From bb36e7afb27480fe957d3bac2de01fa54c95bc3d Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 27 Sep 2021 13:39:03 +0200 Subject: [PATCH 001/802] draft first structural idea --- .gitignore | 1 + README.md | 48 +++++++++++------------------------------------- RLI-Template.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 37 deletions(-) create mode 100644 .gitignore create mode 100644 RLI-Template.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..42cc4105 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea* \ No newline at end of file diff --git a/README.md b/README.md index 49e18aaa..e6107349 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,18 @@ -# rli_template -Template repository for creating new projects under the RLI's umbrella +# eBus Toolbox -## Get started +## Idea -Simply click on the green `Use this template` button on the left of the `Clone or download` button. +This toolbox helps to do eBus feasibility studies and answer research questions -The detailed instructions to create a new repository from this template can be found [here](https://help.github.com/en/articles/creating-a-repository-from-a-template). +## Tools -## src folder +For overview and interfaces of tools see here: +https://miro.com/app/board/o9J_lu8coPI=/ -This folder is where you should place the code of your package (package name to be edited in `setup.py` under name) +### scedule data preparation -You can install it locally for developing with +* [X] from VIP to RLI scedule data format +* [ ] from eFlips to RLI scedule data format +### scedule data analysis - python setup.py install - -More details for packaging are available on [https://packaging.python.org](https://packaging.python.org/tutorials/packaging-projects/) - - -## Docs - -To build the docs simply go to the `docs` folder - - cd docs - -Install the requirements - - pip install -r docs_requirements.txt - -and run - - make html - -The output will then be located in `docs/_build/html` and can be opened with your favorite browser - -## Code linting - -In this template, 3 possible linters are proposed: -- flake8 only sends warnings and error about linting (PEP8) -- pylint sends warnings and error about linting (PEP8) and also allows warning about imports order -- black sends warning but can also fix the files for you - -You can perfectly use the 3 of them or subset, at your preference. Don't forget to edit `.travis.yml` if you want to deactivate the automatic testing of some linters! +* [ ] Generate table of Umlauflängen diff --git a/RLI-Template.md b/RLI-Template.md new file mode 100644 index 00000000..49e18aaa --- /dev/null +++ b/RLI-Template.md @@ -0,0 +1,44 @@ +# rli_template +Template repository for creating new projects under the RLI's umbrella + +## Get started + +Simply click on the green `Use this template` button on the left of the `Clone or download` button. + +The detailed instructions to create a new repository from this template can be found [here](https://help.github.com/en/articles/creating-a-repository-from-a-template). + +## src folder + +This folder is where you should place the code of your package (package name to be edited in `setup.py` under name) + +You can install it locally for developing with + + python setup.py install + +More details for packaging are available on [https://packaging.python.org](https://packaging.python.org/tutorials/packaging-projects/) + + +## Docs + +To build the docs simply go to the `docs` folder + + cd docs + +Install the requirements + + pip install -r docs_requirements.txt + +and run + + make html + +The output will then be located in `docs/_build/html` and can be opened with your favorite browser + +## Code linting + +In this template, 3 possible linters are proposed: +- flake8 only sends warnings and error about linting (PEP8) +- pylint sends warnings and error about linting (PEP8) and also allows warning about imports order +- black sends warning but can also fix the files for you + +You can perfectly use the 3 of them or subset, at your preference. Don't forget to edit `.travis.yml` if you want to deactivate the automatic testing of some linters! From 5b8bbf2528332f5f7db4da4134164e28e3b732ac Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 18 Oct 2021 11:29:30 +0200 Subject: [PATCH 002/802] add bus terminology and schedule template --- Bus Specific Terminology.md | 7 +++++++ .../Template_Schedule_Data.xlsx | Bin 0 -> 10512 bytes .../Template_Schedule_Data_english.csv | 1 + .../Template_Schedule_Data_german.csv | 1 + 4 files changed, 9 insertions(+) create mode 100644 Bus Specific Terminology.md create mode 100644 src/Template Schedule Data/Template_Schedule_Data.xlsx create mode 100644 src/Template Schedule Data/Template_Schedule_Data_english.csv create mode 100644 src/Template Schedule Data/Template_Schedule_Data_german.csv diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md new file mode 100644 index 00000000..2504812d --- /dev/null +++ b/Bus Specific Terminology.md @@ -0,0 +1,7 @@ +Bus Specific Terminology +======================== +| english | german | description | +| Schedule data | Umlaufplan Datensatz | Dataset containing all bus rotations and trips | +| Rotation | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | +| (Leg / Section) | Strecke | One (Leg / Section) is the distance between two planned stops | +| Line | Linie | Number of bus line as depicted on passenger timetable | \ No newline at end of file diff --git a/src/Template Schedule Data/Template_Schedule_Data.xlsx b/src/Template Schedule Data/Template_Schedule_Data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1f5be8dab11ffa8b8fbb140b93f45a4b6f1f8a37 GIT binary patch literal 10512 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 n(EbkpPwV(scrMjn;QzFh%5n(M*#!Vlp+A4 Date: Mon, 18 Oct 2021 12:09:25 +0200 Subject: [PATCH 003/802] format Bus Specific Terminology --- Bus Specific Terminology.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index 2504812d..8be9af02 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -1,7 +1,9 @@ Bus Specific Terminology ======================== + | english | german | description | +| ------- | ------ | ----------- | | Schedule data | Umlaufplan Datensatz | Dataset containing all bus rotations and trips | | Rotation | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | | (Leg / Section) | Strecke | One (Leg / Section) is the distance between two planned stops | -| Line | Linie | Number of bus line as depicted on passenger timetable | \ No newline at end of file +| Line | Linie | Number of bus line as depicted on passenger timetable | From a5055ff8a9722ab9fa97d03ac1144963f596d48c Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 18 Oct 2021 14:53:02 +0200 Subject: [PATCH 004/802] update readme with tools and update terminology --- Bus Specific Terminology.md | 4 ++++ README.md | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index 8be9af02..89efa3a9 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -7,3 +7,7 @@ Bus Specific Terminology | Rotation | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | | (Leg / Section) | Strecke | One (Leg / Section) is the distance between two planned stops | | Line | Linie | Number of bus line as depicted on passenger timetable | +| Depot Charging (DC) | Depot Ladung | Charge busses at depots only | +| Opportunity Charging (OC) | Gelegenheits Ladung | Charge busses at bus stops | +| Solo bus | Solobus | Rigid Bus | +| Articulated bus | Gelenkbus | Bus with two or more rigid sections | diff --git a/README.md b/README.md index e6107349..3845207a 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,28 @@ https://miro.com/app/board/o9J_lu8coPI=/ * [X] from VIP to RLI scedule data format * [ ] from eFlips to RLI scedule data format + ### scedule data analysis -* [ ] Generate table of Umlauflängen +* [ ] Generate table of rotation distances +* [ ] Ranking by accumulated break time + +### Consumption analysis +* [ ] air conditioning consumption based on weather data + +### SOC analysis +Assumptions: Leave depot fully loaded + +SOC trend for each rotation based on: +* [X] charging locations (OC) +* [X] number of available charging infrastructure (OC) +* [ ] charging characteristics (OC) + +### Charge demand analysis +Generate load profile for each charging location based on SOC analysis + +### Schedule adjustment +* [X] split up rotations with negative SOC +* [X] recombine splitted rotations + +### Charging Location Tool \ No newline at end of file From f37a18abf254bd42bbe02d0cb3883dbf4ed3b3c4 Mon Sep 17 00:00:00 2001 From: JBrendel <39203376+j-brendel@users.noreply.github.com> Date: Wed, 20 Oct 2021 15:12:09 +0200 Subject: [PATCH 005/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index 89efa3a9..597b044d 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -1,13 +1,13 @@ Bus Specific Terminology ======================== -| english | german | description | -| ------- | ------ | ----------- | -| Schedule data | Umlaufplan Datensatz | Dataset containing all bus rotations and trips | -| Rotation | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | -| (Leg / Section) | Strecke | One (Leg / Section) is the distance between two planned stops | -| Line | Linie | Number of bus line as depicted on passenger timetable | -| Depot Charging (DC) | Depot Ladung | Charge busses at depots only | -| Opportunity Charging (OC) | Gelegenheits Ladung | Charge busses at bus stops | -| Solo bus | Solobus | Rigid Bus | -| Articulated bus | Gelenkbus | Bus with two or more rigid sections | +| english | Abbrev | german | description | +| ------- | ------ | ------ | ----------- | +| Schedule data | | Umlaufplan Datensatz | Dataset containing all bus rotations and trips | +| Rotation | | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | +| (Leg / Section) | | Strecke | One (Leg / Section) is the distance between two planned stops | +| Line | | Linie | Number of bus line as depicted on passenger timetable | +| Depot Charging (DC) | | Depot Ladung | Charge busses at depots only | +| Opportunity Charging (OC) | | Gelegenheits Ladung | Charge busses at bus stops | +| Solo bus | | Solobus | Rigid Bus | +| Articulated bus | | Gelenkbus | Bus with two or more rigid sections | From d09056a0a29c6567bf19eda9427f777ed165c043 Mon Sep 17 00:00:00 2001 From: JBrendel <39203376+j-brendel@users.noreply.github.com> Date: Wed, 20 Oct 2021 15:15:16 +0200 Subject: [PATCH 006/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index 597b044d..27d68a63 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -5,7 +5,7 @@ Bus Specific Terminology | ------- | ------ | ------ | ----------- | | Schedule data | | Umlaufplan Datensatz | Dataset containing all bus rotations and trips | | Rotation | | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | -| (Leg / Section) | | Strecke | One (Leg / Section) is the distance between two planned stops | +| Trip | | Fahrt | One Trip is the distance between two planned stops | | Line | | Linie | Number of bus line as depicted on passenger timetable | | Depot Charging (DC) | | Depot Ladung | Charge busses at depots only | | Opportunity Charging (OC) | | Gelegenheits Ladung | Charge busses at bus stops | From 5e2468c35943963eef4607cfb3bd1e0173cf2085 Mon Sep 17 00:00:00 2001 From: JBrendel <39203376+j-brendel@users.noreply.github.com> Date: Mon, 8 Nov 2021 10:26:17 +0100 Subject: [PATCH 007/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index 27d68a63..7b6383de 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -7,7 +7,7 @@ Bus Specific Terminology | Rotation | | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | | Trip | | Fahrt | One Trip is the distance between two planned stops | | Line | | Linie | Number of bus line as depicted on passenger timetable | -| Depot Charging (DC) | | Depot Ladung | Charge busses at depots only | -| Opportunity Charging (OC) | | Gelegenheits Ladung | Charge busses at bus stops | -| Solo bus | | Solobus | Rigid Bus | -| Articulated bus | | Gelenkbus | Bus with two or more rigid sections | +| Depot Charging | DEPC | Depot Ladung | Charge busses at depots only | +| Opportunity Charging | OPPC | Gelegenheits Ladung | Charge busses at bus stops | +| Solo bus | SB | Solobus | Rigid Bus | +| Articulated bus | AB | Gelenkbus | Bus with two or more rigid sections | From 03cbcffded6b7c4cbfd556f22346a7db0ee3d0b3 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Feb 2022 12:06:43 +0100 Subject: [PATCH 008/802] Deleted unnecessary files --- .pylintrc | 517 ------------------------------------------------ .travis.yml | 47 ----- RLI-Template.md | 44 ----- setup.py | 179 ----------------- 4 files changed, 787 deletions(-) delete mode 100644 .pylintrc delete mode 100644 .travis.yml delete mode 100644 RLI-Template.md delete mode 100644 setup.py diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 42b59689..00000000 --- a/.pylintrc +++ /dev/null @@ -1,517 +0,0 @@ -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code -extension-pkg-whitelist= - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=conf.py - -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -init-hook="import sys; sys.path.append('./tests/')" - -# Use multiple processes to speed up Pylint. -jobs=1 - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins= - -# Pickle collected data for later comparisons. -persistent=yes - -# Specify a configuration file. -#rcfile= - -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages -suggestion-mode=yes - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -disable=parameter-unpacking, - old-raise-syntax, - long-suffix, - old-ne-operator, - old-octal-literal, - non-ascii-bytes-literal, - raw-checker-failed, - bad-inline-option, - locally-disabled, - locally-enabled, - file-ignored, - suppressed-message, - useless-suppression, - deprecated-pragma, - coerce-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - next-method-defined, - no-member, - missing-docstring, - invalid-name, - redefined-builtin, - too-many-arguments, - too-many-locals, - len-as-condition, - too-many-branches, - too-many-statements, - blacklisted-name, - line-too-long, # already enforced by flake8 - bare-except, - too-many-function-args, - too-many-lines, - too-many-instance-attributes, - too-few-public-methods, - arguments-differ - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio).You can also give a reporter class, eg -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=optparse.Values,sys.exit - - -[BASIC] - -# Naming style matching correct argument names -argument-naming-style=snake_case - -# Regular expression matching correct argument names. Overrides argument- -# naming-style -#argument-rgx= - -# Naming style matching correct attribute names -attr-naming-style=snake_case - -# Regular expression matching correct attribute names. Overrides attr-naming- -# style -#attr-rgx= - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo, - bar, - baz, - toto, - tutu, - tata - -# Naming style matching correct class attribute names -class-attribute-naming-style=any - -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style -#class-attribute-rgx= - -# Naming style matching correct class names -class-naming-style=PascalCase - -# Regular expression matching correct class names. Overrides class-naming-style -#class-rgx= - -# Naming style matching correct constant names -const-naming-style=UPPER_CASE - -# Regular expression matching correct constant names. Overrides const-naming- -# style -#const-rgx= - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Naming style matching correct function names -function-naming-style=snake_case - -# Regular expression matching correct function names. Overrides function- -# naming-style -#function-rgx= - -# Good variable names which should always be accepted, separated by a comma -good-names=i, - j, - k, - ex, - Run, - _ - -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no - -# Naming style matching correct inline iteration names -inlinevar-naming-style=any - -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style -#inlinevar-rgx= - -# Naming style matching correct method names -method-naming-style=snake_case - -# Regular expression matching correct method names. Overrides method-naming- -# style -#method-rgx= - -# Naming style matching correct module names -module-naming-style=snake_case - -# Regular expression matching correct module names. Overrides module-naming- -# style -#module-rgx= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -property-classes=abc.abstractproperty - -# Naming style matching correct variable names -variable-naming-style=snake_case - -# Regular expression matching correct variable names. Overrides variable- -# naming-style -#variable-rgx= - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=100 - -# Maximum number of lines in a module -max-module-lines=1000 - -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma, - dict-separator - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[LOGGING] - -# Logging modules to check that the string format arguments are in logging -# function parameter format -logging-modules=logging - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - -# Minimum lines number of a similarity. -min-similarity-lines=4 - - -[SPELLING] - -# Limits count of emitted suggestions for spelling mistakes -max-spelling-suggestions=4 - -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. -spelling-store-unknown-words=no - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb - -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[DESIGN] - -# Maximum number of arguments for function / method -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in a if statement -max-bool-expr=5 - -# Maximum number of branch for function / method body -max-branches=12 - -# Maximum number of locals for function / method body -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body -max-returns=6 - -# Maximum number of statements in function / method body -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception" -overgeneral-exceptions=Exception diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index dbff469b..00000000 --- a/.travis.yml +++ /dev/null @@ -1,47 +0,0 @@ -dist: xenial # required for Python >= 3.7 -language: python -python: - - '3.6' - -# To install packages which are not on pip -#before_install: -# - sudo apt-get install ... -#addons: -# apt: -# update: true - -# command to install dependencies -install: - - pip install -r requirements.txt - - pip install -r tests/test_requirements.txt - -# commands to run tests -script: - - flake8 - - pylint */*.py - - black --check . --exclude docs/ - - pytest tests -#jobs: -# include: -# - stage: "Tests" # naming the Tests stage -# name: "Linting Tests" # names the first Tests stage job -# script: flake8 -# script: pylint -# for later stages -# - script: ./integration-tests -# name: "Integration Tests" # names the second Tests stage job -# - stage: deploy -# name: "Deploy to GCP" -# script: ./deploy - -# blocklist -#branches: -# except: -# - branch_name1 -# - branch_name2 - -# safelist -#branches: -# only: -# - branch_name1 -# - branch_name2 diff --git a/RLI-Template.md b/RLI-Template.md deleted file mode 100644 index 49e18aaa..00000000 --- a/RLI-Template.md +++ /dev/null @@ -1,44 +0,0 @@ -# rli_template -Template repository for creating new projects under the RLI's umbrella - -## Get started - -Simply click on the green `Use this template` button on the left of the `Clone or download` button. - -The detailed instructions to create a new repository from this template can be found [here](https://help.github.com/en/articles/creating-a-repository-from-a-template). - -## src folder - -This folder is where you should place the code of your package (package name to be edited in `setup.py` under name) - -You can install it locally for developing with - - python setup.py install - -More details for packaging are available on [https://packaging.python.org](https://packaging.python.org/tutorials/packaging-projects/) - - -## Docs - -To build the docs simply go to the `docs` folder - - cd docs - -Install the requirements - - pip install -r docs_requirements.txt - -and run - - make html - -The output will then be located in `docs/_build/html` and can be opened with your favorite browser - -## Code linting - -In this template, 3 possible linters are proposed: -- flake8 only sends warnings and error about linting (PEP8) -- pylint sends warnings and error about linting (PEP8) and also allows warning about imports order -- black sends warning but can also fix the files for you - -You can perfectly use the 3 of them or subset, at your preference. Don't forget to edit `.travis.yml` if you want to deactivate the automatic testing of some linters! diff --git a/setup.py b/setup.py deleted file mode 100644 index 0733d9bb..00000000 --- a/setup.py +++ /dev/null @@ -1,179 +0,0 @@ -"""A setuptools based setup module. - -See: -https://packaging.python.org/guides/distributing-packages-using-setuptools/ -https://github.com/pypa/sampleproject -""" - -# Always prefer setuptools over distutils -from setuptools import setup, find_packages -from os import path - -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - -# Arguments marked as "Required" below must be included for upload to PyPI. -# Fields marked as "Optional" may be commented out. - -setup( - # This is the name of your project. The first time you publish this - # package, this name will be registered for you. It will determine how - # users can install this project, e.g.: - # - # $ pip install sampleproject - # - # And where it will live on PyPI: https://pypi.org/project/sampleproject/ - # - # There are some restrictions on what makes a valid project name - # specification here: - # https://packaging.python.org/specifications/core-metadata/#name - name="rli_template", # Required - # Versions should comply with PEP 440: - # https://www.python.org/dev/peps/pep-0440/ - # - # For a discussion on single-sourcing the version across setup.py and the - # project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version="0.0.0", # Required - # This is a one-line description or tagline of what your project does. This - # corresponds to the "Summary" metadata field: - # https://packaging.python.org/specifications/core-metadata/#summary - description="Description", # Optional - # This is an optional longer description of your project that represents - # the body of text which users will see when they visit PyPI. - # - # Often, this is the same as your README, so you can just read it in from - # that file directly (as we have already done above) - # - # This field corresponds to the "Description" metadata field: - # https://packaging.python.org/specifications/core-metadata/#description-optional - long_description=long_description, # Optional - # Denotes that our long_description is in Markdown; valid values are - # text/plain, text/x-rst, and text/markdown - # - # Optional if long_description is written in reStructuredText (rst) but - # required for plain-text or Markdown; if unspecified, "applications should - # attempt to render [the long_description] as text/x-rst; charset=UTF-8 and - # fall back to text/plain if it is not valid rst" (see link below) - # - # This field corresponds to the "Description-Content-Type" metadata field: - # https://packaging.python.org/specifications/core-metadata/#description-content-type-optional - long_description_content_type="text/markdown", # Optional (see note above) - # This should be a valid link to your project's main homepage. - # - # This field corresponds to the "Home-Page" metadata field: - # https://packaging.python.org/specifications/core-metadata/#home-page-optional - url="https://github.com/rl-institut/rli_template", # Optional - # This should be your name or the name of the organization which owns the - # project. - author="Reiner Lemoine Institut", # Optional - # This should be a valid email address corresponding to the author listed - # above. - # author_email='pypa-dev@googlegroups.com', # Optional - # Classifiers help users find your project by categorizing it. - # - # For a list of valid classifiers, see https://pypi.org/classifiers/ - classifiers=[ # Optional - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 3 - Alpha", - # Indicate who your project is intended for - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish - "License :: OSI Approved :: GPL License", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - # These classifiers are *not* checked by 'pip install'. See instead - # 'python_requires' below. - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - ], - # This field adds keywords for your project which will appear on the - # project page. What does your project relate to? - # - # Note that this is a string of words separated by whitespace, not a list. - keywords="", # Optional - # When your source code is in a subdirectory under the project root, e.g. - # `src/`, it is necessary to specify the `package_dir` argument. - package_dir={"": "src"}, # Optional - # You can just specify package directories manually here if your project is - # simple. Or you can use find_packages(). - # - # Alternatively, if you just want to distribute a single Python file, use - # the `py_modules` argument instead as follows, which will expect a file - # called `my_module.py` to exist: - # - # py_modules=["my_module"], - # - packages=find_packages(where="src"), # Required - # Specify which Python versions you support. In contrast to the - # 'Programming Language' classifiers above, 'pip install' will check this - # and refuse to install the project if the version does not match. If you - # do not support Python 2, you can simplify this to '>=3.5' or similar, see - # https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires - python_requires=">=3, <4", - # This field lists other packages that your project depends on to run. - # Any package you put here will be installed by pip when your project is - # installed, so they must be valid existing projects. - # - # For an analysis of "install_requires" vs pip's requirements files see: - # https://packaging.python.org/en/latest/requirements.html - install_requires=[], # Optional - # List additional groups of dependencies here (e.g. development - # dependencies). Users will be able to install these using the "extras" - # syntax, for example: - # - # $ pip install sampleproject[dev] - # - # Similar to `install_requires` above, these must be valid existing - # projects. - extras_require={"dev": [], "test": []}, # Optional - # If there are data files included in your packages that need to be - # installed, specify them here. - # - # If using Python 2.6 or earlier, then these have to be included in - # MANIFEST.in as well. - # package_data={ # Optional - # 'sample': ['package_data.dat'], - # }, - # Although 'package_data' is the preferred approach, in some case you may - # need to place data files outside of your packages. See: - # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files - # - # In this case, 'data_file' will be installed into '/my_data' - # data_files=[('my_data', ['data/data_file'])], # Optional - # To provide executable scripts, use entry points in preference to the - # "scripts" keyword. Entry points provide cross-platform support and allow - # `pip` to create the appropriate form of executable for the target - # platform. - # - # For example, the following would provide a command called `sample` which - # executes the function `main` from this package when invoked: - # entry_points={ # Optional - # 'console_scripts': [ - # 'sample=sample:main', - # ], - # }, - # List additional URLs that are relevant to your project as a dict. - # - # This field corresponds to the "Project-URL" metadata fields: - # https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use - # - # Examples listed include a pattern for specifying where the package tracks - # issues, where the source is hosted, where to say thanks to the package - # maintainers, and where to support the project financially. The key is - # what's used to render the link text on PyPI. - project_urls={ # Optional - "Bug Reports": "https://github.com/rl-institut/rli_template/issues", - "Source": "https://github.com/rl-institut/rli_template", - }, -) From 2791887c6ce00faa636f43a414d9fd426250712c Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Feb 2022 13:28:43 +0100 Subject: [PATCH 009/802] copy docs structure from spiceev --- docs/.gitignore | 2 ++ docs/_static/.gitkeep | 0 docs/_templates/.gitkeep | 0 docs/{ => source}/conf.py | 0 docs/{ => source}/index.rst | 0 tests/{test_something.py => test_example.py} | 0 tests/test_requirements.txt | 4 +--- 7 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 docs/.gitignore delete mode 100644 docs/_static/.gitkeep delete mode 100644 docs/_templates/.gitkeep rename docs/{ => source}/conf.py (100%) rename docs/{ => source}/index.rst (100%) rename tests/{test_something.py => test_example.py} (100%) diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..749c7a4b --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +build/ +source/temp/ diff --git a/docs/_static/.gitkeep b/docs/_static/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/_templates/.gitkeep b/docs/_templates/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/conf.py b/docs/source/conf.py similarity index 100% rename from docs/conf.py rename to docs/source/conf.py diff --git a/docs/index.rst b/docs/source/index.rst similarity index 100% rename from docs/index.rst rename to docs/source/index.rst diff --git a/tests/test_something.py b/tests/test_example.py similarity index 100% rename from tests/test_something.py rename to tests/test_example.py diff --git a/tests/test_requirements.txt b/tests/test_requirements.txt index fd2e4d8f..28ecacab 100644 --- a/tests/test_requirements.txt +++ b/tests/test_requirements.txt @@ -1,4 +1,2 @@ flake8 -pylint -black -pytest \ No newline at end of file +pytest From bb97bb68b86ff738eececd4a74e96d6241baba08 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Feb 2022 14:18:41 +0100 Subject: [PATCH 010/802] add conf and ini files for testing --- tests/__init__.py | 0 tests/conftest.py | 0 tests/pytest.ini | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/pytest.ini diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/pytest.ini b/tests/pytest.ini new file mode 100644 index 00000000..e69de29b From 69739ac9ecc822aae3cb5484b3037317117551e1 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Feb 2022 16:45:33 +0100 Subject: [PATCH 011/802] removed environment.yml --- environment.yml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 environment.yml diff --git a/environment.yml b/environment.yml deleted file mode 100644 index a3d2ed58..00000000 --- a/environment.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: myvenv -dependencies: -- python=3.6 -- pip: - - -r requirements.txt From a22f55a92d9d2792fd4a0b9493805005cafcfaa5 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Feb 2022 17:55:19 +0100 Subject: [PATCH 012/802] update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 42cc4105..ead767ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -.idea* \ No newline at end of file +.vscode/ +.DS_Store +.python-version + From df3523187002c7179f1b933847d853a335c49b53 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Feb 2022 18:37:09 +0100 Subject: [PATCH 013/802] inital setup of docs --- .gitignore | 2 ++ docs/Makefile | 2 +- docs/_static/style.css | 3 +++ docs/docs_requirements.txt | 4 ++-- docs/source/conf.py | 9 +++++---- docs/source/index.rst | 5 ++++- 6 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 docs/_static/style.css diff --git a/.gitignore b/.gitignore index ead767ec..3c4e0b77 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .DS_Store .python-version +docs/_build +docs/source/temp diff --git a/docs/Makefile b/docs/Makefile index d4bb2cbb..92dd33a1 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -5,7 +5,7 @@ # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build -SOURCEDIR = . +SOURCEDIR = source BUILDDIR = _build # Put it first so that "make" without argument is like "make help". diff --git a/docs/_static/style.css b/docs/_static/style.css new file mode 100644 index 00000000..b07bdb1b --- /dev/null +++ b/docs/_static/style.css @@ -0,0 +1,3 @@ +.wy-nav-content { + max-width: none; +} diff --git a/docs/docs_requirements.txt b/docs/docs_requirements.txt index 856b3f4c..7fbfd647 100644 --- a/docs/docs_requirements.txt +++ b/docs/docs_requirements.txt @@ -1,2 +1,2 @@ -sphinx -sphinx_rtd_theme \ No newline at end of file +sphinx >= 1.4.3 +sphinx_rtd_theme diff --git a/docs/source/conf.py b/docs/source/conf.py index 7c6b2247..7e98ff01 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -17,7 +17,7 @@ # -- Project information ----------------------------------------------------- -project = 'rli_template' +project = 'eBus-Toolbox' copyright = '2020, Reiner Lemoine Institut' author = 'Reiner Lemoine Institut' @@ -30,15 +30,15 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.napoleon'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary'] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = [] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = [] # -- Options for HTML output ------------------------------------------------- @@ -56,3 +56,4 @@ # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +html_css_files = ['style.css'] diff --git a/docs/source/index.rst b/docs/source/index.rst index b9d6890e..8a3e2313 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,9 +3,12 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to rli_template's documentation! +Welcome to the eBus-Toolbox's documentation! ======================================== +This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies. + + .. toctree:: :maxdepth: 2 :caption: Contents: From 8da38ca03d7cb05686c3c784a88b33e4196a2d76 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Feb 2022 18:46:51 +0100 Subject: [PATCH 014/802] flake8 file --- .flake8 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.flake8 b/.flake8 index 2cca717d..773ef31a 100644 --- a/.flake8 +++ b/.flake8 @@ -1,3 +1,3 @@ [flake8] -exclude = meta/migrations/, docs/ +exclude = docs max-line-length=100 \ No newline at end of file From c3b66ff7d95012bd969ccf38568b7a5c1a478214 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Feb 2022 09:20:43 +0100 Subject: [PATCH 015/802] flake8, data directory, initial sketch --- .flake8 | 3 +- .../Template_Schedule_Data.xlsx | Bin .../Template_Schedule_Data_english.csv | 0 .../Template_Schedule_Data_german.csv | 0 src/sketch.py | 57 ++++++++++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) rename {src => data}/Template Schedule Data/Template_Schedule_Data.xlsx (100%) rename {src => data}/Template Schedule Data/Template_Schedule_Data_english.csv (100%) rename {src => data}/Template Schedule Data/Template_Schedule_Data_german.csv (100%) create mode 100644 src/sketch.py diff --git a/.flake8 b/.flake8 index 773ef31a..14f3e863 100644 --- a/.flake8 +++ b/.flake8 @@ -1,3 +1,4 @@ [flake8] exclude = docs -max-line-length=100 \ No newline at end of file +max-line-length=140 +docstring_style=sphinx \ No newline at end of file diff --git a/src/Template Schedule Data/Template_Schedule_Data.xlsx b/data/Template Schedule Data/Template_Schedule_Data.xlsx similarity index 100% rename from src/Template Schedule Data/Template_Schedule_Data.xlsx rename to data/Template Schedule Data/Template_Schedule_Data.xlsx diff --git a/src/Template Schedule Data/Template_Schedule_Data_english.csv b/data/Template Schedule Data/Template_Schedule_Data_english.csv similarity index 100% rename from src/Template Schedule Data/Template_Schedule_Data_english.csv rename to data/Template Schedule Data/Template_Schedule_Data_english.csv diff --git a/src/Template Schedule Data/Template_Schedule_Data_german.csv b/data/Template Schedule Data/Template_Schedule_Data_german.csv similarity index 100% rename from src/Template Schedule Data/Template_Schedule_Data_german.csv rename to data/Template Schedule Data/Template_Schedule_Data_german.csv diff --git a/src/sketch.py b/src/sketch.py new file mode 100644 index 00000000..03c7625e --- /dev/null +++ b/src/sketch.py @@ -0,0 +1,57 @@ +# imports +from spice_ev import args_from_config +import optimizer + +def checkInput(): + pass + +def add_charging_types(): + pass + +def calc_trip_rotation_consumption(): + pass + +def assign_vehicles(): + pass + +def filter_rotations(): + pass + + +def evaluate(args): + # read CSV input file + # check for correct data format / standard + trips = read(csv_file) + if not checkInput(trips): + # exit sim + pass + + gc_info[-1]["target"] = event.target if event.target is not None else gc_info[-1]["targejsdhajkshdksdsdashdksajhdkhaskdhkashkdhaskhdkhashdklast"] + trips = filter_trips(args.rotations_to_be_ignored) + opt = Optimizer(args.opt_config) if args.opt_config else None + + # may be updated by optimizer later + create_configs_spiceev() + + while(True): + # construct szenario and simulate in spice ev + # stop if no optimization wanted (simple yes or no response) + # stop if optimi + args_from_config() + vehicle_types = read(vt.json) + + add_charging_types() + calc_trip_rotation_consumption() + assign_vehicles() + + # RUN SPICE EV + + if opt.optimize(inputs, outputs) == 'satisfied': + break + + generate_report() + + +if __name__ == 'main': + # parse args from cmd or file + evaluate(args) \ No newline at end of file From a2102569a27d7a2b83945fae2eb6259415792116 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 15 Feb 2022 09:38:42 +0100 Subject: [PATCH 016/802] Create test-python-app.yml Github actions that installs Python along with packages from requirements.txt. Lints application with flake8 and tests with pytest. --- .github/workflows/test-python-app.yml | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/test-python-app.yml diff --git a/.github/workflows/test-python-app.yml b/.github/workflows/test-python-app.yml new file mode 100644 index 00000000..b721e957 --- /dev/null +++ b/.github/workflows/test-python-app.yml @@ -0,0 +1,33 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Test Python Application + +on: + [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.8, 3.10] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Lint with flake8 + run: | + flake8 . + - name: Test with pytest + run: | + pytest From afca59b6f7a533cce8544b410113900039de236b Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Feb 2022 10:13:05 +0100 Subject: [PATCH 017/802] remove CHANGELOG --- CHANGELOG.md | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index f9834243..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,30 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is inspired from [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and the versioning aim to respect [Semantic Versioning](http://semver.org/spec/v2.0.0.html). - -Here is a template for new release sections - -``` -## [_._._] - 20XX-MM-DD - -### Added -- -### Changed -- -### Removed -- -``` -## [Unreleased] - -### Added -- one thing - -### Changed -- another thing - -### Removed -- yet another thing - - From e93123939a699449ea30e1e5ad693680fc3a6354 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 15 Feb 2022 10:17:01 +0100 Subject: [PATCH 018/802] github actions - python version as string --- .github/workflows/test-python-app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-python-app.yml b/.github/workflows/test-python-app.yml index b721e957..6a6f8dd8 100644 --- a/.github/workflows/test-python-app.yml +++ b/.github/workflows/test-python-app.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.6, 3.8, 3.10] + python-version: ['3.6', '3.8', '3.10'] steps: - uses: actions/checkout@v2 From 61fb52962b1183b362362f7edc9838d3a686e0b6 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 15 Feb 2022 10:19:53 +0100 Subject: [PATCH 019/802] install darglint for testing --- .github/workflows/test-python-app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-python-app.yml b/.github/workflows/test-python-app.yml index 6a6f8dd8..5a19f9ea 100644 --- a/.github/workflows/test-python-app.yml +++ b/.github/workflows/test-python-app.yml @@ -23,7 +23,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install flake8 pytest + pip install flake8 pytest darglint if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with flake8 run: | From 2805e1065f226116e71f70d20b347a035af541c7 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Feb 2022 14:01:27 +0100 Subject: [PATCH 020/802] describe functionality on high level --- {src => ebus_toolbox}/__init__.py | 0 ebus_toolbox/sketch.py | 87 +++++++++++++++++++++++++++++++ src/sketch.py | 57 -------------------- 3 files changed, 87 insertions(+), 57 deletions(-) rename {src => ebus_toolbox}/__init__.py (100%) create mode 100644 ebus_toolbox/sketch.py delete mode 100644 src/sketch.py diff --git a/src/__init__.py b/ebus_toolbox/__init__.py similarity index 100% rename from src/__init__.py rename to ebus_toolbox/__init__.py diff --git a/ebus_toolbox/sketch.py b/ebus_toolbox/sketch.py new file mode 100644 index 00000000..e8979003 --- /dev/null +++ b/ebus_toolbox/sketch.py @@ -0,0 +1,87 @@ +# imports + +def check_trip_data(trips): + """ The provided trips file is checked against the following requirements: + - + - + - + + :param trips: Dictionaries for every trip + :type trips: list + + :return: True if data is valid, else False. + :rtype: bool + """ + return True + + +def add_charging_types(): + """Add charging types to each vehicle if not already given by trips or vehicle type. + """ + pass + + +def consumption(): + """ Calculate the consumptions for each trip and rotation. + Various consumption schemes possible depending on available data. + """ + pass + + +def assign_vehicles(): + """ Assign vehicle IDs to rotations. + Just randomly? Match consumption with battery sizes? + """ + pass + + +def filter_rotations(trips): + """ Iterate across trips and remove trips that fit criteria given in config. + Possible filters: + - specific rotation IDs + - distance thresholds + - + + :param trips: Dictionaries for every trip + :type trips: list + """ + pass + + +def simulate(args=None): + """Simulate the given scenario and eventually optimize for given metric(s). + + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + + # read CSV input file + # check for correct data format / standard + check_trip_data(None) + + # filter trips according to args + filter_rotations(None) + + # initialize optimizer + + while(True): + # construct szenario and simulate in spice ev until optimizer is happy + # if optimizer None, quit after single iteration + + add_charging_types() + consumption() + assign_vehicles() + + # write trips to csv in spiceEV format + + # RUN SPICE EV + + # Quit if optimizer is not defined + # (LATER) Run optimizer, continue from top or quit based on optimizer output + + # create report + + +if __name__ == 'main': + # parse args from cmd or file + simulate() diff --git a/src/sketch.py b/src/sketch.py deleted file mode 100644 index 03c7625e..00000000 --- a/src/sketch.py +++ /dev/null @@ -1,57 +0,0 @@ -# imports -from spice_ev import args_from_config -import optimizer - -def checkInput(): - pass - -def add_charging_types(): - pass - -def calc_trip_rotation_consumption(): - pass - -def assign_vehicles(): - pass - -def filter_rotations(): - pass - - -def evaluate(args): - # read CSV input file - # check for correct data format / standard - trips = read(csv_file) - if not checkInput(trips): - # exit sim - pass - - gc_info[-1]["target"] = event.target if event.target is not None else gc_info[-1]["targejsdhajkshdksdsdashdksajhdkhaskdhkashkdhaskhdkhashdklast"] - trips = filter_trips(args.rotations_to_be_ignored) - opt = Optimizer(args.opt_config) if args.opt_config else None - - # may be updated by optimizer later - create_configs_spiceev() - - while(True): - # construct szenario and simulate in spice ev - # stop if no optimization wanted (simple yes or no response) - # stop if optimi - args_from_config() - vehicle_types = read(vt.json) - - add_charging_types() - calc_trip_rotation_consumption() - assign_vehicles() - - # RUN SPICE EV - - if opt.optimize(inputs, outputs) == 'satisfied': - break - - generate_report() - - -if __name__ == 'main': - # parse args from cmd or file - evaluate(args) \ No newline at end of file From a0743875c843f83efe6c308646dfe74d1abb4726 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Feb 2022 14:11:34 +0100 Subject: [PATCH 021/802] rename main script --- ebus_toolbox/{sketch.py => simulate.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ebus_toolbox/{sketch.py => simulate.py} (100%) diff --git a/ebus_toolbox/sketch.py b/ebus_toolbox/simulate.py similarity index 100% rename from ebus_toolbox/sketch.py rename to ebus_toolbox/simulate.py From 56099ac48b1d684b502f2c00c9b4b02a9a6457fc Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Feb 2022 14:27:52 +0100 Subject: [PATCH 022/802] initial definition of input cols --- ebus_toolbox/simulate.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e8979003..5ef40c86 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -2,7 +2,26 @@ def check_trip_data(trips): """ The provided trips file is checked against the following requirements: - - + - Folloing columns are provided: + Required: + Rotation, + Line, + Leg, + Departure time, + Departure day, + Arrival time, + Arrival day, + Break at arrival, + Vehicle type, + Departure name, + Departure ID, + Arrival name, + Arrival ID, + Distance, + Optional: + Empty trip, + Departure (short name), + Arrival (short name), - - From a1f6dcca6d9043fb05bc4e5985756984cbc328af Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Feb 2022 14:30:14 +0100 Subject: [PATCH 023/802] flake8 max line length to 100 --- .flake8 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.flake8 b/.flake8 index 14f3e863..62457a9b 100644 --- a/.flake8 +++ b/.flake8 @@ -1,4 +1,4 @@ [flake8] exclude = docs -max-line-length=140 -docstring_style=sphinx \ No newline at end of file +max-line-length=100 +docstring_style=sphinx From 661979d3d4bf9455fcf25c888d0bbe50a0c31ddc Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Feb 2022 10:37:34 +0100 Subject: [PATCH 024/802] move dummy functions to dummy modules --- ebus_toolbox/consumption.py | 6 +++ ebus_toolbox/optimizer.py | 3 ++ ebus_toolbox/preprocessing.py | 40 ++++++++++++++ ebus_toolbox/report.py | 3 ++ ebus_toolbox/rotation_filter.py | 12 +++++ ebus_toolbox/simulate.py | 84 +++++------------------------- ebus_toolbox/vehicle_assignment.py | 6 +++ 7 files changed, 83 insertions(+), 71 deletions(-) create mode 100644 ebus_toolbox/consumption.py create mode 100644 ebus_toolbox/optimizer.py create mode 100644 ebus_toolbox/preprocessing.py create mode 100644 ebus_toolbox/report.py create mode 100644 ebus_toolbox/rotation_filter.py create mode 100644 ebus_toolbox/vehicle_assignment.py diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py new file mode 100644 index 00000000..a46dbc86 --- /dev/null +++ b/ebus_toolbox/consumption.py @@ -0,0 +1,6 @@ + +def consumption(): + """ Calculate the consumptions for each trip and rotation. + Various consumption schemes possible depending on available data. + """ + pass diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py new file mode 100644 index 00000000..52a9f527 --- /dev/null +++ b/ebus_toolbox/optimizer.py @@ -0,0 +1,3 @@ + +def no_optimization(): + return True \ No newline at end of file diff --git a/ebus_toolbox/preprocessing.py b/ebus_toolbox/preprocessing.py new file mode 100644 index 00000000..8045dcd1 --- /dev/null +++ b/ebus_toolbox/preprocessing.py @@ -0,0 +1,40 @@ +# imports + +def check_trip_data(trips): + """ The provided trips file is checked against the following requirements: + - Folloing columns are provided: + Required: + Rotation, + Line, + Leg, + Departure time, + Departure day, + Arrival time, + Arrival day, + Break at arrival, + Vehicle type, + Departure name, + Departure ID, + Arrival name, + Arrival ID, + Distance, + Optional: + Empty trip, + Departure (short name), + Arrival (short name), + - + - + + :param trips: Dictionaries for every trip + :type trips: list + + :return: True if data is valid, else False. + :rtype: bool + """ + return True + + +def add_charging_types(): + """Add charging types to each vehicle if not already given by trips or vehicle type. + """ + pass diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py new file mode 100644 index 00000000..cf6df038 --- /dev/null +++ b/ebus_toolbox/report.py @@ -0,0 +1,3 @@ + +def generate(): + pass \ No newline at end of file diff --git a/ebus_toolbox/rotation_filter.py b/ebus_toolbox/rotation_filter.py new file mode 100644 index 00000000..e8e3cbe7 --- /dev/null +++ b/ebus_toolbox/rotation_filter.py @@ -0,0 +1,12 @@ + +def filter_rotations(trips): + """ Iterate across trips and remove trips that fit criteria given in config. + Possible filters: + - specific rotation IDs + - distance thresholds + - + + :param trips: Dictionaries for every trip + :type trips: list + """ + pass \ No newline at end of file diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 5ef40c86..13dc2415 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,70 +1,10 @@ # imports - -def check_trip_data(trips): - """ The provided trips file is checked against the following requirements: - - Folloing columns are provided: - Required: - Rotation, - Line, - Leg, - Departure time, - Departure day, - Arrival time, - Arrival day, - Break at arrival, - Vehicle type, - Departure name, - Departure ID, - Arrival name, - Arrival ID, - Distance, - Optional: - Empty trip, - Departure (short name), - Arrival (short name), - - - - - - :param trips: Dictionaries for every trip - :type trips: list - - :return: True if data is valid, else False. - :rtype: bool - """ - return True - - -def add_charging_types(): - """Add charging types to each vehicle if not already given by trips or vehicle type. - """ - pass - - -def consumption(): - """ Calculate the consumptions for each trip and rotation. - Various consumption schemes possible depending on available data. - """ - pass - - -def assign_vehicles(): - """ Assign vehicle IDs to rotations. - Just randomly? Match consumption with battery sizes? - """ - pass - - -def filter_rotations(trips): - """ Iterate across trips and remove trips that fit criteria given in config. - Possible filters: - - specific rotation IDs - - distance thresholds - - - - :param trips: Dictionaries for every trip - :type trips: list - """ - pass +import preprocessing +import consumption +import vehicle_assignment +import rotation_filter +import optimizer +import report def simulate(args=None): @@ -76,10 +16,10 @@ def simulate(args=None): # read CSV input file # check for correct data format / standard - check_trip_data(None) + preprocessing.validate(None) # filter trips according to args - filter_rotations(None) + rotation_filter.filter(None) # initialize optimizer @@ -87,9 +27,9 @@ def simulate(args=None): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - add_charging_types() - consumption() - assign_vehicles() + preprocessing.add_charging_types() + consumption.constant() + vehicle_assignment.fishgrid() # write trips to csv in spiceEV format @@ -97,8 +37,10 @@ def simulate(args=None): # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output + optimizer.no_optimization() # create report + report.generate() if __name__ == 'main': diff --git a/ebus_toolbox/vehicle_assignment.py b/ebus_toolbox/vehicle_assignment.py new file mode 100644 index 00000000..093e6f17 --- /dev/null +++ b/ebus_toolbox/vehicle_assignment.py @@ -0,0 +1,6 @@ + +def assign_vehicles(): + """ Assign vehicle IDs to rotations. + Just randomly? Match consumption with battery sizes? + """ + pass \ No newline at end of file From 15cbf53e5e3a93b61b969f02de04ce0ad2915499 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Feb 2022 10:43:36 +0100 Subject: [PATCH 025/802] flake8 --- ebus_toolbox/optimizer.py | 2 +- ebus_toolbox/report.py | 2 +- ebus_toolbox/rotation_filter.py | 2 +- ebus_toolbox/vehicle_assignment.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 52a9f527..f4515d9a 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -1,3 +1,3 @@ def no_optimization(): - return True \ No newline at end of file + return True diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index cf6df038..a1733cc1 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -1,3 +1,3 @@ def generate(): - pass \ No newline at end of file + pass diff --git a/ebus_toolbox/rotation_filter.py b/ebus_toolbox/rotation_filter.py index e8e3cbe7..f0f4780b 100644 --- a/ebus_toolbox/rotation_filter.py +++ b/ebus_toolbox/rotation_filter.py @@ -9,4 +9,4 @@ def filter_rotations(trips): :param trips: Dictionaries for every trip :type trips: list """ - pass \ No newline at end of file + pass diff --git a/ebus_toolbox/vehicle_assignment.py b/ebus_toolbox/vehicle_assignment.py index 093e6f17..05d6c752 100644 --- a/ebus_toolbox/vehicle_assignment.py +++ b/ebus_toolbox/vehicle_assignment.py @@ -3,4 +3,4 @@ def assign_vehicles(): """ Assign vehicle IDs to rotations. Just randomly? Match consumption with battery sizes? """ - pass \ No newline at end of file + pass From 5aa7cc2f605fdaa65cf00149fad932a96a311029 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Feb 2022 10:46:49 +0100 Subject: [PATCH 026/802] rename folder --- .../Template_Schedule_Data.xlsx | Bin .../Template_Schedule_Data_english.csv | 0 .../Template_Schedule_Data_german.csv | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename data/{Template Schedule Data => templates}/Template_Schedule_Data.xlsx (100%) rename data/{Template Schedule Data => templates}/Template_Schedule_Data_english.csv (100%) rename data/{Template Schedule Data => templates}/Template_Schedule_Data_german.csv (100%) diff --git a/data/Template Schedule Data/Template_Schedule_Data.xlsx b/data/templates/Template_Schedule_Data.xlsx similarity index 100% rename from data/Template Schedule Data/Template_Schedule_Data.xlsx rename to data/templates/Template_Schedule_Data.xlsx diff --git a/data/Template Schedule Data/Template_Schedule_Data_english.csv b/data/templates/Template_Schedule_Data_english.csv similarity index 100% rename from data/Template Schedule Data/Template_Schedule_Data_english.csv rename to data/templates/Template_Schedule_Data_english.csv diff --git a/data/Template Schedule Data/Template_Schedule_Data_german.csv b/data/templates/Template_Schedule_Data_german.csv similarity index 100% rename from data/Template Schedule Data/Template_Schedule_Data_german.csv rename to data/templates/Template_Schedule_Data_german.csv From 7b678131413f65270ac9356773dcc753dbd45bf5 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Feb 2022 16:37:39 +0100 Subject: [PATCH 027/802] inital input file templates --- .../{ => archiv}/Template_Schedule_Data.xlsx | Bin .../{ => archiv}/Template_Schedule_Data_english.csv | 0 .../{ => archiv}/Template_Schedule_Data_german.csv | 0 data/templates/ebus_toolbox_input_template.csv | 2 ++ data/templates/spice_ev_input_template.csv | 1 + 5 files changed, 3 insertions(+) rename data/templates/{ => archiv}/Template_Schedule_Data.xlsx (100%) rename data/templates/{ => archiv}/Template_Schedule_Data_english.csv (100%) rename data/templates/{ => archiv}/Template_Schedule_Data_german.csv (100%) create mode 100644 data/templates/ebus_toolbox_input_template.csv create mode 100644 data/templates/spice_ev_input_template.csv diff --git a/data/templates/Template_Schedule_Data.xlsx b/data/templates/archiv/Template_Schedule_Data.xlsx similarity index 100% rename from data/templates/Template_Schedule_Data.xlsx rename to data/templates/archiv/Template_Schedule_Data.xlsx diff --git a/data/templates/Template_Schedule_Data_english.csv b/data/templates/archiv/Template_Schedule_Data_english.csv similarity index 100% rename from data/templates/Template_Schedule_Data_english.csv rename to data/templates/archiv/Template_Schedule_Data_english.csv diff --git a/data/templates/Template_Schedule_Data_german.csv b/data/templates/archiv/Template_Schedule_Data_german.csv similarity index 100% rename from data/templates/Template_Schedule_Data_german.csv rename to data/templates/archiv/Template_Schedule_Data_german.csv diff --git a/data/templates/ebus_toolbox_input_template.csv b/data/templates/ebus_toolbox_input_template.csv new file mode 100644 index 00000000..db1a5a4d --- /dev/null +++ b/data/templates/ebus_toolbox_input_template.csv @@ -0,0 +1,2 @@ +line,departure_name,departure_short_name,departure_day,departure_time,arrival_time,arrival_day,arrival_name,arrival_short_name,distance,pause,rotation_id,vehicle_type +160,Betriebshof A,BF A E,Monday,21.5166666666666,21.5166666666666,Monday,Hasselwerderstr.,HAWR01B,0.06,0,4454943,CKB \ No newline at end of file diff --git a/data/templates/spice_ev_input_template.csv b/data/templates/spice_ev_input_template.csv new file mode 100644 index 00000000..d1ced0c4 --- /dev/null +++ b/data/templates/spice_ev_input_template.csv @@ -0,0 +1 @@ +rotation_id,arrival_name,departure_name,arrival_time,departure_time,vehilce_id,vehicle_type,delta_soc,charging_type \ No newline at end of file From 8fd4bed200cd6768a236bc8bd7f0f1be6cc71a72 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Thu, 17 Feb 2022 15:26:55 +0100 Subject: [PATCH 028/802] move data folder into source folder --- .gitignore | 4 ++ .../archiv/Template_Schedule_Data.xlsx | Bin .../archiv/Template_Schedule_Data_english.csv | 0 .../archiv/Template_Schedule_Data_german.csv | 0 ebus_toolbox/data/examples/ebus_toolbox.cfg | 0 ebus_toolbox/data/examples/vehicle_types.json | 53 ++++++++++++++++++ 6 files changed, 57 insertions(+) rename data/{templates => }/archiv/Template_Schedule_Data.xlsx (100%) rename data/{templates => }/archiv/Template_Schedule_Data_english.csv (100%) rename data/{templates => }/archiv/Template_Schedule_Data_german.csv (100%) create mode 100644 ebus_toolbox/data/examples/ebus_toolbox.cfg create mode 100644 ebus_toolbox/data/examples/vehicle_types.json diff --git a/.gitignore b/.gitignore index 3c4e0b77..ffd4281e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ .vscode/ .DS_Store .python-version +* .pyc +__pycache__ docs/_build docs/source/temp + +ebus_toolbox/data/private_examples diff --git a/data/templates/archiv/Template_Schedule_Data.xlsx b/data/archiv/Template_Schedule_Data.xlsx similarity index 100% rename from data/templates/archiv/Template_Schedule_Data.xlsx rename to data/archiv/Template_Schedule_Data.xlsx diff --git a/data/templates/archiv/Template_Schedule_Data_english.csv b/data/archiv/Template_Schedule_Data_english.csv similarity index 100% rename from data/templates/archiv/Template_Schedule_Data_english.csv rename to data/archiv/Template_Schedule_Data_english.csv diff --git a/data/templates/archiv/Template_Schedule_Data_german.csv b/data/archiv/Template_Schedule_Data_german.csv similarity index 100% rename from data/templates/archiv/Template_Schedule_Data_german.csv rename to data/archiv/Template_Schedule_Data_german.csv diff --git a/ebus_toolbox/data/examples/ebus_toolbox.cfg b/ebus_toolbox/data/examples/ebus_toolbox.cfg new file mode 100644 index 00000000..e69de29b diff --git a/ebus_toolbox/data/examples/vehicle_types.json b/ebus_toolbox/data/examples/vehicle_types.json new file mode 100644 index 00000000..1636da21 --- /dev/null +++ b/ebus_toolbox/data/examples/vehicle_types.json @@ -0,0 +1,53 @@ +{ + "sprinter_small": { + "name": "Sprinter (small)", + "capacity": 38, + "mileage": 25, + "charging_curve": [[0, 11], [0.8, 11], [1, 11]], + "min_charging_power": 0.2, + "v2g": false, + "v2g_power_factor": 0.5 + }, + "sprinter": { + "name": "Sprinter", + "capacity": 76, + "mileage": 40, + "charging_curve": [[0, 11], [0.8, 11], [1, 11]], + "min_charging_power": 0.2, + "v2g": false, + "v2g_power_factor": 0.5 + }, + "golf": { + "name": "E-Golf", + "capacity": 50, + "mileage": 16, + "charging_curve": [[0, 22], [0.8, 22], [1, 22]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5 + }, + "AB-OPP": { + "name": "articulated bus - opportunity charging", + "capacity": 50, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5 + }, + "minimum_information": { + "name": "Displayed name", + "capacity": 0, + "mileage": 0, + "charging_curve": [[0,1],[1,0]] + }, + "all_information": { + "name": "Displayed name", + "capacity": 0, + "mileage": 0, + "charging_curve": [[0,1],[1,0]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5, + "battery_efficiency": 0.95 + } +} From 37b9bcc16496626201c4a0f8727ad8ea1f57bc55 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Thu, 17 Feb 2022 18:40:50 +0100 Subject: [PATCH 029/802] an oop approach/idea --- ebus_toolbox/consumption.py | 2 +- ebus_toolbox/optimizer.py | 4 +++ ebus_toolbox/preprocessing.py | 40 ------------------------ ebus_toolbox/report.py | 3 ++ ebus_toolbox/rotation.py | 17 ++++++++++ ebus_toolbox/rotation_filter.py | 12 ------- ebus_toolbox/schedule.py | 50 ++++++++++++++++++++++++++++++ ebus_toolbox/simulate.py | 19 ++++-------- ebus_toolbox/test.py | 8 +++++ ebus_toolbox/trip.py | 23 ++++++++++++++ ebus_toolbox/vehicle_assignment.py | 6 ---- 11 files changed, 112 insertions(+), 72 deletions(-) delete mode 100644 ebus_toolbox/preprocessing.py create mode 100644 ebus_toolbox/rotation.py delete mode 100644 ebus_toolbox/rotation_filter.py create mode 100644 ebus_toolbox/schedule.py create mode 100644 ebus_toolbox/test.py create mode 100644 ebus_toolbox/trip.py delete mode 100644 ebus_toolbox/vehicle_assignment.py diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index a46dbc86..678df2c0 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,5 +1,5 @@ -def consumption(): +def naive(): """ Calculate the consumptions for each trip and rotation. Various consumption schemes possible depending on available data. """ diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index f4515d9a..9c9c9e3e 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -1,3 +1,7 @@ +""" Optimizer that evaluates inputs and outputs of every iteration, adapting scenario setup + to optimize for specified metrics. +""" + def no_optimization(): return True diff --git a/ebus_toolbox/preprocessing.py b/ebus_toolbox/preprocessing.py deleted file mode 100644 index 8045dcd1..00000000 --- a/ebus_toolbox/preprocessing.py +++ /dev/null @@ -1,40 +0,0 @@ -# imports - -def check_trip_data(trips): - """ The provided trips file is checked against the following requirements: - - Folloing columns are provided: - Required: - Rotation, - Line, - Leg, - Departure time, - Departure day, - Arrival time, - Arrival day, - Break at arrival, - Vehicle type, - Departure name, - Departure ID, - Arrival name, - Arrival ID, - Distance, - Optional: - Empty trip, - Departure (short name), - Arrival (short name), - - - - - - :param trips: Dictionaries for every trip - :type trips: list - - :return: True if data is valid, else False. - :rtype: bool - """ - return True - - -def add_charging_types(): - """Add charging types to each vehicle if not already given by trips or vehicle type. - """ - pass diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index a1733cc1..4f93e7e0 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -1,3 +1,6 @@ +""" Module to generate meaningful output files and/or figures to describe simulation process +""" + def generate(): pass diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py new file mode 100644 index 00000000..f9c0402f --- /dev/null +++ b/ebus_toolbox/rotation.py @@ -0,0 +1,17 @@ +from trip import Trip + + +class Rotation: + + def __init__(self, id) -> None: + self.id = id + self.trips = [] + + def add_trip(self, trip): + """Create a trip object and append to rotations trip set + + :param trip: Information on trip to be added to rotation + :type trip: dict + """ + + self.trips.append(Trip(**trip)) diff --git a/ebus_toolbox/rotation_filter.py b/ebus_toolbox/rotation_filter.py deleted file mode 100644 index f0f4780b..00000000 --- a/ebus_toolbox/rotation_filter.py +++ /dev/null @@ -1,12 +0,0 @@ - -def filter_rotations(trips): - """ Iterate across trips and remove trips that fit criteria given in config. - Possible filters: - - specific rotation IDs - - distance thresholds - - - - :param trips: Dictionaries for every trip - :type trips: list - """ - pass diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py new file mode 100644 index 00000000..c60f0a21 --- /dev/null +++ b/ebus_toolbox/schedule.py @@ -0,0 +1,50 @@ +import csv + +from rotation import Rotation + + +class Schedule: + + def __init__(self) -> None: + """Constructs Schedule object from CSV file containing all trips of schedule""" + self.rotations = {} + + @classmethod + def from_csv(cls, path_to_csv): + """Constructs Schedule object from CSV file containing all trips of schedule. + + :param path_to_csv: Path to csv file containing trip data + :type path_to_csv: str + """ + schedule = cls() + + with open(path_to_csv, 'r') as trips_file: + trip_reader = csv.DictReader(trips_file) + for trip in trip_reader: + rotation_id = trip['rotation_id'] + if rotation_id not in schedule.rotations.keys(): + schedule.rotations.update({rotation_id: Rotation(rotation_id)}) + + schedule.rotations[rotation_id].add_trip(trip) + + def remove_rotation_by_id(self, id): + del self.rotations[id] + + def filter_rotations(self, filter_definition): + """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" + pass + + def add_charging_types(self): + """Iterate across all rotations/trips and append charging type if not given""" + pass + + def assign_vehicles(): + """ Assign vehicle IDs to rotations. + Just randomly? Match consumption with battery sizes? + """ + pass + + def calculate_consumption(self, consumption_func): + for rot in self.rotations.values(): + for trip in rot.trips: + trip.consumption(consumption_func) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 13dc2415..7397959c 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,8 +1,5 @@ # imports -import preprocessing -import consumption -import vehicle_assignment -import rotation_filter +from schedule import Schedule import optimizer import report @@ -14,12 +11,9 @@ def simulate(args=None): :type args: argparse.Namespace """ - # read CSV input file - # check for correct data format / standard - preprocessing.validate(None) - + schedule = Schedule.from_csv("path_to_file.csv") # filter trips according to args - rotation_filter.filter(None) + schedule.filter_rotations(args.filters) # initialize optimizer @@ -27,10 +21,9 @@ def simulate(args=None): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - preprocessing.add_charging_types() - consumption.constant() - vehicle_assignment.fishgrid() - + schedule.add_charging_types() + schedule.calculate_consumption(args.consumption_func) + schedule.assign_vehicles() # write trips to csv in spiceEV format # RUN SPICE EV diff --git a/ebus_toolbox/test.py b/ebus_toolbox/test.py new file mode 100644 index 00000000..d77bb8da --- /dev/null +++ b/ebus_toolbox/test.py @@ -0,0 +1,8 @@ +from schedule import Schedule +import os + +abspath = os.path.abspath(__file__) +dname = os.path.dirname(abspath) +os.chdir(dname) + +schedule = Schedule.from_csv("./data/private_examples/Trips_example.csv") diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py new file mode 100644 index 00000000..2ddbbd70 --- /dev/null +++ b/ebus_toolbox/trip.py @@ -0,0 +1,23 @@ +import consumption + + +class Trip: + + def __init__(self, departure_time, departure_name, + arrival_time, arrival_name, distance, **kwargs): + self.departure_name = departure_name + self.departure_time = departure_time + self.arrival_time = arrival_time + self.arrival_name = arrival_name + self.distance = distance + + self.vehicle_id = kwargs.get('vehicle_id', None) + + self.consumption = getattr(consumption, kwargs['consumption_func'], 'naive')(distance, + departure_time, + arrival_time) + + def calculate_consumption(self, consumption_func=None): + self.consumption = getattr(consumption, consumption_func, 'naive')(self.distance, + self.departure_time, + self.arrival_time) diff --git a/ebus_toolbox/vehicle_assignment.py b/ebus_toolbox/vehicle_assignment.py deleted file mode 100644 index 05d6c752..00000000 --- a/ebus_toolbox/vehicle_assignment.py +++ /dev/null @@ -1,6 +0,0 @@ - -def assign_vehicles(): - """ Assign vehicle IDs to rotations. - Just randomly? Match consumption with battery sizes? - """ - pass From 436b29d8e83e4cd00a846d757ea47c6856a1a2b4 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 22 Feb 2022 08:49:20 +0100 Subject: [PATCH 030/802] example implementation of trip consumption --- ebus_toolbox/consumption.py | 60 +++++++++++++++++-- .../data/examples/default_temp_summer.csv | 25 ++++++++ .../data/examples/default_temp_winter.csv | 25 ++++++++ ebus_toolbox/data/examples/vehicle_types.json | 36 +++++++++++ ebus_toolbox/rotation.py | 10 ++++ ebus_toolbox/schedule.py | 16 +++-- ebus_toolbox/test.py | 8 --- ebus_toolbox/trip.py | 28 +++++---- 8 files changed, 180 insertions(+), 28 deletions(-) create mode 100644 ebus_toolbox/data/examples/default_temp_summer.csv create mode 100644 ebus_toolbox/data/examples/default_temp_winter.csv delete mode 100644 ebus_toolbox/test.py diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 678df2c0..2a564589 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,6 +1,56 @@ +import numpy as np +import csv +import json -def naive(): - """ Calculate the consumptions for each trip and rotation. - Various consumption schemes possible depending on available data. - """ - pass + +class Consumption: + + def __init__(self) -> None: + # load temperature of the day, now dummy winter day + self.temperatures_by_hour = {} + with open("./data/examples/default_temp_winter.csv") as f: + reader = csv.DictReader(f) + for row in reader: + self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) + + self.consumption_files = {} + with open("./data/examples/vehicle_types.json") as f: + self.vehicle_types = json.load(f) + + def calculate_consumption(self, time, distance, vehicle_type): + """ Calculates consumed amount of energy for a given distance. + + :param time: The date and time at which the trip ends + :type time: datetime.datetime + :param distance: Distance travelled [km] + :type distance: float + :param vehicle_type: The vehicle type for which to calculate consumption + :type vehicle_type: str + :return: Consumed energy [kWh] and delta SOC as tuple + :rtype: (float, float) + """ + temp = np.interp(time.hour, + list(self.temperatures_by_hour.keys()), + list(self.temperatures_by_hour.values())) + + # load consumption csv + consumption_file = self.vehicle_types[vehicle_type]["mileage"] + try: + consumption = self.consumption_files[consumption_file] + except KeyError: + consumption = {'temperature': [], 'consumption': []} + with open(consumption_file, 'r') as f: + reader = csv.DictReader(f) + for row in reader: + consumption['temperature'].append(float(row['Temp.'])) + consumption['consumption'].append(float(row['Kat. B'])) + self.consumption_files.update({consumption_file: consumption}) + + xp = self.consumption_files[consumption_file]['temperature'] + fp = self.consumption_files[consumption_file]['consumption'] + + mileage = np.interp(temp, xp, fp) # kWh / km ??? + consumed_energy = mileage * distance # kWh + delta_SOC = consumed_energy / self.vehicle_types[vehicle_type]["capacity"] + + return (consumed_energy, delta_SOC) diff --git a/ebus_toolbox/data/examples/default_temp_summer.csv b/ebus_toolbox/data/examples/default_temp_summer.csv new file mode 100644 index 00000000..9296654d --- /dev/null +++ b/ebus_toolbox/data/examples/default_temp_summer.csv @@ -0,0 +1,25 @@ +Time,Temperature in C +00:00:00,23.8 +01:00:00,23.8 +02:00:00,22.7 +03:00:00,22.2 +04:00:00,21.1 +05:00:00,20 +06:00:00,20 +07:00:00,21.1 +08:00:00,22.7 +09:00:00,25 +10:00:00,28.8 +11:00:00,31.1 +12:00:00,32.7 +13:00:00,33.8 +14:00:00,36.1 +15:00:00,36.1 +16:00:00,36.1 +17:00:00,33.8 +18:00:00,32.2 +19:00:00,32.2 +20:00:00,27.2 +21:00:00,25 +22:00:00,23.8 +23:00:00,25 diff --git a/ebus_toolbox/data/examples/default_temp_winter.csv b/ebus_toolbox/data/examples/default_temp_winter.csv new file mode 100644 index 00000000..67ea0d6d --- /dev/null +++ b/ebus_toolbox/data/examples/default_temp_winter.csv @@ -0,0 +1,25 @@ +hour,temperature +00,-1.1 +01,-1.1 +02,-2.2 +03,-2.7 +04,-2.7 +05,-2.7 +06,-2.7 +07,-3.8 +08,-3.8 +09,-3.8 +10,-3.8 +11,-2.7 +12,-1.1 +13,1.1 +14,2.2 +15,2.2 +16,1.1 +17,0 +18,0 +19,-1.1 +20,-1.1 +21,-1.1 +22,-1.1 +23,-1.1 diff --git a/ebus_toolbox/data/examples/vehicle_types.json b/ebus_toolbox/data/examples/vehicle_types.json index 1636da21..9ce88ddc 100644 --- a/ebus_toolbox/data/examples/vehicle_types.json +++ b/ebus_toolbox/data/examples/vehicle_types.json @@ -34,6 +34,42 @@ "v2g": false, "v2g_power_factor": 0.5 }, + "CKB_depot": { + "name": "articulated bus", + "capacity": 310, + "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "hc": "winter" + }, + "CKB_opp": { + "name": "articulated bus", + "capacity": 190, + "charging_curve": [[0, 190], [0.8, 190], [1, 1900]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "hc": "winter" + }, + "VDL_depot": { + "name": "solo bus", + "capacity": 250, + "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "hc": "winter" + }, + "VDL_opp": { + "name": "solo bus", + "capacity": 250, + "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "hc": "winter" + }, "minimum_information": { "name": "Displayed name", "capacity": 0, diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index f9c0402f..1f2d83d4 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -6,6 +6,7 @@ class Rotation: def __init__(self, id) -> None: self.id = id self.trips = [] + self.consumption = 0 def add_trip(self, trip): """Create a trip object and append to rotations trip set @@ -15,3 +16,12 @@ def add_trip(self, trip): """ self.trips.append(Trip(**trip)) + + def calculate_consumption(self): + rotation_consumption = 0 + for trip in self.trips: + rotation_consumption += trip.calculate_consumption() + + self.consumption = rotation_consumption + + return rotation_consumption diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c60f0a21..8f55ff6e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -27,10 +27,17 @@ def from_csv(cls, path_to_csv): schedule.rotations[rotation_id].add_trip(trip) + return schedule + def remove_rotation_by_id(self, id): + """ Removes a rotation from schedule + + :param id: Rotation ID to be removed + :type id: int + """ del self.rotations[id] - def filter_rotations(self, filter_definition): + def filter_rotations(self): """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" pass @@ -38,13 +45,12 @@ def add_charging_types(self): """Iterate across all rotations/trips and append charging type if not given""" pass - def assign_vehicles(): + def assign_vehicles(self): """ Assign vehicle IDs to rotations. Just randomly? Match consumption with battery sizes? """ pass - def calculate_consumption(self, consumption_func): + def calculate_consumption(self): for rot in self.rotations.values(): - for trip in rot.trips: - trip.consumption(consumption_func) + rot.calculate_consumption() diff --git a/ebus_toolbox/test.py b/ebus_toolbox/test.py deleted file mode 100644 index d77bb8da..00000000 --- a/ebus_toolbox/test.py +++ /dev/null @@ -1,8 +0,0 @@ -from schedule import Schedule -import os - -abspath = os.path.abspath(__file__) -dname = os.path.dirname(abspath) -os.chdir(dname) - -schedule = Schedule.from_csv("./data/private_examples/Trips_example.csv") diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 2ddbbd70..f5833101 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -1,23 +1,31 @@ -import consumption +import datetime +import random + +from consumption import Consumption class Trip: + consumption = Consumption() def __init__(self, departure_time, departure_name, arrival_time, arrival_name, distance, **kwargs): self.departure_name = departure_name self.departure_time = departure_time - self.arrival_time = arrival_time + self.arrival_time = datetime.datetime(2021, 8, 3, random.randint(0, 23), 30) self.arrival_name = arrival_name - self.distance = distance + self.distance = float(distance) + self.vehicle_type = kwargs.get('vehicle_type') + '_opp' # dummy for testing purpose + self.charging_type = None # maybe make charging type a member? self.vehicle_id = kwargs.get('vehicle_id', None) - self.consumption = getattr(consumption, kwargs['consumption_func'], 'naive')(distance, - departure_time, - arrival_time) + self.consumption = 0 + self.delta_SOC = 0 + + def calculate_consumption(self): + self.consumption, self.delta_SOC = \ + Trip.consumption.calculate_consumption(self.arrival_time, + self.distance, + self.vehicle_type) - def calculate_consumption(self, consumption_func=None): - self.consumption = getattr(consumption, consumption_func, 'naive')(self.distance, - self.departure_time, - self.arrival_time) + return self.consumption From e410b678860b2fde319dacc0ebb8b220526b39b8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 22 Feb 2022 08:56:30 +0100 Subject: [PATCH 031/802] calculate total schedule consumption --- ebus_toolbox/schedule.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8f55ff6e..41d68cbd 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -9,12 +9,16 @@ def __init__(self) -> None: """Constructs Schedule object from CSV file containing all trips of schedule""" self.rotations = {} + self.consumption = 0 + @classmethod def from_csv(cls, path_to_csv): """Constructs Schedule object from CSV file containing all trips of schedule. :param path_to_csv: Path to csv file containing trip data :type path_to_csv: str + :return: Returns a new instance of Schedule with all trips from csv loaded. + :rtype: Schedule """ schedule = cls() @@ -52,5 +56,8 @@ def assign_vehicles(self): pass def calculate_consumption(self): + self.consumption = 0 for rot in self.rotations.values(): - rot.calculate_consumption() + self.consumption += rot.calculate_consumption() + + return self.consumption From 0c2e95d7c6af584b4d3e529d3b0a0b0f1928cdce Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 22 Feb 2022 08:59:14 +0100 Subject: [PATCH 032/802] some comments --- ebus_toolbox/trip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index f5833101..9c09af02 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -11,7 +11,7 @@ def __init__(self, departure_time, departure_name, arrival_time, arrival_name, distance, **kwargs): self.departure_name = departure_name self.departure_time = departure_time - self.arrival_time = datetime.datetime(2021, 8, 3, random.randint(0, 23), 30) + self.arrival_time = datetime.datetime(2021, 8, 3, random.randint(0, 23), 30) # testing self.arrival_name = arrival_name self.distance = float(distance) @@ -19,7 +19,7 @@ def __init__(self, departure_time, departure_name, self.charging_type = None # maybe make charging type a member? self.vehicle_id = kwargs.get('vehicle_id', None) - self.consumption = 0 + self.consumption = 0 # kWh self.delta_SOC = 0 def calculate_consumption(self): From 42644cdd3f151ef3abcc40c989dec693995da634 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 23 Feb 2022 12:47:33 +0100 Subject: [PATCH 033/802] relocate data folder --- .../examples/default_temp_summer.csv | 0 .../examples/default_temp_winter.csv | 0 .../data => data}/examples/ebus_toolbox.cfg | 0 .../data => data}/examples/vehicle_types.json | 0 .../energy_consumption_eindecker_solaris.csv | 23 + data/private_examples/trips_example-bvg.csv | 3958 +++++++++++++++++ ebus_toolbox/__main__.py | 4 + ebus_toolbox/schedule.py | 1 - ebus_toolbox/simulate.py | 4 +- 9 files changed, 3987 insertions(+), 3 deletions(-) rename {ebus_toolbox/data => data}/examples/default_temp_summer.csv (100%) rename {ebus_toolbox/data => data}/examples/default_temp_winter.csv (100%) rename {ebus_toolbox/data => data}/examples/ebus_toolbox.cfg (100%) rename {ebus_toolbox/data => data}/examples/vehicle_types.json (100%) create mode 100644 data/private_examples/energy_consumption_eindecker_solaris.csv create mode 100644 data/private_examples/trips_example-bvg.csv create mode 100644 ebus_toolbox/__main__.py diff --git a/ebus_toolbox/data/examples/default_temp_summer.csv b/data/examples/default_temp_summer.csv similarity index 100% rename from ebus_toolbox/data/examples/default_temp_summer.csv rename to data/examples/default_temp_summer.csv diff --git a/ebus_toolbox/data/examples/default_temp_winter.csv b/data/examples/default_temp_winter.csv similarity index 100% rename from ebus_toolbox/data/examples/default_temp_winter.csv rename to data/examples/default_temp_winter.csv diff --git a/ebus_toolbox/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg similarity index 100% rename from ebus_toolbox/data/examples/ebus_toolbox.cfg rename to data/examples/ebus_toolbox.cfg diff --git a/ebus_toolbox/data/examples/vehicle_types.json b/data/examples/vehicle_types.json similarity index 100% rename from ebus_toolbox/data/examples/vehicle_types.json rename to data/examples/vehicle_types.json diff --git a/data/private_examples/energy_consumption_eindecker_solaris.csv b/data/private_examples/energy_consumption_eindecker_solaris.csv new file mode 100644 index 00000000..0579860e --- /dev/null +++ b/data/private_examples/energy_consumption_eindecker_solaris.csv @@ -0,0 +1,23 @@ +Temp.,Alle,Kat. A,Kat. B,Kat. C +-8,2.07,2.2,2.04,1.71 +-6,1.9,2.03,1.76,1.59 +-4,1.81,1.89,1.75,1.58 +-2,1.78,1.86,1.65,1.49 +0,1.65,1.73,1.6,1.44 +2,1.61,1.67,1.57,1.38 +4,1.54,1.6,1.48,1.31 +6,1.47,1.52,1.44,1.25 +8,1.4,1.45,1.38,1.19 +10,1.33,1.37,1.3,1.16 +12,1.29,1.32,1.27,1.1 +14,1.2,1.23,1.17,1.04 +16,1.09,1.13,1.06,0.96 +18,1.06,1.08,1.03,0.93 +20,1.04,1.07,1.00,0.92 +22,1.08,1.11,1.03,0.93 +24,1.16,1.19,1.12,0.96 +26,1.23,1.27,1.2,1.03 +28,1.31,1.34,1.25,1.06 +30,1.43,1.46,1.38,1.11 +32,1.44,1.47,1.42,1.17 +34,1.53,1.57,1.45,1.24 diff --git a/data/private_examples/trips_example-bvg.csv b/data/private_examples/trips_example-bvg.csv new file mode 100644 index 00000000..d03c7600 --- /dev/null +++ b/data/private_examples/trips_example-bvg.csv @@ -0,0 +1,3958 @@ +line,departure_name,departure_short_name,departure_day,departure_time,arrival_time,arrival_day,arrival_name,arrival_short_name,distance,pause,rotation_id,vehicle_type +160,Betriebshof A,BF A E,Monday,21.5166666666666,21.5166666666666,Monday,Hasselwerderstr.,HAWR01B,0.06,0,4454943,CKB +160,Hasselwerderstr.,HAWR01B,Monday,21.5166666666666,22.0666666666666,Monday,Siriusstr.,SIRI01B,14519,4,4454943,CKB +160,Siriusstr.,SIRI01B,Monday,22.1333333333333,22.7166666666666,Monday,Hasselwerderstr.,HAWR01B,13541,8,4454943,CKB +160,Hasselwerderstr.,HAWR01B,Monday,22.85,23.4,Monday,Siriusstr.,SIRI01B,14519,4,4454943,CKB +160,Siriusstr.,SIRI01B,Monday,23.4666666666666,24.05,Tuesday,Hasselwerderstr.,HAWR01B,13541,8,4454943,CKB +160,Hasselwerderstr.,HAWR01B,Tuesday,0.183333333333333,0.733333333333333,Tuesday,Siriusstr.,SIRI01B,14519,0,4454943,CKB +N60,Siriusstr.,SIRI01B,Tuesday,0.733333333333333,0.9,Tuesday,S Adlershof,SAH02BN,4.1,25,4454943,CKB +N60,S Adlershof,SAH02BN,Tuesday,1.31666666666666,1.7,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454943,CKB +N60,Flughafen Schönefeld,SXF01B,Tuesday,1.8,2.1,Tuesday,S Adlershof,SAH02BN,9067,13,4454943,CKB +N60,S Adlershof,SAH02BN,Tuesday,2.31666666666666,2.7,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454943,CKB +N60,Flughafen Schönefeld,SXF01B,Tuesday,2.8,3.1,Tuesday,S Adlershof,SAH02BN,9067,13,4454943,CKB +N60,S Adlershof,SAH02BN,Tuesday,3.31666666666666,3.7,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454943,CKB +N60,Flughafen Schönefeld,SXF01B,Tuesday,3.8,4.1,Tuesday,S Adlershof,SAH02BN,9067,0,4454943,CKB +N60,S Adlershof,SAH02BN,Tuesday,4.1,4.1,Tuesday,Betriebshof A Aussetzen,BF A A,0.06,0,4454943,CKB +160,Betriebshof A,BF A E,Monday,22.1833333333333,22.1833333333333,Monday,Hasselwerderstr.,HAWR01B,0.06,0,4454948,CKB +160,Hasselwerderstr.,HAWR01B,Monday,22.1833333333333,22.7333333333333,Monday,Siriusstr.,SIRI01B,14519,4,4454948,CKB +160,Siriusstr.,SIRI01B,Monday,22.8,23.3833333333333,Monday,Hasselwerderstr.,HAWR01B,13541,8,4454948,CKB +160,Hasselwerderstr.,HAWR01B,Monday,23.5166666666666,24.0666666666666,Tuesday,Siriusstr.,SIRI01B,14519,4,4454948,CKB +160,Siriusstr.,SIRI01B,Tuesday,0.133333333333333,0.65,Tuesday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454948,CKB +N60,S Schöneweide/Sterndamm,SSWS06B,Tuesday,0.65,0.783333333333333,Tuesday,S Adlershof,SAH02BN,4.0,2,4454948,CKB +N60,S Adlershof,SAH02BN,Tuesday,0.816666666666666,1.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454948,CKB +N60,Flughafen Schönefeld,SXF01B,Tuesday,1.3,1.6,Tuesday,S Adlershof,SAH02BN,9067,13,4454948,CKB +N60,S Adlershof,SAH02BN,Tuesday,1.81666666666666,2.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454948,CKB +N60,Flughafen Schönefeld,SXF01B,Tuesday,2.3,2.6,Tuesday,S Adlershof,SAH02BN,9067,13,4454948,CKB +N60,S Adlershof,SAH02BN,Tuesday,2.81666666666666,3.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454948,CKB +N60,Flughafen Schönefeld,SXF01B,Tuesday,3.3,3.6,Tuesday,S Adlershof,SAH02BN,9067,13,4454948,CKB +N60,S Adlershof,SAH02BN,Tuesday,3.81666666666666,4.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,0,4454948,CKB +N60,Flughafen Schönefeld,SXF01B,Tuesday,4.2,4.2,Tuesday,Betriebshof A,BF A A,0.06,0,4454948,CKB +161,Betriebshof A,BF A E,Monday,21.1,21.1,Monday,S Erkner/ZOB,SERZ01B,0.06,0,4664622,CKB +161,S Erkner/ZOB,SERZ01B,Monday,21.1,21.5666666666666,Monday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664622,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Monday,21.8833333333333,22.2166666666666,Monday,Lutherstr.,LUTH01B,10332,17,4664622,CKB +161,Lutherstr.,LUTH01B,Monday,22.5,22.9,Monday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664622,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Monday,23.2166666666666,23.55,Monday,Lutherstr.,LUTH01B,10332,17,4664622,CKB +161,Lutherstr.,LUTH01B,Monday,23.8333333333333,24.2333333333333,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664622,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,0.266666666666666,0.383333333333333,Tuesday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664622,CKB +N61,Rahnsdorf/Waldschänke,RDWS03BN,Tuesday,0.466666666666666,0.733333333333333,Tuesday,Dämeritzstr.,DARI01B,6404,3,4664622,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,0.783333333333333,1.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,1.28333333333333,1.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4664622,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,1.78333333333333,2.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,2.28333333333333,2.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4664622,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,2.78333333333333,3.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,3.28333333333333,3.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4664622,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,3.78333333333333,4.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,4.28333333333333,4.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,0,4664622,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,4.73333333333333,4.73333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4664622,CKB +161,Betriebshof A,BF A E,Monday,20.4333333333333,20.4333333333333,Monday,S Erkner/ZOB,SERZ01B,0.06,0,4762732,CKB +161,S Erkner/ZOB,SERZ01B,Monday,20.4333333333333,20.9333333333333,Monday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762732,CKB +161,"Schöneiche, Goethepark",SEGP01BA,Monday,21.1666666666666,21.6333333333333,Monday,S Erkner/ZOB,SERZ01B,13.19,8,4762732,CKB +161,S Erkner/ZOB,SERZ01B,Monday,21.7666666666666,22.2333333333333,Monday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762732,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Monday,22.55,22.8833333333333,Monday,Lutherstr.,LUTH01B,10332,17,4762732,CKB +161,Lutherstr.,LUTH01B,Monday,23.1666666666666,23.5666666666666,Monday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762732,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Monday,23.8833333333333,24.2166666666666,Tuesday,Lutherstr.,LUTH01B,10332,2,4762732,CKB +161,Lutherstr.,LUTH01B,Tuesday,0.25,0.266666666666666,Tuesday,Dämeritzstr.,DARI01B,506,1,4762732,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,0.283333333333333,0.666666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,0.783333333333333,1.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,1.28333333333333,1.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,1.78333333333333,2.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,2.28333333333333,2.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,2.78333333333333,3.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,3.28333333333333,3.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB +N61,S Friedrichshagen,SFHG05BN,Tuesday,3.78333333333333,4.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB +N61,Dämeritzstr.,DARI01B,Tuesday,4.28333333333333,4.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,3,4762732,CKB +N67,S Friedrichshagen,SFHG05BN,Tuesday,4.71666666666666,4.96666666666666,Tuesday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762732,CKB +N67,Schloßplatz Köpenick,SLPZ01BN,Tuesday,4.96666666666666,4.96666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4762732,CKB +163,Betriebshof A,BF A E,Monday,22.9333333333333,22.9333333333333,Monday,S Grünau,SGA24BA,0.06,0,4617401,CKB +163,S Grünau,SGA24BA,Monday,22.9333333333333,23.1333333333333,Monday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617401,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Monday,23.1833333333333,23.4166666666666,Monday,S Grünau,SGA22BA,6232,0,4617401,CKB +163,S Grünau,SGA22BA,Monday,23.4166666666666,23.6333333333333,Monday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617401,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Monday,23.6833333333333,23.9166666666666,Monday,S Grünau,SGA22BA,6232,0,4617401,CKB +163,S Grünau,SGA22BA,Monday,23.9166666666666,24.1333333333333,Tuesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617401,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Tuesday,0.133333333333333,0.133333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4617401,CKB +168,Betriebshof A,BF A E,Monday,5.08333333333333,5.08333333333333,Monday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,5.08333333333333,5.23333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,5.23333333333333,5.38333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,5.41666666666666,5.56666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,5.56666666666666,5.71666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,23,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,6.1,6.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,6.25,6.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,6.43333333333333,6.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,6.58333333333333,6.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,6.76666666666666,6.91666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,6.91666666666666,7.06666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,7.1,7.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,7.25,7.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,7.43333333333333,7.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,7.58333333333333,7.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,8.1,8.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,8.25,8.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,8.43333333333333,8.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,8.58333333333333,8.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,8.76666666666666,8.91666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,8.91666666666666,9.06666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,9.1,9.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,9.25,9.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,9.43333333333333,9.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,9.58333333333333,9.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,10.1,10.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,10.25,10.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,10.4333333333333,10.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,10.5833333333333,10.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,10.7666666666666,10.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,10.9166666666666,11.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,11.1,11.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,11.25,11.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,11.4333333333333,11.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,11.5833333333333,11.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,12.1,12.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,12.25,12.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,12.4333333333333,12.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,12.5833333333333,12.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,12.7666666666666,12.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,12.9166666666666,13.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,13.1,13.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,13.25,13.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,13.4333333333333,13.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,13.5833333333333,13.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,13.7666666666666,13.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,13.9166666666666,14.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,14.1,14.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,14.25,14.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,14.7666666666666,14.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,14.9166666666666,15.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,15.1,15.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,15.25,15.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,15.4333333333333,15.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,15.5833333333333,15.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,16.1,16.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,16.25,16.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,16.4333333333333,16.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,16.5833333333333,16.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,16.7666666666666,16.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,16.9166666666666,17.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,17.1,17.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,17.25,17.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,17.4333333333333,17.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,17.5833333333333,17.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,18.1,18.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,18.25,18.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,18.4333333333333,18.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,18.5833333333333,18.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,18.7666666666666,18.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,18.9166666666666,19.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,19.1,19.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,19.25,19.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,19.4333333333333,19.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,19.5833333333333,19.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,21,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,20.0833333333333,20.2333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,20.2333333333333,20.3833333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,20.4166666666666,20.5666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,20.5666666666666,20.7166666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,20.75,20.9,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,20.9,21.05,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,21.0833333333333,21.2333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,21.2333333333333,21.3833333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,21.4166666666666,21.5666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,21.5666666666666,21.7166666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,22.0833333333333,22.2333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,22.2333333333333,22.3833333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,22.4166666666666,22.5666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,22.5666666666666,22.7166666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,22.75,22.9,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB +168,Moßkopfring,MKFR01B,Monday,22.9,23.05,Monday,Alt-Schmöckwitz,ALSW02B,5139,0,4426844,CKB +168,Alt-Schmöckwitz,ALSW02B,Monday,23.05,23.05,Monday,Betriebshof A,BF A A,0.06,0,4426844,CKB +269,Betriebshof A,BF A E,Tuesday,0.1,0.1,Tuesday,S Kaulsdorf,SKD05B,0.06,0,4708594,CKB +269,S Kaulsdorf,SKD05B,Tuesday,0.1,0.45,Tuesday,S Köpenick,SKOE01B,7827,0,4708594,CKB +N69,S Köpenick,SKOE01B,Tuesday,0.45,0.8,Tuesday,Odernheimer Str.,ODNH01B,11079,0,4708594,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,0.8,1.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4708594,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,1.55,2.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4708594,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,2.28333333333333,2.91666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4708594,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,3.05,3.76666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4708594,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,3.78333333333333,4.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,0,4708594,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,4.41666666666666,4.41666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4708594,CKB +326,Betriebshof Indira-Gandhi-Str.,BF I E,Monday,5.25,6.01666666666666,Monday,S Hermsdorf,SHDF01B,17.9,0,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,6.01666666666666,6.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,6.38333333333333,6.61666666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,6.68333333333333,6.91666666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,7.05,7.28333333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,7.35,7.58333333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,7.71666666666666,7.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,8.01666666666666,8.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,8.38333333333333,8.61666666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,8.68333333333333,8.91666666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,9.05,9.28333333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,9.35,9.58333333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,9.71666666666666,9.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,10.0166666666666,10.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,10.3833333333333,10.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,10.6833333333333,10.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,11.05,11.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,11.35,11.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,11.7166666666666,11.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,12.0166666666666,12.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,12.3833333333333,12.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,12.6833333333333,12.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,13.05,13.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,13.35,13.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,13.7166666666666,13.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,14.0166666666666,14.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,14.3833333333333,14.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,14.6833333333333,14.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,15.05,15.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,15.35,15.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,15.7166666666666,15.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,16.0166666666666,16.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,16.3833333333333,16.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,16.6833333333333,16.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,17.05,17.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,17.35,17.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,17.7166666666666,17.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,18.0166666666666,18.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,18.3833333333333,18.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,18.6833333333333,18.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,19.05,19.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,19.35,19.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,19.7166666666666,19.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,20.0166666666666,20.2333333333333,Monday,S Hermsdorf,SHDF01B,4637,9,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,20.3833333333333,20.6,Monday,S Hermsdorf,SHDF01B,4637,0,4317624,VDL +326,S Hermsdorf,SHDF01B,Monday,20.6,21.25,Monday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317624,VDL +334,Betriebshof A,BF A E,Monday,4.93333333333333,4.93333333333333,Monday,Alt-Gatow,ALTG01B,0.06,18,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,5.23333333333333,5.33333333333333,Monday,Habichtswald,HWLD01B,3.29,0,4425667,CKB +334,Habichtswald,HWLD01B,Monday,5.33333333333333,5.4,Monday,Alt-Gatow,ALTG01B,2954,20,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,5.73333333333333,5.83333333333333,Monday,Habichtswald,HWLD01B,3.29,0,4425667,CKB +334,Habichtswald,HWLD01B,Monday,5.83333333333333,5.9,Monday,Alt-Gatow,ALTG01B,2954,5,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,5.98333333333333,6.1,Monday,Habichtswald,HWLD01B,3.29,2,4425667,CKB +334,Habichtswald,HWLD01B,Monday,6.13333333333333,6.21666666666666,Monday,Alt-Gatow,ALTG01B,2954,19,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,6.53333333333333,6.65,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB +334,Habichtswald,HWLD01B,Monday,6.66666666666666,6.75,Monday,Alt-Gatow,ALTG01B,2954,7,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,6.86666666666666,6.98333333333333,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB +334,Habichtswald,HWLD01B,Monday,7.0,7.08333333333333,Monday,Alt-Gatow,ALTG01B,2954,7,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,7.2,7.31666666666666,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB +334,Habichtswald,HWLD01B,Monday,7.33333333333333,7.41666666666666,Monday,Alt-Gatow,ALTG01B,2954,7,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,7.53333333333333,7.65,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB +334,Habichtswald,HWLD01B,Monday,7.66666666666666,7.75,Monday,Alt-Gatow,ALTG01B,2954,295,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,12.6666666666666,12.7833333333333,Monday,Habichtswald,HWLD01B,3.29,2,4425667,CKB +334,Habichtswald,HWLD01B,Monday,12.8166666666666,12.9,Monday,Alt-Gatow,ALTG01B,2954,46,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,13.6666666666666,13.7833333333333,Monday,Habichtswald,HWLD01B,3.29,2,4425667,CKB +334,Habichtswald,HWLD01B,Monday,13.8166666666666,13.9,Monday,Alt-Gatow,ALTG01B,2954,434,4425667,CKB +334,Alt-Gatow,ALTG01B,Monday,21.1333333333333,21.1333333333333,Monday,Betriebshof A,BF A A,0.06,0,4425667,CKB +349,Betriebshof A,BF A E,Monday,7.33333333333333,7.33333333333333,Monday,S Grunewald,SGD02B,0.06,0,4448149,CKB +349,S Grunewald,SGD02B,Monday,7.33333333333333,7.83333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,8.0,8.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,8.66666666666666,9.16666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,9.33333333333333,9.83333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,10.0,10.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,10.6666666666666,11.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,11.3333333333333,11.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,12.0,12.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,12.6666666666666,13.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,13.3333333333333,13.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,14.0,14.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,14.6666666666666,15.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,15.3333333333333,15.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,16.0,16.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,16.6666666666666,17.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,17.3333333333333,17.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB +349,S Grunewald,SGD02B,Monday,18.0,18.5,Monday,S Grunewald,SGD02B,9266,0,4448149,CKB +349,S Grunewald,SGD02B,Monday,18.5,18.5,Monday,Betriebshof A,BF A A,0.06,0,4448149,CKB +370,Betriebshof A,BF A E,Monday,7.16666666666666,7.16666666666666,Monday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,7.16666666666666,7.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,7.46666666666666,7.66666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,7.66666666666666,7.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,7.96666666666666,8.16666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,8.16666666666666,8.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,8.46666666666666,8.66666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,8.66666666666666,8.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,8.96666666666666,9.16666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,9.16666666666666,9.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,9.46666666666666,9.66666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,9.66666666666666,9.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,9.96666666666666,10.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,10.1666666666666,10.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,10.4666666666666,10.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,10.6666666666666,10.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,10.9666666666666,11.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,11.1666666666666,11.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,11.4666666666666,11.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,11.6666666666666,11.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,11.9666666666666,12.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,12.1666666666666,12.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,12.4666666666666,12.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,12.6666666666666,12.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,12.9666666666666,13.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,13.1666666666666,13.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,13.4666666666666,13.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,13.6666666666666,13.8,Monday,S+U Hermannstr.,SUHM09B,2169,8,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,13.9333333333333,14.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,14.1666666666666,14.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,14.55,14.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,14.8333333333333,14.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,15.2166666666666,15.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,15.5,15.65,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,15.8833333333333,16.1166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,16.1666666666666,16.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,16.55,16.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,16.8333333333333,16.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,17.2166666666666,17.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,17.5,17.65,Monday,S+U Hermannstr.,SUHM09B,2169,13,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,17.8666666666666,18.0833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,5,4733894,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,18.1666666666666,18.3,Monday,S+U Hermannstr.,SUHM09B,2169,0,4733894,CKB +370,S+U Hermannstr.,SUHM09B,Monday,18.3,18.3,Monday,Betriebshof A,BF A A,0.06,0,4733894,CKB +370,Betriebshof A,BF A E,Monday,14.2166666666666,14.2166666666666,Monday,S+U Hermannstr.,SUHM09B,0.06,0,4734199,CKB +370,S+U Hermannstr.,SUHM09B,Monday,14.2166666666666,14.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,14.5,14.65,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB +370,S+U Hermannstr.,SUHM09B,Monday,14.8833333333333,15.1166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,15.1666666666666,15.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB +370,S+U Hermannstr.,SUHM09B,Monday,15.55,15.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,15.8333333333333,15.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB +370,S+U Hermannstr.,SUHM09B,Monday,16.2166666666666,16.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,16.5,16.65,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB +370,S+U Hermannstr.,SUHM09B,Monday,16.8833333333333,17.1166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,17.1666666666666,17.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB +370,S+U Hermannstr.,SUHM09B,Monday,17.55,17.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,17.8333333333333,17.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB +370,S+U Hermannstr.,SUHM09B,Monday,18.2166666666666,18.4166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4734199,CKB +370,Neuköllnische Brücke,NKBR04BA,Monday,18.4166666666666,18.4166666666666,Monday,Betriebshof A,BF A A,0.06,0,4734199,CKB +N23,Betriebshof A,BF A E,Tuesday,0.383333333333333,0.383333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,0.06,0,4318156,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,0.383333333333333,0.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB +N39,U Rohrdamm,URDM01B,Tuesday,0.65,0.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB +N39,Mertensstr.,MTNS01B,Tuesday,1.05,1.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB +N23,U Rohrdamm,URDM02B,Tuesday,1.28333333333333,1.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,1.38333333333333,1.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB +N39,U Rohrdamm,URDM01B,Tuesday,1.65,1.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB +N39,Mertensstr.,MTNS01B,Tuesday,2.05,2.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB +N23,U Rohrdamm,URDM02B,Tuesday,2.28333333333333,2.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,2.38333333333333,2.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB +N39,U Rohrdamm,URDM01B,Tuesday,2.65,2.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB +N39,Mertensstr.,MTNS01B,Tuesday,3.05,3.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB +N23,U Rohrdamm,URDM02B,Tuesday,3.28333333333333,3.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,3.38333333333333,3.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB +N39,U Rohrdamm,URDM01B,Tuesday,3.65,3.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB +N39,Mertensstr.,MTNS01B,Tuesday,4.05,4.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB +N23,U Rohrdamm,URDM02B,Tuesday,4.28333333333333,4.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,4.38333333333333,4.38333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4318156,CKB +N39,Betriebshof A,BF A E,Tuesday,0.55,0.55,Tuesday,Mertensstr.,MTNS01B,0.06,0,4318176,CKB +N39,Mertensstr.,MTNS01B,Tuesday,0.55,0.783333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB +N23,U Rohrdamm,URDM02B,Tuesday,0.783333333333333,0.883333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,0.883333333333333,1.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB +N39,U Rohrdamm,URDM01B,Tuesday,1.15,1.4,Tuesday,Mertensstr.,MTNS01B,5937,9,4318176,CKB +N39,Mertensstr.,MTNS01B,Tuesday,1.55,1.78333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB +N23,U Rohrdamm,URDM02B,Tuesday,1.78333333333333,1.88333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,1.88333333333333,2.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB +N39,U Rohrdamm,URDM01B,Tuesday,2.15,2.4,Tuesday,Mertensstr.,MTNS01B,5937,9,4318176,CKB +N39,Mertensstr.,MTNS01B,Tuesday,2.55,2.78333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB +N23,U Rohrdamm,URDM02B,Tuesday,2.78333333333333,2.88333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,2.88333333333333,3.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB +N39,U Rohrdamm,URDM01B,Tuesday,3.15,3.4,Tuesday,Mertensstr.,MTNS01B,5937,9,4318176,CKB +N39,Mertensstr.,MTNS01B,Tuesday,3.55,3.78333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB +N23,U Rohrdamm,URDM02B,Tuesday,3.78333333333333,3.88333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB +N23,Mäckeritzwiesen,MAWI01B,Tuesday,3.88333333333333,4.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB +N39,U Rohrdamm,URDM01B,Tuesday,4.15,4.4,Tuesday,Mertensstr.,MTNS01B,5937,0,4318176,CKB +N39,Mertensstr.,MTNS01B,Tuesday,4.4,4.4,Tuesday,Betriebshof A,BF A A,0.06,0,4318176,CKB +N35,Betriebshof A,BF A E,Tuesday,0.95,0.95,Tuesday,Alt-Kladow,ALKL02B,0.06,0,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,0.95,1.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,1.1,1.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,1.45,1.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,1.6,1.68333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,1.95,2.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,2.1,2.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,2.45,2.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,2.6,2.68333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,2.95,3.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,3.1,3.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,3.45,3.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,3.6,3.68333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,3.95,4.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,4.1,4.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB +N35,Alt-Kladow,ALKL02B,Tuesday,4.45,4.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB +N35,Gutsstr.,GUTS01B,Tuesday,4.6,4.6,Tuesday,Betriebshof A,BF A A,0.06,0,4319351,CKB +N52,Betriebshof A,BF A E,Tuesday,0.483333333333333,0.483333333333333,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,0.483333333333333,0.683333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,0.783333333333333,0.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,0.983333333333333,1.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,1.28333333333333,1.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.48333333333333,1.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,1.78333333333333,1.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.98333333333333,2.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,2.28333333333333,2.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.48333333333333,2.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,2.78333333333333,2.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.98333333333333,3.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,3.28333333333333,3.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.48333333333333,3.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,3.78333333333333,3.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.98333333333333,4.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,4.28333333333333,4.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,4.48333333333333,4.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,0,4751086,CKB +N52,U Osloer Str.,UOSL04B,Tuesday,4.68333333333333,4.68333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4751086,CKB +N53,Betriebshof A,BF A E,Tuesday,0.5,0.5,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,0.5,0.733333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,0.733333333333333,0.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.0,1.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,1.23333333333333,1.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.5,1.73333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,1.73333333333333,1.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.0,2.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,2.23333333333333,2.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.5,2.73333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,2.73333333333333,2.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.0,3.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,3.23333333333333,3.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.5,3.73333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,3.73333333333333,3.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,4.0,4.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB +N53,Wilhelmsruher Damm,WIDA02B,Tuesday,4.23333333333333,4.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453544,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,4.45,4.45,Tuesday,Betriebshof A,BF A A,0.06,0,4453544,CKB +N56,Betriebshof A,BF A E,Tuesday,0.716666666666666,0.716666666666666,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374466,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,0.716666666666666,1.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374466,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,1.71666666666666,2.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374466,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,2.71666666666666,3.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374466,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,3.71666666666666,4.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374466,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,4.55,4.55,Tuesday,Betriebshof A,BF A A,0.06,0,4374466,CKB +N56,Betriebshof A,BF A E,Tuesday,0.216666666666666,0.216666666666666,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374471,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,0.216666666666666,1.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374471,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,1.21666666666666,2.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374471,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,2.21666666666666,3.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374471,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,3.21666666666666,4.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374471,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,4.05,4.05,Tuesday,Betriebshof A,BF A A,0.06,0,4374471,CKB +N58,Betriebshof A,BF A E,Tuesday,0.4,0.4,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456447,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,0.4,0.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB +N58,S Buch,SBU02B,Tuesday,0.866666666666666,1.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456447,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,1.4,1.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB +N58,S Buch,SBU02B,Tuesday,1.86666666666666,2.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456447,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,2.4,2.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB +N58,S Buch,SBU02B,Tuesday,2.86666666666666,3.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456447,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,3.4,3.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB +N58,S Buch,SBU02B,Tuesday,3.86666666666666,4.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456447,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,4.23333333333333,4.23333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4456447,CKB +N58,Betriebshof A,BF A E,Tuesday,0.366666666666666,0.366666666666666,Tuesday,S Buch,SBU02B,0.06,0,4456455,CKB +N58,S Buch,SBU02B,Tuesday,0.366666666666666,0.733333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,0.9,1.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB +N58,S Buch,SBU02B,Tuesday,1.36666666666666,1.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,1.9,2.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB +N58,S Buch,SBU02B,Tuesday,2.36666666666666,2.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,2.9,3.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB +N58,S Buch,SBU02B,Tuesday,3.36666666666666,3.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,3.9,4.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB +N58,S Buch,SBU02B,Tuesday,4.36666666666666,4.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456455,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,4.73333333333333,4.73333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4456455,CKB +N62,Betriebshof A,BF A E,Tuesday,0.533333333333333,0.533333333333333,Tuesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747649,CKB +N62,Schloßplatz Köpenick,SLPZ02BN,Tuesday,0.533333333333333,0.733333333333333,Tuesday,Wendenschloß,WESC09BA,4212,3,4747649,CKB +N62,Wendenschloß,WESC09BA,Tuesday,0.783333333333333,1.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,1.26666666666666,1.7,Tuesday,Wendenschloß,WESC09BA,12869,5,4747649,CKB +N62,Wendenschloß,WESC09BA,Tuesday,1.78333333333333,2.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,2.26666666666666,2.7,Tuesday,Wendenschloß,WESC09BA,12869,5,4747649,CKB +N62,Wendenschloß,WESC09BA,Tuesday,2.78333333333333,3.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,3.26666666666666,3.7,Tuesday,Wendenschloß,WESC09BA,12869,5,4747649,CKB +N62,Wendenschloß,WESC09BA,Tuesday,3.78333333333333,4.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,4.26666666666666,4.56666666666666,Tuesday,Betriebshof Köpenick,BHKO01BN,9538,0,4747649,CKB +N62,Betriebshof Köpenick,BHKO01BN,Tuesday,4.56666666666666,4.56666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4747649,CKB +N62,Betriebshof A,BF A E,Tuesday,0.283333333333333,0.283333333333333,Tuesday,Wendenschloß,WESC09BA,0.06,0,4747659,CKB +N62,Wendenschloß,WESC09BA,Tuesday,0.283333333333333,0.766666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,0.766666666666666,1.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB +N62,Wendenschloß,WESC09BA,Tuesday,1.28333333333333,1.76666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,1.76666666666666,2.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB +N62,Wendenschloß,WESC09BA,Tuesday,2.28333333333333,2.76666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,2.76666666666666,3.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB +N62,Wendenschloß,WESC09BA,Tuesday,3.28333333333333,3.76666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,3.76666666666666,4.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB +N62,Wendenschloß,WESC09BA,Tuesday,4.28333333333333,4.46666666666666,Tuesday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747659,CKB +N62,Schloßplatz Köpenick,SLPZ03B,Tuesday,4.46666666666666,4.46666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4747659,CKB +N68,Betriebshof A,BF A E,Tuesday,0.816666666666666,0.816666666666666,Tuesday,S Adlershof,SAH02BN,0.06,0,4434340,CKB +N68,S Adlershof,SAH02BN,Tuesday,0.816666666666666,1.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,1.06666666666666,1.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB +N68,S Adlershof,SAH02BN,Tuesday,1.31666666666666,1.56666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,1.56666666666666,1.81666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB +N68,S Adlershof,SAH02BN,Tuesday,1.81666666666666,2.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,2.06666666666666,2.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB +N68,S Adlershof,SAH02BN,Tuesday,2.31666666666666,2.56666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,2.56666666666666,2.81666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB +N68,S Adlershof,SAH02BN,Tuesday,2.81666666666666,3.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,3.06666666666666,3.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB +N68,S Adlershof,SAH02BN,Tuesday,3.31666666666666,3.56666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,3.56666666666666,3.81666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB +N68,S Adlershof,SAH02BN,Tuesday,3.81666666666666,4.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,4.06666666666666,4.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,23,4434340,CKB +164,S Adlershof,SAH02BN,Tuesday,4.7,5.06666666666666,Tuesday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434340,CKB +164,Kaulsdorfer Str.,KDFS02B,Tuesday,5.06666666666666,5.06666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4434340,CKB +N69,Betriebshof A,BF A E,Tuesday,0.533333333333333,0.533333333333333,Tuesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434896,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Tuesday,0.533333333333333,0.95,Tuesday,S+U Wuhletal,SUWT02BN,11545,6,4434896,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,1.05,1.76666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434896,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,1.78333333333333,2.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434896,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,2.55,3.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434896,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,3.28333333333333,3.91666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434896,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,4.05,4.46666666666666,Tuesday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434896,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Tuesday,4.46666666666666,4.46666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4434896,CKB +N69,Betriebshof A,BF A E,Tuesday,0.55,0.55,Tuesday,S+U Wuhletal,SUWT02BN,0.06,0,4434901,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,0.55,1.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434901,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,1.28333333333333,1.91666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434901,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,2.05,2.76666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434901,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,2.78333333333333,3.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434901,CKB +N69,S+U Wuhletal,SUWT02BN,Tuesday,3.55,4.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434901,CKB +N69,Odernheimer Str.,ODNH01B,Tuesday,4.28333333333333,4.85,Tuesday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434901,CKB +N69,U Elsterwerdaer Platz,UEWP03B,Tuesday,4.85,4.85,Tuesday,Betriebshof A,BF A A,0.06,0,4434901,CKB +N88,Betriebshof A,BF A E,Tuesday,0.566666666666666,0.566666666666666,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619765,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,0.566666666666666,1.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,1.0,1.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619765,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,1.56666666666666,2.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,2.0,2.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619765,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,2.56666666666666,3.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,3.0,3.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619765,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,3.56666666666666,4.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,4.0,4.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619765,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,4.45,4.45,Tuesday,Betriebshof A,BF A A,0.06,0,4619765,CKB +N88,Betriebshof A,BF A E,Tuesday,0.5,0.5,Tuesday,S Lichterfelde Süd,SLIS01B,0.06,0,4619990,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,0.5,0.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,1.06666666666666,1.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,1.5,1.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,2.06666666666666,2.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,2.5,2.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,3.06666666666666,3.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,3.5,3.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,4.06666666666666,4.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB +N88,S Lichterfelde Süd,SLIS01B,Tuesday,4.5,4.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619990,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,4.95,4.95,Tuesday,Betriebshof A,BF A A,0.06,0,4619990,CKB +N91,Betriebshof A,BF A E,Tuesday,0.516666666666666,0.516666666666666,Tuesday,S+U Wuhletal,SUWT02BN,0.06,0,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,0.516666666666666,0.733333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,0.733333333333333,0.933333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,1.01666666666666,1.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,1.23333333333333,1.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,1.51666666666666,1.73333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,1.73333333333333,1.93333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,2.01666666666666,2.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,2.23333333333333,2.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,2.51666666666666,2.73333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,2.73333333333333,2.93333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,3.01666666666666,3.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,3.23333333333333,3.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,3.51666666666666,3.73333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,3.73333333333333,3.93333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,4.01666666666666,4.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB +N91,Boschpoler Str.,BOPO01BN,Tuesday,4.23333333333333,4.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,0,4374743,CKB +N91,S+U Wuhletal,SUWT02BN,Tuesday,4.43333333333333,4.43333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4374743,CKB +N95,Betriebshof A,BF A E,Tuesday,0.516666666666666,0.516666666666666,Tuesday,S+U Wuhletal,SUWT02BN,0.06,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,0.516666666666666,0.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,0.783333333333333,1.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,1.01666666666666,1.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,1.28333333333333,1.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,1.51666666666666,1.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,1.78333333333333,2.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,2.01666666666666,2.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,2.28333333333333,2.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,2.51666666666666,2.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,2.78333333333333,3.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,3.01666666666666,3.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,3.28333333333333,3.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,3.51666666666666,3.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,3.78333333333333,4.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,4.01666666666666,4.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB +N95,Riesaer Str.,RIES01BN,Tuesday,4.28333333333333,4.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB +N95,S+U Wuhletal,SUWT02BN,Tuesday,4.51666666666666,4.51666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4374865,CKB +N97,Betriebshof A,BF A E,Tuesday,0.716666666666666,0.716666666666666,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,0.716666666666666,0.883333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,0.883333333333333,1.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,1.21666666666666,1.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,1.38333333333333,1.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,1.71666666666666,1.88333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,1.88333333333333,2.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,2.21666666666666,2.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,2.38333333333333,2.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,2.71666666666666,2.88333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,2.88333333333333,3.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,3.21666666666666,3.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,3.38333333333333,3.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,3.71666666666666,3.88333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,3.88333333333333,4.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,4.21666666666666,4.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB +N97,Barnimplatz,BARN01B,Tuesday,4.38333333333333,4.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375012,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,4.55,4.55,Tuesday,Betriebshof A,BF A A,0.06,0,4375012,CKB +N68,Betriebshof A,BF A E,Monday,0.816666666666666,0.816666666666666,Monday,S Adlershof,SAH02BN,0.06,0,4434215,CKB +N68,S Adlershof,SAH02BN,Monday,0.816666666666666,1.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Monday,1.06666666666666,1.31666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB +N68,S Adlershof,SAH02BN,Monday,1.31666666666666,1.56666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Monday,1.56666666666666,1.81666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB +N68,S Adlershof,SAH02BN,Monday,1.81666666666666,2.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Monday,2.06666666666666,2.31666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB +N68,S Adlershof,SAH02BN,Monday,2.31666666666666,2.56666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Monday,2.56666666666666,2.81666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB +N68,S Adlershof,SAH02BN,Monday,2.81666666666666,3.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Monday,3.06666666666666,3.31666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB +N68,S Adlershof,SAH02BN,Monday,3.31666666666666,3.56666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Monday,3.56666666666666,3.81666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB +N68,S Adlershof,SAH02BN,Monday,3.81666666666666,4.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Monday,4.06666666666666,4.31666666666666,Monday,S Adlershof,SAH02BN,11801,23,4434215,CKB +164,S Adlershof,SAH02BN,Monday,4.7,5.06666666666666,Monday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434215,CKB +164,Kaulsdorfer Str.,KDFS02B,Monday,5.06666666666666,5.06666666666666,Monday,Betriebshof A,BF A A,0.06,0,4434215,CKB +N23,Betriebshof A,BF A E,Monday,0.383333333333333,0.383333333333333,Monday,Mäckeritzwiesen,MAWI01B,0.06,0,4318071,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,0.383333333333333,0.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB +N39,U Rohrdamm,URDM01B,Monday,0.65,0.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB +N39,Mertensstr.,MTNS01B,Monday,1.05,1.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB +N23,U Rohrdamm,URDM02B,Monday,1.28333333333333,1.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,1.38333333333333,1.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB +N39,U Rohrdamm,URDM01B,Monday,1.65,1.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB +N39,Mertensstr.,MTNS01B,Monday,2.05,2.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB +N23,U Rohrdamm,URDM02B,Monday,2.28333333333333,2.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,2.38333333333333,2.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB +N39,U Rohrdamm,URDM01B,Monday,2.65,2.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB +N39,Mertensstr.,MTNS01B,Monday,3.05,3.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB +N23,U Rohrdamm,URDM02B,Monday,3.28333333333333,3.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,3.38333333333333,3.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB +N39,U Rohrdamm,URDM01B,Monday,3.65,3.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB +N39,Mertensstr.,MTNS01B,Monday,4.05,4.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB +N23,U Rohrdamm,URDM02B,Monday,4.28333333333333,4.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,4.38333333333333,4.38333333333333,Monday,Betriebshof A,BF A A,0.06,0,4318071,CKB +N39,Betriebshof A,BF A E,Monday,0.55,0.55,Monday,Mertensstr.,MTNS01B,0.06,0,4318083,CKB +N39,Mertensstr.,MTNS01B,Monday,0.55,0.783333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB +N23,U Rohrdamm,URDM02B,Monday,0.783333333333333,0.883333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,0.883333333333333,1.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB +N39,U Rohrdamm,URDM01B,Monday,1.15,1.4,Monday,Mertensstr.,MTNS01B,5937,9,4318083,CKB +N39,Mertensstr.,MTNS01B,Monday,1.55,1.78333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB +N23,U Rohrdamm,URDM02B,Monday,1.78333333333333,1.88333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,1.88333333333333,2.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB +N39,U Rohrdamm,URDM01B,Monday,2.15,2.4,Monday,Mertensstr.,MTNS01B,5937,9,4318083,CKB +N39,Mertensstr.,MTNS01B,Monday,2.55,2.78333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB +N23,U Rohrdamm,URDM02B,Monday,2.78333333333333,2.88333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,2.88333333333333,3.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB +N39,U Rohrdamm,URDM01B,Monday,3.15,3.4,Monday,Mertensstr.,MTNS01B,5937,9,4318083,CKB +N39,Mertensstr.,MTNS01B,Monday,3.55,3.78333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB +N23,U Rohrdamm,URDM02B,Monday,3.78333333333333,3.88333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB +N23,Mäckeritzwiesen,MAWI01B,Monday,3.88333333333333,4.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB +N39,U Rohrdamm,URDM01B,Monday,4.15,4.4,Monday,Mertensstr.,MTNS01B,5937,0,4318083,CKB +N39,Mertensstr.,MTNS01B,Monday,4.4,4.4,Monday,Betriebshof A,BF A A,0.06,0,4318083,CKB +N35,Betriebshof A,BF A E,Monday,0.95,0.95,Monday,Alt-Kladow,ALKL02B,0.06,0,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,0.95,1.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,1.1,1.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,1.45,1.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,1.6,1.68333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,1.95,2.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,2.1,2.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,2.45,2.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,2.6,2.68333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,2.95,3.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,3.1,3.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,3.45,3.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,3.6,3.68333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,3.95,4.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,4.1,4.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB +N35,Alt-Kladow,ALKL02B,Monday,4.45,4.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB +N35,Gutsstr.,GUTS01B,Monday,4.6,4.6,Monday,Betriebshof A,BF A A,0.06,0,4319428,CKB +N52,Betriebshof A,BF A E,Monday,0.483333333333333,0.483333333333333,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,0.483333333333333,0.683333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,0.783333333333333,0.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,0.983333333333333,1.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,1.28333333333333,1.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.48333333333333,1.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,1.78333333333333,1.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.98333333333333,2.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,2.28333333333333,2.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.48333333333333,2.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,2.78333333333333,2.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.98333333333333,3.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,3.28333333333333,3.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.48333333333333,3.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,3.78333333333333,3.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.98333333333333,4.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,4.28333333333333,4.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,4.48333333333333,4.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,0,4751093,CKB +N52,U Osloer Str.,UOSL04B,Monday,4.68333333333333,4.68333333333333,Monday,Betriebshof A,BF A A,0.06,0,4751093,CKB +N53,Betriebshof A,BF A E,Monday,0.5,0.5,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,0.5,0.733333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,0.733333333333333,0.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.0,1.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,1.23333333333333,1.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.5,1.73333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,1.73333333333333,1.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.0,2.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,2.23333333333333,2.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.5,2.73333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,2.73333333333333,2.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.0,3.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,3.23333333333333,3.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.5,3.73333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,3.73333333333333,3.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,4.0,4.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB +N53,Wilhelmsruher Damm,WIDA02B,Monday,4.23333333333333,4.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4454017,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,4.45,4.45,Monday,Betriebshof A,BF A A,0.06,0,4454017,CKB +N56,Betriebshof A,BF A E,Monday,0.716666666666666,0.716666666666666,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374470,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,0.716666666666666,1.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374470,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,1.71666666666666,2.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374470,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,2.71666666666666,3.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374470,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,3.71666666666666,4.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374470,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,4.55,4.55,Monday,Betriebshof A,BF A A,0.06,0,4374470,CKB +N56,Betriebshof A,BF A E,Monday,0.216666666666666,0.216666666666666,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374475,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,0.216666666666666,1.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374475,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,1.21666666666666,2.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374475,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,2.21666666666666,3.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374475,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,3.21666666666666,4.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374475,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,4.05,4.05,Monday,Betriebshof A,BF A A,0.06,0,4374475,CKB +N58,Betriebshof A,BF A E,Monday,0.4,0.4,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456537,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,0.4,0.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB +N58,S Buch,SBU02B,Monday,0.866666666666666,1.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456537,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,1.4,1.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB +N58,S Buch,SBU02B,Monday,1.86666666666666,2.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456537,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,2.4,2.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB +N58,S Buch,SBU02B,Monday,2.86666666666666,3.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456537,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,3.4,3.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB +N58,S Buch,SBU02B,Monday,3.86666666666666,4.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456537,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,4.23333333333333,4.23333333333333,Monday,Betriebshof A,BF A A,0.06,0,4456537,CKB +N58,Betriebshof A,BF A E,Monday,0.366666666666666,0.366666666666666,Monday,S Buch,SBU02B,0.06,0,4456538,CKB +N58,S Buch,SBU02B,Monday,0.366666666666666,0.733333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,0.9,1.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB +N58,S Buch,SBU02B,Monday,1.36666666666666,1.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,1.9,2.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB +N58,S Buch,SBU02B,Monday,2.36666666666666,2.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,2.9,3.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB +N58,S Buch,SBU02B,Monday,3.36666666666666,3.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,3.9,4.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB +N58,S Buch,SBU02B,Monday,4.36666666666666,4.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456538,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,4.73333333333333,4.73333333333333,Monday,Betriebshof A,BF A A,0.06,0,4456538,CKB +160,Betriebshof A,BF A E,Sunday,20.85,20.85,Sunday,Hasselwerderstr.,HAWR01B,0.06,0,4454973,CKB +160,Hasselwerderstr.,HAWR01B,Sunday,20.85,21.4,Sunday,Siriusstr.,SIRI01B,14519,4,4454973,CKB +160,Siriusstr.,SIRI01B,Sunday,21.4666666666666,22.05,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454973,CKB +160,Hasselwerderstr.,HAWR01B,Sunday,22.1833333333333,22.7333333333333,Sunday,Siriusstr.,SIRI01B,14519,4,4454973,CKB +160,Siriusstr.,SIRI01B,Sunday,22.8,23.3833333333333,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454973,CKB +160,Hasselwerderstr.,HAWR01B,Sunday,23.5166666666666,24.0666666666666,Monday,Siriusstr.,SIRI01B,14519,4,4454973,CKB +160,Siriusstr.,SIRI01B,Monday,0.133333333333333,0.65,Monday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454973,CKB +N60,S Schöneweide/Sterndamm,SSWS06B,Monday,0.65,0.783333333333333,Monday,S Adlershof,SAH02BN,4.0,2,4454973,CKB +N60,S Adlershof,SAH02BN,Monday,0.816666666666666,1.2,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454973,CKB +N60,Flughafen Schönefeld,SXF01B,Monday,1.3,1.6,Monday,S Adlershof,SAH02BN,9067,13,4454973,CKB +N60,S Adlershof,SAH02BN,Monday,1.81666666666666,2.2,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454973,CKB +N60,Flughafen Schönefeld,SXF01B,Monday,2.3,2.6,Monday,S Adlershof,SAH02BN,9067,13,4454973,CKB +N60,S Adlershof,SAH02BN,Monday,2.81666666666666,3.2,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454973,CKB +N60,Flughafen Schönefeld,SXF01B,Monday,3.3,3.6,Monday,S Adlershof,SAH02BN,9067,13,4454973,CKB +N60,S Adlershof,SAH02BN,Monday,3.81666666666666,4.2,Monday,Flughafen Schönefeld,SXF01B,8.36,0,4454973,CKB +N60,Flughafen Schönefeld,SXF01B,Monday,4.2,4.2,Monday,Betriebshof A,BF A A,0.06,0,4454973,CKB +160,Betriebshof A,BF A E,Sunday,21.5166666666666,21.5166666666666,Sunday,Hasselwerderstr.,HAWR01B,0.06,0,4454974,CKB +160,Hasselwerderstr.,HAWR01B,Sunday,21.5166666666666,22.0666666666666,Sunday,Siriusstr.,SIRI01B,14519,4,4454974,CKB +160,Siriusstr.,SIRI01B,Sunday,22.1333333333333,22.7166666666666,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454974,CKB +160,Hasselwerderstr.,HAWR01B,Sunday,22.85,23.4,Sunday,Siriusstr.,SIRI01B,14519,4,4454974,CKB +160,Siriusstr.,SIRI01B,Sunday,23.4666666666666,24.05,Monday,Hasselwerderstr.,HAWR01B,13541,8,4454974,CKB +160,Hasselwerderstr.,HAWR01B,Monday,0.183333333333333,0.733333333333333,Monday,Siriusstr.,SIRI01B,14519,0,4454974,CKB +N60,Siriusstr.,SIRI01B,Monday,0.733333333333333,0.9,Monday,S Adlershof,SAH02BN,4.1,25,4454974,CKB +N60,S Adlershof,SAH02BN,Monday,1.31666666666666,1.7,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454974,CKB +N60,Flughafen Schönefeld,SXF01B,Monday,1.8,2.1,Monday,S Adlershof,SAH02BN,9067,13,4454974,CKB +N60,S Adlershof,SAH02BN,Monday,2.31666666666666,2.7,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454974,CKB +N60,Flughafen Schönefeld,SXF01B,Monday,2.8,3.1,Monday,S Adlershof,SAH02BN,9067,13,4454974,CKB +N60,S Adlershof,SAH02BN,Monday,3.31666666666666,3.7,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454974,CKB +N60,Flughafen Schönefeld,SXF01B,Monday,3.8,4.1,Monday,S Adlershof,SAH02BN,9067,0,4454974,CKB +N60,S Adlershof,SAH02BN,Monday,4.1,4.1,Monday,Betriebshof A,BF A A,0.06,0,4454974,CKB +161,Betriebshof A,BF A E,Sunday,21.1,21.1,Sunday,S Erkner/ZOB,SERZ01B,0.06,0,4664782,CKB +161,S Erkner/ZOB,SERZ01B,Sunday,21.1,21.5666666666666,Sunday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664782,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,21.8833333333333,22.2166666666666,Sunday,Lutherstr.,LUTH01B,10332,17,4664782,CKB +161,Lutherstr.,LUTH01B,Sunday,22.5,22.9,Sunday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664782,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,23.2166666666666,23.55,Sunday,Lutherstr.,LUTH01B,10332,17,4664782,CKB +161,Lutherstr.,LUTH01B,Sunday,23.8333333333333,24.2333333333333,Monday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664782,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Monday,0.266666666666666,0.383333333333333,Monday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664782,CKB +N61,Rahnsdorf/Waldschänke,RDWS03BN,Monday,0.466666666666666,0.733333333333333,Monday,Dämeritzstr.,DARI01B,6404,3,4664782,CKB +N61,Dämeritzstr.,DARI01B,Monday,0.783333333333333,1.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,1.28333333333333,1.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4664782,CKB +N61,Dämeritzstr.,DARI01B,Monday,1.78333333333333,2.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,2.28333333333333,2.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4664782,CKB +N61,Dämeritzstr.,DARI01B,Monday,2.78333333333333,3.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,3.28333333333333,3.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4664782,CKB +N61,Dämeritzstr.,DARI01B,Monday,3.78333333333333,4.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,4.28333333333333,4.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,0,4664782,CKB +N61,Dämeritzstr.,DARI01B,Monday,4.73333333333333,4.73333333333333,Monday,Betriebshof A,BF A A,0.06,0,4664782,CKB +161,Betriebshof A,BF A E,Sunday,20.4333333333333,20.4333333333333,Sunday,S Erkner/ZOB,SERZ01B,0.06,0,4762788,CKB +161,S Erkner/ZOB,SERZ01B,Sunday,20.4333333333333,20.9333333333333,Sunday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762788,CKB +161,"Schöneiche, Goethepark",SEGP01BA,Sunday,21.1666666666666,21.6333333333333,Sunday,S Erkner/ZOB,SERZ01B,13.19,8,4762788,CKB +161,S Erkner/ZOB,SERZ01B,Sunday,21.7666666666666,22.2333333333333,Sunday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762788,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,22.55,22.8833333333333,Sunday,Lutherstr.,LUTH01B,10332,17,4762788,CKB +161,Lutherstr.,LUTH01B,Sunday,23.1666666666666,23.5666666666666,Sunday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762788,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,23.8833333333333,24.2166666666666,Monday,Lutherstr.,LUTH01B,10332,2,4762788,CKB +161,Lutherstr.,LUTH01B,Monday,0.25,0.266666666666666,Monday,Dämeritzstr.,DARI01B,506,1,4762788,CKB +N61,Dämeritzstr.,DARI01B,Monday,0.283333333333333,0.666666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,0.783333333333333,1.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB +N61,Dämeritzstr.,DARI01B,Monday,1.28333333333333,1.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,1.78333333333333,2.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB +N61,Dämeritzstr.,DARI01B,Monday,2.28333333333333,2.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,2.78333333333333,3.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB +N61,Dämeritzstr.,DARI01B,Monday,3.28333333333333,3.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB +N61,S Friedrichshagen,SFHG05BN,Monday,3.78333333333333,4.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB +N61,Dämeritzstr.,DARI01B,Monday,4.28333333333333,4.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,3,4762788,CKB +N67,S Friedrichshagen,SFHG05BN,Monday,4.71666666666666,4.96666666666666,Monday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762788,CKB +N67,Schloßplatz Köpenick,SLPZ01BN,Monday,4.96666666666666,4.96666666666666,Monday,Betriebshof A,BF A A,0.06,0,4762788,CKB +N62,Betriebshof A,BF A E,Monday,0.533333333333333,0.533333333333333,Monday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747688,CKB +N62,Schloßplatz Köpenick,SLPZ02BN,Monday,0.533333333333333,0.733333333333333,Monday,Wendenschloß,WESC09BA,4212,3,4747688,CKB +N62,Wendenschloß,WESC09BA,Monday,0.783333333333333,1.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,1.26666666666666,1.7,Monday,Wendenschloß,WESC09BA,12869,5,4747688,CKB +N62,Wendenschloß,WESC09BA,Monday,1.78333333333333,2.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,2.26666666666666,2.7,Monday,Wendenschloß,WESC09BA,12869,5,4747688,CKB +N62,Wendenschloß,WESC09BA,Monday,2.78333333333333,3.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,3.26666666666666,3.7,Monday,Wendenschloß,WESC09BA,12869,5,4747688,CKB +N62,Wendenschloß,WESC09BA,Monday,3.78333333333333,4.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,4.26666666666666,4.56666666666666,Monday,Betriebshof Köpenick,BHKO01BN,9538,0,4747688,CKB +N62,Betriebshof Köpenick,BHKO01BN,Monday,4.56666666666666,4.56666666666666,Monday,Betriebshof A,BF A A,0.06,0,4747688,CKB +N62,Betriebshof A,BF A E,Monday,0.283333333333333,0.283333333333333,Monday,Wendenschloß,WESC09BA,0.06,0,4747699,CKB +N62,Wendenschloß,WESC09BA,Monday,0.283333333333333,0.766666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,0.766666666666666,1.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB +N62,Wendenschloß,WESC09BA,Monday,1.28333333333333,1.76666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,1.76666666666666,2.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB +N62,Wendenschloß,WESC09BA,Monday,2.28333333333333,2.76666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,2.76666666666666,3.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB +N62,Wendenschloß,WESC09BA,Monday,3.28333333333333,3.76666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,3.76666666666666,4.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB +N62,Wendenschloß,WESC09BA,Monday,4.28333333333333,4.46666666666666,Monday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747699,CKB +N62,Schloßplatz Köpenick,SLPZ03B,Monday,4.46666666666666,4.46666666666666,Monday,Betriebshof A,BF A A,0.06,0,4747699,CKB +N69,Betriebshof A,BF A E,Monday,0.533333333333333,0.533333333333333,Monday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4627068,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Monday,0.533333333333333,0.95,Monday,S+U Wuhletal,SUWT02BN,11545,6,4627068,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,1.05,1.76666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627068,CKB +N69,Odernheimer Str.,ODNH01B,Monday,1.78333333333333,2.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627068,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,2.55,3.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627068,CKB +N69,Odernheimer Str.,ODNH01B,Monday,3.28333333333333,3.91666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627068,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,4.05,4.46666666666666,Monday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4627068,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Monday,4.46666666666666,4.46666666666666,Monday,Betriebshof A,BF A A,0.06,0,4627068,CKB +N69,Betriebshof A,BF A E,Monday,0.55,0.55,Monday,S+U Wuhletal,SUWT02BN,0.06,0,4627069,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,0.55,1.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627069,CKB +N69,Odernheimer Str.,ODNH01B,Monday,1.28333333333333,1.91666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627069,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,2.05,2.76666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627069,CKB +N69,Odernheimer Str.,ODNH01B,Monday,2.78333333333333,3.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627069,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,3.55,4.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627069,CKB +N69,Odernheimer Str.,ODNH01B,Monday,4.28333333333333,4.85,Monday,U Elsterwerdaer Platz,UEWP03B,18752,0,4627069,CKB +N69,U Elsterwerdaer Platz,UEWP03B,Monday,4.85,4.85,Monday,Betriebshof A,BF A A,0.06,0,4627069,CKB +269,Betriebshof A,BF A E,Monday,0.133333333333333,0.133333333333333,Monday,S Kaulsdorf,SKD05B,0.06,0,4710317,CKB +269,S Kaulsdorf,SKD05B,Monday,0.133333333333333,0.45,Monday,S Köpenick,SKOE01B,7827,0,4710317,CKB +N69,S Köpenick,SKOE01B,Monday,0.45,0.8,Monday,Odernheimer Str.,ODNH01B,11079,0,4710317,CKB +N69,Odernheimer Str.,ODNH01B,Monday,0.8,1.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4710317,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,1.55,2.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4710317,CKB +N69,Odernheimer Str.,ODNH01B,Monday,2.28333333333333,2.91666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4710317,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,3.05,3.76666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4710317,CKB +N69,Odernheimer Str.,ODNH01B,Monday,3.78333333333333,4.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,0,4710317,CKB +N69,S+U Wuhletal,SUWT02BN,Monday,4.41666666666666,4.41666666666666,Monday,Betriebshof A,BF A A,0.06,0,4710317,CKB +N88,Betriebshof A,BF A E,Monday,0.5,0.5,Monday,S Lichterfelde Süd,SLIS01B,0.06,0,4619816,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,0.5,0.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,1.06666666666666,1.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,1.5,1.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,2.06666666666666,2.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,2.5,2.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,3.06666666666666,3.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,3.5,3.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,4.06666666666666,4.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,4.5,4.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619816,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,4.95,4.95,Monday,Betriebshof A,BF A A,0.06,0,4619816,CKB +N88,Betriebshof A,BF A E,Monday,0.566666666666666,0.566666666666666,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619817,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,0.566666666666666,1.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,1.0,1.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619817,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,1.56666666666666,2.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,2.0,2.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619817,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,2.56666666666666,3.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,3.0,3.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619817,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,3.56666666666666,4.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB +N88,S Lichterfelde Süd,SLIS01B,Monday,4.0,4.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619817,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,4.45,4.45,Monday,Betriebshof A,BF A A,0.06,0,4619817,CKB +N91,Betriebshof A,BF A E,Monday,0.516666666666666,0.516666666666666,Monday,S+U Wuhletal,SUWT02BN,0.06,0,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,0.516666666666666,0.733333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,0.733333333333333,0.933333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,1.01666666666666,1.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,1.23333333333333,1.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,1.51666666666666,1.73333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,1.73333333333333,1.93333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,2.01666666666666,2.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,2.23333333333333,2.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,2.51666666666666,2.73333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,2.73333333333333,2.93333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,3.01666666666666,3.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,3.23333333333333,3.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,3.51666666666666,3.73333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,3.73333333333333,3.93333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,4.01666666666666,4.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB +N91,Boschpoler Str.,BOPO01BN,Monday,4.23333333333333,4.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,0,4374749,CKB +N91,S+U Wuhletal,SUWT02BN,Monday,4.43333333333333,4.43333333333333,Monday,Betriebshof A,BF A A,0.06,0,4374749,CKB +N95,Betriebshof A,BF A E,Monday,0.516666666666666,0.516666666666666,Monday,S+U Wuhletal,SUWT02BN,0.06,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,0.516666666666666,0.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,0.783333333333333,1.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,1.01666666666666,1.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,1.28333333333333,1.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,1.51666666666666,1.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,1.78333333333333,2.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,2.01666666666666,2.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,2.28333333333333,2.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,2.51666666666666,2.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,2.78333333333333,3.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,3.01666666666666,3.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,3.28333333333333,3.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,3.51666666666666,3.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,3.78333333333333,4.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,4.01666666666666,4.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB +N95,Riesaer Str.,RIES01BN,Monday,4.28333333333333,4.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB +N95,S+U Wuhletal,SUWT02BN,Monday,4.51666666666666,4.51666666666666,Monday,Betriebshof A,BF A A,0.06,0,4374873,CKB +N97,Betriebshof A,BF A E,Monday,0.716666666666666,0.716666666666666,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,0.716666666666666,0.883333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,0.883333333333333,1.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,1.21666666666666,1.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,1.38333333333333,1.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,1.71666666666666,1.88333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,1.88333333333333,2.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,2.21666666666666,2.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,2.38333333333333,2.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,2.71666666666666,2.88333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,2.88333333333333,3.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,3.21666666666666,3.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,3.38333333333333,3.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,3.71666666666666,3.88333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,3.88333333333333,4.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,4.21666666666666,4.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB +N97,Barnimplatz,BARN01B,Monday,4.38333333333333,4.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375018,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,4.55,4.55,Monday,Betriebshof A,BF A A,0.06,0,4375018,CKB +363,Betriebshof A,BF A E,Sunday,15.7666666666666,15.7666666666666,Sunday,S Grünau,SGA24BA,0.06,0,4458713,CKB +363,S Grünau,SGA24BA,Sunday,15.7666666666666,15.8833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3147,12,4458713,CKB +363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,16.0833333333333,16.25,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB +363,S Grünau,SGA22BA,Sunday,16.25,16.3833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB +363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,16.5833333333333,16.75,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB +363,S Grünau,SGA22BA,Sunday,16.75,16.8833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB +363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,17.0833333333333,17.25,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB +363,S Grünau,SGA22BA,Sunday,17.25,17.3833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB +363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,17.5833333333333,17.75,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB +363,S Grünau,SGA22BA,Sunday,17.75,17.8833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB +363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,18.0833333333333,18.25,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB +363,S Grünau,SGA22BA,Sunday,18.25,18.3833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,0,4458713,CKB +263,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,18.3833333333333,18.4833333333333,Sunday,S Grünau,SGA22BA,3.1,22,4458713,CKB +263,S Grünau,SGA22BA,Sunday,18.85,19.0333333333333,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB +263,Waldstr./Stadtgrenze,WASG01B,Sunday,19.0333333333333,19.2166666666666,Sunday,S Grünau,SGA22BA,4427,12,4458713,CKB +163,S Grünau,SGA22BA,Sunday,19.4166666666666,19.6333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,19.6833333333333,19.9166666666666,Sunday,S Grünau,SGA22BA,6232,0,4458713,CKB +163,S Grünau,SGA22BA,Sunday,19.9166666666666,20.1333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,20.1833333333333,20.4166666666666,Sunday,S Grünau,SGA22BA,6232,6,4458713,CKB +263,S Grünau,SGA22BA,Sunday,20.5166666666666,20.7,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB +263,Waldstr./Stadtgrenze,WASG01B,Sunday,20.7,20.8833333333333,Sunday,S Grünau,SGA22BA,4427,18,4458713,CKB +263,S Grünau,SGA22BA,Sunday,21.1833333333333,21.3666666666666,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB +263,Waldstr./Stadtgrenze,WASG01B,Sunday,21.3666666666666,21.55,Sunday,S Grünau,SGA22BA,4427,18,4458713,CKB +263,S Grünau,SGA22BA,Sunday,21.85,22.0333333333333,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB +263,Waldstr./Stadtgrenze,WASG01B,Sunday,22.0333333333333,22.2166666666666,Sunday,S Grünau,SGA22BA,4427,18,4458713,CKB +263,S Grünau,SGA22BA,Sunday,22.5166666666666,22.7,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB +263,Waldstr./Stadtgrenze,WASG01B,Sunday,22.7,22.8833333333333,Sunday,S Grünau,SGA22BA,4427,2,4458713,CKB +163,S Grünau,SGA22BA,Sunday,22.9166666666666,23.1333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,23.1833333333333,23.4166666666666,Sunday,S Grünau,SGA22BA,6232,0,4458713,CKB +163,S Grünau,SGA22BA,Sunday,23.4166666666666,23.6333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,23.6833333333333,23.9166666666666,Sunday,S Grünau,SGA22BA,6232,0,4458713,CKB +163,S Grünau,SGA22BA,Sunday,23.9166666666666,24.1333333333333,Monday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4458713,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Monday,0.133333333333333,0.133333333333333,Monday,Betriebshof A,BF A A,0.06,0,4458713,CKB +168,Betriebshof A,BF A E,Sunday,7.08333333333333,7.08333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,7.08333333333333,7.23333333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,7.23333333333333,7.38333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,7.41666666666666,7.56666666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,7.56666666666666,7.71666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,8.08333333333333,8.23333333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,8.23333333333333,8.38333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,8.41666666666666,8.56666666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,8.56666666666666,8.71666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,8.75,8.9,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,8.9,9.05,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,9.08333333333333,9.23333333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,9.23333333333333,9.38333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,9.41666666666666,9.56666666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,9.56666666666666,9.71666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,23,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,10.1,10.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,10.25,10.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,10.4333333333333,10.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,10.5833333333333,10.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,10.7666666666666,10.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,10.9166666666666,11.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,11.1,11.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,11.25,11.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,11.4333333333333,11.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,11.5833333333333,11.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,12.1,12.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,12.25,12.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,12.4333333333333,12.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,12.5833333333333,12.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,12.7666666666666,12.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,12.9166666666666,13.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,13.1,13.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,13.25,13.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,13.4333333333333,13.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,13.5833333333333,13.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,14.1,14.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,14.25,14.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,14.4333333333333,14.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,14.5833333333333,14.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,14.7666666666666,14.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,14.9166666666666,15.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,15.1,15.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,15.25,15.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,15.4333333333333,15.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,15.5833333333333,15.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,16.1,16.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,16.25,16.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,16.4333333333333,16.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,16.5833333333333,16.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,16.7666666666666,16.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,16.9166666666666,17.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,17.1,17.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,17.25,17.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,17.4333333333333,17.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,17.5833333333333,17.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,18.1,18.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,18.25,18.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,18.4333333333333,18.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,18.5833333333333,18.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,18.7666666666666,18.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,18.9166666666666,19.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,19.1,19.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,19.25,19.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,19.4333333333333,19.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,19.5833333333333,19.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,21,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,20.0833333333333,20.2333333333333,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,20.25,20.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,20.4166666666666,20.5666666666666,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,20.5833333333333,20.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,20.75,20.9,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,20.9166666666666,21.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,21.0833333333333,21.2333333333333,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,21.25,21.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,21.4166666666666,21.5666666666666,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,21.5833333333333,21.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,21,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,22.0833333333333,22.2333333333333,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,22.25,22.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,22.4166666666666,22.5666666666666,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,22.5833333333333,22.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,22.75,22.9,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB +168,Moßkopfring,MKFR01B,Sunday,22.9166666666666,23.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,0,4426903,CKB +168,Alt-Schmöckwitz,ALSW02B,Sunday,23.0666666666666,23.0666666666666,Sunday,Betriebshof A,BF A A,0.06,0,4426903,CKB +294,Betriebshof A,BF A E,Sunday,7.5,7.5,Sunday,Seehausener Str.,SEEH01B,0.06,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,7.5,7.58333333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,7.65,7.83333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,7.83333333333333,7.91666666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,7.98333333333333,8.16666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,8.16666666666666,8.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,8.31666666666666,8.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,8.5,8.58333333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,8.65,8.83333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,8.83333333333333,8.91666666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,8.98333333333333,9.16666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,9.16666666666666,9.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,9.31666666666666,9.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,9.5,9.58333333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,9.65,9.83333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,9.83333333333333,9.91666666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,9.98333333333333,10.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,10.1666666666666,10.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,10.3166666666666,10.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,10.5,10.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,10.65,10.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,10.8333333333333,10.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,10.9833333333333,11.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,11.1666666666666,11.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,11.3166666666666,11.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,11.5,11.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,11.65,11.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,11.8333333333333,11.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,11.9833333333333,12.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,12.1666666666666,12.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,12.3166666666666,12.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,12.5,12.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,12.65,12.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,12.8333333333333,12.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,12.9833333333333,13.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,13.1666666666666,13.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,13.3166666666666,13.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,13.5,13.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,13.65,13.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,13.8333333333333,13.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,13.9833333333333,14.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,14.1666666666666,14.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,14.3166666666666,14.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,14.5,14.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,14.65,14.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,14.8333333333333,14.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,14.9833333333333,15.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,15.1666666666666,15.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,15.3166666666666,15.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,15.5,15.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,15.65,15.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,15.8333333333333,15.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,15.9833333333333,16.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,16.1666666666666,16.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,16.3166666666666,16.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,16.5,16.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,16.65,16.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,16.8333333333333,16.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,16.9833333333333,17.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,17.1666666666666,17.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,17.3166666666666,17.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,17.5,17.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,17.65,17.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,17.8333333333333,17.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,17.9833333333333,18.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,18.1666666666666,18.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,18.3166666666666,18.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,18.5,18.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,18.65,18.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB +294,Seehausener Str.,SEEH01B,Sunday,18.8333333333333,18.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB +294,Gehrenseestr.,GEHR05B,Sunday,18.9833333333333,19.1666666666666,Sunday,Seehausener Str.,SEEH02B,4288,0,4369706,CKB +294,Seehausener Str.,SEEH02B,Sunday,19.1666666666666,19.1666666666666,Sunday,Betriebshof A,BF A A,0.06,0,4369706,CKB +334,Betriebshof A,BF A E,Sunday,7.93333333333333,7.93333333333333,Sunday,Alt-Gatow,ALTG01B,0.06,0,4419537,CKB +334,Alt-Gatow,ALTG01B,Sunday,7.93333333333333,7.93333333333333,Sunday,Alt-Gatow,ALTG99B,0.0,792,4419537,CKB +334,Alt-Gatow,ALTG99B,Sunday,21.1333333333333,21.1333333333333,Sunday,Alt-Gatow,ALTG01B,0.0,0,4419537,CKB +334,Alt-Gatow,ALTG01B,Sunday,21.1333333333333,21.1333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4419537,CKB +369,Betriebshof A,BF A E,Sunday,7.3,7.3,Sunday,Müggelheim/Dorf,MHDO01B,0.06,0,4688586,CKB +369,Müggelheim/Dorf,MHDO01B,Sunday,7.3,7.43333333333333,Sunday,"Gosen, Eiche",GOSE01B,5562,10,4688586,CKB +369,"Gosen, Eiche",GOSE01B,Sunday,7.6,7.75,Sunday,Alt-Müggelheim,ALMG01B,5941,32,4688586,CKB +369,Alt-Müggelheim,ALMG01B,Sunday,8.28333333333333,8.43333333333333,Sunday,"Gosen, Eiche",GOSE01B,5994,10,4688586,CKB +369,"Gosen, Eiche",GOSE01B,Sunday,8.6,8.75,Sunday,Alt-Müggelheim,ALMG01B,5941,32,4688586,CKB +369,Alt-Müggelheim,ALMG01B,Sunday,9.28333333333333,9.43333333333333,Sunday,"Gosen, Eiche",GOSE01B,5994,8,4688586,CKB +369,"Gosen, Eiche",GOSE01B,Sunday,9.56666666666666,9.71666666666666,Sunday,Alt-Müggelheim,ALMG01B,5941,36,4688586,CKB +369,Alt-Müggelheim,ALMG01B,Sunday,10.3166666666666,10.5,Sunday,"Gosen, Eiche",GOSE01B,5994,2,4688586,CKB +369,"Gosen, Eiche",GOSE01B,Sunday,10.5333333333333,10.6833333333333,Sunday,Müggelheim/Dorf,MHDO02B,5566,0,4688586,CKB +369,Müggelheim/Dorf,MHDO02B,Sunday,10.6833333333333,10.6833333333333,Sunday,Betriebshof A,BF A A,0.06,0,4688586,CKB +160,Betriebshof A,BF A E,Tuesday,21.5166666666666,21.5166666666666,Tuesday,Hasselwerderstr.,HAWR01B,0.06,0,4454944,CKB +160,Hasselwerderstr.,HAWR01B,Tuesday,21.5166666666666,22.0666666666666,Tuesday,Siriusstr.,SIRI01B,14519,4,4454944,CKB +160,Siriusstr.,SIRI01B,Tuesday,22.1333333333333,22.7166666666666,Tuesday,Hasselwerderstr.,HAWR01B,13541,8,4454944,CKB +160,Hasselwerderstr.,HAWR01B,Tuesday,22.85,23.4,Tuesday,Siriusstr.,SIRI01B,14519,4,4454944,CKB +160,Siriusstr.,SIRI01B,Tuesday,23.4666666666666,24.05,Wednesday,Hasselwerderstr.,HAWR01B,13541,8,4454944,CKB +160,Hasselwerderstr.,HAWR01B,Wednesday,0.183333333333333,0.733333333333333,Wednesday,Siriusstr.,SIRI01B,14519,0,4454944,CKB +N60,Siriusstr.,SIRI01B,Wednesday,0.733333333333333,0.9,Wednesday,S Adlershof,SAH02BN,4.1,25,4454944,CKB +N60,S Adlershof,SAH02BN,Wednesday,1.31666666666666,1.7,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454944,CKB +N60,Flughafen Schönefeld,SXF01B,Wednesday,1.8,2.1,Wednesday,S Adlershof,SAH02BN,9067,13,4454944,CKB +N60,S Adlershof,SAH02BN,Wednesday,2.31666666666666,2.7,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454944,CKB +N60,Flughafen Schönefeld,SXF01B,Wednesday,2.8,3.1,Wednesday,S Adlershof,SAH02BN,9067,13,4454944,CKB +N60,S Adlershof,SAH02BN,Wednesday,3.31666666666666,3.7,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454944,CKB +N60,Flughafen Schönefeld,SXF01B,Wednesday,3.8,4.1,Wednesday,S Adlershof,SAH02BN,9067,0,4454944,CKB +N60,S Adlershof,SAH02BN,Wednesday,4.1,4.1,Wednesday,Betriebshof A,BF A A,0.06,0,4454944,CKB +160,Betriebshof A,BF A E,Tuesday,22.1833333333333,22.1833333333333,Tuesday,Hasselwerderstr.,HAWR01B,0.06,0,4454949,CKB +160,Hasselwerderstr.,HAWR01B,Tuesday,22.1833333333333,22.7333333333333,Tuesday,Siriusstr.,SIRI01B,14519,4,4454949,CKB +160,Siriusstr.,SIRI01B,Tuesday,22.8,23.3833333333333,Tuesday,Hasselwerderstr.,HAWR01B,13541,8,4454949,CKB +160,Hasselwerderstr.,HAWR01B,Tuesday,23.5166666666666,24.0666666666666,Wednesday,Siriusstr.,SIRI01B,14519,4,4454949,CKB +160,Siriusstr.,SIRI01B,Wednesday,0.133333333333333,0.65,Wednesday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454949,CKB +N60,S Schöneweide/Sterndamm,SSWS06B,Wednesday,0.65,0.783333333333333,Wednesday,S Adlershof,SAH02BN,4.0,2,4454949,CKB +N60,S Adlershof,SAH02BN,Wednesday,0.816666666666666,1.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454949,CKB +N60,Flughafen Schönefeld,SXF01B,Wednesday,1.3,1.6,Wednesday,S Adlershof,SAH02BN,9067,13,4454949,CKB +N60,S Adlershof,SAH02BN,Wednesday,1.81666666666666,2.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454949,CKB +N60,Flughafen Schönefeld,SXF01B,Wednesday,2.3,2.6,Wednesday,S Adlershof,SAH02BN,9067,13,4454949,CKB +N60,S Adlershof,SAH02BN,Wednesday,2.81666666666666,3.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454949,CKB +N60,Flughafen Schönefeld,SXF01B,Wednesday,3.3,3.6,Wednesday,S Adlershof,SAH02BN,9067,13,4454949,CKB +N60,S Adlershof,SAH02BN,Wednesday,3.81666666666666,4.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,0,4454949,CKB +N60,Flughafen Schönefeld,SXF01B,Wednesday,4.2,4.2,Wednesday,Betriebshof A,BF A A,0.06,0,4454949,CKB +161,Betriebshof A,BF A E,Tuesday,21.1,21.1,Tuesday,S Erkner/ZOB,SERZ01B,0.06,0,4664623,CKB +161,S Erkner/ZOB,SERZ01B,Tuesday,21.1,21.5666666666666,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664623,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,21.8833333333333,22.2166666666666,Tuesday,Lutherstr.,LUTH01B,10332,17,4664623,CKB +161,Lutherstr.,LUTH01B,Tuesday,22.5,22.9,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664623,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,23.2166666666666,23.55,Tuesday,Lutherstr.,LUTH01B,10332,17,4664623,CKB +161,Lutherstr.,LUTH01B,Tuesday,23.8333333333333,24.2333333333333,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664623,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,0.266666666666666,0.383333333333333,Wednesday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664623,CKB +N61,Rahnsdorf/Waldschänke,RDWS03BN,Wednesday,0.466666666666666,0.733333333333333,Wednesday,Dämeritzstr.,DARI01B,6404,3,4664623,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,0.783333333333333,1.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,1.28333333333333,1.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4664623,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,1.78333333333333,2.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,2.28333333333333,2.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4664623,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,2.78333333333333,3.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,3.28333333333333,3.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4664623,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,3.78333333333333,4.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,4.28333333333333,4.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,0,4664623,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,4.73333333333333,4.73333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4664623,CKB +161,Betriebshof A,BF A E,Tuesday,20.4333333333333,20.4333333333333,Tuesday,S Erkner/ZOB,SERZ01B,0.06,0,4762733,CKB +161,S Erkner/ZOB,SERZ01B,Tuesday,20.4333333333333,20.9333333333333,Tuesday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762733,CKB +161,"Schöneiche, Goethepark",SEGP01BA,Tuesday,21.1666666666666,21.6333333333333,Tuesday,S Erkner/ZOB,SERZ01B,13.19,8,4762733,CKB +161,S Erkner/ZOB,SERZ01B,Tuesday,21.7666666666666,22.2333333333333,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762733,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,22.55,22.8833333333333,Tuesday,Lutherstr.,LUTH01B,10332,17,4762733,CKB +161,Lutherstr.,LUTH01B,Tuesday,23.1666666666666,23.5666666666666,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762733,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,23.8833333333333,24.2166666666666,Wednesday,Lutherstr.,LUTH01B,10332,2,4762733,CKB +161,Lutherstr.,LUTH01B,Wednesday,0.25,0.266666666666666,Wednesday,Dämeritzstr.,DARI01B,506,1,4762733,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,0.283333333333333,0.666666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,0.783333333333333,1.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,1.28333333333333,1.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,1.78333333333333,2.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,2.28333333333333,2.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,2.78333333333333,3.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,3.28333333333333,3.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB +N61,S Friedrichshagen,SFHG05BN,Wednesday,3.78333333333333,4.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB +N61,Dämeritzstr.,DARI01B,Wednesday,4.28333333333333,4.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,3,4762733,CKB +N67,S Friedrichshagen,SFHG05BN,Wednesday,4.71666666666666,4.96666666666666,Wednesday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762733,CKB +N67,Schloßplatz Köpenick,SLPZ01BN,Wednesday,4.96666666666666,4.96666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4762733,CKB +163,Betriebshof A,BF A E,Tuesday,22.9333333333333,22.9333333333333,Tuesday,S Grünau,SGA24BA,0.06,0,4617408,CKB +163,S Grünau,SGA24BA,Tuesday,22.9333333333333,23.1333333333333,Tuesday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617408,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Tuesday,23.1833333333333,23.4166666666666,Tuesday,S Grünau,SGA22BA,6232,0,4617408,CKB +163,S Grünau,SGA22BA,Tuesday,23.4166666666666,23.6333333333333,Tuesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617408,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Tuesday,23.6833333333333,23.9166666666666,Tuesday,S Grünau,SGA22BA,6232,0,4617408,CKB +163,S Grünau,SGA22BA,Tuesday,23.9166666666666,24.1333333333333,Wednesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617408,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Wednesday,0.133333333333333,0.133333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4617408,CKB +168,Betriebshof A,BF A E,Tuesday,5.08333333333333,5.08333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,5.08333333333333,5.23333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,5.23333333333333,5.38333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,5.41666666666666,5.56666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,5.56666666666666,5.71666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,23,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,6.1,6.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,6.25,6.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,6.43333333333333,6.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,6.58333333333333,6.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,6.76666666666666,6.91666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,6.91666666666666,7.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,7.1,7.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,7.25,7.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,7.43333333333333,7.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,7.58333333333333,7.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,8.1,8.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,8.25,8.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,8.43333333333333,8.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,8.58333333333333,8.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,8.76666666666666,8.91666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,8.91666666666666,9.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,9.1,9.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,9.25,9.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,9.43333333333333,9.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,9.58333333333333,9.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,10.1,10.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,10.25,10.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,10.4333333333333,10.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,10.5833333333333,10.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,10.7666666666666,10.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,10.9166666666666,11.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,11.1,11.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,11.25,11.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,11.4333333333333,11.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,11.5833333333333,11.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,12.1,12.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,12.25,12.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,12.4333333333333,12.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,12.5833333333333,12.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,12.7666666666666,12.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,12.9166666666666,13.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,13.1,13.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,13.25,13.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,13.4333333333333,13.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,13.5833333333333,13.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,13.7666666666666,13.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,13.9166666666666,14.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,14.1,14.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,14.25,14.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,14.7666666666666,14.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,14.9166666666666,15.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,15.1,15.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,15.25,15.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,15.4333333333333,15.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,15.5833333333333,15.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,16.1,16.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,16.25,16.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,16.4333333333333,16.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,16.5833333333333,16.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,16.7666666666666,16.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,16.9166666666666,17.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,17.1,17.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,17.25,17.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,17.4333333333333,17.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,17.5833333333333,17.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,18.1,18.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,18.25,18.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,18.4333333333333,18.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,18.5833333333333,18.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,18.7666666666666,18.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,18.9166666666666,19.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,19.1,19.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,19.25,19.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,19.4333333333333,19.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,19.5833333333333,19.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,21,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,20.0833333333333,20.2333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,20.2333333333333,20.3833333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,20.4166666666666,20.5666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,20.5666666666666,20.7166666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,20.75,20.9,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,20.9,21.05,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,21.0833333333333,21.2333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,21.2333333333333,21.3833333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,21.4166666666666,21.5666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,21.5666666666666,21.7166666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,22.0833333333333,22.2333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,22.2333333333333,22.3833333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,22.4166666666666,22.5666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,22.5666666666666,22.7166666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,22.75,22.9,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB +168,Moßkopfring,MKFR01B,Tuesday,22.9,23.05,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,0,4426845,CKB +168,Alt-Schmöckwitz,ALSW02B,Tuesday,23.05,23.05,Tuesday,Betriebshof A,BF A A,0.06,0,4426845,CKB +269,Betriebshof A,BF A E,Wednesday,0.1,0.1,Wednesday,S Kaulsdorf,SKD05B,0.06,0,4708595,CKB +269,S Kaulsdorf,SKD05B,Wednesday,0.1,0.45,Wednesday,S Köpenick,SKOE01B,7827,0,4708595,CKB +N69,S Köpenick,SKOE01B,Wednesday,0.45,0.8,Wednesday,Odernheimer Str.,ODNH01B,11079,0,4708595,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,0.8,1.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4708595,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,1.55,2.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4708595,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,2.28333333333333,2.91666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4708595,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,3.05,3.76666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4708595,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,3.78333333333333,4.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,0,4708595,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,4.41666666666666,4.41666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4708595,CKB +326,Betriebshof Indira-Gandhi-Str.,BF I E,Tuesday,5.25,6.01666666666666,Tuesday,S Hermsdorf,SHDF01B,17.9,0,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,6.01666666666666,6.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,6.38333333333333,6.61666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,6.68333333333333,6.91666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,7.05,7.28333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,7.35,7.58333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,7.71666666666666,7.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,8.01666666666666,8.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,8.38333333333333,8.61666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,8.68333333333333,8.91666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,9.05,9.28333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,9.35,9.58333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,9.71666666666666,9.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,10.0166666666666,10.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,10.3833333333333,10.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,10.6833333333333,10.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,11.05,11.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,11.35,11.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,11.7166666666666,11.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,12.0166666666666,12.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,12.3833333333333,12.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,12.6833333333333,12.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,13.05,13.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,13.35,13.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,13.7166666666666,13.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,14.0166666666666,14.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,14.3833333333333,14.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,14.6833333333333,14.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,15.05,15.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,15.35,15.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,15.7166666666666,15.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,16.0166666666666,16.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,16.3833333333333,16.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,16.6833333333333,16.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,17.05,17.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,17.35,17.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,17.7166666666666,17.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,18.0166666666666,18.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,18.3833333333333,18.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,18.6833333333333,18.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,19.05,19.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,19.35,19.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,19.7166666666666,19.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,20.0166666666666,20.2333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,9,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,20.3833333333333,20.6,Tuesday,S Hermsdorf,SHDF01B,4637,0,4317625,VDL +326,S Hermsdorf,SHDF01B,Tuesday,20.6,21.25,Tuesday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317625,VDL +334,Betriebshof A,BF A E,Tuesday,4.93333333333333,4.93333333333333,Tuesday,Alt-Gatow,ALTG01B,0.06,18,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,5.23333333333333,5.33333333333333,Tuesday,Habichtswald,HWLD01B,3.29,0,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,5.33333333333333,5.4,Tuesday,Alt-Gatow,ALTG01B,2954,20,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,5.73333333333333,5.83333333333333,Tuesday,Habichtswald,HWLD01B,3.29,0,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,5.83333333333333,5.9,Tuesday,Alt-Gatow,ALTG01B,2954,5,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,5.98333333333333,6.1,Tuesday,Habichtswald,HWLD01B,3.29,2,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,6.13333333333333,6.21666666666666,Tuesday,Alt-Gatow,ALTG01B,2954,19,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,6.53333333333333,6.65,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,6.66666666666666,6.75,Tuesday,Alt-Gatow,ALTG01B,2954,7,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,6.86666666666666,6.98333333333333,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,7.0,7.08333333333333,Tuesday,Alt-Gatow,ALTG01B,2954,7,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,7.2,7.31666666666666,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,7.33333333333333,7.41666666666666,Tuesday,Alt-Gatow,ALTG01B,2954,7,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,7.53333333333333,7.65,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,7.66666666666666,7.75,Tuesday,Alt-Gatow,ALTG01B,2954,295,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,12.6666666666666,12.7833333333333,Tuesday,Habichtswald,HWLD01B,3.29,2,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,12.8166666666666,12.9,Tuesday,Alt-Gatow,ALTG01B,2954,46,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,13.6666666666666,13.7833333333333,Tuesday,Habichtswald,HWLD01B,3.29,2,4425668,CKB +334,Habichtswald,HWLD01B,Tuesday,13.8166666666666,13.9,Tuesday,Alt-Gatow,ALTG01B,2954,434,4425668,CKB +334,Alt-Gatow,ALTG01B,Tuesday,21.1333333333333,21.1333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4425668,CKB +349,Betriebshof A,BF A E,Tuesday,7.33333333333333,7.33333333333333,Tuesday,S Grunewald,SGD02B,0.06,0,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,7.33333333333333,7.83333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,8.0,8.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,8.66666666666666,9.16666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,9.33333333333333,9.83333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,10.0,10.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,10.6666666666666,11.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,11.3333333333333,11.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,12.0,12.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,12.6666666666666,13.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,13.3333333333333,13.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,14.0,14.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,14.6666666666666,15.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,15.3333333333333,15.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,16.0,16.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,16.6666666666666,17.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,17.3333333333333,17.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,18.0,18.5,Tuesday,S Grunewald,SGD02B,9266,0,4448150,CKB +349,S Grunewald,SGD02B,Tuesday,18.5,18.5,Tuesday,Betriebshof A,BF A A,0.06,0,4448150,CKB +370,Betriebshof A,BF A E,Tuesday,7.16666666666666,7.16666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,7.16666666666666,7.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,7.46666666666666,7.66666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,7.66666666666666,7.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,7.96666666666666,8.16666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,8.16666666666666,8.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,8.46666666666666,8.66666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,8.66666666666666,8.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,8.96666666666666,9.16666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,9.16666666666666,9.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,9.46666666666666,9.66666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,9.66666666666666,9.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,9.96666666666666,10.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,10.1666666666666,10.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,10.4666666666666,10.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,10.6666666666666,10.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,10.9666666666666,11.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,11.1666666666666,11.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,11.4666666666666,11.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,11.6666666666666,11.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,11.9666666666666,12.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,12.1666666666666,12.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,12.4666666666666,12.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,12.6666666666666,12.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,12.9666666666666,13.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,13.1666666666666,13.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,13.4666666666666,13.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,13.6666666666666,13.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,8,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,13.9333333333333,14.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,14.1666666666666,14.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,14.55,14.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,14.8333333333333,14.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,15.2166666666666,15.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,15.5,15.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,15.8833333333333,16.1166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,16.1666666666666,16.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,16.55,16.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,16.8333333333333,16.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,17.2166666666666,17.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,17.5,17.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,13,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,17.8666666666666,18.0833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,5,4733895,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,18.1666666666666,18.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,0,4733895,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,18.3,18.3,Tuesday,Betriebshof A,BF A A,0.06,0,4733895,CKB +370,Betriebshof A,BF A E,Tuesday,14.2166666666666,14.2166666666666,Tuesday,S+U Hermannstr.,SUHM09B,0.06,0,4734200,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,14.2166666666666,14.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,14.5,14.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,14.8833333333333,15.1166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,15.1666666666666,15.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,15.55,15.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,15.8333333333333,15.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,16.2166666666666,16.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,16.5,16.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,16.8833333333333,17.1166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,17.1666666666666,17.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,17.55,17.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,17.8333333333333,17.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB +370,S+U Hermannstr.,SUHM09B,Tuesday,18.2166666666666,18.4166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4734200,CKB +370,Neuköllnische Brücke,NKBR04BA,Tuesday,18.4166666666666,18.4166666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4734200,CKB +N23,Betriebshof A,BF A E,Wednesday,0.383333333333333,0.383333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,0.06,0,4318157,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,0.383333333333333,0.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB +N39,U Rohrdamm,URDM01B,Wednesday,0.65,0.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB +N39,Mertensstr.,MTNS01B,Wednesday,1.05,1.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB +N23,U Rohrdamm,URDM02B,Wednesday,1.28333333333333,1.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,1.38333333333333,1.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB +N39,U Rohrdamm,URDM01B,Wednesday,1.65,1.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB +N39,Mertensstr.,MTNS01B,Wednesday,2.05,2.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB +N23,U Rohrdamm,URDM02B,Wednesday,2.28333333333333,2.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,2.38333333333333,2.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB +N39,U Rohrdamm,URDM01B,Wednesday,2.65,2.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB +N39,Mertensstr.,MTNS01B,Wednesday,3.05,3.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB +N23,U Rohrdamm,URDM02B,Wednesday,3.28333333333333,3.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,3.38333333333333,3.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB +N39,U Rohrdamm,URDM01B,Wednesday,3.65,3.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB +N39,Mertensstr.,MTNS01B,Wednesday,4.05,4.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB +N23,U Rohrdamm,URDM02B,Wednesday,4.28333333333333,4.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,4.38333333333333,4.38333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4318157,CKB +N39,Betriebshof A,BF A E,Wednesday,0.55,0.55,Wednesday,Mertensstr.,MTNS01B,0.06,0,4318177,CKB +N39,Mertensstr.,MTNS01B,Wednesday,0.55,0.783333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB +N23,U Rohrdamm,URDM02B,Wednesday,0.783333333333333,0.883333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,0.883333333333333,1.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB +N39,U Rohrdamm,URDM01B,Wednesday,1.15,1.4,Wednesday,Mertensstr.,MTNS01B,5937,9,4318177,CKB +N39,Mertensstr.,MTNS01B,Wednesday,1.55,1.78333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB +N23,U Rohrdamm,URDM02B,Wednesday,1.78333333333333,1.88333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,1.88333333333333,2.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB +N39,U Rohrdamm,URDM01B,Wednesday,2.15,2.4,Wednesday,Mertensstr.,MTNS01B,5937,9,4318177,CKB +N39,Mertensstr.,MTNS01B,Wednesday,2.55,2.78333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB +N23,U Rohrdamm,URDM02B,Wednesday,2.78333333333333,2.88333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,2.88333333333333,3.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB +N39,U Rohrdamm,URDM01B,Wednesday,3.15,3.4,Wednesday,Mertensstr.,MTNS01B,5937,9,4318177,CKB +N39,Mertensstr.,MTNS01B,Wednesday,3.55,3.78333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB +N23,U Rohrdamm,URDM02B,Wednesday,3.78333333333333,3.88333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB +N23,Mäckeritzwiesen,MAWI01B,Wednesday,3.88333333333333,4.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB +N39,U Rohrdamm,URDM01B,Wednesday,4.15,4.4,Wednesday,Mertensstr.,MTNS01B,5937,0,4318177,CKB +N39,Mertensstr.,MTNS01B,Wednesday,4.4,4.4,Wednesday,Betriebshof A,BF A A,0.06,0,4318177,CKB +N35,Betriebshof A,BF A E,Wednesday,0.95,0.95,Wednesday,Alt-Kladow,ALKL02B,0.06,0,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,0.95,1.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,1.1,1.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,1.45,1.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,1.6,1.68333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,1.95,2.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,2.1,2.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,2.45,2.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,2.6,2.68333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,2.95,3.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,3.1,3.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,3.45,3.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,3.6,3.68333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,3.95,4.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,4.1,4.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB +N35,Alt-Kladow,ALKL02B,Wednesday,4.45,4.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB +N35,Gutsstr.,GUTS01B,Wednesday,4.6,4.6,Wednesday,Betriebshof A,BF A A,0.06,0,4319352,CKB +N52,Betriebshof A,BF A E,Wednesday,0.483333333333333,0.483333333333333,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,0.483333333333333,0.683333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,0.783333333333333,0.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,0.983333333333333,1.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,1.28333333333333,1.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.48333333333333,1.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,1.78333333333333,1.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.98333333333333,2.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,2.28333333333333,2.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.48333333333333,2.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,2.78333333333333,2.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.98333333333333,3.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,3.28333333333333,3.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.48333333333333,3.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,3.78333333333333,3.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.98333333333333,4.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,4.28333333333333,4.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,4.48333333333333,4.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,0,4751087,CKB +N52,U Osloer Str.,UOSL04B,Wednesday,4.68333333333333,4.68333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4751087,CKB +N53,Betriebshof A,BF A E,Wednesday,0.5,0.5,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,0.5,0.733333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,0.733333333333333,0.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.0,1.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,1.23333333333333,1.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.5,1.73333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,1.73333333333333,1.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.0,2.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,2.23333333333333,2.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.5,2.73333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,2.73333333333333,2.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.0,3.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,3.23333333333333,3.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.5,3.73333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,3.73333333333333,3.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,4.0,4.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB +N53,Wilhelmsruher Damm,WIDA02B,Wednesday,4.23333333333333,4.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453545,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,4.45,4.45,Wednesday,Betriebshof A,BF A A,0.06,0,4453545,CKB +N56,Betriebshof A,BF A E,Wednesday,0.716666666666666,0.716666666666666,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374467,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,0.716666666666666,1.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374467,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,1.71666666666666,2.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374467,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,2.71666666666666,3.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374467,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,3.71666666666666,4.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374467,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,4.55,4.55,Wednesday,Betriebshof A,BF A A,0.06,0,4374467,CKB +N56,Betriebshof A,BF A E,Wednesday,0.216666666666666,0.216666666666666,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374472,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,0.216666666666666,1.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374472,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,1.21666666666666,2.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374472,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,2.21666666666666,3.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374472,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,3.21666666666666,4.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374472,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,4.05,4.05,Wednesday,Betriebshof A,BF A A,0.06,0,4374472,CKB +N58,Betriebshof A,BF A E,Wednesday,0.4,0.4,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456448,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,0.4,0.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB +N58,S Buch,SBU02B,Wednesday,0.866666666666666,1.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456448,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,1.4,1.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB +N58,S Buch,SBU02B,Wednesday,1.86666666666666,2.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456448,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,2.4,2.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB +N58,S Buch,SBU02B,Wednesday,2.86666666666666,3.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456448,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,3.4,3.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB +N58,S Buch,SBU02B,Wednesday,3.86666666666666,4.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456448,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,4.23333333333333,4.23333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4456448,CKB +N58,Betriebshof A,BF A E,Wednesday,0.366666666666666,0.366666666666666,Wednesday,S Buch,SBU02B,0.06,0,4456456,CKB +N58,S Buch,SBU02B,Wednesday,0.366666666666666,0.733333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,0.9,1.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB +N58,S Buch,SBU02B,Wednesday,1.36666666666666,1.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,1.9,2.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB +N58,S Buch,SBU02B,Wednesday,2.36666666666666,2.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,2.9,3.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB +N58,S Buch,SBU02B,Wednesday,3.36666666666666,3.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,3.9,4.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB +N58,S Buch,SBU02B,Wednesday,4.36666666666666,4.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456456,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,4.73333333333333,4.73333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4456456,CKB +N62,Betriebshof A,BF A E,Wednesday,0.533333333333333,0.533333333333333,Wednesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747650,CKB +N62,Schloßplatz Köpenick,SLPZ02BN,Wednesday,0.533333333333333,0.733333333333333,Wednesday,Wendenschloß,WESC09BA,4212,3,4747650,CKB +N62,Wendenschloß,WESC09BA,Wednesday,0.783333333333333,1.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,1.26666666666666,1.7,Wednesday,Wendenschloß,WESC09BA,12869,5,4747650,CKB +N62,Wendenschloß,WESC09BA,Wednesday,1.78333333333333,2.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,2.26666666666666,2.7,Wednesday,Wendenschloß,WESC09BA,12869,5,4747650,CKB +N62,Wendenschloß,WESC09BA,Wednesday,2.78333333333333,3.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,3.26666666666666,3.7,Wednesday,Wendenschloß,WESC09BA,12869,5,4747650,CKB +N62,Wendenschloß,WESC09BA,Wednesday,3.78333333333333,4.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,4.26666666666666,4.56666666666666,Wednesday,Betriebshof Köpenick,BHKO01BN,9538,0,4747650,CKB +N62,Betriebshof Köpenick,BHKO01BN,Wednesday,4.56666666666666,4.56666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4747650,CKB +N62,Betriebshof A,BF A E,Wednesday,0.283333333333333,0.283333333333333,Wednesday,Wendenschloß,WESC09BA,0.06,0,4747660,CKB +N62,Wendenschloß,WESC09BA,Wednesday,0.283333333333333,0.766666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,0.766666666666666,1.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB +N62,Wendenschloß,WESC09BA,Wednesday,1.28333333333333,1.76666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,1.76666666666666,2.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB +N62,Wendenschloß,WESC09BA,Wednesday,2.28333333333333,2.76666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,2.76666666666666,3.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB +N62,Wendenschloß,WESC09BA,Wednesday,3.28333333333333,3.76666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,3.76666666666666,4.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB +N62,Wendenschloß,WESC09BA,Wednesday,4.28333333333333,4.46666666666666,Wednesday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747660,CKB +N62,Schloßplatz Köpenick,SLPZ03B,Wednesday,4.46666666666666,4.46666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4747660,CKB +N68,Betriebshof A,BF A E,Wednesday,0.816666666666666,0.816666666666666,Wednesday,S Adlershof,SAH02BN,0.06,0,4434341,CKB +N68,S Adlershof,SAH02BN,Wednesday,0.816666666666666,1.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,1.06666666666666,1.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB +N68,S Adlershof,SAH02BN,Wednesday,1.31666666666666,1.56666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,1.56666666666666,1.81666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB +N68,S Adlershof,SAH02BN,Wednesday,1.81666666666666,2.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,2.06666666666666,2.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB +N68,S Adlershof,SAH02BN,Wednesday,2.31666666666666,2.56666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,2.56666666666666,2.81666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB +N68,S Adlershof,SAH02BN,Wednesday,2.81666666666666,3.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,3.06666666666666,3.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB +N68,S Adlershof,SAH02BN,Wednesday,3.31666666666666,3.56666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,3.56666666666666,3.81666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB +N68,S Adlershof,SAH02BN,Wednesday,3.81666666666666,4.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,4.06666666666666,4.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,23,4434341,CKB +164,S Adlershof,SAH02BN,Wednesday,4.7,5.06666666666666,Wednesday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434341,CKB +164,Kaulsdorfer Str.,KDFS02B,Wednesday,5.06666666666666,5.06666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4434341,CKB +N69,Betriebshof A,BF A E,Wednesday,0.533333333333333,0.533333333333333,Wednesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434897,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Wednesday,0.533333333333333,0.95,Wednesday,S+U Wuhletal,SUWT02BN,11545,6,4434897,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,1.05,1.76666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434897,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,1.78333333333333,2.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434897,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,2.55,3.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434897,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,3.28333333333333,3.91666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434897,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,4.05,4.46666666666666,Wednesday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434897,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Wednesday,4.46666666666666,4.46666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4434897,CKB +N69,Betriebshof A,BF A E,Wednesday,0.55,0.55,Wednesday,S+U Wuhletal,SUWT02BN,0.06,0,4434902,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,0.55,1.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434902,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,1.28333333333333,1.91666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434902,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,2.05,2.76666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434902,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,2.78333333333333,3.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434902,CKB +N69,S+U Wuhletal,SUWT02BN,Wednesday,3.55,4.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434902,CKB +N69,Odernheimer Str.,ODNH01B,Wednesday,4.28333333333333,4.85,Wednesday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434902,CKB +N69,U Elsterwerdaer Platz,UEWP03B,Wednesday,4.85,4.85,Wednesday,Betriebshof A,BF A A,0.06,0,4434902,CKB +N88,Betriebshof A,BF A E,Wednesday,0.566666666666666,0.566666666666666,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619766,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,0.566666666666666,1.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,1.0,1.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619766,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,1.56666666666666,2.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,2.0,2.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619766,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,2.56666666666666,3.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,3.0,3.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619766,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,3.56666666666666,4.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,4.0,4.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619766,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,4.45,4.45,Wednesday,Betriebshof A,BF A A,0.06,0,4619766,CKB +N88,Betriebshof A,BF A E,Wednesday,0.5,0.5,Wednesday,S Lichterfelde Süd,SLIS01B,0.06,0,4619991,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,0.5,0.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,1.06666666666666,1.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,1.5,1.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,2.06666666666666,2.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,2.5,2.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,3.06666666666666,3.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,3.5,3.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,4.06666666666666,4.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB +N88,S Lichterfelde Süd,SLIS01B,Wednesday,4.5,4.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619991,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,4.95,4.95,Wednesday,Betriebshof A,BF A A,0.06,0,4619991,CKB +N91,Betriebshof A,BF A E,Wednesday,0.516666666666666,0.516666666666666,Wednesday,S+U Wuhletal,SUWT02BN,0.06,0,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,0.516666666666666,0.733333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,0.733333333333333,0.933333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,1.01666666666666,1.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,1.23333333333333,1.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,1.51666666666666,1.73333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,1.73333333333333,1.93333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,2.01666666666666,2.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,2.23333333333333,2.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,2.51666666666666,2.73333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,2.73333333333333,2.93333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,3.01666666666666,3.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,3.23333333333333,3.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,3.51666666666666,3.73333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,3.73333333333333,3.93333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,4.01666666666666,4.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB +N91,Boschpoler Str.,BOPO01BN,Wednesday,4.23333333333333,4.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,0,4374744,CKB +N91,S+U Wuhletal,SUWT02BN,Wednesday,4.43333333333333,4.43333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4374744,CKB +N95,Betriebshof A,BF A E,Wednesday,0.516666666666666,0.516666666666666,Wednesday,S+U Wuhletal,SUWT02BN,0.06,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,0.516666666666666,0.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,0.783333333333333,1.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,1.01666666666666,1.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,1.28333333333333,1.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,1.51666666666666,1.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,1.78333333333333,2.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,2.01666666666666,2.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,2.28333333333333,2.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,2.51666666666666,2.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,2.78333333333333,3.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,3.01666666666666,3.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,3.28333333333333,3.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,3.51666666666666,3.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,3.78333333333333,4.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,4.01666666666666,4.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB +N95,Riesaer Str.,RIES01BN,Wednesday,4.28333333333333,4.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB +N95,S+U Wuhletal,SUWT02BN,Wednesday,4.51666666666666,4.51666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4374866,CKB +N97,Betriebshof A,BF A E,Wednesday,0.716666666666666,0.716666666666666,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,0.716666666666666,0.883333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,0.883333333333333,1.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,1.21666666666666,1.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,1.38333333333333,1.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,1.71666666666666,1.88333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,1.88333333333333,2.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,2.21666666666666,2.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,2.38333333333333,2.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,2.71666666666666,2.88333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,2.88333333333333,3.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,3.21666666666666,3.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,3.38333333333333,3.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,3.71666666666666,3.88333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,3.88333333333333,4.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,4.21666666666666,4.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB +N97,Barnimplatz,BARN01B,Wednesday,4.38333333333333,4.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375013,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,4.55,4.55,Wednesday,Betriebshof A,BF A A,0.06,0,4375013,CKB +160,Betriebshof A,BF A E,Wednesday,21.5166666666666,21.5166666666666,Wednesday,Hasselwerderstr.,HAWR01B,0.06,0,4454945,CKB +160,Hasselwerderstr.,HAWR01B,Wednesday,21.5166666666666,22.0666666666666,Wednesday,Siriusstr.,SIRI01B,14519,4,4454945,CKB +160,Siriusstr.,SIRI01B,Wednesday,22.1333333333333,22.7166666666666,Wednesday,Hasselwerderstr.,HAWR01B,13541,8,4454945,CKB +160,Hasselwerderstr.,HAWR01B,Wednesday,22.85,23.4,Wednesday,Siriusstr.,SIRI01B,14519,4,4454945,CKB +160,Siriusstr.,SIRI01B,Wednesday,23.4666666666666,24.05,Thursday,Hasselwerderstr.,HAWR01B,13541,8,4454945,CKB +160,Hasselwerderstr.,HAWR01B,Thursday,0.183333333333333,0.733333333333333,Thursday,Siriusstr.,SIRI01B,14519,0,4454945,CKB +N60,Siriusstr.,SIRI01B,Thursday,0.733333333333333,0.9,Thursday,S Adlershof,SAH02BN,4.1,25,4454945,CKB +N60,S Adlershof,SAH02BN,Thursday,1.31666666666666,1.7,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454945,CKB +N60,Flughafen Schönefeld,SXF01B,Thursday,1.8,2.1,Thursday,S Adlershof,SAH02BN,9067,13,4454945,CKB +N60,S Adlershof,SAH02BN,Thursday,2.31666666666666,2.7,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454945,CKB +N60,Flughafen Schönefeld,SXF01B,Thursday,2.8,3.1,Thursday,S Adlershof,SAH02BN,9067,13,4454945,CKB +N60,S Adlershof,SAH02BN,Thursday,3.31666666666666,3.7,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454945,CKB +N60,Flughafen Schönefeld,SXF01B,Thursday,3.8,4.1,Thursday,S Adlershof,SAH02BN,9067,0,4454945,CKB +N60,S Adlershof,SAH02BN,Thursday,4.1,4.1,Thursday,Betriebshof A,BF A A,0.06,0,4454945,CKB +160,Betriebshof A,BF A E,Wednesday,22.1833333333333,22.1833333333333,Wednesday,Hasselwerderstr.,HAWR01B,0.06,0,4454950,CKB +160,Hasselwerderstr.,HAWR01B,Wednesday,22.1833333333333,22.7333333333333,Wednesday,Siriusstr.,SIRI01B,14519,4,4454950,CKB +160,Siriusstr.,SIRI01B,Wednesday,22.8,23.3833333333333,Wednesday,Hasselwerderstr.,HAWR01B,13541,8,4454950,CKB +160,Hasselwerderstr.,HAWR01B,Wednesday,23.5166666666666,24.0666666666666,Thursday,Siriusstr.,SIRI01B,14519,4,4454950,CKB +160,Siriusstr.,SIRI01B,Thursday,0.133333333333333,0.65,Thursday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454950,CKB +N60,S Schöneweide/Sterndamm,SSWS06B,Thursday,0.65,0.783333333333333,Thursday,S Adlershof,SAH02BN,4.0,2,4454950,CKB +N60,S Adlershof,SAH02BN,Thursday,0.816666666666666,1.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454950,CKB +N60,Flughafen Schönefeld,SXF01B,Thursday,1.3,1.6,Thursday,S Adlershof,SAH02BN,9067,13,4454950,CKB +N60,S Adlershof,SAH02BN,Thursday,1.81666666666666,2.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454950,CKB +N60,Flughafen Schönefeld,SXF01B,Thursday,2.3,2.6,Thursday,S Adlershof,SAH02BN,9067,13,4454950,CKB +N60,S Adlershof,SAH02BN,Thursday,2.81666666666666,3.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454950,CKB +N60,Flughafen Schönefeld,SXF01B,Thursday,3.3,3.6,Thursday,S Adlershof,SAH02BN,9067,13,4454950,CKB +N60,S Adlershof,SAH02BN,Thursday,3.81666666666666,4.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,0,4454950,CKB +N60,Flughafen Schönefeld,SXF01B,Thursday,4.2,4.2,Thursday,Betriebshof A,BF A A,0.06,0,4454950,CKB +161,Betriebshof A,BF A E,Wednesday,21.1,21.1,Wednesday,S Erkner/ZOB,SERZ01B,0.06,0,4664624,CKB +161,S Erkner/ZOB,SERZ01B,Wednesday,21.1,21.5666666666666,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664624,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,21.8833333333333,22.2166666666666,Wednesday,Lutherstr.,LUTH01B,10332,17,4664624,CKB +161,Lutherstr.,LUTH01B,Wednesday,22.5,22.9,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664624,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,23.2166666666666,23.55,Wednesday,Lutherstr.,LUTH01B,10332,17,4664624,CKB +161,Lutherstr.,LUTH01B,Wednesday,23.8333333333333,24.2333333333333,Thursday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664624,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,0.266666666666666,0.383333333333333,Thursday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664624,CKB +N61,Rahnsdorf/Waldschänke,RDWS03BN,Thursday,0.466666666666666,0.733333333333333,Thursday,Dämeritzstr.,DARI01B,6404,3,4664624,CKB +N61,Dämeritzstr.,DARI01B,Thursday,0.783333333333333,1.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,1.28333333333333,1.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4664624,CKB +N61,Dämeritzstr.,DARI01B,Thursday,1.78333333333333,2.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,2.28333333333333,2.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4664624,CKB +N61,Dämeritzstr.,DARI01B,Thursday,2.78333333333333,3.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,3.28333333333333,3.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4664624,CKB +N61,Dämeritzstr.,DARI01B,Thursday,3.78333333333333,4.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,4.28333333333333,4.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,0,4664624,CKB +N61,Dämeritzstr.,DARI01B,Thursday,4.73333333333333,4.73333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4664624,CKB +161,Betriebshof A,BF A E,Wednesday,20.4333333333333,20.4333333333333,Wednesday,S Erkner/ZOB,SERZ01B,0.06,0,4762734,CKB +161,S Erkner/ZOB,SERZ01B,Wednesday,20.4333333333333,20.9333333333333,Wednesday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762734,CKB +161,"Schöneiche, Goethepark",SEGP01BA,Wednesday,21.1666666666666,21.6333333333333,Wednesday,S Erkner/ZOB,SERZ01B,13.19,8,4762734,CKB +161,S Erkner/ZOB,SERZ01B,Wednesday,21.7666666666666,22.2333333333333,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762734,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,22.55,22.8833333333333,Wednesday,Lutherstr.,LUTH01B,10332,17,4762734,CKB +161,Lutherstr.,LUTH01B,Wednesday,23.1666666666666,23.5666666666666,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762734,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,23.8833333333333,24.2166666666666,Thursday,Lutherstr.,LUTH01B,10332,2,4762734,CKB +161,Lutherstr.,LUTH01B,Thursday,0.25,0.266666666666666,Thursday,Dämeritzstr.,DARI01B,506,1,4762734,CKB +N61,Dämeritzstr.,DARI01B,Thursday,0.283333333333333,0.666666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,0.783333333333333,1.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB +N61,Dämeritzstr.,DARI01B,Thursday,1.28333333333333,1.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,1.78333333333333,2.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB +N61,Dämeritzstr.,DARI01B,Thursday,2.28333333333333,2.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,2.78333333333333,3.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB +N61,Dämeritzstr.,DARI01B,Thursday,3.28333333333333,3.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB +N61,S Friedrichshagen,SFHG05BN,Thursday,3.78333333333333,4.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB +N61,Dämeritzstr.,DARI01B,Thursday,4.28333333333333,4.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,3,4762734,CKB +N67,S Friedrichshagen,SFHG05BN,Thursday,4.71666666666666,4.96666666666666,Thursday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762734,CKB +N67,Schloßplatz Köpenick,SLPZ01BN,Thursday,4.96666666666666,4.96666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4762734,CKB +163,Betriebshof A,BF A E,Wednesday,22.9333333333333,22.9333333333333,Wednesday,S Grünau,SGA24BA,0.06,0,4617415,CKB +163,S Grünau,SGA24BA,Wednesday,22.9333333333333,23.1333333333333,Wednesday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617415,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Wednesday,23.1833333333333,23.4166666666666,Wednesday,S Grünau,SGA22BA,6232,0,4617415,CKB +163,S Grünau,SGA22BA,Wednesday,23.4166666666666,23.6333333333333,Wednesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617415,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Wednesday,23.6833333333333,23.9166666666666,Wednesday,S Grünau,SGA22BA,6232,0,4617415,CKB +163,S Grünau,SGA22BA,Wednesday,23.9166666666666,24.1333333333333,Thursday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617415,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Thursday,0.133333333333333,0.133333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4617415,CKB +168,Betriebshof A,BF A E,Wednesday,5.08333333333333,5.08333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,5.08333333333333,5.23333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,5.23333333333333,5.38333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,5.41666666666666,5.56666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,5.56666666666666,5.71666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,23,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,6.1,6.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,6.25,6.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,6.43333333333333,6.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,6.58333333333333,6.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,6.76666666666666,6.91666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,6.91666666666666,7.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,7.1,7.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,7.25,7.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,7.43333333333333,7.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,7.58333333333333,7.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,8.1,8.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,8.25,8.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,8.43333333333333,8.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,8.58333333333333,8.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,8.76666666666666,8.91666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,8.91666666666666,9.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,9.1,9.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,9.25,9.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,9.43333333333333,9.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,9.58333333333333,9.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,10.1,10.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,10.25,10.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,10.4333333333333,10.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,10.5833333333333,10.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,10.7666666666666,10.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,10.9166666666666,11.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,11.1,11.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,11.25,11.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,11.4333333333333,11.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,11.5833333333333,11.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,12.1,12.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,12.25,12.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,12.4333333333333,12.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,12.5833333333333,12.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,12.7666666666666,12.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,12.9166666666666,13.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,13.1,13.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,13.25,13.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,13.4333333333333,13.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,13.5833333333333,13.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,13.7666666666666,13.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,13.9166666666666,14.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,14.1,14.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,14.25,14.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,14.7666666666666,14.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,14.9166666666666,15.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,15.1,15.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,15.25,15.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,15.4333333333333,15.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,15.5833333333333,15.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,16.1,16.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,16.25,16.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,16.4333333333333,16.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,16.5833333333333,16.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,16.7666666666666,16.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,16.9166666666666,17.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,17.1,17.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,17.25,17.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,17.4333333333333,17.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,17.5833333333333,17.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,18.1,18.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,18.25,18.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,18.4333333333333,18.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,18.5833333333333,18.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,18.7666666666666,18.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,18.9166666666666,19.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,19.1,19.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,19.25,19.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,19.4333333333333,19.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,19.5833333333333,19.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,21,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,20.0833333333333,20.2333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,20.2333333333333,20.3833333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,20.4166666666666,20.5666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,20.5666666666666,20.7166666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,20.75,20.9,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,20.9,21.05,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,21.0833333333333,21.2333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,21.2333333333333,21.3833333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,21.4166666666666,21.5666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,21.5666666666666,21.7166666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,22.0833333333333,22.2333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,22.2333333333333,22.3833333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,22.4166666666666,22.5666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,22.5666666666666,22.7166666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,22.75,22.9,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB +168,Moßkopfring,MKFR01B,Wednesday,22.9,23.05,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,0,4426846,CKB +168,Alt-Schmöckwitz,ALSW02B,Wednesday,23.05,23.05,Wednesday,Betriebshof A,BF A A,0.06,0,4426846,CKB +269,Betriebshof A,BF A E,Thursday,0.1,0.1,Thursday,S Kaulsdorf,SKD05B,0.06,0,4708596,CKB +269,S Kaulsdorf,SKD05B,Thursday,0.1,0.45,Thursday,S Köpenick,SKOE01B,7827,0,4708596,CKB +N69,S Köpenick,SKOE01B,Thursday,0.45,0.8,Thursday,Odernheimer Str.,ODNH01B,11079,0,4708596,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,0.8,1.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4708596,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,1.55,2.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4708596,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,2.28333333333333,2.91666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4708596,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,3.05,3.76666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4708596,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,3.78333333333333,4.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,0,4708596,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,4.41666666666666,4.41666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4708596,CKB +326,Betriebshof Indira-Gandhi-Str.,BF I E,Wednesday,5.25,6.01666666666666,Wednesday,S Hermsdorf,SHDF01B,17.9,0,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,6.01666666666666,6.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,6.38333333333333,6.61666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,6.68333333333333,6.91666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,7.05,7.28333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,7.35,7.58333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,7.71666666666666,7.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,8.01666666666666,8.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,8.38333333333333,8.61666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,8.68333333333333,8.91666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,9.05,9.28333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,9.35,9.58333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,9.71666666666666,9.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,10.0166666666666,10.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,10.3833333333333,10.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,10.6833333333333,10.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,11.05,11.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,11.35,11.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,11.7166666666666,11.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,12.0166666666666,12.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,12.3833333333333,12.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,12.6833333333333,12.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,13.05,13.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,13.35,13.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,13.7166666666666,13.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,14.0166666666666,14.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,14.3833333333333,14.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,14.6833333333333,14.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,15.05,15.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,15.35,15.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,15.7166666666666,15.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,16.0166666666666,16.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,16.3833333333333,16.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,16.6833333333333,16.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,17.05,17.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,17.35,17.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,17.7166666666666,17.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,18.0166666666666,18.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,18.3833333333333,18.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,18.6833333333333,18.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,19.05,19.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,19.35,19.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,19.7166666666666,19.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,20.0166666666666,20.2333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,9,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,20.3833333333333,20.6,Wednesday,S Hermsdorf,SHDF01B,4637,0,4317626,VDL +326,S Hermsdorf,SHDF01B,Wednesday,20.6,21.25,Wednesday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317626,VDL +334,Betriebshof A,BF A E,Wednesday,4.93333333333333,4.93333333333333,Wednesday,Alt-Gatow,ALTG01B,0.06,18,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,5.23333333333333,5.33333333333333,Wednesday,Habichtswald,HWLD01B,3.29,0,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,5.33333333333333,5.4,Wednesday,Alt-Gatow,ALTG01B,2954,20,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,5.73333333333333,5.83333333333333,Wednesday,Habichtswald,HWLD01B,3.29,0,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,5.83333333333333,5.9,Wednesday,Alt-Gatow,ALTG01B,2954,5,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,5.98333333333333,6.1,Wednesday,Habichtswald,HWLD01B,3.29,2,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,6.13333333333333,6.21666666666666,Wednesday,Alt-Gatow,ALTG01B,2954,19,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,6.53333333333333,6.65,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,6.66666666666666,6.75,Wednesday,Alt-Gatow,ALTG01B,2954,7,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,6.86666666666666,6.98333333333333,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,7.0,7.08333333333333,Wednesday,Alt-Gatow,ALTG01B,2954,7,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,7.2,7.31666666666666,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,7.33333333333333,7.41666666666666,Wednesday,Alt-Gatow,ALTG01B,2954,7,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,7.53333333333333,7.65,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,7.66666666666666,7.75,Wednesday,Alt-Gatow,ALTG01B,2954,295,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,12.6666666666666,12.7833333333333,Wednesday,Habichtswald,HWLD01B,3.29,2,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,12.8166666666666,12.9,Wednesday,Alt-Gatow,ALTG01B,2954,46,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,13.6666666666666,13.7833333333333,Wednesday,Habichtswald,HWLD01B,3.29,2,4425669,CKB +334,Habichtswald,HWLD01B,Wednesday,13.8166666666666,13.9,Wednesday,Alt-Gatow,ALTG01B,2954,434,4425669,CKB +334,Alt-Gatow,ALTG01B,Wednesday,21.1333333333333,21.1333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4425669,CKB +349,Betriebshof A,BF A E,Wednesday,7.33333333333333,7.33333333333333,Wednesday,S Grunewald,SGD02B,0.06,0,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,7.33333333333333,7.83333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,8.0,8.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,8.66666666666666,9.16666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,9.33333333333333,9.83333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,10.0,10.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,10.6666666666666,11.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,11.3333333333333,11.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,12.0,12.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,12.6666666666666,13.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,13.3333333333333,13.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,14.0,14.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,14.6666666666666,15.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,15.3333333333333,15.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,16.0,16.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,16.6666666666666,17.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,17.3333333333333,17.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,18.0,18.5,Wednesday,S Grunewald,SGD02B,9266,0,4448151,CKB +349,S Grunewald,SGD02B,Wednesday,18.5,18.5,Wednesday,Betriebshof A,BF A A,0.06,0,4448151,CKB +370,Betriebshof A,BF A E,Wednesday,7.16666666666666,7.16666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,7.16666666666666,7.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,7.46666666666666,7.66666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,7.66666666666666,7.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,7.96666666666666,8.16666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,8.16666666666666,8.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,8.46666666666666,8.66666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,8.66666666666666,8.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,8.96666666666666,9.16666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,9.16666666666666,9.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,9.46666666666666,9.66666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,9.66666666666666,9.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,9.96666666666666,10.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,10.1666666666666,10.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,10.4666666666666,10.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,10.6666666666666,10.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,10.9666666666666,11.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,11.1666666666666,11.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,11.4666666666666,11.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,11.6666666666666,11.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,11.9666666666666,12.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,12.1666666666666,12.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,12.4666666666666,12.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,12.6666666666666,12.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,12.9666666666666,13.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,13.1666666666666,13.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,13.4666666666666,13.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,13.6666666666666,13.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,8,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,13.9333333333333,14.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,14.1666666666666,14.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,14.55,14.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,14.8333333333333,14.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,15.2166666666666,15.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,15.5,15.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,15.8833333333333,16.1166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,16.1666666666666,16.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,16.55,16.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,16.8333333333333,16.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,17.2166666666666,17.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,17.5,17.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,13,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,17.8666666666666,18.0833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,5,4733896,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,18.1666666666666,18.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,0,4733896,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,18.3,18.3,Wednesday,Betriebshof A,BF A A,0.06,0,4733896,CKB +370,Betriebshof A,BF A E,Wednesday,14.2166666666666,14.2166666666666,Wednesday,S+U Hermannstr.,SUHM09B,0.06,0,4734201,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,14.2166666666666,14.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,14.5,14.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,14.8833333333333,15.1166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,15.1666666666666,15.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,15.55,15.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,15.8333333333333,15.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,16.2166666666666,16.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,16.5,16.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,16.8833333333333,17.1166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,17.1666666666666,17.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,17.55,17.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,17.8333333333333,17.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB +370,S+U Hermannstr.,SUHM09B,Wednesday,18.2166666666666,18.4166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4734201,CKB +370,Neuköllnische Brücke,NKBR04BA,Wednesday,18.4166666666666,18.4166666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4734201,CKB +N23,Betriebshof A,BF A E,Thursday,0.383333333333333,0.383333333333333,Thursday,Mäckeritzwiesen,MAWI01B,0.06,0,4318158,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,0.383333333333333,0.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB +N39,U Rohrdamm,URDM01B,Thursday,0.65,0.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB +N39,Mertensstr.,MTNS01B,Thursday,1.05,1.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB +N23,U Rohrdamm,URDM02B,Thursday,1.28333333333333,1.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,1.38333333333333,1.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB +N39,U Rohrdamm,URDM01B,Thursday,1.65,1.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB +N39,Mertensstr.,MTNS01B,Thursday,2.05,2.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB +N23,U Rohrdamm,URDM02B,Thursday,2.28333333333333,2.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,2.38333333333333,2.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB +N39,U Rohrdamm,URDM01B,Thursday,2.65,2.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB +N39,Mertensstr.,MTNS01B,Thursday,3.05,3.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB +N23,U Rohrdamm,URDM02B,Thursday,3.28333333333333,3.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,3.38333333333333,3.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB +N39,U Rohrdamm,URDM01B,Thursday,3.65,3.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB +N39,Mertensstr.,MTNS01B,Thursday,4.05,4.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB +N23,U Rohrdamm,URDM02B,Thursday,4.28333333333333,4.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,4.38333333333333,4.38333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4318158,CKB +N39,Betriebshof A,BF A E,Thursday,0.55,0.55,Thursday,Mertensstr.,MTNS01B,0.06,0,4318178,CKB +N39,Mertensstr.,MTNS01B,Thursday,0.55,0.783333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB +N23,U Rohrdamm,URDM02B,Thursday,0.783333333333333,0.883333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,0.883333333333333,1.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB +N39,U Rohrdamm,URDM01B,Thursday,1.15,1.4,Thursday,Mertensstr.,MTNS01B,5937,9,4318178,CKB +N39,Mertensstr.,MTNS01B,Thursday,1.55,1.78333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB +N23,U Rohrdamm,URDM02B,Thursday,1.78333333333333,1.88333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,1.88333333333333,2.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB +N39,U Rohrdamm,URDM01B,Thursday,2.15,2.4,Thursday,Mertensstr.,MTNS01B,5937,9,4318178,CKB +N39,Mertensstr.,MTNS01B,Thursday,2.55,2.78333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB +N23,U Rohrdamm,URDM02B,Thursday,2.78333333333333,2.88333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,2.88333333333333,3.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB +N39,U Rohrdamm,URDM01B,Thursday,3.15,3.4,Thursday,Mertensstr.,MTNS01B,5937,9,4318178,CKB +N39,Mertensstr.,MTNS01B,Thursday,3.55,3.78333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB +N23,U Rohrdamm,URDM02B,Thursday,3.78333333333333,3.88333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB +N23,Mäckeritzwiesen,MAWI01B,Thursday,3.88333333333333,4.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB +N39,U Rohrdamm,URDM01B,Thursday,4.15,4.4,Thursday,Mertensstr.,MTNS01B,5937,0,4318178,CKB +N39,Mertensstr.,MTNS01B,Thursday,4.4,4.4,Thursday,Betriebshof A,BF A A,0.06,0,4318178,CKB +N35,Betriebshof A,BF A E,Thursday,0.95,0.95,Thursday,Alt-Kladow,ALKL02B,0.06,0,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,0.95,1.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,1.1,1.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,1.45,1.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,1.6,1.68333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,1.95,2.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,2.1,2.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,2.45,2.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,2.6,2.68333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,2.95,3.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,3.1,3.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,3.45,3.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,3.6,3.68333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,3.95,4.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,4.1,4.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB +N35,Alt-Kladow,ALKL02B,Thursday,4.45,4.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB +N35,Gutsstr.,GUTS01B,Thursday,4.6,4.6,Thursday,Betriebshof A,BF A A,0.06,0,4319353,CKB +N52,Betriebshof A,BF A E,Thursday,0.483333333333333,0.483333333333333,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,0.483333333333333,0.683333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,0.783333333333333,0.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,0.983333333333333,1.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,1.28333333333333,1.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.48333333333333,1.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,1.78333333333333,1.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.98333333333333,2.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,2.28333333333333,2.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.48333333333333,2.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,2.78333333333333,2.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.98333333333333,3.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,3.28333333333333,3.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.48333333333333,3.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,3.78333333333333,3.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.98333333333333,4.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,4.28333333333333,4.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,4.48333333333333,4.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,0,4751088,CKB +N52,U Osloer Str.,UOSL04B,Thursday,4.68333333333333,4.68333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4751088,CKB +N53,Betriebshof A,BF A E,Thursday,0.5,0.5,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,0.5,0.733333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,0.733333333333333,0.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.0,1.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,1.23333333333333,1.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.5,1.73333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,1.73333333333333,1.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.0,2.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,2.23333333333333,2.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.5,2.73333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,2.73333333333333,2.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.0,3.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,3.23333333333333,3.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.5,3.73333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,3.73333333333333,3.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,4.0,4.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB +N53,Wilhelmsruher Damm,WIDA02B,Thursday,4.23333333333333,4.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453546,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,4.45,4.45,Thursday,Betriebshof A,BF A A,0.06,0,4453546,CKB +N56,Betriebshof A,BF A E,Thursday,0.716666666666666,0.716666666666666,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374468,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,0.716666666666666,1.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374468,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,1.71666666666666,2.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374468,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,2.71666666666666,3.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374468,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,3.71666666666666,4.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374468,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,4.55,4.55,Thursday,Betriebshof A,BF A A,0.06,0,4374468,CKB +N56,Betriebshof A,BF A E,Thursday,0.216666666666666,0.216666666666666,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374473,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,0.216666666666666,1.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374473,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,1.21666666666666,2.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374473,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,2.21666666666666,3.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374473,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,3.21666666666666,4.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374473,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,4.05,4.05,Thursday,Betriebshof A,BF A A,0.06,0,4374473,CKB +N58,Betriebshof A,BF A E,Thursday,0.4,0.4,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456449,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,0.4,0.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB +N58,S Buch,SBU02B,Thursday,0.866666666666666,1.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456449,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,1.4,1.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB +N58,S Buch,SBU02B,Thursday,1.86666666666666,2.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456449,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,2.4,2.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB +N58,S Buch,SBU02B,Thursday,2.86666666666666,3.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456449,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,3.4,3.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB +N58,S Buch,SBU02B,Thursday,3.86666666666666,4.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456449,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,4.23333333333333,4.23333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4456449,CKB +N58,Betriebshof A,BF A E,Thursday,0.366666666666666,0.366666666666666,Thursday,S Buch,SBU02B,0.06,0,4456457,CKB +N58,S Buch,SBU02B,Thursday,0.366666666666666,0.733333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,0.9,1.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB +N58,S Buch,SBU02B,Thursday,1.36666666666666,1.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,1.9,2.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB +N58,S Buch,SBU02B,Thursday,2.36666666666666,2.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,2.9,3.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB +N58,S Buch,SBU02B,Thursday,3.36666666666666,3.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,3.9,4.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB +N58,S Buch,SBU02B,Thursday,4.36666666666666,4.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456457,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,4.73333333333333,4.73333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4456457,CKB +N62,Betriebshof A,BF A E,Thursday,0.533333333333333,0.533333333333333,Thursday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747651,CKB +N62,Schloßplatz Köpenick,SLPZ02BN,Thursday,0.533333333333333,0.733333333333333,Thursday,Wendenschloß,WESC09BA,4212,3,4747651,CKB +N62,Wendenschloß,WESC09BA,Thursday,0.783333333333333,1.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,1.26666666666666,1.7,Thursday,Wendenschloß,WESC09BA,12869,5,4747651,CKB +N62,Wendenschloß,WESC09BA,Thursday,1.78333333333333,2.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,2.26666666666666,2.7,Thursday,Wendenschloß,WESC09BA,12869,5,4747651,CKB +N62,Wendenschloß,WESC09BA,Thursday,2.78333333333333,3.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,3.26666666666666,3.7,Thursday,Wendenschloß,WESC09BA,12869,5,4747651,CKB +N62,Wendenschloß,WESC09BA,Thursday,3.78333333333333,4.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,4.26666666666666,4.56666666666666,Thursday,Betriebshof Köpenick,BHKO01BN,9538,0,4747651,CKB +N62,Betriebshof Köpenick,BHKO01BN,Thursday,4.56666666666666,4.56666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4747651,CKB +N62,Betriebshof A,BF A E,Thursday,0.283333333333333,0.283333333333333,Thursday,Wendenschloß,WESC09BA,0.06,0,4747661,CKB +N62,Wendenschloß,WESC09BA,Thursday,0.283333333333333,0.766666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,0.766666666666666,1.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB +N62,Wendenschloß,WESC09BA,Thursday,1.28333333333333,1.76666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,1.76666666666666,2.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB +N62,Wendenschloß,WESC09BA,Thursday,2.28333333333333,2.76666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,2.76666666666666,3.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB +N62,Wendenschloß,WESC09BA,Thursday,3.28333333333333,3.76666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,3.76666666666666,4.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB +N62,Wendenschloß,WESC09BA,Thursday,4.28333333333333,4.46666666666666,Thursday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747661,CKB +N62,Schloßplatz Köpenick,SLPZ03B,Thursday,4.46666666666666,4.46666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4747661,CKB +N68,Betriebshof A,BF A E,Thursday,0.816666666666666,0.816666666666666,Thursday,S Adlershof,SAH02BN,0.06,0,4434342,CKB +N68,S Adlershof,SAH02BN,Thursday,0.816666666666666,1.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Thursday,1.06666666666666,1.31666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB +N68,S Adlershof,SAH02BN,Thursday,1.31666666666666,1.56666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Thursday,1.56666666666666,1.81666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB +N68,S Adlershof,SAH02BN,Thursday,1.81666666666666,2.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Thursday,2.06666666666666,2.31666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB +N68,S Adlershof,SAH02BN,Thursday,2.31666666666666,2.56666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Thursday,2.56666666666666,2.81666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB +N68,S Adlershof,SAH02BN,Thursday,2.81666666666666,3.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Thursday,3.06666666666666,3.31666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB +N68,S Adlershof,SAH02BN,Thursday,3.31666666666666,3.56666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Thursday,3.56666666666666,3.81666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB +N68,S Adlershof,SAH02BN,Thursday,3.81666666666666,4.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Thursday,4.06666666666666,4.31666666666666,Thursday,S Adlershof,SAH02BN,11801,23,4434342,CKB +164,S Adlershof,SAH02BN,Thursday,4.7,5.06666666666666,Thursday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434342,CKB +164,Kaulsdorfer Str.,KDFS02B,Thursday,5.06666666666666,5.06666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4434342,CKB +N69,Betriebshof A,BF A E,Thursday,0.533333333333333,0.533333333333333,Thursday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434898,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Thursday,0.533333333333333,0.95,Thursday,S+U Wuhletal,SUWT02BN,11545,6,4434898,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,1.05,1.76666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434898,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,1.78333333333333,2.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434898,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,2.55,3.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434898,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,3.28333333333333,3.91666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434898,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,4.05,4.46666666666666,Thursday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434898,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Thursday,4.46666666666666,4.46666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4434898,CKB +N69,Betriebshof A,BF A E,Thursday,0.55,0.55,Thursday,S+U Wuhletal,SUWT02BN,0.06,0,4434903,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,0.55,1.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434903,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,1.28333333333333,1.91666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434903,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,2.05,2.76666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434903,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,2.78333333333333,3.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434903,CKB +N69,S+U Wuhletal,SUWT02BN,Thursday,3.55,4.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434903,CKB +N69,Odernheimer Str.,ODNH01B,Thursday,4.28333333333333,4.85,Thursday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434903,CKB +N69,U Elsterwerdaer Platz,UEWP03B,Thursday,4.85,4.85,Thursday,Betriebshof A,BF A A,0.06,0,4434903,CKB +N88,Betriebshof A,BF A E,Thursday,0.566666666666666,0.566666666666666,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619767,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,0.566666666666666,1.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,1.0,1.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619767,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,1.56666666666666,2.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,2.0,2.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619767,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,2.56666666666666,3.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,3.0,3.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619767,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,3.56666666666666,4.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,4.0,4.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619767,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,4.45,4.45,Thursday,Betriebshof A,BF A A,0.06,0,4619767,CKB +N88,Betriebshof A,BF A E,Thursday,0.5,0.5,Thursday,S Lichterfelde Süd,SLIS01B,0.06,0,4619992,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,0.5,0.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,1.06666666666666,1.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,1.5,1.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,2.06666666666666,2.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,2.5,2.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,3.06666666666666,3.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,3.5,3.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,4.06666666666666,4.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB +N88,S Lichterfelde Süd,SLIS01B,Thursday,4.5,4.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619992,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,4.95,4.95,Thursday,Betriebshof A,BF A A,0.06,0,4619992,CKB +N91,Betriebshof A,BF A E,Thursday,0.516666666666666,0.516666666666666,Thursday,S+U Wuhletal,SUWT02BN,0.06,0,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,0.516666666666666,0.733333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,0.733333333333333,0.933333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,1.01666666666666,1.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,1.23333333333333,1.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,1.51666666666666,1.73333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,1.73333333333333,1.93333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,2.01666666666666,2.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,2.23333333333333,2.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,2.51666666666666,2.73333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,2.73333333333333,2.93333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,3.01666666666666,3.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,3.23333333333333,3.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,3.51666666666666,3.73333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,3.73333333333333,3.93333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,4.01666666666666,4.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB +N91,Boschpoler Str.,BOPO01BN,Thursday,4.23333333333333,4.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,0,4374745,CKB +N91,S+U Wuhletal,SUWT02BN,Thursday,4.43333333333333,4.43333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4374745,CKB +N95,Betriebshof A,BF A E,Thursday,0.516666666666666,0.516666666666666,Thursday,S+U Wuhletal,SUWT02BN,0.06,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,0.516666666666666,0.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,0.783333333333333,1.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,1.01666666666666,1.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,1.28333333333333,1.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,1.51666666666666,1.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,1.78333333333333,2.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,2.01666666666666,2.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,2.28333333333333,2.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,2.51666666666666,2.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,2.78333333333333,3.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,3.01666666666666,3.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,3.28333333333333,3.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,3.51666666666666,3.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,3.78333333333333,4.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,4.01666666666666,4.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB +N95,Riesaer Str.,RIES01BN,Thursday,4.28333333333333,4.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB +N95,S+U Wuhletal,SUWT02BN,Thursday,4.51666666666666,4.51666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4374868,CKB +N97,Betriebshof A,BF A E,Thursday,0.716666666666666,0.716666666666666,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,0.716666666666666,0.883333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,0.883333333333333,1.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,1.21666666666666,1.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,1.38333333333333,1.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,1.71666666666666,1.88333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,1.88333333333333,2.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,2.21666666666666,2.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,2.38333333333333,2.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,2.71666666666666,2.88333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,2.88333333333333,3.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,3.21666666666666,3.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,3.38333333333333,3.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,3.71666666666666,3.88333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,3.88333333333333,4.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,4.21666666666666,4.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB +N97,Barnimplatz,BARN01B,Thursday,4.38333333333333,4.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375014,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,4.55,4.55,Thursday,Betriebshof A,BF A A,0.06,0,4375014,CKB +160,Betriebshof A,BF A E,Thursday,21.5166666666666,21.5166666666666,Thursday,Hasselwerderstr.,HAWR01B,0.06,0,4454946,CKB +160,Hasselwerderstr.,HAWR01B,Thursday,21.5166666666666,22.0666666666666,Thursday,Siriusstr.,SIRI01B,14519,4,4454946,CKB +160,Siriusstr.,SIRI01B,Thursday,22.1333333333333,22.7166666666666,Thursday,Hasselwerderstr.,HAWR01B,13541,8,4454946,CKB +160,Hasselwerderstr.,HAWR01B,Thursday,22.85,23.4,Thursday,Siriusstr.,SIRI01B,14519,4,4454946,CKB +160,Siriusstr.,SIRI01B,Thursday,23.4666666666666,24.05,Friday,Hasselwerderstr.,HAWR01B,13541,8,4454946,CKB +160,Hasselwerderstr.,HAWR01B,Friday,0.183333333333333,0.733333333333333,Friday,Siriusstr.,SIRI01B,14519,0,4454946,CKB +N60,Siriusstr.,SIRI01B,Friday,0.733333333333333,0.9,Friday,S Adlershof,SAH02BN,4.1,25,4454946,CKB +N60,S Adlershof,SAH02BN,Friday,1.31666666666666,1.7,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454946,CKB +N60,Flughafen Schönefeld,SXF01B,Friday,1.8,2.1,Friday,S Adlershof,SAH02BN,9067,13,4454946,CKB +N60,S Adlershof,SAH02BN,Friday,2.31666666666666,2.7,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454946,CKB +N60,Flughafen Schönefeld,SXF01B,Friday,2.8,3.1,Friday,S Adlershof,SAH02BN,9067,13,4454946,CKB +N60,S Adlershof,SAH02BN,Friday,3.31666666666666,3.7,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454946,CKB +N60,Flughafen Schönefeld,SXF01B,Friday,3.8,4.1,Friday,S Adlershof,SAH02BN,9067,0,4454946,CKB +N60,S Adlershof,SAH02BN,Friday,4.1,4.1,Friday,Betriebshof A,BF A A,0.06,0,4454946,CKB +160,Betriebshof A,BF A E,Thursday,22.1833333333333,22.1833333333333,Thursday,Hasselwerderstr.,HAWR01B,0.06,0,4454951,CKB +160,Hasselwerderstr.,HAWR01B,Thursday,22.1833333333333,22.7333333333333,Thursday,Siriusstr.,SIRI01B,14519,4,4454951,CKB +160,Siriusstr.,SIRI01B,Thursday,22.8,23.3833333333333,Thursday,Hasselwerderstr.,HAWR01B,13541,8,4454951,CKB +160,Hasselwerderstr.,HAWR01B,Thursday,23.5166666666666,24.0666666666666,Friday,Siriusstr.,SIRI01B,14519,4,4454951,CKB +160,Siriusstr.,SIRI01B,Friday,0.133333333333333,0.65,Friday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454951,CKB +N60,S Schöneweide/Sterndamm,SSWS06B,Friday,0.65,0.783333333333333,Friday,S Adlershof,SAH02BN,4.0,2,4454951,CKB +N60,S Adlershof,SAH02BN,Friday,0.816666666666666,1.2,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454951,CKB +N60,Flughafen Schönefeld,SXF01B,Friday,1.3,1.6,Friday,S Adlershof,SAH02BN,9067,13,4454951,CKB +N60,S Adlershof,SAH02BN,Friday,1.81666666666666,2.2,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454951,CKB +N60,Flughafen Schönefeld,SXF01B,Friday,2.3,2.6,Friday,S Adlershof,SAH02BN,9067,13,4454951,CKB +N60,S Adlershof,SAH02BN,Friday,2.81666666666666,3.2,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454951,CKB +N60,Flughafen Schönefeld,SXF01B,Friday,3.3,3.6,Friday,S Adlershof,SAH02BN,9067,13,4454951,CKB +N60,S Adlershof,SAH02BN,Friday,3.81666666666666,4.2,Friday,Flughafen Schönefeld,SXF01B,8.36,0,4454951,CKB +N60,Flughafen Schönefeld,SXF01B,Friday,4.2,4.2,Friday,Betriebshof A,BF A A,0.06,0,4454951,CKB +161,Betriebshof A,BF A E,Thursday,21.1,21.1,Thursday,S Erkner/ZOB,SERZ01B,0.06,0,4664625,CKB +161,S Erkner/ZOB,SERZ01B,Thursday,21.1,21.5666666666666,Thursday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664625,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,21.8833333333333,22.2166666666666,Thursday,Lutherstr.,LUTH01B,10332,17,4664625,CKB +161,Lutherstr.,LUTH01B,Thursday,22.5,22.9,Thursday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664625,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,23.2166666666666,23.55,Thursday,Lutherstr.,LUTH01B,10332,17,4664625,CKB +161,Lutherstr.,LUTH01B,Thursday,23.8333333333333,24.2333333333333,Friday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664625,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Friday,0.266666666666666,0.383333333333333,Friday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664625,CKB +N61,Rahnsdorf/Waldschänke,RDWS03BN,Friday,0.466666666666666,0.733333333333333,Friday,Dämeritzstr.,DARI01B,6404,3,4664625,CKB +N61,Dämeritzstr.,DARI01B,Friday,0.783333333333333,1.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,1.28333333333333,1.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4664625,CKB +N61,Dämeritzstr.,DARI01B,Friday,1.78333333333333,2.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,2.28333333333333,2.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4664625,CKB +N61,Dämeritzstr.,DARI01B,Friday,2.78333333333333,3.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,3.28333333333333,3.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4664625,CKB +N61,Dämeritzstr.,DARI01B,Friday,3.78333333333333,4.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,4.28333333333333,4.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,0,4664625,CKB +N61,Dämeritzstr.,DARI01B,Friday,4.73333333333333,4.73333333333333,Friday,Betriebshof A,BF A A,0.06,0,4664625,CKB +161,Betriebshof A,BF A E,Thursday,20.4333333333333,20.4333333333333,Thursday,S Erkner/ZOB,SERZ01B,0.06,0,4762777,CKB +161,S Erkner/ZOB,SERZ01B,Thursday,20.4333333333333,20.9333333333333,Thursday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762777,CKB +161,"Schöneiche, Goethepark",SEGP01BA,Thursday,21.1666666666666,21.6333333333333,Thursday,S Erkner/ZOB,SERZ01B,13.19,8,4762777,CKB +161,S Erkner/ZOB,SERZ01B,Thursday,21.7666666666666,22.2333333333333,Thursday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762777,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,22.55,22.8833333333333,Thursday,Lutherstr.,LUTH01B,10332,17,4762777,CKB +161,Lutherstr.,LUTH01B,Thursday,23.1666666666666,23.5666666666666,Thursday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762777,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,23.8833333333333,24.2166666666666,Friday,Lutherstr.,LUTH01B,10332,2,4762777,CKB +161,Lutherstr.,LUTH01B,Friday,0.25,0.266666666666666,Friday,Dämeritzstr.,DARI01B,506,1,4762777,CKB +N61,Dämeritzstr.,DARI01B,Friday,0.283333333333333,0.666666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,0.783333333333333,1.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB +N61,Dämeritzstr.,DARI01B,Friday,1.28333333333333,1.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,1.78333333333333,2.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB +N61,Dämeritzstr.,DARI01B,Friday,2.28333333333333,2.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,2.78333333333333,3.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB +N61,Dämeritzstr.,DARI01B,Friday,3.28333333333333,3.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB +N61,S Friedrichshagen,SFHG05BN,Friday,3.78333333333333,4.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB +N61,Dämeritzstr.,DARI01B,Friday,4.28333333333333,4.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,3,4762777,CKB +N67,S Friedrichshagen,SFHG05BN,Friday,4.71666666666666,4.96666666666666,Friday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762777,CKB +N67,Schloßplatz Köpenick,SLPZ01BN,Friday,4.96666666666666,4.96666666666666,Friday,Betriebshof A,BF A A,0.06,0,4762777,CKB +163,Betriebshof A,BF A E,Thursday,22.9333333333333,22.9333333333333,Thursday,S Grünau,SGA24BA,0.06,0,4617422,CKB +163,S Grünau,SGA24BA,Thursday,22.9333333333333,23.1333333333333,Thursday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617422,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Thursday,23.1833333333333,23.4166666666666,Thursday,S Grünau,SGA22BA,6232,0,4617422,CKB +163,S Grünau,SGA22BA,Thursday,23.4166666666666,23.6333333333333,Thursday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617422,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Thursday,23.6833333333333,23.9166666666666,Thursday,S Grünau,SGA22BA,6232,0,4617422,CKB +163,S Grünau,SGA22BA,Thursday,23.9166666666666,24.1333333333333,Friday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617422,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Friday,0.133333333333333,0.133333333333333,Friday,Betriebshof A,BF A A,0.06,0,4617422,CKB +168,Betriebshof A,BF A E,Thursday,5.08333333333333,5.08333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,5.08333333333333,5.23333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,5.23333333333333,5.38333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,5.41666666666666,5.56666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,5.56666666666666,5.71666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,23,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,6.1,6.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,6.25,6.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,6.43333333333333,6.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,6.58333333333333,6.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,6.76666666666666,6.91666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,6.91666666666666,7.06666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,7.1,7.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,7.25,7.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,7.43333333333333,7.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,7.58333333333333,7.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,8.1,8.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,8.25,8.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,8.43333333333333,8.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,8.58333333333333,8.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,8.76666666666666,8.91666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,8.91666666666666,9.06666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,9.1,9.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,9.25,9.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,9.43333333333333,9.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,9.58333333333333,9.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,10.1,10.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,10.25,10.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,10.4333333333333,10.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,10.5833333333333,10.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,10.7666666666666,10.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,10.9166666666666,11.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,11.1,11.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,11.25,11.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,11.4333333333333,11.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,11.5833333333333,11.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,12.1,12.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,12.25,12.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,12.4333333333333,12.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,12.5833333333333,12.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,12.7666666666666,12.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,12.9166666666666,13.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,13.1,13.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,13.25,13.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,13.4333333333333,13.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,13.5833333333333,13.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,13.7666666666666,13.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,13.9166666666666,14.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,14.1,14.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,14.25,14.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,14.7666666666666,14.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,14.9166666666666,15.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,15.1,15.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,15.25,15.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,15.4333333333333,15.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,15.5833333333333,15.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,16.1,16.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,16.25,16.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,16.4333333333333,16.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,16.5833333333333,16.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,16.7666666666666,16.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,16.9166666666666,17.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,17.1,17.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,17.25,17.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,17.4333333333333,17.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,17.5833333333333,17.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,18.1,18.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,18.25,18.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,18.4333333333333,18.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,18.5833333333333,18.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,18.7666666666666,18.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,18.9166666666666,19.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,19.1,19.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,19.25,19.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,19.4333333333333,19.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,19.5833333333333,19.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,21,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,20.0833333333333,20.2333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,20.2333333333333,20.3833333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,20.4166666666666,20.5666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,20.5666666666666,20.7166666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,20.75,20.9,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,20.9,21.05,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,21.0833333333333,21.2333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,21.2333333333333,21.3833333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,21.4166666666666,21.5666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,21.5666666666666,21.7166666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,22.0833333333333,22.2333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,22.2333333333333,22.3833333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,22.4166666666666,22.5666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,22.5666666666666,22.7166666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,22.75,22.9,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB +168,Moßkopfring,MKFR01B,Thursday,22.9,23.05,Thursday,Alt-Schmöckwitz,ALSW02B,5139,0,4426847,CKB +168,Alt-Schmöckwitz,ALSW02B,Thursday,23.05,23.05,Thursday,Betriebshof A,BF A A,0.06,0,4426847,CKB +269,Betriebshof A,BF A E,Friday,0.1,0.1,Friday,S Kaulsdorf,SKD05B,0.06,0,4708597,CKB +269,S Kaulsdorf,SKD05B,Friday,0.1,0.45,Friday,S Köpenick,SKOE01B,7827,0,4708597,CKB +N69,S Köpenick,SKOE01B,Friday,0.45,0.8,Friday,Odernheimer Str.,ODNH01B,11079,0,4708597,CKB +N69,Odernheimer Str.,ODNH01B,Friday,0.8,1.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4708597,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,1.55,2.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4708597,CKB +N69,Odernheimer Str.,ODNH01B,Friday,2.28333333333333,2.91666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4708597,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,3.05,3.76666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4708597,CKB +N69,Odernheimer Str.,ODNH01B,Friday,3.78333333333333,4.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,0,4708597,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,4.41666666666666,4.41666666666666,Friday,Betriebshof A,BF A A,0.06,0,4708597,CKB +326,Betriebshof Indira-Gandhi-Str.,BF I E,Thursday,5.25,6.01666666666666,Thursday,S Hermsdorf,SHDF01B,17.9,0,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,6.01666666666666,6.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,6.38333333333333,6.61666666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,6.68333333333333,6.91666666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,7.05,7.28333333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,7.35,7.58333333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,7.71666666666666,7.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,8.01666666666666,8.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,8.38333333333333,8.61666666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,8.68333333333333,8.91666666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,9.05,9.28333333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,9.35,9.58333333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,9.71666666666666,9.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,10.0166666666666,10.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,10.3833333333333,10.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,10.6833333333333,10.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,11.05,11.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,11.35,11.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,11.7166666666666,11.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,12.0166666666666,12.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,12.3833333333333,12.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,12.6833333333333,12.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,13.05,13.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,13.35,13.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,13.7166666666666,13.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,14.0166666666666,14.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,14.3833333333333,14.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,14.6833333333333,14.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,15.05,15.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,15.35,15.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,15.7166666666666,15.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,16.0166666666666,16.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,16.3833333333333,16.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,16.6833333333333,16.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,17.05,17.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,17.35,17.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,17.7166666666666,17.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,18.0166666666666,18.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,18.3833333333333,18.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,18.6833333333333,18.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,19.05,19.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,19.35,19.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,19.7166666666666,19.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,20.0166666666666,20.2333333333333,Thursday,S Hermsdorf,SHDF01B,4637,9,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,20.3833333333333,20.6,Thursday,S Hermsdorf,SHDF01B,4637,0,4317627,VDL +326,S Hermsdorf,SHDF01B,Thursday,20.6,21.25,Thursday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317627,VDL +334,Betriebshof A,BF A E,Thursday,4.93333333333333,4.93333333333333,Thursday,Alt-Gatow,ALTG01B,0.06,18,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,5.23333333333333,5.33333333333333,Thursday,Habichtswald,HWLD01B,3.29,0,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,5.33333333333333,5.4,Thursday,Alt-Gatow,ALTG01B,2954,20,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,5.73333333333333,5.83333333333333,Thursday,Habichtswald,HWLD01B,3.29,0,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,5.83333333333333,5.9,Thursday,Alt-Gatow,ALTG01B,2954,5,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,5.98333333333333,6.1,Thursday,Habichtswald,HWLD01B,3.29,2,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,6.13333333333333,6.21666666666666,Thursday,Alt-Gatow,ALTG01B,2954,19,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,6.53333333333333,6.65,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,6.66666666666666,6.75,Thursday,Alt-Gatow,ALTG01B,2954,7,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,6.86666666666666,6.98333333333333,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,7.0,7.08333333333333,Thursday,Alt-Gatow,ALTG01B,2954,7,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,7.2,7.31666666666666,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,7.33333333333333,7.41666666666666,Thursday,Alt-Gatow,ALTG01B,2954,7,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,7.53333333333333,7.65,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,7.66666666666666,7.75,Thursday,Alt-Gatow,ALTG01B,2954,295,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,12.6666666666666,12.7833333333333,Thursday,Habichtswald,HWLD01B,3.29,2,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,12.8166666666666,12.9,Thursday,Alt-Gatow,ALTG01B,2954,46,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,13.6666666666666,13.7833333333333,Thursday,Habichtswald,HWLD01B,3.29,2,4425670,CKB +334,Habichtswald,HWLD01B,Thursday,13.8166666666666,13.9,Thursday,Alt-Gatow,ALTG01B,2954,434,4425670,CKB +334,Alt-Gatow,ALTG01B,Thursday,21.1333333333333,21.1333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4425670,CKB +349,Betriebshof A,BF A E,Thursday,7.33333333333333,7.33333333333333,Thursday,S Grunewald,SGD02B,0.06,0,4448152,CKB +349,S Grunewald,SGD02B,Thursday,7.33333333333333,7.83333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,8.0,8.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,8.66666666666666,9.16666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,9.33333333333333,9.83333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,10.0,10.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,10.6666666666666,11.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,11.3333333333333,11.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,12.0,12.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,12.6666666666666,13.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,13.3333333333333,13.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,14.0,14.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,14.6666666666666,15.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,15.3333333333333,15.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,16.0,16.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,16.6666666666666,17.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,17.3333333333333,17.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB +349,S Grunewald,SGD02B,Thursday,18.0,18.5,Thursday,S Grunewald,SGD02B,9266,0,4448152,CKB +349,S Grunewald,SGD02B,Thursday,18.5,18.5,Thursday,Betriebshof A,BF A A,0.06,0,4448152,CKB +370,Betriebshof A,BF A E,Thursday,7.16666666666666,7.16666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,7.16666666666666,7.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,7.46666666666666,7.66666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,7.66666666666666,7.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,7.96666666666666,8.16666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,8.16666666666666,8.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,8.46666666666666,8.66666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,8.66666666666666,8.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,8.96666666666666,9.16666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,9.16666666666666,9.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,9.46666666666666,9.66666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,9.66666666666666,9.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,9.96666666666666,10.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,10.1666666666666,10.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,10.4666666666666,10.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,10.6666666666666,10.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,10.9666666666666,11.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,11.1666666666666,11.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,11.4666666666666,11.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,11.6666666666666,11.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,11.9666666666666,12.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,12.1666666666666,12.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,12.4666666666666,12.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,12.6666666666666,12.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,12.9666666666666,13.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,13.1666666666666,13.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,13.4666666666666,13.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,13.6666666666666,13.8,Thursday,S+U Hermannstr.,SUHM09B,2169,8,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,13.9333333333333,14.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,14.1666666666666,14.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,14.55,14.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,14.8333333333333,14.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,15.2166666666666,15.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,15.5,15.65,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,15.8833333333333,16.1166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,16.1666666666666,16.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,16.55,16.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,16.8333333333333,16.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,17.2166666666666,17.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,17.5,17.65,Thursday,S+U Hermannstr.,SUHM09B,2169,13,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,17.8666666666666,18.0833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,5,4733897,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,18.1666666666666,18.3,Thursday,S+U Hermannstr.,SUHM09B,2169,0,4733897,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,18.3,18.3,Thursday,Betriebshof A,BF A A,0.06,0,4733897,CKB +370,Betriebshof A,BF A E,Thursday,14.2166666666666,14.2166666666666,Thursday,S+U Hermannstr.,SUHM09B,0.06,0,4734202,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,14.2166666666666,14.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,14.5,14.65,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,14.8833333333333,15.1166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,15.1666666666666,15.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,15.55,15.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,15.8333333333333,15.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,16.2166666666666,16.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,16.5,16.65,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,16.8833333333333,17.1166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,17.1666666666666,17.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,17.55,17.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,17.8333333333333,17.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB +370,S+U Hermannstr.,SUHM09B,Thursday,18.2166666666666,18.4166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4734202,CKB +370,Neuköllnische Brücke,NKBR04BA,Thursday,18.4166666666666,18.4166666666666,Thursday,Betriebshof A,BF A A,0.06,0,4734202,CKB +N23,Betriebshof A,BF A E,Friday,0.383333333333333,0.383333333333333,Friday,Mäckeritzwiesen,MAWI01B,0.06,0,4318159,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,0.383333333333333,0.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB +N39,U Rohrdamm,URDM01B,Friday,0.65,0.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB +N39,Mertensstr.,MTNS01B,Friday,1.05,1.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB +N23,U Rohrdamm,URDM02B,Friday,1.28333333333333,1.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,1.38333333333333,1.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB +N39,U Rohrdamm,URDM01B,Friday,1.65,1.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB +N39,Mertensstr.,MTNS01B,Friday,2.05,2.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB +N23,U Rohrdamm,URDM02B,Friday,2.28333333333333,2.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,2.38333333333333,2.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB +N39,U Rohrdamm,URDM01B,Friday,2.65,2.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB +N39,Mertensstr.,MTNS01B,Friday,3.05,3.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB +N23,U Rohrdamm,URDM02B,Friday,3.28333333333333,3.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,3.38333333333333,3.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB +N39,U Rohrdamm,URDM01B,Friday,3.65,3.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB +N39,Mertensstr.,MTNS01B,Friday,4.05,4.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB +N23,U Rohrdamm,URDM02B,Friday,4.28333333333333,4.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,4.38333333333333,4.38333333333333,Friday,Betriebshof A,BF A A,0.06,0,4318159,CKB +N39,Betriebshof A,BF A E,Friday,0.55,0.55,Friday,Mertensstr.,MTNS01B,0.06,0,4318179,CKB +N39,Mertensstr.,MTNS01B,Friday,0.55,0.783333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB +N23,U Rohrdamm,URDM02B,Friday,0.783333333333333,0.883333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,0.883333333333333,1.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB +N39,U Rohrdamm,URDM01B,Friday,1.15,1.4,Friday,Mertensstr.,MTNS01B,5937,9,4318179,CKB +N39,Mertensstr.,MTNS01B,Friday,1.55,1.78333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB +N23,U Rohrdamm,URDM02B,Friday,1.78333333333333,1.88333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,1.88333333333333,2.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB +N39,U Rohrdamm,URDM01B,Friday,2.15,2.4,Friday,Mertensstr.,MTNS01B,5937,9,4318179,CKB +N39,Mertensstr.,MTNS01B,Friday,2.55,2.78333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB +N23,U Rohrdamm,URDM02B,Friday,2.78333333333333,2.88333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,2.88333333333333,3.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB +N39,U Rohrdamm,URDM01B,Friday,3.15,3.4,Friday,Mertensstr.,MTNS01B,5937,9,4318179,CKB +N39,Mertensstr.,MTNS01B,Friday,3.55,3.78333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB +N23,U Rohrdamm,URDM02B,Friday,3.78333333333333,3.88333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB +N23,Mäckeritzwiesen,MAWI01B,Friday,3.88333333333333,4.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB +N39,U Rohrdamm,URDM01B,Friday,4.15,4.4,Friday,Mertensstr.,MTNS01B,5937,0,4318179,CKB +N39,Mertensstr.,MTNS01B,Friday,4.4,4.4,Friday,Betriebshof A,BF A A,0.06,0,4318179,CKB +N35,Betriebshof A,BF A E,Friday,0.95,0.95,Friday,Alt-Kladow,ALKL02B,0.06,0,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,0.95,1.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,1.1,1.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,1.45,1.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,1.6,1.68333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,1.95,2.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,2.1,2.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,2.45,2.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,2.6,2.68333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,2.95,3.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,3.1,3.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,3.45,3.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,3.6,3.68333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,3.95,4.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,4.1,4.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB +N35,Alt-Kladow,ALKL02B,Friday,4.45,4.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB +N35,Gutsstr.,GUTS01B,Friday,4.6,4.6,Friday,Betriebshof A,BF A A,0.06,0,4319354,CKB +N52,Betriebshof A,BF A E,Friday,0.483333333333333,0.483333333333333,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,0.483333333333333,0.683333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,0.783333333333333,0.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,0.983333333333333,1.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,1.28333333333333,1.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.48333333333333,1.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,1.78333333333333,1.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.98333333333333,2.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,2.28333333333333,2.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.48333333333333,2.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,2.78333333333333,2.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.98333333333333,3.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,3.28333333333333,3.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.48333333333333,3.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,3.78333333333333,3.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.98333333333333,4.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,4.28333333333333,4.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB +N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,4.48333333333333,4.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,0,4751089,CKB +N52,U Osloer Str.,UOSL04B,Friday,4.68333333333333,4.68333333333333,Friday,Betriebshof A,BF A A,0.06,0,4751089,CKB +N53,Betriebshof A,BF A E,Friday,0.5,0.5,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,0.5,0.733333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,0.733333333333333,0.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.0,1.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,1.23333333333333,1.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.5,1.73333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,1.73333333333333,1.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.0,2.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,2.23333333333333,2.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.5,2.73333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,2.73333333333333,2.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.0,3.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,3.23333333333333,3.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.5,3.73333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,3.73333333333333,3.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,4.0,4.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB +N53,Wilhelmsruher Damm,WIDA02B,Friday,4.23333333333333,4.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453547,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,4.45,4.45,Friday,Betriebshof A,BF A A,0.06,0,4453547,CKB +N56,Betriebshof A,BF A E,Friday,0.716666666666666,0.716666666666666,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374469,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,0.716666666666666,1.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374469,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,1.71666666666666,2.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374469,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,2.71666666666666,3.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374469,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,3.71666666666666,4.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374469,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,4.55,4.55,Friday,Betriebshof A,BF A A,0.06,0,4374469,CKB +N56,Betriebshof A,BF A E,Friday,0.216666666666666,0.216666666666666,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374474,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,0.216666666666666,1.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374474,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,1.21666666666666,2.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374474,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,2.21666666666666,3.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374474,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,3.21666666666666,4.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374474,CKB +N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,4.05,4.05,Friday,Betriebshof A,BF A A,0.06,0,4374474,CKB +N58,Betriebshof A,BF A E,Friday,0.4,0.4,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456450,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,0.4,0.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB +N58,S Buch,SBU02B,Friday,0.866666666666666,1.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456450,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,1.4,1.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB +N58,S Buch,SBU02B,Friday,1.86666666666666,2.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456450,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,2.4,2.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB +N58,S Buch,SBU02B,Friday,2.86666666666666,3.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456450,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,3.4,3.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB +N58,S Buch,SBU02B,Friday,3.86666666666666,4.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456450,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,4.23333333333333,4.23333333333333,Friday,Betriebshof A,BF A A,0.06,0,4456450,CKB +N58,Betriebshof A,BF A E,Friday,0.366666666666666,0.366666666666666,Friday,S Buch,SBU02B,0.06,0,4456458,CKB +N58,S Buch,SBU02B,Friday,0.366666666666666,0.733333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,0.9,1.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB +N58,S Buch,SBU02B,Friday,1.36666666666666,1.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,1.9,2.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB +N58,S Buch,SBU02B,Friday,2.36666666666666,2.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,2.9,3.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB +N58,S Buch,SBU02B,Friday,3.36666666666666,3.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,3.9,4.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB +N58,S Buch,SBU02B,Friday,4.36666666666666,4.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456458,CKB +N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,4.73333333333333,4.73333333333333,Friday,Betriebshof A,BF A A,0.06,0,4456458,CKB +N62,Betriebshof A,BF A E,Friday,0.533333333333333,0.533333333333333,Friday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747652,CKB +N62,Schloßplatz Köpenick,SLPZ02BN,Friday,0.533333333333333,0.733333333333333,Friday,Wendenschloß,WESC09BA,4212,3,4747652,CKB +N62,Wendenschloß,WESC09BA,Friday,0.783333333333333,1.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,1.26666666666666,1.7,Friday,Wendenschloß,WESC09BA,12869,5,4747652,CKB +N62,Wendenschloß,WESC09BA,Friday,1.78333333333333,2.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,2.26666666666666,2.7,Friday,Wendenschloß,WESC09BA,12869,5,4747652,CKB +N62,Wendenschloß,WESC09BA,Friday,2.78333333333333,3.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,3.26666666666666,3.7,Friday,Wendenschloß,WESC09BA,12869,5,4747652,CKB +N62,Wendenschloß,WESC09BA,Friday,3.78333333333333,4.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,4.26666666666666,4.56666666666666,Friday,Betriebshof Köpenick,BHKO01BN,9538,0,4747652,CKB +N62,Betriebshof Köpenick,BHKO01BN,Friday,4.56666666666666,4.56666666666666,Friday,Betriebshof A,BF A A,0.06,0,4747652,CKB +N62,Betriebshof A,BF A E,Friday,0.283333333333333,0.283333333333333,Friday,Wendenschloß,WESC09BA,0.06,0,4747662,CKB +N62,Wendenschloß,WESC09BA,Friday,0.283333333333333,0.766666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,0.766666666666666,1.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB +N62,Wendenschloß,WESC09BA,Friday,1.28333333333333,1.76666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,1.76666666666666,2.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB +N62,Wendenschloß,WESC09BA,Friday,2.28333333333333,2.76666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,2.76666666666666,3.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB +N62,Wendenschloß,WESC09BA,Friday,3.28333333333333,3.76666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,3.76666666666666,4.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB +N62,Wendenschloß,WESC09BA,Friday,4.28333333333333,4.46666666666666,Friday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747662,CKB +N62,Schloßplatz Köpenick,SLPZ03B,Friday,4.46666666666666,4.46666666666666,Friday,Betriebshof A,BF A A,0.06,0,4747662,CKB +N68,Betriebshof A,BF A E,Friday,0.816666666666666,0.816666666666666,Friday,S Adlershof,SAH02BN,0.06,0,4434343,CKB +N68,S Adlershof,SAH02BN,Friday,0.816666666666666,1.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Friday,1.06666666666666,1.31666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB +N68,S Adlershof,SAH02BN,Friday,1.31666666666666,1.56666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Friday,1.56666666666666,1.81666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB +N68,S Adlershof,SAH02BN,Friday,1.81666666666666,2.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Friday,2.06666666666666,2.31666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB +N68,S Adlershof,SAH02BN,Friday,2.31666666666666,2.56666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Friday,2.56666666666666,2.81666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB +N68,S Adlershof,SAH02BN,Friday,2.81666666666666,3.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Friday,3.06666666666666,3.31666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB +N68,S Adlershof,SAH02BN,Friday,3.31666666666666,3.56666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Friday,3.56666666666666,3.81666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB +N68,S Adlershof,SAH02BN,Friday,3.81666666666666,4.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Friday,4.06666666666666,4.31666666666666,Friday,S Adlershof,SAH02BN,11801,23,4434343,CKB +164,S Adlershof,SAH02BN,Friday,4.7,5.06666666666666,Friday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434343,CKB +164,Kaulsdorfer Str.,KDFS02B,Friday,5.06666666666666,5.06666666666666,Friday,Betriebshof A,BF A A,0.06,0,4434343,CKB +N69,Betriebshof A,BF A E,Friday,0.533333333333333,0.533333333333333,Friday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434899,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Friday,0.533333333333333,0.95,Friday,S+U Wuhletal,SUWT02BN,11545,6,4434899,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,1.05,1.76666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434899,CKB +N69,Odernheimer Str.,ODNH01B,Friday,1.78333333333333,2.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434899,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,2.55,3.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434899,CKB +N69,Odernheimer Str.,ODNH01B,Friday,3.28333333333333,3.91666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434899,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,4.05,4.46666666666666,Friday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434899,CKB +N69,Schloßplatz Köpenick,SLPZ02BN,Friday,4.46666666666666,4.46666666666666,Friday,Betriebshof A,BF A A,0.06,0,4434899,CKB +N69,Betriebshof A,BF A E,Friday,0.55,0.55,Friday,S+U Wuhletal,SUWT02BN,0.06,0,4434904,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,0.55,1.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434904,CKB +N69,Odernheimer Str.,ODNH01B,Friday,1.28333333333333,1.91666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434904,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,2.05,2.76666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434904,CKB +N69,Odernheimer Str.,ODNH01B,Friday,2.78333333333333,3.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434904,CKB +N69,S+U Wuhletal,SUWT02BN,Friday,3.55,4.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434904,CKB +N69,Odernheimer Str.,ODNH01B,Friday,4.28333333333333,4.85,Friday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434904,CKB +N69,U Elsterwerdaer Platz,UEWP03B,Friday,4.85,4.85,Friday,Betriebshof A,BF A A,0.06,0,4434904,CKB +N88,Betriebshof A,BF A E,Friday,0.566666666666666,0.566666666666666,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619768,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,0.566666666666666,1.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,1.0,1.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619768,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,1.56666666666666,2.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,2.0,2.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619768,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,2.56666666666666,3.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,3.0,3.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619768,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,3.56666666666666,4.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,4.0,4.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619768,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,4.45,4.45,Friday,Betriebshof A,BF A A,0.06,0,4619768,CKB +N88,Betriebshof A,BF A E,Friday,0.5,0.5,Friday,S Lichterfelde Süd,SLIS01B,0.06,0,4619993,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,0.5,0.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,1.06666666666666,1.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,1.5,1.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,2.06666666666666,2.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,2.5,2.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,3.06666666666666,3.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,3.5,3.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,4.06666666666666,4.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB +N88,S Lichterfelde Süd,SLIS01B,Friday,4.5,4.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619993,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,4.95,4.95,Friday,Betriebshof A,BF A A,0.06,0,4619993,CKB +N91,Betriebshof A,BF A E,Friday,0.516666666666666,0.516666666666666,Friday,S+U Wuhletal,SUWT02BN,0.06,0,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,0.516666666666666,0.733333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,0.733333333333333,0.933333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,1.01666666666666,1.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,1.23333333333333,1.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,1.51666666666666,1.73333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,1.73333333333333,1.93333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,2.01666666666666,2.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,2.23333333333333,2.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,2.51666666666666,2.73333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,2.73333333333333,2.93333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,3.01666666666666,3.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,3.23333333333333,3.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,3.51666666666666,3.73333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,3.73333333333333,3.93333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,4.01666666666666,4.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB +N91,Boschpoler Str.,BOPO01BN,Friday,4.23333333333333,4.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,0,4374746,CKB +N91,S+U Wuhletal,SUWT02BN,Friday,4.43333333333333,4.43333333333333,Friday,Betriebshof A,BF A A,0.06,0,4374746,CKB +N95,Betriebshof A,BF A E,Friday,0.516666666666666,0.516666666666666,Friday,S+U Wuhletal,SUWT02BN,0.06,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,0.516666666666666,0.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,0.783333333333333,1.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,1.01666666666666,1.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,1.28333333333333,1.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,1.51666666666666,1.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,1.78333333333333,2.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,2.01666666666666,2.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,2.28333333333333,2.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,2.51666666666666,2.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,2.78333333333333,3.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,3.01666666666666,3.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,3.28333333333333,3.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,3.51666666666666,3.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,3.78333333333333,4.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,4.01666666666666,4.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB +N95,Riesaer Str.,RIES01BN,Friday,4.28333333333333,4.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB +N95,S+U Wuhletal,SUWT02BN,Friday,4.51666666666666,4.51666666666666,Friday,Betriebshof A,BF A A,0.06,0,4374869,CKB +N97,Betriebshof A,BF A E,Friday,0.716666666666666,0.716666666666666,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,0.716666666666666,0.883333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,0.883333333333333,1.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,1.21666666666666,1.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,1.38333333333333,1.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,1.71666666666666,1.88333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,1.88333333333333,2.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,2.21666666666666,2.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,2.38333333333333,2.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,2.71666666666666,2.88333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,2.88333333333333,3.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,3.21666666666666,3.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,3.38333333333333,3.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,3.71666666666666,3.88333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,3.88333333333333,4.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,4.21666666666666,4.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB +N97,Barnimplatz,BARN01B,Friday,4.38333333333333,4.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375015,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,4.55,4.55,Friday,Betriebshof A,BF A A,0.06,0,4375015,CKB +160,Betriebshof A,BF A E,Friday,21.5166666666666,21.5166666666666,Friday,Hasselwerderstr.,HAWR01B,0.06,0,4454947,CKB +160,Hasselwerderstr.,HAWR01B,Friday,21.5166666666666,22.0666666666666,Friday,Siriusstr.,SIRI01B,14519,4,4454947,CKB +160,Siriusstr.,SIRI01B,Friday,22.1333333333333,22.7166666666666,Friday,Hasselwerderstr.,HAWR01B,13541,8,4454947,CKB +160,Hasselwerderstr.,HAWR01B,Friday,22.85,23.4,Friday,Siriusstr.,SIRI01B,14519,4,4454947,CKB +160,Siriusstr.,SIRI01B,Friday,23.4666666666666,24.05,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454947,CKB +160,Hasselwerderstr.,HAWR01B,Saturday,0.183333333333333,0.733333333333333,Saturday,Siriusstr.,SIRI01B,14519,0,4454947,CKB +N60,Siriusstr.,SIRI01B,Saturday,0.733333333333333,0.9,Saturday,S Adlershof,SAH02BN,4.1,25,4454947,CKB +N60,S Adlershof,SAH02BN,Saturday,1.31666666666666,1.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,1.8,2.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB +N60,S Adlershof,SAH02BN,Saturday,2.31666666666666,2.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,2.8,3.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB +N60,S Adlershof,SAH02BN,Saturday,3.31666666666666,3.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,3.8,4.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB +N60,S Adlershof,SAH02BN,Saturday,4.31666666666666,4.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,4.8,5.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB +N60,S Adlershof,SAH02BN,Saturday,5.31666666666666,5.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,16,4454947,CKB +164,Flughafen Schönefeld,SXF01B,Saturday,5.96666666666666,6.56666666666666,Saturday,Kaulsdorfer Str.,KDFS02B,12968,0,4454947,CKB +164,Kaulsdorfer Str.,KDFS02B,Saturday,6.56666666666666,6.56666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4454947,CKB +160,Betriebshof A,BF A E,Friday,22.1833333333333,22.1833333333333,Friday,Hasselwerderstr.,HAWR01B,0.06,0,4454952,CKB +160,Hasselwerderstr.,HAWR01B,Friday,22.1833333333333,22.7333333333333,Friday,Siriusstr.,SIRI01B,14519,4,4454952,CKB +160,Siriusstr.,SIRI01B,Friday,22.8,23.3833333333333,Friday,Hasselwerderstr.,HAWR01B,13541,8,4454952,CKB +160,Hasselwerderstr.,HAWR01B,Friday,23.5166666666666,24.0666666666666,Saturday,Siriusstr.,SIRI01B,14519,4,4454952,CKB +160,Siriusstr.,SIRI01B,Saturday,0.133333333333333,0.65,Saturday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454952,CKB +N60,S Schöneweide/Sterndamm,SSWS06B,Saturday,0.65,0.783333333333333,Saturday,S Adlershof,SAH02BN,4.0,2,4454952,CKB +N60,S Adlershof,SAH02BN,Saturday,0.816666666666666,1.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,1.3,1.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB +N60,S Adlershof,SAH02BN,Saturday,1.81666666666666,2.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,2.3,2.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB +N60,S Adlershof,SAH02BN,Saturday,2.81666666666666,3.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,3.3,3.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB +N60,S Adlershof,SAH02BN,Saturday,3.81666666666666,4.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,4.3,4.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB +N60,S Adlershof,SAH02BN,Saturday,4.81666666666666,5.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB +N60,Flughafen Schönefeld,SXF01B,Saturday,5.3,5.6,Saturday,S Adlershof,SAH02BN,9067,0,4454952,CKB +N60,S Adlershof,SAH02BN,Saturday,5.6,5.6,Saturday,Betriebshof A,BF A A,0.06,0,4454952,CKB +161,Betriebshof A,BF A E,Friday,21.1,21.1,Friday,S Erkner/ZOB,SERZ01B,0.06,0,4664738,CKB +161,S Erkner/ZOB,SERZ01B,Friday,21.1,21.5666666666666,Friday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664738,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Friday,21.8833333333333,22.2166666666666,Friday,Lutherstr.,LUTH01B,10332,17,4664738,CKB +161,Lutherstr.,LUTH01B,Friday,22.5,22.9,Friday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664738,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Friday,23.2166666666666,23.55,Friday,Lutherstr.,LUTH01B,10332,17,4664738,CKB +161,Lutherstr.,LUTH01B,Friday,23.8333333333333,24.2333333333333,Saturday,"Schöneiche, Lübecker Str.",SELS01B,10.48,8,4664738,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,0.366666666666666,0.45,Saturday,S Rahnsdorf,SRD01B,2533,2,4664738,CKB +N61,S Rahnsdorf,SRD01B,Saturday,0.483333333333333,0.783333333333333,Saturday,Dämeritzstr.,DARI01B,7.58,0,4664738,CKB +N61,Dämeritzstr.,DARI01B,Saturday,0.783333333333333,1.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,1.28333333333333,1.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB +N61,Dämeritzstr.,DARI01B,Saturday,1.78333333333333,2.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,2.28333333333333,2.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB +N61,Dämeritzstr.,DARI01B,Saturday,2.78333333333333,3.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,3.28333333333333,3.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB +N61,Dämeritzstr.,DARI01B,Saturday,3.78333333333333,4.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,4.28333333333333,4.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB +N61,Dämeritzstr.,DARI01B,Saturday,4.78333333333333,5.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,5.28333333333333,5.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB +N61,Dämeritzstr.,DARI01B,Saturday,5.78333333333333,5.78333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4664738,CKB +161,Betriebshof A,BF A E,Friday,20.4333333333333,20.4333333333333,Friday,S Erkner/ZOB,SERZ01B,0.06,0,4762763,CKB +161,S Erkner/ZOB,SERZ01B,Friday,20.4333333333333,20.9333333333333,Friday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762763,CKB +161,"Schöneiche, Goethepark",SEGP01BA,Friday,21.1666666666666,21.6333333333333,Friday,S Erkner/ZOB,SERZ01B,13.19,8,4762763,CKB +161,S Erkner/ZOB,SERZ01B,Friday,21.7666666666666,22.2333333333333,Friday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762763,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Friday,22.55,22.8833333333333,Friday,Lutherstr.,LUTH01B,10332,17,4762763,CKB +161,Lutherstr.,LUTH01B,Friday,23.1666666666666,23.5666666666666,Friday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762763,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Friday,23.8833333333333,24.2166666666666,Saturday,Lutherstr.,LUTH01B,10332,2,4762763,CKB +161,Lutherstr.,LUTH01B,Saturday,0.25,0.266666666666666,Saturday,Dämeritzstr.,DARI01B,506,1,4762763,CKB +N61,Dämeritzstr.,DARI01B,Saturday,0.283333333333333,0.733333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,0.783333333333333,1.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB +N61,Dämeritzstr.,DARI01B,Saturday,1.28333333333333,1.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,1.78333333333333,2.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB +N61,Dämeritzstr.,DARI01B,Saturday,2.28333333333333,2.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,2.78333333333333,3.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB +N61,Dämeritzstr.,DARI01B,Saturday,3.28333333333333,3.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,3.78333333333333,4.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB +N61,Dämeritzstr.,DARI01B,Saturday,4.28333333333333,4.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB +N61,S Friedrichshagen,SFHG05BN,Saturday,4.78333333333333,5.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB +N61,Dämeritzstr.,DARI01B,Saturday,5.28333333333333,5.48333333333333,Saturday,S Rahnsdorf,SRD01B,5474,0,4762763,CKB +N61,S Rahnsdorf,SRD01B,Saturday,5.48333333333333,5.48333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4762763,CKB +163,Betriebshof A,BF A E,Friday,22.9333333333333,22.9333333333333,Friday,S Grünau,SGA24BA,0.06,0,4617429,CKB +163,S Grünau,SGA24BA,Friday,22.9333333333333,23.1333333333333,Friday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617429,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Friday,23.1833333333333,23.4166666666666,Friday,S Grünau,SGA22BA,6232,0,4617429,CKB +163,S Grünau,SGA22BA,Friday,23.4166666666666,23.6333333333333,Friday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617429,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Friday,23.6833333333333,23.9166666666666,Friday,S Grünau,SGA22BA,6232,0,4617429,CKB +163,S Grünau,SGA22BA,Friday,23.9166666666666,24.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617429,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,0.133333333333333,0.133333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4617429,CKB +168,Betriebshof A,BF A E,Friday,5.08333333333333,5.08333333333333,Friday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,5.08333333333333,5.23333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,5.23333333333333,5.38333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,5.41666666666666,5.56666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,5.56666666666666,5.71666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,23,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,6.1,6.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,6.25,6.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,6.43333333333333,6.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,6.58333333333333,6.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,6.76666666666666,6.91666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,6.91666666666666,7.06666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,7.1,7.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,7.25,7.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,7.43333333333333,7.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,7.58333333333333,7.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,8.1,8.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,8.25,8.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,8.43333333333333,8.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,8.58333333333333,8.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,8.76666666666666,8.91666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,8.91666666666666,9.06666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,9.1,9.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,9.25,9.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,9.43333333333333,9.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,9.58333333333333,9.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,10.1,10.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,10.25,10.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,10.4333333333333,10.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,10.5833333333333,10.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,10.7666666666666,10.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,10.9166666666666,11.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,11.1,11.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,11.25,11.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,11.4333333333333,11.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,11.5833333333333,11.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,12.1,12.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,12.25,12.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,12.4333333333333,12.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,12.5833333333333,12.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,12.7666666666666,12.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,12.9166666666666,13.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,13.1,13.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,13.25,13.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,13.4333333333333,13.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,13.5833333333333,13.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,13.7666666666666,13.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,13.9166666666666,14.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,14.1,14.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,14.25,14.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,14.7666666666666,14.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,14.9166666666666,15.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,15.1,15.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,15.25,15.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,15.4333333333333,15.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,15.5833333333333,15.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,16.1,16.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,16.25,16.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,16.4333333333333,16.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,16.5833333333333,16.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,16.7666666666666,16.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,16.9166666666666,17.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,17.1,17.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,17.25,17.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,17.4333333333333,17.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,17.5833333333333,17.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,18.1,18.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,18.25,18.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,18.4333333333333,18.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,18.5833333333333,18.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,18.7666666666666,18.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,18.9166666666666,19.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,19.1,19.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,19.25,19.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,19.4333333333333,19.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,19.5833333333333,19.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,21,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,20.0833333333333,20.2333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,20.2333333333333,20.3833333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,20.4166666666666,20.5666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,20.5666666666666,20.7166666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,20.75,20.9,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,20.9,21.05,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,21.0833333333333,21.2333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,21.2333333333333,21.3833333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,21.4166666666666,21.5666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,21.5666666666666,21.7166666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,22.0833333333333,22.2333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,22.2333333333333,22.3833333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,22.4166666666666,22.5666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,22.5666666666666,22.7166666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,22.75,22.9,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB +168,Moßkopfring,MKFR01B,Friday,22.9,23.05,Friday,Alt-Schmöckwitz,ALSW02B,5139,0,4426848,CKB +168,Alt-Schmöckwitz,ALSW02B,Friday,23.05,23.05,Friday,Betriebshof A,BF A A,0.06,0,4426848,CKB +326,Betriebshof Indira-Gandhi-Str.,BF I E,Friday,5.25,6.01666666666666,Friday,S Hermsdorf,SHDF01B,17.9,0,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,6.01666666666666,6.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,6.38333333333333,6.61666666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,6.68333333333333,6.91666666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,7.05,7.28333333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,7.35,7.58333333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,7.71666666666666,7.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,8.01666666666666,8.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,8.38333333333333,8.61666666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,8.68333333333333,8.91666666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,9.05,9.28333333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,9.35,9.58333333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,9.71666666666666,9.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,10.0166666666666,10.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,10.3833333333333,10.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,10.6833333333333,10.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,11.05,11.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,11.35,11.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,11.7166666666666,11.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,12.0166666666666,12.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,12.3833333333333,12.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,12.6833333333333,12.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,13.05,13.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,13.35,13.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,13.7166666666666,13.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,14.0166666666666,14.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,14.3833333333333,14.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,14.6833333333333,14.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,15.05,15.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,15.35,15.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,15.7166666666666,15.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,16.0166666666666,16.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,16.3833333333333,16.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,16.6833333333333,16.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,17.05,17.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,17.35,17.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,17.7166666666666,17.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,18.0166666666666,18.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,18.3833333333333,18.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,18.6833333333333,18.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,19.05,19.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,19.35,19.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,19.7166666666666,19.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,20.0166666666666,20.2333333333333,Friday,S Hermsdorf,SHDF01B,4637,9,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,20.3833333333333,20.6,Friday,S Hermsdorf,SHDF01B,4637,0,4317628,VDL +326,S Hermsdorf,SHDF01B,Friday,20.6,21.25,Friday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317628,VDL +334,Betriebshof A,BF A E,Friday,4.93333333333333,4.93333333333333,Friday,Alt-Gatow,ALTG01B,0.06,18,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,5.23333333333333,5.33333333333333,Friday,Habichtswald,HWLD01B,3.29,0,4425671,CKB +334,Habichtswald,HWLD01B,Friday,5.33333333333333,5.4,Friday,Alt-Gatow,ALTG01B,2954,20,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,5.73333333333333,5.83333333333333,Friday,Habichtswald,HWLD01B,3.29,0,4425671,CKB +334,Habichtswald,HWLD01B,Friday,5.83333333333333,5.9,Friday,Alt-Gatow,ALTG01B,2954,5,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,5.98333333333333,6.1,Friday,Habichtswald,HWLD01B,3.29,2,4425671,CKB +334,Habichtswald,HWLD01B,Friday,6.13333333333333,6.21666666666666,Friday,Alt-Gatow,ALTG01B,2954,19,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,6.53333333333333,6.65,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB +334,Habichtswald,HWLD01B,Friday,6.66666666666666,6.75,Friday,Alt-Gatow,ALTG01B,2954,7,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,6.86666666666666,6.98333333333333,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB +334,Habichtswald,HWLD01B,Friday,7.0,7.08333333333333,Friday,Alt-Gatow,ALTG01B,2954,7,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,7.2,7.31666666666666,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB +334,Habichtswald,HWLD01B,Friday,7.33333333333333,7.41666666666666,Friday,Alt-Gatow,ALTG01B,2954,7,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,7.53333333333333,7.65,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB +334,Habichtswald,HWLD01B,Friday,7.66666666666666,7.75,Friday,Alt-Gatow,ALTG01B,2954,295,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,12.6666666666666,12.7833333333333,Friday,Habichtswald,HWLD01B,3.29,2,4425671,CKB +334,Habichtswald,HWLD01B,Friday,12.8166666666666,12.9,Friday,Alt-Gatow,ALTG01B,2954,46,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,13.6666666666666,13.7833333333333,Friday,Habichtswald,HWLD01B,3.29,2,4425671,CKB +334,Habichtswald,HWLD01B,Friday,13.8166666666666,13.9,Friday,Alt-Gatow,ALTG01B,2954,434,4425671,CKB +334,Alt-Gatow,ALTG01B,Friday,21.1333333333333,21.1333333333333,Friday,Betriebshof A,BF A A,0.06,0,4425671,CKB +349,Betriebshof A,BF A E,Friday,7.33333333333333,7.33333333333333,Friday,S Grunewald,SGD02B,0.06,0,4448153,CKB +349,S Grunewald,SGD02B,Friday,7.33333333333333,7.83333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,8.0,8.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,8.66666666666666,9.16666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,9.33333333333333,9.83333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,10.0,10.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,10.6666666666666,11.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,11.3333333333333,11.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,12.0,12.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,12.6666666666666,13.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,13.3333333333333,13.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,14.0,14.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,14.6666666666666,15.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,15.3333333333333,15.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,16.0,16.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,16.6666666666666,17.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,17.3333333333333,17.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB +349,S Grunewald,SGD02B,Friday,18.0,18.5,Friday,S Grunewald,SGD02B,9266,0,4448153,CKB +349,S Grunewald,SGD02B,Friday,18.5,18.5,Friday,Betriebshof A,BF A A,0.06,0,4448153,CKB +370,Betriebshof A,BF A E,Friday,7.16666666666666,7.16666666666666,Friday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,7.16666666666666,7.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,7.46666666666666,7.66666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,7.66666666666666,7.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,7.96666666666666,8.16666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,8.16666666666666,8.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,8.46666666666666,8.66666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,8.66666666666666,8.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,8.96666666666666,9.16666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,9.16666666666666,9.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,9.46666666666666,9.66666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,9.66666666666666,9.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,9.96666666666666,10.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,10.1666666666666,10.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,10.4666666666666,10.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,10.6666666666666,10.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,10.9666666666666,11.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,11.1666666666666,11.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,11.4666666666666,11.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,11.6666666666666,11.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,11.9666666666666,12.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,12.1666666666666,12.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,12.4666666666666,12.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,12.6666666666666,12.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,12.9666666666666,13.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,13.1666666666666,13.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,13.4666666666666,13.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,13.6666666666666,13.8,Friday,S+U Hermannstr.,SUHM09B,2169,8,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,13.9333333333333,14.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,14.1666666666666,14.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,14.55,14.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,14.8333333333333,14.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,15.2166666666666,15.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,15.5,15.65,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,15.8833333333333,16.1166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,16.1666666666666,16.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,16.55,16.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,16.8333333333333,16.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,17.2166666666666,17.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,17.5,17.65,Friday,S+U Hermannstr.,SUHM09B,2169,13,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,17.8666666666666,18.0833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,5,4733898,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,18.1666666666666,18.3,Friday,S+U Hermannstr.,SUHM09B,2169,0,4733898,CKB +370,S+U Hermannstr.,SUHM09B,Friday,18.3,18.3,Friday,Betriebshof A,BF A A,0.06,0,4733898,CKB +370,Betriebshof A,BF A E,Friday,14.2166666666666,14.2166666666666,Friday,S+U Hermannstr.,SUHM09B,0.06,0,4734203,CKB +370,S+U Hermannstr.,SUHM09B,Friday,14.2166666666666,14.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,14.5,14.65,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB +370,S+U Hermannstr.,SUHM09B,Friday,14.8833333333333,15.1166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,15.1666666666666,15.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB +370,S+U Hermannstr.,SUHM09B,Friday,15.55,15.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,15.8333333333333,15.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB +370,S+U Hermannstr.,SUHM09B,Friday,16.2166666666666,16.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,16.5,16.65,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB +370,S+U Hermannstr.,SUHM09B,Friday,16.8833333333333,17.1166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,17.1666666666666,17.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB +370,S+U Hermannstr.,SUHM09B,Friday,17.55,17.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,17.8333333333333,17.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB +370,S+U Hermannstr.,SUHM09B,Friday,18.2166666666666,18.4166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4734203,CKB +370,Neuköllnische Brücke,NKBR04BA,Friday,18.4166666666666,18.4166666666666,Friday,Betriebshof A,BF A A,0.06,0,4734203,CKB +N23,Betriebshof A,BF A E,Saturday,0.383333333333333,0.383333333333333,Saturday,Mäckeritzwiesen,MAWI01B,0.06,0,4318160,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,0.383333333333333,0.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB +N39,U Rohrdamm,URDM01B,Saturday,0.65,0.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB +N39,Mertensstr.,MTNS01B,Saturday,1.05,1.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB +N23,U Rohrdamm,URDM02B,Saturday,1.28333333333333,1.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,1.38333333333333,1.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB +N39,U Rohrdamm,URDM01B,Saturday,1.65,1.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB +N39,Mertensstr.,MTNS01B,Saturday,2.05,2.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB +N23,U Rohrdamm,URDM02B,Saturday,2.28333333333333,2.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,2.38333333333333,2.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB +N39,U Rohrdamm,URDM01B,Saturday,2.65,2.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB +N39,Mertensstr.,MTNS01B,Saturday,3.05,3.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB +N23,U Rohrdamm,URDM02B,Saturday,3.28333333333333,3.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,3.38333333333333,3.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB +N39,U Rohrdamm,URDM01B,Saturday,3.65,3.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB +N39,Mertensstr.,MTNS01B,Saturday,4.05,4.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB +N23,U Rohrdamm,URDM02B,Saturday,4.28333333333333,4.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,4.38333333333333,4.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB +N39,U Rohrdamm,URDM01B,Saturday,4.65,4.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB +N39,Mertensstr.,MTNS01B,Saturday,5.05,5.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB +N35,U Rohrdamm,URDM02B,Saturday,5.28333333333333,5.63333333333333,Saturday,Gutsstr.,GUTS01B,12.0,28,4318160,CKB +N35,Gutsstr.,GUTS01B,Saturday,6.1,6.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4318160,CKB +N35,Alt-Kladow,ALKL02B,Saturday,6.45,6.6,Saturday,Gutsstr.,GUTS01B,4343,10,4318160,CKB +N35,Gutsstr.,GUTS01B,Saturday,6.76666666666666,6.85,Saturday,Alt-Kladow,ALKL02B,2936,0,4318160,CKB +334,Alt-Kladow,ALKL02B,Saturday,6.85,7.0,Saturday,Alt-Gatow,ALTG01B,4.6,12,4318160,CKB +334,Alt-Gatow,ALTG01B,Saturday,7.2,7.2,Saturday,Alt-Gatow,ALTG99B,0.0,836,4318160,CKB +334,Alt-Gatow,ALTG99B,Saturday,21.1333333333333,21.1333333333333,Saturday,Alt-Gatow,ALTG01B,0.0,0,4318160,CKB +334,Alt-Gatow,ALTG01B,Saturday,21.1333333333333,21.1333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4318160,CKB +N39,Betriebshof A,BF A E,Saturday,0.55,0.55,Saturday,Mertensstr.,MTNS01B,0.06,0,4318180,CKB +N39,Mertensstr.,MTNS01B,Saturday,0.55,0.783333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB +N23,U Rohrdamm,URDM02B,Saturday,0.783333333333333,0.883333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,0.883333333333333,1.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB +N39,U Rohrdamm,URDM01B,Saturday,1.15,1.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB +N39,Mertensstr.,MTNS01B,Saturday,1.55,1.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB +N23,U Rohrdamm,URDM02B,Saturday,1.78333333333333,1.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,1.88333333333333,2.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB +N39,U Rohrdamm,URDM01B,Saturday,2.15,2.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB +N39,Mertensstr.,MTNS01B,Saturday,2.55,2.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB +N23,U Rohrdamm,URDM02B,Saturday,2.78333333333333,2.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,2.88333333333333,3.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB +N39,U Rohrdamm,URDM01B,Saturday,3.15,3.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB +N39,Mertensstr.,MTNS01B,Saturday,3.55,3.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB +N23,U Rohrdamm,URDM02B,Saturday,3.78333333333333,3.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,3.88333333333333,4.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB +N39,U Rohrdamm,URDM01B,Saturday,4.15,4.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB +N39,Mertensstr.,MTNS01B,Saturday,4.55,4.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB +N23,U Rohrdamm,URDM02B,Saturday,4.78333333333333,4.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB +N23,Mäckeritzwiesen,MAWI01B,Saturday,4.88333333333333,5.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB +N39,U Rohrdamm,URDM01B,Saturday,5.15,5.4,Saturday,Mertensstr.,MTNS01B,5937,0,4318180,CKB +N39,Mertensstr.,MTNS01B,Saturday,5.4,5.4,Saturday,Betriebshof A,BF A A,0.06,0,4318180,CKB +N35,Betriebshof A,BF A E,Saturday,0.95,0.95,Saturday,Alt-Kladow,ALKL02B,0.06,0,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,0.95,1.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,1.1,1.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,1.45,1.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,1.6,1.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,1.95,2.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,2.1,2.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,2.45,2.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,2.6,2.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,2.95,3.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,3.1,3.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,3.45,3.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,3.6,3.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,3.95,4.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,4.1,4.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,4.45,4.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,4.6,4.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,4.95,5.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,5.1,5.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,5.45,5.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,5.6,5.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,5.95,6.1,Saturday,Gutsstr.,GUTS01B,4343,20,4319355,CKB +N35,Gutsstr.,GUTS01B,Saturday,6.43333333333333,6.51666666666666,Saturday,Alt-Kladow,ALKL02B,2936,0,4319355,CKB +N35,Alt-Kladow,ALKL02B,Saturday,6.51666666666666,6.51666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4319355,CKB +N53,Betriebshof A,BF A E,Saturday,0.5,0.5,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,0.5,0.733333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,0.733333333333333,0.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,1.0,1.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,1.23333333333333,1.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,1.5,1.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,1.73333333333333,1.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,2.0,2.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,2.23333333333333,2.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,2.5,2.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,2.73333333333333,2.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,3.0,3.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,3.23333333333333,3.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,3.5,3.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,3.73333333333333,3.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,4.0,4.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,4.23333333333333,4.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,4.5,4.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,4.73333333333333,4.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,5.0,5.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB +N53,Wilhelmsruher Damm,WIDA02B,Saturday,5.23333333333333,5.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453548,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,5.45,5.45,Saturday,Betriebshof A,BF A A,0.06,0,4453548,CKB +N62,Betriebshof A,BF A E,Saturday,0.533333333333333,0.533333333333333,Saturday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747653,CKB +N62,Schloßplatz Köpenick,SLPZ02BN,Saturday,0.533333333333333,0.733333333333333,Saturday,Wendenschloß,WESC09BA,4212,3,4747653,CKB +N62,Wendenschloß,WESC09BA,Saturday,0.783333333333333,1.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,1.26666666666666,1.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB +N62,Wendenschloß,WESC09BA,Saturday,1.78333333333333,2.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,2.26666666666666,2.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB +N62,Wendenschloß,WESC09BA,Saturday,2.78333333333333,3.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,3.26666666666666,3.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB +N62,Wendenschloß,WESC09BA,Saturday,3.78333333333333,4.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,4.26666666666666,4.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB +N62,Wendenschloß,WESC09BA,Saturday,4.78333333333333,5.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,5.26666666666666,5.56666666666666,Saturday,Betriebshof Köpenick,BHKO01BN,9538,0,4747653,CKB +N62,Betriebshof Köpenick,BHKO01BN,Saturday,5.56666666666666,5.56666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4747653,CKB +N62,Betriebshof A,BF A E,Saturday,0.283333333333333,0.283333333333333,Saturday,Wendenschloß,WESC09BA,0.06,0,4747663,CKB +N62,Wendenschloß,WESC09BA,Saturday,0.283333333333333,0.766666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,0.766666666666666,1.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB +N62,Wendenschloß,WESC09BA,Saturday,1.28333333333333,1.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,1.76666666666666,2.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB +N62,Wendenschloß,WESC09BA,Saturday,2.28333333333333,2.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,2.76666666666666,3.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB +N62,Wendenschloß,WESC09BA,Saturday,3.28333333333333,3.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,3.76666666666666,4.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB +N62,Wendenschloß,WESC09BA,Saturday,4.28333333333333,4.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,4.76666666666666,5.2,Saturday,Wendenschloß,WESC09BA,12869,0,4747663,CKB +N62,Wendenschloß,WESC09BA,Saturday,5.2,5.2,Saturday,Betriebshof A,BF A A,0.06,0,4747663,CKB +N68,Betriebshof A,BF A E,Saturday,0.816666666666666,0.816666666666666,Saturday,S Adlershof,SAH02BN,0.06,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,0.816666666666666,1.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,1.06666666666666,1.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,1.31666666666666,1.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,1.56666666666666,1.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,1.81666666666666,2.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,2.06666666666666,2.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,2.31666666666666,2.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,2.56666666666666,2.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,2.81666666666666,3.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,3.06666666666666,3.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,3.31666666666666,3.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,3.56666666666666,3.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,3.81666666666666,4.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,4.06666666666666,4.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,4.31666666666666,4.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,4.56666666666666,4.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,4.81666666666666,5.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Saturday,5.06666666666666,5.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB +N68,S Adlershof,SAH02BN,Saturday,5.31666666666666,5.31666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4434344,CKB +N88,Betriebshof A,BF A E,Saturday,2.56666666666666,2.56666666666666,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4514364,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,2.56666666666666,3.0,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4514364,CKB +N88,S Lichterfelde Süd,SLIS01B,Saturday,3.0,3.45,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4514364,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,3.56666666666666,4.0,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4514364,CKB +N88,S Lichterfelde Süd,SLIS01B,Saturday,4.0,4.45,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4514364,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,4.56666666666666,5.0,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4514364,CKB +N88,S Lichterfelde Süd,SLIS01B,Saturday,5.0,5.45,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4514364,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,5.45,5.45,Saturday,Betriebshof A,BF A A,0.06,0,4514364,CKB +N88,Betriebshof A,BF A E,Saturday,2.06666666666666,2.06666666666666,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619999,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,2.06666666666666,2.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB +N88,S Lichterfelde Süd,SLIS01B,Saturday,2.5,2.95,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619999,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,3.06666666666666,3.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB +N88,S Lichterfelde Süd,SLIS01B,Saturday,3.5,3.95,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619999,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,4.06666666666666,4.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB +N88,S Lichterfelde Süd,SLIS01B,Saturday,4.5,4.95,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619999,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,5.06666666666666,5.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB +N88,S Lichterfelde Süd,SLIS01B,Saturday,5.5,5.5,Saturday,Betriebshof A,BF A A,0.06,0,4619999,CKB +N91,Betriebshof A,BF A E,Saturday,0.516666666666666,0.516666666666666,Saturday,S+U Wuhletal,SUWT02BN,0.06,0,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,0.516666666666666,0.733333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,0.733333333333333,0.933333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,1.01666666666666,1.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,1.23333333333333,1.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,1.51666666666666,1.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,1.73333333333333,1.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,2.01666666666666,2.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,2.23333333333333,2.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,2.51666666666666,2.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,2.73333333333333,2.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,3.01666666666666,3.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,3.23333333333333,3.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,3.51666666666666,3.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,3.73333333333333,3.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,4.01666666666666,4.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,4.23333333333333,4.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,4.51666666666666,4.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,4.73333333333333,4.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,5.01666666666666,5.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB +N91,Boschpoler Str.,BOPO01BN,Saturday,5.23333333333333,5.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,0,4374747,CKB +N91,S+U Wuhletal,SUWT02BN,Saturday,5.43333333333333,5.43333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4374747,CKB +N95,Betriebshof A,BF A E,Saturday,0.516666666666666,0.516666666666666,Saturday,S+U Wuhletal,SUWT02BN,0.06,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,0.516666666666666,0.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,0.783333333333333,1.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,1.01666666666666,1.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,1.28333333333333,1.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,1.51666666666666,1.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,1.78333333333333,2.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,2.01666666666666,2.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,2.28333333333333,2.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,2.51666666666666,2.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,2.78333333333333,3.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,3.01666666666666,3.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,3.28333333333333,3.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,3.51666666666666,3.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,3.78333333333333,4.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,4.01666666666666,4.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,4.28333333333333,4.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,4.51666666666666,4.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,4.78333333333333,5.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,5.01666666666666,5.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,5.28333333333333,5.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,5.51666666666666,5.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,5.78333333333333,6.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,6.01666666666666,6.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB +N95,Riesaer Str.,RIES01BN,Saturday,6.28333333333333,6.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB +N95,S+U Wuhletal,SUWT02BN,Saturday,6.51666666666666,6.75,Saturday,Riesaer Str.,RIES04B,5096,0,4374870,CKB +N95,Riesaer Str.,RIES04B,Saturday,6.75,6.75,Saturday,Betriebshof A,BF A A,0.06,0,4374870,CKB +N97,Betriebshof A,BF A E,Saturday,0.716666666666666,0.716666666666666,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,0.716666666666666,0.883333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,0.883333333333333,1.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,1.21666666666666,1.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,1.38333333333333,1.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,1.71666666666666,1.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,1.88333333333333,2.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,2.21666666666666,2.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,2.38333333333333,2.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,2.71666666666666,2.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,2.88333333333333,3.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,3.21666666666666,3.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,3.38333333333333,3.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,3.71666666666666,3.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,3.88333333333333,4.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,4.21666666666666,4.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,4.38333333333333,4.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,4.71666666666666,4.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,4.88333333333333,5.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,5.21666666666666,5.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB +N97,Barnimplatz,BARN01B,Saturday,5.38333333333333,5.38333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4375016,CKB +160,Betriebshof A,BF A E,Saturday,20.85,20.85,Saturday,Hasselwerderstr.,HAWR01B,0.06,0,4454966,CKB +160,Hasselwerderstr.,HAWR01B,Saturday,20.85,21.4,Saturday,Siriusstr.,SIRI01B,14519,4,4454966,CKB +160,Siriusstr.,SIRI01B,Saturday,21.4666666666666,22.05,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454966,CKB +160,Hasselwerderstr.,HAWR01B,Saturday,22.1833333333333,22.7333333333333,Saturday,Siriusstr.,SIRI01B,14519,4,4454966,CKB +160,Siriusstr.,SIRI01B,Saturday,22.8,23.3833333333333,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454966,CKB +160,Hasselwerderstr.,HAWR01B,Saturday,23.5166666666666,24.0666666666666,Sunday,Siriusstr.,SIRI01B,14519,4,4454966,CKB +160,Siriusstr.,SIRI01B,Sunday,0.133333333333333,0.65,Sunday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454966,CKB +N60,S Schöneweide/Sterndamm,SSWS06B,Sunday,0.65,0.783333333333333,Sunday,S Adlershof,SAH02BN,4.0,2,4454966,CKB +N60,S Adlershof,SAH02BN,Sunday,0.816666666666666,1.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,1.3,1.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB +N60,S Adlershof,SAH02BN,Sunday,1.81666666666666,2.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,2.3,2.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB +N60,S Adlershof,SAH02BN,Sunday,2.81666666666666,3.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,3.3,3.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB +N60,S Adlershof,SAH02BN,Sunday,3.81666666666666,4.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,4.3,4.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB +N60,S Adlershof,SAH02BN,Sunday,4.81666666666666,5.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,5.3,5.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB +N60,S Adlershof,SAH02BN,Sunday,5.81666666666666,6.13333333333333,Sunday,Flughafen Schönefeld,SXF01B,8762,10,4454966,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,6.3,6.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB +N60,S Adlershof,SAH02BN,Sunday,6.81666666666666,7.13333333333333,Sunday,Flughafen Schönefeld,SXF01B,8762,0,4454966,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,7.13333333333333,7.13333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4454966,CKB +160,Betriebshof A,BF A E,Saturday,21.5166666666666,21.5166666666666,Saturday,Hasselwerderstr.,HAWR01B,0.06,0,4454967,CKB +160,Hasselwerderstr.,HAWR01B,Saturday,21.5166666666666,22.0666666666666,Saturday,Siriusstr.,SIRI01B,14519,4,4454967,CKB +160,Siriusstr.,SIRI01B,Saturday,22.1333333333333,22.7166666666666,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454967,CKB +160,Hasselwerderstr.,HAWR01B,Saturday,22.85,23.4,Saturday,Siriusstr.,SIRI01B,14519,4,4454967,CKB +160,Siriusstr.,SIRI01B,Saturday,23.4666666666666,24.05,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454967,CKB +160,Hasselwerderstr.,HAWR01B,Sunday,0.183333333333333,0.733333333333333,Sunday,Siriusstr.,SIRI01B,14519,0,4454967,CKB +N60,Siriusstr.,SIRI01B,Sunday,0.733333333333333,0.9,Sunday,S Adlershof,SAH02BN,4.1,25,4454967,CKB +N60,S Adlershof,SAH02BN,Sunday,1.31666666666666,1.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,1.8,2.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB +N60,S Adlershof,SAH02BN,Sunday,2.31666666666666,2.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,2.8,3.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB +N60,S Adlershof,SAH02BN,Sunday,3.31666666666666,3.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,3.8,4.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB +N60,S Adlershof,SAH02BN,Sunday,4.31666666666666,4.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,4.8,5.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB +N60,S Adlershof,SAH02BN,Sunday,5.31666666666666,5.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB +N60,Flughafen Schönefeld,SXF01B,Sunday,5.8,6.1,Sunday,S Adlershof,SAH02BN,9067,0,4454967,CKB +N60,S Adlershof,SAH02BN,Sunday,6.1,6.1,Sunday,Betriebshof A,BF A A,0.06,0,4454967,CKB +161,Betriebshof A,BF A E,Saturday,21.1,21.1,Saturday,S Erkner/ZOB,SERZ01B,0.06,0,4664765,CKB +161,S Erkner/ZOB,SERZ01B,Saturday,21.1,21.5666666666666,Saturday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664765,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,21.8833333333333,22.2166666666666,Saturday,Lutherstr.,LUTH01B,10332,17,4664765,CKB +161,Lutherstr.,LUTH01B,Saturday,22.5,22.9,Saturday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664765,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,23.2166666666666,23.55,Saturday,Lutherstr.,LUTH01B,10332,17,4664765,CKB +161,Lutherstr.,LUTH01B,Saturday,23.8333333333333,24.2333333333333,Sunday,"Schöneiche, Lübecker Str.",SELS01B,10.48,8,4664765,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,0.366666666666666,0.45,Sunday,S Rahnsdorf,SRD01B,2533,2,4664765,CKB +N61,S Rahnsdorf,SRD01B,Sunday,0.483333333333333,0.783333333333333,Sunday,Dämeritzstr.,DARI01B,7.58,0,4664765,CKB +N61,Dämeritzstr.,DARI01B,Sunday,0.783333333333333,1.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,1.28333333333333,1.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB +N61,Dämeritzstr.,DARI01B,Sunday,1.78333333333333,2.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,2.28333333333333,2.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB +N61,Dämeritzstr.,DARI01B,Sunday,2.78333333333333,3.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,3.28333333333333,3.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB +N61,Dämeritzstr.,DARI01B,Sunday,3.78333333333333,4.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,4.28333333333333,4.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB +N61,Dämeritzstr.,DARI01B,Sunday,4.78333333333333,5.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,5.28333333333333,5.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB +N61,Dämeritzstr.,DARI01B,Sunday,5.78333333333333,6.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,6.28333333333333,6.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB +N61,Dämeritzstr.,DARI01B,Sunday,6.78333333333333,6.98333333333333,Sunday,S Rahnsdorf,SRD01B,5474,0,4664765,CKB +N61,S Rahnsdorf,SRD01B,Sunday,6.98333333333333,6.98333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4664765,CKB +161,Betriebshof A,BF A E,Saturday,20.4333333333333,20.4333333333333,Saturday,S Erkner/ZOB,SERZ01B,0.06,0,4762771,CKB +161,S Erkner/ZOB,SERZ01B,Saturday,20.4333333333333,20.9333333333333,Saturday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762771,CKB +161,"Schöneiche, Goethepark",SEGP01BA,Saturday,21.1666666666666,21.6333333333333,Saturday,S Erkner/ZOB,SERZ01B,13.19,8,4762771,CKB +161,S Erkner/ZOB,SERZ01B,Saturday,21.7666666666666,22.2333333333333,Saturday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762771,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,22.55,22.8833333333333,Saturday,Lutherstr.,LUTH01B,10332,17,4762771,CKB +161,Lutherstr.,LUTH01B,Saturday,23.1666666666666,23.5666666666666,Saturday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762771,CKB +161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,23.8833333333333,24.2166666666666,Sunday,Lutherstr.,LUTH01B,10332,2,4762771,CKB +161,Lutherstr.,LUTH01B,Sunday,0.25,0.266666666666666,Sunday,Dämeritzstr.,DARI01B,506,1,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,0.283333333333333,0.733333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,0.783333333333333,1.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,1.28333333333333,1.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,1.78333333333333,2.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,2.28333333333333,2.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,2.78333333333333,3.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,3.28333333333333,3.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,3.78333333333333,4.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,4.28333333333333,4.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,4.78333333333333,5.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,5.28333333333333,5.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,5.78333333333333,6.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,6.28333333333333,6.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB +N61,S Friedrichshagen,SFHG05BN,Sunday,6.78333333333333,7.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB +N61,Dämeritzstr.,DARI01B,Sunday,7.28333333333333,7.28333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4762771,CKB +163,Betriebshof A,BF A E,Saturday,20.4333333333333,20.4333333333333,Saturday,S Grünau,SGA24BA,0.06,0,4617438,CKB +163,S Grünau,SGA24BA,Saturday,20.4333333333333,20.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,20.6833333333333,20.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB +163,S Grünau,SGA22BA,Saturday,20.9166666666666,21.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,21.1833333333333,21.4166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB +163,S Grünau,SGA22BA,Saturday,21.4166666666666,21.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,21.6833333333333,21.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB +163,S Grünau,SGA22BA,Saturday,21.9166666666666,22.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,22.1833333333333,22.4166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB +163,S Grünau,SGA22BA,Saturday,22.4166666666666,22.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,22.6833333333333,22.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB +163,S Grünau,SGA22BA,Saturday,22.9166666666666,23.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,23.1833333333333,23.4166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB +163,S Grünau,SGA22BA,Saturday,23.4166666666666,23.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,23.6833333333333,23.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB +163,S Grünau,SGA22BA,Saturday,23.9166666666666,24.1333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617438,CKB +163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,0.133333333333333,0.133333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4617438,CKB +168,Betriebshof A,BF A E,Saturday,5.41666666666666,5.41666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,5.41666666666666,5.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,5.56666666666666,5.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,6.08333333333333,6.23333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,6.23333333333333,6.38333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,6.41666666666666,6.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,6.56666666666666,6.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,6.75,6.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,6.9,7.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,7.08333333333333,7.23333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,7.23333333333333,7.38333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,7.41666666666666,7.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,7.56666666666666,7.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,8.08333333333333,8.23333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,8.23333333333333,8.38333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,8.41666666666666,8.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,8.56666666666666,8.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,8.75,8.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,8.9,9.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,3,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,9.1,9.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,9.25,9.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,9.43333333333333,9.58333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,9.58333333333333,9.73333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,10.1,10.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,10.25,10.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,10.4333333333333,10.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,10.5833333333333,10.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,10.7666666666666,10.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,10.9166666666666,11.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,11.1,11.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,11.25,11.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,11.4333333333333,11.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,11.5833333333333,11.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,12.1,12.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,12.25,12.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,12.4333333333333,12.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,12.5833333333333,12.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,12.7666666666666,12.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,12.9166666666666,13.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,13.1,13.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,13.25,13.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,13.4333333333333,13.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,13.5833333333333,13.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,14.1,14.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,14.25,14.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,14.4333333333333,14.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,14.5833333333333,14.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,14.7666666666666,14.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,14.9166666666666,15.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,15.1,15.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,15.25,15.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,15.4333333333333,15.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,15.5833333333333,15.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,16.1,16.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,16.25,16.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,16.4333333333333,16.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,16.5833333333333,16.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,16.7666666666666,16.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,16.9166666666666,17.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,17.1,17.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,17.25,17.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,17.4333333333333,17.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,17.5833333333333,17.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,18.1,18.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,18.25,18.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,18.4333333333333,18.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,18.5833333333333,18.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,18.7666666666666,18.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,18.9166666666666,19.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,19.1,19.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,19.25,19.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,19.4333333333333,19.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,19.5833333333333,19.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,21,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,20.0833333333333,20.2333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,20.2333333333333,20.3833333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,20.4166666666666,20.5666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,20.5666666666666,20.7166666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,20.75,20.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,20.9,21.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,21.0833333333333,21.2333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,21.2333333333333,21.3833333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,21.4166666666666,21.5666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,21.5666666666666,21.7166666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,22.0833333333333,22.2333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,22.2333333333333,22.3833333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,22.4166666666666,22.5666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,22.5666666666666,22.7166666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,22.75,22.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB +168,Moßkopfring,MKFR01B,Saturday,22.9,23.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,0,4426894,CKB +168,Alt-Schmöckwitz,ALSW02B,Saturday,23.05,23.05,Saturday,Betriebshof A,BF A A,0.06,0,4426894,CKB +294,Betriebshof A,BF A E,Saturday,7.5,7.5,Saturday,Seehausener Str.,SEEH01B,0.06,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,7.5,7.58333333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,7.65,7.83333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,7.83333333333333,7.91666666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,7.98333333333333,8.16666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,8.16666666666666,8.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,8.31666666666666,8.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,8.5,8.58333333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,8.65,8.83333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,8.83333333333333,8.91666666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,8.98333333333333,9.16666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,9.16666666666666,9.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,9.31666666666666,9.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,9.5,9.58333333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,9.65,9.83333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,9.83333333333333,9.91666666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,9.98333333333333,10.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,10.1666666666666,10.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,10.3166666666666,10.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,10.5,10.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,10.65,10.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,10.8333333333333,10.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,10.9833333333333,11.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,11.1666666666666,11.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,11.3166666666666,11.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,11.5,11.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,11.65,11.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,11.8333333333333,11.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,11.9833333333333,12.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,12.1666666666666,12.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,12.3166666666666,12.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,12.5,12.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,12.65,12.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,12.8333333333333,12.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,12.9833333333333,13.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,13.1666666666666,13.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,13.3166666666666,13.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,13.5,13.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,13.65,13.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,13.8333333333333,13.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,13.9833333333333,14.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,14.1666666666666,14.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,14.3166666666666,14.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,14.5,14.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,14.65,14.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,14.8333333333333,14.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,14.9833333333333,15.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,15.1666666666666,15.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,15.3166666666666,15.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,15.5,15.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,15.65,15.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,15.8333333333333,15.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,15.9833333333333,16.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,16.1666666666666,16.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,16.3166666666666,16.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,16.5,16.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,16.65,16.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,16.8333333333333,16.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,16.9833333333333,17.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,17.1666666666666,17.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,17.3166666666666,17.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,17.5,17.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,17.65,17.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,17.8333333333333,17.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,17.9833333333333,18.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,18.1666666666666,18.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,18.3166666666666,18.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,18.5,18.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,18.65,18.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB +294,Seehausener Str.,SEEH01B,Saturday,18.8333333333333,18.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB +294,Gehrenseestr.,GEHR05B,Saturday,18.9833333333333,19.1666666666666,Saturday,Seehausener Str.,SEEH02B,4288,0,4369705,CKB +294,Seehausener Str.,SEEH02B,Saturday,19.1666666666666,19.1666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4369705,CKB +326,Betriebshof Indira-Gandhi-Str.,BF I E,Saturday,8.13333333333333,8.68333333333333,Saturday,S Hermsdorf,SHDF01B,17.9,0,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,8.68333333333333,8.9,Saturday,S Hermsdorf,SHDF01B,4637,9,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,9.05,9.28333333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,9.35,9.58333333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,9.71666666666666,9.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,10.0166666666666,10.25,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,10.3833333333333,10.6166666666666,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,10.6833333333333,10.9166666666666,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,11.05,11.2833333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,11.35,11.5833333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,11.7166666666666,11.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,12.0166666666666,12.25,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,12.3833333333333,12.6166666666666,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,12.6833333333333,12.9166666666666,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,13.05,13.2833333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,13.35,13.5833333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,13.7166666666666,13.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,14.0166666666666,14.25,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,14.3833333333333,14.6166666666666,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,14.6833333333333,14.9166666666666,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,15.05,15.2833333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,15.35,15.5833333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,15.7166666666666,15.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,16.0166666666666,16.2333333333333,Saturday,S Hermsdorf,SHDF01B,4637,0,4317640,VDL +326,S Hermsdorf,SHDF01B,Saturday,16.2333333333333,16.95,Saturday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317640,VDL +369,Betriebshof A,BF A E,Saturday,7.3,7.3,Saturday,Müggelheim/Dorf,MHDO01B,0.06,0,4706426,CKB +369,Müggelheim/Dorf,MHDO01B,Saturday,7.3,7.43333333333333,Saturday,"Gosen, Eiche",GOSE01B,5562,10,4706426,CKB +369,"Gosen, Eiche",GOSE01B,Saturday,7.6,7.75,Saturday,Alt-Müggelheim,ALMG01B,5941,32,4706426,CKB +369,Alt-Müggelheim,ALMG01B,Saturday,8.28333333333333,8.43333333333333,Saturday,"Gosen, Eiche",GOSE01B,5994,8,4706426,CKB +369,"Gosen, Eiche",GOSE01B,Saturday,8.56666666666666,8.7,Saturday,Müggelheim/Dorf,MHDO02B,5566,0,4706426,CKB +369,Müggelheim/Dorf,MHDO02B,Saturday,8.7,8.7,Saturday,Betriebshof A,BF A A,0.06,0,4706426,CKB +370,Betriebshof A,BF A E,Saturday,8.16666666666666,8.16666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,0.06,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,8.16666666666666,8.26666666666666,Saturday,S+U Hermannstr.,SUHM09B,2169,12,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,8.46666666666666,8.63333333333333,Saturday,Neuköllnische Brücke,NKBR04BA,2952,2,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,8.66666666666666,8.76666666666666,Saturday,S+U Hermannstr.,SUHM09B,2169,12,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,8.96666666666666,9.16666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,9.16666666666666,9.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,9.46666666666666,9.66666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,9.66666666666666,9.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,9.96666666666666,10.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,10.1666666666666,10.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,10.4666666666666,10.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,10.6666666666666,10.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,10.9666666666666,11.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,11.1666666666666,11.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,11.4666666666666,11.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,11.6666666666666,11.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,11.9666666666666,12.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,12.1666666666666,12.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,12.4666666666666,12.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,12.6666666666666,12.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,12.9666666666666,13.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,13.1666666666666,13.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,13.4666666666666,13.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,13.6666666666666,13.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,13.9666666666666,14.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,14.1666666666666,14.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,14.4666666666666,14.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,14.6666666666666,14.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,14.9666666666666,15.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,15.1666666666666,15.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,15.4666666666666,15.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,15.6666666666666,15.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,15.9666666666666,16.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,16.1666666666666,16.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,16.4666666666666,16.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,16.6666666666666,16.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,16.9666666666666,17.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,17.1666666666666,17.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,17.4666666666666,17.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,17.6666666666666,17.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,17.9666666666666,18.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,18.1666666666666,18.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,18.4666666666666,18.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB +370,Neuköllnische Brücke,NKBR04BA,Saturday,18.6666666666666,18.8,Saturday,S+U Hermannstr.,SUHM09B,2169,0,4731254,CKB +370,S+U Hermannstr.,SUHM09B,Saturday,18.8,18.8,Saturday,Betriebshof A,BF A A,0.06,0,4731254,CKB +N23,Betriebshof A,BF A E,Sunday,0.383333333333333,0.383333333333333,Sunday,Mäckeritzwiesen,MAWI01B,0.06,0,4317771,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,0.383333333333333,0.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB +N39,U Rohrdamm,URDM01B,Sunday,0.65,0.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB +N39,Mertensstr.,MTNS01B,Sunday,1.05,1.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB +N23,U Rohrdamm,URDM02B,Sunday,1.28333333333333,1.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,1.38333333333333,1.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB +N39,U Rohrdamm,URDM01B,Sunday,1.65,1.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB +N39,Mertensstr.,MTNS01B,Sunday,2.05,2.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB +N23,U Rohrdamm,URDM02B,Sunday,2.28333333333333,2.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,2.38333333333333,2.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB +N39,U Rohrdamm,URDM01B,Sunday,2.65,2.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB +N39,Mertensstr.,MTNS01B,Sunday,3.05,3.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB +N23,U Rohrdamm,URDM02B,Sunday,3.28333333333333,3.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,3.38333333333333,3.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB +N39,U Rohrdamm,URDM01B,Sunday,3.65,3.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB +N39,Mertensstr.,MTNS01B,Sunday,4.05,4.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB +N23,U Rohrdamm,URDM02B,Sunday,4.28333333333333,4.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,4.38333333333333,4.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB +N39,U Rohrdamm,URDM01B,Sunday,4.65,4.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB +N39,Mertensstr.,MTNS01B,Sunday,5.05,5.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB +N23,U Rohrdamm,URDM02B,Sunday,5.28333333333333,5.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,5.38333333333333,5.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB +N39,U Rohrdamm,URDM01B,Sunday,5.65,5.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB +N39,Mertensstr.,MTNS01B,Sunday,6.05,6.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB +N23,U Rohrdamm,URDM02B,Sunday,6.28333333333333,6.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,6.38333333333333,6.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB +N39,U Rohrdamm,URDM01B,Sunday,6.65,6.9,Sunday,Mertensstr.,MTNS01B,5937,0,4317771,CKB +N39,Mertensstr.,MTNS01B,Sunday,6.9,6.9,Sunday,Betriebshof A,BF A A,0.06,0,4317771,CKB +N39,Betriebshof A,BF A E,Sunday,0.55,0.55,Sunday,Mertensstr.,MTNS01B,0.06,0,4317937,CKB +N39,Mertensstr.,MTNS01B,Sunday,0.55,0.783333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB +N23,U Rohrdamm,URDM02B,Sunday,0.783333333333333,0.883333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,0.883333333333333,1.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB +N39,U Rohrdamm,URDM01B,Sunday,1.15,1.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB +N39,Mertensstr.,MTNS01B,Sunday,1.55,1.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB +N23,U Rohrdamm,URDM02B,Sunday,1.78333333333333,1.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,1.88333333333333,2.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB +N39,U Rohrdamm,URDM01B,Sunday,2.15,2.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB +N39,Mertensstr.,MTNS01B,Sunday,2.55,2.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB +N23,U Rohrdamm,URDM02B,Sunday,2.78333333333333,2.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,2.88333333333333,3.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB +N39,U Rohrdamm,URDM01B,Sunday,3.15,3.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB +N39,Mertensstr.,MTNS01B,Sunday,3.55,3.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB +N23,U Rohrdamm,URDM02B,Sunday,3.78333333333333,3.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,3.88333333333333,4.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB +N39,U Rohrdamm,URDM01B,Sunday,4.15,4.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB +N39,Mertensstr.,MTNS01B,Sunday,4.55,4.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB +N23,U Rohrdamm,URDM02B,Sunday,4.78333333333333,4.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,4.88333333333333,5.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB +N39,U Rohrdamm,URDM01B,Sunday,5.15,5.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB +N39,Mertensstr.,MTNS01B,Sunday,5.55,5.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB +N23,U Rohrdamm,URDM02B,Sunday,5.78333333333333,5.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB +N23,Mäckeritzwiesen,MAWI01B,Sunday,5.88333333333333,6.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB +N39,U Rohrdamm,URDM01B,Sunday,6.15,6.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB +N39,Mertensstr.,MTNS01B,Sunday,6.55,6.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB +N39,U Rohrdamm,URDM02B,Sunday,6.78333333333333,6.78333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4317937,CKB +N35,Betriebshof A,BF A E,Sunday,0.95,0.95,Sunday,Alt-Kladow,ALKL02B,0.06,0,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,0.95,1.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,1.1,1.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,1.45,1.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,1.6,1.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,1.95,2.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,2.1,2.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,2.45,2.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,2.6,2.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,2.95,3.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,3.1,3.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,3.45,3.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,3.6,3.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,3.95,4.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,4.1,4.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,4.45,4.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,4.6,4.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,4.95,5.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,5.1,5.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,5.45,5.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,5.6,5.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,5.95,6.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,6.1,6.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,6.45,6.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB +N35,Gutsstr.,GUTS01B,Sunday,6.6,6.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,0,4319402,CKB +N35,Alt-Kladow,ALKL02B,Sunday,6.68333333333333,6.68333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4319402,CKB +N53,Betriebshof A,BF A E,Sunday,0.5,0.5,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,0.5,0.733333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,0.733333333333333,0.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,1.0,1.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,1.23333333333333,1.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,1.5,1.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,1.73333333333333,1.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,2.0,2.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,2.23333333333333,2.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,2.5,2.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,2.73333333333333,2.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,3.0,3.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,3.23333333333333,3.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,3.5,3.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,3.73333333333333,3.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,4.0,4.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,4.23333333333333,4.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,4.5,4.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,4.73333333333333,4.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,5.0,5.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,5.23333333333333,5.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,5.5,5.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4.8,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,5.73333333333333,5.93333333333333,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5301,4,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,6.0,6.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4.8,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,6.23333333333333,6.43333333333333,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5301,4,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,6.5,6.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4.8,0,4453948,CKB +N53,Wilhelmsruher Damm,WIDA02B,Sunday,6.73333333333333,6.93333333333333,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5301,0,4453948,CKB +N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,6.93333333333333,6.93333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4453948,CKB +N62,Betriebshof A,BF A E,Sunday,0.533333333333333,0.533333333333333,Sunday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747669,CKB +N62,Schloßplatz Köpenick,SLPZ02BN,Sunday,0.533333333333333,0.733333333333333,Sunday,Wendenschloß,WESC09BA,4212,3,4747669,CKB +N62,Wendenschloß,WESC09BA,Sunday,0.783333333333333,1.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,1.26666666666666,1.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB +N62,Wendenschloß,WESC09BA,Sunday,1.78333333333333,2.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,2.26666666666666,2.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB +N62,Wendenschloß,WESC09BA,Sunday,2.78333333333333,3.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,3.26666666666666,3.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB +N62,Wendenschloß,WESC09BA,Sunday,3.78333333333333,4.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,4.26666666666666,4.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB +N62,Wendenschloß,WESC09BA,Sunday,4.78333333333333,5.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,5.26666666666666,5.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB +N62,Wendenschloß,WESC09BA,Sunday,5.78333333333333,6.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,6.26666666666666,6.7,Sunday,Wendenschloß,WESC09BA,12869,0,4747669,CKB +N62,Wendenschloß,WESC09BA,Sunday,6.7,6.7,Sunday,Betriebshof A,BF A A,0.06,0,4747669,CKB +N62,Betriebshof A,BF A E,Sunday,0.283333333333333,0.283333333333333,Sunday,Wendenschloß,WESC09BA,0.06,0,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,0.283333333333333,0.766666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,0.766666666666666,1.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,1.28333333333333,1.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,1.76666666666666,2.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,2.28333333333333,2.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,2.76666666666666,3.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,3.28333333333333,3.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,3.76666666666666,4.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,4.28333333333333,4.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,4.76666666666666,5.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,5.28333333333333,5.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,5.76666666666666,6.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,6.28333333333333,6.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB +N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,6.76666666666666,7.2,Sunday,Wendenschloß,WESC09BA,12869,0,4747671,CKB +N62,Wendenschloß,WESC09BA,Sunday,7.2,7.2,Sunday,Betriebshof A,BF A A,0.06,0,4747671,CKB +N68,Betriebshof A,BF A E,Sunday,0.816666666666666,0.816666666666666,Sunday,S Adlershof,SAH02BN,0.06,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,0.816666666666666,1.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,1.06666666666666,1.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,1.31666666666666,1.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,1.56666666666666,1.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,1.81666666666666,2.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,2.06666666666666,2.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,2.31666666666666,2.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,2.56666666666666,2.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,2.81666666666666,3.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,3.06666666666666,3.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,3.31666666666666,3.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,3.56666666666666,3.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,3.81666666666666,4.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,4.06666666666666,4.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,4.31666666666666,4.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,4.56666666666666,4.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,4.81666666666666,5.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,5.06666666666666,5.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,5.31666666666666,5.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,5.56666666666666,5.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,5.81666666666666,6.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,6.06666666666666,6.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,6.31666666666666,6.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB +N68,Alt-Schmöckwitz,ALSW11BN,Sunday,6.56666666666666,6.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB +N68,S Adlershof,SAH02BN,Sunday,6.81666666666666,6.81666666666666,Sunday,Betriebshof A,BF A A,0.06,0,4434314,CKB +N88,Betriebshof A,BF A E,Sunday,2.56666666666666,2.56666666666666,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4524178,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,2.56666666666666,3.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,3.0,3.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,3.56666666666666,4.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,4.0,4.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,4.56666666666666,5.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,5.0,5.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,5.56666666666666,6.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,6.0,6.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,6.56666666666666,7.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,7.0,7.0,Sunday,Betriebshof A,BF A A,0.06,0,4524178,CKB +N88,Betriebshof A,BF A E,Sunday,2.06666666666666,2.06666666666666,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619808,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,2.06666666666666,2.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,2.5,2.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,3.06666666666666,3.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,3.5,3.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,4.06666666666666,4.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,4.5,4.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,5.06666666666666,5.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,5.5,5.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,6.06666666666666,6.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB +N88,S Lichterfelde Süd,SLIS01B,Sunday,6.5,6.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619808,CKB +N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,6.95,6.95,Sunday,Betriebshof A,BF A A,0.06,0,4619808,CKB +N91,Betriebshof A,BF A E,Sunday,0.516666666666666,0.516666666666666,Sunday,S+U Wuhletal,SUWT02BN,0.06,0,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,0.516666666666666,0.733333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,0.733333333333333,0.933333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,1.01666666666666,1.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,1.23333333333333,1.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,1.51666666666666,1.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,1.73333333333333,1.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,2.01666666666666,2.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,2.23333333333333,2.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,2.51666666666666,2.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,2.73333333333333,2.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,3.01666666666666,3.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,3.23333333333333,3.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,3.51666666666666,3.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,3.73333333333333,3.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,4.01666666666666,4.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,4.23333333333333,4.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,4.51666666666666,4.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,4.73333333333333,4.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,5.01666666666666,5.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,5.23333333333333,5.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,5.51666666666666,5.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,5.73333333333333,5.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,6.01666666666666,6.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,6.23333333333333,6.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,6.51666666666666,6.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB +N91,Boschpoler Str.,BOPO01BN,Sunday,6.73333333333333,6.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,0,4374748,CKB +N91,S+U Wuhletal,SUWT02BN,Sunday,6.93333333333333,6.93333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4374748,CKB +N95,Betriebshof A,BF A E,Sunday,0.516666666666666,0.516666666666666,Sunday,S+U Wuhletal,SUWT02BN,0.06,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,0.516666666666666,0.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,0.783333333333333,1.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,1.01666666666666,1.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,1.28333333333333,1.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,1.51666666666666,1.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,1.78333333333333,2.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,2.01666666666666,2.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,2.28333333333333,2.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,2.51666666666666,2.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,2.78333333333333,3.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,3.01666666666666,3.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,3.28333333333333,3.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,3.51666666666666,3.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,3.78333333333333,4.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,4.01666666666666,4.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,4.28333333333333,4.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,4.51666666666666,4.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,4.78333333333333,5.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,5.01666666666666,5.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,5.28333333333333,5.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,5.51666666666666,5.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,5.78333333333333,6.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,6.01666666666666,6.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB +N95,Riesaer Str.,RIES01BN,Sunday,6.28333333333333,6.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB +N95,S+U Wuhletal,SUWT02BN,Sunday,6.51666666666666,6.75,Sunday,Riesaer Str.,RIES04B,5096,0,4374871,CKB +N95,Riesaer Str.,RIES04B,Sunday,6.75,6.75,Sunday,Betriebshof A,BF A A,0.06,0,4374871,CKB +N97,Betriebshof A,BF A E,Sunday,0.716666666666666,0.716666666666666,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,0.716666666666666,0.883333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,0.883333333333333,1.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,1.21666666666666,1.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,1.38333333333333,1.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,1.71666666666666,1.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,1.88333333333333,2.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,2.21666666666666,2.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,2.38333333333333,2.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,2.71666666666666,2.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,2.88333333333333,3.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,3.21666666666666,3.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,3.38333333333333,3.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,3.71666666666666,3.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,3.88333333333333,4.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,4.21666666666666,4.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,4.38333333333333,4.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,4.71666666666666,4.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,4.88333333333333,5.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,5.21666666666666,5.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,5.38333333333333,5.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,5.71666666666666,5.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,5.88333333333333,6.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,6.21666666666666,6.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,6.38333333333333,6.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,6.71666666666666,6.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB +N97,Barnimplatz,BARN01B,Sunday,6.88333333333333,7.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375017,CKB +N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,7.05,7.05,Sunday,Betriebshof A,BF A A,0.06,0,4375017,CKB diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py new file mode 100644 index 00000000..b68f6e4b --- /dev/null +++ b/ebus_toolbox/__main__.py @@ -0,0 +1,4 @@ +import simulate + +if __name__ == '__main__': + simulate.simulate() diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 41d68cbd..ba5ba6ba 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -8,7 +8,6 @@ class Schedule: def __init__(self) -> None: """Constructs Schedule object from CSV file containing all trips of schedule""" self.rotations = {} - self.consumption = 0 @classmethod diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 7397959c..fc9a5ecd 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -11,7 +11,7 @@ def simulate(args=None): :type args: argparse.Namespace """ - schedule = Schedule.from_csv("path_to_file.csv") + schedule = Schedule.from_csv("./data/private_examples/trips_example-bvg.csv") # filter trips according to args schedule.filter_rotations(args.filters) @@ -36,6 +36,6 @@ def simulate(args=None): report.generate() -if __name__ == 'main': +if __name__ == '__main__': # parse args from cmd or file simulate() From fd9d293432832c3ced996fea968420fdd67a0228 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 23 Feb 2022 13:56:50 +0100 Subject: [PATCH 034/802] change import structure --- data/{examples => configs}/ebus_toolbox.cfg | 0 ebus_toolbox/__main__.py | 2 +- ebus_toolbox/rotation.py | 2 +- ebus_toolbox/schedule.py | 3 +-- ebus_toolbox/simulate.py | 5 ++-- ebus_toolbox/test.py | 5 ++++ ebus_toolbox/trip.py | 2 +- tests/test_example.py | 26 --------------------- tests/test_schedule.py | 14 +++++++++++ 9 files changed, 25 insertions(+), 34 deletions(-) rename data/{examples => configs}/ebus_toolbox.cfg (100%) create mode 100644 ebus_toolbox/test.py delete mode 100644 tests/test_example.py create mode 100644 tests/test_schedule.py diff --git a/data/examples/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg similarity index 100% rename from data/examples/ebus_toolbox.cfg rename to data/configs/ebus_toolbox.cfg diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index b68f6e4b..74f5751e 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,4 +1,4 @@ -import simulate +from ebus_toolbox import simulate if __name__ == '__main__': simulate.simulate() diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 1f2d83d4..cf9b2c60 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -1,4 +1,4 @@ -from trip import Trip +from ebus_toolbox.trip import Trip class Rotation: diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ba5ba6ba..bef779e9 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,6 +1,5 @@ import csv - -from rotation import Rotation +from ebus_toolbox.rotation import Rotation class Schedule: diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index fc9a5ecd..83fe4706 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,7 +1,6 @@ # imports -from schedule import Schedule -import optimizer -import report +from ebus_toolbox import optimizer, report +from ebus_toolbox.schedule import Schedule def simulate(args=None): diff --git a/ebus_toolbox/test.py b/ebus_toolbox/test.py new file mode 100644 index 00000000..9d64dd39 --- /dev/null +++ b/ebus_toolbox/test.py @@ -0,0 +1,5 @@ +from schedule import Schedule + +schedule = Schedule.from_csv("./data/private_examples/trips_example-bvg.csv") +schedule.calculate_consumption() +print("done") diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 9c09af02..5f22e077 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -1,7 +1,7 @@ import datetime import random -from consumption import Consumption +from ebus_toolbox.consumption import Consumption class Trip: diff --git a/tests/test_example.py b/tests/test_example.py deleted file mode 100644 index 7b3b2e9f..00000000 --- a/tests/test_example.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` -pytest will look for all files starting with "test_" and run all functions -within this file. For basic example of tests you can look at our workshop -https://github.com/rl-institut/workshop/tree/master/test-driven-development. -Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html -are also good support. -""" -import pytest - - -# this function will not run as a test as its name does not start by "test_" -def addition(a, b): - return a + b - - -# each test is described in a function, the function must start with "test_" -# something has to be asserted within the function -def test_addition(): - assert addition(2, 2) == 4 - - -# one can test that exception are raised -def test_addition_wrong_argument_number(): - with pytest.raises(TypeError): - assert addition(2) == 2 # pylint: disable=E1120 diff --git a/tests/test_schedule.py b/tests/test_schedule.py new file mode 100644 index 00000000..3709548e --- /dev/null +++ b/tests/test_schedule.py @@ -0,0 +1,14 @@ +""" +run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` +pytest will look for all files starting with "test_" and run all functions +within this file. For basic example of tests you can look at our workshop +https://github.com/rl-institut/workshop/tree/master/test-driven-development. +Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html +are also good support. +""" +from ebus_toolbox import schedule + + +def test_schedule_from_csv(): + s = schedule.Schedule.from_csv('./data/private_examples/trips_example-bvg.csv') + assert len(s.rotations) > 5 From f9f267e3a321bc319d4907fb50728abe16494d5c Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 23 Feb 2022 14:32:58 +0100 Subject: [PATCH 035/802] add numpy as requirement --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index e69de29b..24ce15ab 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1 @@ +numpy From b4408f7ac95d4b5a024b4cd633bfd6bf41fe061a Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 23 Feb 2022 15:19:12 +0100 Subject: [PATCH 036/802] added config file support --- data/configs/ebus_toolbox.cfg | 1 + ebus_toolbox/__main__.py | 20 ++++++++++++++-- ebus_toolbox/optimizer.py | 2 +- ebus_toolbox/simulate.py | 14 ++++------- ebus_toolbox/util.py | 45 +++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 ebus_toolbox/util.py diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index e69de29b..e37f3de0 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -0,0 +1 @@ +input = "./data/private_examples/trips_example-bvg.csv" \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 74f5751e..b400bb07 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,4 +1,20 @@ -from ebus_toolbox import simulate +import argparse +from ebus_toolbox import simulate, util if __name__ == '__main__': - simulate.simulate() + parser = argparse.ArgumentParser( + description='Ebus Toolbox - \ + Simulation Program for Ebus Fleets.') + parser.add_argument('input', nargs='?', help='Set the scenario JSON file') + parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') + parser.add_argument('--eta', action='store_true', + help='Show estimated time to finish simulation after each step, \ + instead of progress bar. Not recommended for fast computations.') + parser.add_argument('--save-timeseries', help='Write timesteps to file') + parser.add_argument('--save-results', help='Write general info to file') + parser.add_argument('--config', help='Use config file to set arguments') + args = parser.parse_args() + + util.set_options_from_config(args, check=True, verbose=False) + + simulate.simulate(args) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 9c9c9e3e..7b710c44 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -4,4 +4,4 @@ def no_optimization(): - return True + return "converged" diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 83fe4706..616418f8 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -10,9 +10,9 @@ def simulate(args=None): :type args: argparse.Namespace """ - schedule = Schedule.from_csv("./data/private_examples/trips_example-bvg.csv") + schedule = Schedule.from_csv(args.input) # filter trips according to args - schedule.filter_rotations(args.filters) + schedule.filter_rotations() # initialize optimizer @@ -21,7 +21,7 @@ def simulate(args=None): # if optimizer None, quit after single iteration schedule.add_charging_types() - schedule.calculate_consumption(args.consumption_func) + schedule.calculate_consumption() schedule.assign_vehicles() # write trips to csv in spiceEV format @@ -29,12 +29,8 @@ def simulate(args=None): # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output - optimizer.no_optimization() + if optimizer.no_optimization() == 'converged': + break # create report report.generate() - - -if __name__ == '__main__': - # parse args from cmd or file - simulate() diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py new file mode 100644 index 00000000..20f8cb92 --- /dev/null +++ b/ebus_toolbox/util.py @@ -0,0 +1,45 @@ +import json + + +def set_options_from_config(args, check=False, verbose=True): + """Read options from config file, update given args, try to parse options + , ignore comment lines (begin with #) + + :param args: input arguments + :type args: argparse.Namespace + :param check: raise ValueError on unknown options + :type check: bool + :param verbose: gives final overview of arguments + :type bool + + :raises ValueError: Raised if unknown options are given. + """ + + if "config" in args and args.config is not None: + # read options from config file + with open(args.config, 'r') as f: + for line in f: + line = line.strip() + if line.startswith('#'): + # comment + continue + if len(line) == 0: + # empty line + continue + k, v = line.split('=') + k = k.strip() + v = v.strip() + try: + # option may be special: number, array, etc. + v = json.loads(v) + except ValueError: + # or not + pass + # known option? + if (k not in args) and check: + raise ValueError("Unknown option {}".format(k)) + # set option + vars(args)[k] = v + # Give overview of options + if verbose: + print("Options: {}".format(vars(args))) From e5f01d522d4d87f471c002a18fe620aca5c32e15 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 23 Feb 2022 15:43:39 +0100 Subject: [PATCH 037/802] typo in vehicle_types.json --- data/examples/vehicle_types.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 9ce88ddc..cb490694 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -46,7 +46,7 @@ "CKB_opp": { "name": "articulated bus", "capacity": 190, - "charging_curve": [[0, 190], [0.8, 190], [1, 1900]], + "charging_curve": [[0, 190], [0.8, 190], [1, 190]], "min_charging_power": 0, "v2g": false, "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", From 1c60da4d6197ed1d4a2dc2021dfbbfc7b0582008 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 23 Feb 2022 16:16:25 +0100 Subject: [PATCH 038/802] added charging type to args --- data/configs/ebus_toolbox.cfg | 8 +++++++- ebus_toolbox/__main__.py | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index e37f3de0..48f1814a 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1 +1,7 @@ -input = "./data/private_examples/trips_example-bvg.csv" \ No newline at end of file +# Configs for the eBus Toolbox + +# Input file containing trip information +input = "./data/private_examples/trips_example-bvg.csv" + +# Preferred charging type. Options: depot, opp +preferred_charging_type = "depot" \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index b400bb07..3f653792 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -6,6 +6,9 @@ description='Ebus Toolbox - \ Simulation Program for Ebus Fleets.') parser.add_argument('input', nargs='?', help='Set the scenario JSON file') + parser.add_argument('--preferred_charging_type', '-pct', default='depot', + choices=['depot', 'opp'], help="Preferred charging type. Choose one\ + from and . opp stands for opportunity.") parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ From f01af4c43e18f8a5463a41b81bcdca282dfab8d6 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 23 Feb 2022 16:30:30 +0100 Subject: [PATCH 039/802] move vehicle_type,charging_type to rotation --- ebus_toolbox/rotation.py | 9 +++++++-- ebus_toolbox/schedule.py | 4 ++-- ebus_toolbox/trip.py | 8 +++----- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index cf9b2c60..163b1d0b 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -3,9 +3,14 @@ class Rotation: - def __init__(self, id) -> None: + def __init__(self, id, vehicle_type, ) -> None: self.id = id self.trips = [] + + self.vehicle_type = vehicle_type + '_opp' # dummy for testing purpose + self.vehicle_id = None + self.charging_type = 'depot' + self.consumption = 0 def add_trip(self, trip): @@ -15,7 +20,7 @@ def add_trip(self, trip): :type trip: dict """ - self.trips.append(Trip(**trip)) + self.trips.append(Trip(self, **trip)) def calculate_consumption(self): rotation_consumption = 0 diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index bef779e9..364fbc30 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -25,8 +25,8 @@ def from_csv(cls, path_to_csv): for trip in trip_reader: rotation_id = trip['rotation_id'] if rotation_id not in schedule.rotations.keys(): - schedule.rotations.update({rotation_id: Rotation(rotation_id)}) - + schedule.rotations.update({ + rotation_id: Rotation(id=rotation_id, vehicle_type=trip['vehicle_type'])}) schedule.rotations[rotation_id].add_trip(trip) return schedule diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 5f22e077..4de2112d 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -7,7 +7,7 @@ class Trip: consumption = Consumption() - def __init__(self, departure_time, departure_name, + def __init__(self, rotation, departure_time, departure_name, arrival_time, arrival_name, distance, **kwargs): self.departure_name = departure_name self.departure_time = departure_time @@ -15,9 +15,7 @@ def __init__(self, departure_time, departure_name, self.arrival_name = arrival_name self.distance = float(distance) - self.vehicle_type = kwargs.get('vehicle_type') + '_opp' # dummy for testing purpose - self.charging_type = None # maybe make charging type a member? - self.vehicle_id = kwargs.get('vehicle_id', None) + self.rotation = rotation self.consumption = 0 # kWh self.delta_SOC = 0 @@ -26,6 +24,6 @@ def calculate_consumption(self): self.consumption, self.delta_SOC = \ Trip.consumption.calculate_consumption(self.arrival_time, self.distance, - self.vehicle_type) + self.rotation.vehicle_type) return self.consumption From 67af02a38ba4e167c07214441297f82288026035 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 28 Feb 2022 15:43:23 +0100 Subject: [PATCH 040/802] add .idea to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ffd4281e..5715a788 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .DS_Store .python-version * .pyc +.idea/ __pycache__ docs/_build From 207fb0050aaf59b3499b460f4881d5c5c127e37a Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 1 Mar 2022 12:07:32 +0100 Subject: [PATCH 041/802] add default charging type to all rotations --- ebus_toolbox/consumption.py | 7 ++++--- ebus_toolbox/rotation.py | 2 +- ebus_toolbox/schedule.py | 5 +++-- ebus_toolbox/simulate.py | 2 +- ebus_toolbox/trip.py | 3 ++- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 2a564589..f886d56b 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -17,7 +17,7 @@ def __init__(self) -> None: with open("./data/examples/vehicle_types.json") as f: self.vehicle_types = json.load(f) - def calculate_consumption(self, time, distance, vehicle_type): + def calculate_consumption(self, time, distance, vehicle_type, charging_type): """ Calculates consumed amount of energy for a given distance. :param time: The date and time at which the trip ends @@ -34,7 +34,8 @@ def calculate_consumption(self, time, distance, vehicle_type): list(self.temperatures_by_hour.values())) # load consumption csv - consumption_file = self.vehicle_types[vehicle_type]["mileage"] + vt_ct = f"{vehicle_type}_{charging_type}" + consumption_file = self.vehicle_types[vt_ct]["mileage"] try: consumption = self.consumption_files[consumption_file] except KeyError: @@ -51,6 +52,6 @@ def calculate_consumption(self, time, distance, vehicle_type): mileage = np.interp(temp, xp, fp) # kWh / km ??? consumed_energy = mileage * distance # kWh - delta_SOC = consumed_energy / self.vehicle_types[vehicle_type]["capacity"] + delta_SOC = consumed_energy / self.vehicle_types[vt_ct]["capacity"] return (consumed_energy, delta_SOC) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 163b1d0b..7f9643e2 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -7,7 +7,7 @@ def __init__(self, id, vehicle_type, ) -> None: self.id = id self.trips = [] - self.vehicle_type = vehicle_type + '_opp' # dummy for testing purpose + self.vehicle_type = vehicle_type self.vehicle_id = None self.charging_type = 'depot' diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 364fbc30..f6ed2f15 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -43,9 +43,10 @@ def filter_rotations(self): """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" pass - def add_charging_types(self): + def add_charging_type(self, default_ct): """Iterate across all rotations/trips and append charging type if not given""" - pass + for rot in self.rotations.values(): + rot.charging_type = default_ct def assign_vehicles(self): """ Assign vehicle IDs to rotations. diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 616418f8..1b5e33b1 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -20,7 +20,7 @@ def simulate(args=None): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - schedule.add_charging_types() + schedule.add_charging_type(default_ct=args.preferred_charging_type) schedule.calculate_consumption() schedule.assign_vehicles() # write trips to csv in spiceEV format diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 4de2112d..f0816d1e 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -24,6 +24,7 @@ def calculate_consumption(self): self.consumption, self.delta_SOC = \ Trip.consumption.calculate_consumption(self.arrival_time, self.distance, - self.rotation.vehicle_type) + self.rotation.vehicle_type, + self.rotation.charging_type) return self.consumption From b12e158753a86debee94577fa4b64fd3d61a3376 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 2 Mar 2022 09:47:33 +0100 Subject: [PATCH 042/802] structure assigning vehicles --- ebus_toolbox/schedule.py | 30 +++++++++++++++++++++++------- ebus_toolbox/simulate.py | 4 +--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index f6ed2f15..99725cf4 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -43,17 +43,33 @@ def filter_rotations(self): """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" pass - def add_charging_type(self, default_ct): + def set_charging_type(self, ct, rotation_ids=None): """Iterate across all rotations/trips and append charging type if not given""" - for rot in self.rotations.values(): - rot.charging_type = default_ct + if rotation_ids is None: + rotation_ids = self.rotations.keys() - def assign_vehicles(self): - """ Assign vehicle IDs to rotations. - Just randomly? Match consumption with battery sizes? - """ + for id in rotation_ids: + self.rotations[id].charging_type = ct + + def _set_vehicle_ids(self): pass + def assign_vehicles(self, preferred_ct): + """ Depending on preferred charging type and consumption for each rotation + first assign a charging type to each rotation and then assign specific + vehicle IDs to each rotation. + """ + self.set_charging_type(ct=preferred_ct) + self.calculate_consumption() + + if preferred_ct == 'depot': + # evaluate for which busses rotation too long (consumed energy > capacity) + # and change charging types to opp for those + # self.calculate_consumption() + pass + + self._set_vehicle_ids() + def calculate_consumption(self): self.consumption = 0 for rot in self.rotations.values(): diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1b5e33b1..41cee551 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -20,9 +20,7 @@ def simulate(args=None): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - schedule.add_charging_type(default_ct=args.preferred_charging_type) - schedule.calculate_consumption() - schedule.assign_vehicles() + schedule.assign_vehicles(preferred_ct=args.preferred_charging_type) # write trips to csv in spiceEV format # RUN SPICE EV From 640c9a7a9c26fae5fbb5d70575981def83f6cf33 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 2 Mar 2022 12:01:57 +0100 Subject: [PATCH 043/802] add datetime to trip arrival and departure --- data/configs/ebus_toolbox.cfg | 2 +- ebus_toolbox/schedule.py | 16 ++-------------- ebus_toolbox/simulate.py | 5 +++-- ebus_toolbox/trip.py | 9 ++++----- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 48f1814a..f63020a4 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1,7 +1,7 @@ # Configs for the eBus Toolbox # Input file containing trip information -input = "./data/private_examples/trips_example-bvg.csv" +input = "./data/private_examples/trips_example-bvg_datetime.csv" # Preferred charging type. Options: depot, opp preferred_charging_type = "depot" \ No newline at end of file diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 99725cf4..fe059383 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -51,24 +51,12 @@ def set_charging_type(self, ct, rotation_ids=None): for id in rotation_ids: self.rotations[id].charging_type = ct - def _set_vehicle_ids(self): - pass - - def assign_vehicles(self, preferred_ct): + def assign_vehicles(self): """ Depending on preferred charging type and consumption for each rotation first assign a charging type to each rotation and then assign specific vehicle IDs to each rotation. """ - self.set_charging_type(ct=preferred_ct) - self.calculate_consumption() - - if preferred_ct == 'depot': - # evaluate for which busses rotation too long (consumed energy > capacity) - # and change charging types to opp for those - # self.calculate_consumption() - pass - - self._set_vehicle_ids() + pass def calculate_consumption(self): self.consumption = 0 diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 41cee551..a8df6ce6 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -19,8 +19,9 @@ def simulate(args=None): while(True): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - - schedule.assign_vehicles(preferred_ct=args.preferred_charging_type) + schedule.calculate_consumption() + schedule.set_charging_type(preferred_ct=args.preferred_charging_type) + schedule.assign_vehicles() # write trips to csv in spiceEV format # RUN SPICE EV diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index f0816d1e..325ef9aa 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -1,17 +1,16 @@ -import datetime -import random - +from datetime import datetime from ebus_toolbox.consumption import Consumption class Trip: + consumption = Consumption() def __init__(self, rotation, departure_time, departure_name, arrival_time, arrival_name, distance, **kwargs): self.departure_name = departure_name - self.departure_time = departure_time - self.arrival_time = datetime.datetime(2021, 8, 3, random.randint(0, 23), 30) # testing + self.departure_time = datetime.fromisoformat(departure_time) + self.arrival_time = datetime.fromisoformat(arrival_time) self.arrival_name = arrival_name self.distance = float(distance) From 7ea1ec75de2ebbe03b212397a5c0b35786c75962 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 2 Mar 2022 12:06:49 +0100 Subject: [PATCH 044/802] hide private data --- .gitignore | 2 +- .../energy_consumption_eindecker_solaris.csv | 23 - data/private_examples/trips_example-bvg.csv | 3958 ----------------- 3 files changed, 1 insertion(+), 3982 deletions(-) delete mode 100644 data/private_examples/energy_consumption_eindecker_solaris.csv delete mode 100644 data/private_examples/trips_example-bvg.csv diff --git a/.gitignore b/.gitignore index ffd4281e..9566817f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ __pycache__ docs/_build docs/source/temp -ebus_toolbox/data/private_examples +data/private_examples diff --git a/data/private_examples/energy_consumption_eindecker_solaris.csv b/data/private_examples/energy_consumption_eindecker_solaris.csv deleted file mode 100644 index 0579860e..00000000 --- a/data/private_examples/energy_consumption_eindecker_solaris.csv +++ /dev/null @@ -1,23 +0,0 @@ -Temp.,Alle,Kat. A,Kat. B,Kat. C --8,2.07,2.2,2.04,1.71 --6,1.9,2.03,1.76,1.59 --4,1.81,1.89,1.75,1.58 --2,1.78,1.86,1.65,1.49 -0,1.65,1.73,1.6,1.44 -2,1.61,1.67,1.57,1.38 -4,1.54,1.6,1.48,1.31 -6,1.47,1.52,1.44,1.25 -8,1.4,1.45,1.38,1.19 -10,1.33,1.37,1.3,1.16 -12,1.29,1.32,1.27,1.1 -14,1.2,1.23,1.17,1.04 -16,1.09,1.13,1.06,0.96 -18,1.06,1.08,1.03,0.93 -20,1.04,1.07,1.00,0.92 -22,1.08,1.11,1.03,0.93 -24,1.16,1.19,1.12,0.96 -26,1.23,1.27,1.2,1.03 -28,1.31,1.34,1.25,1.06 -30,1.43,1.46,1.38,1.11 -32,1.44,1.47,1.42,1.17 -34,1.53,1.57,1.45,1.24 diff --git a/data/private_examples/trips_example-bvg.csv b/data/private_examples/trips_example-bvg.csv deleted file mode 100644 index d03c7600..00000000 --- a/data/private_examples/trips_example-bvg.csv +++ /dev/null @@ -1,3958 +0,0 @@ -line,departure_name,departure_short_name,departure_day,departure_time,arrival_time,arrival_day,arrival_name,arrival_short_name,distance,pause,rotation_id,vehicle_type -160,Betriebshof A,BF A E,Monday,21.5166666666666,21.5166666666666,Monday,Hasselwerderstr.,HAWR01B,0.06,0,4454943,CKB -160,Hasselwerderstr.,HAWR01B,Monday,21.5166666666666,22.0666666666666,Monday,Siriusstr.,SIRI01B,14519,4,4454943,CKB -160,Siriusstr.,SIRI01B,Monday,22.1333333333333,22.7166666666666,Monday,Hasselwerderstr.,HAWR01B,13541,8,4454943,CKB -160,Hasselwerderstr.,HAWR01B,Monday,22.85,23.4,Monday,Siriusstr.,SIRI01B,14519,4,4454943,CKB -160,Siriusstr.,SIRI01B,Monday,23.4666666666666,24.05,Tuesday,Hasselwerderstr.,HAWR01B,13541,8,4454943,CKB -160,Hasselwerderstr.,HAWR01B,Tuesday,0.183333333333333,0.733333333333333,Tuesday,Siriusstr.,SIRI01B,14519,0,4454943,CKB -N60,Siriusstr.,SIRI01B,Tuesday,0.733333333333333,0.9,Tuesday,S Adlershof,SAH02BN,4.1,25,4454943,CKB -N60,S Adlershof,SAH02BN,Tuesday,1.31666666666666,1.7,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454943,CKB -N60,Flughafen Schönefeld,SXF01B,Tuesday,1.8,2.1,Tuesday,S Adlershof,SAH02BN,9067,13,4454943,CKB -N60,S Adlershof,SAH02BN,Tuesday,2.31666666666666,2.7,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454943,CKB -N60,Flughafen Schönefeld,SXF01B,Tuesday,2.8,3.1,Tuesday,S Adlershof,SAH02BN,9067,13,4454943,CKB -N60,S Adlershof,SAH02BN,Tuesday,3.31666666666666,3.7,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454943,CKB -N60,Flughafen Schönefeld,SXF01B,Tuesday,3.8,4.1,Tuesday,S Adlershof,SAH02BN,9067,0,4454943,CKB -N60,S Adlershof,SAH02BN,Tuesday,4.1,4.1,Tuesday,Betriebshof A Aussetzen,BF A A,0.06,0,4454943,CKB -160,Betriebshof A,BF A E,Monday,22.1833333333333,22.1833333333333,Monday,Hasselwerderstr.,HAWR01B,0.06,0,4454948,CKB -160,Hasselwerderstr.,HAWR01B,Monday,22.1833333333333,22.7333333333333,Monday,Siriusstr.,SIRI01B,14519,4,4454948,CKB -160,Siriusstr.,SIRI01B,Monday,22.8,23.3833333333333,Monday,Hasselwerderstr.,HAWR01B,13541,8,4454948,CKB -160,Hasselwerderstr.,HAWR01B,Monday,23.5166666666666,24.0666666666666,Tuesday,Siriusstr.,SIRI01B,14519,4,4454948,CKB -160,Siriusstr.,SIRI01B,Tuesday,0.133333333333333,0.65,Tuesday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454948,CKB -N60,S Schöneweide/Sterndamm,SSWS06B,Tuesday,0.65,0.783333333333333,Tuesday,S Adlershof,SAH02BN,4.0,2,4454948,CKB -N60,S Adlershof,SAH02BN,Tuesday,0.816666666666666,1.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454948,CKB -N60,Flughafen Schönefeld,SXF01B,Tuesday,1.3,1.6,Tuesday,S Adlershof,SAH02BN,9067,13,4454948,CKB -N60,S Adlershof,SAH02BN,Tuesday,1.81666666666666,2.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454948,CKB -N60,Flughafen Schönefeld,SXF01B,Tuesday,2.3,2.6,Tuesday,S Adlershof,SAH02BN,9067,13,4454948,CKB -N60,S Adlershof,SAH02BN,Tuesday,2.81666666666666,3.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,6,4454948,CKB -N60,Flughafen Schönefeld,SXF01B,Tuesday,3.3,3.6,Tuesday,S Adlershof,SAH02BN,9067,13,4454948,CKB -N60,S Adlershof,SAH02BN,Tuesday,3.81666666666666,4.2,Tuesday,Flughafen Schönefeld,SXF01B,8.36,0,4454948,CKB -N60,Flughafen Schönefeld,SXF01B,Tuesday,4.2,4.2,Tuesday,Betriebshof A,BF A A,0.06,0,4454948,CKB -161,Betriebshof A,BF A E,Monday,21.1,21.1,Monday,S Erkner/ZOB,SERZ01B,0.06,0,4664622,CKB -161,S Erkner/ZOB,SERZ01B,Monday,21.1,21.5666666666666,Monday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664622,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Monday,21.8833333333333,22.2166666666666,Monday,Lutherstr.,LUTH01B,10332,17,4664622,CKB -161,Lutherstr.,LUTH01B,Monday,22.5,22.9,Monday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664622,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Monday,23.2166666666666,23.55,Monday,Lutherstr.,LUTH01B,10332,17,4664622,CKB -161,Lutherstr.,LUTH01B,Monday,23.8333333333333,24.2333333333333,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664622,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,0.266666666666666,0.383333333333333,Tuesday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664622,CKB -N61,Rahnsdorf/Waldschänke,RDWS03BN,Tuesday,0.466666666666666,0.733333333333333,Tuesday,Dämeritzstr.,DARI01B,6404,3,4664622,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,0.783333333333333,1.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,1.28333333333333,1.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4664622,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,1.78333333333333,2.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,2.28333333333333,2.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4664622,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,2.78333333333333,3.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,3.28333333333333,3.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4664622,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,3.78333333333333,4.16666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4664622,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,4.28333333333333,4.73333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,0,4664622,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,4.73333333333333,4.73333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4664622,CKB -161,Betriebshof A,BF A E,Monday,20.4333333333333,20.4333333333333,Monday,S Erkner/ZOB,SERZ01B,0.06,0,4762732,CKB -161,S Erkner/ZOB,SERZ01B,Monday,20.4333333333333,20.9333333333333,Monday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762732,CKB -161,"Schöneiche, Goethepark",SEGP01BA,Monday,21.1666666666666,21.6333333333333,Monday,S Erkner/ZOB,SERZ01B,13.19,8,4762732,CKB -161,S Erkner/ZOB,SERZ01B,Monday,21.7666666666666,22.2333333333333,Monday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762732,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Monday,22.55,22.8833333333333,Monday,Lutherstr.,LUTH01B,10332,17,4762732,CKB -161,Lutherstr.,LUTH01B,Monday,23.1666666666666,23.5666666666666,Monday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762732,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Monday,23.8833333333333,24.2166666666666,Tuesday,Lutherstr.,LUTH01B,10332,2,4762732,CKB -161,Lutherstr.,LUTH01B,Tuesday,0.25,0.266666666666666,Tuesday,Dämeritzstr.,DARI01B,506,1,4762732,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,0.283333333333333,0.666666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,0.783333333333333,1.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,1.28333333333333,1.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,1.78333333333333,2.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,2.28333333333333,2.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,2.78333333333333,3.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,3.28333333333333,3.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,7,4762732,CKB -N61,S Friedrichshagen,SFHG05BN,Tuesday,3.78333333333333,4.23333333333333,Tuesday,Dämeritzstr.,DARI01B,12007,3,4762732,CKB -N61,Dämeritzstr.,DARI01B,Tuesday,4.28333333333333,4.66666666666666,Tuesday,S Friedrichshagen,SFHG05BN,10579,3,4762732,CKB -N67,S Friedrichshagen,SFHG05BN,Tuesday,4.71666666666666,4.96666666666666,Tuesday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762732,CKB -N67,Schloßplatz Köpenick,SLPZ01BN,Tuesday,4.96666666666666,4.96666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4762732,CKB -163,Betriebshof A,BF A E,Monday,22.9333333333333,22.9333333333333,Monday,S Grünau,SGA24BA,0.06,0,4617401,CKB -163,S Grünau,SGA24BA,Monday,22.9333333333333,23.1333333333333,Monday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617401,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Monday,23.1833333333333,23.4166666666666,Monday,S Grünau,SGA22BA,6232,0,4617401,CKB -163,S Grünau,SGA22BA,Monday,23.4166666666666,23.6333333333333,Monday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617401,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Monday,23.6833333333333,23.9166666666666,Monday,S Grünau,SGA22BA,6232,0,4617401,CKB -163,S Grünau,SGA22BA,Monday,23.9166666666666,24.1333333333333,Tuesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617401,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Tuesday,0.133333333333333,0.133333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4617401,CKB -168,Betriebshof A,BF A E,Monday,5.08333333333333,5.08333333333333,Monday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,5.08333333333333,5.23333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,5.23333333333333,5.38333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,5.41666666666666,5.56666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,5.56666666666666,5.71666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,23,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,6.1,6.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,6.25,6.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,6.43333333333333,6.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,6.58333333333333,6.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,6.76666666666666,6.91666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,6.91666666666666,7.06666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,7.1,7.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,7.25,7.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,7.43333333333333,7.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,7.58333333333333,7.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,8.1,8.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,8.25,8.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,8.43333333333333,8.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,8.58333333333333,8.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,8.76666666666666,8.91666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,8.91666666666666,9.06666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,9.1,9.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,9.25,9.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,9.43333333333333,9.58333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,9.58333333333333,9.73333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,10.1,10.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,10.25,10.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,10.4333333333333,10.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,10.5833333333333,10.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,10.7666666666666,10.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,10.9166666666666,11.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,11.1,11.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,11.25,11.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,11.4333333333333,11.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,11.5833333333333,11.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,12.1,12.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,12.25,12.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,12.4333333333333,12.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,12.5833333333333,12.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,12.7666666666666,12.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,12.9166666666666,13.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,13.1,13.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,13.25,13.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,13.4333333333333,13.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,13.5833333333333,13.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,13.7666666666666,13.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,13.9166666666666,14.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,14.1,14.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,14.25,14.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,14.7666666666666,14.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,14.9166666666666,15.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,15.1,15.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,15.25,15.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,15.4333333333333,15.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,15.5833333333333,15.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,16.1,16.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,16.25,16.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,16.4333333333333,16.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,16.5833333333333,16.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,16.7666666666666,16.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,16.9166666666666,17.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,17.1,17.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,17.25,17.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,17.4333333333333,17.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,17.5833333333333,17.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,18.1,18.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,18.25,18.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,18.4333333333333,18.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,18.5833333333333,18.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,18.7666666666666,18.9166666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,18.9166666666666,19.0666666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,19.1,19.25,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,19.25,19.4,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,19.4333333333333,19.5833333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,19.5833333333333,19.7333333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,21,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,20.0833333333333,20.2333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,20.2333333333333,20.3833333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,20.4166666666666,20.5666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,20.5666666666666,20.7166666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,20.75,20.9,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,20.9,21.05,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,21.0833333333333,21.2333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,21.2333333333333,21.3833333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,21.4166666666666,21.5666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,21.5666666666666,21.7166666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,22,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,22.0833333333333,22.2333333333333,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,22.2333333333333,22.3833333333333,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,22.4166666666666,22.5666666666666,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,22.5666666666666,22.7166666666666,Monday,Alt-Schmöckwitz,ALSW02B,5139,2,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,22.75,22.9,Monday,Moßkopfring,MKFR01B,4781,0,4426844,CKB -168,Moßkopfring,MKFR01B,Monday,22.9,23.05,Monday,Alt-Schmöckwitz,ALSW02B,5139,0,4426844,CKB -168,Alt-Schmöckwitz,ALSW02B,Monday,23.05,23.05,Monday,Betriebshof A,BF A A,0.06,0,4426844,CKB -269,Betriebshof A,BF A E,Tuesday,0.1,0.1,Tuesday,S Kaulsdorf,SKD05B,0.06,0,4708594,CKB -269,S Kaulsdorf,SKD05B,Tuesday,0.1,0.45,Tuesday,S Köpenick,SKOE01B,7827,0,4708594,CKB -N69,S Köpenick,SKOE01B,Tuesday,0.45,0.8,Tuesday,Odernheimer Str.,ODNH01B,11079,0,4708594,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,0.8,1.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4708594,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,1.55,2.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4708594,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,2.28333333333333,2.91666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4708594,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,3.05,3.76666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4708594,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,3.78333333333333,4.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,0,4708594,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,4.41666666666666,4.41666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4708594,CKB -326,Betriebshof Indira-Gandhi-Str.,BF I E,Monday,5.25,6.01666666666666,Monday,S Hermsdorf,SHDF01B,17.9,0,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,6.01666666666666,6.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,6.38333333333333,6.61666666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,6.68333333333333,6.91666666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,7.05,7.28333333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,7.35,7.58333333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,7.71666666666666,7.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,8.01666666666666,8.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,8.38333333333333,8.61666666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,8.68333333333333,8.91666666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,9.05,9.28333333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,9.35,9.58333333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,9.71666666666666,9.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,10.0166666666666,10.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,10.3833333333333,10.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,10.6833333333333,10.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,11.05,11.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,11.35,11.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,11.7166666666666,11.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,12.0166666666666,12.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,12.3833333333333,12.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,12.6833333333333,12.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,13.05,13.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,13.35,13.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,13.7166666666666,13.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,14.0166666666666,14.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,14.3833333333333,14.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,14.6833333333333,14.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,15.05,15.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,15.35,15.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,15.7166666666666,15.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,16.0166666666666,16.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,16.3833333333333,16.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,16.6833333333333,16.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,17.05,17.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,17.35,17.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,17.7166666666666,17.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,18.0166666666666,18.25,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,18.3833333333333,18.6166666666666,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,18.6833333333333,18.9166666666666,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,19.05,19.2833333333333,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,19.35,19.5833333333333,Monday,S Hermsdorf,SHDF01B,4637,8,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,19.7166666666666,19.95,Monday,S Hermsdorf,SHDF01B,4637,4,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,20.0166666666666,20.2333333333333,Monday,S Hermsdorf,SHDF01B,4637,9,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,20.3833333333333,20.6,Monday,S Hermsdorf,SHDF01B,4637,0,4317624,VDL -326,S Hermsdorf,SHDF01B,Monday,20.6,21.25,Monday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317624,VDL -334,Betriebshof A,BF A E,Monday,4.93333333333333,4.93333333333333,Monday,Alt-Gatow,ALTG01B,0.06,18,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,5.23333333333333,5.33333333333333,Monday,Habichtswald,HWLD01B,3.29,0,4425667,CKB -334,Habichtswald,HWLD01B,Monday,5.33333333333333,5.4,Monday,Alt-Gatow,ALTG01B,2954,20,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,5.73333333333333,5.83333333333333,Monday,Habichtswald,HWLD01B,3.29,0,4425667,CKB -334,Habichtswald,HWLD01B,Monday,5.83333333333333,5.9,Monday,Alt-Gatow,ALTG01B,2954,5,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,5.98333333333333,6.1,Monday,Habichtswald,HWLD01B,3.29,2,4425667,CKB -334,Habichtswald,HWLD01B,Monday,6.13333333333333,6.21666666666666,Monday,Alt-Gatow,ALTG01B,2954,19,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,6.53333333333333,6.65,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB -334,Habichtswald,HWLD01B,Monday,6.66666666666666,6.75,Monday,Alt-Gatow,ALTG01B,2954,7,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,6.86666666666666,6.98333333333333,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB -334,Habichtswald,HWLD01B,Monday,7.0,7.08333333333333,Monday,Alt-Gatow,ALTG01B,2954,7,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,7.2,7.31666666666666,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB -334,Habichtswald,HWLD01B,Monday,7.33333333333333,7.41666666666666,Monday,Alt-Gatow,ALTG01B,2954,7,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,7.53333333333333,7.65,Monday,Habichtswald,HWLD01B,3.29,1,4425667,CKB -334,Habichtswald,HWLD01B,Monday,7.66666666666666,7.75,Monday,Alt-Gatow,ALTG01B,2954,295,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,12.6666666666666,12.7833333333333,Monday,Habichtswald,HWLD01B,3.29,2,4425667,CKB -334,Habichtswald,HWLD01B,Monday,12.8166666666666,12.9,Monday,Alt-Gatow,ALTG01B,2954,46,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,13.6666666666666,13.7833333333333,Monday,Habichtswald,HWLD01B,3.29,2,4425667,CKB -334,Habichtswald,HWLD01B,Monday,13.8166666666666,13.9,Monday,Alt-Gatow,ALTG01B,2954,434,4425667,CKB -334,Alt-Gatow,ALTG01B,Monday,21.1333333333333,21.1333333333333,Monday,Betriebshof A,BF A A,0.06,0,4425667,CKB -349,Betriebshof A,BF A E,Monday,7.33333333333333,7.33333333333333,Monday,S Grunewald,SGD02B,0.06,0,4448149,CKB -349,S Grunewald,SGD02B,Monday,7.33333333333333,7.83333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,8.0,8.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,8.66666666666666,9.16666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,9.33333333333333,9.83333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,10.0,10.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,10.6666666666666,11.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,11.3333333333333,11.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,12.0,12.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,12.6666666666666,13.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,13.3333333333333,13.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,14.0,14.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,14.6666666666666,15.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,15.3333333333333,15.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,16.0,16.5,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,16.6666666666666,17.1666666666666,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,17.3333333333333,17.8333333333333,Monday,S Grunewald,SGD02B,9266,10,4448149,CKB -349,S Grunewald,SGD02B,Monday,18.0,18.5,Monday,S Grunewald,SGD02B,9266,0,4448149,CKB -349,S Grunewald,SGD02B,Monday,18.5,18.5,Monday,Betriebshof A,BF A A,0.06,0,4448149,CKB -370,Betriebshof A,BF A E,Monday,7.16666666666666,7.16666666666666,Monday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,7.16666666666666,7.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,7.46666666666666,7.66666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,7.66666666666666,7.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,7.96666666666666,8.16666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,8.16666666666666,8.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,8.46666666666666,8.66666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,8.66666666666666,8.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,8.96666666666666,9.16666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,9.16666666666666,9.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,9.46666666666666,9.66666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,9.66666666666666,9.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,9.96666666666666,10.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,10.1666666666666,10.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,10.4666666666666,10.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,10.6666666666666,10.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,10.9666666666666,11.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,11.1666666666666,11.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,11.4666666666666,11.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,11.6666666666666,11.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,11.9666666666666,12.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,12.1666666666666,12.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,12.4666666666666,12.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,12.6666666666666,12.8,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,12.9666666666666,13.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,13.1666666666666,13.3,Monday,S+U Hermannstr.,SUHM09B,2169,10,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,13.4666666666666,13.6666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,13.6666666666666,13.8,Monday,S+U Hermannstr.,SUHM09B,2169,8,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,13.9333333333333,14.1666666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,14.1666666666666,14.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,14.55,14.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,14.8333333333333,14.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,15.2166666666666,15.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,15.5,15.65,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,15.8833333333333,16.1166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,16.1666666666666,16.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,16.55,16.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,16.8333333333333,16.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,17.2166666666666,17.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,17.5,17.65,Monday,S+U Hermannstr.,SUHM09B,2169,13,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,17.8666666666666,18.0833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,5,4733894,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,18.1666666666666,18.3,Monday,S+U Hermannstr.,SUHM09B,2169,0,4733894,CKB -370,S+U Hermannstr.,SUHM09B,Monday,18.3,18.3,Monday,Betriebshof A,BF A A,0.06,0,4733894,CKB -370,Betriebshof A,BF A E,Monday,14.2166666666666,14.2166666666666,Monday,S+U Hermannstr.,SUHM09B,0.06,0,4734199,CKB -370,S+U Hermannstr.,SUHM09B,Monday,14.2166666666666,14.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,14.5,14.65,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB -370,S+U Hermannstr.,SUHM09B,Monday,14.8833333333333,15.1166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,15.1666666666666,15.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB -370,S+U Hermannstr.,SUHM09B,Monday,15.55,15.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,15.8333333333333,15.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB -370,S+U Hermannstr.,SUHM09B,Monday,16.2166666666666,16.45,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,16.5,16.65,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB -370,S+U Hermannstr.,SUHM09B,Monday,16.8833333333333,17.1166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,17.1666666666666,17.3166666666666,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB -370,S+U Hermannstr.,SUHM09B,Monday,17.55,17.7833333333333,Monday,Neuköllnische Brücke,NKBR04BA,2952,3,4734199,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,17.8333333333333,17.9833333333333,Monday,S+U Hermannstr.,SUHM09B,2169,14,4734199,CKB -370,S+U Hermannstr.,SUHM09B,Monday,18.2166666666666,18.4166666666666,Monday,Neuköllnische Brücke,NKBR04BA,2952,0,4734199,CKB -370,Neuköllnische Brücke,NKBR04BA,Monday,18.4166666666666,18.4166666666666,Monday,Betriebshof A,BF A A,0.06,0,4734199,CKB -N23,Betriebshof A,BF A E,Tuesday,0.383333333333333,0.383333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,0.06,0,4318156,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,0.383333333333333,0.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB -N39,U Rohrdamm,URDM01B,Tuesday,0.65,0.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB -N39,Mertensstr.,MTNS01B,Tuesday,1.05,1.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB -N23,U Rohrdamm,URDM02B,Tuesday,1.28333333333333,1.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,1.38333333333333,1.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB -N39,U Rohrdamm,URDM01B,Tuesday,1.65,1.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB -N39,Mertensstr.,MTNS01B,Tuesday,2.05,2.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB -N23,U Rohrdamm,URDM02B,Tuesday,2.28333333333333,2.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,2.38333333333333,2.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB -N39,U Rohrdamm,URDM01B,Tuesday,2.65,2.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB -N39,Mertensstr.,MTNS01B,Tuesday,3.05,3.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB -N23,U Rohrdamm,URDM02B,Tuesday,3.28333333333333,3.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,3.38333333333333,3.5,Tuesday,U Rohrdamm,URDM01B,2577,9,4318156,CKB -N39,U Rohrdamm,URDM01B,Tuesday,3.65,3.9,Tuesday,Mertensstr.,MTNS01B,5937,9,4318156,CKB -N39,Mertensstr.,MTNS01B,Tuesday,4.05,4.28333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318156,CKB -N23,U Rohrdamm,URDM02B,Tuesday,4.28333333333333,4.38333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318156,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,4.38333333333333,4.38333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4318156,CKB -N39,Betriebshof A,BF A E,Tuesday,0.55,0.55,Tuesday,Mertensstr.,MTNS01B,0.06,0,4318176,CKB -N39,Mertensstr.,MTNS01B,Tuesday,0.55,0.783333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB -N23,U Rohrdamm,URDM02B,Tuesday,0.783333333333333,0.883333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,0.883333333333333,1.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB -N39,U Rohrdamm,URDM01B,Tuesday,1.15,1.4,Tuesday,Mertensstr.,MTNS01B,5937,9,4318176,CKB -N39,Mertensstr.,MTNS01B,Tuesday,1.55,1.78333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB -N23,U Rohrdamm,URDM02B,Tuesday,1.78333333333333,1.88333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,1.88333333333333,2.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB -N39,U Rohrdamm,URDM01B,Tuesday,2.15,2.4,Tuesday,Mertensstr.,MTNS01B,5937,9,4318176,CKB -N39,Mertensstr.,MTNS01B,Tuesday,2.55,2.78333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB -N23,U Rohrdamm,URDM02B,Tuesday,2.78333333333333,2.88333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,2.88333333333333,3.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB -N39,U Rohrdamm,URDM01B,Tuesday,3.15,3.4,Tuesday,Mertensstr.,MTNS01B,5937,9,4318176,CKB -N39,Mertensstr.,MTNS01B,Tuesday,3.55,3.78333333333333,Tuesday,U Rohrdamm,URDM02B,6.19,0,4318176,CKB -N23,U Rohrdamm,URDM02B,Tuesday,3.78333333333333,3.88333333333333,Tuesday,Mäckeritzwiesen,MAWI01B,2555,0,4318176,CKB -N23,Mäckeritzwiesen,MAWI01B,Tuesday,3.88333333333333,4.0,Tuesday,U Rohrdamm,URDM01B,2577,9,4318176,CKB -N39,U Rohrdamm,URDM01B,Tuesday,4.15,4.4,Tuesday,Mertensstr.,MTNS01B,5937,0,4318176,CKB -N39,Mertensstr.,MTNS01B,Tuesday,4.4,4.4,Tuesday,Betriebshof A,BF A A,0.06,0,4318176,CKB -N35,Betriebshof A,BF A E,Tuesday,0.95,0.95,Tuesday,Alt-Kladow,ALKL02B,0.06,0,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,0.95,1.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,1.1,1.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,1.45,1.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,1.6,1.68333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,1.95,2.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,2.1,2.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,2.45,2.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,2.6,2.68333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,2.95,3.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,3.1,3.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,3.45,3.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,3.6,3.68333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,3.95,4.1,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,4.1,4.18333333333333,Tuesday,Alt-Kladow,ALKL02B,2936,16,4319351,CKB -N35,Alt-Kladow,ALKL02B,Tuesday,4.45,4.6,Tuesday,Gutsstr.,GUTS01B,4343,0,4319351,CKB -N35,Gutsstr.,GUTS01B,Tuesday,4.6,4.6,Tuesday,Betriebshof A,BF A A,0.06,0,4319351,CKB -N52,Betriebshof A,BF A E,Tuesday,0.483333333333333,0.483333333333333,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,0.483333333333333,0.683333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,0.783333333333333,0.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,0.983333333333333,1.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,1.28333333333333,1.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.48333333333333,1.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,1.78333333333333,1.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.98333333333333,2.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,2.28333333333333,2.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.48333333333333,2.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,2.78333333333333,2.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.98333333333333,3.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,3.28333333333333,3.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.48333333333333,3.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,3.78333333333333,3.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.98333333333333,4.18333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,6,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,4.28333333333333,4.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751086,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,4.48333333333333,4.68333333333333,Tuesday,U Osloer Str.,UOSL04B,4481,0,4751086,CKB -N52,U Osloer Str.,UOSL04B,Tuesday,4.68333333333333,4.68333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4751086,CKB -N53,Betriebshof A,BF A E,Tuesday,0.5,0.5,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,0.5,0.733333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,0.733333333333333,0.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.0,1.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,1.23333333333333,1.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,1.5,1.73333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,1.73333333333333,1.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.0,2.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,2.23333333333333,2.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,2.5,2.73333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,2.73333333333333,2.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.0,3.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,3.23333333333333,3.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,3.5,3.73333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,3.73333333333333,3.95,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,4.0,4.23333333333333,Tuesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453544,CKB -N53,Wilhelmsruher Damm,WIDA02B,Tuesday,4.23333333333333,4.45,Tuesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453544,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Tuesday,4.45,4.45,Tuesday,Betriebshof A,BF A A,0.06,0,4453544,CKB -N56,Betriebshof A,BF A E,Tuesday,0.716666666666666,0.716666666666666,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374466,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,0.716666666666666,1.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374466,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,1.71666666666666,2.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374466,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,2.71666666666666,3.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374466,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,3.71666666666666,4.55,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374466,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,4.55,4.55,Tuesday,Betriebshof A,BF A A,0.06,0,4374466,CKB -N56,Betriebshof A,BF A E,Tuesday,0.216666666666666,0.216666666666666,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374471,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,0.216666666666666,1.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374471,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,1.21666666666666,2.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374471,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,2.21666666666666,3.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374471,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,3.21666666666666,4.05,Tuesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374471,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Tuesday,4.05,4.05,Tuesday,Betriebshof A,BF A A,0.06,0,4374471,CKB -N58,Betriebshof A,BF A E,Tuesday,0.4,0.4,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456447,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,0.4,0.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB -N58,S Buch,SBU02B,Tuesday,0.866666666666666,1.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456447,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,1.4,1.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB -N58,S Buch,SBU02B,Tuesday,1.86666666666666,2.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456447,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,2.4,2.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB -N58,S Buch,SBU02B,Tuesday,2.86666666666666,3.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456447,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,3.4,3.8,Tuesday,S Buch,SBU02B,11.86,4,4456447,CKB -N58,S Buch,SBU02B,Tuesday,3.86666666666666,4.23333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456447,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,4.23333333333333,4.23333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4456447,CKB -N58,Betriebshof A,BF A E,Tuesday,0.366666666666666,0.366666666666666,Tuesday,S Buch,SBU02B,0.06,0,4456455,CKB -N58,S Buch,SBU02B,Tuesday,0.366666666666666,0.733333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,0.9,1.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB -N58,S Buch,SBU02B,Tuesday,1.36666666666666,1.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,1.9,2.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB -N58,S Buch,SBU02B,Tuesday,2.36666666666666,2.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,2.9,3.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB -N58,S Buch,SBU02B,Tuesday,3.36666666666666,3.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456455,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,3.9,4.3,Tuesday,S Buch,SBU02B,11.86,4,4456455,CKB -N58,S Buch,SBU02B,Tuesday,4.36666666666666,4.73333333333333,Tuesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456455,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Tuesday,4.73333333333333,4.73333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4456455,CKB -N62,Betriebshof A,BF A E,Tuesday,0.533333333333333,0.533333333333333,Tuesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747649,CKB -N62,Schloßplatz Köpenick,SLPZ02BN,Tuesday,0.533333333333333,0.733333333333333,Tuesday,Wendenschloß,WESC09BA,4212,3,4747649,CKB -N62,Wendenschloß,WESC09BA,Tuesday,0.783333333333333,1.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,1.26666666666666,1.7,Tuesday,Wendenschloß,WESC09BA,12869,5,4747649,CKB -N62,Wendenschloß,WESC09BA,Tuesday,1.78333333333333,2.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,2.26666666666666,2.7,Tuesday,Wendenschloß,WESC09BA,12869,5,4747649,CKB -N62,Wendenschloß,WESC09BA,Tuesday,2.78333333333333,3.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,3.26666666666666,3.7,Tuesday,Wendenschloß,WESC09BA,12869,5,4747649,CKB -N62,Wendenschloß,WESC09BA,Tuesday,3.78333333333333,4.26666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747649,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,4.26666666666666,4.56666666666666,Tuesday,Betriebshof Köpenick,BHKO01BN,9538,0,4747649,CKB -N62,Betriebshof Köpenick,BHKO01BN,Tuesday,4.56666666666666,4.56666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4747649,CKB -N62,Betriebshof A,BF A E,Tuesday,0.283333333333333,0.283333333333333,Tuesday,Wendenschloß,WESC09BA,0.06,0,4747659,CKB -N62,Wendenschloß,WESC09BA,Tuesday,0.283333333333333,0.766666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,0.766666666666666,1.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB -N62,Wendenschloß,WESC09BA,Tuesday,1.28333333333333,1.76666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,1.76666666666666,2.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB -N62,Wendenschloß,WESC09BA,Tuesday,2.28333333333333,2.76666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,2.76666666666666,3.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB -N62,Wendenschloß,WESC09BA,Tuesday,3.28333333333333,3.76666666666666,Tuesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747659,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Tuesday,3.76666666666666,4.2,Tuesday,Wendenschloß,WESC09BA,12869,5,4747659,CKB -N62,Wendenschloß,WESC09BA,Tuesday,4.28333333333333,4.46666666666666,Tuesday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747659,CKB -N62,Schloßplatz Köpenick,SLPZ03B,Tuesday,4.46666666666666,4.46666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4747659,CKB -N68,Betriebshof A,BF A E,Tuesday,0.816666666666666,0.816666666666666,Tuesday,S Adlershof,SAH02BN,0.06,0,4434340,CKB -N68,S Adlershof,SAH02BN,Tuesday,0.816666666666666,1.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,1.06666666666666,1.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB -N68,S Adlershof,SAH02BN,Tuesday,1.31666666666666,1.56666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,1.56666666666666,1.81666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB -N68,S Adlershof,SAH02BN,Tuesday,1.81666666666666,2.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,2.06666666666666,2.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB -N68,S Adlershof,SAH02BN,Tuesday,2.31666666666666,2.56666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,2.56666666666666,2.81666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB -N68,S Adlershof,SAH02BN,Tuesday,2.81666666666666,3.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,3.06666666666666,3.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB -N68,S Adlershof,SAH02BN,Tuesday,3.31666666666666,3.56666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,3.56666666666666,3.81666666666666,Tuesday,S Adlershof,SAH02BN,11801,0,4434340,CKB -N68,S Adlershof,SAH02BN,Tuesday,3.81666666666666,4.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434340,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Tuesday,4.06666666666666,4.31666666666666,Tuesday,S Adlershof,SAH02BN,11801,23,4434340,CKB -164,S Adlershof,SAH02BN,Tuesday,4.7,5.06666666666666,Tuesday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434340,CKB -164,Kaulsdorfer Str.,KDFS02B,Tuesday,5.06666666666666,5.06666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4434340,CKB -N69,Betriebshof A,BF A E,Tuesday,0.533333333333333,0.533333333333333,Tuesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434896,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Tuesday,0.533333333333333,0.95,Tuesday,S+U Wuhletal,SUWT02BN,11545,6,4434896,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,1.05,1.76666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434896,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,1.78333333333333,2.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434896,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,2.55,3.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434896,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,3.28333333333333,3.91666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434896,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,4.05,4.46666666666666,Tuesday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434896,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Tuesday,4.46666666666666,4.46666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4434896,CKB -N69,Betriebshof A,BF A E,Tuesday,0.55,0.55,Tuesday,S+U Wuhletal,SUWT02BN,0.06,0,4434901,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,0.55,1.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434901,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,1.28333333333333,1.91666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434901,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,2.05,2.76666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434901,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,2.78333333333333,3.41666666666666,Tuesday,S+U Wuhletal,SUWT02BN,20641,8,4434901,CKB -N69,S+U Wuhletal,SUWT02BN,Tuesday,3.55,4.26666666666666,Tuesday,Odernheimer Str.,ODNH01B,20579,1,4434901,CKB -N69,Odernheimer Str.,ODNH01B,Tuesday,4.28333333333333,4.85,Tuesday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434901,CKB -N69,U Elsterwerdaer Platz,UEWP03B,Tuesday,4.85,4.85,Tuesday,Betriebshof A,BF A A,0.06,0,4434901,CKB -N88,Betriebshof A,BF A E,Tuesday,0.566666666666666,0.566666666666666,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619765,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,0.566666666666666,1.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,1.0,1.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619765,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,1.56666666666666,2.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,2.0,2.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619765,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,2.56666666666666,3.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,3.0,3.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619765,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,3.56666666666666,4.0,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619765,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,4.0,4.45,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619765,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,4.45,4.45,Tuesday,Betriebshof A,BF A A,0.06,0,4619765,CKB -N88,Betriebshof A,BF A E,Tuesday,0.5,0.5,Tuesday,S Lichterfelde Süd,SLIS01B,0.06,0,4619990,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,0.5,0.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,1.06666666666666,1.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,1.5,1.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,2.06666666666666,2.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,2.5,2.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,3.06666666666666,3.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,3.5,3.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619990,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,4.06666666666666,4.5,Tuesday,S Lichterfelde Süd,SLIS01B,9016,0,4619990,CKB -N88,S Lichterfelde Süd,SLIS01B,Tuesday,4.5,4.95,Tuesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619990,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Tuesday,4.95,4.95,Tuesday,Betriebshof A,BF A A,0.06,0,4619990,CKB -N91,Betriebshof A,BF A E,Tuesday,0.516666666666666,0.516666666666666,Tuesday,S+U Wuhletal,SUWT02BN,0.06,0,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,0.516666666666666,0.733333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,0.733333333333333,0.933333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,1.01666666666666,1.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,1.23333333333333,1.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,1.51666666666666,1.73333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,1.73333333333333,1.93333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,2.01666666666666,2.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,2.23333333333333,2.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,2.51666666666666,2.73333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,2.73333333333333,2.93333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,3.01666666666666,3.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,3.23333333333333,3.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,3.51666666666666,3.73333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,3.73333333333333,3.93333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,5,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,4.01666666666666,4.23333333333333,Tuesday,Boschpoler Str.,BOPO01BN,4872,0,4374743,CKB -N91,Boschpoler Str.,BOPO01BN,Tuesday,4.23333333333333,4.43333333333333,Tuesday,S+U Wuhletal,SUWT02BN,5362,0,4374743,CKB -N91,S+U Wuhletal,SUWT02BN,Tuesday,4.43333333333333,4.43333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4374743,CKB -N95,Betriebshof A,BF A E,Tuesday,0.516666666666666,0.516666666666666,Tuesday,S+U Wuhletal,SUWT02BN,0.06,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,0.516666666666666,0.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,0.783333333333333,1.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,1.01666666666666,1.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,1.28333333333333,1.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,1.51666666666666,1.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,1.78333333333333,2.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,2.01666666666666,2.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,2.28333333333333,2.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,2.51666666666666,2.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,2.78333333333333,3.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,3.01666666666666,3.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,3.28333333333333,3.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,3.51666666666666,3.75,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,3.78333333333333,4.01666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,4.01666666666666,4.25,Tuesday,Riesaer Str.,RIES01BN,5225,2,4374865,CKB -N95,Riesaer Str.,RIES01BN,Tuesday,4.28333333333333,4.51666666666666,Tuesday,S+U Wuhletal,SUWT02BN,7617,0,4374865,CKB -N95,S+U Wuhletal,SUWT02BN,Tuesday,4.51666666666666,4.51666666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4374865,CKB -N97,Betriebshof A,BF A E,Tuesday,0.716666666666666,0.716666666666666,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,0.716666666666666,0.883333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,0.883333333333333,1.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,1.21666666666666,1.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,1.38333333333333,1.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,1.71666666666666,1.88333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,1.88333333333333,2.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,2.21666666666666,2.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,2.38333333333333,2.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,2.71666666666666,2.88333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,2.88333333333333,3.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,3.21666666666666,3.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,3.38333333333333,3.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,3.71666666666666,3.88333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,3.88333333333333,4.05,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,4.21666666666666,4.38333333333333,Tuesday,Barnimplatz,BARN01B,4507,0,4375012,CKB -N97,Barnimplatz,BARN01B,Tuesday,4.38333333333333,4.55,Tuesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375012,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Tuesday,4.55,4.55,Tuesday,Betriebshof A,BF A A,0.06,0,4375012,CKB -N68,Betriebshof A,BF A E,Monday,0.816666666666666,0.816666666666666,Monday,S Adlershof,SAH02BN,0.06,0,4434215,CKB -N68,S Adlershof,SAH02BN,Monday,0.816666666666666,1.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Monday,1.06666666666666,1.31666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB -N68,S Adlershof,SAH02BN,Monday,1.31666666666666,1.56666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Monday,1.56666666666666,1.81666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB -N68,S Adlershof,SAH02BN,Monday,1.81666666666666,2.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Monday,2.06666666666666,2.31666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB -N68,S Adlershof,SAH02BN,Monday,2.31666666666666,2.56666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Monday,2.56666666666666,2.81666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB -N68,S Adlershof,SAH02BN,Monday,2.81666666666666,3.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Monday,3.06666666666666,3.31666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB -N68,S Adlershof,SAH02BN,Monday,3.31666666666666,3.56666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Monday,3.56666666666666,3.81666666666666,Monday,S Adlershof,SAH02BN,11801,0,4434215,CKB -N68,S Adlershof,SAH02BN,Monday,3.81666666666666,4.06666666666666,Monday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434215,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Monday,4.06666666666666,4.31666666666666,Monday,S Adlershof,SAH02BN,11801,23,4434215,CKB -164,S Adlershof,SAH02BN,Monday,4.7,5.06666666666666,Monday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434215,CKB -164,Kaulsdorfer Str.,KDFS02B,Monday,5.06666666666666,5.06666666666666,Monday,Betriebshof A,BF A A,0.06,0,4434215,CKB -N23,Betriebshof A,BF A E,Monday,0.383333333333333,0.383333333333333,Monday,Mäckeritzwiesen,MAWI01B,0.06,0,4318071,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,0.383333333333333,0.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB -N39,U Rohrdamm,URDM01B,Monday,0.65,0.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB -N39,Mertensstr.,MTNS01B,Monday,1.05,1.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB -N23,U Rohrdamm,URDM02B,Monday,1.28333333333333,1.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,1.38333333333333,1.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB -N39,U Rohrdamm,URDM01B,Monday,1.65,1.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB -N39,Mertensstr.,MTNS01B,Monday,2.05,2.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB -N23,U Rohrdamm,URDM02B,Monday,2.28333333333333,2.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,2.38333333333333,2.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB -N39,U Rohrdamm,URDM01B,Monday,2.65,2.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB -N39,Mertensstr.,MTNS01B,Monday,3.05,3.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB -N23,U Rohrdamm,URDM02B,Monday,3.28333333333333,3.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,3.38333333333333,3.5,Monday,U Rohrdamm,URDM01B,2577,9,4318071,CKB -N39,U Rohrdamm,URDM01B,Monday,3.65,3.9,Monday,Mertensstr.,MTNS01B,5937,9,4318071,CKB -N39,Mertensstr.,MTNS01B,Monday,4.05,4.28333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318071,CKB -N23,U Rohrdamm,URDM02B,Monday,4.28333333333333,4.38333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318071,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,4.38333333333333,4.38333333333333,Monday,Betriebshof A,BF A A,0.06,0,4318071,CKB -N39,Betriebshof A,BF A E,Monday,0.55,0.55,Monday,Mertensstr.,MTNS01B,0.06,0,4318083,CKB -N39,Mertensstr.,MTNS01B,Monday,0.55,0.783333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB -N23,U Rohrdamm,URDM02B,Monday,0.783333333333333,0.883333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,0.883333333333333,1.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB -N39,U Rohrdamm,URDM01B,Monday,1.15,1.4,Monday,Mertensstr.,MTNS01B,5937,9,4318083,CKB -N39,Mertensstr.,MTNS01B,Monday,1.55,1.78333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB -N23,U Rohrdamm,URDM02B,Monday,1.78333333333333,1.88333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,1.88333333333333,2.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB -N39,U Rohrdamm,URDM01B,Monday,2.15,2.4,Monday,Mertensstr.,MTNS01B,5937,9,4318083,CKB -N39,Mertensstr.,MTNS01B,Monday,2.55,2.78333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB -N23,U Rohrdamm,URDM02B,Monday,2.78333333333333,2.88333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,2.88333333333333,3.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB -N39,U Rohrdamm,URDM01B,Monday,3.15,3.4,Monday,Mertensstr.,MTNS01B,5937,9,4318083,CKB -N39,Mertensstr.,MTNS01B,Monday,3.55,3.78333333333333,Monday,U Rohrdamm,URDM02B,6.19,0,4318083,CKB -N23,U Rohrdamm,URDM02B,Monday,3.78333333333333,3.88333333333333,Monday,Mäckeritzwiesen,MAWI01B,2555,0,4318083,CKB -N23,Mäckeritzwiesen,MAWI01B,Monday,3.88333333333333,4.0,Monday,U Rohrdamm,URDM01B,2577,9,4318083,CKB -N39,U Rohrdamm,URDM01B,Monday,4.15,4.4,Monday,Mertensstr.,MTNS01B,5937,0,4318083,CKB -N39,Mertensstr.,MTNS01B,Monday,4.4,4.4,Monday,Betriebshof A,BF A A,0.06,0,4318083,CKB -N35,Betriebshof A,BF A E,Monday,0.95,0.95,Monday,Alt-Kladow,ALKL02B,0.06,0,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,0.95,1.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,1.1,1.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,1.45,1.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,1.6,1.68333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,1.95,2.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,2.1,2.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,2.45,2.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,2.6,2.68333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,2.95,3.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,3.1,3.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,3.45,3.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,3.6,3.68333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,3.95,4.1,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,4.1,4.18333333333333,Monday,Alt-Kladow,ALKL02B,2936,16,4319428,CKB -N35,Alt-Kladow,ALKL02B,Monday,4.45,4.6,Monday,Gutsstr.,GUTS01B,4343,0,4319428,CKB -N35,Gutsstr.,GUTS01B,Monday,4.6,4.6,Monday,Betriebshof A,BF A A,0.06,0,4319428,CKB -N52,Betriebshof A,BF A E,Monday,0.483333333333333,0.483333333333333,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,0.483333333333333,0.683333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,0.783333333333333,0.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,0.983333333333333,1.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,1.28333333333333,1.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.48333333333333,1.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,1.78333333333333,1.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.98333333333333,2.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,2.28333333333333,2.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.48333333333333,2.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,2.78333333333333,2.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.98333333333333,3.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,3.28333333333333,3.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.48333333333333,3.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,3.78333333333333,3.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.98333333333333,4.18333333333333,Monday,U Osloer Str.,UOSL04B,4481,6,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,4.28333333333333,4.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751093,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,4.48333333333333,4.68333333333333,Monday,U Osloer Str.,UOSL04B,4481,0,4751093,CKB -N52,U Osloer Str.,UOSL04B,Monday,4.68333333333333,4.68333333333333,Monday,Betriebshof A,BF A A,0.06,0,4751093,CKB -N53,Betriebshof A,BF A E,Monday,0.5,0.5,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,0.5,0.733333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,0.733333333333333,0.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.0,1.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,1.23333333333333,1.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,1.5,1.73333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,1.73333333333333,1.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.0,2.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,2.23333333333333,2.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,2.5,2.73333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,2.73333333333333,2.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.0,3.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,3.23333333333333,3.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,3.5,3.73333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,3.73333333333333,3.95,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,4.0,4.23333333333333,Monday,Wilhelmsruher Damm,WIDA02B,4801,0,4454017,CKB -N53,Wilhelmsruher Damm,WIDA02B,Monday,4.23333333333333,4.45,Monday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4454017,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Monday,4.45,4.45,Monday,Betriebshof A,BF A A,0.06,0,4454017,CKB -N56,Betriebshof A,BF A E,Monday,0.716666666666666,0.716666666666666,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374470,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,0.716666666666666,1.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374470,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,1.71666666666666,2.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374470,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,2.71666666666666,3.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374470,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,3.71666666666666,4.55,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374470,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,4.55,4.55,Monday,Betriebshof A,BF A A,0.06,0,4374470,CKB -N56,Betriebshof A,BF A E,Monday,0.216666666666666,0.216666666666666,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374475,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,0.216666666666666,1.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374475,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,1.21666666666666,2.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374475,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,2.21666666666666,3.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374475,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,3.21666666666666,4.05,Monday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374475,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Monday,4.05,4.05,Monday,Betriebshof A,BF A A,0.06,0,4374475,CKB -N58,Betriebshof A,BF A E,Monday,0.4,0.4,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456537,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,0.4,0.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB -N58,S Buch,SBU02B,Monday,0.866666666666666,1.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456537,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,1.4,1.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB -N58,S Buch,SBU02B,Monday,1.86666666666666,2.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456537,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,2.4,2.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB -N58,S Buch,SBU02B,Monday,2.86666666666666,3.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456537,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,3.4,3.8,Monday,S Buch,SBU02B,11.86,4,4456537,CKB -N58,S Buch,SBU02B,Monday,3.86666666666666,4.23333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456537,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,4.23333333333333,4.23333333333333,Monday,Betriebshof A,BF A A,0.06,0,4456537,CKB -N58,Betriebshof A,BF A E,Monday,0.366666666666666,0.366666666666666,Monday,S Buch,SBU02B,0.06,0,4456538,CKB -N58,S Buch,SBU02B,Monday,0.366666666666666,0.733333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,0.9,1.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB -N58,S Buch,SBU02B,Monday,1.36666666666666,1.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,1.9,2.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB -N58,S Buch,SBU02B,Monday,2.36666666666666,2.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,2.9,3.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB -N58,S Buch,SBU02B,Monday,3.36666666666666,3.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456538,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,3.9,4.3,Monday,S Buch,SBU02B,11.86,4,4456538,CKB -N58,S Buch,SBU02B,Monday,4.36666666666666,4.73333333333333,Monday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456538,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Monday,4.73333333333333,4.73333333333333,Monday,Betriebshof A,BF A A,0.06,0,4456538,CKB -160,Betriebshof A,BF A E,Sunday,20.85,20.85,Sunday,Hasselwerderstr.,HAWR01B,0.06,0,4454973,CKB -160,Hasselwerderstr.,HAWR01B,Sunday,20.85,21.4,Sunday,Siriusstr.,SIRI01B,14519,4,4454973,CKB -160,Siriusstr.,SIRI01B,Sunday,21.4666666666666,22.05,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454973,CKB -160,Hasselwerderstr.,HAWR01B,Sunday,22.1833333333333,22.7333333333333,Sunday,Siriusstr.,SIRI01B,14519,4,4454973,CKB -160,Siriusstr.,SIRI01B,Sunday,22.8,23.3833333333333,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454973,CKB -160,Hasselwerderstr.,HAWR01B,Sunday,23.5166666666666,24.0666666666666,Monday,Siriusstr.,SIRI01B,14519,4,4454973,CKB -160,Siriusstr.,SIRI01B,Monday,0.133333333333333,0.65,Monday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454973,CKB -N60,S Schöneweide/Sterndamm,SSWS06B,Monday,0.65,0.783333333333333,Monday,S Adlershof,SAH02BN,4.0,2,4454973,CKB -N60,S Adlershof,SAH02BN,Monday,0.816666666666666,1.2,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454973,CKB -N60,Flughafen Schönefeld,SXF01B,Monday,1.3,1.6,Monday,S Adlershof,SAH02BN,9067,13,4454973,CKB -N60,S Adlershof,SAH02BN,Monday,1.81666666666666,2.2,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454973,CKB -N60,Flughafen Schönefeld,SXF01B,Monday,2.3,2.6,Monday,S Adlershof,SAH02BN,9067,13,4454973,CKB -N60,S Adlershof,SAH02BN,Monday,2.81666666666666,3.2,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454973,CKB -N60,Flughafen Schönefeld,SXF01B,Monday,3.3,3.6,Monday,S Adlershof,SAH02BN,9067,13,4454973,CKB -N60,S Adlershof,SAH02BN,Monday,3.81666666666666,4.2,Monday,Flughafen Schönefeld,SXF01B,8.36,0,4454973,CKB -N60,Flughafen Schönefeld,SXF01B,Monday,4.2,4.2,Monday,Betriebshof A,BF A A,0.06,0,4454973,CKB -160,Betriebshof A,BF A E,Sunday,21.5166666666666,21.5166666666666,Sunday,Hasselwerderstr.,HAWR01B,0.06,0,4454974,CKB -160,Hasselwerderstr.,HAWR01B,Sunday,21.5166666666666,22.0666666666666,Sunday,Siriusstr.,SIRI01B,14519,4,4454974,CKB -160,Siriusstr.,SIRI01B,Sunday,22.1333333333333,22.7166666666666,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454974,CKB -160,Hasselwerderstr.,HAWR01B,Sunday,22.85,23.4,Sunday,Siriusstr.,SIRI01B,14519,4,4454974,CKB -160,Siriusstr.,SIRI01B,Sunday,23.4666666666666,24.05,Monday,Hasselwerderstr.,HAWR01B,13541,8,4454974,CKB -160,Hasselwerderstr.,HAWR01B,Monday,0.183333333333333,0.733333333333333,Monday,Siriusstr.,SIRI01B,14519,0,4454974,CKB -N60,Siriusstr.,SIRI01B,Monday,0.733333333333333,0.9,Monday,S Adlershof,SAH02BN,4.1,25,4454974,CKB -N60,S Adlershof,SAH02BN,Monday,1.31666666666666,1.7,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454974,CKB -N60,Flughafen Schönefeld,SXF01B,Monday,1.8,2.1,Monday,S Adlershof,SAH02BN,9067,13,4454974,CKB -N60,S Adlershof,SAH02BN,Monday,2.31666666666666,2.7,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454974,CKB -N60,Flughafen Schönefeld,SXF01B,Monday,2.8,3.1,Monday,S Adlershof,SAH02BN,9067,13,4454974,CKB -N60,S Adlershof,SAH02BN,Monday,3.31666666666666,3.7,Monday,Flughafen Schönefeld,SXF01B,8.36,6,4454974,CKB -N60,Flughafen Schönefeld,SXF01B,Monday,3.8,4.1,Monday,S Adlershof,SAH02BN,9067,0,4454974,CKB -N60,S Adlershof,SAH02BN,Monday,4.1,4.1,Monday,Betriebshof A,BF A A,0.06,0,4454974,CKB -161,Betriebshof A,BF A E,Sunday,21.1,21.1,Sunday,S Erkner/ZOB,SERZ01B,0.06,0,4664782,CKB -161,S Erkner/ZOB,SERZ01B,Sunday,21.1,21.5666666666666,Sunday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664782,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,21.8833333333333,22.2166666666666,Sunday,Lutherstr.,LUTH01B,10332,17,4664782,CKB -161,Lutherstr.,LUTH01B,Sunday,22.5,22.9,Sunday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664782,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,23.2166666666666,23.55,Sunday,Lutherstr.,LUTH01B,10332,17,4664782,CKB -161,Lutherstr.,LUTH01B,Sunday,23.8333333333333,24.2333333333333,Monday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664782,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Monday,0.266666666666666,0.383333333333333,Monday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664782,CKB -N61,Rahnsdorf/Waldschänke,RDWS03BN,Monday,0.466666666666666,0.733333333333333,Monday,Dämeritzstr.,DARI01B,6404,3,4664782,CKB -N61,Dämeritzstr.,DARI01B,Monday,0.783333333333333,1.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,1.28333333333333,1.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4664782,CKB -N61,Dämeritzstr.,DARI01B,Monday,1.78333333333333,2.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,2.28333333333333,2.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4664782,CKB -N61,Dämeritzstr.,DARI01B,Monday,2.78333333333333,3.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,3.28333333333333,3.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4664782,CKB -N61,Dämeritzstr.,DARI01B,Monday,3.78333333333333,4.16666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4664782,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,4.28333333333333,4.73333333333333,Monday,Dämeritzstr.,DARI01B,12007,0,4664782,CKB -N61,Dämeritzstr.,DARI01B,Monday,4.73333333333333,4.73333333333333,Monday,Betriebshof A,BF A A,0.06,0,4664782,CKB -161,Betriebshof A,BF A E,Sunday,20.4333333333333,20.4333333333333,Sunday,S Erkner/ZOB,SERZ01B,0.06,0,4762788,CKB -161,S Erkner/ZOB,SERZ01B,Sunday,20.4333333333333,20.9333333333333,Sunday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762788,CKB -161,"Schöneiche, Goethepark",SEGP01BA,Sunday,21.1666666666666,21.6333333333333,Sunday,S Erkner/ZOB,SERZ01B,13.19,8,4762788,CKB -161,S Erkner/ZOB,SERZ01B,Sunday,21.7666666666666,22.2333333333333,Sunday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762788,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,22.55,22.8833333333333,Sunday,Lutherstr.,LUTH01B,10332,17,4762788,CKB -161,Lutherstr.,LUTH01B,Sunday,23.1666666666666,23.5666666666666,Sunday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762788,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,23.8833333333333,24.2166666666666,Monday,Lutherstr.,LUTH01B,10332,2,4762788,CKB -161,Lutherstr.,LUTH01B,Monday,0.25,0.266666666666666,Monday,Dämeritzstr.,DARI01B,506,1,4762788,CKB -N61,Dämeritzstr.,DARI01B,Monday,0.283333333333333,0.666666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,0.783333333333333,1.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB -N61,Dämeritzstr.,DARI01B,Monday,1.28333333333333,1.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,1.78333333333333,2.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB -N61,Dämeritzstr.,DARI01B,Monday,2.28333333333333,2.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,2.78333333333333,3.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB -N61,Dämeritzstr.,DARI01B,Monday,3.28333333333333,3.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,7,4762788,CKB -N61,S Friedrichshagen,SFHG05BN,Monday,3.78333333333333,4.23333333333333,Monday,Dämeritzstr.,DARI01B,12007,3,4762788,CKB -N61,Dämeritzstr.,DARI01B,Monday,4.28333333333333,4.66666666666666,Monday,S Friedrichshagen,SFHG05BN,10579,3,4762788,CKB -N67,S Friedrichshagen,SFHG05BN,Monday,4.71666666666666,4.96666666666666,Monday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762788,CKB -N67,Schloßplatz Köpenick,SLPZ01BN,Monday,4.96666666666666,4.96666666666666,Monday,Betriebshof A,BF A A,0.06,0,4762788,CKB -N62,Betriebshof A,BF A E,Monday,0.533333333333333,0.533333333333333,Monday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747688,CKB -N62,Schloßplatz Köpenick,SLPZ02BN,Monday,0.533333333333333,0.733333333333333,Monday,Wendenschloß,WESC09BA,4212,3,4747688,CKB -N62,Wendenschloß,WESC09BA,Monday,0.783333333333333,1.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,1.26666666666666,1.7,Monday,Wendenschloß,WESC09BA,12869,5,4747688,CKB -N62,Wendenschloß,WESC09BA,Monday,1.78333333333333,2.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,2.26666666666666,2.7,Monday,Wendenschloß,WESC09BA,12869,5,4747688,CKB -N62,Wendenschloß,WESC09BA,Monday,2.78333333333333,3.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,3.26666666666666,3.7,Monday,Wendenschloß,WESC09BA,12869,5,4747688,CKB -N62,Wendenschloß,WESC09BA,Monday,3.78333333333333,4.26666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747688,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,4.26666666666666,4.56666666666666,Monday,Betriebshof Köpenick,BHKO01BN,9538,0,4747688,CKB -N62,Betriebshof Köpenick,BHKO01BN,Monday,4.56666666666666,4.56666666666666,Monday,Betriebshof A,BF A A,0.06,0,4747688,CKB -N62,Betriebshof A,BF A E,Monday,0.283333333333333,0.283333333333333,Monday,Wendenschloß,WESC09BA,0.06,0,4747699,CKB -N62,Wendenschloß,WESC09BA,Monday,0.283333333333333,0.766666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,0.766666666666666,1.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB -N62,Wendenschloß,WESC09BA,Monday,1.28333333333333,1.76666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,1.76666666666666,2.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB -N62,Wendenschloß,WESC09BA,Monday,2.28333333333333,2.76666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,2.76666666666666,3.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB -N62,Wendenschloß,WESC09BA,Monday,3.28333333333333,3.76666666666666,Monday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747699,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Monday,3.76666666666666,4.2,Monday,Wendenschloß,WESC09BA,12869,5,4747699,CKB -N62,Wendenschloß,WESC09BA,Monday,4.28333333333333,4.46666666666666,Monday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747699,CKB -N62,Schloßplatz Köpenick,SLPZ03B,Monday,4.46666666666666,4.46666666666666,Monday,Betriebshof A,BF A A,0.06,0,4747699,CKB -N69,Betriebshof A,BF A E,Monday,0.533333333333333,0.533333333333333,Monday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4627068,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Monday,0.533333333333333,0.95,Monday,S+U Wuhletal,SUWT02BN,11545,6,4627068,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,1.05,1.76666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627068,CKB -N69,Odernheimer Str.,ODNH01B,Monday,1.78333333333333,2.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627068,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,2.55,3.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627068,CKB -N69,Odernheimer Str.,ODNH01B,Monday,3.28333333333333,3.91666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627068,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,4.05,4.46666666666666,Monday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4627068,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Monday,4.46666666666666,4.46666666666666,Monday,Betriebshof A,BF A A,0.06,0,4627068,CKB -N69,Betriebshof A,BF A E,Monday,0.55,0.55,Monday,S+U Wuhletal,SUWT02BN,0.06,0,4627069,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,0.55,1.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627069,CKB -N69,Odernheimer Str.,ODNH01B,Monday,1.28333333333333,1.91666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627069,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,2.05,2.76666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627069,CKB -N69,Odernheimer Str.,ODNH01B,Monday,2.78333333333333,3.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4627069,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,3.55,4.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4627069,CKB -N69,Odernheimer Str.,ODNH01B,Monday,4.28333333333333,4.85,Monday,U Elsterwerdaer Platz,UEWP03B,18752,0,4627069,CKB -N69,U Elsterwerdaer Platz,UEWP03B,Monday,4.85,4.85,Monday,Betriebshof A,BF A A,0.06,0,4627069,CKB -269,Betriebshof A,BF A E,Monday,0.133333333333333,0.133333333333333,Monday,S Kaulsdorf,SKD05B,0.06,0,4710317,CKB -269,S Kaulsdorf,SKD05B,Monday,0.133333333333333,0.45,Monday,S Köpenick,SKOE01B,7827,0,4710317,CKB -N69,S Köpenick,SKOE01B,Monday,0.45,0.8,Monday,Odernheimer Str.,ODNH01B,11079,0,4710317,CKB -N69,Odernheimer Str.,ODNH01B,Monday,0.8,1.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4710317,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,1.55,2.26666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4710317,CKB -N69,Odernheimer Str.,ODNH01B,Monday,2.28333333333333,2.91666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,8,4710317,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,3.05,3.76666666666666,Monday,Odernheimer Str.,ODNH01B,20579,1,4710317,CKB -N69,Odernheimer Str.,ODNH01B,Monday,3.78333333333333,4.41666666666666,Monday,S+U Wuhletal,SUWT02BN,20641,0,4710317,CKB -N69,S+U Wuhletal,SUWT02BN,Monday,4.41666666666666,4.41666666666666,Monday,Betriebshof A,BF A A,0.06,0,4710317,CKB -N88,Betriebshof A,BF A E,Monday,0.5,0.5,Monday,S Lichterfelde Süd,SLIS01B,0.06,0,4619816,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,0.5,0.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,1.06666666666666,1.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,1.5,1.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,2.06666666666666,2.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,2.5,2.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,3.06666666666666,3.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,3.5,3.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619816,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,4.06666666666666,4.5,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619816,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,4.5,4.95,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619816,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,4.95,4.95,Monday,Betriebshof A,BF A A,0.06,0,4619816,CKB -N88,Betriebshof A,BF A E,Monday,0.566666666666666,0.566666666666666,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619817,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,0.566666666666666,1.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,1.0,1.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619817,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,1.56666666666666,2.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,2.0,2.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619817,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,2.56666666666666,3.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,3.0,3.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619817,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,3.56666666666666,4.0,Monday,S Lichterfelde Süd,SLIS01B,9016,0,4619817,CKB -N88,S Lichterfelde Süd,SLIS01B,Monday,4.0,4.45,Monday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619817,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Monday,4.45,4.45,Monday,Betriebshof A,BF A A,0.06,0,4619817,CKB -N91,Betriebshof A,BF A E,Monday,0.516666666666666,0.516666666666666,Monday,S+U Wuhletal,SUWT02BN,0.06,0,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,0.516666666666666,0.733333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,0.733333333333333,0.933333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,1.01666666666666,1.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,1.23333333333333,1.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,1.51666666666666,1.73333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,1.73333333333333,1.93333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,2.01666666666666,2.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,2.23333333333333,2.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,2.51666666666666,2.73333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,2.73333333333333,2.93333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,3.01666666666666,3.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,3.23333333333333,3.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,3.51666666666666,3.73333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,3.73333333333333,3.93333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,5,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,4.01666666666666,4.23333333333333,Monday,Boschpoler Str.,BOPO01BN,4872,0,4374749,CKB -N91,Boschpoler Str.,BOPO01BN,Monday,4.23333333333333,4.43333333333333,Monday,S+U Wuhletal,SUWT02BN,5362,0,4374749,CKB -N91,S+U Wuhletal,SUWT02BN,Monday,4.43333333333333,4.43333333333333,Monday,Betriebshof A,BF A A,0.06,0,4374749,CKB -N95,Betriebshof A,BF A E,Monday,0.516666666666666,0.516666666666666,Monday,S+U Wuhletal,SUWT02BN,0.06,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,0.516666666666666,0.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,0.783333333333333,1.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,1.01666666666666,1.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,1.28333333333333,1.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,1.51666666666666,1.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,1.78333333333333,2.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,2.01666666666666,2.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,2.28333333333333,2.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,2.51666666666666,2.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,2.78333333333333,3.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,3.01666666666666,3.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,3.28333333333333,3.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,3.51666666666666,3.75,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,3.78333333333333,4.01666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,4.01666666666666,4.25,Monday,Riesaer Str.,RIES01BN,5225,2,4374873,CKB -N95,Riesaer Str.,RIES01BN,Monday,4.28333333333333,4.51666666666666,Monday,S+U Wuhletal,SUWT02BN,7617,0,4374873,CKB -N95,S+U Wuhletal,SUWT02BN,Monday,4.51666666666666,4.51666666666666,Monday,Betriebshof A,BF A A,0.06,0,4374873,CKB -N97,Betriebshof A,BF A E,Monday,0.716666666666666,0.716666666666666,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,0.716666666666666,0.883333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,0.883333333333333,1.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,1.21666666666666,1.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,1.38333333333333,1.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,1.71666666666666,1.88333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,1.88333333333333,2.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,2.21666666666666,2.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,2.38333333333333,2.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,2.71666666666666,2.88333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,2.88333333333333,3.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,3.21666666666666,3.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,3.38333333333333,3.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,3.71666666666666,3.88333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,3.88333333333333,4.05,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,4.21666666666666,4.38333333333333,Monday,Barnimplatz,BARN01B,4507,0,4375018,CKB -N97,Barnimplatz,BARN01B,Monday,4.38333333333333,4.55,Monday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375018,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Monday,4.55,4.55,Monday,Betriebshof A,BF A A,0.06,0,4375018,CKB -363,Betriebshof A,BF A E,Sunday,15.7666666666666,15.7666666666666,Sunday,S Grünau,SGA24BA,0.06,0,4458713,CKB -363,S Grünau,SGA24BA,Sunday,15.7666666666666,15.8833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3147,12,4458713,CKB -363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,16.0833333333333,16.25,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB -363,S Grünau,SGA22BA,Sunday,16.25,16.3833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB -363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,16.5833333333333,16.75,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB -363,S Grünau,SGA22BA,Sunday,16.75,16.8833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB -363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,17.0833333333333,17.25,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB -363,S Grünau,SGA22BA,Sunday,17.25,17.3833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB -363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,17.5833333333333,17.75,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB -363,S Grünau,SGA22BA,Sunday,17.75,17.8833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,12,4458713,CKB -363,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,18.0833333333333,18.25,Sunday,S Grünau,SGA22BA,3469,0,4458713,CKB -363,S Grünau,SGA22BA,Sunday,18.25,18.3833333333333,Sunday,Krankenhaus Hedwigshöhe,KHDW01B,3351,0,4458713,CKB -263,Krankenhaus Hedwigshöhe,KHDW01B,Sunday,18.3833333333333,18.4833333333333,Sunday,S Grünau,SGA22BA,3.1,22,4458713,CKB -263,S Grünau,SGA22BA,Sunday,18.85,19.0333333333333,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB -263,Waldstr./Stadtgrenze,WASG01B,Sunday,19.0333333333333,19.2166666666666,Sunday,S Grünau,SGA22BA,4427,12,4458713,CKB -163,S Grünau,SGA22BA,Sunday,19.4166666666666,19.6333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,19.6833333333333,19.9166666666666,Sunday,S Grünau,SGA22BA,6232,0,4458713,CKB -163,S Grünau,SGA22BA,Sunday,19.9166666666666,20.1333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,20.1833333333333,20.4166666666666,Sunday,S Grünau,SGA22BA,6232,6,4458713,CKB -263,S Grünau,SGA22BA,Sunday,20.5166666666666,20.7,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB -263,Waldstr./Stadtgrenze,WASG01B,Sunday,20.7,20.8833333333333,Sunday,S Grünau,SGA22BA,4427,18,4458713,CKB -263,S Grünau,SGA22BA,Sunday,21.1833333333333,21.3666666666666,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB -263,Waldstr./Stadtgrenze,WASG01B,Sunday,21.3666666666666,21.55,Sunday,S Grünau,SGA22BA,4427,18,4458713,CKB -263,S Grünau,SGA22BA,Sunday,21.85,22.0333333333333,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB -263,Waldstr./Stadtgrenze,WASG01B,Sunday,22.0333333333333,22.2166666666666,Sunday,S Grünau,SGA22BA,4427,18,4458713,CKB -263,S Grünau,SGA22BA,Sunday,22.5166666666666,22.7,Sunday,Waldstr./Stadtgrenze,WASG01B,4338,0,4458713,CKB -263,Waldstr./Stadtgrenze,WASG01B,Sunday,22.7,22.8833333333333,Sunday,S Grünau,SGA22BA,4427,2,4458713,CKB -163,S Grünau,SGA22BA,Sunday,22.9166666666666,23.1333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,23.1833333333333,23.4166666666666,Sunday,S Grünau,SGA22BA,6232,0,4458713,CKB -163,S Grünau,SGA22BA,Sunday,23.4166666666666,23.6333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4458713,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,23.6833333333333,23.9166666666666,Sunday,S Grünau,SGA22BA,6232,0,4458713,CKB -163,S Grünau,SGA22BA,Sunday,23.9166666666666,24.1333333333333,Monday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4458713,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Monday,0.133333333333333,0.133333333333333,Monday,Betriebshof A,BF A A,0.06,0,4458713,CKB -168,Betriebshof A,BF A E,Sunday,7.08333333333333,7.08333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,7.08333333333333,7.23333333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,7.23333333333333,7.38333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,7.41666666666666,7.56666666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,7.56666666666666,7.71666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,8.08333333333333,8.23333333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,8.23333333333333,8.38333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,8.41666666666666,8.56666666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,8.56666666666666,8.71666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,8.75,8.9,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,8.9,9.05,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,9.08333333333333,9.23333333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,9.23333333333333,9.38333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,9.41666666666666,9.56666666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,9.56666666666666,9.71666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,23,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,10.1,10.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,10.25,10.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,10.4333333333333,10.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,10.5833333333333,10.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,10.7666666666666,10.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,10.9166666666666,11.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,11.1,11.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,11.25,11.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,11.4333333333333,11.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,11.5833333333333,11.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,12.1,12.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,12.25,12.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,12.4333333333333,12.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,12.5833333333333,12.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,12.7666666666666,12.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,12.9166666666666,13.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,13.1,13.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,13.25,13.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,13.4333333333333,13.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,13.5833333333333,13.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,14.1,14.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,14.25,14.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,14.4333333333333,14.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,14.5833333333333,14.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,14.7666666666666,14.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,14.9166666666666,15.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,15.1,15.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,15.25,15.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,15.4333333333333,15.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,15.5833333333333,15.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,16.1,16.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,16.25,16.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,16.4333333333333,16.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,16.5833333333333,16.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,16.7666666666666,16.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,16.9166666666666,17.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,17.1,17.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,17.25,17.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,17.4333333333333,17.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,17.5833333333333,17.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,22,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,18.1,18.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,18.25,18.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,18.4333333333333,18.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,18.5833333333333,18.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,18.7666666666666,18.9166666666666,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,18.9166666666666,19.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,19.1,19.25,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,19.25,19.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,2,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,19.4333333333333,19.5833333333333,Sunday,Moßkopfring,MKFR01B,4781,0,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,19.5833333333333,19.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,21,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,20.0833333333333,20.2333333333333,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,20.25,20.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,20.4166666666666,20.5666666666666,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,20.5833333333333,20.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,20.75,20.9,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,20.9166666666666,21.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,21.0833333333333,21.2333333333333,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,21.25,21.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,21.4166666666666,21.5666666666666,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,21.5833333333333,21.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,21,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,22.0833333333333,22.2333333333333,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,22.25,22.4,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,22.4166666666666,22.5666666666666,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,22.5833333333333,22.7333333333333,Sunday,Alt-Schmöckwitz,ALSW02B,5139,1,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,22.75,22.9,Sunday,Moßkopfring,MKFR01B,4781,1,4426903,CKB -168,Moßkopfring,MKFR01B,Sunday,22.9166666666666,23.0666666666666,Sunday,Alt-Schmöckwitz,ALSW02B,5139,0,4426903,CKB -168,Alt-Schmöckwitz,ALSW02B,Sunday,23.0666666666666,23.0666666666666,Sunday,Betriebshof A,BF A A,0.06,0,4426903,CKB -294,Betriebshof A,BF A E,Sunday,7.5,7.5,Sunday,Seehausener Str.,SEEH01B,0.06,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,7.5,7.58333333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,7.65,7.83333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,7.83333333333333,7.91666666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,7.98333333333333,8.16666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,8.16666666666666,8.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,8.31666666666666,8.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,8.5,8.58333333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,8.65,8.83333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,8.83333333333333,8.91666666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,8.98333333333333,9.16666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,9.16666666666666,9.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,9.31666666666666,9.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,9.5,9.58333333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,9.65,9.83333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,9.83333333333333,9.91666666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,9.98333333333333,10.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,10.1666666666666,10.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,10.3166666666666,10.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,10.5,10.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,10.65,10.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,10.8333333333333,10.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,10.9833333333333,11.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,11.1666666666666,11.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,11.3166666666666,11.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,11.5,11.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,11.65,11.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,11.8333333333333,11.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,11.9833333333333,12.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,12.1666666666666,12.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,12.3166666666666,12.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,12.5,12.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,12.65,12.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,12.8333333333333,12.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,12.9833333333333,13.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,13.1666666666666,13.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,13.3166666666666,13.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,13.5,13.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,13.65,13.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,13.8333333333333,13.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,13.9833333333333,14.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,14.1666666666666,14.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,14.3166666666666,14.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,14.5,14.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,14.65,14.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,14.8333333333333,14.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,14.9833333333333,15.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,15.1666666666666,15.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,15.3166666666666,15.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,15.5,15.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,15.65,15.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,15.8333333333333,15.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,15.9833333333333,16.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,16.1666666666666,16.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,16.3166666666666,16.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,16.5,16.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,16.65,16.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,16.8333333333333,16.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,16.9833333333333,17.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,17.1666666666666,17.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,17.3166666666666,17.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,17.5,17.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,17.65,17.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,17.8333333333333,17.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,17.9833333333333,18.1666666666666,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,18.1666666666666,18.25,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,18.3166666666666,18.5,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,18.5,18.5833333333333,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,18.65,18.8333333333333,Sunday,Seehausener Str.,SEEH01B,4341,0,4369706,CKB -294,Seehausener Str.,SEEH01B,Sunday,18.8333333333333,18.9166666666666,Sunday,Gehrenseestr.,GEHR05B,2217,4,4369706,CKB -294,Gehrenseestr.,GEHR05B,Sunday,18.9833333333333,19.1666666666666,Sunday,Seehausener Str.,SEEH02B,4288,0,4369706,CKB -294,Seehausener Str.,SEEH02B,Sunday,19.1666666666666,19.1666666666666,Sunday,Betriebshof A,BF A A,0.06,0,4369706,CKB -334,Betriebshof A,BF A E,Sunday,7.93333333333333,7.93333333333333,Sunday,Alt-Gatow,ALTG01B,0.06,0,4419537,CKB -334,Alt-Gatow,ALTG01B,Sunday,7.93333333333333,7.93333333333333,Sunday,Alt-Gatow,ALTG99B,0.0,792,4419537,CKB -334,Alt-Gatow,ALTG99B,Sunday,21.1333333333333,21.1333333333333,Sunday,Alt-Gatow,ALTG01B,0.0,0,4419537,CKB -334,Alt-Gatow,ALTG01B,Sunday,21.1333333333333,21.1333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4419537,CKB -369,Betriebshof A,BF A E,Sunday,7.3,7.3,Sunday,Müggelheim/Dorf,MHDO01B,0.06,0,4688586,CKB -369,Müggelheim/Dorf,MHDO01B,Sunday,7.3,7.43333333333333,Sunday,"Gosen, Eiche",GOSE01B,5562,10,4688586,CKB -369,"Gosen, Eiche",GOSE01B,Sunday,7.6,7.75,Sunday,Alt-Müggelheim,ALMG01B,5941,32,4688586,CKB -369,Alt-Müggelheim,ALMG01B,Sunday,8.28333333333333,8.43333333333333,Sunday,"Gosen, Eiche",GOSE01B,5994,10,4688586,CKB -369,"Gosen, Eiche",GOSE01B,Sunday,8.6,8.75,Sunday,Alt-Müggelheim,ALMG01B,5941,32,4688586,CKB -369,Alt-Müggelheim,ALMG01B,Sunday,9.28333333333333,9.43333333333333,Sunday,"Gosen, Eiche",GOSE01B,5994,8,4688586,CKB -369,"Gosen, Eiche",GOSE01B,Sunday,9.56666666666666,9.71666666666666,Sunday,Alt-Müggelheim,ALMG01B,5941,36,4688586,CKB -369,Alt-Müggelheim,ALMG01B,Sunday,10.3166666666666,10.5,Sunday,"Gosen, Eiche",GOSE01B,5994,2,4688586,CKB -369,"Gosen, Eiche",GOSE01B,Sunday,10.5333333333333,10.6833333333333,Sunday,Müggelheim/Dorf,MHDO02B,5566,0,4688586,CKB -369,Müggelheim/Dorf,MHDO02B,Sunday,10.6833333333333,10.6833333333333,Sunday,Betriebshof A,BF A A,0.06,0,4688586,CKB -160,Betriebshof A,BF A E,Tuesday,21.5166666666666,21.5166666666666,Tuesday,Hasselwerderstr.,HAWR01B,0.06,0,4454944,CKB -160,Hasselwerderstr.,HAWR01B,Tuesday,21.5166666666666,22.0666666666666,Tuesday,Siriusstr.,SIRI01B,14519,4,4454944,CKB -160,Siriusstr.,SIRI01B,Tuesday,22.1333333333333,22.7166666666666,Tuesday,Hasselwerderstr.,HAWR01B,13541,8,4454944,CKB -160,Hasselwerderstr.,HAWR01B,Tuesday,22.85,23.4,Tuesday,Siriusstr.,SIRI01B,14519,4,4454944,CKB -160,Siriusstr.,SIRI01B,Tuesday,23.4666666666666,24.05,Wednesday,Hasselwerderstr.,HAWR01B,13541,8,4454944,CKB -160,Hasselwerderstr.,HAWR01B,Wednesday,0.183333333333333,0.733333333333333,Wednesday,Siriusstr.,SIRI01B,14519,0,4454944,CKB -N60,Siriusstr.,SIRI01B,Wednesday,0.733333333333333,0.9,Wednesday,S Adlershof,SAH02BN,4.1,25,4454944,CKB -N60,S Adlershof,SAH02BN,Wednesday,1.31666666666666,1.7,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454944,CKB -N60,Flughafen Schönefeld,SXF01B,Wednesday,1.8,2.1,Wednesday,S Adlershof,SAH02BN,9067,13,4454944,CKB -N60,S Adlershof,SAH02BN,Wednesday,2.31666666666666,2.7,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454944,CKB -N60,Flughafen Schönefeld,SXF01B,Wednesday,2.8,3.1,Wednesday,S Adlershof,SAH02BN,9067,13,4454944,CKB -N60,S Adlershof,SAH02BN,Wednesday,3.31666666666666,3.7,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454944,CKB -N60,Flughafen Schönefeld,SXF01B,Wednesday,3.8,4.1,Wednesday,S Adlershof,SAH02BN,9067,0,4454944,CKB -N60,S Adlershof,SAH02BN,Wednesday,4.1,4.1,Wednesday,Betriebshof A,BF A A,0.06,0,4454944,CKB -160,Betriebshof A,BF A E,Tuesday,22.1833333333333,22.1833333333333,Tuesday,Hasselwerderstr.,HAWR01B,0.06,0,4454949,CKB -160,Hasselwerderstr.,HAWR01B,Tuesday,22.1833333333333,22.7333333333333,Tuesday,Siriusstr.,SIRI01B,14519,4,4454949,CKB -160,Siriusstr.,SIRI01B,Tuesday,22.8,23.3833333333333,Tuesday,Hasselwerderstr.,HAWR01B,13541,8,4454949,CKB -160,Hasselwerderstr.,HAWR01B,Tuesday,23.5166666666666,24.0666666666666,Wednesday,Siriusstr.,SIRI01B,14519,4,4454949,CKB -160,Siriusstr.,SIRI01B,Wednesday,0.133333333333333,0.65,Wednesday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454949,CKB -N60,S Schöneweide/Sterndamm,SSWS06B,Wednesday,0.65,0.783333333333333,Wednesday,S Adlershof,SAH02BN,4.0,2,4454949,CKB -N60,S Adlershof,SAH02BN,Wednesday,0.816666666666666,1.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454949,CKB -N60,Flughafen Schönefeld,SXF01B,Wednesday,1.3,1.6,Wednesday,S Adlershof,SAH02BN,9067,13,4454949,CKB -N60,S Adlershof,SAH02BN,Wednesday,1.81666666666666,2.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454949,CKB -N60,Flughafen Schönefeld,SXF01B,Wednesday,2.3,2.6,Wednesday,S Adlershof,SAH02BN,9067,13,4454949,CKB -N60,S Adlershof,SAH02BN,Wednesday,2.81666666666666,3.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,6,4454949,CKB -N60,Flughafen Schönefeld,SXF01B,Wednesday,3.3,3.6,Wednesday,S Adlershof,SAH02BN,9067,13,4454949,CKB -N60,S Adlershof,SAH02BN,Wednesday,3.81666666666666,4.2,Wednesday,Flughafen Schönefeld,SXF01B,8.36,0,4454949,CKB -N60,Flughafen Schönefeld,SXF01B,Wednesday,4.2,4.2,Wednesday,Betriebshof A,BF A A,0.06,0,4454949,CKB -161,Betriebshof A,BF A E,Tuesday,21.1,21.1,Tuesday,S Erkner/ZOB,SERZ01B,0.06,0,4664623,CKB -161,S Erkner/ZOB,SERZ01B,Tuesday,21.1,21.5666666666666,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664623,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,21.8833333333333,22.2166666666666,Tuesday,Lutherstr.,LUTH01B,10332,17,4664623,CKB -161,Lutherstr.,LUTH01B,Tuesday,22.5,22.9,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664623,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,23.2166666666666,23.55,Tuesday,Lutherstr.,LUTH01B,10332,17,4664623,CKB -161,Lutherstr.,LUTH01B,Tuesday,23.8333333333333,24.2333333333333,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664623,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,0.266666666666666,0.383333333333333,Wednesday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664623,CKB -N61,Rahnsdorf/Waldschänke,RDWS03BN,Wednesday,0.466666666666666,0.733333333333333,Wednesday,Dämeritzstr.,DARI01B,6404,3,4664623,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,0.783333333333333,1.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,1.28333333333333,1.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4664623,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,1.78333333333333,2.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,2.28333333333333,2.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4664623,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,2.78333333333333,3.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,3.28333333333333,3.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4664623,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,3.78333333333333,4.16666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4664623,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,4.28333333333333,4.73333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,0,4664623,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,4.73333333333333,4.73333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4664623,CKB -161,Betriebshof A,BF A E,Tuesday,20.4333333333333,20.4333333333333,Tuesday,S Erkner/ZOB,SERZ01B,0.06,0,4762733,CKB -161,S Erkner/ZOB,SERZ01B,Tuesday,20.4333333333333,20.9333333333333,Tuesday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762733,CKB -161,"Schöneiche, Goethepark",SEGP01BA,Tuesday,21.1666666666666,21.6333333333333,Tuesday,S Erkner/ZOB,SERZ01B,13.19,8,4762733,CKB -161,S Erkner/ZOB,SERZ01B,Tuesday,21.7666666666666,22.2333333333333,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762733,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,22.55,22.8833333333333,Tuesday,Lutherstr.,LUTH01B,10332,17,4762733,CKB -161,Lutherstr.,LUTH01B,Tuesday,23.1666666666666,23.5666666666666,Tuesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762733,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Tuesday,23.8833333333333,24.2166666666666,Wednesday,Lutherstr.,LUTH01B,10332,2,4762733,CKB -161,Lutherstr.,LUTH01B,Wednesday,0.25,0.266666666666666,Wednesday,Dämeritzstr.,DARI01B,506,1,4762733,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,0.283333333333333,0.666666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,0.783333333333333,1.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,1.28333333333333,1.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,1.78333333333333,2.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,2.28333333333333,2.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,2.78333333333333,3.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,3.28333333333333,3.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,7,4762733,CKB -N61,S Friedrichshagen,SFHG05BN,Wednesday,3.78333333333333,4.23333333333333,Wednesday,Dämeritzstr.,DARI01B,12007,3,4762733,CKB -N61,Dämeritzstr.,DARI01B,Wednesday,4.28333333333333,4.66666666666666,Wednesday,S Friedrichshagen,SFHG05BN,10579,3,4762733,CKB -N67,S Friedrichshagen,SFHG05BN,Wednesday,4.71666666666666,4.96666666666666,Wednesday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762733,CKB -N67,Schloßplatz Köpenick,SLPZ01BN,Wednesday,4.96666666666666,4.96666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4762733,CKB -163,Betriebshof A,BF A E,Tuesday,22.9333333333333,22.9333333333333,Tuesday,S Grünau,SGA24BA,0.06,0,4617408,CKB -163,S Grünau,SGA24BA,Tuesday,22.9333333333333,23.1333333333333,Tuesday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617408,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Tuesday,23.1833333333333,23.4166666666666,Tuesday,S Grünau,SGA22BA,6232,0,4617408,CKB -163,S Grünau,SGA22BA,Tuesday,23.4166666666666,23.6333333333333,Tuesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617408,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Tuesday,23.6833333333333,23.9166666666666,Tuesday,S Grünau,SGA22BA,6232,0,4617408,CKB -163,S Grünau,SGA22BA,Tuesday,23.9166666666666,24.1333333333333,Wednesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617408,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Wednesday,0.133333333333333,0.133333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4617408,CKB -168,Betriebshof A,BF A E,Tuesday,5.08333333333333,5.08333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,5.08333333333333,5.23333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,5.23333333333333,5.38333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,5.41666666666666,5.56666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,5.56666666666666,5.71666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,23,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,6.1,6.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,6.25,6.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,6.43333333333333,6.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,6.58333333333333,6.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,6.76666666666666,6.91666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,6.91666666666666,7.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,7.1,7.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,7.25,7.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,7.43333333333333,7.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,7.58333333333333,7.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,8.1,8.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,8.25,8.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,8.43333333333333,8.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,8.58333333333333,8.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,8.76666666666666,8.91666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,8.91666666666666,9.06666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,9.1,9.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,9.25,9.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,9.43333333333333,9.58333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,9.58333333333333,9.73333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,10.1,10.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,10.25,10.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,10.4333333333333,10.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,10.5833333333333,10.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,10.7666666666666,10.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,10.9166666666666,11.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,11.1,11.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,11.25,11.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,11.4333333333333,11.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,11.5833333333333,11.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,12.1,12.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,12.25,12.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,12.4333333333333,12.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,12.5833333333333,12.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,12.7666666666666,12.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,12.9166666666666,13.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,13.1,13.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,13.25,13.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,13.4333333333333,13.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,13.5833333333333,13.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,13.7666666666666,13.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,13.9166666666666,14.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,14.1,14.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,14.25,14.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,14.7666666666666,14.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,14.9166666666666,15.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,15.1,15.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,15.25,15.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,15.4333333333333,15.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,15.5833333333333,15.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,16.1,16.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,16.25,16.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,16.4333333333333,16.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,16.5833333333333,16.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,16.7666666666666,16.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,16.9166666666666,17.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,17.1,17.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,17.25,17.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,17.4333333333333,17.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,17.5833333333333,17.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,18.1,18.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,18.25,18.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,18.4333333333333,18.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,18.5833333333333,18.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,18.7666666666666,18.9166666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,18.9166666666666,19.0666666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,19.1,19.25,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,19.25,19.4,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,19.4333333333333,19.5833333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,19.5833333333333,19.7333333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,21,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,20.0833333333333,20.2333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,20.2333333333333,20.3833333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,20.4166666666666,20.5666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,20.5666666666666,20.7166666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,20.75,20.9,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,20.9,21.05,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,21.0833333333333,21.2333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,21.2333333333333,21.3833333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,21.4166666666666,21.5666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,21.5666666666666,21.7166666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,22.0833333333333,22.2333333333333,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,22.2333333333333,22.3833333333333,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,22.4166666666666,22.5666666666666,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,22.5666666666666,22.7166666666666,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,22.75,22.9,Tuesday,Moßkopfring,MKFR01B,4781,0,4426845,CKB -168,Moßkopfring,MKFR01B,Tuesday,22.9,23.05,Tuesday,Alt-Schmöckwitz,ALSW02B,5139,0,4426845,CKB -168,Alt-Schmöckwitz,ALSW02B,Tuesday,23.05,23.05,Tuesday,Betriebshof A,BF A A,0.06,0,4426845,CKB -269,Betriebshof A,BF A E,Wednesday,0.1,0.1,Wednesday,S Kaulsdorf,SKD05B,0.06,0,4708595,CKB -269,S Kaulsdorf,SKD05B,Wednesday,0.1,0.45,Wednesday,S Köpenick,SKOE01B,7827,0,4708595,CKB -N69,S Köpenick,SKOE01B,Wednesday,0.45,0.8,Wednesday,Odernheimer Str.,ODNH01B,11079,0,4708595,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,0.8,1.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4708595,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,1.55,2.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4708595,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,2.28333333333333,2.91666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4708595,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,3.05,3.76666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4708595,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,3.78333333333333,4.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,0,4708595,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,4.41666666666666,4.41666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4708595,CKB -326,Betriebshof Indira-Gandhi-Str.,BF I E,Tuesday,5.25,6.01666666666666,Tuesday,S Hermsdorf,SHDF01B,17.9,0,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,6.01666666666666,6.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,6.38333333333333,6.61666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,6.68333333333333,6.91666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,7.05,7.28333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,7.35,7.58333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,7.71666666666666,7.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,8.01666666666666,8.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,8.38333333333333,8.61666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,8.68333333333333,8.91666666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,9.05,9.28333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,9.35,9.58333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,9.71666666666666,9.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,10.0166666666666,10.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,10.3833333333333,10.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,10.6833333333333,10.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,11.05,11.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,11.35,11.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,11.7166666666666,11.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,12.0166666666666,12.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,12.3833333333333,12.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,12.6833333333333,12.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,13.05,13.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,13.35,13.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,13.7166666666666,13.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,14.0166666666666,14.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,14.3833333333333,14.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,14.6833333333333,14.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,15.05,15.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,15.35,15.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,15.7166666666666,15.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,16.0166666666666,16.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,16.3833333333333,16.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,16.6833333333333,16.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,17.05,17.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,17.35,17.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,17.7166666666666,17.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,18.0166666666666,18.25,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,18.3833333333333,18.6166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,18.6833333333333,18.9166666666666,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,19.05,19.2833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,19.35,19.5833333333333,Tuesday,S Hermsdorf,SHDF01B,4637,8,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,19.7166666666666,19.95,Tuesday,S Hermsdorf,SHDF01B,4637,4,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,20.0166666666666,20.2333333333333,Tuesday,S Hermsdorf,SHDF01B,4637,9,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,20.3833333333333,20.6,Tuesday,S Hermsdorf,SHDF01B,4637,0,4317625,VDL -326,S Hermsdorf,SHDF01B,Tuesday,20.6,21.25,Tuesday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317625,VDL -334,Betriebshof A,BF A E,Tuesday,4.93333333333333,4.93333333333333,Tuesday,Alt-Gatow,ALTG01B,0.06,18,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,5.23333333333333,5.33333333333333,Tuesday,Habichtswald,HWLD01B,3.29,0,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,5.33333333333333,5.4,Tuesday,Alt-Gatow,ALTG01B,2954,20,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,5.73333333333333,5.83333333333333,Tuesday,Habichtswald,HWLD01B,3.29,0,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,5.83333333333333,5.9,Tuesday,Alt-Gatow,ALTG01B,2954,5,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,5.98333333333333,6.1,Tuesday,Habichtswald,HWLD01B,3.29,2,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,6.13333333333333,6.21666666666666,Tuesday,Alt-Gatow,ALTG01B,2954,19,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,6.53333333333333,6.65,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,6.66666666666666,6.75,Tuesday,Alt-Gatow,ALTG01B,2954,7,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,6.86666666666666,6.98333333333333,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,7.0,7.08333333333333,Tuesday,Alt-Gatow,ALTG01B,2954,7,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,7.2,7.31666666666666,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,7.33333333333333,7.41666666666666,Tuesday,Alt-Gatow,ALTG01B,2954,7,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,7.53333333333333,7.65,Tuesday,Habichtswald,HWLD01B,3.29,1,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,7.66666666666666,7.75,Tuesday,Alt-Gatow,ALTG01B,2954,295,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,12.6666666666666,12.7833333333333,Tuesday,Habichtswald,HWLD01B,3.29,2,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,12.8166666666666,12.9,Tuesday,Alt-Gatow,ALTG01B,2954,46,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,13.6666666666666,13.7833333333333,Tuesday,Habichtswald,HWLD01B,3.29,2,4425668,CKB -334,Habichtswald,HWLD01B,Tuesday,13.8166666666666,13.9,Tuesday,Alt-Gatow,ALTG01B,2954,434,4425668,CKB -334,Alt-Gatow,ALTG01B,Tuesday,21.1333333333333,21.1333333333333,Tuesday,Betriebshof A,BF A A,0.06,0,4425668,CKB -349,Betriebshof A,BF A E,Tuesday,7.33333333333333,7.33333333333333,Tuesday,S Grunewald,SGD02B,0.06,0,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,7.33333333333333,7.83333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,8.0,8.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,8.66666666666666,9.16666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,9.33333333333333,9.83333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,10.0,10.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,10.6666666666666,11.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,11.3333333333333,11.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,12.0,12.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,12.6666666666666,13.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,13.3333333333333,13.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,14.0,14.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,14.6666666666666,15.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,15.3333333333333,15.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,16.0,16.5,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,16.6666666666666,17.1666666666666,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,17.3333333333333,17.8333333333333,Tuesday,S Grunewald,SGD02B,9266,10,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,18.0,18.5,Tuesday,S Grunewald,SGD02B,9266,0,4448150,CKB -349,S Grunewald,SGD02B,Tuesday,18.5,18.5,Tuesday,Betriebshof A,BF A A,0.06,0,4448150,CKB -370,Betriebshof A,BF A E,Tuesday,7.16666666666666,7.16666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,7.16666666666666,7.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,7.46666666666666,7.66666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,7.66666666666666,7.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,7.96666666666666,8.16666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,8.16666666666666,8.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,8.46666666666666,8.66666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,8.66666666666666,8.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,8.96666666666666,9.16666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,9.16666666666666,9.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,9.46666666666666,9.66666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,9.66666666666666,9.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,9.96666666666666,10.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,10.1666666666666,10.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,10.4666666666666,10.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,10.6666666666666,10.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,10.9666666666666,11.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,11.1666666666666,11.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,11.4666666666666,11.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,11.6666666666666,11.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,11.9666666666666,12.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,12.1666666666666,12.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,12.4666666666666,12.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,12.6666666666666,12.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,12.9666666666666,13.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,13.1666666666666,13.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,10,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,13.4666666666666,13.6666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,13.6666666666666,13.8,Tuesday,S+U Hermannstr.,SUHM09B,2169,8,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,13.9333333333333,14.1666666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,14.1666666666666,14.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,14.55,14.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,14.8333333333333,14.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,15.2166666666666,15.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,15.5,15.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,15.8833333333333,16.1166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,16.1666666666666,16.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,16.55,16.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,16.8333333333333,16.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,17.2166666666666,17.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,17.5,17.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,13,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,17.8666666666666,18.0833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,5,4733895,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,18.1666666666666,18.3,Tuesday,S+U Hermannstr.,SUHM09B,2169,0,4733895,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,18.3,18.3,Tuesday,Betriebshof A,BF A A,0.06,0,4733895,CKB -370,Betriebshof A,BF A E,Tuesday,14.2166666666666,14.2166666666666,Tuesday,S+U Hermannstr.,SUHM09B,0.06,0,4734200,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,14.2166666666666,14.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,14.5,14.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,14.8833333333333,15.1166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,15.1666666666666,15.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,15.55,15.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,15.8333333333333,15.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,16.2166666666666,16.45,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,16.5,16.65,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,16.8833333333333,17.1166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,17.1666666666666,17.3166666666666,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,17.55,17.7833333333333,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734200,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,17.8333333333333,17.9833333333333,Tuesday,S+U Hermannstr.,SUHM09B,2169,14,4734200,CKB -370,S+U Hermannstr.,SUHM09B,Tuesday,18.2166666666666,18.4166666666666,Tuesday,Neuköllnische Brücke,NKBR04BA,2952,0,4734200,CKB -370,Neuköllnische Brücke,NKBR04BA,Tuesday,18.4166666666666,18.4166666666666,Tuesday,Betriebshof A,BF A A,0.06,0,4734200,CKB -N23,Betriebshof A,BF A E,Wednesday,0.383333333333333,0.383333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,0.06,0,4318157,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,0.383333333333333,0.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB -N39,U Rohrdamm,URDM01B,Wednesday,0.65,0.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB -N39,Mertensstr.,MTNS01B,Wednesday,1.05,1.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB -N23,U Rohrdamm,URDM02B,Wednesday,1.28333333333333,1.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,1.38333333333333,1.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB -N39,U Rohrdamm,URDM01B,Wednesday,1.65,1.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB -N39,Mertensstr.,MTNS01B,Wednesday,2.05,2.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB -N23,U Rohrdamm,URDM02B,Wednesday,2.28333333333333,2.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,2.38333333333333,2.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB -N39,U Rohrdamm,URDM01B,Wednesday,2.65,2.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB -N39,Mertensstr.,MTNS01B,Wednesday,3.05,3.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB -N23,U Rohrdamm,URDM02B,Wednesday,3.28333333333333,3.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,3.38333333333333,3.5,Wednesday,U Rohrdamm,URDM01B,2577,9,4318157,CKB -N39,U Rohrdamm,URDM01B,Wednesday,3.65,3.9,Wednesday,Mertensstr.,MTNS01B,5937,9,4318157,CKB -N39,Mertensstr.,MTNS01B,Wednesday,4.05,4.28333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318157,CKB -N23,U Rohrdamm,URDM02B,Wednesday,4.28333333333333,4.38333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318157,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,4.38333333333333,4.38333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4318157,CKB -N39,Betriebshof A,BF A E,Wednesday,0.55,0.55,Wednesday,Mertensstr.,MTNS01B,0.06,0,4318177,CKB -N39,Mertensstr.,MTNS01B,Wednesday,0.55,0.783333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB -N23,U Rohrdamm,URDM02B,Wednesday,0.783333333333333,0.883333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,0.883333333333333,1.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB -N39,U Rohrdamm,URDM01B,Wednesday,1.15,1.4,Wednesday,Mertensstr.,MTNS01B,5937,9,4318177,CKB -N39,Mertensstr.,MTNS01B,Wednesday,1.55,1.78333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB -N23,U Rohrdamm,URDM02B,Wednesday,1.78333333333333,1.88333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,1.88333333333333,2.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB -N39,U Rohrdamm,URDM01B,Wednesday,2.15,2.4,Wednesday,Mertensstr.,MTNS01B,5937,9,4318177,CKB -N39,Mertensstr.,MTNS01B,Wednesday,2.55,2.78333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB -N23,U Rohrdamm,URDM02B,Wednesday,2.78333333333333,2.88333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,2.88333333333333,3.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB -N39,U Rohrdamm,URDM01B,Wednesday,3.15,3.4,Wednesday,Mertensstr.,MTNS01B,5937,9,4318177,CKB -N39,Mertensstr.,MTNS01B,Wednesday,3.55,3.78333333333333,Wednesday,U Rohrdamm,URDM02B,6.19,0,4318177,CKB -N23,U Rohrdamm,URDM02B,Wednesday,3.78333333333333,3.88333333333333,Wednesday,Mäckeritzwiesen,MAWI01B,2555,0,4318177,CKB -N23,Mäckeritzwiesen,MAWI01B,Wednesday,3.88333333333333,4.0,Wednesday,U Rohrdamm,URDM01B,2577,9,4318177,CKB -N39,U Rohrdamm,URDM01B,Wednesday,4.15,4.4,Wednesday,Mertensstr.,MTNS01B,5937,0,4318177,CKB -N39,Mertensstr.,MTNS01B,Wednesday,4.4,4.4,Wednesday,Betriebshof A,BF A A,0.06,0,4318177,CKB -N35,Betriebshof A,BF A E,Wednesday,0.95,0.95,Wednesday,Alt-Kladow,ALKL02B,0.06,0,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,0.95,1.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,1.1,1.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,1.45,1.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,1.6,1.68333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,1.95,2.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,2.1,2.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,2.45,2.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,2.6,2.68333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,2.95,3.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,3.1,3.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,3.45,3.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,3.6,3.68333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,3.95,4.1,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,4.1,4.18333333333333,Wednesday,Alt-Kladow,ALKL02B,2936,16,4319352,CKB -N35,Alt-Kladow,ALKL02B,Wednesday,4.45,4.6,Wednesday,Gutsstr.,GUTS01B,4343,0,4319352,CKB -N35,Gutsstr.,GUTS01B,Wednesday,4.6,4.6,Wednesday,Betriebshof A,BF A A,0.06,0,4319352,CKB -N52,Betriebshof A,BF A E,Wednesday,0.483333333333333,0.483333333333333,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,0.483333333333333,0.683333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,0.783333333333333,0.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,0.983333333333333,1.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,1.28333333333333,1.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.48333333333333,1.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,1.78333333333333,1.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.98333333333333,2.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,2.28333333333333,2.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.48333333333333,2.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,2.78333333333333,2.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.98333333333333,3.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,3.28333333333333,3.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.48333333333333,3.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,3.78333333333333,3.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.98333333333333,4.18333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,6,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,4.28333333333333,4.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751087,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,4.48333333333333,4.68333333333333,Wednesday,U Osloer Str.,UOSL04B,4481,0,4751087,CKB -N52,U Osloer Str.,UOSL04B,Wednesday,4.68333333333333,4.68333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4751087,CKB -N53,Betriebshof A,BF A E,Wednesday,0.5,0.5,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,0.5,0.733333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,0.733333333333333,0.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.0,1.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,1.23333333333333,1.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,1.5,1.73333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,1.73333333333333,1.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.0,2.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,2.23333333333333,2.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,2.5,2.73333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,2.73333333333333,2.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.0,3.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,3.23333333333333,3.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,3.5,3.73333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,3.73333333333333,3.95,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,4.0,4.23333333333333,Wednesday,Wilhelmsruher Damm,WIDA02B,4801,0,4453545,CKB -N53,Wilhelmsruher Damm,WIDA02B,Wednesday,4.23333333333333,4.45,Wednesday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453545,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Wednesday,4.45,4.45,Wednesday,Betriebshof A,BF A A,0.06,0,4453545,CKB -N56,Betriebshof A,BF A E,Wednesday,0.716666666666666,0.716666666666666,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374467,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,0.716666666666666,1.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374467,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,1.71666666666666,2.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374467,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,2.71666666666666,3.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374467,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,3.71666666666666,4.55,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374467,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,4.55,4.55,Wednesday,Betriebshof A,BF A A,0.06,0,4374467,CKB -N56,Betriebshof A,BF A E,Wednesday,0.216666666666666,0.216666666666666,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374472,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,0.216666666666666,1.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374472,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,1.21666666666666,2.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374472,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,2.21666666666666,3.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374472,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,3.21666666666666,4.05,Wednesday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374472,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Wednesday,4.05,4.05,Wednesday,Betriebshof A,BF A A,0.06,0,4374472,CKB -N58,Betriebshof A,BF A E,Wednesday,0.4,0.4,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456448,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,0.4,0.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB -N58,S Buch,SBU02B,Wednesday,0.866666666666666,1.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456448,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,1.4,1.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB -N58,S Buch,SBU02B,Wednesday,1.86666666666666,2.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456448,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,2.4,2.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB -N58,S Buch,SBU02B,Wednesday,2.86666666666666,3.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456448,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,3.4,3.8,Wednesday,S Buch,SBU02B,11.86,4,4456448,CKB -N58,S Buch,SBU02B,Wednesday,3.86666666666666,4.23333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456448,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,4.23333333333333,4.23333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4456448,CKB -N58,Betriebshof A,BF A E,Wednesday,0.366666666666666,0.366666666666666,Wednesday,S Buch,SBU02B,0.06,0,4456456,CKB -N58,S Buch,SBU02B,Wednesday,0.366666666666666,0.733333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,0.9,1.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB -N58,S Buch,SBU02B,Wednesday,1.36666666666666,1.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,1.9,2.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB -N58,S Buch,SBU02B,Wednesday,2.36666666666666,2.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,2.9,3.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB -N58,S Buch,SBU02B,Wednesday,3.36666666666666,3.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456456,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,3.9,4.3,Wednesday,S Buch,SBU02B,11.86,4,4456456,CKB -N58,S Buch,SBU02B,Wednesday,4.36666666666666,4.73333333333333,Wednesday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456456,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Wednesday,4.73333333333333,4.73333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4456456,CKB -N62,Betriebshof A,BF A E,Wednesday,0.533333333333333,0.533333333333333,Wednesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747650,CKB -N62,Schloßplatz Köpenick,SLPZ02BN,Wednesday,0.533333333333333,0.733333333333333,Wednesday,Wendenschloß,WESC09BA,4212,3,4747650,CKB -N62,Wendenschloß,WESC09BA,Wednesday,0.783333333333333,1.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,1.26666666666666,1.7,Wednesday,Wendenschloß,WESC09BA,12869,5,4747650,CKB -N62,Wendenschloß,WESC09BA,Wednesday,1.78333333333333,2.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,2.26666666666666,2.7,Wednesday,Wendenschloß,WESC09BA,12869,5,4747650,CKB -N62,Wendenschloß,WESC09BA,Wednesday,2.78333333333333,3.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,3.26666666666666,3.7,Wednesday,Wendenschloß,WESC09BA,12869,5,4747650,CKB -N62,Wendenschloß,WESC09BA,Wednesday,3.78333333333333,4.26666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747650,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,4.26666666666666,4.56666666666666,Wednesday,Betriebshof Köpenick,BHKO01BN,9538,0,4747650,CKB -N62,Betriebshof Köpenick,BHKO01BN,Wednesday,4.56666666666666,4.56666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4747650,CKB -N62,Betriebshof A,BF A E,Wednesday,0.283333333333333,0.283333333333333,Wednesday,Wendenschloß,WESC09BA,0.06,0,4747660,CKB -N62,Wendenschloß,WESC09BA,Wednesday,0.283333333333333,0.766666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,0.766666666666666,1.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB -N62,Wendenschloß,WESC09BA,Wednesday,1.28333333333333,1.76666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,1.76666666666666,2.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB -N62,Wendenschloß,WESC09BA,Wednesday,2.28333333333333,2.76666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,2.76666666666666,3.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB -N62,Wendenschloß,WESC09BA,Wednesday,3.28333333333333,3.76666666666666,Wednesday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747660,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Wednesday,3.76666666666666,4.2,Wednesday,Wendenschloß,WESC09BA,12869,5,4747660,CKB -N62,Wendenschloß,WESC09BA,Wednesday,4.28333333333333,4.46666666666666,Wednesday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747660,CKB -N62,Schloßplatz Köpenick,SLPZ03B,Wednesday,4.46666666666666,4.46666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4747660,CKB -N68,Betriebshof A,BF A E,Wednesday,0.816666666666666,0.816666666666666,Wednesday,S Adlershof,SAH02BN,0.06,0,4434341,CKB -N68,S Adlershof,SAH02BN,Wednesday,0.816666666666666,1.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,1.06666666666666,1.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB -N68,S Adlershof,SAH02BN,Wednesday,1.31666666666666,1.56666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,1.56666666666666,1.81666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB -N68,S Adlershof,SAH02BN,Wednesday,1.81666666666666,2.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,2.06666666666666,2.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB -N68,S Adlershof,SAH02BN,Wednesday,2.31666666666666,2.56666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,2.56666666666666,2.81666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB -N68,S Adlershof,SAH02BN,Wednesday,2.81666666666666,3.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,3.06666666666666,3.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB -N68,S Adlershof,SAH02BN,Wednesday,3.31666666666666,3.56666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,3.56666666666666,3.81666666666666,Wednesday,S Adlershof,SAH02BN,11801,0,4434341,CKB -N68,S Adlershof,SAH02BN,Wednesday,3.81666666666666,4.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434341,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Wednesday,4.06666666666666,4.31666666666666,Wednesday,S Adlershof,SAH02BN,11801,23,4434341,CKB -164,S Adlershof,SAH02BN,Wednesday,4.7,5.06666666666666,Wednesday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434341,CKB -164,Kaulsdorfer Str.,KDFS02B,Wednesday,5.06666666666666,5.06666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4434341,CKB -N69,Betriebshof A,BF A E,Wednesday,0.533333333333333,0.533333333333333,Wednesday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434897,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Wednesday,0.533333333333333,0.95,Wednesday,S+U Wuhletal,SUWT02BN,11545,6,4434897,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,1.05,1.76666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434897,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,1.78333333333333,2.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434897,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,2.55,3.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434897,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,3.28333333333333,3.91666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434897,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,4.05,4.46666666666666,Wednesday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434897,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Wednesday,4.46666666666666,4.46666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4434897,CKB -N69,Betriebshof A,BF A E,Wednesday,0.55,0.55,Wednesday,S+U Wuhletal,SUWT02BN,0.06,0,4434902,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,0.55,1.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434902,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,1.28333333333333,1.91666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434902,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,2.05,2.76666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434902,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,2.78333333333333,3.41666666666666,Wednesday,S+U Wuhletal,SUWT02BN,20641,8,4434902,CKB -N69,S+U Wuhletal,SUWT02BN,Wednesday,3.55,4.26666666666666,Wednesday,Odernheimer Str.,ODNH01B,20579,1,4434902,CKB -N69,Odernheimer Str.,ODNH01B,Wednesday,4.28333333333333,4.85,Wednesday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434902,CKB -N69,U Elsterwerdaer Platz,UEWP03B,Wednesday,4.85,4.85,Wednesday,Betriebshof A,BF A A,0.06,0,4434902,CKB -N88,Betriebshof A,BF A E,Wednesday,0.566666666666666,0.566666666666666,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619766,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,0.566666666666666,1.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,1.0,1.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619766,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,1.56666666666666,2.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,2.0,2.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619766,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,2.56666666666666,3.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,3.0,3.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619766,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,3.56666666666666,4.0,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619766,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,4.0,4.45,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619766,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,4.45,4.45,Wednesday,Betriebshof A,BF A A,0.06,0,4619766,CKB -N88,Betriebshof A,BF A E,Wednesday,0.5,0.5,Wednesday,S Lichterfelde Süd,SLIS01B,0.06,0,4619991,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,0.5,0.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,1.06666666666666,1.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,1.5,1.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,2.06666666666666,2.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,2.5,2.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,3.06666666666666,3.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,3.5,3.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619991,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,4.06666666666666,4.5,Wednesday,S Lichterfelde Süd,SLIS01B,9016,0,4619991,CKB -N88,S Lichterfelde Süd,SLIS01B,Wednesday,4.5,4.95,Wednesday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619991,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Wednesday,4.95,4.95,Wednesday,Betriebshof A,BF A A,0.06,0,4619991,CKB -N91,Betriebshof A,BF A E,Wednesday,0.516666666666666,0.516666666666666,Wednesday,S+U Wuhletal,SUWT02BN,0.06,0,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,0.516666666666666,0.733333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,0.733333333333333,0.933333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,1.01666666666666,1.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,1.23333333333333,1.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,1.51666666666666,1.73333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,1.73333333333333,1.93333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,2.01666666666666,2.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,2.23333333333333,2.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,2.51666666666666,2.73333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,2.73333333333333,2.93333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,3.01666666666666,3.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,3.23333333333333,3.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,3.51666666666666,3.73333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,3.73333333333333,3.93333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,5,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,4.01666666666666,4.23333333333333,Wednesday,Boschpoler Str.,BOPO01BN,4872,0,4374744,CKB -N91,Boschpoler Str.,BOPO01BN,Wednesday,4.23333333333333,4.43333333333333,Wednesday,S+U Wuhletal,SUWT02BN,5362,0,4374744,CKB -N91,S+U Wuhletal,SUWT02BN,Wednesday,4.43333333333333,4.43333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4374744,CKB -N95,Betriebshof A,BF A E,Wednesday,0.516666666666666,0.516666666666666,Wednesday,S+U Wuhletal,SUWT02BN,0.06,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,0.516666666666666,0.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,0.783333333333333,1.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,1.01666666666666,1.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,1.28333333333333,1.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,1.51666666666666,1.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,1.78333333333333,2.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,2.01666666666666,2.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,2.28333333333333,2.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,2.51666666666666,2.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,2.78333333333333,3.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,3.01666666666666,3.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,3.28333333333333,3.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,3.51666666666666,3.75,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,3.78333333333333,4.01666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,4.01666666666666,4.25,Wednesday,Riesaer Str.,RIES01BN,5225,2,4374866,CKB -N95,Riesaer Str.,RIES01BN,Wednesday,4.28333333333333,4.51666666666666,Wednesday,S+U Wuhletal,SUWT02BN,7617,0,4374866,CKB -N95,S+U Wuhletal,SUWT02BN,Wednesday,4.51666666666666,4.51666666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4374866,CKB -N97,Betriebshof A,BF A E,Wednesday,0.716666666666666,0.716666666666666,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,0.716666666666666,0.883333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,0.883333333333333,1.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,1.21666666666666,1.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,1.38333333333333,1.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,1.71666666666666,1.88333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,1.88333333333333,2.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,2.21666666666666,2.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,2.38333333333333,2.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,2.71666666666666,2.88333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,2.88333333333333,3.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,3.21666666666666,3.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,3.38333333333333,3.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,3.71666666666666,3.88333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,3.88333333333333,4.05,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,4.21666666666666,4.38333333333333,Wednesday,Barnimplatz,BARN01B,4507,0,4375013,CKB -N97,Barnimplatz,BARN01B,Wednesday,4.38333333333333,4.55,Wednesday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375013,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Wednesday,4.55,4.55,Wednesday,Betriebshof A,BF A A,0.06,0,4375013,CKB -160,Betriebshof A,BF A E,Wednesday,21.5166666666666,21.5166666666666,Wednesday,Hasselwerderstr.,HAWR01B,0.06,0,4454945,CKB -160,Hasselwerderstr.,HAWR01B,Wednesday,21.5166666666666,22.0666666666666,Wednesday,Siriusstr.,SIRI01B,14519,4,4454945,CKB -160,Siriusstr.,SIRI01B,Wednesday,22.1333333333333,22.7166666666666,Wednesday,Hasselwerderstr.,HAWR01B,13541,8,4454945,CKB -160,Hasselwerderstr.,HAWR01B,Wednesday,22.85,23.4,Wednesday,Siriusstr.,SIRI01B,14519,4,4454945,CKB -160,Siriusstr.,SIRI01B,Wednesday,23.4666666666666,24.05,Thursday,Hasselwerderstr.,HAWR01B,13541,8,4454945,CKB -160,Hasselwerderstr.,HAWR01B,Thursday,0.183333333333333,0.733333333333333,Thursday,Siriusstr.,SIRI01B,14519,0,4454945,CKB -N60,Siriusstr.,SIRI01B,Thursday,0.733333333333333,0.9,Thursday,S Adlershof,SAH02BN,4.1,25,4454945,CKB -N60,S Adlershof,SAH02BN,Thursday,1.31666666666666,1.7,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454945,CKB -N60,Flughafen Schönefeld,SXF01B,Thursday,1.8,2.1,Thursday,S Adlershof,SAH02BN,9067,13,4454945,CKB -N60,S Adlershof,SAH02BN,Thursday,2.31666666666666,2.7,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454945,CKB -N60,Flughafen Schönefeld,SXF01B,Thursday,2.8,3.1,Thursday,S Adlershof,SAH02BN,9067,13,4454945,CKB -N60,S Adlershof,SAH02BN,Thursday,3.31666666666666,3.7,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454945,CKB -N60,Flughafen Schönefeld,SXF01B,Thursday,3.8,4.1,Thursday,S Adlershof,SAH02BN,9067,0,4454945,CKB -N60,S Adlershof,SAH02BN,Thursday,4.1,4.1,Thursday,Betriebshof A,BF A A,0.06,0,4454945,CKB -160,Betriebshof A,BF A E,Wednesday,22.1833333333333,22.1833333333333,Wednesday,Hasselwerderstr.,HAWR01B,0.06,0,4454950,CKB -160,Hasselwerderstr.,HAWR01B,Wednesday,22.1833333333333,22.7333333333333,Wednesday,Siriusstr.,SIRI01B,14519,4,4454950,CKB -160,Siriusstr.,SIRI01B,Wednesday,22.8,23.3833333333333,Wednesday,Hasselwerderstr.,HAWR01B,13541,8,4454950,CKB -160,Hasselwerderstr.,HAWR01B,Wednesday,23.5166666666666,24.0666666666666,Thursday,Siriusstr.,SIRI01B,14519,4,4454950,CKB -160,Siriusstr.,SIRI01B,Thursday,0.133333333333333,0.65,Thursday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454950,CKB -N60,S Schöneweide/Sterndamm,SSWS06B,Thursday,0.65,0.783333333333333,Thursday,S Adlershof,SAH02BN,4.0,2,4454950,CKB -N60,S Adlershof,SAH02BN,Thursday,0.816666666666666,1.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454950,CKB -N60,Flughafen Schönefeld,SXF01B,Thursday,1.3,1.6,Thursday,S Adlershof,SAH02BN,9067,13,4454950,CKB -N60,S Adlershof,SAH02BN,Thursday,1.81666666666666,2.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454950,CKB -N60,Flughafen Schönefeld,SXF01B,Thursday,2.3,2.6,Thursday,S Adlershof,SAH02BN,9067,13,4454950,CKB -N60,S Adlershof,SAH02BN,Thursday,2.81666666666666,3.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,6,4454950,CKB -N60,Flughafen Schönefeld,SXF01B,Thursday,3.3,3.6,Thursday,S Adlershof,SAH02BN,9067,13,4454950,CKB -N60,S Adlershof,SAH02BN,Thursday,3.81666666666666,4.2,Thursday,Flughafen Schönefeld,SXF01B,8.36,0,4454950,CKB -N60,Flughafen Schönefeld,SXF01B,Thursday,4.2,4.2,Thursday,Betriebshof A,BF A A,0.06,0,4454950,CKB -161,Betriebshof A,BF A E,Wednesday,21.1,21.1,Wednesday,S Erkner/ZOB,SERZ01B,0.06,0,4664624,CKB -161,S Erkner/ZOB,SERZ01B,Wednesday,21.1,21.5666666666666,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664624,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,21.8833333333333,22.2166666666666,Wednesday,Lutherstr.,LUTH01B,10332,17,4664624,CKB -161,Lutherstr.,LUTH01B,Wednesday,22.5,22.9,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664624,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,23.2166666666666,23.55,Wednesday,Lutherstr.,LUTH01B,10332,17,4664624,CKB -161,Lutherstr.,LUTH01B,Wednesday,23.8333333333333,24.2333333333333,Thursday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664624,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,0.266666666666666,0.383333333333333,Thursday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664624,CKB -N61,Rahnsdorf/Waldschänke,RDWS03BN,Thursday,0.466666666666666,0.733333333333333,Thursday,Dämeritzstr.,DARI01B,6404,3,4664624,CKB -N61,Dämeritzstr.,DARI01B,Thursday,0.783333333333333,1.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,1.28333333333333,1.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4664624,CKB -N61,Dämeritzstr.,DARI01B,Thursday,1.78333333333333,2.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,2.28333333333333,2.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4664624,CKB -N61,Dämeritzstr.,DARI01B,Thursday,2.78333333333333,3.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,3.28333333333333,3.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4664624,CKB -N61,Dämeritzstr.,DARI01B,Thursday,3.78333333333333,4.16666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4664624,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,4.28333333333333,4.73333333333333,Thursday,Dämeritzstr.,DARI01B,12007,0,4664624,CKB -N61,Dämeritzstr.,DARI01B,Thursday,4.73333333333333,4.73333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4664624,CKB -161,Betriebshof A,BF A E,Wednesday,20.4333333333333,20.4333333333333,Wednesday,S Erkner/ZOB,SERZ01B,0.06,0,4762734,CKB -161,S Erkner/ZOB,SERZ01B,Wednesday,20.4333333333333,20.9333333333333,Wednesday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762734,CKB -161,"Schöneiche, Goethepark",SEGP01BA,Wednesday,21.1666666666666,21.6333333333333,Wednesday,S Erkner/ZOB,SERZ01B,13.19,8,4762734,CKB -161,S Erkner/ZOB,SERZ01B,Wednesday,21.7666666666666,22.2333333333333,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762734,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,22.55,22.8833333333333,Wednesday,Lutherstr.,LUTH01B,10332,17,4762734,CKB -161,Lutherstr.,LUTH01B,Wednesday,23.1666666666666,23.5666666666666,Wednesday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762734,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Wednesday,23.8833333333333,24.2166666666666,Thursday,Lutherstr.,LUTH01B,10332,2,4762734,CKB -161,Lutherstr.,LUTH01B,Thursday,0.25,0.266666666666666,Thursday,Dämeritzstr.,DARI01B,506,1,4762734,CKB -N61,Dämeritzstr.,DARI01B,Thursday,0.283333333333333,0.666666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,0.783333333333333,1.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB -N61,Dämeritzstr.,DARI01B,Thursday,1.28333333333333,1.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,1.78333333333333,2.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB -N61,Dämeritzstr.,DARI01B,Thursday,2.28333333333333,2.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,2.78333333333333,3.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB -N61,Dämeritzstr.,DARI01B,Thursday,3.28333333333333,3.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,7,4762734,CKB -N61,S Friedrichshagen,SFHG05BN,Thursday,3.78333333333333,4.23333333333333,Thursday,Dämeritzstr.,DARI01B,12007,3,4762734,CKB -N61,Dämeritzstr.,DARI01B,Thursday,4.28333333333333,4.66666666666666,Thursday,S Friedrichshagen,SFHG05BN,10579,3,4762734,CKB -N67,S Friedrichshagen,SFHG05BN,Thursday,4.71666666666666,4.96666666666666,Thursday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762734,CKB -N67,Schloßplatz Köpenick,SLPZ01BN,Thursday,4.96666666666666,4.96666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4762734,CKB -163,Betriebshof A,BF A E,Wednesday,22.9333333333333,22.9333333333333,Wednesday,S Grünau,SGA24BA,0.06,0,4617415,CKB -163,S Grünau,SGA24BA,Wednesday,22.9333333333333,23.1333333333333,Wednesday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617415,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Wednesday,23.1833333333333,23.4166666666666,Wednesday,S Grünau,SGA22BA,6232,0,4617415,CKB -163,S Grünau,SGA22BA,Wednesday,23.4166666666666,23.6333333333333,Wednesday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617415,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Wednesday,23.6833333333333,23.9166666666666,Wednesday,S Grünau,SGA22BA,6232,0,4617415,CKB -163,S Grünau,SGA22BA,Wednesday,23.9166666666666,24.1333333333333,Thursday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617415,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Thursday,0.133333333333333,0.133333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4617415,CKB -168,Betriebshof A,BF A E,Wednesday,5.08333333333333,5.08333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,5.08333333333333,5.23333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,5.23333333333333,5.38333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,5.41666666666666,5.56666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,5.56666666666666,5.71666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,23,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,6.1,6.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,6.25,6.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,6.43333333333333,6.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,6.58333333333333,6.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,6.76666666666666,6.91666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,6.91666666666666,7.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,7.1,7.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,7.25,7.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,7.43333333333333,7.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,7.58333333333333,7.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,8.1,8.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,8.25,8.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,8.43333333333333,8.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,8.58333333333333,8.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,8.76666666666666,8.91666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,8.91666666666666,9.06666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,9.1,9.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,9.25,9.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,9.43333333333333,9.58333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,9.58333333333333,9.73333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,10.1,10.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,10.25,10.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,10.4333333333333,10.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,10.5833333333333,10.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,10.7666666666666,10.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,10.9166666666666,11.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,11.1,11.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,11.25,11.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,11.4333333333333,11.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,11.5833333333333,11.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,12.1,12.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,12.25,12.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,12.4333333333333,12.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,12.5833333333333,12.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,12.7666666666666,12.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,12.9166666666666,13.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,13.1,13.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,13.25,13.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,13.4333333333333,13.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,13.5833333333333,13.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,13.7666666666666,13.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,13.9166666666666,14.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,14.1,14.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,14.25,14.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,14.7666666666666,14.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,14.9166666666666,15.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,15.1,15.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,15.25,15.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,15.4333333333333,15.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,15.5833333333333,15.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,16.1,16.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,16.25,16.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,16.4333333333333,16.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,16.5833333333333,16.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,16.7666666666666,16.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,16.9166666666666,17.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,17.1,17.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,17.25,17.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,17.4333333333333,17.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,17.5833333333333,17.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,18.1,18.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,18.25,18.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,18.4333333333333,18.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,18.5833333333333,18.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,18.7666666666666,18.9166666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,18.9166666666666,19.0666666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,19.1,19.25,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,19.25,19.4,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,19.4333333333333,19.5833333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,19.5833333333333,19.7333333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,21,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,20.0833333333333,20.2333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,20.2333333333333,20.3833333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,20.4166666666666,20.5666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,20.5666666666666,20.7166666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,20.75,20.9,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,20.9,21.05,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,21.0833333333333,21.2333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,21.2333333333333,21.3833333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,21.4166666666666,21.5666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,21.5666666666666,21.7166666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,22,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,22.0833333333333,22.2333333333333,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,22.2333333333333,22.3833333333333,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,22.4166666666666,22.5666666666666,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,22.5666666666666,22.7166666666666,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,2,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,22.75,22.9,Wednesday,Moßkopfring,MKFR01B,4781,0,4426846,CKB -168,Moßkopfring,MKFR01B,Wednesday,22.9,23.05,Wednesday,Alt-Schmöckwitz,ALSW02B,5139,0,4426846,CKB -168,Alt-Schmöckwitz,ALSW02B,Wednesday,23.05,23.05,Wednesday,Betriebshof A,BF A A,0.06,0,4426846,CKB -269,Betriebshof A,BF A E,Thursday,0.1,0.1,Thursday,S Kaulsdorf,SKD05B,0.06,0,4708596,CKB -269,S Kaulsdorf,SKD05B,Thursday,0.1,0.45,Thursday,S Köpenick,SKOE01B,7827,0,4708596,CKB -N69,S Köpenick,SKOE01B,Thursday,0.45,0.8,Thursday,Odernheimer Str.,ODNH01B,11079,0,4708596,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,0.8,1.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4708596,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,1.55,2.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4708596,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,2.28333333333333,2.91666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4708596,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,3.05,3.76666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4708596,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,3.78333333333333,4.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,0,4708596,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,4.41666666666666,4.41666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4708596,CKB -326,Betriebshof Indira-Gandhi-Str.,BF I E,Wednesday,5.25,6.01666666666666,Wednesday,S Hermsdorf,SHDF01B,17.9,0,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,6.01666666666666,6.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,6.38333333333333,6.61666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,6.68333333333333,6.91666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,7.05,7.28333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,7.35,7.58333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,7.71666666666666,7.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,8.01666666666666,8.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,8.38333333333333,8.61666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,8.68333333333333,8.91666666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,9.05,9.28333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,9.35,9.58333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,9.71666666666666,9.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,10.0166666666666,10.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,10.3833333333333,10.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,10.6833333333333,10.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,11.05,11.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,11.35,11.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,11.7166666666666,11.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,12.0166666666666,12.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,12.3833333333333,12.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,12.6833333333333,12.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,13.05,13.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,13.35,13.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,13.7166666666666,13.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,14.0166666666666,14.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,14.3833333333333,14.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,14.6833333333333,14.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,15.05,15.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,15.35,15.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,15.7166666666666,15.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,16.0166666666666,16.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,16.3833333333333,16.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,16.6833333333333,16.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,17.05,17.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,17.35,17.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,17.7166666666666,17.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,18.0166666666666,18.25,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,18.3833333333333,18.6166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,18.6833333333333,18.9166666666666,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,19.05,19.2833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,19.35,19.5833333333333,Wednesday,S Hermsdorf,SHDF01B,4637,8,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,19.7166666666666,19.95,Wednesday,S Hermsdorf,SHDF01B,4637,4,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,20.0166666666666,20.2333333333333,Wednesday,S Hermsdorf,SHDF01B,4637,9,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,20.3833333333333,20.6,Wednesday,S Hermsdorf,SHDF01B,4637,0,4317626,VDL -326,S Hermsdorf,SHDF01B,Wednesday,20.6,21.25,Wednesday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317626,VDL -334,Betriebshof A,BF A E,Wednesday,4.93333333333333,4.93333333333333,Wednesday,Alt-Gatow,ALTG01B,0.06,18,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,5.23333333333333,5.33333333333333,Wednesday,Habichtswald,HWLD01B,3.29,0,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,5.33333333333333,5.4,Wednesday,Alt-Gatow,ALTG01B,2954,20,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,5.73333333333333,5.83333333333333,Wednesday,Habichtswald,HWLD01B,3.29,0,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,5.83333333333333,5.9,Wednesday,Alt-Gatow,ALTG01B,2954,5,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,5.98333333333333,6.1,Wednesday,Habichtswald,HWLD01B,3.29,2,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,6.13333333333333,6.21666666666666,Wednesday,Alt-Gatow,ALTG01B,2954,19,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,6.53333333333333,6.65,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,6.66666666666666,6.75,Wednesday,Alt-Gatow,ALTG01B,2954,7,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,6.86666666666666,6.98333333333333,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,7.0,7.08333333333333,Wednesday,Alt-Gatow,ALTG01B,2954,7,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,7.2,7.31666666666666,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,7.33333333333333,7.41666666666666,Wednesday,Alt-Gatow,ALTG01B,2954,7,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,7.53333333333333,7.65,Wednesday,Habichtswald,HWLD01B,3.29,1,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,7.66666666666666,7.75,Wednesday,Alt-Gatow,ALTG01B,2954,295,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,12.6666666666666,12.7833333333333,Wednesday,Habichtswald,HWLD01B,3.29,2,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,12.8166666666666,12.9,Wednesday,Alt-Gatow,ALTG01B,2954,46,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,13.6666666666666,13.7833333333333,Wednesday,Habichtswald,HWLD01B,3.29,2,4425669,CKB -334,Habichtswald,HWLD01B,Wednesday,13.8166666666666,13.9,Wednesday,Alt-Gatow,ALTG01B,2954,434,4425669,CKB -334,Alt-Gatow,ALTG01B,Wednesday,21.1333333333333,21.1333333333333,Wednesday,Betriebshof A,BF A A,0.06,0,4425669,CKB -349,Betriebshof A,BF A E,Wednesday,7.33333333333333,7.33333333333333,Wednesday,S Grunewald,SGD02B,0.06,0,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,7.33333333333333,7.83333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,8.0,8.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,8.66666666666666,9.16666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,9.33333333333333,9.83333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,10.0,10.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,10.6666666666666,11.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,11.3333333333333,11.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,12.0,12.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,12.6666666666666,13.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,13.3333333333333,13.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,14.0,14.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,14.6666666666666,15.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,15.3333333333333,15.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,16.0,16.5,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,16.6666666666666,17.1666666666666,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,17.3333333333333,17.8333333333333,Wednesday,S Grunewald,SGD02B,9266,10,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,18.0,18.5,Wednesday,S Grunewald,SGD02B,9266,0,4448151,CKB -349,S Grunewald,SGD02B,Wednesday,18.5,18.5,Wednesday,Betriebshof A,BF A A,0.06,0,4448151,CKB -370,Betriebshof A,BF A E,Wednesday,7.16666666666666,7.16666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,7.16666666666666,7.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,7.46666666666666,7.66666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,7.66666666666666,7.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,7.96666666666666,8.16666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,8.16666666666666,8.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,8.46666666666666,8.66666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,8.66666666666666,8.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,8.96666666666666,9.16666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,9.16666666666666,9.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,9.46666666666666,9.66666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,9.66666666666666,9.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,9.96666666666666,10.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,10.1666666666666,10.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,10.4666666666666,10.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,10.6666666666666,10.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,10.9666666666666,11.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,11.1666666666666,11.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,11.4666666666666,11.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,11.6666666666666,11.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,11.9666666666666,12.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,12.1666666666666,12.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,12.4666666666666,12.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,12.6666666666666,12.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,12.9666666666666,13.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,13.1666666666666,13.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,10,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,13.4666666666666,13.6666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,13.6666666666666,13.8,Wednesday,S+U Hermannstr.,SUHM09B,2169,8,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,13.9333333333333,14.1666666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,14.1666666666666,14.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,14.55,14.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,14.8333333333333,14.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,15.2166666666666,15.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,15.5,15.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,15.8833333333333,16.1166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,16.1666666666666,16.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,16.55,16.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,16.8333333333333,16.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,17.2166666666666,17.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,17.5,17.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,13,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,17.8666666666666,18.0833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,5,4733896,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,18.1666666666666,18.3,Wednesday,S+U Hermannstr.,SUHM09B,2169,0,4733896,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,18.3,18.3,Wednesday,Betriebshof A,BF A A,0.06,0,4733896,CKB -370,Betriebshof A,BF A E,Wednesday,14.2166666666666,14.2166666666666,Wednesday,S+U Hermannstr.,SUHM09B,0.06,0,4734201,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,14.2166666666666,14.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,14.5,14.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,14.8833333333333,15.1166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,15.1666666666666,15.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,15.55,15.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,15.8333333333333,15.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,16.2166666666666,16.45,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,16.5,16.65,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,16.8833333333333,17.1166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,17.1666666666666,17.3166666666666,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,17.55,17.7833333333333,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,3,4734201,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,17.8333333333333,17.9833333333333,Wednesday,S+U Hermannstr.,SUHM09B,2169,14,4734201,CKB -370,S+U Hermannstr.,SUHM09B,Wednesday,18.2166666666666,18.4166666666666,Wednesday,Neuköllnische Brücke,NKBR04BA,2952,0,4734201,CKB -370,Neuköllnische Brücke,NKBR04BA,Wednesday,18.4166666666666,18.4166666666666,Wednesday,Betriebshof A,BF A A,0.06,0,4734201,CKB -N23,Betriebshof A,BF A E,Thursday,0.383333333333333,0.383333333333333,Thursday,Mäckeritzwiesen,MAWI01B,0.06,0,4318158,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,0.383333333333333,0.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB -N39,U Rohrdamm,URDM01B,Thursday,0.65,0.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB -N39,Mertensstr.,MTNS01B,Thursday,1.05,1.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB -N23,U Rohrdamm,URDM02B,Thursday,1.28333333333333,1.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,1.38333333333333,1.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB -N39,U Rohrdamm,URDM01B,Thursday,1.65,1.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB -N39,Mertensstr.,MTNS01B,Thursday,2.05,2.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB -N23,U Rohrdamm,URDM02B,Thursday,2.28333333333333,2.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,2.38333333333333,2.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB -N39,U Rohrdamm,URDM01B,Thursday,2.65,2.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB -N39,Mertensstr.,MTNS01B,Thursday,3.05,3.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB -N23,U Rohrdamm,URDM02B,Thursday,3.28333333333333,3.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,3.38333333333333,3.5,Thursday,U Rohrdamm,URDM01B,2577,9,4318158,CKB -N39,U Rohrdamm,URDM01B,Thursday,3.65,3.9,Thursday,Mertensstr.,MTNS01B,5937,9,4318158,CKB -N39,Mertensstr.,MTNS01B,Thursday,4.05,4.28333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318158,CKB -N23,U Rohrdamm,URDM02B,Thursday,4.28333333333333,4.38333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318158,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,4.38333333333333,4.38333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4318158,CKB -N39,Betriebshof A,BF A E,Thursday,0.55,0.55,Thursday,Mertensstr.,MTNS01B,0.06,0,4318178,CKB -N39,Mertensstr.,MTNS01B,Thursday,0.55,0.783333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB -N23,U Rohrdamm,URDM02B,Thursday,0.783333333333333,0.883333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,0.883333333333333,1.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB -N39,U Rohrdamm,URDM01B,Thursday,1.15,1.4,Thursday,Mertensstr.,MTNS01B,5937,9,4318178,CKB -N39,Mertensstr.,MTNS01B,Thursday,1.55,1.78333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB -N23,U Rohrdamm,URDM02B,Thursday,1.78333333333333,1.88333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,1.88333333333333,2.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB -N39,U Rohrdamm,URDM01B,Thursday,2.15,2.4,Thursday,Mertensstr.,MTNS01B,5937,9,4318178,CKB -N39,Mertensstr.,MTNS01B,Thursday,2.55,2.78333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB -N23,U Rohrdamm,URDM02B,Thursday,2.78333333333333,2.88333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,2.88333333333333,3.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB -N39,U Rohrdamm,URDM01B,Thursday,3.15,3.4,Thursday,Mertensstr.,MTNS01B,5937,9,4318178,CKB -N39,Mertensstr.,MTNS01B,Thursday,3.55,3.78333333333333,Thursday,U Rohrdamm,URDM02B,6.19,0,4318178,CKB -N23,U Rohrdamm,URDM02B,Thursday,3.78333333333333,3.88333333333333,Thursday,Mäckeritzwiesen,MAWI01B,2555,0,4318178,CKB -N23,Mäckeritzwiesen,MAWI01B,Thursday,3.88333333333333,4.0,Thursday,U Rohrdamm,URDM01B,2577,9,4318178,CKB -N39,U Rohrdamm,URDM01B,Thursday,4.15,4.4,Thursday,Mertensstr.,MTNS01B,5937,0,4318178,CKB -N39,Mertensstr.,MTNS01B,Thursday,4.4,4.4,Thursday,Betriebshof A,BF A A,0.06,0,4318178,CKB -N35,Betriebshof A,BF A E,Thursday,0.95,0.95,Thursday,Alt-Kladow,ALKL02B,0.06,0,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,0.95,1.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,1.1,1.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,1.45,1.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,1.6,1.68333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,1.95,2.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,2.1,2.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,2.45,2.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,2.6,2.68333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,2.95,3.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,3.1,3.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,3.45,3.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,3.6,3.68333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,3.95,4.1,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,4.1,4.18333333333333,Thursday,Alt-Kladow,ALKL02B,2936,16,4319353,CKB -N35,Alt-Kladow,ALKL02B,Thursday,4.45,4.6,Thursday,Gutsstr.,GUTS01B,4343,0,4319353,CKB -N35,Gutsstr.,GUTS01B,Thursday,4.6,4.6,Thursday,Betriebshof A,BF A A,0.06,0,4319353,CKB -N52,Betriebshof A,BF A E,Thursday,0.483333333333333,0.483333333333333,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,0.483333333333333,0.683333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,0.783333333333333,0.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,0.983333333333333,1.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,1.28333333333333,1.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.48333333333333,1.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,1.78333333333333,1.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.98333333333333,2.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,2.28333333333333,2.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.48333333333333,2.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,2.78333333333333,2.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.98333333333333,3.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,3.28333333333333,3.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.48333333333333,3.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,3.78333333333333,3.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.98333333333333,4.18333333333333,Thursday,U Osloer Str.,UOSL04B,4481,6,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,4.28333333333333,4.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751088,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,4.48333333333333,4.68333333333333,Thursday,U Osloer Str.,UOSL04B,4481,0,4751088,CKB -N52,U Osloer Str.,UOSL04B,Thursday,4.68333333333333,4.68333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4751088,CKB -N53,Betriebshof A,BF A E,Thursday,0.5,0.5,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,0.5,0.733333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,0.733333333333333,0.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.0,1.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,1.23333333333333,1.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,1.5,1.73333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,1.73333333333333,1.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.0,2.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,2.23333333333333,2.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,2.5,2.73333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,2.73333333333333,2.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.0,3.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,3.23333333333333,3.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,3.5,3.73333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,3.73333333333333,3.95,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,4.0,4.23333333333333,Thursday,Wilhelmsruher Damm,WIDA02B,4801,0,4453546,CKB -N53,Wilhelmsruher Damm,WIDA02B,Thursday,4.23333333333333,4.45,Thursday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453546,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Thursday,4.45,4.45,Thursday,Betriebshof A,BF A A,0.06,0,4453546,CKB -N56,Betriebshof A,BF A E,Thursday,0.716666666666666,0.716666666666666,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374468,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,0.716666666666666,1.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374468,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,1.71666666666666,2.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374468,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,2.71666666666666,3.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374468,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,3.71666666666666,4.55,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374468,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,4.55,4.55,Thursday,Betriebshof A,BF A A,0.06,0,4374468,CKB -N56,Betriebshof A,BF A E,Thursday,0.216666666666666,0.216666666666666,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374473,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,0.216666666666666,1.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374473,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,1.21666666666666,2.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374473,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,2.21666666666666,3.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374473,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,3.21666666666666,4.05,Thursday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374473,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Thursday,4.05,4.05,Thursday,Betriebshof A,BF A A,0.06,0,4374473,CKB -N58,Betriebshof A,BF A E,Thursday,0.4,0.4,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456449,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,0.4,0.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB -N58,S Buch,SBU02B,Thursday,0.866666666666666,1.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456449,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,1.4,1.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB -N58,S Buch,SBU02B,Thursday,1.86666666666666,2.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456449,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,2.4,2.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB -N58,S Buch,SBU02B,Thursday,2.86666666666666,3.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456449,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,3.4,3.8,Thursday,S Buch,SBU02B,11.86,4,4456449,CKB -N58,S Buch,SBU02B,Thursday,3.86666666666666,4.23333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456449,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,4.23333333333333,4.23333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4456449,CKB -N58,Betriebshof A,BF A E,Thursday,0.366666666666666,0.366666666666666,Thursday,S Buch,SBU02B,0.06,0,4456457,CKB -N58,S Buch,SBU02B,Thursday,0.366666666666666,0.733333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,0.9,1.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB -N58,S Buch,SBU02B,Thursday,1.36666666666666,1.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,1.9,2.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB -N58,S Buch,SBU02B,Thursday,2.36666666666666,2.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,2.9,3.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB -N58,S Buch,SBU02B,Thursday,3.36666666666666,3.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456457,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,3.9,4.3,Thursday,S Buch,SBU02B,11.86,4,4456457,CKB -N58,S Buch,SBU02B,Thursday,4.36666666666666,4.73333333333333,Thursday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456457,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Thursday,4.73333333333333,4.73333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4456457,CKB -N62,Betriebshof A,BF A E,Thursday,0.533333333333333,0.533333333333333,Thursday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747651,CKB -N62,Schloßplatz Köpenick,SLPZ02BN,Thursday,0.533333333333333,0.733333333333333,Thursday,Wendenschloß,WESC09BA,4212,3,4747651,CKB -N62,Wendenschloß,WESC09BA,Thursday,0.783333333333333,1.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,1.26666666666666,1.7,Thursday,Wendenschloß,WESC09BA,12869,5,4747651,CKB -N62,Wendenschloß,WESC09BA,Thursday,1.78333333333333,2.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,2.26666666666666,2.7,Thursday,Wendenschloß,WESC09BA,12869,5,4747651,CKB -N62,Wendenschloß,WESC09BA,Thursday,2.78333333333333,3.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,3.26666666666666,3.7,Thursday,Wendenschloß,WESC09BA,12869,5,4747651,CKB -N62,Wendenschloß,WESC09BA,Thursday,3.78333333333333,4.26666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747651,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,4.26666666666666,4.56666666666666,Thursday,Betriebshof Köpenick,BHKO01BN,9538,0,4747651,CKB -N62,Betriebshof Köpenick,BHKO01BN,Thursday,4.56666666666666,4.56666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4747651,CKB -N62,Betriebshof A,BF A E,Thursday,0.283333333333333,0.283333333333333,Thursday,Wendenschloß,WESC09BA,0.06,0,4747661,CKB -N62,Wendenschloß,WESC09BA,Thursday,0.283333333333333,0.766666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,0.766666666666666,1.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB -N62,Wendenschloß,WESC09BA,Thursday,1.28333333333333,1.76666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,1.76666666666666,2.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB -N62,Wendenschloß,WESC09BA,Thursday,2.28333333333333,2.76666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,2.76666666666666,3.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB -N62,Wendenschloß,WESC09BA,Thursday,3.28333333333333,3.76666666666666,Thursday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747661,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Thursday,3.76666666666666,4.2,Thursday,Wendenschloß,WESC09BA,12869,5,4747661,CKB -N62,Wendenschloß,WESC09BA,Thursday,4.28333333333333,4.46666666666666,Thursday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747661,CKB -N62,Schloßplatz Köpenick,SLPZ03B,Thursday,4.46666666666666,4.46666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4747661,CKB -N68,Betriebshof A,BF A E,Thursday,0.816666666666666,0.816666666666666,Thursday,S Adlershof,SAH02BN,0.06,0,4434342,CKB -N68,S Adlershof,SAH02BN,Thursday,0.816666666666666,1.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Thursday,1.06666666666666,1.31666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB -N68,S Adlershof,SAH02BN,Thursday,1.31666666666666,1.56666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Thursday,1.56666666666666,1.81666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB -N68,S Adlershof,SAH02BN,Thursday,1.81666666666666,2.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Thursday,2.06666666666666,2.31666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB -N68,S Adlershof,SAH02BN,Thursday,2.31666666666666,2.56666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Thursday,2.56666666666666,2.81666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB -N68,S Adlershof,SAH02BN,Thursday,2.81666666666666,3.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Thursday,3.06666666666666,3.31666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB -N68,S Adlershof,SAH02BN,Thursday,3.31666666666666,3.56666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Thursday,3.56666666666666,3.81666666666666,Thursday,S Adlershof,SAH02BN,11801,0,4434342,CKB -N68,S Adlershof,SAH02BN,Thursday,3.81666666666666,4.06666666666666,Thursday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434342,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Thursday,4.06666666666666,4.31666666666666,Thursday,S Adlershof,SAH02BN,11801,23,4434342,CKB -164,S Adlershof,SAH02BN,Thursday,4.7,5.06666666666666,Thursday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434342,CKB -164,Kaulsdorfer Str.,KDFS02B,Thursday,5.06666666666666,5.06666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4434342,CKB -N69,Betriebshof A,BF A E,Thursday,0.533333333333333,0.533333333333333,Thursday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434898,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Thursday,0.533333333333333,0.95,Thursday,S+U Wuhletal,SUWT02BN,11545,6,4434898,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,1.05,1.76666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434898,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,1.78333333333333,2.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434898,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,2.55,3.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434898,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,3.28333333333333,3.91666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434898,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,4.05,4.46666666666666,Thursday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434898,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Thursday,4.46666666666666,4.46666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4434898,CKB -N69,Betriebshof A,BF A E,Thursday,0.55,0.55,Thursday,S+U Wuhletal,SUWT02BN,0.06,0,4434903,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,0.55,1.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434903,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,1.28333333333333,1.91666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434903,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,2.05,2.76666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434903,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,2.78333333333333,3.41666666666666,Thursday,S+U Wuhletal,SUWT02BN,20641,8,4434903,CKB -N69,S+U Wuhletal,SUWT02BN,Thursday,3.55,4.26666666666666,Thursday,Odernheimer Str.,ODNH01B,20579,1,4434903,CKB -N69,Odernheimer Str.,ODNH01B,Thursday,4.28333333333333,4.85,Thursday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434903,CKB -N69,U Elsterwerdaer Platz,UEWP03B,Thursday,4.85,4.85,Thursday,Betriebshof A,BF A A,0.06,0,4434903,CKB -N88,Betriebshof A,BF A E,Thursday,0.566666666666666,0.566666666666666,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619767,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,0.566666666666666,1.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,1.0,1.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619767,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,1.56666666666666,2.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,2.0,2.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619767,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,2.56666666666666,3.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,3.0,3.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619767,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,3.56666666666666,4.0,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619767,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,4.0,4.45,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619767,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,4.45,4.45,Thursday,Betriebshof A,BF A A,0.06,0,4619767,CKB -N88,Betriebshof A,BF A E,Thursday,0.5,0.5,Thursday,S Lichterfelde Süd,SLIS01B,0.06,0,4619992,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,0.5,0.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,1.06666666666666,1.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,1.5,1.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,2.06666666666666,2.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,2.5,2.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,3.06666666666666,3.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,3.5,3.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619992,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,4.06666666666666,4.5,Thursday,S Lichterfelde Süd,SLIS01B,9016,0,4619992,CKB -N88,S Lichterfelde Süd,SLIS01B,Thursday,4.5,4.95,Thursday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619992,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Thursday,4.95,4.95,Thursday,Betriebshof A,BF A A,0.06,0,4619992,CKB -N91,Betriebshof A,BF A E,Thursday,0.516666666666666,0.516666666666666,Thursday,S+U Wuhletal,SUWT02BN,0.06,0,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,0.516666666666666,0.733333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,0.733333333333333,0.933333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,1.01666666666666,1.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,1.23333333333333,1.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,1.51666666666666,1.73333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,1.73333333333333,1.93333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,2.01666666666666,2.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,2.23333333333333,2.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,2.51666666666666,2.73333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,2.73333333333333,2.93333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,3.01666666666666,3.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,3.23333333333333,3.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,3.51666666666666,3.73333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,3.73333333333333,3.93333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,5,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,4.01666666666666,4.23333333333333,Thursday,Boschpoler Str.,BOPO01BN,4872,0,4374745,CKB -N91,Boschpoler Str.,BOPO01BN,Thursday,4.23333333333333,4.43333333333333,Thursday,S+U Wuhletal,SUWT02BN,5362,0,4374745,CKB -N91,S+U Wuhletal,SUWT02BN,Thursday,4.43333333333333,4.43333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4374745,CKB -N95,Betriebshof A,BF A E,Thursday,0.516666666666666,0.516666666666666,Thursday,S+U Wuhletal,SUWT02BN,0.06,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,0.516666666666666,0.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,0.783333333333333,1.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,1.01666666666666,1.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,1.28333333333333,1.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,1.51666666666666,1.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,1.78333333333333,2.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,2.01666666666666,2.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,2.28333333333333,2.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,2.51666666666666,2.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,2.78333333333333,3.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,3.01666666666666,3.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,3.28333333333333,3.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,3.51666666666666,3.75,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,3.78333333333333,4.01666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,4.01666666666666,4.25,Thursday,Riesaer Str.,RIES01BN,5225,2,4374868,CKB -N95,Riesaer Str.,RIES01BN,Thursday,4.28333333333333,4.51666666666666,Thursday,S+U Wuhletal,SUWT02BN,7617,0,4374868,CKB -N95,S+U Wuhletal,SUWT02BN,Thursday,4.51666666666666,4.51666666666666,Thursday,Betriebshof A,BF A A,0.06,0,4374868,CKB -N97,Betriebshof A,BF A E,Thursday,0.716666666666666,0.716666666666666,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,0.716666666666666,0.883333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,0.883333333333333,1.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,1.21666666666666,1.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,1.38333333333333,1.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,1.71666666666666,1.88333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,1.88333333333333,2.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,2.21666666666666,2.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,2.38333333333333,2.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,2.71666666666666,2.88333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,2.88333333333333,3.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,3.21666666666666,3.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,3.38333333333333,3.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,3.71666666666666,3.88333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,3.88333333333333,4.05,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,4.21666666666666,4.38333333333333,Thursday,Barnimplatz,BARN01B,4507,0,4375014,CKB -N97,Barnimplatz,BARN01B,Thursday,4.38333333333333,4.55,Thursday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375014,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Thursday,4.55,4.55,Thursday,Betriebshof A,BF A A,0.06,0,4375014,CKB -160,Betriebshof A,BF A E,Thursday,21.5166666666666,21.5166666666666,Thursday,Hasselwerderstr.,HAWR01B,0.06,0,4454946,CKB -160,Hasselwerderstr.,HAWR01B,Thursday,21.5166666666666,22.0666666666666,Thursday,Siriusstr.,SIRI01B,14519,4,4454946,CKB -160,Siriusstr.,SIRI01B,Thursday,22.1333333333333,22.7166666666666,Thursday,Hasselwerderstr.,HAWR01B,13541,8,4454946,CKB -160,Hasselwerderstr.,HAWR01B,Thursday,22.85,23.4,Thursday,Siriusstr.,SIRI01B,14519,4,4454946,CKB -160,Siriusstr.,SIRI01B,Thursday,23.4666666666666,24.05,Friday,Hasselwerderstr.,HAWR01B,13541,8,4454946,CKB -160,Hasselwerderstr.,HAWR01B,Friday,0.183333333333333,0.733333333333333,Friday,Siriusstr.,SIRI01B,14519,0,4454946,CKB -N60,Siriusstr.,SIRI01B,Friday,0.733333333333333,0.9,Friday,S Adlershof,SAH02BN,4.1,25,4454946,CKB -N60,S Adlershof,SAH02BN,Friday,1.31666666666666,1.7,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454946,CKB -N60,Flughafen Schönefeld,SXF01B,Friday,1.8,2.1,Friday,S Adlershof,SAH02BN,9067,13,4454946,CKB -N60,S Adlershof,SAH02BN,Friday,2.31666666666666,2.7,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454946,CKB -N60,Flughafen Schönefeld,SXF01B,Friday,2.8,3.1,Friday,S Adlershof,SAH02BN,9067,13,4454946,CKB -N60,S Adlershof,SAH02BN,Friday,3.31666666666666,3.7,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454946,CKB -N60,Flughafen Schönefeld,SXF01B,Friday,3.8,4.1,Friday,S Adlershof,SAH02BN,9067,0,4454946,CKB -N60,S Adlershof,SAH02BN,Friday,4.1,4.1,Friday,Betriebshof A,BF A A,0.06,0,4454946,CKB -160,Betriebshof A,BF A E,Thursday,22.1833333333333,22.1833333333333,Thursday,Hasselwerderstr.,HAWR01B,0.06,0,4454951,CKB -160,Hasselwerderstr.,HAWR01B,Thursday,22.1833333333333,22.7333333333333,Thursday,Siriusstr.,SIRI01B,14519,4,4454951,CKB -160,Siriusstr.,SIRI01B,Thursday,22.8,23.3833333333333,Thursday,Hasselwerderstr.,HAWR01B,13541,8,4454951,CKB -160,Hasselwerderstr.,HAWR01B,Thursday,23.5166666666666,24.0666666666666,Friday,Siriusstr.,SIRI01B,14519,4,4454951,CKB -160,Siriusstr.,SIRI01B,Friday,0.133333333333333,0.65,Friday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454951,CKB -N60,S Schöneweide/Sterndamm,SSWS06B,Friday,0.65,0.783333333333333,Friday,S Adlershof,SAH02BN,4.0,2,4454951,CKB -N60,S Adlershof,SAH02BN,Friday,0.816666666666666,1.2,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454951,CKB -N60,Flughafen Schönefeld,SXF01B,Friday,1.3,1.6,Friday,S Adlershof,SAH02BN,9067,13,4454951,CKB -N60,S Adlershof,SAH02BN,Friday,1.81666666666666,2.2,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454951,CKB -N60,Flughafen Schönefeld,SXF01B,Friday,2.3,2.6,Friday,S Adlershof,SAH02BN,9067,13,4454951,CKB -N60,S Adlershof,SAH02BN,Friday,2.81666666666666,3.2,Friday,Flughafen Schönefeld,SXF01B,8.36,6,4454951,CKB -N60,Flughafen Schönefeld,SXF01B,Friday,3.3,3.6,Friday,S Adlershof,SAH02BN,9067,13,4454951,CKB -N60,S Adlershof,SAH02BN,Friday,3.81666666666666,4.2,Friday,Flughafen Schönefeld,SXF01B,8.36,0,4454951,CKB -N60,Flughafen Schönefeld,SXF01B,Friday,4.2,4.2,Friday,Betriebshof A,BF A A,0.06,0,4454951,CKB -161,Betriebshof A,BF A E,Thursday,21.1,21.1,Thursday,S Erkner/ZOB,SERZ01B,0.06,0,4664625,CKB -161,S Erkner/ZOB,SERZ01B,Thursday,21.1,21.5666666666666,Thursday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664625,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,21.8833333333333,22.2166666666666,Thursday,Lutherstr.,LUTH01B,10332,17,4664625,CKB -161,Lutherstr.,LUTH01B,Thursday,22.5,22.9,Thursday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664625,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,23.2166666666666,23.55,Thursday,Lutherstr.,LUTH01B,10332,17,4664625,CKB -161,Lutherstr.,LUTH01B,Thursday,23.8333333333333,24.2333333333333,Friday,"Schöneiche, Lübecker Str.",SELS01B,10.48,2,4664625,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Friday,0.266666666666666,0.383333333333333,Friday,Rahnsdorf/Waldschänke,RDWS03BN,3709,5,4664625,CKB -N61,Rahnsdorf/Waldschänke,RDWS03BN,Friday,0.466666666666666,0.733333333333333,Friday,Dämeritzstr.,DARI01B,6404,3,4664625,CKB -N61,Dämeritzstr.,DARI01B,Friday,0.783333333333333,1.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,1.28333333333333,1.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4664625,CKB -N61,Dämeritzstr.,DARI01B,Friday,1.78333333333333,2.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,2.28333333333333,2.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4664625,CKB -N61,Dämeritzstr.,DARI01B,Friday,2.78333333333333,3.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,3.28333333333333,3.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4664625,CKB -N61,Dämeritzstr.,DARI01B,Friday,3.78333333333333,4.16666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4664625,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,4.28333333333333,4.73333333333333,Friday,Dämeritzstr.,DARI01B,12007,0,4664625,CKB -N61,Dämeritzstr.,DARI01B,Friday,4.73333333333333,4.73333333333333,Friday,Betriebshof A,BF A A,0.06,0,4664625,CKB -161,Betriebshof A,BF A E,Thursday,20.4333333333333,20.4333333333333,Thursday,S Erkner/ZOB,SERZ01B,0.06,0,4762777,CKB -161,S Erkner/ZOB,SERZ01B,Thursday,20.4333333333333,20.9333333333333,Thursday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762777,CKB -161,"Schöneiche, Goethepark",SEGP01BA,Thursday,21.1666666666666,21.6333333333333,Thursday,S Erkner/ZOB,SERZ01B,13.19,8,4762777,CKB -161,S Erkner/ZOB,SERZ01B,Thursday,21.7666666666666,22.2333333333333,Thursday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762777,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,22.55,22.8833333333333,Thursday,Lutherstr.,LUTH01B,10332,17,4762777,CKB -161,Lutherstr.,LUTH01B,Thursday,23.1666666666666,23.5666666666666,Thursday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762777,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Thursday,23.8833333333333,24.2166666666666,Friday,Lutherstr.,LUTH01B,10332,2,4762777,CKB -161,Lutherstr.,LUTH01B,Friday,0.25,0.266666666666666,Friday,Dämeritzstr.,DARI01B,506,1,4762777,CKB -N61,Dämeritzstr.,DARI01B,Friday,0.283333333333333,0.666666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,0.783333333333333,1.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB -N61,Dämeritzstr.,DARI01B,Friday,1.28333333333333,1.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,1.78333333333333,2.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB -N61,Dämeritzstr.,DARI01B,Friday,2.28333333333333,2.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,2.78333333333333,3.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB -N61,Dämeritzstr.,DARI01B,Friday,3.28333333333333,3.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,7,4762777,CKB -N61,S Friedrichshagen,SFHG05BN,Friday,3.78333333333333,4.23333333333333,Friday,Dämeritzstr.,DARI01B,12007,3,4762777,CKB -N61,Dämeritzstr.,DARI01B,Friday,4.28333333333333,4.66666666666666,Friday,S Friedrichshagen,SFHG05BN,10579,3,4762777,CKB -N67,S Friedrichshagen,SFHG05BN,Friday,4.71666666666666,4.96666666666666,Friday,Schloßplatz Köpenick,SLPZ01BN,6161,0,4762777,CKB -N67,Schloßplatz Köpenick,SLPZ01BN,Friday,4.96666666666666,4.96666666666666,Friday,Betriebshof A,BF A A,0.06,0,4762777,CKB -163,Betriebshof A,BF A E,Thursday,22.9333333333333,22.9333333333333,Thursday,S Grünau,SGA24BA,0.06,0,4617422,CKB -163,S Grünau,SGA24BA,Thursday,22.9333333333333,23.1333333333333,Thursday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617422,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Thursday,23.1833333333333,23.4166666666666,Thursday,S Grünau,SGA22BA,6232,0,4617422,CKB -163,S Grünau,SGA22BA,Thursday,23.4166666666666,23.6333333333333,Thursday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617422,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Thursday,23.6833333333333,23.9166666666666,Thursday,S Grünau,SGA22BA,6232,0,4617422,CKB -163,S Grünau,SGA22BA,Thursday,23.9166666666666,24.1333333333333,Friday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617422,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Friday,0.133333333333333,0.133333333333333,Friday,Betriebshof A,BF A A,0.06,0,4617422,CKB -168,Betriebshof A,BF A E,Thursday,5.08333333333333,5.08333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,5.08333333333333,5.23333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,5.23333333333333,5.38333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,5.41666666666666,5.56666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,5.56666666666666,5.71666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,23,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,6.1,6.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,6.25,6.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,6.43333333333333,6.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,6.58333333333333,6.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,6.76666666666666,6.91666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,6.91666666666666,7.06666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,7.1,7.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,7.25,7.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,7.43333333333333,7.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,7.58333333333333,7.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,8.1,8.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,8.25,8.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,8.43333333333333,8.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,8.58333333333333,8.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,8.76666666666666,8.91666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,8.91666666666666,9.06666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,9.1,9.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,9.25,9.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,9.43333333333333,9.58333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,9.58333333333333,9.73333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,10.1,10.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,10.25,10.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,10.4333333333333,10.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,10.5833333333333,10.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,10.7666666666666,10.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,10.9166666666666,11.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,11.1,11.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,11.25,11.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,11.4333333333333,11.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,11.5833333333333,11.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,12.1,12.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,12.25,12.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,12.4333333333333,12.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,12.5833333333333,12.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,12.7666666666666,12.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,12.9166666666666,13.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,13.1,13.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,13.25,13.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,13.4333333333333,13.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,13.5833333333333,13.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,13.7666666666666,13.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,13.9166666666666,14.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,14.1,14.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,14.25,14.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,14.7666666666666,14.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,14.9166666666666,15.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,15.1,15.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,15.25,15.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,15.4333333333333,15.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,15.5833333333333,15.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,16.1,16.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,16.25,16.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,16.4333333333333,16.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,16.5833333333333,16.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,16.7666666666666,16.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,16.9166666666666,17.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,17.1,17.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,17.25,17.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,17.4333333333333,17.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,17.5833333333333,17.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,18.1,18.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,18.25,18.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,18.4333333333333,18.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,18.5833333333333,18.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,18.7666666666666,18.9166666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,18.9166666666666,19.0666666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,19.1,19.25,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,19.25,19.4,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,19.4333333333333,19.5833333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,19.5833333333333,19.7333333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,21,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,20.0833333333333,20.2333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,20.2333333333333,20.3833333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,20.4166666666666,20.5666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,20.5666666666666,20.7166666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,20.75,20.9,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,20.9,21.05,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,21.0833333333333,21.2333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,21.2333333333333,21.3833333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,21.4166666666666,21.5666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,21.5666666666666,21.7166666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,22,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,22.0833333333333,22.2333333333333,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,22.2333333333333,22.3833333333333,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,22.4166666666666,22.5666666666666,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,22.5666666666666,22.7166666666666,Thursday,Alt-Schmöckwitz,ALSW02B,5139,2,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,22.75,22.9,Thursday,Moßkopfring,MKFR01B,4781,0,4426847,CKB -168,Moßkopfring,MKFR01B,Thursday,22.9,23.05,Thursday,Alt-Schmöckwitz,ALSW02B,5139,0,4426847,CKB -168,Alt-Schmöckwitz,ALSW02B,Thursday,23.05,23.05,Thursday,Betriebshof A,BF A A,0.06,0,4426847,CKB -269,Betriebshof A,BF A E,Friday,0.1,0.1,Friday,S Kaulsdorf,SKD05B,0.06,0,4708597,CKB -269,S Kaulsdorf,SKD05B,Friday,0.1,0.45,Friday,S Köpenick,SKOE01B,7827,0,4708597,CKB -N69,S Köpenick,SKOE01B,Friday,0.45,0.8,Friday,Odernheimer Str.,ODNH01B,11079,0,4708597,CKB -N69,Odernheimer Str.,ODNH01B,Friday,0.8,1.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4708597,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,1.55,2.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4708597,CKB -N69,Odernheimer Str.,ODNH01B,Friday,2.28333333333333,2.91666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4708597,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,3.05,3.76666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4708597,CKB -N69,Odernheimer Str.,ODNH01B,Friday,3.78333333333333,4.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,0,4708597,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,4.41666666666666,4.41666666666666,Friday,Betriebshof A,BF A A,0.06,0,4708597,CKB -326,Betriebshof Indira-Gandhi-Str.,BF I E,Thursday,5.25,6.01666666666666,Thursday,S Hermsdorf,SHDF01B,17.9,0,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,6.01666666666666,6.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,6.38333333333333,6.61666666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,6.68333333333333,6.91666666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,7.05,7.28333333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,7.35,7.58333333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,7.71666666666666,7.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,8.01666666666666,8.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,8.38333333333333,8.61666666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,8.68333333333333,8.91666666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,9.05,9.28333333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,9.35,9.58333333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,9.71666666666666,9.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,10.0166666666666,10.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,10.3833333333333,10.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,10.6833333333333,10.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,11.05,11.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,11.35,11.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,11.7166666666666,11.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,12.0166666666666,12.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,12.3833333333333,12.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,12.6833333333333,12.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,13.05,13.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,13.35,13.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,13.7166666666666,13.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,14.0166666666666,14.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,14.3833333333333,14.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,14.6833333333333,14.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,15.05,15.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,15.35,15.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,15.7166666666666,15.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,16.0166666666666,16.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,16.3833333333333,16.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,16.6833333333333,16.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,17.05,17.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,17.35,17.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,17.7166666666666,17.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,18.0166666666666,18.25,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,18.3833333333333,18.6166666666666,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,18.6833333333333,18.9166666666666,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,19.05,19.2833333333333,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,19.35,19.5833333333333,Thursday,S Hermsdorf,SHDF01B,4637,8,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,19.7166666666666,19.95,Thursday,S Hermsdorf,SHDF01B,4637,4,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,20.0166666666666,20.2333333333333,Thursday,S Hermsdorf,SHDF01B,4637,9,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,20.3833333333333,20.6,Thursday,S Hermsdorf,SHDF01B,4637,0,4317627,VDL -326,S Hermsdorf,SHDF01B,Thursday,20.6,21.25,Thursday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317627,VDL -334,Betriebshof A,BF A E,Thursday,4.93333333333333,4.93333333333333,Thursday,Alt-Gatow,ALTG01B,0.06,18,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,5.23333333333333,5.33333333333333,Thursday,Habichtswald,HWLD01B,3.29,0,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,5.33333333333333,5.4,Thursday,Alt-Gatow,ALTG01B,2954,20,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,5.73333333333333,5.83333333333333,Thursday,Habichtswald,HWLD01B,3.29,0,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,5.83333333333333,5.9,Thursday,Alt-Gatow,ALTG01B,2954,5,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,5.98333333333333,6.1,Thursday,Habichtswald,HWLD01B,3.29,2,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,6.13333333333333,6.21666666666666,Thursday,Alt-Gatow,ALTG01B,2954,19,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,6.53333333333333,6.65,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,6.66666666666666,6.75,Thursday,Alt-Gatow,ALTG01B,2954,7,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,6.86666666666666,6.98333333333333,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,7.0,7.08333333333333,Thursday,Alt-Gatow,ALTG01B,2954,7,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,7.2,7.31666666666666,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,7.33333333333333,7.41666666666666,Thursday,Alt-Gatow,ALTG01B,2954,7,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,7.53333333333333,7.65,Thursday,Habichtswald,HWLD01B,3.29,1,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,7.66666666666666,7.75,Thursday,Alt-Gatow,ALTG01B,2954,295,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,12.6666666666666,12.7833333333333,Thursday,Habichtswald,HWLD01B,3.29,2,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,12.8166666666666,12.9,Thursday,Alt-Gatow,ALTG01B,2954,46,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,13.6666666666666,13.7833333333333,Thursday,Habichtswald,HWLD01B,3.29,2,4425670,CKB -334,Habichtswald,HWLD01B,Thursday,13.8166666666666,13.9,Thursday,Alt-Gatow,ALTG01B,2954,434,4425670,CKB -334,Alt-Gatow,ALTG01B,Thursday,21.1333333333333,21.1333333333333,Thursday,Betriebshof A,BF A A,0.06,0,4425670,CKB -349,Betriebshof A,BF A E,Thursday,7.33333333333333,7.33333333333333,Thursday,S Grunewald,SGD02B,0.06,0,4448152,CKB -349,S Grunewald,SGD02B,Thursday,7.33333333333333,7.83333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,8.0,8.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,8.66666666666666,9.16666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,9.33333333333333,9.83333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,10.0,10.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,10.6666666666666,11.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,11.3333333333333,11.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,12.0,12.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,12.6666666666666,13.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,13.3333333333333,13.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,14.0,14.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,14.6666666666666,15.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,15.3333333333333,15.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,16.0,16.5,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,16.6666666666666,17.1666666666666,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,17.3333333333333,17.8333333333333,Thursday,S Grunewald,SGD02B,9266,10,4448152,CKB -349,S Grunewald,SGD02B,Thursday,18.0,18.5,Thursday,S Grunewald,SGD02B,9266,0,4448152,CKB -349,S Grunewald,SGD02B,Thursday,18.5,18.5,Thursday,Betriebshof A,BF A A,0.06,0,4448152,CKB -370,Betriebshof A,BF A E,Thursday,7.16666666666666,7.16666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,7.16666666666666,7.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,7.46666666666666,7.66666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,7.66666666666666,7.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,7.96666666666666,8.16666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,8.16666666666666,8.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,8.46666666666666,8.66666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,8.66666666666666,8.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,8.96666666666666,9.16666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,9.16666666666666,9.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,9.46666666666666,9.66666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,9.66666666666666,9.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,9.96666666666666,10.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,10.1666666666666,10.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,10.4666666666666,10.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,10.6666666666666,10.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,10.9666666666666,11.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,11.1666666666666,11.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,11.4666666666666,11.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,11.6666666666666,11.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,11.9666666666666,12.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,12.1666666666666,12.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,12.4666666666666,12.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,12.6666666666666,12.8,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,12.9666666666666,13.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,13.1666666666666,13.3,Thursday,S+U Hermannstr.,SUHM09B,2169,10,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,13.4666666666666,13.6666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,13.6666666666666,13.8,Thursday,S+U Hermannstr.,SUHM09B,2169,8,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,13.9333333333333,14.1666666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,14.1666666666666,14.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,14.55,14.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,14.8333333333333,14.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,15.2166666666666,15.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,15.5,15.65,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,15.8833333333333,16.1166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,16.1666666666666,16.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,16.55,16.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,16.8333333333333,16.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,17.2166666666666,17.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,17.5,17.65,Thursday,S+U Hermannstr.,SUHM09B,2169,13,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,17.8666666666666,18.0833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,5,4733897,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,18.1666666666666,18.3,Thursday,S+U Hermannstr.,SUHM09B,2169,0,4733897,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,18.3,18.3,Thursday,Betriebshof A,BF A A,0.06,0,4733897,CKB -370,Betriebshof A,BF A E,Thursday,14.2166666666666,14.2166666666666,Thursday,S+U Hermannstr.,SUHM09B,0.06,0,4734202,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,14.2166666666666,14.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,14.5,14.65,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,14.8833333333333,15.1166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,15.1666666666666,15.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,15.55,15.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,15.8333333333333,15.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,16.2166666666666,16.45,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,16.5,16.65,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,16.8833333333333,17.1166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,17.1666666666666,17.3166666666666,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,17.55,17.7833333333333,Thursday,Neuköllnische Brücke,NKBR04BA,2952,3,4734202,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,17.8333333333333,17.9833333333333,Thursday,S+U Hermannstr.,SUHM09B,2169,14,4734202,CKB -370,S+U Hermannstr.,SUHM09B,Thursday,18.2166666666666,18.4166666666666,Thursday,Neuköllnische Brücke,NKBR04BA,2952,0,4734202,CKB -370,Neuköllnische Brücke,NKBR04BA,Thursday,18.4166666666666,18.4166666666666,Thursday,Betriebshof A,BF A A,0.06,0,4734202,CKB -N23,Betriebshof A,BF A E,Friday,0.383333333333333,0.383333333333333,Friday,Mäckeritzwiesen,MAWI01B,0.06,0,4318159,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,0.383333333333333,0.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB -N39,U Rohrdamm,URDM01B,Friday,0.65,0.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB -N39,Mertensstr.,MTNS01B,Friday,1.05,1.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB -N23,U Rohrdamm,URDM02B,Friday,1.28333333333333,1.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,1.38333333333333,1.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB -N39,U Rohrdamm,URDM01B,Friday,1.65,1.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB -N39,Mertensstr.,MTNS01B,Friday,2.05,2.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB -N23,U Rohrdamm,URDM02B,Friday,2.28333333333333,2.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,2.38333333333333,2.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB -N39,U Rohrdamm,URDM01B,Friday,2.65,2.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB -N39,Mertensstr.,MTNS01B,Friday,3.05,3.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB -N23,U Rohrdamm,URDM02B,Friday,3.28333333333333,3.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,3.38333333333333,3.5,Friday,U Rohrdamm,URDM01B,2577,9,4318159,CKB -N39,U Rohrdamm,URDM01B,Friday,3.65,3.9,Friday,Mertensstr.,MTNS01B,5937,9,4318159,CKB -N39,Mertensstr.,MTNS01B,Friday,4.05,4.28333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318159,CKB -N23,U Rohrdamm,URDM02B,Friday,4.28333333333333,4.38333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318159,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,4.38333333333333,4.38333333333333,Friday,Betriebshof A,BF A A,0.06,0,4318159,CKB -N39,Betriebshof A,BF A E,Friday,0.55,0.55,Friday,Mertensstr.,MTNS01B,0.06,0,4318179,CKB -N39,Mertensstr.,MTNS01B,Friday,0.55,0.783333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB -N23,U Rohrdamm,URDM02B,Friday,0.783333333333333,0.883333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,0.883333333333333,1.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB -N39,U Rohrdamm,URDM01B,Friday,1.15,1.4,Friday,Mertensstr.,MTNS01B,5937,9,4318179,CKB -N39,Mertensstr.,MTNS01B,Friday,1.55,1.78333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB -N23,U Rohrdamm,URDM02B,Friday,1.78333333333333,1.88333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,1.88333333333333,2.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB -N39,U Rohrdamm,URDM01B,Friday,2.15,2.4,Friday,Mertensstr.,MTNS01B,5937,9,4318179,CKB -N39,Mertensstr.,MTNS01B,Friday,2.55,2.78333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB -N23,U Rohrdamm,URDM02B,Friday,2.78333333333333,2.88333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,2.88333333333333,3.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB -N39,U Rohrdamm,URDM01B,Friday,3.15,3.4,Friday,Mertensstr.,MTNS01B,5937,9,4318179,CKB -N39,Mertensstr.,MTNS01B,Friday,3.55,3.78333333333333,Friday,U Rohrdamm,URDM02B,6.19,0,4318179,CKB -N23,U Rohrdamm,URDM02B,Friday,3.78333333333333,3.88333333333333,Friday,Mäckeritzwiesen,MAWI01B,2555,0,4318179,CKB -N23,Mäckeritzwiesen,MAWI01B,Friday,3.88333333333333,4.0,Friday,U Rohrdamm,URDM01B,2577,9,4318179,CKB -N39,U Rohrdamm,URDM01B,Friday,4.15,4.4,Friday,Mertensstr.,MTNS01B,5937,0,4318179,CKB -N39,Mertensstr.,MTNS01B,Friday,4.4,4.4,Friday,Betriebshof A,BF A A,0.06,0,4318179,CKB -N35,Betriebshof A,BF A E,Friday,0.95,0.95,Friday,Alt-Kladow,ALKL02B,0.06,0,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,0.95,1.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,1.1,1.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,1.45,1.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,1.6,1.68333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,1.95,2.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,2.1,2.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,2.45,2.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,2.6,2.68333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,2.95,3.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,3.1,3.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,3.45,3.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,3.6,3.68333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,3.95,4.1,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,4.1,4.18333333333333,Friday,Alt-Kladow,ALKL02B,2936,16,4319354,CKB -N35,Alt-Kladow,ALKL02B,Friday,4.45,4.6,Friday,Gutsstr.,GUTS01B,4343,0,4319354,CKB -N35,Gutsstr.,GUTS01B,Friday,4.6,4.6,Friday,Betriebshof A,BF A A,0.06,0,4319354,CKB -N52,Betriebshof A,BF A E,Friday,0.483333333333333,0.483333333333333,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,0.483333333333333,0.683333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,0.783333333333333,0.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,0.983333333333333,1.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,1.28333333333333,1.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.48333333333333,1.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,1.78333333333333,1.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.98333333333333,2.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,2.28333333333333,2.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.48333333333333,2.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,2.78333333333333,2.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.98333333333333,3.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,3.28333333333333,3.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.48333333333333,3.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,3.78333333333333,3.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.98333333333333,4.18333333333333,Friday,U Osloer Str.,UOSL04B,4481,6,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,4.28333333333333,4.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,4031,2,4751089,CKB -N52,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,4.48333333333333,4.68333333333333,Friday,U Osloer Str.,UOSL04B,4481,0,4751089,CKB -N52,U Osloer Str.,UOSL04B,Friday,4.68333333333333,4.68333333333333,Friday,Betriebshof A,BF A A,0.06,0,4751089,CKB -N53,Betriebshof A,BF A E,Friday,0.5,0.5,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,0.5,0.733333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,0.733333333333333,0.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.0,1.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,1.23333333333333,1.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,1.5,1.73333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,1.73333333333333,1.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.0,2.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,2.23333333333333,2.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,2.5,2.73333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,2.73333333333333,2.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.0,3.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,3.23333333333333,3.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,3.5,3.73333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,3.73333333333333,3.95,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,4.0,4.23333333333333,Friday,Wilhelmsruher Damm,WIDA02B,4801,0,4453547,CKB -N53,Wilhelmsruher Damm,WIDA02B,Friday,4.23333333333333,4.45,Friday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453547,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Friday,4.45,4.45,Friday,Betriebshof A,BF A A,0.06,0,4453547,CKB -N56,Betriebshof A,BF A E,Friday,0.716666666666666,0.716666666666666,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374469,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,0.716666666666666,1.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374469,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,1.71666666666666,2.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374469,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,2.71666666666666,3.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374469,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,3.71666666666666,4.55,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374469,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,4.55,4.55,Friday,Betriebshof A,BF A A,0.06,0,4374469,CKB -N56,Betriebshof A,BF A E,Friday,0.216666666666666,0.216666666666666,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,0.06,0,4374474,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,0.216666666666666,1.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374474,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,1.21666666666666,2.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374474,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,2.21666666666666,3.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,10,4374474,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,3.21666666666666,4.05,Friday,Atzpodienstr./U Magdalenenstr.,AZUM03BN,20434,0,4374474,CKB -N56,Atzpodienstr./U Magdalenenstr.,AZUM03BN,Friday,4.05,4.05,Friday,Betriebshof A,BF A A,0.06,0,4374474,CKB -N58,Betriebshof A,BF A E,Friday,0.4,0.4,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,0.06,0,4456450,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,0.4,0.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB -N58,S Buch,SBU02B,Friday,0.866666666666666,1.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456450,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,1.4,1.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB -N58,S Buch,SBU02B,Friday,1.86666666666666,2.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456450,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,2.4,2.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB -N58,S Buch,SBU02B,Friday,2.86666666666666,3.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456450,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,3.4,3.8,Friday,S Buch,SBU02B,11.86,4,4456450,CKB -N58,S Buch,SBU02B,Friday,3.86666666666666,4.23333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456450,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,4.23333333333333,4.23333333333333,Friday,Betriebshof A,BF A A,0.06,0,4456450,CKB -N58,Betriebshof A,BF A E,Friday,0.366666666666666,0.366666666666666,Friday,S Buch,SBU02B,0.06,0,4456458,CKB -N58,S Buch,SBU02B,Friday,0.366666666666666,0.733333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,0.9,1.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB -N58,S Buch,SBU02B,Friday,1.36666666666666,1.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,1.9,2.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB -N58,S Buch,SBU02B,Friday,2.36666666666666,2.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,2.9,3.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB -N58,S Buch,SBU02B,Friday,3.36666666666666,3.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,10,4456458,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,3.9,4.3,Friday,S Buch,SBU02B,11.86,4,4456458,CKB -N58,S Buch,SBU02B,Friday,4.36666666666666,4.73333333333333,Friday,Prenzlauer Prom./Am Steinberg,PPAS02B,11139,0,4456458,CKB -N58,Prenzlauer Prom./Am Steinberg,PPAS02B,Friday,4.73333333333333,4.73333333333333,Friday,Betriebshof A,BF A A,0.06,0,4456458,CKB -N62,Betriebshof A,BF A E,Friday,0.533333333333333,0.533333333333333,Friday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747652,CKB -N62,Schloßplatz Köpenick,SLPZ02BN,Friday,0.533333333333333,0.733333333333333,Friday,Wendenschloß,WESC09BA,4212,3,4747652,CKB -N62,Wendenschloß,WESC09BA,Friday,0.783333333333333,1.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,1.26666666666666,1.7,Friday,Wendenschloß,WESC09BA,12869,5,4747652,CKB -N62,Wendenschloß,WESC09BA,Friday,1.78333333333333,2.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,2.26666666666666,2.7,Friday,Wendenschloß,WESC09BA,12869,5,4747652,CKB -N62,Wendenschloß,WESC09BA,Friday,2.78333333333333,3.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,3.26666666666666,3.7,Friday,Wendenschloß,WESC09BA,12869,5,4747652,CKB -N62,Wendenschloß,WESC09BA,Friday,3.78333333333333,4.26666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747652,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,4.26666666666666,4.56666666666666,Friday,Betriebshof Köpenick,BHKO01BN,9538,0,4747652,CKB -N62,Betriebshof Köpenick,BHKO01BN,Friday,4.56666666666666,4.56666666666666,Friday,Betriebshof A,BF A A,0.06,0,4747652,CKB -N62,Betriebshof A,BF A E,Friday,0.283333333333333,0.283333333333333,Friday,Wendenschloß,WESC09BA,0.06,0,4747662,CKB -N62,Wendenschloß,WESC09BA,Friday,0.283333333333333,0.766666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,0.766666666666666,1.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB -N62,Wendenschloß,WESC09BA,Friday,1.28333333333333,1.76666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,1.76666666666666,2.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB -N62,Wendenschloß,WESC09BA,Friday,2.28333333333333,2.76666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,2.76666666666666,3.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB -N62,Wendenschloß,WESC09BA,Friday,3.28333333333333,3.76666666666666,Friday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747662,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Friday,3.76666666666666,4.2,Friday,Wendenschloß,WESC09BA,12869,5,4747662,CKB -N62,Wendenschloß,WESC09BA,Friday,4.28333333333333,4.46666666666666,Friday,Schloßplatz Köpenick,SLPZ03B,4316,0,4747662,CKB -N62,Schloßplatz Köpenick,SLPZ03B,Friday,4.46666666666666,4.46666666666666,Friday,Betriebshof A,BF A A,0.06,0,4747662,CKB -N68,Betriebshof A,BF A E,Friday,0.816666666666666,0.816666666666666,Friday,S Adlershof,SAH02BN,0.06,0,4434343,CKB -N68,S Adlershof,SAH02BN,Friday,0.816666666666666,1.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Friday,1.06666666666666,1.31666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB -N68,S Adlershof,SAH02BN,Friday,1.31666666666666,1.56666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Friday,1.56666666666666,1.81666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB -N68,S Adlershof,SAH02BN,Friday,1.81666666666666,2.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Friday,2.06666666666666,2.31666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB -N68,S Adlershof,SAH02BN,Friday,2.31666666666666,2.56666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Friday,2.56666666666666,2.81666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB -N68,S Adlershof,SAH02BN,Friday,2.81666666666666,3.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Friday,3.06666666666666,3.31666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB -N68,S Adlershof,SAH02BN,Friday,3.31666666666666,3.56666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Friday,3.56666666666666,3.81666666666666,Friday,S Adlershof,SAH02BN,11801,0,4434343,CKB -N68,S Adlershof,SAH02BN,Friday,3.81666666666666,4.06666666666666,Friday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434343,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Friday,4.06666666666666,4.31666666666666,Friday,S Adlershof,SAH02BN,11801,23,4434343,CKB -164,S Adlershof,SAH02BN,Friday,4.7,5.06666666666666,Friday,Kaulsdorfer Str.,KDFS02B,6.81,0,4434343,CKB -164,Kaulsdorfer Str.,KDFS02B,Friday,5.06666666666666,5.06666666666666,Friday,Betriebshof A,BF A A,0.06,0,4434343,CKB -N69,Betriebshof A,BF A E,Friday,0.533333333333333,0.533333333333333,Friday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4434899,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Friday,0.533333333333333,0.95,Friday,S+U Wuhletal,SUWT02BN,11545,6,4434899,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,1.05,1.76666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434899,CKB -N69,Odernheimer Str.,ODNH01B,Friday,1.78333333333333,2.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434899,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,2.55,3.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434899,CKB -N69,Odernheimer Str.,ODNH01B,Friday,3.28333333333333,3.91666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434899,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,4.05,4.46666666666666,Friday,Schloßplatz Köpenick,SLPZ02BN,11499,0,4434899,CKB -N69,Schloßplatz Köpenick,SLPZ02BN,Friday,4.46666666666666,4.46666666666666,Friday,Betriebshof A,BF A A,0.06,0,4434899,CKB -N69,Betriebshof A,BF A E,Friday,0.55,0.55,Friday,S+U Wuhletal,SUWT02BN,0.06,0,4434904,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,0.55,1.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434904,CKB -N69,Odernheimer Str.,ODNH01B,Friday,1.28333333333333,1.91666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434904,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,2.05,2.76666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434904,CKB -N69,Odernheimer Str.,ODNH01B,Friday,2.78333333333333,3.41666666666666,Friday,S+U Wuhletal,SUWT02BN,20641,8,4434904,CKB -N69,S+U Wuhletal,SUWT02BN,Friday,3.55,4.26666666666666,Friday,Odernheimer Str.,ODNH01B,20579,1,4434904,CKB -N69,Odernheimer Str.,ODNH01B,Friday,4.28333333333333,4.85,Friday,U Elsterwerdaer Platz,UEWP03B,18752,0,4434904,CKB -N69,U Elsterwerdaer Platz,UEWP03B,Friday,4.85,4.85,Friday,Betriebshof A,BF A A,0.06,0,4434904,CKB -N88,Betriebshof A,BF A E,Friday,0.566666666666666,0.566666666666666,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619768,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,0.566666666666666,1.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,1.0,1.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619768,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,1.56666666666666,2.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,2.0,2.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619768,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,2.56666666666666,3.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,3.0,3.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619768,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,3.56666666666666,4.0,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619768,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,4.0,4.45,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619768,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,4.45,4.45,Friday,Betriebshof A,BF A A,0.06,0,4619768,CKB -N88,Betriebshof A,BF A E,Friday,0.5,0.5,Friday,S Lichterfelde Süd,SLIS01B,0.06,0,4619993,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,0.5,0.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,1.06666666666666,1.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,1.5,1.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,2.06666666666666,2.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,2.5,2.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,3.06666666666666,3.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,3.5,3.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619993,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,4.06666666666666,4.5,Friday,S Lichterfelde Süd,SLIS01B,9016,0,4619993,CKB -N88,S Lichterfelde Süd,SLIS01B,Friday,4.5,4.95,Friday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619993,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Friday,4.95,4.95,Friday,Betriebshof A,BF A A,0.06,0,4619993,CKB -N91,Betriebshof A,BF A E,Friday,0.516666666666666,0.516666666666666,Friday,S+U Wuhletal,SUWT02BN,0.06,0,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,0.516666666666666,0.733333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,0.733333333333333,0.933333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,1.01666666666666,1.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,1.23333333333333,1.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,1.51666666666666,1.73333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,1.73333333333333,1.93333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,2.01666666666666,2.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,2.23333333333333,2.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,2.51666666666666,2.73333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,2.73333333333333,2.93333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,3.01666666666666,3.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,3.23333333333333,3.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,3.51666666666666,3.73333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,3.73333333333333,3.93333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,5,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,4.01666666666666,4.23333333333333,Friday,Boschpoler Str.,BOPO01BN,4872,0,4374746,CKB -N91,Boschpoler Str.,BOPO01BN,Friday,4.23333333333333,4.43333333333333,Friday,S+U Wuhletal,SUWT02BN,5362,0,4374746,CKB -N91,S+U Wuhletal,SUWT02BN,Friday,4.43333333333333,4.43333333333333,Friday,Betriebshof A,BF A A,0.06,0,4374746,CKB -N95,Betriebshof A,BF A E,Friday,0.516666666666666,0.516666666666666,Friday,S+U Wuhletal,SUWT02BN,0.06,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,0.516666666666666,0.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,0.783333333333333,1.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,1.01666666666666,1.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,1.28333333333333,1.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,1.51666666666666,1.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,1.78333333333333,2.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,2.01666666666666,2.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,2.28333333333333,2.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,2.51666666666666,2.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,2.78333333333333,3.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,3.01666666666666,3.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,3.28333333333333,3.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,3.51666666666666,3.75,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,3.78333333333333,4.01666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,4.01666666666666,4.25,Friday,Riesaer Str.,RIES01BN,5225,2,4374869,CKB -N95,Riesaer Str.,RIES01BN,Friday,4.28333333333333,4.51666666666666,Friday,S+U Wuhletal,SUWT02BN,7617,0,4374869,CKB -N95,S+U Wuhletal,SUWT02BN,Friday,4.51666666666666,4.51666666666666,Friday,Betriebshof A,BF A A,0.06,0,4374869,CKB -N97,Betriebshof A,BF A E,Friday,0.716666666666666,0.716666666666666,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,0.716666666666666,0.883333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,0.883333333333333,1.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,1.21666666666666,1.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,1.38333333333333,1.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,1.71666666666666,1.88333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,1.88333333333333,2.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,2.21666666666666,2.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,2.38333333333333,2.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,2.71666666666666,2.88333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,2.88333333333333,3.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,3.21666666666666,3.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,3.38333333333333,3.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,3.71666666666666,3.88333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,3.88333333333333,4.05,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,4.21666666666666,4.38333333333333,Friday,Barnimplatz,BARN01B,4507,0,4375015,CKB -N97,Barnimplatz,BARN01B,Friday,4.38333333333333,4.55,Friday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375015,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Friday,4.55,4.55,Friday,Betriebshof A,BF A A,0.06,0,4375015,CKB -160,Betriebshof A,BF A E,Friday,21.5166666666666,21.5166666666666,Friday,Hasselwerderstr.,HAWR01B,0.06,0,4454947,CKB -160,Hasselwerderstr.,HAWR01B,Friday,21.5166666666666,22.0666666666666,Friday,Siriusstr.,SIRI01B,14519,4,4454947,CKB -160,Siriusstr.,SIRI01B,Friday,22.1333333333333,22.7166666666666,Friday,Hasselwerderstr.,HAWR01B,13541,8,4454947,CKB -160,Hasselwerderstr.,HAWR01B,Friday,22.85,23.4,Friday,Siriusstr.,SIRI01B,14519,4,4454947,CKB -160,Siriusstr.,SIRI01B,Friday,23.4666666666666,24.05,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454947,CKB -160,Hasselwerderstr.,HAWR01B,Saturday,0.183333333333333,0.733333333333333,Saturday,Siriusstr.,SIRI01B,14519,0,4454947,CKB -N60,Siriusstr.,SIRI01B,Saturday,0.733333333333333,0.9,Saturday,S Adlershof,SAH02BN,4.1,25,4454947,CKB -N60,S Adlershof,SAH02BN,Saturday,1.31666666666666,1.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,1.8,2.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB -N60,S Adlershof,SAH02BN,Saturday,2.31666666666666,2.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,2.8,3.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB -N60,S Adlershof,SAH02BN,Saturday,3.31666666666666,3.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,3.8,4.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB -N60,S Adlershof,SAH02BN,Saturday,4.31666666666666,4.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454947,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,4.8,5.1,Saturday,S Adlershof,SAH02BN,9067,13,4454947,CKB -N60,S Adlershof,SAH02BN,Saturday,5.31666666666666,5.7,Saturday,Flughafen Schönefeld,SXF01B,8.36,16,4454947,CKB -164,Flughafen Schönefeld,SXF01B,Saturday,5.96666666666666,6.56666666666666,Saturday,Kaulsdorfer Str.,KDFS02B,12968,0,4454947,CKB -164,Kaulsdorfer Str.,KDFS02B,Saturday,6.56666666666666,6.56666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4454947,CKB -160,Betriebshof A,BF A E,Friday,22.1833333333333,22.1833333333333,Friday,Hasselwerderstr.,HAWR01B,0.06,0,4454952,CKB -160,Hasselwerderstr.,HAWR01B,Friday,22.1833333333333,22.7333333333333,Friday,Siriusstr.,SIRI01B,14519,4,4454952,CKB -160,Siriusstr.,SIRI01B,Friday,22.8,23.3833333333333,Friday,Hasselwerderstr.,HAWR01B,13541,8,4454952,CKB -160,Hasselwerderstr.,HAWR01B,Friday,23.5166666666666,24.0666666666666,Saturday,Siriusstr.,SIRI01B,14519,4,4454952,CKB -160,Siriusstr.,SIRI01B,Saturday,0.133333333333333,0.65,Saturday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454952,CKB -N60,S Schöneweide/Sterndamm,SSWS06B,Saturday,0.65,0.783333333333333,Saturday,S Adlershof,SAH02BN,4.0,2,4454952,CKB -N60,S Adlershof,SAH02BN,Saturday,0.816666666666666,1.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,1.3,1.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB -N60,S Adlershof,SAH02BN,Saturday,1.81666666666666,2.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,2.3,2.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB -N60,S Adlershof,SAH02BN,Saturday,2.81666666666666,3.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,3.3,3.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB -N60,S Adlershof,SAH02BN,Saturday,3.81666666666666,4.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,4.3,4.6,Saturday,S Adlershof,SAH02BN,9067,13,4454952,CKB -N60,S Adlershof,SAH02BN,Saturday,4.81666666666666,5.2,Saturday,Flughafen Schönefeld,SXF01B,8.36,6,4454952,CKB -N60,Flughafen Schönefeld,SXF01B,Saturday,5.3,5.6,Saturday,S Adlershof,SAH02BN,9067,0,4454952,CKB -N60,S Adlershof,SAH02BN,Saturday,5.6,5.6,Saturday,Betriebshof A,BF A A,0.06,0,4454952,CKB -161,Betriebshof A,BF A E,Friday,21.1,21.1,Friday,S Erkner/ZOB,SERZ01B,0.06,0,4664738,CKB -161,S Erkner/ZOB,SERZ01B,Friday,21.1,21.5666666666666,Friday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664738,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Friday,21.8833333333333,22.2166666666666,Friday,Lutherstr.,LUTH01B,10332,17,4664738,CKB -161,Lutherstr.,LUTH01B,Friday,22.5,22.9,Friday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664738,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Friday,23.2166666666666,23.55,Friday,Lutherstr.,LUTH01B,10332,17,4664738,CKB -161,Lutherstr.,LUTH01B,Friday,23.8333333333333,24.2333333333333,Saturday,"Schöneiche, Lübecker Str.",SELS01B,10.48,8,4664738,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,0.366666666666666,0.45,Saturday,S Rahnsdorf,SRD01B,2533,2,4664738,CKB -N61,S Rahnsdorf,SRD01B,Saturday,0.483333333333333,0.783333333333333,Saturday,Dämeritzstr.,DARI01B,7.58,0,4664738,CKB -N61,Dämeritzstr.,DARI01B,Saturday,0.783333333333333,1.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,1.28333333333333,1.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB -N61,Dämeritzstr.,DARI01B,Saturday,1.78333333333333,2.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,2.28333333333333,2.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB -N61,Dämeritzstr.,DARI01B,Saturday,2.78333333333333,3.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,3.28333333333333,3.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB -N61,Dämeritzstr.,DARI01B,Saturday,3.78333333333333,4.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,4.28333333333333,4.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB -N61,Dämeritzstr.,DARI01B,Saturday,4.78333333333333,5.23333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4664738,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,5.28333333333333,5.78333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4664738,CKB -N61,Dämeritzstr.,DARI01B,Saturday,5.78333333333333,5.78333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4664738,CKB -161,Betriebshof A,BF A E,Friday,20.4333333333333,20.4333333333333,Friday,S Erkner/ZOB,SERZ01B,0.06,0,4762763,CKB -161,S Erkner/ZOB,SERZ01B,Friday,20.4333333333333,20.9333333333333,Friday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762763,CKB -161,"Schöneiche, Goethepark",SEGP01BA,Friday,21.1666666666666,21.6333333333333,Friday,S Erkner/ZOB,SERZ01B,13.19,8,4762763,CKB -161,S Erkner/ZOB,SERZ01B,Friday,21.7666666666666,22.2333333333333,Friday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762763,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Friday,22.55,22.8833333333333,Friday,Lutherstr.,LUTH01B,10332,17,4762763,CKB -161,Lutherstr.,LUTH01B,Friday,23.1666666666666,23.5666666666666,Friday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762763,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Friday,23.8833333333333,24.2166666666666,Saturday,Lutherstr.,LUTH01B,10332,2,4762763,CKB -161,Lutherstr.,LUTH01B,Saturday,0.25,0.266666666666666,Saturday,Dämeritzstr.,DARI01B,506,1,4762763,CKB -N61,Dämeritzstr.,DARI01B,Saturday,0.283333333333333,0.733333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,0.783333333333333,1.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB -N61,Dämeritzstr.,DARI01B,Saturday,1.28333333333333,1.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,1.78333333333333,2.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB -N61,Dämeritzstr.,DARI01B,Saturday,2.28333333333333,2.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,2.78333333333333,3.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB -N61,Dämeritzstr.,DARI01B,Saturday,3.28333333333333,3.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,3.78333333333333,4.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB -N61,Dämeritzstr.,DARI01B,Saturday,4.28333333333333,4.73333333333333,Saturday,S Friedrichshagen,SFHG05BN,12841,3,4762763,CKB -N61,S Friedrichshagen,SFHG05BN,Saturday,4.78333333333333,5.28333333333333,Saturday,Dämeritzstr.,DARI01B,14281,0,4762763,CKB -N61,Dämeritzstr.,DARI01B,Saturday,5.28333333333333,5.48333333333333,Saturday,S Rahnsdorf,SRD01B,5474,0,4762763,CKB -N61,S Rahnsdorf,SRD01B,Saturday,5.48333333333333,5.48333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4762763,CKB -163,Betriebshof A,BF A E,Friday,22.9333333333333,22.9333333333333,Friday,S Grünau,SGA24BA,0.06,0,4617429,CKB -163,S Grünau,SGA24BA,Friday,22.9333333333333,23.1333333333333,Friday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617429,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Friday,23.1833333333333,23.4166666666666,Friday,S Grünau,SGA22BA,6232,0,4617429,CKB -163,S Grünau,SGA22BA,Friday,23.4166666666666,23.6333333333333,Friday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617429,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Friday,23.6833333333333,23.9166666666666,Friday,S Grünau,SGA22BA,6232,0,4617429,CKB -163,S Grünau,SGA22BA,Friday,23.9166666666666,24.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617429,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,0.133333333333333,0.133333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4617429,CKB -168,Betriebshof A,BF A E,Friday,5.08333333333333,5.08333333333333,Friday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,5.08333333333333,5.23333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,5.23333333333333,5.38333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,5.41666666666666,5.56666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,5.56666666666666,5.71666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,23,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,6.1,6.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,6.25,6.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,6.43333333333333,6.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,6.58333333333333,6.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,6.76666666666666,6.91666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,6.91666666666666,7.06666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,7.1,7.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,7.25,7.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,7.43333333333333,7.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,7.58333333333333,7.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,8.1,8.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,8.25,8.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,8.43333333333333,8.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,8.58333333333333,8.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,8.76666666666666,8.91666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,8.91666666666666,9.06666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,9.1,9.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,9.25,9.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,9.43333333333333,9.58333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,9.58333333333333,9.73333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,10.1,10.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,10.25,10.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,10.4333333333333,10.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,10.5833333333333,10.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,10.7666666666666,10.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,10.9166666666666,11.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,11.1,11.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,11.25,11.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,11.4333333333333,11.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,11.5833333333333,11.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,12.1,12.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,12.25,12.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,12.4333333333333,12.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,12.5833333333333,12.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,12.7666666666666,12.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,12.9166666666666,13.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,13.1,13.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,13.25,13.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,13.4333333333333,13.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,13.5833333333333,13.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,13.7666666666666,13.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,13.9166666666666,14.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,14.1,14.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,14.25,14.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,14.7666666666666,14.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,14.9166666666666,15.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,15.1,15.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,15.25,15.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,15.4333333333333,15.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,15.5833333333333,15.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,16.1,16.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,16.25,16.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,16.4333333333333,16.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,16.5833333333333,16.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,16.7666666666666,16.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,16.9166666666666,17.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,17.1,17.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,17.25,17.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,17.4333333333333,17.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,17.5833333333333,17.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,18.1,18.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,18.25,18.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,18.4333333333333,18.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,18.5833333333333,18.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,18.7666666666666,18.9166666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,18.9166666666666,19.0666666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,19.1,19.25,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,19.25,19.4,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,19.4333333333333,19.5833333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,19.5833333333333,19.7333333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,21,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,20.0833333333333,20.2333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,20.2333333333333,20.3833333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,20.4166666666666,20.5666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,20.5666666666666,20.7166666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,20.75,20.9,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,20.9,21.05,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,21.0833333333333,21.2333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,21.2333333333333,21.3833333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,21.4166666666666,21.5666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,21.5666666666666,21.7166666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,22,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,22.0833333333333,22.2333333333333,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,22.2333333333333,22.3833333333333,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,22.4166666666666,22.5666666666666,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,22.5666666666666,22.7166666666666,Friday,Alt-Schmöckwitz,ALSW02B,5139,2,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,22.75,22.9,Friday,Moßkopfring,MKFR01B,4781,0,4426848,CKB -168,Moßkopfring,MKFR01B,Friday,22.9,23.05,Friday,Alt-Schmöckwitz,ALSW02B,5139,0,4426848,CKB -168,Alt-Schmöckwitz,ALSW02B,Friday,23.05,23.05,Friday,Betriebshof A,BF A A,0.06,0,4426848,CKB -326,Betriebshof Indira-Gandhi-Str.,BF I E,Friday,5.25,6.01666666666666,Friday,S Hermsdorf,SHDF01B,17.9,0,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,6.01666666666666,6.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,6.38333333333333,6.61666666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,6.68333333333333,6.91666666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,7.05,7.28333333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,7.35,7.58333333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,7.71666666666666,7.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,8.01666666666666,8.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,8.38333333333333,8.61666666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,8.68333333333333,8.91666666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,9.05,9.28333333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,9.35,9.58333333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,9.71666666666666,9.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,10.0166666666666,10.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,10.3833333333333,10.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,10.6833333333333,10.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,11.05,11.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,11.35,11.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,11.7166666666666,11.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,12.0166666666666,12.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,12.3833333333333,12.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,12.6833333333333,12.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,13.05,13.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,13.35,13.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,13.7166666666666,13.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,14.0166666666666,14.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,14.3833333333333,14.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,14.6833333333333,14.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,15.05,15.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,15.35,15.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,15.7166666666666,15.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,16.0166666666666,16.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,16.3833333333333,16.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,16.6833333333333,16.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,17.05,17.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,17.35,17.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,17.7166666666666,17.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,18.0166666666666,18.25,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,18.3833333333333,18.6166666666666,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,18.6833333333333,18.9166666666666,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,19.05,19.2833333333333,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,19.35,19.5833333333333,Friday,S Hermsdorf,SHDF01B,4637,8,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,19.7166666666666,19.95,Friday,S Hermsdorf,SHDF01B,4637,4,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,20.0166666666666,20.2333333333333,Friday,S Hermsdorf,SHDF01B,4637,9,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,20.3833333333333,20.6,Friday,S Hermsdorf,SHDF01B,4637,0,4317628,VDL -326,S Hermsdorf,SHDF01B,Friday,20.6,21.25,Friday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317628,VDL -334,Betriebshof A,BF A E,Friday,4.93333333333333,4.93333333333333,Friday,Alt-Gatow,ALTG01B,0.06,18,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,5.23333333333333,5.33333333333333,Friday,Habichtswald,HWLD01B,3.29,0,4425671,CKB -334,Habichtswald,HWLD01B,Friday,5.33333333333333,5.4,Friday,Alt-Gatow,ALTG01B,2954,20,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,5.73333333333333,5.83333333333333,Friday,Habichtswald,HWLD01B,3.29,0,4425671,CKB -334,Habichtswald,HWLD01B,Friday,5.83333333333333,5.9,Friday,Alt-Gatow,ALTG01B,2954,5,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,5.98333333333333,6.1,Friday,Habichtswald,HWLD01B,3.29,2,4425671,CKB -334,Habichtswald,HWLD01B,Friday,6.13333333333333,6.21666666666666,Friday,Alt-Gatow,ALTG01B,2954,19,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,6.53333333333333,6.65,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB -334,Habichtswald,HWLD01B,Friday,6.66666666666666,6.75,Friday,Alt-Gatow,ALTG01B,2954,7,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,6.86666666666666,6.98333333333333,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB -334,Habichtswald,HWLD01B,Friday,7.0,7.08333333333333,Friday,Alt-Gatow,ALTG01B,2954,7,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,7.2,7.31666666666666,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB -334,Habichtswald,HWLD01B,Friday,7.33333333333333,7.41666666666666,Friday,Alt-Gatow,ALTG01B,2954,7,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,7.53333333333333,7.65,Friday,Habichtswald,HWLD01B,3.29,1,4425671,CKB -334,Habichtswald,HWLD01B,Friday,7.66666666666666,7.75,Friday,Alt-Gatow,ALTG01B,2954,295,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,12.6666666666666,12.7833333333333,Friday,Habichtswald,HWLD01B,3.29,2,4425671,CKB -334,Habichtswald,HWLD01B,Friday,12.8166666666666,12.9,Friday,Alt-Gatow,ALTG01B,2954,46,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,13.6666666666666,13.7833333333333,Friday,Habichtswald,HWLD01B,3.29,2,4425671,CKB -334,Habichtswald,HWLD01B,Friday,13.8166666666666,13.9,Friday,Alt-Gatow,ALTG01B,2954,434,4425671,CKB -334,Alt-Gatow,ALTG01B,Friday,21.1333333333333,21.1333333333333,Friday,Betriebshof A,BF A A,0.06,0,4425671,CKB -349,Betriebshof A,BF A E,Friday,7.33333333333333,7.33333333333333,Friday,S Grunewald,SGD02B,0.06,0,4448153,CKB -349,S Grunewald,SGD02B,Friday,7.33333333333333,7.83333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,8.0,8.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,8.66666666666666,9.16666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,9.33333333333333,9.83333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,10.0,10.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,10.6666666666666,11.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,11.3333333333333,11.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,12.0,12.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,12.6666666666666,13.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,13.3333333333333,13.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,14.0,14.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,14.6666666666666,15.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,15.3333333333333,15.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,16.0,16.5,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,16.6666666666666,17.1666666666666,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,17.3333333333333,17.8333333333333,Friday,S Grunewald,SGD02B,9266,10,4448153,CKB -349,S Grunewald,SGD02B,Friday,18.0,18.5,Friday,S Grunewald,SGD02B,9266,0,4448153,CKB -349,S Grunewald,SGD02B,Friday,18.5,18.5,Friday,Betriebshof A,BF A A,0.06,0,4448153,CKB -370,Betriebshof A,BF A E,Friday,7.16666666666666,7.16666666666666,Friday,Neuköllnische Brücke,NKBR04BA,0.06,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,7.16666666666666,7.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,7.46666666666666,7.66666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,7.66666666666666,7.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,7.96666666666666,8.16666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,8.16666666666666,8.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,8.46666666666666,8.66666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,8.66666666666666,8.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,8.96666666666666,9.16666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,9.16666666666666,9.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,9.46666666666666,9.66666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,9.66666666666666,9.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,9.96666666666666,10.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,10.1666666666666,10.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,10.4666666666666,10.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,10.6666666666666,10.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,10.9666666666666,11.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,11.1666666666666,11.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,11.4666666666666,11.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,11.6666666666666,11.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,11.9666666666666,12.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,12.1666666666666,12.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,12.4666666666666,12.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,12.6666666666666,12.8,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,12.9666666666666,13.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,13.1666666666666,13.3,Friday,S+U Hermannstr.,SUHM09B,2169,10,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,13.4666666666666,13.6666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,13.6666666666666,13.8,Friday,S+U Hermannstr.,SUHM09B,2169,8,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,13.9333333333333,14.1666666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,14.1666666666666,14.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,14.55,14.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,14.8333333333333,14.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,15.2166666666666,15.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,15.5,15.65,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,15.8833333333333,16.1166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,16.1666666666666,16.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,16.55,16.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,16.8333333333333,16.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,17.2166666666666,17.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,17.5,17.65,Friday,S+U Hermannstr.,SUHM09B,2169,13,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,17.8666666666666,18.0833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,5,4733898,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,18.1666666666666,18.3,Friday,S+U Hermannstr.,SUHM09B,2169,0,4733898,CKB -370,S+U Hermannstr.,SUHM09B,Friday,18.3,18.3,Friday,Betriebshof A,BF A A,0.06,0,4733898,CKB -370,Betriebshof A,BF A E,Friday,14.2166666666666,14.2166666666666,Friday,S+U Hermannstr.,SUHM09B,0.06,0,4734203,CKB -370,S+U Hermannstr.,SUHM09B,Friday,14.2166666666666,14.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,14.5,14.65,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB -370,S+U Hermannstr.,SUHM09B,Friday,14.8833333333333,15.1166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,15.1666666666666,15.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB -370,S+U Hermannstr.,SUHM09B,Friday,15.55,15.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,15.8333333333333,15.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB -370,S+U Hermannstr.,SUHM09B,Friday,16.2166666666666,16.45,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,16.5,16.65,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB -370,S+U Hermannstr.,SUHM09B,Friday,16.8833333333333,17.1166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,17.1666666666666,17.3166666666666,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB -370,S+U Hermannstr.,SUHM09B,Friday,17.55,17.7833333333333,Friday,Neuköllnische Brücke,NKBR04BA,2952,3,4734203,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,17.8333333333333,17.9833333333333,Friday,S+U Hermannstr.,SUHM09B,2169,14,4734203,CKB -370,S+U Hermannstr.,SUHM09B,Friday,18.2166666666666,18.4166666666666,Friday,Neuköllnische Brücke,NKBR04BA,2952,0,4734203,CKB -370,Neuköllnische Brücke,NKBR04BA,Friday,18.4166666666666,18.4166666666666,Friday,Betriebshof A,BF A A,0.06,0,4734203,CKB -N23,Betriebshof A,BF A E,Saturday,0.383333333333333,0.383333333333333,Saturday,Mäckeritzwiesen,MAWI01B,0.06,0,4318160,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,0.383333333333333,0.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB -N39,U Rohrdamm,URDM01B,Saturday,0.65,0.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB -N39,Mertensstr.,MTNS01B,Saturday,1.05,1.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB -N23,U Rohrdamm,URDM02B,Saturday,1.28333333333333,1.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,1.38333333333333,1.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB -N39,U Rohrdamm,URDM01B,Saturday,1.65,1.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB -N39,Mertensstr.,MTNS01B,Saturday,2.05,2.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB -N23,U Rohrdamm,URDM02B,Saturday,2.28333333333333,2.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,2.38333333333333,2.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB -N39,U Rohrdamm,URDM01B,Saturday,2.65,2.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB -N39,Mertensstr.,MTNS01B,Saturday,3.05,3.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB -N23,U Rohrdamm,URDM02B,Saturday,3.28333333333333,3.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,3.38333333333333,3.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB -N39,U Rohrdamm,URDM01B,Saturday,3.65,3.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB -N39,Mertensstr.,MTNS01B,Saturday,4.05,4.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB -N23,U Rohrdamm,URDM02B,Saturday,4.28333333333333,4.38333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318160,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,4.38333333333333,4.5,Saturday,U Rohrdamm,URDM01B,2577,9,4318160,CKB -N39,U Rohrdamm,URDM01B,Saturday,4.65,4.9,Saturday,Mertensstr.,MTNS01B,5937,9,4318160,CKB -N39,Mertensstr.,MTNS01B,Saturday,5.05,5.28333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318160,CKB -N35,U Rohrdamm,URDM02B,Saturday,5.28333333333333,5.63333333333333,Saturday,Gutsstr.,GUTS01B,12.0,28,4318160,CKB -N35,Gutsstr.,GUTS01B,Saturday,6.1,6.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4318160,CKB -N35,Alt-Kladow,ALKL02B,Saturday,6.45,6.6,Saturday,Gutsstr.,GUTS01B,4343,10,4318160,CKB -N35,Gutsstr.,GUTS01B,Saturday,6.76666666666666,6.85,Saturday,Alt-Kladow,ALKL02B,2936,0,4318160,CKB -334,Alt-Kladow,ALKL02B,Saturday,6.85,7.0,Saturday,Alt-Gatow,ALTG01B,4.6,12,4318160,CKB -334,Alt-Gatow,ALTG01B,Saturday,7.2,7.2,Saturday,Alt-Gatow,ALTG99B,0.0,836,4318160,CKB -334,Alt-Gatow,ALTG99B,Saturday,21.1333333333333,21.1333333333333,Saturday,Alt-Gatow,ALTG01B,0.0,0,4318160,CKB -334,Alt-Gatow,ALTG01B,Saturday,21.1333333333333,21.1333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4318160,CKB -N39,Betriebshof A,BF A E,Saturday,0.55,0.55,Saturday,Mertensstr.,MTNS01B,0.06,0,4318180,CKB -N39,Mertensstr.,MTNS01B,Saturday,0.55,0.783333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB -N23,U Rohrdamm,URDM02B,Saturday,0.783333333333333,0.883333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,0.883333333333333,1.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB -N39,U Rohrdamm,URDM01B,Saturday,1.15,1.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB -N39,Mertensstr.,MTNS01B,Saturday,1.55,1.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB -N23,U Rohrdamm,URDM02B,Saturday,1.78333333333333,1.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,1.88333333333333,2.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB -N39,U Rohrdamm,URDM01B,Saturday,2.15,2.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB -N39,Mertensstr.,MTNS01B,Saturday,2.55,2.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB -N23,U Rohrdamm,URDM02B,Saturday,2.78333333333333,2.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,2.88333333333333,3.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB -N39,U Rohrdamm,URDM01B,Saturday,3.15,3.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB -N39,Mertensstr.,MTNS01B,Saturday,3.55,3.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB -N23,U Rohrdamm,URDM02B,Saturday,3.78333333333333,3.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,3.88333333333333,4.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB -N39,U Rohrdamm,URDM01B,Saturday,4.15,4.4,Saturday,Mertensstr.,MTNS01B,5937,9,4318180,CKB -N39,Mertensstr.,MTNS01B,Saturday,4.55,4.78333333333333,Saturday,U Rohrdamm,URDM02B,6.19,0,4318180,CKB -N23,U Rohrdamm,URDM02B,Saturday,4.78333333333333,4.88333333333333,Saturday,Mäckeritzwiesen,MAWI01B,2555,0,4318180,CKB -N23,Mäckeritzwiesen,MAWI01B,Saturday,4.88333333333333,5.0,Saturday,U Rohrdamm,URDM01B,2577,9,4318180,CKB -N39,U Rohrdamm,URDM01B,Saturday,5.15,5.4,Saturday,Mertensstr.,MTNS01B,5937,0,4318180,CKB -N39,Mertensstr.,MTNS01B,Saturday,5.4,5.4,Saturday,Betriebshof A,BF A A,0.06,0,4318180,CKB -N35,Betriebshof A,BF A E,Saturday,0.95,0.95,Saturday,Alt-Kladow,ALKL02B,0.06,0,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,0.95,1.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,1.1,1.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,1.45,1.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,1.6,1.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,1.95,2.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,2.1,2.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,2.45,2.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,2.6,2.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,2.95,3.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,3.1,3.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,3.45,3.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,3.6,3.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,3.95,4.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,4.1,4.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,4.45,4.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,4.6,4.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,4.95,5.1,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,5.1,5.18333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,5.45,5.6,Saturday,Gutsstr.,GUTS01B,4343,0,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,5.6,5.68333333333333,Saturday,Alt-Kladow,ALKL02B,2936,16,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,5.95,6.1,Saturday,Gutsstr.,GUTS01B,4343,20,4319355,CKB -N35,Gutsstr.,GUTS01B,Saturday,6.43333333333333,6.51666666666666,Saturday,Alt-Kladow,ALKL02B,2936,0,4319355,CKB -N35,Alt-Kladow,ALKL02B,Saturday,6.51666666666666,6.51666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4319355,CKB -N53,Betriebshof A,BF A E,Saturday,0.5,0.5,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,0.5,0.733333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,0.733333333333333,0.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,1.0,1.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,1.23333333333333,1.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,1.5,1.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,1.73333333333333,1.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,2.0,2.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,2.23333333333333,2.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,2.5,2.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,2.73333333333333,2.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,3.0,3.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,3.23333333333333,3.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,3.5,3.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,3.73333333333333,3.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,4.0,4.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,4.23333333333333,4.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,4.5,4.73333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,4.73333333333333,4.95,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,5.0,5.23333333333333,Saturday,Wilhelmsruher Damm,WIDA02B,4801,0,4453548,CKB -N53,Wilhelmsruher Damm,WIDA02B,Saturday,5.23333333333333,5.45,Saturday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,0,4453548,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Saturday,5.45,5.45,Saturday,Betriebshof A,BF A A,0.06,0,4453548,CKB -N62,Betriebshof A,BF A E,Saturday,0.533333333333333,0.533333333333333,Saturday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747653,CKB -N62,Schloßplatz Köpenick,SLPZ02BN,Saturday,0.533333333333333,0.733333333333333,Saturday,Wendenschloß,WESC09BA,4212,3,4747653,CKB -N62,Wendenschloß,WESC09BA,Saturday,0.783333333333333,1.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,1.26666666666666,1.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB -N62,Wendenschloß,WESC09BA,Saturday,1.78333333333333,2.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,2.26666666666666,2.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB -N62,Wendenschloß,WESC09BA,Saturday,2.78333333333333,3.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,3.26666666666666,3.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB -N62,Wendenschloß,WESC09BA,Saturday,3.78333333333333,4.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,4.26666666666666,4.7,Saturday,Wendenschloß,WESC09BA,12869,5,4747653,CKB -N62,Wendenschloß,WESC09BA,Saturday,4.78333333333333,5.26666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747653,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,5.26666666666666,5.56666666666666,Saturday,Betriebshof Köpenick,BHKO01BN,9538,0,4747653,CKB -N62,Betriebshof Köpenick,BHKO01BN,Saturday,5.56666666666666,5.56666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4747653,CKB -N62,Betriebshof A,BF A E,Saturday,0.283333333333333,0.283333333333333,Saturday,Wendenschloß,WESC09BA,0.06,0,4747663,CKB -N62,Wendenschloß,WESC09BA,Saturday,0.283333333333333,0.766666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,0.766666666666666,1.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB -N62,Wendenschloß,WESC09BA,Saturday,1.28333333333333,1.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,1.76666666666666,2.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB -N62,Wendenschloß,WESC09BA,Saturday,2.28333333333333,2.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,2.76666666666666,3.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB -N62,Wendenschloß,WESC09BA,Saturday,3.28333333333333,3.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,3.76666666666666,4.2,Saturday,Wendenschloß,WESC09BA,12869,5,4747663,CKB -N62,Wendenschloß,WESC09BA,Saturday,4.28333333333333,4.76666666666666,Saturday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747663,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Saturday,4.76666666666666,5.2,Saturday,Wendenschloß,WESC09BA,12869,0,4747663,CKB -N62,Wendenschloß,WESC09BA,Saturday,5.2,5.2,Saturday,Betriebshof A,BF A A,0.06,0,4747663,CKB -N68,Betriebshof A,BF A E,Saturday,0.816666666666666,0.816666666666666,Saturday,S Adlershof,SAH02BN,0.06,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,0.816666666666666,1.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,1.06666666666666,1.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,1.31666666666666,1.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,1.56666666666666,1.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,1.81666666666666,2.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,2.06666666666666,2.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,2.31666666666666,2.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,2.56666666666666,2.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,2.81666666666666,3.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,3.06666666666666,3.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,3.31666666666666,3.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,3.56666666666666,3.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,3.81666666666666,4.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,4.06666666666666,4.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,4.31666666666666,4.56666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,4.56666666666666,4.81666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,4.81666666666666,5.06666666666666,Saturday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434344,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Saturday,5.06666666666666,5.31666666666666,Saturday,S Adlershof,SAH02BN,11801,0,4434344,CKB -N68,S Adlershof,SAH02BN,Saturday,5.31666666666666,5.31666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4434344,CKB -N88,Betriebshof A,BF A E,Saturday,2.56666666666666,2.56666666666666,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4514364,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,2.56666666666666,3.0,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4514364,CKB -N88,S Lichterfelde Süd,SLIS01B,Saturday,3.0,3.45,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4514364,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,3.56666666666666,4.0,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4514364,CKB -N88,S Lichterfelde Süd,SLIS01B,Saturday,4.0,4.45,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4514364,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,4.56666666666666,5.0,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4514364,CKB -N88,S Lichterfelde Süd,SLIS01B,Saturday,5.0,5.45,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4514364,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,5.45,5.45,Saturday,Betriebshof A,BF A A,0.06,0,4514364,CKB -N88,Betriebshof A,BF A E,Saturday,2.06666666666666,2.06666666666666,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619999,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,2.06666666666666,2.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB -N88,S Lichterfelde Süd,SLIS01B,Saturday,2.5,2.95,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619999,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,3.06666666666666,3.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB -N88,S Lichterfelde Süd,SLIS01B,Saturday,3.5,3.95,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619999,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,4.06666666666666,4.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB -N88,S Lichterfelde Süd,SLIS01B,Saturday,4.5,4.95,Saturday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619999,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Saturday,5.06666666666666,5.5,Saturday,S Lichterfelde Süd,SLIS01B,9016,0,4619999,CKB -N88,S Lichterfelde Süd,SLIS01B,Saturday,5.5,5.5,Saturday,Betriebshof A,BF A A,0.06,0,4619999,CKB -N91,Betriebshof A,BF A E,Saturday,0.516666666666666,0.516666666666666,Saturday,S+U Wuhletal,SUWT02BN,0.06,0,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,0.516666666666666,0.733333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,0.733333333333333,0.933333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,1.01666666666666,1.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,1.23333333333333,1.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,1.51666666666666,1.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,1.73333333333333,1.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,2.01666666666666,2.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,2.23333333333333,2.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,2.51666666666666,2.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,2.73333333333333,2.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,3.01666666666666,3.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,3.23333333333333,3.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,3.51666666666666,3.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,3.73333333333333,3.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,4.01666666666666,4.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,4.23333333333333,4.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,4.51666666666666,4.73333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,4.73333333333333,4.93333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,5,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,5.01666666666666,5.23333333333333,Saturday,Boschpoler Str.,BOPO01BN,4872,0,4374747,CKB -N91,Boschpoler Str.,BOPO01BN,Saturday,5.23333333333333,5.43333333333333,Saturday,S+U Wuhletal,SUWT02BN,5362,0,4374747,CKB -N91,S+U Wuhletal,SUWT02BN,Saturday,5.43333333333333,5.43333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4374747,CKB -N95,Betriebshof A,BF A E,Saturday,0.516666666666666,0.516666666666666,Saturday,S+U Wuhletal,SUWT02BN,0.06,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,0.516666666666666,0.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,0.783333333333333,1.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,1.01666666666666,1.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,1.28333333333333,1.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,1.51666666666666,1.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,1.78333333333333,2.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,2.01666666666666,2.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,2.28333333333333,2.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,2.51666666666666,2.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,2.78333333333333,3.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,3.01666666666666,3.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,3.28333333333333,3.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,3.51666666666666,3.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,3.78333333333333,4.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,4.01666666666666,4.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,4.28333333333333,4.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,4.51666666666666,4.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,4.78333333333333,5.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,5.01666666666666,5.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,5.28333333333333,5.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,5.51666666666666,5.75,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,5.78333333333333,6.01666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,6.01666666666666,6.25,Saturday,Riesaer Str.,RIES01BN,5225,2,4374870,CKB -N95,Riesaer Str.,RIES01BN,Saturday,6.28333333333333,6.51666666666666,Saturday,S+U Wuhletal,SUWT02BN,7617,0,4374870,CKB -N95,S+U Wuhletal,SUWT02BN,Saturday,6.51666666666666,6.75,Saturday,Riesaer Str.,RIES04B,5096,0,4374870,CKB -N95,Riesaer Str.,RIES04B,Saturday,6.75,6.75,Saturday,Betriebshof A,BF A A,0.06,0,4374870,CKB -N97,Betriebshof A,BF A E,Saturday,0.716666666666666,0.716666666666666,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,0.716666666666666,0.883333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,0.883333333333333,1.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,1.21666666666666,1.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,1.38333333333333,1.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,1.71666666666666,1.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,1.88333333333333,2.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,2.21666666666666,2.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,2.38333333333333,2.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,2.71666666666666,2.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,2.88333333333333,3.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,3.21666666666666,3.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,3.38333333333333,3.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,3.71666666666666,3.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,3.88333333333333,4.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,4.21666666666666,4.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,4.38333333333333,4.55,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,4.71666666666666,4.88333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,4.88333333333333,5.05,Saturday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375016,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Saturday,5.21666666666666,5.38333333333333,Saturday,Barnimplatz,BARN01B,4507,0,4375016,CKB -N97,Barnimplatz,BARN01B,Saturday,5.38333333333333,5.38333333333333,Saturday,Betriebshof A,BF A A,0.06,0,4375016,CKB -160,Betriebshof A,BF A E,Saturday,20.85,20.85,Saturday,Hasselwerderstr.,HAWR01B,0.06,0,4454966,CKB -160,Hasselwerderstr.,HAWR01B,Saturday,20.85,21.4,Saturday,Siriusstr.,SIRI01B,14519,4,4454966,CKB -160,Siriusstr.,SIRI01B,Saturday,21.4666666666666,22.05,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454966,CKB -160,Hasselwerderstr.,HAWR01B,Saturday,22.1833333333333,22.7333333333333,Saturday,Siriusstr.,SIRI01B,14519,4,4454966,CKB -160,Siriusstr.,SIRI01B,Saturday,22.8,23.3833333333333,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454966,CKB -160,Hasselwerderstr.,HAWR01B,Saturday,23.5166666666666,24.0666666666666,Sunday,Siriusstr.,SIRI01B,14519,4,4454966,CKB -160,Siriusstr.,SIRI01B,Sunday,0.133333333333333,0.65,Sunday,S Schöneweide/Sterndamm,SSWS06B,12213,0,4454966,CKB -N60,S Schöneweide/Sterndamm,SSWS06B,Sunday,0.65,0.783333333333333,Sunday,S Adlershof,SAH02BN,4.0,2,4454966,CKB -N60,S Adlershof,SAH02BN,Sunday,0.816666666666666,1.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,1.3,1.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB -N60,S Adlershof,SAH02BN,Sunday,1.81666666666666,2.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,2.3,2.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB -N60,S Adlershof,SAH02BN,Sunday,2.81666666666666,3.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,3.3,3.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB -N60,S Adlershof,SAH02BN,Sunday,3.81666666666666,4.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,4.3,4.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB -N60,S Adlershof,SAH02BN,Sunday,4.81666666666666,5.2,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454966,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,5.3,5.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB -N60,S Adlershof,SAH02BN,Sunday,5.81666666666666,6.13333333333333,Sunday,Flughafen Schönefeld,SXF01B,8762,10,4454966,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,6.3,6.6,Sunday,S Adlershof,SAH02BN,9067,13,4454966,CKB -N60,S Adlershof,SAH02BN,Sunday,6.81666666666666,7.13333333333333,Sunday,Flughafen Schönefeld,SXF01B,8762,0,4454966,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,7.13333333333333,7.13333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4454966,CKB -160,Betriebshof A,BF A E,Saturday,21.5166666666666,21.5166666666666,Saturday,Hasselwerderstr.,HAWR01B,0.06,0,4454967,CKB -160,Hasselwerderstr.,HAWR01B,Saturday,21.5166666666666,22.0666666666666,Saturday,Siriusstr.,SIRI01B,14519,4,4454967,CKB -160,Siriusstr.,SIRI01B,Saturday,22.1333333333333,22.7166666666666,Saturday,Hasselwerderstr.,HAWR01B,13541,8,4454967,CKB -160,Hasselwerderstr.,HAWR01B,Saturday,22.85,23.4,Saturday,Siriusstr.,SIRI01B,14519,4,4454967,CKB -160,Siriusstr.,SIRI01B,Saturday,23.4666666666666,24.05,Sunday,Hasselwerderstr.,HAWR01B,13541,8,4454967,CKB -160,Hasselwerderstr.,HAWR01B,Sunday,0.183333333333333,0.733333333333333,Sunday,Siriusstr.,SIRI01B,14519,0,4454967,CKB -N60,Siriusstr.,SIRI01B,Sunday,0.733333333333333,0.9,Sunday,S Adlershof,SAH02BN,4.1,25,4454967,CKB -N60,S Adlershof,SAH02BN,Sunday,1.31666666666666,1.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,1.8,2.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB -N60,S Adlershof,SAH02BN,Sunday,2.31666666666666,2.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,2.8,3.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB -N60,S Adlershof,SAH02BN,Sunday,3.31666666666666,3.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,3.8,4.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB -N60,S Adlershof,SAH02BN,Sunday,4.31666666666666,4.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,4.8,5.1,Sunday,S Adlershof,SAH02BN,9067,13,4454967,CKB -N60,S Adlershof,SAH02BN,Sunday,5.31666666666666,5.7,Sunday,Flughafen Schönefeld,SXF01B,8.36,6,4454967,CKB -N60,Flughafen Schönefeld,SXF01B,Sunday,5.8,6.1,Sunday,S Adlershof,SAH02BN,9067,0,4454967,CKB -N60,S Adlershof,SAH02BN,Sunday,6.1,6.1,Sunday,Betriebshof A,BF A A,0.06,0,4454967,CKB -161,Betriebshof A,BF A E,Saturday,21.1,21.1,Saturday,S Erkner/ZOB,SERZ01B,0.06,0,4664765,CKB -161,S Erkner/ZOB,SERZ01B,Saturday,21.1,21.5666666666666,Saturday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4664765,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,21.8833333333333,22.2166666666666,Saturday,Lutherstr.,LUTH01B,10332,17,4664765,CKB -161,Lutherstr.,LUTH01B,Saturday,22.5,22.9,Saturday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4664765,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,23.2166666666666,23.55,Saturday,Lutherstr.,LUTH01B,10332,17,4664765,CKB -161,Lutherstr.,LUTH01B,Saturday,23.8333333333333,24.2333333333333,Sunday,"Schöneiche, Lübecker Str.",SELS01B,10.48,8,4664765,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Sunday,0.366666666666666,0.45,Sunday,S Rahnsdorf,SRD01B,2533,2,4664765,CKB -N61,S Rahnsdorf,SRD01B,Sunday,0.483333333333333,0.783333333333333,Sunday,Dämeritzstr.,DARI01B,7.58,0,4664765,CKB -N61,Dämeritzstr.,DARI01B,Sunday,0.783333333333333,1.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,1.28333333333333,1.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB -N61,Dämeritzstr.,DARI01B,Sunday,1.78333333333333,2.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,2.28333333333333,2.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB -N61,Dämeritzstr.,DARI01B,Sunday,2.78333333333333,3.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,3.28333333333333,3.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB -N61,Dämeritzstr.,DARI01B,Sunday,3.78333333333333,4.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,4.28333333333333,4.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB -N61,Dämeritzstr.,DARI01B,Sunday,4.78333333333333,5.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,5.28333333333333,5.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB -N61,Dämeritzstr.,DARI01B,Sunday,5.78333333333333,6.23333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4664765,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,6.28333333333333,6.78333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4664765,CKB -N61,Dämeritzstr.,DARI01B,Sunday,6.78333333333333,6.98333333333333,Sunday,S Rahnsdorf,SRD01B,5474,0,4664765,CKB -N61,S Rahnsdorf,SRD01B,Sunday,6.98333333333333,6.98333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4664765,CKB -161,Betriebshof A,BF A E,Saturday,20.4333333333333,20.4333333333333,Saturday,S Erkner/ZOB,SERZ01B,0.06,0,4762771,CKB -161,S Erkner/ZOB,SERZ01B,Saturday,20.4333333333333,20.9333333333333,Saturday,"Schöneiche, Goethepark",SEGP01BA,14097,14,4762771,CKB -161,"Schöneiche, Goethepark",SEGP01BA,Saturday,21.1666666666666,21.6333333333333,Saturday,S Erkner/ZOB,SERZ01B,13.19,8,4762771,CKB -161,S Erkner/ZOB,SERZ01B,Saturday,21.7666666666666,22.2333333333333,Saturday,"Schöneiche, Lübecker Str.",SELS01B,13018,19,4762771,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,22.55,22.8833333333333,Saturday,Lutherstr.,LUTH01B,10332,17,4762771,CKB -161,Lutherstr.,LUTH01B,Saturday,23.1666666666666,23.5666666666666,Saturday,"Schöneiche, Lübecker Str.",SELS01B,10.48,19,4762771,CKB -161,"Schöneiche, Lübecker Str.",SELS01B,Saturday,23.8833333333333,24.2166666666666,Sunday,Lutherstr.,LUTH01B,10332,2,4762771,CKB -161,Lutherstr.,LUTH01B,Sunday,0.25,0.266666666666666,Sunday,Dämeritzstr.,DARI01B,506,1,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,0.283333333333333,0.733333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,0.783333333333333,1.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,1.28333333333333,1.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,1.78333333333333,2.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,2.28333333333333,2.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,2.78333333333333,3.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,3.28333333333333,3.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,3.78333333333333,4.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,4.28333333333333,4.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,4.78333333333333,5.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,5.28333333333333,5.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,5.78333333333333,6.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,6.28333333333333,6.73333333333333,Sunday,S Friedrichshagen,SFHG05BN,12841,3,4762771,CKB -N61,S Friedrichshagen,SFHG05BN,Sunday,6.78333333333333,7.28333333333333,Sunday,Dämeritzstr.,DARI01B,14281,0,4762771,CKB -N61,Dämeritzstr.,DARI01B,Sunday,7.28333333333333,7.28333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4762771,CKB -163,Betriebshof A,BF A E,Saturday,20.4333333333333,20.4333333333333,Saturday,S Grünau,SGA24BA,0.06,0,4617438,CKB -163,S Grünau,SGA24BA,Saturday,20.4333333333333,20.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,5882,3,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,20.6833333333333,20.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB -163,S Grünau,SGA22BA,Saturday,20.9166666666666,21.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,21.1833333333333,21.4166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB -163,S Grünau,SGA22BA,Saturday,21.4166666666666,21.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,21.6833333333333,21.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB -163,S Grünau,SGA22BA,Saturday,21.9166666666666,22.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,22.1833333333333,22.4166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB -163,S Grünau,SGA22BA,Saturday,22.4166666666666,22.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,22.6833333333333,22.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB -163,S Grünau,SGA22BA,Saturday,22.9166666666666,23.1333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,23.1833333333333,23.4166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB -163,S Grünau,SGA22BA,Saturday,23.4166666666666,23.6333333333333,Saturday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,3,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Saturday,23.6833333333333,23.9166666666666,Saturday,S Grünau,SGA22BA,6232,0,4617438,CKB -163,S Grünau,SGA22BA,Saturday,23.9166666666666,24.1333333333333,Sunday,S Flughafen Berlin-Schönefeld,SSXF01B,6086,0,4617438,CKB -163,S Flughafen Berlin-Schönefeld,SSXF01B,Sunday,0.133333333333333,0.133333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4617438,CKB -168,Betriebshof A,BF A E,Saturday,5.41666666666666,5.41666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,0.06,0,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,5.41666666666666,5.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,5.56666666666666,5.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,6.08333333333333,6.23333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,6.23333333333333,6.38333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,6.41666666666666,6.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,6.56666666666666,6.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,6.75,6.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,6.9,7.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,7.08333333333333,7.23333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,7.23333333333333,7.38333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,7.41666666666666,7.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,7.56666666666666,7.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,8.08333333333333,8.23333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,8.23333333333333,8.38333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,8.41666666666666,8.56666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,8.56666666666666,8.71666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,8.75,8.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,8.9,9.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,3,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,9.1,9.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,9.25,9.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,9.43333333333333,9.58333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,9.58333333333333,9.73333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,10.1,10.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,10.25,10.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,10.4333333333333,10.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,10.5833333333333,10.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,10.7666666666666,10.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,10.9166666666666,11.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,11.1,11.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,11.25,11.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,11.4333333333333,11.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,11.5833333333333,11.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,12.1,12.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,12.25,12.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,12.4333333333333,12.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,12.5833333333333,12.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,12.7666666666666,12.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,12.9166666666666,13.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,13.1,13.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,13.25,13.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,13.4333333333333,13.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,13.5833333333333,13.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,14.1,14.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,14.25,14.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,14.4333333333333,14.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,14.5833333333333,14.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,14.7666666666666,14.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,14.9166666666666,15.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,15.1,15.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,15.25,15.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,15.4333333333333,15.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,15.5833333333333,15.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,16.1,16.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,16.25,16.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,16.4333333333333,16.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,16.5833333333333,16.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,16.7666666666666,16.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,16.9166666666666,17.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,17.1,17.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,17.25,17.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,17.4333333333333,17.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,17.5833333333333,17.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,18.1,18.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,18.25,18.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,18.4333333333333,18.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,18.5833333333333,18.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,18.7666666666666,18.9166666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,18.9166666666666,19.0666666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,19.1,19.25,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,19.25,19.4,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,19.4333333333333,19.5833333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,19.5833333333333,19.7333333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,21,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,20.0833333333333,20.2333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,20.2333333333333,20.3833333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,20.4166666666666,20.5666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,20.5666666666666,20.7166666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,20.75,20.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,20.9,21.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,21.0833333333333,21.2333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,21.2333333333333,21.3833333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,21.4166666666666,21.5666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,21.5666666666666,21.7166666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,22,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,22.0833333333333,22.2333333333333,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,22.2333333333333,22.3833333333333,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,22.4166666666666,22.5666666666666,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,22.5666666666666,22.7166666666666,Saturday,Alt-Schmöckwitz,ALSW02B,5139,2,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,22.75,22.9,Saturday,Moßkopfring,MKFR01B,4781,0,4426894,CKB -168,Moßkopfring,MKFR01B,Saturday,22.9,23.05,Saturday,Alt-Schmöckwitz,ALSW02B,5139,0,4426894,CKB -168,Alt-Schmöckwitz,ALSW02B,Saturday,23.05,23.05,Saturday,Betriebshof A,BF A A,0.06,0,4426894,CKB -294,Betriebshof A,BF A E,Saturday,7.5,7.5,Saturday,Seehausener Str.,SEEH01B,0.06,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,7.5,7.58333333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,7.65,7.83333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,7.83333333333333,7.91666666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,7.98333333333333,8.16666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,8.16666666666666,8.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,8.31666666666666,8.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,8.5,8.58333333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,8.65,8.83333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,8.83333333333333,8.91666666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,8.98333333333333,9.16666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,9.16666666666666,9.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,9.31666666666666,9.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,9.5,9.58333333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,9.65,9.83333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,9.83333333333333,9.91666666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,9.98333333333333,10.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,10.1666666666666,10.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,10.3166666666666,10.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,10.5,10.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,10.65,10.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,10.8333333333333,10.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,10.9833333333333,11.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,11.1666666666666,11.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,11.3166666666666,11.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,11.5,11.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,11.65,11.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,11.8333333333333,11.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,11.9833333333333,12.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,12.1666666666666,12.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,12.3166666666666,12.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,12.5,12.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,12.65,12.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,12.8333333333333,12.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,12.9833333333333,13.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,13.1666666666666,13.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,13.3166666666666,13.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,13.5,13.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,13.65,13.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,13.8333333333333,13.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,13.9833333333333,14.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,14.1666666666666,14.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,14.3166666666666,14.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,14.5,14.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,14.65,14.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,14.8333333333333,14.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,14.9833333333333,15.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,15.1666666666666,15.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,15.3166666666666,15.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,15.5,15.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,15.65,15.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,15.8333333333333,15.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,15.9833333333333,16.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,16.1666666666666,16.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,16.3166666666666,16.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,16.5,16.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,16.65,16.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,16.8333333333333,16.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,16.9833333333333,17.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,17.1666666666666,17.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,17.3166666666666,17.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,17.5,17.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,17.65,17.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,17.8333333333333,17.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,17.9833333333333,18.1666666666666,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,18.1666666666666,18.25,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,18.3166666666666,18.5,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,18.5,18.5833333333333,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,18.65,18.8333333333333,Saturday,Seehausener Str.,SEEH01B,4341,0,4369705,CKB -294,Seehausener Str.,SEEH01B,Saturday,18.8333333333333,18.9166666666666,Saturday,Gehrenseestr.,GEHR05B,2217,4,4369705,CKB -294,Gehrenseestr.,GEHR05B,Saturday,18.9833333333333,19.1666666666666,Saturday,Seehausener Str.,SEEH02B,4288,0,4369705,CKB -294,Seehausener Str.,SEEH02B,Saturday,19.1666666666666,19.1666666666666,Saturday,Betriebshof A,BF A A,0.06,0,4369705,CKB -326,Betriebshof Indira-Gandhi-Str.,BF I E,Saturday,8.13333333333333,8.68333333333333,Saturday,S Hermsdorf,SHDF01B,17.9,0,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,8.68333333333333,8.9,Saturday,S Hermsdorf,SHDF01B,4637,9,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,9.05,9.28333333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,9.35,9.58333333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,9.71666666666666,9.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,10.0166666666666,10.25,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,10.3833333333333,10.6166666666666,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,10.6833333333333,10.9166666666666,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,11.05,11.2833333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,11.35,11.5833333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,11.7166666666666,11.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,12.0166666666666,12.25,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,12.3833333333333,12.6166666666666,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,12.6833333333333,12.9166666666666,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,13.05,13.2833333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,13.35,13.5833333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,13.7166666666666,13.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,14.0166666666666,14.25,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,14.3833333333333,14.6166666666666,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,14.6833333333333,14.9166666666666,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,15.05,15.2833333333333,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,15.35,15.5833333333333,Saturday,S Hermsdorf,SHDF01B,4637,8,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,15.7166666666666,15.95,Saturday,S Hermsdorf,SHDF01B,4637,4,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,16.0166666666666,16.2333333333333,Saturday,S Hermsdorf,SHDF01B,4637,0,4317640,VDL -326,S Hermsdorf,SHDF01B,Saturday,16.2333333333333,16.95,Saturday,Betriebshof Indira-Gandhi-Str.,BF I A,19.8,0,4317640,VDL -369,Betriebshof A,BF A E,Saturday,7.3,7.3,Saturday,Müggelheim/Dorf,MHDO01B,0.06,0,4706426,CKB -369,Müggelheim/Dorf,MHDO01B,Saturday,7.3,7.43333333333333,Saturday,"Gosen, Eiche",GOSE01B,5562,10,4706426,CKB -369,"Gosen, Eiche",GOSE01B,Saturday,7.6,7.75,Saturday,Alt-Müggelheim,ALMG01B,5941,32,4706426,CKB -369,Alt-Müggelheim,ALMG01B,Saturday,8.28333333333333,8.43333333333333,Saturday,"Gosen, Eiche",GOSE01B,5994,8,4706426,CKB -369,"Gosen, Eiche",GOSE01B,Saturday,8.56666666666666,8.7,Saturday,Müggelheim/Dorf,MHDO02B,5566,0,4706426,CKB -369,Müggelheim/Dorf,MHDO02B,Saturday,8.7,8.7,Saturday,Betriebshof A,BF A A,0.06,0,4706426,CKB -370,Betriebshof A,BF A E,Saturday,8.16666666666666,8.16666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,0.06,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,8.16666666666666,8.26666666666666,Saturday,S+U Hermannstr.,SUHM09B,2169,12,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,8.46666666666666,8.63333333333333,Saturday,Neuköllnische Brücke,NKBR04BA,2952,2,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,8.66666666666666,8.76666666666666,Saturday,S+U Hermannstr.,SUHM09B,2169,12,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,8.96666666666666,9.16666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,9.16666666666666,9.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,9.46666666666666,9.66666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,9.66666666666666,9.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,9.96666666666666,10.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,10.1666666666666,10.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,10.4666666666666,10.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,10.6666666666666,10.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,10.9666666666666,11.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,11.1666666666666,11.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,11.4666666666666,11.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,11.6666666666666,11.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,11.9666666666666,12.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,12.1666666666666,12.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,12.4666666666666,12.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,12.6666666666666,12.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,12.9666666666666,13.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,13.1666666666666,13.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,13.4666666666666,13.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,13.6666666666666,13.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,13.9666666666666,14.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,14.1666666666666,14.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,14.4666666666666,14.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,14.6666666666666,14.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,14.9666666666666,15.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,15.1666666666666,15.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,15.4666666666666,15.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,15.6666666666666,15.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,15.9666666666666,16.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,16.1666666666666,16.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,16.4666666666666,16.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,16.6666666666666,16.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,16.9666666666666,17.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,17.1666666666666,17.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,17.4666666666666,17.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,17.6666666666666,17.8,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,17.9666666666666,18.1666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,18.1666666666666,18.3,Saturday,S+U Hermannstr.,SUHM09B,2169,10,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,18.4666666666666,18.6666666666666,Saturday,Neuköllnische Brücke,NKBR04BA,2952,0,4731254,CKB -370,Neuköllnische Brücke,NKBR04BA,Saturday,18.6666666666666,18.8,Saturday,S+U Hermannstr.,SUHM09B,2169,0,4731254,CKB -370,S+U Hermannstr.,SUHM09B,Saturday,18.8,18.8,Saturday,Betriebshof A,BF A A,0.06,0,4731254,CKB -N23,Betriebshof A,BF A E,Sunday,0.383333333333333,0.383333333333333,Sunday,Mäckeritzwiesen,MAWI01B,0.06,0,4317771,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,0.383333333333333,0.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB -N39,U Rohrdamm,URDM01B,Sunday,0.65,0.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB -N39,Mertensstr.,MTNS01B,Sunday,1.05,1.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB -N23,U Rohrdamm,URDM02B,Sunday,1.28333333333333,1.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,1.38333333333333,1.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB -N39,U Rohrdamm,URDM01B,Sunday,1.65,1.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB -N39,Mertensstr.,MTNS01B,Sunday,2.05,2.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB -N23,U Rohrdamm,URDM02B,Sunday,2.28333333333333,2.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,2.38333333333333,2.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB -N39,U Rohrdamm,URDM01B,Sunday,2.65,2.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB -N39,Mertensstr.,MTNS01B,Sunday,3.05,3.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB -N23,U Rohrdamm,URDM02B,Sunday,3.28333333333333,3.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,3.38333333333333,3.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB -N39,U Rohrdamm,URDM01B,Sunday,3.65,3.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB -N39,Mertensstr.,MTNS01B,Sunday,4.05,4.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB -N23,U Rohrdamm,URDM02B,Sunday,4.28333333333333,4.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,4.38333333333333,4.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB -N39,U Rohrdamm,URDM01B,Sunday,4.65,4.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB -N39,Mertensstr.,MTNS01B,Sunday,5.05,5.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB -N23,U Rohrdamm,URDM02B,Sunday,5.28333333333333,5.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,5.38333333333333,5.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB -N39,U Rohrdamm,URDM01B,Sunday,5.65,5.9,Sunday,Mertensstr.,MTNS01B,5937,9,4317771,CKB -N39,Mertensstr.,MTNS01B,Sunday,6.05,6.28333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317771,CKB -N23,U Rohrdamm,URDM02B,Sunday,6.28333333333333,6.38333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317771,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,6.38333333333333,6.5,Sunday,U Rohrdamm,URDM01B,2577,9,4317771,CKB -N39,U Rohrdamm,URDM01B,Sunday,6.65,6.9,Sunday,Mertensstr.,MTNS01B,5937,0,4317771,CKB -N39,Mertensstr.,MTNS01B,Sunday,6.9,6.9,Sunday,Betriebshof A,BF A A,0.06,0,4317771,CKB -N39,Betriebshof A,BF A E,Sunday,0.55,0.55,Sunday,Mertensstr.,MTNS01B,0.06,0,4317937,CKB -N39,Mertensstr.,MTNS01B,Sunday,0.55,0.783333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB -N23,U Rohrdamm,URDM02B,Sunday,0.783333333333333,0.883333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,0.883333333333333,1.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB -N39,U Rohrdamm,URDM01B,Sunday,1.15,1.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB -N39,Mertensstr.,MTNS01B,Sunday,1.55,1.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB -N23,U Rohrdamm,URDM02B,Sunday,1.78333333333333,1.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,1.88333333333333,2.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB -N39,U Rohrdamm,URDM01B,Sunday,2.15,2.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB -N39,Mertensstr.,MTNS01B,Sunday,2.55,2.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB -N23,U Rohrdamm,URDM02B,Sunday,2.78333333333333,2.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,2.88333333333333,3.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB -N39,U Rohrdamm,URDM01B,Sunday,3.15,3.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB -N39,Mertensstr.,MTNS01B,Sunday,3.55,3.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB -N23,U Rohrdamm,URDM02B,Sunday,3.78333333333333,3.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,3.88333333333333,4.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB -N39,U Rohrdamm,URDM01B,Sunday,4.15,4.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB -N39,Mertensstr.,MTNS01B,Sunday,4.55,4.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB -N23,U Rohrdamm,URDM02B,Sunday,4.78333333333333,4.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,4.88333333333333,5.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB -N39,U Rohrdamm,URDM01B,Sunday,5.15,5.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB -N39,Mertensstr.,MTNS01B,Sunday,5.55,5.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB -N23,U Rohrdamm,URDM02B,Sunday,5.78333333333333,5.88333333333333,Sunday,Mäckeritzwiesen,MAWI01B,2555,0,4317937,CKB -N23,Mäckeritzwiesen,MAWI01B,Sunday,5.88333333333333,6.0,Sunday,U Rohrdamm,URDM01B,2577,9,4317937,CKB -N39,U Rohrdamm,URDM01B,Sunday,6.15,6.4,Sunday,Mertensstr.,MTNS01B,5937,9,4317937,CKB -N39,Mertensstr.,MTNS01B,Sunday,6.55,6.78333333333333,Sunday,U Rohrdamm,URDM02B,6.19,0,4317937,CKB -N39,U Rohrdamm,URDM02B,Sunday,6.78333333333333,6.78333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4317937,CKB -N35,Betriebshof A,BF A E,Sunday,0.95,0.95,Sunday,Alt-Kladow,ALKL02B,0.06,0,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,0.95,1.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,1.1,1.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,1.45,1.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,1.6,1.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,1.95,2.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,2.1,2.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,2.45,2.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,2.6,2.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,2.95,3.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,3.1,3.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,3.45,3.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,3.6,3.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,3.95,4.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,4.1,4.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,4.45,4.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,4.6,4.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,4.95,5.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,5.1,5.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,5.45,5.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,5.6,5.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,5.95,6.1,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,6.1,6.18333333333333,Sunday,Alt-Kladow,ALKL02B,2936,16,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,6.45,6.6,Sunday,Gutsstr.,GUTS01B,4343,0,4319402,CKB -N35,Gutsstr.,GUTS01B,Sunday,6.6,6.68333333333333,Sunday,Alt-Kladow,ALKL02B,2936,0,4319402,CKB -N35,Alt-Kladow,ALKL02B,Sunday,6.68333333333333,6.68333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4319402,CKB -N53,Betriebshof A,BF A E,Sunday,0.5,0.5,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,0.06,0,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,0.5,0.733333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,0.733333333333333,0.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,1.0,1.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,1.23333333333333,1.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,1.5,1.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,1.73333333333333,1.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,2.0,2.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,2.23333333333333,2.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,2.5,2.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,2.73333333333333,2.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,3.0,3.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,3.23333333333333,3.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,3.5,3.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,3.73333333333333,3.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,4.0,4.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,4.23333333333333,4.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,4.5,4.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,4.73333333333333,4.95,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,5.0,5.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4801,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,5.23333333333333,5.45,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5302,3,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,5.5,5.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4.8,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,5.73333333333333,5.93333333333333,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5301,4,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,6.0,6.23333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4.8,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,6.23333333333333,6.43333333333333,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5301,4,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,6.5,6.73333333333333,Sunday,Wilhelmsruher Damm,WIDA02B,4.8,0,4453948,CKB -N53,Wilhelmsruher Damm,WIDA02B,Sunday,6.73333333333333,6.93333333333333,Sunday,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,5301,0,4453948,CKB -N53,Grabbeallee/Pastor-Niemöller-Pl.,GAPN01B,Sunday,6.93333333333333,6.93333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4453948,CKB -N62,Betriebshof A,BF A E,Sunday,0.533333333333333,0.533333333333333,Sunday,Schloßplatz Köpenick,SLPZ02BN,0.06,0,4747669,CKB -N62,Schloßplatz Köpenick,SLPZ02BN,Sunday,0.533333333333333,0.733333333333333,Sunday,Wendenschloß,WESC09BA,4212,3,4747669,CKB -N62,Wendenschloß,WESC09BA,Sunday,0.783333333333333,1.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,1.26666666666666,1.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB -N62,Wendenschloß,WESC09BA,Sunday,1.78333333333333,2.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,2.26666666666666,2.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB -N62,Wendenschloß,WESC09BA,Sunday,2.78333333333333,3.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,3.26666666666666,3.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB -N62,Wendenschloß,WESC09BA,Sunday,3.78333333333333,4.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,4.26666666666666,4.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB -N62,Wendenschloß,WESC09BA,Sunday,4.78333333333333,5.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,5.26666666666666,5.7,Sunday,Wendenschloß,WESC09BA,12869,5,4747669,CKB -N62,Wendenschloß,WESC09BA,Sunday,5.78333333333333,6.26666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747669,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,6.26666666666666,6.7,Sunday,Wendenschloß,WESC09BA,12869,0,4747669,CKB -N62,Wendenschloß,WESC09BA,Sunday,6.7,6.7,Sunday,Betriebshof A,BF A A,0.06,0,4747669,CKB -N62,Betriebshof A,BF A E,Sunday,0.283333333333333,0.283333333333333,Sunday,Wendenschloß,WESC09BA,0.06,0,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,0.283333333333333,0.766666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,0.766666666666666,1.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,1.28333333333333,1.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,1.76666666666666,2.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,2.28333333333333,2.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,2.76666666666666,3.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,3.28333333333333,3.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,3.76666666666666,4.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,4.28333333333333,4.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,4.76666666666666,5.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,5.28333333333333,5.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,5.76666666666666,6.2,Sunday,Wendenschloß,WESC09BA,12869,5,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,6.28333333333333,6.76666666666666,Sunday,Waltersdorfer Str/Parchwitzer S.,WAPA01B,13048,0,4747671,CKB -N62,Waltersdorfer Str/Parchwitzer S.,WAPA01B,Sunday,6.76666666666666,7.2,Sunday,Wendenschloß,WESC09BA,12869,0,4747671,CKB -N62,Wendenschloß,WESC09BA,Sunday,7.2,7.2,Sunday,Betriebshof A,BF A A,0.06,0,4747671,CKB -N68,Betriebshof A,BF A E,Sunday,0.816666666666666,0.816666666666666,Sunday,S Adlershof,SAH02BN,0.06,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,0.816666666666666,1.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,1.06666666666666,1.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,1.31666666666666,1.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,1.56666666666666,1.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,1.81666666666666,2.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,2.06666666666666,2.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,2.31666666666666,2.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,2.56666666666666,2.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,2.81666666666666,3.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,3.06666666666666,3.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,3.31666666666666,3.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,3.56666666666666,3.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,3.81666666666666,4.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,4.06666666666666,4.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,4.31666666666666,4.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,4.56666666666666,4.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,4.81666666666666,5.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,5.06666666666666,5.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,5.31666666666666,5.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,5.56666666666666,5.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,5.81666666666666,6.06666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,6.06666666666666,6.31666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,6.31666666666666,6.56666666666666,Sunday,Alt-Schmöckwitz,ALSW11BN,10229,0,4434314,CKB -N68,Alt-Schmöckwitz,ALSW11BN,Sunday,6.56666666666666,6.81666666666666,Sunday,S Adlershof,SAH02BN,11801,0,4434314,CKB -N68,S Adlershof,SAH02BN,Sunday,6.81666666666666,6.81666666666666,Sunday,Betriebshof A,BF A A,0.06,0,4434314,CKB -N88,Betriebshof A,BF A E,Sunday,2.56666666666666,2.56666666666666,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4524178,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,2.56666666666666,3.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,3.0,3.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,3.56666666666666,4.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,4.0,4.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,4.56666666666666,5.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,5.0,5.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,5.56666666666666,6.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,6.0,6.45,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4524178,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,6.56666666666666,7.0,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4524178,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,7.0,7.0,Sunday,Betriebshof A,BF A A,0.06,0,4524178,CKB -N88,Betriebshof A,BF A E,Sunday,2.06666666666666,2.06666666666666,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,0.06,0,4619808,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,2.06666666666666,2.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,2.5,2.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,3.06666666666666,3.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,3.5,3.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,4.06666666666666,4.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,4.5,4.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,5.06666666666666,5.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,5.5,5.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,7,4619808,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,6.06666666666666,6.5,Sunday,S Lichterfelde Süd,SLIS01B,9016,0,4619808,CKB -N88,S Lichterfelde Süd,SLIS01B,Sunday,6.5,6.95,Sunday,S+U Rathaus Steglitz/Kreisel,SURK04B,10083,0,4619808,CKB -N88,S+U Rathaus Steglitz/Kreisel,SURK04B,Sunday,6.95,6.95,Sunday,Betriebshof A,BF A A,0.06,0,4619808,CKB -N91,Betriebshof A,BF A E,Sunday,0.516666666666666,0.516666666666666,Sunday,S+U Wuhletal,SUWT02BN,0.06,0,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,0.516666666666666,0.733333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,0.733333333333333,0.933333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,1.01666666666666,1.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,1.23333333333333,1.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,1.51666666666666,1.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,1.73333333333333,1.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,2.01666666666666,2.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,2.23333333333333,2.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,2.51666666666666,2.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,2.73333333333333,2.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,3.01666666666666,3.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,3.23333333333333,3.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,3.51666666666666,3.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,3.73333333333333,3.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,4.01666666666666,4.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,4.23333333333333,4.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,4.51666666666666,4.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,4.73333333333333,4.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,5.01666666666666,5.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,5.23333333333333,5.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,5.51666666666666,5.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,5.73333333333333,5.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,6.01666666666666,6.23333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,6.23333333333333,6.43333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,5,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,6.51666666666666,6.73333333333333,Sunday,Boschpoler Str.,BOPO01BN,4872,0,4374748,CKB -N91,Boschpoler Str.,BOPO01BN,Sunday,6.73333333333333,6.93333333333333,Sunday,S+U Wuhletal,SUWT02BN,5362,0,4374748,CKB -N91,S+U Wuhletal,SUWT02BN,Sunday,6.93333333333333,6.93333333333333,Sunday,Betriebshof A,BF A A,0.06,0,4374748,CKB -N95,Betriebshof A,BF A E,Sunday,0.516666666666666,0.516666666666666,Sunday,S+U Wuhletal,SUWT02BN,0.06,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,0.516666666666666,0.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,0.783333333333333,1.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,1.01666666666666,1.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,1.28333333333333,1.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,1.51666666666666,1.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,1.78333333333333,2.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,2.01666666666666,2.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,2.28333333333333,2.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,2.51666666666666,2.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,2.78333333333333,3.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,3.01666666666666,3.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,3.28333333333333,3.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,3.51666666666666,3.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,3.78333333333333,4.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,4.01666666666666,4.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,4.28333333333333,4.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,4.51666666666666,4.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,4.78333333333333,5.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,5.01666666666666,5.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,5.28333333333333,5.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,5.51666666666666,5.75,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,5.78333333333333,6.01666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,6.01666666666666,6.25,Sunday,Riesaer Str.,RIES01BN,5225,2,4374871,CKB -N95,Riesaer Str.,RIES01BN,Sunday,6.28333333333333,6.51666666666666,Sunday,S+U Wuhletal,SUWT02BN,7617,0,4374871,CKB -N95,S+U Wuhletal,SUWT02BN,Sunday,6.51666666666666,6.75,Sunday,Riesaer Str.,RIES04B,5096,0,4374871,CKB -N95,Riesaer Str.,RIES04B,Sunday,6.75,6.75,Sunday,Betriebshof A,BF A A,0.06,0,4374871,CKB -N97,Betriebshof A,BF A E,Sunday,0.716666666666666,0.716666666666666,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,0.06,0,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,0.716666666666666,0.883333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,0.883333333333333,1.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,1.21666666666666,1.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,1.38333333333333,1.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,1.71666666666666,1.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,1.88333333333333,2.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,2.21666666666666,2.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,2.38333333333333,2.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,2.71666666666666,2.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,2.88333333333333,3.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,3.21666666666666,3.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,3.38333333333333,3.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,3.71666666666666,3.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,3.88333333333333,4.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,4.21666666666666,4.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,4.38333333333333,4.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,4.71666666666666,4.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,4.88333333333333,5.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,5.21666666666666,5.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,5.38333333333333,5.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,5.71666666666666,5.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,5.88333333333333,6.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,6.21666666666666,6.38333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,6.38333333333333,6.55,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,10,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,6.71666666666666,6.88333333333333,Sunday,Barnimplatz,BARN01B,4507,0,4375017,CKB -N97,Barnimplatz,BARN01B,Sunday,6.88333333333333,7.05,Sunday,Falkenberger Ch./Prendener Str.,FAPR01B,4408,0,4375017,CKB -N97,Falkenberger Ch./Prendener Str.,FAPR01B,Sunday,7.05,7.05,Sunday,Betriebshof A,BF A A,0.06,0,4375017,CKB From 5a704e9a961fa36c9a1e21311fb82e344ab1bf79 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 2 Mar 2022 12:35:26 +0100 Subject: [PATCH 045/802] add departure and arrival to rotation --- ebus_toolbox/rotation.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 7f9643e2..69e1cafe 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -13,14 +13,36 @@ def __init__(self, id, vehicle_type, ) -> None: self.consumption = 0 + self.departure_time = None + self.departure_name = None + self.arrival_time = None + self.arrival_name = None + def add_trip(self, trip): """Create a trip object and append to rotations trip set :param trip: Information on trip to be added to rotation :type trip: dict """ - - self.trips.append(Trip(self, **trip)) + new_trip = Trip(self, **trip) + + if self.departure_time is None and self.arrival_time is None: + # first trip added + self.departure_time = new_trip.departure_time + self.departure_name = new_trip.departure_name + self.arrival_time = new_trip.arrival_time + self.arrival_name = new_trip.arrival_name + else: + if self.departure_time > new_trip.departure_time: + # first of rotation found (for now) + self.departure_time = new_trip.departure_time + self.departure_name = new_trip.departure_name + elif self.arrival_time < new_trip.arrival_time: + # last trip of rotation (for now) + self.arrival_time = new_trip.arrival_time + self.arrival_name = new_trip.arrival_name + + self.trips.append(new_trip) def calculate_consumption(self): rotation_consumption = 0 From 921744234c22fe1bb39d7504955e97498b87f810 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 2 Mar 2022 16:58:53 +0100 Subject: [PATCH 046/802] providing vehicle_type to multiple classes --- data/configs/ebus_toolbox.cfg | 5 ++++- ebus_toolbox/__main__.py | 2 ++ ebus_toolbox/consumption.py | 8 +++----- ebus_toolbox/rotation.py | 2 +- ebus_toolbox/schedule.py | 17 ++++++++++++----- ebus_toolbox/simulate.py | 21 +++++++++++++++++---- ebus_toolbox/trip.py | 17 +++++++++-------- 7 files changed, 48 insertions(+), 24 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index f63020a4..06963e5e 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -4,4 +4,7 @@ input = "./data/private_examples/trips_example-bvg_datetime.csv" # Preferred charging type. Options: depot, opp -preferred_charging_type = "depot" \ No newline at end of file +preferred_charging_type = "depot" + +# vehicle types +vehicle_types = "./data/examples/vehicle_types.json" diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 3f653792..181fb362 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -9,6 +9,8 @@ parser.add_argument('--preferred_charging_type', '-pct', default='depot', choices=['depot', 'opp'], help="Preferred charging type. Choose one\ from and . opp stands for opportunity.") + parser.add_argument('--vehicle-types', default=None, + help='location of vehicle type definitions') parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index f886d56b..078bff84 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,21 +1,19 @@ import numpy as np import csv -import json class Consumption: - def __init__(self) -> None: + def __init__(self, vehicle_types, **kwargs) -> None: # load temperature of the day, now dummy winter day self.temperatures_by_hour = {} - with open("./data/examples/default_temp_winter.csv") as f: + with open(kwargs.get("outside_temperatures", "data/examples/default_temp_winter.csv")) as f: reader = csv.DictReader(f) for row in reader: self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) self.consumption_files = {} - with open("./data/examples/vehicle_types.json") as f: - self.vehicle_types = json.load(f) + self.vehicle_types = vehicle_types def calculate_consumption(self, time, distance, vehicle_type, charging_type): """ Calculates consumed amount of energy for a given distance. diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 69e1cafe..c450c9f8 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -3,7 +3,7 @@ class Rotation: - def __init__(self, id, vehicle_type, ) -> None: + def __init__(self, id, vehicle_type) -> None: self.id = id self.trips = [] diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index fe059383..e2af9e1c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -4,13 +4,14 @@ class Schedule: - def __init__(self) -> None: + def __init__(self, vehicle_types) -> None: """Constructs Schedule object from CSV file containing all trips of schedule""" self.rotations = {} self.consumption = 0 + self.vehicle_types = vehicle_types @classmethod - def from_csv(cls, path_to_csv): + def from_csv(cls, path_to_csv, vehicle_types): """Constructs Schedule object from CSV file containing all trips of schedule. :param path_to_csv: Path to csv file containing trip data @@ -18,7 +19,7 @@ def from_csv(cls, path_to_csv): :return: Returns a new instance of Schedule with all trips from csv loaded. :rtype: Schedule """ - schedule = cls() + schedule = cls(vehicle_types) with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) @@ -43,13 +44,19 @@ def filter_rotations(self): """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" pass - def set_charging_type(self, ct, rotation_ids=None): + def set_charging_type(self, preferred_ct, rotation_ids=None): """Iterate across all rotations/trips and append charging type if not given""" + assert preferred_ct in ["opp", "depot"], f"Invalid charging type: {preferred_ct}" if rotation_ids is None: rotation_ids = self.rotations.keys() for id in rotation_ids: - self.rotations[id].charging_type = ct + rot = self.rotations[id] + vehicle_type = self.vehicle_types[f"{rot.vehicle_type}_{rot.charging_type}"] + if preferred_ct == "opp" or vehicle_type["capacity"] < rot.consumption: + self.rotations[id].charging_type = "opp" + else: + self.rotations[id].charging_type = "depot" def assign_vehicles(self): """ Depending on preferred charging type and consumption for each rotation diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index a8df6ce6..e6e19266 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,16 +1,29 @@ # imports -from ebus_toolbox import optimizer, report +import json +import warnings +from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule +from ebus_toolbox.trip import Trip +from ebus_toolbox import optimizer, report -def simulate(args=None): +def simulate(args): """Simulate the given scenario and eventually optimize for given metric(s). :param args: Configuration arguments specified in config files contained in configs directory. :type args: argparse.Namespace """ - - schedule = Schedule.from_csv(args.input) + try: + with open(args.vehicle_types) as f: + vehicle_types = json.load(f) + except FileNotFoundError: + warnings.warn("Invalid path for vehicle type JSON. Using default types from EXAMPLE dir.") + with open("data/examples/vehicle_types.json") as f: + vehicle_types = json.load(f) + + schedule = Schedule.from_csv(args.input, vehicle_types) + # setup consumption calculator that can be accessed by all trips + Trip.consumption = Consumption(vehicle_types) # filter trips according to args schedule.filter_rotations() diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 325ef9aa..f67188d5 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -1,11 +1,8 @@ from datetime import datetime -from ebus_toolbox.consumption import Consumption class Trip: - consumption = Consumption() - def __init__(self, rotation, departure_time, departure_name, arrival_time, arrival_name, distance, **kwargs): self.departure_name = departure_name @@ -20,10 +17,14 @@ def __init__(self, rotation, departure_time, departure_name, self.delta_SOC = 0 def calculate_consumption(self): - self.consumption, self.delta_SOC = \ - Trip.consumption.calculate_consumption(self.arrival_time, - self.distance, - self.rotation.vehicle_type, - self.rotation.charging_type) + try: + self.consumption, self.delta_SOC = \ + Trip.consumption.calculate_consumption(self.arrival_time, + self.distance, + self.rotation.vehicle_type, + self.rotation.charging_type) + except AttributeError: + print("""To calculate consumption, a consumption object needs to be constructed + and linked to Trip class.""") return self.consumption From 9ff41eba364b233445ee96559e7f752a52c3dd20 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 12:42:22 +0100 Subject: [PATCH 047/802] added vehicle ID assignment --- data/configs/ebus_toolbox.cfg | 7 ++++-- ebus_toolbox/__main__.py | 3 +++ ebus_toolbox/schedule.py | 45 +++++++++++++++++++++++++++++++---- ebus_toolbox/simulate.py | 5 ++-- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 06963e5e..cb7d5d66 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -3,8 +3,11 @@ # Input file containing trip information input = "./data/private_examples/trips_example-bvg_datetime.csv" -# Preferred charging type. Options: depot, opp +# Preferred charging type. Options: depot, opp (default: depot) preferred_charging_type = "depot" -# vehicle types +# vehicle types (default: ./data/examples/vehicle_types.json) vehicle_types = "./data/examples/vehicle_types.json" + +# minimum standing time in depot for every bus in hours (default:6) +min_standing_time = 5 \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 181fb362..e98d8d78 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -11,6 +11,9 @@ from and . opp stands for opportunity.") parser.add_argument('--vehicle-types', default=None, help='location of vehicle type definitions') + parser.add_argument('--min-standing-time', default=6, + help='Minimum standing time in hours for all buses in the depot before \ + they become available for dispatch again.') parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e2af9e1c..3845dd21 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,4 +1,6 @@ import csv +import bisect +from datetime import timedelta from ebus_toolbox.rotation import Rotation @@ -58,12 +60,45 @@ def set_charging_type(self, preferred_ct, rotation_ids=None): else: self.rotations[id].charging_type = "depot" - def assign_vehicles(self): - """ Depending on preferred charging type and consumption for each rotation - first assign a charging type to each rotation and then assign specific - vehicle IDs to each rotation. + def assign_vehicles(self, minimum_standing_time): + """ Assign vehicle IDs to rotations. A FIFO approach is used. + For every rotation it is checked whether vehicles with matching type are idle, in which + case the one with longest standing time since last rotation is used. + If no vehicle is available a new vehicle ID is generated. + + :param minimum_standing_time: Amount of hours after arrival from previous rotation after + which a vehicle become avaibable for dispatch again. + :type minimum_standing_time: int """ - pass + rotations_in_progress = [] + idle_vehicles = [] + vehicle_type_counts = {vehicle_type: 0 for vehicle_type in self.vehicle_types.keys()} + + rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) + + for rot in rotations: + # find vehicles that have completed rotation and stood for a minimum staning time + # mark those vehicle as idle + for r in rotations_in_progress: + if rot.departure_time > r.arrival_time + timedelta(hours=minimum_standing_time): + idle_vehicles.append(r.vehicle_id) + rotations_in_progress.pop(0) + else: + break + + # find idle vehicle for rotation if exists + # else generate new vehicle id + vt_ct = f"{rot.vehicle_type}_{rot.charging_type}" + id = next((id for id in idle_vehicles if vt_ct in id), None) + if id is None: + vehicle_type_counts[vt_ct] += 1 + id = f"{vt_ct}_{vehicle_type_counts[vt_ct]}" + else: + idle_vehicles.remove(id) + + rot.vehicle_id = id + arrival_times = [r.arrival_time for r in rotations_in_progress] + rotations_in_progress.insert(bisect.bisect(arrival_times, rot.arrival_time), rot) def calculate_consumption(self): self.consumption = 0 diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e6e19266..6a6e0d51 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -21,9 +21,10 @@ def simulate(args): with open("data/examples/vehicle_types.json") as f: vehicle_types = json.load(f) - schedule = Schedule.from_csv(args.input, vehicle_types) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) + + schedule = Schedule.from_csv(args.input, vehicle_types) # filter trips according to args schedule.filter_rotations() @@ -34,7 +35,7 @@ def simulate(args): # if optimizer None, quit after single iteration schedule.calculate_consumption() schedule.set_charging_type(preferred_ct=args.preferred_charging_type) - schedule.assign_vehicles() + schedule.assign_vehicles(args.min_standing_time) # write trips to csv in spiceEV format # RUN SPICE EV From 2063767b3e2a3aeb526d6e1e1965989ad2af382e Mon Sep 17 00:00:00 2001 From: Piranias Date: Mon, 7 Mar 2022 13:49:03 +0100 Subject: [PATCH 048/802] generate_scenario_json --- ebus_toolbox/schedule.py | 320 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 320 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e2af9e1c..7cea43be 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,7 +1,12 @@ import csv +import datetime +import json +from os import path +import random from ebus_toolbox.rotation import Rotation + class Schedule: def __init__(self, vehicle_types) -> None: @@ -9,6 +14,23 @@ def __init__(self, vehicle_types) -> None: self.rotations = {} self.consumption = 0 self.vehicle_types = vehicle_types + self.desired_soc = 1 + self.min_charging_time = 2 #min + self.electrified_stations = "/home/inia/Dokumente/GIZ/eBus-Toolbox/data/private_examples/electrified_stations.json" + self.cs_power_depot = 150 + self.cs_power_opp = 400 + + self.days = 7 + self.interval = 15 #min + self.output = "/home/inia/Dokumente/GIZ/eBus-Toolbox/data/private_examples/scenario.json" + self.battery = None + self.include_price_csv = None + self.include_price_csv_option = None + self.include_ext_load_csv = None + self.include_ext_csv_option = None + self.include_feed_in_csv = None + self.include_feed_in_csv_option = None + @classmethod def from_csv(cls, path_to_csv, vehicle_types): @@ -71,3 +93,301 @@ def calculate_consumption(self): self.consumption += rot.calculate_consumption() return self.consumption + + def generate_scenario_json(self): + """ Generate scenario.json for spiceEV + """ + # load stations file + if self.electrified_stations is None: + self.electrified_stations = "examples/electrified_stations.json" + ext = self.electrified_stations.split('.')[-1] + if ext != "json": + print("File extension mismatch: electrified_stations file should be .json") + with open(self.electrified_stations) as json_file: + stations_dict = json.load(json_file) + + interval = datetime.timedelta(minutes=self.interval) + + vehicle_types = {} + vehicles = {} + batteries = {} + charging_stations = {} + grid_connectors = {} + events = { + "grid_operator_signals": [], + "external_load": {}, + "energy_feed_in": {}, + "vehicle_events": [] + } + + for rotation_id, item in self.rotations.items(): + item.vehicle_type = item.vehicle_type + "_" + item.charging_type + + number = 1 + for rotation_id, item in self.rotations.items(): + item.vehicle_id = item.vehicle_type + "_" + str(number) + number += 1 + + # add vehicle events + for vehicle_id in {item.vehicle_id for rotation_id, item in self.rotations.items()}: + vt = [d for i, d in self.rotations.items() if d.vehicle_id == vehicle_id][0].vehicle_type + v_name = vehicle_id + ct = vt.split("_")[1] + cs_name = "CS_" + v_name + # define start conditions + vehicles[v_name] = { + "connected_charging_station": None, + "estimated_time_of_departure": None, + "desired_soc": None, + "soc": self.desired_soc, + "vehicle_type": vt + } + # filter all rides for that bus + v_id = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} + # sort events for their departure time, so that the matching departure time of an + # arrival event can be read out of the next element in vid_list + v_id = {key: value for key, value in sorted(v_id.items(), + key=lambda x: x[1].departure_time)} + key_list = list(v_id.keys()) + for i, v in enumerate(key_list): + departure_event_in_input = True + # create events for all trips of one rotation + for j, trip in enumerate(v_id[v].trips): + cs_name = "{}_{}".format(v_name, trip.arrival_name) + gc_name = "{}".format(trip.arrival_name) + arrival = trip.arrival_time +# arrival = datetime.datetime.strptime(arrival, '%Y-%m-%d %H:%M:%S') + try: + departure = v_id[v].trips[j + 1].departure_time +# departure = datetime.datetime.strptime(departure, '%Y-%m-%d %H:%M:%S') + next_arrival = v_id[v].trips[j + 1].arrival_time + # next_arrival = datetime.datetime.strptime(next_arrival, + # '%Y-%m-%d %H:%M:%S') + except IndexError: + # get departure of the first trip of the next rotation + try: + departure = v_id[key_list[i + 1]].departure_time + departure = datetime.datetime.strptime(departure, + '%Y-%m-%d %H:%M:%S') + next_arrival = v_id[key_list[i + 1]].trips[0].arrival_time +# next_arrival = datetime.datetime.strptime(next_arrival, +# '%Y-%m-%d %H:%M:%S') + except IndexError: + departure_event_in_input = False + departure = arrival + datetime.timedelta(hours=8) + # no more rotations + # connect cs and add gc if station is electrified + connected_charging_station = None + skip = False + desired_soc = 0 + # if departure - arrival shorter than min_charging_time, + # do not connect charging station + if (departure - arrival).seconds / 60 >= self.min_charging_time: + if gc_name in stations_dict["opp_stations"] or gc_name in \ + stations_dict["depot_stations"]: + # if station is depot, set min_soc = args.min_soc, else: None + if gc_name in stations_dict["depot_stations"]: + station_type = "depot" + desired_soc = self.desired_soc + number_cs = stations_dict["depot_stations"][gc_name] + cs_power = self.cs_power_depot + if number_cs != "None": + gc_power = number_cs * cs_power + else: + gc_power = 100 * cs_power + else: + if ct == "depot": + skip = True + else: + station_type = "opp" + number_cs = stations_dict["opp_stations"][gc_name] + cs_power = self.cs_power_opp + desired_soc = 1 + if number_cs != "None": + gc_power = number_cs * cs_power + else: + gc_power = 100 * cs_power + if not skip: + cs_name_and_type = cs_name + "_" + station_type + connected_charging_station = cs_name_and_type + # add one charging station for each bus at bus station + if cs_name not in charging_stations: + charging_stations[cs_name_and_type] = { + "max_power": cs_power, + "min_power": 0.1 * cs_power, + "parent": gc_name + } + # add one grid connector for each bus station + if gc_name not in grid_connectors: + number_cs = None if number_cs == 'None' else number_cs + grid_connectors[gc_name] = { + "max_power": gc_power, + "cost": {"type": "fixed", "value": 0.3}, + "number_cs": number_cs + } + + # create arrival events + events["vehicle_events"].append({ + "signal_time": arrival.isoformat(), + "start_time": arrival.isoformat(), + "vehicle_id": v_name, + "event_type": "arrival", + "update": { + "connected_charging_station": connected_charging_station, + "estimated_time_of_departure": departure.isoformat(), + "soc_delta": trip.consumption, #todo: correct this + "desired_soc": desired_soc + } + }) + # create departure events + if departure_event_in_input: + events["vehicle_events"].append({ + "signal_time": departure.isoformat(), + "start_time": departure.isoformat(), + "vehicle_id": v_name, + "event_type": "departure", + "update": { + "estimated_time_of_arrival": next_arrival.isoformat() + } + }) + + # define start and stop times + times = [val.departure_time for key, val in self.rotations.items()] + start = min(times) +# start = datetime.datetime.strptime(start, '%Y-%m-%d %H:%M:%S') + stop = start + datetime.timedelta(days=self.days) + daily = datetime.timedelta(days=1) + # price events + for key in grid_connectors.keys(): + if not self.include_price_csv: + now = start - daily + while now < stop + 2 * daily: + now += daily + for v_id, v in vehicles.items(): + if now >= stop: + # after end of scenario: keep generating trips, but don't include in + # scenario + continue + + # generate prices for the day + if now < stop: + morning = now + datetime.timedelta(hours=6) + evening_by_month = now + datetime.timedelta( + hours=22 - abs(6 - now.month)) + events['grid_operator_signals'] += [{ + # day (6-evening): 15ct + "signal_time": max(start, now - daily).isoformat(), + "grid_connector_id": key, + "start_time": morning.isoformat(), + "cost": { + "type": "fixed", + "value": 0.15 + random.gauss(0, 0.05) + } + }, { + # night (depending on month - 6): 5ct + "signal_time": max(start, now - daily).isoformat(), + "grid_connector_id": key, + "start_time": evening_by_month.isoformat(), + "cost": { + "type": "fixed", + "value": 0.05 + random.gauss(0, 0.03) + } + }] + + # add timeseries from csv + + # save path and options for CSV timeseries + # all paths are relative to output file + target_path = path.dirname(self.output) + + if self.include_ext_load_csv: + filename = self.include_ext_load_csv + basename = self.splitext(self.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 900, # 15 minutes + "grid_connector_id": "GC1", + "column": "energy" + } + if self.include_ext_csv_option: + for key, value in self.include_ext_csv_option: + if key == "step_duration_s": + value = int(value) + options[key] = value + events['external_load'][basename] = options + # check if CSV file exists + ext_csv_path = self.join(target_path, filename) + if not self.exists(ext_csv_path): + print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) + + if self.include_feed_in_csv: + filename = self.include_feed_in_csv + basename = self.splitext(self.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 3600, # 60 minutes + "grid_connector_id": "GC1", + "column": "energy" + } + if self.include_feed_in_csv_option: + for key, value in self.include_feed_in_csv_option: + if key == "step_duration_s": + value = int(value) + options[key] = value + events['energy_feed_in'][basename] = options + feed_in_path = path.join(target_path, filename) + if not path.exists(feed_in_path): + print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) + + if self.include_price_csv: + filename = self.include_price_csv + # basename = path.splitext(path.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 3600, # 60 minutes + "grid_connector_id": "GC1", + "column": "price [ct/kWh]" + } + for key, value in self.include_price_csv_option: + if key == "step_duration_s": + value = int(value) + options[key] = value + events['energy_price_from_csv'] = options + price_csv_path = path.join(target_path, filename) + if not path.exists(price_csv_path): + print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) + + if self.battery: + for idx, (capacity, c_rate, gc) in enumerate(self.battery): + if capacity > 0: + max_power = c_rate * capacity + else: + # unlimited battery: set power directly + max_power = c_rate + batteries["BAT{}".format(idx + 1)] = { + "parent": gc, + "capacity": capacity, + "charging_curve": [[0, max_power], [1, max_power]] + } + # create final dict + j = { + "scenario": { + "start_time": start.isoformat(), + "interval": interval.days * 24 * 60 + interval.seconds // 60, + "n_intervals": (stop - start) // interval + }, + "constants": { + "vehicle_types": vehicle_types, + "vehicles": vehicles, + "grid_connectors": grid_connectors, + "charging_stations": charging_stations, + "batteries": batteries + }, + "events": events + } + # Write JSON + with open(self.output, 'w') as f: + json.dump(j, f, indent=2) From 96abf514b0ee10089ebae6b9060c684aa2032394 Mon Sep 17 00:00:00 2001 From: Piranias Date: Mon, 7 Mar 2022 13:49:52 +0100 Subject: [PATCH 049/802] new input arguments --- data/configs/ebus_toolbox.cfg | 7 +++++-- ebus_toolbox/__main__.py | 1 + ebus_toolbox/simulate.py | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 06963e5e..8f21376b 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1,10 +1,13 @@ # Configs for the eBus Toolbox # Input file containing trip information -input = "./data/private_examples/trips_example-bvg_datetime.csv" +input = "/home/inia/Dokumente/GIZ/eBus-Toolbox/data/private_examples/trips_example-bvg_datetime.csv" # Preferred charging type. Options: depot, opp preferred_charging_type = "depot" +# desired soc +desired_soc = 1 + # vehicle types -vehicle_types = "./data/examples/vehicle_types.json" +vehicle_types = "/home/inia/Dokumente/GIZ/eBus-Toolbox/data/examples/vehicle_types.json" diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 181fb362..c2f665b5 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -12,6 +12,7 @@ parser.add_argument('--vehicle-types', default=None, help='location of vehicle type definitions') parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') + parser.add_argument('--desired_soc', default = 1, help='desired_soc of vehicles') parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e6e19266..db84d4e4 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -21,6 +21,7 @@ def simulate(args): with open("data/examples/vehicle_types.json") as f: vehicle_types = json.load(f) + schedule = Schedule.from_csv(args.input, vehicle_types) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) @@ -36,6 +37,7 @@ def simulate(args): schedule.set_charging_type(preferred_ct=args.preferred_charging_type) schedule.assign_vehicles() # write trips to csv in spiceEV format + schedule.generate_scenario_json() # RUN SPICE EV From 885b819646416267ecdc8f30e34749abe33751cd Mon Sep 17 00:00:00 2001 From: Piranias Date: Mon, 7 Mar 2022 14:29:47 +0100 Subject: [PATCH 050/802] add other parameters --- data/configs/ebus_toolbox.cfg | 55 ++++++++++++++--- ebus_toolbox/__main__.py | 43 +++++++++++++- ebus_toolbox/schedule.py | 107 ++++++++++++---------------------- ebus_toolbox/simulate.py | 4 +- 4 files changed, 129 insertions(+), 80 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index d5b50c44..e2724b69 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -2,15 +2,56 @@ # Input file containing trip information input = "./data/private_examples/trips_example-bvg_datetime.csv" - +# output path for scenario.json +output = "./data/private_examples/scenario.json" # Preferred charging type. Options: depot, opp (default: depot) preferred_charging_type = "depot" - -# desired soc -desired_soc = 1 - # vehicle types vehicle_types = "./data/examples/vehicle_types.json" - # minimum standing time in depot for every bus in hours (default:6) -min_standing_time = 5 +min_standing_time_depot = 5 +#electrified stations +electrified_stations = data/private_examples/electrified_stations.json +# set random seed (for always random: set seed = null) +seed = 1 +# set number of days for simulation (default: 7) +days = 2 +# set length of timestep in minutes (default: 15 minute intervals) +interval = 1 +# set minimum allowed state of charge when leaving (default: 0.8) +desired_soc = 1 +# max power of charging station at depot and opp stations +cs_power_opp = 400 +cs_power_depot = 100 +# min charging time at opp station +min_charging_time_opp = 2 +# define hours of traffic_jam (options are "stop&go" and "dense") +#rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} + +# set stationary batteries [capacity, C-Rate] +# battery with capacity = 75 kWh and C-Rate = 0.5 +#battery = [[50, 1]] +# 2 batteries with capacity = 50 kWh, C-Rate = 1, grid_connector = "Betriebshof A") +battery = [[50, 1, "Betriebshof A"], [50 , 0.5, "Betriebshof Indira-Gandhi-Str."]] +# unlimited battery capacity with constant (dis)charge of 50 kWh +#battery = [[-1, 50]] + + +# set CSV-files +# external load timeseries (in this example in same directory as resulting json) +#include_ext_load_csv = Building-20210705-20210719.csv +# options for external load CSV: +# set CSV column name, timestep duration in sec. (example: 10 min) and factor (example: input in Watt) +#include_ext_csv_option = [["column", "value"], ["step_duration_s", 600], ["factor", 0.001], ["grid_connector_id", "Betriebshof A"]] + +# local feed in timeseries (in this example in subdirectory "timeseries" - relative to resulting json) +#include_feed_in_csv = None #timeseries/feed_in.csv +# options for feed in CSV: +# set CSV column name, timestep duration in sec. (example: 1 hour) and factor (example: input in Watt) +#include_feed_in_csv_option = None # [["column", "value"], ["step_duration_s", 3600], ["factor", 1], ["grid_connector", "Betriebshof A"]] + +# energy price timeseries in EUR/kWh (in this example in parent directory - relative to resulting json) +#include_price_csv = ../energy_price.csv +# options for price CSV: set CSV column name and timestep duration in sec. (example: 6 hours) +#include_price_csv_option = [["column", "value"], ["step_duration_s", 21600], ["grid_connector", "Betriebshof A"]] +# for more options, see https://github.com/rl-institut/spice_ev/wiki/Command-line-options#csv-file-options diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index a7274e8d..af251813 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -6,14 +6,55 @@ description='Ebus Toolbox - \ Simulation Program for Ebus Fleets.') parser.add_argument('input', nargs='?', help='Set the scenario JSON file') + parser.add_argument('output', nargs='?', help='output file name (example.json)') parser.add_argument('--preferred_charging_type', '-pct', default='depot', choices=['depot', 'opp'], help="Preferred charging type. Choose one\ from and . opp stands for opportunity.") parser.add_argument('--vehicle-types', default=None, help='location of vehicle type definitions') - parser.add_argument('--min-standing-time', default=6, + parser.add_argument('--min-standing-time_depot', default=6, help='Minimum standing time in hours for all buses in the depot before \ they become available for dispatch again.') + parser.add_argument('--days', metavar='N', type=int, default=30, + help='set duration of scenario as number of days') + parser.add_argument('--interval', metavar='MIN', type=int, default=15, + help='set number of minutes for each timestep (Δt)') + parser.add_argument('--desired-soc', metavar='SOC', type=float, default=0.8, + help='set minimum desired SOC (0 - 1) for each charging process') + parser.add_argument('--cs_power_opp', metavar='POPP', type=float, default=150, + help='max power of charging station at opp stations') + parser.add_argument('--cs_power_depot', metavar='PD', type=float, default=150, + help='max power of charging station at depot stations') + parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', + help='add battery with specified capacity in kWh and C-rate \ + (-1 for variable capacity, second argument is fixed power))') + parser.add_argument('--seed', default=None, type=int, help='set random seed') + parser.add_argument('--include-ext-load-csv', + help='include CSV for external load. \ + You may define custom options with --include-ext-csv-option') + parser.add_argument('--include-ext-csv-option', '-eo', metavar=('KEY', 'VALUE'), + nargs=2, action='append', + help='append additional argument to external load') + parser.add_argument('--include-feed-in-csv', + help='include CSV for energy feed-in, e.g., local PV. \ + You may define custom options with --include-feed-in-csv-option') + parser.add_argument('--include-feed-in-csv-option', '-fo', metavar=('KEY', 'VALUE'), + nargs=2, action='append', help='append additional argument to feed-in load') + parser.add_argument('--include-price-csv', + help='include CSV for energy price. \ + You may define custom options with --include-price-csv-option') + parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), + nargs=2, default=[], action='append', + help='append additional argument to price signals') + parser.add_argument('--start_date', default='2018-01-02', + help='Provide start date of simulation in format YYYY-MM-DD.E.g. ' + '2018-01-31') + parser.add_argument('--electrified_stations', help='include electrified_stations json', + default='examples/electrified_stations.json') + parser.add_argument('--vehicle_types', help='include vehicle_types json', + default='examples/vehicle_types.json') + parser.add_argument('--min_charging_time_opp', help='define minimum time of charging', + default=2) parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') parser.add_argument('--desired_soc', default = 1, help='desired_soc of vehicles') parser.add_argument('--eta', action='store_true', diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index af40c6e6..ff6ec3f3 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -15,23 +15,6 @@ def __init__(self, vehicle_types) -> None: self.rotations = {} self.consumption = 0 self.vehicle_types = vehicle_types - self.desired_soc = 1 - self.min_charging_time = 2 #min - self.electrified_stations = "/home/inia/Dokumente/GIZ/eBus-Toolbox/data/private_examples/electrified_stations.json" - self.cs_power_depot = 150 - self.cs_power_opp = 400 - - self.days = 7 - self.interval = 15 #min - self.output = "/home/inia/Dokumente/GIZ/eBus-Toolbox/data/private_examples/scenario.json" - self.battery = None - self.include_price_csv = None - self.include_price_csv_option = None - self.include_ext_load_csv = None - self.include_ext_csv_option = None - self.include_feed_in_csv = None - self.include_feed_in_csv_option = None - @classmethod def from_csv(cls, path_to_csv, vehicle_types): @@ -81,7 +64,7 @@ def set_charging_type(self, preferred_ct, rotation_ids=None): else: self.rotations[id].charging_type = "depot" - def assign_vehicles(self, minimum_standing_time): + def assign_vehicles(self, minimum_standing_time_depot): """ Assign vehicle IDs to rotations. A FIFO approach is used. For every rotation it is checked whether vehicles with matching type are idle, in which case the one with longest standing time since last rotation is used. @@ -101,7 +84,8 @@ def assign_vehicles(self, minimum_standing_time): # find vehicles that have completed rotation and stood for a minimum staning time # mark those vehicle as idle for r in rotations_in_progress: - if rot.departure_time > r.arrival_time + timedelta(hours=minimum_standing_time): + if rot.departure_time > r.arrival_time + \ + timedelta(hours=minimum_standing_time_depot): idle_vehicles.append(r.vehicle_id) rotations_in_progress.pop(0) else: @@ -128,19 +112,19 @@ def calculate_consumption(self): return self.consumption - def generate_scenario_json(self): + def generate_scenario_json(self, args): """ Generate scenario.json for spiceEV """ # load stations file - if self.electrified_stations is None: - self.electrified_stations = "examples/electrified_stations.json" - ext = self.electrified_stations.split('.')[-1] + if args.electrified_stations is None: + args.electrified_stations = "examples/electrified_stations.json" + ext = args.electrified_stations.split('.')[-1] if ext != "json": print("File extension mismatch: electrified_stations file should be .json") - with open(self.electrified_stations) as json_file: + with open(args.electrified_stations) as json_file: stations_dict = json.load(json_file) - interval = datetime.timedelta(minutes=self.interval) + interval = datetime.timedelta(minutes=args.interval) vehicle_types = {} vehicles = {} @@ -154,33 +138,24 @@ def generate_scenario_json(self): "vehicle_events": [] } - for rotation_id, item in self.rotations.items(): - item.vehicle_type = item.vehicle_type + "_" + item.charging_type - - number = 1 - for rotation_id, item in self.rotations.items(): - item.vehicle_id = item.vehicle_type + "_" + str(number) - number += 1 - # add vehicle events - for vehicle_id in {item.vehicle_id for rotation_id, item in self.rotations.items()}: - vt = [d for i, d in self.rotations.items() if d.vehicle_id == vehicle_id][0].vehicle_type + for vehicle_id in {rot.vehicle_id for rot in self.rotations.values()}: v_name = vehicle_id - ct = vt.split("_")[1] - cs_name = "CS_" + v_name + vt = vehicle_id.split("_")[0] + ct = vehicle_id.split("_")[0] # define start conditions vehicles[v_name] = { "connected_charging_station": None, "estimated_time_of_departure": None, "desired_soc": None, - "soc": self.desired_soc, + "soc": args.desired_soc, "vehicle_type": vt } # filter all rides for that bus v_id = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} # sort events for their departure time, so that the matching departure time of an # arrival event can be read out of the next element in vid_list - v_id = {key: value for key, value in sorted(v_id.items(), + v_id = {k: v for k, v in sorted(v_id.items(), key=lambda x: x[1].departure_time)} key_list = list(v_id.keys()) for i, v in enumerate(key_list): @@ -190,22 +165,14 @@ def generate_scenario_json(self): cs_name = "{}_{}".format(v_name, trip.arrival_name) gc_name = "{}".format(trip.arrival_name) arrival = trip.arrival_time -# arrival = datetime.datetime.strptime(arrival, '%Y-%m-%d %H:%M:%S') try: departure = v_id[v].trips[j + 1].departure_time -# departure = datetime.datetime.strptime(departure, '%Y-%m-%d %H:%M:%S') next_arrival = v_id[v].trips[j + 1].arrival_time - # next_arrival = datetime.datetime.strptime(next_arrival, - # '%Y-%m-%d %H:%M:%S') except IndexError: # get departure of the first trip of the next rotation try: departure = v_id[key_list[i + 1]].departure_time - departure = datetime.datetime.strptime(departure, - '%Y-%m-%d %H:%M:%S') next_arrival = v_id[key_list[i + 1]].trips[0].arrival_time -# next_arrival = datetime.datetime.strptime(next_arrival, -# '%Y-%m-%d %H:%M:%S') except IndexError: departure_event_in_input = False departure = arrival + datetime.timedelta(hours=8) @@ -216,15 +183,15 @@ def generate_scenario_json(self): desired_soc = 0 # if departure - arrival shorter than min_charging_time, # do not connect charging station - if (departure - arrival).seconds / 60 >= self.min_charging_time: + if (departure - arrival).seconds / 60 >= args.min_charging_time_opp: if gc_name in stations_dict["opp_stations"] or gc_name in \ stations_dict["depot_stations"]: # if station is depot, set min_soc = args.min_soc, else: None if gc_name in stations_dict["depot_stations"]: station_type = "depot" - desired_soc = self.desired_soc + desired_soc = args.desired_soc number_cs = stations_dict["depot_stations"][gc_name] - cs_power = self.cs_power_depot + cs_power = args.cs_power_depot if number_cs != "None": gc_power = number_cs * cs_power else: @@ -235,11 +202,12 @@ def generate_scenario_json(self): else: station_type = "opp" number_cs = stations_dict["opp_stations"][gc_name] - cs_power = self.cs_power_opp + cs_power = args.cs_power_opp desired_soc = 1 if number_cs != "None": gc_power = number_cs * cs_power else: + # add a really large number gc_power = 100 * cs_power if not skip: cs_name_and_type = cs_name + "_" + station_type @@ -269,7 +237,7 @@ def generate_scenario_json(self): "update": { "connected_charging_station": connected_charging_station, "estimated_time_of_departure": departure.isoformat(), - "soc_delta": trip.consumption, #todo: correct this + "soc_delta": trip.consumption, #todo: dummy value! correct this "desired_soc": desired_soc } }) @@ -289,11 +257,11 @@ def generate_scenario_json(self): times = [val.departure_time for key, val in self.rotations.items()] start = min(times) # start = datetime.datetime.strptime(start, '%Y-%m-%d %H:%M:%S') - stop = start + datetime.timedelta(days=self.days) + stop = start + datetime.timedelta(days=args.days) daily = datetime.timedelta(days=1) # price events for key in grid_connectors.keys(): - if not self.include_price_csv: + if not args.include_price_csv: now = start - daily while now < stop + 2 * daily: now += daily @@ -329,13 +297,12 @@ def generate_scenario_json(self): }] # add timeseries from csv - # save path and options for CSV timeseries # all paths are relative to output file - target_path = path.dirname(self.output) + target_path = path.dirname(args.output) - if self.include_ext_load_csv: - filename = self.include_ext_load_csv + if args.include_ext_load_csv: + filename = args.include_ext_load_csv basename = self.splitext(self.basename(filename))[0] options = { "csv_file": filename, @@ -344,8 +311,8 @@ def generate_scenario_json(self): "grid_connector_id": "GC1", "column": "energy" } - if self.include_ext_csv_option: - for key, value in self.include_ext_csv_option: + if args.include_ext_csv_option: + for key, value in args.include_ext_csv_option: if key == "step_duration_s": value = int(value) options[key] = value @@ -355,8 +322,8 @@ def generate_scenario_json(self): if not self.exists(ext_csv_path): print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) - if self.include_feed_in_csv: - filename = self.include_feed_in_csv + if args.include_feed_in_csv: + filename = args.include_feed_in_csv basename = self.splitext(self.basename(filename))[0] options = { "csv_file": filename, @@ -365,8 +332,8 @@ def generate_scenario_json(self): "grid_connector_id": "GC1", "column": "energy" } - if self.include_feed_in_csv_option: - for key, value in self.include_feed_in_csv_option: + if args.include_feed_in_csv_option: + for key, value in args.include_feed_in_csv_option: if key == "step_duration_s": value = int(value) options[key] = value @@ -375,8 +342,8 @@ def generate_scenario_json(self): if not path.exists(feed_in_path): print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) - if self.include_price_csv: - filename = self.include_price_csv + if args.include_price_csv: + filename = args.include_price_csv # basename = path.splitext(path.basename(filename))[0] options = { "csv_file": filename, @@ -385,7 +352,7 @@ def generate_scenario_json(self): "grid_connector_id": "GC1", "column": "price [ct/kWh]" } - for key, value in self.include_price_csv_option: + for key, value in args.include_price_csv_option: if key == "step_duration_s": value = int(value) options[key] = value @@ -394,8 +361,8 @@ def generate_scenario_json(self): if not path.exists(price_csv_path): print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) - if self.battery: - for idx, (capacity, c_rate, gc) in enumerate(self.battery): + if args.battery: + for idx, (capacity, c_rate, gc) in enumerate(args.battery): if capacity > 0: max_power = c_rate * capacity else: @@ -423,5 +390,5 @@ def generate_scenario_json(self): "events": events } # Write JSON - with open(self.output, 'w') as f: + with open(args.output, 'w') as f: json.dump(j, f, indent=2) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f6aa5139..16ee1cb6 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -34,9 +34,9 @@ def simulate(args): # if optimizer None, quit after single iteration schedule.calculate_consumption() schedule.set_charging_type(preferred_ct=args.preferred_charging_type) - schedule.assign_vehicles(args.min_standing_time) + schedule.assign_vehicles(args.min_standing_time_depot) # write trips to csv in spiceEV format - schedule.generate_scenario_json() + schedule.generate_scenario_json(args) # RUN SPICE EV From 0b8de7453c707e0dededb9d3140fe18d5b712b76 Mon Sep 17 00:00:00 2001 From: Piranias Date: Mon, 7 Mar 2022 14:33:03 +0100 Subject: [PATCH 051/802] flake8 --- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/schedule.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index af251813..959f3cba 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -56,7 +56,7 @@ parser.add_argument('--min_charging_time_opp', help='define minimum time of charging', default=2) parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') - parser.add_argument('--desired_soc', default = 1, help='desired_soc of vehicles') + parser.add_argument('--desired_soc', default=1, help='desired_soc of vehicles') parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ff6ec3f3..79a0557a 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -155,8 +155,7 @@ def generate_scenario_json(self, args): v_id = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} # sort events for their departure time, so that the matching departure time of an # arrival event can be read out of the next element in vid_list - v_id = {k: v for k, v in sorted(v_id.items(), - key=lambda x: x[1].departure_time)} + v_id = {k: v for k, v in sorted(v_id.items(), key=lambda x: x[1].departure_time)} key_list = list(v_id.keys()) for i, v in enumerate(key_list): departure_event_in_input = True @@ -237,7 +236,7 @@ def generate_scenario_json(self, args): "update": { "connected_charging_station": connected_charging_station, "estimated_time_of_departure": departure.isoformat(), - "soc_delta": trip.consumption, #todo: dummy value! correct this + "soc_delta": trip.consumption, # todo: dummy value! correct this "desired_soc": desired_soc } }) From 145d5b206c3261205d2b130067192fd003a870f5 Mon Sep 17 00:00:00 2001 From: Piranias Date: Mon, 7 Mar 2022 14:49:04 +0100 Subject: [PATCH 052/802] correct vt --- ebus_toolbox/schedule.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 79a0557a..abeaebb5 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -114,6 +114,13 @@ def calculate_consumption(self): def generate_scenario_json(self, args): """ Generate scenario.json for spiceEV + + :param args.desired_soc: desired_soc of vehicles + :type args.desired_soc: float + :param args.days: number of days of simulation + :type args.days: int + :param args.interval: number of minutes of interval + """ # load stations file if args.electrified_stations is None: @@ -142,14 +149,14 @@ def generate_scenario_json(self, args): for vehicle_id in {rot.vehicle_id for rot in self.rotations.values()}: v_name = vehicle_id vt = vehicle_id.split("_")[0] - ct = vehicle_id.split("_")[0] + ct = vehicle_id.split("_")[1] # define start conditions vehicles[v_name] = { "connected_charging_station": None, "estimated_time_of_departure": None, "desired_soc": None, "soc": args.desired_soc, - "vehicle_type": vt + "vehicle_type": vt + "_" + ct } # filter all rides for that bus v_id = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} From 09b025415376e89ddf22870a59999cc352dfdb5d Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 15:18:35 +0100 Subject: [PATCH 053/802] docstrings --- ebus_toolbox/schedule.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index abeaebb5..76373297 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -11,7 +11,11 @@ class Schedule: def __init__(self, vehicle_types) -> None: - """Constructs Schedule object from CSV file containing all trips of schedule""" + """Constructs Schedule object from CSV file containing all trips of schedule + + :param vehicle_types: Collection of vehicle types and their properties. + :type vehicle_types: dict + """ self.rotations = {} self.consumption = 0 self.vehicle_types = vehicle_types @@ -22,6 +26,8 @@ def from_csv(cls, path_to_csv, vehicle_types): :param path_to_csv: Path to csv file containing trip data :type path_to_csv: str + :param vehicle_types: Collection of vehicle types and their properties. + :type vehicle_types: dict :return: Returns a new instance of Schedule with all trips from csv loaded. :rtype: Schedule """ @@ -51,7 +57,14 @@ def filter_rotations(self): pass def set_charging_type(self, preferred_ct, rotation_ids=None): - """Iterate across all rotations/trips and append charging type if not given""" + """Iterate across all rotations/trips and append charging type if not given + + :param preferred_ct: Choose this charging type wheneever possible. Either 'depot' or 'opp'. + :type preferred_ct: str + :param rotation_ids: IDs of rotations for which to set charging type. If None set charging + charging type for all rotations. + :type rotation_ids: list + """ assert preferred_ct in ["opp", "depot"], f"Invalid charging type: {preferred_ct}" if rotation_ids is None: rotation_ids = self.rotations.keys() @@ -70,9 +83,10 @@ def assign_vehicles(self, minimum_standing_time_depot): case the one with longest standing time since last rotation is used. If no vehicle is available a new vehicle ID is generated. - :param minimum_standing_time: Amount of hours after arrival from previous rotation after - which a vehicle become avaibable for dispatch again. - :type minimum_standing_time: int + :param minimum_standing_time_depot: Amount of hours after arrival from previous rotation + after which a vehicle become avaibable for dispatch + again. + :type minimum_standing_time_depot: int """ rotations_in_progress = [] idle_vehicles = [] @@ -103,6 +117,7 @@ def assign_vehicles(self, minimum_standing_time_depot): rot.vehicle_id = id arrival_times = [r.arrival_time for r in rotations_in_progress] + # keep list of ongoing rotations sorted by arrival_time rotations_in_progress.insert(bisect.bisect(arrival_times, rot.arrival_time), rot) def calculate_consumption(self): @@ -115,12 +130,8 @@ def calculate_consumption(self): def generate_scenario_json(self, args): """ Generate scenario.json for spiceEV - :param args.desired_soc: desired_soc of vehicles - :type args.desired_soc: float - :param args.days: number of days of simulation - :type args.days: int - :param args.interval: number of minutes of interval - + :param args: Command line arguments and/or arguments from config file. + :type args: argparse.Namespace """ # load stations file if args.electrified_stations is None: From a74df54577de0abbbf9030d366b929cbeb70bc8e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 15:22:19 +0100 Subject: [PATCH 054/802] more docstrings --- ebus_toolbox/consumption.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 078bff84..9a685911 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -24,6 +24,9 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): :type distance: float :param vehicle_type: The vehicle type for which to calculate consumption :type vehicle_type: str + :param charging_type: Charging type for the trip. Consumption differs between + distinct types. + :type charging_type: str :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) """ From 3f9846edf1118594d6b7a84066b0e6dd6247d441 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 15:26:23 +0100 Subject: [PATCH 055/802] updated test --- tests/test_schedule.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 3709548e..05bd4add 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -10,5 +10,6 @@ def test_schedule_from_csv(): - s = schedule.Schedule.from_csv('./data/private_examples/trips_example-bvg.csv') - assert len(s.rotations) > 5 + s = schedule.Schedule.from_csv('./data/private_examples/trips_example-bvg_datetime.csv', + './data/examples/vehicle_types.json') + assert len(s.rotations) == 6 From e33fabb0997285856c0efd85fad14ed7774dda63 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 15:28:43 +0100 Subject: [PATCH 056/802] removed dummy test --- tests/test_schedule.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 05bd4add..1ba8e00e 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -6,10 +6,3 @@ Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html are also good support. """ -from ebus_toolbox import schedule - - -def test_schedule_from_csv(): - s = schedule.Schedule.from_csv('./data/private_examples/trips_example-bvg_datetime.csv', - './data/examples/vehicle_types.json') - assert len(s.rotations) == 6 From 66e76feb17eebf845a876b47dc8559d710645f09 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 15:31:47 +0100 Subject: [PATCH 057/802] single dummy test is necessary --- tests/test_schedule.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 1ba8e00e..1e85f67b 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -6,3 +6,9 @@ Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html are also good support. """ +from ebus_toolbox import schedule + + +def test_schedule_from_csv(): + empty_schedule = schedule.Schedule('./data/examples/vehicle_types.json') + assert empty_schedule.rotations == {} From 88be868cfcd0628d7a14ecba3921b5f444535c63 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 17:25:11 +0100 Subject: [PATCH 058/802] check if vehicle types have opp and depot version --- data/examples/vehicle_types.json | 29 +---------------------------- ebus_toolbox/schedule.py | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index cb490694..3ef21bca 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -1,32 +1,5 @@ { - "sprinter_small": { - "name": "Sprinter (small)", - "capacity": 38, - "mileage": 25, - "charging_curve": [[0, 11], [0.8, 11], [1, 11]], - "min_charging_power": 0.2, - "v2g": false, - "v2g_power_factor": 0.5 - }, - "sprinter": { - "name": "Sprinter", - "capacity": 76, - "mileage": 40, - "charging_curve": [[0, 11], [0.8, 11], [1, 11]], - "min_charging_power": 0.2, - "v2g": false, - "v2g_power_factor": 0.5 - }, - "golf": { - "name": "E-Golf", - "capacity": 50, - "mileage": 16, - "charging_curve": [[0, 22], [0.8, 22], [1, 22]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5 - }, - "AB-OPP": { + "AB_OPP": { "name": "articulated bus - opportunity charging", "capacity": 50, "charging_curve": [[0, 150], [0.8, 150], [1, 150]], diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 76373297..5fb753b6 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -16,9 +16,22 @@ def __init__(self, vehicle_types) -> None: :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict """ + # Check if all bus types have both an opp and depot version + # Also make sure that both versions have the same mileage + vehicle_type_names = list(vehicle_types.keys()) + for name in vehicle_type_names: + try: + base, ct = name.rsplit('_', 1) + except ValueError: + continue + if f"{base}_opp" in vehicle_types and ct == 'depot': + assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_opp"]["mileage"] + elif f"{base}_depot" in vehicle_types and ct == 'opp': + assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_depot"]["mileage"] + self.vehicle_types = vehicle_types + self.rotations = {} self.consumption = 0 - self.vehicle_types = vehicle_types @classmethod def from_csv(cls, path_to_csv, vehicle_types): From b16e2018e8c5397063436aa4217004f173dc5494 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 17:50:10 +0100 Subject: [PATCH 059/802] functions to compute delta soc at each lvl --- ebus_toolbox/consumption.py | 7 +++++-- ebus_toolbox/rotation.py | 4 ++++ ebus_toolbox/schedule.py | 4 ++++ ebus_toolbox/simulate.py | 1 + ebus_toolbox/trip.py | 16 +++++++++++++--- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 9a685911..80a39a2b 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -53,6 +53,9 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): mileage = np.interp(temp, xp, fp) # kWh / km ??? consumed_energy = mileage * distance # kWh - delta_SOC = consumed_energy / self.vehicle_types[vt_ct]["capacity"] - return (consumed_energy, delta_SOC) + return consumed_energy + + def get_delta_soc(self, consumed_energy, vehicle_type, charging_type): + vt_ct = f"{vehicle_type}_{charging_type}" + return consumed_energy / self.vehicle_types[vt_ct]["capacity"] diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index c450c9f8..0e3d5c9f 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -52,3 +52,7 @@ def calculate_consumption(self): self.consumption = rotation_consumption return rotation_consumption + + def delta_soc_all_trips(self): + for trip in self.trips: + trip.get_delta_soc() diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5fb753b6..b08d4860 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -140,6 +140,10 @@ def calculate_consumption(self): return self.consumption + def delta_soc_all_trips(self): + for rot in self.rotations.values(): + rot.delta_soc_all_trips() + def generate_scenario_json(self, args): """ Generate scenario.json for spiceEV diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 16ee1cb6..b550a871 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -34,6 +34,7 @@ def simulate(args): # if optimizer None, quit after single iteration schedule.calculate_consumption() schedule.set_charging_type(preferred_ct=args.preferred_charging_type) + schedule.delta_soc_all_trips() schedule.assign_vehicles(args.min_standing_time_depot) # write trips to csv in spiceEV format schedule.generate_scenario_json(args) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index f67188d5..b05ae9ab 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -13,12 +13,12 @@ def __init__(self, rotation, departure_time, departure_name, self.rotation = rotation - self.consumption = 0 # kWh - self.delta_SOC = 0 + self.consumption = None # kWh + self.delta_SOC = None def calculate_consumption(self): try: - self.consumption, self.delta_SOC = \ + self.consumption = \ Trip.consumption.calculate_consumption(self.arrival_time, self.distance, self.rotation.vehicle_type, @@ -28,3 +28,13 @@ def calculate_consumption(self): and linked to Trip class.""") return self.consumption + + def get_delta_soc(self): + if self.consumption is None: + self.calculate_consumption() + + self.delta_SOC = Trip.consumption.get_delta_soc(self.consumption, + self.rotation.vehicle_type, + self.rotation.charging_type) + + return self.delta_SOC From 0c25de096b7a00bcde64cb7c7be5cbb561165b2f Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 17:56:56 +0100 Subject: [PATCH 060/802] fix path usage --- ebus_toolbox/schedule.py | 8 ++++---- ebus_toolbox/simulate.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index b08d4860..48a8d149 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -337,7 +337,7 @@ def generate_scenario_json(self, args): if args.include_ext_load_csv: filename = args.include_ext_load_csv - basename = self.splitext(self.basename(filename))[0] + basename = path.splitext(path.basename(filename))[0] options = { "csv_file": filename, "start_time": start.isoformat(), @@ -352,13 +352,13 @@ def generate_scenario_json(self, args): options[key] = value events['external_load'][basename] = options # check if CSV file exists - ext_csv_path = self.join(target_path, filename) - if not self.exists(ext_csv_path): + ext_csv_path = path.join(target_path, filename) + if not path.exists(ext_csv_path): print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) if args.include_feed_in_csv: filename = args.include_feed_in_csv - basename = self.splitext(self.basename(filename))[0] + basename = path.splitext(path.basename(filename))[0] options = { "csv_file": filename, "start_time": start.isoformat(), diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index b550a871..3a0113a0 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -26,13 +26,13 @@ def simulate(args): Trip.consumption = Consumption(vehicle_types) # filter trips according to args schedule.filter_rotations() + schedule.calculate_consumption() # initialize optimizer while(True): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - schedule.calculate_consumption() schedule.set_charging_type(preferred_ct=args.preferred_charging_type) schedule.delta_soc_all_trips() schedule.assign_vehicles(args.min_standing_time_depot) From a5ffb7b3875ac636817c334d3316bddcad1e9a6e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 7 Mar 2022 18:05:02 +0100 Subject: [PATCH 061/802] pytest issue --- tests/test_schedule.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 1e85f67b..796b311c 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -7,8 +7,11 @@ are also good support. """ from ebus_toolbox import schedule +import json def test_schedule_from_csv(): - empty_schedule = schedule.Schedule('./data/examples/vehicle_types.json') + with open('./data/examples/vehicle_types.json') as f: + vehicle_types = json.load(f) + empty_schedule = schedule.Schedule(vehicle_types) assert empty_schedule.rotations == {} From 83774773cfacdc845ebbbd3dc473bdd9771d7105 Mon Sep 17 00:00:00 2001 From: Piranias Date: Wed, 9 Mar 2022 10:59:53 +0100 Subject: [PATCH 062/802] add spice_ev to requirements --- ebus_toolbox/simulate.py | 3 +++ requirements.txt | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 3a0113a0..56f06ab7 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -5,6 +5,7 @@ from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip from ebus_toolbox import optimizer, report +import spiceev def simulate(args): @@ -40,6 +41,8 @@ def simulate(args): schedule.generate_scenario_json(args) # RUN SPICE EV + spiceev.simulate.simulate(args) + # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output diff --git a/requirements.txt b/requirements.txt index 24ce15ab..e6be0ca0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -numpy +numpy >= 1.12.0 +-e git+https://github.com/rl-institut/spice_ev.git@feature/add_setup#egg=spiceev \ No newline at end of file From 88fe91191ef0bbc1aa0aec7e027021e050d08f08 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Mar 2022 15:41:00 +0100 Subject: [PATCH 063/802] run spice ev simulation from ebus toolbox --- .gitignore | 1 + data/configs/ebus_toolbox.cfg | 32 ++++++++++++++++++++++++++++---- ebus_toolbox/__main__.py | 15 +++++++++++++-- ebus_toolbox/schedule.py | 9 ++++----- ebus_toolbox/simulate.py | 8 ++++---- requirements.txt | 3 ++- 6 files changed, 52 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index f69fa47e..ad02d197 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ docs/_build docs/source/temp data/private_examples +data/simulation_results diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index e2724b69..71070cdd 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1,9 +1,9 @@ # Configs for the eBus Toolbox # Input file containing trip information -input = "./data/private_examples/trips_example-bvg_datetime.csv" -# output path for scenario.json -output = "./data/private_examples/scenario.json" +input_schedule = "./data/private_examples/trips_example-bvg_datetime.csv" +# output path for scenario.json -- called input since its input for spiceev (to be changed) +input = "./data/private_examples/scenario.json" # Preferred charging type. Options: depot, opp (default: depot) preferred_charging_type = "depot" # vehicle types @@ -32,7 +32,7 @@ min_charging_time_opp = 2 # battery with capacity = 75 kWh and C-Rate = 0.5 #battery = [[50, 1]] # 2 batteries with capacity = 50 kWh, C-Rate = 1, grid_connector = "Betriebshof A") -battery = [[50, 1, "Betriebshof A"], [50 , 0.5, "Betriebshof Indira-Gandhi-Str."]] +battery = [[50, 1, "Betriebshof A"]] # unlimited battery capacity with constant (dis)charge of 50 kWh #battery = [[-1, 50]] @@ -55,3 +55,27 @@ battery = [[50, 1, "Betriebshof A"], [50 , 0.5, "Betriebshof Indira-Gandhi-Str." # options for price CSV: set CSV column name and timestep duration in sec. (example: 6 hours) #include_price_csv_option = [["column", "value"], ["step_duration_s", 21600], ["grid_connector", "Betriebshof A"]] # for more options, see https://github.com/rl-institut/spice_ev/wiki/Command-line-options#csv-file-options + + +########### SPICE_EV SIMULATE PARAMETERS ############### + +strategy = greedy +# possible strategies: greedy, balanced, balanced_market, schedule, flex_window +# options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] +strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001]] + +# show plots after simulation +visual = true + +# show estimated remaining time instead of progress bar +# WARNING: slows down fast computations +eta = false + +# give margin for desired SoC [0.0 - 1.0] +# margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. +# margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. +margin = 0.2 + +# generate output files with simulation data +save_timeseries = data/simulation_results/simulation_spiceEV.csv +save_results = data/simulation_results/simulation_spiceEV.json diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 959f3cba..e63cc405 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -5,8 +5,8 @@ parser = argparse.ArgumentParser( description='Ebus Toolbox - \ Simulation Program for Ebus Fleets.') - parser.add_argument('input', nargs='?', help='Set the scenario JSON file') - parser.add_argument('output', nargs='?', help='output file name (example.json)') + parser.add_argument('input_schedule', nargs='?', help='Set the scenario JSON file') + parser.add_argument('input', nargs='?', help='output file name (example.json)') parser.add_argument('--preferred_charging_type', '-pct', default='depot', choices=['depot', 'opp'], help="Preferred charging type. Choose one\ from and . opp stands for opportunity.") @@ -62,6 +62,17 @@ instead of progress bar. Not recommended for fast computations.') parser.add_argument('--save-timeseries', help='Write timesteps to file') parser.add_argument('--save-results', help='Write general info to file') + parser.add_argument('--strategy', '-s', default='greedy', + help='Specify the charging strategy. One of {}. You may define \ + custom options with --strategy-option.'.format('greedy, balanced')) + parser.add_argument('--margin', '-m', metavar='X', type=float, default=0.05, + help=('Add margin for desired SOC [0.0 - 1.0].\ + margin=0.05 means the simulation will not abort if vehicles \ + reach at least 95%% of the desired SOC before leaving. \ + margin=1 -> the simulation continues with every positive SOC value.')) + parser.add_argument('--strategy-option', '-so', metavar=('KEY', 'VALUE'), + nargs=2, action='append', + help='Append additional options to the charging strategy.') parser.add_argument('--config', help='Use config file to set arguments') args = parser.parse_args() diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 48a8d149..4de5c782 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -161,7 +161,6 @@ def generate_scenario_json(self, args): interval = datetime.timedelta(minutes=args.interval) - vehicle_types = {} vehicles = {} batteries = {} charging_stations = {} @@ -332,8 +331,8 @@ def generate_scenario_json(self, args): # add timeseries from csv # save path and options for CSV timeseries - # all paths are relative to output file - target_path = path.dirname(args.output) + # all spiceev paths are relative to input (refers to spiceEv input) file + target_path = path.dirname(args.input) if args.include_ext_load_csv: filename = args.include_ext_load_csv @@ -415,7 +414,7 @@ def generate_scenario_json(self, args): "n_intervals": (stop - start) // interval }, "constants": { - "vehicle_types": vehicle_types, + "vehicle_types": self.vehicle_types, "vehicles": vehicles, "grid_connectors": grid_connectors, "charging_stations": charging_stations, @@ -424,5 +423,5 @@ def generate_scenario_json(self, args): "events": events } # Write JSON - with open(args.output, 'w') as f: + with open(args.input, 'w') as f: json.dump(j, f, indent=2) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 56f06ab7..f7a6067a 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -5,7 +5,8 @@ from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip from ebus_toolbox import optimizer, report -import spiceev +# SPICE EV SIMULATE +import simulate as spice_ev def simulate(args): @@ -22,7 +23,7 @@ def simulate(args): with open("data/examples/vehicle_types.json") as f: vehicle_types = json.load(f) - schedule = Schedule.from_csv(args.input, vehicle_types) + schedule = Schedule.from_csv(args.input_schedule, vehicle_types) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) # filter trips according to args @@ -41,8 +42,7 @@ def simulate(args): schedule.generate_scenario_json(args) # RUN SPICE EV - spiceev.simulate.simulate(args) - + spice_ev.simulate(args) # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output diff --git a/requirements.txt b/requirements.txt index e6be0ca0..260cd279 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ numpy >= 1.12.0 --e git+https://github.com/rl-institut/spice_ev.git@feature/add_setup#egg=spiceev \ No newline at end of file +matplotlib +-e git+https://github.com/rl-institut/spice_ev.git@feature/add_setup_v2#egg=spiceev From 91e6045bb389b9ec345e52fb67c3256a4fbfea3f Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 9 Mar 2022 18:38:29 +0100 Subject: [PATCH 064/802] pass delta SOC to spice ev --- data/configs/ebus_toolbox.cfg | 2 +- ebus_toolbox/consumption.py | 6 +++--- ebus_toolbox/schedule.py | 2 +- ebus_toolbox/trip.py | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 71070cdd..9c1a3c7f 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -62,7 +62,7 @@ battery = [[50, 1, "Betriebshof A"]] strategy = greedy # possible strategies: greedy, balanced, balanced_market, schedule, flex_window # options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] -strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001]] +strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", 1]] # show plots after simulation visual = true diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 80a39a2b..2309417f 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -51,11 +51,11 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): xp = self.consumption_files[consumption_file]['temperature'] fp = self.consumption_files[consumption_file]['consumption'] - mileage = np.interp(temp, xp, fp) # kWh / km ??? - consumed_energy = mileage * distance # kWh + mileage = np.interp(temp, xp, fp) # kWh / m + consumed_energy = mileage * distance / 1000 # kWh return consumed_energy def get_delta_soc(self, consumed_energy, vehicle_type, charging_type): vt_ct = f"{vehicle_type}_{charging_type}" - return consumed_energy / self.vehicle_types[vt_ct]["capacity"] + return -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 4de5c782..65283edd 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -270,7 +270,7 @@ def generate_scenario_json(self, args): "update": { "connected_charging_station": connected_charging_station, "estimated_time_of_departure": departure.isoformat(), - "soc_delta": trip.consumption, # todo: dummy value! correct this + "soc_delta": trip.delta_soc, # todo: dummy value! correct this "desired_soc": desired_soc } }) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index b05ae9ab..4e379a69 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -14,7 +14,7 @@ def __init__(self, rotation, departure_time, departure_name, self.rotation = rotation self.consumption = None # kWh - self.delta_SOC = None + self.delta_soc = None def calculate_consumption(self): try: @@ -33,8 +33,8 @@ def get_delta_soc(self): if self.consumption is None: self.calculate_consumption() - self.delta_SOC = Trip.consumption.get_delta_soc(self.consumption, + self.delta_soc = Trip.consumption.get_delta_soc(self.consumption, self.rotation.vehicle_type, self.rotation.charging_type) - return self.delta_SOC + return self.delta_soc From a4e96a3e4a2a9309057524fb18c56988b4d4c428 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Thu, 10 Mar 2022 09:15:04 +0100 Subject: [PATCH 065/802] simulate only for duration of trip events --- data/configs/ebus_toolbox.cfg | 10 ++++------ ebus_toolbox/schedule.py | 13 ++++++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 9c1a3c7f..ed1da1f8 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1,7 +1,7 @@ # Configs for the eBus Toolbox # Input file containing trip information -input_schedule = "./data/private_examples/trips_example-bvg_datetime.csv" +input_schedule = "./data/private_examples/trips_example-bvg_datetime_short.csv" # output path for scenario.json -- called input since its input for spiceev (to be changed) input = "./data/private_examples/scenario.json" # Preferred charging type. Options: depot, opp (default: depot) @@ -14,8 +14,6 @@ min_standing_time_depot = 5 electrified_stations = data/private_examples/electrified_stations.json # set random seed (for always random: set seed = null) seed = 1 -# set number of days for simulation (default: 7) -days = 2 # set length of timestep in minutes (default: 15 minute intervals) interval = 1 # set minimum allowed state of charge when leaving (default: 0.8) @@ -59,7 +57,7 @@ battery = [[50, 1, "Betriebshof A"]] ########### SPICE_EV SIMULATE PARAMETERS ############### -strategy = greedy +strategy = distributed # possible strategies: greedy, balanced, balanced_market, schedule, flex_window # options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", 1]] @@ -77,5 +75,5 @@ eta = false margin = 0.2 # generate output files with simulation data -save_timeseries = data/simulation_results/simulation_spiceEV.csv -save_results = data/simulation_results/simulation_spiceEV.json +# save_timeseries = data/simulation_results/simulation_spiceEV.csv +# save_results = data/simulation_results/simulation_spiceEV.json diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 65283edd..5b8e9e86 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -144,6 +144,14 @@ def delta_soc_all_trips(self): for rot in self.rotations.values(): rot.delta_soc_all_trips() + def get_departure_of_first_trip(self): + sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) + return sorted_rotations[0].departure_time + + def get_arrival_of_last_trip(self): + sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.arrival_time) + return sorted_rotations[-1].arrival_time + def generate_scenario_json(self, args): """ Generate scenario.json for spiceEV @@ -287,10 +295,9 @@ def generate_scenario_json(self, args): }) # define start and stop times - times = [val.departure_time for key, val in self.rotations.items()] - start = min(times) + start = self.get_departure_of_first_trip() # start = datetime.datetime.strptime(start, '%Y-%m-%d %H:%M:%S') - stop = start + datetime.timedelta(days=args.days) + stop = self.get_arrival_of_last_trip() daily = datetime.timedelta(days=1) # price events for key in grid_connectors.keys(): From c5b3c35294164b68b98274d90a5364964d3604a8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Thu, 10 Mar 2022 14:04:16 +0100 Subject: [PATCH 066/802] fix indent error for performance gain --- ebus_toolbox/schedule.py | 271 ++++++++++++++++++++------------------- 1 file changed, 137 insertions(+), 134 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5b8e9e86..b8352f3b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -133,6 +133,8 @@ def assign_vehicles(self, minimum_standing_time_depot): # keep list of ongoing rotations sorted by arrival_time rotations_in_progress.insert(bisect.bisect(arrival_times, rot.arrival_time), rot) + self.vehicle_type_counts = vehicle_type_counts + def calculate_consumption(self): self.consumption = 0 for rot in self.rotations.values(): @@ -294,141 +296,142 @@ def generate_scenario_json(self, args): } }) - # define start and stop times - start = self.get_departure_of_first_trip() -# start = datetime.datetime.strptime(start, '%Y-%m-%d %H:%M:%S') - stop = self.get_arrival_of_last_trip() - daily = datetime.timedelta(days=1) - # price events - for key in grid_connectors.keys(): - if not args.include_price_csv: - now = start - daily - while now < stop + 2 * daily: - now += daily - for v_id, v in vehicles.items(): - if now >= stop: - # after end of scenario: keep generating trips, but don't include in - # scenario - continue - - # generate prices for the day - if now < stop: - morning = now + datetime.timedelta(hours=6) - evening_by_month = now + datetime.timedelta( - hours=22 - abs(6 - now.month)) - events['grid_operator_signals'] += [{ - # day (6-evening): 15ct - "signal_time": max(start, now - daily).isoformat(), - "grid_connector_id": key, - "start_time": morning.isoformat(), - "cost": { - "type": "fixed", - "value": 0.15 + random.gauss(0, 0.05) - } - }, { - # night (depending on month - 6): 5ct - "signal_time": max(start, now - daily).isoformat(), - "grid_connector_id": key, - "start_time": evening_by_month.isoformat(), - "cost": { - "type": "fixed", - "value": 0.05 + random.gauss(0, 0.03) - } - }] - - # add timeseries from csv - # save path and options for CSV timeseries - # all spiceev paths are relative to input (refers to spiceEv input) file - target_path = path.dirname(args.input) - - if args.include_ext_load_csv: - filename = args.include_ext_load_csv - basename = path.splitext(path.basename(filename))[0] - options = { - "csv_file": filename, - "start_time": start.isoformat(), - "step_duration_s": 900, # 15 minutes - "grid_connector_id": "GC1", - "column": "energy" - } - if args.include_ext_csv_option: - for key, value in args.include_ext_csv_option: - if key == "step_duration_s": - value = int(value) - options[key] = value - events['external_load'][basename] = options - # check if CSV file exists - ext_csv_path = path.join(target_path, filename) - if not path.exists(ext_csv_path): - print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) - - if args.include_feed_in_csv: - filename = args.include_feed_in_csv - basename = path.splitext(path.basename(filename))[0] - options = { - "csv_file": filename, - "start_time": start.isoformat(), - "step_duration_s": 3600, # 60 minutes - "grid_connector_id": "GC1", - "column": "energy" - } - if args.include_feed_in_csv_option: - for key, value in args.include_feed_in_csv_option: - if key == "step_duration_s": - value = int(value) - options[key] = value - events['energy_feed_in'][basename] = options - feed_in_path = path.join(target_path, filename) - if not path.exists(feed_in_path): - print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) - - if args.include_price_csv: - filename = args.include_price_csv - # basename = path.splitext(path.basename(filename))[0] - options = { - "csv_file": filename, - "start_time": start.isoformat(), - "step_duration_s": 3600, # 60 minutes - "grid_connector_id": "GC1", - "column": "price [ct/kWh]" - } - for key, value in args.include_price_csv_option: + # ######## END OF VEHICLE EVENTS ########## # + + # define start and stop times + start = self.get_departure_of_first_trip() + stop = self.get_arrival_of_last_trip() + daily = datetime.timedelta(days=1) + # price events + for key in grid_connectors.keys(): + if not args.include_price_csv: + now = start - daily + while now < stop + 2 * daily: + now += daily + for v_id, v in vehicles.items(): + if now >= stop: + # after end of scenario: keep generating trips, but don't include in + # scenario + continue + + # generate prices for the day + if now < stop: + morning = now + datetime.timedelta(hours=6) + evening_by_month = now + datetime.timedelta( + hours=22 - abs(6 - now.month)) + events['grid_operator_signals'] += [{ + # day (6-evening): 15ct + "signal_time": max(start, now - daily).isoformat(), + "grid_connector_id": key, + "start_time": morning.isoformat(), + "cost": { + "type": "fixed", + "value": 0.15 + random.gauss(0, 0.05) + } + }, { + # night (depending on month - 6): 5ct + "signal_time": max(start, now - daily).isoformat(), + "grid_connector_id": key, + "start_time": evening_by_month.isoformat(), + "cost": { + "type": "fixed", + "value": 0.05 + random.gauss(0, 0.03) + } + }] + + # add timeseries from csv + # save path and options for CSV timeseries + # all spiceev paths are relative to input (refers to spiceEv input) file + target_path = path.dirname(args.input) + + if args.include_ext_load_csv: + filename = args.include_ext_load_csv + basename = path.splitext(path.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 900, # 15 minutes + "grid_connector_id": "GC1", + "column": "energy" + } + if args.include_ext_csv_option: + for key, value in args.include_ext_csv_option: if key == "step_duration_s": value = int(value) options[key] = value - events['energy_price_from_csv'] = options - price_csv_path = path.join(target_path, filename) - if not path.exists(price_csv_path): - print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) - - if args.battery: - for idx, (capacity, c_rate, gc) in enumerate(args.battery): - if capacity > 0: - max_power = c_rate * capacity - else: - # unlimited battery: set power directly - max_power = c_rate - batteries["BAT{}".format(idx + 1)] = { - "parent": gc, - "capacity": capacity, - "charging_curve": [[0, max_power], [1, max_power]] - } - # create final dict - j = { - "scenario": { - "start_time": start.isoformat(), - "interval": interval.days * 24 * 60 + interval.seconds // 60, - "n_intervals": (stop - start) // interval - }, - "constants": { - "vehicle_types": self.vehicle_types, - "vehicles": vehicles, - "grid_connectors": grid_connectors, - "charging_stations": charging_stations, - "batteries": batteries - }, - "events": events + events['external_load'][basename] = options + # check if CSV file exists + ext_csv_path = path.join(target_path, filename) + if not path.exists(ext_csv_path): + print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) + + if args.include_feed_in_csv: + filename = args.include_feed_in_csv + basename = path.splitext(path.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 3600, # 60 minutes + "grid_connector_id": "GC1", + "column": "energy" } - # Write JSON - with open(args.input, 'w') as f: - json.dump(j, f, indent=2) + if args.include_feed_in_csv_option: + for key, value in args.include_feed_in_csv_option: + if key == "step_duration_s": + value = int(value) + options[key] = value + events['energy_feed_in'][basename] = options + feed_in_path = path.join(target_path, filename) + if not path.exists(feed_in_path): + print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) + + if args.include_price_csv: + filename = args.include_price_csv + # basename = path.splitext(path.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 3600, # 60 minutes + "grid_connector_id": "GC1", + "column": "price [ct/kWh]" + } + for key, value in args.include_price_csv_option: + if key == "step_duration_s": + value = int(value) + options[key] = value + events['energy_price_from_csv'] = options + price_csv_path = path.join(target_path, filename) + if not path.exists(price_csv_path): + print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) + + if args.battery: + for idx, (capacity, c_rate, gc) in enumerate(args.battery): + if capacity > 0: + max_power = c_rate * capacity + else: + # unlimited battery: set power directly + max_power = c_rate + batteries["BAT{}".format(idx + 1)] = { + "parent": gc, + "capacity": capacity, + "charging_curve": [[0, max_power], [1, max_power]] + } + # create final dict + j = { + "scenario": { + "start_time": start.isoformat(), + "interval": interval.days * 24 * 60 + interval.seconds // 60, + "n_intervals": (stop - start) // interval + }, + "constants": { + "vehicle_types": self.vehicle_types, + "vehicles": vehicles, + "grid_connectors": grid_connectors, + "charging_stations": charging_stations, + "batteries": batteries + }, + "events": events + } + # Write JSON + with open(args.input, 'w') as f: + json.dump(j, f, indent=2) From 7fde9efee2f2f13bc4a6411bfb05f8c608222644 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 14 Mar 2022 16:44:29 +0100 Subject: [PATCH 067/802] github actions stores spiceev in src, ignore --- .flake8 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.flake8 b/.flake8 index 62457a9b..216ffa1a 100644 --- a/.flake8 +++ b/.flake8 @@ -1,4 +1,4 @@ [flake8] -exclude = docs +exclude = docs,src max-line-length=100 docstring_style=sphinx From c77f49ee4862d5c2eba9dfab435e9dc9e69b0a9b Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 14 Mar 2022 17:04:07 +0100 Subject: [PATCH 068/802] comments --- ebus_toolbox/rotation.py | 8 ++++++++ ebus_toolbox/schedule.py | 15 +++++++++++++++ ebus_toolbox/trip.py | 8 ++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 0e3d5c9f..c99b5fad 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -45,6 +45,11 @@ def add_trip(self, trip): self.trips.append(new_trip) def calculate_consumption(self): + """ Calculate consumption of this rotation and all its trips. + + :return: Consumption of rotation [kWh] + :rtype: float + """ rotation_consumption = 0 for trip in self.trips: rotation_consumption += trip.calculate_consumption() @@ -54,5 +59,8 @@ def calculate_consumption(self): return rotation_consumption def delta_soc_all_trips(self): + """ Compute change in state of charge (SOC) for every trip + of this rotation. Stored in the trip objects. + """ for trip in self.trips: trip.get_delta_soc() diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index b8352f3b..e99c69a1 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -136,6 +136,11 @@ def assign_vehicles(self, minimum_standing_time_depot): self.vehicle_type_counts = vehicle_type_counts def calculate_consumption(self): + """ Computes consumption for all trips of all rotations. + + :return: Total consumption for entire schedule [kWh] + :rtype: float + """ self.consumption = 0 for rot in self.rotations.values(): self.consumption += rot.calculate_consumption() @@ -147,10 +152,20 @@ def delta_soc_all_trips(self): rot.delta_soc_all_trips() def get_departure_of_first_trip(self): + """ Finds earliest departure time among all rotations. + + :return: Date and time of earliest departure of schedule. + :rtype: datetime.datetime + """ sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) return sorted_rotations[0].departure_time def get_arrival_of_last_trip(self): + """Finds latest arrival time among all rotations. + + :return: Date and time of latest arrival of schedule. + :rtype: datetime.datetime + """ sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.arrival_time) return sorted_rotations[-1].arrival_time diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 4e379a69..51f7cdbe 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -17,6 +17,11 @@ def __init__(self, rotation, departure_time, departure_name, self.delta_soc = None def calculate_consumption(self): + """ Compute consumption for this trip. + + :return: Consumption of trip [kWh] + :rtype: float + """ try: self.consumption = \ Trip.consumption.calculate_consumption(self.arrival_time, @@ -30,11 +35,10 @@ def calculate_consumption(self): return self.consumption def get_delta_soc(self): + """ Compute change in state of charge (SOC) for this trip.""" if self.consumption is None: self.calculate_consumption() self.delta_soc = Trip.consumption.get_delta_soc(self.consumption, self.rotation.vehicle_type, self.rotation.charging_type) - - return self.delta_soc From 47af02f2bc5c7b5fbcd4d2fe7eeb78c254f61d21 Mon Sep 17 00:00:00 2001 From: Piranias <44803304+Piranias@users.noreply.github.com> Date: Tue, 15 Mar 2022 09:51:18 +0100 Subject: [PATCH 069/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index 7b6383de..483f2202 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -11,3 +11,9 @@ Bus Specific Terminology | Opportunity Charging | OPPC | Gelegenheits Ladung | Charge busses at bus stops | | Solo bus | SB | Solobus | Rigid Bus | | Articulated bus | AB | Gelenkbus | Bus with two or more rigid sections | + +# proposal +| Depot | dep | Depot | Depot station | +| Opportunity | OPP | Gelegenheit | Opportunity charging station| +| Depot charger | depb | Depotlader | Bus with depot charging only | +| Opportunitycharger | oppb | Gelegenheitslader | Bus with opportunity charging| From 61fb0b2b78435213a6827fada892ac0d2b4deb22 Mon Sep 17 00:00:00 2001 From: Piranias <44803304+Piranias@users.noreply.github.com> Date: Tue, 15 Mar 2022 09:51:58 +0100 Subject: [PATCH 070/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index 483f2202..f7f1c182 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -13,7 +13,9 @@ Bus Specific Terminology | Articulated bus | AB | Gelenkbus | Bus with two or more rigid sections | # proposal +| english | Abbrev | german | description | +| ------- | ------ | ------ | ----------- | | Depot | dep | Depot | Depot station | -| Opportunity | OPP | Gelegenheit | Opportunity charging station| +| Opportunity | opp | Gelegenheit | Opportunity charging station| | Depot charger | depb | Depotlader | Bus with depot charging only | | Opportunitycharger | oppb | Gelegenheitslader | Bus with opportunity charging| From 93c54f755aa6f12ffcb196dabdf4c68eea4f7806 Mon Sep 17 00:00:00 2001 From: Piranias <44803304+Piranias@users.noreply.github.com> Date: Tue, 15 Mar 2022 09:52:27 +0100 Subject: [PATCH 071/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index f7f1c182..ae141482 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -15,7 +15,7 @@ Bus Specific Terminology # proposal | english | Abbrev | german | description | | ------- | ------ | ------ | ----------- | -| Depot | dep | Depot | Depot station | -| Opportunity | opp | Gelegenheit | Opportunity charging station| +| Depot | dep or deps| Depot | Depot station | +| Opportunity | opp or opps| Gelegenheit | Opportunity charging station| | Depot charger | depb | Depotlader | Bus with depot charging only | | Opportunitycharger | oppb | Gelegenheitslader | Bus with opportunity charging| From 3d77126ce676c9cccfdd667d6a7bd3769b48bfc5 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Mar 2022 12:17:40 +0100 Subject: [PATCH 072/802] add DAYS parameter for setting scenario duration --- data/configs/ebus_toolbox.cfg | 6 ++++-- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/schedule.py | 5 ++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index ed1da1f8..5d2a09c5 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1,8 +1,8 @@ # Configs for the eBus Toolbox # Input file containing trip information -input_schedule = "./data/private_examples/trips_example-bvg_datetime_short.csv" -# output path for scenario.json -- called input since its input for spiceev (to be changed) +input_schedule = "./data/private_examples/trips_example-bvg_datetime_medium.csv" +# output path for scenario.json -- called input since its input for spiceev input = "./data/private_examples/scenario.json" # Preferred charging type. Options: depot, opp (default: depot) preferred_charging_type = "depot" @@ -14,6 +14,8 @@ min_standing_time_depot = 5 electrified_stations = data/private_examples/electrified_stations.json # set random seed (for always random: set seed = null) seed = 1 +# maximum number of days to simulate, if not set simulate entire schedule +days = 1 # set length of timestep in minutes (default: 15 minute intervals) interval = 1 # set minimum allowed state of charge when leaving (default: 0.8) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index e63cc405..94cdfc78 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -15,7 +15,7 @@ parser.add_argument('--min-standing-time_depot', default=6, help='Minimum standing time in hours for all buses in the depot before \ they become available for dispatch again.') - parser.add_argument('--days', metavar='N', type=int, default=30, + parser.add_argument('--days', metavar='N', type=int, default=None, help='set duration of scenario as number of days') parser.add_argument('--interval', metavar='MIN', type=int, default=15, help='set number of minutes for each timestep (Δt)') diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e99c69a1..0062b24e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -315,7 +315,10 @@ def generate_scenario_json(self, args): # define start and stop times start = self.get_departure_of_first_trip() - stop = self.get_arrival_of_last_trip() + if args.days is None: + stop = self.get_arrival_of_last_trip() + else: + stop = start + datetime.timedelta(days=args.days) daily = datetime.timedelta(days=1) # price events for key in grid_connectors.keys(): From 6d94d70afaf0de481837ee6b27627837ffbb22e0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Mar 2022 12:25:22 +0100 Subject: [PATCH 073/802] dont simulate beyond last trip arrival --- ebus_toolbox/schedule.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 0062b24e..aa09c367 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -315,10 +315,9 @@ def generate_scenario_json(self, args): # define start and stop times start = self.get_departure_of_first_trip() - if args.days is None: - stop = self.get_arrival_of_last_trip() - else: - stop = start + datetime.timedelta(days=args.days) + stop = self.get_arrival_of_last_trip() + if args.days is not None: + stop = min(stop, start + datetime.timedelta(days=args.days)) daily = datetime.timedelta(days=1) # price events for key in grid_connectors.keys(): From 8350c044d0e75adf0bbafae9499c146fdcef860b Mon Sep 17 00:00:00 2001 From: Piranias <44803304+Piranias@users.noreply.github.com> Date: Tue, 15 Mar 2022 14:10:30 +0100 Subject: [PATCH 074/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index ae141482..d9deed5d 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -15,7 +15,7 @@ Bus Specific Terminology # proposal | english | Abbrev | german | description | | ------- | ------ | ------ | ----------- | -| Depot | dep or deps| Depot | Depot station | -| Opportunity | opp or opps| Gelegenheit | Opportunity charging station| +| Depot | dep | Depot | Depot station | +| Opportunity | opps| Gelegenheit | Opportunity charging station| | Depot charger | depb | Depotlader | Bus with depot charging only | | Opportunitycharger | oppb | Gelegenheitslader | Bus with opportunity charging| From fd35f1685fab9c0df163dcdbdc8d61009b40c1a7 Mon Sep 17 00:00:00 2001 From: Piranias <44803304+Piranias@users.noreply.github.com> Date: Tue, 15 Mar 2022 15:38:20 +0100 Subject: [PATCH 075/802] Update Bus Specific Terminology.md --- Bus Specific Terminology.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Bus Specific Terminology.md b/Bus Specific Terminology.md index d9deed5d..9c8687ca 100644 --- a/Bus Specific Terminology.md +++ b/Bus Specific Terminology.md @@ -7,15 +7,9 @@ Bus Specific Terminology | Rotation | | Umlauf| One (bus) rotation describes all trips one bus takes from leaving the depot until returning | | Trip | | Fahrt | One Trip is the distance between two planned stops | | Line | | Linie | Number of bus line as depicted on passenger timetable | -| Depot Charging | DEPC | Depot Ladung | Charge busses at depots only | -| Opportunity Charging | OPPC | Gelegenheits Ladung | Charge busses at bus stops | | Solo bus | SB | Solobus | Rigid Bus | | Articulated bus | AB | Gelenkbus | Bus with two or more rigid sections | - -# proposal -| english | Abbrev | german | description | -| ------- | ------ | ------ | ----------- | -| Depot | dep | Depot | Depot station | +| Depot| deps | Depot | Depot charging station | | Opportunity | opps| Gelegenheit | Opportunity charging station| | Depot charger | depb | Depotlader | Bus with depot charging only | | Opportunitycharger | oppb | Gelegenheitslader | Bus with opportunity charging| From 03e7eac62e4542c715fe99f0384b071f6b42f3e7 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Mar 2022 17:43:40 +0100 Subject: [PATCH 076/802] refactor cs generation for scenario.json --- ebus_toolbox/schedule.py | 100 ++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index aa09c367..bf6da206 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -221,7 +221,7 @@ def generate_scenario_json(self, args): # create events for all trips of one rotation for j, trip in enumerate(v_id[v].trips): cs_name = "{}_{}".format(v_name, trip.arrival_name) - gc_name = "{}".format(trip.arrival_name) + gc_name = trip.arrival_name arrival = trip.arrival_time try: departure = v_id[v].trips[j + 1].departure_time @@ -235,56 +235,58 @@ def generate_scenario_json(self, args): departure_event_in_input = False departure = arrival + datetime.timedelta(hours=8) # no more rotations + # connect cs and add gc if station is electrified connected_charging_station = None - skip = False - desired_soc = 0 - # if departure - arrival shorter than min_charging_time, + if gc_name in stations_dict["depot_stations"]: + station_type = "depot" + desired_soc = args.desired_soc + elif gc_name in stations_dict["opp_stations"] and ct == "opp": + station_type = "opp" + desired_soc = 1 + else: + # either station has no charger or current bus cannot charge at this station + station_type = None + desired_soc = 0 + + # 1. if departure - arrival shorter than min_charging_time, # do not connect charging station - if (departure - arrival).seconds / 60 >= args.min_charging_time_opp: - if gc_name in stations_dict["opp_stations"] or gc_name in \ - stations_dict["depot_stations"]: - # if station is depot, set min_soc = args.min_soc, else: None - if gc_name in stations_dict["depot_stations"]: - station_type = "depot" - desired_soc = args.desired_soc - number_cs = stations_dict["depot_stations"][gc_name] - cs_power = args.cs_power_depot - if number_cs != "None": - gc_power = number_cs * cs_power - else: - gc_power = 100 * cs_power - else: - if ct == "depot": - skip = True - else: - station_type = "opp" - number_cs = stations_dict["opp_stations"][gc_name] - cs_power = args.cs_power_opp - desired_soc = 1 - if number_cs != "None": - gc_power = number_cs * cs_power - else: - # add a really large number - gc_power = 100 * cs_power - if not skip: - cs_name_and_type = cs_name + "_" + station_type - connected_charging_station = cs_name_and_type - # add one charging station for each bus at bus station - if cs_name not in charging_stations: - charging_stations[cs_name_and_type] = { - "max_power": cs_power, - "min_power": 0.1 * cs_power, - "parent": gc_name - } - # add one grid connector for each bus station - if gc_name not in grid_connectors: - number_cs = None if number_cs == 'None' else number_cs - grid_connectors[gc_name] = { - "max_power": gc_power, - "cost": {"type": "fixed", "value": 0.3}, - "number_cs": number_cs - } + # 2. if current station has no charger or a depot bus arrives at opp charger, + # do not connect charging station either + if (((departure - arrival).seconds / 60 >= args.min_charging_time_opp) and + station_type is not None): + + cs_name_and_type = cs_name + "_" + station_type + connected_charging_station = cs_name_and_type + # if station is depot, set min_soc = args.min_soc, else: None + if station_type == "depot": + number_cs = stations_dict["depot_stations"][gc_name] + cs_power = args.cs_power_depot + elif station_type == "opp": + number_cs = stations_dict["opp_stations"][gc_name] + cs_power = args.cs_power_opp + + if number_cs != "None": + gc_power = number_cs * cs_power + else: + # add a really large number + gc_power = 100 * cs_power + + # add one charging station for each bus at bus station + if cs_name not in charging_stations: + charging_stations[cs_name_and_type] = { + "max_power": cs_power, + "min_power": 0.1 * cs_power, + "parent": gc_name + } + # add one grid connector for each bus station + if gc_name not in grid_connectors: + number_cs = None if number_cs == 'None' else number_cs + grid_connectors[gc_name] = { + "max_power": gc_power, + "cost": {"type": "fixed", "value": 0.3}, + "number_cs": number_cs + } # create arrival events events["vehicle_events"].append({ @@ -295,7 +297,7 @@ def generate_scenario_json(self, args): "update": { "connected_charging_station": connected_charging_station, "estimated_time_of_departure": departure.isoformat(), - "soc_delta": trip.delta_soc, # todo: dummy value! correct this + "soc_delta": trip.delta_soc, "desired_soc": desired_soc } }) From d55a7bc1985cbe0bc8cd9fcb1ee9550658b075cb Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Mar 2022 17:56:38 +0100 Subject: [PATCH 077/802] add distint cs_power cfg vars for oppb and depb --- data/configs/ebus_toolbox.cfg | 16 +++++++++------- ebus_toolbox/__main__.py | 8 +++++--- ebus_toolbox/schedule.py | 7 +++++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 5d2a09c5..c1daaafc 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -15,15 +15,17 @@ electrified_stations = data/private_examples/electrified_stations.json # set random seed (for always random: set seed = null) seed = 1 # maximum number of days to simulate, if not set simulate entire schedule -days = 1 +days = 10 # set length of timestep in minutes (default: 15 minute intervals) interval = 1 # set minimum allowed state of charge when leaving (default: 0.8) desired_soc = 1 # max power of charging station at depot and opp stations -cs_power_opp = 400 -cs_power_depot = 100 -# min charging time at opp station +# at depot stations opp and depot busses have distinct charging stations +cs_power_opps = 400 +cs_power_deps_depb = 100 +cs_power_deps_oppb = 150 +# min charging time at opp station [minutes] min_charging_time_opp = 2 # define hours of traffic_jam (options are "stop&go" and "dense") #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} @@ -74,8 +76,8 @@ eta = false # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. # margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. -margin = 0.2 +margin = 1.0 # generate output files with simulation data -# save_timeseries = data/simulation_results/simulation_spiceEV.csv -# save_results = data/simulation_results/simulation_spiceEV.json +save_timeseries = data/simulation_results/simulation_spiceEV.csv +save_results = data/simulation_results/simulation_spiceEV.json diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 94cdfc78..e7fbd76a 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -21,10 +21,12 @@ help='set number of minutes for each timestep (Δt)') parser.add_argument('--desired-soc', metavar='SOC', type=float, default=0.8, help='set minimum desired SOC (0 - 1) for each charging process') - parser.add_argument('--cs_power_opp', metavar='POPP', type=float, default=150, + parser.add_argument('--cs_power_opps', metavar='POPP', type=float, default=150, help='max power of charging station at opp stations') - parser.add_argument('--cs_power_depot', metavar='PD', type=float, default=150, - help='max power of charging station at depot stations') + parser.add_argument('--cs_power_deps_depb', metavar='PD', type=float, default=150, + help='max power of charging station at depot stations for depot busses') + parser.add_argument('--cs_power_deps_oppb', metavar='PD', type=float, default=150, + help='max power of charging station at depot stations for opp busses') parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', help='add battery with specified capacity in kWh and C-rate \ (-1 for variable capacity, second argument is fixed power))') diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index bf6da206..1c044a90 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -261,10 +261,13 @@ def generate_scenario_json(self, args): # if station is depot, set min_soc = args.min_soc, else: None if station_type == "depot": number_cs = stations_dict["depot_stations"][gc_name] - cs_power = args.cs_power_depot + if ct == 'opp': + cs_power = args.cs_power_deps_oppb + elif ct == 'depot': + cs_power = args.cs_power_deps_depb elif station_type == "opp": number_cs = stations_dict["opp_stations"][gc_name] - cs_power = args.cs_power_opp + cs_power = args.cs_power_opps if number_cs != "None": gc_power = number_cs * cs_power From 2d53404911d50d6359018db7bdb143e4901bc4ad Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Mar 2022 18:48:29 +0100 Subject: [PATCH 078/802] add optional gc_power params to config --- data/configs/ebus_toolbox.cfg | 4 +++ ebus_toolbox/__main__.py | 4 +++ ebus_toolbox/schedule.py | 46 ++++++++++++++++++----------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index c1daaafc..2ec0da81 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -20,6 +20,10 @@ days = 10 interval = 1 # set minimum allowed state of charge when leaving (default: 0.8) desired_soc = 1 +# max power of grid connectors at depot and opp stations +# default: Sum of max power of all charging stations at this grid connector +gc_power_opps = 1000 +gc_power_deps = 1000 # max power of charging station at depot and opp stations # at depot stations opp and depot busses have distinct charging stations cs_power_opps = 400 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index e7fbd76a..ca1adc82 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -21,6 +21,10 @@ help='set number of minutes for each timestep (Δt)') parser.add_argument('--desired-soc', metavar='SOC', type=float, default=0.8, help='set minimum desired SOC (0 - 1) for each charging process') + parser.add_argument('--gc_power_opps', metavar='POPP', type=float, default=1500, + help='max power of grid connector at opp stations') + parser.add_argument('--gc_power_deps', metavar='POPP', type=float, default=1500, + help='max power of grid connector at depot stations') parser.add_argument('--cs_power_opps', metavar='POPP', type=float, default=150, help='max power of charging station at opp stations') parser.add_argument('--cs_power_deps_depb', metavar='PD', type=float, default=150, diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 1c044a90..8870a0c8 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -5,6 +5,7 @@ import json from os import path import random + from ebus_toolbox.rotation import Rotation @@ -258,32 +259,33 @@ def generate_scenario_json(self, args): cs_name_and_type = cs_name + "_" + station_type connected_charging_station = cs_name_and_type - # if station is depot, set min_soc = args.min_soc, else: None - if station_type == "depot": - number_cs = stations_dict["depot_stations"][gc_name] - if ct == 'opp': - cs_power = args.cs_power_deps_oppb - elif ct == 'depot': - cs_power = args.cs_power_deps_depb - elif station_type == "opp": - number_cs = stations_dict["opp_stations"][gc_name] - cs_power = args.cs_power_opps - - if number_cs != "None": - gc_power = number_cs * cs_power - else: - # add a really large number - gc_power = 100 * cs_power - - # add one charging station for each bus at bus station - if cs_name not in charging_stations: + + if cs_name not in charging_stations or gc_name not in grid_connectors: + if station_type == "depot": + number_cs = stations_dict["depot_stations"][gc_name] + cs_power = args.cs_power_deps_oppb if ct == 'opp' \ + else args.cs_power_deps_depb + gc_power = args.gc_power_deps + elif station_type == "opp": + number_cs = stations_dict["opp_stations"][gc_name] + cs_power = args.cs_power_opps + gc_power = args.gc_power_opps + + # gc power is not set in config + if gc_power is None: + if number_cs != "None": + gc_power = number_cs * cs_power + else: + # add a really large number + gc_power = 100 * cs_power + + # add one charging station for each bus at bus station charging_stations[cs_name_and_type] = { "max_power": cs_power, "min_power": 0.1 * cs_power, "parent": gc_name } - # add one grid connector for each bus station - if gc_name not in grid_connectors: + # add one grid connector for each bus station number_cs = None if number_cs == 'None' else number_cs grid_connectors[gc_name] = { "max_power": gc_power, @@ -320,7 +322,7 @@ def generate_scenario_json(self, args): # define start and stop times start = self.get_departure_of_first_trip() - stop = self.get_arrival_of_last_trip() + stop = self.get_arrival_of_last_trip() + interval if args.days is not None: stop = min(stop, start + datetime.timedelta(days=args.days)) daily = datetime.timedelta(days=1) From 4a9516c8b0b9c8fb1b771d70ac5f9d4f6e542290 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 15 Mar 2022 18:51:56 +0100 Subject: [PATCH 079/802] saved us 1 line of code. cheers --- ebus_toolbox/schedule.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8870a0c8..62af17a2 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -222,8 +222,7 @@ def generate_scenario_json(self, args): # create events for all trips of one rotation for j, trip in enumerate(v_id[v].trips): cs_name = "{}_{}".format(v_name, trip.arrival_name) - gc_name = trip.arrival_name - arrival = trip.arrival_time + gc_name = arrival = trip.arrival_name try: departure = v_id[v].trips[j + 1].departure_time next_arrival = v_id[v].trips[j + 1].arrival_time From 5eaf8cec55288f886196ae1e9e1761d14b5d3b01 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Mar 2022 08:29:13 +0100 Subject: [PATCH 080/802] update vehicle_types.json to use new terminology --- data/examples/vehicle_types.json | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 3ef21bca..9575057a 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -1,5 +1,5 @@ { - "AB_OPP": { + "AB_oppb": { "name": "articulated bus - opportunity charging", "capacity": 50, "charging_curve": [[0, 150], [0.8, 150], [1, 150]], @@ -7,7 +7,15 @@ "v2g": false, "v2g_power_factor": 0.5 }, - "CKB_depot": { + "AB_depb": { + "name": "articulated bus - opportunity charging", + "capacity": 150, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5 + }, + "CKB_depb": { "name": "articulated bus", "capacity": 310, "charging_curve": [[0, 250], [0.8, 250], [1, 250]], @@ -16,7 +24,7 @@ "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", "hc": "winter" }, - "CKB_opp": { + "CKB_oppb": { "name": "articulated bus", "capacity": 190, "charging_curve": [[0, 190], [0.8, 190], [1, 190]], @@ -25,7 +33,7 @@ "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", "hc": "winter" }, - "VDL_depot": { + "VDL_depb": { "name": "solo bus", "capacity": 250, "charging_curve": [[0, 250], [0.8, 250], [1, 250]], @@ -34,7 +42,7 @@ "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", "hc": "winter" }, - "VDL_opp": { + "VDL_oppb": { "name": "solo bus", "capacity": 250, "charging_curve": [[0, 250], [0.8, 250], [1, 250]], From c97b950dc8fd9ad8c311a635899fd8de006a2228 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Mar 2022 09:07:30 +0100 Subject: [PATCH 081/802] undo last commit --- ebus_toolbox/schedule.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 62af17a2..8870a0c8 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -222,7 +222,8 @@ def generate_scenario_json(self, args): # create events for all trips of one rotation for j, trip in enumerate(v_id[v].trips): cs_name = "{}_{}".format(v_name, trip.arrival_name) - gc_name = arrival = trip.arrival_name + gc_name = trip.arrival_name + arrival = trip.arrival_time try: departure = v_id[v].trips[j + 1].departure_time next_arrival = v_id[v].trips[j + 1].arrival_time From 06e871e47a5d6f9e0d554a075f0ce8b50a81b1a8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Mar 2022 09:12:49 +0100 Subject: [PATCH 082/802] change charging type terminology --- data/configs/ebus_toolbox.cfg | 2 +- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/rotation.py | 2 +- ebus_toolbox/schedule.py | 26 +++++++++++++------------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 2ec0da81..d6a67a10 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -5,7 +5,7 @@ input_schedule = "./data/private_examples/trips_example-bvg_datetime_medium.csv" # output path for scenario.json -- called input since its input for spiceev input = "./data/private_examples/scenario.json" # Preferred charging type. Options: depot, opp (default: depot) -preferred_charging_type = "depot" +preferred_charging_type = "depb" # vehicle types vehicle_types = "./data/examples/vehicle_types.json" # minimum standing time in depot for every bus in hours (default:6) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index ca1adc82..56787eff 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -9,7 +9,7 @@ parser.add_argument('input', nargs='?', help='output file name (example.json)') parser.add_argument('--preferred_charging_type', '-pct', default='depot', choices=['depot', 'opp'], help="Preferred charging type. Choose one\ - from and . opp stands for opportunity.") + from and . opp stands for opportunity.") parser.add_argument('--vehicle-types', default=None, help='location of vehicle type definitions') parser.add_argument('--min-standing-time_depot', default=6, diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index c99b5fad..94da8765 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -9,7 +9,7 @@ def __init__(self, id, vehicle_type) -> None: self.vehicle_type = vehicle_type self.vehicle_id = None - self.charging_type = 'depot' + self.charging_type = 'depb' self.consumption = 0 diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 62af17a2..2b0475e9 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -25,10 +25,10 @@ def __init__(self, vehicle_types) -> None: base, ct = name.rsplit('_', 1) except ValueError: continue - if f"{base}_opp" in vehicle_types and ct == 'depot': - assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_opp"]["mileage"] - elif f"{base}_depot" in vehicle_types and ct == 'opp': - assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_depot"]["mileage"] + if f"{base}_oppb" in vehicle_types and ct == 'dep': + assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_oppb"]["mileage"] + elif f"{base}_depb" in vehicle_types and ct == 'opp': + assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_depb"]["mileage"] self.vehicle_types = vehicle_types self.rotations = {} @@ -79,7 +79,7 @@ def set_charging_type(self, preferred_ct, rotation_ids=None): charging type for all rotations. :type rotation_ids: list """ - assert preferred_ct in ["opp", "depot"], f"Invalid charging type: {preferred_ct}" + assert preferred_ct in ["oppb", "depb"], f"Invalid charging type: {preferred_ct}" if rotation_ids is None: rotation_ids = self.rotations.keys() @@ -87,9 +87,9 @@ def set_charging_type(self, preferred_ct, rotation_ids=None): rot = self.rotations[id] vehicle_type = self.vehicle_types[f"{rot.vehicle_type}_{rot.charging_type}"] if preferred_ct == "opp" or vehicle_type["capacity"] < rot.consumption: - self.rotations[id].charging_type = "opp" + self.rotations[id].charging_type = "oppb" else: - self.rotations[id].charging_type = "depot" + self.rotations[id].charging_type = "depb" def assign_vehicles(self, minimum_standing_time_depot): """ Assign vehicle IDs to rotations. A FIFO approach is used. @@ -239,10 +239,10 @@ def generate_scenario_json(self, args): # connect cs and add gc if station is electrified connected_charging_station = None if gc_name in stations_dict["depot_stations"]: - station_type = "depot" + station_type = "deps" desired_soc = args.desired_soc - elif gc_name in stations_dict["opp_stations"] and ct == "opp": - station_type = "opp" + elif gc_name in stations_dict["opp_stations"] and ct == "oppb": + station_type = "opps" desired_soc = 1 else: # either station has no charger or current bus cannot charge at this station @@ -260,12 +260,12 @@ def generate_scenario_json(self, args): connected_charging_station = cs_name_and_type if cs_name not in charging_stations or gc_name not in grid_connectors: - if station_type == "depot": + if station_type == "deps": number_cs = stations_dict["depot_stations"][gc_name] - cs_power = args.cs_power_deps_oppb if ct == 'opp' \ + cs_power = args.cs_power_deps_oppb if ct == 'oppb' \ else args.cs_power_deps_depb gc_power = args.gc_power_deps - elif station_type == "opp": + elif station_type == "opps": number_cs = stations_dict["opp_stations"][gc_name] cs_power = args.cs_power_opps gc_power = args.gc_power_opps From d476bd6d691769908c1d034fe8b96b3cec53ef19 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Mar 2022 09:32:23 +0100 Subject: [PATCH 083/802] adapt metavars to have them distinct --- ebus_toolbox/__main__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index ca1adc82..1bd79c78 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -23,13 +23,13 @@ help='set minimum desired SOC (0 - 1) for each charging process') parser.add_argument('--gc_power_opps', metavar='POPP', type=float, default=1500, help='max power of grid connector at opp stations') - parser.add_argument('--gc_power_deps', metavar='POPP', type=float, default=1500, + parser.add_argument('--gc_power_deps', metavar='PDEP', type=float, default=1500, help='max power of grid connector at depot stations') - parser.add_argument('--cs_power_opps', metavar='POPP', type=float, default=150, + parser.add_argument('--cs_power_opps', metavar='CSPOPP', type=float, default=150, help='max power of charging station at opp stations') - parser.add_argument('--cs_power_deps_depb', metavar='PD', type=float, default=150, + parser.add_argument('--cs_power_deps_depb', metavar='CSPDEPDEP', type=float, default=150, help='max power of charging station at depot stations for depot busses') - parser.add_argument('--cs_power_deps_oppb', metavar='PD', type=float, default=150, + parser.add_argument('--cs_power_deps_oppb', metavar='CSPDEPOPP', type=float, default=150, help='max power of charging station at depot stations for opp busses') parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', help='add battery with specified capacity in kWh and C-rate \ From 8bb39dc19c058e5f4644efc326a14c1b107b9cf7 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Mar 2022 10:01:09 +0100 Subject: [PATCH 084/802] update config documentation --- data/configs/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index d6a67a10..27a72183 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -4,7 +4,7 @@ input_schedule = "./data/private_examples/trips_example-bvg_datetime_medium.csv" # output path for scenario.json -- called input since its input for spiceev input = "./data/private_examples/scenario.json" -# Preferred charging type. Options: depot, opp (default: depot) +# Preferred charging type. Options: depb, oppb (default: depb) preferred_charging_type = "depb" # vehicle types vehicle_types = "./data/examples/vehicle_types.json" From c2b3055097d43b873749243ad8fa4b8094c1bd09 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 16 Mar 2022 11:19:59 +0100 Subject: [PATCH 085/802] adjust config for multiple GCs added support for multiple feed_in, ext_load and price CSVs --- data/configs/ebus_toolbox.cfg | 36 ++++++++---- ebus_toolbox/schedule.py | 105 +++++++++++++++++----------------- 2 files changed, 76 insertions(+), 65 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 27a72183..56d54b43 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -44,22 +44,34 @@ battery = [[50, 1, "Betriebshof A"]] # set CSV-files -# external load timeseries (in this example in same directory as resulting json) -#include_ext_load_csv = Building-20210705-20210719.csv -# options for external load CSV: +# list of external load timeseries (in this example in same directory as resulting json) and +# grid connector at which the timeseries shall be applied +# e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] +#include_ext_load_csv = [["Building-20210705-20210719.csv", "Betriebshof A"]] + +# options for external load CSV (options are used for all files specified above): # set CSV column name, timestep duration in sec. (example: 10 min) and factor (example: input in Watt) -#include_ext_csv_option = [["column", "value"], ["step_duration_s", 600], ["factor", 0.001], ["grid_connector_id", "Betriebshof A"]] +#include_ext_csv_option = [["column", "value"], ["step_duration_s", 600], ["factor", 0.001]] + + +# local feed in timeseries (in this example in subdirectory "timeseries" - relative to resulting json) and +# grid connector at which the timeseries shall be applied +# e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] +#include_feed_in_csv = [["timeseries/feed_in.csv", "Betriebshof A"]] -# local feed in timeseries (in this example in subdirectory "timeseries" - relative to resulting json) -#include_feed_in_csv = None #timeseries/feed_in.csv -# options for feed in CSV: +# options for feed in CSV (options are used for all files specified above): # set CSV column name, timestep duration in sec. (example: 1 hour) and factor (example: input in Watt) -#include_feed_in_csv_option = None # [["column", "value"], ["step_duration_s", 3600], ["factor", 1], ["grid_connector", "Betriebshof A"]] +#include_feed_in_csv_option = [["column", "value"], ["step_duration_s", 3600], ["factor", 1]] + + +# energy price timeseries in EUR/kWh (in this example in parent directory - relative to resulting json) and +# grid connector at which the timeseries shall be applied +# e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] +#include_price_csv = [["../energy_price.csv", "Betriebshof A"]] -# energy price timeseries in EUR/kWh (in this example in parent directory - relative to resulting json) -#include_price_csv = ../energy_price.csv -# options for price CSV: set CSV column name and timestep duration in sec. (example: 6 hours) -#include_price_csv_option = [["column", "value"], ["step_duration_s", 21600], ["grid_connector", "Betriebshof A"]] +# options for price CSV (options are used for all files specified above): +# set CSV column name and timestep duration in sec. (example: 6 hours) +#include_price_csv_option = [["column", "value"], ["step_duration_s", 21600]] # for more options, see https://github.com/rl-institut/spice_ev/wiki/Command-line-options#csv-file-options diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 287aeed9..8ac9e11d 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -369,64 +369,63 @@ def generate_scenario_json(self, args): target_path = path.dirname(args.input) if args.include_ext_load_csv: - filename = args.include_ext_load_csv - basename = path.splitext(path.basename(filename))[0] - options = { - "csv_file": filename, - "start_time": start.isoformat(), - "step_duration_s": 900, # 15 minutes - "grid_connector_id": "GC1", - "column": "energy" - } - if args.include_ext_csv_option: - for key, value in args.include_ext_csv_option: - if key == "step_duration_s": - value = int(value) - options[key] = value - events['external_load'][basename] = options - # check if CSV file exists - ext_csv_path = path.join(target_path, filename) - if not path.exists(ext_csv_path): - print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) + for filename, gc_name in args.include_ext_load_csv: + basename = path.splitext(path.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 900, # 15 minutes + "grid_connector_id": gc_name, + "column": "energy" + } + if args.include_ext_csv_option: + for key, value in args.include_ext_csv_option: + if key == "step_duration_s": + value = int(value) + options[key] = value + events['external_load'][basename] = options + # check if CSV file exists + ext_csv_path = path.join(target_path, filename) + if not path.exists(ext_csv_path): + print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) if args.include_feed_in_csv: - filename = args.include_feed_in_csv - basename = path.splitext(path.basename(filename))[0] - options = { - "csv_file": filename, - "start_time": start.isoformat(), - "step_duration_s": 3600, # 60 minutes - "grid_connector_id": "GC1", - "column": "energy" - } - if args.include_feed_in_csv_option: - for key, value in args.include_feed_in_csv_option: + for filename, gc_name in args.include_feed_in_csv: + basename = path.splitext(path.basename(filename))[0] + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 3600, # 60 minutes + "grid_connector_id": gc_name, + "column": "energy" + } + if args.include_feed_in_csv_option: + for key, value in args.include_feed_in_csv_option: + if key == "step_duration_s": + value = int(value) + options[key] = value + events['energy_feed_in'][basename] = options + feed_in_path = path.join(target_path, filename) + if not path.exists(feed_in_path): + print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) + + if args.include_price_csv: + for filename, gc_name in args.include_price_csv: + options = { + "csv_file": filename, + "start_time": start.isoformat(), + "step_duration_s": 3600, # 60 minutes + "grid_connector_id": gc_name, + "column": "price [ct/kWh]" + } + for key, value in args.include_price_csv_option: if key == "step_duration_s": value = int(value) options[key] = value - events['energy_feed_in'][basename] = options - feed_in_path = path.join(target_path, filename) - if not path.exists(feed_in_path): - print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) - - if args.include_price_csv: - filename = args.include_price_csv - # basename = path.splitext(path.basename(filename))[0] - options = { - "csv_file": filename, - "start_time": start.isoformat(), - "step_duration_s": 3600, # 60 minutes - "grid_connector_id": "GC1", - "column": "price [ct/kWh]" - } - for key, value in args.include_price_csv_option: - if key == "step_duration_s": - value = int(value) - options[key] = value - events['energy_price_from_csv'] = options - price_csv_path = path.join(target_path, filename) - if not path.exists(price_csv_path): - print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) + events['energy_price_from_csv'] = options + price_csv_path = path.join(target_path, filename) + if not path.exists(price_csv_path): + print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) if args.battery: for idx, (capacity, c_rate, gc) in enumerate(args.battery): From 91a28be128750d9cf65b97b56d4b8ec07378bfcc Mon Sep 17 00:00:00 2001 From: Piranias Date: Wed, 16 Mar 2022 17:22:43 +0100 Subject: [PATCH 086/802] add adjust charging type and allow for number of iterations --- data/configs/ebus_toolbox.cfg | 5 +++- ebus_toolbox/schedule.py | 55 ++++++++++++++++++++++++++++++++++- ebus_toolbox/simulate.py | 14 +++++---- 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 56d54b43..6820e71d 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -14,6 +14,8 @@ min_standing_time_depot = 5 electrified_stations = data/private_examples/electrified_stations.json # set random seed (for always random: set seed = null) seed = 1 +# number of interations for the adjustment of charging types +iterations = 2 # maximum number of days to simulate, if not set simulate entire schedule days = 10 # set length of timestep in minutes (default: 15 minute intervals) @@ -83,7 +85,7 @@ strategy = distributed strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", 1]] # show plots after simulation -visual = true +visual = false # show estimated remaining time instead of progress bar # WARNING: slows down fast computations @@ -97,3 +99,4 @@ margin = 1.0 # generate output files with simulation data save_timeseries = data/simulation_results/simulation_spiceEV.csv save_results = data/simulation_results/simulation_spiceEV.json +save_soc = data/simulation_results/simulation_soc_spiceEV.csv diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8ac9e11d..c9bb4146 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -8,7 +8,6 @@ from ebus_toolbox.rotation import Rotation - class Schedule: def __init__(self, vehicle_types) -> None: @@ -456,5 +455,59 @@ def generate_scenario_json(self, args): "events": events } # Write JSON + self.scenario = j with open(args.input, 'w') as f: json.dump(j, f, indent=2) + + def readjust_charging_type(self, args): + """ + Loads rotations with negative soc from spice_ev results and adjusts charging type from + depb to oppb and vice versa. + # todo: it would maybe make sense to change each rotations charging type at a time and not + # todo: all together, as they may influence one another + :param args: Command line arguments and/or arguments from config file. + :type args: argparse.Namespace + """ + negative_rotations = self.get_negative_rotations(args) + + print(f"Rotations {self.get_negative_rotations(args)} have negative SoC.") + print("Adjust charging types for rotations with negative soc.") + + + for rot in negative_rotations: + if self.rotations[rot].charging_type == "depb": + self.rotations[rot].charging_type = "oppb" #todo: actually this case should not happen, but it still does happen.. why? + else: + self.rotations[rot].charging_type = "depb" + + def get_negative_rotations(self, args): + """ + Get rotations with negative soc from spice_ev outputs + + :param args: Command line arguments and/or arguments from config file. + :type args: argparse.Namespace + :return: list of negative rotation_id's + :rtype: list + """ + + # load any json output file of sice_ev + gcID = list(self.scenario["constants"]["grid_connectors"].keys())[0] + try: + ext = path.splitext(args.save_results) + except TypeError: + raise TypeError("In order to get negative totations from spice_ev results, please " + "specify 'save_results' in your input arguments.") + filename = f"{ext[0]}_{gcID}{ext[-1]}" + f = open(filename) + results = json.load(f) + + # get dict of vehicles with negative soc's + negative_vehicles = results["vehicles with negative soc"] + # get matching rotations + negative_rotations = [] + for v_id, time in negative_vehicles.items(): + time = datetime.datetime.fromisoformat(time) + rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} + negative_rotations.append([k for k, v in rides.items() if time > v.departure_time and + time < v.arrival_time][0]) + return negative_rotations \ No newline at end of file diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f7a6067a..3134473c 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -29,13 +29,12 @@ def simulate(args): # filter trips according to args schedule.filter_rotations() schedule.calculate_consumption() - + schedule.set_charging_type(preferred_ct=args.preferred_charging_type) # initialize optimizer - + i = 0 while(True): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - schedule.set_charging_type(preferred_ct=args.preferred_charging_type) schedule.delta_soc_all_trips() schedule.assign_vehicles(args.min_standing_time_depot) # write trips to csv in spiceEV format @@ -43,11 +42,16 @@ def simulate(args): # RUN SPICE EV spice_ev.simulate(args) + if i == args.iterations: + print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") + break + schedule.readjust_charging_type(args) + i += 1 # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output - if optimizer.no_optimization() == 'converged': - break + #if optimizer.no_optimization() == 'converged': + # break # create report report.generate() From 1b0e41474d6b211a3354bbe4345b8b941334e6c6 Mon Sep 17 00:00:00 2001 From: Piranias Date: Wed, 16 Mar 2022 17:53:12 +0100 Subject: [PATCH 087/802] flake8 --- ebus_toolbox/schedule.py | 7 ++++--- ebus_toolbox/simulate.py | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c9bb4146..c7b7fe94 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -8,6 +8,7 @@ from ebus_toolbox.rotation import Rotation + class Schedule: def __init__(self, vehicle_types) -> None: @@ -473,10 +474,10 @@ def readjust_charging_type(self, args): print(f"Rotations {self.get_negative_rotations(args)} have negative SoC.") print("Adjust charging types for rotations with negative soc.") - for rot in negative_rotations: if self.rotations[rot].charging_type == "depb": - self.rotations[rot].charging_type = "oppb" #todo: actually this case should not happen, but it still does happen.. why? + self.rotations[rot].charging_type = "oppb" + # todo: actually this case should not happen, but it still does happen.. why? else: self.rotations[rot].charging_type = "depb" @@ -510,4 +511,4 @@ def get_negative_rotations(self, args): rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} negative_rotations.append([k for k, v in rides.items() if time > v.departure_time and time < v.arrival_time][0]) - return negative_rotations \ No newline at end of file + return negative_rotations diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 3134473c..8288e6b5 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -4,7 +4,7 @@ from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip -from ebus_toolbox import optimizer, report +from ebus_toolbox import report # , optimizer # SPICE EV SIMULATE import simulate as spice_ev @@ -50,7 +50,7 @@ def simulate(args): # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output - #if optimizer.no_optimization() == 'converged': + # if optimizer.no_optimization() == 'converged': # break # create report From 0f48b4eef47f320b4425c940ba15e5b40491baf4 Mon Sep 17 00:00:00 2001 From: Piranias Date: Wed, 16 Mar 2022 17:57:09 +0100 Subject: [PATCH 088/802] add raise error to docstring --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c7b7fe94..1817f0ee 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -489,6 +489,9 @@ def get_negative_rotations(self, args): :type args: argparse.Namespace :return: list of negative rotation_id's :rtype: list + + :raises + TypeError: If args.save_results is not set. """ # load any json output file of sice_ev From 66965047feec612196b22231cebca429db672d81 Mon Sep 17 00:00:00 2001 From: Piranias Date: Wed, 16 Mar 2022 18:00:19 +0100 Subject: [PATCH 089/802] use raise instead of raises --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 1817f0ee..f2c446a0 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -490,8 +490,8 @@ def get_negative_rotations(self, args): :return: list of negative rotation_id's :rtype: list - :raises - TypeError: If args.save_results is not set. + :raise + TypeError: If args.save_results is not set. """ # load any json output file of sice_ev From 8fa5969d028aee46ea525309598ecd5429f82c0b Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 18 Mar 2022 08:35:52 +0100 Subject: [PATCH 090/802] fix typo --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8ac9e11d..5a57285b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -86,7 +86,7 @@ def set_charging_type(self, preferred_ct, rotation_ids=None): for id in rotation_ids: rot = self.rotations[id] vehicle_type = self.vehicle_types[f"{rot.vehicle_type}_{rot.charging_type}"] - if preferred_ct == "opp" or vehicle_type["capacity"] < rot.consumption: + if preferred_ct == "oppb" or vehicle_type["capacity"] < rot.consumption: self.rotations[id].charging_type = "oppb" else: self.rotations[id].charging_type = "depb" From daad7a34f628748da9e92c281b8475fd657bfe36 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 18 Mar 2022 09:03:40 +0100 Subject: [PATCH 091/802] fix docstring --- ebus_toolbox/schedule.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index f5ccfbab..4b7685b0 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -490,8 +490,7 @@ def get_negative_rotations(self, args): :return: list of negative rotation_id's :rtype: list - :raise - TypeError: If args.save_results is not set. + :raises TypeError: If args.save_results is not set. """ # load any json output file of sice_ev From e00db6865ac322e1dfe983da4ed84a39f2140b9d Mon Sep 17 00:00:00 2001 From: Piranias Date: Tue, 22 Mar 2022 12:56:18 +0100 Subject: [PATCH 092/802] add min recharge fraction --- data/configs/ebus_toolbox.cfg | 7 ++++--- ebus_toolbox/__main__.py | 9 +++++---- ebus_toolbox/schedule.py | 16 +++++++++++++--- ebus_toolbox/simulate.py | 2 +- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 56d54b43..8354ad0e 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -8,8 +8,9 @@ input = "./data/private_examples/scenario.json" preferred_charging_type = "depb" # vehicle types vehicle_types = "./data/examples/vehicle_types.json" -# minimum standing time in depot for every bus in hours (default:6) -min_standing_time_depot = 5 +# minimum fraction of capacity for recharge when leaving the depot. Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) +min_recharge_deps_oppb = 1 +min_recharge_deps_depb = 1 #electrified stations electrified_stations = data/private_examples/electrified_stations.json # set random seed (for always random: set seed = null) @@ -30,7 +31,7 @@ cs_power_opps = 400 cs_power_deps_depb = 100 cs_power_deps_oppb = 150 # min charging time at opp station [minutes] -min_charging_time_opp = 2 +min_charging_time_opps = 2 # define hours of traffic_jam (options are "stop&go" and "dense") #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 4c797bd7..f7cc035b 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -12,9 +12,10 @@ from and . opp stands for opportunity.") parser.add_argument('--vehicle-types', default=None, help='location of vehicle type definitions') - parser.add_argument('--min-standing-time_depot', default=6, - help='Minimum standing time in hours for all buses in the depot before \ - they become available for dispatch again.') + parser.add_argument('--min_recharge_deps_oppb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--min_recharge_deps_depb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') parser.add_argument('--days', metavar='N', type=int, default=None, help='set duration of scenario as number of days') parser.add_argument('--interval', metavar='MIN', type=int, default=15, @@ -59,7 +60,7 @@ default='examples/electrified_stations.json') parser.add_argument('--vehicle_types', help='include vehicle_types json', default='examples/vehicle_types.json') - parser.add_argument('--min_charging_time_opp', help='define minimum time of charging', + parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', default=2) parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') parser.add_argument('--desired_soc', default=1, help='desired_soc of vehicles') diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5a57285b..db206800 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -91,7 +91,7 @@ def set_charging_type(self, preferred_ct, rotation_ids=None): else: self.rotations[id].charging_type = "depb" - def assign_vehicles(self, minimum_standing_time_depot): + def assign_vehicles(self, args): """ Assign vehicle IDs to rotations. A FIFO approach is used. For every rotation it is checked whether vehicles with matching type are idle, in which case the one with longest standing time since last rotation is used. @@ -112,8 +112,18 @@ def assign_vehicles(self, minimum_standing_time_depot): # find vehicles that have completed rotation and stood for a minimum staning time # mark those vehicle as idle for r in rotations_in_progress: + # calculate min_standing_time deps + if r.charging_type == "oppb": + capacity = self.vehicle_types[ + r.vehicle_type + "_" + r.charging_type]["capacity"] + min_standing_time_deps = \ + (capacity / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb + else: + min_standing_time_deps = (r.consumption / args.cs_power_deps_oppb) * \ + args.min_recharge_deps_depb + if rot.departure_time > r.arrival_time + \ - timedelta(hours=minimum_standing_time_depot): + timedelta(hours=min_standing_time_deps): idle_vehicles.append(r.vehicle_id) rotations_in_progress.pop(0) else: @@ -254,7 +264,7 @@ def generate_scenario_json(self, args): # do not connect charging station # 2. if current station has no charger or a depot bus arrives at opp charger, # do not connect charging station either - if (((departure - arrival).seconds / 60 >= args.min_charging_time_opp) and + if (((departure - arrival).seconds / 60 >= args.min_charging_time_opps) and station_type is not None): cs_name_and_type = cs_name + "_" + station_type diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f7a6067a..b4dc5ebf 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -37,7 +37,7 @@ def simulate(args): # if optimizer None, quit after single iteration schedule.set_charging_type(preferred_ct=args.preferred_charging_type) schedule.delta_soc_all_trips() - schedule.assign_vehicles(args.min_standing_time_depot) + schedule.assign_vehicles(args) # write trips to csv in spiceEV format schedule.generate_scenario_json(args) From b431cad76b21652b2ad69da8a8d32c3c6ea575cf Mon Sep 17 00:00:00 2001 From: Piranias Date: Tue, 22 Mar 2022 13:01:01 +0100 Subject: [PATCH 093/802] add max_desired_standing_time deps depb --- ebus_toolbox/schedule.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index db206800..e6173f6a 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -113,14 +113,17 @@ def assign_vehicles(self, args): # mark those vehicle as idle for r in rotations_in_progress: # calculate min_standing_time deps + capacity = self.vehicle_types[ + r.vehicle_type + "_" + r.charging_type]["capacity"] if r.charging_type == "oppb": - capacity = self.vehicle_types[ - r.vehicle_type + "_" + r.charging_type]["capacity"] min_standing_time_deps = \ (capacity / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb else: - min_standing_time_deps = (r.consumption / args.cs_power_deps_oppb) * \ - args.min_recharge_deps_depb + min_standing_time_deps = (r.consumption / args.cs_power_deps_depb) + desired_max_standing_time = \ + (capacity / args.cs_power_deps_depb) * args.min_recharge_deps_oppb + if min_standing_time_deps > desired_max_standing_time: + min_standing_time_deps = desired_max_standing_time if rot.departure_time > r.arrival_time + \ timedelta(hours=min_standing_time_deps): From 891f354485ca28313b5ab16edff542b74fba1206 Mon Sep 17 00:00:00 2001 From: Piranias Date: Tue, 22 Mar 2022 13:27:32 +0100 Subject: [PATCH 094/802] add signal_time diff to solve #18 --- data/configs/ebus_toolbox.cfg | 3 ++- ebus_toolbox/__main__.py | 3 +++ ebus_toolbox/schedule.py | 13 +++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 8354ad0e..d6e48fd4 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -34,7 +34,8 @@ cs_power_deps_oppb = 150 min_charging_time_opps = 2 # define hours of traffic_jam (options are "stop&go" and "dense") #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} - +# time difference between signal time and actual start time of a vehicle event im min. (default: 10) +signal_time_dif = 10 # set stationary batteries [capacity, C-Rate] # battery with capacity = 75 kWh and C-Rate = 0.5 #battery = [[50, 1]] diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index f7cc035b..c7b14c49 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -62,6 +62,9 @@ default='examples/vehicle_types.json') parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', default=2) + parser.add_argument('--signal_time_dif', help='time difference between signal time and actual ' + 'start time of a vehicle event im min.', + default=10) parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') parser.add_argument('--desired_soc', default=1, help='desired_soc of vehicles') parser.add_argument('--eta', action='store_true', diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e6173f6a..3f8fe398 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -97,10 +97,9 @@ def assign_vehicles(self, args): case the one with longest standing time since last rotation is used. If no vehicle is available a new vehicle ID is generated. - :param minimum_standing_time_depot: Amount of hours after arrival from previous rotation - after which a vehicle become avaibable for dispatch - again. - :type minimum_standing_time_depot: int + :param args: Command line arguments and/or arguments from config file. + :type args: argparse.Namespace + """ rotations_in_progress = [] idle_vehicles = [] @@ -308,7 +307,8 @@ def generate_scenario_json(self, args): # create arrival events events["vehicle_events"].append({ - "signal_time": arrival.isoformat(), + "signal_time": (arrival + datetime.timedelta(minutes=-args.signal_time_dif) + ).isoformat(), "start_time": arrival.isoformat(), "vehicle_id": v_name, "event_type": "arrival", @@ -322,7 +322,8 @@ def generate_scenario_json(self, args): # create departure events if departure_event_in_input: events["vehicle_events"].append({ - "signal_time": departure.isoformat(), + "signal_time": (departure + datetime.timedelta( + minutes=-args.signal_time_dif)).isoformat(), "start_time": departure.isoformat(), "vehicle_id": v_name, "event_type": "departure", From c7eef9922e81f6182c692aad0dbaa079bf8b49da Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 4 Apr 2022 11:06:48 +0200 Subject: [PATCH 095/802] minor fixes --- ebus_toolbox/__main__.py | 2 ++ ebus_toolbox/schedule.py | 4 ++-- ebus_toolbox/simulate.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 4c797bd7..c873a138 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -35,6 +35,7 @@ help='add battery with specified capacity in kWh and C-rate \ (-1 for variable capacity, second argument is fixed power))') parser.add_argument('--seed', default=None, type=int, help='set random seed') + parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') parser.add_argument('--include-ext-load-csv', help='include CSV for external load. \ You may define custom options with --include-ext-csv-option') @@ -68,6 +69,7 @@ instead of progress bar. Not recommended for fast computations.') parser.add_argument('--save-timeseries', help='Write timesteps to file') parser.add_argument('--save-results', help='Write general info to file') + parser.add_argument('--save-soc', help='Write SOC info to file') parser.add_argument('--strategy', '-s', default='greedy', help='Specify the charging strategy. One of {}. You may define \ custom options with --strategy-option.'.format('greedy, balanced')) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 4b7685b0..0cec5918 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -511,6 +511,6 @@ def get_negative_rotations(self, args): for v_id, time in negative_vehicles.items(): time = datetime.datetime.fromisoformat(time) rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} - negative_rotations.append([k for k, v in rides.items() if time > v.departure_time and - time < v.arrival_time][0]) + negative_rotations.append([k for k, v in rides.items() if time >= v.departure_time and + time <= v.arrival_time][0]) return negative_rotations diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 8288e6b5..891a0d0e 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -33,6 +33,7 @@ def simulate(args): # initialize optimizer i = 0 while(True): + i += 1 # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration schedule.delta_soc_all_trips() @@ -46,7 +47,6 @@ def simulate(args): print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") break schedule.readjust_charging_type(args) - i += 1 # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output From 0dc77a8cd6f949475e48d520c8dce35e232d8361 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 4 Apr 2022 11:38:37 +0200 Subject: [PATCH 096/802] use set_charging_type for ct readjustment --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 0cec5918..6d49fb8c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -476,10 +476,10 @@ def readjust_charging_type(self, args): for rot in negative_rotations: if self.rotations[rot].charging_type == "depb": - self.rotations[rot].charging_type = "oppb" + self.set_charging_type("oppb", [rot]) # todo: actually this case should not happen, but it still does happen.. why? else: - self.rotations[rot].charging_type = "depb" + self.set_charging_type("depb", [rot]) def get_negative_rotations(self, args): """ From 96dc9eb2c7125477845ece1439f35347791626ce Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 4 Apr 2022 12:15:45 +0200 Subject: [PATCH 097/802] add min standing time calc to set_charging_type --- ebus_toolbox/schedule.py | 48 ++++++++++++++++++---------------------- ebus_toolbox/simulate.py | 4 ++-- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 3f8fe398..c79dcd83 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -70,11 +70,14 @@ def filter_rotations(self): """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" pass - def set_charging_type(self, preferred_ct, rotation_ids=None): - """Iterate across all rotations/trips and append charging type if not given + def set_charging_type(self, preferred_ct, args, rotation_ids=None): + """ Change charging type of either all or specified rotations. Adjust minimum standing time + at depot after completion of rotation. - :param preferred_ct: Choose this charging type wheneever possible. Either 'depot' or 'opp'. + :param preferred_ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. :type preferred_ct: str + :param args: Command line arguments and/or arguments from config file. + :type args: argparse.Namespace :param rotation_ids: IDs of rotations for which to set charging type. If None set charging charging type for all rotations. :type rotation_ids: list @@ -86,20 +89,24 @@ def set_charging_type(self, preferred_ct, rotation_ids=None): for id in rotation_ids: rot = self.rotations[id] vehicle_type = self.vehicle_types[f"{rot.vehicle_type}_{rot.charging_type}"] - if preferred_ct == "oppb" or vehicle_type["capacity"] < rot.consumption: + capacity = vehicle_type["capacity"] + if preferred_ct == "oppb" or capacity < rot.consumption: self.rotations[id].charging_type = "oppb" + rot.min_standing_time_deps = \ + (capacity / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb else: self.rotations[id].charging_type = "depb" + rot.min_standing_time_deps = (rot.consumption / args.cs_power_deps_depb) + desired_max_standing_time = \ + (capacity / args.cs_power_deps_depb) * args.min_recharge_deps_oppb + if rot.min_standing_time_deps > desired_max_standing_time: + rot.min_standing_time_deps = desired_max_standing_time - def assign_vehicles(self, args): + def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. For every rotation it is checked whether vehicles with matching type are idle, in which case the one with longest standing time since last rotation is used. If no vehicle is available a new vehicle ID is generated. - - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace - """ rotations_in_progress = [] idle_vehicles = [] @@ -112,20 +119,9 @@ def assign_vehicles(self, args): # mark those vehicle as idle for r in rotations_in_progress: # calculate min_standing_time deps - capacity = self.vehicle_types[ - r.vehicle_type + "_" + r.charging_type]["capacity"] - if r.charging_type == "oppb": - min_standing_time_deps = \ - (capacity / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb - else: - min_standing_time_deps = (r.consumption / args.cs_power_deps_depb) - desired_max_standing_time = \ - (capacity / args.cs_power_deps_depb) * args.min_recharge_deps_oppb - if min_standing_time_deps > desired_max_standing_time: - min_standing_time_deps = desired_max_standing_time if rot.departure_time > r.arrival_time + \ - timedelta(hours=min_standing_time_deps): + timedelta(hours=r.min_standing_time_deps): idle_vehicles.append(r.vehicle_id) rotations_in_progress.pop(0) else: @@ -134,14 +130,14 @@ def assign_vehicles(self, args): # find idle vehicle for rotation if exists # else generate new vehicle id vt_ct = f"{rot.vehicle_type}_{rot.charging_type}" - id = next((id for id in idle_vehicles if vt_ct in id), None) - if id is None: + vehicle_id = next((id for id in idle_vehicles if vt_ct in id), None) + if vehicle_id is None: vehicle_type_counts[vt_ct] += 1 - id = f"{vt_ct}_{vehicle_type_counts[vt_ct]}" + vehicle_id = f"{vt_ct}_{vehicle_type_counts[vt_ct]}" else: - idle_vehicles.remove(id) + idle_vehicles.remove(vehicle_id) - rot.vehicle_id = id + rot.vehicle_id = vehicle_id arrival_times = [r.arrival_time for r in rotations_in_progress] # keep list of ongoing rotations sorted by arrival_time rotations_in_progress.insert(bisect.bisect(arrival_times, rot.arrival_time), rot) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index b4dc5ebf..7ba48408 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -35,9 +35,9 @@ def simulate(args): while(True): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration - schedule.set_charging_type(preferred_ct=args.preferred_charging_type) + schedule.set_charging_type(preferred_ct=args.preferred_charging_type, args=args) schedule.delta_soc_all_trips() - schedule.assign_vehicles(args) + schedule.assign_vehicles() # write trips to csv in spiceEV format schedule.generate_scenario_json(args) From 078dab79386a42c7917f2917740e8f086036cc5a Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 4 Apr 2022 12:56:50 +0200 Subject: [PATCH 098/802] adjust to new signature of set_charging_type --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 6e282820..a0d8988f 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -194,10 +194,10 @@ def readjust_charging_type(self, args): for rot in negative_rotations: if self.rotations[rot].charging_type == "depb": - self.set_charging_type("oppb", [rot]) + self.set_charging_type("oppb", args, [rot]) # todo: actually this case should not happen, but it still does happen.. why? else: - self.set_charging_type("depb", [rot]) + self.set_charging_type("depb", args, [rot]) def get_negative_rotations(self, args): """ From fed40ac87a6092ab33c78760e8cbf9d4d08ee378 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 6 Apr 2022 12:18:03 +0200 Subject: [PATCH 099/802] set start_time of spice_ev sim to earliest signal --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a0d8988f..c0aa1061 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -386,7 +386,7 @@ def generate_scenario_json(self, args): # ######## END OF VEHICLE EVENTS ########## # # define start and stop times - start = self.get_departure_of_first_trip() + start = self.get_departure_of_first_trip() - timedelta(minutes=args.signal_time_dif) stop = self.get_arrival_of_last_trip() + interval if args.days is not None: stop = min(stop, start + datetime.timedelta(days=args.days)) From fac3f2d801f0dc405051a4b120ceadeb7c260141 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 6 Apr 2022 12:19:13 +0200 Subject: [PATCH 100/802] supress spice_ev output --- ebus_toolbox/simulate.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 0cb9ac89..0bbf767d 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,12 +1,14 @@ # imports import json +import sys +import os import warnings from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip from ebus_toolbox import report # , optimizer # SPICE EV SIMULATE -import simulate as spice_ev +from spice_ev import simulate as spice_ev def simulate(args): @@ -42,7 +44,12 @@ def simulate(args): schedule.generate_scenario_json(args) # RUN SPICE EV + print("Running Spice EV...") + sys.stdout = open(os.devnull, 'w') spice_ev.simulate(args) + sys.stdout = sys.__stdout__ + print("Spice EV simulation complete.") + if i == args.iterations: print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") break From 99b7cc244f13932828f7f533f2119d4738283bd0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 6 Apr 2022 12:21:41 +0200 Subject: [PATCH 101/802] add public energy_consumption example file --- data/examples/energy_consumption_example.csv | 23 ++++++++++++++++++++ data/examples/vehicle_types.json | 8 +++---- 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 data/examples/energy_consumption_example.csv diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv new file mode 100644 index 00000000..0579860e --- /dev/null +++ b/data/examples/energy_consumption_example.csv @@ -0,0 +1,23 @@ +Temp.,Alle,Kat. A,Kat. B,Kat. C +-8,2.07,2.2,2.04,1.71 +-6,1.9,2.03,1.76,1.59 +-4,1.81,1.89,1.75,1.58 +-2,1.78,1.86,1.65,1.49 +0,1.65,1.73,1.6,1.44 +2,1.61,1.67,1.57,1.38 +4,1.54,1.6,1.48,1.31 +6,1.47,1.52,1.44,1.25 +8,1.4,1.45,1.38,1.19 +10,1.33,1.37,1.3,1.16 +12,1.29,1.32,1.27,1.1 +14,1.2,1.23,1.17,1.04 +16,1.09,1.13,1.06,0.96 +18,1.06,1.08,1.03,0.93 +20,1.04,1.07,1.00,0.92 +22,1.08,1.11,1.03,0.93 +24,1.16,1.19,1.12,0.96 +26,1.23,1.27,1.2,1.03 +28,1.31,1.34,1.25,1.06 +30,1.43,1.46,1.38,1.11 +32,1.44,1.47,1.42,1.17 +34,1.53,1.57,1.45,1.24 diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 9575057a..05b21136 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -21,7 +21,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "mileage": "data/examples/energy_consumption_example.csv", "hc": "winter" }, "CKB_oppb": { @@ -30,7 +30,7 @@ "charging_curve": [[0, 190], [0.8, 190], [1, 190]], "min_charging_power": 0, "v2g": false, - "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "mileage": "data/examples/energy_consumption_example.csv", "hc": "winter" }, "VDL_depb": { @@ -39,7 +39,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "mileage": "data/examples/energy_consumption_example.csv", "hc": "winter" }, "VDL_oppb": { @@ -48,7 +48,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/private_examples/energy_consumption_eindecker_solaris.csv", + "mileage": "data/examples/energy_consumption_example.csv", "hc": "winter" }, "minimum_information": { From e8d35da558c7052c939efbffcfb1fcc6e1da1bf7 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 6 Apr 2022 12:38:48 +0200 Subject: [PATCH 102/802] minor change for readability --- ebus_toolbox/simulate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 0bbf767d..13ae0355 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -50,10 +50,10 @@ def simulate(args): sys.stdout = sys.__stdout__ print("Spice EV simulation complete.") + schedule.readjust_charging_type(args) + if i == args.iterations: - print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") break - schedule.readjust_charging_type(args) # Quit if optimizer is not defined # (LATER) Run optimizer, continue from top or quit based on optimizer output From 117b6ac95401df0cebc581a335df9a4a7f4f1e4a Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 6 Apr 2022 12:43:31 +0200 Subject: [PATCH 103/802] update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ad02d197..8143efc7 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ docs/source/temp data/private_examples data/simulation_results +data/preprocessing_scripts From 463639289d30f29e4e76475d4f058ce53ce8980c Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 6 Apr 2022 18:05:53 +0200 Subject: [PATCH 104/802] add anonymized data as example --- data/configs/ebus_toolbox.cfg | 10 +- data/examples/electrified_stations.json | 17 + data/examples/trips_example.csv | 3958 +++++++++++++++++++++++ ebus_toolbox/rotation.py | 6 +- ebus_toolbox/schedule.py | 2 +- 5 files changed, 3986 insertions(+), 7 deletions(-) create mode 100644 data/examples/electrified_stations.json create mode 100644 data/examples/trips_example.csv diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 1d03357b..3e9bea40 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1,9 +1,9 @@ # Configs for the eBus Toolbox -# Input file containing trip information -input_schedule = "./data/private_examples/trips_example-bvg_datetime_medium.csv" +# Input file containing trip informationgg +input_schedule = "./data/examples/trips_example.csv" # output path for scenario.json -- called input since its input for spiceev -input = "./data/private_examples/scenario.json" +input = "./data/simulation_results/scenario.json" # Preferred charging type. Options: depb, oppb (default: depb) preferred_charging_type = "depb" # vehicle types @@ -12,7 +12,7 @@ vehicle_types = "./data/examples/vehicle_types.json" min_recharge_deps_oppb = 1 min_recharge_deps_depb = 1 #electrified stations -electrified_stations = data/private_examples/electrified_stations.json +electrified_stations = data/examples/electrified_stations.json # set random seed (for always random: set seed = null) seed = 1 # number of interations for the adjustment of charging types @@ -42,7 +42,7 @@ signal_time_dif = 10 # battery with capacity = 75 kWh and C-Rate = 0.5 #battery = [[50, 1]] # 2 batteries with capacity = 50 kWh, C-Rate = 1, grid_connector = "Betriebshof A") -battery = [[50, 1, "Betriebshof A"]] +battery = [[50, 1, "Beckham"]] # unlimited battery capacity with constant (dis)charge of 50 kWh #battery = [[-1, 50]] diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json new file mode 100644 index 00000000..8a77fa37 --- /dev/null +++ b/data/examples/electrified_stations.json @@ -0,0 +1,17 @@ +{ + "opp_stations": { + "Kehlani": 3, + "Brinley": 1, + "Kamila": 2, + "Izaiah": 5, + "Cecilia": 4, + "Ari": 4, + "Lexi": 3, + "Kali": 5 + }, + "depot_stations": { + "Beckham": "None", + "King": "None", + "Gia": "None" + } +} \ No newline at end of file diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv new file mode 100644 index 00000000..bcda319e --- /dev/null +++ b/data/examples/trips_example.csv @@ -0,0 +1,3958 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type +Ayaan,Beckham,2022-03-07 21:31:00,2022-03-07 21:31:00,Kalani,0.06,0,4454943,CKB +Ayaan,Kalani,2022-03-07 21:31:00,2022-03-07 22:04:00,Brian,14519,4,4454943,CKB +Ayaan,Brian,2022-03-07 22:08:00,2022-03-07 22:43:00,Kalani,13541,8,4454943,CKB +Ayaan,Kalani,2022-03-07 22:51:00,2022-03-07 23:24:00,Brian,14519,4,4454943,CKB +Ayaan,Brian,2022-03-07 23:28:00,2022-03-08 00:03:00,Kalani,13541,8,4454943,CKB +Ayaan,Kalani,2022-03-08 00:11:00,2022-03-08 00:44:00,Brian,14519,0,4454943,CKB +Hunter,Brian,2022-03-08 00:44:00,2022-03-08 00:54:00,Kehlani,4.1,25,4454943,CKB +Hunter,Kehlani,2022-03-08 01:19:00,2022-03-08 01:42:00,Ayden,8.36,6,4454943,CKB +Hunter,Ayden,2022-03-08 01:48:00,2022-03-08 02:06:00,Kehlani,9067,13,4454943,CKB +Hunter,Kehlani,2022-03-08 02:19:00,2022-03-08 02:42:00,Ayden,8.36,6,4454943,CKB +Hunter,Ayden,2022-03-08 02:48:00,2022-03-08 03:06:00,Kehlani,9067,13,4454943,CKB +Hunter,Kehlani,2022-03-08 03:19:00,2022-03-08 03:42:00,Ayden,8.36,6,4454943,CKB +Hunter,Ayden,2022-03-08 03:48:00,2022-03-08 04:06:00,Kehlani,9067,0,4454943,CKB +Hunter,Kehlani,2022-03-08 04:06:00,2022-03-08 04:06:00,Beckham,0.06,0,4454943,CKB +Ayaan,Beckham,2022-03-07 22:11:00,2022-03-07 22:11:00,Kalani,0.06,0,4454948,CKB +Ayaan,Kalani,2022-03-07 22:11:00,2022-03-07 22:44:00,Brian,14519,4,4454948,CKB +Ayaan,Brian,2022-03-07 22:48:00,2022-03-07 23:23:00,Kalani,13541,8,4454948,CKB +Ayaan,Kalani,2022-03-07 23:31:00,2022-03-08 00:04:00,Brian,14519,4,4454948,CKB +Ayaan,Brian,2022-03-08 00:08:00,2022-03-08 00:39:00,Leonel,12213,0,4454948,CKB +Hunter,Leonel,2022-03-08 00:39:00,2022-03-08 00:47:00,Kehlani,4.0,2,4454948,CKB +Hunter,Kehlani,2022-03-08 00:49:00,2022-03-08 01:12:00,Ayden,8.36,6,4454948,CKB +Hunter,Ayden,2022-03-08 01:18:00,2022-03-08 01:36:00,Kehlani,9067,13,4454948,CKB +Hunter,Kehlani,2022-03-08 01:49:00,2022-03-08 02:12:00,Ayden,8.36,6,4454948,CKB +Hunter,Ayden,2022-03-08 02:18:00,2022-03-08 02:36:00,Kehlani,9067,13,4454948,CKB +Hunter,Kehlani,2022-03-08 02:49:00,2022-03-08 03:12:00,Ayden,8.36,6,4454948,CKB +Hunter,Ayden,2022-03-08 03:18:00,2022-03-08 03:36:00,Kehlani,9067,13,4454948,CKB +Hunter,Kehlani,2022-03-08 03:49:00,2022-03-08 04:12:00,Ayden,8.36,0,4454948,CKB +Hunter,Ayden,2022-03-08 04:12:00,2022-03-08 04:12:00,Beckham,0.06,0,4454948,CKB +Donovan,Beckham,2022-03-07 21:06:00,2022-03-07 21:06:00,Pierce,0.06,0,4664622,CKB +Donovan,Pierce,2022-03-07 21:06:00,2022-03-07 21:34:00,Leonardo,13018,19,4664622,CKB +Donovan,Leonardo,2022-03-07 21:53:00,2022-03-07 22:13:00,Kamryn,10332,17,4664622,CKB +Donovan,Kamryn,2022-03-07 22:30:00,2022-03-07 22:54:00,Leonardo,10.48,19,4664622,CKB +Donovan,Leonardo,2022-03-07 23:13:00,2022-03-07 23:33:00,Kamryn,10332,17,4664622,CKB +Donovan,Kamryn,2022-03-07 23:50:00,2022-03-08 00:14:00,Leonardo,10.48,2,4664622,CKB +Donovan,Leonardo,2022-03-08 00:16:00,2022-03-08 00:23:00,Melanie,3709,5,4664622,CKB +Zoey,Melanie,2022-03-08 00:28:00,2022-03-08 00:44:00,Brinley,6404,3,4664622,CKB +Zoey,Brinley,2022-03-08 00:47:00,2022-03-08 01:10:00,Finn,10579,7,4664622,CKB +Zoey,Finn,2022-03-08 01:17:00,2022-03-08 01:44:00,Brinley,12007,3,4664622,CKB +Zoey,Brinley,2022-03-08 01:47:00,2022-03-08 02:10:00,Finn,10579,7,4664622,CKB +Zoey,Finn,2022-03-08 02:17:00,2022-03-08 02:44:00,Brinley,12007,3,4664622,CKB +Zoey,Brinley,2022-03-08 02:47:00,2022-03-08 03:10:00,Finn,10579,7,4664622,CKB +Zoey,Finn,2022-03-08 03:17:00,2022-03-08 03:44:00,Brinley,12007,3,4664622,CKB +Zoey,Brinley,2022-03-08 03:47:00,2022-03-08 04:10:00,Finn,10579,7,4664622,CKB +Zoey,Finn,2022-03-08 04:17:00,2022-03-08 04:44:00,Brinley,12007,0,4664622,CKB +Zoey,Brinley,2022-03-08 04:44:00,2022-03-08 04:44:00,Beckham,0.06,0,4664622,CKB +Donovan,Beckham,2022-03-07 20:26:00,2022-03-07 20:26:00,Pierce,0.06,0,4762732,CKB +Donovan,Pierce,2022-03-07 20:26:00,2022-03-07 20:56:00,Ezra,14097,14,4762732,CKB +Donovan,Ezra,2022-03-07 21:10:00,2022-03-07 21:38:00,Pierce,13.19,8,4762732,CKB +Donovan,Pierce,2022-03-07 21:46:00,2022-03-07 22:14:00,Leonardo,13018,19,4762732,CKB +Donovan,Leonardo,2022-03-07 22:33:00,2022-03-07 22:53:00,Kamryn,10332,17,4762732,CKB +Donovan,Kamryn,2022-03-07 23:10:00,2022-03-07 23:34:00,Leonardo,10.48,19,4762732,CKB +Donovan,Leonardo,2022-03-07 23:53:00,2022-03-08 00:13:00,Kamryn,10332,2,4762732,CKB +Donovan,Kamryn,2022-03-08 00:15:00,2022-03-08 00:16:00,Brinley,506,1,4762732,CKB +Zoey,Brinley,2022-03-08 00:17:00,2022-03-08 00:40:00,Finn,10579,7,4762732,CKB +Zoey,Finn,2022-03-08 00:47:00,2022-03-08 01:14:00,Brinley,12007,3,4762732,CKB +Zoey,Brinley,2022-03-08 01:17:00,2022-03-08 01:40:00,Finn,10579,7,4762732,CKB +Zoey,Finn,2022-03-08 01:47:00,2022-03-08 02:14:00,Brinley,12007,3,4762732,CKB +Zoey,Brinley,2022-03-08 02:17:00,2022-03-08 02:40:00,Finn,10579,7,4762732,CKB +Zoey,Finn,2022-03-08 02:47:00,2022-03-08 03:14:00,Brinley,12007,3,4762732,CKB +Zoey,Brinley,2022-03-08 03:17:00,2022-03-08 03:40:00,Finn,10579,7,4762732,CKB +Zoey,Finn,2022-03-08 03:47:00,2022-03-08 04:14:00,Brinley,12007,3,4762732,CKB +Zoey,Brinley,2022-03-08 04:17:00,2022-03-08 04:40:00,Finn,10579,3,4762732,CKB +Jackson,Finn,2022-03-08 04:43:00,2022-03-08 04:58:00,Rose,6161,0,4762732,CKB +Jackson,Rose,2022-03-08 04:58:00,2022-03-08 04:58:00,Beckham,0.06,0,4762732,CKB +Avery,Beckham,2022-03-07 22:56:00,2022-03-07 22:56:00,Jace,0.06,0,4617401,CKB +Avery,Jace,2022-03-07 22:56:00,2022-03-07 23:08:00,Nathan,5882,3,4617401,CKB +Avery,Nathan,2022-03-07 23:11:00,2022-03-07 23:25:00,Jace,6232,0,4617401,CKB +Avery,Jace,2022-03-07 23:25:00,2022-03-07 23:38:00,Nathan,6086,3,4617401,CKB +Avery,Nathan,2022-03-07 23:41:00,2022-03-07 23:55:00,Jace,6232,0,4617401,CKB +Avery,Jace,2022-03-07 23:55:00,2022-03-08 00:08:00,Nathan,6086,0,4617401,CKB +Avery,Nathan,2022-03-08 00:08:00,2022-03-08 00:08:00,Beckham,0.06,0,4617401,CKB +Richard,Beckham,2022-03-07 05:05:00,2022-03-07 05:05:00,Ariyah,0.06,0,4426844,CKB +Richard,Ariyah,2022-03-07 05:05:00,2022-03-07 05:14:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 05:14:00,2022-03-07 05:23:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 05:25:00,2022-03-07 05:34:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 05:34:00,2022-03-07 05:43:00,Ariyah,5139,23,4426844,CKB +Richard,Ariyah,2022-03-07 06:06:00,2022-03-07 06:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 06:15:00,2022-03-07 06:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 06:26:00,2022-03-07 06:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 06:35:00,2022-03-07 06:44:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 06:46:00,2022-03-07 06:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 06:55:00,2022-03-07 07:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 07:06:00,2022-03-07 07:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 07:15:00,2022-03-07 07:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 07:26:00,2022-03-07 07:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 07:35:00,2022-03-07 07:44:00,Ariyah,5139,22,4426844,CKB +Richard,Ariyah,2022-03-07 08:06:00,2022-03-07 08:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 08:15:00,2022-03-07 08:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 08:26:00,2022-03-07 08:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 08:35:00,2022-03-07 08:44:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 08:46:00,2022-03-07 08:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 08:55:00,2022-03-07 09:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 09:06:00,2022-03-07 09:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 09:15:00,2022-03-07 09:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 09:26:00,2022-03-07 09:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 09:35:00,2022-03-07 09:44:00,Ariyah,5139,22,4426844,CKB +Richard,Ariyah,2022-03-07 10:06:00,2022-03-07 10:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 10:15:00,2022-03-07 10:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 10:26:00,2022-03-07 10:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 10:35:00,2022-03-07 10:44:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 10:46:00,2022-03-07 10:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 10:55:00,2022-03-07 11:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 11:06:00,2022-03-07 11:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 11:15:00,2022-03-07 11:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 11:26:00,2022-03-07 11:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 11:35:00,2022-03-07 11:44:00,Ariyah,5139,22,4426844,CKB +Richard,Ariyah,2022-03-07 12:06:00,2022-03-07 12:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 12:15:00,2022-03-07 12:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 12:26:00,2022-03-07 12:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 12:35:00,2022-03-07 12:44:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 12:46:00,2022-03-07 12:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 12:55:00,2022-03-07 13:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 13:06:00,2022-03-07 13:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 13:15:00,2022-03-07 13:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 13:26:00,2022-03-07 13:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 13:35:00,2022-03-07 13:44:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 13:46:00,2022-03-07 13:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 13:55:00,2022-03-07 14:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 14:06:00,2022-03-07 14:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 14:15:00,2022-03-07 14:24:00,Ariyah,5139,22,4426844,CKB +Richard,Ariyah,2022-03-07 14:46:00,2022-03-07 14:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 14:55:00,2022-03-07 15:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 15:06:00,2022-03-07 15:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 15:15:00,2022-03-07 15:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 15:26:00,2022-03-07 15:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 15:35:00,2022-03-07 15:44:00,Ariyah,5139,22,4426844,CKB +Richard,Ariyah,2022-03-07 16:06:00,2022-03-07 16:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 16:15:00,2022-03-07 16:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 16:26:00,2022-03-07 16:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 16:35:00,2022-03-07 16:44:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 16:46:00,2022-03-07 16:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 16:55:00,2022-03-07 17:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 17:06:00,2022-03-07 17:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 17:15:00,2022-03-07 17:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 17:26:00,2022-03-07 17:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 17:35:00,2022-03-07 17:44:00,Ariyah,5139,22,4426844,CKB +Richard,Ariyah,2022-03-07 18:06:00,2022-03-07 18:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 18:15:00,2022-03-07 18:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 18:26:00,2022-03-07 18:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 18:35:00,2022-03-07 18:44:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 18:46:00,2022-03-07 18:55:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 18:55:00,2022-03-07 19:04:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 19:06:00,2022-03-07 19:15:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 19:15:00,2022-03-07 19:24:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 19:26:00,2022-03-07 19:35:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 19:35:00,2022-03-07 19:44:00,Ariyah,5139,21,4426844,CKB +Richard,Ariyah,2022-03-07 20:05:00,2022-03-07 20:14:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 20:14:00,2022-03-07 20:23:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 20:25:00,2022-03-07 20:34:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 20:34:00,2022-03-07 20:43:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 20:45:00,2022-03-07 20:54:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 20:54:00,2022-03-07 21:03:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 21:05:00,2022-03-07 21:14:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 21:14:00,2022-03-07 21:23:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 21:25:00,2022-03-07 21:34:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 21:34:00,2022-03-07 21:43:00,Ariyah,5139,22,4426844,CKB +Richard,Ariyah,2022-03-07 22:05:00,2022-03-07 22:14:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 22:14:00,2022-03-07 22:23:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 22:25:00,2022-03-07 22:34:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 22:34:00,2022-03-07 22:43:00,Ariyah,5139,2,4426844,CKB +Richard,Ariyah,2022-03-07 22:45:00,2022-03-07 22:54:00,Jaden,4781,0,4426844,CKB +Richard,Jaden,2022-03-07 22:54:00,2022-03-07 23:03:00,Ariyah,5139,0,4426844,CKB +Richard,Ariyah,2022-03-07 23:03:00,2022-03-07 23:03:00,Beckham,0.06,0,4426844,CKB +Ezekiel,Beckham,2022-03-08 00:06:00,2022-03-08 00:06:00,Erik,0.06,0,4708594,CKB +Ezekiel,Erik,2022-03-08 00:06:00,2022-03-08 00:27:00,Memphis,7827,0,4708594,CKB +Jake,Memphis,2022-03-08 00:27:00,2022-03-08 00:48:00,Kayleigh,11079,0,4708594,CKB +Jake,Kayleigh,2022-03-08 00:48:00,2022-03-08 01:25:00,Kamila,20641,8,4708594,CKB +Jake,Kamila,2022-03-08 01:33:00,2022-03-08 02:16:00,Kayleigh,20579,1,4708594,CKB +Jake,Kayleigh,2022-03-08 02:17:00,2022-03-08 02:55:00,Kamila,20641,8,4708594,CKB +Jake,Kamila,2022-03-08 03:03:00,2022-03-08 03:46:00,Kayleigh,20579,1,4708594,CKB +Jake,Kayleigh,2022-03-08 03:47:00,2022-03-08 04:25:00,Kamila,20641,0,4708594,CKB +Jake,Kamila,2022-03-08 04:25:00,2022-03-08 04:25:00,Beckham,0.06,0,4708594,CKB +Astrid,King,2022-03-07 05:15:00,2022-03-07 06:01:00,Brayden,17.9,0,4317624,VDL +Astrid,Brayden,2022-03-07 06:01:00,2022-03-07 06:15:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 06:23:00,2022-03-07 06:37:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 06:41:00,2022-03-07 06:55:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 07:03:00,2022-03-07 07:17:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 07:21:00,2022-03-07 07:35:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 07:43:00,2022-03-07 07:57:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 08:01:00,2022-03-07 08:15:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 08:23:00,2022-03-07 08:37:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 08:41:00,2022-03-07 08:55:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 09:03:00,2022-03-07 09:17:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 09:21:00,2022-03-07 09:35:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 09:43:00,2022-03-07 09:57:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 10:01:00,2022-03-07 10:15:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 10:23:00,2022-03-07 10:37:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 10:41:00,2022-03-07 10:55:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 11:03:00,2022-03-07 11:17:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 11:21:00,2022-03-07 11:35:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 11:43:00,2022-03-07 11:57:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 12:01:00,2022-03-07 12:15:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 12:23:00,2022-03-07 12:37:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 12:41:00,2022-03-07 12:55:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 13:03:00,2022-03-07 13:17:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 13:21:00,2022-03-07 13:35:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 13:43:00,2022-03-07 13:57:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 14:01:00,2022-03-07 14:15:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 14:23:00,2022-03-07 14:37:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 14:41:00,2022-03-07 14:55:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 15:03:00,2022-03-07 15:17:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 15:21:00,2022-03-07 15:35:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 15:43:00,2022-03-07 15:57:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 16:01:00,2022-03-07 16:15:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 16:23:00,2022-03-07 16:37:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 16:41:00,2022-03-07 16:55:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 17:03:00,2022-03-07 17:17:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 17:21:00,2022-03-07 17:35:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 17:43:00,2022-03-07 17:57:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 18:01:00,2022-03-07 18:15:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 18:23:00,2022-03-07 18:37:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 18:41:00,2022-03-07 18:55:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 19:03:00,2022-03-07 19:17:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 19:21:00,2022-03-07 19:35:00,Brayden,4637,8,4317624,VDL +Astrid,Brayden,2022-03-07 19:43:00,2022-03-07 19:57:00,Brayden,4637,4,4317624,VDL +Astrid,Brayden,2022-03-07 20:01:00,2022-03-07 20:14:00,Brayden,4637,9,4317624,VDL +Astrid,Brayden,2022-03-07 20:23:00,2022-03-07 20:36:00,Brayden,4637,0,4317624,VDL +Astrid,Brayden,2022-03-07 20:36:00,2022-03-07 21:15:00,King,19.8,0,4317624,VDL +Amy,Beckham,2022-03-07 04:56:00,2022-03-07 04:56:00,Izabella,0.06,18,4425667,CKB +Amy,Izabella,2022-03-07 05:14:00,2022-03-07 05:20:00,Tristan,3.29,0,4425667,CKB +Amy,Tristan,2022-03-07 05:20:00,2022-03-07 05:24:00,Izabella,2954,20,4425667,CKB +Amy,Izabella,2022-03-07 05:44:00,2022-03-07 05:50:00,Tristan,3.29,0,4425667,CKB +Amy,Tristan,2022-03-07 05:50:00,2022-03-07 05:54:00,Izabella,2954,5,4425667,CKB +Amy,Izabella,2022-03-07 05:59:00,2022-03-07 06:06:00,Tristan,3.29,2,4425667,CKB +Amy,Tristan,2022-03-07 06:08:00,2022-03-07 06:13:00,Izabella,2954,19,4425667,CKB +Amy,Izabella,2022-03-07 06:32:00,2022-03-07 06:39:00,Tristan,3.29,1,4425667,CKB +Amy,Tristan,2022-03-07 06:40:00,2022-03-07 06:45:00,Izabella,2954,7,4425667,CKB +Amy,Izabella,2022-03-07 06:52:00,2022-03-07 06:59:00,Tristan,3.29,1,4425667,CKB +Amy,Tristan,2022-03-07 07:00:00,2022-03-07 07:05:00,Izabella,2954,7,4425667,CKB +Amy,Izabella,2022-03-07 07:12:00,2022-03-07 07:19:00,Tristan,3.29,1,4425667,CKB +Amy,Tristan,2022-03-07 07:20:00,2022-03-07 07:25:00,Izabella,2954,7,4425667,CKB +Amy,Izabella,2022-03-07 07:32:00,2022-03-07 07:39:00,Tristan,3.29,1,4425667,CKB +Amy,Tristan,2022-03-07 07:40:00,2022-03-07 07:45:00,Izabella,2954,295,4425667,CKB +Amy,Izabella,2022-03-07 12:40:00,2022-03-07 12:47:00,Tristan,3.29,2,4425667,CKB +Amy,Tristan,2022-03-07 12:49:00,2022-03-07 12:54:00,Izabella,2954,46,4425667,CKB +Amy,Izabella,2022-03-07 13:40:00,2022-03-07 13:47:00,Tristan,3.29,2,4425667,CKB +Amy,Tristan,2022-03-07 13:49:00,2022-03-07 13:54:00,Izabella,2954,434,4425667,CKB +Amy,Izabella,2022-03-07 21:08:00,2022-03-07 21:08:00,Beckham,0.06,0,4425667,CKB +Matilda,Beckham,2022-03-07 07:20:00,2022-03-07 07:20:00,Izaiah,0.06,0,4448149,CKB +Matilda,Izaiah,2022-03-07 07:20:00,2022-03-07 07:50:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 08:00:00,2022-03-07 08:30:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 08:40:00,2022-03-07 09:10:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 09:20:00,2022-03-07 09:50:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 10:00:00,2022-03-07 10:30:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 10:40:00,2022-03-07 11:10:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 11:20:00,2022-03-07 11:50:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 12:00:00,2022-03-07 12:30:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 12:40:00,2022-03-07 13:10:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 13:20:00,2022-03-07 13:50:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 14:00:00,2022-03-07 14:30:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 14:40:00,2022-03-07 15:10:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 15:20:00,2022-03-07 15:50:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 16:00:00,2022-03-07 16:30:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 16:40:00,2022-03-07 17:10:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 17:20:00,2022-03-07 17:50:00,Izaiah,9266,10,4448149,CKB +Matilda,Izaiah,2022-03-07 18:00:00,2022-03-07 18:30:00,Izaiah,9266,0,4448149,CKB +Matilda,Izaiah,2022-03-07 18:30:00,2022-03-07 18:30:00,Beckham,0.06,0,4448149,CKB +Hailey,Beckham,2022-03-07 07:10:00,2022-03-07 07:10:00,Kaylani,0.06,0,4733894,CKB +Hailey,Kaylani,2022-03-07 07:10:00,2022-03-07 07:18:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 07:28:00,2022-03-07 07:40:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 07:40:00,2022-03-07 07:48:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 07:58:00,2022-03-07 08:10:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 08:10:00,2022-03-07 08:18:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 08:28:00,2022-03-07 08:40:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 08:40:00,2022-03-07 08:48:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 08:58:00,2022-03-07 09:10:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 09:10:00,2022-03-07 09:18:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 09:28:00,2022-03-07 09:40:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 09:40:00,2022-03-07 09:48:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 09:58:00,2022-03-07 10:10:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 10:10:00,2022-03-07 10:18:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 10:28:00,2022-03-07 10:40:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 10:40:00,2022-03-07 10:48:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 10:58:00,2022-03-07 11:10:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 11:10:00,2022-03-07 11:18:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 11:28:00,2022-03-07 11:40:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 11:40:00,2022-03-07 11:48:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 11:58:00,2022-03-07 12:10:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 12:10:00,2022-03-07 12:18:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 12:28:00,2022-03-07 12:40:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 12:40:00,2022-03-07 12:48:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 12:58:00,2022-03-07 13:10:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 13:10:00,2022-03-07 13:18:00,Cecilia,2169,10,4733894,CKB +Hailey,Cecilia,2022-03-07 13:28:00,2022-03-07 13:40:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 13:40:00,2022-03-07 13:48:00,Cecilia,2169,8,4733894,CKB +Hailey,Cecilia,2022-03-07 13:56:00,2022-03-07 14:10:00,Kaylani,2952,0,4733894,CKB +Hailey,Kaylani,2022-03-07 14:10:00,2022-03-07 14:19:00,Cecilia,2169,14,4733894,CKB +Hailey,Cecilia,2022-03-07 14:33:00,2022-03-07 14:47:00,Kaylani,2952,3,4733894,CKB +Hailey,Kaylani,2022-03-07 14:50:00,2022-03-07 14:59:00,Cecilia,2169,14,4733894,CKB +Hailey,Cecilia,2022-03-07 15:13:00,2022-03-07 15:27:00,Kaylani,2952,3,4733894,CKB +Hailey,Kaylani,2022-03-07 15:30:00,2022-03-07 15:39:00,Cecilia,2169,14,4733894,CKB +Hailey,Cecilia,2022-03-07 15:53:00,2022-03-07 16:07:00,Kaylani,2952,3,4733894,CKB +Hailey,Kaylani,2022-03-07 16:10:00,2022-03-07 16:19:00,Cecilia,2169,14,4733894,CKB +Hailey,Cecilia,2022-03-07 16:33:00,2022-03-07 16:47:00,Kaylani,2952,3,4733894,CKB +Hailey,Kaylani,2022-03-07 16:50:00,2022-03-07 16:59:00,Cecilia,2169,14,4733894,CKB +Hailey,Cecilia,2022-03-07 17:13:00,2022-03-07 17:27:00,Kaylani,2952,3,4733894,CKB +Hailey,Kaylani,2022-03-07 17:30:00,2022-03-07 17:39:00,Cecilia,2169,13,4733894,CKB +Hailey,Cecilia,2022-03-07 17:52:00,2022-03-07 18:05:00,Kaylani,2952,5,4733894,CKB +Hailey,Kaylani,2022-03-07 18:10:00,2022-03-07 18:18:00,Cecilia,2169,0,4733894,CKB +Hailey,Cecilia,2022-03-07 18:18:00,2022-03-07 18:18:00,Beckham,0.06,0,4733894,CKB +Hailey,Beckham,2022-03-07 14:13:00,2022-03-07 14:13:00,Cecilia,0.06,0,4734199,CKB +Hailey,Cecilia,2022-03-07 14:13:00,2022-03-07 14:27:00,Kaylani,2952,3,4734199,CKB +Hailey,Kaylani,2022-03-07 14:30:00,2022-03-07 14:39:00,Cecilia,2169,14,4734199,CKB +Hailey,Cecilia,2022-03-07 14:53:00,2022-03-07 15:07:00,Kaylani,2952,3,4734199,CKB +Hailey,Kaylani,2022-03-07 15:10:00,2022-03-07 15:19:00,Cecilia,2169,14,4734199,CKB +Hailey,Cecilia,2022-03-07 15:33:00,2022-03-07 15:47:00,Kaylani,2952,3,4734199,CKB +Hailey,Kaylani,2022-03-07 15:50:00,2022-03-07 15:59:00,Cecilia,2169,14,4734199,CKB +Hailey,Cecilia,2022-03-07 16:13:00,2022-03-07 16:27:00,Kaylani,2952,3,4734199,CKB +Hailey,Kaylani,2022-03-07 16:30:00,2022-03-07 16:39:00,Cecilia,2169,14,4734199,CKB +Hailey,Cecilia,2022-03-07 16:53:00,2022-03-07 17:07:00,Kaylani,2952,3,4734199,CKB +Hailey,Kaylani,2022-03-07 17:10:00,2022-03-07 17:19:00,Cecilia,2169,14,4734199,CKB +Hailey,Cecilia,2022-03-07 17:33:00,2022-03-07 17:47:00,Kaylani,2952,3,4734199,CKB +Hailey,Kaylani,2022-03-07 17:50:00,2022-03-07 17:59:00,Cecilia,2169,14,4734199,CKB +Hailey,Cecilia,2022-03-07 18:13:00,2022-03-07 18:25:00,Kaylani,2952,0,4734199,CKB +Hailey,Kaylani,2022-03-07 18:25:00,2022-03-07 18:25:00,Beckham,0.06,0,4734199,CKB +Matthias,Beckham,2022-03-08 00:23:00,2022-03-08 00:23:00,Addilyn,0.06,0,4318156,CKB +Matthias,Addilyn,2022-03-08 00:23:00,2022-03-08 00:30:00,Ari,2577,9,4318156,CKB +Ruby,Ari,2022-03-08 00:39:00,2022-03-08 00:54:00,Kobe,5937,9,4318156,CKB +Ruby,Kobe,2022-03-08 01:03:00,2022-03-08 01:17:00,Ari,6.19,0,4318156,CKB +Matthias,Ari,2022-03-08 01:17:00,2022-03-08 01:23:00,Addilyn,2555,0,4318156,CKB +Matthias,Addilyn,2022-03-08 01:23:00,2022-03-08 01:30:00,Ari,2577,9,4318156,CKB +Ruby,Ari,2022-03-08 01:39:00,2022-03-08 01:54:00,Kobe,5937,9,4318156,CKB +Ruby,Kobe,2022-03-08 02:03:00,2022-03-08 02:17:00,Ari,6.19,0,4318156,CKB +Matthias,Ari,2022-03-08 02:17:00,2022-03-08 02:23:00,Addilyn,2555,0,4318156,CKB +Matthias,Addilyn,2022-03-08 02:23:00,2022-03-08 02:30:00,Ari,2577,9,4318156,CKB +Ruby,Ari,2022-03-08 02:39:00,2022-03-08 02:54:00,Kobe,5937,9,4318156,CKB +Ruby,Kobe,2022-03-08 03:03:00,2022-03-08 03:17:00,Ari,6.19,0,4318156,CKB +Matthias,Ari,2022-03-08 03:17:00,2022-03-08 03:23:00,Addilyn,2555,0,4318156,CKB +Matthias,Addilyn,2022-03-08 03:23:00,2022-03-08 03:30:00,Ari,2577,9,4318156,CKB +Ruby,Ari,2022-03-08 03:39:00,2022-03-08 03:54:00,Kobe,5937,9,4318156,CKB +Ruby,Kobe,2022-03-08 04:03:00,2022-03-08 04:17:00,Ari,6.19,0,4318156,CKB +Matthias,Ari,2022-03-08 04:17:00,2022-03-08 04:23:00,Addilyn,2555,0,4318156,CKB +Matthias,Addilyn,2022-03-08 04:23:00,2022-03-08 04:23:00,Beckham,0.06,0,4318156,CKB +Ruby,Beckham,2022-03-08 00:33:00,2022-03-08 00:33:00,Kobe,0.06,0,4318176,CKB +Ruby,Kobe,2022-03-08 00:33:00,2022-03-08 00:47:00,Ari,6.19,0,4318176,CKB +Matthias,Ari,2022-03-08 00:47:00,2022-03-08 00:53:00,Addilyn,2555,0,4318176,CKB +Matthias,Addilyn,2022-03-08 00:53:00,2022-03-08 01:00:00,Ari,2577,9,4318176,CKB +Ruby,Ari,2022-03-08 01:09:00,2022-03-08 01:24:00,Kobe,5937,9,4318176,CKB +Ruby,Kobe,2022-03-08 01:33:00,2022-03-08 01:47:00,Ari,6.19,0,4318176,CKB +Matthias,Ari,2022-03-08 01:47:00,2022-03-08 01:53:00,Addilyn,2555,0,4318176,CKB +Matthias,Addilyn,2022-03-08 01:53:00,2022-03-08 02:00:00,Ari,2577,9,4318176,CKB +Ruby,Ari,2022-03-08 02:09:00,2022-03-08 02:24:00,Kobe,5937,9,4318176,CKB +Ruby,Kobe,2022-03-08 02:33:00,2022-03-08 02:47:00,Ari,6.19,0,4318176,CKB +Matthias,Ari,2022-03-08 02:47:00,2022-03-08 02:53:00,Addilyn,2555,0,4318176,CKB +Matthias,Addilyn,2022-03-08 02:53:00,2022-03-08 03:00:00,Ari,2577,9,4318176,CKB +Ruby,Ari,2022-03-08 03:09:00,2022-03-08 03:24:00,Kobe,5937,9,4318176,CKB +Ruby,Kobe,2022-03-08 03:33:00,2022-03-08 03:47:00,Ari,6.19,0,4318176,CKB +Matthias,Ari,2022-03-08 03:47:00,2022-03-08 03:53:00,Addilyn,2555,0,4318176,CKB +Matthias,Addilyn,2022-03-08 03:53:00,2022-03-08 04:00:00,Ari,2577,9,4318176,CKB +Ruby,Ari,2022-03-08 04:09:00,2022-03-08 04:24:00,Kobe,5937,0,4318176,CKB +Ruby,Kobe,2022-03-08 04:24:00,2022-03-08 04:24:00,Beckham,0.06,0,4318176,CKB +Rosie,Beckham,2022-03-08 00:57:00,2022-03-08 00:57:00,Lexi,0.06,0,4319351,CKB +Rosie,Lexi,2022-03-08 00:57:00,2022-03-08 01:06:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 01:06:00,2022-03-08 01:11:00,Lexi,2936,16,4319351,CKB +Rosie,Lexi,2022-03-08 01:27:00,2022-03-08 01:36:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 01:36:00,2022-03-08 01:41:00,Lexi,2936,16,4319351,CKB +Rosie,Lexi,2022-03-08 01:57:00,2022-03-08 02:06:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 02:06:00,2022-03-08 02:11:00,Lexi,2936,16,4319351,CKB +Rosie,Lexi,2022-03-08 02:27:00,2022-03-08 02:36:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 02:36:00,2022-03-08 02:41:00,Lexi,2936,16,4319351,CKB +Rosie,Lexi,2022-03-08 02:57:00,2022-03-08 03:06:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 03:06:00,2022-03-08 03:11:00,Lexi,2936,16,4319351,CKB +Rosie,Lexi,2022-03-08 03:27:00,2022-03-08 03:36:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 03:36:00,2022-03-08 03:41:00,Lexi,2936,16,4319351,CKB +Rosie,Lexi,2022-03-08 03:57:00,2022-03-08 04:06:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 04:06:00,2022-03-08 04:11:00,Lexi,2936,16,4319351,CKB +Rosie,Lexi,2022-03-08 04:27:00,2022-03-08 04:36:00,Colton,4343,0,4319351,CKB +Rosie,Colton,2022-03-08 04:36:00,2022-03-08 04:36:00,Beckham,0.06,0,4319351,CKB +Daxton,Beckham,2022-03-08 00:29:00,2022-03-08 00:29:00,Harper,0.06,0,4751086,CKB +Daxton,Harper,2022-03-08 00:29:00,2022-03-08 00:41:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 00:47:00,2022-03-08 00:57:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 00:59:00,2022-03-08 01:11:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 01:17:00,2022-03-08 01:27:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 01:29:00,2022-03-08 01:41:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 01:47:00,2022-03-08 01:57:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 01:59:00,2022-03-08 02:11:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 02:17:00,2022-03-08 02:27:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 02:29:00,2022-03-08 02:41:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 02:47:00,2022-03-08 02:57:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 02:59:00,2022-03-08 03:11:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 03:17:00,2022-03-08 03:27:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 03:29:00,2022-03-08 03:41:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 03:47:00,2022-03-08 03:57:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 03:59:00,2022-03-08 04:11:00,Calvin,4481,6,4751086,CKB +Daxton,Calvin,2022-03-08 04:17:00,2022-03-08 04:27:00,Harper,4031,2,4751086,CKB +Daxton,Harper,2022-03-08 04:29:00,2022-03-08 04:41:00,Calvin,4481,0,4751086,CKB +Daxton,Calvin,2022-03-08 04:41:00,2022-03-08 04:41:00,Beckham,0.06,0,4751086,CKB +Andy,Beckham,2022-03-08 00:30:00,2022-03-08 00:30:00,Harper,0.06,0,4453544,CKB +Andy,Harper,2022-03-08 00:30:00,2022-03-08 00:44:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 00:44:00,2022-03-08 00:57:00,Harper,5302,3,4453544,CKB +Andy,Harper,2022-03-08 01:00:00,2022-03-08 01:14:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 01:14:00,2022-03-08 01:27:00,Harper,5302,3,4453544,CKB +Andy,Harper,2022-03-08 01:30:00,2022-03-08 01:44:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 01:44:00,2022-03-08 01:57:00,Harper,5302,3,4453544,CKB +Andy,Harper,2022-03-08 02:00:00,2022-03-08 02:14:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 02:14:00,2022-03-08 02:27:00,Harper,5302,3,4453544,CKB +Andy,Harper,2022-03-08 02:30:00,2022-03-08 02:44:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 02:44:00,2022-03-08 02:57:00,Harper,5302,3,4453544,CKB +Andy,Harper,2022-03-08 03:00:00,2022-03-08 03:14:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 03:14:00,2022-03-08 03:27:00,Harper,5302,3,4453544,CKB +Andy,Harper,2022-03-08 03:30:00,2022-03-08 03:44:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 03:44:00,2022-03-08 03:57:00,Harper,5302,3,4453544,CKB +Andy,Harper,2022-03-08 04:00:00,2022-03-08 04:14:00,Elise,4801,0,4453544,CKB +Andy,Elise,2022-03-08 04:14:00,2022-03-08 04:27:00,Harper,5302,0,4453544,CKB +Andy,Harper,2022-03-08 04:27:00,2022-03-08 04:27:00,Beckham,0.06,0,4453544,CKB +Alex,Beckham,2022-03-08 00:43:00,2022-03-08 00:43:00,Chase,0.06,0,4374466,CKB +Alex,Chase,2022-03-08 00:43:00,2022-03-08 01:33:00,Chase,20434,10,4374466,CKB +Alex,Chase,2022-03-08 01:43:00,2022-03-08 02:33:00,Chase,20434,10,4374466,CKB +Alex,Chase,2022-03-08 02:43:00,2022-03-08 03:33:00,Chase,20434,10,4374466,CKB +Alex,Chase,2022-03-08 03:43:00,2022-03-08 04:33:00,Chase,20434,0,4374466,CKB +Alex,Chase,2022-03-08 04:33:00,2022-03-08 04:33:00,Beckham,0.06,0,4374466,CKB +Alex,Beckham,2022-03-08 00:13:00,2022-03-08 00:13:00,Chase,0.06,0,4374471,CKB +Alex,Chase,2022-03-08 00:13:00,2022-03-08 01:03:00,Chase,20434,10,4374471,CKB +Alex,Chase,2022-03-08 01:13:00,2022-03-08 02:03:00,Chase,20434,10,4374471,CKB +Alex,Chase,2022-03-08 02:13:00,2022-03-08 03:03:00,Chase,20434,10,4374471,CKB +Alex,Chase,2022-03-08 03:13:00,2022-03-08 04:03:00,Chase,20434,0,4374471,CKB +Alex,Chase,2022-03-08 04:03:00,2022-03-08 04:03:00,Beckham,0.06,0,4374471,CKB +Hazel,Beckham,2022-03-08 00:24:00,2022-03-08 00:24:00,Celine,0.06,0,4456447,CKB +Hazel,Celine,2022-03-08 00:24:00,2022-03-08 00:48:00,Kali,11.86,4,4456447,CKB +Hazel,Kali,2022-03-08 00:52:00,2022-03-08 01:14:00,Celine,11139,10,4456447,CKB +Hazel,Celine,2022-03-08 01:24:00,2022-03-08 01:48:00,Kali,11.86,4,4456447,CKB +Hazel,Kali,2022-03-08 01:52:00,2022-03-08 02:14:00,Celine,11139,10,4456447,CKB +Hazel,Celine,2022-03-08 02:24:00,2022-03-08 02:48:00,Kali,11.86,4,4456447,CKB +Hazel,Kali,2022-03-08 02:52:00,2022-03-08 03:14:00,Celine,11139,10,4456447,CKB +Hazel,Celine,2022-03-08 03:24:00,2022-03-08 03:48:00,Kali,11.86,4,4456447,CKB +Hazel,Kali,2022-03-08 03:52:00,2022-03-08 04:14:00,Celine,11139,0,4456447,CKB +Hazel,Celine,2022-03-08 04:14:00,2022-03-08 04:14:00,Beckham,0.06,0,4456447,CKB +Hazel,Beckham,2022-03-08 00:22:00,2022-03-08 00:22:00,Kali,0.06,0,4456455,CKB +Hazel,Kali,2022-03-08 00:22:00,2022-03-08 00:44:00,Celine,11139,10,4456455,CKB +Hazel,Celine,2022-03-08 00:54:00,2022-03-08 01:18:00,Kali,11.86,4,4456455,CKB +Hazel,Kali,2022-03-08 01:22:00,2022-03-08 01:44:00,Celine,11139,10,4456455,CKB +Hazel,Celine,2022-03-08 01:54:00,2022-03-08 02:18:00,Kali,11.86,4,4456455,CKB +Hazel,Kali,2022-03-08 02:22:00,2022-03-08 02:44:00,Celine,11139,10,4456455,CKB +Hazel,Celine,2022-03-08 02:54:00,2022-03-08 03:18:00,Kali,11.86,4,4456455,CKB +Hazel,Kali,2022-03-08 03:22:00,2022-03-08 03:44:00,Celine,11139,10,4456455,CKB +Hazel,Celine,2022-03-08 03:54:00,2022-03-08 04:18:00,Kali,11.86,4,4456455,CKB +Hazel,Kali,2022-03-08 04:22:00,2022-03-08 04:44:00,Celine,11139,0,4456455,CKB +Hazel,Celine,2022-03-08 04:44:00,2022-03-08 04:44:00,Beckham,0.06,0,4456455,CKB +Emilio,Beckham,2022-03-08 00:32:00,2022-03-08 00:32:00,Rose,0.06,0,4747649,CKB +Emilio,Rose,2022-03-08 00:32:00,2022-03-08 00:44:00,Brooklynn,4212,3,4747649,CKB +Emilio,Brooklynn,2022-03-08 00:47:00,2022-03-08 01:16:00,Francis,13048,0,4747649,CKB +Emilio,Francis,2022-03-08 01:16:00,2022-03-08 01:42:00,Brooklynn,12869,5,4747649,CKB +Emilio,Brooklynn,2022-03-08 01:47:00,2022-03-08 02:16:00,Francis,13048,0,4747649,CKB +Emilio,Francis,2022-03-08 02:16:00,2022-03-08 02:42:00,Brooklynn,12869,5,4747649,CKB +Emilio,Brooklynn,2022-03-08 02:47:00,2022-03-08 03:16:00,Francis,13048,0,4747649,CKB +Emilio,Francis,2022-03-08 03:16:00,2022-03-08 03:42:00,Brooklynn,12869,5,4747649,CKB +Emilio,Brooklynn,2022-03-08 03:47:00,2022-03-08 04:16:00,Francis,13048,0,4747649,CKB +Emilio,Francis,2022-03-08 04:16:00,2022-03-08 04:34:00,Gia,9538,0,4747649,CKB +Emilio,Gia,2022-03-08 04:34:00,2022-03-08 04:34:00,Beckham,0.06,0,4747649,CKB +Emilio,Beckham,2022-03-08 00:17:00,2022-03-08 00:17:00,Brooklynn,0.06,0,4747659,CKB +Emilio,Brooklynn,2022-03-08 00:17:00,2022-03-08 00:46:00,Francis,13048,0,4747659,CKB +Emilio,Francis,2022-03-08 00:46:00,2022-03-08 01:12:00,Brooklynn,12869,5,4747659,CKB +Emilio,Brooklynn,2022-03-08 01:17:00,2022-03-08 01:46:00,Francis,13048,0,4747659,CKB +Emilio,Francis,2022-03-08 01:46:00,2022-03-08 02:12:00,Brooklynn,12869,5,4747659,CKB +Emilio,Brooklynn,2022-03-08 02:17:00,2022-03-08 02:46:00,Francis,13048,0,4747659,CKB +Emilio,Francis,2022-03-08 02:46:00,2022-03-08 03:12:00,Brooklynn,12869,5,4747659,CKB +Emilio,Brooklynn,2022-03-08 03:17:00,2022-03-08 03:46:00,Francis,13048,0,4747659,CKB +Emilio,Francis,2022-03-08 03:46:00,2022-03-08 04:12:00,Brooklynn,12869,5,4747659,CKB +Emilio,Brooklynn,2022-03-08 04:17:00,2022-03-08 04:28:00,Rose,4316,0,4747659,CKB +Emilio,Rose,2022-03-08 04:28:00,2022-03-08 04:28:00,Beckham,0.06,0,4747659,CKB +Ryder,Beckham,2022-03-08 00:49:00,2022-03-08 00:49:00,Kehlani,0.06,0,4434340,CKB +Ryder,Kehlani,2022-03-08 00:49:00,2022-03-08 01:04:00,Ariyah,10229,0,4434340,CKB +Ryder,Ariyah,2022-03-08 01:04:00,2022-03-08 01:19:00,Kehlani,11801,0,4434340,CKB +Ryder,Kehlani,2022-03-08 01:19:00,2022-03-08 01:34:00,Ariyah,10229,0,4434340,CKB +Ryder,Ariyah,2022-03-08 01:34:00,2022-03-08 01:49:00,Kehlani,11801,0,4434340,CKB +Ryder,Kehlani,2022-03-08 01:49:00,2022-03-08 02:04:00,Ariyah,10229,0,4434340,CKB +Ryder,Ariyah,2022-03-08 02:04:00,2022-03-08 02:19:00,Kehlani,11801,0,4434340,CKB +Ryder,Kehlani,2022-03-08 02:19:00,2022-03-08 02:34:00,Ariyah,10229,0,4434340,CKB +Ryder,Ariyah,2022-03-08 02:34:00,2022-03-08 02:49:00,Kehlani,11801,0,4434340,CKB +Ryder,Kehlani,2022-03-08 02:49:00,2022-03-08 03:04:00,Ariyah,10229,0,4434340,CKB +Ryder,Ariyah,2022-03-08 03:04:00,2022-03-08 03:19:00,Kehlani,11801,0,4434340,CKB +Ryder,Kehlani,2022-03-08 03:19:00,2022-03-08 03:34:00,Ariyah,10229,0,4434340,CKB +Ryder,Ariyah,2022-03-08 03:34:00,2022-03-08 03:49:00,Kehlani,11801,0,4434340,CKB +Ryder,Kehlani,2022-03-08 03:49:00,2022-03-08 04:04:00,Ariyah,10229,0,4434340,CKB +Ryder,Ariyah,2022-03-08 04:04:00,2022-03-08 04:19:00,Kehlani,11801,23,4434340,CKB +Kian,Kehlani,2022-03-08 04:42:00,2022-03-08 05:04:00,Finley,6.81,0,4434340,CKB +Kian,Finley,2022-03-08 05:04:00,2022-03-08 05:04:00,Beckham,0.06,0,4434340,CKB +Jake,Beckham,2022-03-08 00:32:00,2022-03-08 00:32:00,Rose,0.06,0,4434896,CKB +Jake,Rose,2022-03-08 00:32:00,2022-03-08 00:57:00,Kamila,11545,6,4434896,CKB +Jake,Kamila,2022-03-08 01:03:00,2022-03-08 01:46:00,Kayleigh,20579,1,4434896,CKB +Jake,Kayleigh,2022-03-08 01:47:00,2022-03-08 02:25:00,Kamila,20641,8,4434896,CKB +Jake,Kamila,2022-03-08 02:33:00,2022-03-08 03:16:00,Kayleigh,20579,1,4434896,CKB +Jake,Kayleigh,2022-03-08 03:17:00,2022-03-08 03:55:00,Kamila,20641,8,4434896,CKB +Jake,Kamila,2022-03-08 04:03:00,2022-03-08 04:28:00,Rose,11499,0,4434896,CKB +Jake,Rose,2022-03-08 04:28:00,2022-03-08 04:28:00,Beckham,0.06,0,4434896,CKB +Jake,Beckham,2022-03-08 00:33:00,2022-03-08 00:33:00,Kamila,0.06,0,4434901,CKB +Jake,Kamila,2022-03-08 00:33:00,2022-03-08 01:16:00,Kayleigh,20579,1,4434901,CKB +Jake,Kayleigh,2022-03-08 01:17:00,2022-03-08 01:55:00,Kamila,20641,8,4434901,CKB +Jake,Kamila,2022-03-08 02:03:00,2022-03-08 02:46:00,Kayleigh,20579,1,4434901,CKB +Jake,Kayleigh,2022-03-08 02:47:00,2022-03-08 03:25:00,Kamila,20641,8,4434901,CKB +Jake,Kamila,2022-03-08 03:33:00,2022-03-08 04:16:00,Kayleigh,20579,1,4434901,CKB +Jake,Kayleigh,2022-03-08 04:17:00,2022-03-08 04:51:00,Willa,18752,0,4434901,CKB +Jake,Willa,2022-03-08 04:51:00,2022-03-08 04:51:00,Beckham,0.06,0,4434901,CKB +Aziel,Beckham,2022-03-08 00:34:00,2022-03-08 00:34:00,Miles,0.06,0,4619765,CKB +Aziel,Miles,2022-03-08 00:34:00,2022-03-08 01:00:00,Delilah,9016,0,4619765,CKB +Aziel,Delilah,2022-03-08 01:00:00,2022-03-08 01:27:00,Miles,10083,7,4619765,CKB +Aziel,Miles,2022-03-08 01:34:00,2022-03-08 02:00:00,Delilah,9016,0,4619765,CKB +Aziel,Delilah,2022-03-08 02:00:00,2022-03-08 02:27:00,Miles,10083,7,4619765,CKB +Aziel,Miles,2022-03-08 02:34:00,2022-03-08 03:00:00,Delilah,9016,0,4619765,CKB +Aziel,Delilah,2022-03-08 03:00:00,2022-03-08 03:27:00,Miles,10083,7,4619765,CKB +Aziel,Miles,2022-03-08 03:34:00,2022-03-08 04:00:00,Delilah,9016,0,4619765,CKB +Aziel,Delilah,2022-03-08 04:00:00,2022-03-08 04:27:00,Miles,10083,0,4619765,CKB +Aziel,Miles,2022-03-08 04:27:00,2022-03-08 04:27:00,Beckham,0.06,0,4619765,CKB +Aziel,Beckham,2022-03-08 00:30:00,2022-03-08 00:30:00,Delilah,0.06,0,4619990,CKB +Aziel,Delilah,2022-03-08 00:30:00,2022-03-08 00:57:00,Miles,10083,7,4619990,CKB +Aziel,Miles,2022-03-08 01:04:00,2022-03-08 01:30:00,Delilah,9016,0,4619990,CKB +Aziel,Delilah,2022-03-08 01:30:00,2022-03-08 01:57:00,Miles,10083,7,4619990,CKB +Aziel,Miles,2022-03-08 02:04:00,2022-03-08 02:30:00,Delilah,9016,0,4619990,CKB +Aziel,Delilah,2022-03-08 02:30:00,2022-03-08 02:57:00,Miles,10083,7,4619990,CKB +Aziel,Miles,2022-03-08 03:04:00,2022-03-08 03:30:00,Delilah,9016,0,4619990,CKB +Aziel,Delilah,2022-03-08 03:30:00,2022-03-08 03:57:00,Miles,10083,7,4619990,CKB +Aziel,Miles,2022-03-08 04:04:00,2022-03-08 04:30:00,Delilah,9016,0,4619990,CKB +Aziel,Delilah,2022-03-08 04:30:00,2022-03-08 04:57:00,Miles,10083,0,4619990,CKB +Aziel,Miles,2022-03-08 04:57:00,2022-03-08 04:57:00,Beckham,0.06,0,4619990,CKB +Dalton,Beckham,2022-03-08 00:31:00,2022-03-08 00:31:00,Kamila,0.06,0,4374743,CKB +Dalton,Kamila,2022-03-08 00:31:00,2022-03-08 00:44:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 00:44:00,2022-03-08 00:56:00,Kamila,5362,5,4374743,CKB +Dalton,Kamila,2022-03-08 01:01:00,2022-03-08 01:14:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 01:14:00,2022-03-08 01:26:00,Kamila,5362,5,4374743,CKB +Dalton,Kamila,2022-03-08 01:31:00,2022-03-08 01:44:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 01:44:00,2022-03-08 01:56:00,Kamila,5362,5,4374743,CKB +Dalton,Kamila,2022-03-08 02:01:00,2022-03-08 02:14:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 02:14:00,2022-03-08 02:26:00,Kamila,5362,5,4374743,CKB +Dalton,Kamila,2022-03-08 02:31:00,2022-03-08 02:44:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 02:44:00,2022-03-08 02:56:00,Kamila,5362,5,4374743,CKB +Dalton,Kamila,2022-03-08 03:01:00,2022-03-08 03:14:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 03:14:00,2022-03-08 03:26:00,Kamila,5362,5,4374743,CKB +Dalton,Kamila,2022-03-08 03:31:00,2022-03-08 03:44:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 03:44:00,2022-03-08 03:56:00,Kamila,5362,5,4374743,CKB +Dalton,Kamila,2022-03-08 04:01:00,2022-03-08 04:14:00,Veronica,4872,0,4374743,CKB +Dalton,Veronica,2022-03-08 04:14:00,2022-03-08 04:26:00,Kamila,5362,0,4374743,CKB +Dalton,Kamila,2022-03-08 04:26:00,2022-03-08 04:26:00,Beckham,0.06,0,4374743,CKB +Jamison,Beckham,2022-03-08 00:31:00,2022-03-08 00:31:00,Kamila,0.06,0,4374865,CKB +Jamison,Kamila,2022-03-08 00:31:00,2022-03-08 00:45:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 00:47:00,2022-03-08 01:01:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 01:01:00,2022-03-08 01:15:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 01:17:00,2022-03-08 01:31:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 01:31:00,2022-03-08 01:45:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 01:47:00,2022-03-08 02:01:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 02:01:00,2022-03-08 02:15:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 02:17:00,2022-03-08 02:31:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 02:31:00,2022-03-08 02:45:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 02:47:00,2022-03-08 03:01:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 03:01:00,2022-03-08 03:15:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 03:17:00,2022-03-08 03:31:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 03:31:00,2022-03-08 03:45:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 03:47:00,2022-03-08 04:01:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 04:01:00,2022-03-08 04:15:00,Liana,5225,2,4374865,CKB +Jamison,Liana,2022-03-08 04:17:00,2022-03-08 04:31:00,Kamila,7617,0,4374865,CKB +Jamison,Kamila,2022-03-08 04:31:00,2022-03-08 04:31:00,Beckham,0.06,0,4374865,CKB +Keegan,Beckham,2022-03-08 00:43:00,2022-03-08 00:43:00,Charleigh,0.06,0,4375012,CKB +Keegan,Charleigh,2022-03-08 00:43:00,2022-03-08 00:53:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 00:53:00,2022-03-08 01:03:00,Charleigh,4408,10,4375012,CKB +Keegan,Charleigh,2022-03-08 01:13:00,2022-03-08 01:23:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 01:23:00,2022-03-08 01:33:00,Charleigh,4408,10,4375012,CKB +Keegan,Charleigh,2022-03-08 01:43:00,2022-03-08 01:53:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 01:53:00,2022-03-08 02:03:00,Charleigh,4408,10,4375012,CKB +Keegan,Charleigh,2022-03-08 02:13:00,2022-03-08 02:23:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 02:23:00,2022-03-08 02:33:00,Charleigh,4408,10,4375012,CKB +Keegan,Charleigh,2022-03-08 02:43:00,2022-03-08 02:53:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 02:53:00,2022-03-08 03:03:00,Charleigh,4408,10,4375012,CKB +Keegan,Charleigh,2022-03-08 03:13:00,2022-03-08 03:23:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 03:23:00,2022-03-08 03:33:00,Charleigh,4408,10,4375012,CKB +Keegan,Charleigh,2022-03-08 03:43:00,2022-03-08 03:53:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 03:53:00,2022-03-08 04:03:00,Charleigh,4408,10,4375012,CKB +Keegan,Charleigh,2022-03-08 04:13:00,2022-03-08 04:23:00,Eli,4507,0,4375012,CKB +Keegan,Eli,2022-03-08 04:23:00,2022-03-08 04:33:00,Charleigh,4408,0,4375012,CKB +Keegan,Charleigh,2022-03-08 04:33:00,2022-03-08 04:33:00,Beckham,0.06,0,4375012,CKB +Ryder,Beckham,2022-03-07 00:49:00,2022-03-07 00:49:00,Kehlani,0.06,0,4434215,CKB +Ryder,Kehlani,2022-03-07 00:49:00,2022-03-07 01:04:00,Ariyah,10229,0,4434215,CKB +Ryder,Ariyah,2022-03-07 01:04:00,2022-03-07 01:19:00,Kehlani,11801,0,4434215,CKB +Ryder,Kehlani,2022-03-07 01:19:00,2022-03-07 01:34:00,Ariyah,10229,0,4434215,CKB +Ryder,Ariyah,2022-03-07 01:34:00,2022-03-07 01:49:00,Kehlani,11801,0,4434215,CKB +Ryder,Kehlani,2022-03-07 01:49:00,2022-03-07 02:04:00,Ariyah,10229,0,4434215,CKB +Ryder,Ariyah,2022-03-07 02:04:00,2022-03-07 02:19:00,Kehlani,11801,0,4434215,CKB +Ryder,Kehlani,2022-03-07 02:19:00,2022-03-07 02:34:00,Ariyah,10229,0,4434215,CKB +Ryder,Ariyah,2022-03-07 02:34:00,2022-03-07 02:49:00,Kehlani,11801,0,4434215,CKB +Ryder,Kehlani,2022-03-07 02:49:00,2022-03-07 03:04:00,Ariyah,10229,0,4434215,CKB +Ryder,Ariyah,2022-03-07 03:04:00,2022-03-07 03:19:00,Kehlani,11801,0,4434215,CKB +Ryder,Kehlani,2022-03-07 03:19:00,2022-03-07 03:34:00,Ariyah,10229,0,4434215,CKB +Ryder,Ariyah,2022-03-07 03:34:00,2022-03-07 03:49:00,Kehlani,11801,0,4434215,CKB +Ryder,Kehlani,2022-03-07 03:49:00,2022-03-07 04:04:00,Ariyah,10229,0,4434215,CKB +Ryder,Ariyah,2022-03-07 04:04:00,2022-03-07 04:19:00,Kehlani,11801,23,4434215,CKB +Kian,Kehlani,2022-03-07 04:42:00,2022-03-07 05:04:00,Finley,6.81,0,4434215,CKB +Kian,Finley,2022-03-07 05:04:00,2022-03-07 05:04:00,Beckham,0.06,0,4434215,CKB +Matthias,Beckham,2022-03-07 00:23:00,2022-03-07 00:23:00,Addilyn,0.06,0,4318071,CKB +Matthias,Addilyn,2022-03-07 00:23:00,2022-03-07 00:30:00,Ari,2577,9,4318071,CKB +Ruby,Ari,2022-03-07 00:39:00,2022-03-07 00:54:00,Kobe,5937,9,4318071,CKB +Ruby,Kobe,2022-03-07 01:03:00,2022-03-07 01:17:00,Ari,6.19,0,4318071,CKB +Matthias,Ari,2022-03-07 01:17:00,2022-03-07 01:23:00,Addilyn,2555,0,4318071,CKB +Matthias,Addilyn,2022-03-07 01:23:00,2022-03-07 01:30:00,Ari,2577,9,4318071,CKB +Ruby,Ari,2022-03-07 01:39:00,2022-03-07 01:54:00,Kobe,5937,9,4318071,CKB +Ruby,Kobe,2022-03-07 02:03:00,2022-03-07 02:17:00,Ari,6.19,0,4318071,CKB +Matthias,Ari,2022-03-07 02:17:00,2022-03-07 02:23:00,Addilyn,2555,0,4318071,CKB +Matthias,Addilyn,2022-03-07 02:23:00,2022-03-07 02:30:00,Ari,2577,9,4318071,CKB +Ruby,Ari,2022-03-07 02:39:00,2022-03-07 02:54:00,Kobe,5937,9,4318071,CKB +Ruby,Kobe,2022-03-07 03:03:00,2022-03-07 03:17:00,Ari,6.19,0,4318071,CKB +Matthias,Ari,2022-03-07 03:17:00,2022-03-07 03:23:00,Addilyn,2555,0,4318071,CKB +Matthias,Addilyn,2022-03-07 03:23:00,2022-03-07 03:30:00,Ari,2577,9,4318071,CKB +Ruby,Ari,2022-03-07 03:39:00,2022-03-07 03:54:00,Kobe,5937,9,4318071,CKB +Ruby,Kobe,2022-03-07 04:03:00,2022-03-07 04:17:00,Ari,6.19,0,4318071,CKB +Matthias,Ari,2022-03-07 04:17:00,2022-03-07 04:23:00,Addilyn,2555,0,4318071,CKB +Matthias,Addilyn,2022-03-07 04:23:00,2022-03-07 04:23:00,Beckham,0.06,0,4318071,CKB +Ruby,Beckham,2022-03-07 00:33:00,2022-03-07 00:33:00,Kobe,0.06,0,4318083,CKB +Ruby,Kobe,2022-03-07 00:33:00,2022-03-07 00:47:00,Ari,6.19,0,4318083,CKB +Matthias,Ari,2022-03-07 00:47:00,2022-03-07 00:53:00,Addilyn,2555,0,4318083,CKB +Matthias,Addilyn,2022-03-07 00:53:00,2022-03-07 01:00:00,Ari,2577,9,4318083,CKB +Ruby,Ari,2022-03-07 01:09:00,2022-03-07 01:24:00,Kobe,5937,9,4318083,CKB +Ruby,Kobe,2022-03-07 01:33:00,2022-03-07 01:47:00,Ari,6.19,0,4318083,CKB +Matthias,Ari,2022-03-07 01:47:00,2022-03-07 01:53:00,Addilyn,2555,0,4318083,CKB +Matthias,Addilyn,2022-03-07 01:53:00,2022-03-07 02:00:00,Ari,2577,9,4318083,CKB +Ruby,Ari,2022-03-07 02:09:00,2022-03-07 02:24:00,Kobe,5937,9,4318083,CKB +Ruby,Kobe,2022-03-07 02:33:00,2022-03-07 02:47:00,Ari,6.19,0,4318083,CKB +Matthias,Ari,2022-03-07 02:47:00,2022-03-07 02:53:00,Addilyn,2555,0,4318083,CKB +Matthias,Addilyn,2022-03-07 02:53:00,2022-03-07 03:00:00,Ari,2577,9,4318083,CKB +Ruby,Ari,2022-03-07 03:09:00,2022-03-07 03:24:00,Kobe,5937,9,4318083,CKB +Ruby,Kobe,2022-03-07 03:33:00,2022-03-07 03:47:00,Ari,6.19,0,4318083,CKB +Matthias,Ari,2022-03-07 03:47:00,2022-03-07 03:53:00,Addilyn,2555,0,4318083,CKB +Matthias,Addilyn,2022-03-07 03:53:00,2022-03-07 04:00:00,Ari,2577,9,4318083,CKB +Ruby,Ari,2022-03-07 04:09:00,2022-03-07 04:24:00,Kobe,5937,0,4318083,CKB +Ruby,Kobe,2022-03-07 04:24:00,2022-03-07 04:24:00,Beckham,0.06,0,4318083,CKB +Rosie,Beckham,2022-03-07 00:57:00,2022-03-07 00:57:00,Lexi,0.06,0,4319428,CKB +Rosie,Lexi,2022-03-07 00:57:00,2022-03-07 01:06:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 01:06:00,2022-03-07 01:11:00,Lexi,2936,16,4319428,CKB +Rosie,Lexi,2022-03-07 01:27:00,2022-03-07 01:36:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 01:36:00,2022-03-07 01:41:00,Lexi,2936,16,4319428,CKB +Rosie,Lexi,2022-03-07 01:57:00,2022-03-07 02:06:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 02:06:00,2022-03-07 02:11:00,Lexi,2936,16,4319428,CKB +Rosie,Lexi,2022-03-07 02:27:00,2022-03-07 02:36:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 02:36:00,2022-03-07 02:41:00,Lexi,2936,16,4319428,CKB +Rosie,Lexi,2022-03-07 02:57:00,2022-03-07 03:06:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 03:06:00,2022-03-07 03:11:00,Lexi,2936,16,4319428,CKB +Rosie,Lexi,2022-03-07 03:27:00,2022-03-07 03:36:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 03:36:00,2022-03-07 03:41:00,Lexi,2936,16,4319428,CKB +Rosie,Lexi,2022-03-07 03:57:00,2022-03-07 04:06:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 04:06:00,2022-03-07 04:11:00,Lexi,2936,16,4319428,CKB +Rosie,Lexi,2022-03-07 04:27:00,2022-03-07 04:36:00,Colton,4343,0,4319428,CKB +Rosie,Colton,2022-03-07 04:36:00,2022-03-07 04:36:00,Beckham,0.06,0,4319428,CKB +Daxton,Beckham,2022-03-07 00:29:00,2022-03-07 00:29:00,Harper,0.06,0,4751093,CKB +Daxton,Harper,2022-03-07 00:29:00,2022-03-07 00:41:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 00:47:00,2022-03-07 00:57:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 00:59:00,2022-03-07 01:11:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 01:17:00,2022-03-07 01:27:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 01:29:00,2022-03-07 01:41:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 01:47:00,2022-03-07 01:57:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 01:59:00,2022-03-07 02:11:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 02:17:00,2022-03-07 02:27:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 02:29:00,2022-03-07 02:41:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 02:47:00,2022-03-07 02:57:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 02:59:00,2022-03-07 03:11:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 03:17:00,2022-03-07 03:27:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 03:29:00,2022-03-07 03:41:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 03:47:00,2022-03-07 03:57:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 03:59:00,2022-03-07 04:11:00,Calvin,4481,6,4751093,CKB +Daxton,Calvin,2022-03-07 04:17:00,2022-03-07 04:27:00,Harper,4031,2,4751093,CKB +Daxton,Harper,2022-03-07 04:29:00,2022-03-07 04:41:00,Calvin,4481,0,4751093,CKB +Daxton,Calvin,2022-03-07 04:41:00,2022-03-07 04:41:00,Beckham,0.06,0,4751093,CKB +Andy,Beckham,2022-03-07 00:30:00,2022-03-07 00:30:00,Harper,0.06,0,4454017,CKB +Andy,Harper,2022-03-07 00:30:00,2022-03-07 00:44:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 00:44:00,2022-03-07 00:57:00,Harper,5302,3,4454017,CKB +Andy,Harper,2022-03-07 01:00:00,2022-03-07 01:14:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 01:14:00,2022-03-07 01:27:00,Harper,5302,3,4454017,CKB +Andy,Harper,2022-03-07 01:30:00,2022-03-07 01:44:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 01:44:00,2022-03-07 01:57:00,Harper,5302,3,4454017,CKB +Andy,Harper,2022-03-07 02:00:00,2022-03-07 02:14:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 02:14:00,2022-03-07 02:27:00,Harper,5302,3,4454017,CKB +Andy,Harper,2022-03-07 02:30:00,2022-03-07 02:44:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 02:44:00,2022-03-07 02:57:00,Harper,5302,3,4454017,CKB +Andy,Harper,2022-03-07 03:00:00,2022-03-07 03:14:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 03:14:00,2022-03-07 03:27:00,Harper,5302,3,4454017,CKB +Andy,Harper,2022-03-07 03:30:00,2022-03-07 03:44:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 03:44:00,2022-03-07 03:57:00,Harper,5302,3,4454017,CKB +Andy,Harper,2022-03-07 04:00:00,2022-03-07 04:14:00,Elise,4801,0,4454017,CKB +Andy,Elise,2022-03-07 04:14:00,2022-03-07 04:27:00,Harper,5302,0,4454017,CKB +Andy,Harper,2022-03-07 04:27:00,2022-03-07 04:27:00,Beckham,0.06,0,4454017,CKB +Alex,Beckham,2022-03-07 00:43:00,2022-03-07 00:43:00,Chase,0.06,0,4374470,CKB +Alex,Chase,2022-03-07 00:43:00,2022-03-07 01:33:00,Chase,20434,10,4374470,CKB +Alex,Chase,2022-03-07 01:43:00,2022-03-07 02:33:00,Chase,20434,10,4374470,CKB +Alex,Chase,2022-03-07 02:43:00,2022-03-07 03:33:00,Chase,20434,10,4374470,CKB +Alex,Chase,2022-03-07 03:43:00,2022-03-07 04:33:00,Chase,20434,0,4374470,CKB +Alex,Chase,2022-03-07 04:33:00,2022-03-07 04:33:00,Beckham,0.06,0,4374470,CKB +Alex,Beckham,2022-03-07 00:13:00,2022-03-07 00:13:00,Chase,0.06,0,4374475,CKB +Alex,Chase,2022-03-07 00:13:00,2022-03-07 01:03:00,Chase,20434,10,4374475,CKB +Alex,Chase,2022-03-07 01:13:00,2022-03-07 02:03:00,Chase,20434,10,4374475,CKB +Alex,Chase,2022-03-07 02:13:00,2022-03-07 03:03:00,Chase,20434,10,4374475,CKB +Alex,Chase,2022-03-07 03:13:00,2022-03-07 04:03:00,Chase,20434,0,4374475,CKB +Alex,Chase,2022-03-07 04:03:00,2022-03-07 04:03:00,Beckham,0.06,0,4374475,CKB +Hazel,Beckham,2022-03-07 00:24:00,2022-03-07 00:24:00,Celine,0.06,0,4456537,CKB +Hazel,Celine,2022-03-07 00:24:00,2022-03-07 00:48:00,Kali,11.86,4,4456537,CKB +Hazel,Kali,2022-03-07 00:52:00,2022-03-07 01:14:00,Celine,11139,10,4456537,CKB +Hazel,Celine,2022-03-07 01:24:00,2022-03-07 01:48:00,Kali,11.86,4,4456537,CKB +Hazel,Kali,2022-03-07 01:52:00,2022-03-07 02:14:00,Celine,11139,10,4456537,CKB +Hazel,Celine,2022-03-07 02:24:00,2022-03-07 02:48:00,Kali,11.86,4,4456537,CKB +Hazel,Kali,2022-03-07 02:52:00,2022-03-07 03:14:00,Celine,11139,10,4456537,CKB +Hazel,Celine,2022-03-07 03:24:00,2022-03-07 03:48:00,Kali,11.86,4,4456537,CKB +Hazel,Kali,2022-03-07 03:52:00,2022-03-07 04:14:00,Celine,11139,0,4456537,CKB +Hazel,Celine,2022-03-07 04:14:00,2022-03-07 04:14:00,Beckham,0.06,0,4456537,CKB +Hazel,Beckham,2022-03-07 00:22:00,2022-03-07 00:22:00,Kali,0.06,0,4456538,CKB +Hazel,Kali,2022-03-07 00:22:00,2022-03-07 00:44:00,Celine,11139,10,4456538,CKB +Hazel,Celine,2022-03-07 00:54:00,2022-03-07 01:18:00,Kali,11.86,4,4456538,CKB +Hazel,Kali,2022-03-07 01:22:00,2022-03-07 01:44:00,Celine,11139,10,4456538,CKB +Hazel,Celine,2022-03-07 01:54:00,2022-03-07 02:18:00,Kali,11.86,4,4456538,CKB +Hazel,Kali,2022-03-07 02:22:00,2022-03-07 02:44:00,Celine,11139,10,4456538,CKB +Hazel,Celine,2022-03-07 02:54:00,2022-03-07 03:18:00,Kali,11.86,4,4456538,CKB +Hazel,Kali,2022-03-07 03:22:00,2022-03-07 03:44:00,Celine,11139,10,4456538,CKB +Hazel,Celine,2022-03-07 03:54:00,2022-03-07 04:18:00,Kali,11.86,4,4456538,CKB +Hazel,Kali,2022-03-07 04:22:00,2022-03-07 04:44:00,Celine,11139,0,4456538,CKB +Hazel,Celine,2022-03-07 04:44:00,2022-03-07 04:44:00,Beckham,0.06,0,4456538,CKB +Ayaan,Beckham,2022-03-13 20:51:00,2022-03-13 20:51:00,Kalani,0.06,0,4454973,CKB +Ayaan,Kalani,2022-03-13 20:51:00,2022-03-13 21:24:00,Brian,14519,4,4454973,CKB +Ayaan,Brian,2022-03-13 21:28:00,2022-03-13 22:03:00,Kalani,13541,8,4454973,CKB +Ayaan,Kalani,2022-03-13 22:11:00,2022-03-13 22:44:00,Brian,14519,4,4454973,CKB +Ayaan,Brian,2022-03-13 22:48:00,2022-03-13 23:23:00,Kalani,13541,8,4454973,CKB +Ayaan,Kalani,2022-03-13 23:31:00,2022-03-14 00:04:00,Brian,14519,4,4454973,CKB +Ayaan,Brian,2022-03-14 00:08:00,2022-03-14 00:39:00,Leonel,12213,0,4454973,CKB +Hunter,Leonel,2022-03-14 00:39:00,2022-03-14 00:47:00,Kehlani,4.0,2,4454973,CKB +Hunter,Kehlani,2022-03-14 00:49:00,2022-03-14 01:12:00,Ayden,8.36,6,4454973,CKB +Hunter,Ayden,2022-03-14 01:18:00,2022-03-14 01:36:00,Kehlani,9067,13,4454973,CKB +Hunter,Kehlani,2022-03-14 01:49:00,2022-03-14 02:12:00,Ayden,8.36,6,4454973,CKB +Hunter,Ayden,2022-03-14 02:18:00,2022-03-14 02:36:00,Kehlani,9067,13,4454973,CKB +Hunter,Kehlani,2022-03-14 02:49:00,2022-03-14 03:12:00,Ayden,8.36,6,4454973,CKB +Hunter,Ayden,2022-03-14 03:18:00,2022-03-14 03:36:00,Kehlani,9067,13,4454973,CKB +Hunter,Kehlani,2022-03-14 03:49:00,2022-03-14 04:12:00,Ayden,8.36,0,4454973,CKB +Hunter,Ayden,2022-03-14 04:12:00,2022-03-14 04:12:00,Beckham,0.06,0,4454973,CKB +Ayaan,Beckham,2022-03-13 21:31:00,2022-03-13 21:31:00,Kalani,0.06,0,4454974,CKB +Ayaan,Kalani,2022-03-13 21:31:00,2022-03-13 22:04:00,Brian,14519,4,4454974,CKB +Ayaan,Brian,2022-03-13 22:08:00,2022-03-13 22:43:00,Kalani,13541,8,4454974,CKB +Ayaan,Kalani,2022-03-13 22:51:00,2022-03-13 23:24:00,Brian,14519,4,4454974,CKB +Ayaan,Brian,2022-03-13 23:28:00,2022-03-14 00:03:00,Kalani,13541,8,4454974,CKB +Ayaan,Kalani,2022-03-14 00:11:00,2022-03-14 00:44:00,Brian,14519,0,4454974,CKB +Hunter,Brian,2022-03-14 00:44:00,2022-03-14 00:54:00,Kehlani,4.1,25,4454974,CKB +Hunter,Kehlani,2022-03-14 01:19:00,2022-03-14 01:42:00,Ayden,8.36,6,4454974,CKB +Hunter,Ayden,2022-03-14 01:48:00,2022-03-14 02:06:00,Kehlani,9067,13,4454974,CKB +Hunter,Kehlani,2022-03-14 02:19:00,2022-03-14 02:42:00,Ayden,8.36,6,4454974,CKB +Hunter,Ayden,2022-03-14 02:48:00,2022-03-14 03:06:00,Kehlani,9067,13,4454974,CKB +Hunter,Kehlani,2022-03-14 03:19:00,2022-03-14 03:42:00,Ayden,8.36,6,4454974,CKB +Hunter,Ayden,2022-03-14 03:48:00,2022-03-14 04:06:00,Kehlani,9067,0,4454974,CKB +Hunter,Kehlani,2022-03-14 04:06:00,2022-03-14 04:06:00,Beckham,0.06,0,4454974,CKB +Donovan,Beckham,2022-03-13 21:06:00,2022-03-13 21:06:00,Pierce,0.06,0,4664782,CKB +Donovan,Pierce,2022-03-13 21:06:00,2022-03-13 21:34:00,Leonardo,13018,19,4664782,CKB +Donovan,Leonardo,2022-03-13 21:53:00,2022-03-13 22:13:00,Kamryn,10332,17,4664782,CKB +Donovan,Kamryn,2022-03-13 22:30:00,2022-03-13 22:54:00,Leonardo,10.48,19,4664782,CKB +Donovan,Leonardo,2022-03-13 23:13:00,2022-03-13 23:33:00,Kamryn,10332,17,4664782,CKB +Donovan,Kamryn,2022-03-13 23:50:00,2022-03-14 00:14:00,Leonardo,10.48,2,4664782,CKB +Donovan,Leonardo,2022-03-14 00:16:00,2022-03-14 00:23:00,Melanie,3709,5,4664782,CKB +Zoey,Melanie,2022-03-14 00:28:00,2022-03-14 00:44:00,Brinley,6404,3,4664782,CKB +Zoey,Brinley,2022-03-14 00:47:00,2022-03-14 01:10:00,Finn,10579,7,4664782,CKB +Zoey,Finn,2022-03-14 01:17:00,2022-03-14 01:44:00,Brinley,12007,3,4664782,CKB +Zoey,Brinley,2022-03-14 01:47:00,2022-03-14 02:10:00,Finn,10579,7,4664782,CKB +Zoey,Finn,2022-03-14 02:17:00,2022-03-14 02:44:00,Brinley,12007,3,4664782,CKB +Zoey,Brinley,2022-03-14 02:47:00,2022-03-14 03:10:00,Finn,10579,7,4664782,CKB +Zoey,Finn,2022-03-14 03:17:00,2022-03-14 03:44:00,Brinley,12007,3,4664782,CKB +Zoey,Brinley,2022-03-14 03:47:00,2022-03-14 04:10:00,Finn,10579,7,4664782,CKB +Zoey,Finn,2022-03-14 04:17:00,2022-03-14 04:44:00,Brinley,12007,0,4664782,CKB +Zoey,Brinley,2022-03-14 04:44:00,2022-03-14 04:44:00,Beckham,0.06,0,4664782,CKB +Donovan,Beckham,2022-03-13 20:26:00,2022-03-13 20:26:00,Pierce,0.06,0,4762788,CKB +Donovan,Pierce,2022-03-13 20:26:00,2022-03-13 20:56:00,Ezra,14097,14,4762788,CKB +Donovan,Ezra,2022-03-13 21:10:00,2022-03-13 21:38:00,Pierce,13.19,8,4762788,CKB +Donovan,Pierce,2022-03-13 21:46:00,2022-03-13 22:14:00,Leonardo,13018,19,4762788,CKB +Donovan,Leonardo,2022-03-13 22:33:00,2022-03-13 22:53:00,Kamryn,10332,17,4762788,CKB +Donovan,Kamryn,2022-03-13 23:10:00,2022-03-13 23:34:00,Leonardo,10.48,19,4762788,CKB +Donovan,Leonardo,2022-03-13 23:53:00,2022-03-14 00:13:00,Kamryn,10332,2,4762788,CKB +Donovan,Kamryn,2022-03-14 00:15:00,2022-03-14 00:16:00,Brinley,506,1,4762788,CKB +Zoey,Brinley,2022-03-14 00:17:00,2022-03-14 00:40:00,Finn,10579,7,4762788,CKB +Zoey,Finn,2022-03-14 00:47:00,2022-03-14 01:14:00,Brinley,12007,3,4762788,CKB +Zoey,Brinley,2022-03-14 01:17:00,2022-03-14 01:40:00,Finn,10579,7,4762788,CKB +Zoey,Finn,2022-03-14 01:47:00,2022-03-14 02:14:00,Brinley,12007,3,4762788,CKB +Zoey,Brinley,2022-03-14 02:17:00,2022-03-14 02:40:00,Finn,10579,7,4762788,CKB +Zoey,Finn,2022-03-14 02:47:00,2022-03-14 03:14:00,Brinley,12007,3,4762788,CKB +Zoey,Brinley,2022-03-14 03:17:00,2022-03-14 03:40:00,Finn,10579,7,4762788,CKB +Zoey,Finn,2022-03-14 03:47:00,2022-03-14 04:14:00,Brinley,12007,3,4762788,CKB +Zoey,Brinley,2022-03-14 04:17:00,2022-03-14 04:40:00,Finn,10579,3,4762788,CKB +Jackson,Finn,2022-03-14 04:43:00,2022-03-14 04:58:00,Rose,6161,0,4762788,CKB +Jackson,Rose,2022-03-14 04:58:00,2022-03-14 04:58:00,Beckham,0.06,0,4762788,CKB +Emilio,Beckham,2022-03-07 00:32:00,2022-03-07 00:32:00,Rose,0.06,0,4747688,CKB +Emilio,Rose,2022-03-07 00:32:00,2022-03-07 00:44:00,Brooklynn,4212,3,4747688,CKB +Emilio,Brooklynn,2022-03-07 00:47:00,2022-03-07 01:16:00,Francis,13048,0,4747688,CKB +Emilio,Francis,2022-03-07 01:16:00,2022-03-07 01:42:00,Brooklynn,12869,5,4747688,CKB +Emilio,Brooklynn,2022-03-07 01:47:00,2022-03-07 02:16:00,Francis,13048,0,4747688,CKB +Emilio,Francis,2022-03-07 02:16:00,2022-03-07 02:42:00,Brooklynn,12869,5,4747688,CKB +Emilio,Brooklynn,2022-03-07 02:47:00,2022-03-07 03:16:00,Francis,13048,0,4747688,CKB +Emilio,Francis,2022-03-07 03:16:00,2022-03-07 03:42:00,Brooklynn,12869,5,4747688,CKB +Emilio,Brooklynn,2022-03-07 03:47:00,2022-03-07 04:16:00,Francis,13048,0,4747688,CKB +Emilio,Francis,2022-03-07 04:16:00,2022-03-07 04:34:00,Gia,9538,0,4747688,CKB +Emilio,Gia,2022-03-07 04:34:00,2022-03-07 04:34:00,Beckham,0.06,0,4747688,CKB +Emilio,Beckham,2022-03-07 00:17:00,2022-03-07 00:17:00,Brooklynn,0.06,0,4747699,CKB +Emilio,Brooklynn,2022-03-07 00:17:00,2022-03-07 00:46:00,Francis,13048,0,4747699,CKB +Emilio,Francis,2022-03-07 00:46:00,2022-03-07 01:12:00,Brooklynn,12869,5,4747699,CKB +Emilio,Brooklynn,2022-03-07 01:17:00,2022-03-07 01:46:00,Francis,13048,0,4747699,CKB +Emilio,Francis,2022-03-07 01:46:00,2022-03-07 02:12:00,Brooklynn,12869,5,4747699,CKB +Emilio,Brooklynn,2022-03-07 02:17:00,2022-03-07 02:46:00,Francis,13048,0,4747699,CKB +Emilio,Francis,2022-03-07 02:46:00,2022-03-07 03:12:00,Brooklynn,12869,5,4747699,CKB +Emilio,Brooklynn,2022-03-07 03:17:00,2022-03-07 03:46:00,Francis,13048,0,4747699,CKB +Emilio,Francis,2022-03-07 03:46:00,2022-03-07 04:12:00,Brooklynn,12869,5,4747699,CKB +Emilio,Brooklynn,2022-03-07 04:17:00,2022-03-07 04:28:00,Rose,4316,0,4747699,CKB +Emilio,Rose,2022-03-07 04:28:00,2022-03-07 04:28:00,Beckham,0.06,0,4747699,CKB +Jake,Beckham,2022-03-07 00:32:00,2022-03-07 00:32:00,Rose,0.06,0,4627068,CKB +Jake,Rose,2022-03-07 00:32:00,2022-03-07 00:57:00,Kamila,11545,6,4627068,CKB +Jake,Kamila,2022-03-07 01:03:00,2022-03-07 01:46:00,Kayleigh,20579,1,4627068,CKB +Jake,Kayleigh,2022-03-07 01:47:00,2022-03-07 02:25:00,Kamila,20641,8,4627068,CKB +Jake,Kamila,2022-03-07 02:33:00,2022-03-07 03:16:00,Kayleigh,20579,1,4627068,CKB +Jake,Kayleigh,2022-03-07 03:17:00,2022-03-07 03:55:00,Kamila,20641,8,4627068,CKB +Jake,Kamila,2022-03-07 04:03:00,2022-03-07 04:28:00,Rose,11499,0,4627068,CKB +Jake,Rose,2022-03-07 04:28:00,2022-03-07 04:28:00,Beckham,0.06,0,4627068,CKB +Jake,Beckham,2022-03-07 00:33:00,2022-03-07 00:33:00,Kamila,0.06,0,4627069,CKB +Jake,Kamila,2022-03-07 00:33:00,2022-03-07 01:16:00,Kayleigh,20579,1,4627069,CKB +Jake,Kayleigh,2022-03-07 01:17:00,2022-03-07 01:55:00,Kamila,20641,8,4627069,CKB +Jake,Kamila,2022-03-07 02:03:00,2022-03-07 02:46:00,Kayleigh,20579,1,4627069,CKB +Jake,Kayleigh,2022-03-07 02:47:00,2022-03-07 03:25:00,Kamila,20641,8,4627069,CKB +Jake,Kamila,2022-03-07 03:33:00,2022-03-07 04:16:00,Kayleigh,20579,1,4627069,CKB +Jake,Kayleigh,2022-03-07 04:17:00,2022-03-07 04:51:00,Willa,18752,0,4627069,CKB +Jake,Willa,2022-03-07 04:51:00,2022-03-07 04:51:00,Beckham,0.06,0,4627069,CKB +Ezekiel,Beckham,2022-03-07 00:08:00,2022-03-07 00:08:00,Erik,0.06,0,4710317,CKB +Ezekiel,Erik,2022-03-07 00:08:00,2022-03-07 00:27:00,Memphis,7827,0,4710317,CKB +Jake,Memphis,2022-03-07 00:27:00,2022-03-07 00:48:00,Kayleigh,11079,0,4710317,CKB +Jake,Kayleigh,2022-03-07 00:48:00,2022-03-07 01:25:00,Kamila,20641,8,4710317,CKB +Jake,Kamila,2022-03-07 01:33:00,2022-03-07 02:16:00,Kayleigh,20579,1,4710317,CKB +Jake,Kayleigh,2022-03-07 02:17:00,2022-03-07 02:55:00,Kamila,20641,8,4710317,CKB +Jake,Kamila,2022-03-07 03:03:00,2022-03-07 03:46:00,Kayleigh,20579,1,4710317,CKB +Jake,Kayleigh,2022-03-07 03:47:00,2022-03-07 04:25:00,Kamila,20641,0,4710317,CKB +Jake,Kamila,2022-03-07 04:25:00,2022-03-07 04:25:00,Beckham,0.06,0,4710317,CKB +Aziel,Beckham,2022-03-07 00:30:00,2022-03-07 00:30:00,Delilah,0.06,0,4619816,CKB +Aziel,Delilah,2022-03-07 00:30:00,2022-03-07 00:57:00,Miles,10083,7,4619816,CKB +Aziel,Miles,2022-03-07 01:04:00,2022-03-07 01:30:00,Delilah,9016,0,4619816,CKB +Aziel,Delilah,2022-03-07 01:30:00,2022-03-07 01:57:00,Miles,10083,7,4619816,CKB +Aziel,Miles,2022-03-07 02:04:00,2022-03-07 02:30:00,Delilah,9016,0,4619816,CKB +Aziel,Delilah,2022-03-07 02:30:00,2022-03-07 02:57:00,Miles,10083,7,4619816,CKB +Aziel,Miles,2022-03-07 03:04:00,2022-03-07 03:30:00,Delilah,9016,0,4619816,CKB +Aziel,Delilah,2022-03-07 03:30:00,2022-03-07 03:57:00,Miles,10083,7,4619816,CKB +Aziel,Miles,2022-03-07 04:04:00,2022-03-07 04:30:00,Delilah,9016,0,4619816,CKB +Aziel,Delilah,2022-03-07 04:30:00,2022-03-07 04:57:00,Miles,10083,0,4619816,CKB +Aziel,Miles,2022-03-07 04:57:00,2022-03-07 04:57:00,Beckham,0.06,0,4619816,CKB +Aziel,Beckham,2022-03-07 00:34:00,2022-03-07 00:34:00,Miles,0.06,0,4619817,CKB +Aziel,Miles,2022-03-07 00:34:00,2022-03-07 01:00:00,Delilah,9016,0,4619817,CKB +Aziel,Delilah,2022-03-07 01:00:00,2022-03-07 01:27:00,Miles,10083,7,4619817,CKB +Aziel,Miles,2022-03-07 01:34:00,2022-03-07 02:00:00,Delilah,9016,0,4619817,CKB +Aziel,Delilah,2022-03-07 02:00:00,2022-03-07 02:27:00,Miles,10083,7,4619817,CKB +Aziel,Miles,2022-03-07 02:34:00,2022-03-07 03:00:00,Delilah,9016,0,4619817,CKB +Aziel,Delilah,2022-03-07 03:00:00,2022-03-07 03:27:00,Miles,10083,7,4619817,CKB +Aziel,Miles,2022-03-07 03:34:00,2022-03-07 04:00:00,Delilah,9016,0,4619817,CKB +Aziel,Delilah,2022-03-07 04:00:00,2022-03-07 04:27:00,Miles,10083,0,4619817,CKB +Aziel,Miles,2022-03-07 04:27:00,2022-03-07 04:27:00,Beckham,0.06,0,4619817,CKB +Dalton,Beckham,2022-03-07 00:31:00,2022-03-07 00:31:00,Kamila,0.06,0,4374749,CKB +Dalton,Kamila,2022-03-07 00:31:00,2022-03-07 00:44:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 00:44:00,2022-03-07 00:56:00,Kamila,5362,5,4374749,CKB +Dalton,Kamila,2022-03-07 01:01:00,2022-03-07 01:14:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 01:14:00,2022-03-07 01:26:00,Kamila,5362,5,4374749,CKB +Dalton,Kamila,2022-03-07 01:31:00,2022-03-07 01:44:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 01:44:00,2022-03-07 01:56:00,Kamila,5362,5,4374749,CKB +Dalton,Kamila,2022-03-07 02:01:00,2022-03-07 02:14:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 02:14:00,2022-03-07 02:26:00,Kamila,5362,5,4374749,CKB +Dalton,Kamila,2022-03-07 02:31:00,2022-03-07 02:44:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 02:44:00,2022-03-07 02:56:00,Kamila,5362,5,4374749,CKB +Dalton,Kamila,2022-03-07 03:01:00,2022-03-07 03:14:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 03:14:00,2022-03-07 03:26:00,Kamila,5362,5,4374749,CKB +Dalton,Kamila,2022-03-07 03:31:00,2022-03-07 03:44:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 03:44:00,2022-03-07 03:56:00,Kamila,5362,5,4374749,CKB +Dalton,Kamila,2022-03-07 04:01:00,2022-03-07 04:14:00,Veronica,4872,0,4374749,CKB +Dalton,Veronica,2022-03-07 04:14:00,2022-03-07 04:26:00,Kamila,5362,0,4374749,CKB +Dalton,Kamila,2022-03-07 04:26:00,2022-03-07 04:26:00,Beckham,0.06,0,4374749,CKB +Jamison,Beckham,2022-03-07 00:31:00,2022-03-07 00:31:00,Kamila,0.06,0,4374873,CKB +Jamison,Kamila,2022-03-07 00:31:00,2022-03-07 00:45:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 00:47:00,2022-03-07 01:01:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 01:01:00,2022-03-07 01:15:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 01:17:00,2022-03-07 01:31:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 01:31:00,2022-03-07 01:45:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 01:47:00,2022-03-07 02:01:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 02:01:00,2022-03-07 02:15:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 02:17:00,2022-03-07 02:31:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 02:31:00,2022-03-07 02:45:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 02:47:00,2022-03-07 03:01:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 03:01:00,2022-03-07 03:15:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 03:17:00,2022-03-07 03:31:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 03:31:00,2022-03-07 03:45:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 03:47:00,2022-03-07 04:01:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 04:01:00,2022-03-07 04:15:00,Liana,5225,2,4374873,CKB +Jamison,Liana,2022-03-07 04:17:00,2022-03-07 04:31:00,Kamila,7617,0,4374873,CKB +Jamison,Kamila,2022-03-07 04:31:00,2022-03-07 04:31:00,Beckham,0.06,0,4374873,CKB +Keegan,Beckham,2022-03-07 00:43:00,2022-03-07 00:43:00,Charleigh,0.06,0,4375018,CKB +Keegan,Charleigh,2022-03-07 00:43:00,2022-03-07 00:53:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 00:53:00,2022-03-07 01:03:00,Charleigh,4408,10,4375018,CKB +Keegan,Charleigh,2022-03-07 01:13:00,2022-03-07 01:23:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 01:23:00,2022-03-07 01:33:00,Charleigh,4408,10,4375018,CKB +Keegan,Charleigh,2022-03-07 01:43:00,2022-03-07 01:53:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 01:53:00,2022-03-07 02:03:00,Charleigh,4408,10,4375018,CKB +Keegan,Charleigh,2022-03-07 02:13:00,2022-03-07 02:23:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 02:23:00,2022-03-07 02:33:00,Charleigh,4408,10,4375018,CKB +Keegan,Charleigh,2022-03-07 02:43:00,2022-03-07 02:53:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 02:53:00,2022-03-07 03:03:00,Charleigh,4408,10,4375018,CKB +Keegan,Charleigh,2022-03-07 03:13:00,2022-03-07 03:23:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 03:23:00,2022-03-07 03:33:00,Charleigh,4408,10,4375018,CKB +Keegan,Charleigh,2022-03-07 03:43:00,2022-03-07 03:53:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 03:53:00,2022-03-07 04:03:00,Charleigh,4408,10,4375018,CKB +Keegan,Charleigh,2022-03-07 04:13:00,2022-03-07 04:23:00,Eli,4507,0,4375018,CKB +Keegan,Eli,2022-03-07 04:23:00,2022-03-07 04:33:00,Charleigh,4408,0,4375018,CKB +Keegan,Charleigh,2022-03-07 04:33:00,2022-03-07 04:33:00,Beckham,0.06,0,4375018,CKB +Juan,Beckham,2022-03-13 15:46:00,2022-03-13 15:46:00,Jace,0.06,0,4458713,CKB +Juan,Jace,2022-03-13 15:46:00,2022-03-13 15:53:00,Jaxton,3147,12,4458713,CKB +Juan,Jaxton,2022-03-13 16:05:00,2022-03-13 16:15:00,Jace,3469,0,4458713,CKB +Juan,Jace,2022-03-13 16:15:00,2022-03-13 16:23:00,Jaxton,3351,12,4458713,CKB +Juan,Jaxton,2022-03-13 16:35:00,2022-03-13 16:45:00,Jace,3469,0,4458713,CKB +Juan,Jace,2022-03-13 16:45:00,2022-03-13 16:53:00,Jaxton,3351,12,4458713,CKB +Juan,Jaxton,2022-03-13 17:05:00,2022-03-13 17:15:00,Jace,3469,0,4458713,CKB +Juan,Jace,2022-03-13 17:15:00,2022-03-13 17:23:00,Jaxton,3351,12,4458713,CKB +Juan,Jaxton,2022-03-13 17:35:00,2022-03-13 17:45:00,Jace,3469,0,4458713,CKB +Juan,Jace,2022-03-13 17:45:00,2022-03-13 17:53:00,Jaxton,3351,12,4458713,CKB +Juan,Jaxton,2022-03-13 18:05:00,2022-03-13 18:15:00,Jace,3469,0,4458713,CKB +Juan,Jace,2022-03-13 18:15:00,2022-03-13 18:23:00,Jaxton,3351,0,4458713,CKB +Cruz,Jaxton,2022-03-13 18:23:00,2022-03-13 18:29:00,Jace,3.1,22,4458713,CKB +Cruz,Jace,2022-03-13 18:51:00,2022-03-13 19:02:00,Quinn,4338,0,4458713,CKB +Cruz,Quinn,2022-03-13 19:02:00,2022-03-13 19:13:00,Jace,4427,12,4458713,CKB +Avery,Jace,2022-03-13 19:25:00,2022-03-13 19:38:00,Nathan,6086,3,4458713,CKB +Avery,Nathan,2022-03-13 19:41:00,2022-03-13 19:55:00,Jace,6232,0,4458713,CKB +Avery,Jace,2022-03-13 19:55:00,2022-03-13 20:08:00,Nathan,6086,3,4458713,CKB +Avery,Nathan,2022-03-13 20:11:00,2022-03-13 20:25:00,Jace,6232,6,4458713,CKB +Cruz,Jace,2022-03-13 20:31:00,2022-03-13 20:42:00,Quinn,4338,0,4458713,CKB +Cruz,Quinn,2022-03-13 20:42:00,2022-03-13 20:53:00,Jace,4427,18,4458713,CKB +Cruz,Jace,2022-03-13 21:11:00,2022-03-13 21:22:00,Quinn,4338,0,4458713,CKB +Cruz,Quinn,2022-03-13 21:22:00,2022-03-13 21:33:00,Jace,4427,18,4458713,CKB +Cruz,Jace,2022-03-13 21:51:00,2022-03-13 22:02:00,Quinn,4338,0,4458713,CKB +Cruz,Quinn,2022-03-13 22:02:00,2022-03-13 22:13:00,Jace,4427,18,4458713,CKB +Cruz,Jace,2022-03-13 22:31:00,2022-03-13 22:42:00,Quinn,4338,0,4458713,CKB +Cruz,Quinn,2022-03-13 22:42:00,2022-03-13 22:53:00,Jace,4427,2,4458713,CKB +Avery,Jace,2022-03-13 22:55:00,2022-03-13 23:08:00,Nathan,6086,3,4458713,CKB +Avery,Nathan,2022-03-13 23:11:00,2022-03-13 23:25:00,Jace,6232,0,4458713,CKB +Avery,Jace,2022-03-13 23:25:00,2022-03-13 23:38:00,Nathan,6086,3,4458713,CKB +Avery,Nathan,2022-03-13 23:41:00,2022-03-13 23:55:00,Jace,6232,0,4458713,CKB +Avery,Jace,2022-03-13 23:55:00,2022-03-14 00:08:00,Nathan,6086,0,4458713,CKB +Avery,Nathan,2022-03-14 00:08:00,2022-03-14 00:08:00,Beckham,0.06,0,4458713,CKB +Richard,Beckham,2022-03-13 07:05:00,2022-03-13 07:05:00,Ariyah,0.06,0,4426903,CKB +Richard,Ariyah,2022-03-13 07:05:00,2022-03-13 07:14:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 07:14:00,2022-03-13 07:23:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 07:25:00,2022-03-13 07:34:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 07:34:00,2022-03-13 07:43:00,Ariyah,5139,22,4426903,CKB +Richard,Ariyah,2022-03-13 08:05:00,2022-03-13 08:14:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 08:14:00,2022-03-13 08:23:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 08:25:00,2022-03-13 08:34:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 08:34:00,2022-03-13 08:43:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 08:45:00,2022-03-13 08:54:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 08:54:00,2022-03-13 09:03:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 09:05:00,2022-03-13 09:14:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 09:14:00,2022-03-13 09:23:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 09:25:00,2022-03-13 09:34:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 09:34:00,2022-03-13 09:43:00,Ariyah,5139,23,4426903,CKB +Richard,Ariyah,2022-03-13 10:06:00,2022-03-13 10:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 10:15:00,2022-03-13 10:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 10:26:00,2022-03-13 10:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 10:35:00,2022-03-13 10:44:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 10:46:00,2022-03-13 10:55:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 10:55:00,2022-03-13 11:04:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 11:06:00,2022-03-13 11:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 11:15:00,2022-03-13 11:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 11:26:00,2022-03-13 11:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 11:35:00,2022-03-13 11:44:00,Ariyah,5139,22,4426903,CKB +Richard,Ariyah,2022-03-13 12:06:00,2022-03-13 12:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 12:15:00,2022-03-13 12:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 12:26:00,2022-03-13 12:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 12:35:00,2022-03-13 12:44:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 12:46:00,2022-03-13 12:55:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 12:55:00,2022-03-13 13:04:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 13:06:00,2022-03-13 13:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 13:15:00,2022-03-13 13:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 13:26:00,2022-03-13 13:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 13:35:00,2022-03-13 13:44:00,Ariyah,5139,22,4426903,CKB +Richard,Ariyah,2022-03-13 14:06:00,2022-03-13 14:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 14:15:00,2022-03-13 14:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 14:26:00,2022-03-13 14:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 14:35:00,2022-03-13 14:44:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 14:46:00,2022-03-13 14:55:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 14:55:00,2022-03-13 15:04:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 15:06:00,2022-03-13 15:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 15:15:00,2022-03-13 15:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 15:26:00,2022-03-13 15:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 15:35:00,2022-03-13 15:44:00,Ariyah,5139,22,4426903,CKB +Richard,Ariyah,2022-03-13 16:06:00,2022-03-13 16:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 16:15:00,2022-03-13 16:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 16:26:00,2022-03-13 16:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 16:35:00,2022-03-13 16:44:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 16:46:00,2022-03-13 16:55:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 16:55:00,2022-03-13 17:04:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 17:06:00,2022-03-13 17:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 17:15:00,2022-03-13 17:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 17:26:00,2022-03-13 17:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 17:35:00,2022-03-13 17:44:00,Ariyah,5139,22,4426903,CKB +Richard,Ariyah,2022-03-13 18:06:00,2022-03-13 18:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 18:15:00,2022-03-13 18:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 18:26:00,2022-03-13 18:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 18:35:00,2022-03-13 18:44:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 18:46:00,2022-03-13 18:55:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 18:55:00,2022-03-13 19:04:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 19:06:00,2022-03-13 19:15:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 19:15:00,2022-03-13 19:24:00,Ariyah,5139,2,4426903,CKB +Richard,Ariyah,2022-03-13 19:26:00,2022-03-13 19:35:00,Jaden,4781,0,4426903,CKB +Richard,Jaden,2022-03-13 19:35:00,2022-03-13 19:44:00,Ariyah,5139,21,4426903,CKB +Richard,Ariyah,2022-03-13 20:05:00,2022-03-13 20:14:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 20:15:00,2022-03-13 20:24:00,Ariyah,5139,1,4426903,CKB +Richard,Ariyah,2022-03-13 20:25:00,2022-03-13 20:34:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 20:35:00,2022-03-13 20:44:00,Ariyah,5139,1,4426903,CKB +Richard,Ariyah,2022-03-13 20:45:00,2022-03-13 20:54:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 20:55:00,2022-03-13 21:04:00,Ariyah,5139,1,4426903,CKB +Richard,Ariyah,2022-03-13 21:05:00,2022-03-13 21:14:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 21:15:00,2022-03-13 21:24:00,Ariyah,5139,1,4426903,CKB +Richard,Ariyah,2022-03-13 21:25:00,2022-03-13 21:34:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 21:35:00,2022-03-13 21:44:00,Ariyah,5139,21,4426903,CKB +Richard,Ariyah,2022-03-13 22:05:00,2022-03-13 22:14:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 22:15:00,2022-03-13 22:24:00,Ariyah,5139,1,4426903,CKB +Richard,Ariyah,2022-03-13 22:25:00,2022-03-13 22:34:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 22:35:00,2022-03-13 22:44:00,Ariyah,5139,1,4426903,CKB +Richard,Ariyah,2022-03-13 22:45:00,2022-03-13 22:54:00,Jaden,4781,1,4426903,CKB +Richard,Jaden,2022-03-13 22:55:00,2022-03-13 23:04:00,Ariyah,5139,0,4426903,CKB +Richard,Ariyah,2022-03-13 23:04:00,2022-03-13 23:04:00,Beckham,0.06,0,4426903,CKB +Camryn,Beckham,2022-03-13 07:30:00,2022-03-13 07:30:00,Lucia,0.06,0,4369706,CKB +Camryn,Lucia,2022-03-13 07:30:00,2022-03-13 07:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 07:39:00,2022-03-13 07:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 07:50:00,2022-03-13 07:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 07:59:00,2022-03-13 08:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 08:10:00,2022-03-13 08:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 08:19:00,2022-03-13 08:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 08:30:00,2022-03-13 08:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 08:39:00,2022-03-13 08:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 08:50:00,2022-03-13 08:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 08:59:00,2022-03-13 09:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 09:10:00,2022-03-13 09:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 09:19:00,2022-03-13 09:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 09:30:00,2022-03-13 09:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 09:39:00,2022-03-13 09:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 09:50:00,2022-03-13 09:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 09:59:00,2022-03-13 10:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 10:10:00,2022-03-13 10:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 10:19:00,2022-03-13 10:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 10:30:00,2022-03-13 10:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 10:39:00,2022-03-13 10:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 10:50:00,2022-03-13 10:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 10:59:00,2022-03-13 11:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 11:10:00,2022-03-13 11:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 11:19:00,2022-03-13 11:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 11:30:00,2022-03-13 11:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 11:39:00,2022-03-13 11:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 11:50:00,2022-03-13 11:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 11:59:00,2022-03-13 12:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 12:10:00,2022-03-13 12:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 12:19:00,2022-03-13 12:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 12:30:00,2022-03-13 12:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 12:39:00,2022-03-13 12:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 12:50:00,2022-03-13 12:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 12:59:00,2022-03-13 13:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 13:10:00,2022-03-13 13:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 13:19:00,2022-03-13 13:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 13:30:00,2022-03-13 13:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 13:39:00,2022-03-13 13:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 13:50:00,2022-03-13 13:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 13:59:00,2022-03-13 14:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 14:10:00,2022-03-13 14:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 14:19:00,2022-03-13 14:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 14:30:00,2022-03-13 14:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 14:39:00,2022-03-13 14:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 14:50:00,2022-03-13 14:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 14:59:00,2022-03-13 15:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 15:10:00,2022-03-13 15:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 15:19:00,2022-03-13 15:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 15:30:00,2022-03-13 15:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 15:39:00,2022-03-13 15:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 15:50:00,2022-03-13 15:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 15:59:00,2022-03-13 16:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 16:10:00,2022-03-13 16:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 16:19:00,2022-03-13 16:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 16:30:00,2022-03-13 16:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 16:39:00,2022-03-13 16:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 16:50:00,2022-03-13 16:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 16:59:00,2022-03-13 17:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 17:10:00,2022-03-13 17:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 17:19:00,2022-03-13 17:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 17:30:00,2022-03-13 17:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 17:39:00,2022-03-13 17:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 17:50:00,2022-03-13 17:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 17:59:00,2022-03-13 18:10:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 18:10:00,2022-03-13 18:15:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 18:19:00,2022-03-13 18:30:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 18:30:00,2022-03-13 18:35:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 18:39:00,2022-03-13 18:50:00,Lucia,4341,0,4369706,CKB +Camryn,Lucia,2022-03-13 18:50:00,2022-03-13 18:55:00,Jaxon,2217,4,4369706,CKB +Camryn,Jaxon,2022-03-13 18:59:00,2022-03-13 19:10:00,Lucia,4288,0,4369706,CKB +Camryn,Lucia,2022-03-13 19:10:00,2022-03-13 19:10:00,Beckham,0.06,0,4369706,CKB +Amy,Beckham,2022-03-13 07:56:00,2022-03-13 07:56:00,Izabella,0.06,0,4419537,CKB +Amy,Izabella,2022-03-13 07:56:00,2022-03-13 07:56:00,Izabella,0.0,792,4419537,CKB +Amy,Izabella,2022-03-13 21:08:00,2022-03-13 21:08:00,Izabella,0.0,0,4419537,CKB +Amy,Izabella,2022-03-13 21:08:00,2022-03-13 21:08:00,Beckham,0.06,0,4419537,CKB +Nash,Beckham,2022-03-13 07:18:00,2022-03-13 07:18:00,Amira,0.06,0,4688586,CKB +Nash,Amira,2022-03-13 07:18:00,2022-03-13 07:26:00,Victor,5562,10,4688586,CKB +Nash,Victor,2022-03-13 07:36:00,2022-03-13 07:45:00,Olivia,5941,32,4688586,CKB +Nash,Olivia,2022-03-13 08:17:00,2022-03-13 08:26:00,Victor,5994,10,4688586,CKB +Nash,Victor,2022-03-13 08:36:00,2022-03-13 08:45:00,Olivia,5941,32,4688586,CKB +Nash,Olivia,2022-03-13 09:17:00,2022-03-13 09:26:00,Victor,5994,8,4688586,CKB +Nash,Victor,2022-03-13 09:34:00,2022-03-13 09:43:00,Olivia,5941,36,4688586,CKB +Nash,Olivia,2022-03-13 10:19:00,2022-03-13 10:30:00,Victor,5994,2,4688586,CKB +Nash,Victor,2022-03-13 10:32:00,2022-03-13 10:41:00,Amira,5566,0,4688586,CKB +Nash,Amira,2022-03-13 10:41:00,2022-03-13 10:41:00,Beckham,0.06,0,4688586,CKB +Ayaan,Beckham,2022-03-08 21:31:00,2022-03-08 21:31:00,Kalani,0.06,0,4454944,CKB +Ayaan,Kalani,2022-03-08 21:31:00,2022-03-08 22:04:00,Brian,14519,4,4454944,CKB +Ayaan,Brian,2022-03-08 22:08:00,2022-03-08 22:43:00,Kalani,13541,8,4454944,CKB +Ayaan,Kalani,2022-03-08 22:51:00,2022-03-08 23:24:00,Brian,14519,4,4454944,CKB +Ayaan,Brian,2022-03-08 23:28:00,2022-03-09 00:03:00,Kalani,13541,8,4454944,CKB +Ayaan,Kalani,2022-03-09 00:11:00,2022-03-09 00:44:00,Brian,14519,0,4454944,CKB +Hunter,Brian,2022-03-09 00:44:00,2022-03-09 00:54:00,Kehlani,4.1,25,4454944,CKB +Hunter,Kehlani,2022-03-09 01:19:00,2022-03-09 01:42:00,Ayden,8.36,6,4454944,CKB +Hunter,Ayden,2022-03-09 01:48:00,2022-03-09 02:06:00,Kehlani,9067,13,4454944,CKB +Hunter,Kehlani,2022-03-09 02:19:00,2022-03-09 02:42:00,Ayden,8.36,6,4454944,CKB +Hunter,Ayden,2022-03-09 02:48:00,2022-03-09 03:06:00,Kehlani,9067,13,4454944,CKB +Hunter,Kehlani,2022-03-09 03:19:00,2022-03-09 03:42:00,Ayden,8.36,6,4454944,CKB +Hunter,Ayden,2022-03-09 03:48:00,2022-03-09 04:06:00,Kehlani,9067,0,4454944,CKB +Hunter,Kehlani,2022-03-09 04:06:00,2022-03-09 04:06:00,Beckham,0.06,0,4454944,CKB +Ayaan,Beckham,2022-03-08 22:11:00,2022-03-08 22:11:00,Kalani,0.06,0,4454949,CKB +Ayaan,Kalani,2022-03-08 22:11:00,2022-03-08 22:44:00,Brian,14519,4,4454949,CKB +Ayaan,Brian,2022-03-08 22:48:00,2022-03-08 23:23:00,Kalani,13541,8,4454949,CKB +Ayaan,Kalani,2022-03-08 23:31:00,2022-03-09 00:04:00,Brian,14519,4,4454949,CKB +Ayaan,Brian,2022-03-09 00:08:00,2022-03-09 00:39:00,Leonel,12213,0,4454949,CKB +Hunter,Leonel,2022-03-09 00:39:00,2022-03-09 00:47:00,Kehlani,4.0,2,4454949,CKB +Hunter,Kehlani,2022-03-09 00:49:00,2022-03-09 01:12:00,Ayden,8.36,6,4454949,CKB +Hunter,Ayden,2022-03-09 01:18:00,2022-03-09 01:36:00,Kehlani,9067,13,4454949,CKB +Hunter,Kehlani,2022-03-09 01:49:00,2022-03-09 02:12:00,Ayden,8.36,6,4454949,CKB +Hunter,Ayden,2022-03-09 02:18:00,2022-03-09 02:36:00,Kehlani,9067,13,4454949,CKB +Hunter,Kehlani,2022-03-09 02:49:00,2022-03-09 03:12:00,Ayden,8.36,6,4454949,CKB +Hunter,Ayden,2022-03-09 03:18:00,2022-03-09 03:36:00,Kehlani,9067,13,4454949,CKB +Hunter,Kehlani,2022-03-09 03:49:00,2022-03-09 04:12:00,Ayden,8.36,0,4454949,CKB +Hunter,Ayden,2022-03-09 04:12:00,2022-03-09 04:12:00,Beckham,0.06,0,4454949,CKB +Donovan,Beckham,2022-03-08 21:06:00,2022-03-08 21:06:00,Pierce,0.06,0,4664623,CKB +Donovan,Pierce,2022-03-08 21:06:00,2022-03-08 21:34:00,Leonardo,13018,19,4664623,CKB +Donovan,Leonardo,2022-03-08 21:53:00,2022-03-08 22:13:00,Kamryn,10332,17,4664623,CKB +Donovan,Kamryn,2022-03-08 22:30:00,2022-03-08 22:54:00,Leonardo,10.48,19,4664623,CKB +Donovan,Leonardo,2022-03-08 23:13:00,2022-03-08 23:33:00,Kamryn,10332,17,4664623,CKB +Donovan,Kamryn,2022-03-08 23:50:00,2022-03-09 00:14:00,Leonardo,10.48,2,4664623,CKB +Donovan,Leonardo,2022-03-09 00:16:00,2022-03-09 00:23:00,Melanie,3709,5,4664623,CKB +Zoey,Melanie,2022-03-09 00:28:00,2022-03-09 00:44:00,Brinley,6404,3,4664623,CKB +Zoey,Brinley,2022-03-09 00:47:00,2022-03-09 01:10:00,Finn,10579,7,4664623,CKB +Zoey,Finn,2022-03-09 01:17:00,2022-03-09 01:44:00,Brinley,12007,3,4664623,CKB +Zoey,Brinley,2022-03-09 01:47:00,2022-03-09 02:10:00,Finn,10579,7,4664623,CKB +Zoey,Finn,2022-03-09 02:17:00,2022-03-09 02:44:00,Brinley,12007,3,4664623,CKB +Zoey,Brinley,2022-03-09 02:47:00,2022-03-09 03:10:00,Finn,10579,7,4664623,CKB +Zoey,Finn,2022-03-09 03:17:00,2022-03-09 03:44:00,Brinley,12007,3,4664623,CKB +Zoey,Brinley,2022-03-09 03:47:00,2022-03-09 04:10:00,Finn,10579,7,4664623,CKB +Zoey,Finn,2022-03-09 04:17:00,2022-03-09 04:44:00,Brinley,12007,0,4664623,CKB +Zoey,Brinley,2022-03-09 04:44:00,2022-03-09 04:44:00,Beckham,0.06,0,4664623,CKB +Donovan,Beckham,2022-03-08 20:26:00,2022-03-08 20:26:00,Pierce,0.06,0,4762733,CKB +Donovan,Pierce,2022-03-08 20:26:00,2022-03-08 20:56:00,Ezra,14097,14,4762733,CKB +Donovan,Ezra,2022-03-08 21:10:00,2022-03-08 21:38:00,Pierce,13.19,8,4762733,CKB +Donovan,Pierce,2022-03-08 21:46:00,2022-03-08 22:14:00,Leonardo,13018,19,4762733,CKB +Donovan,Leonardo,2022-03-08 22:33:00,2022-03-08 22:53:00,Kamryn,10332,17,4762733,CKB +Donovan,Kamryn,2022-03-08 23:10:00,2022-03-08 23:34:00,Leonardo,10.48,19,4762733,CKB +Donovan,Leonardo,2022-03-08 23:53:00,2022-03-09 00:13:00,Kamryn,10332,2,4762733,CKB +Donovan,Kamryn,2022-03-09 00:15:00,2022-03-09 00:16:00,Brinley,506,1,4762733,CKB +Zoey,Brinley,2022-03-09 00:17:00,2022-03-09 00:40:00,Finn,10579,7,4762733,CKB +Zoey,Finn,2022-03-09 00:47:00,2022-03-09 01:14:00,Brinley,12007,3,4762733,CKB +Zoey,Brinley,2022-03-09 01:17:00,2022-03-09 01:40:00,Finn,10579,7,4762733,CKB +Zoey,Finn,2022-03-09 01:47:00,2022-03-09 02:14:00,Brinley,12007,3,4762733,CKB +Zoey,Brinley,2022-03-09 02:17:00,2022-03-09 02:40:00,Finn,10579,7,4762733,CKB +Zoey,Finn,2022-03-09 02:47:00,2022-03-09 03:14:00,Brinley,12007,3,4762733,CKB +Zoey,Brinley,2022-03-09 03:17:00,2022-03-09 03:40:00,Finn,10579,7,4762733,CKB +Zoey,Finn,2022-03-09 03:47:00,2022-03-09 04:14:00,Brinley,12007,3,4762733,CKB +Zoey,Brinley,2022-03-09 04:17:00,2022-03-09 04:40:00,Finn,10579,3,4762733,CKB +Jackson,Finn,2022-03-09 04:43:00,2022-03-09 04:58:00,Rose,6161,0,4762733,CKB +Jackson,Rose,2022-03-09 04:58:00,2022-03-09 04:58:00,Beckham,0.06,0,4762733,CKB +Avery,Beckham,2022-03-08 22:56:00,2022-03-08 22:56:00,Jace,0.06,0,4617408,CKB +Avery,Jace,2022-03-08 22:56:00,2022-03-08 23:08:00,Nathan,5882,3,4617408,CKB +Avery,Nathan,2022-03-08 23:11:00,2022-03-08 23:25:00,Jace,6232,0,4617408,CKB +Avery,Jace,2022-03-08 23:25:00,2022-03-08 23:38:00,Nathan,6086,3,4617408,CKB +Avery,Nathan,2022-03-08 23:41:00,2022-03-08 23:55:00,Jace,6232,0,4617408,CKB +Avery,Jace,2022-03-08 23:55:00,2022-03-09 00:08:00,Nathan,6086,0,4617408,CKB +Avery,Nathan,2022-03-09 00:08:00,2022-03-09 00:08:00,Beckham,0.06,0,4617408,CKB +Richard,Beckham,2022-03-08 05:05:00,2022-03-08 05:05:00,Ariyah,0.06,0,4426845,CKB +Richard,Ariyah,2022-03-08 05:05:00,2022-03-08 05:14:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 05:14:00,2022-03-08 05:23:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 05:25:00,2022-03-08 05:34:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 05:34:00,2022-03-08 05:43:00,Ariyah,5139,23,4426845,CKB +Richard,Ariyah,2022-03-08 06:06:00,2022-03-08 06:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 06:15:00,2022-03-08 06:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 06:26:00,2022-03-08 06:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 06:35:00,2022-03-08 06:44:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 06:46:00,2022-03-08 06:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 06:55:00,2022-03-08 07:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 07:06:00,2022-03-08 07:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 07:15:00,2022-03-08 07:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 07:26:00,2022-03-08 07:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 07:35:00,2022-03-08 07:44:00,Ariyah,5139,22,4426845,CKB +Richard,Ariyah,2022-03-08 08:06:00,2022-03-08 08:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 08:15:00,2022-03-08 08:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 08:26:00,2022-03-08 08:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 08:35:00,2022-03-08 08:44:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 08:46:00,2022-03-08 08:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 08:55:00,2022-03-08 09:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 09:06:00,2022-03-08 09:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 09:15:00,2022-03-08 09:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 09:26:00,2022-03-08 09:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 09:35:00,2022-03-08 09:44:00,Ariyah,5139,22,4426845,CKB +Richard,Ariyah,2022-03-08 10:06:00,2022-03-08 10:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 10:15:00,2022-03-08 10:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 10:26:00,2022-03-08 10:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 10:35:00,2022-03-08 10:44:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 10:46:00,2022-03-08 10:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 10:55:00,2022-03-08 11:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 11:06:00,2022-03-08 11:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 11:15:00,2022-03-08 11:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 11:26:00,2022-03-08 11:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 11:35:00,2022-03-08 11:44:00,Ariyah,5139,22,4426845,CKB +Richard,Ariyah,2022-03-08 12:06:00,2022-03-08 12:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 12:15:00,2022-03-08 12:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 12:26:00,2022-03-08 12:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 12:35:00,2022-03-08 12:44:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 12:46:00,2022-03-08 12:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 12:55:00,2022-03-08 13:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 13:06:00,2022-03-08 13:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 13:15:00,2022-03-08 13:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 13:26:00,2022-03-08 13:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 13:35:00,2022-03-08 13:44:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 13:46:00,2022-03-08 13:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 13:55:00,2022-03-08 14:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 14:06:00,2022-03-08 14:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 14:15:00,2022-03-08 14:24:00,Ariyah,5139,22,4426845,CKB +Richard,Ariyah,2022-03-08 14:46:00,2022-03-08 14:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 14:55:00,2022-03-08 15:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 15:06:00,2022-03-08 15:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 15:15:00,2022-03-08 15:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 15:26:00,2022-03-08 15:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 15:35:00,2022-03-08 15:44:00,Ariyah,5139,22,4426845,CKB +Richard,Ariyah,2022-03-08 16:06:00,2022-03-08 16:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 16:15:00,2022-03-08 16:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 16:26:00,2022-03-08 16:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 16:35:00,2022-03-08 16:44:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 16:46:00,2022-03-08 16:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 16:55:00,2022-03-08 17:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 17:06:00,2022-03-08 17:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 17:15:00,2022-03-08 17:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 17:26:00,2022-03-08 17:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 17:35:00,2022-03-08 17:44:00,Ariyah,5139,22,4426845,CKB +Richard,Ariyah,2022-03-08 18:06:00,2022-03-08 18:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 18:15:00,2022-03-08 18:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 18:26:00,2022-03-08 18:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 18:35:00,2022-03-08 18:44:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 18:46:00,2022-03-08 18:55:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 18:55:00,2022-03-08 19:04:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 19:06:00,2022-03-08 19:15:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 19:15:00,2022-03-08 19:24:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 19:26:00,2022-03-08 19:35:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 19:35:00,2022-03-08 19:44:00,Ariyah,5139,21,4426845,CKB +Richard,Ariyah,2022-03-08 20:05:00,2022-03-08 20:14:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 20:14:00,2022-03-08 20:23:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 20:25:00,2022-03-08 20:34:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 20:34:00,2022-03-08 20:43:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 20:45:00,2022-03-08 20:54:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 20:54:00,2022-03-08 21:03:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 21:05:00,2022-03-08 21:14:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 21:14:00,2022-03-08 21:23:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 21:25:00,2022-03-08 21:34:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 21:34:00,2022-03-08 21:43:00,Ariyah,5139,22,4426845,CKB +Richard,Ariyah,2022-03-08 22:05:00,2022-03-08 22:14:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 22:14:00,2022-03-08 22:23:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 22:25:00,2022-03-08 22:34:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 22:34:00,2022-03-08 22:43:00,Ariyah,5139,2,4426845,CKB +Richard,Ariyah,2022-03-08 22:45:00,2022-03-08 22:54:00,Jaden,4781,0,4426845,CKB +Richard,Jaden,2022-03-08 22:54:00,2022-03-08 23:03:00,Ariyah,5139,0,4426845,CKB +Richard,Ariyah,2022-03-08 23:03:00,2022-03-08 23:03:00,Beckham,0.06,0,4426845,CKB +Ezekiel,Beckham,2022-03-09 00:06:00,2022-03-09 00:06:00,Erik,0.06,0,4708595,CKB +Ezekiel,Erik,2022-03-09 00:06:00,2022-03-09 00:27:00,Memphis,7827,0,4708595,CKB +Jake,Memphis,2022-03-09 00:27:00,2022-03-09 00:48:00,Kayleigh,11079,0,4708595,CKB +Jake,Kayleigh,2022-03-09 00:48:00,2022-03-09 01:25:00,Kamila,20641,8,4708595,CKB +Jake,Kamila,2022-03-09 01:33:00,2022-03-09 02:16:00,Kayleigh,20579,1,4708595,CKB +Jake,Kayleigh,2022-03-09 02:17:00,2022-03-09 02:55:00,Kamila,20641,8,4708595,CKB +Jake,Kamila,2022-03-09 03:03:00,2022-03-09 03:46:00,Kayleigh,20579,1,4708595,CKB +Jake,Kayleigh,2022-03-09 03:47:00,2022-03-09 04:25:00,Kamila,20641,0,4708595,CKB +Jake,Kamila,2022-03-09 04:25:00,2022-03-09 04:25:00,Beckham,0.06,0,4708595,CKB +Astrid,King,2022-03-08 05:15:00,2022-03-08 06:01:00,Brayden,17.9,0,4317625,VDL +Astrid,Brayden,2022-03-08 06:01:00,2022-03-08 06:15:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 06:23:00,2022-03-08 06:37:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 06:41:00,2022-03-08 06:55:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 07:03:00,2022-03-08 07:17:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 07:21:00,2022-03-08 07:35:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 07:43:00,2022-03-08 07:57:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 08:01:00,2022-03-08 08:15:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 08:23:00,2022-03-08 08:37:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 08:41:00,2022-03-08 08:55:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 09:03:00,2022-03-08 09:17:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 09:21:00,2022-03-08 09:35:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 09:43:00,2022-03-08 09:57:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 10:01:00,2022-03-08 10:15:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 10:23:00,2022-03-08 10:37:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 10:41:00,2022-03-08 10:55:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 11:03:00,2022-03-08 11:17:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 11:21:00,2022-03-08 11:35:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 11:43:00,2022-03-08 11:57:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 12:01:00,2022-03-08 12:15:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 12:23:00,2022-03-08 12:37:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 12:41:00,2022-03-08 12:55:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 13:03:00,2022-03-08 13:17:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 13:21:00,2022-03-08 13:35:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 13:43:00,2022-03-08 13:57:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 14:01:00,2022-03-08 14:15:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 14:23:00,2022-03-08 14:37:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 14:41:00,2022-03-08 14:55:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 15:03:00,2022-03-08 15:17:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 15:21:00,2022-03-08 15:35:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 15:43:00,2022-03-08 15:57:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 16:01:00,2022-03-08 16:15:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 16:23:00,2022-03-08 16:37:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 16:41:00,2022-03-08 16:55:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 17:03:00,2022-03-08 17:17:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 17:21:00,2022-03-08 17:35:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 17:43:00,2022-03-08 17:57:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 18:01:00,2022-03-08 18:15:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 18:23:00,2022-03-08 18:37:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 18:41:00,2022-03-08 18:55:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 19:03:00,2022-03-08 19:17:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 19:21:00,2022-03-08 19:35:00,Brayden,4637,8,4317625,VDL +Astrid,Brayden,2022-03-08 19:43:00,2022-03-08 19:57:00,Brayden,4637,4,4317625,VDL +Astrid,Brayden,2022-03-08 20:01:00,2022-03-08 20:14:00,Brayden,4637,9,4317625,VDL +Astrid,Brayden,2022-03-08 20:23:00,2022-03-08 20:36:00,Brayden,4637,0,4317625,VDL +Astrid,Brayden,2022-03-08 20:36:00,2022-03-08 21:15:00,King,19.8,0,4317625,VDL +Amy,Beckham,2022-03-08 04:56:00,2022-03-08 04:56:00,Izabella,0.06,18,4425668,CKB +Amy,Izabella,2022-03-08 05:14:00,2022-03-08 05:20:00,Tristan,3.29,0,4425668,CKB +Amy,Tristan,2022-03-08 05:20:00,2022-03-08 05:24:00,Izabella,2954,20,4425668,CKB +Amy,Izabella,2022-03-08 05:44:00,2022-03-08 05:50:00,Tristan,3.29,0,4425668,CKB +Amy,Tristan,2022-03-08 05:50:00,2022-03-08 05:54:00,Izabella,2954,5,4425668,CKB +Amy,Izabella,2022-03-08 05:59:00,2022-03-08 06:06:00,Tristan,3.29,2,4425668,CKB +Amy,Tristan,2022-03-08 06:08:00,2022-03-08 06:13:00,Izabella,2954,19,4425668,CKB +Amy,Izabella,2022-03-08 06:32:00,2022-03-08 06:39:00,Tristan,3.29,1,4425668,CKB +Amy,Tristan,2022-03-08 06:40:00,2022-03-08 06:45:00,Izabella,2954,7,4425668,CKB +Amy,Izabella,2022-03-08 06:52:00,2022-03-08 06:59:00,Tristan,3.29,1,4425668,CKB +Amy,Tristan,2022-03-08 07:00:00,2022-03-08 07:05:00,Izabella,2954,7,4425668,CKB +Amy,Izabella,2022-03-08 07:12:00,2022-03-08 07:19:00,Tristan,3.29,1,4425668,CKB +Amy,Tristan,2022-03-08 07:20:00,2022-03-08 07:25:00,Izabella,2954,7,4425668,CKB +Amy,Izabella,2022-03-08 07:32:00,2022-03-08 07:39:00,Tristan,3.29,1,4425668,CKB +Amy,Tristan,2022-03-08 07:40:00,2022-03-08 07:45:00,Izabella,2954,295,4425668,CKB +Amy,Izabella,2022-03-08 12:40:00,2022-03-08 12:47:00,Tristan,3.29,2,4425668,CKB +Amy,Tristan,2022-03-08 12:49:00,2022-03-08 12:54:00,Izabella,2954,46,4425668,CKB +Amy,Izabella,2022-03-08 13:40:00,2022-03-08 13:47:00,Tristan,3.29,2,4425668,CKB +Amy,Tristan,2022-03-08 13:49:00,2022-03-08 13:54:00,Izabella,2954,434,4425668,CKB +Amy,Izabella,2022-03-08 21:08:00,2022-03-08 21:08:00,Beckham,0.06,0,4425668,CKB +Matilda,Beckham,2022-03-08 07:20:00,2022-03-08 07:20:00,Izaiah,0.06,0,4448150,CKB +Matilda,Izaiah,2022-03-08 07:20:00,2022-03-08 07:50:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 08:00:00,2022-03-08 08:30:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 08:40:00,2022-03-08 09:10:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 09:20:00,2022-03-08 09:50:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 10:00:00,2022-03-08 10:30:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 10:40:00,2022-03-08 11:10:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 11:20:00,2022-03-08 11:50:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 12:00:00,2022-03-08 12:30:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 12:40:00,2022-03-08 13:10:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 13:20:00,2022-03-08 13:50:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 14:00:00,2022-03-08 14:30:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 14:40:00,2022-03-08 15:10:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 15:20:00,2022-03-08 15:50:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 16:00:00,2022-03-08 16:30:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 16:40:00,2022-03-08 17:10:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 17:20:00,2022-03-08 17:50:00,Izaiah,9266,10,4448150,CKB +Matilda,Izaiah,2022-03-08 18:00:00,2022-03-08 18:30:00,Izaiah,9266,0,4448150,CKB +Matilda,Izaiah,2022-03-08 18:30:00,2022-03-08 18:30:00,Beckham,0.06,0,4448150,CKB +Hailey,Beckham,2022-03-08 07:10:00,2022-03-08 07:10:00,Kaylani,0.06,0,4733895,CKB +Hailey,Kaylani,2022-03-08 07:10:00,2022-03-08 07:18:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 07:28:00,2022-03-08 07:40:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 07:40:00,2022-03-08 07:48:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 07:58:00,2022-03-08 08:10:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 08:10:00,2022-03-08 08:18:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 08:28:00,2022-03-08 08:40:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 08:40:00,2022-03-08 08:48:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 08:58:00,2022-03-08 09:10:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 09:10:00,2022-03-08 09:18:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 09:28:00,2022-03-08 09:40:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 09:40:00,2022-03-08 09:48:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 09:58:00,2022-03-08 10:10:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 10:10:00,2022-03-08 10:18:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 10:28:00,2022-03-08 10:40:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 10:40:00,2022-03-08 10:48:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 10:58:00,2022-03-08 11:10:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 11:10:00,2022-03-08 11:18:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 11:28:00,2022-03-08 11:40:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 11:40:00,2022-03-08 11:48:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 11:58:00,2022-03-08 12:10:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 12:10:00,2022-03-08 12:18:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 12:28:00,2022-03-08 12:40:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 12:40:00,2022-03-08 12:48:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 12:58:00,2022-03-08 13:10:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 13:10:00,2022-03-08 13:18:00,Cecilia,2169,10,4733895,CKB +Hailey,Cecilia,2022-03-08 13:28:00,2022-03-08 13:40:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 13:40:00,2022-03-08 13:48:00,Cecilia,2169,8,4733895,CKB +Hailey,Cecilia,2022-03-08 13:56:00,2022-03-08 14:10:00,Kaylani,2952,0,4733895,CKB +Hailey,Kaylani,2022-03-08 14:10:00,2022-03-08 14:19:00,Cecilia,2169,14,4733895,CKB +Hailey,Cecilia,2022-03-08 14:33:00,2022-03-08 14:47:00,Kaylani,2952,3,4733895,CKB +Hailey,Kaylani,2022-03-08 14:50:00,2022-03-08 14:59:00,Cecilia,2169,14,4733895,CKB +Hailey,Cecilia,2022-03-08 15:13:00,2022-03-08 15:27:00,Kaylani,2952,3,4733895,CKB +Hailey,Kaylani,2022-03-08 15:30:00,2022-03-08 15:39:00,Cecilia,2169,14,4733895,CKB +Hailey,Cecilia,2022-03-08 15:53:00,2022-03-08 16:07:00,Kaylani,2952,3,4733895,CKB +Hailey,Kaylani,2022-03-08 16:10:00,2022-03-08 16:19:00,Cecilia,2169,14,4733895,CKB +Hailey,Cecilia,2022-03-08 16:33:00,2022-03-08 16:47:00,Kaylani,2952,3,4733895,CKB +Hailey,Kaylani,2022-03-08 16:50:00,2022-03-08 16:59:00,Cecilia,2169,14,4733895,CKB +Hailey,Cecilia,2022-03-08 17:13:00,2022-03-08 17:27:00,Kaylani,2952,3,4733895,CKB +Hailey,Kaylani,2022-03-08 17:30:00,2022-03-08 17:39:00,Cecilia,2169,13,4733895,CKB +Hailey,Cecilia,2022-03-08 17:52:00,2022-03-08 18:05:00,Kaylani,2952,5,4733895,CKB +Hailey,Kaylani,2022-03-08 18:10:00,2022-03-08 18:18:00,Cecilia,2169,0,4733895,CKB +Hailey,Cecilia,2022-03-08 18:18:00,2022-03-08 18:18:00,Beckham,0.06,0,4733895,CKB +Hailey,Beckham,2022-03-08 14:13:00,2022-03-08 14:13:00,Cecilia,0.06,0,4734200,CKB +Hailey,Cecilia,2022-03-08 14:13:00,2022-03-08 14:27:00,Kaylani,2952,3,4734200,CKB +Hailey,Kaylani,2022-03-08 14:30:00,2022-03-08 14:39:00,Cecilia,2169,14,4734200,CKB +Hailey,Cecilia,2022-03-08 14:53:00,2022-03-08 15:07:00,Kaylani,2952,3,4734200,CKB +Hailey,Kaylani,2022-03-08 15:10:00,2022-03-08 15:19:00,Cecilia,2169,14,4734200,CKB +Hailey,Cecilia,2022-03-08 15:33:00,2022-03-08 15:47:00,Kaylani,2952,3,4734200,CKB +Hailey,Kaylani,2022-03-08 15:50:00,2022-03-08 15:59:00,Cecilia,2169,14,4734200,CKB +Hailey,Cecilia,2022-03-08 16:13:00,2022-03-08 16:27:00,Kaylani,2952,3,4734200,CKB +Hailey,Kaylani,2022-03-08 16:30:00,2022-03-08 16:39:00,Cecilia,2169,14,4734200,CKB +Hailey,Cecilia,2022-03-08 16:53:00,2022-03-08 17:07:00,Kaylani,2952,3,4734200,CKB +Hailey,Kaylani,2022-03-08 17:10:00,2022-03-08 17:19:00,Cecilia,2169,14,4734200,CKB +Hailey,Cecilia,2022-03-08 17:33:00,2022-03-08 17:47:00,Kaylani,2952,3,4734200,CKB +Hailey,Kaylani,2022-03-08 17:50:00,2022-03-08 17:59:00,Cecilia,2169,14,4734200,CKB +Hailey,Cecilia,2022-03-08 18:13:00,2022-03-08 18:25:00,Kaylani,2952,0,4734200,CKB +Hailey,Kaylani,2022-03-08 18:25:00,2022-03-08 18:25:00,Beckham,0.06,0,4734200,CKB +Matthias,Beckham,2022-03-09 00:23:00,2022-03-09 00:23:00,Addilyn,0.06,0,4318157,CKB +Matthias,Addilyn,2022-03-09 00:23:00,2022-03-09 00:30:00,Ari,2577,9,4318157,CKB +Ruby,Ari,2022-03-09 00:39:00,2022-03-09 00:54:00,Kobe,5937,9,4318157,CKB +Ruby,Kobe,2022-03-09 01:03:00,2022-03-09 01:17:00,Ari,6.19,0,4318157,CKB +Matthias,Ari,2022-03-09 01:17:00,2022-03-09 01:23:00,Addilyn,2555,0,4318157,CKB +Matthias,Addilyn,2022-03-09 01:23:00,2022-03-09 01:30:00,Ari,2577,9,4318157,CKB +Ruby,Ari,2022-03-09 01:39:00,2022-03-09 01:54:00,Kobe,5937,9,4318157,CKB +Ruby,Kobe,2022-03-09 02:03:00,2022-03-09 02:17:00,Ari,6.19,0,4318157,CKB +Matthias,Ari,2022-03-09 02:17:00,2022-03-09 02:23:00,Addilyn,2555,0,4318157,CKB +Matthias,Addilyn,2022-03-09 02:23:00,2022-03-09 02:30:00,Ari,2577,9,4318157,CKB +Ruby,Ari,2022-03-09 02:39:00,2022-03-09 02:54:00,Kobe,5937,9,4318157,CKB +Ruby,Kobe,2022-03-09 03:03:00,2022-03-09 03:17:00,Ari,6.19,0,4318157,CKB +Matthias,Ari,2022-03-09 03:17:00,2022-03-09 03:23:00,Addilyn,2555,0,4318157,CKB +Matthias,Addilyn,2022-03-09 03:23:00,2022-03-09 03:30:00,Ari,2577,9,4318157,CKB +Ruby,Ari,2022-03-09 03:39:00,2022-03-09 03:54:00,Kobe,5937,9,4318157,CKB +Ruby,Kobe,2022-03-09 04:03:00,2022-03-09 04:17:00,Ari,6.19,0,4318157,CKB +Matthias,Ari,2022-03-09 04:17:00,2022-03-09 04:23:00,Addilyn,2555,0,4318157,CKB +Matthias,Addilyn,2022-03-09 04:23:00,2022-03-09 04:23:00,Beckham,0.06,0,4318157,CKB +Ruby,Beckham,2022-03-09 00:33:00,2022-03-09 00:33:00,Kobe,0.06,0,4318177,CKB +Ruby,Kobe,2022-03-09 00:33:00,2022-03-09 00:47:00,Ari,6.19,0,4318177,CKB +Matthias,Ari,2022-03-09 00:47:00,2022-03-09 00:53:00,Addilyn,2555,0,4318177,CKB +Matthias,Addilyn,2022-03-09 00:53:00,2022-03-09 01:00:00,Ari,2577,9,4318177,CKB +Ruby,Ari,2022-03-09 01:09:00,2022-03-09 01:24:00,Kobe,5937,9,4318177,CKB +Ruby,Kobe,2022-03-09 01:33:00,2022-03-09 01:47:00,Ari,6.19,0,4318177,CKB +Matthias,Ari,2022-03-09 01:47:00,2022-03-09 01:53:00,Addilyn,2555,0,4318177,CKB +Matthias,Addilyn,2022-03-09 01:53:00,2022-03-09 02:00:00,Ari,2577,9,4318177,CKB +Ruby,Ari,2022-03-09 02:09:00,2022-03-09 02:24:00,Kobe,5937,9,4318177,CKB +Ruby,Kobe,2022-03-09 02:33:00,2022-03-09 02:47:00,Ari,6.19,0,4318177,CKB +Matthias,Ari,2022-03-09 02:47:00,2022-03-09 02:53:00,Addilyn,2555,0,4318177,CKB +Matthias,Addilyn,2022-03-09 02:53:00,2022-03-09 03:00:00,Ari,2577,9,4318177,CKB +Ruby,Ari,2022-03-09 03:09:00,2022-03-09 03:24:00,Kobe,5937,9,4318177,CKB +Ruby,Kobe,2022-03-09 03:33:00,2022-03-09 03:47:00,Ari,6.19,0,4318177,CKB +Matthias,Ari,2022-03-09 03:47:00,2022-03-09 03:53:00,Addilyn,2555,0,4318177,CKB +Matthias,Addilyn,2022-03-09 03:53:00,2022-03-09 04:00:00,Ari,2577,9,4318177,CKB +Ruby,Ari,2022-03-09 04:09:00,2022-03-09 04:24:00,Kobe,5937,0,4318177,CKB +Ruby,Kobe,2022-03-09 04:24:00,2022-03-09 04:24:00,Beckham,0.06,0,4318177,CKB +Rosie,Beckham,2022-03-09 00:57:00,2022-03-09 00:57:00,Lexi,0.06,0,4319352,CKB +Rosie,Lexi,2022-03-09 00:57:00,2022-03-09 01:06:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 01:06:00,2022-03-09 01:11:00,Lexi,2936,16,4319352,CKB +Rosie,Lexi,2022-03-09 01:27:00,2022-03-09 01:36:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 01:36:00,2022-03-09 01:41:00,Lexi,2936,16,4319352,CKB +Rosie,Lexi,2022-03-09 01:57:00,2022-03-09 02:06:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 02:06:00,2022-03-09 02:11:00,Lexi,2936,16,4319352,CKB +Rosie,Lexi,2022-03-09 02:27:00,2022-03-09 02:36:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 02:36:00,2022-03-09 02:41:00,Lexi,2936,16,4319352,CKB +Rosie,Lexi,2022-03-09 02:57:00,2022-03-09 03:06:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 03:06:00,2022-03-09 03:11:00,Lexi,2936,16,4319352,CKB +Rosie,Lexi,2022-03-09 03:27:00,2022-03-09 03:36:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 03:36:00,2022-03-09 03:41:00,Lexi,2936,16,4319352,CKB +Rosie,Lexi,2022-03-09 03:57:00,2022-03-09 04:06:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 04:06:00,2022-03-09 04:11:00,Lexi,2936,16,4319352,CKB +Rosie,Lexi,2022-03-09 04:27:00,2022-03-09 04:36:00,Colton,4343,0,4319352,CKB +Rosie,Colton,2022-03-09 04:36:00,2022-03-09 04:36:00,Beckham,0.06,0,4319352,CKB +Daxton,Beckham,2022-03-09 00:29:00,2022-03-09 00:29:00,Harper,0.06,0,4751087,CKB +Daxton,Harper,2022-03-09 00:29:00,2022-03-09 00:41:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 00:47:00,2022-03-09 00:57:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 00:59:00,2022-03-09 01:11:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 01:17:00,2022-03-09 01:27:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 01:29:00,2022-03-09 01:41:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 01:47:00,2022-03-09 01:57:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 01:59:00,2022-03-09 02:11:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 02:17:00,2022-03-09 02:27:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 02:29:00,2022-03-09 02:41:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 02:47:00,2022-03-09 02:57:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 02:59:00,2022-03-09 03:11:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 03:17:00,2022-03-09 03:27:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 03:29:00,2022-03-09 03:41:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 03:47:00,2022-03-09 03:57:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 03:59:00,2022-03-09 04:11:00,Calvin,4481,6,4751087,CKB +Daxton,Calvin,2022-03-09 04:17:00,2022-03-09 04:27:00,Harper,4031,2,4751087,CKB +Daxton,Harper,2022-03-09 04:29:00,2022-03-09 04:41:00,Calvin,4481,0,4751087,CKB +Daxton,Calvin,2022-03-09 04:41:00,2022-03-09 04:41:00,Beckham,0.06,0,4751087,CKB +Andy,Beckham,2022-03-09 00:30:00,2022-03-09 00:30:00,Harper,0.06,0,4453545,CKB +Andy,Harper,2022-03-09 00:30:00,2022-03-09 00:44:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 00:44:00,2022-03-09 00:57:00,Harper,5302,3,4453545,CKB +Andy,Harper,2022-03-09 01:00:00,2022-03-09 01:14:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 01:14:00,2022-03-09 01:27:00,Harper,5302,3,4453545,CKB +Andy,Harper,2022-03-09 01:30:00,2022-03-09 01:44:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 01:44:00,2022-03-09 01:57:00,Harper,5302,3,4453545,CKB +Andy,Harper,2022-03-09 02:00:00,2022-03-09 02:14:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 02:14:00,2022-03-09 02:27:00,Harper,5302,3,4453545,CKB +Andy,Harper,2022-03-09 02:30:00,2022-03-09 02:44:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 02:44:00,2022-03-09 02:57:00,Harper,5302,3,4453545,CKB +Andy,Harper,2022-03-09 03:00:00,2022-03-09 03:14:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 03:14:00,2022-03-09 03:27:00,Harper,5302,3,4453545,CKB +Andy,Harper,2022-03-09 03:30:00,2022-03-09 03:44:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 03:44:00,2022-03-09 03:57:00,Harper,5302,3,4453545,CKB +Andy,Harper,2022-03-09 04:00:00,2022-03-09 04:14:00,Elise,4801,0,4453545,CKB +Andy,Elise,2022-03-09 04:14:00,2022-03-09 04:27:00,Harper,5302,0,4453545,CKB +Andy,Harper,2022-03-09 04:27:00,2022-03-09 04:27:00,Beckham,0.06,0,4453545,CKB +Alex,Beckham,2022-03-09 00:43:00,2022-03-09 00:43:00,Chase,0.06,0,4374467,CKB +Alex,Chase,2022-03-09 00:43:00,2022-03-09 01:33:00,Chase,20434,10,4374467,CKB +Alex,Chase,2022-03-09 01:43:00,2022-03-09 02:33:00,Chase,20434,10,4374467,CKB +Alex,Chase,2022-03-09 02:43:00,2022-03-09 03:33:00,Chase,20434,10,4374467,CKB +Alex,Chase,2022-03-09 03:43:00,2022-03-09 04:33:00,Chase,20434,0,4374467,CKB +Alex,Chase,2022-03-09 04:33:00,2022-03-09 04:33:00,Beckham,0.06,0,4374467,CKB +Alex,Beckham,2022-03-09 00:13:00,2022-03-09 00:13:00,Chase,0.06,0,4374472,CKB +Alex,Chase,2022-03-09 00:13:00,2022-03-09 01:03:00,Chase,20434,10,4374472,CKB +Alex,Chase,2022-03-09 01:13:00,2022-03-09 02:03:00,Chase,20434,10,4374472,CKB +Alex,Chase,2022-03-09 02:13:00,2022-03-09 03:03:00,Chase,20434,10,4374472,CKB +Alex,Chase,2022-03-09 03:13:00,2022-03-09 04:03:00,Chase,20434,0,4374472,CKB +Alex,Chase,2022-03-09 04:03:00,2022-03-09 04:03:00,Beckham,0.06,0,4374472,CKB +Hazel,Beckham,2022-03-09 00:24:00,2022-03-09 00:24:00,Celine,0.06,0,4456448,CKB +Hazel,Celine,2022-03-09 00:24:00,2022-03-09 00:48:00,Kali,11.86,4,4456448,CKB +Hazel,Kali,2022-03-09 00:52:00,2022-03-09 01:14:00,Celine,11139,10,4456448,CKB +Hazel,Celine,2022-03-09 01:24:00,2022-03-09 01:48:00,Kali,11.86,4,4456448,CKB +Hazel,Kali,2022-03-09 01:52:00,2022-03-09 02:14:00,Celine,11139,10,4456448,CKB +Hazel,Celine,2022-03-09 02:24:00,2022-03-09 02:48:00,Kali,11.86,4,4456448,CKB +Hazel,Kali,2022-03-09 02:52:00,2022-03-09 03:14:00,Celine,11139,10,4456448,CKB +Hazel,Celine,2022-03-09 03:24:00,2022-03-09 03:48:00,Kali,11.86,4,4456448,CKB +Hazel,Kali,2022-03-09 03:52:00,2022-03-09 04:14:00,Celine,11139,0,4456448,CKB +Hazel,Celine,2022-03-09 04:14:00,2022-03-09 04:14:00,Beckham,0.06,0,4456448,CKB +Hazel,Beckham,2022-03-09 00:22:00,2022-03-09 00:22:00,Kali,0.06,0,4456456,CKB +Hazel,Kali,2022-03-09 00:22:00,2022-03-09 00:44:00,Celine,11139,10,4456456,CKB +Hazel,Celine,2022-03-09 00:54:00,2022-03-09 01:18:00,Kali,11.86,4,4456456,CKB +Hazel,Kali,2022-03-09 01:22:00,2022-03-09 01:44:00,Celine,11139,10,4456456,CKB +Hazel,Celine,2022-03-09 01:54:00,2022-03-09 02:18:00,Kali,11.86,4,4456456,CKB +Hazel,Kali,2022-03-09 02:22:00,2022-03-09 02:44:00,Celine,11139,10,4456456,CKB +Hazel,Celine,2022-03-09 02:54:00,2022-03-09 03:18:00,Kali,11.86,4,4456456,CKB +Hazel,Kali,2022-03-09 03:22:00,2022-03-09 03:44:00,Celine,11139,10,4456456,CKB +Hazel,Celine,2022-03-09 03:54:00,2022-03-09 04:18:00,Kali,11.86,4,4456456,CKB +Hazel,Kali,2022-03-09 04:22:00,2022-03-09 04:44:00,Celine,11139,0,4456456,CKB +Hazel,Celine,2022-03-09 04:44:00,2022-03-09 04:44:00,Beckham,0.06,0,4456456,CKB +Emilio,Beckham,2022-03-09 00:32:00,2022-03-09 00:32:00,Rose,0.06,0,4747650,CKB +Emilio,Rose,2022-03-09 00:32:00,2022-03-09 00:44:00,Brooklynn,4212,3,4747650,CKB +Emilio,Brooklynn,2022-03-09 00:47:00,2022-03-09 01:16:00,Francis,13048,0,4747650,CKB +Emilio,Francis,2022-03-09 01:16:00,2022-03-09 01:42:00,Brooklynn,12869,5,4747650,CKB +Emilio,Brooklynn,2022-03-09 01:47:00,2022-03-09 02:16:00,Francis,13048,0,4747650,CKB +Emilio,Francis,2022-03-09 02:16:00,2022-03-09 02:42:00,Brooklynn,12869,5,4747650,CKB +Emilio,Brooklynn,2022-03-09 02:47:00,2022-03-09 03:16:00,Francis,13048,0,4747650,CKB +Emilio,Francis,2022-03-09 03:16:00,2022-03-09 03:42:00,Brooklynn,12869,5,4747650,CKB +Emilio,Brooklynn,2022-03-09 03:47:00,2022-03-09 04:16:00,Francis,13048,0,4747650,CKB +Emilio,Francis,2022-03-09 04:16:00,2022-03-09 04:34:00,Gia,9538,0,4747650,CKB +Emilio,Gia,2022-03-09 04:34:00,2022-03-09 04:34:00,Beckham,0.06,0,4747650,CKB +Emilio,Beckham,2022-03-09 00:17:00,2022-03-09 00:17:00,Brooklynn,0.06,0,4747660,CKB +Emilio,Brooklynn,2022-03-09 00:17:00,2022-03-09 00:46:00,Francis,13048,0,4747660,CKB +Emilio,Francis,2022-03-09 00:46:00,2022-03-09 01:12:00,Brooklynn,12869,5,4747660,CKB +Emilio,Brooklynn,2022-03-09 01:17:00,2022-03-09 01:46:00,Francis,13048,0,4747660,CKB +Emilio,Francis,2022-03-09 01:46:00,2022-03-09 02:12:00,Brooklynn,12869,5,4747660,CKB +Emilio,Brooklynn,2022-03-09 02:17:00,2022-03-09 02:46:00,Francis,13048,0,4747660,CKB +Emilio,Francis,2022-03-09 02:46:00,2022-03-09 03:12:00,Brooklynn,12869,5,4747660,CKB +Emilio,Brooklynn,2022-03-09 03:17:00,2022-03-09 03:46:00,Francis,13048,0,4747660,CKB +Emilio,Francis,2022-03-09 03:46:00,2022-03-09 04:12:00,Brooklynn,12869,5,4747660,CKB +Emilio,Brooklynn,2022-03-09 04:17:00,2022-03-09 04:28:00,Rose,4316,0,4747660,CKB +Emilio,Rose,2022-03-09 04:28:00,2022-03-09 04:28:00,Beckham,0.06,0,4747660,CKB +Ryder,Beckham,2022-03-09 00:49:00,2022-03-09 00:49:00,Kehlani,0.06,0,4434341,CKB +Ryder,Kehlani,2022-03-09 00:49:00,2022-03-09 01:04:00,Ariyah,10229,0,4434341,CKB +Ryder,Ariyah,2022-03-09 01:04:00,2022-03-09 01:19:00,Kehlani,11801,0,4434341,CKB +Ryder,Kehlani,2022-03-09 01:19:00,2022-03-09 01:34:00,Ariyah,10229,0,4434341,CKB +Ryder,Ariyah,2022-03-09 01:34:00,2022-03-09 01:49:00,Kehlani,11801,0,4434341,CKB +Ryder,Kehlani,2022-03-09 01:49:00,2022-03-09 02:04:00,Ariyah,10229,0,4434341,CKB +Ryder,Ariyah,2022-03-09 02:04:00,2022-03-09 02:19:00,Kehlani,11801,0,4434341,CKB +Ryder,Kehlani,2022-03-09 02:19:00,2022-03-09 02:34:00,Ariyah,10229,0,4434341,CKB +Ryder,Ariyah,2022-03-09 02:34:00,2022-03-09 02:49:00,Kehlani,11801,0,4434341,CKB +Ryder,Kehlani,2022-03-09 02:49:00,2022-03-09 03:04:00,Ariyah,10229,0,4434341,CKB +Ryder,Ariyah,2022-03-09 03:04:00,2022-03-09 03:19:00,Kehlani,11801,0,4434341,CKB +Ryder,Kehlani,2022-03-09 03:19:00,2022-03-09 03:34:00,Ariyah,10229,0,4434341,CKB +Ryder,Ariyah,2022-03-09 03:34:00,2022-03-09 03:49:00,Kehlani,11801,0,4434341,CKB +Ryder,Kehlani,2022-03-09 03:49:00,2022-03-09 04:04:00,Ariyah,10229,0,4434341,CKB +Ryder,Ariyah,2022-03-09 04:04:00,2022-03-09 04:19:00,Kehlani,11801,23,4434341,CKB +Kian,Kehlani,2022-03-09 04:42:00,2022-03-09 05:04:00,Finley,6.81,0,4434341,CKB +Kian,Finley,2022-03-09 05:04:00,2022-03-09 05:04:00,Beckham,0.06,0,4434341,CKB +Jake,Beckham,2022-03-09 00:32:00,2022-03-09 00:32:00,Rose,0.06,0,4434897,CKB +Jake,Rose,2022-03-09 00:32:00,2022-03-09 00:57:00,Kamila,11545,6,4434897,CKB +Jake,Kamila,2022-03-09 01:03:00,2022-03-09 01:46:00,Kayleigh,20579,1,4434897,CKB +Jake,Kayleigh,2022-03-09 01:47:00,2022-03-09 02:25:00,Kamila,20641,8,4434897,CKB +Jake,Kamila,2022-03-09 02:33:00,2022-03-09 03:16:00,Kayleigh,20579,1,4434897,CKB +Jake,Kayleigh,2022-03-09 03:17:00,2022-03-09 03:55:00,Kamila,20641,8,4434897,CKB +Jake,Kamila,2022-03-09 04:03:00,2022-03-09 04:28:00,Rose,11499,0,4434897,CKB +Jake,Rose,2022-03-09 04:28:00,2022-03-09 04:28:00,Beckham,0.06,0,4434897,CKB +Jake,Beckham,2022-03-09 00:33:00,2022-03-09 00:33:00,Kamila,0.06,0,4434902,CKB +Jake,Kamila,2022-03-09 00:33:00,2022-03-09 01:16:00,Kayleigh,20579,1,4434902,CKB +Jake,Kayleigh,2022-03-09 01:17:00,2022-03-09 01:55:00,Kamila,20641,8,4434902,CKB +Jake,Kamila,2022-03-09 02:03:00,2022-03-09 02:46:00,Kayleigh,20579,1,4434902,CKB +Jake,Kayleigh,2022-03-09 02:47:00,2022-03-09 03:25:00,Kamila,20641,8,4434902,CKB +Jake,Kamila,2022-03-09 03:33:00,2022-03-09 04:16:00,Kayleigh,20579,1,4434902,CKB +Jake,Kayleigh,2022-03-09 04:17:00,2022-03-09 04:51:00,Willa,18752,0,4434902,CKB +Jake,Willa,2022-03-09 04:51:00,2022-03-09 04:51:00,Beckham,0.06,0,4434902,CKB +Aziel,Beckham,2022-03-09 00:34:00,2022-03-09 00:34:00,Miles,0.06,0,4619766,CKB +Aziel,Miles,2022-03-09 00:34:00,2022-03-09 01:00:00,Delilah,9016,0,4619766,CKB +Aziel,Delilah,2022-03-09 01:00:00,2022-03-09 01:27:00,Miles,10083,7,4619766,CKB +Aziel,Miles,2022-03-09 01:34:00,2022-03-09 02:00:00,Delilah,9016,0,4619766,CKB +Aziel,Delilah,2022-03-09 02:00:00,2022-03-09 02:27:00,Miles,10083,7,4619766,CKB +Aziel,Miles,2022-03-09 02:34:00,2022-03-09 03:00:00,Delilah,9016,0,4619766,CKB +Aziel,Delilah,2022-03-09 03:00:00,2022-03-09 03:27:00,Miles,10083,7,4619766,CKB +Aziel,Miles,2022-03-09 03:34:00,2022-03-09 04:00:00,Delilah,9016,0,4619766,CKB +Aziel,Delilah,2022-03-09 04:00:00,2022-03-09 04:27:00,Miles,10083,0,4619766,CKB +Aziel,Miles,2022-03-09 04:27:00,2022-03-09 04:27:00,Beckham,0.06,0,4619766,CKB +Aziel,Beckham,2022-03-09 00:30:00,2022-03-09 00:30:00,Delilah,0.06,0,4619991,CKB +Aziel,Delilah,2022-03-09 00:30:00,2022-03-09 00:57:00,Miles,10083,7,4619991,CKB +Aziel,Miles,2022-03-09 01:04:00,2022-03-09 01:30:00,Delilah,9016,0,4619991,CKB +Aziel,Delilah,2022-03-09 01:30:00,2022-03-09 01:57:00,Miles,10083,7,4619991,CKB +Aziel,Miles,2022-03-09 02:04:00,2022-03-09 02:30:00,Delilah,9016,0,4619991,CKB +Aziel,Delilah,2022-03-09 02:30:00,2022-03-09 02:57:00,Miles,10083,7,4619991,CKB +Aziel,Miles,2022-03-09 03:04:00,2022-03-09 03:30:00,Delilah,9016,0,4619991,CKB +Aziel,Delilah,2022-03-09 03:30:00,2022-03-09 03:57:00,Miles,10083,7,4619991,CKB +Aziel,Miles,2022-03-09 04:04:00,2022-03-09 04:30:00,Delilah,9016,0,4619991,CKB +Aziel,Delilah,2022-03-09 04:30:00,2022-03-09 04:57:00,Miles,10083,0,4619991,CKB +Aziel,Miles,2022-03-09 04:57:00,2022-03-09 04:57:00,Beckham,0.06,0,4619991,CKB +Dalton,Beckham,2022-03-09 00:31:00,2022-03-09 00:31:00,Kamila,0.06,0,4374744,CKB +Dalton,Kamila,2022-03-09 00:31:00,2022-03-09 00:44:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 00:44:00,2022-03-09 00:56:00,Kamila,5362,5,4374744,CKB +Dalton,Kamila,2022-03-09 01:01:00,2022-03-09 01:14:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 01:14:00,2022-03-09 01:26:00,Kamila,5362,5,4374744,CKB +Dalton,Kamila,2022-03-09 01:31:00,2022-03-09 01:44:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 01:44:00,2022-03-09 01:56:00,Kamila,5362,5,4374744,CKB +Dalton,Kamila,2022-03-09 02:01:00,2022-03-09 02:14:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 02:14:00,2022-03-09 02:26:00,Kamila,5362,5,4374744,CKB +Dalton,Kamila,2022-03-09 02:31:00,2022-03-09 02:44:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 02:44:00,2022-03-09 02:56:00,Kamila,5362,5,4374744,CKB +Dalton,Kamila,2022-03-09 03:01:00,2022-03-09 03:14:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 03:14:00,2022-03-09 03:26:00,Kamila,5362,5,4374744,CKB +Dalton,Kamila,2022-03-09 03:31:00,2022-03-09 03:44:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 03:44:00,2022-03-09 03:56:00,Kamila,5362,5,4374744,CKB +Dalton,Kamila,2022-03-09 04:01:00,2022-03-09 04:14:00,Veronica,4872,0,4374744,CKB +Dalton,Veronica,2022-03-09 04:14:00,2022-03-09 04:26:00,Kamila,5362,0,4374744,CKB +Dalton,Kamila,2022-03-09 04:26:00,2022-03-09 04:26:00,Beckham,0.06,0,4374744,CKB +Jamison,Beckham,2022-03-09 00:31:00,2022-03-09 00:31:00,Kamila,0.06,0,4374866,CKB +Jamison,Kamila,2022-03-09 00:31:00,2022-03-09 00:45:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 00:47:00,2022-03-09 01:01:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 01:01:00,2022-03-09 01:15:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 01:17:00,2022-03-09 01:31:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 01:31:00,2022-03-09 01:45:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 01:47:00,2022-03-09 02:01:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 02:01:00,2022-03-09 02:15:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 02:17:00,2022-03-09 02:31:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 02:31:00,2022-03-09 02:45:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 02:47:00,2022-03-09 03:01:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 03:01:00,2022-03-09 03:15:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 03:17:00,2022-03-09 03:31:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 03:31:00,2022-03-09 03:45:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 03:47:00,2022-03-09 04:01:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 04:01:00,2022-03-09 04:15:00,Liana,5225,2,4374866,CKB +Jamison,Liana,2022-03-09 04:17:00,2022-03-09 04:31:00,Kamila,7617,0,4374866,CKB +Jamison,Kamila,2022-03-09 04:31:00,2022-03-09 04:31:00,Beckham,0.06,0,4374866,CKB +Keegan,Beckham,2022-03-09 00:43:00,2022-03-09 00:43:00,Charleigh,0.06,0,4375013,CKB +Keegan,Charleigh,2022-03-09 00:43:00,2022-03-09 00:53:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 00:53:00,2022-03-09 01:03:00,Charleigh,4408,10,4375013,CKB +Keegan,Charleigh,2022-03-09 01:13:00,2022-03-09 01:23:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 01:23:00,2022-03-09 01:33:00,Charleigh,4408,10,4375013,CKB +Keegan,Charleigh,2022-03-09 01:43:00,2022-03-09 01:53:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 01:53:00,2022-03-09 02:03:00,Charleigh,4408,10,4375013,CKB +Keegan,Charleigh,2022-03-09 02:13:00,2022-03-09 02:23:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 02:23:00,2022-03-09 02:33:00,Charleigh,4408,10,4375013,CKB +Keegan,Charleigh,2022-03-09 02:43:00,2022-03-09 02:53:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 02:53:00,2022-03-09 03:03:00,Charleigh,4408,10,4375013,CKB +Keegan,Charleigh,2022-03-09 03:13:00,2022-03-09 03:23:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 03:23:00,2022-03-09 03:33:00,Charleigh,4408,10,4375013,CKB +Keegan,Charleigh,2022-03-09 03:43:00,2022-03-09 03:53:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 03:53:00,2022-03-09 04:03:00,Charleigh,4408,10,4375013,CKB +Keegan,Charleigh,2022-03-09 04:13:00,2022-03-09 04:23:00,Eli,4507,0,4375013,CKB +Keegan,Eli,2022-03-09 04:23:00,2022-03-09 04:33:00,Charleigh,4408,0,4375013,CKB +Keegan,Charleigh,2022-03-09 04:33:00,2022-03-09 04:33:00,Beckham,0.06,0,4375013,CKB +Ayaan,Beckham,2022-03-09 21:31:00,2022-03-09 21:31:00,Kalani,0.06,0,4454945,CKB +Ayaan,Kalani,2022-03-09 21:31:00,2022-03-09 22:04:00,Brian,14519,4,4454945,CKB +Ayaan,Brian,2022-03-09 22:08:00,2022-03-09 22:43:00,Kalani,13541,8,4454945,CKB +Ayaan,Kalani,2022-03-09 22:51:00,2022-03-09 23:24:00,Brian,14519,4,4454945,CKB +Ayaan,Brian,2022-03-09 23:28:00,2022-03-10 00:03:00,Kalani,13541,8,4454945,CKB +Ayaan,Kalani,2022-03-10 00:11:00,2022-03-10 00:44:00,Brian,14519,0,4454945,CKB +Hunter,Brian,2022-03-10 00:44:00,2022-03-10 00:54:00,Kehlani,4.1,25,4454945,CKB +Hunter,Kehlani,2022-03-10 01:19:00,2022-03-10 01:42:00,Ayden,8.36,6,4454945,CKB +Hunter,Ayden,2022-03-10 01:48:00,2022-03-10 02:06:00,Kehlani,9067,13,4454945,CKB +Hunter,Kehlani,2022-03-10 02:19:00,2022-03-10 02:42:00,Ayden,8.36,6,4454945,CKB +Hunter,Ayden,2022-03-10 02:48:00,2022-03-10 03:06:00,Kehlani,9067,13,4454945,CKB +Hunter,Kehlani,2022-03-10 03:19:00,2022-03-10 03:42:00,Ayden,8.36,6,4454945,CKB +Hunter,Ayden,2022-03-10 03:48:00,2022-03-10 04:06:00,Kehlani,9067,0,4454945,CKB +Hunter,Kehlani,2022-03-10 04:06:00,2022-03-10 04:06:00,Beckham,0.06,0,4454945,CKB +Ayaan,Beckham,2022-03-09 22:11:00,2022-03-09 22:11:00,Kalani,0.06,0,4454950,CKB +Ayaan,Kalani,2022-03-09 22:11:00,2022-03-09 22:44:00,Brian,14519,4,4454950,CKB +Ayaan,Brian,2022-03-09 22:48:00,2022-03-09 23:23:00,Kalani,13541,8,4454950,CKB +Ayaan,Kalani,2022-03-09 23:31:00,2022-03-10 00:04:00,Brian,14519,4,4454950,CKB +Ayaan,Brian,2022-03-10 00:08:00,2022-03-10 00:39:00,Leonel,12213,0,4454950,CKB +Hunter,Leonel,2022-03-10 00:39:00,2022-03-10 00:47:00,Kehlani,4.0,2,4454950,CKB +Hunter,Kehlani,2022-03-10 00:49:00,2022-03-10 01:12:00,Ayden,8.36,6,4454950,CKB +Hunter,Ayden,2022-03-10 01:18:00,2022-03-10 01:36:00,Kehlani,9067,13,4454950,CKB +Hunter,Kehlani,2022-03-10 01:49:00,2022-03-10 02:12:00,Ayden,8.36,6,4454950,CKB +Hunter,Ayden,2022-03-10 02:18:00,2022-03-10 02:36:00,Kehlani,9067,13,4454950,CKB +Hunter,Kehlani,2022-03-10 02:49:00,2022-03-10 03:12:00,Ayden,8.36,6,4454950,CKB +Hunter,Ayden,2022-03-10 03:18:00,2022-03-10 03:36:00,Kehlani,9067,13,4454950,CKB +Hunter,Kehlani,2022-03-10 03:49:00,2022-03-10 04:12:00,Ayden,8.36,0,4454950,CKB +Hunter,Ayden,2022-03-10 04:12:00,2022-03-10 04:12:00,Beckham,0.06,0,4454950,CKB +Donovan,Beckham,2022-03-09 21:06:00,2022-03-09 21:06:00,Pierce,0.06,0,4664624,CKB +Donovan,Pierce,2022-03-09 21:06:00,2022-03-09 21:34:00,Leonardo,13018,19,4664624,CKB +Donovan,Leonardo,2022-03-09 21:53:00,2022-03-09 22:13:00,Kamryn,10332,17,4664624,CKB +Donovan,Kamryn,2022-03-09 22:30:00,2022-03-09 22:54:00,Leonardo,10.48,19,4664624,CKB +Donovan,Leonardo,2022-03-09 23:13:00,2022-03-09 23:33:00,Kamryn,10332,17,4664624,CKB +Donovan,Kamryn,2022-03-09 23:50:00,2022-03-10 00:14:00,Leonardo,10.48,2,4664624,CKB +Donovan,Leonardo,2022-03-10 00:16:00,2022-03-10 00:23:00,Melanie,3709,5,4664624,CKB +Zoey,Melanie,2022-03-10 00:28:00,2022-03-10 00:44:00,Brinley,6404,3,4664624,CKB +Zoey,Brinley,2022-03-10 00:47:00,2022-03-10 01:10:00,Finn,10579,7,4664624,CKB +Zoey,Finn,2022-03-10 01:17:00,2022-03-10 01:44:00,Brinley,12007,3,4664624,CKB +Zoey,Brinley,2022-03-10 01:47:00,2022-03-10 02:10:00,Finn,10579,7,4664624,CKB +Zoey,Finn,2022-03-10 02:17:00,2022-03-10 02:44:00,Brinley,12007,3,4664624,CKB +Zoey,Brinley,2022-03-10 02:47:00,2022-03-10 03:10:00,Finn,10579,7,4664624,CKB +Zoey,Finn,2022-03-10 03:17:00,2022-03-10 03:44:00,Brinley,12007,3,4664624,CKB +Zoey,Brinley,2022-03-10 03:47:00,2022-03-10 04:10:00,Finn,10579,7,4664624,CKB +Zoey,Finn,2022-03-10 04:17:00,2022-03-10 04:44:00,Brinley,12007,0,4664624,CKB +Zoey,Brinley,2022-03-10 04:44:00,2022-03-10 04:44:00,Beckham,0.06,0,4664624,CKB +Donovan,Beckham,2022-03-09 20:26:00,2022-03-09 20:26:00,Pierce,0.06,0,4762734,CKB +Donovan,Pierce,2022-03-09 20:26:00,2022-03-09 20:56:00,Ezra,14097,14,4762734,CKB +Donovan,Ezra,2022-03-09 21:10:00,2022-03-09 21:38:00,Pierce,13.19,8,4762734,CKB +Donovan,Pierce,2022-03-09 21:46:00,2022-03-09 22:14:00,Leonardo,13018,19,4762734,CKB +Donovan,Leonardo,2022-03-09 22:33:00,2022-03-09 22:53:00,Kamryn,10332,17,4762734,CKB +Donovan,Kamryn,2022-03-09 23:10:00,2022-03-09 23:34:00,Leonardo,10.48,19,4762734,CKB +Donovan,Leonardo,2022-03-09 23:53:00,2022-03-10 00:13:00,Kamryn,10332,2,4762734,CKB +Donovan,Kamryn,2022-03-10 00:15:00,2022-03-10 00:16:00,Brinley,506,1,4762734,CKB +Zoey,Brinley,2022-03-10 00:17:00,2022-03-10 00:40:00,Finn,10579,7,4762734,CKB +Zoey,Finn,2022-03-10 00:47:00,2022-03-10 01:14:00,Brinley,12007,3,4762734,CKB +Zoey,Brinley,2022-03-10 01:17:00,2022-03-10 01:40:00,Finn,10579,7,4762734,CKB +Zoey,Finn,2022-03-10 01:47:00,2022-03-10 02:14:00,Brinley,12007,3,4762734,CKB +Zoey,Brinley,2022-03-10 02:17:00,2022-03-10 02:40:00,Finn,10579,7,4762734,CKB +Zoey,Finn,2022-03-10 02:47:00,2022-03-10 03:14:00,Brinley,12007,3,4762734,CKB +Zoey,Brinley,2022-03-10 03:17:00,2022-03-10 03:40:00,Finn,10579,7,4762734,CKB +Zoey,Finn,2022-03-10 03:47:00,2022-03-10 04:14:00,Brinley,12007,3,4762734,CKB +Zoey,Brinley,2022-03-10 04:17:00,2022-03-10 04:40:00,Finn,10579,3,4762734,CKB +Jackson,Finn,2022-03-10 04:43:00,2022-03-10 04:58:00,Rose,6161,0,4762734,CKB +Jackson,Rose,2022-03-10 04:58:00,2022-03-10 04:58:00,Beckham,0.06,0,4762734,CKB +Avery,Beckham,2022-03-09 22:56:00,2022-03-09 22:56:00,Jace,0.06,0,4617415,CKB +Avery,Jace,2022-03-09 22:56:00,2022-03-09 23:08:00,Nathan,5882,3,4617415,CKB +Avery,Nathan,2022-03-09 23:11:00,2022-03-09 23:25:00,Jace,6232,0,4617415,CKB +Avery,Jace,2022-03-09 23:25:00,2022-03-09 23:38:00,Nathan,6086,3,4617415,CKB +Avery,Nathan,2022-03-09 23:41:00,2022-03-09 23:55:00,Jace,6232,0,4617415,CKB +Avery,Jace,2022-03-09 23:55:00,2022-03-10 00:08:00,Nathan,6086,0,4617415,CKB +Avery,Nathan,2022-03-10 00:08:00,2022-03-10 00:08:00,Beckham,0.06,0,4617415,CKB +Richard,Beckham,2022-03-09 05:05:00,2022-03-09 05:05:00,Ariyah,0.06,0,4426846,CKB +Richard,Ariyah,2022-03-09 05:05:00,2022-03-09 05:14:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 05:14:00,2022-03-09 05:23:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 05:25:00,2022-03-09 05:34:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 05:34:00,2022-03-09 05:43:00,Ariyah,5139,23,4426846,CKB +Richard,Ariyah,2022-03-09 06:06:00,2022-03-09 06:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 06:15:00,2022-03-09 06:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 06:26:00,2022-03-09 06:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 06:35:00,2022-03-09 06:44:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 06:46:00,2022-03-09 06:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 06:55:00,2022-03-09 07:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 07:06:00,2022-03-09 07:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 07:15:00,2022-03-09 07:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 07:26:00,2022-03-09 07:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 07:35:00,2022-03-09 07:44:00,Ariyah,5139,22,4426846,CKB +Richard,Ariyah,2022-03-09 08:06:00,2022-03-09 08:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 08:15:00,2022-03-09 08:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 08:26:00,2022-03-09 08:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 08:35:00,2022-03-09 08:44:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 08:46:00,2022-03-09 08:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 08:55:00,2022-03-09 09:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 09:06:00,2022-03-09 09:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 09:15:00,2022-03-09 09:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 09:26:00,2022-03-09 09:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 09:35:00,2022-03-09 09:44:00,Ariyah,5139,22,4426846,CKB +Richard,Ariyah,2022-03-09 10:06:00,2022-03-09 10:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 10:15:00,2022-03-09 10:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 10:26:00,2022-03-09 10:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 10:35:00,2022-03-09 10:44:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 10:46:00,2022-03-09 10:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 10:55:00,2022-03-09 11:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 11:06:00,2022-03-09 11:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 11:15:00,2022-03-09 11:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 11:26:00,2022-03-09 11:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 11:35:00,2022-03-09 11:44:00,Ariyah,5139,22,4426846,CKB +Richard,Ariyah,2022-03-09 12:06:00,2022-03-09 12:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 12:15:00,2022-03-09 12:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 12:26:00,2022-03-09 12:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 12:35:00,2022-03-09 12:44:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 12:46:00,2022-03-09 12:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 12:55:00,2022-03-09 13:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 13:06:00,2022-03-09 13:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 13:15:00,2022-03-09 13:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 13:26:00,2022-03-09 13:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 13:35:00,2022-03-09 13:44:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 13:46:00,2022-03-09 13:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 13:55:00,2022-03-09 14:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 14:06:00,2022-03-09 14:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 14:15:00,2022-03-09 14:24:00,Ariyah,5139,22,4426846,CKB +Richard,Ariyah,2022-03-09 14:46:00,2022-03-09 14:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 14:55:00,2022-03-09 15:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 15:06:00,2022-03-09 15:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 15:15:00,2022-03-09 15:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 15:26:00,2022-03-09 15:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 15:35:00,2022-03-09 15:44:00,Ariyah,5139,22,4426846,CKB +Richard,Ariyah,2022-03-09 16:06:00,2022-03-09 16:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 16:15:00,2022-03-09 16:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 16:26:00,2022-03-09 16:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 16:35:00,2022-03-09 16:44:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 16:46:00,2022-03-09 16:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 16:55:00,2022-03-09 17:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 17:06:00,2022-03-09 17:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 17:15:00,2022-03-09 17:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 17:26:00,2022-03-09 17:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 17:35:00,2022-03-09 17:44:00,Ariyah,5139,22,4426846,CKB +Richard,Ariyah,2022-03-09 18:06:00,2022-03-09 18:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 18:15:00,2022-03-09 18:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 18:26:00,2022-03-09 18:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 18:35:00,2022-03-09 18:44:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 18:46:00,2022-03-09 18:55:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 18:55:00,2022-03-09 19:04:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 19:06:00,2022-03-09 19:15:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 19:15:00,2022-03-09 19:24:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 19:26:00,2022-03-09 19:35:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 19:35:00,2022-03-09 19:44:00,Ariyah,5139,21,4426846,CKB +Richard,Ariyah,2022-03-09 20:05:00,2022-03-09 20:14:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 20:14:00,2022-03-09 20:23:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 20:25:00,2022-03-09 20:34:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 20:34:00,2022-03-09 20:43:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 20:45:00,2022-03-09 20:54:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 20:54:00,2022-03-09 21:03:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 21:05:00,2022-03-09 21:14:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 21:14:00,2022-03-09 21:23:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 21:25:00,2022-03-09 21:34:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 21:34:00,2022-03-09 21:43:00,Ariyah,5139,22,4426846,CKB +Richard,Ariyah,2022-03-09 22:05:00,2022-03-09 22:14:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 22:14:00,2022-03-09 22:23:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 22:25:00,2022-03-09 22:34:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 22:34:00,2022-03-09 22:43:00,Ariyah,5139,2,4426846,CKB +Richard,Ariyah,2022-03-09 22:45:00,2022-03-09 22:54:00,Jaden,4781,0,4426846,CKB +Richard,Jaden,2022-03-09 22:54:00,2022-03-09 23:03:00,Ariyah,5139,0,4426846,CKB +Richard,Ariyah,2022-03-09 23:03:00,2022-03-09 23:03:00,Beckham,0.06,0,4426846,CKB +Ezekiel,Beckham,2022-03-10 00:06:00,2022-03-10 00:06:00,Erik,0.06,0,4708596,CKB +Ezekiel,Erik,2022-03-10 00:06:00,2022-03-10 00:27:00,Memphis,7827,0,4708596,CKB +Jake,Memphis,2022-03-10 00:27:00,2022-03-10 00:48:00,Kayleigh,11079,0,4708596,CKB +Jake,Kayleigh,2022-03-10 00:48:00,2022-03-10 01:25:00,Kamila,20641,8,4708596,CKB +Jake,Kamila,2022-03-10 01:33:00,2022-03-10 02:16:00,Kayleigh,20579,1,4708596,CKB +Jake,Kayleigh,2022-03-10 02:17:00,2022-03-10 02:55:00,Kamila,20641,8,4708596,CKB +Jake,Kamila,2022-03-10 03:03:00,2022-03-10 03:46:00,Kayleigh,20579,1,4708596,CKB +Jake,Kayleigh,2022-03-10 03:47:00,2022-03-10 04:25:00,Kamila,20641,0,4708596,CKB +Jake,Kamila,2022-03-10 04:25:00,2022-03-10 04:25:00,Beckham,0.06,0,4708596,CKB +Astrid,King,2022-03-09 05:15:00,2022-03-09 06:01:00,Brayden,17.9,0,4317626,VDL +Astrid,Brayden,2022-03-09 06:01:00,2022-03-09 06:15:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 06:23:00,2022-03-09 06:37:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 06:41:00,2022-03-09 06:55:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 07:03:00,2022-03-09 07:17:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 07:21:00,2022-03-09 07:35:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 07:43:00,2022-03-09 07:57:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 08:01:00,2022-03-09 08:15:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 08:23:00,2022-03-09 08:37:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 08:41:00,2022-03-09 08:55:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 09:03:00,2022-03-09 09:17:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 09:21:00,2022-03-09 09:35:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 09:43:00,2022-03-09 09:57:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 10:01:00,2022-03-09 10:15:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 10:23:00,2022-03-09 10:37:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 10:41:00,2022-03-09 10:55:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 11:03:00,2022-03-09 11:17:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 11:21:00,2022-03-09 11:35:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 11:43:00,2022-03-09 11:57:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 12:01:00,2022-03-09 12:15:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 12:23:00,2022-03-09 12:37:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 12:41:00,2022-03-09 12:55:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 13:03:00,2022-03-09 13:17:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 13:21:00,2022-03-09 13:35:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 13:43:00,2022-03-09 13:57:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 14:01:00,2022-03-09 14:15:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 14:23:00,2022-03-09 14:37:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 14:41:00,2022-03-09 14:55:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 15:03:00,2022-03-09 15:17:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 15:21:00,2022-03-09 15:35:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 15:43:00,2022-03-09 15:57:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 16:01:00,2022-03-09 16:15:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 16:23:00,2022-03-09 16:37:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 16:41:00,2022-03-09 16:55:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 17:03:00,2022-03-09 17:17:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 17:21:00,2022-03-09 17:35:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 17:43:00,2022-03-09 17:57:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 18:01:00,2022-03-09 18:15:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 18:23:00,2022-03-09 18:37:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 18:41:00,2022-03-09 18:55:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 19:03:00,2022-03-09 19:17:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 19:21:00,2022-03-09 19:35:00,Brayden,4637,8,4317626,VDL +Astrid,Brayden,2022-03-09 19:43:00,2022-03-09 19:57:00,Brayden,4637,4,4317626,VDL +Astrid,Brayden,2022-03-09 20:01:00,2022-03-09 20:14:00,Brayden,4637,9,4317626,VDL +Astrid,Brayden,2022-03-09 20:23:00,2022-03-09 20:36:00,Brayden,4637,0,4317626,VDL +Astrid,Brayden,2022-03-09 20:36:00,2022-03-09 21:15:00,King,19.8,0,4317626,VDL +Amy,Beckham,2022-03-09 04:56:00,2022-03-09 04:56:00,Izabella,0.06,18,4425669,CKB +Amy,Izabella,2022-03-09 05:14:00,2022-03-09 05:20:00,Tristan,3.29,0,4425669,CKB +Amy,Tristan,2022-03-09 05:20:00,2022-03-09 05:24:00,Izabella,2954,20,4425669,CKB +Amy,Izabella,2022-03-09 05:44:00,2022-03-09 05:50:00,Tristan,3.29,0,4425669,CKB +Amy,Tristan,2022-03-09 05:50:00,2022-03-09 05:54:00,Izabella,2954,5,4425669,CKB +Amy,Izabella,2022-03-09 05:59:00,2022-03-09 06:06:00,Tristan,3.29,2,4425669,CKB +Amy,Tristan,2022-03-09 06:08:00,2022-03-09 06:13:00,Izabella,2954,19,4425669,CKB +Amy,Izabella,2022-03-09 06:32:00,2022-03-09 06:39:00,Tristan,3.29,1,4425669,CKB +Amy,Tristan,2022-03-09 06:40:00,2022-03-09 06:45:00,Izabella,2954,7,4425669,CKB +Amy,Izabella,2022-03-09 06:52:00,2022-03-09 06:59:00,Tristan,3.29,1,4425669,CKB +Amy,Tristan,2022-03-09 07:00:00,2022-03-09 07:05:00,Izabella,2954,7,4425669,CKB +Amy,Izabella,2022-03-09 07:12:00,2022-03-09 07:19:00,Tristan,3.29,1,4425669,CKB +Amy,Tristan,2022-03-09 07:20:00,2022-03-09 07:25:00,Izabella,2954,7,4425669,CKB +Amy,Izabella,2022-03-09 07:32:00,2022-03-09 07:39:00,Tristan,3.29,1,4425669,CKB +Amy,Tristan,2022-03-09 07:40:00,2022-03-09 07:45:00,Izabella,2954,295,4425669,CKB +Amy,Izabella,2022-03-09 12:40:00,2022-03-09 12:47:00,Tristan,3.29,2,4425669,CKB +Amy,Tristan,2022-03-09 12:49:00,2022-03-09 12:54:00,Izabella,2954,46,4425669,CKB +Amy,Izabella,2022-03-09 13:40:00,2022-03-09 13:47:00,Tristan,3.29,2,4425669,CKB +Amy,Tristan,2022-03-09 13:49:00,2022-03-09 13:54:00,Izabella,2954,434,4425669,CKB +Amy,Izabella,2022-03-09 21:08:00,2022-03-09 21:08:00,Beckham,0.06,0,4425669,CKB +Matilda,Beckham,2022-03-09 07:20:00,2022-03-09 07:20:00,Izaiah,0.06,0,4448151,CKB +Matilda,Izaiah,2022-03-09 07:20:00,2022-03-09 07:50:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 08:00:00,2022-03-09 08:30:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 08:40:00,2022-03-09 09:10:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 09:20:00,2022-03-09 09:50:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 10:00:00,2022-03-09 10:30:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 10:40:00,2022-03-09 11:10:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 11:20:00,2022-03-09 11:50:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 12:00:00,2022-03-09 12:30:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 12:40:00,2022-03-09 13:10:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 13:20:00,2022-03-09 13:50:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 14:00:00,2022-03-09 14:30:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 14:40:00,2022-03-09 15:10:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 15:20:00,2022-03-09 15:50:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 16:00:00,2022-03-09 16:30:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 16:40:00,2022-03-09 17:10:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 17:20:00,2022-03-09 17:50:00,Izaiah,9266,10,4448151,CKB +Matilda,Izaiah,2022-03-09 18:00:00,2022-03-09 18:30:00,Izaiah,9266,0,4448151,CKB +Matilda,Izaiah,2022-03-09 18:30:00,2022-03-09 18:30:00,Beckham,0.06,0,4448151,CKB +Hailey,Beckham,2022-03-09 07:10:00,2022-03-09 07:10:00,Kaylani,0.06,0,4733896,CKB +Hailey,Kaylani,2022-03-09 07:10:00,2022-03-09 07:18:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 07:28:00,2022-03-09 07:40:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 07:40:00,2022-03-09 07:48:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 07:58:00,2022-03-09 08:10:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 08:10:00,2022-03-09 08:18:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 08:28:00,2022-03-09 08:40:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 08:40:00,2022-03-09 08:48:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 08:58:00,2022-03-09 09:10:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 09:10:00,2022-03-09 09:18:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 09:28:00,2022-03-09 09:40:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 09:40:00,2022-03-09 09:48:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 09:58:00,2022-03-09 10:10:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 10:10:00,2022-03-09 10:18:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 10:28:00,2022-03-09 10:40:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 10:40:00,2022-03-09 10:48:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 10:58:00,2022-03-09 11:10:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 11:10:00,2022-03-09 11:18:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 11:28:00,2022-03-09 11:40:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 11:40:00,2022-03-09 11:48:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 11:58:00,2022-03-09 12:10:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 12:10:00,2022-03-09 12:18:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 12:28:00,2022-03-09 12:40:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 12:40:00,2022-03-09 12:48:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 12:58:00,2022-03-09 13:10:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 13:10:00,2022-03-09 13:18:00,Cecilia,2169,10,4733896,CKB +Hailey,Cecilia,2022-03-09 13:28:00,2022-03-09 13:40:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 13:40:00,2022-03-09 13:48:00,Cecilia,2169,8,4733896,CKB +Hailey,Cecilia,2022-03-09 13:56:00,2022-03-09 14:10:00,Kaylani,2952,0,4733896,CKB +Hailey,Kaylani,2022-03-09 14:10:00,2022-03-09 14:19:00,Cecilia,2169,14,4733896,CKB +Hailey,Cecilia,2022-03-09 14:33:00,2022-03-09 14:47:00,Kaylani,2952,3,4733896,CKB +Hailey,Kaylani,2022-03-09 14:50:00,2022-03-09 14:59:00,Cecilia,2169,14,4733896,CKB +Hailey,Cecilia,2022-03-09 15:13:00,2022-03-09 15:27:00,Kaylani,2952,3,4733896,CKB +Hailey,Kaylani,2022-03-09 15:30:00,2022-03-09 15:39:00,Cecilia,2169,14,4733896,CKB +Hailey,Cecilia,2022-03-09 15:53:00,2022-03-09 16:07:00,Kaylani,2952,3,4733896,CKB +Hailey,Kaylani,2022-03-09 16:10:00,2022-03-09 16:19:00,Cecilia,2169,14,4733896,CKB +Hailey,Cecilia,2022-03-09 16:33:00,2022-03-09 16:47:00,Kaylani,2952,3,4733896,CKB +Hailey,Kaylani,2022-03-09 16:50:00,2022-03-09 16:59:00,Cecilia,2169,14,4733896,CKB +Hailey,Cecilia,2022-03-09 17:13:00,2022-03-09 17:27:00,Kaylani,2952,3,4733896,CKB +Hailey,Kaylani,2022-03-09 17:30:00,2022-03-09 17:39:00,Cecilia,2169,13,4733896,CKB +Hailey,Cecilia,2022-03-09 17:52:00,2022-03-09 18:05:00,Kaylani,2952,5,4733896,CKB +Hailey,Kaylani,2022-03-09 18:10:00,2022-03-09 18:18:00,Cecilia,2169,0,4733896,CKB +Hailey,Cecilia,2022-03-09 18:18:00,2022-03-09 18:18:00,Beckham,0.06,0,4733896,CKB +Hailey,Beckham,2022-03-09 14:13:00,2022-03-09 14:13:00,Cecilia,0.06,0,4734201,CKB +Hailey,Cecilia,2022-03-09 14:13:00,2022-03-09 14:27:00,Kaylani,2952,3,4734201,CKB +Hailey,Kaylani,2022-03-09 14:30:00,2022-03-09 14:39:00,Cecilia,2169,14,4734201,CKB +Hailey,Cecilia,2022-03-09 14:53:00,2022-03-09 15:07:00,Kaylani,2952,3,4734201,CKB +Hailey,Kaylani,2022-03-09 15:10:00,2022-03-09 15:19:00,Cecilia,2169,14,4734201,CKB +Hailey,Cecilia,2022-03-09 15:33:00,2022-03-09 15:47:00,Kaylani,2952,3,4734201,CKB +Hailey,Kaylani,2022-03-09 15:50:00,2022-03-09 15:59:00,Cecilia,2169,14,4734201,CKB +Hailey,Cecilia,2022-03-09 16:13:00,2022-03-09 16:27:00,Kaylani,2952,3,4734201,CKB +Hailey,Kaylani,2022-03-09 16:30:00,2022-03-09 16:39:00,Cecilia,2169,14,4734201,CKB +Hailey,Cecilia,2022-03-09 16:53:00,2022-03-09 17:07:00,Kaylani,2952,3,4734201,CKB +Hailey,Kaylani,2022-03-09 17:10:00,2022-03-09 17:19:00,Cecilia,2169,14,4734201,CKB +Hailey,Cecilia,2022-03-09 17:33:00,2022-03-09 17:47:00,Kaylani,2952,3,4734201,CKB +Hailey,Kaylani,2022-03-09 17:50:00,2022-03-09 17:59:00,Cecilia,2169,14,4734201,CKB +Hailey,Cecilia,2022-03-09 18:13:00,2022-03-09 18:25:00,Kaylani,2952,0,4734201,CKB +Hailey,Kaylani,2022-03-09 18:25:00,2022-03-09 18:25:00,Beckham,0.06,0,4734201,CKB +Matthias,Beckham,2022-03-10 00:23:00,2022-03-10 00:23:00,Addilyn,0.06,0,4318158,CKB +Matthias,Addilyn,2022-03-10 00:23:00,2022-03-10 00:30:00,Ari,2577,9,4318158,CKB +Ruby,Ari,2022-03-10 00:39:00,2022-03-10 00:54:00,Kobe,5937,9,4318158,CKB +Ruby,Kobe,2022-03-10 01:03:00,2022-03-10 01:17:00,Ari,6.19,0,4318158,CKB +Matthias,Ari,2022-03-10 01:17:00,2022-03-10 01:23:00,Addilyn,2555,0,4318158,CKB +Matthias,Addilyn,2022-03-10 01:23:00,2022-03-10 01:30:00,Ari,2577,9,4318158,CKB +Ruby,Ari,2022-03-10 01:39:00,2022-03-10 01:54:00,Kobe,5937,9,4318158,CKB +Ruby,Kobe,2022-03-10 02:03:00,2022-03-10 02:17:00,Ari,6.19,0,4318158,CKB +Matthias,Ari,2022-03-10 02:17:00,2022-03-10 02:23:00,Addilyn,2555,0,4318158,CKB +Matthias,Addilyn,2022-03-10 02:23:00,2022-03-10 02:30:00,Ari,2577,9,4318158,CKB +Ruby,Ari,2022-03-10 02:39:00,2022-03-10 02:54:00,Kobe,5937,9,4318158,CKB +Ruby,Kobe,2022-03-10 03:03:00,2022-03-10 03:17:00,Ari,6.19,0,4318158,CKB +Matthias,Ari,2022-03-10 03:17:00,2022-03-10 03:23:00,Addilyn,2555,0,4318158,CKB +Matthias,Addilyn,2022-03-10 03:23:00,2022-03-10 03:30:00,Ari,2577,9,4318158,CKB +Ruby,Ari,2022-03-10 03:39:00,2022-03-10 03:54:00,Kobe,5937,9,4318158,CKB +Ruby,Kobe,2022-03-10 04:03:00,2022-03-10 04:17:00,Ari,6.19,0,4318158,CKB +Matthias,Ari,2022-03-10 04:17:00,2022-03-10 04:23:00,Addilyn,2555,0,4318158,CKB +Matthias,Addilyn,2022-03-10 04:23:00,2022-03-10 04:23:00,Beckham,0.06,0,4318158,CKB +Ruby,Beckham,2022-03-10 00:33:00,2022-03-10 00:33:00,Kobe,0.06,0,4318178,CKB +Ruby,Kobe,2022-03-10 00:33:00,2022-03-10 00:47:00,Ari,6.19,0,4318178,CKB +Matthias,Ari,2022-03-10 00:47:00,2022-03-10 00:53:00,Addilyn,2555,0,4318178,CKB +Matthias,Addilyn,2022-03-10 00:53:00,2022-03-10 01:00:00,Ari,2577,9,4318178,CKB +Ruby,Ari,2022-03-10 01:09:00,2022-03-10 01:24:00,Kobe,5937,9,4318178,CKB +Ruby,Kobe,2022-03-10 01:33:00,2022-03-10 01:47:00,Ari,6.19,0,4318178,CKB +Matthias,Ari,2022-03-10 01:47:00,2022-03-10 01:53:00,Addilyn,2555,0,4318178,CKB +Matthias,Addilyn,2022-03-10 01:53:00,2022-03-10 02:00:00,Ari,2577,9,4318178,CKB +Ruby,Ari,2022-03-10 02:09:00,2022-03-10 02:24:00,Kobe,5937,9,4318178,CKB +Ruby,Kobe,2022-03-10 02:33:00,2022-03-10 02:47:00,Ari,6.19,0,4318178,CKB +Matthias,Ari,2022-03-10 02:47:00,2022-03-10 02:53:00,Addilyn,2555,0,4318178,CKB +Matthias,Addilyn,2022-03-10 02:53:00,2022-03-10 03:00:00,Ari,2577,9,4318178,CKB +Ruby,Ari,2022-03-10 03:09:00,2022-03-10 03:24:00,Kobe,5937,9,4318178,CKB +Ruby,Kobe,2022-03-10 03:33:00,2022-03-10 03:47:00,Ari,6.19,0,4318178,CKB +Matthias,Ari,2022-03-10 03:47:00,2022-03-10 03:53:00,Addilyn,2555,0,4318178,CKB +Matthias,Addilyn,2022-03-10 03:53:00,2022-03-10 04:00:00,Ari,2577,9,4318178,CKB +Ruby,Ari,2022-03-10 04:09:00,2022-03-10 04:24:00,Kobe,5937,0,4318178,CKB +Ruby,Kobe,2022-03-10 04:24:00,2022-03-10 04:24:00,Beckham,0.06,0,4318178,CKB +Rosie,Beckham,2022-03-10 00:57:00,2022-03-10 00:57:00,Lexi,0.06,0,4319353,CKB +Rosie,Lexi,2022-03-10 00:57:00,2022-03-10 01:06:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 01:06:00,2022-03-10 01:11:00,Lexi,2936,16,4319353,CKB +Rosie,Lexi,2022-03-10 01:27:00,2022-03-10 01:36:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 01:36:00,2022-03-10 01:41:00,Lexi,2936,16,4319353,CKB +Rosie,Lexi,2022-03-10 01:57:00,2022-03-10 02:06:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 02:06:00,2022-03-10 02:11:00,Lexi,2936,16,4319353,CKB +Rosie,Lexi,2022-03-10 02:27:00,2022-03-10 02:36:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 02:36:00,2022-03-10 02:41:00,Lexi,2936,16,4319353,CKB +Rosie,Lexi,2022-03-10 02:57:00,2022-03-10 03:06:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 03:06:00,2022-03-10 03:11:00,Lexi,2936,16,4319353,CKB +Rosie,Lexi,2022-03-10 03:27:00,2022-03-10 03:36:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 03:36:00,2022-03-10 03:41:00,Lexi,2936,16,4319353,CKB +Rosie,Lexi,2022-03-10 03:57:00,2022-03-10 04:06:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 04:06:00,2022-03-10 04:11:00,Lexi,2936,16,4319353,CKB +Rosie,Lexi,2022-03-10 04:27:00,2022-03-10 04:36:00,Colton,4343,0,4319353,CKB +Rosie,Colton,2022-03-10 04:36:00,2022-03-10 04:36:00,Beckham,0.06,0,4319353,CKB +Daxton,Beckham,2022-03-10 00:29:00,2022-03-10 00:29:00,Harper,0.06,0,4751088,CKB +Daxton,Harper,2022-03-10 00:29:00,2022-03-10 00:41:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 00:47:00,2022-03-10 00:57:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 00:59:00,2022-03-10 01:11:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 01:17:00,2022-03-10 01:27:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 01:29:00,2022-03-10 01:41:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 01:47:00,2022-03-10 01:57:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 01:59:00,2022-03-10 02:11:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 02:17:00,2022-03-10 02:27:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 02:29:00,2022-03-10 02:41:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 02:47:00,2022-03-10 02:57:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 02:59:00,2022-03-10 03:11:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 03:17:00,2022-03-10 03:27:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 03:29:00,2022-03-10 03:41:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 03:47:00,2022-03-10 03:57:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 03:59:00,2022-03-10 04:11:00,Calvin,4481,6,4751088,CKB +Daxton,Calvin,2022-03-10 04:17:00,2022-03-10 04:27:00,Harper,4031,2,4751088,CKB +Daxton,Harper,2022-03-10 04:29:00,2022-03-10 04:41:00,Calvin,4481,0,4751088,CKB +Daxton,Calvin,2022-03-10 04:41:00,2022-03-10 04:41:00,Beckham,0.06,0,4751088,CKB +Andy,Beckham,2022-03-10 00:30:00,2022-03-10 00:30:00,Harper,0.06,0,4453546,CKB +Andy,Harper,2022-03-10 00:30:00,2022-03-10 00:44:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 00:44:00,2022-03-10 00:57:00,Harper,5302,3,4453546,CKB +Andy,Harper,2022-03-10 01:00:00,2022-03-10 01:14:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 01:14:00,2022-03-10 01:27:00,Harper,5302,3,4453546,CKB +Andy,Harper,2022-03-10 01:30:00,2022-03-10 01:44:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 01:44:00,2022-03-10 01:57:00,Harper,5302,3,4453546,CKB +Andy,Harper,2022-03-10 02:00:00,2022-03-10 02:14:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 02:14:00,2022-03-10 02:27:00,Harper,5302,3,4453546,CKB +Andy,Harper,2022-03-10 02:30:00,2022-03-10 02:44:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 02:44:00,2022-03-10 02:57:00,Harper,5302,3,4453546,CKB +Andy,Harper,2022-03-10 03:00:00,2022-03-10 03:14:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 03:14:00,2022-03-10 03:27:00,Harper,5302,3,4453546,CKB +Andy,Harper,2022-03-10 03:30:00,2022-03-10 03:44:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 03:44:00,2022-03-10 03:57:00,Harper,5302,3,4453546,CKB +Andy,Harper,2022-03-10 04:00:00,2022-03-10 04:14:00,Elise,4801,0,4453546,CKB +Andy,Elise,2022-03-10 04:14:00,2022-03-10 04:27:00,Harper,5302,0,4453546,CKB +Andy,Harper,2022-03-10 04:27:00,2022-03-10 04:27:00,Beckham,0.06,0,4453546,CKB +Alex,Beckham,2022-03-10 00:43:00,2022-03-10 00:43:00,Chase,0.06,0,4374468,CKB +Alex,Chase,2022-03-10 00:43:00,2022-03-10 01:33:00,Chase,20434,10,4374468,CKB +Alex,Chase,2022-03-10 01:43:00,2022-03-10 02:33:00,Chase,20434,10,4374468,CKB +Alex,Chase,2022-03-10 02:43:00,2022-03-10 03:33:00,Chase,20434,10,4374468,CKB +Alex,Chase,2022-03-10 03:43:00,2022-03-10 04:33:00,Chase,20434,0,4374468,CKB +Alex,Chase,2022-03-10 04:33:00,2022-03-10 04:33:00,Beckham,0.06,0,4374468,CKB +Alex,Beckham,2022-03-10 00:13:00,2022-03-10 00:13:00,Chase,0.06,0,4374473,CKB +Alex,Chase,2022-03-10 00:13:00,2022-03-10 01:03:00,Chase,20434,10,4374473,CKB +Alex,Chase,2022-03-10 01:13:00,2022-03-10 02:03:00,Chase,20434,10,4374473,CKB +Alex,Chase,2022-03-10 02:13:00,2022-03-10 03:03:00,Chase,20434,10,4374473,CKB +Alex,Chase,2022-03-10 03:13:00,2022-03-10 04:03:00,Chase,20434,0,4374473,CKB +Alex,Chase,2022-03-10 04:03:00,2022-03-10 04:03:00,Beckham,0.06,0,4374473,CKB +Hazel,Beckham,2022-03-10 00:24:00,2022-03-10 00:24:00,Celine,0.06,0,4456449,CKB +Hazel,Celine,2022-03-10 00:24:00,2022-03-10 00:48:00,Kali,11.86,4,4456449,CKB +Hazel,Kali,2022-03-10 00:52:00,2022-03-10 01:14:00,Celine,11139,10,4456449,CKB +Hazel,Celine,2022-03-10 01:24:00,2022-03-10 01:48:00,Kali,11.86,4,4456449,CKB +Hazel,Kali,2022-03-10 01:52:00,2022-03-10 02:14:00,Celine,11139,10,4456449,CKB +Hazel,Celine,2022-03-10 02:24:00,2022-03-10 02:48:00,Kali,11.86,4,4456449,CKB +Hazel,Kali,2022-03-10 02:52:00,2022-03-10 03:14:00,Celine,11139,10,4456449,CKB +Hazel,Celine,2022-03-10 03:24:00,2022-03-10 03:48:00,Kali,11.86,4,4456449,CKB +Hazel,Kali,2022-03-10 03:52:00,2022-03-10 04:14:00,Celine,11139,0,4456449,CKB +Hazel,Celine,2022-03-10 04:14:00,2022-03-10 04:14:00,Beckham,0.06,0,4456449,CKB +Hazel,Beckham,2022-03-10 00:22:00,2022-03-10 00:22:00,Kali,0.06,0,4456457,CKB +Hazel,Kali,2022-03-10 00:22:00,2022-03-10 00:44:00,Celine,11139,10,4456457,CKB +Hazel,Celine,2022-03-10 00:54:00,2022-03-10 01:18:00,Kali,11.86,4,4456457,CKB +Hazel,Kali,2022-03-10 01:22:00,2022-03-10 01:44:00,Celine,11139,10,4456457,CKB +Hazel,Celine,2022-03-10 01:54:00,2022-03-10 02:18:00,Kali,11.86,4,4456457,CKB +Hazel,Kali,2022-03-10 02:22:00,2022-03-10 02:44:00,Celine,11139,10,4456457,CKB +Hazel,Celine,2022-03-10 02:54:00,2022-03-10 03:18:00,Kali,11.86,4,4456457,CKB +Hazel,Kali,2022-03-10 03:22:00,2022-03-10 03:44:00,Celine,11139,10,4456457,CKB +Hazel,Celine,2022-03-10 03:54:00,2022-03-10 04:18:00,Kali,11.86,4,4456457,CKB +Hazel,Kali,2022-03-10 04:22:00,2022-03-10 04:44:00,Celine,11139,0,4456457,CKB +Hazel,Celine,2022-03-10 04:44:00,2022-03-10 04:44:00,Beckham,0.06,0,4456457,CKB +Emilio,Beckham,2022-03-10 00:32:00,2022-03-10 00:32:00,Rose,0.06,0,4747651,CKB +Emilio,Rose,2022-03-10 00:32:00,2022-03-10 00:44:00,Brooklynn,4212,3,4747651,CKB +Emilio,Brooklynn,2022-03-10 00:47:00,2022-03-10 01:16:00,Francis,13048,0,4747651,CKB +Emilio,Francis,2022-03-10 01:16:00,2022-03-10 01:42:00,Brooklynn,12869,5,4747651,CKB +Emilio,Brooklynn,2022-03-10 01:47:00,2022-03-10 02:16:00,Francis,13048,0,4747651,CKB +Emilio,Francis,2022-03-10 02:16:00,2022-03-10 02:42:00,Brooklynn,12869,5,4747651,CKB +Emilio,Brooklynn,2022-03-10 02:47:00,2022-03-10 03:16:00,Francis,13048,0,4747651,CKB +Emilio,Francis,2022-03-10 03:16:00,2022-03-10 03:42:00,Brooklynn,12869,5,4747651,CKB +Emilio,Brooklynn,2022-03-10 03:47:00,2022-03-10 04:16:00,Francis,13048,0,4747651,CKB +Emilio,Francis,2022-03-10 04:16:00,2022-03-10 04:34:00,Gia,9538,0,4747651,CKB +Emilio,Gia,2022-03-10 04:34:00,2022-03-10 04:34:00,Beckham,0.06,0,4747651,CKB +Emilio,Beckham,2022-03-10 00:17:00,2022-03-10 00:17:00,Brooklynn,0.06,0,4747661,CKB +Emilio,Brooklynn,2022-03-10 00:17:00,2022-03-10 00:46:00,Francis,13048,0,4747661,CKB +Emilio,Francis,2022-03-10 00:46:00,2022-03-10 01:12:00,Brooklynn,12869,5,4747661,CKB +Emilio,Brooklynn,2022-03-10 01:17:00,2022-03-10 01:46:00,Francis,13048,0,4747661,CKB +Emilio,Francis,2022-03-10 01:46:00,2022-03-10 02:12:00,Brooklynn,12869,5,4747661,CKB +Emilio,Brooklynn,2022-03-10 02:17:00,2022-03-10 02:46:00,Francis,13048,0,4747661,CKB +Emilio,Francis,2022-03-10 02:46:00,2022-03-10 03:12:00,Brooklynn,12869,5,4747661,CKB +Emilio,Brooklynn,2022-03-10 03:17:00,2022-03-10 03:46:00,Francis,13048,0,4747661,CKB +Emilio,Francis,2022-03-10 03:46:00,2022-03-10 04:12:00,Brooklynn,12869,5,4747661,CKB +Emilio,Brooklynn,2022-03-10 04:17:00,2022-03-10 04:28:00,Rose,4316,0,4747661,CKB +Emilio,Rose,2022-03-10 04:28:00,2022-03-10 04:28:00,Beckham,0.06,0,4747661,CKB +Ryder,Beckham,2022-03-10 00:49:00,2022-03-10 00:49:00,Kehlani,0.06,0,4434342,CKB +Ryder,Kehlani,2022-03-10 00:49:00,2022-03-10 01:04:00,Ariyah,10229,0,4434342,CKB +Ryder,Ariyah,2022-03-10 01:04:00,2022-03-10 01:19:00,Kehlani,11801,0,4434342,CKB +Ryder,Kehlani,2022-03-10 01:19:00,2022-03-10 01:34:00,Ariyah,10229,0,4434342,CKB +Ryder,Ariyah,2022-03-10 01:34:00,2022-03-10 01:49:00,Kehlani,11801,0,4434342,CKB +Ryder,Kehlani,2022-03-10 01:49:00,2022-03-10 02:04:00,Ariyah,10229,0,4434342,CKB +Ryder,Ariyah,2022-03-10 02:04:00,2022-03-10 02:19:00,Kehlani,11801,0,4434342,CKB +Ryder,Kehlani,2022-03-10 02:19:00,2022-03-10 02:34:00,Ariyah,10229,0,4434342,CKB +Ryder,Ariyah,2022-03-10 02:34:00,2022-03-10 02:49:00,Kehlani,11801,0,4434342,CKB +Ryder,Kehlani,2022-03-10 02:49:00,2022-03-10 03:04:00,Ariyah,10229,0,4434342,CKB +Ryder,Ariyah,2022-03-10 03:04:00,2022-03-10 03:19:00,Kehlani,11801,0,4434342,CKB +Ryder,Kehlani,2022-03-10 03:19:00,2022-03-10 03:34:00,Ariyah,10229,0,4434342,CKB +Ryder,Ariyah,2022-03-10 03:34:00,2022-03-10 03:49:00,Kehlani,11801,0,4434342,CKB +Ryder,Kehlani,2022-03-10 03:49:00,2022-03-10 04:04:00,Ariyah,10229,0,4434342,CKB +Ryder,Ariyah,2022-03-10 04:04:00,2022-03-10 04:19:00,Kehlani,11801,23,4434342,CKB +Kian,Kehlani,2022-03-10 04:42:00,2022-03-10 05:04:00,Finley,6.81,0,4434342,CKB +Kian,Finley,2022-03-10 05:04:00,2022-03-10 05:04:00,Beckham,0.06,0,4434342,CKB +Jake,Beckham,2022-03-10 00:32:00,2022-03-10 00:32:00,Rose,0.06,0,4434898,CKB +Jake,Rose,2022-03-10 00:32:00,2022-03-10 00:57:00,Kamila,11545,6,4434898,CKB +Jake,Kamila,2022-03-10 01:03:00,2022-03-10 01:46:00,Kayleigh,20579,1,4434898,CKB +Jake,Kayleigh,2022-03-10 01:47:00,2022-03-10 02:25:00,Kamila,20641,8,4434898,CKB +Jake,Kamila,2022-03-10 02:33:00,2022-03-10 03:16:00,Kayleigh,20579,1,4434898,CKB +Jake,Kayleigh,2022-03-10 03:17:00,2022-03-10 03:55:00,Kamila,20641,8,4434898,CKB +Jake,Kamila,2022-03-10 04:03:00,2022-03-10 04:28:00,Rose,11499,0,4434898,CKB +Jake,Rose,2022-03-10 04:28:00,2022-03-10 04:28:00,Beckham,0.06,0,4434898,CKB +Jake,Beckham,2022-03-10 00:33:00,2022-03-10 00:33:00,Kamila,0.06,0,4434903,CKB +Jake,Kamila,2022-03-10 00:33:00,2022-03-10 01:16:00,Kayleigh,20579,1,4434903,CKB +Jake,Kayleigh,2022-03-10 01:17:00,2022-03-10 01:55:00,Kamila,20641,8,4434903,CKB +Jake,Kamila,2022-03-10 02:03:00,2022-03-10 02:46:00,Kayleigh,20579,1,4434903,CKB +Jake,Kayleigh,2022-03-10 02:47:00,2022-03-10 03:25:00,Kamila,20641,8,4434903,CKB +Jake,Kamila,2022-03-10 03:33:00,2022-03-10 04:16:00,Kayleigh,20579,1,4434903,CKB +Jake,Kayleigh,2022-03-10 04:17:00,2022-03-10 04:51:00,Willa,18752,0,4434903,CKB +Jake,Willa,2022-03-10 04:51:00,2022-03-10 04:51:00,Beckham,0.06,0,4434903,CKB +Aziel,Beckham,2022-03-10 00:34:00,2022-03-10 00:34:00,Miles,0.06,0,4619767,CKB +Aziel,Miles,2022-03-10 00:34:00,2022-03-10 01:00:00,Delilah,9016,0,4619767,CKB +Aziel,Delilah,2022-03-10 01:00:00,2022-03-10 01:27:00,Miles,10083,7,4619767,CKB +Aziel,Miles,2022-03-10 01:34:00,2022-03-10 02:00:00,Delilah,9016,0,4619767,CKB +Aziel,Delilah,2022-03-10 02:00:00,2022-03-10 02:27:00,Miles,10083,7,4619767,CKB +Aziel,Miles,2022-03-10 02:34:00,2022-03-10 03:00:00,Delilah,9016,0,4619767,CKB +Aziel,Delilah,2022-03-10 03:00:00,2022-03-10 03:27:00,Miles,10083,7,4619767,CKB +Aziel,Miles,2022-03-10 03:34:00,2022-03-10 04:00:00,Delilah,9016,0,4619767,CKB +Aziel,Delilah,2022-03-10 04:00:00,2022-03-10 04:27:00,Miles,10083,0,4619767,CKB +Aziel,Miles,2022-03-10 04:27:00,2022-03-10 04:27:00,Beckham,0.06,0,4619767,CKB +Aziel,Beckham,2022-03-10 00:30:00,2022-03-10 00:30:00,Delilah,0.06,0,4619992,CKB +Aziel,Delilah,2022-03-10 00:30:00,2022-03-10 00:57:00,Miles,10083,7,4619992,CKB +Aziel,Miles,2022-03-10 01:04:00,2022-03-10 01:30:00,Delilah,9016,0,4619992,CKB +Aziel,Delilah,2022-03-10 01:30:00,2022-03-10 01:57:00,Miles,10083,7,4619992,CKB +Aziel,Miles,2022-03-10 02:04:00,2022-03-10 02:30:00,Delilah,9016,0,4619992,CKB +Aziel,Delilah,2022-03-10 02:30:00,2022-03-10 02:57:00,Miles,10083,7,4619992,CKB +Aziel,Miles,2022-03-10 03:04:00,2022-03-10 03:30:00,Delilah,9016,0,4619992,CKB +Aziel,Delilah,2022-03-10 03:30:00,2022-03-10 03:57:00,Miles,10083,7,4619992,CKB +Aziel,Miles,2022-03-10 04:04:00,2022-03-10 04:30:00,Delilah,9016,0,4619992,CKB +Aziel,Delilah,2022-03-10 04:30:00,2022-03-10 04:57:00,Miles,10083,0,4619992,CKB +Aziel,Miles,2022-03-10 04:57:00,2022-03-10 04:57:00,Beckham,0.06,0,4619992,CKB +Dalton,Beckham,2022-03-10 00:31:00,2022-03-10 00:31:00,Kamila,0.06,0,4374745,CKB +Dalton,Kamila,2022-03-10 00:31:00,2022-03-10 00:44:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 00:44:00,2022-03-10 00:56:00,Kamila,5362,5,4374745,CKB +Dalton,Kamila,2022-03-10 01:01:00,2022-03-10 01:14:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 01:14:00,2022-03-10 01:26:00,Kamila,5362,5,4374745,CKB +Dalton,Kamila,2022-03-10 01:31:00,2022-03-10 01:44:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 01:44:00,2022-03-10 01:56:00,Kamila,5362,5,4374745,CKB +Dalton,Kamila,2022-03-10 02:01:00,2022-03-10 02:14:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 02:14:00,2022-03-10 02:26:00,Kamila,5362,5,4374745,CKB +Dalton,Kamila,2022-03-10 02:31:00,2022-03-10 02:44:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 02:44:00,2022-03-10 02:56:00,Kamila,5362,5,4374745,CKB +Dalton,Kamila,2022-03-10 03:01:00,2022-03-10 03:14:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 03:14:00,2022-03-10 03:26:00,Kamila,5362,5,4374745,CKB +Dalton,Kamila,2022-03-10 03:31:00,2022-03-10 03:44:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 03:44:00,2022-03-10 03:56:00,Kamila,5362,5,4374745,CKB +Dalton,Kamila,2022-03-10 04:01:00,2022-03-10 04:14:00,Veronica,4872,0,4374745,CKB +Dalton,Veronica,2022-03-10 04:14:00,2022-03-10 04:26:00,Kamila,5362,0,4374745,CKB +Dalton,Kamila,2022-03-10 04:26:00,2022-03-10 04:26:00,Beckham,0.06,0,4374745,CKB +Jamison,Beckham,2022-03-10 00:31:00,2022-03-10 00:31:00,Kamila,0.06,0,4374868,CKB +Jamison,Kamila,2022-03-10 00:31:00,2022-03-10 00:45:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 00:47:00,2022-03-10 01:01:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 01:01:00,2022-03-10 01:15:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 01:17:00,2022-03-10 01:31:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 01:31:00,2022-03-10 01:45:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 01:47:00,2022-03-10 02:01:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 02:01:00,2022-03-10 02:15:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 02:17:00,2022-03-10 02:31:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 02:31:00,2022-03-10 02:45:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 02:47:00,2022-03-10 03:01:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 03:01:00,2022-03-10 03:15:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 03:17:00,2022-03-10 03:31:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 03:31:00,2022-03-10 03:45:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 03:47:00,2022-03-10 04:01:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 04:01:00,2022-03-10 04:15:00,Liana,5225,2,4374868,CKB +Jamison,Liana,2022-03-10 04:17:00,2022-03-10 04:31:00,Kamila,7617,0,4374868,CKB +Jamison,Kamila,2022-03-10 04:31:00,2022-03-10 04:31:00,Beckham,0.06,0,4374868,CKB +Keegan,Beckham,2022-03-10 00:43:00,2022-03-10 00:43:00,Charleigh,0.06,0,4375014,CKB +Keegan,Charleigh,2022-03-10 00:43:00,2022-03-10 00:53:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 00:53:00,2022-03-10 01:03:00,Charleigh,4408,10,4375014,CKB +Keegan,Charleigh,2022-03-10 01:13:00,2022-03-10 01:23:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 01:23:00,2022-03-10 01:33:00,Charleigh,4408,10,4375014,CKB +Keegan,Charleigh,2022-03-10 01:43:00,2022-03-10 01:53:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 01:53:00,2022-03-10 02:03:00,Charleigh,4408,10,4375014,CKB +Keegan,Charleigh,2022-03-10 02:13:00,2022-03-10 02:23:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 02:23:00,2022-03-10 02:33:00,Charleigh,4408,10,4375014,CKB +Keegan,Charleigh,2022-03-10 02:43:00,2022-03-10 02:53:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 02:53:00,2022-03-10 03:03:00,Charleigh,4408,10,4375014,CKB +Keegan,Charleigh,2022-03-10 03:13:00,2022-03-10 03:23:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 03:23:00,2022-03-10 03:33:00,Charleigh,4408,10,4375014,CKB +Keegan,Charleigh,2022-03-10 03:43:00,2022-03-10 03:53:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 03:53:00,2022-03-10 04:03:00,Charleigh,4408,10,4375014,CKB +Keegan,Charleigh,2022-03-10 04:13:00,2022-03-10 04:23:00,Eli,4507,0,4375014,CKB +Keegan,Eli,2022-03-10 04:23:00,2022-03-10 04:33:00,Charleigh,4408,0,4375014,CKB +Keegan,Charleigh,2022-03-10 04:33:00,2022-03-10 04:33:00,Beckham,0.06,0,4375014,CKB +Ayaan,Beckham,2022-03-10 21:31:00,2022-03-10 21:31:00,Kalani,0.06,0,4454946,CKB +Ayaan,Kalani,2022-03-10 21:31:00,2022-03-10 22:04:00,Brian,14519,4,4454946,CKB +Ayaan,Brian,2022-03-10 22:08:00,2022-03-10 22:43:00,Kalani,13541,8,4454946,CKB +Ayaan,Kalani,2022-03-10 22:51:00,2022-03-10 23:24:00,Brian,14519,4,4454946,CKB +Ayaan,Brian,2022-03-10 23:28:00,2022-03-11 00:03:00,Kalani,13541,8,4454946,CKB +Ayaan,Kalani,2022-03-11 00:11:00,2022-03-11 00:44:00,Brian,14519,0,4454946,CKB +Hunter,Brian,2022-03-11 00:44:00,2022-03-11 00:54:00,Kehlani,4.1,25,4454946,CKB +Hunter,Kehlani,2022-03-11 01:19:00,2022-03-11 01:42:00,Ayden,8.36,6,4454946,CKB +Hunter,Ayden,2022-03-11 01:48:00,2022-03-11 02:06:00,Kehlani,9067,13,4454946,CKB +Hunter,Kehlani,2022-03-11 02:19:00,2022-03-11 02:42:00,Ayden,8.36,6,4454946,CKB +Hunter,Ayden,2022-03-11 02:48:00,2022-03-11 03:06:00,Kehlani,9067,13,4454946,CKB +Hunter,Kehlani,2022-03-11 03:19:00,2022-03-11 03:42:00,Ayden,8.36,6,4454946,CKB +Hunter,Ayden,2022-03-11 03:48:00,2022-03-11 04:06:00,Kehlani,9067,0,4454946,CKB +Hunter,Kehlani,2022-03-11 04:06:00,2022-03-11 04:06:00,Beckham,0.06,0,4454946,CKB +Ayaan,Beckham,2022-03-10 22:11:00,2022-03-10 22:11:00,Kalani,0.06,0,4454951,CKB +Ayaan,Kalani,2022-03-10 22:11:00,2022-03-10 22:44:00,Brian,14519,4,4454951,CKB +Ayaan,Brian,2022-03-10 22:48:00,2022-03-10 23:23:00,Kalani,13541,8,4454951,CKB +Ayaan,Kalani,2022-03-10 23:31:00,2022-03-11 00:04:00,Brian,14519,4,4454951,CKB +Ayaan,Brian,2022-03-11 00:08:00,2022-03-11 00:39:00,Leonel,12213,0,4454951,CKB +Hunter,Leonel,2022-03-11 00:39:00,2022-03-11 00:47:00,Kehlani,4.0,2,4454951,CKB +Hunter,Kehlani,2022-03-11 00:49:00,2022-03-11 01:12:00,Ayden,8.36,6,4454951,CKB +Hunter,Ayden,2022-03-11 01:18:00,2022-03-11 01:36:00,Kehlani,9067,13,4454951,CKB +Hunter,Kehlani,2022-03-11 01:49:00,2022-03-11 02:12:00,Ayden,8.36,6,4454951,CKB +Hunter,Ayden,2022-03-11 02:18:00,2022-03-11 02:36:00,Kehlani,9067,13,4454951,CKB +Hunter,Kehlani,2022-03-11 02:49:00,2022-03-11 03:12:00,Ayden,8.36,6,4454951,CKB +Hunter,Ayden,2022-03-11 03:18:00,2022-03-11 03:36:00,Kehlani,9067,13,4454951,CKB +Hunter,Kehlani,2022-03-11 03:49:00,2022-03-11 04:12:00,Ayden,8.36,0,4454951,CKB +Hunter,Ayden,2022-03-11 04:12:00,2022-03-11 04:12:00,Beckham,0.06,0,4454951,CKB +Donovan,Beckham,2022-03-10 21:06:00,2022-03-10 21:06:00,Pierce,0.06,0,4664625,CKB +Donovan,Pierce,2022-03-10 21:06:00,2022-03-10 21:34:00,Leonardo,13018,19,4664625,CKB +Donovan,Leonardo,2022-03-10 21:53:00,2022-03-10 22:13:00,Kamryn,10332,17,4664625,CKB +Donovan,Kamryn,2022-03-10 22:30:00,2022-03-10 22:54:00,Leonardo,10.48,19,4664625,CKB +Donovan,Leonardo,2022-03-10 23:13:00,2022-03-10 23:33:00,Kamryn,10332,17,4664625,CKB +Donovan,Kamryn,2022-03-10 23:50:00,2022-03-11 00:14:00,Leonardo,10.48,2,4664625,CKB +Donovan,Leonardo,2022-03-11 00:16:00,2022-03-11 00:23:00,Melanie,3709,5,4664625,CKB +Zoey,Melanie,2022-03-11 00:28:00,2022-03-11 00:44:00,Brinley,6404,3,4664625,CKB +Zoey,Brinley,2022-03-11 00:47:00,2022-03-11 01:10:00,Finn,10579,7,4664625,CKB +Zoey,Finn,2022-03-11 01:17:00,2022-03-11 01:44:00,Brinley,12007,3,4664625,CKB +Zoey,Brinley,2022-03-11 01:47:00,2022-03-11 02:10:00,Finn,10579,7,4664625,CKB +Zoey,Finn,2022-03-11 02:17:00,2022-03-11 02:44:00,Brinley,12007,3,4664625,CKB +Zoey,Brinley,2022-03-11 02:47:00,2022-03-11 03:10:00,Finn,10579,7,4664625,CKB +Zoey,Finn,2022-03-11 03:17:00,2022-03-11 03:44:00,Brinley,12007,3,4664625,CKB +Zoey,Brinley,2022-03-11 03:47:00,2022-03-11 04:10:00,Finn,10579,7,4664625,CKB +Zoey,Finn,2022-03-11 04:17:00,2022-03-11 04:44:00,Brinley,12007,0,4664625,CKB +Zoey,Brinley,2022-03-11 04:44:00,2022-03-11 04:44:00,Beckham,0.06,0,4664625,CKB +Donovan,Beckham,2022-03-10 20:26:00,2022-03-10 20:26:00,Pierce,0.06,0,4762777,CKB +Donovan,Pierce,2022-03-10 20:26:00,2022-03-10 20:56:00,Ezra,14097,14,4762777,CKB +Donovan,Ezra,2022-03-10 21:10:00,2022-03-10 21:38:00,Pierce,13.19,8,4762777,CKB +Donovan,Pierce,2022-03-10 21:46:00,2022-03-10 22:14:00,Leonardo,13018,19,4762777,CKB +Donovan,Leonardo,2022-03-10 22:33:00,2022-03-10 22:53:00,Kamryn,10332,17,4762777,CKB +Donovan,Kamryn,2022-03-10 23:10:00,2022-03-10 23:34:00,Leonardo,10.48,19,4762777,CKB +Donovan,Leonardo,2022-03-10 23:53:00,2022-03-11 00:13:00,Kamryn,10332,2,4762777,CKB +Donovan,Kamryn,2022-03-11 00:15:00,2022-03-11 00:16:00,Brinley,506,1,4762777,CKB +Zoey,Brinley,2022-03-11 00:17:00,2022-03-11 00:40:00,Finn,10579,7,4762777,CKB +Zoey,Finn,2022-03-11 00:47:00,2022-03-11 01:14:00,Brinley,12007,3,4762777,CKB +Zoey,Brinley,2022-03-11 01:17:00,2022-03-11 01:40:00,Finn,10579,7,4762777,CKB +Zoey,Finn,2022-03-11 01:47:00,2022-03-11 02:14:00,Brinley,12007,3,4762777,CKB +Zoey,Brinley,2022-03-11 02:17:00,2022-03-11 02:40:00,Finn,10579,7,4762777,CKB +Zoey,Finn,2022-03-11 02:47:00,2022-03-11 03:14:00,Brinley,12007,3,4762777,CKB +Zoey,Brinley,2022-03-11 03:17:00,2022-03-11 03:40:00,Finn,10579,7,4762777,CKB +Zoey,Finn,2022-03-11 03:47:00,2022-03-11 04:14:00,Brinley,12007,3,4762777,CKB +Zoey,Brinley,2022-03-11 04:17:00,2022-03-11 04:40:00,Finn,10579,3,4762777,CKB +Jackson,Finn,2022-03-11 04:43:00,2022-03-11 04:58:00,Rose,6161,0,4762777,CKB +Jackson,Rose,2022-03-11 04:58:00,2022-03-11 04:58:00,Beckham,0.06,0,4762777,CKB +Avery,Beckham,2022-03-10 22:56:00,2022-03-10 22:56:00,Jace,0.06,0,4617422,CKB +Avery,Jace,2022-03-10 22:56:00,2022-03-10 23:08:00,Nathan,5882,3,4617422,CKB +Avery,Nathan,2022-03-10 23:11:00,2022-03-10 23:25:00,Jace,6232,0,4617422,CKB +Avery,Jace,2022-03-10 23:25:00,2022-03-10 23:38:00,Nathan,6086,3,4617422,CKB +Avery,Nathan,2022-03-10 23:41:00,2022-03-10 23:55:00,Jace,6232,0,4617422,CKB +Avery,Jace,2022-03-10 23:55:00,2022-03-11 00:08:00,Nathan,6086,0,4617422,CKB +Avery,Nathan,2022-03-11 00:08:00,2022-03-11 00:08:00,Beckham,0.06,0,4617422,CKB +Richard,Beckham,2022-03-10 05:05:00,2022-03-10 05:05:00,Ariyah,0.06,0,4426847,CKB +Richard,Ariyah,2022-03-10 05:05:00,2022-03-10 05:14:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 05:14:00,2022-03-10 05:23:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 05:25:00,2022-03-10 05:34:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 05:34:00,2022-03-10 05:43:00,Ariyah,5139,23,4426847,CKB +Richard,Ariyah,2022-03-10 06:06:00,2022-03-10 06:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 06:15:00,2022-03-10 06:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 06:26:00,2022-03-10 06:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 06:35:00,2022-03-10 06:44:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 06:46:00,2022-03-10 06:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 06:55:00,2022-03-10 07:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 07:06:00,2022-03-10 07:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 07:15:00,2022-03-10 07:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 07:26:00,2022-03-10 07:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 07:35:00,2022-03-10 07:44:00,Ariyah,5139,22,4426847,CKB +Richard,Ariyah,2022-03-10 08:06:00,2022-03-10 08:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 08:15:00,2022-03-10 08:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 08:26:00,2022-03-10 08:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 08:35:00,2022-03-10 08:44:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 08:46:00,2022-03-10 08:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 08:55:00,2022-03-10 09:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 09:06:00,2022-03-10 09:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 09:15:00,2022-03-10 09:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 09:26:00,2022-03-10 09:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 09:35:00,2022-03-10 09:44:00,Ariyah,5139,22,4426847,CKB +Richard,Ariyah,2022-03-10 10:06:00,2022-03-10 10:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 10:15:00,2022-03-10 10:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 10:26:00,2022-03-10 10:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 10:35:00,2022-03-10 10:44:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 10:46:00,2022-03-10 10:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 10:55:00,2022-03-10 11:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 11:06:00,2022-03-10 11:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 11:15:00,2022-03-10 11:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 11:26:00,2022-03-10 11:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 11:35:00,2022-03-10 11:44:00,Ariyah,5139,22,4426847,CKB +Richard,Ariyah,2022-03-10 12:06:00,2022-03-10 12:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 12:15:00,2022-03-10 12:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 12:26:00,2022-03-10 12:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 12:35:00,2022-03-10 12:44:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 12:46:00,2022-03-10 12:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 12:55:00,2022-03-10 13:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 13:06:00,2022-03-10 13:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 13:15:00,2022-03-10 13:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 13:26:00,2022-03-10 13:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 13:35:00,2022-03-10 13:44:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 13:46:00,2022-03-10 13:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 13:55:00,2022-03-10 14:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 14:06:00,2022-03-10 14:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 14:15:00,2022-03-10 14:24:00,Ariyah,5139,22,4426847,CKB +Richard,Ariyah,2022-03-10 14:46:00,2022-03-10 14:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 14:55:00,2022-03-10 15:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 15:06:00,2022-03-10 15:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 15:15:00,2022-03-10 15:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 15:26:00,2022-03-10 15:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 15:35:00,2022-03-10 15:44:00,Ariyah,5139,22,4426847,CKB +Richard,Ariyah,2022-03-10 16:06:00,2022-03-10 16:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 16:15:00,2022-03-10 16:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 16:26:00,2022-03-10 16:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 16:35:00,2022-03-10 16:44:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 16:46:00,2022-03-10 16:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 16:55:00,2022-03-10 17:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 17:06:00,2022-03-10 17:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 17:15:00,2022-03-10 17:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 17:26:00,2022-03-10 17:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 17:35:00,2022-03-10 17:44:00,Ariyah,5139,22,4426847,CKB +Richard,Ariyah,2022-03-10 18:06:00,2022-03-10 18:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 18:15:00,2022-03-10 18:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 18:26:00,2022-03-10 18:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 18:35:00,2022-03-10 18:44:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 18:46:00,2022-03-10 18:55:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 18:55:00,2022-03-10 19:04:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 19:06:00,2022-03-10 19:15:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 19:15:00,2022-03-10 19:24:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 19:26:00,2022-03-10 19:35:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 19:35:00,2022-03-10 19:44:00,Ariyah,5139,21,4426847,CKB +Richard,Ariyah,2022-03-10 20:05:00,2022-03-10 20:14:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 20:14:00,2022-03-10 20:23:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 20:25:00,2022-03-10 20:34:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 20:34:00,2022-03-10 20:43:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 20:45:00,2022-03-10 20:54:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 20:54:00,2022-03-10 21:03:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 21:05:00,2022-03-10 21:14:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 21:14:00,2022-03-10 21:23:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 21:25:00,2022-03-10 21:34:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 21:34:00,2022-03-10 21:43:00,Ariyah,5139,22,4426847,CKB +Richard,Ariyah,2022-03-10 22:05:00,2022-03-10 22:14:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 22:14:00,2022-03-10 22:23:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 22:25:00,2022-03-10 22:34:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 22:34:00,2022-03-10 22:43:00,Ariyah,5139,2,4426847,CKB +Richard,Ariyah,2022-03-10 22:45:00,2022-03-10 22:54:00,Jaden,4781,0,4426847,CKB +Richard,Jaden,2022-03-10 22:54:00,2022-03-10 23:03:00,Ariyah,5139,0,4426847,CKB +Richard,Ariyah,2022-03-10 23:03:00,2022-03-10 23:03:00,Beckham,0.06,0,4426847,CKB +Ezekiel,Beckham,2022-03-11 00:06:00,2022-03-11 00:06:00,Erik,0.06,0,4708597,CKB +Ezekiel,Erik,2022-03-11 00:06:00,2022-03-11 00:27:00,Memphis,7827,0,4708597,CKB +Jake,Memphis,2022-03-11 00:27:00,2022-03-11 00:48:00,Kayleigh,11079,0,4708597,CKB +Jake,Kayleigh,2022-03-11 00:48:00,2022-03-11 01:25:00,Kamila,20641,8,4708597,CKB +Jake,Kamila,2022-03-11 01:33:00,2022-03-11 02:16:00,Kayleigh,20579,1,4708597,CKB +Jake,Kayleigh,2022-03-11 02:17:00,2022-03-11 02:55:00,Kamila,20641,8,4708597,CKB +Jake,Kamila,2022-03-11 03:03:00,2022-03-11 03:46:00,Kayleigh,20579,1,4708597,CKB +Jake,Kayleigh,2022-03-11 03:47:00,2022-03-11 04:25:00,Kamila,20641,0,4708597,CKB +Jake,Kamila,2022-03-11 04:25:00,2022-03-11 04:25:00,Beckham,0.06,0,4708597,CKB +Astrid,King,2022-03-10 05:15:00,2022-03-10 06:01:00,Brayden,17.9,0,4317627,VDL +Astrid,Brayden,2022-03-10 06:01:00,2022-03-10 06:15:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 06:23:00,2022-03-10 06:37:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 06:41:00,2022-03-10 06:55:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 07:03:00,2022-03-10 07:17:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 07:21:00,2022-03-10 07:35:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 07:43:00,2022-03-10 07:57:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 08:01:00,2022-03-10 08:15:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 08:23:00,2022-03-10 08:37:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 08:41:00,2022-03-10 08:55:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 09:03:00,2022-03-10 09:17:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 09:21:00,2022-03-10 09:35:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 09:43:00,2022-03-10 09:57:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 10:01:00,2022-03-10 10:15:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 10:23:00,2022-03-10 10:37:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 10:41:00,2022-03-10 10:55:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 11:03:00,2022-03-10 11:17:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 11:21:00,2022-03-10 11:35:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 11:43:00,2022-03-10 11:57:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 12:01:00,2022-03-10 12:15:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 12:23:00,2022-03-10 12:37:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 12:41:00,2022-03-10 12:55:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 13:03:00,2022-03-10 13:17:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 13:21:00,2022-03-10 13:35:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 13:43:00,2022-03-10 13:57:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 14:01:00,2022-03-10 14:15:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 14:23:00,2022-03-10 14:37:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 14:41:00,2022-03-10 14:55:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 15:03:00,2022-03-10 15:17:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 15:21:00,2022-03-10 15:35:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 15:43:00,2022-03-10 15:57:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 16:01:00,2022-03-10 16:15:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 16:23:00,2022-03-10 16:37:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 16:41:00,2022-03-10 16:55:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 17:03:00,2022-03-10 17:17:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 17:21:00,2022-03-10 17:35:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 17:43:00,2022-03-10 17:57:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 18:01:00,2022-03-10 18:15:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 18:23:00,2022-03-10 18:37:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 18:41:00,2022-03-10 18:55:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 19:03:00,2022-03-10 19:17:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 19:21:00,2022-03-10 19:35:00,Brayden,4637,8,4317627,VDL +Astrid,Brayden,2022-03-10 19:43:00,2022-03-10 19:57:00,Brayden,4637,4,4317627,VDL +Astrid,Brayden,2022-03-10 20:01:00,2022-03-10 20:14:00,Brayden,4637,9,4317627,VDL +Astrid,Brayden,2022-03-10 20:23:00,2022-03-10 20:36:00,Brayden,4637,0,4317627,VDL +Astrid,Brayden,2022-03-10 20:36:00,2022-03-10 21:15:00,King,19.8,0,4317627,VDL +Amy,Beckham,2022-03-10 04:56:00,2022-03-10 04:56:00,Izabella,0.06,18,4425670,CKB +Amy,Izabella,2022-03-10 05:14:00,2022-03-10 05:20:00,Tristan,3.29,0,4425670,CKB +Amy,Tristan,2022-03-10 05:20:00,2022-03-10 05:24:00,Izabella,2954,20,4425670,CKB +Amy,Izabella,2022-03-10 05:44:00,2022-03-10 05:50:00,Tristan,3.29,0,4425670,CKB +Amy,Tristan,2022-03-10 05:50:00,2022-03-10 05:54:00,Izabella,2954,5,4425670,CKB +Amy,Izabella,2022-03-10 05:59:00,2022-03-10 06:06:00,Tristan,3.29,2,4425670,CKB +Amy,Tristan,2022-03-10 06:08:00,2022-03-10 06:13:00,Izabella,2954,19,4425670,CKB +Amy,Izabella,2022-03-10 06:32:00,2022-03-10 06:39:00,Tristan,3.29,1,4425670,CKB +Amy,Tristan,2022-03-10 06:40:00,2022-03-10 06:45:00,Izabella,2954,7,4425670,CKB +Amy,Izabella,2022-03-10 06:52:00,2022-03-10 06:59:00,Tristan,3.29,1,4425670,CKB +Amy,Tristan,2022-03-10 07:00:00,2022-03-10 07:05:00,Izabella,2954,7,4425670,CKB +Amy,Izabella,2022-03-10 07:12:00,2022-03-10 07:19:00,Tristan,3.29,1,4425670,CKB +Amy,Tristan,2022-03-10 07:20:00,2022-03-10 07:25:00,Izabella,2954,7,4425670,CKB +Amy,Izabella,2022-03-10 07:32:00,2022-03-10 07:39:00,Tristan,3.29,1,4425670,CKB +Amy,Tristan,2022-03-10 07:40:00,2022-03-10 07:45:00,Izabella,2954,295,4425670,CKB +Amy,Izabella,2022-03-10 12:40:00,2022-03-10 12:47:00,Tristan,3.29,2,4425670,CKB +Amy,Tristan,2022-03-10 12:49:00,2022-03-10 12:54:00,Izabella,2954,46,4425670,CKB +Amy,Izabella,2022-03-10 13:40:00,2022-03-10 13:47:00,Tristan,3.29,2,4425670,CKB +Amy,Tristan,2022-03-10 13:49:00,2022-03-10 13:54:00,Izabella,2954,434,4425670,CKB +Amy,Izabella,2022-03-10 21:08:00,2022-03-10 21:08:00,Beckham,0.06,0,4425670,CKB +Matilda,Beckham,2022-03-10 07:20:00,2022-03-10 07:20:00,Izaiah,0.06,0,4448152,CKB +Matilda,Izaiah,2022-03-10 07:20:00,2022-03-10 07:50:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 08:00:00,2022-03-10 08:30:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 08:40:00,2022-03-10 09:10:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 09:20:00,2022-03-10 09:50:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 10:00:00,2022-03-10 10:30:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 10:40:00,2022-03-10 11:10:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 11:20:00,2022-03-10 11:50:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 12:00:00,2022-03-10 12:30:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 12:40:00,2022-03-10 13:10:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 13:20:00,2022-03-10 13:50:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 14:00:00,2022-03-10 14:30:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 14:40:00,2022-03-10 15:10:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 15:20:00,2022-03-10 15:50:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 16:00:00,2022-03-10 16:30:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 16:40:00,2022-03-10 17:10:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 17:20:00,2022-03-10 17:50:00,Izaiah,9266,10,4448152,CKB +Matilda,Izaiah,2022-03-10 18:00:00,2022-03-10 18:30:00,Izaiah,9266,0,4448152,CKB +Matilda,Izaiah,2022-03-10 18:30:00,2022-03-10 18:30:00,Beckham,0.06,0,4448152,CKB +Hailey,Beckham,2022-03-10 07:10:00,2022-03-10 07:10:00,Kaylani,0.06,0,4733897,CKB +Hailey,Kaylani,2022-03-10 07:10:00,2022-03-10 07:18:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 07:28:00,2022-03-10 07:40:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 07:40:00,2022-03-10 07:48:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 07:58:00,2022-03-10 08:10:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 08:10:00,2022-03-10 08:18:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 08:28:00,2022-03-10 08:40:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 08:40:00,2022-03-10 08:48:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 08:58:00,2022-03-10 09:10:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 09:10:00,2022-03-10 09:18:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 09:28:00,2022-03-10 09:40:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 09:40:00,2022-03-10 09:48:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 09:58:00,2022-03-10 10:10:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 10:10:00,2022-03-10 10:18:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 10:28:00,2022-03-10 10:40:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 10:40:00,2022-03-10 10:48:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 10:58:00,2022-03-10 11:10:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 11:10:00,2022-03-10 11:18:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 11:28:00,2022-03-10 11:40:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 11:40:00,2022-03-10 11:48:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 11:58:00,2022-03-10 12:10:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 12:10:00,2022-03-10 12:18:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 12:28:00,2022-03-10 12:40:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 12:40:00,2022-03-10 12:48:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 12:58:00,2022-03-10 13:10:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 13:10:00,2022-03-10 13:18:00,Cecilia,2169,10,4733897,CKB +Hailey,Cecilia,2022-03-10 13:28:00,2022-03-10 13:40:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 13:40:00,2022-03-10 13:48:00,Cecilia,2169,8,4733897,CKB +Hailey,Cecilia,2022-03-10 13:56:00,2022-03-10 14:10:00,Kaylani,2952,0,4733897,CKB +Hailey,Kaylani,2022-03-10 14:10:00,2022-03-10 14:19:00,Cecilia,2169,14,4733897,CKB +Hailey,Cecilia,2022-03-10 14:33:00,2022-03-10 14:47:00,Kaylani,2952,3,4733897,CKB +Hailey,Kaylani,2022-03-10 14:50:00,2022-03-10 14:59:00,Cecilia,2169,14,4733897,CKB +Hailey,Cecilia,2022-03-10 15:13:00,2022-03-10 15:27:00,Kaylani,2952,3,4733897,CKB +Hailey,Kaylani,2022-03-10 15:30:00,2022-03-10 15:39:00,Cecilia,2169,14,4733897,CKB +Hailey,Cecilia,2022-03-10 15:53:00,2022-03-10 16:07:00,Kaylani,2952,3,4733897,CKB +Hailey,Kaylani,2022-03-10 16:10:00,2022-03-10 16:19:00,Cecilia,2169,14,4733897,CKB +Hailey,Cecilia,2022-03-10 16:33:00,2022-03-10 16:47:00,Kaylani,2952,3,4733897,CKB +Hailey,Kaylani,2022-03-10 16:50:00,2022-03-10 16:59:00,Cecilia,2169,14,4733897,CKB +Hailey,Cecilia,2022-03-10 17:13:00,2022-03-10 17:27:00,Kaylani,2952,3,4733897,CKB +Hailey,Kaylani,2022-03-10 17:30:00,2022-03-10 17:39:00,Cecilia,2169,13,4733897,CKB +Hailey,Cecilia,2022-03-10 17:52:00,2022-03-10 18:05:00,Kaylani,2952,5,4733897,CKB +Hailey,Kaylani,2022-03-10 18:10:00,2022-03-10 18:18:00,Cecilia,2169,0,4733897,CKB +Hailey,Cecilia,2022-03-10 18:18:00,2022-03-10 18:18:00,Beckham,0.06,0,4733897,CKB +Hailey,Beckham,2022-03-10 14:13:00,2022-03-10 14:13:00,Cecilia,0.06,0,4734202,CKB +Hailey,Cecilia,2022-03-10 14:13:00,2022-03-10 14:27:00,Kaylani,2952,3,4734202,CKB +Hailey,Kaylani,2022-03-10 14:30:00,2022-03-10 14:39:00,Cecilia,2169,14,4734202,CKB +Hailey,Cecilia,2022-03-10 14:53:00,2022-03-10 15:07:00,Kaylani,2952,3,4734202,CKB +Hailey,Kaylani,2022-03-10 15:10:00,2022-03-10 15:19:00,Cecilia,2169,14,4734202,CKB +Hailey,Cecilia,2022-03-10 15:33:00,2022-03-10 15:47:00,Kaylani,2952,3,4734202,CKB +Hailey,Kaylani,2022-03-10 15:50:00,2022-03-10 15:59:00,Cecilia,2169,14,4734202,CKB +Hailey,Cecilia,2022-03-10 16:13:00,2022-03-10 16:27:00,Kaylani,2952,3,4734202,CKB +Hailey,Kaylani,2022-03-10 16:30:00,2022-03-10 16:39:00,Cecilia,2169,14,4734202,CKB +Hailey,Cecilia,2022-03-10 16:53:00,2022-03-10 17:07:00,Kaylani,2952,3,4734202,CKB +Hailey,Kaylani,2022-03-10 17:10:00,2022-03-10 17:19:00,Cecilia,2169,14,4734202,CKB +Hailey,Cecilia,2022-03-10 17:33:00,2022-03-10 17:47:00,Kaylani,2952,3,4734202,CKB +Hailey,Kaylani,2022-03-10 17:50:00,2022-03-10 17:59:00,Cecilia,2169,14,4734202,CKB +Hailey,Cecilia,2022-03-10 18:13:00,2022-03-10 18:25:00,Kaylani,2952,0,4734202,CKB +Hailey,Kaylani,2022-03-10 18:25:00,2022-03-10 18:25:00,Beckham,0.06,0,4734202,CKB +Matthias,Beckham,2022-03-11 00:23:00,2022-03-11 00:23:00,Addilyn,0.06,0,4318159,CKB +Matthias,Addilyn,2022-03-11 00:23:00,2022-03-11 00:30:00,Ari,2577,9,4318159,CKB +Ruby,Ari,2022-03-11 00:39:00,2022-03-11 00:54:00,Kobe,5937,9,4318159,CKB +Ruby,Kobe,2022-03-11 01:03:00,2022-03-11 01:17:00,Ari,6.19,0,4318159,CKB +Matthias,Ari,2022-03-11 01:17:00,2022-03-11 01:23:00,Addilyn,2555,0,4318159,CKB +Matthias,Addilyn,2022-03-11 01:23:00,2022-03-11 01:30:00,Ari,2577,9,4318159,CKB +Ruby,Ari,2022-03-11 01:39:00,2022-03-11 01:54:00,Kobe,5937,9,4318159,CKB +Ruby,Kobe,2022-03-11 02:03:00,2022-03-11 02:17:00,Ari,6.19,0,4318159,CKB +Matthias,Ari,2022-03-11 02:17:00,2022-03-11 02:23:00,Addilyn,2555,0,4318159,CKB +Matthias,Addilyn,2022-03-11 02:23:00,2022-03-11 02:30:00,Ari,2577,9,4318159,CKB +Ruby,Ari,2022-03-11 02:39:00,2022-03-11 02:54:00,Kobe,5937,9,4318159,CKB +Ruby,Kobe,2022-03-11 03:03:00,2022-03-11 03:17:00,Ari,6.19,0,4318159,CKB +Matthias,Ari,2022-03-11 03:17:00,2022-03-11 03:23:00,Addilyn,2555,0,4318159,CKB +Matthias,Addilyn,2022-03-11 03:23:00,2022-03-11 03:30:00,Ari,2577,9,4318159,CKB +Ruby,Ari,2022-03-11 03:39:00,2022-03-11 03:54:00,Kobe,5937,9,4318159,CKB +Ruby,Kobe,2022-03-11 04:03:00,2022-03-11 04:17:00,Ari,6.19,0,4318159,CKB +Matthias,Ari,2022-03-11 04:17:00,2022-03-11 04:23:00,Addilyn,2555,0,4318159,CKB +Matthias,Addilyn,2022-03-11 04:23:00,2022-03-11 04:23:00,Beckham,0.06,0,4318159,CKB +Ruby,Beckham,2022-03-11 00:33:00,2022-03-11 00:33:00,Kobe,0.06,0,4318179,CKB +Ruby,Kobe,2022-03-11 00:33:00,2022-03-11 00:47:00,Ari,6.19,0,4318179,CKB +Matthias,Ari,2022-03-11 00:47:00,2022-03-11 00:53:00,Addilyn,2555,0,4318179,CKB +Matthias,Addilyn,2022-03-11 00:53:00,2022-03-11 01:00:00,Ari,2577,9,4318179,CKB +Ruby,Ari,2022-03-11 01:09:00,2022-03-11 01:24:00,Kobe,5937,9,4318179,CKB +Ruby,Kobe,2022-03-11 01:33:00,2022-03-11 01:47:00,Ari,6.19,0,4318179,CKB +Matthias,Ari,2022-03-11 01:47:00,2022-03-11 01:53:00,Addilyn,2555,0,4318179,CKB +Matthias,Addilyn,2022-03-11 01:53:00,2022-03-11 02:00:00,Ari,2577,9,4318179,CKB +Ruby,Ari,2022-03-11 02:09:00,2022-03-11 02:24:00,Kobe,5937,9,4318179,CKB +Ruby,Kobe,2022-03-11 02:33:00,2022-03-11 02:47:00,Ari,6.19,0,4318179,CKB +Matthias,Ari,2022-03-11 02:47:00,2022-03-11 02:53:00,Addilyn,2555,0,4318179,CKB +Matthias,Addilyn,2022-03-11 02:53:00,2022-03-11 03:00:00,Ari,2577,9,4318179,CKB +Ruby,Ari,2022-03-11 03:09:00,2022-03-11 03:24:00,Kobe,5937,9,4318179,CKB +Ruby,Kobe,2022-03-11 03:33:00,2022-03-11 03:47:00,Ari,6.19,0,4318179,CKB +Matthias,Ari,2022-03-11 03:47:00,2022-03-11 03:53:00,Addilyn,2555,0,4318179,CKB +Matthias,Addilyn,2022-03-11 03:53:00,2022-03-11 04:00:00,Ari,2577,9,4318179,CKB +Ruby,Ari,2022-03-11 04:09:00,2022-03-11 04:24:00,Kobe,5937,0,4318179,CKB +Ruby,Kobe,2022-03-11 04:24:00,2022-03-11 04:24:00,Beckham,0.06,0,4318179,CKB +Rosie,Beckham,2022-03-11 00:57:00,2022-03-11 00:57:00,Lexi,0.06,0,4319354,CKB +Rosie,Lexi,2022-03-11 00:57:00,2022-03-11 01:06:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 01:06:00,2022-03-11 01:11:00,Lexi,2936,16,4319354,CKB +Rosie,Lexi,2022-03-11 01:27:00,2022-03-11 01:36:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 01:36:00,2022-03-11 01:41:00,Lexi,2936,16,4319354,CKB +Rosie,Lexi,2022-03-11 01:57:00,2022-03-11 02:06:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 02:06:00,2022-03-11 02:11:00,Lexi,2936,16,4319354,CKB +Rosie,Lexi,2022-03-11 02:27:00,2022-03-11 02:36:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 02:36:00,2022-03-11 02:41:00,Lexi,2936,16,4319354,CKB +Rosie,Lexi,2022-03-11 02:57:00,2022-03-11 03:06:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 03:06:00,2022-03-11 03:11:00,Lexi,2936,16,4319354,CKB +Rosie,Lexi,2022-03-11 03:27:00,2022-03-11 03:36:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 03:36:00,2022-03-11 03:41:00,Lexi,2936,16,4319354,CKB +Rosie,Lexi,2022-03-11 03:57:00,2022-03-11 04:06:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 04:06:00,2022-03-11 04:11:00,Lexi,2936,16,4319354,CKB +Rosie,Lexi,2022-03-11 04:27:00,2022-03-11 04:36:00,Colton,4343,0,4319354,CKB +Rosie,Colton,2022-03-11 04:36:00,2022-03-11 04:36:00,Beckham,0.06,0,4319354,CKB +Daxton,Beckham,2022-03-11 00:29:00,2022-03-11 00:29:00,Harper,0.06,0,4751089,CKB +Daxton,Harper,2022-03-11 00:29:00,2022-03-11 00:41:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 00:47:00,2022-03-11 00:57:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 00:59:00,2022-03-11 01:11:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 01:17:00,2022-03-11 01:27:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 01:29:00,2022-03-11 01:41:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 01:47:00,2022-03-11 01:57:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 01:59:00,2022-03-11 02:11:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 02:17:00,2022-03-11 02:27:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 02:29:00,2022-03-11 02:41:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 02:47:00,2022-03-11 02:57:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 02:59:00,2022-03-11 03:11:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 03:17:00,2022-03-11 03:27:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 03:29:00,2022-03-11 03:41:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 03:47:00,2022-03-11 03:57:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 03:59:00,2022-03-11 04:11:00,Calvin,4481,6,4751089,CKB +Daxton,Calvin,2022-03-11 04:17:00,2022-03-11 04:27:00,Harper,4031,2,4751089,CKB +Daxton,Harper,2022-03-11 04:29:00,2022-03-11 04:41:00,Calvin,4481,0,4751089,CKB +Daxton,Calvin,2022-03-11 04:41:00,2022-03-11 04:41:00,Beckham,0.06,0,4751089,CKB +Andy,Beckham,2022-03-11 00:30:00,2022-03-11 00:30:00,Harper,0.06,0,4453547,CKB +Andy,Harper,2022-03-11 00:30:00,2022-03-11 00:44:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 00:44:00,2022-03-11 00:57:00,Harper,5302,3,4453547,CKB +Andy,Harper,2022-03-11 01:00:00,2022-03-11 01:14:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 01:14:00,2022-03-11 01:27:00,Harper,5302,3,4453547,CKB +Andy,Harper,2022-03-11 01:30:00,2022-03-11 01:44:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 01:44:00,2022-03-11 01:57:00,Harper,5302,3,4453547,CKB +Andy,Harper,2022-03-11 02:00:00,2022-03-11 02:14:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 02:14:00,2022-03-11 02:27:00,Harper,5302,3,4453547,CKB +Andy,Harper,2022-03-11 02:30:00,2022-03-11 02:44:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 02:44:00,2022-03-11 02:57:00,Harper,5302,3,4453547,CKB +Andy,Harper,2022-03-11 03:00:00,2022-03-11 03:14:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 03:14:00,2022-03-11 03:27:00,Harper,5302,3,4453547,CKB +Andy,Harper,2022-03-11 03:30:00,2022-03-11 03:44:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 03:44:00,2022-03-11 03:57:00,Harper,5302,3,4453547,CKB +Andy,Harper,2022-03-11 04:00:00,2022-03-11 04:14:00,Elise,4801,0,4453547,CKB +Andy,Elise,2022-03-11 04:14:00,2022-03-11 04:27:00,Harper,5302,0,4453547,CKB +Andy,Harper,2022-03-11 04:27:00,2022-03-11 04:27:00,Beckham,0.06,0,4453547,CKB +Alex,Beckham,2022-03-11 00:43:00,2022-03-11 00:43:00,Chase,0.06,0,4374469,CKB +Alex,Chase,2022-03-11 00:43:00,2022-03-11 01:33:00,Chase,20434,10,4374469,CKB +Alex,Chase,2022-03-11 01:43:00,2022-03-11 02:33:00,Chase,20434,10,4374469,CKB +Alex,Chase,2022-03-11 02:43:00,2022-03-11 03:33:00,Chase,20434,10,4374469,CKB +Alex,Chase,2022-03-11 03:43:00,2022-03-11 04:33:00,Chase,20434,0,4374469,CKB +Alex,Chase,2022-03-11 04:33:00,2022-03-11 04:33:00,Beckham,0.06,0,4374469,CKB +Alex,Beckham,2022-03-11 00:13:00,2022-03-11 00:13:00,Chase,0.06,0,4374474,CKB +Alex,Chase,2022-03-11 00:13:00,2022-03-11 01:03:00,Chase,20434,10,4374474,CKB +Alex,Chase,2022-03-11 01:13:00,2022-03-11 02:03:00,Chase,20434,10,4374474,CKB +Alex,Chase,2022-03-11 02:13:00,2022-03-11 03:03:00,Chase,20434,10,4374474,CKB +Alex,Chase,2022-03-11 03:13:00,2022-03-11 04:03:00,Chase,20434,0,4374474,CKB +Alex,Chase,2022-03-11 04:03:00,2022-03-11 04:03:00,Beckham,0.06,0,4374474,CKB +Hazel,Beckham,2022-03-11 00:24:00,2022-03-11 00:24:00,Celine,0.06,0,4456450,CKB +Hazel,Celine,2022-03-11 00:24:00,2022-03-11 00:48:00,Kali,11.86,4,4456450,CKB +Hazel,Kali,2022-03-11 00:52:00,2022-03-11 01:14:00,Celine,11139,10,4456450,CKB +Hazel,Celine,2022-03-11 01:24:00,2022-03-11 01:48:00,Kali,11.86,4,4456450,CKB +Hazel,Kali,2022-03-11 01:52:00,2022-03-11 02:14:00,Celine,11139,10,4456450,CKB +Hazel,Celine,2022-03-11 02:24:00,2022-03-11 02:48:00,Kali,11.86,4,4456450,CKB +Hazel,Kali,2022-03-11 02:52:00,2022-03-11 03:14:00,Celine,11139,10,4456450,CKB +Hazel,Celine,2022-03-11 03:24:00,2022-03-11 03:48:00,Kali,11.86,4,4456450,CKB +Hazel,Kali,2022-03-11 03:52:00,2022-03-11 04:14:00,Celine,11139,0,4456450,CKB +Hazel,Celine,2022-03-11 04:14:00,2022-03-11 04:14:00,Beckham,0.06,0,4456450,CKB +Hazel,Beckham,2022-03-11 00:22:00,2022-03-11 00:22:00,Kali,0.06,0,4456458,CKB +Hazel,Kali,2022-03-11 00:22:00,2022-03-11 00:44:00,Celine,11139,10,4456458,CKB +Hazel,Celine,2022-03-11 00:54:00,2022-03-11 01:18:00,Kali,11.86,4,4456458,CKB +Hazel,Kali,2022-03-11 01:22:00,2022-03-11 01:44:00,Celine,11139,10,4456458,CKB +Hazel,Celine,2022-03-11 01:54:00,2022-03-11 02:18:00,Kali,11.86,4,4456458,CKB +Hazel,Kali,2022-03-11 02:22:00,2022-03-11 02:44:00,Celine,11139,10,4456458,CKB +Hazel,Celine,2022-03-11 02:54:00,2022-03-11 03:18:00,Kali,11.86,4,4456458,CKB +Hazel,Kali,2022-03-11 03:22:00,2022-03-11 03:44:00,Celine,11139,10,4456458,CKB +Hazel,Celine,2022-03-11 03:54:00,2022-03-11 04:18:00,Kali,11.86,4,4456458,CKB +Hazel,Kali,2022-03-11 04:22:00,2022-03-11 04:44:00,Celine,11139,0,4456458,CKB +Hazel,Celine,2022-03-11 04:44:00,2022-03-11 04:44:00,Beckham,0.06,0,4456458,CKB +Emilio,Beckham,2022-03-11 00:32:00,2022-03-11 00:32:00,Rose,0.06,0,4747652,CKB +Emilio,Rose,2022-03-11 00:32:00,2022-03-11 00:44:00,Brooklynn,4212,3,4747652,CKB +Emilio,Brooklynn,2022-03-11 00:47:00,2022-03-11 01:16:00,Francis,13048,0,4747652,CKB +Emilio,Francis,2022-03-11 01:16:00,2022-03-11 01:42:00,Brooklynn,12869,5,4747652,CKB +Emilio,Brooklynn,2022-03-11 01:47:00,2022-03-11 02:16:00,Francis,13048,0,4747652,CKB +Emilio,Francis,2022-03-11 02:16:00,2022-03-11 02:42:00,Brooklynn,12869,5,4747652,CKB +Emilio,Brooklynn,2022-03-11 02:47:00,2022-03-11 03:16:00,Francis,13048,0,4747652,CKB +Emilio,Francis,2022-03-11 03:16:00,2022-03-11 03:42:00,Brooklynn,12869,5,4747652,CKB +Emilio,Brooklynn,2022-03-11 03:47:00,2022-03-11 04:16:00,Francis,13048,0,4747652,CKB +Emilio,Francis,2022-03-11 04:16:00,2022-03-11 04:34:00,Gia,9538,0,4747652,CKB +Emilio,Gia,2022-03-11 04:34:00,2022-03-11 04:34:00,Beckham,0.06,0,4747652,CKB +Emilio,Beckham,2022-03-11 00:17:00,2022-03-11 00:17:00,Brooklynn,0.06,0,4747662,CKB +Emilio,Brooklynn,2022-03-11 00:17:00,2022-03-11 00:46:00,Francis,13048,0,4747662,CKB +Emilio,Francis,2022-03-11 00:46:00,2022-03-11 01:12:00,Brooklynn,12869,5,4747662,CKB +Emilio,Brooklynn,2022-03-11 01:17:00,2022-03-11 01:46:00,Francis,13048,0,4747662,CKB +Emilio,Francis,2022-03-11 01:46:00,2022-03-11 02:12:00,Brooklynn,12869,5,4747662,CKB +Emilio,Brooklynn,2022-03-11 02:17:00,2022-03-11 02:46:00,Francis,13048,0,4747662,CKB +Emilio,Francis,2022-03-11 02:46:00,2022-03-11 03:12:00,Brooklynn,12869,5,4747662,CKB +Emilio,Brooklynn,2022-03-11 03:17:00,2022-03-11 03:46:00,Francis,13048,0,4747662,CKB +Emilio,Francis,2022-03-11 03:46:00,2022-03-11 04:12:00,Brooklynn,12869,5,4747662,CKB +Emilio,Brooklynn,2022-03-11 04:17:00,2022-03-11 04:28:00,Rose,4316,0,4747662,CKB +Emilio,Rose,2022-03-11 04:28:00,2022-03-11 04:28:00,Beckham,0.06,0,4747662,CKB +Ryder,Beckham,2022-03-11 00:49:00,2022-03-11 00:49:00,Kehlani,0.06,0,4434343,CKB +Ryder,Kehlani,2022-03-11 00:49:00,2022-03-11 01:04:00,Ariyah,10229,0,4434343,CKB +Ryder,Ariyah,2022-03-11 01:04:00,2022-03-11 01:19:00,Kehlani,11801,0,4434343,CKB +Ryder,Kehlani,2022-03-11 01:19:00,2022-03-11 01:34:00,Ariyah,10229,0,4434343,CKB +Ryder,Ariyah,2022-03-11 01:34:00,2022-03-11 01:49:00,Kehlani,11801,0,4434343,CKB +Ryder,Kehlani,2022-03-11 01:49:00,2022-03-11 02:04:00,Ariyah,10229,0,4434343,CKB +Ryder,Ariyah,2022-03-11 02:04:00,2022-03-11 02:19:00,Kehlani,11801,0,4434343,CKB +Ryder,Kehlani,2022-03-11 02:19:00,2022-03-11 02:34:00,Ariyah,10229,0,4434343,CKB +Ryder,Ariyah,2022-03-11 02:34:00,2022-03-11 02:49:00,Kehlani,11801,0,4434343,CKB +Ryder,Kehlani,2022-03-11 02:49:00,2022-03-11 03:04:00,Ariyah,10229,0,4434343,CKB +Ryder,Ariyah,2022-03-11 03:04:00,2022-03-11 03:19:00,Kehlani,11801,0,4434343,CKB +Ryder,Kehlani,2022-03-11 03:19:00,2022-03-11 03:34:00,Ariyah,10229,0,4434343,CKB +Ryder,Ariyah,2022-03-11 03:34:00,2022-03-11 03:49:00,Kehlani,11801,0,4434343,CKB +Ryder,Kehlani,2022-03-11 03:49:00,2022-03-11 04:04:00,Ariyah,10229,0,4434343,CKB +Ryder,Ariyah,2022-03-11 04:04:00,2022-03-11 04:19:00,Kehlani,11801,23,4434343,CKB +Kian,Kehlani,2022-03-11 04:42:00,2022-03-11 05:04:00,Finley,6.81,0,4434343,CKB +Kian,Finley,2022-03-11 05:04:00,2022-03-11 05:04:00,Beckham,0.06,0,4434343,CKB +Jake,Beckham,2022-03-11 00:32:00,2022-03-11 00:32:00,Rose,0.06,0,4434899,CKB +Jake,Rose,2022-03-11 00:32:00,2022-03-11 00:57:00,Kamila,11545,6,4434899,CKB +Jake,Kamila,2022-03-11 01:03:00,2022-03-11 01:46:00,Kayleigh,20579,1,4434899,CKB +Jake,Kayleigh,2022-03-11 01:47:00,2022-03-11 02:25:00,Kamila,20641,8,4434899,CKB +Jake,Kamila,2022-03-11 02:33:00,2022-03-11 03:16:00,Kayleigh,20579,1,4434899,CKB +Jake,Kayleigh,2022-03-11 03:17:00,2022-03-11 03:55:00,Kamila,20641,8,4434899,CKB +Jake,Kamila,2022-03-11 04:03:00,2022-03-11 04:28:00,Rose,11499,0,4434899,CKB +Jake,Rose,2022-03-11 04:28:00,2022-03-11 04:28:00,Beckham,0.06,0,4434899,CKB +Jake,Beckham,2022-03-11 00:33:00,2022-03-11 00:33:00,Kamila,0.06,0,4434904,CKB +Jake,Kamila,2022-03-11 00:33:00,2022-03-11 01:16:00,Kayleigh,20579,1,4434904,CKB +Jake,Kayleigh,2022-03-11 01:17:00,2022-03-11 01:55:00,Kamila,20641,8,4434904,CKB +Jake,Kamila,2022-03-11 02:03:00,2022-03-11 02:46:00,Kayleigh,20579,1,4434904,CKB +Jake,Kayleigh,2022-03-11 02:47:00,2022-03-11 03:25:00,Kamila,20641,8,4434904,CKB +Jake,Kamila,2022-03-11 03:33:00,2022-03-11 04:16:00,Kayleigh,20579,1,4434904,CKB +Jake,Kayleigh,2022-03-11 04:17:00,2022-03-11 04:51:00,Willa,18752,0,4434904,CKB +Jake,Willa,2022-03-11 04:51:00,2022-03-11 04:51:00,Beckham,0.06,0,4434904,CKB +Aziel,Beckham,2022-03-11 00:34:00,2022-03-11 00:34:00,Miles,0.06,0,4619768,CKB +Aziel,Miles,2022-03-11 00:34:00,2022-03-11 01:00:00,Delilah,9016,0,4619768,CKB +Aziel,Delilah,2022-03-11 01:00:00,2022-03-11 01:27:00,Miles,10083,7,4619768,CKB +Aziel,Miles,2022-03-11 01:34:00,2022-03-11 02:00:00,Delilah,9016,0,4619768,CKB +Aziel,Delilah,2022-03-11 02:00:00,2022-03-11 02:27:00,Miles,10083,7,4619768,CKB +Aziel,Miles,2022-03-11 02:34:00,2022-03-11 03:00:00,Delilah,9016,0,4619768,CKB +Aziel,Delilah,2022-03-11 03:00:00,2022-03-11 03:27:00,Miles,10083,7,4619768,CKB +Aziel,Miles,2022-03-11 03:34:00,2022-03-11 04:00:00,Delilah,9016,0,4619768,CKB +Aziel,Delilah,2022-03-11 04:00:00,2022-03-11 04:27:00,Miles,10083,0,4619768,CKB +Aziel,Miles,2022-03-11 04:27:00,2022-03-11 04:27:00,Beckham,0.06,0,4619768,CKB +Aziel,Beckham,2022-03-11 00:30:00,2022-03-11 00:30:00,Delilah,0.06,0,4619993,CKB +Aziel,Delilah,2022-03-11 00:30:00,2022-03-11 00:57:00,Miles,10083,7,4619993,CKB +Aziel,Miles,2022-03-11 01:04:00,2022-03-11 01:30:00,Delilah,9016,0,4619993,CKB +Aziel,Delilah,2022-03-11 01:30:00,2022-03-11 01:57:00,Miles,10083,7,4619993,CKB +Aziel,Miles,2022-03-11 02:04:00,2022-03-11 02:30:00,Delilah,9016,0,4619993,CKB +Aziel,Delilah,2022-03-11 02:30:00,2022-03-11 02:57:00,Miles,10083,7,4619993,CKB +Aziel,Miles,2022-03-11 03:04:00,2022-03-11 03:30:00,Delilah,9016,0,4619993,CKB +Aziel,Delilah,2022-03-11 03:30:00,2022-03-11 03:57:00,Miles,10083,7,4619993,CKB +Aziel,Miles,2022-03-11 04:04:00,2022-03-11 04:30:00,Delilah,9016,0,4619993,CKB +Aziel,Delilah,2022-03-11 04:30:00,2022-03-11 04:57:00,Miles,10083,0,4619993,CKB +Aziel,Miles,2022-03-11 04:57:00,2022-03-11 04:57:00,Beckham,0.06,0,4619993,CKB +Dalton,Beckham,2022-03-11 00:31:00,2022-03-11 00:31:00,Kamila,0.06,0,4374746,CKB +Dalton,Kamila,2022-03-11 00:31:00,2022-03-11 00:44:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 00:44:00,2022-03-11 00:56:00,Kamila,5362,5,4374746,CKB +Dalton,Kamila,2022-03-11 01:01:00,2022-03-11 01:14:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 01:14:00,2022-03-11 01:26:00,Kamila,5362,5,4374746,CKB +Dalton,Kamila,2022-03-11 01:31:00,2022-03-11 01:44:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 01:44:00,2022-03-11 01:56:00,Kamila,5362,5,4374746,CKB +Dalton,Kamila,2022-03-11 02:01:00,2022-03-11 02:14:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 02:14:00,2022-03-11 02:26:00,Kamila,5362,5,4374746,CKB +Dalton,Kamila,2022-03-11 02:31:00,2022-03-11 02:44:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 02:44:00,2022-03-11 02:56:00,Kamila,5362,5,4374746,CKB +Dalton,Kamila,2022-03-11 03:01:00,2022-03-11 03:14:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 03:14:00,2022-03-11 03:26:00,Kamila,5362,5,4374746,CKB +Dalton,Kamila,2022-03-11 03:31:00,2022-03-11 03:44:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 03:44:00,2022-03-11 03:56:00,Kamila,5362,5,4374746,CKB +Dalton,Kamila,2022-03-11 04:01:00,2022-03-11 04:14:00,Veronica,4872,0,4374746,CKB +Dalton,Veronica,2022-03-11 04:14:00,2022-03-11 04:26:00,Kamila,5362,0,4374746,CKB +Dalton,Kamila,2022-03-11 04:26:00,2022-03-11 04:26:00,Beckham,0.06,0,4374746,CKB +Jamison,Beckham,2022-03-11 00:31:00,2022-03-11 00:31:00,Kamila,0.06,0,4374869,CKB +Jamison,Kamila,2022-03-11 00:31:00,2022-03-11 00:45:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 00:47:00,2022-03-11 01:01:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 01:01:00,2022-03-11 01:15:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 01:17:00,2022-03-11 01:31:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 01:31:00,2022-03-11 01:45:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 01:47:00,2022-03-11 02:01:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 02:01:00,2022-03-11 02:15:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 02:17:00,2022-03-11 02:31:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 02:31:00,2022-03-11 02:45:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 02:47:00,2022-03-11 03:01:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 03:01:00,2022-03-11 03:15:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 03:17:00,2022-03-11 03:31:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 03:31:00,2022-03-11 03:45:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 03:47:00,2022-03-11 04:01:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 04:01:00,2022-03-11 04:15:00,Liana,5225,2,4374869,CKB +Jamison,Liana,2022-03-11 04:17:00,2022-03-11 04:31:00,Kamila,7617,0,4374869,CKB +Jamison,Kamila,2022-03-11 04:31:00,2022-03-11 04:31:00,Beckham,0.06,0,4374869,CKB +Keegan,Beckham,2022-03-11 00:43:00,2022-03-11 00:43:00,Charleigh,0.06,0,4375015,CKB +Keegan,Charleigh,2022-03-11 00:43:00,2022-03-11 00:53:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 00:53:00,2022-03-11 01:03:00,Charleigh,4408,10,4375015,CKB +Keegan,Charleigh,2022-03-11 01:13:00,2022-03-11 01:23:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 01:23:00,2022-03-11 01:33:00,Charleigh,4408,10,4375015,CKB +Keegan,Charleigh,2022-03-11 01:43:00,2022-03-11 01:53:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 01:53:00,2022-03-11 02:03:00,Charleigh,4408,10,4375015,CKB +Keegan,Charleigh,2022-03-11 02:13:00,2022-03-11 02:23:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 02:23:00,2022-03-11 02:33:00,Charleigh,4408,10,4375015,CKB +Keegan,Charleigh,2022-03-11 02:43:00,2022-03-11 02:53:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 02:53:00,2022-03-11 03:03:00,Charleigh,4408,10,4375015,CKB +Keegan,Charleigh,2022-03-11 03:13:00,2022-03-11 03:23:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 03:23:00,2022-03-11 03:33:00,Charleigh,4408,10,4375015,CKB +Keegan,Charleigh,2022-03-11 03:43:00,2022-03-11 03:53:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 03:53:00,2022-03-11 04:03:00,Charleigh,4408,10,4375015,CKB +Keegan,Charleigh,2022-03-11 04:13:00,2022-03-11 04:23:00,Eli,4507,0,4375015,CKB +Keegan,Eli,2022-03-11 04:23:00,2022-03-11 04:33:00,Charleigh,4408,0,4375015,CKB +Keegan,Charleigh,2022-03-11 04:33:00,2022-03-11 04:33:00,Beckham,0.06,0,4375015,CKB +Ayaan,Beckham,2022-03-11 21:31:00,2022-03-11 21:31:00,Kalani,0.06,0,4454947,CKB +Ayaan,Kalani,2022-03-11 21:31:00,2022-03-11 22:04:00,Brian,14519,4,4454947,CKB +Ayaan,Brian,2022-03-11 22:08:00,2022-03-11 22:43:00,Kalani,13541,8,4454947,CKB +Ayaan,Kalani,2022-03-11 22:51:00,2022-03-11 23:24:00,Brian,14519,4,4454947,CKB +Ayaan,Brian,2022-03-11 23:28:00,2022-03-12 00:03:00,Kalani,13541,8,4454947,CKB +Ayaan,Kalani,2022-03-12 00:11:00,2022-03-12 00:44:00,Brian,14519,0,4454947,CKB +Hunter,Brian,2022-03-12 00:44:00,2022-03-12 00:54:00,Kehlani,4.1,25,4454947,CKB +Hunter,Kehlani,2022-03-12 01:19:00,2022-03-12 01:42:00,Ayden,8.36,6,4454947,CKB +Hunter,Ayden,2022-03-12 01:48:00,2022-03-12 02:06:00,Kehlani,9067,13,4454947,CKB +Hunter,Kehlani,2022-03-12 02:19:00,2022-03-12 02:42:00,Ayden,8.36,6,4454947,CKB +Hunter,Ayden,2022-03-12 02:48:00,2022-03-12 03:06:00,Kehlani,9067,13,4454947,CKB +Hunter,Kehlani,2022-03-12 03:19:00,2022-03-12 03:42:00,Ayden,8.36,6,4454947,CKB +Hunter,Ayden,2022-03-12 03:48:00,2022-03-12 04:06:00,Kehlani,9067,13,4454947,CKB +Hunter,Kehlani,2022-03-12 04:19:00,2022-03-12 04:42:00,Ayden,8.36,6,4454947,CKB +Hunter,Ayden,2022-03-12 04:48:00,2022-03-12 05:06:00,Kehlani,9067,13,4454947,CKB +Hunter,Kehlani,2022-03-12 05:19:00,2022-03-12 05:42:00,Ayden,8.36,16,4454947,CKB +Kian,Ayden,2022-03-12 05:58:00,2022-03-12 06:34:00,Finley,12968,0,4454947,CKB +Kian,Finley,2022-03-12 06:34:00,2022-03-12 06:34:00,Beckham,0.06,0,4454947,CKB +Ayaan,Beckham,2022-03-11 22:11:00,2022-03-11 22:11:00,Kalani,0.06,0,4454952,CKB +Ayaan,Kalani,2022-03-11 22:11:00,2022-03-11 22:44:00,Brian,14519,4,4454952,CKB +Ayaan,Brian,2022-03-11 22:48:00,2022-03-11 23:23:00,Kalani,13541,8,4454952,CKB +Ayaan,Kalani,2022-03-11 23:31:00,2022-03-12 00:04:00,Brian,14519,4,4454952,CKB +Ayaan,Brian,2022-03-12 00:08:00,2022-03-12 00:39:00,Leonel,12213,0,4454952,CKB +Hunter,Leonel,2022-03-12 00:39:00,2022-03-12 00:47:00,Kehlani,4.0,2,4454952,CKB +Hunter,Kehlani,2022-03-12 00:49:00,2022-03-12 01:12:00,Ayden,8.36,6,4454952,CKB +Hunter,Ayden,2022-03-12 01:18:00,2022-03-12 01:36:00,Kehlani,9067,13,4454952,CKB +Hunter,Kehlani,2022-03-12 01:49:00,2022-03-12 02:12:00,Ayden,8.36,6,4454952,CKB +Hunter,Ayden,2022-03-12 02:18:00,2022-03-12 02:36:00,Kehlani,9067,13,4454952,CKB +Hunter,Kehlani,2022-03-12 02:49:00,2022-03-12 03:12:00,Ayden,8.36,6,4454952,CKB +Hunter,Ayden,2022-03-12 03:18:00,2022-03-12 03:36:00,Kehlani,9067,13,4454952,CKB +Hunter,Kehlani,2022-03-12 03:49:00,2022-03-12 04:12:00,Ayden,8.36,6,4454952,CKB +Hunter,Ayden,2022-03-12 04:18:00,2022-03-12 04:36:00,Kehlani,9067,13,4454952,CKB +Hunter,Kehlani,2022-03-12 04:49:00,2022-03-12 05:12:00,Ayden,8.36,6,4454952,CKB +Hunter,Ayden,2022-03-12 05:18:00,2022-03-12 05:36:00,Kehlani,9067,0,4454952,CKB +Hunter,Kehlani,2022-03-12 05:36:00,2022-03-12 05:36:00,Beckham,0.06,0,4454952,CKB +Donovan,Beckham,2022-03-11 21:06:00,2022-03-11 21:06:00,Pierce,0.06,0,4664738,CKB +Donovan,Pierce,2022-03-11 21:06:00,2022-03-11 21:34:00,Leonardo,13018,19,4664738,CKB +Donovan,Leonardo,2022-03-11 21:53:00,2022-03-11 22:13:00,Kamryn,10332,17,4664738,CKB +Donovan,Kamryn,2022-03-11 22:30:00,2022-03-11 22:54:00,Leonardo,10.48,19,4664738,CKB +Donovan,Leonardo,2022-03-11 23:13:00,2022-03-11 23:33:00,Kamryn,10332,17,4664738,CKB +Donovan,Kamryn,2022-03-11 23:50:00,2022-03-12 00:14:00,Leonardo,10.48,8,4664738,CKB +Donovan,Leonardo,2022-03-12 00:22:00,2022-03-12 00:27:00,Iker,2533,2,4664738,CKB +Zoey,Iker,2022-03-12 00:29:00,2022-03-12 00:47:00,Brinley,7.58,0,4664738,CKB +Zoey,Brinley,2022-03-12 00:47:00,2022-03-12 01:14:00,Finn,12841,3,4664738,CKB +Zoey,Finn,2022-03-12 01:17:00,2022-03-12 01:47:00,Brinley,14281,0,4664738,CKB +Zoey,Brinley,2022-03-12 01:47:00,2022-03-12 02:14:00,Finn,12841,3,4664738,CKB +Zoey,Finn,2022-03-12 02:17:00,2022-03-12 02:47:00,Brinley,14281,0,4664738,CKB +Zoey,Brinley,2022-03-12 02:47:00,2022-03-12 03:14:00,Finn,12841,3,4664738,CKB +Zoey,Finn,2022-03-12 03:17:00,2022-03-12 03:47:00,Brinley,14281,0,4664738,CKB +Zoey,Brinley,2022-03-12 03:47:00,2022-03-12 04:14:00,Finn,12841,3,4664738,CKB +Zoey,Finn,2022-03-12 04:17:00,2022-03-12 04:47:00,Brinley,14281,0,4664738,CKB +Zoey,Brinley,2022-03-12 04:47:00,2022-03-12 05:14:00,Finn,12841,3,4664738,CKB +Zoey,Finn,2022-03-12 05:17:00,2022-03-12 05:47:00,Brinley,14281,0,4664738,CKB +Zoey,Brinley,2022-03-12 05:47:00,2022-03-12 05:47:00,Beckham,0.06,0,4664738,CKB +Donovan,Beckham,2022-03-11 20:26:00,2022-03-11 20:26:00,Pierce,0.06,0,4762763,CKB +Donovan,Pierce,2022-03-11 20:26:00,2022-03-11 20:56:00,Ezra,14097,14,4762763,CKB +Donovan,Ezra,2022-03-11 21:10:00,2022-03-11 21:38:00,Pierce,13.19,8,4762763,CKB +Donovan,Pierce,2022-03-11 21:46:00,2022-03-11 22:14:00,Leonardo,13018,19,4762763,CKB +Donovan,Leonardo,2022-03-11 22:33:00,2022-03-11 22:53:00,Kamryn,10332,17,4762763,CKB +Donovan,Kamryn,2022-03-11 23:10:00,2022-03-11 23:34:00,Leonardo,10.48,19,4762763,CKB +Donovan,Leonardo,2022-03-11 23:53:00,2022-03-12 00:13:00,Kamryn,10332,2,4762763,CKB +Donovan,Kamryn,2022-03-12 00:15:00,2022-03-12 00:16:00,Brinley,506,1,4762763,CKB +Zoey,Brinley,2022-03-12 00:17:00,2022-03-12 00:44:00,Finn,12841,3,4762763,CKB +Zoey,Finn,2022-03-12 00:47:00,2022-03-12 01:17:00,Brinley,14281,0,4762763,CKB +Zoey,Brinley,2022-03-12 01:17:00,2022-03-12 01:44:00,Finn,12841,3,4762763,CKB +Zoey,Finn,2022-03-12 01:47:00,2022-03-12 02:17:00,Brinley,14281,0,4762763,CKB +Zoey,Brinley,2022-03-12 02:17:00,2022-03-12 02:44:00,Finn,12841,3,4762763,CKB +Zoey,Finn,2022-03-12 02:47:00,2022-03-12 03:17:00,Brinley,14281,0,4762763,CKB +Zoey,Brinley,2022-03-12 03:17:00,2022-03-12 03:44:00,Finn,12841,3,4762763,CKB +Zoey,Finn,2022-03-12 03:47:00,2022-03-12 04:17:00,Brinley,14281,0,4762763,CKB +Zoey,Brinley,2022-03-12 04:17:00,2022-03-12 04:44:00,Finn,12841,3,4762763,CKB +Zoey,Finn,2022-03-12 04:47:00,2022-03-12 05:17:00,Brinley,14281,0,4762763,CKB +Zoey,Brinley,2022-03-12 05:17:00,2022-03-12 05:29:00,Iker,5474,0,4762763,CKB +Zoey,Iker,2022-03-12 05:29:00,2022-03-12 05:29:00,Beckham,0.06,0,4762763,CKB +Avery,Beckham,2022-03-11 22:56:00,2022-03-11 22:56:00,Jace,0.06,0,4617429,CKB +Avery,Jace,2022-03-11 22:56:00,2022-03-11 23:08:00,Nathan,5882,3,4617429,CKB +Avery,Nathan,2022-03-11 23:11:00,2022-03-11 23:25:00,Jace,6232,0,4617429,CKB +Avery,Jace,2022-03-11 23:25:00,2022-03-11 23:38:00,Nathan,6086,3,4617429,CKB +Avery,Nathan,2022-03-11 23:41:00,2022-03-11 23:55:00,Jace,6232,0,4617429,CKB +Avery,Jace,2022-03-11 23:55:00,2022-03-12 00:08:00,Nathan,6086,0,4617429,CKB +Avery,Nathan,2022-03-12 00:08:00,2022-03-12 00:08:00,Beckham,0.06,0,4617429,CKB +Richard,Beckham,2022-03-11 05:05:00,2022-03-11 05:05:00,Ariyah,0.06,0,4426848,CKB +Richard,Ariyah,2022-03-11 05:05:00,2022-03-11 05:14:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 05:14:00,2022-03-11 05:23:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 05:25:00,2022-03-11 05:34:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 05:34:00,2022-03-11 05:43:00,Ariyah,5139,23,4426848,CKB +Richard,Ariyah,2022-03-11 06:06:00,2022-03-11 06:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 06:15:00,2022-03-11 06:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 06:26:00,2022-03-11 06:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 06:35:00,2022-03-11 06:44:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 06:46:00,2022-03-11 06:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 06:55:00,2022-03-11 07:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 07:06:00,2022-03-11 07:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 07:15:00,2022-03-11 07:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 07:26:00,2022-03-11 07:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 07:35:00,2022-03-11 07:44:00,Ariyah,5139,22,4426848,CKB +Richard,Ariyah,2022-03-11 08:06:00,2022-03-11 08:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 08:15:00,2022-03-11 08:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 08:26:00,2022-03-11 08:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 08:35:00,2022-03-11 08:44:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 08:46:00,2022-03-11 08:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 08:55:00,2022-03-11 09:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 09:06:00,2022-03-11 09:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 09:15:00,2022-03-11 09:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 09:26:00,2022-03-11 09:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 09:35:00,2022-03-11 09:44:00,Ariyah,5139,22,4426848,CKB +Richard,Ariyah,2022-03-11 10:06:00,2022-03-11 10:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 10:15:00,2022-03-11 10:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 10:26:00,2022-03-11 10:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 10:35:00,2022-03-11 10:44:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 10:46:00,2022-03-11 10:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 10:55:00,2022-03-11 11:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 11:06:00,2022-03-11 11:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 11:15:00,2022-03-11 11:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 11:26:00,2022-03-11 11:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 11:35:00,2022-03-11 11:44:00,Ariyah,5139,22,4426848,CKB +Richard,Ariyah,2022-03-11 12:06:00,2022-03-11 12:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 12:15:00,2022-03-11 12:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 12:26:00,2022-03-11 12:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 12:35:00,2022-03-11 12:44:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 12:46:00,2022-03-11 12:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 12:55:00,2022-03-11 13:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 13:06:00,2022-03-11 13:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 13:15:00,2022-03-11 13:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 13:26:00,2022-03-11 13:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 13:35:00,2022-03-11 13:44:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 13:46:00,2022-03-11 13:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 13:55:00,2022-03-11 14:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 14:06:00,2022-03-11 14:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 14:15:00,2022-03-11 14:24:00,Ariyah,5139,22,4426848,CKB +Richard,Ariyah,2022-03-11 14:46:00,2022-03-11 14:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 14:55:00,2022-03-11 15:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 15:06:00,2022-03-11 15:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 15:15:00,2022-03-11 15:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 15:26:00,2022-03-11 15:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 15:35:00,2022-03-11 15:44:00,Ariyah,5139,22,4426848,CKB +Richard,Ariyah,2022-03-11 16:06:00,2022-03-11 16:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 16:15:00,2022-03-11 16:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 16:26:00,2022-03-11 16:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 16:35:00,2022-03-11 16:44:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 16:46:00,2022-03-11 16:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 16:55:00,2022-03-11 17:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 17:06:00,2022-03-11 17:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 17:15:00,2022-03-11 17:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 17:26:00,2022-03-11 17:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 17:35:00,2022-03-11 17:44:00,Ariyah,5139,22,4426848,CKB +Richard,Ariyah,2022-03-11 18:06:00,2022-03-11 18:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 18:15:00,2022-03-11 18:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 18:26:00,2022-03-11 18:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 18:35:00,2022-03-11 18:44:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 18:46:00,2022-03-11 18:55:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 18:55:00,2022-03-11 19:04:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 19:06:00,2022-03-11 19:15:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 19:15:00,2022-03-11 19:24:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 19:26:00,2022-03-11 19:35:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 19:35:00,2022-03-11 19:44:00,Ariyah,5139,21,4426848,CKB +Richard,Ariyah,2022-03-11 20:05:00,2022-03-11 20:14:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 20:14:00,2022-03-11 20:23:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 20:25:00,2022-03-11 20:34:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 20:34:00,2022-03-11 20:43:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 20:45:00,2022-03-11 20:54:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 20:54:00,2022-03-11 21:03:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 21:05:00,2022-03-11 21:14:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 21:14:00,2022-03-11 21:23:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 21:25:00,2022-03-11 21:34:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 21:34:00,2022-03-11 21:43:00,Ariyah,5139,22,4426848,CKB +Richard,Ariyah,2022-03-11 22:05:00,2022-03-11 22:14:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 22:14:00,2022-03-11 22:23:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 22:25:00,2022-03-11 22:34:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 22:34:00,2022-03-11 22:43:00,Ariyah,5139,2,4426848,CKB +Richard,Ariyah,2022-03-11 22:45:00,2022-03-11 22:54:00,Jaden,4781,0,4426848,CKB +Richard,Jaden,2022-03-11 22:54:00,2022-03-11 23:03:00,Ariyah,5139,0,4426848,CKB +Richard,Ariyah,2022-03-11 23:03:00,2022-03-11 23:03:00,Beckham,0.06,0,4426848,CKB +Astrid,King,2022-03-11 05:15:00,2022-03-11 06:01:00,Brayden,17.9,0,4317628,VDL +Astrid,Brayden,2022-03-11 06:01:00,2022-03-11 06:15:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 06:23:00,2022-03-11 06:37:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 06:41:00,2022-03-11 06:55:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 07:03:00,2022-03-11 07:17:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 07:21:00,2022-03-11 07:35:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 07:43:00,2022-03-11 07:57:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 08:01:00,2022-03-11 08:15:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 08:23:00,2022-03-11 08:37:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 08:41:00,2022-03-11 08:55:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 09:03:00,2022-03-11 09:17:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 09:21:00,2022-03-11 09:35:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 09:43:00,2022-03-11 09:57:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 10:01:00,2022-03-11 10:15:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 10:23:00,2022-03-11 10:37:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 10:41:00,2022-03-11 10:55:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 11:03:00,2022-03-11 11:17:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 11:21:00,2022-03-11 11:35:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 11:43:00,2022-03-11 11:57:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 12:01:00,2022-03-11 12:15:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 12:23:00,2022-03-11 12:37:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 12:41:00,2022-03-11 12:55:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 13:03:00,2022-03-11 13:17:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 13:21:00,2022-03-11 13:35:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 13:43:00,2022-03-11 13:57:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 14:01:00,2022-03-11 14:15:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 14:23:00,2022-03-11 14:37:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 14:41:00,2022-03-11 14:55:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 15:03:00,2022-03-11 15:17:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 15:21:00,2022-03-11 15:35:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 15:43:00,2022-03-11 15:57:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 16:01:00,2022-03-11 16:15:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 16:23:00,2022-03-11 16:37:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 16:41:00,2022-03-11 16:55:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 17:03:00,2022-03-11 17:17:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 17:21:00,2022-03-11 17:35:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 17:43:00,2022-03-11 17:57:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 18:01:00,2022-03-11 18:15:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 18:23:00,2022-03-11 18:37:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 18:41:00,2022-03-11 18:55:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 19:03:00,2022-03-11 19:17:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 19:21:00,2022-03-11 19:35:00,Brayden,4637,8,4317628,VDL +Astrid,Brayden,2022-03-11 19:43:00,2022-03-11 19:57:00,Brayden,4637,4,4317628,VDL +Astrid,Brayden,2022-03-11 20:01:00,2022-03-11 20:14:00,Brayden,4637,9,4317628,VDL +Astrid,Brayden,2022-03-11 20:23:00,2022-03-11 20:36:00,Brayden,4637,0,4317628,VDL +Astrid,Brayden,2022-03-11 20:36:00,2022-03-11 21:15:00,King,19.8,0,4317628,VDL +Amy,Beckham,2022-03-11 04:56:00,2022-03-11 04:56:00,Izabella,0.06,18,4425671,CKB +Amy,Izabella,2022-03-11 05:14:00,2022-03-11 05:20:00,Tristan,3.29,0,4425671,CKB +Amy,Tristan,2022-03-11 05:20:00,2022-03-11 05:24:00,Izabella,2954,20,4425671,CKB +Amy,Izabella,2022-03-11 05:44:00,2022-03-11 05:50:00,Tristan,3.29,0,4425671,CKB +Amy,Tristan,2022-03-11 05:50:00,2022-03-11 05:54:00,Izabella,2954,5,4425671,CKB +Amy,Izabella,2022-03-11 05:59:00,2022-03-11 06:06:00,Tristan,3.29,2,4425671,CKB +Amy,Tristan,2022-03-11 06:08:00,2022-03-11 06:13:00,Izabella,2954,19,4425671,CKB +Amy,Izabella,2022-03-11 06:32:00,2022-03-11 06:39:00,Tristan,3.29,1,4425671,CKB +Amy,Tristan,2022-03-11 06:40:00,2022-03-11 06:45:00,Izabella,2954,7,4425671,CKB +Amy,Izabella,2022-03-11 06:52:00,2022-03-11 06:59:00,Tristan,3.29,1,4425671,CKB +Amy,Tristan,2022-03-11 07:00:00,2022-03-11 07:05:00,Izabella,2954,7,4425671,CKB +Amy,Izabella,2022-03-11 07:12:00,2022-03-11 07:19:00,Tristan,3.29,1,4425671,CKB +Amy,Tristan,2022-03-11 07:20:00,2022-03-11 07:25:00,Izabella,2954,7,4425671,CKB +Amy,Izabella,2022-03-11 07:32:00,2022-03-11 07:39:00,Tristan,3.29,1,4425671,CKB +Amy,Tristan,2022-03-11 07:40:00,2022-03-11 07:45:00,Izabella,2954,295,4425671,CKB +Amy,Izabella,2022-03-11 12:40:00,2022-03-11 12:47:00,Tristan,3.29,2,4425671,CKB +Amy,Tristan,2022-03-11 12:49:00,2022-03-11 12:54:00,Izabella,2954,46,4425671,CKB +Amy,Izabella,2022-03-11 13:40:00,2022-03-11 13:47:00,Tristan,3.29,2,4425671,CKB +Amy,Tristan,2022-03-11 13:49:00,2022-03-11 13:54:00,Izabella,2954,434,4425671,CKB +Amy,Izabella,2022-03-11 21:08:00,2022-03-11 21:08:00,Beckham,0.06,0,4425671,CKB +Matilda,Beckham,2022-03-11 07:20:00,2022-03-11 07:20:00,Izaiah,0.06,0,4448153,CKB +Matilda,Izaiah,2022-03-11 07:20:00,2022-03-11 07:50:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 08:00:00,2022-03-11 08:30:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 08:40:00,2022-03-11 09:10:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 09:20:00,2022-03-11 09:50:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 10:00:00,2022-03-11 10:30:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 10:40:00,2022-03-11 11:10:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 11:20:00,2022-03-11 11:50:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 12:00:00,2022-03-11 12:30:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 12:40:00,2022-03-11 13:10:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 13:20:00,2022-03-11 13:50:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 14:00:00,2022-03-11 14:30:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 14:40:00,2022-03-11 15:10:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 15:20:00,2022-03-11 15:50:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 16:00:00,2022-03-11 16:30:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 16:40:00,2022-03-11 17:10:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 17:20:00,2022-03-11 17:50:00,Izaiah,9266,10,4448153,CKB +Matilda,Izaiah,2022-03-11 18:00:00,2022-03-11 18:30:00,Izaiah,9266,0,4448153,CKB +Matilda,Izaiah,2022-03-11 18:30:00,2022-03-11 18:30:00,Beckham,0.06,0,4448153,CKB +Hailey,Beckham,2022-03-11 07:10:00,2022-03-11 07:10:00,Kaylani,0.06,0,4733898,CKB +Hailey,Kaylani,2022-03-11 07:10:00,2022-03-11 07:18:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 07:28:00,2022-03-11 07:40:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 07:40:00,2022-03-11 07:48:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 07:58:00,2022-03-11 08:10:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 08:10:00,2022-03-11 08:18:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 08:28:00,2022-03-11 08:40:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 08:40:00,2022-03-11 08:48:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 08:58:00,2022-03-11 09:10:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 09:10:00,2022-03-11 09:18:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 09:28:00,2022-03-11 09:40:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 09:40:00,2022-03-11 09:48:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 09:58:00,2022-03-11 10:10:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 10:10:00,2022-03-11 10:18:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 10:28:00,2022-03-11 10:40:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 10:40:00,2022-03-11 10:48:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 10:58:00,2022-03-11 11:10:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 11:10:00,2022-03-11 11:18:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 11:28:00,2022-03-11 11:40:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 11:40:00,2022-03-11 11:48:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 11:58:00,2022-03-11 12:10:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 12:10:00,2022-03-11 12:18:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 12:28:00,2022-03-11 12:40:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 12:40:00,2022-03-11 12:48:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 12:58:00,2022-03-11 13:10:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 13:10:00,2022-03-11 13:18:00,Cecilia,2169,10,4733898,CKB +Hailey,Cecilia,2022-03-11 13:28:00,2022-03-11 13:40:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 13:40:00,2022-03-11 13:48:00,Cecilia,2169,8,4733898,CKB +Hailey,Cecilia,2022-03-11 13:56:00,2022-03-11 14:10:00,Kaylani,2952,0,4733898,CKB +Hailey,Kaylani,2022-03-11 14:10:00,2022-03-11 14:19:00,Cecilia,2169,14,4733898,CKB +Hailey,Cecilia,2022-03-11 14:33:00,2022-03-11 14:47:00,Kaylani,2952,3,4733898,CKB +Hailey,Kaylani,2022-03-11 14:50:00,2022-03-11 14:59:00,Cecilia,2169,14,4733898,CKB +Hailey,Cecilia,2022-03-11 15:13:00,2022-03-11 15:27:00,Kaylani,2952,3,4733898,CKB +Hailey,Kaylani,2022-03-11 15:30:00,2022-03-11 15:39:00,Cecilia,2169,14,4733898,CKB +Hailey,Cecilia,2022-03-11 15:53:00,2022-03-11 16:07:00,Kaylani,2952,3,4733898,CKB +Hailey,Kaylani,2022-03-11 16:10:00,2022-03-11 16:19:00,Cecilia,2169,14,4733898,CKB +Hailey,Cecilia,2022-03-11 16:33:00,2022-03-11 16:47:00,Kaylani,2952,3,4733898,CKB +Hailey,Kaylani,2022-03-11 16:50:00,2022-03-11 16:59:00,Cecilia,2169,14,4733898,CKB +Hailey,Cecilia,2022-03-11 17:13:00,2022-03-11 17:27:00,Kaylani,2952,3,4733898,CKB +Hailey,Kaylani,2022-03-11 17:30:00,2022-03-11 17:39:00,Cecilia,2169,13,4733898,CKB +Hailey,Cecilia,2022-03-11 17:52:00,2022-03-11 18:05:00,Kaylani,2952,5,4733898,CKB +Hailey,Kaylani,2022-03-11 18:10:00,2022-03-11 18:18:00,Cecilia,2169,0,4733898,CKB +Hailey,Cecilia,2022-03-11 18:18:00,2022-03-11 18:18:00,Beckham,0.06,0,4733898,CKB +Hailey,Beckham,2022-03-11 14:13:00,2022-03-11 14:13:00,Cecilia,0.06,0,4734203,CKB +Hailey,Cecilia,2022-03-11 14:13:00,2022-03-11 14:27:00,Kaylani,2952,3,4734203,CKB +Hailey,Kaylani,2022-03-11 14:30:00,2022-03-11 14:39:00,Cecilia,2169,14,4734203,CKB +Hailey,Cecilia,2022-03-11 14:53:00,2022-03-11 15:07:00,Kaylani,2952,3,4734203,CKB +Hailey,Kaylani,2022-03-11 15:10:00,2022-03-11 15:19:00,Cecilia,2169,14,4734203,CKB +Hailey,Cecilia,2022-03-11 15:33:00,2022-03-11 15:47:00,Kaylani,2952,3,4734203,CKB +Hailey,Kaylani,2022-03-11 15:50:00,2022-03-11 15:59:00,Cecilia,2169,14,4734203,CKB +Hailey,Cecilia,2022-03-11 16:13:00,2022-03-11 16:27:00,Kaylani,2952,3,4734203,CKB +Hailey,Kaylani,2022-03-11 16:30:00,2022-03-11 16:39:00,Cecilia,2169,14,4734203,CKB +Hailey,Cecilia,2022-03-11 16:53:00,2022-03-11 17:07:00,Kaylani,2952,3,4734203,CKB +Hailey,Kaylani,2022-03-11 17:10:00,2022-03-11 17:19:00,Cecilia,2169,14,4734203,CKB +Hailey,Cecilia,2022-03-11 17:33:00,2022-03-11 17:47:00,Kaylani,2952,3,4734203,CKB +Hailey,Kaylani,2022-03-11 17:50:00,2022-03-11 17:59:00,Cecilia,2169,14,4734203,CKB +Hailey,Cecilia,2022-03-11 18:13:00,2022-03-11 18:25:00,Kaylani,2952,0,4734203,CKB +Hailey,Kaylani,2022-03-11 18:25:00,2022-03-11 18:25:00,Beckham,0.06,0,4734203,CKB +Matthias,Beckham,2022-03-12 00:23:00,2022-03-12 00:23:00,Addilyn,0.06,0,4318160,CKB +Matthias,Addilyn,2022-03-12 00:23:00,2022-03-12 00:30:00,Ari,2577,9,4318160,CKB +Ruby,Ari,2022-03-12 00:39:00,2022-03-12 00:54:00,Kobe,5937,9,4318160,CKB +Ruby,Kobe,2022-03-12 01:03:00,2022-03-12 01:17:00,Ari,6.19,0,4318160,CKB +Matthias,Ari,2022-03-12 01:17:00,2022-03-12 01:23:00,Addilyn,2555,0,4318160,CKB +Matthias,Addilyn,2022-03-12 01:23:00,2022-03-12 01:30:00,Ari,2577,9,4318160,CKB +Ruby,Ari,2022-03-12 01:39:00,2022-03-12 01:54:00,Kobe,5937,9,4318160,CKB +Ruby,Kobe,2022-03-12 02:03:00,2022-03-12 02:17:00,Ari,6.19,0,4318160,CKB +Matthias,Ari,2022-03-12 02:17:00,2022-03-12 02:23:00,Addilyn,2555,0,4318160,CKB +Matthias,Addilyn,2022-03-12 02:23:00,2022-03-12 02:30:00,Ari,2577,9,4318160,CKB +Ruby,Ari,2022-03-12 02:39:00,2022-03-12 02:54:00,Kobe,5937,9,4318160,CKB +Ruby,Kobe,2022-03-12 03:03:00,2022-03-12 03:17:00,Ari,6.19,0,4318160,CKB +Matthias,Ari,2022-03-12 03:17:00,2022-03-12 03:23:00,Addilyn,2555,0,4318160,CKB +Matthias,Addilyn,2022-03-12 03:23:00,2022-03-12 03:30:00,Ari,2577,9,4318160,CKB +Ruby,Ari,2022-03-12 03:39:00,2022-03-12 03:54:00,Kobe,5937,9,4318160,CKB +Ruby,Kobe,2022-03-12 04:03:00,2022-03-12 04:17:00,Ari,6.19,0,4318160,CKB +Matthias,Ari,2022-03-12 04:17:00,2022-03-12 04:23:00,Addilyn,2555,0,4318160,CKB +Matthias,Addilyn,2022-03-12 04:23:00,2022-03-12 04:30:00,Ari,2577,9,4318160,CKB +Ruby,Ari,2022-03-12 04:39:00,2022-03-12 04:54:00,Kobe,5937,9,4318160,CKB +Ruby,Kobe,2022-03-12 05:03:00,2022-03-12 05:17:00,Ari,6.19,0,4318160,CKB +Rosie,Ari,2022-03-12 05:17:00,2022-03-12 05:38:00,Colton,12.0,28,4318160,CKB +Rosie,Colton,2022-03-12 06:06:00,2022-03-12 06:11:00,Lexi,2936,16,4318160,CKB +Rosie,Lexi,2022-03-12 06:27:00,2022-03-12 06:36:00,Colton,4343,10,4318160,CKB +Rosie,Colton,2022-03-12 06:46:00,2022-03-12 06:51:00,Lexi,2936,0,4318160,CKB +Amy,Lexi,2022-03-12 06:51:00,2022-03-12 07:00:00,Izabella,4.6,12,4318160,CKB +Amy,Izabella,2022-03-12 07:12:00,2022-03-12 07:12:00,Izabella,0.0,836,4318160,CKB +Amy,Izabella,2022-03-12 21:08:00,2022-03-12 21:08:00,Izabella,0.0,0,4318160,CKB +Amy,Izabella,2022-03-12 21:08:00,2022-03-12 21:08:00,Beckham,0.06,0,4318160,CKB +Ruby,Beckham,2022-03-12 00:33:00,2022-03-12 00:33:00,Kobe,0.06,0,4318180,CKB +Ruby,Kobe,2022-03-12 00:33:00,2022-03-12 00:47:00,Ari,6.19,0,4318180,CKB +Matthias,Ari,2022-03-12 00:47:00,2022-03-12 00:53:00,Addilyn,2555,0,4318180,CKB +Matthias,Addilyn,2022-03-12 00:53:00,2022-03-12 01:00:00,Ari,2577,9,4318180,CKB +Ruby,Ari,2022-03-12 01:09:00,2022-03-12 01:24:00,Kobe,5937,9,4318180,CKB +Ruby,Kobe,2022-03-12 01:33:00,2022-03-12 01:47:00,Ari,6.19,0,4318180,CKB +Matthias,Ari,2022-03-12 01:47:00,2022-03-12 01:53:00,Addilyn,2555,0,4318180,CKB +Matthias,Addilyn,2022-03-12 01:53:00,2022-03-12 02:00:00,Ari,2577,9,4318180,CKB +Ruby,Ari,2022-03-12 02:09:00,2022-03-12 02:24:00,Kobe,5937,9,4318180,CKB +Ruby,Kobe,2022-03-12 02:33:00,2022-03-12 02:47:00,Ari,6.19,0,4318180,CKB +Matthias,Ari,2022-03-12 02:47:00,2022-03-12 02:53:00,Addilyn,2555,0,4318180,CKB +Matthias,Addilyn,2022-03-12 02:53:00,2022-03-12 03:00:00,Ari,2577,9,4318180,CKB +Ruby,Ari,2022-03-12 03:09:00,2022-03-12 03:24:00,Kobe,5937,9,4318180,CKB +Ruby,Kobe,2022-03-12 03:33:00,2022-03-12 03:47:00,Ari,6.19,0,4318180,CKB +Matthias,Ari,2022-03-12 03:47:00,2022-03-12 03:53:00,Addilyn,2555,0,4318180,CKB +Matthias,Addilyn,2022-03-12 03:53:00,2022-03-12 04:00:00,Ari,2577,9,4318180,CKB +Ruby,Ari,2022-03-12 04:09:00,2022-03-12 04:24:00,Kobe,5937,9,4318180,CKB +Ruby,Kobe,2022-03-12 04:33:00,2022-03-12 04:47:00,Ari,6.19,0,4318180,CKB +Matthias,Ari,2022-03-12 04:47:00,2022-03-12 04:53:00,Addilyn,2555,0,4318180,CKB +Matthias,Addilyn,2022-03-12 04:53:00,2022-03-12 05:00:00,Ari,2577,9,4318180,CKB +Ruby,Ari,2022-03-12 05:09:00,2022-03-12 05:24:00,Kobe,5937,0,4318180,CKB +Ruby,Kobe,2022-03-12 05:24:00,2022-03-12 05:24:00,Beckham,0.06,0,4318180,CKB +Rosie,Beckham,2022-03-12 00:57:00,2022-03-12 00:57:00,Lexi,0.06,0,4319355,CKB +Rosie,Lexi,2022-03-12 00:57:00,2022-03-12 01:06:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 01:06:00,2022-03-12 01:11:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 01:27:00,2022-03-12 01:36:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 01:36:00,2022-03-12 01:41:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 01:57:00,2022-03-12 02:06:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 02:06:00,2022-03-12 02:11:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 02:27:00,2022-03-12 02:36:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 02:36:00,2022-03-12 02:41:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 02:57:00,2022-03-12 03:06:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 03:06:00,2022-03-12 03:11:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 03:27:00,2022-03-12 03:36:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 03:36:00,2022-03-12 03:41:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 03:57:00,2022-03-12 04:06:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 04:06:00,2022-03-12 04:11:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 04:27:00,2022-03-12 04:36:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 04:36:00,2022-03-12 04:41:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 04:57:00,2022-03-12 05:06:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 05:06:00,2022-03-12 05:11:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 05:27:00,2022-03-12 05:36:00,Colton,4343,0,4319355,CKB +Rosie,Colton,2022-03-12 05:36:00,2022-03-12 05:41:00,Lexi,2936,16,4319355,CKB +Rosie,Lexi,2022-03-12 05:57:00,2022-03-12 06:06:00,Colton,4343,20,4319355,CKB +Rosie,Colton,2022-03-12 06:26:00,2022-03-12 06:31:00,Lexi,2936,0,4319355,CKB +Rosie,Lexi,2022-03-12 06:31:00,2022-03-12 06:31:00,Beckham,0.06,0,4319355,CKB +Andy,Beckham,2022-03-12 00:30:00,2022-03-12 00:30:00,Harper,0.06,0,4453548,CKB +Andy,Harper,2022-03-12 00:30:00,2022-03-12 00:44:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 00:44:00,2022-03-12 00:57:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 01:00:00,2022-03-12 01:14:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 01:14:00,2022-03-12 01:27:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 01:30:00,2022-03-12 01:44:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 01:44:00,2022-03-12 01:57:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 02:00:00,2022-03-12 02:14:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 02:14:00,2022-03-12 02:27:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 02:30:00,2022-03-12 02:44:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 02:44:00,2022-03-12 02:57:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 03:00:00,2022-03-12 03:14:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 03:14:00,2022-03-12 03:27:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 03:30:00,2022-03-12 03:44:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 03:44:00,2022-03-12 03:57:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 04:00:00,2022-03-12 04:14:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 04:14:00,2022-03-12 04:27:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 04:30:00,2022-03-12 04:44:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 04:44:00,2022-03-12 04:57:00,Harper,5302,3,4453548,CKB +Andy,Harper,2022-03-12 05:00:00,2022-03-12 05:14:00,Elise,4801,0,4453548,CKB +Andy,Elise,2022-03-12 05:14:00,2022-03-12 05:27:00,Harper,5302,0,4453548,CKB +Andy,Harper,2022-03-12 05:27:00,2022-03-12 05:27:00,Beckham,0.06,0,4453548,CKB +Emilio,Beckham,2022-03-12 00:32:00,2022-03-12 00:32:00,Rose,0.06,0,4747653,CKB +Emilio,Rose,2022-03-12 00:32:00,2022-03-12 00:44:00,Brooklynn,4212,3,4747653,CKB +Emilio,Brooklynn,2022-03-12 00:47:00,2022-03-12 01:16:00,Francis,13048,0,4747653,CKB +Emilio,Francis,2022-03-12 01:16:00,2022-03-12 01:42:00,Brooklynn,12869,5,4747653,CKB +Emilio,Brooklynn,2022-03-12 01:47:00,2022-03-12 02:16:00,Francis,13048,0,4747653,CKB +Emilio,Francis,2022-03-12 02:16:00,2022-03-12 02:42:00,Brooklynn,12869,5,4747653,CKB +Emilio,Brooklynn,2022-03-12 02:47:00,2022-03-12 03:16:00,Francis,13048,0,4747653,CKB +Emilio,Francis,2022-03-12 03:16:00,2022-03-12 03:42:00,Brooklynn,12869,5,4747653,CKB +Emilio,Brooklynn,2022-03-12 03:47:00,2022-03-12 04:16:00,Francis,13048,0,4747653,CKB +Emilio,Francis,2022-03-12 04:16:00,2022-03-12 04:42:00,Brooklynn,12869,5,4747653,CKB +Emilio,Brooklynn,2022-03-12 04:47:00,2022-03-12 05:16:00,Francis,13048,0,4747653,CKB +Emilio,Francis,2022-03-12 05:16:00,2022-03-12 05:34:00,Gia,9538,0,4747653,CKB +Emilio,Gia,2022-03-12 05:34:00,2022-03-12 05:34:00,Beckham,0.06,0,4747653,CKB +Emilio,Beckham,2022-03-12 00:17:00,2022-03-12 00:17:00,Brooklynn,0.06,0,4747663,CKB +Emilio,Brooklynn,2022-03-12 00:17:00,2022-03-12 00:46:00,Francis,13048,0,4747663,CKB +Emilio,Francis,2022-03-12 00:46:00,2022-03-12 01:12:00,Brooklynn,12869,5,4747663,CKB +Emilio,Brooklynn,2022-03-12 01:17:00,2022-03-12 01:46:00,Francis,13048,0,4747663,CKB +Emilio,Francis,2022-03-12 01:46:00,2022-03-12 02:12:00,Brooklynn,12869,5,4747663,CKB +Emilio,Brooklynn,2022-03-12 02:17:00,2022-03-12 02:46:00,Francis,13048,0,4747663,CKB +Emilio,Francis,2022-03-12 02:46:00,2022-03-12 03:12:00,Brooklynn,12869,5,4747663,CKB +Emilio,Brooklynn,2022-03-12 03:17:00,2022-03-12 03:46:00,Francis,13048,0,4747663,CKB +Emilio,Francis,2022-03-12 03:46:00,2022-03-12 04:12:00,Brooklynn,12869,5,4747663,CKB +Emilio,Brooklynn,2022-03-12 04:17:00,2022-03-12 04:46:00,Francis,13048,0,4747663,CKB +Emilio,Francis,2022-03-12 04:46:00,2022-03-12 05:12:00,Brooklynn,12869,0,4747663,CKB +Emilio,Brooklynn,2022-03-12 05:12:00,2022-03-12 05:12:00,Beckham,0.06,0,4747663,CKB +Ryder,Beckham,2022-03-12 00:49:00,2022-03-12 00:49:00,Kehlani,0.06,0,4434344,CKB +Ryder,Kehlani,2022-03-12 00:49:00,2022-03-12 01:04:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 01:04:00,2022-03-12 01:19:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 01:19:00,2022-03-12 01:34:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 01:34:00,2022-03-12 01:49:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 01:49:00,2022-03-12 02:04:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 02:04:00,2022-03-12 02:19:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 02:19:00,2022-03-12 02:34:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 02:34:00,2022-03-12 02:49:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 02:49:00,2022-03-12 03:04:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 03:04:00,2022-03-12 03:19:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 03:19:00,2022-03-12 03:34:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 03:34:00,2022-03-12 03:49:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 03:49:00,2022-03-12 04:04:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 04:04:00,2022-03-12 04:19:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 04:19:00,2022-03-12 04:34:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 04:34:00,2022-03-12 04:49:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 04:49:00,2022-03-12 05:04:00,Ariyah,10229,0,4434344,CKB +Ryder,Ariyah,2022-03-12 05:04:00,2022-03-12 05:19:00,Kehlani,11801,0,4434344,CKB +Ryder,Kehlani,2022-03-12 05:19:00,2022-03-12 05:19:00,Beckham,0.06,0,4434344,CKB +Aziel,Beckham,2022-03-12 02:34:00,2022-03-12 02:34:00,Miles,0.06,0,4514364,CKB +Aziel,Miles,2022-03-12 02:34:00,2022-03-12 03:00:00,Delilah,9016,0,4514364,CKB +Aziel,Delilah,2022-03-12 03:00:00,2022-03-12 03:27:00,Miles,10083,7,4514364,CKB +Aziel,Miles,2022-03-12 03:34:00,2022-03-12 04:00:00,Delilah,9016,0,4514364,CKB +Aziel,Delilah,2022-03-12 04:00:00,2022-03-12 04:27:00,Miles,10083,7,4514364,CKB +Aziel,Miles,2022-03-12 04:34:00,2022-03-12 05:00:00,Delilah,9016,0,4514364,CKB +Aziel,Delilah,2022-03-12 05:00:00,2022-03-12 05:27:00,Miles,10083,0,4514364,CKB +Aziel,Miles,2022-03-12 05:27:00,2022-03-12 05:27:00,Beckham,0.06,0,4514364,CKB +Aziel,Beckham,2022-03-12 02:04:00,2022-03-12 02:04:00,Miles,0.06,0,4619999,CKB +Aziel,Miles,2022-03-12 02:04:00,2022-03-12 02:30:00,Delilah,9016,0,4619999,CKB +Aziel,Delilah,2022-03-12 02:30:00,2022-03-12 02:57:00,Miles,10083,7,4619999,CKB +Aziel,Miles,2022-03-12 03:04:00,2022-03-12 03:30:00,Delilah,9016,0,4619999,CKB +Aziel,Delilah,2022-03-12 03:30:00,2022-03-12 03:57:00,Miles,10083,7,4619999,CKB +Aziel,Miles,2022-03-12 04:04:00,2022-03-12 04:30:00,Delilah,9016,0,4619999,CKB +Aziel,Delilah,2022-03-12 04:30:00,2022-03-12 04:57:00,Miles,10083,7,4619999,CKB +Aziel,Miles,2022-03-12 05:04:00,2022-03-12 05:30:00,Delilah,9016,0,4619999,CKB +Aziel,Delilah,2022-03-12 05:30:00,2022-03-12 05:30:00,Beckham,0.06,0,4619999,CKB +Dalton,Beckham,2022-03-12 00:31:00,2022-03-12 00:31:00,Kamila,0.06,0,4374747,CKB +Dalton,Kamila,2022-03-12 00:31:00,2022-03-12 00:44:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 00:44:00,2022-03-12 00:56:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 01:01:00,2022-03-12 01:14:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 01:14:00,2022-03-12 01:26:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 01:31:00,2022-03-12 01:44:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 01:44:00,2022-03-12 01:56:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 02:01:00,2022-03-12 02:14:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 02:14:00,2022-03-12 02:26:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 02:31:00,2022-03-12 02:44:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 02:44:00,2022-03-12 02:56:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 03:01:00,2022-03-12 03:14:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 03:14:00,2022-03-12 03:26:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 03:31:00,2022-03-12 03:44:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 03:44:00,2022-03-12 03:56:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 04:01:00,2022-03-12 04:14:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 04:14:00,2022-03-12 04:26:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 04:31:00,2022-03-12 04:44:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 04:44:00,2022-03-12 04:56:00,Kamila,5362,5,4374747,CKB +Dalton,Kamila,2022-03-12 05:01:00,2022-03-12 05:14:00,Veronica,4872,0,4374747,CKB +Dalton,Veronica,2022-03-12 05:14:00,2022-03-12 05:26:00,Kamila,5362,0,4374747,CKB +Dalton,Kamila,2022-03-12 05:26:00,2022-03-12 05:26:00,Beckham,0.06,0,4374747,CKB +Jamison,Beckham,2022-03-12 00:31:00,2022-03-12 00:31:00,Kamila,0.06,0,4374870,CKB +Jamison,Kamila,2022-03-12 00:31:00,2022-03-12 00:45:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 00:47:00,2022-03-12 01:01:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 01:01:00,2022-03-12 01:15:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 01:17:00,2022-03-12 01:31:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 01:31:00,2022-03-12 01:45:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 01:47:00,2022-03-12 02:01:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 02:01:00,2022-03-12 02:15:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 02:17:00,2022-03-12 02:31:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 02:31:00,2022-03-12 02:45:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 02:47:00,2022-03-12 03:01:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 03:01:00,2022-03-12 03:15:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 03:17:00,2022-03-12 03:31:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 03:31:00,2022-03-12 03:45:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 03:47:00,2022-03-12 04:01:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 04:01:00,2022-03-12 04:15:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 04:17:00,2022-03-12 04:31:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 04:31:00,2022-03-12 04:45:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 04:47:00,2022-03-12 05:01:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 05:01:00,2022-03-12 05:15:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 05:17:00,2022-03-12 05:31:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 05:31:00,2022-03-12 05:45:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 05:47:00,2022-03-12 06:01:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 06:01:00,2022-03-12 06:15:00,Liana,5225,2,4374870,CKB +Jamison,Liana,2022-03-12 06:17:00,2022-03-12 06:31:00,Kamila,7617,0,4374870,CKB +Jamison,Kamila,2022-03-12 06:31:00,2022-03-12 06:45:00,Liana,5096,0,4374870,CKB +Jamison,Liana,2022-03-12 06:45:00,2022-03-12 06:45:00,Beckham,0.06,0,4374870,CKB +Keegan,Beckham,2022-03-12 00:43:00,2022-03-12 00:43:00,Charleigh,0.06,0,4375016,CKB +Keegan,Charleigh,2022-03-12 00:43:00,2022-03-12 00:53:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 00:53:00,2022-03-12 01:03:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 01:13:00,2022-03-12 01:23:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 01:23:00,2022-03-12 01:33:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 01:43:00,2022-03-12 01:53:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 01:53:00,2022-03-12 02:03:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 02:13:00,2022-03-12 02:23:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 02:23:00,2022-03-12 02:33:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 02:43:00,2022-03-12 02:53:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 02:53:00,2022-03-12 03:03:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 03:13:00,2022-03-12 03:23:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 03:23:00,2022-03-12 03:33:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 03:43:00,2022-03-12 03:53:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 03:53:00,2022-03-12 04:03:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 04:13:00,2022-03-12 04:23:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 04:23:00,2022-03-12 04:33:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 04:43:00,2022-03-12 04:53:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 04:53:00,2022-03-12 05:03:00,Charleigh,4408,10,4375016,CKB +Keegan,Charleigh,2022-03-12 05:13:00,2022-03-12 05:23:00,Eli,4507,0,4375016,CKB +Keegan,Eli,2022-03-12 05:23:00,2022-03-12 05:23:00,Beckham,0.06,0,4375016,CKB +Ayaan,Beckham,2022-03-12 20:51:00,2022-03-12 20:51:00,Kalani,0.06,0,4454966,CKB +Ayaan,Kalani,2022-03-12 20:51:00,2022-03-12 21:24:00,Brian,14519,4,4454966,CKB +Ayaan,Brian,2022-03-12 21:28:00,2022-03-12 22:03:00,Kalani,13541,8,4454966,CKB +Ayaan,Kalani,2022-03-12 22:11:00,2022-03-12 22:44:00,Brian,14519,4,4454966,CKB +Ayaan,Brian,2022-03-12 22:48:00,2022-03-12 23:23:00,Kalani,13541,8,4454966,CKB +Ayaan,Kalani,2022-03-12 23:31:00,2022-03-13 00:04:00,Brian,14519,4,4454966,CKB +Ayaan,Brian,2022-03-13 00:08:00,2022-03-13 00:39:00,Leonel,12213,0,4454966,CKB +Hunter,Leonel,2022-03-13 00:39:00,2022-03-13 00:47:00,Kehlani,4.0,2,4454966,CKB +Hunter,Kehlani,2022-03-13 00:49:00,2022-03-13 01:12:00,Ayden,8.36,6,4454966,CKB +Hunter,Ayden,2022-03-13 01:18:00,2022-03-13 01:36:00,Kehlani,9067,13,4454966,CKB +Hunter,Kehlani,2022-03-13 01:49:00,2022-03-13 02:12:00,Ayden,8.36,6,4454966,CKB +Hunter,Ayden,2022-03-13 02:18:00,2022-03-13 02:36:00,Kehlani,9067,13,4454966,CKB +Hunter,Kehlani,2022-03-13 02:49:00,2022-03-13 03:12:00,Ayden,8.36,6,4454966,CKB +Hunter,Ayden,2022-03-13 03:18:00,2022-03-13 03:36:00,Kehlani,9067,13,4454966,CKB +Hunter,Kehlani,2022-03-13 03:49:00,2022-03-13 04:12:00,Ayden,8.36,6,4454966,CKB +Hunter,Ayden,2022-03-13 04:18:00,2022-03-13 04:36:00,Kehlani,9067,13,4454966,CKB +Hunter,Kehlani,2022-03-13 04:49:00,2022-03-13 05:12:00,Ayden,8.36,6,4454966,CKB +Hunter,Ayden,2022-03-13 05:18:00,2022-03-13 05:36:00,Kehlani,9067,13,4454966,CKB +Hunter,Kehlani,2022-03-13 05:49:00,2022-03-13 06:08:00,Ayden,8762,10,4454966,CKB +Hunter,Ayden,2022-03-13 06:18:00,2022-03-13 06:36:00,Kehlani,9067,13,4454966,CKB +Hunter,Kehlani,2022-03-13 06:49:00,2022-03-13 07:08:00,Ayden,8762,0,4454966,CKB +Hunter,Ayden,2022-03-13 07:08:00,2022-03-13 07:08:00,Beckham,0.06,0,4454966,CKB +Ayaan,Beckham,2022-03-12 21:31:00,2022-03-12 21:31:00,Kalani,0.06,0,4454967,CKB +Ayaan,Kalani,2022-03-12 21:31:00,2022-03-12 22:04:00,Brian,14519,4,4454967,CKB +Ayaan,Brian,2022-03-12 22:08:00,2022-03-12 22:43:00,Kalani,13541,8,4454967,CKB +Ayaan,Kalani,2022-03-12 22:51:00,2022-03-12 23:24:00,Brian,14519,4,4454967,CKB +Ayaan,Brian,2022-03-12 23:28:00,2022-03-13 00:03:00,Kalani,13541,8,4454967,CKB +Ayaan,Kalani,2022-03-13 00:11:00,2022-03-13 00:44:00,Brian,14519,0,4454967,CKB +Hunter,Brian,2022-03-13 00:44:00,2022-03-13 00:54:00,Kehlani,4.1,25,4454967,CKB +Hunter,Kehlani,2022-03-13 01:19:00,2022-03-13 01:42:00,Ayden,8.36,6,4454967,CKB +Hunter,Ayden,2022-03-13 01:48:00,2022-03-13 02:06:00,Kehlani,9067,13,4454967,CKB +Hunter,Kehlani,2022-03-13 02:19:00,2022-03-13 02:42:00,Ayden,8.36,6,4454967,CKB +Hunter,Ayden,2022-03-13 02:48:00,2022-03-13 03:06:00,Kehlani,9067,13,4454967,CKB +Hunter,Kehlani,2022-03-13 03:19:00,2022-03-13 03:42:00,Ayden,8.36,6,4454967,CKB +Hunter,Ayden,2022-03-13 03:48:00,2022-03-13 04:06:00,Kehlani,9067,13,4454967,CKB +Hunter,Kehlani,2022-03-13 04:19:00,2022-03-13 04:42:00,Ayden,8.36,6,4454967,CKB +Hunter,Ayden,2022-03-13 04:48:00,2022-03-13 05:06:00,Kehlani,9067,13,4454967,CKB +Hunter,Kehlani,2022-03-13 05:19:00,2022-03-13 05:42:00,Ayden,8.36,6,4454967,CKB +Hunter,Ayden,2022-03-13 05:48:00,2022-03-13 06:06:00,Kehlani,9067,0,4454967,CKB +Hunter,Kehlani,2022-03-13 06:06:00,2022-03-13 06:06:00,Beckham,0.06,0,4454967,CKB +Donovan,Beckham,2022-03-12 21:06:00,2022-03-12 21:06:00,Pierce,0.06,0,4664765,CKB +Donovan,Pierce,2022-03-12 21:06:00,2022-03-12 21:34:00,Leonardo,13018,19,4664765,CKB +Donovan,Leonardo,2022-03-12 21:53:00,2022-03-12 22:13:00,Kamryn,10332,17,4664765,CKB +Donovan,Kamryn,2022-03-12 22:30:00,2022-03-12 22:54:00,Leonardo,10.48,19,4664765,CKB +Donovan,Leonardo,2022-03-12 23:13:00,2022-03-12 23:33:00,Kamryn,10332,17,4664765,CKB +Donovan,Kamryn,2022-03-12 23:50:00,2022-03-13 00:14:00,Leonardo,10.48,8,4664765,CKB +Donovan,Leonardo,2022-03-13 00:22:00,2022-03-13 00:27:00,Iker,2533,2,4664765,CKB +Zoey,Iker,2022-03-13 00:29:00,2022-03-13 00:47:00,Brinley,7.58,0,4664765,CKB +Zoey,Brinley,2022-03-13 00:47:00,2022-03-13 01:14:00,Finn,12841,3,4664765,CKB +Zoey,Finn,2022-03-13 01:17:00,2022-03-13 01:47:00,Brinley,14281,0,4664765,CKB +Zoey,Brinley,2022-03-13 01:47:00,2022-03-13 02:14:00,Finn,12841,3,4664765,CKB +Zoey,Finn,2022-03-13 02:17:00,2022-03-13 02:47:00,Brinley,14281,0,4664765,CKB +Zoey,Brinley,2022-03-13 02:47:00,2022-03-13 03:14:00,Finn,12841,3,4664765,CKB +Zoey,Finn,2022-03-13 03:17:00,2022-03-13 03:47:00,Brinley,14281,0,4664765,CKB +Zoey,Brinley,2022-03-13 03:47:00,2022-03-13 04:14:00,Finn,12841,3,4664765,CKB +Zoey,Finn,2022-03-13 04:17:00,2022-03-13 04:47:00,Brinley,14281,0,4664765,CKB +Zoey,Brinley,2022-03-13 04:47:00,2022-03-13 05:14:00,Finn,12841,3,4664765,CKB +Zoey,Finn,2022-03-13 05:17:00,2022-03-13 05:47:00,Brinley,14281,0,4664765,CKB +Zoey,Brinley,2022-03-13 05:47:00,2022-03-13 06:14:00,Finn,12841,3,4664765,CKB +Zoey,Finn,2022-03-13 06:17:00,2022-03-13 06:47:00,Brinley,14281,0,4664765,CKB +Zoey,Brinley,2022-03-13 06:47:00,2022-03-13 06:59:00,Iker,5474,0,4664765,CKB +Zoey,Iker,2022-03-13 06:59:00,2022-03-13 06:59:00,Beckham,0.06,0,4664765,CKB +Donovan,Beckham,2022-03-12 20:26:00,2022-03-12 20:26:00,Pierce,0.06,0,4762771,CKB +Donovan,Pierce,2022-03-12 20:26:00,2022-03-12 20:56:00,Ezra,14097,14,4762771,CKB +Donovan,Ezra,2022-03-12 21:10:00,2022-03-12 21:38:00,Pierce,13.19,8,4762771,CKB +Donovan,Pierce,2022-03-12 21:46:00,2022-03-12 22:14:00,Leonardo,13018,19,4762771,CKB +Donovan,Leonardo,2022-03-12 22:33:00,2022-03-12 22:53:00,Kamryn,10332,17,4762771,CKB +Donovan,Kamryn,2022-03-12 23:10:00,2022-03-12 23:34:00,Leonardo,10.48,19,4762771,CKB +Donovan,Leonardo,2022-03-12 23:53:00,2022-03-13 00:13:00,Kamryn,10332,2,4762771,CKB +Donovan,Kamryn,2022-03-13 00:15:00,2022-03-13 00:16:00,Brinley,506,1,4762771,CKB +Zoey,Brinley,2022-03-13 00:17:00,2022-03-13 00:44:00,Finn,12841,3,4762771,CKB +Zoey,Finn,2022-03-13 00:47:00,2022-03-13 01:17:00,Brinley,14281,0,4762771,CKB +Zoey,Brinley,2022-03-13 01:17:00,2022-03-13 01:44:00,Finn,12841,3,4762771,CKB +Zoey,Finn,2022-03-13 01:47:00,2022-03-13 02:17:00,Brinley,14281,0,4762771,CKB +Zoey,Brinley,2022-03-13 02:17:00,2022-03-13 02:44:00,Finn,12841,3,4762771,CKB +Zoey,Finn,2022-03-13 02:47:00,2022-03-13 03:17:00,Brinley,14281,0,4762771,CKB +Zoey,Brinley,2022-03-13 03:17:00,2022-03-13 03:44:00,Finn,12841,3,4762771,CKB +Zoey,Finn,2022-03-13 03:47:00,2022-03-13 04:17:00,Brinley,14281,0,4762771,CKB +Zoey,Brinley,2022-03-13 04:17:00,2022-03-13 04:44:00,Finn,12841,3,4762771,CKB +Zoey,Finn,2022-03-13 04:47:00,2022-03-13 05:17:00,Brinley,14281,0,4762771,CKB +Zoey,Brinley,2022-03-13 05:17:00,2022-03-13 05:44:00,Finn,12841,3,4762771,CKB +Zoey,Finn,2022-03-13 05:47:00,2022-03-13 06:17:00,Brinley,14281,0,4762771,CKB +Zoey,Brinley,2022-03-13 06:17:00,2022-03-13 06:44:00,Finn,12841,3,4762771,CKB +Zoey,Finn,2022-03-13 06:47:00,2022-03-13 07:17:00,Brinley,14281,0,4762771,CKB +Zoey,Brinley,2022-03-13 07:17:00,2022-03-13 07:17:00,Beckham,0.06,0,4762771,CKB +Avery,Beckham,2022-03-12 20:26:00,2022-03-12 20:26:00,Jace,0.06,0,4617438,CKB +Avery,Jace,2022-03-12 20:26:00,2022-03-12 20:38:00,Nathan,5882,3,4617438,CKB +Avery,Nathan,2022-03-12 20:41:00,2022-03-12 20:55:00,Jace,6232,0,4617438,CKB +Avery,Jace,2022-03-12 20:55:00,2022-03-12 21:08:00,Nathan,6086,3,4617438,CKB +Avery,Nathan,2022-03-12 21:11:00,2022-03-12 21:25:00,Jace,6232,0,4617438,CKB +Avery,Jace,2022-03-12 21:25:00,2022-03-12 21:38:00,Nathan,6086,3,4617438,CKB +Avery,Nathan,2022-03-12 21:41:00,2022-03-12 21:55:00,Jace,6232,0,4617438,CKB +Avery,Jace,2022-03-12 21:55:00,2022-03-12 22:08:00,Nathan,6086,3,4617438,CKB +Avery,Nathan,2022-03-12 22:11:00,2022-03-12 22:25:00,Jace,6232,0,4617438,CKB +Avery,Jace,2022-03-12 22:25:00,2022-03-12 22:38:00,Nathan,6086,3,4617438,CKB +Avery,Nathan,2022-03-12 22:41:00,2022-03-12 22:55:00,Jace,6232,0,4617438,CKB +Avery,Jace,2022-03-12 22:55:00,2022-03-12 23:08:00,Nathan,6086,3,4617438,CKB +Avery,Nathan,2022-03-12 23:11:00,2022-03-12 23:25:00,Jace,6232,0,4617438,CKB +Avery,Jace,2022-03-12 23:25:00,2022-03-12 23:38:00,Nathan,6086,3,4617438,CKB +Avery,Nathan,2022-03-12 23:41:00,2022-03-12 23:55:00,Jace,6232,0,4617438,CKB +Avery,Jace,2022-03-12 23:55:00,2022-03-13 00:08:00,Nathan,6086,0,4617438,CKB +Avery,Nathan,2022-03-13 00:08:00,2022-03-13 00:08:00,Beckham,0.06,0,4617438,CKB +Richard,Beckham,2022-03-12 05:25:00,2022-03-12 05:25:00,Ariyah,0.06,0,4426894,CKB +Richard,Ariyah,2022-03-12 05:25:00,2022-03-12 05:34:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 05:34:00,2022-03-12 05:43:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 06:05:00,2022-03-12 06:14:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 06:14:00,2022-03-12 06:23:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 06:25:00,2022-03-12 06:34:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 06:34:00,2022-03-12 06:43:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 06:45:00,2022-03-12 06:54:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 06:54:00,2022-03-12 07:03:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 07:05:00,2022-03-12 07:14:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 07:14:00,2022-03-12 07:23:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 07:25:00,2022-03-12 07:34:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 07:34:00,2022-03-12 07:43:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 08:05:00,2022-03-12 08:14:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 08:14:00,2022-03-12 08:23:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 08:25:00,2022-03-12 08:34:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 08:34:00,2022-03-12 08:43:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 08:45:00,2022-03-12 08:54:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 08:54:00,2022-03-12 09:03:00,Ariyah,5139,3,4426894,CKB +Richard,Ariyah,2022-03-12 09:06:00,2022-03-12 09:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 09:15:00,2022-03-12 09:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 09:26:00,2022-03-12 09:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 09:35:00,2022-03-12 09:44:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 10:06:00,2022-03-12 10:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 10:15:00,2022-03-12 10:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 10:26:00,2022-03-12 10:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 10:35:00,2022-03-12 10:44:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 10:46:00,2022-03-12 10:55:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 10:55:00,2022-03-12 11:04:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 11:06:00,2022-03-12 11:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 11:15:00,2022-03-12 11:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 11:26:00,2022-03-12 11:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 11:35:00,2022-03-12 11:44:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 12:06:00,2022-03-12 12:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 12:15:00,2022-03-12 12:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 12:26:00,2022-03-12 12:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 12:35:00,2022-03-12 12:44:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 12:46:00,2022-03-12 12:55:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 12:55:00,2022-03-12 13:04:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 13:06:00,2022-03-12 13:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 13:15:00,2022-03-12 13:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 13:26:00,2022-03-12 13:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 13:35:00,2022-03-12 13:44:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 14:06:00,2022-03-12 14:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 14:15:00,2022-03-12 14:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 14:26:00,2022-03-12 14:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 14:35:00,2022-03-12 14:44:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 14:46:00,2022-03-12 14:55:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 14:55:00,2022-03-12 15:04:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 15:06:00,2022-03-12 15:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 15:15:00,2022-03-12 15:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 15:26:00,2022-03-12 15:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 15:35:00,2022-03-12 15:44:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 16:06:00,2022-03-12 16:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 16:15:00,2022-03-12 16:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 16:26:00,2022-03-12 16:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 16:35:00,2022-03-12 16:44:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 16:46:00,2022-03-12 16:55:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 16:55:00,2022-03-12 17:04:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 17:06:00,2022-03-12 17:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 17:15:00,2022-03-12 17:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 17:26:00,2022-03-12 17:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 17:35:00,2022-03-12 17:44:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 18:06:00,2022-03-12 18:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 18:15:00,2022-03-12 18:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 18:26:00,2022-03-12 18:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 18:35:00,2022-03-12 18:44:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 18:46:00,2022-03-12 18:55:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 18:55:00,2022-03-12 19:04:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 19:06:00,2022-03-12 19:15:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 19:15:00,2022-03-12 19:24:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 19:26:00,2022-03-12 19:35:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 19:35:00,2022-03-12 19:44:00,Ariyah,5139,21,4426894,CKB +Richard,Ariyah,2022-03-12 20:05:00,2022-03-12 20:14:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 20:14:00,2022-03-12 20:23:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 20:25:00,2022-03-12 20:34:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 20:34:00,2022-03-12 20:43:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 20:45:00,2022-03-12 20:54:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 20:54:00,2022-03-12 21:03:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 21:05:00,2022-03-12 21:14:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 21:14:00,2022-03-12 21:23:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 21:25:00,2022-03-12 21:34:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 21:34:00,2022-03-12 21:43:00,Ariyah,5139,22,4426894,CKB +Richard,Ariyah,2022-03-12 22:05:00,2022-03-12 22:14:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 22:14:00,2022-03-12 22:23:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 22:25:00,2022-03-12 22:34:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 22:34:00,2022-03-12 22:43:00,Ariyah,5139,2,4426894,CKB +Richard,Ariyah,2022-03-12 22:45:00,2022-03-12 22:54:00,Jaden,4781,0,4426894,CKB +Richard,Jaden,2022-03-12 22:54:00,2022-03-12 23:03:00,Ariyah,5139,0,4426894,CKB +Richard,Ariyah,2022-03-12 23:03:00,2022-03-12 23:03:00,Beckham,0.06,0,4426894,CKB +Camryn,Beckham,2022-03-12 07:30:00,2022-03-12 07:30:00,Lucia,0.06,0,4369705,CKB +Camryn,Lucia,2022-03-12 07:30:00,2022-03-12 07:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 07:39:00,2022-03-12 07:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 07:50:00,2022-03-12 07:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 07:59:00,2022-03-12 08:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 08:10:00,2022-03-12 08:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 08:19:00,2022-03-12 08:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 08:30:00,2022-03-12 08:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 08:39:00,2022-03-12 08:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 08:50:00,2022-03-12 08:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 08:59:00,2022-03-12 09:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 09:10:00,2022-03-12 09:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 09:19:00,2022-03-12 09:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 09:30:00,2022-03-12 09:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 09:39:00,2022-03-12 09:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 09:50:00,2022-03-12 09:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 09:59:00,2022-03-12 10:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 10:10:00,2022-03-12 10:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 10:19:00,2022-03-12 10:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 10:30:00,2022-03-12 10:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 10:39:00,2022-03-12 10:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 10:50:00,2022-03-12 10:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 10:59:00,2022-03-12 11:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 11:10:00,2022-03-12 11:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 11:19:00,2022-03-12 11:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 11:30:00,2022-03-12 11:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 11:39:00,2022-03-12 11:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 11:50:00,2022-03-12 11:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 11:59:00,2022-03-12 12:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 12:10:00,2022-03-12 12:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 12:19:00,2022-03-12 12:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 12:30:00,2022-03-12 12:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 12:39:00,2022-03-12 12:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 12:50:00,2022-03-12 12:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 12:59:00,2022-03-12 13:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 13:10:00,2022-03-12 13:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 13:19:00,2022-03-12 13:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 13:30:00,2022-03-12 13:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 13:39:00,2022-03-12 13:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 13:50:00,2022-03-12 13:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 13:59:00,2022-03-12 14:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 14:10:00,2022-03-12 14:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 14:19:00,2022-03-12 14:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 14:30:00,2022-03-12 14:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 14:39:00,2022-03-12 14:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 14:50:00,2022-03-12 14:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 14:59:00,2022-03-12 15:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 15:10:00,2022-03-12 15:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 15:19:00,2022-03-12 15:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 15:30:00,2022-03-12 15:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 15:39:00,2022-03-12 15:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 15:50:00,2022-03-12 15:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 15:59:00,2022-03-12 16:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 16:10:00,2022-03-12 16:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 16:19:00,2022-03-12 16:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 16:30:00,2022-03-12 16:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 16:39:00,2022-03-12 16:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 16:50:00,2022-03-12 16:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 16:59:00,2022-03-12 17:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 17:10:00,2022-03-12 17:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 17:19:00,2022-03-12 17:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 17:30:00,2022-03-12 17:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 17:39:00,2022-03-12 17:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 17:50:00,2022-03-12 17:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 17:59:00,2022-03-12 18:10:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 18:10:00,2022-03-12 18:15:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 18:19:00,2022-03-12 18:30:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 18:30:00,2022-03-12 18:35:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 18:39:00,2022-03-12 18:50:00,Lucia,4341,0,4369705,CKB +Camryn,Lucia,2022-03-12 18:50:00,2022-03-12 18:55:00,Jaxon,2217,4,4369705,CKB +Camryn,Jaxon,2022-03-12 18:59:00,2022-03-12 19:10:00,Lucia,4288,0,4369705,CKB +Camryn,Lucia,2022-03-12 19:10:00,2022-03-12 19:10:00,Beckham,0.06,0,4369705,CKB +Astrid,King,2022-03-12 08:08:00,2022-03-12 08:41:00,Brayden,17.9,0,4317640,VDL +Astrid,Brayden,2022-03-12 08:41:00,2022-03-12 08:54:00,Brayden,4637,9,4317640,VDL +Astrid,Brayden,2022-03-12 09:03:00,2022-03-12 09:17:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 09:21:00,2022-03-12 09:35:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 09:43:00,2022-03-12 09:57:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 10:01:00,2022-03-12 10:15:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 10:23:00,2022-03-12 10:37:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 10:41:00,2022-03-12 10:55:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 11:03:00,2022-03-12 11:17:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 11:21:00,2022-03-12 11:35:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 11:43:00,2022-03-12 11:57:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 12:01:00,2022-03-12 12:15:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 12:23:00,2022-03-12 12:37:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 12:41:00,2022-03-12 12:55:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 13:03:00,2022-03-12 13:17:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 13:21:00,2022-03-12 13:35:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 13:43:00,2022-03-12 13:57:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 14:01:00,2022-03-12 14:15:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 14:23:00,2022-03-12 14:37:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 14:41:00,2022-03-12 14:55:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 15:03:00,2022-03-12 15:17:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 15:21:00,2022-03-12 15:35:00,Brayden,4637,8,4317640,VDL +Astrid,Brayden,2022-03-12 15:43:00,2022-03-12 15:57:00,Brayden,4637,4,4317640,VDL +Astrid,Brayden,2022-03-12 16:01:00,2022-03-12 16:14:00,Brayden,4637,0,4317640,VDL +Astrid,Brayden,2022-03-12 16:14:00,2022-03-12 16:57:00,King,19.8,0,4317640,VDL +Nash,Beckham,2022-03-12 07:18:00,2022-03-12 07:18:00,Amira,0.06,0,4706426,CKB +Nash,Amira,2022-03-12 07:18:00,2022-03-12 07:26:00,Victor,5562,10,4706426,CKB +Nash,Victor,2022-03-12 07:36:00,2022-03-12 07:45:00,Olivia,5941,32,4706426,CKB +Nash,Olivia,2022-03-12 08:17:00,2022-03-12 08:26:00,Victor,5994,8,4706426,CKB +Nash,Victor,2022-03-12 08:34:00,2022-03-12 08:42:00,Amira,5566,0,4706426,CKB +Nash,Amira,2022-03-12 08:42:00,2022-03-12 08:42:00,Beckham,0.06,0,4706426,CKB +Hailey,Beckham,2022-03-12 08:10:00,2022-03-12 08:10:00,Kaylani,0.06,0,4731254,CKB +Hailey,Kaylani,2022-03-12 08:10:00,2022-03-12 08:16:00,Cecilia,2169,12,4731254,CKB +Hailey,Cecilia,2022-03-12 08:28:00,2022-03-12 08:38:00,Kaylani,2952,2,4731254,CKB +Hailey,Kaylani,2022-03-12 08:40:00,2022-03-12 08:46:00,Cecilia,2169,12,4731254,CKB +Hailey,Cecilia,2022-03-12 08:58:00,2022-03-12 09:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 09:10:00,2022-03-12 09:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 09:28:00,2022-03-12 09:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 09:40:00,2022-03-12 09:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 09:58:00,2022-03-12 10:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 10:10:00,2022-03-12 10:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 10:28:00,2022-03-12 10:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 10:40:00,2022-03-12 10:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 10:58:00,2022-03-12 11:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 11:10:00,2022-03-12 11:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 11:28:00,2022-03-12 11:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 11:40:00,2022-03-12 11:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 11:58:00,2022-03-12 12:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 12:10:00,2022-03-12 12:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 12:28:00,2022-03-12 12:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 12:40:00,2022-03-12 12:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 12:58:00,2022-03-12 13:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 13:10:00,2022-03-12 13:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 13:28:00,2022-03-12 13:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 13:40:00,2022-03-12 13:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 13:58:00,2022-03-12 14:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 14:10:00,2022-03-12 14:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 14:28:00,2022-03-12 14:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 14:40:00,2022-03-12 14:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 14:58:00,2022-03-12 15:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 15:10:00,2022-03-12 15:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 15:28:00,2022-03-12 15:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 15:40:00,2022-03-12 15:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 15:58:00,2022-03-12 16:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 16:10:00,2022-03-12 16:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 16:28:00,2022-03-12 16:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 16:40:00,2022-03-12 16:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 16:58:00,2022-03-12 17:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 17:10:00,2022-03-12 17:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 17:28:00,2022-03-12 17:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 17:40:00,2022-03-12 17:48:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 17:58:00,2022-03-12 18:10:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 18:10:00,2022-03-12 18:18:00,Cecilia,2169,10,4731254,CKB +Hailey,Cecilia,2022-03-12 18:28:00,2022-03-12 18:40:00,Kaylani,2952,0,4731254,CKB +Hailey,Kaylani,2022-03-12 18:40:00,2022-03-12 18:48:00,Cecilia,2169,0,4731254,CKB +Hailey,Cecilia,2022-03-12 18:48:00,2022-03-12 18:48:00,Beckham,0.06,0,4731254,CKB +Matthias,Beckham,2022-03-13 00:23:00,2022-03-13 00:23:00,Addilyn,0.06,0,4317771,CKB +Matthias,Addilyn,2022-03-13 00:23:00,2022-03-13 00:30:00,Ari,2577,9,4317771,CKB +Ruby,Ari,2022-03-13 00:39:00,2022-03-13 00:54:00,Kobe,5937,9,4317771,CKB +Ruby,Kobe,2022-03-13 01:03:00,2022-03-13 01:17:00,Ari,6.19,0,4317771,CKB +Matthias,Ari,2022-03-13 01:17:00,2022-03-13 01:23:00,Addilyn,2555,0,4317771,CKB +Matthias,Addilyn,2022-03-13 01:23:00,2022-03-13 01:30:00,Ari,2577,9,4317771,CKB +Ruby,Ari,2022-03-13 01:39:00,2022-03-13 01:54:00,Kobe,5937,9,4317771,CKB +Ruby,Kobe,2022-03-13 02:03:00,2022-03-13 02:17:00,Ari,6.19,0,4317771,CKB +Matthias,Ari,2022-03-13 02:17:00,2022-03-13 02:23:00,Addilyn,2555,0,4317771,CKB +Matthias,Addilyn,2022-03-13 02:23:00,2022-03-13 02:30:00,Ari,2577,9,4317771,CKB +Ruby,Ari,2022-03-13 02:39:00,2022-03-13 02:54:00,Kobe,5937,9,4317771,CKB +Ruby,Kobe,2022-03-13 03:03:00,2022-03-13 03:17:00,Ari,6.19,0,4317771,CKB +Matthias,Ari,2022-03-13 03:17:00,2022-03-13 03:23:00,Addilyn,2555,0,4317771,CKB +Matthias,Addilyn,2022-03-13 03:23:00,2022-03-13 03:30:00,Ari,2577,9,4317771,CKB +Ruby,Ari,2022-03-13 03:39:00,2022-03-13 03:54:00,Kobe,5937,9,4317771,CKB +Ruby,Kobe,2022-03-13 04:03:00,2022-03-13 04:17:00,Ari,6.19,0,4317771,CKB +Matthias,Ari,2022-03-13 04:17:00,2022-03-13 04:23:00,Addilyn,2555,0,4317771,CKB +Matthias,Addilyn,2022-03-13 04:23:00,2022-03-13 04:30:00,Ari,2577,9,4317771,CKB +Ruby,Ari,2022-03-13 04:39:00,2022-03-13 04:54:00,Kobe,5937,9,4317771,CKB +Ruby,Kobe,2022-03-13 05:03:00,2022-03-13 05:17:00,Ari,6.19,0,4317771,CKB +Matthias,Ari,2022-03-13 05:17:00,2022-03-13 05:23:00,Addilyn,2555,0,4317771,CKB +Matthias,Addilyn,2022-03-13 05:23:00,2022-03-13 05:30:00,Ari,2577,9,4317771,CKB +Ruby,Ari,2022-03-13 05:39:00,2022-03-13 05:54:00,Kobe,5937,9,4317771,CKB +Ruby,Kobe,2022-03-13 06:03:00,2022-03-13 06:17:00,Ari,6.19,0,4317771,CKB +Matthias,Ari,2022-03-13 06:17:00,2022-03-13 06:23:00,Addilyn,2555,0,4317771,CKB +Matthias,Addilyn,2022-03-13 06:23:00,2022-03-13 06:30:00,Ari,2577,9,4317771,CKB +Ruby,Ari,2022-03-13 06:39:00,2022-03-13 06:54:00,Kobe,5937,0,4317771,CKB +Ruby,Kobe,2022-03-13 06:54:00,2022-03-13 06:54:00,Beckham,0.06,0,4317771,CKB +Ruby,Beckham,2022-03-13 00:33:00,2022-03-13 00:33:00,Kobe,0.06,0,4317937,CKB +Ruby,Kobe,2022-03-13 00:33:00,2022-03-13 00:47:00,Ari,6.19,0,4317937,CKB +Matthias,Ari,2022-03-13 00:47:00,2022-03-13 00:53:00,Addilyn,2555,0,4317937,CKB +Matthias,Addilyn,2022-03-13 00:53:00,2022-03-13 01:00:00,Ari,2577,9,4317937,CKB +Ruby,Ari,2022-03-13 01:09:00,2022-03-13 01:24:00,Kobe,5937,9,4317937,CKB +Ruby,Kobe,2022-03-13 01:33:00,2022-03-13 01:47:00,Ari,6.19,0,4317937,CKB +Matthias,Ari,2022-03-13 01:47:00,2022-03-13 01:53:00,Addilyn,2555,0,4317937,CKB +Matthias,Addilyn,2022-03-13 01:53:00,2022-03-13 02:00:00,Ari,2577,9,4317937,CKB +Ruby,Ari,2022-03-13 02:09:00,2022-03-13 02:24:00,Kobe,5937,9,4317937,CKB +Ruby,Kobe,2022-03-13 02:33:00,2022-03-13 02:47:00,Ari,6.19,0,4317937,CKB +Matthias,Ari,2022-03-13 02:47:00,2022-03-13 02:53:00,Addilyn,2555,0,4317937,CKB +Matthias,Addilyn,2022-03-13 02:53:00,2022-03-13 03:00:00,Ari,2577,9,4317937,CKB +Ruby,Ari,2022-03-13 03:09:00,2022-03-13 03:24:00,Kobe,5937,9,4317937,CKB +Ruby,Kobe,2022-03-13 03:33:00,2022-03-13 03:47:00,Ari,6.19,0,4317937,CKB +Matthias,Ari,2022-03-13 03:47:00,2022-03-13 03:53:00,Addilyn,2555,0,4317937,CKB +Matthias,Addilyn,2022-03-13 03:53:00,2022-03-13 04:00:00,Ari,2577,9,4317937,CKB +Ruby,Ari,2022-03-13 04:09:00,2022-03-13 04:24:00,Kobe,5937,9,4317937,CKB +Ruby,Kobe,2022-03-13 04:33:00,2022-03-13 04:47:00,Ari,6.19,0,4317937,CKB +Matthias,Ari,2022-03-13 04:47:00,2022-03-13 04:53:00,Addilyn,2555,0,4317937,CKB +Matthias,Addilyn,2022-03-13 04:53:00,2022-03-13 05:00:00,Ari,2577,9,4317937,CKB +Ruby,Ari,2022-03-13 05:09:00,2022-03-13 05:24:00,Kobe,5937,9,4317937,CKB +Ruby,Kobe,2022-03-13 05:33:00,2022-03-13 05:47:00,Ari,6.19,0,4317937,CKB +Matthias,Ari,2022-03-13 05:47:00,2022-03-13 05:53:00,Addilyn,2555,0,4317937,CKB +Matthias,Addilyn,2022-03-13 05:53:00,2022-03-13 06:00:00,Ari,2577,9,4317937,CKB +Ruby,Ari,2022-03-13 06:09:00,2022-03-13 06:24:00,Kobe,5937,9,4317937,CKB +Ruby,Kobe,2022-03-13 06:33:00,2022-03-13 06:47:00,Ari,6.19,0,4317937,CKB +Ruby,Ari,2022-03-13 06:47:00,2022-03-13 06:47:00,Beckham,0.06,0,4317937,CKB +Rosie,Beckham,2022-03-13 00:57:00,2022-03-13 00:57:00,Lexi,0.06,0,4319402,CKB +Rosie,Lexi,2022-03-13 00:57:00,2022-03-13 01:06:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 01:06:00,2022-03-13 01:11:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 01:27:00,2022-03-13 01:36:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 01:36:00,2022-03-13 01:41:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 01:57:00,2022-03-13 02:06:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 02:06:00,2022-03-13 02:11:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 02:27:00,2022-03-13 02:36:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 02:36:00,2022-03-13 02:41:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 02:57:00,2022-03-13 03:06:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 03:06:00,2022-03-13 03:11:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 03:27:00,2022-03-13 03:36:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 03:36:00,2022-03-13 03:41:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 03:57:00,2022-03-13 04:06:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 04:06:00,2022-03-13 04:11:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 04:27:00,2022-03-13 04:36:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 04:36:00,2022-03-13 04:41:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 04:57:00,2022-03-13 05:06:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 05:06:00,2022-03-13 05:11:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 05:27:00,2022-03-13 05:36:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 05:36:00,2022-03-13 05:41:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 05:57:00,2022-03-13 06:06:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 06:06:00,2022-03-13 06:11:00,Lexi,2936,16,4319402,CKB +Rosie,Lexi,2022-03-13 06:27:00,2022-03-13 06:36:00,Colton,4343,0,4319402,CKB +Rosie,Colton,2022-03-13 06:36:00,2022-03-13 06:41:00,Lexi,2936,0,4319402,CKB +Rosie,Lexi,2022-03-13 06:41:00,2022-03-13 06:41:00,Beckham,0.06,0,4319402,CKB +Andy,Beckham,2022-03-13 00:30:00,2022-03-13 00:30:00,Harper,0.06,0,4453948,CKB +Andy,Harper,2022-03-13 00:30:00,2022-03-13 00:44:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 00:44:00,2022-03-13 00:57:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 01:00:00,2022-03-13 01:14:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 01:14:00,2022-03-13 01:27:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 01:30:00,2022-03-13 01:44:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 01:44:00,2022-03-13 01:57:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 02:00:00,2022-03-13 02:14:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 02:14:00,2022-03-13 02:27:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 02:30:00,2022-03-13 02:44:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 02:44:00,2022-03-13 02:57:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 03:00:00,2022-03-13 03:14:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 03:14:00,2022-03-13 03:27:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 03:30:00,2022-03-13 03:44:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 03:44:00,2022-03-13 03:57:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 04:00:00,2022-03-13 04:14:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 04:14:00,2022-03-13 04:27:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 04:30:00,2022-03-13 04:44:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 04:44:00,2022-03-13 04:57:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 05:00:00,2022-03-13 05:14:00,Elise,4801,0,4453948,CKB +Andy,Elise,2022-03-13 05:14:00,2022-03-13 05:27:00,Harper,5302,3,4453948,CKB +Andy,Harper,2022-03-13 05:30:00,2022-03-13 05:44:00,Elise,4.8,0,4453948,CKB +Andy,Elise,2022-03-13 05:44:00,2022-03-13 05:56:00,Harper,5301,4,4453948,CKB +Andy,Harper,2022-03-13 06:00:00,2022-03-13 06:14:00,Elise,4.8,0,4453948,CKB +Andy,Elise,2022-03-13 06:14:00,2022-03-13 06:26:00,Harper,5301,4,4453948,CKB +Andy,Harper,2022-03-13 06:30:00,2022-03-13 06:44:00,Elise,4.8,0,4453948,CKB +Andy,Elise,2022-03-13 06:44:00,2022-03-13 06:56:00,Harper,5301,0,4453948,CKB +Andy,Harper,2022-03-13 06:56:00,2022-03-13 06:56:00,Beckham,0.06,0,4453948,CKB +Emilio,Beckham,2022-03-13 00:32:00,2022-03-13 00:32:00,Rose,0.06,0,4747669,CKB +Emilio,Rose,2022-03-13 00:32:00,2022-03-13 00:44:00,Brooklynn,4212,3,4747669,CKB +Emilio,Brooklynn,2022-03-13 00:47:00,2022-03-13 01:16:00,Francis,13048,0,4747669,CKB +Emilio,Francis,2022-03-13 01:16:00,2022-03-13 01:42:00,Brooklynn,12869,5,4747669,CKB +Emilio,Brooklynn,2022-03-13 01:47:00,2022-03-13 02:16:00,Francis,13048,0,4747669,CKB +Emilio,Francis,2022-03-13 02:16:00,2022-03-13 02:42:00,Brooklynn,12869,5,4747669,CKB +Emilio,Brooklynn,2022-03-13 02:47:00,2022-03-13 03:16:00,Francis,13048,0,4747669,CKB +Emilio,Francis,2022-03-13 03:16:00,2022-03-13 03:42:00,Brooklynn,12869,5,4747669,CKB +Emilio,Brooklynn,2022-03-13 03:47:00,2022-03-13 04:16:00,Francis,13048,0,4747669,CKB +Emilio,Francis,2022-03-13 04:16:00,2022-03-13 04:42:00,Brooklynn,12869,5,4747669,CKB +Emilio,Brooklynn,2022-03-13 04:47:00,2022-03-13 05:16:00,Francis,13048,0,4747669,CKB +Emilio,Francis,2022-03-13 05:16:00,2022-03-13 05:42:00,Brooklynn,12869,5,4747669,CKB +Emilio,Brooklynn,2022-03-13 05:47:00,2022-03-13 06:16:00,Francis,13048,0,4747669,CKB +Emilio,Francis,2022-03-13 06:16:00,2022-03-13 06:42:00,Brooklynn,12869,0,4747669,CKB +Emilio,Brooklynn,2022-03-13 06:42:00,2022-03-13 06:42:00,Beckham,0.06,0,4747669,CKB +Emilio,Beckham,2022-03-13 00:17:00,2022-03-13 00:17:00,Brooklynn,0.06,0,4747671,CKB +Emilio,Brooklynn,2022-03-13 00:17:00,2022-03-13 00:46:00,Francis,13048,0,4747671,CKB +Emilio,Francis,2022-03-13 00:46:00,2022-03-13 01:12:00,Brooklynn,12869,5,4747671,CKB +Emilio,Brooklynn,2022-03-13 01:17:00,2022-03-13 01:46:00,Francis,13048,0,4747671,CKB +Emilio,Francis,2022-03-13 01:46:00,2022-03-13 02:12:00,Brooklynn,12869,5,4747671,CKB +Emilio,Brooklynn,2022-03-13 02:17:00,2022-03-13 02:46:00,Francis,13048,0,4747671,CKB +Emilio,Francis,2022-03-13 02:46:00,2022-03-13 03:12:00,Brooklynn,12869,5,4747671,CKB +Emilio,Brooklynn,2022-03-13 03:17:00,2022-03-13 03:46:00,Francis,13048,0,4747671,CKB +Emilio,Francis,2022-03-13 03:46:00,2022-03-13 04:12:00,Brooklynn,12869,5,4747671,CKB +Emilio,Brooklynn,2022-03-13 04:17:00,2022-03-13 04:46:00,Francis,13048,0,4747671,CKB +Emilio,Francis,2022-03-13 04:46:00,2022-03-13 05:12:00,Brooklynn,12869,5,4747671,CKB +Emilio,Brooklynn,2022-03-13 05:17:00,2022-03-13 05:46:00,Francis,13048,0,4747671,CKB +Emilio,Francis,2022-03-13 05:46:00,2022-03-13 06:12:00,Brooklynn,12869,5,4747671,CKB +Emilio,Brooklynn,2022-03-13 06:17:00,2022-03-13 06:46:00,Francis,13048,0,4747671,CKB +Emilio,Francis,2022-03-13 06:46:00,2022-03-13 07:12:00,Brooklynn,12869,0,4747671,CKB +Emilio,Brooklynn,2022-03-13 07:12:00,2022-03-13 07:12:00,Beckham,0.06,0,4747671,CKB +Ryder,Beckham,2022-03-13 00:49:00,2022-03-13 00:49:00,Kehlani,0.06,0,4434314,CKB +Ryder,Kehlani,2022-03-13 00:49:00,2022-03-13 01:04:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 01:04:00,2022-03-13 01:19:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 01:19:00,2022-03-13 01:34:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 01:34:00,2022-03-13 01:49:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 01:49:00,2022-03-13 02:04:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 02:04:00,2022-03-13 02:19:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 02:19:00,2022-03-13 02:34:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 02:34:00,2022-03-13 02:49:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 02:49:00,2022-03-13 03:04:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 03:04:00,2022-03-13 03:19:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 03:19:00,2022-03-13 03:34:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 03:34:00,2022-03-13 03:49:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 03:49:00,2022-03-13 04:04:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 04:04:00,2022-03-13 04:19:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 04:19:00,2022-03-13 04:34:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 04:34:00,2022-03-13 04:49:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 04:49:00,2022-03-13 05:04:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 05:04:00,2022-03-13 05:19:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 05:19:00,2022-03-13 05:34:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 05:34:00,2022-03-13 05:49:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 05:49:00,2022-03-13 06:04:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 06:04:00,2022-03-13 06:19:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 06:19:00,2022-03-13 06:34:00,Ariyah,10229,0,4434314,CKB +Ryder,Ariyah,2022-03-13 06:34:00,2022-03-13 06:49:00,Kehlani,11801,0,4434314,CKB +Ryder,Kehlani,2022-03-13 06:49:00,2022-03-13 06:49:00,Beckham,0.06,0,4434314,CKB +Aziel,Beckham,2022-03-13 02:34:00,2022-03-13 02:34:00,Miles,0.06,0,4524178,CKB +Aziel,Miles,2022-03-13 02:34:00,2022-03-13 03:00:00,Delilah,9016,0,4524178,CKB +Aziel,Delilah,2022-03-13 03:00:00,2022-03-13 03:27:00,Miles,10083,7,4524178,CKB +Aziel,Miles,2022-03-13 03:34:00,2022-03-13 04:00:00,Delilah,9016,0,4524178,CKB +Aziel,Delilah,2022-03-13 04:00:00,2022-03-13 04:27:00,Miles,10083,7,4524178,CKB +Aziel,Miles,2022-03-13 04:34:00,2022-03-13 05:00:00,Delilah,9016,0,4524178,CKB +Aziel,Delilah,2022-03-13 05:00:00,2022-03-13 05:27:00,Miles,10083,7,4524178,CKB +Aziel,Miles,2022-03-13 05:34:00,2022-03-13 06:00:00,Delilah,9016,0,4524178,CKB +Aziel,Delilah,2022-03-13 06:00:00,2022-03-13 06:27:00,Miles,10083,7,4524178,CKB +Aziel,Miles,2022-03-13 06:34:00,2022-03-13 07:00:00,Delilah,9016,0,4524178,CKB +Aziel,Delilah,2022-03-13 07:00:00,2022-03-13 07:00:00,Beckham,0.06,0,4524178,CKB +Aziel,Beckham,2022-03-13 02:04:00,2022-03-13 02:04:00,Miles,0.06,0,4619808,CKB +Aziel,Miles,2022-03-13 02:04:00,2022-03-13 02:30:00,Delilah,9016,0,4619808,CKB +Aziel,Delilah,2022-03-13 02:30:00,2022-03-13 02:57:00,Miles,10083,7,4619808,CKB +Aziel,Miles,2022-03-13 03:04:00,2022-03-13 03:30:00,Delilah,9016,0,4619808,CKB +Aziel,Delilah,2022-03-13 03:30:00,2022-03-13 03:57:00,Miles,10083,7,4619808,CKB +Aziel,Miles,2022-03-13 04:04:00,2022-03-13 04:30:00,Delilah,9016,0,4619808,CKB +Aziel,Delilah,2022-03-13 04:30:00,2022-03-13 04:57:00,Miles,10083,7,4619808,CKB +Aziel,Miles,2022-03-13 05:04:00,2022-03-13 05:30:00,Delilah,9016,0,4619808,CKB +Aziel,Delilah,2022-03-13 05:30:00,2022-03-13 05:57:00,Miles,10083,7,4619808,CKB +Aziel,Miles,2022-03-13 06:04:00,2022-03-13 06:30:00,Delilah,9016,0,4619808,CKB +Aziel,Delilah,2022-03-13 06:30:00,2022-03-13 06:57:00,Miles,10083,0,4619808,CKB +Aziel,Miles,2022-03-13 06:57:00,2022-03-13 06:57:00,Beckham,0.06,0,4619808,CKB +Dalton,Beckham,2022-03-13 00:31:00,2022-03-13 00:31:00,Kamila,0.06,0,4374748,CKB +Dalton,Kamila,2022-03-13 00:31:00,2022-03-13 00:44:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 00:44:00,2022-03-13 00:56:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 01:01:00,2022-03-13 01:14:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 01:14:00,2022-03-13 01:26:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 01:31:00,2022-03-13 01:44:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 01:44:00,2022-03-13 01:56:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 02:01:00,2022-03-13 02:14:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 02:14:00,2022-03-13 02:26:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 02:31:00,2022-03-13 02:44:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 02:44:00,2022-03-13 02:56:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 03:01:00,2022-03-13 03:14:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 03:14:00,2022-03-13 03:26:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 03:31:00,2022-03-13 03:44:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 03:44:00,2022-03-13 03:56:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 04:01:00,2022-03-13 04:14:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 04:14:00,2022-03-13 04:26:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 04:31:00,2022-03-13 04:44:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 04:44:00,2022-03-13 04:56:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 05:01:00,2022-03-13 05:14:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 05:14:00,2022-03-13 05:26:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 05:31:00,2022-03-13 05:44:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 05:44:00,2022-03-13 05:56:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 06:01:00,2022-03-13 06:14:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 06:14:00,2022-03-13 06:26:00,Kamila,5362,5,4374748,CKB +Dalton,Kamila,2022-03-13 06:31:00,2022-03-13 06:44:00,Veronica,4872,0,4374748,CKB +Dalton,Veronica,2022-03-13 06:44:00,2022-03-13 06:56:00,Kamila,5362,0,4374748,CKB +Dalton,Kamila,2022-03-13 06:56:00,2022-03-13 06:56:00,Beckham,0.06,0,4374748,CKB +Jamison,Beckham,2022-03-13 00:31:00,2022-03-13 00:31:00,Kamila,0.06,0,4374871,CKB +Jamison,Kamila,2022-03-13 00:31:00,2022-03-13 00:45:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 00:47:00,2022-03-13 01:01:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 01:01:00,2022-03-13 01:15:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 01:17:00,2022-03-13 01:31:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 01:31:00,2022-03-13 01:45:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 01:47:00,2022-03-13 02:01:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 02:01:00,2022-03-13 02:15:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 02:17:00,2022-03-13 02:31:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 02:31:00,2022-03-13 02:45:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 02:47:00,2022-03-13 03:01:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 03:01:00,2022-03-13 03:15:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 03:17:00,2022-03-13 03:31:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 03:31:00,2022-03-13 03:45:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 03:47:00,2022-03-13 04:01:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 04:01:00,2022-03-13 04:15:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 04:17:00,2022-03-13 04:31:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 04:31:00,2022-03-13 04:45:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 04:47:00,2022-03-13 05:01:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 05:01:00,2022-03-13 05:15:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 05:17:00,2022-03-13 05:31:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 05:31:00,2022-03-13 05:45:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 05:47:00,2022-03-13 06:01:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 06:01:00,2022-03-13 06:15:00,Liana,5225,2,4374871,CKB +Jamison,Liana,2022-03-13 06:17:00,2022-03-13 06:31:00,Kamila,7617,0,4374871,CKB +Jamison,Kamila,2022-03-13 06:31:00,2022-03-13 06:45:00,Liana,5096,0,4374871,CKB +Jamison,Liana,2022-03-13 06:45:00,2022-03-13 06:45:00,Beckham,0.06,0,4374871,CKB +Keegan,Beckham,2022-03-13 00:43:00,2022-03-13 00:43:00,Charleigh,0.06,0,4375017,CKB +Keegan,Charleigh,2022-03-13 00:43:00,2022-03-13 00:53:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 00:53:00,2022-03-13 01:03:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 01:13:00,2022-03-13 01:23:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 01:23:00,2022-03-13 01:33:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 01:43:00,2022-03-13 01:53:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 01:53:00,2022-03-13 02:03:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 02:13:00,2022-03-13 02:23:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 02:23:00,2022-03-13 02:33:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 02:43:00,2022-03-13 02:53:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 02:53:00,2022-03-13 03:03:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 03:13:00,2022-03-13 03:23:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 03:23:00,2022-03-13 03:33:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 03:43:00,2022-03-13 03:53:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 03:53:00,2022-03-13 04:03:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 04:13:00,2022-03-13 04:23:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 04:23:00,2022-03-13 04:33:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 04:43:00,2022-03-13 04:53:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 04:53:00,2022-03-13 05:03:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 05:13:00,2022-03-13 05:23:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 05:23:00,2022-03-13 05:33:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 05:43:00,2022-03-13 05:53:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 05:53:00,2022-03-13 06:03:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 06:13:00,2022-03-13 06:23:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 06:23:00,2022-03-13 06:33:00,Charleigh,4408,10,4375017,CKB +Keegan,Charleigh,2022-03-13 06:43:00,2022-03-13 06:53:00,Eli,4507,0,4375017,CKB +Keegan,Eli,2022-03-13 06:53:00,2022-03-13 07:03:00,Charleigh,4408,0,4375017,CKB +Keegan,Charleigh,2022-03-13 07:03:00,2022-03-13 07:03:00,Beckham,0.06,0,4375017,CKB diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 94da8765..29eb20b2 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -37,7 +37,11 @@ def add_trip(self, trip): # first of rotation found (for now) self.departure_time = new_trip.departure_time self.departure_name = new_trip.departure_name - elif self.arrival_time < new_trip.arrival_time: + # '<=' instead of '<' since last trip of rotation has no duration + # in the sample data. The trips are however chronologically + # sorted which is why this approach works for sample data. + # Will also work if one only relies on timestamps! + elif self.arrival_time <= new_trip.arrival_time: # last trip of rotation (for now) self.arrival_time = new_trip.arrival_time self.arrival_name = new_trip.arrival_name diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c0aa1061..3d29f7ac 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -522,5 +522,5 @@ def generate_scenario_json(self, args): } # Write JSON self.scenario = j - with open(args.input, 'w') as f: + with open(args.input, 'w+') as f: json.dump(j, f, indent=2) From aea2eaf7e9aea396ed6a20ef384f43923b009763 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 6 Apr 2022 18:07:49 +0200 Subject: [PATCH 105/802] exclude data dir from flake8 --- .flake8 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.flake8 b/.flake8 index 216ffa1a..7f0a9bd3 100644 --- a/.flake8 +++ b/.flake8 @@ -1,4 +1,4 @@ [flake8] -exclude = docs,src +exclude = docs,src,data max-line-length=100 docstring_style=sphinx From 13b06af6e445d0a19af4c2d617cd223c2704cfcb Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Thu, 7 Apr 2022 09:27:33 +0200 Subject: [PATCH 106/802] README explains usage of module --- Development Progress.md | 40 ++++++++++++++++++++++++++++++++++++++++ README.md | 39 ++++++--------------------------------- 2 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 Development Progress.md diff --git a/Development Progress.md b/Development Progress.md new file mode 100644 index 00000000..3845207a --- /dev/null +++ b/Development Progress.md @@ -0,0 +1,40 @@ +# eBus Toolbox + +## Idea + +This toolbox helps to do eBus feasibility studies and answer research questions + +## Tools + +For overview and interfaces of tools see here: +https://miro.com/app/board/o9J_lu8coPI=/ + +### scedule data preparation + +* [X] from VIP to RLI scedule data format +* [ ] from eFlips to RLI scedule data format + +### scedule data analysis + +* [ ] Generate table of rotation distances +* [ ] Ranking by accumulated break time + +### Consumption analysis +* [ ] air conditioning consumption based on weather data + +### SOC analysis +Assumptions: Leave depot fully loaded + +SOC trend for each rotation based on: +* [X] charging locations (OC) +* [X] number of available charging infrastructure (OC) +* [ ] charging characteristics (OC) + +### Charge demand analysis +Generate load profile for each charging location based on SOC analysis + +### Schedule adjustment +* [X] split up rotations with negative SOC +* [X] recombine splitted rotations + +### Charging Location Tool \ No newline at end of file diff --git a/README.md b/README.md index 3845207a..ae97af93 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,13 @@ # eBus Toolbox -## Idea +The eBus Toolbox assists the user in analysing and optimising electrified bus fleets and schedules. -This toolbox helps to do eBus feasibility studies and answer research questions +### Usage -## Tools +At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an indepth SOC analysis. -For overview and interfaces of tools see here: -https://miro.com/app/board/o9J_lu8coPI=/ +To try it out, run the following command from the root directory of this repository after installing the dependencies from `requirements.txt`. -### scedule data preparation +`python -m ebus_toolbox --config data/configs/ebus_toolbox.cfg` -* [X] from VIP to RLI scedule data format -* [ ] from eFlips to RLI scedule data format - -### scedule data analysis - -* [ ] Generate table of rotation distances -* [ ] Ranking by accumulated break time - -### Consumption analysis -* [ ] air conditioning consumption based on weather data - -### SOC analysis -Assumptions: Leave depot fully loaded - -SOC trend for each rotation based on: -* [X] charging locations (OC) -* [X] number of available charging infrastructure (OC) -* [ ] charging characteristics (OC) - -### Charge demand analysis -Generate load profile for each charging location based on SOC analysis - -### Schedule adjustment -* [X] split up rotations with negative SOC -* [X] recombine splitted rotations - -### Charging Location Tool \ No newline at end of file +The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. \ No newline at end of file From 5bf6ab5ff310503ea5ebbdd21a5bf69b59acd639 Mon Sep 17 00:00:00 2001 From: PaulB Date: Mon, 11 Apr 2022 09:34:11 +0200 Subject: [PATCH 107/802] Only run ebus_toolbox tests --- .github/workflows/test-python-app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-python-app.yml b/.github/workflows/test-python-app.yml index 5a19f9ea..b7db6bfa 100644 --- a/.github/workflows/test-python-app.yml +++ b/.github/workflows/test-python-app.yml @@ -30,4 +30,4 @@ jobs: flake8 . - name: Test with pytest run: | - pytest + pytest tests/ From 9b282772011ebc92ab82cc7fb2b4f885328ea661 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 11 Apr 2022 12:44:58 +0200 Subject: [PATCH 108/802] remove unnecessary file --- ebus_toolbox/test.py | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 ebus_toolbox/test.py diff --git a/ebus_toolbox/test.py b/ebus_toolbox/test.py deleted file mode 100644 index 9d64dd39..00000000 --- a/ebus_toolbox/test.py +++ /dev/null @@ -1,5 +0,0 @@ -from schedule import Schedule - -schedule = Schedule.from_csv("./data/private_examples/trips_example-bvg.csv") -schedule.calculate_consumption() -print("done") From b13c016210186d86bea49582e25e200fddb0ec64 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 11 Apr 2022 14:12:05 +0200 Subject: [PATCH 109/802] assign vID considers vt specific standing times --- ebus_toolbox/schedule.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 3d29f7ac..2b0abefb 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,6 +1,5 @@ import csv import datetime -import bisect from datetime import timedelta import json from os import path @@ -92,15 +91,17 @@ def set_charging_type(self, preferred_ct, args, rotation_ids=None): capacity = vehicle_type["capacity"] if preferred_ct == "oppb" or capacity < rot.consumption: self.rotations[id].charging_type = "oppb" - rot.min_standing_time_deps = \ + min_standing_time = \ (capacity / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb else: self.rotations[id].charging_type = "depb" - rot.min_standing_time_deps = (rot.consumption / args.cs_power_deps_depb) + min_standing_time = (rot.consumption / args.cs_power_deps_depb) desired_max_standing_time = \ (capacity / args.cs_power_deps_depb) * args.min_recharge_deps_oppb - if rot.min_standing_time_deps > desired_max_standing_time: - rot.min_standing_time_deps = desired_max_standing_time + if min_standing_time > desired_max_standing_time: + min_standing_time = desired_max_standing_time + + rot.earliest_departure_next_rot = rot.arrival_time + timedelta(hours=min_standing_time) def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. @@ -119,9 +120,7 @@ def assign_vehicles(self): # mark those vehicle as idle for r in rotations_in_progress: # calculate min_standing_time deps - - if rot.departure_time > r.arrival_time + \ - timedelta(hours=r.min_standing_time_deps): + if rot.departure_time > r.earliest_departure_next_rot: idle_vehicles.append(r.vehicle_id) rotations_in_progress.pop(0) else: @@ -138,9 +137,15 @@ def assign_vehicles(self): idle_vehicles.remove(vehicle_id) rot.vehicle_id = vehicle_id - arrival_times = [r.arrival_time for r in rotations_in_progress] - # keep list of ongoing rotations sorted by arrival_time - rotations_in_progress.insert(bisect.bisect(arrival_times, rot.arrival_time), rot) + + # keep list of rotations in progress sorted + i = 0 + for i, r in enumerate(rotations_in_progress): + # go through rotations in order, stop at same or higher departure + if r.earliest_departure_next_rot >= rot.earliest_departure_next_rot: + break + # insert at calculated index + rotations_in_progress.insert(i, rot) self.vehicle_type_counts = vehicle_type_counts From 5c43998283e3c3697b780de49e728707cf75b849 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 11 Apr 2022 16:51:27 +0200 Subject: [PATCH 110/802] refactor config --- data/configs/ebus_toolbox.cfg | 78 +++++++++++++++++++++-------------- ebus_toolbox/__main__.py | 18 ++++++-- ebus_toolbox/schedule.py | 8 ++-- 3 files changed, 65 insertions(+), 39 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 3e9bea40..0a0d6d8c 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -1,53 +1,82 @@ # Configs for the eBus Toolbox -# Input file containing trip informationgg +##### INPUT/OUTPUT FILES AND PATHS ##### + +# Input file containing trip information input_schedule = "./data/examples/trips_example.csv" + # output path for scenario.json -- called input since its input for spiceev -input = "./data/simulation_results/scenario.json" -# Preferred charging type. Options: depb, oppb (default: depb) -preferred_charging_type = "depb" -# vehicle types -vehicle_types = "./data/examples/vehicle_types.json" -# minimum fraction of capacity for recharge when leaving the depot. Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) -min_recharge_deps_oppb = 1 -min_recharge_deps_depb = 1 -#electrified stations -electrified_stations = data/examples/electrified_stations.json +output_directory = "./data/simulation_results/" + +# electrified stations (defaults to: data/examples/electrified_stations.json) +#electrified_stations = "data/examples/electrified_stations.json" + +# vehicle types (defaults to: ./data/examples/vehicle_types.json) +#vehicle_types = "./data/examples/vehicle_types.json" + + +##### SIMULATION HYPERPARAMETERS ##### # set random seed (for always random: set seed = null) seed = 1 -# number of interations for the adjustment of charging types + +# number of interations for the adjustment of charging types (default:1) iterations = 2 -# maximum number of days to simulate, if not set simulate entire schedule -days = 10 + # set length of timestep in minutes (default: 15 minute intervals) interval = 1 + +# time difference between signal time and actual start time of a vehicle event im min. (default: 10) +signal_time_dif = 10 + + +##### SIMULATION CONDITIONS AND BOUNDARIES ##### + +# maximum number of days to simulate, if not set simulate entire schedule +#days = 10 + # set minimum allowed state of charge when leaving (default: 0.8) desired_soc = 1 + +# Preferred charging type. Options: depb, oppb (default: depb) +preferred_charging_type = "depb" + +# min charging time at opp station [minutes] (default: 2) +min_charging_time_opps = 2 + + +##### PHYSICAL SETUP OF ENVIRONMENT ##### + +# minimum fraction of capacity for recharge when leaving the depot. Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) +min_recharge_deps_oppb = 1 +min_recharge_deps_depb = 1 + # max power of grid connectors at depot and opp stations # default: Sum of max power of all charging stations at this grid connector gc_power_opps = 1000 gc_power_deps = 1000 + # max power of charging station at depot and opp stations # at depot stations opp and depot busses have distinct charging stations cs_power_opps = 400 cs_power_deps_depb = 100 cs_power_deps_oppb = 150 -# min charging time at opp station [minutes] -min_charging_time_opps = 2 + # define hours of traffic_jam (options are "stop&go" and "dense") #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} -# time difference between signal time and actual start time of a vehicle event im min. (default: 10) -signal_time_dif = 10 + # set stationary batteries [capacity, C-Rate] # battery with capacity = 75 kWh and C-Rate = 0.5 #battery = [[50, 1]] + # 2 batteries with capacity = 50 kWh, C-Rate = 1, grid_connector = "Betriebshof A") battery = [[50, 1, "Beckham"]] + # unlimited battery capacity with constant (dis)charge of 50 kWh #battery = [[-1, 50]] -# set CSV-files +##### TIMESERIES ##### + # list of external load timeseries (in this example in same directory as resulting json) and # grid connector at which the timeseries shall be applied # e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] @@ -57,7 +86,6 @@ battery = [[50, 1, "Beckham"]] # set CSV column name, timestep duration in sec. (example: 10 min) and factor (example: input in Watt) #include_ext_csv_option = [["column", "value"], ["step_duration_s", 600], ["factor", 0.001]] - # local feed in timeseries (in this example in subdirectory "timeseries" - relative to resulting json) and # grid connector at which the timeseries shall be applied # e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] @@ -67,7 +95,6 @@ battery = [[50, 1, "Beckham"]] # set CSV column name, timestep duration in sec. (example: 1 hour) and factor (example: input in Watt) #include_feed_in_csv_option = [["column", "value"], ["step_duration_s", 3600], ["factor", 1]] - # energy price timeseries in EUR/kWh (in this example in parent directory - relative to resulting json) and # grid connector at which the timeseries shall be applied # e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] @@ -89,16 +116,7 @@ strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEG # show plots after simulation visual = false -# show estimated remaining time instead of progress bar -# WARNING: slows down fast computations -eta = false - # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. # margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. margin = 1.0 - -# generate output files with simulation data -save_timeseries = data/simulation_results/simulation_spiceEV.csv -save_results = data/simulation_results/simulation_spiceEV.json -save_soc = data/simulation_results/simulation_soc_spiceEV.csv diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 233d0851..e884e2f0 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,16 +1,19 @@ import argparse +from os import path from ebus_toolbox import simulate, util if __name__ == '__main__': parser = argparse.ArgumentParser( description='Ebus Toolbox - \ Simulation Program for Ebus Fleets.') - parser.add_argument('input_schedule', nargs='?', help='Set the scenario JSON file') - parser.add_argument('input', nargs='?', help='output file name (example.json)') + parser.add_argument('--input_schedule', nargs='?', + help='Path to CSV file containing all trips of schdedule to be analyzed.') + parser.add_argument('--output_directory', nargs='?', + help='Location where all simulation outputs are stored') parser.add_argument('--preferred_charging_type', '-pct', default='depot', choices=['depot', 'opp'], help="Preferred charging type. Choose one\ from and . opp stands for opportunity.") - parser.add_argument('--vehicle-types', default=None, + parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", help='location of vehicle type definitions') parser.add_argument('--min_recharge_deps_oppb', default=1, help='Minimum fraction of capacity for recharge when leaving the depot.') @@ -58,7 +61,7 @@ help='Provide start date of simulation in format YYYY-MM-DD.E.g. ' '2018-01-31') parser.add_argument('--electrified_stations', help='include electrified_stations json', - default='examples/electrified_stations.json') + default='data/examples/electrified_stations.json') parser.add_argument('--vehicle_types', help='include vehicle_types json', default='examples/vehicle_types.json') parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', @@ -90,4 +93,11 @@ util.set_options_from_config(args, check=True, verbose=False) + # arguments relevant to SpiceEV, setting automatically to reduce clutter in config + args.input = path.join(args.output_directory, "scenario.json") + args.save_timeseries = path.join(args.output_directory, "simulation_spiceEV.csv") + args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") + args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") + args.eta = False + simulate.simulate(args) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 2b0abefb..74f43bf0 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -435,8 +435,6 @@ def generate_scenario_json(self, args): # add timeseries from csv # save path and options for CSV timeseries - # all spiceev paths are relative to input (refers to spiceEv input) file - target_path = path.dirname(args.input) if args.include_ext_load_csv: for filename, gc_name in args.include_ext_load_csv: @@ -455,7 +453,7 @@ def generate_scenario_json(self, args): options[key] = value events['external_load'][basename] = options # check if CSV file exists - ext_csv_path = path.join(target_path, filename) + ext_csv_path = path.join(args.output_directory, filename) if not path.exists(ext_csv_path): print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) @@ -475,7 +473,7 @@ def generate_scenario_json(self, args): value = int(value) options[key] = value events['energy_feed_in'][basename] = options - feed_in_path = path.join(target_path, filename) + feed_in_path = path.join(args.output_directory, filename) if not path.exists(feed_in_path): print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) @@ -493,7 +491,7 @@ def generate_scenario_json(self, args): value = int(value) options[key] = value events['energy_price_from_csv'] = options - price_csv_path = path.join(target_path, filename) + price_csv_path = path.join(args.output_directory, filename) if not path.exists(price_csv_path): print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) From 9b87b9e4a0c132ca2475ddfcd3557e49f25c4b36 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 11:53:38 +0200 Subject: [PATCH 111/802] improve handling of arg output_directory --- .gitignore | 2 +- data/configs/ebus_toolbox.cfg | 4 ++-- ebus_toolbox/__main__.py | 5 ++++- ebus_toolbox/schedule.py | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 8143efc7..11393235 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,5 @@ docs/_build docs/source/temp data/private_examples -data/simulation_results +data/sim_outputs data/preprocessing_scripts diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 0a0d6d8c..e11cd383 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -2,11 +2,11 @@ ##### INPUT/OUTPUT FILES AND PATHS ##### -# Input file containing trip information +# Input file containing trip information (required) input_schedule = "./data/examples/trips_example.csv" # output path for scenario.json -- called input since its input for spiceev -output_directory = "./data/simulation_results/" +#output_directory = "./data/sim_outputs/" # electrified stations (defaults to: data/examples/electrified_stations.json) #electrified_stations = "data/examples/electrified_stations.json" diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index e884e2f0..33a1258a 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -8,7 +8,7 @@ Simulation Program for Ebus Fleets.') parser.add_argument('--input_schedule', nargs='?', help='Path to CSV file containing all trips of schdedule to be analyzed.') - parser.add_argument('--output_directory', nargs='?', + parser.add_argument('--output_directory', default='data/sim_outputs', nargs='?', help='Location where all simulation outputs are stored') parser.add_argument('--preferred_charging_type', '-pct', default='depot', choices=['depot', 'opp'], help="Preferred charging type. Choose one\ @@ -93,6 +93,9 @@ util.set_options_from_config(args, check=True, verbose=False) + if args.input_schedule is None: + raise SystemExit("The following argument is required: input_schedule") + # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.input = path.join(args.output_directory, "scenario.json") args.save_timeseries = path.join(args.output_directory, "simulation_spiceEV.csv") diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 74f43bf0..507cb2d9 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -2,7 +2,7 @@ import datetime from datetime import timedelta import json -from os import path +from os import path, makedirs import random from ebus_toolbox.rotation import Rotation @@ -525,5 +525,6 @@ def generate_scenario_json(self, args): } # Write JSON self.scenario = j + makedirs(args.output_directory, exist_ok=True) with open(args.input, 'w+') as f: json.dump(j, f, indent=2) From 25f1713a82b6eeba1e597ac30044d4a255f55159 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 11:54:25 +0200 Subject: [PATCH 112/802] fix vehicle assignment bug --- ebus_toolbox/schedule.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 507cb2d9..fa7dead7 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -118,12 +118,13 @@ def assign_vehicles(self): for rot in rotations: # find vehicles that have completed rotation and stood for a minimum staning time # mark those vehicle as idle - for r in rotations_in_progress: + while rotations_in_progress: # calculate min_standing_time deps + r = rotations_in_progress.pop(0) if rot.departure_time > r.earliest_departure_next_rot: idle_vehicles.append(r.vehicle_id) - rotations_in_progress.pop(0) else: + rotations_in_progress.insert(0, r) break # find idle vehicle for rotation if exists From a177c96f2058e490e27edff913322b7c11969e04 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 12:12:17 +0200 Subject: [PATCH 113/802] fix bug - list negative soc can be empty --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index fa7dead7..fc849c1c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -229,7 +229,10 @@ def get_negative_rotations(self, args): results = json.load(f) # get dict of vehicles with negative soc's + try: negative_vehicles = results["vehicles with negative soc"] + except KeyError: + return [] # get matching rotations negative_rotations = [] for v_id, time in negative_vehicles.items(): From 4af037c1b8fb2424af324453139518ed7bd6b9a8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 12:19:01 +0200 Subject: [PATCH 114/802] comment of circular reference --- ebus_toolbox/trip.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 51f7cdbe..9ba91f39 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -11,6 +11,11 @@ def __init__(self, rotation, departure_time, departure_name, self.arrival_name = arrival_name self.distance = float(distance) + # Attention: Circular reference! + # While a rotation carries a references to this trip, this trip + # itself carries the below reference to that rotation as well. + # For Python versions < 3.4 this created a problem for the garbage + # collector. self.rotation = rotation self.consumption = None # kWh From ac76d55f4590afa6ec77ed25a4e4d8f2b1102d9e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 12:22:30 +0200 Subject: [PATCH 115/802] add default value to example config --- data/configs/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index e11cd383..f40a4640 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -56,7 +56,7 @@ gc_power_opps = 1000 gc_power_deps = 1000 # max power of charging station at depot and opp stations -# at depot stations opp and depot busses have distinct charging stations +# at depot stations opp and depot busses have distinct charging stations (all default to: 150) cs_power_opps = 400 cs_power_deps_depb = 100 cs_power_deps_oppb = 150 From 3c7f0df5060c8fd4adfa7d632cf17f95c27c5020 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 14:16:58 +0200 Subject: [PATCH 116/802] open file with with-statement --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index fc849c1c..c80459ff 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -225,7 +225,7 @@ def get_negative_rotations(self, args): raise TypeError("In order to get negative totations from spice_ev results, please " "specify 'save_results' in your input arguments.") filename = f"{ext[0]}_{gcID}{ext[-1]}" - f = open(filename) + with open(filename) as f: results = json.load(f) # get dict of vehicles with negative soc's From 6733c3bafe3c78b767abecce7b4288fe509773c2 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 14:21:26 +0200 Subject: [PATCH 117/802] git issue --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c80459ff..0607330b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -226,11 +226,11 @@ def get_negative_rotations(self, args): "specify 'save_results' in your input arguments.") filename = f"{ext[0]}_{gcID}{ext[-1]}" with open(filename) as f: - results = json.load(f) + results = json.load(f) # get dict of vehicles with negative soc's try: - negative_vehicles = results["vehicles with negative soc"] + negative_vehicles = results["vehicles with negative soc"] except KeyError: return [] # get matching rotations From 638dcbd5718ea7424e3555da5b9238a7693870be Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 14:29:57 +0200 Subject: [PATCH 118/802] do not optimize after final iteration --- ebus_toolbox/simulate.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 13ae0355..66df77af 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -50,15 +50,11 @@ def simulate(args): sys.stdout = sys.__stdout__ print("Spice EV simulation complete.") - schedule.readjust_charging_type(args) - if i == args.iterations: break - # Quit if optimizer is not defined - # (LATER) Run optimizer, continue from top or quit based on optimizer output - # if optimizer.no_optimization() == 'converged': - # break + # TODO: replace with optimizer step in the future + schedule.readjust_charging_type(args) # create report report.generate() From a98ea08c0fefa9c4bf8813a7ef50fa1610b2a446 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 14:54:28 +0200 Subject: [PATCH 119/802] update README --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ae97af93..414fb5eb 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,20 @@ The eBus Toolbox assists the user in analysing and optimising electrified bus fl ### Usage -At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an indepth SOC analysis. +At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an in-depth SOC analysis. -To try it out, run the following command from the root directory of this repository after installing the dependencies from `requirements.txt`. +To try it out, first clone this repository and then install the required packages to your current environment by running -`python -m ebus_toolbox --config data/configs/ebus_toolbox.cfg` +`pip install -r requirements.txt` -The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. \ No newline at end of file +Now you can start the eBus Toolbox with all configurations stored at `data/configs/ebus_toolbox.cfg` module via the command. + +``python -m ebus_toolbox --config data/configs/ebus_toolbox.cfg`` + +The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. + +To run the eBus Toolbox with your own `schedule.csv` file and default configurations run + +`python -m ebus_toolbox --input_schedule path/to/schedule.csv` + +Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. \ No newline at end of file From e7ac2be99317a54e92f084ab74e952ae26b2f940 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 16:28:05 +0200 Subject: [PATCH 120/802] remove templates --- data/templates/ebus_toolbox_input_template.csv | 2 -- data/templates/spice_ev_input_template.csv | 1 - 2 files changed, 3 deletions(-) delete mode 100644 data/templates/ebus_toolbox_input_template.csv delete mode 100644 data/templates/spice_ev_input_template.csv diff --git a/data/templates/ebus_toolbox_input_template.csv b/data/templates/ebus_toolbox_input_template.csv deleted file mode 100644 index db1a5a4d..00000000 --- a/data/templates/ebus_toolbox_input_template.csv +++ /dev/null @@ -1,2 +0,0 @@ -line,departure_name,departure_short_name,departure_day,departure_time,arrival_time,arrival_day,arrival_name,arrival_short_name,distance,pause,rotation_id,vehicle_type -160,Betriebshof A,BF A E,Monday,21.5166666666666,21.5166666666666,Monday,Hasselwerderstr.,HAWR01B,0.06,0,4454943,CKB \ No newline at end of file diff --git a/data/templates/spice_ev_input_template.csv b/data/templates/spice_ev_input_template.csv deleted file mode 100644 index d1ced0c4..00000000 --- a/data/templates/spice_ev_input_template.csv +++ /dev/null @@ -1 +0,0 @@ -rotation_id,arrival_name,departure_name,arrival_time,departure_time,vehilce_id,vehicle_type,delta_soc,charging_type \ No newline at end of file From f17d5dbbdee4508c081e0954962409e4ff1fcb2a Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 13 Apr 2022 16:31:12 +0200 Subject: [PATCH 121/802] remove archiv from repo --- data/archiv/Template_Schedule_Data.xlsx | Bin 10512 -> 0 bytes data/archiv/Template_Schedule_Data_english.csv | 1 - data/archiv/Template_Schedule_Data_german.csv | 1 - 3 files changed, 2 deletions(-) delete mode 100644 data/archiv/Template_Schedule_Data.xlsx delete mode 100644 data/archiv/Template_Schedule_Data_english.csv delete mode 100644 data/archiv/Template_Schedule_Data_german.csv diff --git a/data/archiv/Template_Schedule_Data.xlsx b/data/archiv/Template_Schedule_Data.xlsx deleted file mode 100644 index 1f5be8dab11ffa8b8fbb140b93f45a4b6f1f8a37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10512 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 n(EbkpPwV(scrMjn;QzFh%5n(M*#!Vlp+A4 Date: Wed, 13 Apr 2022 18:25:16 +0200 Subject: [PATCH 122/802] add input description to README --- README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 414fb5eb..75e02456 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,25 @@ Now you can start the eBus Toolbox with all configurations stored at `data/confi The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. -To run the eBus Toolbox with your own `schedule.csv` file and default configurations run +To run the eBus Toolbox with your own `schedule.csv` (see details [below](#input-data)) file and default configurations run `python -m ebus_toolbox --input_schedule path/to/schedule.csv` -Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. \ No newline at end of file +Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. + + + +### Input Data + +To analyze your own electric bus schedule, the data needs to be provided as a CSV file where each row contains the details of a single trip of that schedule. Find the details about the various columns in this file below. The first table lists the **mandatory** columns while the second one (tbd) lists optional parameters. Refer to `data/examples/trips.csv` for an example. + +| Column Name | Description | Example | +| -------------- | ------------------------------------------------------------ | ----------------- | +| rotation_id | Unique alphanumeric ID to identify rotations | 27312 | +| departure_name | Name of the station the trip starts at | Warschauer Straße | +| departure_time | Date and Time at which bus starts trip | 2022-03-13T10:25 | +| arrival_name | Name of the station the trip ends at | Ostbahnhof Berlin | +| arrival_time | Date and Time at which bus completes trip (e.g. yyyy-mm-ddThh:mm[:ss]) | 2022-03-13T10:30 | +| distance | Distance traveled in **m** | 1340 | +| vehicle_type | ID of vehicle type defined in vehicle types file. Set path of this file in config.
(see default for reference: `data/examples/vehicle_types.json`) | some_bus_type | + From c7182000cd7d2cb137c0f70bf0f3a7879164c5f8 Mon Sep 17 00:00:00 2001 From: PaulB Date: Tue, 19 Apr 2022 11:23:58 +0200 Subject: [PATCH 123/802] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 75e02456..7b934bae 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To try it out, first clone this repository and then install the required package `pip install -r requirements.txt` -Now you can start the eBus Toolbox with all configurations stored at `data/configs/ebus_toolbox.cfg` module via the command. +Now you can start the eBus Toolbox module with all configurations stored at `data/configs/ebus_toolbox.cfg` via the command ``python -m ebus_toolbox --config data/configs/ebus_toolbox.cfg`` From 93328b132b4f7cccb6ba710c47f3e39b0639b7a3 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 19 Apr 2022 17:35:21 +0200 Subject: [PATCH 124/802] new station names for example --- data/configs/ebus_toolbox.cfg | 2 +- data/examples/electrified_stations.json | 22 +- data/examples/trips_example.csv | 7914 +++++++++++------------ 3 files changed, 3969 insertions(+), 3969 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index f40a4640..93e8c6ab 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -69,7 +69,7 @@ cs_power_deps_oppb = 150 #battery = [[50, 1]] # 2 batteries with capacity = 50 kWh, C-Rate = 1, grid_connector = "Betriebshof A") -battery = [[50, 1, "Beckham"]] +#battery = [[50, 1, "DEPS_1"]] # unlimited battery capacity with constant (dis)charge of 50 kWh #battery = [[-1, 50]] diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 8a77fa37..d36f0f3b 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -1,17 +1,17 @@ { "opp_stations": { - "Kehlani": 3, - "Brinley": 1, - "Kamila": 2, - "Izaiah": 5, - "Cecilia": 4, - "Ari": 4, - "Lexi": 3, - "Kali": 5 + "OPPS_3": 3, + "OPPS_10": 1, + "OPPS_21": 2, + "OPPS_26": 5, + "OPPS_28": 4, + "OPPS_30": 4, + "OPPS_32": 3, + "OPPS_39": 5 }, "depot_stations": { - "Beckham": "None", - "King": "None", - "Gia": "None" + "DEPS_1": "None", + "DEPS_23": "None", + "DEPS_42": "None" } } \ No newline at end of file diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index bcda319e..97a79c3b 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,3958 +1,3958 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type -Ayaan,Beckham,2022-03-07 21:31:00,2022-03-07 21:31:00,Kalani,0.06,0,4454943,CKB -Ayaan,Kalani,2022-03-07 21:31:00,2022-03-07 22:04:00,Brian,14519,4,4454943,CKB -Ayaan,Brian,2022-03-07 22:08:00,2022-03-07 22:43:00,Kalani,13541,8,4454943,CKB -Ayaan,Kalani,2022-03-07 22:51:00,2022-03-07 23:24:00,Brian,14519,4,4454943,CKB -Ayaan,Brian,2022-03-07 23:28:00,2022-03-08 00:03:00,Kalani,13541,8,4454943,CKB -Ayaan,Kalani,2022-03-08 00:11:00,2022-03-08 00:44:00,Brian,14519,0,4454943,CKB -Hunter,Brian,2022-03-08 00:44:00,2022-03-08 00:54:00,Kehlani,4.1,25,4454943,CKB -Hunter,Kehlani,2022-03-08 01:19:00,2022-03-08 01:42:00,Ayden,8.36,6,4454943,CKB -Hunter,Ayden,2022-03-08 01:48:00,2022-03-08 02:06:00,Kehlani,9067,13,4454943,CKB -Hunter,Kehlani,2022-03-08 02:19:00,2022-03-08 02:42:00,Ayden,8.36,6,4454943,CKB -Hunter,Ayden,2022-03-08 02:48:00,2022-03-08 03:06:00,Kehlani,9067,13,4454943,CKB -Hunter,Kehlani,2022-03-08 03:19:00,2022-03-08 03:42:00,Ayden,8.36,6,4454943,CKB -Hunter,Ayden,2022-03-08 03:48:00,2022-03-08 04:06:00,Kehlani,9067,0,4454943,CKB -Hunter,Kehlani,2022-03-08 04:06:00,2022-03-08 04:06:00,Beckham,0.06,0,4454943,CKB -Ayaan,Beckham,2022-03-07 22:11:00,2022-03-07 22:11:00,Kalani,0.06,0,4454948,CKB -Ayaan,Kalani,2022-03-07 22:11:00,2022-03-07 22:44:00,Brian,14519,4,4454948,CKB -Ayaan,Brian,2022-03-07 22:48:00,2022-03-07 23:23:00,Kalani,13541,8,4454948,CKB -Ayaan,Kalani,2022-03-07 23:31:00,2022-03-08 00:04:00,Brian,14519,4,4454948,CKB -Ayaan,Brian,2022-03-08 00:08:00,2022-03-08 00:39:00,Leonel,12213,0,4454948,CKB -Hunter,Leonel,2022-03-08 00:39:00,2022-03-08 00:47:00,Kehlani,4.0,2,4454948,CKB -Hunter,Kehlani,2022-03-08 00:49:00,2022-03-08 01:12:00,Ayden,8.36,6,4454948,CKB -Hunter,Ayden,2022-03-08 01:18:00,2022-03-08 01:36:00,Kehlani,9067,13,4454948,CKB -Hunter,Kehlani,2022-03-08 01:49:00,2022-03-08 02:12:00,Ayden,8.36,6,4454948,CKB -Hunter,Ayden,2022-03-08 02:18:00,2022-03-08 02:36:00,Kehlani,9067,13,4454948,CKB -Hunter,Kehlani,2022-03-08 02:49:00,2022-03-08 03:12:00,Ayden,8.36,6,4454948,CKB -Hunter,Ayden,2022-03-08 03:18:00,2022-03-08 03:36:00,Kehlani,9067,13,4454948,CKB -Hunter,Kehlani,2022-03-08 03:49:00,2022-03-08 04:12:00,Ayden,8.36,0,4454948,CKB -Hunter,Ayden,2022-03-08 04:12:00,2022-03-08 04:12:00,Beckham,0.06,0,4454948,CKB -Donovan,Beckham,2022-03-07 21:06:00,2022-03-07 21:06:00,Pierce,0.06,0,4664622,CKB -Donovan,Pierce,2022-03-07 21:06:00,2022-03-07 21:34:00,Leonardo,13018,19,4664622,CKB -Donovan,Leonardo,2022-03-07 21:53:00,2022-03-07 22:13:00,Kamryn,10332,17,4664622,CKB -Donovan,Kamryn,2022-03-07 22:30:00,2022-03-07 22:54:00,Leonardo,10.48,19,4664622,CKB -Donovan,Leonardo,2022-03-07 23:13:00,2022-03-07 23:33:00,Kamryn,10332,17,4664622,CKB -Donovan,Kamryn,2022-03-07 23:50:00,2022-03-08 00:14:00,Leonardo,10.48,2,4664622,CKB -Donovan,Leonardo,2022-03-08 00:16:00,2022-03-08 00:23:00,Melanie,3709,5,4664622,CKB -Zoey,Melanie,2022-03-08 00:28:00,2022-03-08 00:44:00,Brinley,6404,3,4664622,CKB -Zoey,Brinley,2022-03-08 00:47:00,2022-03-08 01:10:00,Finn,10579,7,4664622,CKB -Zoey,Finn,2022-03-08 01:17:00,2022-03-08 01:44:00,Brinley,12007,3,4664622,CKB -Zoey,Brinley,2022-03-08 01:47:00,2022-03-08 02:10:00,Finn,10579,7,4664622,CKB -Zoey,Finn,2022-03-08 02:17:00,2022-03-08 02:44:00,Brinley,12007,3,4664622,CKB -Zoey,Brinley,2022-03-08 02:47:00,2022-03-08 03:10:00,Finn,10579,7,4664622,CKB -Zoey,Finn,2022-03-08 03:17:00,2022-03-08 03:44:00,Brinley,12007,3,4664622,CKB -Zoey,Brinley,2022-03-08 03:47:00,2022-03-08 04:10:00,Finn,10579,7,4664622,CKB -Zoey,Finn,2022-03-08 04:17:00,2022-03-08 04:44:00,Brinley,12007,0,4664622,CKB -Zoey,Brinley,2022-03-08 04:44:00,2022-03-08 04:44:00,Beckham,0.06,0,4664622,CKB -Donovan,Beckham,2022-03-07 20:26:00,2022-03-07 20:26:00,Pierce,0.06,0,4762732,CKB -Donovan,Pierce,2022-03-07 20:26:00,2022-03-07 20:56:00,Ezra,14097,14,4762732,CKB -Donovan,Ezra,2022-03-07 21:10:00,2022-03-07 21:38:00,Pierce,13.19,8,4762732,CKB -Donovan,Pierce,2022-03-07 21:46:00,2022-03-07 22:14:00,Leonardo,13018,19,4762732,CKB -Donovan,Leonardo,2022-03-07 22:33:00,2022-03-07 22:53:00,Kamryn,10332,17,4762732,CKB -Donovan,Kamryn,2022-03-07 23:10:00,2022-03-07 23:34:00,Leonardo,10.48,19,4762732,CKB -Donovan,Leonardo,2022-03-07 23:53:00,2022-03-08 00:13:00,Kamryn,10332,2,4762732,CKB -Donovan,Kamryn,2022-03-08 00:15:00,2022-03-08 00:16:00,Brinley,506,1,4762732,CKB -Zoey,Brinley,2022-03-08 00:17:00,2022-03-08 00:40:00,Finn,10579,7,4762732,CKB -Zoey,Finn,2022-03-08 00:47:00,2022-03-08 01:14:00,Brinley,12007,3,4762732,CKB -Zoey,Brinley,2022-03-08 01:17:00,2022-03-08 01:40:00,Finn,10579,7,4762732,CKB -Zoey,Finn,2022-03-08 01:47:00,2022-03-08 02:14:00,Brinley,12007,3,4762732,CKB -Zoey,Brinley,2022-03-08 02:17:00,2022-03-08 02:40:00,Finn,10579,7,4762732,CKB -Zoey,Finn,2022-03-08 02:47:00,2022-03-08 03:14:00,Brinley,12007,3,4762732,CKB -Zoey,Brinley,2022-03-08 03:17:00,2022-03-08 03:40:00,Finn,10579,7,4762732,CKB -Zoey,Finn,2022-03-08 03:47:00,2022-03-08 04:14:00,Brinley,12007,3,4762732,CKB -Zoey,Brinley,2022-03-08 04:17:00,2022-03-08 04:40:00,Finn,10579,3,4762732,CKB -Jackson,Finn,2022-03-08 04:43:00,2022-03-08 04:58:00,Rose,6161,0,4762732,CKB -Jackson,Rose,2022-03-08 04:58:00,2022-03-08 04:58:00,Beckham,0.06,0,4762732,CKB -Avery,Beckham,2022-03-07 22:56:00,2022-03-07 22:56:00,Jace,0.06,0,4617401,CKB -Avery,Jace,2022-03-07 22:56:00,2022-03-07 23:08:00,Nathan,5882,3,4617401,CKB -Avery,Nathan,2022-03-07 23:11:00,2022-03-07 23:25:00,Jace,6232,0,4617401,CKB -Avery,Jace,2022-03-07 23:25:00,2022-03-07 23:38:00,Nathan,6086,3,4617401,CKB -Avery,Nathan,2022-03-07 23:41:00,2022-03-07 23:55:00,Jace,6232,0,4617401,CKB -Avery,Jace,2022-03-07 23:55:00,2022-03-08 00:08:00,Nathan,6086,0,4617401,CKB -Avery,Nathan,2022-03-08 00:08:00,2022-03-08 00:08:00,Beckham,0.06,0,4617401,CKB -Richard,Beckham,2022-03-07 05:05:00,2022-03-07 05:05:00,Ariyah,0.06,0,4426844,CKB -Richard,Ariyah,2022-03-07 05:05:00,2022-03-07 05:14:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 05:14:00,2022-03-07 05:23:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 05:25:00,2022-03-07 05:34:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 05:34:00,2022-03-07 05:43:00,Ariyah,5139,23,4426844,CKB -Richard,Ariyah,2022-03-07 06:06:00,2022-03-07 06:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 06:15:00,2022-03-07 06:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 06:26:00,2022-03-07 06:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 06:35:00,2022-03-07 06:44:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 06:46:00,2022-03-07 06:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 06:55:00,2022-03-07 07:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 07:06:00,2022-03-07 07:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 07:15:00,2022-03-07 07:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 07:26:00,2022-03-07 07:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 07:35:00,2022-03-07 07:44:00,Ariyah,5139,22,4426844,CKB -Richard,Ariyah,2022-03-07 08:06:00,2022-03-07 08:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 08:15:00,2022-03-07 08:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 08:26:00,2022-03-07 08:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 08:35:00,2022-03-07 08:44:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 08:46:00,2022-03-07 08:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 08:55:00,2022-03-07 09:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 09:06:00,2022-03-07 09:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 09:15:00,2022-03-07 09:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 09:26:00,2022-03-07 09:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 09:35:00,2022-03-07 09:44:00,Ariyah,5139,22,4426844,CKB -Richard,Ariyah,2022-03-07 10:06:00,2022-03-07 10:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 10:15:00,2022-03-07 10:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 10:26:00,2022-03-07 10:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 10:35:00,2022-03-07 10:44:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 10:46:00,2022-03-07 10:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 10:55:00,2022-03-07 11:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 11:06:00,2022-03-07 11:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 11:15:00,2022-03-07 11:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 11:26:00,2022-03-07 11:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 11:35:00,2022-03-07 11:44:00,Ariyah,5139,22,4426844,CKB -Richard,Ariyah,2022-03-07 12:06:00,2022-03-07 12:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 12:15:00,2022-03-07 12:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 12:26:00,2022-03-07 12:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 12:35:00,2022-03-07 12:44:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 12:46:00,2022-03-07 12:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 12:55:00,2022-03-07 13:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 13:06:00,2022-03-07 13:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 13:15:00,2022-03-07 13:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 13:26:00,2022-03-07 13:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 13:35:00,2022-03-07 13:44:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 13:46:00,2022-03-07 13:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 13:55:00,2022-03-07 14:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 14:06:00,2022-03-07 14:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 14:15:00,2022-03-07 14:24:00,Ariyah,5139,22,4426844,CKB -Richard,Ariyah,2022-03-07 14:46:00,2022-03-07 14:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 14:55:00,2022-03-07 15:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 15:06:00,2022-03-07 15:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 15:15:00,2022-03-07 15:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 15:26:00,2022-03-07 15:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 15:35:00,2022-03-07 15:44:00,Ariyah,5139,22,4426844,CKB -Richard,Ariyah,2022-03-07 16:06:00,2022-03-07 16:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 16:15:00,2022-03-07 16:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 16:26:00,2022-03-07 16:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 16:35:00,2022-03-07 16:44:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 16:46:00,2022-03-07 16:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 16:55:00,2022-03-07 17:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 17:06:00,2022-03-07 17:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 17:15:00,2022-03-07 17:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 17:26:00,2022-03-07 17:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 17:35:00,2022-03-07 17:44:00,Ariyah,5139,22,4426844,CKB -Richard,Ariyah,2022-03-07 18:06:00,2022-03-07 18:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 18:15:00,2022-03-07 18:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 18:26:00,2022-03-07 18:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 18:35:00,2022-03-07 18:44:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 18:46:00,2022-03-07 18:55:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 18:55:00,2022-03-07 19:04:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 19:06:00,2022-03-07 19:15:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 19:15:00,2022-03-07 19:24:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 19:26:00,2022-03-07 19:35:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 19:35:00,2022-03-07 19:44:00,Ariyah,5139,21,4426844,CKB -Richard,Ariyah,2022-03-07 20:05:00,2022-03-07 20:14:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 20:14:00,2022-03-07 20:23:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 20:25:00,2022-03-07 20:34:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 20:34:00,2022-03-07 20:43:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 20:45:00,2022-03-07 20:54:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 20:54:00,2022-03-07 21:03:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 21:05:00,2022-03-07 21:14:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 21:14:00,2022-03-07 21:23:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 21:25:00,2022-03-07 21:34:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 21:34:00,2022-03-07 21:43:00,Ariyah,5139,22,4426844,CKB -Richard,Ariyah,2022-03-07 22:05:00,2022-03-07 22:14:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 22:14:00,2022-03-07 22:23:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 22:25:00,2022-03-07 22:34:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 22:34:00,2022-03-07 22:43:00,Ariyah,5139,2,4426844,CKB -Richard,Ariyah,2022-03-07 22:45:00,2022-03-07 22:54:00,Jaden,4781,0,4426844,CKB -Richard,Jaden,2022-03-07 22:54:00,2022-03-07 23:03:00,Ariyah,5139,0,4426844,CKB -Richard,Ariyah,2022-03-07 23:03:00,2022-03-07 23:03:00,Beckham,0.06,0,4426844,CKB -Ezekiel,Beckham,2022-03-08 00:06:00,2022-03-08 00:06:00,Erik,0.06,0,4708594,CKB -Ezekiel,Erik,2022-03-08 00:06:00,2022-03-08 00:27:00,Memphis,7827,0,4708594,CKB -Jake,Memphis,2022-03-08 00:27:00,2022-03-08 00:48:00,Kayleigh,11079,0,4708594,CKB -Jake,Kayleigh,2022-03-08 00:48:00,2022-03-08 01:25:00,Kamila,20641,8,4708594,CKB -Jake,Kamila,2022-03-08 01:33:00,2022-03-08 02:16:00,Kayleigh,20579,1,4708594,CKB -Jake,Kayleigh,2022-03-08 02:17:00,2022-03-08 02:55:00,Kamila,20641,8,4708594,CKB -Jake,Kamila,2022-03-08 03:03:00,2022-03-08 03:46:00,Kayleigh,20579,1,4708594,CKB -Jake,Kayleigh,2022-03-08 03:47:00,2022-03-08 04:25:00,Kamila,20641,0,4708594,CKB -Jake,Kamila,2022-03-08 04:25:00,2022-03-08 04:25:00,Beckham,0.06,0,4708594,CKB -Astrid,King,2022-03-07 05:15:00,2022-03-07 06:01:00,Brayden,17.9,0,4317624,VDL -Astrid,Brayden,2022-03-07 06:01:00,2022-03-07 06:15:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 06:23:00,2022-03-07 06:37:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 06:41:00,2022-03-07 06:55:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 07:03:00,2022-03-07 07:17:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 07:21:00,2022-03-07 07:35:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 07:43:00,2022-03-07 07:57:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 08:01:00,2022-03-07 08:15:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 08:23:00,2022-03-07 08:37:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 08:41:00,2022-03-07 08:55:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 09:03:00,2022-03-07 09:17:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 09:21:00,2022-03-07 09:35:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 09:43:00,2022-03-07 09:57:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 10:01:00,2022-03-07 10:15:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 10:23:00,2022-03-07 10:37:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 10:41:00,2022-03-07 10:55:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 11:03:00,2022-03-07 11:17:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 11:21:00,2022-03-07 11:35:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 11:43:00,2022-03-07 11:57:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 12:01:00,2022-03-07 12:15:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 12:23:00,2022-03-07 12:37:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 12:41:00,2022-03-07 12:55:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 13:03:00,2022-03-07 13:17:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 13:21:00,2022-03-07 13:35:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 13:43:00,2022-03-07 13:57:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 14:01:00,2022-03-07 14:15:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 14:23:00,2022-03-07 14:37:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 14:41:00,2022-03-07 14:55:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 15:03:00,2022-03-07 15:17:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 15:21:00,2022-03-07 15:35:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 15:43:00,2022-03-07 15:57:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 16:01:00,2022-03-07 16:15:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 16:23:00,2022-03-07 16:37:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 16:41:00,2022-03-07 16:55:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 17:03:00,2022-03-07 17:17:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 17:21:00,2022-03-07 17:35:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 17:43:00,2022-03-07 17:57:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 18:01:00,2022-03-07 18:15:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 18:23:00,2022-03-07 18:37:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 18:41:00,2022-03-07 18:55:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 19:03:00,2022-03-07 19:17:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 19:21:00,2022-03-07 19:35:00,Brayden,4637,8,4317624,VDL -Astrid,Brayden,2022-03-07 19:43:00,2022-03-07 19:57:00,Brayden,4637,4,4317624,VDL -Astrid,Brayden,2022-03-07 20:01:00,2022-03-07 20:14:00,Brayden,4637,9,4317624,VDL -Astrid,Brayden,2022-03-07 20:23:00,2022-03-07 20:36:00,Brayden,4637,0,4317624,VDL -Astrid,Brayden,2022-03-07 20:36:00,2022-03-07 21:15:00,King,19.8,0,4317624,VDL -Amy,Beckham,2022-03-07 04:56:00,2022-03-07 04:56:00,Izabella,0.06,18,4425667,CKB -Amy,Izabella,2022-03-07 05:14:00,2022-03-07 05:20:00,Tristan,3.29,0,4425667,CKB -Amy,Tristan,2022-03-07 05:20:00,2022-03-07 05:24:00,Izabella,2954,20,4425667,CKB -Amy,Izabella,2022-03-07 05:44:00,2022-03-07 05:50:00,Tristan,3.29,0,4425667,CKB -Amy,Tristan,2022-03-07 05:50:00,2022-03-07 05:54:00,Izabella,2954,5,4425667,CKB -Amy,Izabella,2022-03-07 05:59:00,2022-03-07 06:06:00,Tristan,3.29,2,4425667,CKB -Amy,Tristan,2022-03-07 06:08:00,2022-03-07 06:13:00,Izabella,2954,19,4425667,CKB -Amy,Izabella,2022-03-07 06:32:00,2022-03-07 06:39:00,Tristan,3.29,1,4425667,CKB -Amy,Tristan,2022-03-07 06:40:00,2022-03-07 06:45:00,Izabella,2954,7,4425667,CKB -Amy,Izabella,2022-03-07 06:52:00,2022-03-07 06:59:00,Tristan,3.29,1,4425667,CKB -Amy,Tristan,2022-03-07 07:00:00,2022-03-07 07:05:00,Izabella,2954,7,4425667,CKB -Amy,Izabella,2022-03-07 07:12:00,2022-03-07 07:19:00,Tristan,3.29,1,4425667,CKB -Amy,Tristan,2022-03-07 07:20:00,2022-03-07 07:25:00,Izabella,2954,7,4425667,CKB -Amy,Izabella,2022-03-07 07:32:00,2022-03-07 07:39:00,Tristan,3.29,1,4425667,CKB -Amy,Tristan,2022-03-07 07:40:00,2022-03-07 07:45:00,Izabella,2954,295,4425667,CKB -Amy,Izabella,2022-03-07 12:40:00,2022-03-07 12:47:00,Tristan,3.29,2,4425667,CKB -Amy,Tristan,2022-03-07 12:49:00,2022-03-07 12:54:00,Izabella,2954,46,4425667,CKB -Amy,Izabella,2022-03-07 13:40:00,2022-03-07 13:47:00,Tristan,3.29,2,4425667,CKB -Amy,Tristan,2022-03-07 13:49:00,2022-03-07 13:54:00,Izabella,2954,434,4425667,CKB -Amy,Izabella,2022-03-07 21:08:00,2022-03-07 21:08:00,Beckham,0.06,0,4425667,CKB -Matilda,Beckham,2022-03-07 07:20:00,2022-03-07 07:20:00,Izaiah,0.06,0,4448149,CKB -Matilda,Izaiah,2022-03-07 07:20:00,2022-03-07 07:50:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 08:00:00,2022-03-07 08:30:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 08:40:00,2022-03-07 09:10:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 09:20:00,2022-03-07 09:50:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 10:00:00,2022-03-07 10:30:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 10:40:00,2022-03-07 11:10:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 11:20:00,2022-03-07 11:50:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 12:00:00,2022-03-07 12:30:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 12:40:00,2022-03-07 13:10:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 13:20:00,2022-03-07 13:50:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 14:00:00,2022-03-07 14:30:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 14:40:00,2022-03-07 15:10:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 15:20:00,2022-03-07 15:50:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 16:00:00,2022-03-07 16:30:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 16:40:00,2022-03-07 17:10:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 17:20:00,2022-03-07 17:50:00,Izaiah,9266,10,4448149,CKB -Matilda,Izaiah,2022-03-07 18:00:00,2022-03-07 18:30:00,Izaiah,9266,0,4448149,CKB -Matilda,Izaiah,2022-03-07 18:30:00,2022-03-07 18:30:00,Beckham,0.06,0,4448149,CKB -Hailey,Beckham,2022-03-07 07:10:00,2022-03-07 07:10:00,Kaylani,0.06,0,4733894,CKB -Hailey,Kaylani,2022-03-07 07:10:00,2022-03-07 07:18:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 07:28:00,2022-03-07 07:40:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 07:40:00,2022-03-07 07:48:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 07:58:00,2022-03-07 08:10:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 08:10:00,2022-03-07 08:18:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 08:28:00,2022-03-07 08:40:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 08:40:00,2022-03-07 08:48:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 08:58:00,2022-03-07 09:10:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 09:10:00,2022-03-07 09:18:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 09:28:00,2022-03-07 09:40:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 09:40:00,2022-03-07 09:48:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 09:58:00,2022-03-07 10:10:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 10:10:00,2022-03-07 10:18:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 10:28:00,2022-03-07 10:40:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 10:40:00,2022-03-07 10:48:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 10:58:00,2022-03-07 11:10:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 11:10:00,2022-03-07 11:18:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 11:28:00,2022-03-07 11:40:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 11:40:00,2022-03-07 11:48:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 11:58:00,2022-03-07 12:10:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 12:10:00,2022-03-07 12:18:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 12:28:00,2022-03-07 12:40:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 12:40:00,2022-03-07 12:48:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 12:58:00,2022-03-07 13:10:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 13:10:00,2022-03-07 13:18:00,Cecilia,2169,10,4733894,CKB -Hailey,Cecilia,2022-03-07 13:28:00,2022-03-07 13:40:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 13:40:00,2022-03-07 13:48:00,Cecilia,2169,8,4733894,CKB -Hailey,Cecilia,2022-03-07 13:56:00,2022-03-07 14:10:00,Kaylani,2952,0,4733894,CKB -Hailey,Kaylani,2022-03-07 14:10:00,2022-03-07 14:19:00,Cecilia,2169,14,4733894,CKB -Hailey,Cecilia,2022-03-07 14:33:00,2022-03-07 14:47:00,Kaylani,2952,3,4733894,CKB -Hailey,Kaylani,2022-03-07 14:50:00,2022-03-07 14:59:00,Cecilia,2169,14,4733894,CKB -Hailey,Cecilia,2022-03-07 15:13:00,2022-03-07 15:27:00,Kaylani,2952,3,4733894,CKB -Hailey,Kaylani,2022-03-07 15:30:00,2022-03-07 15:39:00,Cecilia,2169,14,4733894,CKB -Hailey,Cecilia,2022-03-07 15:53:00,2022-03-07 16:07:00,Kaylani,2952,3,4733894,CKB -Hailey,Kaylani,2022-03-07 16:10:00,2022-03-07 16:19:00,Cecilia,2169,14,4733894,CKB -Hailey,Cecilia,2022-03-07 16:33:00,2022-03-07 16:47:00,Kaylani,2952,3,4733894,CKB -Hailey,Kaylani,2022-03-07 16:50:00,2022-03-07 16:59:00,Cecilia,2169,14,4733894,CKB -Hailey,Cecilia,2022-03-07 17:13:00,2022-03-07 17:27:00,Kaylani,2952,3,4733894,CKB -Hailey,Kaylani,2022-03-07 17:30:00,2022-03-07 17:39:00,Cecilia,2169,13,4733894,CKB -Hailey,Cecilia,2022-03-07 17:52:00,2022-03-07 18:05:00,Kaylani,2952,5,4733894,CKB -Hailey,Kaylani,2022-03-07 18:10:00,2022-03-07 18:18:00,Cecilia,2169,0,4733894,CKB -Hailey,Cecilia,2022-03-07 18:18:00,2022-03-07 18:18:00,Beckham,0.06,0,4733894,CKB -Hailey,Beckham,2022-03-07 14:13:00,2022-03-07 14:13:00,Cecilia,0.06,0,4734199,CKB -Hailey,Cecilia,2022-03-07 14:13:00,2022-03-07 14:27:00,Kaylani,2952,3,4734199,CKB -Hailey,Kaylani,2022-03-07 14:30:00,2022-03-07 14:39:00,Cecilia,2169,14,4734199,CKB -Hailey,Cecilia,2022-03-07 14:53:00,2022-03-07 15:07:00,Kaylani,2952,3,4734199,CKB -Hailey,Kaylani,2022-03-07 15:10:00,2022-03-07 15:19:00,Cecilia,2169,14,4734199,CKB -Hailey,Cecilia,2022-03-07 15:33:00,2022-03-07 15:47:00,Kaylani,2952,3,4734199,CKB -Hailey,Kaylani,2022-03-07 15:50:00,2022-03-07 15:59:00,Cecilia,2169,14,4734199,CKB -Hailey,Cecilia,2022-03-07 16:13:00,2022-03-07 16:27:00,Kaylani,2952,3,4734199,CKB -Hailey,Kaylani,2022-03-07 16:30:00,2022-03-07 16:39:00,Cecilia,2169,14,4734199,CKB -Hailey,Cecilia,2022-03-07 16:53:00,2022-03-07 17:07:00,Kaylani,2952,3,4734199,CKB -Hailey,Kaylani,2022-03-07 17:10:00,2022-03-07 17:19:00,Cecilia,2169,14,4734199,CKB -Hailey,Cecilia,2022-03-07 17:33:00,2022-03-07 17:47:00,Kaylani,2952,3,4734199,CKB -Hailey,Kaylani,2022-03-07 17:50:00,2022-03-07 17:59:00,Cecilia,2169,14,4734199,CKB -Hailey,Cecilia,2022-03-07 18:13:00,2022-03-07 18:25:00,Kaylani,2952,0,4734199,CKB -Hailey,Kaylani,2022-03-07 18:25:00,2022-03-07 18:25:00,Beckham,0.06,0,4734199,CKB -Matthias,Beckham,2022-03-08 00:23:00,2022-03-08 00:23:00,Addilyn,0.06,0,4318156,CKB -Matthias,Addilyn,2022-03-08 00:23:00,2022-03-08 00:30:00,Ari,2577,9,4318156,CKB -Ruby,Ari,2022-03-08 00:39:00,2022-03-08 00:54:00,Kobe,5937,9,4318156,CKB -Ruby,Kobe,2022-03-08 01:03:00,2022-03-08 01:17:00,Ari,6.19,0,4318156,CKB -Matthias,Ari,2022-03-08 01:17:00,2022-03-08 01:23:00,Addilyn,2555,0,4318156,CKB -Matthias,Addilyn,2022-03-08 01:23:00,2022-03-08 01:30:00,Ari,2577,9,4318156,CKB -Ruby,Ari,2022-03-08 01:39:00,2022-03-08 01:54:00,Kobe,5937,9,4318156,CKB -Ruby,Kobe,2022-03-08 02:03:00,2022-03-08 02:17:00,Ari,6.19,0,4318156,CKB -Matthias,Ari,2022-03-08 02:17:00,2022-03-08 02:23:00,Addilyn,2555,0,4318156,CKB -Matthias,Addilyn,2022-03-08 02:23:00,2022-03-08 02:30:00,Ari,2577,9,4318156,CKB -Ruby,Ari,2022-03-08 02:39:00,2022-03-08 02:54:00,Kobe,5937,9,4318156,CKB -Ruby,Kobe,2022-03-08 03:03:00,2022-03-08 03:17:00,Ari,6.19,0,4318156,CKB -Matthias,Ari,2022-03-08 03:17:00,2022-03-08 03:23:00,Addilyn,2555,0,4318156,CKB -Matthias,Addilyn,2022-03-08 03:23:00,2022-03-08 03:30:00,Ari,2577,9,4318156,CKB -Ruby,Ari,2022-03-08 03:39:00,2022-03-08 03:54:00,Kobe,5937,9,4318156,CKB -Ruby,Kobe,2022-03-08 04:03:00,2022-03-08 04:17:00,Ari,6.19,0,4318156,CKB -Matthias,Ari,2022-03-08 04:17:00,2022-03-08 04:23:00,Addilyn,2555,0,4318156,CKB -Matthias,Addilyn,2022-03-08 04:23:00,2022-03-08 04:23:00,Beckham,0.06,0,4318156,CKB -Ruby,Beckham,2022-03-08 00:33:00,2022-03-08 00:33:00,Kobe,0.06,0,4318176,CKB -Ruby,Kobe,2022-03-08 00:33:00,2022-03-08 00:47:00,Ari,6.19,0,4318176,CKB -Matthias,Ari,2022-03-08 00:47:00,2022-03-08 00:53:00,Addilyn,2555,0,4318176,CKB -Matthias,Addilyn,2022-03-08 00:53:00,2022-03-08 01:00:00,Ari,2577,9,4318176,CKB -Ruby,Ari,2022-03-08 01:09:00,2022-03-08 01:24:00,Kobe,5937,9,4318176,CKB -Ruby,Kobe,2022-03-08 01:33:00,2022-03-08 01:47:00,Ari,6.19,0,4318176,CKB -Matthias,Ari,2022-03-08 01:47:00,2022-03-08 01:53:00,Addilyn,2555,0,4318176,CKB -Matthias,Addilyn,2022-03-08 01:53:00,2022-03-08 02:00:00,Ari,2577,9,4318176,CKB -Ruby,Ari,2022-03-08 02:09:00,2022-03-08 02:24:00,Kobe,5937,9,4318176,CKB -Ruby,Kobe,2022-03-08 02:33:00,2022-03-08 02:47:00,Ari,6.19,0,4318176,CKB -Matthias,Ari,2022-03-08 02:47:00,2022-03-08 02:53:00,Addilyn,2555,0,4318176,CKB -Matthias,Addilyn,2022-03-08 02:53:00,2022-03-08 03:00:00,Ari,2577,9,4318176,CKB -Ruby,Ari,2022-03-08 03:09:00,2022-03-08 03:24:00,Kobe,5937,9,4318176,CKB -Ruby,Kobe,2022-03-08 03:33:00,2022-03-08 03:47:00,Ari,6.19,0,4318176,CKB -Matthias,Ari,2022-03-08 03:47:00,2022-03-08 03:53:00,Addilyn,2555,0,4318176,CKB -Matthias,Addilyn,2022-03-08 03:53:00,2022-03-08 04:00:00,Ari,2577,9,4318176,CKB -Ruby,Ari,2022-03-08 04:09:00,2022-03-08 04:24:00,Kobe,5937,0,4318176,CKB -Ruby,Kobe,2022-03-08 04:24:00,2022-03-08 04:24:00,Beckham,0.06,0,4318176,CKB -Rosie,Beckham,2022-03-08 00:57:00,2022-03-08 00:57:00,Lexi,0.06,0,4319351,CKB -Rosie,Lexi,2022-03-08 00:57:00,2022-03-08 01:06:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 01:06:00,2022-03-08 01:11:00,Lexi,2936,16,4319351,CKB -Rosie,Lexi,2022-03-08 01:27:00,2022-03-08 01:36:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 01:36:00,2022-03-08 01:41:00,Lexi,2936,16,4319351,CKB -Rosie,Lexi,2022-03-08 01:57:00,2022-03-08 02:06:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 02:06:00,2022-03-08 02:11:00,Lexi,2936,16,4319351,CKB -Rosie,Lexi,2022-03-08 02:27:00,2022-03-08 02:36:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 02:36:00,2022-03-08 02:41:00,Lexi,2936,16,4319351,CKB -Rosie,Lexi,2022-03-08 02:57:00,2022-03-08 03:06:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 03:06:00,2022-03-08 03:11:00,Lexi,2936,16,4319351,CKB -Rosie,Lexi,2022-03-08 03:27:00,2022-03-08 03:36:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 03:36:00,2022-03-08 03:41:00,Lexi,2936,16,4319351,CKB -Rosie,Lexi,2022-03-08 03:57:00,2022-03-08 04:06:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 04:06:00,2022-03-08 04:11:00,Lexi,2936,16,4319351,CKB -Rosie,Lexi,2022-03-08 04:27:00,2022-03-08 04:36:00,Colton,4343,0,4319351,CKB -Rosie,Colton,2022-03-08 04:36:00,2022-03-08 04:36:00,Beckham,0.06,0,4319351,CKB -Daxton,Beckham,2022-03-08 00:29:00,2022-03-08 00:29:00,Harper,0.06,0,4751086,CKB -Daxton,Harper,2022-03-08 00:29:00,2022-03-08 00:41:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 00:47:00,2022-03-08 00:57:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 00:59:00,2022-03-08 01:11:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 01:17:00,2022-03-08 01:27:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 01:29:00,2022-03-08 01:41:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 01:47:00,2022-03-08 01:57:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 01:59:00,2022-03-08 02:11:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 02:17:00,2022-03-08 02:27:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 02:29:00,2022-03-08 02:41:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 02:47:00,2022-03-08 02:57:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 02:59:00,2022-03-08 03:11:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 03:17:00,2022-03-08 03:27:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 03:29:00,2022-03-08 03:41:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 03:47:00,2022-03-08 03:57:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 03:59:00,2022-03-08 04:11:00,Calvin,4481,6,4751086,CKB -Daxton,Calvin,2022-03-08 04:17:00,2022-03-08 04:27:00,Harper,4031,2,4751086,CKB -Daxton,Harper,2022-03-08 04:29:00,2022-03-08 04:41:00,Calvin,4481,0,4751086,CKB -Daxton,Calvin,2022-03-08 04:41:00,2022-03-08 04:41:00,Beckham,0.06,0,4751086,CKB -Andy,Beckham,2022-03-08 00:30:00,2022-03-08 00:30:00,Harper,0.06,0,4453544,CKB -Andy,Harper,2022-03-08 00:30:00,2022-03-08 00:44:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 00:44:00,2022-03-08 00:57:00,Harper,5302,3,4453544,CKB -Andy,Harper,2022-03-08 01:00:00,2022-03-08 01:14:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 01:14:00,2022-03-08 01:27:00,Harper,5302,3,4453544,CKB -Andy,Harper,2022-03-08 01:30:00,2022-03-08 01:44:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 01:44:00,2022-03-08 01:57:00,Harper,5302,3,4453544,CKB -Andy,Harper,2022-03-08 02:00:00,2022-03-08 02:14:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 02:14:00,2022-03-08 02:27:00,Harper,5302,3,4453544,CKB -Andy,Harper,2022-03-08 02:30:00,2022-03-08 02:44:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 02:44:00,2022-03-08 02:57:00,Harper,5302,3,4453544,CKB -Andy,Harper,2022-03-08 03:00:00,2022-03-08 03:14:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 03:14:00,2022-03-08 03:27:00,Harper,5302,3,4453544,CKB -Andy,Harper,2022-03-08 03:30:00,2022-03-08 03:44:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 03:44:00,2022-03-08 03:57:00,Harper,5302,3,4453544,CKB -Andy,Harper,2022-03-08 04:00:00,2022-03-08 04:14:00,Elise,4801,0,4453544,CKB -Andy,Elise,2022-03-08 04:14:00,2022-03-08 04:27:00,Harper,5302,0,4453544,CKB -Andy,Harper,2022-03-08 04:27:00,2022-03-08 04:27:00,Beckham,0.06,0,4453544,CKB -Alex,Beckham,2022-03-08 00:43:00,2022-03-08 00:43:00,Chase,0.06,0,4374466,CKB -Alex,Chase,2022-03-08 00:43:00,2022-03-08 01:33:00,Chase,20434,10,4374466,CKB -Alex,Chase,2022-03-08 01:43:00,2022-03-08 02:33:00,Chase,20434,10,4374466,CKB -Alex,Chase,2022-03-08 02:43:00,2022-03-08 03:33:00,Chase,20434,10,4374466,CKB -Alex,Chase,2022-03-08 03:43:00,2022-03-08 04:33:00,Chase,20434,0,4374466,CKB -Alex,Chase,2022-03-08 04:33:00,2022-03-08 04:33:00,Beckham,0.06,0,4374466,CKB -Alex,Beckham,2022-03-08 00:13:00,2022-03-08 00:13:00,Chase,0.06,0,4374471,CKB -Alex,Chase,2022-03-08 00:13:00,2022-03-08 01:03:00,Chase,20434,10,4374471,CKB -Alex,Chase,2022-03-08 01:13:00,2022-03-08 02:03:00,Chase,20434,10,4374471,CKB -Alex,Chase,2022-03-08 02:13:00,2022-03-08 03:03:00,Chase,20434,10,4374471,CKB -Alex,Chase,2022-03-08 03:13:00,2022-03-08 04:03:00,Chase,20434,0,4374471,CKB -Alex,Chase,2022-03-08 04:03:00,2022-03-08 04:03:00,Beckham,0.06,0,4374471,CKB -Hazel,Beckham,2022-03-08 00:24:00,2022-03-08 00:24:00,Celine,0.06,0,4456447,CKB -Hazel,Celine,2022-03-08 00:24:00,2022-03-08 00:48:00,Kali,11.86,4,4456447,CKB -Hazel,Kali,2022-03-08 00:52:00,2022-03-08 01:14:00,Celine,11139,10,4456447,CKB -Hazel,Celine,2022-03-08 01:24:00,2022-03-08 01:48:00,Kali,11.86,4,4456447,CKB -Hazel,Kali,2022-03-08 01:52:00,2022-03-08 02:14:00,Celine,11139,10,4456447,CKB -Hazel,Celine,2022-03-08 02:24:00,2022-03-08 02:48:00,Kali,11.86,4,4456447,CKB -Hazel,Kali,2022-03-08 02:52:00,2022-03-08 03:14:00,Celine,11139,10,4456447,CKB -Hazel,Celine,2022-03-08 03:24:00,2022-03-08 03:48:00,Kali,11.86,4,4456447,CKB -Hazel,Kali,2022-03-08 03:52:00,2022-03-08 04:14:00,Celine,11139,0,4456447,CKB -Hazel,Celine,2022-03-08 04:14:00,2022-03-08 04:14:00,Beckham,0.06,0,4456447,CKB -Hazel,Beckham,2022-03-08 00:22:00,2022-03-08 00:22:00,Kali,0.06,0,4456455,CKB -Hazel,Kali,2022-03-08 00:22:00,2022-03-08 00:44:00,Celine,11139,10,4456455,CKB -Hazel,Celine,2022-03-08 00:54:00,2022-03-08 01:18:00,Kali,11.86,4,4456455,CKB -Hazel,Kali,2022-03-08 01:22:00,2022-03-08 01:44:00,Celine,11139,10,4456455,CKB -Hazel,Celine,2022-03-08 01:54:00,2022-03-08 02:18:00,Kali,11.86,4,4456455,CKB -Hazel,Kali,2022-03-08 02:22:00,2022-03-08 02:44:00,Celine,11139,10,4456455,CKB -Hazel,Celine,2022-03-08 02:54:00,2022-03-08 03:18:00,Kali,11.86,4,4456455,CKB -Hazel,Kali,2022-03-08 03:22:00,2022-03-08 03:44:00,Celine,11139,10,4456455,CKB -Hazel,Celine,2022-03-08 03:54:00,2022-03-08 04:18:00,Kali,11.86,4,4456455,CKB -Hazel,Kali,2022-03-08 04:22:00,2022-03-08 04:44:00,Celine,11139,0,4456455,CKB -Hazel,Celine,2022-03-08 04:44:00,2022-03-08 04:44:00,Beckham,0.06,0,4456455,CKB -Emilio,Beckham,2022-03-08 00:32:00,2022-03-08 00:32:00,Rose,0.06,0,4747649,CKB -Emilio,Rose,2022-03-08 00:32:00,2022-03-08 00:44:00,Brooklynn,4212,3,4747649,CKB -Emilio,Brooklynn,2022-03-08 00:47:00,2022-03-08 01:16:00,Francis,13048,0,4747649,CKB -Emilio,Francis,2022-03-08 01:16:00,2022-03-08 01:42:00,Brooklynn,12869,5,4747649,CKB -Emilio,Brooklynn,2022-03-08 01:47:00,2022-03-08 02:16:00,Francis,13048,0,4747649,CKB -Emilio,Francis,2022-03-08 02:16:00,2022-03-08 02:42:00,Brooklynn,12869,5,4747649,CKB -Emilio,Brooklynn,2022-03-08 02:47:00,2022-03-08 03:16:00,Francis,13048,0,4747649,CKB -Emilio,Francis,2022-03-08 03:16:00,2022-03-08 03:42:00,Brooklynn,12869,5,4747649,CKB -Emilio,Brooklynn,2022-03-08 03:47:00,2022-03-08 04:16:00,Francis,13048,0,4747649,CKB -Emilio,Francis,2022-03-08 04:16:00,2022-03-08 04:34:00,Gia,9538,0,4747649,CKB -Emilio,Gia,2022-03-08 04:34:00,2022-03-08 04:34:00,Beckham,0.06,0,4747649,CKB -Emilio,Beckham,2022-03-08 00:17:00,2022-03-08 00:17:00,Brooklynn,0.06,0,4747659,CKB -Emilio,Brooklynn,2022-03-08 00:17:00,2022-03-08 00:46:00,Francis,13048,0,4747659,CKB -Emilio,Francis,2022-03-08 00:46:00,2022-03-08 01:12:00,Brooklynn,12869,5,4747659,CKB -Emilio,Brooklynn,2022-03-08 01:17:00,2022-03-08 01:46:00,Francis,13048,0,4747659,CKB -Emilio,Francis,2022-03-08 01:46:00,2022-03-08 02:12:00,Brooklynn,12869,5,4747659,CKB -Emilio,Brooklynn,2022-03-08 02:17:00,2022-03-08 02:46:00,Francis,13048,0,4747659,CKB -Emilio,Francis,2022-03-08 02:46:00,2022-03-08 03:12:00,Brooklynn,12869,5,4747659,CKB -Emilio,Brooklynn,2022-03-08 03:17:00,2022-03-08 03:46:00,Francis,13048,0,4747659,CKB -Emilio,Francis,2022-03-08 03:46:00,2022-03-08 04:12:00,Brooklynn,12869,5,4747659,CKB -Emilio,Brooklynn,2022-03-08 04:17:00,2022-03-08 04:28:00,Rose,4316,0,4747659,CKB -Emilio,Rose,2022-03-08 04:28:00,2022-03-08 04:28:00,Beckham,0.06,0,4747659,CKB -Ryder,Beckham,2022-03-08 00:49:00,2022-03-08 00:49:00,Kehlani,0.06,0,4434340,CKB -Ryder,Kehlani,2022-03-08 00:49:00,2022-03-08 01:04:00,Ariyah,10229,0,4434340,CKB -Ryder,Ariyah,2022-03-08 01:04:00,2022-03-08 01:19:00,Kehlani,11801,0,4434340,CKB -Ryder,Kehlani,2022-03-08 01:19:00,2022-03-08 01:34:00,Ariyah,10229,0,4434340,CKB -Ryder,Ariyah,2022-03-08 01:34:00,2022-03-08 01:49:00,Kehlani,11801,0,4434340,CKB -Ryder,Kehlani,2022-03-08 01:49:00,2022-03-08 02:04:00,Ariyah,10229,0,4434340,CKB -Ryder,Ariyah,2022-03-08 02:04:00,2022-03-08 02:19:00,Kehlani,11801,0,4434340,CKB -Ryder,Kehlani,2022-03-08 02:19:00,2022-03-08 02:34:00,Ariyah,10229,0,4434340,CKB -Ryder,Ariyah,2022-03-08 02:34:00,2022-03-08 02:49:00,Kehlani,11801,0,4434340,CKB -Ryder,Kehlani,2022-03-08 02:49:00,2022-03-08 03:04:00,Ariyah,10229,0,4434340,CKB -Ryder,Ariyah,2022-03-08 03:04:00,2022-03-08 03:19:00,Kehlani,11801,0,4434340,CKB -Ryder,Kehlani,2022-03-08 03:19:00,2022-03-08 03:34:00,Ariyah,10229,0,4434340,CKB -Ryder,Ariyah,2022-03-08 03:34:00,2022-03-08 03:49:00,Kehlani,11801,0,4434340,CKB -Ryder,Kehlani,2022-03-08 03:49:00,2022-03-08 04:04:00,Ariyah,10229,0,4434340,CKB -Ryder,Ariyah,2022-03-08 04:04:00,2022-03-08 04:19:00,Kehlani,11801,23,4434340,CKB -Kian,Kehlani,2022-03-08 04:42:00,2022-03-08 05:04:00,Finley,6.81,0,4434340,CKB -Kian,Finley,2022-03-08 05:04:00,2022-03-08 05:04:00,Beckham,0.06,0,4434340,CKB -Jake,Beckham,2022-03-08 00:32:00,2022-03-08 00:32:00,Rose,0.06,0,4434896,CKB -Jake,Rose,2022-03-08 00:32:00,2022-03-08 00:57:00,Kamila,11545,6,4434896,CKB -Jake,Kamila,2022-03-08 01:03:00,2022-03-08 01:46:00,Kayleigh,20579,1,4434896,CKB -Jake,Kayleigh,2022-03-08 01:47:00,2022-03-08 02:25:00,Kamila,20641,8,4434896,CKB -Jake,Kamila,2022-03-08 02:33:00,2022-03-08 03:16:00,Kayleigh,20579,1,4434896,CKB -Jake,Kayleigh,2022-03-08 03:17:00,2022-03-08 03:55:00,Kamila,20641,8,4434896,CKB -Jake,Kamila,2022-03-08 04:03:00,2022-03-08 04:28:00,Rose,11499,0,4434896,CKB -Jake,Rose,2022-03-08 04:28:00,2022-03-08 04:28:00,Beckham,0.06,0,4434896,CKB -Jake,Beckham,2022-03-08 00:33:00,2022-03-08 00:33:00,Kamila,0.06,0,4434901,CKB -Jake,Kamila,2022-03-08 00:33:00,2022-03-08 01:16:00,Kayleigh,20579,1,4434901,CKB -Jake,Kayleigh,2022-03-08 01:17:00,2022-03-08 01:55:00,Kamila,20641,8,4434901,CKB -Jake,Kamila,2022-03-08 02:03:00,2022-03-08 02:46:00,Kayleigh,20579,1,4434901,CKB -Jake,Kayleigh,2022-03-08 02:47:00,2022-03-08 03:25:00,Kamila,20641,8,4434901,CKB -Jake,Kamila,2022-03-08 03:33:00,2022-03-08 04:16:00,Kayleigh,20579,1,4434901,CKB -Jake,Kayleigh,2022-03-08 04:17:00,2022-03-08 04:51:00,Willa,18752,0,4434901,CKB -Jake,Willa,2022-03-08 04:51:00,2022-03-08 04:51:00,Beckham,0.06,0,4434901,CKB -Aziel,Beckham,2022-03-08 00:34:00,2022-03-08 00:34:00,Miles,0.06,0,4619765,CKB -Aziel,Miles,2022-03-08 00:34:00,2022-03-08 01:00:00,Delilah,9016,0,4619765,CKB -Aziel,Delilah,2022-03-08 01:00:00,2022-03-08 01:27:00,Miles,10083,7,4619765,CKB -Aziel,Miles,2022-03-08 01:34:00,2022-03-08 02:00:00,Delilah,9016,0,4619765,CKB -Aziel,Delilah,2022-03-08 02:00:00,2022-03-08 02:27:00,Miles,10083,7,4619765,CKB -Aziel,Miles,2022-03-08 02:34:00,2022-03-08 03:00:00,Delilah,9016,0,4619765,CKB -Aziel,Delilah,2022-03-08 03:00:00,2022-03-08 03:27:00,Miles,10083,7,4619765,CKB -Aziel,Miles,2022-03-08 03:34:00,2022-03-08 04:00:00,Delilah,9016,0,4619765,CKB -Aziel,Delilah,2022-03-08 04:00:00,2022-03-08 04:27:00,Miles,10083,0,4619765,CKB -Aziel,Miles,2022-03-08 04:27:00,2022-03-08 04:27:00,Beckham,0.06,0,4619765,CKB -Aziel,Beckham,2022-03-08 00:30:00,2022-03-08 00:30:00,Delilah,0.06,0,4619990,CKB -Aziel,Delilah,2022-03-08 00:30:00,2022-03-08 00:57:00,Miles,10083,7,4619990,CKB -Aziel,Miles,2022-03-08 01:04:00,2022-03-08 01:30:00,Delilah,9016,0,4619990,CKB -Aziel,Delilah,2022-03-08 01:30:00,2022-03-08 01:57:00,Miles,10083,7,4619990,CKB -Aziel,Miles,2022-03-08 02:04:00,2022-03-08 02:30:00,Delilah,9016,0,4619990,CKB -Aziel,Delilah,2022-03-08 02:30:00,2022-03-08 02:57:00,Miles,10083,7,4619990,CKB -Aziel,Miles,2022-03-08 03:04:00,2022-03-08 03:30:00,Delilah,9016,0,4619990,CKB -Aziel,Delilah,2022-03-08 03:30:00,2022-03-08 03:57:00,Miles,10083,7,4619990,CKB -Aziel,Miles,2022-03-08 04:04:00,2022-03-08 04:30:00,Delilah,9016,0,4619990,CKB -Aziel,Delilah,2022-03-08 04:30:00,2022-03-08 04:57:00,Miles,10083,0,4619990,CKB -Aziel,Miles,2022-03-08 04:57:00,2022-03-08 04:57:00,Beckham,0.06,0,4619990,CKB -Dalton,Beckham,2022-03-08 00:31:00,2022-03-08 00:31:00,Kamila,0.06,0,4374743,CKB -Dalton,Kamila,2022-03-08 00:31:00,2022-03-08 00:44:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 00:44:00,2022-03-08 00:56:00,Kamila,5362,5,4374743,CKB -Dalton,Kamila,2022-03-08 01:01:00,2022-03-08 01:14:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 01:14:00,2022-03-08 01:26:00,Kamila,5362,5,4374743,CKB -Dalton,Kamila,2022-03-08 01:31:00,2022-03-08 01:44:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 01:44:00,2022-03-08 01:56:00,Kamila,5362,5,4374743,CKB -Dalton,Kamila,2022-03-08 02:01:00,2022-03-08 02:14:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 02:14:00,2022-03-08 02:26:00,Kamila,5362,5,4374743,CKB -Dalton,Kamila,2022-03-08 02:31:00,2022-03-08 02:44:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 02:44:00,2022-03-08 02:56:00,Kamila,5362,5,4374743,CKB -Dalton,Kamila,2022-03-08 03:01:00,2022-03-08 03:14:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 03:14:00,2022-03-08 03:26:00,Kamila,5362,5,4374743,CKB -Dalton,Kamila,2022-03-08 03:31:00,2022-03-08 03:44:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 03:44:00,2022-03-08 03:56:00,Kamila,5362,5,4374743,CKB -Dalton,Kamila,2022-03-08 04:01:00,2022-03-08 04:14:00,Veronica,4872,0,4374743,CKB -Dalton,Veronica,2022-03-08 04:14:00,2022-03-08 04:26:00,Kamila,5362,0,4374743,CKB -Dalton,Kamila,2022-03-08 04:26:00,2022-03-08 04:26:00,Beckham,0.06,0,4374743,CKB -Jamison,Beckham,2022-03-08 00:31:00,2022-03-08 00:31:00,Kamila,0.06,0,4374865,CKB -Jamison,Kamila,2022-03-08 00:31:00,2022-03-08 00:45:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 00:47:00,2022-03-08 01:01:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 01:01:00,2022-03-08 01:15:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 01:17:00,2022-03-08 01:31:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 01:31:00,2022-03-08 01:45:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 01:47:00,2022-03-08 02:01:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 02:01:00,2022-03-08 02:15:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 02:17:00,2022-03-08 02:31:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 02:31:00,2022-03-08 02:45:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 02:47:00,2022-03-08 03:01:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 03:01:00,2022-03-08 03:15:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 03:17:00,2022-03-08 03:31:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 03:31:00,2022-03-08 03:45:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 03:47:00,2022-03-08 04:01:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 04:01:00,2022-03-08 04:15:00,Liana,5225,2,4374865,CKB -Jamison,Liana,2022-03-08 04:17:00,2022-03-08 04:31:00,Kamila,7617,0,4374865,CKB -Jamison,Kamila,2022-03-08 04:31:00,2022-03-08 04:31:00,Beckham,0.06,0,4374865,CKB -Keegan,Beckham,2022-03-08 00:43:00,2022-03-08 00:43:00,Charleigh,0.06,0,4375012,CKB -Keegan,Charleigh,2022-03-08 00:43:00,2022-03-08 00:53:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 00:53:00,2022-03-08 01:03:00,Charleigh,4408,10,4375012,CKB -Keegan,Charleigh,2022-03-08 01:13:00,2022-03-08 01:23:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 01:23:00,2022-03-08 01:33:00,Charleigh,4408,10,4375012,CKB -Keegan,Charleigh,2022-03-08 01:43:00,2022-03-08 01:53:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 01:53:00,2022-03-08 02:03:00,Charleigh,4408,10,4375012,CKB -Keegan,Charleigh,2022-03-08 02:13:00,2022-03-08 02:23:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 02:23:00,2022-03-08 02:33:00,Charleigh,4408,10,4375012,CKB -Keegan,Charleigh,2022-03-08 02:43:00,2022-03-08 02:53:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 02:53:00,2022-03-08 03:03:00,Charleigh,4408,10,4375012,CKB -Keegan,Charleigh,2022-03-08 03:13:00,2022-03-08 03:23:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 03:23:00,2022-03-08 03:33:00,Charleigh,4408,10,4375012,CKB -Keegan,Charleigh,2022-03-08 03:43:00,2022-03-08 03:53:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 03:53:00,2022-03-08 04:03:00,Charleigh,4408,10,4375012,CKB -Keegan,Charleigh,2022-03-08 04:13:00,2022-03-08 04:23:00,Eli,4507,0,4375012,CKB -Keegan,Eli,2022-03-08 04:23:00,2022-03-08 04:33:00,Charleigh,4408,0,4375012,CKB -Keegan,Charleigh,2022-03-08 04:33:00,2022-03-08 04:33:00,Beckham,0.06,0,4375012,CKB -Ryder,Beckham,2022-03-07 00:49:00,2022-03-07 00:49:00,Kehlani,0.06,0,4434215,CKB -Ryder,Kehlani,2022-03-07 00:49:00,2022-03-07 01:04:00,Ariyah,10229,0,4434215,CKB -Ryder,Ariyah,2022-03-07 01:04:00,2022-03-07 01:19:00,Kehlani,11801,0,4434215,CKB -Ryder,Kehlani,2022-03-07 01:19:00,2022-03-07 01:34:00,Ariyah,10229,0,4434215,CKB -Ryder,Ariyah,2022-03-07 01:34:00,2022-03-07 01:49:00,Kehlani,11801,0,4434215,CKB -Ryder,Kehlani,2022-03-07 01:49:00,2022-03-07 02:04:00,Ariyah,10229,0,4434215,CKB -Ryder,Ariyah,2022-03-07 02:04:00,2022-03-07 02:19:00,Kehlani,11801,0,4434215,CKB -Ryder,Kehlani,2022-03-07 02:19:00,2022-03-07 02:34:00,Ariyah,10229,0,4434215,CKB -Ryder,Ariyah,2022-03-07 02:34:00,2022-03-07 02:49:00,Kehlani,11801,0,4434215,CKB -Ryder,Kehlani,2022-03-07 02:49:00,2022-03-07 03:04:00,Ariyah,10229,0,4434215,CKB -Ryder,Ariyah,2022-03-07 03:04:00,2022-03-07 03:19:00,Kehlani,11801,0,4434215,CKB -Ryder,Kehlani,2022-03-07 03:19:00,2022-03-07 03:34:00,Ariyah,10229,0,4434215,CKB -Ryder,Ariyah,2022-03-07 03:34:00,2022-03-07 03:49:00,Kehlani,11801,0,4434215,CKB -Ryder,Kehlani,2022-03-07 03:49:00,2022-03-07 04:04:00,Ariyah,10229,0,4434215,CKB -Ryder,Ariyah,2022-03-07 04:04:00,2022-03-07 04:19:00,Kehlani,11801,23,4434215,CKB -Kian,Kehlani,2022-03-07 04:42:00,2022-03-07 05:04:00,Finley,6.81,0,4434215,CKB -Kian,Finley,2022-03-07 05:04:00,2022-03-07 05:04:00,Beckham,0.06,0,4434215,CKB -Matthias,Beckham,2022-03-07 00:23:00,2022-03-07 00:23:00,Addilyn,0.06,0,4318071,CKB -Matthias,Addilyn,2022-03-07 00:23:00,2022-03-07 00:30:00,Ari,2577,9,4318071,CKB -Ruby,Ari,2022-03-07 00:39:00,2022-03-07 00:54:00,Kobe,5937,9,4318071,CKB -Ruby,Kobe,2022-03-07 01:03:00,2022-03-07 01:17:00,Ari,6.19,0,4318071,CKB -Matthias,Ari,2022-03-07 01:17:00,2022-03-07 01:23:00,Addilyn,2555,0,4318071,CKB -Matthias,Addilyn,2022-03-07 01:23:00,2022-03-07 01:30:00,Ari,2577,9,4318071,CKB -Ruby,Ari,2022-03-07 01:39:00,2022-03-07 01:54:00,Kobe,5937,9,4318071,CKB -Ruby,Kobe,2022-03-07 02:03:00,2022-03-07 02:17:00,Ari,6.19,0,4318071,CKB -Matthias,Ari,2022-03-07 02:17:00,2022-03-07 02:23:00,Addilyn,2555,0,4318071,CKB -Matthias,Addilyn,2022-03-07 02:23:00,2022-03-07 02:30:00,Ari,2577,9,4318071,CKB -Ruby,Ari,2022-03-07 02:39:00,2022-03-07 02:54:00,Kobe,5937,9,4318071,CKB -Ruby,Kobe,2022-03-07 03:03:00,2022-03-07 03:17:00,Ari,6.19,0,4318071,CKB -Matthias,Ari,2022-03-07 03:17:00,2022-03-07 03:23:00,Addilyn,2555,0,4318071,CKB -Matthias,Addilyn,2022-03-07 03:23:00,2022-03-07 03:30:00,Ari,2577,9,4318071,CKB -Ruby,Ari,2022-03-07 03:39:00,2022-03-07 03:54:00,Kobe,5937,9,4318071,CKB -Ruby,Kobe,2022-03-07 04:03:00,2022-03-07 04:17:00,Ari,6.19,0,4318071,CKB -Matthias,Ari,2022-03-07 04:17:00,2022-03-07 04:23:00,Addilyn,2555,0,4318071,CKB -Matthias,Addilyn,2022-03-07 04:23:00,2022-03-07 04:23:00,Beckham,0.06,0,4318071,CKB -Ruby,Beckham,2022-03-07 00:33:00,2022-03-07 00:33:00,Kobe,0.06,0,4318083,CKB -Ruby,Kobe,2022-03-07 00:33:00,2022-03-07 00:47:00,Ari,6.19,0,4318083,CKB -Matthias,Ari,2022-03-07 00:47:00,2022-03-07 00:53:00,Addilyn,2555,0,4318083,CKB -Matthias,Addilyn,2022-03-07 00:53:00,2022-03-07 01:00:00,Ari,2577,9,4318083,CKB -Ruby,Ari,2022-03-07 01:09:00,2022-03-07 01:24:00,Kobe,5937,9,4318083,CKB -Ruby,Kobe,2022-03-07 01:33:00,2022-03-07 01:47:00,Ari,6.19,0,4318083,CKB -Matthias,Ari,2022-03-07 01:47:00,2022-03-07 01:53:00,Addilyn,2555,0,4318083,CKB -Matthias,Addilyn,2022-03-07 01:53:00,2022-03-07 02:00:00,Ari,2577,9,4318083,CKB -Ruby,Ari,2022-03-07 02:09:00,2022-03-07 02:24:00,Kobe,5937,9,4318083,CKB -Ruby,Kobe,2022-03-07 02:33:00,2022-03-07 02:47:00,Ari,6.19,0,4318083,CKB -Matthias,Ari,2022-03-07 02:47:00,2022-03-07 02:53:00,Addilyn,2555,0,4318083,CKB -Matthias,Addilyn,2022-03-07 02:53:00,2022-03-07 03:00:00,Ari,2577,9,4318083,CKB -Ruby,Ari,2022-03-07 03:09:00,2022-03-07 03:24:00,Kobe,5937,9,4318083,CKB -Ruby,Kobe,2022-03-07 03:33:00,2022-03-07 03:47:00,Ari,6.19,0,4318083,CKB -Matthias,Ari,2022-03-07 03:47:00,2022-03-07 03:53:00,Addilyn,2555,0,4318083,CKB -Matthias,Addilyn,2022-03-07 03:53:00,2022-03-07 04:00:00,Ari,2577,9,4318083,CKB -Ruby,Ari,2022-03-07 04:09:00,2022-03-07 04:24:00,Kobe,5937,0,4318083,CKB -Ruby,Kobe,2022-03-07 04:24:00,2022-03-07 04:24:00,Beckham,0.06,0,4318083,CKB -Rosie,Beckham,2022-03-07 00:57:00,2022-03-07 00:57:00,Lexi,0.06,0,4319428,CKB -Rosie,Lexi,2022-03-07 00:57:00,2022-03-07 01:06:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 01:06:00,2022-03-07 01:11:00,Lexi,2936,16,4319428,CKB -Rosie,Lexi,2022-03-07 01:27:00,2022-03-07 01:36:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 01:36:00,2022-03-07 01:41:00,Lexi,2936,16,4319428,CKB -Rosie,Lexi,2022-03-07 01:57:00,2022-03-07 02:06:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 02:06:00,2022-03-07 02:11:00,Lexi,2936,16,4319428,CKB -Rosie,Lexi,2022-03-07 02:27:00,2022-03-07 02:36:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 02:36:00,2022-03-07 02:41:00,Lexi,2936,16,4319428,CKB -Rosie,Lexi,2022-03-07 02:57:00,2022-03-07 03:06:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 03:06:00,2022-03-07 03:11:00,Lexi,2936,16,4319428,CKB -Rosie,Lexi,2022-03-07 03:27:00,2022-03-07 03:36:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 03:36:00,2022-03-07 03:41:00,Lexi,2936,16,4319428,CKB -Rosie,Lexi,2022-03-07 03:57:00,2022-03-07 04:06:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 04:06:00,2022-03-07 04:11:00,Lexi,2936,16,4319428,CKB -Rosie,Lexi,2022-03-07 04:27:00,2022-03-07 04:36:00,Colton,4343,0,4319428,CKB -Rosie,Colton,2022-03-07 04:36:00,2022-03-07 04:36:00,Beckham,0.06,0,4319428,CKB -Daxton,Beckham,2022-03-07 00:29:00,2022-03-07 00:29:00,Harper,0.06,0,4751093,CKB -Daxton,Harper,2022-03-07 00:29:00,2022-03-07 00:41:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 00:47:00,2022-03-07 00:57:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 00:59:00,2022-03-07 01:11:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 01:17:00,2022-03-07 01:27:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 01:29:00,2022-03-07 01:41:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 01:47:00,2022-03-07 01:57:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 01:59:00,2022-03-07 02:11:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 02:17:00,2022-03-07 02:27:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 02:29:00,2022-03-07 02:41:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 02:47:00,2022-03-07 02:57:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 02:59:00,2022-03-07 03:11:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 03:17:00,2022-03-07 03:27:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 03:29:00,2022-03-07 03:41:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 03:47:00,2022-03-07 03:57:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 03:59:00,2022-03-07 04:11:00,Calvin,4481,6,4751093,CKB -Daxton,Calvin,2022-03-07 04:17:00,2022-03-07 04:27:00,Harper,4031,2,4751093,CKB -Daxton,Harper,2022-03-07 04:29:00,2022-03-07 04:41:00,Calvin,4481,0,4751093,CKB -Daxton,Calvin,2022-03-07 04:41:00,2022-03-07 04:41:00,Beckham,0.06,0,4751093,CKB -Andy,Beckham,2022-03-07 00:30:00,2022-03-07 00:30:00,Harper,0.06,0,4454017,CKB -Andy,Harper,2022-03-07 00:30:00,2022-03-07 00:44:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 00:44:00,2022-03-07 00:57:00,Harper,5302,3,4454017,CKB -Andy,Harper,2022-03-07 01:00:00,2022-03-07 01:14:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 01:14:00,2022-03-07 01:27:00,Harper,5302,3,4454017,CKB -Andy,Harper,2022-03-07 01:30:00,2022-03-07 01:44:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 01:44:00,2022-03-07 01:57:00,Harper,5302,3,4454017,CKB -Andy,Harper,2022-03-07 02:00:00,2022-03-07 02:14:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 02:14:00,2022-03-07 02:27:00,Harper,5302,3,4454017,CKB -Andy,Harper,2022-03-07 02:30:00,2022-03-07 02:44:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 02:44:00,2022-03-07 02:57:00,Harper,5302,3,4454017,CKB -Andy,Harper,2022-03-07 03:00:00,2022-03-07 03:14:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 03:14:00,2022-03-07 03:27:00,Harper,5302,3,4454017,CKB -Andy,Harper,2022-03-07 03:30:00,2022-03-07 03:44:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 03:44:00,2022-03-07 03:57:00,Harper,5302,3,4454017,CKB -Andy,Harper,2022-03-07 04:00:00,2022-03-07 04:14:00,Elise,4801,0,4454017,CKB -Andy,Elise,2022-03-07 04:14:00,2022-03-07 04:27:00,Harper,5302,0,4454017,CKB -Andy,Harper,2022-03-07 04:27:00,2022-03-07 04:27:00,Beckham,0.06,0,4454017,CKB -Alex,Beckham,2022-03-07 00:43:00,2022-03-07 00:43:00,Chase,0.06,0,4374470,CKB -Alex,Chase,2022-03-07 00:43:00,2022-03-07 01:33:00,Chase,20434,10,4374470,CKB -Alex,Chase,2022-03-07 01:43:00,2022-03-07 02:33:00,Chase,20434,10,4374470,CKB -Alex,Chase,2022-03-07 02:43:00,2022-03-07 03:33:00,Chase,20434,10,4374470,CKB -Alex,Chase,2022-03-07 03:43:00,2022-03-07 04:33:00,Chase,20434,0,4374470,CKB -Alex,Chase,2022-03-07 04:33:00,2022-03-07 04:33:00,Beckham,0.06,0,4374470,CKB -Alex,Beckham,2022-03-07 00:13:00,2022-03-07 00:13:00,Chase,0.06,0,4374475,CKB -Alex,Chase,2022-03-07 00:13:00,2022-03-07 01:03:00,Chase,20434,10,4374475,CKB -Alex,Chase,2022-03-07 01:13:00,2022-03-07 02:03:00,Chase,20434,10,4374475,CKB -Alex,Chase,2022-03-07 02:13:00,2022-03-07 03:03:00,Chase,20434,10,4374475,CKB -Alex,Chase,2022-03-07 03:13:00,2022-03-07 04:03:00,Chase,20434,0,4374475,CKB -Alex,Chase,2022-03-07 04:03:00,2022-03-07 04:03:00,Beckham,0.06,0,4374475,CKB -Hazel,Beckham,2022-03-07 00:24:00,2022-03-07 00:24:00,Celine,0.06,0,4456537,CKB -Hazel,Celine,2022-03-07 00:24:00,2022-03-07 00:48:00,Kali,11.86,4,4456537,CKB -Hazel,Kali,2022-03-07 00:52:00,2022-03-07 01:14:00,Celine,11139,10,4456537,CKB -Hazel,Celine,2022-03-07 01:24:00,2022-03-07 01:48:00,Kali,11.86,4,4456537,CKB -Hazel,Kali,2022-03-07 01:52:00,2022-03-07 02:14:00,Celine,11139,10,4456537,CKB -Hazel,Celine,2022-03-07 02:24:00,2022-03-07 02:48:00,Kali,11.86,4,4456537,CKB -Hazel,Kali,2022-03-07 02:52:00,2022-03-07 03:14:00,Celine,11139,10,4456537,CKB -Hazel,Celine,2022-03-07 03:24:00,2022-03-07 03:48:00,Kali,11.86,4,4456537,CKB -Hazel,Kali,2022-03-07 03:52:00,2022-03-07 04:14:00,Celine,11139,0,4456537,CKB -Hazel,Celine,2022-03-07 04:14:00,2022-03-07 04:14:00,Beckham,0.06,0,4456537,CKB -Hazel,Beckham,2022-03-07 00:22:00,2022-03-07 00:22:00,Kali,0.06,0,4456538,CKB -Hazel,Kali,2022-03-07 00:22:00,2022-03-07 00:44:00,Celine,11139,10,4456538,CKB -Hazel,Celine,2022-03-07 00:54:00,2022-03-07 01:18:00,Kali,11.86,4,4456538,CKB -Hazel,Kali,2022-03-07 01:22:00,2022-03-07 01:44:00,Celine,11139,10,4456538,CKB -Hazel,Celine,2022-03-07 01:54:00,2022-03-07 02:18:00,Kali,11.86,4,4456538,CKB -Hazel,Kali,2022-03-07 02:22:00,2022-03-07 02:44:00,Celine,11139,10,4456538,CKB -Hazel,Celine,2022-03-07 02:54:00,2022-03-07 03:18:00,Kali,11.86,4,4456538,CKB -Hazel,Kali,2022-03-07 03:22:00,2022-03-07 03:44:00,Celine,11139,10,4456538,CKB -Hazel,Celine,2022-03-07 03:54:00,2022-03-07 04:18:00,Kali,11.86,4,4456538,CKB -Hazel,Kali,2022-03-07 04:22:00,2022-03-07 04:44:00,Celine,11139,0,4456538,CKB -Hazel,Celine,2022-03-07 04:44:00,2022-03-07 04:44:00,Beckham,0.06,0,4456538,CKB -Ayaan,Beckham,2022-03-13 20:51:00,2022-03-13 20:51:00,Kalani,0.06,0,4454973,CKB -Ayaan,Kalani,2022-03-13 20:51:00,2022-03-13 21:24:00,Brian,14519,4,4454973,CKB -Ayaan,Brian,2022-03-13 21:28:00,2022-03-13 22:03:00,Kalani,13541,8,4454973,CKB -Ayaan,Kalani,2022-03-13 22:11:00,2022-03-13 22:44:00,Brian,14519,4,4454973,CKB -Ayaan,Brian,2022-03-13 22:48:00,2022-03-13 23:23:00,Kalani,13541,8,4454973,CKB -Ayaan,Kalani,2022-03-13 23:31:00,2022-03-14 00:04:00,Brian,14519,4,4454973,CKB -Ayaan,Brian,2022-03-14 00:08:00,2022-03-14 00:39:00,Leonel,12213,0,4454973,CKB -Hunter,Leonel,2022-03-14 00:39:00,2022-03-14 00:47:00,Kehlani,4.0,2,4454973,CKB -Hunter,Kehlani,2022-03-14 00:49:00,2022-03-14 01:12:00,Ayden,8.36,6,4454973,CKB -Hunter,Ayden,2022-03-14 01:18:00,2022-03-14 01:36:00,Kehlani,9067,13,4454973,CKB -Hunter,Kehlani,2022-03-14 01:49:00,2022-03-14 02:12:00,Ayden,8.36,6,4454973,CKB -Hunter,Ayden,2022-03-14 02:18:00,2022-03-14 02:36:00,Kehlani,9067,13,4454973,CKB -Hunter,Kehlani,2022-03-14 02:49:00,2022-03-14 03:12:00,Ayden,8.36,6,4454973,CKB -Hunter,Ayden,2022-03-14 03:18:00,2022-03-14 03:36:00,Kehlani,9067,13,4454973,CKB -Hunter,Kehlani,2022-03-14 03:49:00,2022-03-14 04:12:00,Ayden,8.36,0,4454973,CKB -Hunter,Ayden,2022-03-14 04:12:00,2022-03-14 04:12:00,Beckham,0.06,0,4454973,CKB -Ayaan,Beckham,2022-03-13 21:31:00,2022-03-13 21:31:00,Kalani,0.06,0,4454974,CKB -Ayaan,Kalani,2022-03-13 21:31:00,2022-03-13 22:04:00,Brian,14519,4,4454974,CKB -Ayaan,Brian,2022-03-13 22:08:00,2022-03-13 22:43:00,Kalani,13541,8,4454974,CKB -Ayaan,Kalani,2022-03-13 22:51:00,2022-03-13 23:24:00,Brian,14519,4,4454974,CKB -Ayaan,Brian,2022-03-13 23:28:00,2022-03-14 00:03:00,Kalani,13541,8,4454974,CKB -Ayaan,Kalani,2022-03-14 00:11:00,2022-03-14 00:44:00,Brian,14519,0,4454974,CKB -Hunter,Brian,2022-03-14 00:44:00,2022-03-14 00:54:00,Kehlani,4.1,25,4454974,CKB -Hunter,Kehlani,2022-03-14 01:19:00,2022-03-14 01:42:00,Ayden,8.36,6,4454974,CKB -Hunter,Ayden,2022-03-14 01:48:00,2022-03-14 02:06:00,Kehlani,9067,13,4454974,CKB -Hunter,Kehlani,2022-03-14 02:19:00,2022-03-14 02:42:00,Ayden,8.36,6,4454974,CKB -Hunter,Ayden,2022-03-14 02:48:00,2022-03-14 03:06:00,Kehlani,9067,13,4454974,CKB -Hunter,Kehlani,2022-03-14 03:19:00,2022-03-14 03:42:00,Ayden,8.36,6,4454974,CKB -Hunter,Ayden,2022-03-14 03:48:00,2022-03-14 04:06:00,Kehlani,9067,0,4454974,CKB -Hunter,Kehlani,2022-03-14 04:06:00,2022-03-14 04:06:00,Beckham,0.06,0,4454974,CKB -Donovan,Beckham,2022-03-13 21:06:00,2022-03-13 21:06:00,Pierce,0.06,0,4664782,CKB -Donovan,Pierce,2022-03-13 21:06:00,2022-03-13 21:34:00,Leonardo,13018,19,4664782,CKB -Donovan,Leonardo,2022-03-13 21:53:00,2022-03-13 22:13:00,Kamryn,10332,17,4664782,CKB -Donovan,Kamryn,2022-03-13 22:30:00,2022-03-13 22:54:00,Leonardo,10.48,19,4664782,CKB -Donovan,Leonardo,2022-03-13 23:13:00,2022-03-13 23:33:00,Kamryn,10332,17,4664782,CKB -Donovan,Kamryn,2022-03-13 23:50:00,2022-03-14 00:14:00,Leonardo,10.48,2,4664782,CKB -Donovan,Leonardo,2022-03-14 00:16:00,2022-03-14 00:23:00,Melanie,3709,5,4664782,CKB -Zoey,Melanie,2022-03-14 00:28:00,2022-03-14 00:44:00,Brinley,6404,3,4664782,CKB -Zoey,Brinley,2022-03-14 00:47:00,2022-03-14 01:10:00,Finn,10579,7,4664782,CKB -Zoey,Finn,2022-03-14 01:17:00,2022-03-14 01:44:00,Brinley,12007,3,4664782,CKB -Zoey,Brinley,2022-03-14 01:47:00,2022-03-14 02:10:00,Finn,10579,7,4664782,CKB -Zoey,Finn,2022-03-14 02:17:00,2022-03-14 02:44:00,Brinley,12007,3,4664782,CKB -Zoey,Brinley,2022-03-14 02:47:00,2022-03-14 03:10:00,Finn,10579,7,4664782,CKB -Zoey,Finn,2022-03-14 03:17:00,2022-03-14 03:44:00,Brinley,12007,3,4664782,CKB -Zoey,Brinley,2022-03-14 03:47:00,2022-03-14 04:10:00,Finn,10579,7,4664782,CKB -Zoey,Finn,2022-03-14 04:17:00,2022-03-14 04:44:00,Brinley,12007,0,4664782,CKB -Zoey,Brinley,2022-03-14 04:44:00,2022-03-14 04:44:00,Beckham,0.06,0,4664782,CKB -Donovan,Beckham,2022-03-13 20:26:00,2022-03-13 20:26:00,Pierce,0.06,0,4762788,CKB -Donovan,Pierce,2022-03-13 20:26:00,2022-03-13 20:56:00,Ezra,14097,14,4762788,CKB -Donovan,Ezra,2022-03-13 21:10:00,2022-03-13 21:38:00,Pierce,13.19,8,4762788,CKB -Donovan,Pierce,2022-03-13 21:46:00,2022-03-13 22:14:00,Leonardo,13018,19,4762788,CKB -Donovan,Leonardo,2022-03-13 22:33:00,2022-03-13 22:53:00,Kamryn,10332,17,4762788,CKB -Donovan,Kamryn,2022-03-13 23:10:00,2022-03-13 23:34:00,Leonardo,10.48,19,4762788,CKB -Donovan,Leonardo,2022-03-13 23:53:00,2022-03-14 00:13:00,Kamryn,10332,2,4762788,CKB -Donovan,Kamryn,2022-03-14 00:15:00,2022-03-14 00:16:00,Brinley,506,1,4762788,CKB -Zoey,Brinley,2022-03-14 00:17:00,2022-03-14 00:40:00,Finn,10579,7,4762788,CKB -Zoey,Finn,2022-03-14 00:47:00,2022-03-14 01:14:00,Brinley,12007,3,4762788,CKB -Zoey,Brinley,2022-03-14 01:17:00,2022-03-14 01:40:00,Finn,10579,7,4762788,CKB -Zoey,Finn,2022-03-14 01:47:00,2022-03-14 02:14:00,Brinley,12007,3,4762788,CKB -Zoey,Brinley,2022-03-14 02:17:00,2022-03-14 02:40:00,Finn,10579,7,4762788,CKB -Zoey,Finn,2022-03-14 02:47:00,2022-03-14 03:14:00,Brinley,12007,3,4762788,CKB -Zoey,Brinley,2022-03-14 03:17:00,2022-03-14 03:40:00,Finn,10579,7,4762788,CKB -Zoey,Finn,2022-03-14 03:47:00,2022-03-14 04:14:00,Brinley,12007,3,4762788,CKB -Zoey,Brinley,2022-03-14 04:17:00,2022-03-14 04:40:00,Finn,10579,3,4762788,CKB -Jackson,Finn,2022-03-14 04:43:00,2022-03-14 04:58:00,Rose,6161,0,4762788,CKB -Jackson,Rose,2022-03-14 04:58:00,2022-03-14 04:58:00,Beckham,0.06,0,4762788,CKB -Emilio,Beckham,2022-03-07 00:32:00,2022-03-07 00:32:00,Rose,0.06,0,4747688,CKB -Emilio,Rose,2022-03-07 00:32:00,2022-03-07 00:44:00,Brooklynn,4212,3,4747688,CKB -Emilio,Brooklynn,2022-03-07 00:47:00,2022-03-07 01:16:00,Francis,13048,0,4747688,CKB -Emilio,Francis,2022-03-07 01:16:00,2022-03-07 01:42:00,Brooklynn,12869,5,4747688,CKB -Emilio,Brooklynn,2022-03-07 01:47:00,2022-03-07 02:16:00,Francis,13048,0,4747688,CKB -Emilio,Francis,2022-03-07 02:16:00,2022-03-07 02:42:00,Brooklynn,12869,5,4747688,CKB -Emilio,Brooklynn,2022-03-07 02:47:00,2022-03-07 03:16:00,Francis,13048,0,4747688,CKB -Emilio,Francis,2022-03-07 03:16:00,2022-03-07 03:42:00,Brooklynn,12869,5,4747688,CKB -Emilio,Brooklynn,2022-03-07 03:47:00,2022-03-07 04:16:00,Francis,13048,0,4747688,CKB -Emilio,Francis,2022-03-07 04:16:00,2022-03-07 04:34:00,Gia,9538,0,4747688,CKB -Emilio,Gia,2022-03-07 04:34:00,2022-03-07 04:34:00,Beckham,0.06,0,4747688,CKB -Emilio,Beckham,2022-03-07 00:17:00,2022-03-07 00:17:00,Brooklynn,0.06,0,4747699,CKB -Emilio,Brooklynn,2022-03-07 00:17:00,2022-03-07 00:46:00,Francis,13048,0,4747699,CKB -Emilio,Francis,2022-03-07 00:46:00,2022-03-07 01:12:00,Brooklynn,12869,5,4747699,CKB -Emilio,Brooklynn,2022-03-07 01:17:00,2022-03-07 01:46:00,Francis,13048,0,4747699,CKB -Emilio,Francis,2022-03-07 01:46:00,2022-03-07 02:12:00,Brooklynn,12869,5,4747699,CKB -Emilio,Brooklynn,2022-03-07 02:17:00,2022-03-07 02:46:00,Francis,13048,0,4747699,CKB -Emilio,Francis,2022-03-07 02:46:00,2022-03-07 03:12:00,Brooklynn,12869,5,4747699,CKB -Emilio,Brooklynn,2022-03-07 03:17:00,2022-03-07 03:46:00,Francis,13048,0,4747699,CKB -Emilio,Francis,2022-03-07 03:46:00,2022-03-07 04:12:00,Brooklynn,12869,5,4747699,CKB -Emilio,Brooklynn,2022-03-07 04:17:00,2022-03-07 04:28:00,Rose,4316,0,4747699,CKB -Emilio,Rose,2022-03-07 04:28:00,2022-03-07 04:28:00,Beckham,0.06,0,4747699,CKB -Jake,Beckham,2022-03-07 00:32:00,2022-03-07 00:32:00,Rose,0.06,0,4627068,CKB -Jake,Rose,2022-03-07 00:32:00,2022-03-07 00:57:00,Kamila,11545,6,4627068,CKB -Jake,Kamila,2022-03-07 01:03:00,2022-03-07 01:46:00,Kayleigh,20579,1,4627068,CKB -Jake,Kayleigh,2022-03-07 01:47:00,2022-03-07 02:25:00,Kamila,20641,8,4627068,CKB -Jake,Kamila,2022-03-07 02:33:00,2022-03-07 03:16:00,Kayleigh,20579,1,4627068,CKB -Jake,Kayleigh,2022-03-07 03:17:00,2022-03-07 03:55:00,Kamila,20641,8,4627068,CKB -Jake,Kamila,2022-03-07 04:03:00,2022-03-07 04:28:00,Rose,11499,0,4627068,CKB -Jake,Rose,2022-03-07 04:28:00,2022-03-07 04:28:00,Beckham,0.06,0,4627068,CKB -Jake,Beckham,2022-03-07 00:33:00,2022-03-07 00:33:00,Kamila,0.06,0,4627069,CKB -Jake,Kamila,2022-03-07 00:33:00,2022-03-07 01:16:00,Kayleigh,20579,1,4627069,CKB -Jake,Kayleigh,2022-03-07 01:17:00,2022-03-07 01:55:00,Kamila,20641,8,4627069,CKB -Jake,Kamila,2022-03-07 02:03:00,2022-03-07 02:46:00,Kayleigh,20579,1,4627069,CKB -Jake,Kayleigh,2022-03-07 02:47:00,2022-03-07 03:25:00,Kamila,20641,8,4627069,CKB -Jake,Kamila,2022-03-07 03:33:00,2022-03-07 04:16:00,Kayleigh,20579,1,4627069,CKB -Jake,Kayleigh,2022-03-07 04:17:00,2022-03-07 04:51:00,Willa,18752,0,4627069,CKB -Jake,Willa,2022-03-07 04:51:00,2022-03-07 04:51:00,Beckham,0.06,0,4627069,CKB -Ezekiel,Beckham,2022-03-07 00:08:00,2022-03-07 00:08:00,Erik,0.06,0,4710317,CKB -Ezekiel,Erik,2022-03-07 00:08:00,2022-03-07 00:27:00,Memphis,7827,0,4710317,CKB -Jake,Memphis,2022-03-07 00:27:00,2022-03-07 00:48:00,Kayleigh,11079,0,4710317,CKB -Jake,Kayleigh,2022-03-07 00:48:00,2022-03-07 01:25:00,Kamila,20641,8,4710317,CKB -Jake,Kamila,2022-03-07 01:33:00,2022-03-07 02:16:00,Kayleigh,20579,1,4710317,CKB -Jake,Kayleigh,2022-03-07 02:17:00,2022-03-07 02:55:00,Kamila,20641,8,4710317,CKB -Jake,Kamila,2022-03-07 03:03:00,2022-03-07 03:46:00,Kayleigh,20579,1,4710317,CKB -Jake,Kayleigh,2022-03-07 03:47:00,2022-03-07 04:25:00,Kamila,20641,0,4710317,CKB -Jake,Kamila,2022-03-07 04:25:00,2022-03-07 04:25:00,Beckham,0.06,0,4710317,CKB -Aziel,Beckham,2022-03-07 00:30:00,2022-03-07 00:30:00,Delilah,0.06,0,4619816,CKB -Aziel,Delilah,2022-03-07 00:30:00,2022-03-07 00:57:00,Miles,10083,7,4619816,CKB -Aziel,Miles,2022-03-07 01:04:00,2022-03-07 01:30:00,Delilah,9016,0,4619816,CKB -Aziel,Delilah,2022-03-07 01:30:00,2022-03-07 01:57:00,Miles,10083,7,4619816,CKB -Aziel,Miles,2022-03-07 02:04:00,2022-03-07 02:30:00,Delilah,9016,0,4619816,CKB -Aziel,Delilah,2022-03-07 02:30:00,2022-03-07 02:57:00,Miles,10083,7,4619816,CKB -Aziel,Miles,2022-03-07 03:04:00,2022-03-07 03:30:00,Delilah,9016,0,4619816,CKB -Aziel,Delilah,2022-03-07 03:30:00,2022-03-07 03:57:00,Miles,10083,7,4619816,CKB -Aziel,Miles,2022-03-07 04:04:00,2022-03-07 04:30:00,Delilah,9016,0,4619816,CKB -Aziel,Delilah,2022-03-07 04:30:00,2022-03-07 04:57:00,Miles,10083,0,4619816,CKB -Aziel,Miles,2022-03-07 04:57:00,2022-03-07 04:57:00,Beckham,0.06,0,4619816,CKB -Aziel,Beckham,2022-03-07 00:34:00,2022-03-07 00:34:00,Miles,0.06,0,4619817,CKB -Aziel,Miles,2022-03-07 00:34:00,2022-03-07 01:00:00,Delilah,9016,0,4619817,CKB -Aziel,Delilah,2022-03-07 01:00:00,2022-03-07 01:27:00,Miles,10083,7,4619817,CKB -Aziel,Miles,2022-03-07 01:34:00,2022-03-07 02:00:00,Delilah,9016,0,4619817,CKB -Aziel,Delilah,2022-03-07 02:00:00,2022-03-07 02:27:00,Miles,10083,7,4619817,CKB -Aziel,Miles,2022-03-07 02:34:00,2022-03-07 03:00:00,Delilah,9016,0,4619817,CKB -Aziel,Delilah,2022-03-07 03:00:00,2022-03-07 03:27:00,Miles,10083,7,4619817,CKB -Aziel,Miles,2022-03-07 03:34:00,2022-03-07 04:00:00,Delilah,9016,0,4619817,CKB -Aziel,Delilah,2022-03-07 04:00:00,2022-03-07 04:27:00,Miles,10083,0,4619817,CKB -Aziel,Miles,2022-03-07 04:27:00,2022-03-07 04:27:00,Beckham,0.06,0,4619817,CKB -Dalton,Beckham,2022-03-07 00:31:00,2022-03-07 00:31:00,Kamila,0.06,0,4374749,CKB -Dalton,Kamila,2022-03-07 00:31:00,2022-03-07 00:44:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 00:44:00,2022-03-07 00:56:00,Kamila,5362,5,4374749,CKB -Dalton,Kamila,2022-03-07 01:01:00,2022-03-07 01:14:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 01:14:00,2022-03-07 01:26:00,Kamila,5362,5,4374749,CKB -Dalton,Kamila,2022-03-07 01:31:00,2022-03-07 01:44:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 01:44:00,2022-03-07 01:56:00,Kamila,5362,5,4374749,CKB -Dalton,Kamila,2022-03-07 02:01:00,2022-03-07 02:14:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 02:14:00,2022-03-07 02:26:00,Kamila,5362,5,4374749,CKB -Dalton,Kamila,2022-03-07 02:31:00,2022-03-07 02:44:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 02:44:00,2022-03-07 02:56:00,Kamila,5362,5,4374749,CKB -Dalton,Kamila,2022-03-07 03:01:00,2022-03-07 03:14:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 03:14:00,2022-03-07 03:26:00,Kamila,5362,5,4374749,CKB -Dalton,Kamila,2022-03-07 03:31:00,2022-03-07 03:44:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 03:44:00,2022-03-07 03:56:00,Kamila,5362,5,4374749,CKB -Dalton,Kamila,2022-03-07 04:01:00,2022-03-07 04:14:00,Veronica,4872,0,4374749,CKB -Dalton,Veronica,2022-03-07 04:14:00,2022-03-07 04:26:00,Kamila,5362,0,4374749,CKB -Dalton,Kamila,2022-03-07 04:26:00,2022-03-07 04:26:00,Beckham,0.06,0,4374749,CKB -Jamison,Beckham,2022-03-07 00:31:00,2022-03-07 00:31:00,Kamila,0.06,0,4374873,CKB -Jamison,Kamila,2022-03-07 00:31:00,2022-03-07 00:45:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 00:47:00,2022-03-07 01:01:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 01:01:00,2022-03-07 01:15:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 01:17:00,2022-03-07 01:31:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 01:31:00,2022-03-07 01:45:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 01:47:00,2022-03-07 02:01:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 02:01:00,2022-03-07 02:15:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 02:17:00,2022-03-07 02:31:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 02:31:00,2022-03-07 02:45:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 02:47:00,2022-03-07 03:01:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 03:01:00,2022-03-07 03:15:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 03:17:00,2022-03-07 03:31:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 03:31:00,2022-03-07 03:45:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 03:47:00,2022-03-07 04:01:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 04:01:00,2022-03-07 04:15:00,Liana,5225,2,4374873,CKB -Jamison,Liana,2022-03-07 04:17:00,2022-03-07 04:31:00,Kamila,7617,0,4374873,CKB -Jamison,Kamila,2022-03-07 04:31:00,2022-03-07 04:31:00,Beckham,0.06,0,4374873,CKB -Keegan,Beckham,2022-03-07 00:43:00,2022-03-07 00:43:00,Charleigh,0.06,0,4375018,CKB -Keegan,Charleigh,2022-03-07 00:43:00,2022-03-07 00:53:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 00:53:00,2022-03-07 01:03:00,Charleigh,4408,10,4375018,CKB -Keegan,Charleigh,2022-03-07 01:13:00,2022-03-07 01:23:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 01:23:00,2022-03-07 01:33:00,Charleigh,4408,10,4375018,CKB -Keegan,Charleigh,2022-03-07 01:43:00,2022-03-07 01:53:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 01:53:00,2022-03-07 02:03:00,Charleigh,4408,10,4375018,CKB -Keegan,Charleigh,2022-03-07 02:13:00,2022-03-07 02:23:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 02:23:00,2022-03-07 02:33:00,Charleigh,4408,10,4375018,CKB -Keegan,Charleigh,2022-03-07 02:43:00,2022-03-07 02:53:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 02:53:00,2022-03-07 03:03:00,Charleigh,4408,10,4375018,CKB -Keegan,Charleigh,2022-03-07 03:13:00,2022-03-07 03:23:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 03:23:00,2022-03-07 03:33:00,Charleigh,4408,10,4375018,CKB -Keegan,Charleigh,2022-03-07 03:43:00,2022-03-07 03:53:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 03:53:00,2022-03-07 04:03:00,Charleigh,4408,10,4375018,CKB -Keegan,Charleigh,2022-03-07 04:13:00,2022-03-07 04:23:00,Eli,4507,0,4375018,CKB -Keegan,Eli,2022-03-07 04:23:00,2022-03-07 04:33:00,Charleigh,4408,0,4375018,CKB -Keegan,Charleigh,2022-03-07 04:33:00,2022-03-07 04:33:00,Beckham,0.06,0,4375018,CKB -Juan,Beckham,2022-03-13 15:46:00,2022-03-13 15:46:00,Jace,0.06,0,4458713,CKB -Juan,Jace,2022-03-13 15:46:00,2022-03-13 15:53:00,Jaxton,3147,12,4458713,CKB -Juan,Jaxton,2022-03-13 16:05:00,2022-03-13 16:15:00,Jace,3469,0,4458713,CKB -Juan,Jace,2022-03-13 16:15:00,2022-03-13 16:23:00,Jaxton,3351,12,4458713,CKB -Juan,Jaxton,2022-03-13 16:35:00,2022-03-13 16:45:00,Jace,3469,0,4458713,CKB -Juan,Jace,2022-03-13 16:45:00,2022-03-13 16:53:00,Jaxton,3351,12,4458713,CKB -Juan,Jaxton,2022-03-13 17:05:00,2022-03-13 17:15:00,Jace,3469,0,4458713,CKB -Juan,Jace,2022-03-13 17:15:00,2022-03-13 17:23:00,Jaxton,3351,12,4458713,CKB -Juan,Jaxton,2022-03-13 17:35:00,2022-03-13 17:45:00,Jace,3469,0,4458713,CKB -Juan,Jace,2022-03-13 17:45:00,2022-03-13 17:53:00,Jaxton,3351,12,4458713,CKB -Juan,Jaxton,2022-03-13 18:05:00,2022-03-13 18:15:00,Jace,3469,0,4458713,CKB -Juan,Jace,2022-03-13 18:15:00,2022-03-13 18:23:00,Jaxton,3351,0,4458713,CKB -Cruz,Jaxton,2022-03-13 18:23:00,2022-03-13 18:29:00,Jace,3.1,22,4458713,CKB -Cruz,Jace,2022-03-13 18:51:00,2022-03-13 19:02:00,Quinn,4338,0,4458713,CKB -Cruz,Quinn,2022-03-13 19:02:00,2022-03-13 19:13:00,Jace,4427,12,4458713,CKB -Avery,Jace,2022-03-13 19:25:00,2022-03-13 19:38:00,Nathan,6086,3,4458713,CKB -Avery,Nathan,2022-03-13 19:41:00,2022-03-13 19:55:00,Jace,6232,0,4458713,CKB -Avery,Jace,2022-03-13 19:55:00,2022-03-13 20:08:00,Nathan,6086,3,4458713,CKB -Avery,Nathan,2022-03-13 20:11:00,2022-03-13 20:25:00,Jace,6232,6,4458713,CKB -Cruz,Jace,2022-03-13 20:31:00,2022-03-13 20:42:00,Quinn,4338,0,4458713,CKB -Cruz,Quinn,2022-03-13 20:42:00,2022-03-13 20:53:00,Jace,4427,18,4458713,CKB -Cruz,Jace,2022-03-13 21:11:00,2022-03-13 21:22:00,Quinn,4338,0,4458713,CKB -Cruz,Quinn,2022-03-13 21:22:00,2022-03-13 21:33:00,Jace,4427,18,4458713,CKB -Cruz,Jace,2022-03-13 21:51:00,2022-03-13 22:02:00,Quinn,4338,0,4458713,CKB -Cruz,Quinn,2022-03-13 22:02:00,2022-03-13 22:13:00,Jace,4427,18,4458713,CKB -Cruz,Jace,2022-03-13 22:31:00,2022-03-13 22:42:00,Quinn,4338,0,4458713,CKB -Cruz,Quinn,2022-03-13 22:42:00,2022-03-13 22:53:00,Jace,4427,2,4458713,CKB -Avery,Jace,2022-03-13 22:55:00,2022-03-13 23:08:00,Nathan,6086,3,4458713,CKB -Avery,Nathan,2022-03-13 23:11:00,2022-03-13 23:25:00,Jace,6232,0,4458713,CKB -Avery,Jace,2022-03-13 23:25:00,2022-03-13 23:38:00,Nathan,6086,3,4458713,CKB -Avery,Nathan,2022-03-13 23:41:00,2022-03-13 23:55:00,Jace,6232,0,4458713,CKB -Avery,Jace,2022-03-13 23:55:00,2022-03-14 00:08:00,Nathan,6086,0,4458713,CKB -Avery,Nathan,2022-03-14 00:08:00,2022-03-14 00:08:00,Beckham,0.06,0,4458713,CKB -Richard,Beckham,2022-03-13 07:05:00,2022-03-13 07:05:00,Ariyah,0.06,0,4426903,CKB -Richard,Ariyah,2022-03-13 07:05:00,2022-03-13 07:14:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 07:14:00,2022-03-13 07:23:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 07:25:00,2022-03-13 07:34:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 07:34:00,2022-03-13 07:43:00,Ariyah,5139,22,4426903,CKB -Richard,Ariyah,2022-03-13 08:05:00,2022-03-13 08:14:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 08:14:00,2022-03-13 08:23:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 08:25:00,2022-03-13 08:34:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 08:34:00,2022-03-13 08:43:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 08:45:00,2022-03-13 08:54:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 08:54:00,2022-03-13 09:03:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 09:05:00,2022-03-13 09:14:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 09:14:00,2022-03-13 09:23:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 09:25:00,2022-03-13 09:34:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 09:34:00,2022-03-13 09:43:00,Ariyah,5139,23,4426903,CKB -Richard,Ariyah,2022-03-13 10:06:00,2022-03-13 10:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 10:15:00,2022-03-13 10:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 10:26:00,2022-03-13 10:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 10:35:00,2022-03-13 10:44:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 10:46:00,2022-03-13 10:55:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 10:55:00,2022-03-13 11:04:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 11:06:00,2022-03-13 11:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 11:15:00,2022-03-13 11:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 11:26:00,2022-03-13 11:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 11:35:00,2022-03-13 11:44:00,Ariyah,5139,22,4426903,CKB -Richard,Ariyah,2022-03-13 12:06:00,2022-03-13 12:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 12:15:00,2022-03-13 12:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 12:26:00,2022-03-13 12:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 12:35:00,2022-03-13 12:44:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 12:46:00,2022-03-13 12:55:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 12:55:00,2022-03-13 13:04:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 13:06:00,2022-03-13 13:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 13:15:00,2022-03-13 13:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 13:26:00,2022-03-13 13:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 13:35:00,2022-03-13 13:44:00,Ariyah,5139,22,4426903,CKB -Richard,Ariyah,2022-03-13 14:06:00,2022-03-13 14:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 14:15:00,2022-03-13 14:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 14:26:00,2022-03-13 14:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 14:35:00,2022-03-13 14:44:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 14:46:00,2022-03-13 14:55:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 14:55:00,2022-03-13 15:04:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 15:06:00,2022-03-13 15:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 15:15:00,2022-03-13 15:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 15:26:00,2022-03-13 15:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 15:35:00,2022-03-13 15:44:00,Ariyah,5139,22,4426903,CKB -Richard,Ariyah,2022-03-13 16:06:00,2022-03-13 16:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 16:15:00,2022-03-13 16:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 16:26:00,2022-03-13 16:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 16:35:00,2022-03-13 16:44:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 16:46:00,2022-03-13 16:55:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 16:55:00,2022-03-13 17:04:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 17:06:00,2022-03-13 17:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 17:15:00,2022-03-13 17:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 17:26:00,2022-03-13 17:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 17:35:00,2022-03-13 17:44:00,Ariyah,5139,22,4426903,CKB -Richard,Ariyah,2022-03-13 18:06:00,2022-03-13 18:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 18:15:00,2022-03-13 18:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 18:26:00,2022-03-13 18:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 18:35:00,2022-03-13 18:44:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 18:46:00,2022-03-13 18:55:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 18:55:00,2022-03-13 19:04:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 19:06:00,2022-03-13 19:15:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 19:15:00,2022-03-13 19:24:00,Ariyah,5139,2,4426903,CKB -Richard,Ariyah,2022-03-13 19:26:00,2022-03-13 19:35:00,Jaden,4781,0,4426903,CKB -Richard,Jaden,2022-03-13 19:35:00,2022-03-13 19:44:00,Ariyah,5139,21,4426903,CKB -Richard,Ariyah,2022-03-13 20:05:00,2022-03-13 20:14:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 20:15:00,2022-03-13 20:24:00,Ariyah,5139,1,4426903,CKB -Richard,Ariyah,2022-03-13 20:25:00,2022-03-13 20:34:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 20:35:00,2022-03-13 20:44:00,Ariyah,5139,1,4426903,CKB -Richard,Ariyah,2022-03-13 20:45:00,2022-03-13 20:54:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 20:55:00,2022-03-13 21:04:00,Ariyah,5139,1,4426903,CKB -Richard,Ariyah,2022-03-13 21:05:00,2022-03-13 21:14:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 21:15:00,2022-03-13 21:24:00,Ariyah,5139,1,4426903,CKB -Richard,Ariyah,2022-03-13 21:25:00,2022-03-13 21:34:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 21:35:00,2022-03-13 21:44:00,Ariyah,5139,21,4426903,CKB -Richard,Ariyah,2022-03-13 22:05:00,2022-03-13 22:14:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 22:15:00,2022-03-13 22:24:00,Ariyah,5139,1,4426903,CKB -Richard,Ariyah,2022-03-13 22:25:00,2022-03-13 22:34:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 22:35:00,2022-03-13 22:44:00,Ariyah,5139,1,4426903,CKB -Richard,Ariyah,2022-03-13 22:45:00,2022-03-13 22:54:00,Jaden,4781,1,4426903,CKB -Richard,Jaden,2022-03-13 22:55:00,2022-03-13 23:04:00,Ariyah,5139,0,4426903,CKB -Richard,Ariyah,2022-03-13 23:04:00,2022-03-13 23:04:00,Beckham,0.06,0,4426903,CKB -Camryn,Beckham,2022-03-13 07:30:00,2022-03-13 07:30:00,Lucia,0.06,0,4369706,CKB -Camryn,Lucia,2022-03-13 07:30:00,2022-03-13 07:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 07:39:00,2022-03-13 07:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 07:50:00,2022-03-13 07:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 07:59:00,2022-03-13 08:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 08:10:00,2022-03-13 08:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 08:19:00,2022-03-13 08:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 08:30:00,2022-03-13 08:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 08:39:00,2022-03-13 08:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 08:50:00,2022-03-13 08:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 08:59:00,2022-03-13 09:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 09:10:00,2022-03-13 09:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 09:19:00,2022-03-13 09:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 09:30:00,2022-03-13 09:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 09:39:00,2022-03-13 09:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 09:50:00,2022-03-13 09:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 09:59:00,2022-03-13 10:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 10:10:00,2022-03-13 10:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 10:19:00,2022-03-13 10:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 10:30:00,2022-03-13 10:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 10:39:00,2022-03-13 10:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 10:50:00,2022-03-13 10:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 10:59:00,2022-03-13 11:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 11:10:00,2022-03-13 11:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 11:19:00,2022-03-13 11:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 11:30:00,2022-03-13 11:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 11:39:00,2022-03-13 11:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 11:50:00,2022-03-13 11:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 11:59:00,2022-03-13 12:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 12:10:00,2022-03-13 12:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 12:19:00,2022-03-13 12:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 12:30:00,2022-03-13 12:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 12:39:00,2022-03-13 12:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 12:50:00,2022-03-13 12:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 12:59:00,2022-03-13 13:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 13:10:00,2022-03-13 13:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 13:19:00,2022-03-13 13:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 13:30:00,2022-03-13 13:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 13:39:00,2022-03-13 13:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 13:50:00,2022-03-13 13:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 13:59:00,2022-03-13 14:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 14:10:00,2022-03-13 14:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 14:19:00,2022-03-13 14:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 14:30:00,2022-03-13 14:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 14:39:00,2022-03-13 14:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 14:50:00,2022-03-13 14:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 14:59:00,2022-03-13 15:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 15:10:00,2022-03-13 15:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 15:19:00,2022-03-13 15:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 15:30:00,2022-03-13 15:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 15:39:00,2022-03-13 15:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 15:50:00,2022-03-13 15:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 15:59:00,2022-03-13 16:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 16:10:00,2022-03-13 16:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 16:19:00,2022-03-13 16:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 16:30:00,2022-03-13 16:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 16:39:00,2022-03-13 16:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 16:50:00,2022-03-13 16:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 16:59:00,2022-03-13 17:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 17:10:00,2022-03-13 17:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 17:19:00,2022-03-13 17:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 17:30:00,2022-03-13 17:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 17:39:00,2022-03-13 17:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 17:50:00,2022-03-13 17:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 17:59:00,2022-03-13 18:10:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 18:10:00,2022-03-13 18:15:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 18:19:00,2022-03-13 18:30:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 18:30:00,2022-03-13 18:35:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 18:39:00,2022-03-13 18:50:00,Lucia,4341,0,4369706,CKB -Camryn,Lucia,2022-03-13 18:50:00,2022-03-13 18:55:00,Jaxon,2217,4,4369706,CKB -Camryn,Jaxon,2022-03-13 18:59:00,2022-03-13 19:10:00,Lucia,4288,0,4369706,CKB -Camryn,Lucia,2022-03-13 19:10:00,2022-03-13 19:10:00,Beckham,0.06,0,4369706,CKB -Amy,Beckham,2022-03-13 07:56:00,2022-03-13 07:56:00,Izabella,0.06,0,4419537,CKB -Amy,Izabella,2022-03-13 07:56:00,2022-03-13 07:56:00,Izabella,0.0,792,4419537,CKB -Amy,Izabella,2022-03-13 21:08:00,2022-03-13 21:08:00,Izabella,0.0,0,4419537,CKB -Amy,Izabella,2022-03-13 21:08:00,2022-03-13 21:08:00,Beckham,0.06,0,4419537,CKB -Nash,Beckham,2022-03-13 07:18:00,2022-03-13 07:18:00,Amira,0.06,0,4688586,CKB -Nash,Amira,2022-03-13 07:18:00,2022-03-13 07:26:00,Victor,5562,10,4688586,CKB -Nash,Victor,2022-03-13 07:36:00,2022-03-13 07:45:00,Olivia,5941,32,4688586,CKB -Nash,Olivia,2022-03-13 08:17:00,2022-03-13 08:26:00,Victor,5994,10,4688586,CKB -Nash,Victor,2022-03-13 08:36:00,2022-03-13 08:45:00,Olivia,5941,32,4688586,CKB -Nash,Olivia,2022-03-13 09:17:00,2022-03-13 09:26:00,Victor,5994,8,4688586,CKB -Nash,Victor,2022-03-13 09:34:00,2022-03-13 09:43:00,Olivia,5941,36,4688586,CKB -Nash,Olivia,2022-03-13 10:19:00,2022-03-13 10:30:00,Victor,5994,2,4688586,CKB -Nash,Victor,2022-03-13 10:32:00,2022-03-13 10:41:00,Amira,5566,0,4688586,CKB -Nash,Amira,2022-03-13 10:41:00,2022-03-13 10:41:00,Beckham,0.06,0,4688586,CKB -Ayaan,Beckham,2022-03-08 21:31:00,2022-03-08 21:31:00,Kalani,0.06,0,4454944,CKB -Ayaan,Kalani,2022-03-08 21:31:00,2022-03-08 22:04:00,Brian,14519,4,4454944,CKB -Ayaan,Brian,2022-03-08 22:08:00,2022-03-08 22:43:00,Kalani,13541,8,4454944,CKB -Ayaan,Kalani,2022-03-08 22:51:00,2022-03-08 23:24:00,Brian,14519,4,4454944,CKB -Ayaan,Brian,2022-03-08 23:28:00,2022-03-09 00:03:00,Kalani,13541,8,4454944,CKB -Ayaan,Kalani,2022-03-09 00:11:00,2022-03-09 00:44:00,Brian,14519,0,4454944,CKB -Hunter,Brian,2022-03-09 00:44:00,2022-03-09 00:54:00,Kehlani,4.1,25,4454944,CKB -Hunter,Kehlani,2022-03-09 01:19:00,2022-03-09 01:42:00,Ayden,8.36,6,4454944,CKB -Hunter,Ayden,2022-03-09 01:48:00,2022-03-09 02:06:00,Kehlani,9067,13,4454944,CKB -Hunter,Kehlani,2022-03-09 02:19:00,2022-03-09 02:42:00,Ayden,8.36,6,4454944,CKB -Hunter,Ayden,2022-03-09 02:48:00,2022-03-09 03:06:00,Kehlani,9067,13,4454944,CKB -Hunter,Kehlani,2022-03-09 03:19:00,2022-03-09 03:42:00,Ayden,8.36,6,4454944,CKB -Hunter,Ayden,2022-03-09 03:48:00,2022-03-09 04:06:00,Kehlani,9067,0,4454944,CKB -Hunter,Kehlani,2022-03-09 04:06:00,2022-03-09 04:06:00,Beckham,0.06,0,4454944,CKB -Ayaan,Beckham,2022-03-08 22:11:00,2022-03-08 22:11:00,Kalani,0.06,0,4454949,CKB -Ayaan,Kalani,2022-03-08 22:11:00,2022-03-08 22:44:00,Brian,14519,4,4454949,CKB -Ayaan,Brian,2022-03-08 22:48:00,2022-03-08 23:23:00,Kalani,13541,8,4454949,CKB -Ayaan,Kalani,2022-03-08 23:31:00,2022-03-09 00:04:00,Brian,14519,4,4454949,CKB -Ayaan,Brian,2022-03-09 00:08:00,2022-03-09 00:39:00,Leonel,12213,0,4454949,CKB -Hunter,Leonel,2022-03-09 00:39:00,2022-03-09 00:47:00,Kehlani,4.0,2,4454949,CKB -Hunter,Kehlani,2022-03-09 00:49:00,2022-03-09 01:12:00,Ayden,8.36,6,4454949,CKB -Hunter,Ayden,2022-03-09 01:18:00,2022-03-09 01:36:00,Kehlani,9067,13,4454949,CKB -Hunter,Kehlani,2022-03-09 01:49:00,2022-03-09 02:12:00,Ayden,8.36,6,4454949,CKB -Hunter,Ayden,2022-03-09 02:18:00,2022-03-09 02:36:00,Kehlani,9067,13,4454949,CKB -Hunter,Kehlani,2022-03-09 02:49:00,2022-03-09 03:12:00,Ayden,8.36,6,4454949,CKB -Hunter,Ayden,2022-03-09 03:18:00,2022-03-09 03:36:00,Kehlani,9067,13,4454949,CKB -Hunter,Kehlani,2022-03-09 03:49:00,2022-03-09 04:12:00,Ayden,8.36,0,4454949,CKB -Hunter,Ayden,2022-03-09 04:12:00,2022-03-09 04:12:00,Beckham,0.06,0,4454949,CKB -Donovan,Beckham,2022-03-08 21:06:00,2022-03-08 21:06:00,Pierce,0.06,0,4664623,CKB -Donovan,Pierce,2022-03-08 21:06:00,2022-03-08 21:34:00,Leonardo,13018,19,4664623,CKB -Donovan,Leonardo,2022-03-08 21:53:00,2022-03-08 22:13:00,Kamryn,10332,17,4664623,CKB -Donovan,Kamryn,2022-03-08 22:30:00,2022-03-08 22:54:00,Leonardo,10.48,19,4664623,CKB -Donovan,Leonardo,2022-03-08 23:13:00,2022-03-08 23:33:00,Kamryn,10332,17,4664623,CKB -Donovan,Kamryn,2022-03-08 23:50:00,2022-03-09 00:14:00,Leonardo,10.48,2,4664623,CKB -Donovan,Leonardo,2022-03-09 00:16:00,2022-03-09 00:23:00,Melanie,3709,5,4664623,CKB -Zoey,Melanie,2022-03-09 00:28:00,2022-03-09 00:44:00,Brinley,6404,3,4664623,CKB -Zoey,Brinley,2022-03-09 00:47:00,2022-03-09 01:10:00,Finn,10579,7,4664623,CKB -Zoey,Finn,2022-03-09 01:17:00,2022-03-09 01:44:00,Brinley,12007,3,4664623,CKB -Zoey,Brinley,2022-03-09 01:47:00,2022-03-09 02:10:00,Finn,10579,7,4664623,CKB -Zoey,Finn,2022-03-09 02:17:00,2022-03-09 02:44:00,Brinley,12007,3,4664623,CKB -Zoey,Brinley,2022-03-09 02:47:00,2022-03-09 03:10:00,Finn,10579,7,4664623,CKB -Zoey,Finn,2022-03-09 03:17:00,2022-03-09 03:44:00,Brinley,12007,3,4664623,CKB -Zoey,Brinley,2022-03-09 03:47:00,2022-03-09 04:10:00,Finn,10579,7,4664623,CKB -Zoey,Finn,2022-03-09 04:17:00,2022-03-09 04:44:00,Brinley,12007,0,4664623,CKB -Zoey,Brinley,2022-03-09 04:44:00,2022-03-09 04:44:00,Beckham,0.06,0,4664623,CKB -Donovan,Beckham,2022-03-08 20:26:00,2022-03-08 20:26:00,Pierce,0.06,0,4762733,CKB -Donovan,Pierce,2022-03-08 20:26:00,2022-03-08 20:56:00,Ezra,14097,14,4762733,CKB -Donovan,Ezra,2022-03-08 21:10:00,2022-03-08 21:38:00,Pierce,13.19,8,4762733,CKB -Donovan,Pierce,2022-03-08 21:46:00,2022-03-08 22:14:00,Leonardo,13018,19,4762733,CKB -Donovan,Leonardo,2022-03-08 22:33:00,2022-03-08 22:53:00,Kamryn,10332,17,4762733,CKB -Donovan,Kamryn,2022-03-08 23:10:00,2022-03-08 23:34:00,Leonardo,10.48,19,4762733,CKB -Donovan,Leonardo,2022-03-08 23:53:00,2022-03-09 00:13:00,Kamryn,10332,2,4762733,CKB -Donovan,Kamryn,2022-03-09 00:15:00,2022-03-09 00:16:00,Brinley,506,1,4762733,CKB -Zoey,Brinley,2022-03-09 00:17:00,2022-03-09 00:40:00,Finn,10579,7,4762733,CKB -Zoey,Finn,2022-03-09 00:47:00,2022-03-09 01:14:00,Brinley,12007,3,4762733,CKB -Zoey,Brinley,2022-03-09 01:17:00,2022-03-09 01:40:00,Finn,10579,7,4762733,CKB -Zoey,Finn,2022-03-09 01:47:00,2022-03-09 02:14:00,Brinley,12007,3,4762733,CKB -Zoey,Brinley,2022-03-09 02:17:00,2022-03-09 02:40:00,Finn,10579,7,4762733,CKB -Zoey,Finn,2022-03-09 02:47:00,2022-03-09 03:14:00,Brinley,12007,3,4762733,CKB -Zoey,Brinley,2022-03-09 03:17:00,2022-03-09 03:40:00,Finn,10579,7,4762733,CKB -Zoey,Finn,2022-03-09 03:47:00,2022-03-09 04:14:00,Brinley,12007,3,4762733,CKB -Zoey,Brinley,2022-03-09 04:17:00,2022-03-09 04:40:00,Finn,10579,3,4762733,CKB -Jackson,Finn,2022-03-09 04:43:00,2022-03-09 04:58:00,Rose,6161,0,4762733,CKB -Jackson,Rose,2022-03-09 04:58:00,2022-03-09 04:58:00,Beckham,0.06,0,4762733,CKB -Avery,Beckham,2022-03-08 22:56:00,2022-03-08 22:56:00,Jace,0.06,0,4617408,CKB -Avery,Jace,2022-03-08 22:56:00,2022-03-08 23:08:00,Nathan,5882,3,4617408,CKB -Avery,Nathan,2022-03-08 23:11:00,2022-03-08 23:25:00,Jace,6232,0,4617408,CKB -Avery,Jace,2022-03-08 23:25:00,2022-03-08 23:38:00,Nathan,6086,3,4617408,CKB -Avery,Nathan,2022-03-08 23:41:00,2022-03-08 23:55:00,Jace,6232,0,4617408,CKB -Avery,Jace,2022-03-08 23:55:00,2022-03-09 00:08:00,Nathan,6086,0,4617408,CKB -Avery,Nathan,2022-03-09 00:08:00,2022-03-09 00:08:00,Beckham,0.06,0,4617408,CKB -Richard,Beckham,2022-03-08 05:05:00,2022-03-08 05:05:00,Ariyah,0.06,0,4426845,CKB -Richard,Ariyah,2022-03-08 05:05:00,2022-03-08 05:14:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 05:14:00,2022-03-08 05:23:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 05:25:00,2022-03-08 05:34:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 05:34:00,2022-03-08 05:43:00,Ariyah,5139,23,4426845,CKB -Richard,Ariyah,2022-03-08 06:06:00,2022-03-08 06:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 06:15:00,2022-03-08 06:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 06:26:00,2022-03-08 06:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 06:35:00,2022-03-08 06:44:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 06:46:00,2022-03-08 06:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 06:55:00,2022-03-08 07:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 07:06:00,2022-03-08 07:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 07:15:00,2022-03-08 07:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 07:26:00,2022-03-08 07:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 07:35:00,2022-03-08 07:44:00,Ariyah,5139,22,4426845,CKB -Richard,Ariyah,2022-03-08 08:06:00,2022-03-08 08:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 08:15:00,2022-03-08 08:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 08:26:00,2022-03-08 08:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 08:35:00,2022-03-08 08:44:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 08:46:00,2022-03-08 08:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 08:55:00,2022-03-08 09:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 09:06:00,2022-03-08 09:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 09:15:00,2022-03-08 09:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 09:26:00,2022-03-08 09:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 09:35:00,2022-03-08 09:44:00,Ariyah,5139,22,4426845,CKB -Richard,Ariyah,2022-03-08 10:06:00,2022-03-08 10:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 10:15:00,2022-03-08 10:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 10:26:00,2022-03-08 10:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 10:35:00,2022-03-08 10:44:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 10:46:00,2022-03-08 10:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 10:55:00,2022-03-08 11:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 11:06:00,2022-03-08 11:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 11:15:00,2022-03-08 11:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 11:26:00,2022-03-08 11:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 11:35:00,2022-03-08 11:44:00,Ariyah,5139,22,4426845,CKB -Richard,Ariyah,2022-03-08 12:06:00,2022-03-08 12:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 12:15:00,2022-03-08 12:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 12:26:00,2022-03-08 12:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 12:35:00,2022-03-08 12:44:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 12:46:00,2022-03-08 12:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 12:55:00,2022-03-08 13:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 13:06:00,2022-03-08 13:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 13:15:00,2022-03-08 13:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 13:26:00,2022-03-08 13:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 13:35:00,2022-03-08 13:44:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 13:46:00,2022-03-08 13:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 13:55:00,2022-03-08 14:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 14:06:00,2022-03-08 14:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 14:15:00,2022-03-08 14:24:00,Ariyah,5139,22,4426845,CKB -Richard,Ariyah,2022-03-08 14:46:00,2022-03-08 14:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 14:55:00,2022-03-08 15:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 15:06:00,2022-03-08 15:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 15:15:00,2022-03-08 15:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 15:26:00,2022-03-08 15:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 15:35:00,2022-03-08 15:44:00,Ariyah,5139,22,4426845,CKB -Richard,Ariyah,2022-03-08 16:06:00,2022-03-08 16:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 16:15:00,2022-03-08 16:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 16:26:00,2022-03-08 16:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 16:35:00,2022-03-08 16:44:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 16:46:00,2022-03-08 16:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 16:55:00,2022-03-08 17:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 17:06:00,2022-03-08 17:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 17:15:00,2022-03-08 17:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 17:26:00,2022-03-08 17:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 17:35:00,2022-03-08 17:44:00,Ariyah,5139,22,4426845,CKB -Richard,Ariyah,2022-03-08 18:06:00,2022-03-08 18:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 18:15:00,2022-03-08 18:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 18:26:00,2022-03-08 18:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 18:35:00,2022-03-08 18:44:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 18:46:00,2022-03-08 18:55:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 18:55:00,2022-03-08 19:04:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 19:06:00,2022-03-08 19:15:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 19:15:00,2022-03-08 19:24:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 19:26:00,2022-03-08 19:35:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 19:35:00,2022-03-08 19:44:00,Ariyah,5139,21,4426845,CKB -Richard,Ariyah,2022-03-08 20:05:00,2022-03-08 20:14:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 20:14:00,2022-03-08 20:23:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 20:25:00,2022-03-08 20:34:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 20:34:00,2022-03-08 20:43:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 20:45:00,2022-03-08 20:54:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 20:54:00,2022-03-08 21:03:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 21:05:00,2022-03-08 21:14:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 21:14:00,2022-03-08 21:23:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 21:25:00,2022-03-08 21:34:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 21:34:00,2022-03-08 21:43:00,Ariyah,5139,22,4426845,CKB -Richard,Ariyah,2022-03-08 22:05:00,2022-03-08 22:14:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 22:14:00,2022-03-08 22:23:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 22:25:00,2022-03-08 22:34:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 22:34:00,2022-03-08 22:43:00,Ariyah,5139,2,4426845,CKB -Richard,Ariyah,2022-03-08 22:45:00,2022-03-08 22:54:00,Jaden,4781,0,4426845,CKB -Richard,Jaden,2022-03-08 22:54:00,2022-03-08 23:03:00,Ariyah,5139,0,4426845,CKB -Richard,Ariyah,2022-03-08 23:03:00,2022-03-08 23:03:00,Beckham,0.06,0,4426845,CKB -Ezekiel,Beckham,2022-03-09 00:06:00,2022-03-09 00:06:00,Erik,0.06,0,4708595,CKB -Ezekiel,Erik,2022-03-09 00:06:00,2022-03-09 00:27:00,Memphis,7827,0,4708595,CKB -Jake,Memphis,2022-03-09 00:27:00,2022-03-09 00:48:00,Kayleigh,11079,0,4708595,CKB -Jake,Kayleigh,2022-03-09 00:48:00,2022-03-09 01:25:00,Kamila,20641,8,4708595,CKB -Jake,Kamila,2022-03-09 01:33:00,2022-03-09 02:16:00,Kayleigh,20579,1,4708595,CKB -Jake,Kayleigh,2022-03-09 02:17:00,2022-03-09 02:55:00,Kamila,20641,8,4708595,CKB -Jake,Kamila,2022-03-09 03:03:00,2022-03-09 03:46:00,Kayleigh,20579,1,4708595,CKB -Jake,Kayleigh,2022-03-09 03:47:00,2022-03-09 04:25:00,Kamila,20641,0,4708595,CKB -Jake,Kamila,2022-03-09 04:25:00,2022-03-09 04:25:00,Beckham,0.06,0,4708595,CKB -Astrid,King,2022-03-08 05:15:00,2022-03-08 06:01:00,Brayden,17.9,0,4317625,VDL -Astrid,Brayden,2022-03-08 06:01:00,2022-03-08 06:15:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 06:23:00,2022-03-08 06:37:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 06:41:00,2022-03-08 06:55:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 07:03:00,2022-03-08 07:17:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 07:21:00,2022-03-08 07:35:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 07:43:00,2022-03-08 07:57:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 08:01:00,2022-03-08 08:15:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 08:23:00,2022-03-08 08:37:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 08:41:00,2022-03-08 08:55:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 09:03:00,2022-03-08 09:17:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 09:21:00,2022-03-08 09:35:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 09:43:00,2022-03-08 09:57:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 10:01:00,2022-03-08 10:15:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 10:23:00,2022-03-08 10:37:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 10:41:00,2022-03-08 10:55:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 11:03:00,2022-03-08 11:17:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 11:21:00,2022-03-08 11:35:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 11:43:00,2022-03-08 11:57:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 12:01:00,2022-03-08 12:15:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 12:23:00,2022-03-08 12:37:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 12:41:00,2022-03-08 12:55:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 13:03:00,2022-03-08 13:17:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 13:21:00,2022-03-08 13:35:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 13:43:00,2022-03-08 13:57:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 14:01:00,2022-03-08 14:15:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 14:23:00,2022-03-08 14:37:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 14:41:00,2022-03-08 14:55:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 15:03:00,2022-03-08 15:17:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 15:21:00,2022-03-08 15:35:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 15:43:00,2022-03-08 15:57:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 16:01:00,2022-03-08 16:15:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 16:23:00,2022-03-08 16:37:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 16:41:00,2022-03-08 16:55:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 17:03:00,2022-03-08 17:17:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 17:21:00,2022-03-08 17:35:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 17:43:00,2022-03-08 17:57:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 18:01:00,2022-03-08 18:15:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 18:23:00,2022-03-08 18:37:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 18:41:00,2022-03-08 18:55:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 19:03:00,2022-03-08 19:17:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 19:21:00,2022-03-08 19:35:00,Brayden,4637,8,4317625,VDL -Astrid,Brayden,2022-03-08 19:43:00,2022-03-08 19:57:00,Brayden,4637,4,4317625,VDL -Astrid,Brayden,2022-03-08 20:01:00,2022-03-08 20:14:00,Brayden,4637,9,4317625,VDL -Astrid,Brayden,2022-03-08 20:23:00,2022-03-08 20:36:00,Brayden,4637,0,4317625,VDL -Astrid,Brayden,2022-03-08 20:36:00,2022-03-08 21:15:00,King,19.8,0,4317625,VDL -Amy,Beckham,2022-03-08 04:56:00,2022-03-08 04:56:00,Izabella,0.06,18,4425668,CKB -Amy,Izabella,2022-03-08 05:14:00,2022-03-08 05:20:00,Tristan,3.29,0,4425668,CKB -Amy,Tristan,2022-03-08 05:20:00,2022-03-08 05:24:00,Izabella,2954,20,4425668,CKB -Amy,Izabella,2022-03-08 05:44:00,2022-03-08 05:50:00,Tristan,3.29,0,4425668,CKB -Amy,Tristan,2022-03-08 05:50:00,2022-03-08 05:54:00,Izabella,2954,5,4425668,CKB -Amy,Izabella,2022-03-08 05:59:00,2022-03-08 06:06:00,Tristan,3.29,2,4425668,CKB -Amy,Tristan,2022-03-08 06:08:00,2022-03-08 06:13:00,Izabella,2954,19,4425668,CKB -Amy,Izabella,2022-03-08 06:32:00,2022-03-08 06:39:00,Tristan,3.29,1,4425668,CKB -Amy,Tristan,2022-03-08 06:40:00,2022-03-08 06:45:00,Izabella,2954,7,4425668,CKB -Amy,Izabella,2022-03-08 06:52:00,2022-03-08 06:59:00,Tristan,3.29,1,4425668,CKB -Amy,Tristan,2022-03-08 07:00:00,2022-03-08 07:05:00,Izabella,2954,7,4425668,CKB -Amy,Izabella,2022-03-08 07:12:00,2022-03-08 07:19:00,Tristan,3.29,1,4425668,CKB -Amy,Tristan,2022-03-08 07:20:00,2022-03-08 07:25:00,Izabella,2954,7,4425668,CKB -Amy,Izabella,2022-03-08 07:32:00,2022-03-08 07:39:00,Tristan,3.29,1,4425668,CKB -Amy,Tristan,2022-03-08 07:40:00,2022-03-08 07:45:00,Izabella,2954,295,4425668,CKB -Amy,Izabella,2022-03-08 12:40:00,2022-03-08 12:47:00,Tristan,3.29,2,4425668,CKB -Amy,Tristan,2022-03-08 12:49:00,2022-03-08 12:54:00,Izabella,2954,46,4425668,CKB -Amy,Izabella,2022-03-08 13:40:00,2022-03-08 13:47:00,Tristan,3.29,2,4425668,CKB -Amy,Tristan,2022-03-08 13:49:00,2022-03-08 13:54:00,Izabella,2954,434,4425668,CKB -Amy,Izabella,2022-03-08 21:08:00,2022-03-08 21:08:00,Beckham,0.06,0,4425668,CKB -Matilda,Beckham,2022-03-08 07:20:00,2022-03-08 07:20:00,Izaiah,0.06,0,4448150,CKB -Matilda,Izaiah,2022-03-08 07:20:00,2022-03-08 07:50:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 08:00:00,2022-03-08 08:30:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 08:40:00,2022-03-08 09:10:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 09:20:00,2022-03-08 09:50:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 10:00:00,2022-03-08 10:30:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 10:40:00,2022-03-08 11:10:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 11:20:00,2022-03-08 11:50:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 12:00:00,2022-03-08 12:30:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 12:40:00,2022-03-08 13:10:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 13:20:00,2022-03-08 13:50:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 14:00:00,2022-03-08 14:30:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 14:40:00,2022-03-08 15:10:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 15:20:00,2022-03-08 15:50:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 16:00:00,2022-03-08 16:30:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 16:40:00,2022-03-08 17:10:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 17:20:00,2022-03-08 17:50:00,Izaiah,9266,10,4448150,CKB -Matilda,Izaiah,2022-03-08 18:00:00,2022-03-08 18:30:00,Izaiah,9266,0,4448150,CKB -Matilda,Izaiah,2022-03-08 18:30:00,2022-03-08 18:30:00,Beckham,0.06,0,4448150,CKB -Hailey,Beckham,2022-03-08 07:10:00,2022-03-08 07:10:00,Kaylani,0.06,0,4733895,CKB -Hailey,Kaylani,2022-03-08 07:10:00,2022-03-08 07:18:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 07:28:00,2022-03-08 07:40:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 07:40:00,2022-03-08 07:48:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 07:58:00,2022-03-08 08:10:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 08:10:00,2022-03-08 08:18:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 08:28:00,2022-03-08 08:40:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 08:40:00,2022-03-08 08:48:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 08:58:00,2022-03-08 09:10:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 09:10:00,2022-03-08 09:18:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 09:28:00,2022-03-08 09:40:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 09:40:00,2022-03-08 09:48:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 09:58:00,2022-03-08 10:10:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 10:10:00,2022-03-08 10:18:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 10:28:00,2022-03-08 10:40:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 10:40:00,2022-03-08 10:48:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 10:58:00,2022-03-08 11:10:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 11:10:00,2022-03-08 11:18:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 11:28:00,2022-03-08 11:40:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 11:40:00,2022-03-08 11:48:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 11:58:00,2022-03-08 12:10:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 12:10:00,2022-03-08 12:18:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 12:28:00,2022-03-08 12:40:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 12:40:00,2022-03-08 12:48:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 12:58:00,2022-03-08 13:10:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 13:10:00,2022-03-08 13:18:00,Cecilia,2169,10,4733895,CKB -Hailey,Cecilia,2022-03-08 13:28:00,2022-03-08 13:40:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 13:40:00,2022-03-08 13:48:00,Cecilia,2169,8,4733895,CKB -Hailey,Cecilia,2022-03-08 13:56:00,2022-03-08 14:10:00,Kaylani,2952,0,4733895,CKB -Hailey,Kaylani,2022-03-08 14:10:00,2022-03-08 14:19:00,Cecilia,2169,14,4733895,CKB -Hailey,Cecilia,2022-03-08 14:33:00,2022-03-08 14:47:00,Kaylani,2952,3,4733895,CKB -Hailey,Kaylani,2022-03-08 14:50:00,2022-03-08 14:59:00,Cecilia,2169,14,4733895,CKB -Hailey,Cecilia,2022-03-08 15:13:00,2022-03-08 15:27:00,Kaylani,2952,3,4733895,CKB -Hailey,Kaylani,2022-03-08 15:30:00,2022-03-08 15:39:00,Cecilia,2169,14,4733895,CKB -Hailey,Cecilia,2022-03-08 15:53:00,2022-03-08 16:07:00,Kaylani,2952,3,4733895,CKB -Hailey,Kaylani,2022-03-08 16:10:00,2022-03-08 16:19:00,Cecilia,2169,14,4733895,CKB -Hailey,Cecilia,2022-03-08 16:33:00,2022-03-08 16:47:00,Kaylani,2952,3,4733895,CKB -Hailey,Kaylani,2022-03-08 16:50:00,2022-03-08 16:59:00,Cecilia,2169,14,4733895,CKB -Hailey,Cecilia,2022-03-08 17:13:00,2022-03-08 17:27:00,Kaylani,2952,3,4733895,CKB -Hailey,Kaylani,2022-03-08 17:30:00,2022-03-08 17:39:00,Cecilia,2169,13,4733895,CKB -Hailey,Cecilia,2022-03-08 17:52:00,2022-03-08 18:05:00,Kaylani,2952,5,4733895,CKB -Hailey,Kaylani,2022-03-08 18:10:00,2022-03-08 18:18:00,Cecilia,2169,0,4733895,CKB -Hailey,Cecilia,2022-03-08 18:18:00,2022-03-08 18:18:00,Beckham,0.06,0,4733895,CKB -Hailey,Beckham,2022-03-08 14:13:00,2022-03-08 14:13:00,Cecilia,0.06,0,4734200,CKB -Hailey,Cecilia,2022-03-08 14:13:00,2022-03-08 14:27:00,Kaylani,2952,3,4734200,CKB -Hailey,Kaylani,2022-03-08 14:30:00,2022-03-08 14:39:00,Cecilia,2169,14,4734200,CKB -Hailey,Cecilia,2022-03-08 14:53:00,2022-03-08 15:07:00,Kaylani,2952,3,4734200,CKB -Hailey,Kaylani,2022-03-08 15:10:00,2022-03-08 15:19:00,Cecilia,2169,14,4734200,CKB -Hailey,Cecilia,2022-03-08 15:33:00,2022-03-08 15:47:00,Kaylani,2952,3,4734200,CKB -Hailey,Kaylani,2022-03-08 15:50:00,2022-03-08 15:59:00,Cecilia,2169,14,4734200,CKB -Hailey,Cecilia,2022-03-08 16:13:00,2022-03-08 16:27:00,Kaylani,2952,3,4734200,CKB -Hailey,Kaylani,2022-03-08 16:30:00,2022-03-08 16:39:00,Cecilia,2169,14,4734200,CKB -Hailey,Cecilia,2022-03-08 16:53:00,2022-03-08 17:07:00,Kaylani,2952,3,4734200,CKB -Hailey,Kaylani,2022-03-08 17:10:00,2022-03-08 17:19:00,Cecilia,2169,14,4734200,CKB -Hailey,Cecilia,2022-03-08 17:33:00,2022-03-08 17:47:00,Kaylani,2952,3,4734200,CKB -Hailey,Kaylani,2022-03-08 17:50:00,2022-03-08 17:59:00,Cecilia,2169,14,4734200,CKB -Hailey,Cecilia,2022-03-08 18:13:00,2022-03-08 18:25:00,Kaylani,2952,0,4734200,CKB -Hailey,Kaylani,2022-03-08 18:25:00,2022-03-08 18:25:00,Beckham,0.06,0,4734200,CKB -Matthias,Beckham,2022-03-09 00:23:00,2022-03-09 00:23:00,Addilyn,0.06,0,4318157,CKB -Matthias,Addilyn,2022-03-09 00:23:00,2022-03-09 00:30:00,Ari,2577,9,4318157,CKB -Ruby,Ari,2022-03-09 00:39:00,2022-03-09 00:54:00,Kobe,5937,9,4318157,CKB -Ruby,Kobe,2022-03-09 01:03:00,2022-03-09 01:17:00,Ari,6.19,0,4318157,CKB -Matthias,Ari,2022-03-09 01:17:00,2022-03-09 01:23:00,Addilyn,2555,0,4318157,CKB -Matthias,Addilyn,2022-03-09 01:23:00,2022-03-09 01:30:00,Ari,2577,9,4318157,CKB -Ruby,Ari,2022-03-09 01:39:00,2022-03-09 01:54:00,Kobe,5937,9,4318157,CKB -Ruby,Kobe,2022-03-09 02:03:00,2022-03-09 02:17:00,Ari,6.19,0,4318157,CKB -Matthias,Ari,2022-03-09 02:17:00,2022-03-09 02:23:00,Addilyn,2555,0,4318157,CKB -Matthias,Addilyn,2022-03-09 02:23:00,2022-03-09 02:30:00,Ari,2577,9,4318157,CKB -Ruby,Ari,2022-03-09 02:39:00,2022-03-09 02:54:00,Kobe,5937,9,4318157,CKB -Ruby,Kobe,2022-03-09 03:03:00,2022-03-09 03:17:00,Ari,6.19,0,4318157,CKB -Matthias,Ari,2022-03-09 03:17:00,2022-03-09 03:23:00,Addilyn,2555,0,4318157,CKB -Matthias,Addilyn,2022-03-09 03:23:00,2022-03-09 03:30:00,Ari,2577,9,4318157,CKB -Ruby,Ari,2022-03-09 03:39:00,2022-03-09 03:54:00,Kobe,5937,9,4318157,CKB -Ruby,Kobe,2022-03-09 04:03:00,2022-03-09 04:17:00,Ari,6.19,0,4318157,CKB -Matthias,Ari,2022-03-09 04:17:00,2022-03-09 04:23:00,Addilyn,2555,0,4318157,CKB -Matthias,Addilyn,2022-03-09 04:23:00,2022-03-09 04:23:00,Beckham,0.06,0,4318157,CKB -Ruby,Beckham,2022-03-09 00:33:00,2022-03-09 00:33:00,Kobe,0.06,0,4318177,CKB -Ruby,Kobe,2022-03-09 00:33:00,2022-03-09 00:47:00,Ari,6.19,0,4318177,CKB -Matthias,Ari,2022-03-09 00:47:00,2022-03-09 00:53:00,Addilyn,2555,0,4318177,CKB -Matthias,Addilyn,2022-03-09 00:53:00,2022-03-09 01:00:00,Ari,2577,9,4318177,CKB -Ruby,Ari,2022-03-09 01:09:00,2022-03-09 01:24:00,Kobe,5937,9,4318177,CKB -Ruby,Kobe,2022-03-09 01:33:00,2022-03-09 01:47:00,Ari,6.19,0,4318177,CKB -Matthias,Ari,2022-03-09 01:47:00,2022-03-09 01:53:00,Addilyn,2555,0,4318177,CKB -Matthias,Addilyn,2022-03-09 01:53:00,2022-03-09 02:00:00,Ari,2577,9,4318177,CKB -Ruby,Ari,2022-03-09 02:09:00,2022-03-09 02:24:00,Kobe,5937,9,4318177,CKB -Ruby,Kobe,2022-03-09 02:33:00,2022-03-09 02:47:00,Ari,6.19,0,4318177,CKB -Matthias,Ari,2022-03-09 02:47:00,2022-03-09 02:53:00,Addilyn,2555,0,4318177,CKB -Matthias,Addilyn,2022-03-09 02:53:00,2022-03-09 03:00:00,Ari,2577,9,4318177,CKB -Ruby,Ari,2022-03-09 03:09:00,2022-03-09 03:24:00,Kobe,5937,9,4318177,CKB -Ruby,Kobe,2022-03-09 03:33:00,2022-03-09 03:47:00,Ari,6.19,0,4318177,CKB -Matthias,Ari,2022-03-09 03:47:00,2022-03-09 03:53:00,Addilyn,2555,0,4318177,CKB -Matthias,Addilyn,2022-03-09 03:53:00,2022-03-09 04:00:00,Ari,2577,9,4318177,CKB -Ruby,Ari,2022-03-09 04:09:00,2022-03-09 04:24:00,Kobe,5937,0,4318177,CKB -Ruby,Kobe,2022-03-09 04:24:00,2022-03-09 04:24:00,Beckham,0.06,0,4318177,CKB -Rosie,Beckham,2022-03-09 00:57:00,2022-03-09 00:57:00,Lexi,0.06,0,4319352,CKB -Rosie,Lexi,2022-03-09 00:57:00,2022-03-09 01:06:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 01:06:00,2022-03-09 01:11:00,Lexi,2936,16,4319352,CKB -Rosie,Lexi,2022-03-09 01:27:00,2022-03-09 01:36:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 01:36:00,2022-03-09 01:41:00,Lexi,2936,16,4319352,CKB -Rosie,Lexi,2022-03-09 01:57:00,2022-03-09 02:06:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 02:06:00,2022-03-09 02:11:00,Lexi,2936,16,4319352,CKB -Rosie,Lexi,2022-03-09 02:27:00,2022-03-09 02:36:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 02:36:00,2022-03-09 02:41:00,Lexi,2936,16,4319352,CKB -Rosie,Lexi,2022-03-09 02:57:00,2022-03-09 03:06:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 03:06:00,2022-03-09 03:11:00,Lexi,2936,16,4319352,CKB -Rosie,Lexi,2022-03-09 03:27:00,2022-03-09 03:36:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 03:36:00,2022-03-09 03:41:00,Lexi,2936,16,4319352,CKB -Rosie,Lexi,2022-03-09 03:57:00,2022-03-09 04:06:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 04:06:00,2022-03-09 04:11:00,Lexi,2936,16,4319352,CKB -Rosie,Lexi,2022-03-09 04:27:00,2022-03-09 04:36:00,Colton,4343,0,4319352,CKB -Rosie,Colton,2022-03-09 04:36:00,2022-03-09 04:36:00,Beckham,0.06,0,4319352,CKB -Daxton,Beckham,2022-03-09 00:29:00,2022-03-09 00:29:00,Harper,0.06,0,4751087,CKB -Daxton,Harper,2022-03-09 00:29:00,2022-03-09 00:41:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 00:47:00,2022-03-09 00:57:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 00:59:00,2022-03-09 01:11:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 01:17:00,2022-03-09 01:27:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 01:29:00,2022-03-09 01:41:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 01:47:00,2022-03-09 01:57:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 01:59:00,2022-03-09 02:11:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 02:17:00,2022-03-09 02:27:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 02:29:00,2022-03-09 02:41:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 02:47:00,2022-03-09 02:57:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 02:59:00,2022-03-09 03:11:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 03:17:00,2022-03-09 03:27:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 03:29:00,2022-03-09 03:41:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 03:47:00,2022-03-09 03:57:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 03:59:00,2022-03-09 04:11:00,Calvin,4481,6,4751087,CKB -Daxton,Calvin,2022-03-09 04:17:00,2022-03-09 04:27:00,Harper,4031,2,4751087,CKB -Daxton,Harper,2022-03-09 04:29:00,2022-03-09 04:41:00,Calvin,4481,0,4751087,CKB -Daxton,Calvin,2022-03-09 04:41:00,2022-03-09 04:41:00,Beckham,0.06,0,4751087,CKB -Andy,Beckham,2022-03-09 00:30:00,2022-03-09 00:30:00,Harper,0.06,0,4453545,CKB -Andy,Harper,2022-03-09 00:30:00,2022-03-09 00:44:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 00:44:00,2022-03-09 00:57:00,Harper,5302,3,4453545,CKB -Andy,Harper,2022-03-09 01:00:00,2022-03-09 01:14:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 01:14:00,2022-03-09 01:27:00,Harper,5302,3,4453545,CKB -Andy,Harper,2022-03-09 01:30:00,2022-03-09 01:44:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 01:44:00,2022-03-09 01:57:00,Harper,5302,3,4453545,CKB -Andy,Harper,2022-03-09 02:00:00,2022-03-09 02:14:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 02:14:00,2022-03-09 02:27:00,Harper,5302,3,4453545,CKB -Andy,Harper,2022-03-09 02:30:00,2022-03-09 02:44:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 02:44:00,2022-03-09 02:57:00,Harper,5302,3,4453545,CKB -Andy,Harper,2022-03-09 03:00:00,2022-03-09 03:14:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 03:14:00,2022-03-09 03:27:00,Harper,5302,3,4453545,CKB -Andy,Harper,2022-03-09 03:30:00,2022-03-09 03:44:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 03:44:00,2022-03-09 03:57:00,Harper,5302,3,4453545,CKB -Andy,Harper,2022-03-09 04:00:00,2022-03-09 04:14:00,Elise,4801,0,4453545,CKB -Andy,Elise,2022-03-09 04:14:00,2022-03-09 04:27:00,Harper,5302,0,4453545,CKB -Andy,Harper,2022-03-09 04:27:00,2022-03-09 04:27:00,Beckham,0.06,0,4453545,CKB -Alex,Beckham,2022-03-09 00:43:00,2022-03-09 00:43:00,Chase,0.06,0,4374467,CKB -Alex,Chase,2022-03-09 00:43:00,2022-03-09 01:33:00,Chase,20434,10,4374467,CKB -Alex,Chase,2022-03-09 01:43:00,2022-03-09 02:33:00,Chase,20434,10,4374467,CKB -Alex,Chase,2022-03-09 02:43:00,2022-03-09 03:33:00,Chase,20434,10,4374467,CKB -Alex,Chase,2022-03-09 03:43:00,2022-03-09 04:33:00,Chase,20434,0,4374467,CKB -Alex,Chase,2022-03-09 04:33:00,2022-03-09 04:33:00,Beckham,0.06,0,4374467,CKB -Alex,Beckham,2022-03-09 00:13:00,2022-03-09 00:13:00,Chase,0.06,0,4374472,CKB -Alex,Chase,2022-03-09 00:13:00,2022-03-09 01:03:00,Chase,20434,10,4374472,CKB -Alex,Chase,2022-03-09 01:13:00,2022-03-09 02:03:00,Chase,20434,10,4374472,CKB -Alex,Chase,2022-03-09 02:13:00,2022-03-09 03:03:00,Chase,20434,10,4374472,CKB -Alex,Chase,2022-03-09 03:13:00,2022-03-09 04:03:00,Chase,20434,0,4374472,CKB -Alex,Chase,2022-03-09 04:03:00,2022-03-09 04:03:00,Beckham,0.06,0,4374472,CKB -Hazel,Beckham,2022-03-09 00:24:00,2022-03-09 00:24:00,Celine,0.06,0,4456448,CKB -Hazel,Celine,2022-03-09 00:24:00,2022-03-09 00:48:00,Kali,11.86,4,4456448,CKB -Hazel,Kali,2022-03-09 00:52:00,2022-03-09 01:14:00,Celine,11139,10,4456448,CKB -Hazel,Celine,2022-03-09 01:24:00,2022-03-09 01:48:00,Kali,11.86,4,4456448,CKB -Hazel,Kali,2022-03-09 01:52:00,2022-03-09 02:14:00,Celine,11139,10,4456448,CKB -Hazel,Celine,2022-03-09 02:24:00,2022-03-09 02:48:00,Kali,11.86,4,4456448,CKB -Hazel,Kali,2022-03-09 02:52:00,2022-03-09 03:14:00,Celine,11139,10,4456448,CKB -Hazel,Celine,2022-03-09 03:24:00,2022-03-09 03:48:00,Kali,11.86,4,4456448,CKB -Hazel,Kali,2022-03-09 03:52:00,2022-03-09 04:14:00,Celine,11139,0,4456448,CKB -Hazel,Celine,2022-03-09 04:14:00,2022-03-09 04:14:00,Beckham,0.06,0,4456448,CKB -Hazel,Beckham,2022-03-09 00:22:00,2022-03-09 00:22:00,Kali,0.06,0,4456456,CKB -Hazel,Kali,2022-03-09 00:22:00,2022-03-09 00:44:00,Celine,11139,10,4456456,CKB -Hazel,Celine,2022-03-09 00:54:00,2022-03-09 01:18:00,Kali,11.86,4,4456456,CKB -Hazel,Kali,2022-03-09 01:22:00,2022-03-09 01:44:00,Celine,11139,10,4456456,CKB -Hazel,Celine,2022-03-09 01:54:00,2022-03-09 02:18:00,Kali,11.86,4,4456456,CKB -Hazel,Kali,2022-03-09 02:22:00,2022-03-09 02:44:00,Celine,11139,10,4456456,CKB -Hazel,Celine,2022-03-09 02:54:00,2022-03-09 03:18:00,Kali,11.86,4,4456456,CKB -Hazel,Kali,2022-03-09 03:22:00,2022-03-09 03:44:00,Celine,11139,10,4456456,CKB -Hazel,Celine,2022-03-09 03:54:00,2022-03-09 04:18:00,Kali,11.86,4,4456456,CKB -Hazel,Kali,2022-03-09 04:22:00,2022-03-09 04:44:00,Celine,11139,0,4456456,CKB -Hazel,Celine,2022-03-09 04:44:00,2022-03-09 04:44:00,Beckham,0.06,0,4456456,CKB -Emilio,Beckham,2022-03-09 00:32:00,2022-03-09 00:32:00,Rose,0.06,0,4747650,CKB -Emilio,Rose,2022-03-09 00:32:00,2022-03-09 00:44:00,Brooklynn,4212,3,4747650,CKB -Emilio,Brooklynn,2022-03-09 00:47:00,2022-03-09 01:16:00,Francis,13048,0,4747650,CKB -Emilio,Francis,2022-03-09 01:16:00,2022-03-09 01:42:00,Brooklynn,12869,5,4747650,CKB -Emilio,Brooklynn,2022-03-09 01:47:00,2022-03-09 02:16:00,Francis,13048,0,4747650,CKB -Emilio,Francis,2022-03-09 02:16:00,2022-03-09 02:42:00,Brooklynn,12869,5,4747650,CKB -Emilio,Brooklynn,2022-03-09 02:47:00,2022-03-09 03:16:00,Francis,13048,0,4747650,CKB -Emilio,Francis,2022-03-09 03:16:00,2022-03-09 03:42:00,Brooklynn,12869,5,4747650,CKB -Emilio,Brooklynn,2022-03-09 03:47:00,2022-03-09 04:16:00,Francis,13048,0,4747650,CKB -Emilio,Francis,2022-03-09 04:16:00,2022-03-09 04:34:00,Gia,9538,0,4747650,CKB -Emilio,Gia,2022-03-09 04:34:00,2022-03-09 04:34:00,Beckham,0.06,0,4747650,CKB -Emilio,Beckham,2022-03-09 00:17:00,2022-03-09 00:17:00,Brooklynn,0.06,0,4747660,CKB -Emilio,Brooklynn,2022-03-09 00:17:00,2022-03-09 00:46:00,Francis,13048,0,4747660,CKB -Emilio,Francis,2022-03-09 00:46:00,2022-03-09 01:12:00,Brooklynn,12869,5,4747660,CKB -Emilio,Brooklynn,2022-03-09 01:17:00,2022-03-09 01:46:00,Francis,13048,0,4747660,CKB -Emilio,Francis,2022-03-09 01:46:00,2022-03-09 02:12:00,Brooklynn,12869,5,4747660,CKB -Emilio,Brooklynn,2022-03-09 02:17:00,2022-03-09 02:46:00,Francis,13048,0,4747660,CKB -Emilio,Francis,2022-03-09 02:46:00,2022-03-09 03:12:00,Brooklynn,12869,5,4747660,CKB -Emilio,Brooklynn,2022-03-09 03:17:00,2022-03-09 03:46:00,Francis,13048,0,4747660,CKB -Emilio,Francis,2022-03-09 03:46:00,2022-03-09 04:12:00,Brooklynn,12869,5,4747660,CKB -Emilio,Brooklynn,2022-03-09 04:17:00,2022-03-09 04:28:00,Rose,4316,0,4747660,CKB -Emilio,Rose,2022-03-09 04:28:00,2022-03-09 04:28:00,Beckham,0.06,0,4747660,CKB -Ryder,Beckham,2022-03-09 00:49:00,2022-03-09 00:49:00,Kehlani,0.06,0,4434341,CKB -Ryder,Kehlani,2022-03-09 00:49:00,2022-03-09 01:04:00,Ariyah,10229,0,4434341,CKB -Ryder,Ariyah,2022-03-09 01:04:00,2022-03-09 01:19:00,Kehlani,11801,0,4434341,CKB -Ryder,Kehlani,2022-03-09 01:19:00,2022-03-09 01:34:00,Ariyah,10229,0,4434341,CKB -Ryder,Ariyah,2022-03-09 01:34:00,2022-03-09 01:49:00,Kehlani,11801,0,4434341,CKB -Ryder,Kehlani,2022-03-09 01:49:00,2022-03-09 02:04:00,Ariyah,10229,0,4434341,CKB -Ryder,Ariyah,2022-03-09 02:04:00,2022-03-09 02:19:00,Kehlani,11801,0,4434341,CKB -Ryder,Kehlani,2022-03-09 02:19:00,2022-03-09 02:34:00,Ariyah,10229,0,4434341,CKB -Ryder,Ariyah,2022-03-09 02:34:00,2022-03-09 02:49:00,Kehlani,11801,0,4434341,CKB -Ryder,Kehlani,2022-03-09 02:49:00,2022-03-09 03:04:00,Ariyah,10229,0,4434341,CKB -Ryder,Ariyah,2022-03-09 03:04:00,2022-03-09 03:19:00,Kehlani,11801,0,4434341,CKB -Ryder,Kehlani,2022-03-09 03:19:00,2022-03-09 03:34:00,Ariyah,10229,0,4434341,CKB -Ryder,Ariyah,2022-03-09 03:34:00,2022-03-09 03:49:00,Kehlani,11801,0,4434341,CKB -Ryder,Kehlani,2022-03-09 03:49:00,2022-03-09 04:04:00,Ariyah,10229,0,4434341,CKB -Ryder,Ariyah,2022-03-09 04:04:00,2022-03-09 04:19:00,Kehlani,11801,23,4434341,CKB -Kian,Kehlani,2022-03-09 04:42:00,2022-03-09 05:04:00,Finley,6.81,0,4434341,CKB -Kian,Finley,2022-03-09 05:04:00,2022-03-09 05:04:00,Beckham,0.06,0,4434341,CKB -Jake,Beckham,2022-03-09 00:32:00,2022-03-09 00:32:00,Rose,0.06,0,4434897,CKB -Jake,Rose,2022-03-09 00:32:00,2022-03-09 00:57:00,Kamila,11545,6,4434897,CKB -Jake,Kamila,2022-03-09 01:03:00,2022-03-09 01:46:00,Kayleigh,20579,1,4434897,CKB -Jake,Kayleigh,2022-03-09 01:47:00,2022-03-09 02:25:00,Kamila,20641,8,4434897,CKB -Jake,Kamila,2022-03-09 02:33:00,2022-03-09 03:16:00,Kayleigh,20579,1,4434897,CKB -Jake,Kayleigh,2022-03-09 03:17:00,2022-03-09 03:55:00,Kamila,20641,8,4434897,CKB -Jake,Kamila,2022-03-09 04:03:00,2022-03-09 04:28:00,Rose,11499,0,4434897,CKB -Jake,Rose,2022-03-09 04:28:00,2022-03-09 04:28:00,Beckham,0.06,0,4434897,CKB -Jake,Beckham,2022-03-09 00:33:00,2022-03-09 00:33:00,Kamila,0.06,0,4434902,CKB -Jake,Kamila,2022-03-09 00:33:00,2022-03-09 01:16:00,Kayleigh,20579,1,4434902,CKB -Jake,Kayleigh,2022-03-09 01:17:00,2022-03-09 01:55:00,Kamila,20641,8,4434902,CKB -Jake,Kamila,2022-03-09 02:03:00,2022-03-09 02:46:00,Kayleigh,20579,1,4434902,CKB -Jake,Kayleigh,2022-03-09 02:47:00,2022-03-09 03:25:00,Kamila,20641,8,4434902,CKB -Jake,Kamila,2022-03-09 03:33:00,2022-03-09 04:16:00,Kayleigh,20579,1,4434902,CKB -Jake,Kayleigh,2022-03-09 04:17:00,2022-03-09 04:51:00,Willa,18752,0,4434902,CKB -Jake,Willa,2022-03-09 04:51:00,2022-03-09 04:51:00,Beckham,0.06,0,4434902,CKB -Aziel,Beckham,2022-03-09 00:34:00,2022-03-09 00:34:00,Miles,0.06,0,4619766,CKB -Aziel,Miles,2022-03-09 00:34:00,2022-03-09 01:00:00,Delilah,9016,0,4619766,CKB -Aziel,Delilah,2022-03-09 01:00:00,2022-03-09 01:27:00,Miles,10083,7,4619766,CKB -Aziel,Miles,2022-03-09 01:34:00,2022-03-09 02:00:00,Delilah,9016,0,4619766,CKB -Aziel,Delilah,2022-03-09 02:00:00,2022-03-09 02:27:00,Miles,10083,7,4619766,CKB -Aziel,Miles,2022-03-09 02:34:00,2022-03-09 03:00:00,Delilah,9016,0,4619766,CKB -Aziel,Delilah,2022-03-09 03:00:00,2022-03-09 03:27:00,Miles,10083,7,4619766,CKB -Aziel,Miles,2022-03-09 03:34:00,2022-03-09 04:00:00,Delilah,9016,0,4619766,CKB -Aziel,Delilah,2022-03-09 04:00:00,2022-03-09 04:27:00,Miles,10083,0,4619766,CKB -Aziel,Miles,2022-03-09 04:27:00,2022-03-09 04:27:00,Beckham,0.06,0,4619766,CKB -Aziel,Beckham,2022-03-09 00:30:00,2022-03-09 00:30:00,Delilah,0.06,0,4619991,CKB -Aziel,Delilah,2022-03-09 00:30:00,2022-03-09 00:57:00,Miles,10083,7,4619991,CKB -Aziel,Miles,2022-03-09 01:04:00,2022-03-09 01:30:00,Delilah,9016,0,4619991,CKB -Aziel,Delilah,2022-03-09 01:30:00,2022-03-09 01:57:00,Miles,10083,7,4619991,CKB -Aziel,Miles,2022-03-09 02:04:00,2022-03-09 02:30:00,Delilah,9016,0,4619991,CKB -Aziel,Delilah,2022-03-09 02:30:00,2022-03-09 02:57:00,Miles,10083,7,4619991,CKB -Aziel,Miles,2022-03-09 03:04:00,2022-03-09 03:30:00,Delilah,9016,0,4619991,CKB -Aziel,Delilah,2022-03-09 03:30:00,2022-03-09 03:57:00,Miles,10083,7,4619991,CKB -Aziel,Miles,2022-03-09 04:04:00,2022-03-09 04:30:00,Delilah,9016,0,4619991,CKB -Aziel,Delilah,2022-03-09 04:30:00,2022-03-09 04:57:00,Miles,10083,0,4619991,CKB -Aziel,Miles,2022-03-09 04:57:00,2022-03-09 04:57:00,Beckham,0.06,0,4619991,CKB -Dalton,Beckham,2022-03-09 00:31:00,2022-03-09 00:31:00,Kamila,0.06,0,4374744,CKB -Dalton,Kamila,2022-03-09 00:31:00,2022-03-09 00:44:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 00:44:00,2022-03-09 00:56:00,Kamila,5362,5,4374744,CKB -Dalton,Kamila,2022-03-09 01:01:00,2022-03-09 01:14:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 01:14:00,2022-03-09 01:26:00,Kamila,5362,5,4374744,CKB -Dalton,Kamila,2022-03-09 01:31:00,2022-03-09 01:44:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 01:44:00,2022-03-09 01:56:00,Kamila,5362,5,4374744,CKB -Dalton,Kamila,2022-03-09 02:01:00,2022-03-09 02:14:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 02:14:00,2022-03-09 02:26:00,Kamila,5362,5,4374744,CKB -Dalton,Kamila,2022-03-09 02:31:00,2022-03-09 02:44:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 02:44:00,2022-03-09 02:56:00,Kamila,5362,5,4374744,CKB -Dalton,Kamila,2022-03-09 03:01:00,2022-03-09 03:14:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 03:14:00,2022-03-09 03:26:00,Kamila,5362,5,4374744,CKB -Dalton,Kamila,2022-03-09 03:31:00,2022-03-09 03:44:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 03:44:00,2022-03-09 03:56:00,Kamila,5362,5,4374744,CKB -Dalton,Kamila,2022-03-09 04:01:00,2022-03-09 04:14:00,Veronica,4872,0,4374744,CKB -Dalton,Veronica,2022-03-09 04:14:00,2022-03-09 04:26:00,Kamila,5362,0,4374744,CKB -Dalton,Kamila,2022-03-09 04:26:00,2022-03-09 04:26:00,Beckham,0.06,0,4374744,CKB -Jamison,Beckham,2022-03-09 00:31:00,2022-03-09 00:31:00,Kamila,0.06,0,4374866,CKB -Jamison,Kamila,2022-03-09 00:31:00,2022-03-09 00:45:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 00:47:00,2022-03-09 01:01:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 01:01:00,2022-03-09 01:15:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 01:17:00,2022-03-09 01:31:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 01:31:00,2022-03-09 01:45:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 01:47:00,2022-03-09 02:01:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 02:01:00,2022-03-09 02:15:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 02:17:00,2022-03-09 02:31:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 02:31:00,2022-03-09 02:45:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 02:47:00,2022-03-09 03:01:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 03:01:00,2022-03-09 03:15:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 03:17:00,2022-03-09 03:31:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 03:31:00,2022-03-09 03:45:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 03:47:00,2022-03-09 04:01:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 04:01:00,2022-03-09 04:15:00,Liana,5225,2,4374866,CKB -Jamison,Liana,2022-03-09 04:17:00,2022-03-09 04:31:00,Kamila,7617,0,4374866,CKB -Jamison,Kamila,2022-03-09 04:31:00,2022-03-09 04:31:00,Beckham,0.06,0,4374866,CKB -Keegan,Beckham,2022-03-09 00:43:00,2022-03-09 00:43:00,Charleigh,0.06,0,4375013,CKB -Keegan,Charleigh,2022-03-09 00:43:00,2022-03-09 00:53:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 00:53:00,2022-03-09 01:03:00,Charleigh,4408,10,4375013,CKB -Keegan,Charleigh,2022-03-09 01:13:00,2022-03-09 01:23:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 01:23:00,2022-03-09 01:33:00,Charleigh,4408,10,4375013,CKB -Keegan,Charleigh,2022-03-09 01:43:00,2022-03-09 01:53:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 01:53:00,2022-03-09 02:03:00,Charleigh,4408,10,4375013,CKB -Keegan,Charleigh,2022-03-09 02:13:00,2022-03-09 02:23:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 02:23:00,2022-03-09 02:33:00,Charleigh,4408,10,4375013,CKB -Keegan,Charleigh,2022-03-09 02:43:00,2022-03-09 02:53:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 02:53:00,2022-03-09 03:03:00,Charleigh,4408,10,4375013,CKB -Keegan,Charleigh,2022-03-09 03:13:00,2022-03-09 03:23:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 03:23:00,2022-03-09 03:33:00,Charleigh,4408,10,4375013,CKB -Keegan,Charleigh,2022-03-09 03:43:00,2022-03-09 03:53:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 03:53:00,2022-03-09 04:03:00,Charleigh,4408,10,4375013,CKB -Keegan,Charleigh,2022-03-09 04:13:00,2022-03-09 04:23:00,Eli,4507,0,4375013,CKB -Keegan,Eli,2022-03-09 04:23:00,2022-03-09 04:33:00,Charleigh,4408,0,4375013,CKB -Keegan,Charleigh,2022-03-09 04:33:00,2022-03-09 04:33:00,Beckham,0.06,0,4375013,CKB -Ayaan,Beckham,2022-03-09 21:31:00,2022-03-09 21:31:00,Kalani,0.06,0,4454945,CKB -Ayaan,Kalani,2022-03-09 21:31:00,2022-03-09 22:04:00,Brian,14519,4,4454945,CKB -Ayaan,Brian,2022-03-09 22:08:00,2022-03-09 22:43:00,Kalani,13541,8,4454945,CKB -Ayaan,Kalani,2022-03-09 22:51:00,2022-03-09 23:24:00,Brian,14519,4,4454945,CKB -Ayaan,Brian,2022-03-09 23:28:00,2022-03-10 00:03:00,Kalani,13541,8,4454945,CKB -Ayaan,Kalani,2022-03-10 00:11:00,2022-03-10 00:44:00,Brian,14519,0,4454945,CKB -Hunter,Brian,2022-03-10 00:44:00,2022-03-10 00:54:00,Kehlani,4.1,25,4454945,CKB -Hunter,Kehlani,2022-03-10 01:19:00,2022-03-10 01:42:00,Ayden,8.36,6,4454945,CKB -Hunter,Ayden,2022-03-10 01:48:00,2022-03-10 02:06:00,Kehlani,9067,13,4454945,CKB -Hunter,Kehlani,2022-03-10 02:19:00,2022-03-10 02:42:00,Ayden,8.36,6,4454945,CKB -Hunter,Ayden,2022-03-10 02:48:00,2022-03-10 03:06:00,Kehlani,9067,13,4454945,CKB -Hunter,Kehlani,2022-03-10 03:19:00,2022-03-10 03:42:00,Ayden,8.36,6,4454945,CKB -Hunter,Ayden,2022-03-10 03:48:00,2022-03-10 04:06:00,Kehlani,9067,0,4454945,CKB -Hunter,Kehlani,2022-03-10 04:06:00,2022-03-10 04:06:00,Beckham,0.06,0,4454945,CKB -Ayaan,Beckham,2022-03-09 22:11:00,2022-03-09 22:11:00,Kalani,0.06,0,4454950,CKB -Ayaan,Kalani,2022-03-09 22:11:00,2022-03-09 22:44:00,Brian,14519,4,4454950,CKB -Ayaan,Brian,2022-03-09 22:48:00,2022-03-09 23:23:00,Kalani,13541,8,4454950,CKB -Ayaan,Kalani,2022-03-09 23:31:00,2022-03-10 00:04:00,Brian,14519,4,4454950,CKB -Ayaan,Brian,2022-03-10 00:08:00,2022-03-10 00:39:00,Leonel,12213,0,4454950,CKB -Hunter,Leonel,2022-03-10 00:39:00,2022-03-10 00:47:00,Kehlani,4.0,2,4454950,CKB -Hunter,Kehlani,2022-03-10 00:49:00,2022-03-10 01:12:00,Ayden,8.36,6,4454950,CKB -Hunter,Ayden,2022-03-10 01:18:00,2022-03-10 01:36:00,Kehlani,9067,13,4454950,CKB -Hunter,Kehlani,2022-03-10 01:49:00,2022-03-10 02:12:00,Ayden,8.36,6,4454950,CKB -Hunter,Ayden,2022-03-10 02:18:00,2022-03-10 02:36:00,Kehlani,9067,13,4454950,CKB -Hunter,Kehlani,2022-03-10 02:49:00,2022-03-10 03:12:00,Ayden,8.36,6,4454950,CKB -Hunter,Ayden,2022-03-10 03:18:00,2022-03-10 03:36:00,Kehlani,9067,13,4454950,CKB -Hunter,Kehlani,2022-03-10 03:49:00,2022-03-10 04:12:00,Ayden,8.36,0,4454950,CKB -Hunter,Ayden,2022-03-10 04:12:00,2022-03-10 04:12:00,Beckham,0.06,0,4454950,CKB -Donovan,Beckham,2022-03-09 21:06:00,2022-03-09 21:06:00,Pierce,0.06,0,4664624,CKB -Donovan,Pierce,2022-03-09 21:06:00,2022-03-09 21:34:00,Leonardo,13018,19,4664624,CKB -Donovan,Leonardo,2022-03-09 21:53:00,2022-03-09 22:13:00,Kamryn,10332,17,4664624,CKB -Donovan,Kamryn,2022-03-09 22:30:00,2022-03-09 22:54:00,Leonardo,10.48,19,4664624,CKB -Donovan,Leonardo,2022-03-09 23:13:00,2022-03-09 23:33:00,Kamryn,10332,17,4664624,CKB -Donovan,Kamryn,2022-03-09 23:50:00,2022-03-10 00:14:00,Leonardo,10.48,2,4664624,CKB -Donovan,Leonardo,2022-03-10 00:16:00,2022-03-10 00:23:00,Melanie,3709,5,4664624,CKB -Zoey,Melanie,2022-03-10 00:28:00,2022-03-10 00:44:00,Brinley,6404,3,4664624,CKB -Zoey,Brinley,2022-03-10 00:47:00,2022-03-10 01:10:00,Finn,10579,7,4664624,CKB -Zoey,Finn,2022-03-10 01:17:00,2022-03-10 01:44:00,Brinley,12007,3,4664624,CKB -Zoey,Brinley,2022-03-10 01:47:00,2022-03-10 02:10:00,Finn,10579,7,4664624,CKB -Zoey,Finn,2022-03-10 02:17:00,2022-03-10 02:44:00,Brinley,12007,3,4664624,CKB -Zoey,Brinley,2022-03-10 02:47:00,2022-03-10 03:10:00,Finn,10579,7,4664624,CKB -Zoey,Finn,2022-03-10 03:17:00,2022-03-10 03:44:00,Brinley,12007,3,4664624,CKB -Zoey,Brinley,2022-03-10 03:47:00,2022-03-10 04:10:00,Finn,10579,7,4664624,CKB -Zoey,Finn,2022-03-10 04:17:00,2022-03-10 04:44:00,Brinley,12007,0,4664624,CKB -Zoey,Brinley,2022-03-10 04:44:00,2022-03-10 04:44:00,Beckham,0.06,0,4664624,CKB -Donovan,Beckham,2022-03-09 20:26:00,2022-03-09 20:26:00,Pierce,0.06,0,4762734,CKB -Donovan,Pierce,2022-03-09 20:26:00,2022-03-09 20:56:00,Ezra,14097,14,4762734,CKB -Donovan,Ezra,2022-03-09 21:10:00,2022-03-09 21:38:00,Pierce,13.19,8,4762734,CKB -Donovan,Pierce,2022-03-09 21:46:00,2022-03-09 22:14:00,Leonardo,13018,19,4762734,CKB -Donovan,Leonardo,2022-03-09 22:33:00,2022-03-09 22:53:00,Kamryn,10332,17,4762734,CKB -Donovan,Kamryn,2022-03-09 23:10:00,2022-03-09 23:34:00,Leonardo,10.48,19,4762734,CKB -Donovan,Leonardo,2022-03-09 23:53:00,2022-03-10 00:13:00,Kamryn,10332,2,4762734,CKB -Donovan,Kamryn,2022-03-10 00:15:00,2022-03-10 00:16:00,Brinley,506,1,4762734,CKB -Zoey,Brinley,2022-03-10 00:17:00,2022-03-10 00:40:00,Finn,10579,7,4762734,CKB -Zoey,Finn,2022-03-10 00:47:00,2022-03-10 01:14:00,Brinley,12007,3,4762734,CKB -Zoey,Brinley,2022-03-10 01:17:00,2022-03-10 01:40:00,Finn,10579,7,4762734,CKB -Zoey,Finn,2022-03-10 01:47:00,2022-03-10 02:14:00,Brinley,12007,3,4762734,CKB -Zoey,Brinley,2022-03-10 02:17:00,2022-03-10 02:40:00,Finn,10579,7,4762734,CKB -Zoey,Finn,2022-03-10 02:47:00,2022-03-10 03:14:00,Brinley,12007,3,4762734,CKB -Zoey,Brinley,2022-03-10 03:17:00,2022-03-10 03:40:00,Finn,10579,7,4762734,CKB -Zoey,Finn,2022-03-10 03:47:00,2022-03-10 04:14:00,Brinley,12007,3,4762734,CKB -Zoey,Brinley,2022-03-10 04:17:00,2022-03-10 04:40:00,Finn,10579,3,4762734,CKB -Jackson,Finn,2022-03-10 04:43:00,2022-03-10 04:58:00,Rose,6161,0,4762734,CKB -Jackson,Rose,2022-03-10 04:58:00,2022-03-10 04:58:00,Beckham,0.06,0,4762734,CKB -Avery,Beckham,2022-03-09 22:56:00,2022-03-09 22:56:00,Jace,0.06,0,4617415,CKB -Avery,Jace,2022-03-09 22:56:00,2022-03-09 23:08:00,Nathan,5882,3,4617415,CKB -Avery,Nathan,2022-03-09 23:11:00,2022-03-09 23:25:00,Jace,6232,0,4617415,CKB -Avery,Jace,2022-03-09 23:25:00,2022-03-09 23:38:00,Nathan,6086,3,4617415,CKB -Avery,Nathan,2022-03-09 23:41:00,2022-03-09 23:55:00,Jace,6232,0,4617415,CKB -Avery,Jace,2022-03-09 23:55:00,2022-03-10 00:08:00,Nathan,6086,0,4617415,CKB -Avery,Nathan,2022-03-10 00:08:00,2022-03-10 00:08:00,Beckham,0.06,0,4617415,CKB -Richard,Beckham,2022-03-09 05:05:00,2022-03-09 05:05:00,Ariyah,0.06,0,4426846,CKB -Richard,Ariyah,2022-03-09 05:05:00,2022-03-09 05:14:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 05:14:00,2022-03-09 05:23:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 05:25:00,2022-03-09 05:34:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 05:34:00,2022-03-09 05:43:00,Ariyah,5139,23,4426846,CKB -Richard,Ariyah,2022-03-09 06:06:00,2022-03-09 06:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 06:15:00,2022-03-09 06:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 06:26:00,2022-03-09 06:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 06:35:00,2022-03-09 06:44:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 06:46:00,2022-03-09 06:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 06:55:00,2022-03-09 07:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 07:06:00,2022-03-09 07:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 07:15:00,2022-03-09 07:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 07:26:00,2022-03-09 07:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 07:35:00,2022-03-09 07:44:00,Ariyah,5139,22,4426846,CKB -Richard,Ariyah,2022-03-09 08:06:00,2022-03-09 08:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 08:15:00,2022-03-09 08:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 08:26:00,2022-03-09 08:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 08:35:00,2022-03-09 08:44:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 08:46:00,2022-03-09 08:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 08:55:00,2022-03-09 09:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 09:06:00,2022-03-09 09:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 09:15:00,2022-03-09 09:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 09:26:00,2022-03-09 09:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 09:35:00,2022-03-09 09:44:00,Ariyah,5139,22,4426846,CKB -Richard,Ariyah,2022-03-09 10:06:00,2022-03-09 10:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 10:15:00,2022-03-09 10:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 10:26:00,2022-03-09 10:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 10:35:00,2022-03-09 10:44:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 10:46:00,2022-03-09 10:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 10:55:00,2022-03-09 11:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 11:06:00,2022-03-09 11:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 11:15:00,2022-03-09 11:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 11:26:00,2022-03-09 11:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 11:35:00,2022-03-09 11:44:00,Ariyah,5139,22,4426846,CKB -Richard,Ariyah,2022-03-09 12:06:00,2022-03-09 12:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 12:15:00,2022-03-09 12:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 12:26:00,2022-03-09 12:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 12:35:00,2022-03-09 12:44:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 12:46:00,2022-03-09 12:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 12:55:00,2022-03-09 13:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 13:06:00,2022-03-09 13:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 13:15:00,2022-03-09 13:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 13:26:00,2022-03-09 13:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 13:35:00,2022-03-09 13:44:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 13:46:00,2022-03-09 13:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 13:55:00,2022-03-09 14:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 14:06:00,2022-03-09 14:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 14:15:00,2022-03-09 14:24:00,Ariyah,5139,22,4426846,CKB -Richard,Ariyah,2022-03-09 14:46:00,2022-03-09 14:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 14:55:00,2022-03-09 15:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 15:06:00,2022-03-09 15:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 15:15:00,2022-03-09 15:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 15:26:00,2022-03-09 15:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 15:35:00,2022-03-09 15:44:00,Ariyah,5139,22,4426846,CKB -Richard,Ariyah,2022-03-09 16:06:00,2022-03-09 16:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 16:15:00,2022-03-09 16:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 16:26:00,2022-03-09 16:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 16:35:00,2022-03-09 16:44:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 16:46:00,2022-03-09 16:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 16:55:00,2022-03-09 17:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 17:06:00,2022-03-09 17:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 17:15:00,2022-03-09 17:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 17:26:00,2022-03-09 17:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 17:35:00,2022-03-09 17:44:00,Ariyah,5139,22,4426846,CKB -Richard,Ariyah,2022-03-09 18:06:00,2022-03-09 18:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 18:15:00,2022-03-09 18:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 18:26:00,2022-03-09 18:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 18:35:00,2022-03-09 18:44:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 18:46:00,2022-03-09 18:55:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 18:55:00,2022-03-09 19:04:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 19:06:00,2022-03-09 19:15:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 19:15:00,2022-03-09 19:24:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 19:26:00,2022-03-09 19:35:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 19:35:00,2022-03-09 19:44:00,Ariyah,5139,21,4426846,CKB -Richard,Ariyah,2022-03-09 20:05:00,2022-03-09 20:14:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 20:14:00,2022-03-09 20:23:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 20:25:00,2022-03-09 20:34:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 20:34:00,2022-03-09 20:43:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 20:45:00,2022-03-09 20:54:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 20:54:00,2022-03-09 21:03:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 21:05:00,2022-03-09 21:14:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 21:14:00,2022-03-09 21:23:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 21:25:00,2022-03-09 21:34:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 21:34:00,2022-03-09 21:43:00,Ariyah,5139,22,4426846,CKB -Richard,Ariyah,2022-03-09 22:05:00,2022-03-09 22:14:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 22:14:00,2022-03-09 22:23:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 22:25:00,2022-03-09 22:34:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 22:34:00,2022-03-09 22:43:00,Ariyah,5139,2,4426846,CKB -Richard,Ariyah,2022-03-09 22:45:00,2022-03-09 22:54:00,Jaden,4781,0,4426846,CKB -Richard,Jaden,2022-03-09 22:54:00,2022-03-09 23:03:00,Ariyah,5139,0,4426846,CKB -Richard,Ariyah,2022-03-09 23:03:00,2022-03-09 23:03:00,Beckham,0.06,0,4426846,CKB -Ezekiel,Beckham,2022-03-10 00:06:00,2022-03-10 00:06:00,Erik,0.06,0,4708596,CKB -Ezekiel,Erik,2022-03-10 00:06:00,2022-03-10 00:27:00,Memphis,7827,0,4708596,CKB -Jake,Memphis,2022-03-10 00:27:00,2022-03-10 00:48:00,Kayleigh,11079,0,4708596,CKB -Jake,Kayleigh,2022-03-10 00:48:00,2022-03-10 01:25:00,Kamila,20641,8,4708596,CKB -Jake,Kamila,2022-03-10 01:33:00,2022-03-10 02:16:00,Kayleigh,20579,1,4708596,CKB -Jake,Kayleigh,2022-03-10 02:17:00,2022-03-10 02:55:00,Kamila,20641,8,4708596,CKB -Jake,Kamila,2022-03-10 03:03:00,2022-03-10 03:46:00,Kayleigh,20579,1,4708596,CKB -Jake,Kayleigh,2022-03-10 03:47:00,2022-03-10 04:25:00,Kamila,20641,0,4708596,CKB -Jake,Kamila,2022-03-10 04:25:00,2022-03-10 04:25:00,Beckham,0.06,0,4708596,CKB -Astrid,King,2022-03-09 05:15:00,2022-03-09 06:01:00,Brayden,17.9,0,4317626,VDL -Astrid,Brayden,2022-03-09 06:01:00,2022-03-09 06:15:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 06:23:00,2022-03-09 06:37:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 06:41:00,2022-03-09 06:55:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 07:03:00,2022-03-09 07:17:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 07:21:00,2022-03-09 07:35:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 07:43:00,2022-03-09 07:57:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 08:01:00,2022-03-09 08:15:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 08:23:00,2022-03-09 08:37:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 08:41:00,2022-03-09 08:55:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 09:03:00,2022-03-09 09:17:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 09:21:00,2022-03-09 09:35:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 09:43:00,2022-03-09 09:57:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 10:01:00,2022-03-09 10:15:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 10:23:00,2022-03-09 10:37:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 10:41:00,2022-03-09 10:55:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 11:03:00,2022-03-09 11:17:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 11:21:00,2022-03-09 11:35:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 11:43:00,2022-03-09 11:57:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 12:01:00,2022-03-09 12:15:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 12:23:00,2022-03-09 12:37:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 12:41:00,2022-03-09 12:55:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 13:03:00,2022-03-09 13:17:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 13:21:00,2022-03-09 13:35:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 13:43:00,2022-03-09 13:57:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 14:01:00,2022-03-09 14:15:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 14:23:00,2022-03-09 14:37:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 14:41:00,2022-03-09 14:55:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 15:03:00,2022-03-09 15:17:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 15:21:00,2022-03-09 15:35:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 15:43:00,2022-03-09 15:57:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 16:01:00,2022-03-09 16:15:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 16:23:00,2022-03-09 16:37:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 16:41:00,2022-03-09 16:55:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 17:03:00,2022-03-09 17:17:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 17:21:00,2022-03-09 17:35:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 17:43:00,2022-03-09 17:57:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 18:01:00,2022-03-09 18:15:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 18:23:00,2022-03-09 18:37:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 18:41:00,2022-03-09 18:55:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 19:03:00,2022-03-09 19:17:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 19:21:00,2022-03-09 19:35:00,Brayden,4637,8,4317626,VDL -Astrid,Brayden,2022-03-09 19:43:00,2022-03-09 19:57:00,Brayden,4637,4,4317626,VDL -Astrid,Brayden,2022-03-09 20:01:00,2022-03-09 20:14:00,Brayden,4637,9,4317626,VDL -Astrid,Brayden,2022-03-09 20:23:00,2022-03-09 20:36:00,Brayden,4637,0,4317626,VDL -Astrid,Brayden,2022-03-09 20:36:00,2022-03-09 21:15:00,King,19.8,0,4317626,VDL -Amy,Beckham,2022-03-09 04:56:00,2022-03-09 04:56:00,Izabella,0.06,18,4425669,CKB -Amy,Izabella,2022-03-09 05:14:00,2022-03-09 05:20:00,Tristan,3.29,0,4425669,CKB -Amy,Tristan,2022-03-09 05:20:00,2022-03-09 05:24:00,Izabella,2954,20,4425669,CKB -Amy,Izabella,2022-03-09 05:44:00,2022-03-09 05:50:00,Tristan,3.29,0,4425669,CKB -Amy,Tristan,2022-03-09 05:50:00,2022-03-09 05:54:00,Izabella,2954,5,4425669,CKB -Amy,Izabella,2022-03-09 05:59:00,2022-03-09 06:06:00,Tristan,3.29,2,4425669,CKB -Amy,Tristan,2022-03-09 06:08:00,2022-03-09 06:13:00,Izabella,2954,19,4425669,CKB -Amy,Izabella,2022-03-09 06:32:00,2022-03-09 06:39:00,Tristan,3.29,1,4425669,CKB -Amy,Tristan,2022-03-09 06:40:00,2022-03-09 06:45:00,Izabella,2954,7,4425669,CKB -Amy,Izabella,2022-03-09 06:52:00,2022-03-09 06:59:00,Tristan,3.29,1,4425669,CKB -Amy,Tristan,2022-03-09 07:00:00,2022-03-09 07:05:00,Izabella,2954,7,4425669,CKB -Amy,Izabella,2022-03-09 07:12:00,2022-03-09 07:19:00,Tristan,3.29,1,4425669,CKB -Amy,Tristan,2022-03-09 07:20:00,2022-03-09 07:25:00,Izabella,2954,7,4425669,CKB -Amy,Izabella,2022-03-09 07:32:00,2022-03-09 07:39:00,Tristan,3.29,1,4425669,CKB -Amy,Tristan,2022-03-09 07:40:00,2022-03-09 07:45:00,Izabella,2954,295,4425669,CKB -Amy,Izabella,2022-03-09 12:40:00,2022-03-09 12:47:00,Tristan,3.29,2,4425669,CKB -Amy,Tristan,2022-03-09 12:49:00,2022-03-09 12:54:00,Izabella,2954,46,4425669,CKB -Amy,Izabella,2022-03-09 13:40:00,2022-03-09 13:47:00,Tristan,3.29,2,4425669,CKB -Amy,Tristan,2022-03-09 13:49:00,2022-03-09 13:54:00,Izabella,2954,434,4425669,CKB -Amy,Izabella,2022-03-09 21:08:00,2022-03-09 21:08:00,Beckham,0.06,0,4425669,CKB -Matilda,Beckham,2022-03-09 07:20:00,2022-03-09 07:20:00,Izaiah,0.06,0,4448151,CKB -Matilda,Izaiah,2022-03-09 07:20:00,2022-03-09 07:50:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 08:00:00,2022-03-09 08:30:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 08:40:00,2022-03-09 09:10:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 09:20:00,2022-03-09 09:50:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 10:00:00,2022-03-09 10:30:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 10:40:00,2022-03-09 11:10:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 11:20:00,2022-03-09 11:50:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 12:00:00,2022-03-09 12:30:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 12:40:00,2022-03-09 13:10:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 13:20:00,2022-03-09 13:50:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 14:00:00,2022-03-09 14:30:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 14:40:00,2022-03-09 15:10:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 15:20:00,2022-03-09 15:50:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 16:00:00,2022-03-09 16:30:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 16:40:00,2022-03-09 17:10:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 17:20:00,2022-03-09 17:50:00,Izaiah,9266,10,4448151,CKB -Matilda,Izaiah,2022-03-09 18:00:00,2022-03-09 18:30:00,Izaiah,9266,0,4448151,CKB -Matilda,Izaiah,2022-03-09 18:30:00,2022-03-09 18:30:00,Beckham,0.06,0,4448151,CKB -Hailey,Beckham,2022-03-09 07:10:00,2022-03-09 07:10:00,Kaylani,0.06,0,4733896,CKB -Hailey,Kaylani,2022-03-09 07:10:00,2022-03-09 07:18:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 07:28:00,2022-03-09 07:40:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 07:40:00,2022-03-09 07:48:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 07:58:00,2022-03-09 08:10:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 08:10:00,2022-03-09 08:18:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 08:28:00,2022-03-09 08:40:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 08:40:00,2022-03-09 08:48:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 08:58:00,2022-03-09 09:10:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 09:10:00,2022-03-09 09:18:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 09:28:00,2022-03-09 09:40:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 09:40:00,2022-03-09 09:48:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 09:58:00,2022-03-09 10:10:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 10:10:00,2022-03-09 10:18:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 10:28:00,2022-03-09 10:40:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 10:40:00,2022-03-09 10:48:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 10:58:00,2022-03-09 11:10:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 11:10:00,2022-03-09 11:18:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 11:28:00,2022-03-09 11:40:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 11:40:00,2022-03-09 11:48:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 11:58:00,2022-03-09 12:10:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 12:10:00,2022-03-09 12:18:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 12:28:00,2022-03-09 12:40:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 12:40:00,2022-03-09 12:48:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 12:58:00,2022-03-09 13:10:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 13:10:00,2022-03-09 13:18:00,Cecilia,2169,10,4733896,CKB -Hailey,Cecilia,2022-03-09 13:28:00,2022-03-09 13:40:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 13:40:00,2022-03-09 13:48:00,Cecilia,2169,8,4733896,CKB -Hailey,Cecilia,2022-03-09 13:56:00,2022-03-09 14:10:00,Kaylani,2952,0,4733896,CKB -Hailey,Kaylani,2022-03-09 14:10:00,2022-03-09 14:19:00,Cecilia,2169,14,4733896,CKB -Hailey,Cecilia,2022-03-09 14:33:00,2022-03-09 14:47:00,Kaylani,2952,3,4733896,CKB -Hailey,Kaylani,2022-03-09 14:50:00,2022-03-09 14:59:00,Cecilia,2169,14,4733896,CKB -Hailey,Cecilia,2022-03-09 15:13:00,2022-03-09 15:27:00,Kaylani,2952,3,4733896,CKB -Hailey,Kaylani,2022-03-09 15:30:00,2022-03-09 15:39:00,Cecilia,2169,14,4733896,CKB -Hailey,Cecilia,2022-03-09 15:53:00,2022-03-09 16:07:00,Kaylani,2952,3,4733896,CKB -Hailey,Kaylani,2022-03-09 16:10:00,2022-03-09 16:19:00,Cecilia,2169,14,4733896,CKB -Hailey,Cecilia,2022-03-09 16:33:00,2022-03-09 16:47:00,Kaylani,2952,3,4733896,CKB -Hailey,Kaylani,2022-03-09 16:50:00,2022-03-09 16:59:00,Cecilia,2169,14,4733896,CKB -Hailey,Cecilia,2022-03-09 17:13:00,2022-03-09 17:27:00,Kaylani,2952,3,4733896,CKB -Hailey,Kaylani,2022-03-09 17:30:00,2022-03-09 17:39:00,Cecilia,2169,13,4733896,CKB -Hailey,Cecilia,2022-03-09 17:52:00,2022-03-09 18:05:00,Kaylani,2952,5,4733896,CKB -Hailey,Kaylani,2022-03-09 18:10:00,2022-03-09 18:18:00,Cecilia,2169,0,4733896,CKB -Hailey,Cecilia,2022-03-09 18:18:00,2022-03-09 18:18:00,Beckham,0.06,0,4733896,CKB -Hailey,Beckham,2022-03-09 14:13:00,2022-03-09 14:13:00,Cecilia,0.06,0,4734201,CKB -Hailey,Cecilia,2022-03-09 14:13:00,2022-03-09 14:27:00,Kaylani,2952,3,4734201,CKB -Hailey,Kaylani,2022-03-09 14:30:00,2022-03-09 14:39:00,Cecilia,2169,14,4734201,CKB -Hailey,Cecilia,2022-03-09 14:53:00,2022-03-09 15:07:00,Kaylani,2952,3,4734201,CKB -Hailey,Kaylani,2022-03-09 15:10:00,2022-03-09 15:19:00,Cecilia,2169,14,4734201,CKB -Hailey,Cecilia,2022-03-09 15:33:00,2022-03-09 15:47:00,Kaylani,2952,3,4734201,CKB -Hailey,Kaylani,2022-03-09 15:50:00,2022-03-09 15:59:00,Cecilia,2169,14,4734201,CKB -Hailey,Cecilia,2022-03-09 16:13:00,2022-03-09 16:27:00,Kaylani,2952,3,4734201,CKB -Hailey,Kaylani,2022-03-09 16:30:00,2022-03-09 16:39:00,Cecilia,2169,14,4734201,CKB -Hailey,Cecilia,2022-03-09 16:53:00,2022-03-09 17:07:00,Kaylani,2952,3,4734201,CKB -Hailey,Kaylani,2022-03-09 17:10:00,2022-03-09 17:19:00,Cecilia,2169,14,4734201,CKB -Hailey,Cecilia,2022-03-09 17:33:00,2022-03-09 17:47:00,Kaylani,2952,3,4734201,CKB -Hailey,Kaylani,2022-03-09 17:50:00,2022-03-09 17:59:00,Cecilia,2169,14,4734201,CKB -Hailey,Cecilia,2022-03-09 18:13:00,2022-03-09 18:25:00,Kaylani,2952,0,4734201,CKB -Hailey,Kaylani,2022-03-09 18:25:00,2022-03-09 18:25:00,Beckham,0.06,0,4734201,CKB -Matthias,Beckham,2022-03-10 00:23:00,2022-03-10 00:23:00,Addilyn,0.06,0,4318158,CKB -Matthias,Addilyn,2022-03-10 00:23:00,2022-03-10 00:30:00,Ari,2577,9,4318158,CKB -Ruby,Ari,2022-03-10 00:39:00,2022-03-10 00:54:00,Kobe,5937,9,4318158,CKB -Ruby,Kobe,2022-03-10 01:03:00,2022-03-10 01:17:00,Ari,6.19,0,4318158,CKB -Matthias,Ari,2022-03-10 01:17:00,2022-03-10 01:23:00,Addilyn,2555,0,4318158,CKB -Matthias,Addilyn,2022-03-10 01:23:00,2022-03-10 01:30:00,Ari,2577,9,4318158,CKB -Ruby,Ari,2022-03-10 01:39:00,2022-03-10 01:54:00,Kobe,5937,9,4318158,CKB -Ruby,Kobe,2022-03-10 02:03:00,2022-03-10 02:17:00,Ari,6.19,0,4318158,CKB -Matthias,Ari,2022-03-10 02:17:00,2022-03-10 02:23:00,Addilyn,2555,0,4318158,CKB -Matthias,Addilyn,2022-03-10 02:23:00,2022-03-10 02:30:00,Ari,2577,9,4318158,CKB -Ruby,Ari,2022-03-10 02:39:00,2022-03-10 02:54:00,Kobe,5937,9,4318158,CKB -Ruby,Kobe,2022-03-10 03:03:00,2022-03-10 03:17:00,Ari,6.19,0,4318158,CKB -Matthias,Ari,2022-03-10 03:17:00,2022-03-10 03:23:00,Addilyn,2555,0,4318158,CKB -Matthias,Addilyn,2022-03-10 03:23:00,2022-03-10 03:30:00,Ari,2577,9,4318158,CKB -Ruby,Ari,2022-03-10 03:39:00,2022-03-10 03:54:00,Kobe,5937,9,4318158,CKB -Ruby,Kobe,2022-03-10 04:03:00,2022-03-10 04:17:00,Ari,6.19,0,4318158,CKB -Matthias,Ari,2022-03-10 04:17:00,2022-03-10 04:23:00,Addilyn,2555,0,4318158,CKB -Matthias,Addilyn,2022-03-10 04:23:00,2022-03-10 04:23:00,Beckham,0.06,0,4318158,CKB -Ruby,Beckham,2022-03-10 00:33:00,2022-03-10 00:33:00,Kobe,0.06,0,4318178,CKB -Ruby,Kobe,2022-03-10 00:33:00,2022-03-10 00:47:00,Ari,6.19,0,4318178,CKB -Matthias,Ari,2022-03-10 00:47:00,2022-03-10 00:53:00,Addilyn,2555,0,4318178,CKB -Matthias,Addilyn,2022-03-10 00:53:00,2022-03-10 01:00:00,Ari,2577,9,4318178,CKB -Ruby,Ari,2022-03-10 01:09:00,2022-03-10 01:24:00,Kobe,5937,9,4318178,CKB -Ruby,Kobe,2022-03-10 01:33:00,2022-03-10 01:47:00,Ari,6.19,0,4318178,CKB -Matthias,Ari,2022-03-10 01:47:00,2022-03-10 01:53:00,Addilyn,2555,0,4318178,CKB -Matthias,Addilyn,2022-03-10 01:53:00,2022-03-10 02:00:00,Ari,2577,9,4318178,CKB -Ruby,Ari,2022-03-10 02:09:00,2022-03-10 02:24:00,Kobe,5937,9,4318178,CKB -Ruby,Kobe,2022-03-10 02:33:00,2022-03-10 02:47:00,Ari,6.19,0,4318178,CKB -Matthias,Ari,2022-03-10 02:47:00,2022-03-10 02:53:00,Addilyn,2555,0,4318178,CKB -Matthias,Addilyn,2022-03-10 02:53:00,2022-03-10 03:00:00,Ari,2577,9,4318178,CKB -Ruby,Ari,2022-03-10 03:09:00,2022-03-10 03:24:00,Kobe,5937,9,4318178,CKB -Ruby,Kobe,2022-03-10 03:33:00,2022-03-10 03:47:00,Ari,6.19,0,4318178,CKB -Matthias,Ari,2022-03-10 03:47:00,2022-03-10 03:53:00,Addilyn,2555,0,4318178,CKB -Matthias,Addilyn,2022-03-10 03:53:00,2022-03-10 04:00:00,Ari,2577,9,4318178,CKB -Ruby,Ari,2022-03-10 04:09:00,2022-03-10 04:24:00,Kobe,5937,0,4318178,CKB -Ruby,Kobe,2022-03-10 04:24:00,2022-03-10 04:24:00,Beckham,0.06,0,4318178,CKB -Rosie,Beckham,2022-03-10 00:57:00,2022-03-10 00:57:00,Lexi,0.06,0,4319353,CKB -Rosie,Lexi,2022-03-10 00:57:00,2022-03-10 01:06:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 01:06:00,2022-03-10 01:11:00,Lexi,2936,16,4319353,CKB -Rosie,Lexi,2022-03-10 01:27:00,2022-03-10 01:36:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 01:36:00,2022-03-10 01:41:00,Lexi,2936,16,4319353,CKB -Rosie,Lexi,2022-03-10 01:57:00,2022-03-10 02:06:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 02:06:00,2022-03-10 02:11:00,Lexi,2936,16,4319353,CKB -Rosie,Lexi,2022-03-10 02:27:00,2022-03-10 02:36:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 02:36:00,2022-03-10 02:41:00,Lexi,2936,16,4319353,CKB -Rosie,Lexi,2022-03-10 02:57:00,2022-03-10 03:06:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 03:06:00,2022-03-10 03:11:00,Lexi,2936,16,4319353,CKB -Rosie,Lexi,2022-03-10 03:27:00,2022-03-10 03:36:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 03:36:00,2022-03-10 03:41:00,Lexi,2936,16,4319353,CKB -Rosie,Lexi,2022-03-10 03:57:00,2022-03-10 04:06:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 04:06:00,2022-03-10 04:11:00,Lexi,2936,16,4319353,CKB -Rosie,Lexi,2022-03-10 04:27:00,2022-03-10 04:36:00,Colton,4343,0,4319353,CKB -Rosie,Colton,2022-03-10 04:36:00,2022-03-10 04:36:00,Beckham,0.06,0,4319353,CKB -Daxton,Beckham,2022-03-10 00:29:00,2022-03-10 00:29:00,Harper,0.06,0,4751088,CKB -Daxton,Harper,2022-03-10 00:29:00,2022-03-10 00:41:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 00:47:00,2022-03-10 00:57:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 00:59:00,2022-03-10 01:11:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 01:17:00,2022-03-10 01:27:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 01:29:00,2022-03-10 01:41:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 01:47:00,2022-03-10 01:57:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 01:59:00,2022-03-10 02:11:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 02:17:00,2022-03-10 02:27:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 02:29:00,2022-03-10 02:41:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 02:47:00,2022-03-10 02:57:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 02:59:00,2022-03-10 03:11:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 03:17:00,2022-03-10 03:27:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 03:29:00,2022-03-10 03:41:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 03:47:00,2022-03-10 03:57:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 03:59:00,2022-03-10 04:11:00,Calvin,4481,6,4751088,CKB -Daxton,Calvin,2022-03-10 04:17:00,2022-03-10 04:27:00,Harper,4031,2,4751088,CKB -Daxton,Harper,2022-03-10 04:29:00,2022-03-10 04:41:00,Calvin,4481,0,4751088,CKB -Daxton,Calvin,2022-03-10 04:41:00,2022-03-10 04:41:00,Beckham,0.06,0,4751088,CKB -Andy,Beckham,2022-03-10 00:30:00,2022-03-10 00:30:00,Harper,0.06,0,4453546,CKB -Andy,Harper,2022-03-10 00:30:00,2022-03-10 00:44:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 00:44:00,2022-03-10 00:57:00,Harper,5302,3,4453546,CKB -Andy,Harper,2022-03-10 01:00:00,2022-03-10 01:14:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 01:14:00,2022-03-10 01:27:00,Harper,5302,3,4453546,CKB -Andy,Harper,2022-03-10 01:30:00,2022-03-10 01:44:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 01:44:00,2022-03-10 01:57:00,Harper,5302,3,4453546,CKB -Andy,Harper,2022-03-10 02:00:00,2022-03-10 02:14:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 02:14:00,2022-03-10 02:27:00,Harper,5302,3,4453546,CKB -Andy,Harper,2022-03-10 02:30:00,2022-03-10 02:44:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 02:44:00,2022-03-10 02:57:00,Harper,5302,3,4453546,CKB -Andy,Harper,2022-03-10 03:00:00,2022-03-10 03:14:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 03:14:00,2022-03-10 03:27:00,Harper,5302,3,4453546,CKB -Andy,Harper,2022-03-10 03:30:00,2022-03-10 03:44:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 03:44:00,2022-03-10 03:57:00,Harper,5302,3,4453546,CKB -Andy,Harper,2022-03-10 04:00:00,2022-03-10 04:14:00,Elise,4801,0,4453546,CKB -Andy,Elise,2022-03-10 04:14:00,2022-03-10 04:27:00,Harper,5302,0,4453546,CKB -Andy,Harper,2022-03-10 04:27:00,2022-03-10 04:27:00,Beckham,0.06,0,4453546,CKB -Alex,Beckham,2022-03-10 00:43:00,2022-03-10 00:43:00,Chase,0.06,0,4374468,CKB -Alex,Chase,2022-03-10 00:43:00,2022-03-10 01:33:00,Chase,20434,10,4374468,CKB -Alex,Chase,2022-03-10 01:43:00,2022-03-10 02:33:00,Chase,20434,10,4374468,CKB -Alex,Chase,2022-03-10 02:43:00,2022-03-10 03:33:00,Chase,20434,10,4374468,CKB -Alex,Chase,2022-03-10 03:43:00,2022-03-10 04:33:00,Chase,20434,0,4374468,CKB -Alex,Chase,2022-03-10 04:33:00,2022-03-10 04:33:00,Beckham,0.06,0,4374468,CKB -Alex,Beckham,2022-03-10 00:13:00,2022-03-10 00:13:00,Chase,0.06,0,4374473,CKB -Alex,Chase,2022-03-10 00:13:00,2022-03-10 01:03:00,Chase,20434,10,4374473,CKB -Alex,Chase,2022-03-10 01:13:00,2022-03-10 02:03:00,Chase,20434,10,4374473,CKB -Alex,Chase,2022-03-10 02:13:00,2022-03-10 03:03:00,Chase,20434,10,4374473,CKB -Alex,Chase,2022-03-10 03:13:00,2022-03-10 04:03:00,Chase,20434,0,4374473,CKB -Alex,Chase,2022-03-10 04:03:00,2022-03-10 04:03:00,Beckham,0.06,0,4374473,CKB -Hazel,Beckham,2022-03-10 00:24:00,2022-03-10 00:24:00,Celine,0.06,0,4456449,CKB -Hazel,Celine,2022-03-10 00:24:00,2022-03-10 00:48:00,Kali,11.86,4,4456449,CKB -Hazel,Kali,2022-03-10 00:52:00,2022-03-10 01:14:00,Celine,11139,10,4456449,CKB -Hazel,Celine,2022-03-10 01:24:00,2022-03-10 01:48:00,Kali,11.86,4,4456449,CKB -Hazel,Kali,2022-03-10 01:52:00,2022-03-10 02:14:00,Celine,11139,10,4456449,CKB -Hazel,Celine,2022-03-10 02:24:00,2022-03-10 02:48:00,Kali,11.86,4,4456449,CKB -Hazel,Kali,2022-03-10 02:52:00,2022-03-10 03:14:00,Celine,11139,10,4456449,CKB -Hazel,Celine,2022-03-10 03:24:00,2022-03-10 03:48:00,Kali,11.86,4,4456449,CKB -Hazel,Kali,2022-03-10 03:52:00,2022-03-10 04:14:00,Celine,11139,0,4456449,CKB -Hazel,Celine,2022-03-10 04:14:00,2022-03-10 04:14:00,Beckham,0.06,0,4456449,CKB -Hazel,Beckham,2022-03-10 00:22:00,2022-03-10 00:22:00,Kali,0.06,0,4456457,CKB -Hazel,Kali,2022-03-10 00:22:00,2022-03-10 00:44:00,Celine,11139,10,4456457,CKB -Hazel,Celine,2022-03-10 00:54:00,2022-03-10 01:18:00,Kali,11.86,4,4456457,CKB -Hazel,Kali,2022-03-10 01:22:00,2022-03-10 01:44:00,Celine,11139,10,4456457,CKB -Hazel,Celine,2022-03-10 01:54:00,2022-03-10 02:18:00,Kali,11.86,4,4456457,CKB -Hazel,Kali,2022-03-10 02:22:00,2022-03-10 02:44:00,Celine,11139,10,4456457,CKB -Hazel,Celine,2022-03-10 02:54:00,2022-03-10 03:18:00,Kali,11.86,4,4456457,CKB -Hazel,Kali,2022-03-10 03:22:00,2022-03-10 03:44:00,Celine,11139,10,4456457,CKB -Hazel,Celine,2022-03-10 03:54:00,2022-03-10 04:18:00,Kali,11.86,4,4456457,CKB -Hazel,Kali,2022-03-10 04:22:00,2022-03-10 04:44:00,Celine,11139,0,4456457,CKB -Hazel,Celine,2022-03-10 04:44:00,2022-03-10 04:44:00,Beckham,0.06,0,4456457,CKB -Emilio,Beckham,2022-03-10 00:32:00,2022-03-10 00:32:00,Rose,0.06,0,4747651,CKB -Emilio,Rose,2022-03-10 00:32:00,2022-03-10 00:44:00,Brooklynn,4212,3,4747651,CKB -Emilio,Brooklynn,2022-03-10 00:47:00,2022-03-10 01:16:00,Francis,13048,0,4747651,CKB -Emilio,Francis,2022-03-10 01:16:00,2022-03-10 01:42:00,Brooklynn,12869,5,4747651,CKB -Emilio,Brooklynn,2022-03-10 01:47:00,2022-03-10 02:16:00,Francis,13048,0,4747651,CKB -Emilio,Francis,2022-03-10 02:16:00,2022-03-10 02:42:00,Brooklynn,12869,5,4747651,CKB -Emilio,Brooklynn,2022-03-10 02:47:00,2022-03-10 03:16:00,Francis,13048,0,4747651,CKB -Emilio,Francis,2022-03-10 03:16:00,2022-03-10 03:42:00,Brooklynn,12869,5,4747651,CKB -Emilio,Brooklynn,2022-03-10 03:47:00,2022-03-10 04:16:00,Francis,13048,0,4747651,CKB -Emilio,Francis,2022-03-10 04:16:00,2022-03-10 04:34:00,Gia,9538,0,4747651,CKB -Emilio,Gia,2022-03-10 04:34:00,2022-03-10 04:34:00,Beckham,0.06,0,4747651,CKB -Emilio,Beckham,2022-03-10 00:17:00,2022-03-10 00:17:00,Brooklynn,0.06,0,4747661,CKB -Emilio,Brooklynn,2022-03-10 00:17:00,2022-03-10 00:46:00,Francis,13048,0,4747661,CKB -Emilio,Francis,2022-03-10 00:46:00,2022-03-10 01:12:00,Brooklynn,12869,5,4747661,CKB -Emilio,Brooklynn,2022-03-10 01:17:00,2022-03-10 01:46:00,Francis,13048,0,4747661,CKB -Emilio,Francis,2022-03-10 01:46:00,2022-03-10 02:12:00,Brooklynn,12869,5,4747661,CKB -Emilio,Brooklynn,2022-03-10 02:17:00,2022-03-10 02:46:00,Francis,13048,0,4747661,CKB -Emilio,Francis,2022-03-10 02:46:00,2022-03-10 03:12:00,Brooklynn,12869,5,4747661,CKB -Emilio,Brooklynn,2022-03-10 03:17:00,2022-03-10 03:46:00,Francis,13048,0,4747661,CKB -Emilio,Francis,2022-03-10 03:46:00,2022-03-10 04:12:00,Brooklynn,12869,5,4747661,CKB -Emilio,Brooklynn,2022-03-10 04:17:00,2022-03-10 04:28:00,Rose,4316,0,4747661,CKB -Emilio,Rose,2022-03-10 04:28:00,2022-03-10 04:28:00,Beckham,0.06,0,4747661,CKB -Ryder,Beckham,2022-03-10 00:49:00,2022-03-10 00:49:00,Kehlani,0.06,0,4434342,CKB -Ryder,Kehlani,2022-03-10 00:49:00,2022-03-10 01:04:00,Ariyah,10229,0,4434342,CKB -Ryder,Ariyah,2022-03-10 01:04:00,2022-03-10 01:19:00,Kehlani,11801,0,4434342,CKB -Ryder,Kehlani,2022-03-10 01:19:00,2022-03-10 01:34:00,Ariyah,10229,0,4434342,CKB -Ryder,Ariyah,2022-03-10 01:34:00,2022-03-10 01:49:00,Kehlani,11801,0,4434342,CKB -Ryder,Kehlani,2022-03-10 01:49:00,2022-03-10 02:04:00,Ariyah,10229,0,4434342,CKB -Ryder,Ariyah,2022-03-10 02:04:00,2022-03-10 02:19:00,Kehlani,11801,0,4434342,CKB -Ryder,Kehlani,2022-03-10 02:19:00,2022-03-10 02:34:00,Ariyah,10229,0,4434342,CKB -Ryder,Ariyah,2022-03-10 02:34:00,2022-03-10 02:49:00,Kehlani,11801,0,4434342,CKB -Ryder,Kehlani,2022-03-10 02:49:00,2022-03-10 03:04:00,Ariyah,10229,0,4434342,CKB -Ryder,Ariyah,2022-03-10 03:04:00,2022-03-10 03:19:00,Kehlani,11801,0,4434342,CKB -Ryder,Kehlani,2022-03-10 03:19:00,2022-03-10 03:34:00,Ariyah,10229,0,4434342,CKB -Ryder,Ariyah,2022-03-10 03:34:00,2022-03-10 03:49:00,Kehlani,11801,0,4434342,CKB -Ryder,Kehlani,2022-03-10 03:49:00,2022-03-10 04:04:00,Ariyah,10229,0,4434342,CKB -Ryder,Ariyah,2022-03-10 04:04:00,2022-03-10 04:19:00,Kehlani,11801,23,4434342,CKB -Kian,Kehlani,2022-03-10 04:42:00,2022-03-10 05:04:00,Finley,6.81,0,4434342,CKB -Kian,Finley,2022-03-10 05:04:00,2022-03-10 05:04:00,Beckham,0.06,0,4434342,CKB -Jake,Beckham,2022-03-10 00:32:00,2022-03-10 00:32:00,Rose,0.06,0,4434898,CKB -Jake,Rose,2022-03-10 00:32:00,2022-03-10 00:57:00,Kamila,11545,6,4434898,CKB -Jake,Kamila,2022-03-10 01:03:00,2022-03-10 01:46:00,Kayleigh,20579,1,4434898,CKB -Jake,Kayleigh,2022-03-10 01:47:00,2022-03-10 02:25:00,Kamila,20641,8,4434898,CKB -Jake,Kamila,2022-03-10 02:33:00,2022-03-10 03:16:00,Kayleigh,20579,1,4434898,CKB -Jake,Kayleigh,2022-03-10 03:17:00,2022-03-10 03:55:00,Kamila,20641,8,4434898,CKB -Jake,Kamila,2022-03-10 04:03:00,2022-03-10 04:28:00,Rose,11499,0,4434898,CKB -Jake,Rose,2022-03-10 04:28:00,2022-03-10 04:28:00,Beckham,0.06,0,4434898,CKB -Jake,Beckham,2022-03-10 00:33:00,2022-03-10 00:33:00,Kamila,0.06,0,4434903,CKB -Jake,Kamila,2022-03-10 00:33:00,2022-03-10 01:16:00,Kayleigh,20579,1,4434903,CKB -Jake,Kayleigh,2022-03-10 01:17:00,2022-03-10 01:55:00,Kamila,20641,8,4434903,CKB -Jake,Kamila,2022-03-10 02:03:00,2022-03-10 02:46:00,Kayleigh,20579,1,4434903,CKB -Jake,Kayleigh,2022-03-10 02:47:00,2022-03-10 03:25:00,Kamila,20641,8,4434903,CKB -Jake,Kamila,2022-03-10 03:33:00,2022-03-10 04:16:00,Kayleigh,20579,1,4434903,CKB -Jake,Kayleigh,2022-03-10 04:17:00,2022-03-10 04:51:00,Willa,18752,0,4434903,CKB -Jake,Willa,2022-03-10 04:51:00,2022-03-10 04:51:00,Beckham,0.06,0,4434903,CKB -Aziel,Beckham,2022-03-10 00:34:00,2022-03-10 00:34:00,Miles,0.06,0,4619767,CKB -Aziel,Miles,2022-03-10 00:34:00,2022-03-10 01:00:00,Delilah,9016,0,4619767,CKB -Aziel,Delilah,2022-03-10 01:00:00,2022-03-10 01:27:00,Miles,10083,7,4619767,CKB -Aziel,Miles,2022-03-10 01:34:00,2022-03-10 02:00:00,Delilah,9016,0,4619767,CKB -Aziel,Delilah,2022-03-10 02:00:00,2022-03-10 02:27:00,Miles,10083,7,4619767,CKB -Aziel,Miles,2022-03-10 02:34:00,2022-03-10 03:00:00,Delilah,9016,0,4619767,CKB -Aziel,Delilah,2022-03-10 03:00:00,2022-03-10 03:27:00,Miles,10083,7,4619767,CKB -Aziel,Miles,2022-03-10 03:34:00,2022-03-10 04:00:00,Delilah,9016,0,4619767,CKB -Aziel,Delilah,2022-03-10 04:00:00,2022-03-10 04:27:00,Miles,10083,0,4619767,CKB -Aziel,Miles,2022-03-10 04:27:00,2022-03-10 04:27:00,Beckham,0.06,0,4619767,CKB -Aziel,Beckham,2022-03-10 00:30:00,2022-03-10 00:30:00,Delilah,0.06,0,4619992,CKB -Aziel,Delilah,2022-03-10 00:30:00,2022-03-10 00:57:00,Miles,10083,7,4619992,CKB -Aziel,Miles,2022-03-10 01:04:00,2022-03-10 01:30:00,Delilah,9016,0,4619992,CKB -Aziel,Delilah,2022-03-10 01:30:00,2022-03-10 01:57:00,Miles,10083,7,4619992,CKB -Aziel,Miles,2022-03-10 02:04:00,2022-03-10 02:30:00,Delilah,9016,0,4619992,CKB -Aziel,Delilah,2022-03-10 02:30:00,2022-03-10 02:57:00,Miles,10083,7,4619992,CKB -Aziel,Miles,2022-03-10 03:04:00,2022-03-10 03:30:00,Delilah,9016,0,4619992,CKB -Aziel,Delilah,2022-03-10 03:30:00,2022-03-10 03:57:00,Miles,10083,7,4619992,CKB -Aziel,Miles,2022-03-10 04:04:00,2022-03-10 04:30:00,Delilah,9016,0,4619992,CKB -Aziel,Delilah,2022-03-10 04:30:00,2022-03-10 04:57:00,Miles,10083,0,4619992,CKB -Aziel,Miles,2022-03-10 04:57:00,2022-03-10 04:57:00,Beckham,0.06,0,4619992,CKB -Dalton,Beckham,2022-03-10 00:31:00,2022-03-10 00:31:00,Kamila,0.06,0,4374745,CKB -Dalton,Kamila,2022-03-10 00:31:00,2022-03-10 00:44:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 00:44:00,2022-03-10 00:56:00,Kamila,5362,5,4374745,CKB -Dalton,Kamila,2022-03-10 01:01:00,2022-03-10 01:14:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 01:14:00,2022-03-10 01:26:00,Kamila,5362,5,4374745,CKB -Dalton,Kamila,2022-03-10 01:31:00,2022-03-10 01:44:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 01:44:00,2022-03-10 01:56:00,Kamila,5362,5,4374745,CKB -Dalton,Kamila,2022-03-10 02:01:00,2022-03-10 02:14:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 02:14:00,2022-03-10 02:26:00,Kamila,5362,5,4374745,CKB -Dalton,Kamila,2022-03-10 02:31:00,2022-03-10 02:44:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 02:44:00,2022-03-10 02:56:00,Kamila,5362,5,4374745,CKB -Dalton,Kamila,2022-03-10 03:01:00,2022-03-10 03:14:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 03:14:00,2022-03-10 03:26:00,Kamila,5362,5,4374745,CKB -Dalton,Kamila,2022-03-10 03:31:00,2022-03-10 03:44:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 03:44:00,2022-03-10 03:56:00,Kamila,5362,5,4374745,CKB -Dalton,Kamila,2022-03-10 04:01:00,2022-03-10 04:14:00,Veronica,4872,0,4374745,CKB -Dalton,Veronica,2022-03-10 04:14:00,2022-03-10 04:26:00,Kamila,5362,0,4374745,CKB -Dalton,Kamila,2022-03-10 04:26:00,2022-03-10 04:26:00,Beckham,0.06,0,4374745,CKB -Jamison,Beckham,2022-03-10 00:31:00,2022-03-10 00:31:00,Kamila,0.06,0,4374868,CKB -Jamison,Kamila,2022-03-10 00:31:00,2022-03-10 00:45:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 00:47:00,2022-03-10 01:01:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 01:01:00,2022-03-10 01:15:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 01:17:00,2022-03-10 01:31:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 01:31:00,2022-03-10 01:45:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 01:47:00,2022-03-10 02:01:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 02:01:00,2022-03-10 02:15:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 02:17:00,2022-03-10 02:31:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 02:31:00,2022-03-10 02:45:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 02:47:00,2022-03-10 03:01:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 03:01:00,2022-03-10 03:15:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 03:17:00,2022-03-10 03:31:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 03:31:00,2022-03-10 03:45:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 03:47:00,2022-03-10 04:01:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 04:01:00,2022-03-10 04:15:00,Liana,5225,2,4374868,CKB -Jamison,Liana,2022-03-10 04:17:00,2022-03-10 04:31:00,Kamila,7617,0,4374868,CKB -Jamison,Kamila,2022-03-10 04:31:00,2022-03-10 04:31:00,Beckham,0.06,0,4374868,CKB -Keegan,Beckham,2022-03-10 00:43:00,2022-03-10 00:43:00,Charleigh,0.06,0,4375014,CKB -Keegan,Charleigh,2022-03-10 00:43:00,2022-03-10 00:53:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 00:53:00,2022-03-10 01:03:00,Charleigh,4408,10,4375014,CKB -Keegan,Charleigh,2022-03-10 01:13:00,2022-03-10 01:23:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 01:23:00,2022-03-10 01:33:00,Charleigh,4408,10,4375014,CKB -Keegan,Charleigh,2022-03-10 01:43:00,2022-03-10 01:53:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 01:53:00,2022-03-10 02:03:00,Charleigh,4408,10,4375014,CKB -Keegan,Charleigh,2022-03-10 02:13:00,2022-03-10 02:23:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 02:23:00,2022-03-10 02:33:00,Charleigh,4408,10,4375014,CKB -Keegan,Charleigh,2022-03-10 02:43:00,2022-03-10 02:53:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 02:53:00,2022-03-10 03:03:00,Charleigh,4408,10,4375014,CKB -Keegan,Charleigh,2022-03-10 03:13:00,2022-03-10 03:23:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 03:23:00,2022-03-10 03:33:00,Charleigh,4408,10,4375014,CKB -Keegan,Charleigh,2022-03-10 03:43:00,2022-03-10 03:53:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 03:53:00,2022-03-10 04:03:00,Charleigh,4408,10,4375014,CKB -Keegan,Charleigh,2022-03-10 04:13:00,2022-03-10 04:23:00,Eli,4507,0,4375014,CKB -Keegan,Eli,2022-03-10 04:23:00,2022-03-10 04:33:00,Charleigh,4408,0,4375014,CKB -Keegan,Charleigh,2022-03-10 04:33:00,2022-03-10 04:33:00,Beckham,0.06,0,4375014,CKB -Ayaan,Beckham,2022-03-10 21:31:00,2022-03-10 21:31:00,Kalani,0.06,0,4454946,CKB -Ayaan,Kalani,2022-03-10 21:31:00,2022-03-10 22:04:00,Brian,14519,4,4454946,CKB -Ayaan,Brian,2022-03-10 22:08:00,2022-03-10 22:43:00,Kalani,13541,8,4454946,CKB -Ayaan,Kalani,2022-03-10 22:51:00,2022-03-10 23:24:00,Brian,14519,4,4454946,CKB -Ayaan,Brian,2022-03-10 23:28:00,2022-03-11 00:03:00,Kalani,13541,8,4454946,CKB -Ayaan,Kalani,2022-03-11 00:11:00,2022-03-11 00:44:00,Brian,14519,0,4454946,CKB -Hunter,Brian,2022-03-11 00:44:00,2022-03-11 00:54:00,Kehlani,4.1,25,4454946,CKB -Hunter,Kehlani,2022-03-11 01:19:00,2022-03-11 01:42:00,Ayden,8.36,6,4454946,CKB -Hunter,Ayden,2022-03-11 01:48:00,2022-03-11 02:06:00,Kehlani,9067,13,4454946,CKB -Hunter,Kehlani,2022-03-11 02:19:00,2022-03-11 02:42:00,Ayden,8.36,6,4454946,CKB -Hunter,Ayden,2022-03-11 02:48:00,2022-03-11 03:06:00,Kehlani,9067,13,4454946,CKB -Hunter,Kehlani,2022-03-11 03:19:00,2022-03-11 03:42:00,Ayden,8.36,6,4454946,CKB -Hunter,Ayden,2022-03-11 03:48:00,2022-03-11 04:06:00,Kehlani,9067,0,4454946,CKB -Hunter,Kehlani,2022-03-11 04:06:00,2022-03-11 04:06:00,Beckham,0.06,0,4454946,CKB -Ayaan,Beckham,2022-03-10 22:11:00,2022-03-10 22:11:00,Kalani,0.06,0,4454951,CKB -Ayaan,Kalani,2022-03-10 22:11:00,2022-03-10 22:44:00,Brian,14519,4,4454951,CKB -Ayaan,Brian,2022-03-10 22:48:00,2022-03-10 23:23:00,Kalani,13541,8,4454951,CKB -Ayaan,Kalani,2022-03-10 23:31:00,2022-03-11 00:04:00,Brian,14519,4,4454951,CKB -Ayaan,Brian,2022-03-11 00:08:00,2022-03-11 00:39:00,Leonel,12213,0,4454951,CKB -Hunter,Leonel,2022-03-11 00:39:00,2022-03-11 00:47:00,Kehlani,4.0,2,4454951,CKB -Hunter,Kehlani,2022-03-11 00:49:00,2022-03-11 01:12:00,Ayden,8.36,6,4454951,CKB -Hunter,Ayden,2022-03-11 01:18:00,2022-03-11 01:36:00,Kehlani,9067,13,4454951,CKB -Hunter,Kehlani,2022-03-11 01:49:00,2022-03-11 02:12:00,Ayden,8.36,6,4454951,CKB -Hunter,Ayden,2022-03-11 02:18:00,2022-03-11 02:36:00,Kehlani,9067,13,4454951,CKB -Hunter,Kehlani,2022-03-11 02:49:00,2022-03-11 03:12:00,Ayden,8.36,6,4454951,CKB -Hunter,Ayden,2022-03-11 03:18:00,2022-03-11 03:36:00,Kehlani,9067,13,4454951,CKB -Hunter,Kehlani,2022-03-11 03:49:00,2022-03-11 04:12:00,Ayden,8.36,0,4454951,CKB -Hunter,Ayden,2022-03-11 04:12:00,2022-03-11 04:12:00,Beckham,0.06,0,4454951,CKB -Donovan,Beckham,2022-03-10 21:06:00,2022-03-10 21:06:00,Pierce,0.06,0,4664625,CKB -Donovan,Pierce,2022-03-10 21:06:00,2022-03-10 21:34:00,Leonardo,13018,19,4664625,CKB -Donovan,Leonardo,2022-03-10 21:53:00,2022-03-10 22:13:00,Kamryn,10332,17,4664625,CKB -Donovan,Kamryn,2022-03-10 22:30:00,2022-03-10 22:54:00,Leonardo,10.48,19,4664625,CKB -Donovan,Leonardo,2022-03-10 23:13:00,2022-03-10 23:33:00,Kamryn,10332,17,4664625,CKB -Donovan,Kamryn,2022-03-10 23:50:00,2022-03-11 00:14:00,Leonardo,10.48,2,4664625,CKB -Donovan,Leonardo,2022-03-11 00:16:00,2022-03-11 00:23:00,Melanie,3709,5,4664625,CKB -Zoey,Melanie,2022-03-11 00:28:00,2022-03-11 00:44:00,Brinley,6404,3,4664625,CKB -Zoey,Brinley,2022-03-11 00:47:00,2022-03-11 01:10:00,Finn,10579,7,4664625,CKB -Zoey,Finn,2022-03-11 01:17:00,2022-03-11 01:44:00,Brinley,12007,3,4664625,CKB -Zoey,Brinley,2022-03-11 01:47:00,2022-03-11 02:10:00,Finn,10579,7,4664625,CKB -Zoey,Finn,2022-03-11 02:17:00,2022-03-11 02:44:00,Brinley,12007,3,4664625,CKB -Zoey,Brinley,2022-03-11 02:47:00,2022-03-11 03:10:00,Finn,10579,7,4664625,CKB -Zoey,Finn,2022-03-11 03:17:00,2022-03-11 03:44:00,Brinley,12007,3,4664625,CKB -Zoey,Brinley,2022-03-11 03:47:00,2022-03-11 04:10:00,Finn,10579,7,4664625,CKB -Zoey,Finn,2022-03-11 04:17:00,2022-03-11 04:44:00,Brinley,12007,0,4664625,CKB -Zoey,Brinley,2022-03-11 04:44:00,2022-03-11 04:44:00,Beckham,0.06,0,4664625,CKB -Donovan,Beckham,2022-03-10 20:26:00,2022-03-10 20:26:00,Pierce,0.06,0,4762777,CKB -Donovan,Pierce,2022-03-10 20:26:00,2022-03-10 20:56:00,Ezra,14097,14,4762777,CKB -Donovan,Ezra,2022-03-10 21:10:00,2022-03-10 21:38:00,Pierce,13.19,8,4762777,CKB -Donovan,Pierce,2022-03-10 21:46:00,2022-03-10 22:14:00,Leonardo,13018,19,4762777,CKB -Donovan,Leonardo,2022-03-10 22:33:00,2022-03-10 22:53:00,Kamryn,10332,17,4762777,CKB -Donovan,Kamryn,2022-03-10 23:10:00,2022-03-10 23:34:00,Leonardo,10.48,19,4762777,CKB -Donovan,Leonardo,2022-03-10 23:53:00,2022-03-11 00:13:00,Kamryn,10332,2,4762777,CKB -Donovan,Kamryn,2022-03-11 00:15:00,2022-03-11 00:16:00,Brinley,506,1,4762777,CKB -Zoey,Brinley,2022-03-11 00:17:00,2022-03-11 00:40:00,Finn,10579,7,4762777,CKB -Zoey,Finn,2022-03-11 00:47:00,2022-03-11 01:14:00,Brinley,12007,3,4762777,CKB -Zoey,Brinley,2022-03-11 01:17:00,2022-03-11 01:40:00,Finn,10579,7,4762777,CKB -Zoey,Finn,2022-03-11 01:47:00,2022-03-11 02:14:00,Brinley,12007,3,4762777,CKB -Zoey,Brinley,2022-03-11 02:17:00,2022-03-11 02:40:00,Finn,10579,7,4762777,CKB -Zoey,Finn,2022-03-11 02:47:00,2022-03-11 03:14:00,Brinley,12007,3,4762777,CKB -Zoey,Brinley,2022-03-11 03:17:00,2022-03-11 03:40:00,Finn,10579,7,4762777,CKB -Zoey,Finn,2022-03-11 03:47:00,2022-03-11 04:14:00,Brinley,12007,3,4762777,CKB -Zoey,Brinley,2022-03-11 04:17:00,2022-03-11 04:40:00,Finn,10579,3,4762777,CKB -Jackson,Finn,2022-03-11 04:43:00,2022-03-11 04:58:00,Rose,6161,0,4762777,CKB -Jackson,Rose,2022-03-11 04:58:00,2022-03-11 04:58:00,Beckham,0.06,0,4762777,CKB -Avery,Beckham,2022-03-10 22:56:00,2022-03-10 22:56:00,Jace,0.06,0,4617422,CKB -Avery,Jace,2022-03-10 22:56:00,2022-03-10 23:08:00,Nathan,5882,3,4617422,CKB -Avery,Nathan,2022-03-10 23:11:00,2022-03-10 23:25:00,Jace,6232,0,4617422,CKB -Avery,Jace,2022-03-10 23:25:00,2022-03-10 23:38:00,Nathan,6086,3,4617422,CKB -Avery,Nathan,2022-03-10 23:41:00,2022-03-10 23:55:00,Jace,6232,0,4617422,CKB -Avery,Jace,2022-03-10 23:55:00,2022-03-11 00:08:00,Nathan,6086,0,4617422,CKB -Avery,Nathan,2022-03-11 00:08:00,2022-03-11 00:08:00,Beckham,0.06,0,4617422,CKB -Richard,Beckham,2022-03-10 05:05:00,2022-03-10 05:05:00,Ariyah,0.06,0,4426847,CKB -Richard,Ariyah,2022-03-10 05:05:00,2022-03-10 05:14:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 05:14:00,2022-03-10 05:23:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 05:25:00,2022-03-10 05:34:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 05:34:00,2022-03-10 05:43:00,Ariyah,5139,23,4426847,CKB -Richard,Ariyah,2022-03-10 06:06:00,2022-03-10 06:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 06:15:00,2022-03-10 06:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 06:26:00,2022-03-10 06:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 06:35:00,2022-03-10 06:44:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 06:46:00,2022-03-10 06:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 06:55:00,2022-03-10 07:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 07:06:00,2022-03-10 07:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 07:15:00,2022-03-10 07:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 07:26:00,2022-03-10 07:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 07:35:00,2022-03-10 07:44:00,Ariyah,5139,22,4426847,CKB -Richard,Ariyah,2022-03-10 08:06:00,2022-03-10 08:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 08:15:00,2022-03-10 08:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 08:26:00,2022-03-10 08:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 08:35:00,2022-03-10 08:44:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 08:46:00,2022-03-10 08:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 08:55:00,2022-03-10 09:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 09:06:00,2022-03-10 09:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 09:15:00,2022-03-10 09:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 09:26:00,2022-03-10 09:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 09:35:00,2022-03-10 09:44:00,Ariyah,5139,22,4426847,CKB -Richard,Ariyah,2022-03-10 10:06:00,2022-03-10 10:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 10:15:00,2022-03-10 10:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 10:26:00,2022-03-10 10:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 10:35:00,2022-03-10 10:44:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 10:46:00,2022-03-10 10:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 10:55:00,2022-03-10 11:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 11:06:00,2022-03-10 11:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 11:15:00,2022-03-10 11:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 11:26:00,2022-03-10 11:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 11:35:00,2022-03-10 11:44:00,Ariyah,5139,22,4426847,CKB -Richard,Ariyah,2022-03-10 12:06:00,2022-03-10 12:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 12:15:00,2022-03-10 12:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 12:26:00,2022-03-10 12:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 12:35:00,2022-03-10 12:44:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 12:46:00,2022-03-10 12:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 12:55:00,2022-03-10 13:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 13:06:00,2022-03-10 13:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 13:15:00,2022-03-10 13:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 13:26:00,2022-03-10 13:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 13:35:00,2022-03-10 13:44:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 13:46:00,2022-03-10 13:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 13:55:00,2022-03-10 14:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 14:06:00,2022-03-10 14:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 14:15:00,2022-03-10 14:24:00,Ariyah,5139,22,4426847,CKB -Richard,Ariyah,2022-03-10 14:46:00,2022-03-10 14:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 14:55:00,2022-03-10 15:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 15:06:00,2022-03-10 15:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 15:15:00,2022-03-10 15:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 15:26:00,2022-03-10 15:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 15:35:00,2022-03-10 15:44:00,Ariyah,5139,22,4426847,CKB -Richard,Ariyah,2022-03-10 16:06:00,2022-03-10 16:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 16:15:00,2022-03-10 16:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 16:26:00,2022-03-10 16:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 16:35:00,2022-03-10 16:44:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 16:46:00,2022-03-10 16:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 16:55:00,2022-03-10 17:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 17:06:00,2022-03-10 17:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 17:15:00,2022-03-10 17:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 17:26:00,2022-03-10 17:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 17:35:00,2022-03-10 17:44:00,Ariyah,5139,22,4426847,CKB -Richard,Ariyah,2022-03-10 18:06:00,2022-03-10 18:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 18:15:00,2022-03-10 18:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 18:26:00,2022-03-10 18:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 18:35:00,2022-03-10 18:44:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 18:46:00,2022-03-10 18:55:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 18:55:00,2022-03-10 19:04:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 19:06:00,2022-03-10 19:15:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 19:15:00,2022-03-10 19:24:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 19:26:00,2022-03-10 19:35:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 19:35:00,2022-03-10 19:44:00,Ariyah,5139,21,4426847,CKB -Richard,Ariyah,2022-03-10 20:05:00,2022-03-10 20:14:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 20:14:00,2022-03-10 20:23:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 20:25:00,2022-03-10 20:34:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 20:34:00,2022-03-10 20:43:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 20:45:00,2022-03-10 20:54:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 20:54:00,2022-03-10 21:03:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 21:05:00,2022-03-10 21:14:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 21:14:00,2022-03-10 21:23:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 21:25:00,2022-03-10 21:34:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 21:34:00,2022-03-10 21:43:00,Ariyah,5139,22,4426847,CKB -Richard,Ariyah,2022-03-10 22:05:00,2022-03-10 22:14:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 22:14:00,2022-03-10 22:23:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 22:25:00,2022-03-10 22:34:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 22:34:00,2022-03-10 22:43:00,Ariyah,5139,2,4426847,CKB -Richard,Ariyah,2022-03-10 22:45:00,2022-03-10 22:54:00,Jaden,4781,0,4426847,CKB -Richard,Jaden,2022-03-10 22:54:00,2022-03-10 23:03:00,Ariyah,5139,0,4426847,CKB -Richard,Ariyah,2022-03-10 23:03:00,2022-03-10 23:03:00,Beckham,0.06,0,4426847,CKB -Ezekiel,Beckham,2022-03-11 00:06:00,2022-03-11 00:06:00,Erik,0.06,0,4708597,CKB -Ezekiel,Erik,2022-03-11 00:06:00,2022-03-11 00:27:00,Memphis,7827,0,4708597,CKB -Jake,Memphis,2022-03-11 00:27:00,2022-03-11 00:48:00,Kayleigh,11079,0,4708597,CKB -Jake,Kayleigh,2022-03-11 00:48:00,2022-03-11 01:25:00,Kamila,20641,8,4708597,CKB -Jake,Kamila,2022-03-11 01:33:00,2022-03-11 02:16:00,Kayleigh,20579,1,4708597,CKB -Jake,Kayleigh,2022-03-11 02:17:00,2022-03-11 02:55:00,Kamila,20641,8,4708597,CKB -Jake,Kamila,2022-03-11 03:03:00,2022-03-11 03:46:00,Kayleigh,20579,1,4708597,CKB -Jake,Kayleigh,2022-03-11 03:47:00,2022-03-11 04:25:00,Kamila,20641,0,4708597,CKB -Jake,Kamila,2022-03-11 04:25:00,2022-03-11 04:25:00,Beckham,0.06,0,4708597,CKB -Astrid,King,2022-03-10 05:15:00,2022-03-10 06:01:00,Brayden,17.9,0,4317627,VDL -Astrid,Brayden,2022-03-10 06:01:00,2022-03-10 06:15:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 06:23:00,2022-03-10 06:37:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 06:41:00,2022-03-10 06:55:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 07:03:00,2022-03-10 07:17:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 07:21:00,2022-03-10 07:35:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 07:43:00,2022-03-10 07:57:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 08:01:00,2022-03-10 08:15:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 08:23:00,2022-03-10 08:37:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 08:41:00,2022-03-10 08:55:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 09:03:00,2022-03-10 09:17:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 09:21:00,2022-03-10 09:35:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 09:43:00,2022-03-10 09:57:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 10:01:00,2022-03-10 10:15:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 10:23:00,2022-03-10 10:37:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 10:41:00,2022-03-10 10:55:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 11:03:00,2022-03-10 11:17:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 11:21:00,2022-03-10 11:35:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 11:43:00,2022-03-10 11:57:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 12:01:00,2022-03-10 12:15:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 12:23:00,2022-03-10 12:37:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 12:41:00,2022-03-10 12:55:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 13:03:00,2022-03-10 13:17:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 13:21:00,2022-03-10 13:35:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 13:43:00,2022-03-10 13:57:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 14:01:00,2022-03-10 14:15:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 14:23:00,2022-03-10 14:37:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 14:41:00,2022-03-10 14:55:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 15:03:00,2022-03-10 15:17:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 15:21:00,2022-03-10 15:35:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 15:43:00,2022-03-10 15:57:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 16:01:00,2022-03-10 16:15:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 16:23:00,2022-03-10 16:37:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 16:41:00,2022-03-10 16:55:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 17:03:00,2022-03-10 17:17:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 17:21:00,2022-03-10 17:35:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 17:43:00,2022-03-10 17:57:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 18:01:00,2022-03-10 18:15:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 18:23:00,2022-03-10 18:37:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 18:41:00,2022-03-10 18:55:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 19:03:00,2022-03-10 19:17:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 19:21:00,2022-03-10 19:35:00,Brayden,4637,8,4317627,VDL -Astrid,Brayden,2022-03-10 19:43:00,2022-03-10 19:57:00,Brayden,4637,4,4317627,VDL -Astrid,Brayden,2022-03-10 20:01:00,2022-03-10 20:14:00,Brayden,4637,9,4317627,VDL -Astrid,Brayden,2022-03-10 20:23:00,2022-03-10 20:36:00,Brayden,4637,0,4317627,VDL -Astrid,Brayden,2022-03-10 20:36:00,2022-03-10 21:15:00,King,19.8,0,4317627,VDL -Amy,Beckham,2022-03-10 04:56:00,2022-03-10 04:56:00,Izabella,0.06,18,4425670,CKB -Amy,Izabella,2022-03-10 05:14:00,2022-03-10 05:20:00,Tristan,3.29,0,4425670,CKB -Amy,Tristan,2022-03-10 05:20:00,2022-03-10 05:24:00,Izabella,2954,20,4425670,CKB -Amy,Izabella,2022-03-10 05:44:00,2022-03-10 05:50:00,Tristan,3.29,0,4425670,CKB -Amy,Tristan,2022-03-10 05:50:00,2022-03-10 05:54:00,Izabella,2954,5,4425670,CKB -Amy,Izabella,2022-03-10 05:59:00,2022-03-10 06:06:00,Tristan,3.29,2,4425670,CKB -Amy,Tristan,2022-03-10 06:08:00,2022-03-10 06:13:00,Izabella,2954,19,4425670,CKB -Amy,Izabella,2022-03-10 06:32:00,2022-03-10 06:39:00,Tristan,3.29,1,4425670,CKB -Amy,Tristan,2022-03-10 06:40:00,2022-03-10 06:45:00,Izabella,2954,7,4425670,CKB -Amy,Izabella,2022-03-10 06:52:00,2022-03-10 06:59:00,Tristan,3.29,1,4425670,CKB -Amy,Tristan,2022-03-10 07:00:00,2022-03-10 07:05:00,Izabella,2954,7,4425670,CKB -Amy,Izabella,2022-03-10 07:12:00,2022-03-10 07:19:00,Tristan,3.29,1,4425670,CKB -Amy,Tristan,2022-03-10 07:20:00,2022-03-10 07:25:00,Izabella,2954,7,4425670,CKB -Amy,Izabella,2022-03-10 07:32:00,2022-03-10 07:39:00,Tristan,3.29,1,4425670,CKB -Amy,Tristan,2022-03-10 07:40:00,2022-03-10 07:45:00,Izabella,2954,295,4425670,CKB -Amy,Izabella,2022-03-10 12:40:00,2022-03-10 12:47:00,Tristan,3.29,2,4425670,CKB -Amy,Tristan,2022-03-10 12:49:00,2022-03-10 12:54:00,Izabella,2954,46,4425670,CKB -Amy,Izabella,2022-03-10 13:40:00,2022-03-10 13:47:00,Tristan,3.29,2,4425670,CKB -Amy,Tristan,2022-03-10 13:49:00,2022-03-10 13:54:00,Izabella,2954,434,4425670,CKB -Amy,Izabella,2022-03-10 21:08:00,2022-03-10 21:08:00,Beckham,0.06,0,4425670,CKB -Matilda,Beckham,2022-03-10 07:20:00,2022-03-10 07:20:00,Izaiah,0.06,0,4448152,CKB -Matilda,Izaiah,2022-03-10 07:20:00,2022-03-10 07:50:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 08:00:00,2022-03-10 08:30:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 08:40:00,2022-03-10 09:10:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 09:20:00,2022-03-10 09:50:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 10:00:00,2022-03-10 10:30:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 10:40:00,2022-03-10 11:10:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 11:20:00,2022-03-10 11:50:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 12:00:00,2022-03-10 12:30:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 12:40:00,2022-03-10 13:10:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 13:20:00,2022-03-10 13:50:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 14:00:00,2022-03-10 14:30:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 14:40:00,2022-03-10 15:10:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 15:20:00,2022-03-10 15:50:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 16:00:00,2022-03-10 16:30:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 16:40:00,2022-03-10 17:10:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 17:20:00,2022-03-10 17:50:00,Izaiah,9266,10,4448152,CKB -Matilda,Izaiah,2022-03-10 18:00:00,2022-03-10 18:30:00,Izaiah,9266,0,4448152,CKB -Matilda,Izaiah,2022-03-10 18:30:00,2022-03-10 18:30:00,Beckham,0.06,0,4448152,CKB -Hailey,Beckham,2022-03-10 07:10:00,2022-03-10 07:10:00,Kaylani,0.06,0,4733897,CKB -Hailey,Kaylani,2022-03-10 07:10:00,2022-03-10 07:18:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 07:28:00,2022-03-10 07:40:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 07:40:00,2022-03-10 07:48:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 07:58:00,2022-03-10 08:10:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 08:10:00,2022-03-10 08:18:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 08:28:00,2022-03-10 08:40:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 08:40:00,2022-03-10 08:48:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 08:58:00,2022-03-10 09:10:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 09:10:00,2022-03-10 09:18:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 09:28:00,2022-03-10 09:40:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 09:40:00,2022-03-10 09:48:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 09:58:00,2022-03-10 10:10:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 10:10:00,2022-03-10 10:18:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 10:28:00,2022-03-10 10:40:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 10:40:00,2022-03-10 10:48:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 10:58:00,2022-03-10 11:10:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 11:10:00,2022-03-10 11:18:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 11:28:00,2022-03-10 11:40:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 11:40:00,2022-03-10 11:48:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 11:58:00,2022-03-10 12:10:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 12:10:00,2022-03-10 12:18:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 12:28:00,2022-03-10 12:40:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 12:40:00,2022-03-10 12:48:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 12:58:00,2022-03-10 13:10:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 13:10:00,2022-03-10 13:18:00,Cecilia,2169,10,4733897,CKB -Hailey,Cecilia,2022-03-10 13:28:00,2022-03-10 13:40:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 13:40:00,2022-03-10 13:48:00,Cecilia,2169,8,4733897,CKB -Hailey,Cecilia,2022-03-10 13:56:00,2022-03-10 14:10:00,Kaylani,2952,0,4733897,CKB -Hailey,Kaylani,2022-03-10 14:10:00,2022-03-10 14:19:00,Cecilia,2169,14,4733897,CKB -Hailey,Cecilia,2022-03-10 14:33:00,2022-03-10 14:47:00,Kaylani,2952,3,4733897,CKB -Hailey,Kaylani,2022-03-10 14:50:00,2022-03-10 14:59:00,Cecilia,2169,14,4733897,CKB -Hailey,Cecilia,2022-03-10 15:13:00,2022-03-10 15:27:00,Kaylani,2952,3,4733897,CKB -Hailey,Kaylani,2022-03-10 15:30:00,2022-03-10 15:39:00,Cecilia,2169,14,4733897,CKB -Hailey,Cecilia,2022-03-10 15:53:00,2022-03-10 16:07:00,Kaylani,2952,3,4733897,CKB -Hailey,Kaylani,2022-03-10 16:10:00,2022-03-10 16:19:00,Cecilia,2169,14,4733897,CKB -Hailey,Cecilia,2022-03-10 16:33:00,2022-03-10 16:47:00,Kaylani,2952,3,4733897,CKB -Hailey,Kaylani,2022-03-10 16:50:00,2022-03-10 16:59:00,Cecilia,2169,14,4733897,CKB -Hailey,Cecilia,2022-03-10 17:13:00,2022-03-10 17:27:00,Kaylani,2952,3,4733897,CKB -Hailey,Kaylani,2022-03-10 17:30:00,2022-03-10 17:39:00,Cecilia,2169,13,4733897,CKB -Hailey,Cecilia,2022-03-10 17:52:00,2022-03-10 18:05:00,Kaylani,2952,5,4733897,CKB -Hailey,Kaylani,2022-03-10 18:10:00,2022-03-10 18:18:00,Cecilia,2169,0,4733897,CKB -Hailey,Cecilia,2022-03-10 18:18:00,2022-03-10 18:18:00,Beckham,0.06,0,4733897,CKB -Hailey,Beckham,2022-03-10 14:13:00,2022-03-10 14:13:00,Cecilia,0.06,0,4734202,CKB -Hailey,Cecilia,2022-03-10 14:13:00,2022-03-10 14:27:00,Kaylani,2952,3,4734202,CKB -Hailey,Kaylani,2022-03-10 14:30:00,2022-03-10 14:39:00,Cecilia,2169,14,4734202,CKB -Hailey,Cecilia,2022-03-10 14:53:00,2022-03-10 15:07:00,Kaylani,2952,3,4734202,CKB -Hailey,Kaylani,2022-03-10 15:10:00,2022-03-10 15:19:00,Cecilia,2169,14,4734202,CKB -Hailey,Cecilia,2022-03-10 15:33:00,2022-03-10 15:47:00,Kaylani,2952,3,4734202,CKB -Hailey,Kaylani,2022-03-10 15:50:00,2022-03-10 15:59:00,Cecilia,2169,14,4734202,CKB -Hailey,Cecilia,2022-03-10 16:13:00,2022-03-10 16:27:00,Kaylani,2952,3,4734202,CKB -Hailey,Kaylani,2022-03-10 16:30:00,2022-03-10 16:39:00,Cecilia,2169,14,4734202,CKB -Hailey,Cecilia,2022-03-10 16:53:00,2022-03-10 17:07:00,Kaylani,2952,3,4734202,CKB -Hailey,Kaylani,2022-03-10 17:10:00,2022-03-10 17:19:00,Cecilia,2169,14,4734202,CKB -Hailey,Cecilia,2022-03-10 17:33:00,2022-03-10 17:47:00,Kaylani,2952,3,4734202,CKB -Hailey,Kaylani,2022-03-10 17:50:00,2022-03-10 17:59:00,Cecilia,2169,14,4734202,CKB -Hailey,Cecilia,2022-03-10 18:13:00,2022-03-10 18:25:00,Kaylani,2952,0,4734202,CKB -Hailey,Kaylani,2022-03-10 18:25:00,2022-03-10 18:25:00,Beckham,0.06,0,4734202,CKB -Matthias,Beckham,2022-03-11 00:23:00,2022-03-11 00:23:00,Addilyn,0.06,0,4318159,CKB -Matthias,Addilyn,2022-03-11 00:23:00,2022-03-11 00:30:00,Ari,2577,9,4318159,CKB -Ruby,Ari,2022-03-11 00:39:00,2022-03-11 00:54:00,Kobe,5937,9,4318159,CKB -Ruby,Kobe,2022-03-11 01:03:00,2022-03-11 01:17:00,Ari,6.19,0,4318159,CKB -Matthias,Ari,2022-03-11 01:17:00,2022-03-11 01:23:00,Addilyn,2555,0,4318159,CKB -Matthias,Addilyn,2022-03-11 01:23:00,2022-03-11 01:30:00,Ari,2577,9,4318159,CKB -Ruby,Ari,2022-03-11 01:39:00,2022-03-11 01:54:00,Kobe,5937,9,4318159,CKB -Ruby,Kobe,2022-03-11 02:03:00,2022-03-11 02:17:00,Ari,6.19,0,4318159,CKB -Matthias,Ari,2022-03-11 02:17:00,2022-03-11 02:23:00,Addilyn,2555,0,4318159,CKB -Matthias,Addilyn,2022-03-11 02:23:00,2022-03-11 02:30:00,Ari,2577,9,4318159,CKB -Ruby,Ari,2022-03-11 02:39:00,2022-03-11 02:54:00,Kobe,5937,9,4318159,CKB -Ruby,Kobe,2022-03-11 03:03:00,2022-03-11 03:17:00,Ari,6.19,0,4318159,CKB -Matthias,Ari,2022-03-11 03:17:00,2022-03-11 03:23:00,Addilyn,2555,0,4318159,CKB -Matthias,Addilyn,2022-03-11 03:23:00,2022-03-11 03:30:00,Ari,2577,9,4318159,CKB -Ruby,Ari,2022-03-11 03:39:00,2022-03-11 03:54:00,Kobe,5937,9,4318159,CKB -Ruby,Kobe,2022-03-11 04:03:00,2022-03-11 04:17:00,Ari,6.19,0,4318159,CKB -Matthias,Ari,2022-03-11 04:17:00,2022-03-11 04:23:00,Addilyn,2555,0,4318159,CKB -Matthias,Addilyn,2022-03-11 04:23:00,2022-03-11 04:23:00,Beckham,0.06,0,4318159,CKB -Ruby,Beckham,2022-03-11 00:33:00,2022-03-11 00:33:00,Kobe,0.06,0,4318179,CKB -Ruby,Kobe,2022-03-11 00:33:00,2022-03-11 00:47:00,Ari,6.19,0,4318179,CKB -Matthias,Ari,2022-03-11 00:47:00,2022-03-11 00:53:00,Addilyn,2555,0,4318179,CKB -Matthias,Addilyn,2022-03-11 00:53:00,2022-03-11 01:00:00,Ari,2577,9,4318179,CKB -Ruby,Ari,2022-03-11 01:09:00,2022-03-11 01:24:00,Kobe,5937,9,4318179,CKB -Ruby,Kobe,2022-03-11 01:33:00,2022-03-11 01:47:00,Ari,6.19,0,4318179,CKB -Matthias,Ari,2022-03-11 01:47:00,2022-03-11 01:53:00,Addilyn,2555,0,4318179,CKB -Matthias,Addilyn,2022-03-11 01:53:00,2022-03-11 02:00:00,Ari,2577,9,4318179,CKB -Ruby,Ari,2022-03-11 02:09:00,2022-03-11 02:24:00,Kobe,5937,9,4318179,CKB -Ruby,Kobe,2022-03-11 02:33:00,2022-03-11 02:47:00,Ari,6.19,0,4318179,CKB -Matthias,Ari,2022-03-11 02:47:00,2022-03-11 02:53:00,Addilyn,2555,0,4318179,CKB -Matthias,Addilyn,2022-03-11 02:53:00,2022-03-11 03:00:00,Ari,2577,9,4318179,CKB -Ruby,Ari,2022-03-11 03:09:00,2022-03-11 03:24:00,Kobe,5937,9,4318179,CKB -Ruby,Kobe,2022-03-11 03:33:00,2022-03-11 03:47:00,Ari,6.19,0,4318179,CKB -Matthias,Ari,2022-03-11 03:47:00,2022-03-11 03:53:00,Addilyn,2555,0,4318179,CKB -Matthias,Addilyn,2022-03-11 03:53:00,2022-03-11 04:00:00,Ari,2577,9,4318179,CKB -Ruby,Ari,2022-03-11 04:09:00,2022-03-11 04:24:00,Kobe,5937,0,4318179,CKB -Ruby,Kobe,2022-03-11 04:24:00,2022-03-11 04:24:00,Beckham,0.06,0,4318179,CKB -Rosie,Beckham,2022-03-11 00:57:00,2022-03-11 00:57:00,Lexi,0.06,0,4319354,CKB -Rosie,Lexi,2022-03-11 00:57:00,2022-03-11 01:06:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 01:06:00,2022-03-11 01:11:00,Lexi,2936,16,4319354,CKB -Rosie,Lexi,2022-03-11 01:27:00,2022-03-11 01:36:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 01:36:00,2022-03-11 01:41:00,Lexi,2936,16,4319354,CKB -Rosie,Lexi,2022-03-11 01:57:00,2022-03-11 02:06:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 02:06:00,2022-03-11 02:11:00,Lexi,2936,16,4319354,CKB -Rosie,Lexi,2022-03-11 02:27:00,2022-03-11 02:36:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 02:36:00,2022-03-11 02:41:00,Lexi,2936,16,4319354,CKB -Rosie,Lexi,2022-03-11 02:57:00,2022-03-11 03:06:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 03:06:00,2022-03-11 03:11:00,Lexi,2936,16,4319354,CKB -Rosie,Lexi,2022-03-11 03:27:00,2022-03-11 03:36:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 03:36:00,2022-03-11 03:41:00,Lexi,2936,16,4319354,CKB -Rosie,Lexi,2022-03-11 03:57:00,2022-03-11 04:06:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 04:06:00,2022-03-11 04:11:00,Lexi,2936,16,4319354,CKB -Rosie,Lexi,2022-03-11 04:27:00,2022-03-11 04:36:00,Colton,4343,0,4319354,CKB -Rosie,Colton,2022-03-11 04:36:00,2022-03-11 04:36:00,Beckham,0.06,0,4319354,CKB -Daxton,Beckham,2022-03-11 00:29:00,2022-03-11 00:29:00,Harper,0.06,0,4751089,CKB -Daxton,Harper,2022-03-11 00:29:00,2022-03-11 00:41:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 00:47:00,2022-03-11 00:57:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 00:59:00,2022-03-11 01:11:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 01:17:00,2022-03-11 01:27:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 01:29:00,2022-03-11 01:41:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 01:47:00,2022-03-11 01:57:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 01:59:00,2022-03-11 02:11:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 02:17:00,2022-03-11 02:27:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 02:29:00,2022-03-11 02:41:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 02:47:00,2022-03-11 02:57:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 02:59:00,2022-03-11 03:11:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 03:17:00,2022-03-11 03:27:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 03:29:00,2022-03-11 03:41:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 03:47:00,2022-03-11 03:57:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 03:59:00,2022-03-11 04:11:00,Calvin,4481,6,4751089,CKB -Daxton,Calvin,2022-03-11 04:17:00,2022-03-11 04:27:00,Harper,4031,2,4751089,CKB -Daxton,Harper,2022-03-11 04:29:00,2022-03-11 04:41:00,Calvin,4481,0,4751089,CKB -Daxton,Calvin,2022-03-11 04:41:00,2022-03-11 04:41:00,Beckham,0.06,0,4751089,CKB -Andy,Beckham,2022-03-11 00:30:00,2022-03-11 00:30:00,Harper,0.06,0,4453547,CKB -Andy,Harper,2022-03-11 00:30:00,2022-03-11 00:44:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 00:44:00,2022-03-11 00:57:00,Harper,5302,3,4453547,CKB -Andy,Harper,2022-03-11 01:00:00,2022-03-11 01:14:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 01:14:00,2022-03-11 01:27:00,Harper,5302,3,4453547,CKB -Andy,Harper,2022-03-11 01:30:00,2022-03-11 01:44:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 01:44:00,2022-03-11 01:57:00,Harper,5302,3,4453547,CKB -Andy,Harper,2022-03-11 02:00:00,2022-03-11 02:14:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 02:14:00,2022-03-11 02:27:00,Harper,5302,3,4453547,CKB -Andy,Harper,2022-03-11 02:30:00,2022-03-11 02:44:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 02:44:00,2022-03-11 02:57:00,Harper,5302,3,4453547,CKB -Andy,Harper,2022-03-11 03:00:00,2022-03-11 03:14:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 03:14:00,2022-03-11 03:27:00,Harper,5302,3,4453547,CKB -Andy,Harper,2022-03-11 03:30:00,2022-03-11 03:44:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 03:44:00,2022-03-11 03:57:00,Harper,5302,3,4453547,CKB -Andy,Harper,2022-03-11 04:00:00,2022-03-11 04:14:00,Elise,4801,0,4453547,CKB -Andy,Elise,2022-03-11 04:14:00,2022-03-11 04:27:00,Harper,5302,0,4453547,CKB -Andy,Harper,2022-03-11 04:27:00,2022-03-11 04:27:00,Beckham,0.06,0,4453547,CKB -Alex,Beckham,2022-03-11 00:43:00,2022-03-11 00:43:00,Chase,0.06,0,4374469,CKB -Alex,Chase,2022-03-11 00:43:00,2022-03-11 01:33:00,Chase,20434,10,4374469,CKB -Alex,Chase,2022-03-11 01:43:00,2022-03-11 02:33:00,Chase,20434,10,4374469,CKB -Alex,Chase,2022-03-11 02:43:00,2022-03-11 03:33:00,Chase,20434,10,4374469,CKB -Alex,Chase,2022-03-11 03:43:00,2022-03-11 04:33:00,Chase,20434,0,4374469,CKB -Alex,Chase,2022-03-11 04:33:00,2022-03-11 04:33:00,Beckham,0.06,0,4374469,CKB -Alex,Beckham,2022-03-11 00:13:00,2022-03-11 00:13:00,Chase,0.06,0,4374474,CKB -Alex,Chase,2022-03-11 00:13:00,2022-03-11 01:03:00,Chase,20434,10,4374474,CKB -Alex,Chase,2022-03-11 01:13:00,2022-03-11 02:03:00,Chase,20434,10,4374474,CKB -Alex,Chase,2022-03-11 02:13:00,2022-03-11 03:03:00,Chase,20434,10,4374474,CKB -Alex,Chase,2022-03-11 03:13:00,2022-03-11 04:03:00,Chase,20434,0,4374474,CKB -Alex,Chase,2022-03-11 04:03:00,2022-03-11 04:03:00,Beckham,0.06,0,4374474,CKB -Hazel,Beckham,2022-03-11 00:24:00,2022-03-11 00:24:00,Celine,0.06,0,4456450,CKB -Hazel,Celine,2022-03-11 00:24:00,2022-03-11 00:48:00,Kali,11.86,4,4456450,CKB -Hazel,Kali,2022-03-11 00:52:00,2022-03-11 01:14:00,Celine,11139,10,4456450,CKB -Hazel,Celine,2022-03-11 01:24:00,2022-03-11 01:48:00,Kali,11.86,4,4456450,CKB -Hazel,Kali,2022-03-11 01:52:00,2022-03-11 02:14:00,Celine,11139,10,4456450,CKB -Hazel,Celine,2022-03-11 02:24:00,2022-03-11 02:48:00,Kali,11.86,4,4456450,CKB -Hazel,Kali,2022-03-11 02:52:00,2022-03-11 03:14:00,Celine,11139,10,4456450,CKB -Hazel,Celine,2022-03-11 03:24:00,2022-03-11 03:48:00,Kali,11.86,4,4456450,CKB -Hazel,Kali,2022-03-11 03:52:00,2022-03-11 04:14:00,Celine,11139,0,4456450,CKB -Hazel,Celine,2022-03-11 04:14:00,2022-03-11 04:14:00,Beckham,0.06,0,4456450,CKB -Hazel,Beckham,2022-03-11 00:22:00,2022-03-11 00:22:00,Kali,0.06,0,4456458,CKB -Hazel,Kali,2022-03-11 00:22:00,2022-03-11 00:44:00,Celine,11139,10,4456458,CKB -Hazel,Celine,2022-03-11 00:54:00,2022-03-11 01:18:00,Kali,11.86,4,4456458,CKB -Hazel,Kali,2022-03-11 01:22:00,2022-03-11 01:44:00,Celine,11139,10,4456458,CKB -Hazel,Celine,2022-03-11 01:54:00,2022-03-11 02:18:00,Kali,11.86,4,4456458,CKB -Hazel,Kali,2022-03-11 02:22:00,2022-03-11 02:44:00,Celine,11139,10,4456458,CKB -Hazel,Celine,2022-03-11 02:54:00,2022-03-11 03:18:00,Kali,11.86,4,4456458,CKB -Hazel,Kali,2022-03-11 03:22:00,2022-03-11 03:44:00,Celine,11139,10,4456458,CKB -Hazel,Celine,2022-03-11 03:54:00,2022-03-11 04:18:00,Kali,11.86,4,4456458,CKB -Hazel,Kali,2022-03-11 04:22:00,2022-03-11 04:44:00,Celine,11139,0,4456458,CKB -Hazel,Celine,2022-03-11 04:44:00,2022-03-11 04:44:00,Beckham,0.06,0,4456458,CKB -Emilio,Beckham,2022-03-11 00:32:00,2022-03-11 00:32:00,Rose,0.06,0,4747652,CKB -Emilio,Rose,2022-03-11 00:32:00,2022-03-11 00:44:00,Brooklynn,4212,3,4747652,CKB -Emilio,Brooklynn,2022-03-11 00:47:00,2022-03-11 01:16:00,Francis,13048,0,4747652,CKB -Emilio,Francis,2022-03-11 01:16:00,2022-03-11 01:42:00,Brooklynn,12869,5,4747652,CKB -Emilio,Brooklynn,2022-03-11 01:47:00,2022-03-11 02:16:00,Francis,13048,0,4747652,CKB -Emilio,Francis,2022-03-11 02:16:00,2022-03-11 02:42:00,Brooklynn,12869,5,4747652,CKB -Emilio,Brooklynn,2022-03-11 02:47:00,2022-03-11 03:16:00,Francis,13048,0,4747652,CKB -Emilio,Francis,2022-03-11 03:16:00,2022-03-11 03:42:00,Brooklynn,12869,5,4747652,CKB -Emilio,Brooklynn,2022-03-11 03:47:00,2022-03-11 04:16:00,Francis,13048,0,4747652,CKB -Emilio,Francis,2022-03-11 04:16:00,2022-03-11 04:34:00,Gia,9538,0,4747652,CKB -Emilio,Gia,2022-03-11 04:34:00,2022-03-11 04:34:00,Beckham,0.06,0,4747652,CKB -Emilio,Beckham,2022-03-11 00:17:00,2022-03-11 00:17:00,Brooklynn,0.06,0,4747662,CKB -Emilio,Brooklynn,2022-03-11 00:17:00,2022-03-11 00:46:00,Francis,13048,0,4747662,CKB -Emilio,Francis,2022-03-11 00:46:00,2022-03-11 01:12:00,Brooklynn,12869,5,4747662,CKB -Emilio,Brooklynn,2022-03-11 01:17:00,2022-03-11 01:46:00,Francis,13048,0,4747662,CKB -Emilio,Francis,2022-03-11 01:46:00,2022-03-11 02:12:00,Brooklynn,12869,5,4747662,CKB -Emilio,Brooklynn,2022-03-11 02:17:00,2022-03-11 02:46:00,Francis,13048,0,4747662,CKB -Emilio,Francis,2022-03-11 02:46:00,2022-03-11 03:12:00,Brooklynn,12869,5,4747662,CKB -Emilio,Brooklynn,2022-03-11 03:17:00,2022-03-11 03:46:00,Francis,13048,0,4747662,CKB -Emilio,Francis,2022-03-11 03:46:00,2022-03-11 04:12:00,Brooklynn,12869,5,4747662,CKB -Emilio,Brooklynn,2022-03-11 04:17:00,2022-03-11 04:28:00,Rose,4316,0,4747662,CKB -Emilio,Rose,2022-03-11 04:28:00,2022-03-11 04:28:00,Beckham,0.06,0,4747662,CKB -Ryder,Beckham,2022-03-11 00:49:00,2022-03-11 00:49:00,Kehlani,0.06,0,4434343,CKB -Ryder,Kehlani,2022-03-11 00:49:00,2022-03-11 01:04:00,Ariyah,10229,0,4434343,CKB -Ryder,Ariyah,2022-03-11 01:04:00,2022-03-11 01:19:00,Kehlani,11801,0,4434343,CKB -Ryder,Kehlani,2022-03-11 01:19:00,2022-03-11 01:34:00,Ariyah,10229,0,4434343,CKB -Ryder,Ariyah,2022-03-11 01:34:00,2022-03-11 01:49:00,Kehlani,11801,0,4434343,CKB -Ryder,Kehlani,2022-03-11 01:49:00,2022-03-11 02:04:00,Ariyah,10229,0,4434343,CKB -Ryder,Ariyah,2022-03-11 02:04:00,2022-03-11 02:19:00,Kehlani,11801,0,4434343,CKB -Ryder,Kehlani,2022-03-11 02:19:00,2022-03-11 02:34:00,Ariyah,10229,0,4434343,CKB -Ryder,Ariyah,2022-03-11 02:34:00,2022-03-11 02:49:00,Kehlani,11801,0,4434343,CKB -Ryder,Kehlani,2022-03-11 02:49:00,2022-03-11 03:04:00,Ariyah,10229,0,4434343,CKB -Ryder,Ariyah,2022-03-11 03:04:00,2022-03-11 03:19:00,Kehlani,11801,0,4434343,CKB -Ryder,Kehlani,2022-03-11 03:19:00,2022-03-11 03:34:00,Ariyah,10229,0,4434343,CKB -Ryder,Ariyah,2022-03-11 03:34:00,2022-03-11 03:49:00,Kehlani,11801,0,4434343,CKB -Ryder,Kehlani,2022-03-11 03:49:00,2022-03-11 04:04:00,Ariyah,10229,0,4434343,CKB -Ryder,Ariyah,2022-03-11 04:04:00,2022-03-11 04:19:00,Kehlani,11801,23,4434343,CKB -Kian,Kehlani,2022-03-11 04:42:00,2022-03-11 05:04:00,Finley,6.81,0,4434343,CKB -Kian,Finley,2022-03-11 05:04:00,2022-03-11 05:04:00,Beckham,0.06,0,4434343,CKB -Jake,Beckham,2022-03-11 00:32:00,2022-03-11 00:32:00,Rose,0.06,0,4434899,CKB -Jake,Rose,2022-03-11 00:32:00,2022-03-11 00:57:00,Kamila,11545,6,4434899,CKB -Jake,Kamila,2022-03-11 01:03:00,2022-03-11 01:46:00,Kayleigh,20579,1,4434899,CKB -Jake,Kayleigh,2022-03-11 01:47:00,2022-03-11 02:25:00,Kamila,20641,8,4434899,CKB -Jake,Kamila,2022-03-11 02:33:00,2022-03-11 03:16:00,Kayleigh,20579,1,4434899,CKB -Jake,Kayleigh,2022-03-11 03:17:00,2022-03-11 03:55:00,Kamila,20641,8,4434899,CKB -Jake,Kamila,2022-03-11 04:03:00,2022-03-11 04:28:00,Rose,11499,0,4434899,CKB -Jake,Rose,2022-03-11 04:28:00,2022-03-11 04:28:00,Beckham,0.06,0,4434899,CKB -Jake,Beckham,2022-03-11 00:33:00,2022-03-11 00:33:00,Kamila,0.06,0,4434904,CKB -Jake,Kamila,2022-03-11 00:33:00,2022-03-11 01:16:00,Kayleigh,20579,1,4434904,CKB -Jake,Kayleigh,2022-03-11 01:17:00,2022-03-11 01:55:00,Kamila,20641,8,4434904,CKB -Jake,Kamila,2022-03-11 02:03:00,2022-03-11 02:46:00,Kayleigh,20579,1,4434904,CKB -Jake,Kayleigh,2022-03-11 02:47:00,2022-03-11 03:25:00,Kamila,20641,8,4434904,CKB -Jake,Kamila,2022-03-11 03:33:00,2022-03-11 04:16:00,Kayleigh,20579,1,4434904,CKB -Jake,Kayleigh,2022-03-11 04:17:00,2022-03-11 04:51:00,Willa,18752,0,4434904,CKB -Jake,Willa,2022-03-11 04:51:00,2022-03-11 04:51:00,Beckham,0.06,0,4434904,CKB -Aziel,Beckham,2022-03-11 00:34:00,2022-03-11 00:34:00,Miles,0.06,0,4619768,CKB -Aziel,Miles,2022-03-11 00:34:00,2022-03-11 01:00:00,Delilah,9016,0,4619768,CKB -Aziel,Delilah,2022-03-11 01:00:00,2022-03-11 01:27:00,Miles,10083,7,4619768,CKB -Aziel,Miles,2022-03-11 01:34:00,2022-03-11 02:00:00,Delilah,9016,0,4619768,CKB -Aziel,Delilah,2022-03-11 02:00:00,2022-03-11 02:27:00,Miles,10083,7,4619768,CKB -Aziel,Miles,2022-03-11 02:34:00,2022-03-11 03:00:00,Delilah,9016,0,4619768,CKB -Aziel,Delilah,2022-03-11 03:00:00,2022-03-11 03:27:00,Miles,10083,7,4619768,CKB -Aziel,Miles,2022-03-11 03:34:00,2022-03-11 04:00:00,Delilah,9016,0,4619768,CKB -Aziel,Delilah,2022-03-11 04:00:00,2022-03-11 04:27:00,Miles,10083,0,4619768,CKB -Aziel,Miles,2022-03-11 04:27:00,2022-03-11 04:27:00,Beckham,0.06,0,4619768,CKB -Aziel,Beckham,2022-03-11 00:30:00,2022-03-11 00:30:00,Delilah,0.06,0,4619993,CKB -Aziel,Delilah,2022-03-11 00:30:00,2022-03-11 00:57:00,Miles,10083,7,4619993,CKB -Aziel,Miles,2022-03-11 01:04:00,2022-03-11 01:30:00,Delilah,9016,0,4619993,CKB -Aziel,Delilah,2022-03-11 01:30:00,2022-03-11 01:57:00,Miles,10083,7,4619993,CKB -Aziel,Miles,2022-03-11 02:04:00,2022-03-11 02:30:00,Delilah,9016,0,4619993,CKB -Aziel,Delilah,2022-03-11 02:30:00,2022-03-11 02:57:00,Miles,10083,7,4619993,CKB -Aziel,Miles,2022-03-11 03:04:00,2022-03-11 03:30:00,Delilah,9016,0,4619993,CKB -Aziel,Delilah,2022-03-11 03:30:00,2022-03-11 03:57:00,Miles,10083,7,4619993,CKB -Aziel,Miles,2022-03-11 04:04:00,2022-03-11 04:30:00,Delilah,9016,0,4619993,CKB -Aziel,Delilah,2022-03-11 04:30:00,2022-03-11 04:57:00,Miles,10083,0,4619993,CKB -Aziel,Miles,2022-03-11 04:57:00,2022-03-11 04:57:00,Beckham,0.06,0,4619993,CKB -Dalton,Beckham,2022-03-11 00:31:00,2022-03-11 00:31:00,Kamila,0.06,0,4374746,CKB -Dalton,Kamila,2022-03-11 00:31:00,2022-03-11 00:44:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 00:44:00,2022-03-11 00:56:00,Kamila,5362,5,4374746,CKB -Dalton,Kamila,2022-03-11 01:01:00,2022-03-11 01:14:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 01:14:00,2022-03-11 01:26:00,Kamila,5362,5,4374746,CKB -Dalton,Kamila,2022-03-11 01:31:00,2022-03-11 01:44:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 01:44:00,2022-03-11 01:56:00,Kamila,5362,5,4374746,CKB -Dalton,Kamila,2022-03-11 02:01:00,2022-03-11 02:14:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 02:14:00,2022-03-11 02:26:00,Kamila,5362,5,4374746,CKB -Dalton,Kamila,2022-03-11 02:31:00,2022-03-11 02:44:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 02:44:00,2022-03-11 02:56:00,Kamila,5362,5,4374746,CKB -Dalton,Kamila,2022-03-11 03:01:00,2022-03-11 03:14:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 03:14:00,2022-03-11 03:26:00,Kamila,5362,5,4374746,CKB -Dalton,Kamila,2022-03-11 03:31:00,2022-03-11 03:44:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 03:44:00,2022-03-11 03:56:00,Kamila,5362,5,4374746,CKB -Dalton,Kamila,2022-03-11 04:01:00,2022-03-11 04:14:00,Veronica,4872,0,4374746,CKB -Dalton,Veronica,2022-03-11 04:14:00,2022-03-11 04:26:00,Kamila,5362,0,4374746,CKB -Dalton,Kamila,2022-03-11 04:26:00,2022-03-11 04:26:00,Beckham,0.06,0,4374746,CKB -Jamison,Beckham,2022-03-11 00:31:00,2022-03-11 00:31:00,Kamila,0.06,0,4374869,CKB -Jamison,Kamila,2022-03-11 00:31:00,2022-03-11 00:45:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 00:47:00,2022-03-11 01:01:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 01:01:00,2022-03-11 01:15:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 01:17:00,2022-03-11 01:31:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 01:31:00,2022-03-11 01:45:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 01:47:00,2022-03-11 02:01:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 02:01:00,2022-03-11 02:15:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 02:17:00,2022-03-11 02:31:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 02:31:00,2022-03-11 02:45:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 02:47:00,2022-03-11 03:01:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 03:01:00,2022-03-11 03:15:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 03:17:00,2022-03-11 03:31:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 03:31:00,2022-03-11 03:45:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 03:47:00,2022-03-11 04:01:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 04:01:00,2022-03-11 04:15:00,Liana,5225,2,4374869,CKB -Jamison,Liana,2022-03-11 04:17:00,2022-03-11 04:31:00,Kamila,7617,0,4374869,CKB -Jamison,Kamila,2022-03-11 04:31:00,2022-03-11 04:31:00,Beckham,0.06,0,4374869,CKB -Keegan,Beckham,2022-03-11 00:43:00,2022-03-11 00:43:00,Charleigh,0.06,0,4375015,CKB -Keegan,Charleigh,2022-03-11 00:43:00,2022-03-11 00:53:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 00:53:00,2022-03-11 01:03:00,Charleigh,4408,10,4375015,CKB -Keegan,Charleigh,2022-03-11 01:13:00,2022-03-11 01:23:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 01:23:00,2022-03-11 01:33:00,Charleigh,4408,10,4375015,CKB -Keegan,Charleigh,2022-03-11 01:43:00,2022-03-11 01:53:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 01:53:00,2022-03-11 02:03:00,Charleigh,4408,10,4375015,CKB -Keegan,Charleigh,2022-03-11 02:13:00,2022-03-11 02:23:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 02:23:00,2022-03-11 02:33:00,Charleigh,4408,10,4375015,CKB -Keegan,Charleigh,2022-03-11 02:43:00,2022-03-11 02:53:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 02:53:00,2022-03-11 03:03:00,Charleigh,4408,10,4375015,CKB -Keegan,Charleigh,2022-03-11 03:13:00,2022-03-11 03:23:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 03:23:00,2022-03-11 03:33:00,Charleigh,4408,10,4375015,CKB -Keegan,Charleigh,2022-03-11 03:43:00,2022-03-11 03:53:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 03:53:00,2022-03-11 04:03:00,Charleigh,4408,10,4375015,CKB -Keegan,Charleigh,2022-03-11 04:13:00,2022-03-11 04:23:00,Eli,4507,0,4375015,CKB -Keegan,Eli,2022-03-11 04:23:00,2022-03-11 04:33:00,Charleigh,4408,0,4375015,CKB -Keegan,Charleigh,2022-03-11 04:33:00,2022-03-11 04:33:00,Beckham,0.06,0,4375015,CKB -Ayaan,Beckham,2022-03-11 21:31:00,2022-03-11 21:31:00,Kalani,0.06,0,4454947,CKB -Ayaan,Kalani,2022-03-11 21:31:00,2022-03-11 22:04:00,Brian,14519,4,4454947,CKB -Ayaan,Brian,2022-03-11 22:08:00,2022-03-11 22:43:00,Kalani,13541,8,4454947,CKB -Ayaan,Kalani,2022-03-11 22:51:00,2022-03-11 23:24:00,Brian,14519,4,4454947,CKB -Ayaan,Brian,2022-03-11 23:28:00,2022-03-12 00:03:00,Kalani,13541,8,4454947,CKB -Ayaan,Kalani,2022-03-12 00:11:00,2022-03-12 00:44:00,Brian,14519,0,4454947,CKB -Hunter,Brian,2022-03-12 00:44:00,2022-03-12 00:54:00,Kehlani,4.1,25,4454947,CKB -Hunter,Kehlani,2022-03-12 01:19:00,2022-03-12 01:42:00,Ayden,8.36,6,4454947,CKB -Hunter,Ayden,2022-03-12 01:48:00,2022-03-12 02:06:00,Kehlani,9067,13,4454947,CKB -Hunter,Kehlani,2022-03-12 02:19:00,2022-03-12 02:42:00,Ayden,8.36,6,4454947,CKB -Hunter,Ayden,2022-03-12 02:48:00,2022-03-12 03:06:00,Kehlani,9067,13,4454947,CKB -Hunter,Kehlani,2022-03-12 03:19:00,2022-03-12 03:42:00,Ayden,8.36,6,4454947,CKB -Hunter,Ayden,2022-03-12 03:48:00,2022-03-12 04:06:00,Kehlani,9067,13,4454947,CKB -Hunter,Kehlani,2022-03-12 04:19:00,2022-03-12 04:42:00,Ayden,8.36,6,4454947,CKB -Hunter,Ayden,2022-03-12 04:48:00,2022-03-12 05:06:00,Kehlani,9067,13,4454947,CKB -Hunter,Kehlani,2022-03-12 05:19:00,2022-03-12 05:42:00,Ayden,8.36,16,4454947,CKB -Kian,Ayden,2022-03-12 05:58:00,2022-03-12 06:34:00,Finley,12968,0,4454947,CKB -Kian,Finley,2022-03-12 06:34:00,2022-03-12 06:34:00,Beckham,0.06,0,4454947,CKB -Ayaan,Beckham,2022-03-11 22:11:00,2022-03-11 22:11:00,Kalani,0.06,0,4454952,CKB -Ayaan,Kalani,2022-03-11 22:11:00,2022-03-11 22:44:00,Brian,14519,4,4454952,CKB -Ayaan,Brian,2022-03-11 22:48:00,2022-03-11 23:23:00,Kalani,13541,8,4454952,CKB -Ayaan,Kalani,2022-03-11 23:31:00,2022-03-12 00:04:00,Brian,14519,4,4454952,CKB -Ayaan,Brian,2022-03-12 00:08:00,2022-03-12 00:39:00,Leonel,12213,0,4454952,CKB -Hunter,Leonel,2022-03-12 00:39:00,2022-03-12 00:47:00,Kehlani,4.0,2,4454952,CKB -Hunter,Kehlani,2022-03-12 00:49:00,2022-03-12 01:12:00,Ayden,8.36,6,4454952,CKB -Hunter,Ayden,2022-03-12 01:18:00,2022-03-12 01:36:00,Kehlani,9067,13,4454952,CKB -Hunter,Kehlani,2022-03-12 01:49:00,2022-03-12 02:12:00,Ayden,8.36,6,4454952,CKB -Hunter,Ayden,2022-03-12 02:18:00,2022-03-12 02:36:00,Kehlani,9067,13,4454952,CKB -Hunter,Kehlani,2022-03-12 02:49:00,2022-03-12 03:12:00,Ayden,8.36,6,4454952,CKB -Hunter,Ayden,2022-03-12 03:18:00,2022-03-12 03:36:00,Kehlani,9067,13,4454952,CKB -Hunter,Kehlani,2022-03-12 03:49:00,2022-03-12 04:12:00,Ayden,8.36,6,4454952,CKB -Hunter,Ayden,2022-03-12 04:18:00,2022-03-12 04:36:00,Kehlani,9067,13,4454952,CKB -Hunter,Kehlani,2022-03-12 04:49:00,2022-03-12 05:12:00,Ayden,8.36,6,4454952,CKB -Hunter,Ayden,2022-03-12 05:18:00,2022-03-12 05:36:00,Kehlani,9067,0,4454952,CKB -Hunter,Kehlani,2022-03-12 05:36:00,2022-03-12 05:36:00,Beckham,0.06,0,4454952,CKB -Donovan,Beckham,2022-03-11 21:06:00,2022-03-11 21:06:00,Pierce,0.06,0,4664738,CKB -Donovan,Pierce,2022-03-11 21:06:00,2022-03-11 21:34:00,Leonardo,13018,19,4664738,CKB -Donovan,Leonardo,2022-03-11 21:53:00,2022-03-11 22:13:00,Kamryn,10332,17,4664738,CKB -Donovan,Kamryn,2022-03-11 22:30:00,2022-03-11 22:54:00,Leonardo,10.48,19,4664738,CKB -Donovan,Leonardo,2022-03-11 23:13:00,2022-03-11 23:33:00,Kamryn,10332,17,4664738,CKB -Donovan,Kamryn,2022-03-11 23:50:00,2022-03-12 00:14:00,Leonardo,10.48,8,4664738,CKB -Donovan,Leonardo,2022-03-12 00:22:00,2022-03-12 00:27:00,Iker,2533,2,4664738,CKB -Zoey,Iker,2022-03-12 00:29:00,2022-03-12 00:47:00,Brinley,7.58,0,4664738,CKB -Zoey,Brinley,2022-03-12 00:47:00,2022-03-12 01:14:00,Finn,12841,3,4664738,CKB -Zoey,Finn,2022-03-12 01:17:00,2022-03-12 01:47:00,Brinley,14281,0,4664738,CKB -Zoey,Brinley,2022-03-12 01:47:00,2022-03-12 02:14:00,Finn,12841,3,4664738,CKB -Zoey,Finn,2022-03-12 02:17:00,2022-03-12 02:47:00,Brinley,14281,0,4664738,CKB -Zoey,Brinley,2022-03-12 02:47:00,2022-03-12 03:14:00,Finn,12841,3,4664738,CKB -Zoey,Finn,2022-03-12 03:17:00,2022-03-12 03:47:00,Brinley,14281,0,4664738,CKB -Zoey,Brinley,2022-03-12 03:47:00,2022-03-12 04:14:00,Finn,12841,3,4664738,CKB -Zoey,Finn,2022-03-12 04:17:00,2022-03-12 04:47:00,Brinley,14281,0,4664738,CKB -Zoey,Brinley,2022-03-12 04:47:00,2022-03-12 05:14:00,Finn,12841,3,4664738,CKB -Zoey,Finn,2022-03-12 05:17:00,2022-03-12 05:47:00,Brinley,14281,0,4664738,CKB -Zoey,Brinley,2022-03-12 05:47:00,2022-03-12 05:47:00,Beckham,0.06,0,4664738,CKB -Donovan,Beckham,2022-03-11 20:26:00,2022-03-11 20:26:00,Pierce,0.06,0,4762763,CKB -Donovan,Pierce,2022-03-11 20:26:00,2022-03-11 20:56:00,Ezra,14097,14,4762763,CKB -Donovan,Ezra,2022-03-11 21:10:00,2022-03-11 21:38:00,Pierce,13.19,8,4762763,CKB -Donovan,Pierce,2022-03-11 21:46:00,2022-03-11 22:14:00,Leonardo,13018,19,4762763,CKB -Donovan,Leonardo,2022-03-11 22:33:00,2022-03-11 22:53:00,Kamryn,10332,17,4762763,CKB -Donovan,Kamryn,2022-03-11 23:10:00,2022-03-11 23:34:00,Leonardo,10.48,19,4762763,CKB -Donovan,Leonardo,2022-03-11 23:53:00,2022-03-12 00:13:00,Kamryn,10332,2,4762763,CKB -Donovan,Kamryn,2022-03-12 00:15:00,2022-03-12 00:16:00,Brinley,506,1,4762763,CKB -Zoey,Brinley,2022-03-12 00:17:00,2022-03-12 00:44:00,Finn,12841,3,4762763,CKB -Zoey,Finn,2022-03-12 00:47:00,2022-03-12 01:17:00,Brinley,14281,0,4762763,CKB -Zoey,Brinley,2022-03-12 01:17:00,2022-03-12 01:44:00,Finn,12841,3,4762763,CKB -Zoey,Finn,2022-03-12 01:47:00,2022-03-12 02:17:00,Brinley,14281,0,4762763,CKB -Zoey,Brinley,2022-03-12 02:17:00,2022-03-12 02:44:00,Finn,12841,3,4762763,CKB -Zoey,Finn,2022-03-12 02:47:00,2022-03-12 03:17:00,Brinley,14281,0,4762763,CKB -Zoey,Brinley,2022-03-12 03:17:00,2022-03-12 03:44:00,Finn,12841,3,4762763,CKB -Zoey,Finn,2022-03-12 03:47:00,2022-03-12 04:17:00,Brinley,14281,0,4762763,CKB -Zoey,Brinley,2022-03-12 04:17:00,2022-03-12 04:44:00,Finn,12841,3,4762763,CKB -Zoey,Finn,2022-03-12 04:47:00,2022-03-12 05:17:00,Brinley,14281,0,4762763,CKB -Zoey,Brinley,2022-03-12 05:17:00,2022-03-12 05:29:00,Iker,5474,0,4762763,CKB -Zoey,Iker,2022-03-12 05:29:00,2022-03-12 05:29:00,Beckham,0.06,0,4762763,CKB -Avery,Beckham,2022-03-11 22:56:00,2022-03-11 22:56:00,Jace,0.06,0,4617429,CKB -Avery,Jace,2022-03-11 22:56:00,2022-03-11 23:08:00,Nathan,5882,3,4617429,CKB -Avery,Nathan,2022-03-11 23:11:00,2022-03-11 23:25:00,Jace,6232,0,4617429,CKB -Avery,Jace,2022-03-11 23:25:00,2022-03-11 23:38:00,Nathan,6086,3,4617429,CKB -Avery,Nathan,2022-03-11 23:41:00,2022-03-11 23:55:00,Jace,6232,0,4617429,CKB -Avery,Jace,2022-03-11 23:55:00,2022-03-12 00:08:00,Nathan,6086,0,4617429,CKB -Avery,Nathan,2022-03-12 00:08:00,2022-03-12 00:08:00,Beckham,0.06,0,4617429,CKB -Richard,Beckham,2022-03-11 05:05:00,2022-03-11 05:05:00,Ariyah,0.06,0,4426848,CKB -Richard,Ariyah,2022-03-11 05:05:00,2022-03-11 05:14:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 05:14:00,2022-03-11 05:23:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 05:25:00,2022-03-11 05:34:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 05:34:00,2022-03-11 05:43:00,Ariyah,5139,23,4426848,CKB -Richard,Ariyah,2022-03-11 06:06:00,2022-03-11 06:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 06:15:00,2022-03-11 06:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 06:26:00,2022-03-11 06:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 06:35:00,2022-03-11 06:44:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 06:46:00,2022-03-11 06:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 06:55:00,2022-03-11 07:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 07:06:00,2022-03-11 07:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 07:15:00,2022-03-11 07:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 07:26:00,2022-03-11 07:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 07:35:00,2022-03-11 07:44:00,Ariyah,5139,22,4426848,CKB -Richard,Ariyah,2022-03-11 08:06:00,2022-03-11 08:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 08:15:00,2022-03-11 08:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 08:26:00,2022-03-11 08:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 08:35:00,2022-03-11 08:44:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 08:46:00,2022-03-11 08:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 08:55:00,2022-03-11 09:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 09:06:00,2022-03-11 09:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 09:15:00,2022-03-11 09:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 09:26:00,2022-03-11 09:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 09:35:00,2022-03-11 09:44:00,Ariyah,5139,22,4426848,CKB -Richard,Ariyah,2022-03-11 10:06:00,2022-03-11 10:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 10:15:00,2022-03-11 10:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 10:26:00,2022-03-11 10:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 10:35:00,2022-03-11 10:44:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 10:46:00,2022-03-11 10:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 10:55:00,2022-03-11 11:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 11:06:00,2022-03-11 11:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 11:15:00,2022-03-11 11:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 11:26:00,2022-03-11 11:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 11:35:00,2022-03-11 11:44:00,Ariyah,5139,22,4426848,CKB -Richard,Ariyah,2022-03-11 12:06:00,2022-03-11 12:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 12:15:00,2022-03-11 12:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 12:26:00,2022-03-11 12:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 12:35:00,2022-03-11 12:44:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 12:46:00,2022-03-11 12:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 12:55:00,2022-03-11 13:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 13:06:00,2022-03-11 13:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 13:15:00,2022-03-11 13:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 13:26:00,2022-03-11 13:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 13:35:00,2022-03-11 13:44:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 13:46:00,2022-03-11 13:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 13:55:00,2022-03-11 14:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 14:06:00,2022-03-11 14:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 14:15:00,2022-03-11 14:24:00,Ariyah,5139,22,4426848,CKB -Richard,Ariyah,2022-03-11 14:46:00,2022-03-11 14:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 14:55:00,2022-03-11 15:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 15:06:00,2022-03-11 15:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 15:15:00,2022-03-11 15:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 15:26:00,2022-03-11 15:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 15:35:00,2022-03-11 15:44:00,Ariyah,5139,22,4426848,CKB -Richard,Ariyah,2022-03-11 16:06:00,2022-03-11 16:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 16:15:00,2022-03-11 16:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 16:26:00,2022-03-11 16:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 16:35:00,2022-03-11 16:44:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 16:46:00,2022-03-11 16:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 16:55:00,2022-03-11 17:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 17:06:00,2022-03-11 17:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 17:15:00,2022-03-11 17:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 17:26:00,2022-03-11 17:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 17:35:00,2022-03-11 17:44:00,Ariyah,5139,22,4426848,CKB -Richard,Ariyah,2022-03-11 18:06:00,2022-03-11 18:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 18:15:00,2022-03-11 18:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 18:26:00,2022-03-11 18:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 18:35:00,2022-03-11 18:44:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 18:46:00,2022-03-11 18:55:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 18:55:00,2022-03-11 19:04:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 19:06:00,2022-03-11 19:15:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 19:15:00,2022-03-11 19:24:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 19:26:00,2022-03-11 19:35:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 19:35:00,2022-03-11 19:44:00,Ariyah,5139,21,4426848,CKB -Richard,Ariyah,2022-03-11 20:05:00,2022-03-11 20:14:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 20:14:00,2022-03-11 20:23:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 20:25:00,2022-03-11 20:34:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 20:34:00,2022-03-11 20:43:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 20:45:00,2022-03-11 20:54:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 20:54:00,2022-03-11 21:03:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 21:05:00,2022-03-11 21:14:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 21:14:00,2022-03-11 21:23:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 21:25:00,2022-03-11 21:34:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 21:34:00,2022-03-11 21:43:00,Ariyah,5139,22,4426848,CKB -Richard,Ariyah,2022-03-11 22:05:00,2022-03-11 22:14:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 22:14:00,2022-03-11 22:23:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 22:25:00,2022-03-11 22:34:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 22:34:00,2022-03-11 22:43:00,Ariyah,5139,2,4426848,CKB -Richard,Ariyah,2022-03-11 22:45:00,2022-03-11 22:54:00,Jaden,4781,0,4426848,CKB -Richard,Jaden,2022-03-11 22:54:00,2022-03-11 23:03:00,Ariyah,5139,0,4426848,CKB -Richard,Ariyah,2022-03-11 23:03:00,2022-03-11 23:03:00,Beckham,0.06,0,4426848,CKB -Astrid,King,2022-03-11 05:15:00,2022-03-11 06:01:00,Brayden,17.9,0,4317628,VDL -Astrid,Brayden,2022-03-11 06:01:00,2022-03-11 06:15:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 06:23:00,2022-03-11 06:37:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 06:41:00,2022-03-11 06:55:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 07:03:00,2022-03-11 07:17:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 07:21:00,2022-03-11 07:35:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 07:43:00,2022-03-11 07:57:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 08:01:00,2022-03-11 08:15:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 08:23:00,2022-03-11 08:37:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 08:41:00,2022-03-11 08:55:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 09:03:00,2022-03-11 09:17:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 09:21:00,2022-03-11 09:35:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 09:43:00,2022-03-11 09:57:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 10:01:00,2022-03-11 10:15:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 10:23:00,2022-03-11 10:37:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 10:41:00,2022-03-11 10:55:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 11:03:00,2022-03-11 11:17:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 11:21:00,2022-03-11 11:35:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 11:43:00,2022-03-11 11:57:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 12:01:00,2022-03-11 12:15:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 12:23:00,2022-03-11 12:37:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 12:41:00,2022-03-11 12:55:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 13:03:00,2022-03-11 13:17:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 13:21:00,2022-03-11 13:35:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 13:43:00,2022-03-11 13:57:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 14:01:00,2022-03-11 14:15:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 14:23:00,2022-03-11 14:37:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 14:41:00,2022-03-11 14:55:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 15:03:00,2022-03-11 15:17:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 15:21:00,2022-03-11 15:35:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 15:43:00,2022-03-11 15:57:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 16:01:00,2022-03-11 16:15:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 16:23:00,2022-03-11 16:37:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 16:41:00,2022-03-11 16:55:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 17:03:00,2022-03-11 17:17:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 17:21:00,2022-03-11 17:35:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 17:43:00,2022-03-11 17:57:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 18:01:00,2022-03-11 18:15:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 18:23:00,2022-03-11 18:37:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 18:41:00,2022-03-11 18:55:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 19:03:00,2022-03-11 19:17:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 19:21:00,2022-03-11 19:35:00,Brayden,4637,8,4317628,VDL -Astrid,Brayden,2022-03-11 19:43:00,2022-03-11 19:57:00,Brayden,4637,4,4317628,VDL -Astrid,Brayden,2022-03-11 20:01:00,2022-03-11 20:14:00,Brayden,4637,9,4317628,VDL -Astrid,Brayden,2022-03-11 20:23:00,2022-03-11 20:36:00,Brayden,4637,0,4317628,VDL -Astrid,Brayden,2022-03-11 20:36:00,2022-03-11 21:15:00,King,19.8,0,4317628,VDL -Amy,Beckham,2022-03-11 04:56:00,2022-03-11 04:56:00,Izabella,0.06,18,4425671,CKB -Amy,Izabella,2022-03-11 05:14:00,2022-03-11 05:20:00,Tristan,3.29,0,4425671,CKB -Amy,Tristan,2022-03-11 05:20:00,2022-03-11 05:24:00,Izabella,2954,20,4425671,CKB -Amy,Izabella,2022-03-11 05:44:00,2022-03-11 05:50:00,Tristan,3.29,0,4425671,CKB -Amy,Tristan,2022-03-11 05:50:00,2022-03-11 05:54:00,Izabella,2954,5,4425671,CKB -Amy,Izabella,2022-03-11 05:59:00,2022-03-11 06:06:00,Tristan,3.29,2,4425671,CKB -Amy,Tristan,2022-03-11 06:08:00,2022-03-11 06:13:00,Izabella,2954,19,4425671,CKB -Amy,Izabella,2022-03-11 06:32:00,2022-03-11 06:39:00,Tristan,3.29,1,4425671,CKB -Amy,Tristan,2022-03-11 06:40:00,2022-03-11 06:45:00,Izabella,2954,7,4425671,CKB -Amy,Izabella,2022-03-11 06:52:00,2022-03-11 06:59:00,Tristan,3.29,1,4425671,CKB -Amy,Tristan,2022-03-11 07:00:00,2022-03-11 07:05:00,Izabella,2954,7,4425671,CKB -Amy,Izabella,2022-03-11 07:12:00,2022-03-11 07:19:00,Tristan,3.29,1,4425671,CKB -Amy,Tristan,2022-03-11 07:20:00,2022-03-11 07:25:00,Izabella,2954,7,4425671,CKB -Amy,Izabella,2022-03-11 07:32:00,2022-03-11 07:39:00,Tristan,3.29,1,4425671,CKB -Amy,Tristan,2022-03-11 07:40:00,2022-03-11 07:45:00,Izabella,2954,295,4425671,CKB -Amy,Izabella,2022-03-11 12:40:00,2022-03-11 12:47:00,Tristan,3.29,2,4425671,CKB -Amy,Tristan,2022-03-11 12:49:00,2022-03-11 12:54:00,Izabella,2954,46,4425671,CKB -Amy,Izabella,2022-03-11 13:40:00,2022-03-11 13:47:00,Tristan,3.29,2,4425671,CKB -Amy,Tristan,2022-03-11 13:49:00,2022-03-11 13:54:00,Izabella,2954,434,4425671,CKB -Amy,Izabella,2022-03-11 21:08:00,2022-03-11 21:08:00,Beckham,0.06,0,4425671,CKB -Matilda,Beckham,2022-03-11 07:20:00,2022-03-11 07:20:00,Izaiah,0.06,0,4448153,CKB -Matilda,Izaiah,2022-03-11 07:20:00,2022-03-11 07:50:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 08:00:00,2022-03-11 08:30:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 08:40:00,2022-03-11 09:10:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 09:20:00,2022-03-11 09:50:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 10:00:00,2022-03-11 10:30:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 10:40:00,2022-03-11 11:10:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 11:20:00,2022-03-11 11:50:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 12:00:00,2022-03-11 12:30:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 12:40:00,2022-03-11 13:10:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 13:20:00,2022-03-11 13:50:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 14:00:00,2022-03-11 14:30:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 14:40:00,2022-03-11 15:10:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 15:20:00,2022-03-11 15:50:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 16:00:00,2022-03-11 16:30:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 16:40:00,2022-03-11 17:10:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 17:20:00,2022-03-11 17:50:00,Izaiah,9266,10,4448153,CKB -Matilda,Izaiah,2022-03-11 18:00:00,2022-03-11 18:30:00,Izaiah,9266,0,4448153,CKB -Matilda,Izaiah,2022-03-11 18:30:00,2022-03-11 18:30:00,Beckham,0.06,0,4448153,CKB -Hailey,Beckham,2022-03-11 07:10:00,2022-03-11 07:10:00,Kaylani,0.06,0,4733898,CKB -Hailey,Kaylani,2022-03-11 07:10:00,2022-03-11 07:18:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 07:28:00,2022-03-11 07:40:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 07:40:00,2022-03-11 07:48:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 07:58:00,2022-03-11 08:10:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 08:10:00,2022-03-11 08:18:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 08:28:00,2022-03-11 08:40:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 08:40:00,2022-03-11 08:48:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 08:58:00,2022-03-11 09:10:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 09:10:00,2022-03-11 09:18:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 09:28:00,2022-03-11 09:40:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 09:40:00,2022-03-11 09:48:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 09:58:00,2022-03-11 10:10:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 10:10:00,2022-03-11 10:18:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 10:28:00,2022-03-11 10:40:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 10:40:00,2022-03-11 10:48:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 10:58:00,2022-03-11 11:10:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 11:10:00,2022-03-11 11:18:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 11:28:00,2022-03-11 11:40:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 11:40:00,2022-03-11 11:48:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 11:58:00,2022-03-11 12:10:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 12:10:00,2022-03-11 12:18:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 12:28:00,2022-03-11 12:40:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 12:40:00,2022-03-11 12:48:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 12:58:00,2022-03-11 13:10:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 13:10:00,2022-03-11 13:18:00,Cecilia,2169,10,4733898,CKB -Hailey,Cecilia,2022-03-11 13:28:00,2022-03-11 13:40:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 13:40:00,2022-03-11 13:48:00,Cecilia,2169,8,4733898,CKB -Hailey,Cecilia,2022-03-11 13:56:00,2022-03-11 14:10:00,Kaylani,2952,0,4733898,CKB -Hailey,Kaylani,2022-03-11 14:10:00,2022-03-11 14:19:00,Cecilia,2169,14,4733898,CKB -Hailey,Cecilia,2022-03-11 14:33:00,2022-03-11 14:47:00,Kaylani,2952,3,4733898,CKB -Hailey,Kaylani,2022-03-11 14:50:00,2022-03-11 14:59:00,Cecilia,2169,14,4733898,CKB -Hailey,Cecilia,2022-03-11 15:13:00,2022-03-11 15:27:00,Kaylani,2952,3,4733898,CKB -Hailey,Kaylani,2022-03-11 15:30:00,2022-03-11 15:39:00,Cecilia,2169,14,4733898,CKB -Hailey,Cecilia,2022-03-11 15:53:00,2022-03-11 16:07:00,Kaylani,2952,3,4733898,CKB -Hailey,Kaylani,2022-03-11 16:10:00,2022-03-11 16:19:00,Cecilia,2169,14,4733898,CKB -Hailey,Cecilia,2022-03-11 16:33:00,2022-03-11 16:47:00,Kaylani,2952,3,4733898,CKB -Hailey,Kaylani,2022-03-11 16:50:00,2022-03-11 16:59:00,Cecilia,2169,14,4733898,CKB -Hailey,Cecilia,2022-03-11 17:13:00,2022-03-11 17:27:00,Kaylani,2952,3,4733898,CKB -Hailey,Kaylani,2022-03-11 17:30:00,2022-03-11 17:39:00,Cecilia,2169,13,4733898,CKB -Hailey,Cecilia,2022-03-11 17:52:00,2022-03-11 18:05:00,Kaylani,2952,5,4733898,CKB -Hailey,Kaylani,2022-03-11 18:10:00,2022-03-11 18:18:00,Cecilia,2169,0,4733898,CKB -Hailey,Cecilia,2022-03-11 18:18:00,2022-03-11 18:18:00,Beckham,0.06,0,4733898,CKB -Hailey,Beckham,2022-03-11 14:13:00,2022-03-11 14:13:00,Cecilia,0.06,0,4734203,CKB -Hailey,Cecilia,2022-03-11 14:13:00,2022-03-11 14:27:00,Kaylani,2952,3,4734203,CKB -Hailey,Kaylani,2022-03-11 14:30:00,2022-03-11 14:39:00,Cecilia,2169,14,4734203,CKB -Hailey,Cecilia,2022-03-11 14:53:00,2022-03-11 15:07:00,Kaylani,2952,3,4734203,CKB -Hailey,Kaylani,2022-03-11 15:10:00,2022-03-11 15:19:00,Cecilia,2169,14,4734203,CKB -Hailey,Cecilia,2022-03-11 15:33:00,2022-03-11 15:47:00,Kaylani,2952,3,4734203,CKB -Hailey,Kaylani,2022-03-11 15:50:00,2022-03-11 15:59:00,Cecilia,2169,14,4734203,CKB -Hailey,Cecilia,2022-03-11 16:13:00,2022-03-11 16:27:00,Kaylani,2952,3,4734203,CKB -Hailey,Kaylani,2022-03-11 16:30:00,2022-03-11 16:39:00,Cecilia,2169,14,4734203,CKB -Hailey,Cecilia,2022-03-11 16:53:00,2022-03-11 17:07:00,Kaylani,2952,3,4734203,CKB -Hailey,Kaylani,2022-03-11 17:10:00,2022-03-11 17:19:00,Cecilia,2169,14,4734203,CKB -Hailey,Cecilia,2022-03-11 17:33:00,2022-03-11 17:47:00,Kaylani,2952,3,4734203,CKB -Hailey,Kaylani,2022-03-11 17:50:00,2022-03-11 17:59:00,Cecilia,2169,14,4734203,CKB -Hailey,Cecilia,2022-03-11 18:13:00,2022-03-11 18:25:00,Kaylani,2952,0,4734203,CKB -Hailey,Kaylani,2022-03-11 18:25:00,2022-03-11 18:25:00,Beckham,0.06,0,4734203,CKB -Matthias,Beckham,2022-03-12 00:23:00,2022-03-12 00:23:00,Addilyn,0.06,0,4318160,CKB -Matthias,Addilyn,2022-03-12 00:23:00,2022-03-12 00:30:00,Ari,2577,9,4318160,CKB -Ruby,Ari,2022-03-12 00:39:00,2022-03-12 00:54:00,Kobe,5937,9,4318160,CKB -Ruby,Kobe,2022-03-12 01:03:00,2022-03-12 01:17:00,Ari,6.19,0,4318160,CKB -Matthias,Ari,2022-03-12 01:17:00,2022-03-12 01:23:00,Addilyn,2555,0,4318160,CKB -Matthias,Addilyn,2022-03-12 01:23:00,2022-03-12 01:30:00,Ari,2577,9,4318160,CKB -Ruby,Ari,2022-03-12 01:39:00,2022-03-12 01:54:00,Kobe,5937,9,4318160,CKB -Ruby,Kobe,2022-03-12 02:03:00,2022-03-12 02:17:00,Ari,6.19,0,4318160,CKB -Matthias,Ari,2022-03-12 02:17:00,2022-03-12 02:23:00,Addilyn,2555,0,4318160,CKB -Matthias,Addilyn,2022-03-12 02:23:00,2022-03-12 02:30:00,Ari,2577,9,4318160,CKB -Ruby,Ari,2022-03-12 02:39:00,2022-03-12 02:54:00,Kobe,5937,9,4318160,CKB -Ruby,Kobe,2022-03-12 03:03:00,2022-03-12 03:17:00,Ari,6.19,0,4318160,CKB -Matthias,Ari,2022-03-12 03:17:00,2022-03-12 03:23:00,Addilyn,2555,0,4318160,CKB -Matthias,Addilyn,2022-03-12 03:23:00,2022-03-12 03:30:00,Ari,2577,9,4318160,CKB -Ruby,Ari,2022-03-12 03:39:00,2022-03-12 03:54:00,Kobe,5937,9,4318160,CKB -Ruby,Kobe,2022-03-12 04:03:00,2022-03-12 04:17:00,Ari,6.19,0,4318160,CKB -Matthias,Ari,2022-03-12 04:17:00,2022-03-12 04:23:00,Addilyn,2555,0,4318160,CKB -Matthias,Addilyn,2022-03-12 04:23:00,2022-03-12 04:30:00,Ari,2577,9,4318160,CKB -Ruby,Ari,2022-03-12 04:39:00,2022-03-12 04:54:00,Kobe,5937,9,4318160,CKB -Ruby,Kobe,2022-03-12 05:03:00,2022-03-12 05:17:00,Ari,6.19,0,4318160,CKB -Rosie,Ari,2022-03-12 05:17:00,2022-03-12 05:38:00,Colton,12.0,28,4318160,CKB -Rosie,Colton,2022-03-12 06:06:00,2022-03-12 06:11:00,Lexi,2936,16,4318160,CKB -Rosie,Lexi,2022-03-12 06:27:00,2022-03-12 06:36:00,Colton,4343,10,4318160,CKB -Rosie,Colton,2022-03-12 06:46:00,2022-03-12 06:51:00,Lexi,2936,0,4318160,CKB -Amy,Lexi,2022-03-12 06:51:00,2022-03-12 07:00:00,Izabella,4.6,12,4318160,CKB -Amy,Izabella,2022-03-12 07:12:00,2022-03-12 07:12:00,Izabella,0.0,836,4318160,CKB -Amy,Izabella,2022-03-12 21:08:00,2022-03-12 21:08:00,Izabella,0.0,0,4318160,CKB -Amy,Izabella,2022-03-12 21:08:00,2022-03-12 21:08:00,Beckham,0.06,0,4318160,CKB -Ruby,Beckham,2022-03-12 00:33:00,2022-03-12 00:33:00,Kobe,0.06,0,4318180,CKB -Ruby,Kobe,2022-03-12 00:33:00,2022-03-12 00:47:00,Ari,6.19,0,4318180,CKB -Matthias,Ari,2022-03-12 00:47:00,2022-03-12 00:53:00,Addilyn,2555,0,4318180,CKB -Matthias,Addilyn,2022-03-12 00:53:00,2022-03-12 01:00:00,Ari,2577,9,4318180,CKB -Ruby,Ari,2022-03-12 01:09:00,2022-03-12 01:24:00,Kobe,5937,9,4318180,CKB -Ruby,Kobe,2022-03-12 01:33:00,2022-03-12 01:47:00,Ari,6.19,0,4318180,CKB -Matthias,Ari,2022-03-12 01:47:00,2022-03-12 01:53:00,Addilyn,2555,0,4318180,CKB -Matthias,Addilyn,2022-03-12 01:53:00,2022-03-12 02:00:00,Ari,2577,9,4318180,CKB -Ruby,Ari,2022-03-12 02:09:00,2022-03-12 02:24:00,Kobe,5937,9,4318180,CKB -Ruby,Kobe,2022-03-12 02:33:00,2022-03-12 02:47:00,Ari,6.19,0,4318180,CKB -Matthias,Ari,2022-03-12 02:47:00,2022-03-12 02:53:00,Addilyn,2555,0,4318180,CKB -Matthias,Addilyn,2022-03-12 02:53:00,2022-03-12 03:00:00,Ari,2577,9,4318180,CKB -Ruby,Ari,2022-03-12 03:09:00,2022-03-12 03:24:00,Kobe,5937,9,4318180,CKB -Ruby,Kobe,2022-03-12 03:33:00,2022-03-12 03:47:00,Ari,6.19,0,4318180,CKB -Matthias,Ari,2022-03-12 03:47:00,2022-03-12 03:53:00,Addilyn,2555,0,4318180,CKB -Matthias,Addilyn,2022-03-12 03:53:00,2022-03-12 04:00:00,Ari,2577,9,4318180,CKB -Ruby,Ari,2022-03-12 04:09:00,2022-03-12 04:24:00,Kobe,5937,9,4318180,CKB -Ruby,Kobe,2022-03-12 04:33:00,2022-03-12 04:47:00,Ari,6.19,0,4318180,CKB -Matthias,Ari,2022-03-12 04:47:00,2022-03-12 04:53:00,Addilyn,2555,0,4318180,CKB -Matthias,Addilyn,2022-03-12 04:53:00,2022-03-12 05:00:00,Ari,2577,9,4318180,CKB -Ruby,Ari,2022-03-12 05:09:00,2022-03-12 05:24:00,Kobe,5937,0,4318180,CKB -Ruby,Kobe,2022-03-12 05:24:00,2022-03-12 05:24:00,Beckham,0.06,0,4318180,CKB -Rosie,Beckham,2022-03-12 00:57:00,2022-03-12 00:57:00,Lexi,0.06,0,4319355,CKB -Rosie,Lexi,2022-03-12 00:57:00,2022-03-12 01:06:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 01:06:00,2022-03-12 01:11:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 01:27:00,2022-03-12 01:36:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 01:36:00,2022-03-12 01:41:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 01:57:00,2022-03-12 02:06:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 02:06:00,2022-03-12 02:11:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 02:27:00,2022-03-12 02:36:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 02:36:00,2022-03-12 02:41:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 02:57:00,2022-03-12 03:06:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 03:06:00,2022-03-12 03:11:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 03:27:00,2022-03-12 03:36:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 03:36:00,2022-03-12 03:41:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 03:57:00,2022-03-12 04:06:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 04:06:00,2022-03-12 04:11:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 04:27:00,2022-03-12 04:36:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 04:36:00,2022-03-12 04:41:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 04:57:00,2022-03-12 05:06:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 05:06:00,2022-03-12 05:11:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 05:27:00,2022-03-12 05:36:00,Colton,4343,0,4319355,CKB -Rosie,Colton,2022-03-12 05:36:00,2022-03-12 05:41:00,Lexi,2936,16,4319355,CKB -Rosie,Lexi,2022-03-12 05:57:00,2022-03-12 06:06:00,Colton,4343,20,4319355,CKB -Rosie,Colton,2022-03-12 06:26:00,2022-03-12 06:31:00,Lexi,2936,0,4319355,CKB -Rosie,Lexi,2022-03-12 06:31:00,2022-03-12 06:31:00,Beckham,0.06,0,4319355,CKB -Andy,Beckham,2022-03-12 00:30:00,2022-03-12 00:30:00,Harper,0.06,0,4453548,CKB -Andy,Harper,2022-03-12 00:30:00,2022-03-12 00:44:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 00:44:00,2022-03-12 00:57:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 01:00:00,2022-03-12 01:14:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 01:14:00,2022-03-12 01:27:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 01:30:00,2022-03-12 01:44:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 01:44:00,2022-03-12 01:57:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 02:00:00,2022-03-12 02:14:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 02:14:00,2022-03-12 02:27:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 02:30:00,2022-03-12 02:44:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 02:44:00,2022-03-12 02:57:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 03:00:00,2022-03-12 03:14:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 03:14:00,2022-03-12 03:27:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 03:30:00,2022-03-12 03:44:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 03:44:00,2022-03-12 03:57:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 04:00:00,2022-03-12 04:14:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 04:14:00,2022-03-12 04:27:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 04:30:00,2022-03-12 04:44:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 04:44:00,2022-03-12 04:57:00,Harper,5302,3,4453548,CKB -Andy,Harper,2022-03-12 05:00:00,2022-03-12 05:14:00,Elise,4801,0,4453548,CKB -Andy,Elise,2022-03-12 05:14:00,2022-03-12 05:27:00,Harper,5302,0,4453548,CKB -Andy,Harper,2022-03-12 05:27:00,2022-03-12 05:27:00,Beckham,0.06,0,4453548,CKB -Emilio,Beckham,2022-03-12 00:32:00,2022-03-12 00:32:00,Rose,0.06,0,4747653,CKB -Emilio,Rose,2022-03-12 00:32:00,2022-03-12 00:44:00,Brooklynn,4212,3,4747653,CKB -Emilio,Brooklynn,2022-03-12 00:47:00,2022-03-12 01:16:00,Francis,13048,0,4747653,CKB -Emilio,Francis,2022-03-12 01:16:00,2022-03-12 01:42:00,Brooklynn,12869,5,4747653,CKB -Emilio,Brooklynn,2022-03-12 01:47:00,2022-03-12 02:16:00,Francis,13048,0,4747653,CKB -Emilio,Francis,2022-03-12 02:16:00,2022-03-12 02:42:00,Brooklynn,12869,5,4747653,CKB -Emilio,Brooklynn,2022-03-12 02:47:00,2022-03-12 03:16:00,Francis,13048,0,4747653,CKB -Emilio,Francis,2022-03-12 03:16:00,2022-03-12 03:42:00,Brooklynn,12869,5,4747653,CKB -Emilio,Brooklynn,2022-03-12 03:47:00,2022-03-12 04:16:00,Francis,13048,0,4747653,CKB -Emilio,Francis,2022-03-12 04:16:00,2022-03-12 04:42:00,Brooklynn,12869,5,4747653,CKB -Emilio,Brooklynn,2022-03-12 04:47:00,2022-03-12 05:16:00,Francis,13048,0,4747653,CKB -Emilio,Francis,2022-03-12 05:16:00,2022-03-12 05:34:00,Gia,9538,0,4747653,CKB -Emilio,Gia,2022-03-12 05:34:00,2022-03-12 05:34:00,Beckham,0.06,0,4747653,CKB -Emilio,Beckham,2022-03-12 00:17:00,2022-03-12 00:17:00,Brooklynn,0.06,0,4747663,CKB -Emilio,Brooklynn,2022-03-12 00:17:00,2022-03-12 00:46:00,Francis,13048,0,4747663,CKB -Emilio,Francis,2022-03-12 00:46:00,2022-03-12 01:12:00,Brooklynn,12869,5,4747663,CKB -Emilio,Brooklynn,2022-03-12 01:17:00,2022-03-12 01:46:00,Francis,13048,0,4747663,CKB -Emilio,Francis,2022-03-12 01:46:00,2022-03-12 02:12:00,Brooklynn,12869,5,4747663,CKB -Emilio,Brooklynn,2022-03-12 02:17:00,2022-03-12 02:46:00,Francis,13048,0,4747663,CKB -Emilio,Francis,2022-03-12 02:46:00,2022-03-12 03:12:00,Brooklynn,12869,5,4747663,CKB -Emilio,Brooklynn,2022-03-12 03:17:00,2022-03-12 03:46:00,Francis,13048,0,4747663,CKB -Emilio,Francis,2022-03-12 03:46:00,2022-03-12 04:12:00,Brooklynn,12869,5,4747663,CKB -Emilio,Brooklynn,2022-03-12 04:17:00,2022-03-12 04:46:00,Francis,13048,0,4747663,CKB -Emilio,Francis,2022-03-12 04:46:00,2022-03-12 05:12:00,Brooklynn,12869,0,4747663,CKB -Emilio,Brooklynn,2022-03-12 05:12:00,2022-03-12 05:12:00,Beckham,0.06,0,4747663,CKB -Ryder,Beckham,2022-03-12 00:49:00,2022-03-12 00:49:00,Kehlani,0.06,0,4434344,CKB -Ryder,Kehlani,2022-03-12 00:49:00,2022-03-12 01:04:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 01:04:00,2022-03-12 01:19:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 01:19:00,2022-03-12 01:34:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 01:34:00,2022-03-12 01:49:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 01:49:00,2022-03-12 02:04:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 02:04:00,2022-03-12 02:19:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 02:19:00,2022-03-12 02:34:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 02:34:00,2022-03-12 02:49:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 02:49:00,2022-03-12 03:04:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 03:04:00,2022-03-12 03:19:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 03:19:00,2022-03-12 03:34:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 03:34:00,2022-03-12 03:49:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 03:49:00,2022-03-12 04:04:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 04:04:00,2022-03-12 04:19:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 04:19:00,2022-03-12 04:34:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 04:34:00,2022-03-12 04:49:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 04:49:00,2022-03-12 05:04:00,Ariyah,10229,0,4434344,CKB -Ryder,Ariyah,2022-03-12 05:04:00,2022-03-12 05:19:00,Kehlani,11801,0,4434344,CKB -Ryder,Kehlani,2022-03-12 05:19:00,2022-03-12 05:19:00,Beckham,0.06,0,4434344,CKB -Aziel,Beckham,2022-03-12 02:34:00,2022-03-12 02:34:00,Miles,0.06,0,4514364,CKB -Aziel,Miles,2022-03-12 02:34:00,2022-03-12 03:00:00,Delilah,9016,0,4514364,CKB -Aziel,Delilah,2022-03-12 03:00:00,2022-03-12 03:27:00,Miles,10083,7,4514364,CKB -Aziel,Miles,2022-03-12 03:34:00,2022-03-12 04:00:00,Delilah,9016,0,4514364,CKB -Aziel,Delilah,2022-03-12 04:00:00,2022-03-12 04:27:00,Miles,10083,7,4514364,CKB -Aziel,Miles,2022-03-12 04:34:00,2022-03-12 05:00:00,Delilah,9016,0,4514364,CKB -Aziel,Delilah,2022-03-12 05:00:00,2022-03-12 05:27:00,Miles,10083,0,4514364,CKB -Aziel,Miles,2022-03-12 05:27:00,2022-03-12 05:27:00,Beckham,0.06,0,4514364,CKB -Aziel,Beckham,2022-03-12 02:04:00,2022-03-12 02:04:00,Miles,0.06,0,4619999,CKB -Aziel,Miles,2022-03-12 02:04:00,2022-03-12 02:30:00,Delilah,9016,0,4619999,CKB -Aziel,Delilah,2022-03-12 02:30:00,2022-03-12 02:57:00,Miles,10083,7,4619999,CKB -Aziel,Miles,2022-03-12 03:04:00,2022-03-12 03:30:00,Delilah,9016,0,4619999,CKB -Aziel,Delilah,2022-03-12 03:30:00,2022-03-12 03:57:00,Miles,10083,7,4619999,CKB -Aziel,Miles,2022-03-12 04:04:00,2022-03-12 04:30:00,Delilah,9016,0,4619999,CKB -Aziel,Delilah,2022-03-12 04:30:00,2022-03-12 04:57:00,Miles,10083,7,4619999,CKB -Aziel,Miles,2022-03-12 05:04:00,2022-03-12 05:30:00,Delilah,9016,0,4619999,CKB -Aziel,Delilah,2022-03-12 05:30:00,2022-03-12 05:30:00,Beckham,0.06,0,4619999,CKB -Dalton,Beckham,2022-03-12 00:31:00,2022-03-12 00:31:00,Kamila,0.06,0,4374747,CKB -Dalton,Kamila,2022-03-12 00:31:00,2022-03-12 00:44:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 00:44:00,2022-03-12 00:56:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 01:01:00,2022-03-12 01:14:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 01:14:00,2022-03-12 01:26:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 01:31:00,2022-03-12 01:44:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 01:44:00,2022-03-12 01:56:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 02:01:00,2022-03-12 02:14:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 02:14:00,2022-03-12 02:26:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 02:31:00,2022-03-12 02:44:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 02:44:00,2022-03-12 02:56:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 03:01:00,2022-03-12 03:14:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 03:14:00,2022-03-12 03:26:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 03:31:00,2022-03-12 03:44:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 03:44:00,2022-03-12 03:56:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 04:01:00,2022-03-12 04:14:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 04:14:00,2022-03-12 04:26:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 04:31:00,2022-03-12 04:44:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 04:44:00,2022-03-12 04:56:00,Kamila,5362,5,4374747,CKB -Dalton,Kamila,2022-03-12 05:01:00,2022-03-12 05:14:00,Veronica,4872,0,4374747,CKB -Dalton,Veronica,2022-03-12 05:14:00,2022-03-12 05:26:00,Kamila,5362,0,4374747,CKB -Dalton,Kamila,2022-03-12 05:26:00,2022-03-12 05:26:00,Beckham,0.06,0,4374747,CKB -Jamison,Beckham,2022-03-12 00:31:00,2022-03-12 00:31:00,Kamila,0.06,0,4374870,CKB -Jamison,Kamila,2022-03-12 00:31:00,2022-03-12 00:45:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 00:47:00,2022-03-12 01:01:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 01:01:00,2022-03-12 01:15:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 01:17:00,2022-03-12 01:31:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 01:31:00,2022-03-12 01:45:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 01:47:00,2022-03-12 02:01:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 02:01:00,2022-03-12 02:15:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 02:17:00,2022-03-12 02:31:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 02:31:00,2022-03-12 02:45:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 02:47:00,2022-03-12 03:01:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 03:01:00,2022-03-12 03:15:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 03:17:00,2022-03-12 03:31:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 03:31:00,2022-03-12 03:45:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 03:47:00,2022-03-12 04:01:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 04:01:00,2022-03-12 04:15:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 04:17:00,2022-03-12 04:31:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 04:31:00,2022-03-12 04:45:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 04:47:00,2022-03-12 05:01:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 05:01:00,2022-03-12 05:15:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 05:17:00,2022-03-12 05:31:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 05:31:00,2022-03-12 05:45:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 05:47:00,2022-03-12 06:01:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 06:01:00,2022-03-12 06:15:00,Liana,5225,2,4374870,CKB -Jamison,Liana,2022-03-12 06:17:00,2022-03-12 06:31:00,Kamila,7617,0,4374870,CKB -Jamison,Kamila,2022-03-12 06:31:00,2022-03-12 06:45:00,Liana,5096,0,4374870,CKB -Jamison,Liana,2022-03-12 06:45:00,2022-03-12 06:45:00,Beckham,0.06,0,4374870,CKB -Keegan,Beckham,2022-03-12 00:43:00,2022-03-12 00:43:00,Charleigh,0.06,0,4375016,CKB -Keegan,Charleigh,2022-03-12 00:43:00,2022-03-12 00:53:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 00:53:00,2022-03-12 01:03:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 01:13:00,2022-03-12 01:23:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 01:23:00,2022-03-12 01:33:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 01:43:00,2022-03-12 01:53:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 01:53:00,2022-03-12 02:03:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 02:13:00,2022-03-12 02:23:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 02:23:00,2022-03-12 02:33:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 02:43:00,2022-03-12 02:53:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 02:53:00,2022-03-12 03:03:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 03:13:00,2022-03-12 03:23:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 03:23:00,2022-03-12 03:33:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 03:43:00,2022-03-12 03:53:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 03:53:00,2022-03-12 04:03:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 04:13:00,2022-03-12 04:23:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 04:23:00,2022-03-12 04:33:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 04:43:00,2022-03-12 04:53:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 04:53:00,2022-03-12 05:03:00,Charleigh,4408,10,4375016,CKB -Keegan,Charleigh,2022-03-12 05:13:00,2022-03-12 05:23:00,Eli,4507,0,4375016,CKB -Keegan,Eli,2022-03-12 05:23:00,2022-03-12 05:23:00,Beckham,0.06,0,4375016,CKB -Ayaan,Beckham,2022-03-12 20:51:00,2022-03-12 20:51:00,Kalani,0.06,0,4454966,CKB -Ayaan,Kalani,2022-03-12 20:51:00,2022-03-12 21:24:00,Brian,14519,4,4454966,CKB -Ayaan,Brian,2022-03-12 21:28:00,2022-03-12 22:03:00,Kalani,13541,8,4454966,CKB -Ayaan,Kalani,2022-03-12 22:11:00,2022-03-12 22:44:00,Brian,14519,4,4454966,CKB -Ayaan,Brian,2022-03-12 22:48:00,2022-03-12 23:23:00,Kalani,13541,8,4454966,CKB -Ayaan,Kalani,2022-03-12 23:31:00,2022-03-13 00:04:00,Brian,14519,4,4454966,CKB -Ayaan,Brian,2022-03-13 00:08:00,2022-03-13 00:39:00,Leonel,12213,0,4454966,CKB -Hunter,Leonel,2022-03-13 00:39:00,2022-03-13 00:47:00,Kehlani,4.0,2,4454966,CKB -Hunter,Kehlani,2022-03-13 00:49:00,2022-03-13 01:12:00,Ayden,8.36,6,4454966,CKB -Hunter,Ayden,2022-03-13 01:18:00,2022-03-13 01:36:00,Kehlani,9067,13,4454966,CKB -Hunter,Kehlani,2022-03-13 01:49:00,2022-03-13 02:12:00,Ayden,8.36,6,4454966,CKB -Hunter,Ayden,2022-03-13 02:18:00,2022-03-13 02:36:00,Kehlani,9067,13,4454966,CKB -Hunter,Kehlani,2022-03-13 02:49:00,2022-03-13 03:12:00,Ayden,8.36,6,4454966,CKB -Hunter,Ayden,2022-03-13 03:18:00,2022-03-13 03:36:00,Kehlani,9067,13,4454966,CKB -Hunter,Kehlani,2022-03-13 03:49:00,2022-03-13 04:12:00,Ayden,8.36,6,4454966,CKB -Hunter,Ayden,2022-03-13 04:18:00,2022-03-13 04:36:00,Kehlani,9067,13,4454966,CKB -Hunter,Kehlani,2022-03-13 04:49:00,2022-03-13 05:12:00,Ayden,8.36,6,4454966,CKB -Hunter,Ayden,2022-03-13 05:18:00,2022-03-13 05:36:00,Kehlani,9067,13,4454966,CKB -Hunter,Kehlani,2022-03-13 05:49:00,2022-03-13 06:08:00,Ayden,8762,10,4454966,CKB -Hunter,Ayden,2022-03-13 06:18:00,2022-03-13 06:36:00,Kehlani,9067,13,4454966,CKB -Hunter,Kehlani,2022-03-13 06:49:00,2022-03-13 07:08:00,Ayden,8762,0,4454966,CKB -Hunter,Ayden,2022-03-13 07:08:00,2022-03-13 07:08:00,Beckham,0.06,0,4454966,CKB -Ayaan,Beckham,2022-03-12 21:31:00,2022-03-12 21:31:00,Kalani,0.06,0,4454967,CKB -Ayaan,Kalani,2022-03-12 21:31:00,2022-03-12 22:04:00,Brian,14519,4,4454967,CKB -Ayaan,Brian,2022-03-12 22:08:00,2022-03-12 22:43:00,Kalani,13541,8,4454967,CKB -Ayaan,Kalani,2022-03-12 22:51:00,2022-03-12 23:24:00,Brian,14519,4,4454967,CKB -Ayaan,Brian,2022-03-12 23:28:00,2022-03-13 00:03:00,Kalani,13541,8,4454967,CKB -Ayaan,Kalani,2022-03-13 00:11:00,2022-03-13 00:44:00,Brian,14519,0,4454967,CKB -Hunter,Brian,2022-03-13 00:44:00,2022-03-13 00:54:00,Kehlani,4.1,25,4454967,CKB -Hunter,Kehlani,2022-03-13 01:19:00,2022-03-13 01:42:00,Ayden,8.36,6,4454967,CKB -Hunter,Ayden,2022-03-13 01:48:00,2022-03-13 02:06:00,Kehlani,9067,13,4454967,CKB -Hunter,Kehlani,2022-03-13 02:19:00,2022-03-13 02:42:00,Ayden,8.36,6,4454967,CKB -Hunter,Ayden,2022-03-13 02:48:00,2022-03-13 03:06:00,Kehlani,9067,13,4454967,CKB -Hunter,Kehlani,2022-03-13 03:19:00,2022-03-13 03:42:00,Ayden,8.36,6,4454967,CKB -Hunter,Ayden,2022-03-13 03:48:00,2022-03-13 04:06:00,Kehlani,9067,13,4454967,CKB -Hunter,Kehlani,2022-03-13 04:19:00,2022-03-13 04:42:00,Ayden,8.36,6,4454967,CKB -Hunter,Ayden,2022-03-13 04:48:00,2022-03-13 05:06:00,Kehlani,9067,13,4454967,CKB -Hunter,Kehlani,2022-03-13 05:19:00,2022-03-13 05:42:00,Ayden,8.36,6,4454967,CKB -Hunter,Ayden,2022-03-13 05:48:00,2022-03-13 06:06:00,Kehlani,9067,0,4454967,CKB -Hunter,Kehlani,2022-03-13 06:06:00,2022-03-13 06:06:00,Beckham,0.06,0,4454967,CKB -Donovan,Beckham,2022-03-12 21:06:00,2022-03-12 21:06:00,Pierce,0.06,0,4664765,CKB -Donovan,Pierce,2022-03-12 21:06:00,2022-03-12 21:34:00,Leonardo,13018,19,4664765,CKB -Donovan,Leonardo,2022-03-12 21:53:00,2022-03-12 22:13:00,Kamryn,10332,17,4664765,CKB -Donovan,Kamryn,2022-03-12 22:30:00,2022-03-12 22:54:00,Leonardo,10.48,19,4664765,CKB -Donovan,Leonardo,2022-03-12 23:13:00,2022-03-12 23:33:00,Kamryn,10332,17,4664765,CKB -Donovan,Kamryn,2022-03-12 23:50:00,2022-03-13 00:14:00,Leonardo,10.48,8,4664765,CKB -Donovan,Leonardo,2022-03-13 00:22:00,2022-03-13 00:27:00,Iker,2533,2,4664765,CKB -Zoey,Iker,2022-03-13 00:29:00,2022-03-13 00:47:00,Brinley,7.58,0,4664765,CKB -Zoey,Brinley,2022-03-13 00:47:00,2022-03-13 01:14:00,Finn,12841,3,4664765,CKB -Zoey,Finn,2022-03-13 01:17:00,2022-03-13 01:47:00,Brinley,14281,0,4664765,CKB -Zoey,Brinley,2022-03-13 01:47:00,2022-03-13 02:14:00,Finn,12841,3,4664765,CKB -Zoey,Finn,2022-03-13 02:17:00,2022-03-13 02:47:00,Brinley,14281,0,4664765,CKB -Zoey,Brinley,2022-03-13 02:47:00,2022-03-13 03:14:00,Finn,12841,3,4664765,CKB -Zoey,Finn,2022-03-13 03:17:00,2022-03-13 03:47:00,Brinley,14281,0,4664765,CKB -Zoey,Brinley,2022-03-13 03:47:00,2022-03-13 04:14:00,Finn,12841,3,4664765,CKB -Zoey,Finn,2022-03-13 04:17:00,2022-03-13 04:47:00,Brinley,14281,0,4664765,CKB -Zoey,Brinley,2022-03-13 04:47:00,2022-03-13 05:14:00,Finn,12841,3,4664765,CKB -Zoey,Finn,2022-03-13 05:17:00,2022-03-13 05:47:00,Brinley,14281,0,4664765,CKB -Zoey,Brinley,2022-03-13 05:47:00,2022-03-13 06:14:00,Finn,12841,3,4664765,CKB -Zoey,Finn,2022-03-13 06:17:00,2022-03-13 06:47:00,Brinley,14281,0,4664765,CKB -Zoey,Brinley,2022-03-13 06:47:00,2022-03-13 06:59:00,Iker,5474,0,4664765,CKB -Zoey,Iker,2022-03-13 06:59:00,2022-03-13 06:59:00,Beckham,0.06,0,4664765,CKB -Donovan,Beckham,2022-03-12 20:26:00,2022-03-12 20:26:00,Pierce,0.06,0,4762771,CKB -Donovan,Pierce,2022-03-12 20:26:00,2022-03-12 20:56:00,Ezra,14097,14,4762771,CKB -Donovan,Ezra,2022-03-12 21:10:00,2022-03-12 21:38:00,Pierce,13.19,8,4762771,CKB -Donovan,Pierce,2022-03-12 21:46:00,2022-03-12 22:14:00,Leonardo,13018,19,4762771,CKB -Donovan,Leonardo,2022-03-12 22:33:00,2022-03-12 22:53:00,Kamryn,10332,17,4762771,CKB -Donovan,Kamryn,2022-03-12 23:10:00,2022-03-12 23:34:00,Leonardo,10.48,19,4762771,CKB -Donovan,Leonardo,2022-03-12 23:53:00,2022-03-13 00:13:00,Kamryn,10332,2,4762771,CKB -Donovan,Kamryn,2022-03-13 00:15:00,2022-03-13 00:16:00,Brinley,506,1,4762771,CKB -Zoey,Brinley,2022-03-13 00:17:00,2022-03-13 00:44:00,Finn,12841,3,4762771,CKB -Zoey,Finn,2022-03-13 00:47:00,2022-03-13 01:17:00,Brinley,14281,0,4762771,CKB -Zoey,Brinley,2022-03-13 01:17:00,2022-03-13 01:44:00,Finn,12841,3,4762771,CKB -Zoey,Finn,2022-03-13 01:47:00,2022-03-13 02:17:00,Brinley,14281,0,4762771,CKB -Zoey,Brinley,2022-03-13 02:17:00,2022-03-13 02:44:00,Finn,12841,3,4762771,CKB -Zoey,Finn,2022-03-13 02:47:00,2022-03-13 03:17:00,Brinley,14281,0,4762771,CKB -Zoey,Brinley,2022-03-13 03:17:00,2022-03-13 03:44:00,Finn,12841,3,4762771,CKB -Zoey,Finn,2022-03-13 03:47:00,2022-03-13 04:17:00,Brinley,14281,0,4762771,CKB -Zoey,Brinley,2022-03-13 04:17:00,2022-03-13 04:44:00,Finn,12841,3,4762771,CKB -Zoey,Finn,2022-03-13 04:47:00,2022-03-13 05:17:00,Brinley,14281,0,4762771,CKB -Zoey,Brinley,2022-03-13 05:17:00,2022-03-13 05:44:00,Finn,12841,3,4762771,CKB -Zoey,Finn,2022-03-13 05:47:00,2022-03-13 06:17:00,Brinley,14281,0,4762771,CKB -Zoey,Brinley,2022-03-13 06:17:00,2022-03-13 06:44:00,Finn,12841,3,4762771,CKB -Zoey,Finn,2022-03-13 06:47:00,2022-03-13 07:17:00,Brinley,14281,0,4762771,CKB -Zoey,Brinley,2022-03-13 07:17:00,2022-03-13 07:17:00,Beckham,0.06,0,4762771,CKB -Avery,Beckham,2022-03-12 20:26:00,2022-03-12 20:26:00,Jace,0.06,0,4617438,CKB -Avery,Jace,2022-03-12 20:26:00,2022-03-12 20:38:00,Nathan,5882,3,4617438,CKB -Avery,Nathan,2022-03-12 20:41:00,2022-03-12 20:55:00,Jace,6232,0,4617438,CKB -Avery,Jace,2022-03-12 20:55:00,2022-03-12 21:08:00,Nathan,6086,3,4617438,CKB -Avery,Nathan,2022-03-12 21:11:00,2022-03-12 21:25:00,Jace,6232,0,4617438,CKB -Avery,Jace,2022-03-12 21:25:00,2022-03-12 21:38:00,Nathan,6086,3,4617438,CKB -Avery,Nathan,2022-03-12 21:41:00,2022-03-12 21:55:00,Jace,6232,0,4617438,CKB -Avery,Jace,2022-03-12 21:55:00,2022-03-12 22:08:00,Nathan,6086,3,4617438,CKB -Avery,Nathan,2022-03-12 22:11:00,2022-03-12 22:25:00,Jace,6232,0,4617438,CKB -Avery,Jace,2022-03-12 22:25:00,2022-03-12 22:38:00,Nathan,6086,3,4617438,CKB -Avery,Nathan,2022-03-12 22:41:00,2022-03-12 22:55:00,Jace,6232,0,4617438,CKB -Avery,Jace,2022-03-12 22:55:00,2022-03-12 23:08:00,Nathan,6086,3,4617438,CKB -Avery,Nathan,2022-03-12 23:11:00,2022-03-12 23:25:00,Jace,6232,0,4617438,CKB -Avery,Jace,2022-03-12 23:25:00,2022-03-12 23:38:00,Nathan,6086,3,4617438,CKB -Avery,Nathan,2022-03-12 23:41:00,2022-03-12 23:55:00,Jace,6232,0,4617438,CKB -Avery,Jace,2022-03-12 23:55:00,2022-03-13 00:08:00,Nathan,6086,0,4617438,CKB -Avery,Nathan,2022-03-13 00:08:00,2022-03-13 00:08:00,Beckham,0.06,0,4617438,CKB -Richard,Beckham,2022-03-12 05:25:00,2022-03-12 05:25:00,Ariyah,0.06,0,4426894,CKB -Richard,Ariyah,2022-03-12 05:25:00,2022-03-12 05:34:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 05:34:00,2022-03-12 05:43:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 06:05:00,2022-03-12 06:14:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 06:14:00,2022-03-12 06:23:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 06:25:00,2022-03-12 06:34:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 06:34:00,2022-03-12 06:43:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 06:45:00,2022-03-12 06:54:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 06:54:00,2022-03-12 07:03:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 07:05:00,2022-03-12 07:14:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 07:14:00,2022-03-12 07:23:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 07:25:00,2022-03-12 07:34:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 07:34:00,2022-03-12 07:43:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 08:05:00,2022-03-12 08:14:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 08:14:00,2022-03-12 08:23:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 08:25:00,2022-03-12 08:34:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 08:34:00,2022-03-12 08:43:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 08:45:00,2022-03-12 08:54:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 08:54:00,2022-03-12 09:03:00,Ariyah,5139,3,4426894,CKB -Richard,Ariyah,2022-03-12 09:06:00,2022-03-12 09:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 09:15:00,2022-03-12 09:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 09:26:00,2022-03-12 09:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 09:35:00,2022-03-12 09:44:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 10:06:00,2022-03-12 10:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 10:15:00,2022-03-12 10:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 10:26:00,2022-03-12 10:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 10:35:00,2022-03-12 10:44:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 10:46:00,2022-03-12 10:55:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 10:55:00,2022-03-12 11:04:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 11:06:00,2022-03-12 11:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 11:15:00,2022-03-12 11:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 11:26:00,2022-03-12 11:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 11:35:00,2022-03-12 11:44:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 12:06:00,2022-03-12 12:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 12:15:00,2022-03-12 12:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 12:26:00,2022-03-12 12:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 12:35:00,2022-03-12 12:44:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 12:46:00,2022-03-12 12:55:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 12:55:00,2022-03-12 13:04:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 13:06:00,2022-03-12 13:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 13:15:00,2022-03-12 13:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 13:26:00,2022-03-12 13:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 13:35:00,2022-03-12 13:44:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 14:06:00,2022-03-12 14:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 14:15:00,2022-03-12 14:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 14:26:00,2022-03-12 14:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 14:35:00,2022-03-12 14:44:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 14:46:00,2022-03-12 14:55:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 14:55:00,2022-03-12 15:04:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 15:06:00,2022-03-12 15:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 15:15:00,2022-03-12 15:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 15:26:00,2022-03-12 15:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 15:35:00,2022-03-12 15:44:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 16:06:00,2022-03-12 16:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 16:15:00,2022-03-12 16:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 16:26:00,2022-03-12 16:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 16:35:00,2022-03-12 16:44:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 16:46:00,2022-03-12 16:55:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 16:55:00,2022-03-12 17:04:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 17:06:00,2022-03-12 17:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 17:15:00,2022-03-12 17:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 17:26:00,2022-03-12 17:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 17:35:00,2022-03-12 17:44:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 18:06:00,2022-03-12 18:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 18:15:00,2022-03-12 18:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 18:26:00,2022-03-12 18:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 18:35:00,2022-03-12 18:44:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 18:46:00,2022-03-12 18:55:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 18:55:00,2022-03-12 19:04:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 19:06:00,2022-03-12 19:15:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 19:15:00,2022-03-12 19:24:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 19:26:00,2022-03-12 19:35:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 19:35:00,2022-03-12 19:44:00,Ariyah,5139,21,4426894,CKB -Richard,Ariyah,2022-03-12 20:05:00,2022-03-12 20:14:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 20:14:00,2022-03-12 20:23:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 20:25:00,2022-03-12 20:34:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 20:34:00,2022-03-12 20:43:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 20:45:00,2022-03-12 20:54:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 20:54:00,2022-03-12 21:03:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 21:05:00,2022-03-12 21:14:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 21:14:00,2022-03-12 21:23:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 21:25:00,2022-03-12 21:34:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 21:34:00,2022-03-12 21:43:00,Ariyah,5139,22,4426894,CKB -Richard,Ariyah,2022-03-12 22:05:00,2022-03-12 22:14:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 22:14:00,2022-03-12 22:23:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 22:25:00,2022-03-12 22:34:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 22:34:00,2022-03-12 22:43:00,Ariyah,5139,2,4426894,CKB -Richard,Ariyah,2022-03-12 22:45:00,2022-03-12 22:54:00,Jaden,4781,0,4426894,CKB -Richard,Jaden,2022-03-12 22:54:00,2022-03-12 23:03:00,Ariyah,5139,0,4426894,CKB -Richard,Ariyah,2022-03-12 23:03:00,2022-03-12 23:03:00,Beckham,0.06,0,4426894,CKB -Camryn,Beckham,2022-03-12 07:30:00,2022-03-12 07:30:00,Lucia,0.06,0,4369705,CKB -Camryn,Lucia,2022-03-12 07:30:00,2022-03-12 07:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 07:39:00,2022-03-12 07:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 07:50:00,2022-03-12 07:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 07:59:00,2022-03-12 08:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 08:10:00,2022-03-12 08:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 08:19:00,2022-03-12 08:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 08:30:00,2022-03-12 08:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 08:39:00,2022-03-12 08:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 08:50:00,2022-03-12 08:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 08:59:00,2022-03-12 09:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 09:10:00,2022-03-12 09:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 09:19:00,2022-03-12 09:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 09:30:00,2022-03-12 09:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 09:39:00,2022-03-12 09:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 09:50:00,2022-03-12 09:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 09:59:00,2022-03-12 10:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 10:10:00,2022-03-12 10:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 10:19:00,2022-03-12 10:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 10:30:00,2022-03-12 10:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 10:39:00,2022-03-12 10:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 10:50:00,2022-03-12 10:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 10:59:00,2022-03-12 11:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 11:10:00,2022-03-12 11:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 11:19:00,2022-03-12 11:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 11:30:00,2022-03-12 11:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 11:39:00,2022-03-12 11:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 11:50:00,2022-03-12 11:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 11:59:00,2022-03-12 12:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 12:10:00,2022-03-12 12:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 12:19:00,2022-03-12 12:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 12:30:00,2022-03-12 12:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 12:39:00,2022-03-12 12:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 12:50:00,2022-03-12 12:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 12:59:00,2022-03-12 13:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 13:10:00,2022-03-12 13:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 13:19:00,2022-03-12 13:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 13:30:00,2022-03-12 13:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 13:39:00,2022-03-12 13:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 13:50:00,2022-03-12 13:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 13:59:00,2022-03-12 14:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 14:10:00,2022-03-12 14:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 14:19:00,2022-03-12 14:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 14:30:00,2022-03-12 14:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 14:39:00,2022-03-12 14:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 14:50:00,2022-03-12 14:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 14:59:00,2022-03-12 15:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 15:10:00,2022-03-12 15:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 15:19:00,2022-03-12 15:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 15:30:00,2022-03-12 15:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 15:39:00,2022-03-12 15:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 15:50:00,2022-03-12 15:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 15:59:00,2022-03-12 16:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 16:10:00,2022-03-12 16:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 16:19:00,2022-03-12 16:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 16:30:00,2022-03-12 16:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 16:39:00,2022-03-12 16:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 16:50:00,2022-03-12 16:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 16:59:00,2022-03-12 17:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 17:10:00,2022-03-12 17:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 17:19:00,2022-03-12 17:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 17:30:00,2022-03-12 17:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 17:39:00,2022-03-12 17:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 17:50:00,2022-03-12 17:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 17:59:00,2022-03-12 18:10:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 18:10:00,2022-03-12 18:15:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 18:19:00,2022-03-12 18:30:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 18:30:00,2022-03-12 18:35:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 18:39:00,2022-03-12 18:50:00,Lucia,4341,0,4369705,CKB -Camryn,Lucia,2022-03-12 18:50:00,2022-03-12 18:55:00,Jaxon,2217,4,4369705,CKB -Camryn,Jaxon,2022-03-12 18:59:00,2022-03-12 19:10:00,Lucia,4288,0,4369705,CKB -Camryn,Lucia,2022-03-12 19:10:00,2022-03-12 19:10:00,Beckham,0.06,0,4369705,CKB -Astrid,King,2022-03-12 08:08:00,2022-03-12 08:41:00,Brayden,17.9,0,4317640,VDL -Astrid,Brayden,2022-03-12 08:41:00,2022-03-12 08:54:00,Brayden,4637,9,4317640,VDL -Astrid,Brayden,2022-03-12 09:03:00,2022-03-12 09:17:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 09:21:00,2022-03-12 09:35:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 09:43:00,2022-03-12 09:57:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 10:01:00,2022-03-12 10:15:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 10:23:00,2022-03-12 10:37:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 10:41:00,2022-03-12 10:55:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 11:03:00,2022-03-12 11:17:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 11:21:00,2022-03-12 11:35:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 11:43:00,2022-03-12 11:57:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 12:01:00,2022-03-12 12:15:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 12:23:00,2022-03-12 12:37:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 12:41:00,2022-03-12 12:55:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 13:03:00,2022-03-12 13:17:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 13:21:00,2022-03-12 13:35:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 13:43:00,2022-03-12 13:57:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 14:01:00,2022-03-12 14:15:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 14:23:00,2022-03-12 14:37:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 14:41:00,2022-03-12 14:55:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 15:03:00,2022-03-12 15:17:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 15:21:00,2022-03-12 15:35:00,Brayden,4637,8,4317640,VDL -Astrid,Brayden,2022-03-12 15:43:00,2022-03-12 15:57:00,Brayden,4637,4,4317640,VDL -Astrid,Brayden,2022-03-12 16:01:00,2022-03-12 16:14:00,Brayden,4637,0,4317640,VDL -Astrid,Brayden,2022-03-12 16:14:00,2022-03-12 16:57:00,King,19.8,0,4317640,VDL -Nash,Beckham,2022-03-12 07:18:00,2022-03-12 07:18:00,Amira,0.06,0,4706426,CKB -Nash,Amira,2022-03-12 07:18:00,2022-03-12 07:26:00,Victor,5562,10,4706426,CKB -Nash,Victor,2022-03-12 07:36:00,2022-03-12 07:45:00,Olivia,5941,32,4706426,CKB -Nash,Olivia,2022-03-12 08:17:00,2022-03-12 08:26:00,Victor,5994,8,4706426,CKB -Nash,Victor,2022-03-12 08:34:00,2022-03-12 08:42:00,Amira,5566,0,4706426,CKB -Nash,Amira,2022-03-12 08:42:00,2022-03-12 08:42:00,Beckham,0.06,0,4706426,CKB -Hailey,Beckham,2022-03-12 08:10:00,2022-03-12 08:10:00,Kaylani,0.06,0,4731254,CKB -Hailey,Kaylani,2022-03-12 08:10:00,2022-03-12 08:16:00,Cecilia,2169,12,4731254,CKB -Hailey,Cecilia,2022-03-12 08:28:00,2022-03-12 08:38:00,Kaylani,2952,2,4731254,CKB -Hailey,Kaylani,2022-03-12 08:40:00,2022-03-12 08:46:00,Cecilia,2169,12,4731254,CKB -Hailey,Cecilia,2022-03-12 08:58:00,2022-03-12 09:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 09:10:00,2022-03-12 09:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 09:28:00,2022-03-12 09:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 09:40:00,2022-03-12 09:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 09:58:00,2022-03-12 10:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 10:10:00,2022-03-12 10:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 10:28:00,2022-03-12 10:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 10:40:00,2022-03-12 10:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 10:58:00,2022-03-12 11:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 11:10:00,2022-03-12 11:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 11:28:00,2022-03-12 11:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 11:40:00,2022-03-12 11:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 11:58:00,2022-03-12 12:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 12:10:00,2022-03-12 12:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 12:28:00,2022-03-12 12:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 12:40:00,2022-03-12 12:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 12:58:00,2022-03-12 13:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 13:10:00,2022-03-12 13:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 13:28:00,2022-03-12 13:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 13:40:00,2022-03-12 13:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 13:58:00,2022-03-12 14:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 14:10:00,2022-03-12 14:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 14:28:00,2022-03-12 14:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 14:40:00,2022-03-12 14:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 14:58:00,2022-03-12 15:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 15:10:00,2022-03-12 15:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 15:28:00,2022-03-12 15:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 15:40:00,2022-03-12 15:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 15:58:00,2022-03-12 16:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 16:10:00,2022-03-12 16:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 16:28:00,2022-03-12 16:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 16:40:00,2022-03-12 16:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 16:58:00,2022-03-12 17:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 17:10:00,2022-03-12 17:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 17:28:00,2022-03-12 17:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 17:40:00,2022-03-12 17:48:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 17:58:00,2022-03-12 18:10:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 18:10:00,2022-03-12 18:18:00,Cecilia,2169,10,4731254,CKB -Hailey,Cecilia,2022-03-12 18:28:00,2022-03-12 18:40:00,Kaylani,2952,0,4731254,CKB -Hailey,Kaylani,2022-03-12 18:40:00,2022-03-12 18:48:00,Cecilia,2169,0,4731254,CKB -Hailey,Cecilia,2022-03-12 18:48:00,2022-03-12 18:48:00,Beckham,0.06,0,4731254,CKB -Matthias,Beckham,2022-03-13 00:23:00,2022-03-13 00:23:00,Addilyn,0.06,0,4317771,CKB -Matthias,Addilyn,2022-03-13 00:23:00,2022-03-13 00:30:00,Ari,2577,9,4317771,CKB -Ruby,Ari,2022-03-13 00:39:00,2022-03-13 00:54:00,Kobe,5937,9,4317771,CKB -Ruby,Kobe,2022-03-13 01:03:00,2022-03-13 01:17:00,Ari,6.19,0,4317771,CKB -Matthias,Ari,2022-03-13 01:17:00,2022-03-13 01:23:00,Addilyn,2555,0,4317771,CKB -Matthias,Addilyn,2022-03-13 01:23:00,2022-03-13 01:30:00,Ari,2577,9,4317771,CKB -Ruby,Ari,2022-03-13 01:39:00,2022-03-13 01:54:00,Kobe,5937,9,4317771,CKB -Ruby,Kobe,2022-03-13 02:03:00,2022-03-13 02:17:00,Ari,6.19,0,4317771,CKB -Matthias,Ari,2022-03-13 02:17:00,2022-03-13 02:23:00,Addilyn,2555,0,4317771,CKB -Matthias,Addilyn,2022-03-13 02:23:00,2022-03-13 02:30:00,Ari,2577,9,4317771,CKB -Ruby,Ari,2022-03-13 02:39:00,2022-03-13 02:54:00,Kobe,5937,9,4317771,CKB -Ruby,Kobe,2022-03-13 03:03:00,2022-03-13 03:17:00,Ari,6.19,0,4317771,CKB -Matthias,Ari,2022-03-13 03:17:00,2022-03-13 03:23:00,Addilyn,2555,0,4317771,CKB -Matthias,Addilyn,2022-03-13 03:23:00,2022-03-13 03:30:00,Ari,2577,9,4317771,CKB -Ruby,Ari,2022-03-13 03:39:00,2022-03-13 03:54:00,Kobe,5937,9,4317771,CKB -Ruby,Kobe,2022-03-13 04:03:00,2022-03-13 04:17:00,Ari,6.19,0,4317771,CKB -Matthias,Ari,2022-03-13 04:17:00,2022-03-13 04:23:00,Addilyn,2555,0,4317771,CKB -Matthias,Addilyn,2022-03-13 04:23:00,2022-03-13 04:30:00,Ari,2577,9,4317771,CKB -Ruby,Ari,2022-03-13 04:39:00,2022-03-13 04:54:00,Kobe,5937,9,4317771,CKB -Ruby,Kobe,2022-03-13 05:03:00,2022-03-13 05:17:00,Ari,6.19,0,4317771,CKB -Matthias,Ari,2022-03-13 05:17:00,2022-03-13 05:23:00,Addilyn,2555,0,4317771,CKB -Matthias,Addilyn,2022-03-13 05:23:00,2022-03-13 05:30:00,Ari,2577,9,4317771,CKB -Ruby,Ari,2022-03-13 05:39:00,2022-03-13 05:54:00,Kobe,5937,9,4317771,CKB -Ruby,Kobe,2022-03-13 06:03:00,2022-03-13 06:17:00,Ari,6.19,0,4317771,CKB -Matthias,Ari,2022-03-13 06:17:00,2022-03-13 06:23:00,Addilyn,2555,0,4317771,CKB -Matthias,Addilyn,2022-03-13 06:23:00,2022-03-13 06:30:00,Ari,2577,9,4317771,CKB -Ruby,Ari,2022-03-13 06:39:00,2022-03-13 06:54:00,Kobe,5937,0,4317771,CKB -Ruby,Kobe,2022-03-13 06:54:00,2022-03-13 06:54:00,Beckham,0.06,0,4317771,CKB -Ruby,Beckham,2022-03-13 00:33:00,2022-03-13 00:33:00,Kobe,0.06,0,4317937,CKB -Ruby,Kobe,2022-03-13 00:33:00,2022-03-13 00:47:00,Ari,6.19,0,4317937,CKB -Matthias,Ari,2022-03-13 00:47:00,2022-03-13 00:53:00,Addilyn,2555,0,4317937,CKB -Matthias,Addilyn,2022-03-13 00:53:00,2022-03-13 01:00:00,Ari,2577,9,4317937,CKB -Ruby,Ari,2022-03-13 01:09:00,2022-03-13 01:24:00,Kobe,5937,9,4317937,CKB -Ruby,Kobe,2022-03-13 01:33:00,2022-03-13 01:47:00,Ari,6.19,0,4317937,CKB -Matthias,Ari,2022-03-13 01:47:00,2022-03-13 01:53:00,Addilyn,2555,0,4317937,CKB -Matthias,Addilyn,2022-03-13 01:53:00,2022-03-13 02:00:00,Ari,2577,9,4317937,CKB -Ruby,Ari,2022-03-13 02:09:00,2022-03-13 02:24:00,Kobe,5937,9,4317937,CKB -Ruby,Kobe,2022-03-13 02:33:00,2022-03-13 02:47:00,Ari,6.19,0,4317937,CKB -Matthias,Ari,2022-03-13 02:47:00,2022-03-13 02:53:00,Addilyn,2555,0,4317937,CKB -Matthias,Addilyn,2022-03-13 02:53:00,2022-03-13 03:00:00,Ari,2577,9,4317937,CKB -Ruby,Ari,2022-03-13 03:09:00,2022-03-13 03:24:00,Kobe,5937,9,4317937,CKB -Ruby,Kobe,2022-03-13 03:33:00,2022-03-13 03:47:00,Ari,6.19,0,4317937,CKB -Matthias,Ari,2022-03-13 03:47:00,2022-03-13 03:53:00,Addilyn,2555,0,4317937,CKB -Matthias,Addilyn,2022-03-13 03:53:00,2022-03-13 04:00:00,Ari,2577,9,4317937,CKB -Ruby,Ari,2022-03-13 04:09:00,2022-03-13 04:24:00,Kobe,5937,9,4317937,CKB -Ruby,Kobe,2022-03-13 04:33:00,2022-03-13 04:47:00,Ari,6.19,0,4317937,CKB -Matthias,Ari,2022-03-13 04:47:00,2022-03-13 04:53:00,Addilyn,2555,0,4317937,CKB -Matthias,Addilyn,2022-03-13 04:53:00,2022-03-13 05:00:00,Ari,2577,9,4317937,CKB -Ruby,Ari,2022-03-13 05:09:00,2022-03-13 05:24:00,Kobe,5937,9,4317937,CKB -Ruby,Kobe,2022-03-13 05:33:00,2022-03-13 05:47:00,Ari,6.19,0,4317937,CKB -Matthias,Ari,2022-03-13 05:47:00,2022-03-13 05:53:00,Addilyn,2555,0,4317937,CKB -Matthias,Addilyn,2022-03-13 05:53:00,2022-03-13 06:00:00,Ari,2577,9,4317937,CKB -Ruby,Ari,2022-03-13 06:09:00,2022-03-13 06:24:00,Kobe,5937,9,4317937,CKB -Ruby,Kobe,2022-03-13 06:33:00,2022-03-13 06:47:00,Ari,6.19,0,4317937,CKB -Ruby,Ari,2022-03-13 06:47:00,2022-03-13 06:47:00,Beckham,0.06,0,4317937,CKB -Rosie,Beckham,2022-03-13 00:57:00,2022-03-13 00:57:00,Lexi,0.06,0,4319402,CKB -Rosie,Lexi,2022-03-13 00:57:00,2022-03-13 01:06:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 01:06:00,2022-03-13 01:11:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 01:27:00,2022-03-13 01:36:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 01:36:00,2022-03-13 01:41:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 01:57:00,2022-03-13 02:06:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 02:06:00,2022-03-13 02:11:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 02:27:00,2022-03-13 02:36:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 02:36:00,2022-03-13 02:41:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 02:57:00,2022-03-13 03:06:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 03:06:00,2022-03-13 03:11:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 03:27:00,2022-03-13 03:36:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 03:36:00,2022-03-13 03:41:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 03:57:00,2022-03-13 04:06:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 04:06:00,2022-03-13 04:11:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 04:27:00,2022-03-13 04:36:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 04:36:00,2022-03-13 04:41:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 04:57:00,2022-03-13 05:06:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 05:06:00,2022-03-13 05:11:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 05:27:00,2022-03-13 05:36:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 05:36:00,2022-03-13 05:41:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 05:57:00,2022-03-13 06:06:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 06:06:00,2022-03-13 06:11:00,Lexi,2936,16,4319402,CKB -Rosie,Lexi,2022-03-13 06:27:00,2022-03-13 06:36:00,Colton,4343,0,4319402,CKB -Rosie,Colton,2022-03-13 06:36:00,2022-03-13 06:41:00,Lexi,2936,0,4319402,CKB -Rosie,Lexi,2022-03-13 06:41:00,2022-03-13 06:41:00,Beckham,0.06,0,4319402,CKB -Andy,Beckham,2022-03-13 00:30:00,2022-03-13 00:30:00,Harper,0.06,0,4453948,CKB -Andy,Harper,2022-03-13 00:30:00,2022-03-13 00:44:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 00:44:00,2022-03-13 00:57:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 01:00:00,2022-03-13 01:14:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 01:14:00,2022-03-13 01:27:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 01:30:00,2022-03-13 01:44:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 01:44:00,2022-03-13 01:57:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 02:00:00,2022-03-13 02:14:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 02:14:00,2022-03-13 02:27:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 02:30:00,2022-03-13 02:44:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 02:44:00,2022-03-13 02:57:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 03:00:00,2022-03-13 03:14:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 03:14:00,2022-03-13 03:27:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 03:30:00,2022-03-13 03:44:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 03:44:00,2022-03-13 03:57:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 04:00:00,2022-03-13 04:14:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 04:14:00,2022-03-13 04:27:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 04:30:00,2022-03-13 04:44:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 04:44:00,2022-03-13 04:57:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 05:00:00,2022-03-13 05:14:00,Elise,4801,0,4453948,CKB -Andy,Elise,2022-03-13 05:14:00,2022-03-13 05:27:00,Harper,5302,3,4453948,CKB -Andy,Harper,2022-03-13 05:30:00,2022-03-13 05:44:00,Elise,4.8,0,4453948,CKB -Andy,Elise,2022-03-13 05:44:00,2022-03-13 05:56:00,Harper,5301,4,4453948,CKB -Andy,Harper,2022-03-13 06:00:00,2022-03-13 06:14:00,Elise,4.8,0,4453948,CKB -Andy,Elise,2022-03-13 06:14:00,2022-03-13 06:26:00,Harper,5301,4,4453948,CKB -Andy,Harper,2022-03-13 06:30:00,2022-03-13 06:44:00,Elise,4.8,0,4453948,CKB -Andy,Elise,2022-03-13 06:44:00,2022-03-13 06:56:00,Harper,5301,0,4453948,CKB -Andy,Harper,2022-03-13 06:56:00,2022-03-13 06:56:00,Beckham,0.06,0,4453948,CKB -Emilio,Beckham,2022-03-13 00:32:00,2022-03-13 00:32:00,Rose,0.06,0,4747669,CKB -Emilio,Rose,2022-03-13 00:32:00,2022-03-13 00:44:00,Brooklynn,4212,3,4747669,CKB -Emilio,Brooklynn,2022-03-13 00:47:00,2022-03-13 01:16:00,Francis,13048,0,4747669,CKB -Emilio,Francis,2022-03-13 01:16:00,2022-03-13 01:42:00,Brooklynn,12869,5,4747669,CKB -Emilio,Brooklynn,2022-03-13 01:47:00,2022-03-13 02:16:00,Francis,13048,0,4747669,CKB -Emilio,Francis,2022-03-13 02:16:00,2022-03-13 02:42:00,Brooklynn,12869,5,4747669,CKB -Emilio,Brooklynn,2022-03-13 02:47:00,2022-03-13 03:16:00,Francis,13048,0,4747669,CKB -Emilio,Francis,2022-03-13 03:16:00,2022-03-13 03:42:00,Brooklynn,12869,5,4747669,CKB -Emilio,Brooklynn,2022-03-13 03:47:00,2022-03-13 04:16:00,Francis,13048,0,4747669,CKB -Emilio,Francis,2022-03-13 04:16:00,2022-03-13 04:42:00,Brooklynn,12869,5,4747669,CKB -Emilio,Brooklynn,2022-03-13 04:47:00,2022-03-13 05:16:00,Francis,13048,0,4747669,CKB -Emilio,Francis,2022-03-13 05:16:00,2022-03-13 05:42:00,Brooklynn,12869,5,4747669,CKB -Emilio,Brooklynn,2022-03-13 05:47:00,2022-03-13 06:16:00,Francis,13048,0,4747669,CKB -Emilio,Francis,2022-03-13 06:16:00,2022-03-13 06:42:00,Brooklynn,12869,0,4747669,CKB -Emilio,Brooklynn,2022-03-13 06:42:00,2022-03-13 06:42:00,Beckham,0.06,0,4747669,CKB -Emilio,Beckham,2022-03-13 00:17:00,2022-03-13 00:17:00,Brooklynn,0.06,0,4747671,CKB -Emilio,Brooklynn,2022-03-13 00:17:00,2022-03-13 00:46:00,Francis,13048,0,4747671,CKB -Emilio,Francis,2022-03-13 00:46:00,2022-03-13 01:12:00,Brooklynn,12869,5,4747671,CKB -Emilio,Brooklynn,2022-03-13 01:17:00,2022-03-13 01:46:00,Francis,13048,0,4747671,CKB -Emilio,Francis,2022-03-13 01:46:00,2022-03-13 02:12:00,Brooklynn,12869,5,4747671,CKB -Emilio,Brooklynn,2022-03-13 02:17:00,2022-03-13 02:46:00,Francis,13048,0,4747671,CKB -Emilio,Francis,2022-03-13 02:46:00,2022-03-13 03:12:00,Brooklynn,12869,5,4747671,CKB -Emilio,Brooklynn,2022-03-13 03:17:00,2022-03-13 03:46:00,Francis,13048,0,4747671,CKB -Emilio,Francis,2022-03-13 03:46:00,2022-03-13 04:12:00,Brooklynn,12869,5,4747671,CKB -Emilio,Brooklynn,2022-03-13 04:17:00,2022-03-13 04:46:00,Francis,13048,0,4747671,CKB -Emilio,Francis,2022-03-13 04:46:00,2022-03-13 05:12:00,Brooklynn,12869,5,4747671,CKB -Emilio,Brooklynn,2022-03-13 05:17:00,2022-03-13 05:46:00,Francis,13048,0,4747671,CKB -Emilio,Francis,2022-03-13 05:46:00,2022-03-13 06:12:00,Brooklynn,12869,5,4747671,CKB -Emilio,Brooklynn,2022-03-13 06:17:00,2022-03-13 06:46:00,Francis,13048,0,4747671,CKB -Emilio,Francis,2022-03-13 06:46:00,2022-03-13 07:12:00,Brooklynn,12869,0,4747671,CKB -Emilio,Brooklynn,2022-03-13 07:12:00,2022-03-13 07:12:00,Beckham,0.06,0,4747671,CKB -Ryder,Beckham,2022-03-13 00:49:00,2022-03-13 00:49:00,Kehlani,0.06,0,4434314,CKB -Ryder,Kehlani,2022-03-13 00:49:00,2022-03-13 01:04:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 01:04:00,2022-03-13 01:19:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 01:19:00,2022-03-13 01:34:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 01:34:00,2022-03-13 01:49:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 01:49:00,2022-03-13 02:04:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 02:04:00,2022-03-13 02:19:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 02:19:00,2022-03-13 02:34:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 02:34:00,2022-03-13 02:49:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 02:49:00,2022-03-13 03:04:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 03:04:00,2022-03-13 03:19:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 03:19:00,2022-03-13 03:34:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 03:34:00,2022-03-13 03:49:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 03:49:00,2022-03-13 04:04:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 04:04:00,2022-03-13 04:19:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 04:19:00,2022-03-13 04:34:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 04:34:00,2022-03-13 04:49:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 04:49:00,2022-03-13 05:04:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 05:04:00,2022-03-13 05:19:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 05:19:00,2022-03-13 05:34:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 05:34:00,2022-03-13 05:49:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 05:49:00,2022-03-13 06:04:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 06:04:00,2022-03-13 06:19:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 06:19:00,2022-03-13 06:34:00,Ariyah,10229,0,4434314,CKB -Ryder,Ariyah,2022-03-13 06:34:00,2022-03-13 06:49:00,Kehlani,11801,0,4434314,CKB -Ryder,Kehlani,2022-03-13 06:49:00,2022-03-13 06:49:00,Beckham,0.06,0,4434314,CKB -Aziel,Beckham,2022-03-13 02:34:00,2022-03-13 02:34:00,Miles,0.06,0,4524178,CKB -Aziel,Miles,2022-03-13 02:34:00,2022-03-13 03:00:00,Delilah,9016,0,4524178,CKB -Aziel,Delilah,2022-03-13 03:00:00,2022-03-13 03:27:00,Miles,10083,7,4524178,CKB -Aziel,Miles,2022-03-13 03:34:00,2022-03-13 04:00:00,Delilah,9016,0,4524178,CKB -Aziel,Delilah,2022-03-13 04:00:00,2022-03-13 04:27:00,Miles,10083,7,4524178,CKB -Aziel,Miles,2022-03-13 04:34:00,2022-03-13 05:00:00,Delilah,9016,0,4524178,CKB -Aziel,Delilah,2022-03-13 05:00:00,2022-03-13 05:27:00,Miles,10083,7,4524178,CKB -Aziel,Miles,2022-03-13 05:34:00,2022-03-13 06:00:00,Delilah,9016,0,4524178,CKB -Aziel,Delilah,2022-03-13 06:00:00,2022-03-13 06:27:00,Miles,10083,7,4524178,CKB -Aziel,Miles,2022-03-13 06:34:00,2022-03-13 07:00:00,Delilah,9016,0,4524178,CKB -Aziel,Delilah,2022-03-13 07:00:00,2022-03-13 07:00:00,Beckham,0.06,0,4524178,CKB -Aziel,Beckham,2022-03-13 02:04:00,2022-03-13 02:04:00,Miles,0.06,0,4619808,CKB -Aziel,Miles,2022-03-13 02:04:00,2022-03-13 02:30:00,Delilah,9016,0,4619808,CKB -Aziel,Delilah,2022-03-13 02:30:00,2022-03-13 02:57:00,Miles,10083,7,4619808,CKB -Aziel,Miles,2022-03-13 03:04:00,2022-03-13 03:30:00,Delilah,9016,0,4619808,CKB -Aziel,Delilah,2022-03-13 03:30:00,2022-03-13 03:57:00,Miles,10083,7,4619808,CKB -Aziel,Miles,2022-03-13 04:04:00,2022-03-13 04:30:00,Delilah,9016,0,4619808,CKB -Aziel,Delilah,2022-03-13 04:30:00,2022-03-13 04:57:00,Miles,10083,7,4619808,CKB -Aziel,Miles,2022-03-13 05:04:00,2022-03-13 05:30:00,Delilah,9016,0,4619808,CKB -Aziel,Delilah,2022-03-13 05:30:00,2022-03-13 05:57:00,Miles,10083,7,4619808,CKB -Aziel,Miles,2022-03-13 06:04:00,2022-03-13 06:30:00,Delilah,9016,0,4619808,CKB -Aziel,Delilah,2022-03-13 06:30:00,2022-03-13 06:57:00,Miles,10083,0,4619808,CKB -Aziel,Miles,2022-03-13 06:57:00,2022-03-13 06:57:00,Beckham,0.06,0,4619808,CKB -Dalton,Beckham,2022-03-13 00:31:00,2022-03-13 00:31:00,Kamila,0.06,0,4374748,CKB -Dalton,Kamila,2022-03-13 00:31:00,2022-03-13 00:44:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 00:44:00,2022-03-13 00:56:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 01:01:00,2022-03-13 01:14:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 01:14:00,2022-03-13 01:26:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 01:31:00,2022-03-13 01:44:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 01:44:00,2022-03-13 01:56:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 02:01:00,2022-03-13 02:14:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 02:14:00,2022-03-13 02:26:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 02:31:00,2022-03-13 02:44:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 02:44:00,2022-03-13 02:56:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 03:01:00,2022-03-13 03:14:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 03:14:00,2022-03-13 03:26:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 03:31:00,2022-03-13 03:44:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 03:44:00,2022-03-13 03:56:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 04:01:00,2022-03-13 04:14:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 04:14:00,2022-03-13 04:26:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 04:31:00,2022-03-13 04:44:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 04:44:00,2022-03-13 04:56:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 05:01:00,2022-03-13 05:14:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 05:14:00,2022-03-13 05:26:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 05:31:00,2022-03-13 05:44:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 05:44:00,2022-03-13 05:56:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 06:01:00,2022-03-13 06:14:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 06:14:00,2022-03-13 06:26:00,Kamila,5362,5,4374748,CKB -Dalton,Kamila,2022-03-13 06:31:00,2022-03-13 06:44:00,Veronica,4872,0,4374748,CKB -Dalton,Veronica,2022-03-13 06:44:00,2022-03-13 06:56:00,Kamila,5362,0,4374748,CKB -Dalton,Kamila,2022-03-13 06:56:00,2022-03-13 06:56:00,Beckham,0.06,0,4374748,CKB -Jamison,Beckham,2022-03-13 00:31:00,2022-03-13 00:31:00,Kamila,0.06,0,4374871,CKB -Jamison,Kamila,2022-03-13 00:31:00,2022-03-13 00:45:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 00:47:00,2022-03-13 01:01:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 01:01:00,2022-03-13 01:15:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 01:17:00,2022-03-13 01:31:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 01:31:00,2022-03-13 01:45:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 01:47:00,2022-03-13 02:01:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 02:01:00,2022-03-13 02:15:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 02:17:00,2022-03-13 02:31:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 02:31:00,2022-03-13 02:45:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 02:47:00,2022-03-13 03:01:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 03:01:00,2022-03-13 03:15:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 03:17:00,2022-03-13 03:31:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 03:31:00,2022-03-13 03:45:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 03:47:00,2022-03-13 04:01:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 04:01:00,2022-03-13 04:15:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 04:17:00,2022-03-13 04:31:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 04:31:00,2022-03-13 04:45:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 04:47:00,2022-03-13 05:01:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 05:01:00,2022-03-13 05:15:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 05:17:00,2022-03-13 05:31:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 05:31:00,2022-03-13 05:45:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 05:47:00,2022-03-13 06:01:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 06:01:00,2022-03-13 06:15:00,Liana,5225,2,4374871,CKB -Jamison,Liana,2022-03-13 06:17:00,2022-03-13 06:31:00,Kamila,7617,0,4374871,CKB -Jamison,Kamila,2022-03-13 06:31:00,2022-03-13 06:45:00,Liana,5096,0,4374871,CKB -Jamison,Liana,2022-03-13 06:45:00,2022-03-13 06:45:00,Beckham,0.06,0,4374871,CKB -Keegan,Beckham,2022-03-13 00:43:00,2022-03-13 00:43:00,Charleigh,0.06,0,4375017,CKB -Keegan,Charleigh,2022-03-13 00:43:00,2022-03-13 00:53:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 00:53:00,2022-03-13 01:03:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 01:13:00,2022-03-13 01:23:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 01:23:00,2022-03-13 01:33:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 01:43:00,2022-03-13 01:53:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 01:53:00,2022-03-13 02:03:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 02:13:00,2022-03-13 02:23:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 02:23:00,2022-03-13 02:33:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 02:43:00,2022-03-13 02:53:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 02:53:00,2022-03-13 03:03:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 03:13:00,2022-03-13 03:23:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 03:23:00,2022-03-13 03:33:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 03:43:00,2022-03-13 03:53:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 03:53:00,2022-03-13 04:03:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 04:13:00,2022-03-13 04:23:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 04:23:00,2022-03-13 04:33:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 04:43:00,2022-03-13 04:53:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 04:53:00,2022-03-13 05:03:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 05:13:00,2022-03-13 05:23:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 05:23:00,2022-03-13 05:33:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 05:43:00,2022-03-13 05:53:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 05:53:00,2022-03-13 06:03:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 06:13:00,2022-03-13 06:23:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 06:23:00,2022-03-13 06:33:00,Charleigh,4408,10,4375017,CKB -Keegan,Charleigh,2022-03-13 06:43:00,2022-03-13 06:53:00,Eli,4507,0,4375017,CKB -Keegan,Eli,2022-03-13 06:53:00,2022-03-13 07:03:00,Charleigh,4408,0,4375017,CKB -Keegan,Charleigh,2022-03-13 07:03:00,2022-03-13 07:03:00,Beckham,0.06,0,4375017,CKB +LINE_0,DEPS_1,2022-03-07 21:31:00,2022-03-07 21:31:00,S_0,0.06,0,4454943,CKB +LINE_0,S_0,2022-03-07 21:31:00,2022-03-07 22:04:00,S_2,14519,4,4454943,CKB +LINE_0,S_2,2022-03-07 22:08:00,2022-03-07 22:43:00,S_0,13541,8,4454943,CKB +LINE_0,S_0,2022-03-07 22:51:00,2022-03-07 23:24:00,S_2,14519,4,4454943,CKB +LINE_0,S_2,2022-03-07 23:28:00,2022-03-08 00:03:00,S_0,13541,8,4454943,CKB +LINE_0,S_0,2022-03-08 00:11:00,2022-03-08 00:44:00,S_2,14519,0,4454943,CKB +LINE_1,S_2,2022-03-08 00:44:00,2022-03-08 00:54:00,OPPS_3,4.1,25,4454943,CKB +LINE_1,OPPS_3,2022-03-08 01:19:00,2022-03-08 01:42:00,S_4,8.36,6,4454943,CKB +LINE_1,S_4,2022-03-08 01:48:00,2022-03-08 02:06:00,OPPS_3,9067,13,4454943,CKB +LINE_1,OPPS_3,2022-03-08 02:19:00,2022-03-08 02:42:00,S_4,8.36,6,4454943,CKB +LINE_1,S_4,2022-03-08 02:48:00,2022-03-08 03:06:00,OPPS_3,9067,13,4454943,CKB +LINE_1,OPPS_3,2022-03-08 03:19:00,2022-03-08 03:42:00,S_4,8.36,6,4454943,CKB +LINE_1,S_4,2022-03-08 03:48:00,2022-03-08 04:06:00,OPPS_3,9067,0,4454943,CKB +LINE_1,OPPS_3,2022-03-08 04:06:00,2022-03-08 04:06:00,DEPS_1,0.06,0,4454943,CKB +LINE_0,DEPS_1,2022-03-07 22:11:00,2022-03-07 22:11:00,S_0,0.06,0,4454948,CKB +LINE_0,S_0,2022-03-07 22:11:00,2022-03-07 22:44:00,S_2,14519,4,4454948,CKB +LINE_0,S_2,2022-03-07 22:48:00,2022-03-07 23:23:00,S_0,13541,8,4454948,CKB +LINE_0,S_0,2022-03-07 23:31:00,2022-03-08 00:04:00,S_2,14519,4,4454948,CKB +LINE_0,S_2,2022-03-08 00:08:00,2022-03-08 00:39:00,S_5,12213,0,4454948,CKB +LINE_1,S_5,2022-03-08 00:39:00,2022-03-08 00:47:00,OPPS_3,4.0,2,4454948,CKB +LINE_1,OPPS_3,2022-03-08 00:49:00,2022-03-08 01:12:00,S_4,8.36,6,4454948,CKB +LINE_1,S_4,2022-03-08 01:18:00,2022-03-08 01:36:00,OPPS_3,9067,13,4454948,CKB +LINE_1,OPPS_3,2022-03-08 01:49:00,2022-03-08 02:12:00,S_4,8.36,6,4454948,CKB +LINE_1,S_4,2022-03-08 02:18:00,2022-03-08 02:36:00,OPPS_3,9067,13,4454948,CKB +LINE_1,OPPS_3,2022-03-08 02:49:00,2022-03-08 03:12:00,S_4,8.36,6,4454948,CKB +LINE_1,S_4,2022-03-08 03:18:00,2022-03-08 03:36:00,OPPS_3,9067,13,4454948,CKB +LINE_1,OPPS_3,2022-03-08 03:49:00,2022-03-08 04:12:00,S_4,8.36,0,4454948,CKB +LINE_1,S_4,2022-03-08 04:12:00,2022-03-08 04:12:00,DEPS_1,0.06,0,4454948,CKB +LINE_2,DEPS_1,2022-03-07 21:06:00,2022-03-07 21:06:00,S_6,0.06,0,4664622,CKB +LINE_2,S_6,2022-03-07 21:06:00,2022-03-07 21:34:00,S_7,13018,19,4664622,CKB +LINE_2,S_7,2022-03-07 21:53:00,2022-03-07 22:13:00,S_8,10332,17,4664622,CKB +LINE_2,S_8,2022-03-07 22:30:00,2022-03-07 22:54:00,S_7,10.48,19,4664622,CKB +LINE_2,S_7,2022-03-07 23:13:00,2022-03-07 23:33:00,S_8,10332,17,4664622,CKB +LINE_2,S_8,2022-03-07 23:50:00,2022-03-08 00:14:00,S_7,10.48,2,4664622,CKB +LINE_2,S_7,2022-03-08 00:16:00,2022-03-08 00:23:00,S_9,3709,5,4664622,CKB +LINE_3,S_9,2022-03-08 00:28:00,2022-03-08 00:44:00,OPPS_10,6404,3,4664622,CKB +LINE_3,OPPS_10,2022-03-08 00:47:00,2022-03-08 01:10:00,S_11,10579,7,4664622,CKB +LINE_3,S_11,2022-03-08 01:17:00,2022-03-08 01:44:00,OPPS_10,12007,3,4664622,CKB +LINE_3,OPPS_10,2022-03-08 01:47:00,2022-03-08 02:10:00,S_11,10579,7,4664622,CKB +LINE_3,S_11,2022-03-08 02:17:00,2022-03-08 02:44:00,OPPS_10,12007,3,4664622,CKB +LINE_3,OPPS_10,2022-03-08 02:47:00,2022-03-08 03:10:00,S_11,10579,7,4664622,CKB +LINE_3,S_11,2022-03-08 03:17:00,2022-03-08 03:44:00,OPPS_10,12007,3,4664622,CKB +LINE_3,OPPS_10,2022-03-08 03:47:00,2022-03-08 04:10:00,S_11,10579,7,4664622,CKB +LINE_3,S_11,2022-03-08 04:17:00,2022-03-08 04:44:00,OPPS_10,12007,0,4664622,CKB +LINE_3,OPPS_10,2022-03-08 04:44:00,2022-03-08 04:44:00,DEPS_1,0.06,0,4664622,CKB +LINE_2,DEPS_1,2022-03-07 20:26:00,2022-03-07 20:26:00,S_6,0.06,0,4762732,CKB +LINE_2,S_6,2022-03-07 20:26:00,2022-03-07 20:56:00,S_12,14097,14,4762732,CKB +LINE_2,S_12,2022-03-07 21:10:00,2022-03-07 21:38:00,S_6,13.19,8,4762732,CKB +LINE_2,S_6,2022-03-07 21:46:00,2022-03-07 22:14:00,S_7,13018,19,4762732,CKB +LINE_2,S_7,2022-03-07 22:33:00,2022-03-07 22:53:00,S_8,10332,17,4762732,CKB +LINE_2,S_8,2022-03-07 23:10:00,2022-03-07 23:34:00,S_7,10.48,19,4762732,CKB +LINE_2,S_7,2022-03-07 23:53:00,2022-03-08 00:13:00,S_8,10332,2,4762732,CKB +LINE_2,S_8,2022-03-08 00:15:00,2022-03-08 00:16:00,OPPS_10,506,1,4762732,CKB +LINE_3,OPPS_10,2022-03-08 00:17:00,2022-03-08 00:40:00,S_11,10579,7,4762732,CKB +LINE_3,S_11,2022-03-08 00:47:00,2022-03-08 01:14:00,OPPS_10,12007,3,4762732,CKB +LINE_3,OPPS_10,2022-03-08 01:17:00,2022-03-08 01:40:00,S_11,10579,7,4762732,CKB +LINE_3,S_11,2022-03-08 01:47:00,2022-03-08 02:14:00,OPPS_10,12007,3,4762732,CKB +LINE_3,OPPS_10,2022-03-08 02:17:00,2022-03-08 02:40:00,S_11,10579,7,4762732,CKB +LINE_3,S_11,2022-03-08 02:47:00,2022-03-08 03:14:00,OPPS_10,12007,3,4762732,CKB +LINE_3,OPPS_10,2022-03-08 03:17:00,2022-03-08 03:40:00,S_11,10579,7,4762732,CKB +LINE_3,S_11,2022-03-08 03:47:00,2022-03-08 04:14:00,OPPS_10,12007,3,4762732,CKB +LINE_3,OPPS_10,2022-03-08 04:17:00,2022-03-08 04:40:00,S_11,10579,3,4762732,CKB +LINE_4,S_11,2022-03-08 04:43:00,2022-03-08 04:58:00,S_13,6161,0,4762732,CKB +LINE_4,S_13,2022-03-08 04:58:00,2022-03-08 04:58:00,DEPS_1,0.06,0,4762732,CKB +LINE_5,DEPS_1,2022-03-07 22:56:00,2022-03-07 22:56:00,S_14,0.06,0,4617401,CKB +LINE_5,S_14,2022-03-07 22:56:00,2022-03-07 23:08:00,S_15,5882,3,4617401,CKB +LINE_5,S_15,2022-03-07 23:11:00,2022-03-07 23:25:00,S_14,6232,0,4617401,CKB +LINE_5,S_14,2022-03-07 23:25:00,2022-03-07 23:38:00,S_15,6086,3,4617401,CKB +LINE_5,S_15,2022-03-07 23:41:00,2022-03-07 23:55:00,S_14,6232,0,4617401,CKB +LINE_5,S_14,2022-03-07 23:55:00,2022-03-08 00:08:00,S_15,6086,0,4617401,CKB +LINE_5,S_15,2022-03-08 00:08:00,2022-03-08 00:08:00,DEPS_1,0.06,0,4617401,CKB +LINE_6,DEPS_1,2022-03-07 05:05:00,2022-03-07 05:05:00,S_16,0.06,0,4426844,CKB +LINE_6,S_16,2022-03-07 05:05:00,2022-03-07 05:14:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 05:14:00,2022-03-07 05:23:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 05:25:00,2022-03-07 05:34:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 05:34:00,2022-03-07 05:43:00,S_16,5139,23,4426844,CKB +LINE_6,S_16,2022-03-07 06:06:00,2022-03-07 06:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 06:15:00,2022-03-07 06:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 06:26:00,2022-03-07 06:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 06:35:00,2022-03-07 06:44:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 06:46:00,2022-03-07 06:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 06:55:00,2022-03-07 07:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 07:06:00,2022-03-07 07:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 07:15:00,2022-03-07 07:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 07:26:00,2022-03-07 07:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 07:35:00,2022-03-07 07:44:00,S_16,5139,22,4426844,CKB +LINE_6,S_16,2022-03-07 08:06:00,2022-03-07 08:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 08:15:00,2022-03-07 08:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 08:26:00,2022-03-07 08:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 08:35:00,2022-03-07 08:44:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 08:46:00,2022-03-07 08:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 08:55:00,2022-03-07 09:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 09:06:00,2022-03-07 09:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 09:15:00,2022-03-07 09:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 09:26:00,2022-03-07 09:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 09:35:00,2022-03-07 09:44:00,S_16,5139,22,4426844,CKB +LINE_6,S_16,2022-03-07 10:06:00,2022-03-07 10:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 10:15:00,2022-03-07 10:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 10:26:00,2022-03-07 10:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 10:35:00,2022-03-07 10:44:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 10:46:00,2022-03-07 10:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 10:55:00,2022-03-07 11:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 11:06:00,2022-03-07 11:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 11:15:00,2022-03-07 11:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 11:26:00,2022-03-07 11:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 11:35:00,2022-03-07 11:44:00,S_16,5139,22,4426844,CKB +LINE_6,S_16,2022-03-07 12:06:00,2022-03-07 12:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 12:15:00,2022-03-07 12:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 12:26:00,2022-03-07 12:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 12:35:00,2022-03-07 12:44:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 12:46:00,2022-03-07 12:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 12:55:00,2022-03-07 13:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 13:06:00,2022-03-07 13:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 13:15:00,2022-03-07 13:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 13:26:00,2022-03-07 13:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 13:35:00,2022-03-07 13:44:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 13:46:00,2022-03-07 13:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 13:55:00,2022-03-07 14:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 14:06:00,2022-03-07 14:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 14:15:00,2022-03-07 14:24:00,S_16,5139,22,4426844,CKB +LINE_6,S_16,2022-03-07 14:46:00,2022-03-07 14:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 14:55:00,2022-03-07 15:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 15:06:00,2022-03-07 15:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 15:15:00,2022-03-07 15:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 15:26:00,2022-03-07 15:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 15:35:00,2022-03-07 15:44:00,S_16,5139,22,4426844,CKB +LINE_6,S_16,2022-03-07 16:06:00,2022-03-07 16:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 16:15:00,2022-03-07 16:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 16:26:00,2022-03-07 16:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 16:35:00,2022-03-07 16:44:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 16:46:00,2022-03-07 16:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 16:55:00,2022-03-07 17:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 17:06:00,2022-03-07 17:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 17:15:00,2022-03-07 17:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 17:26:00,2022-03-07 17:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 17:35:00,2022-03-07 17:44:00,S_16,5139,22,4426844,CKB +LINE_6,S_16,2022-03-07 18:06:00,2022-03-07 18:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 18:15:00,2022-03-07 18:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 18:26:00,2022-03-07 18:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 18:35:00,2022-03-07 18:44:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 18:46:00,2022-03-07 18:55:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 18:55:00,2022-03-07 19:04:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 19:06:00,2022-03-07 19:15:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 19:15:00,2022-03-07 19:24:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 19:26:00,2022-03-07 19:35:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 19:35:00,2022-03-07 19:44:00,S_16,5139,21,4426844,CKB +LINE_6,S_16,2022-03-07 20:05:00,2022-03-07 20:14:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 20:14:00,2022-03-07 20:23:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 20:25:00,2022-03-07 20:34:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 20:34:00,2022-03-07 20:43:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 20:45:00,2022-03-07 20:54:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 20:54:00,2022-03-07 21:03:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 21:05:00,2022-03-07 21:14:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 21:14:00,2022-03-07 21:23:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 21:25:00,2022-03-07 21:34:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 21:34:00,2022-03-07 21:43:00,S_16,5139,22,4426844,CKB +LINE_6,S_16,2022-03-07 22:05:00,2022-03-07 22:14:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 22:14:00,2022-03-07 22:23:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 22:25:00,2022-03-07 22:34:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 22:34:00,2022-03-07 22:43:00,S_16,5139,2,4426844,CKB +LINE_6,S_16,2022-03-07 22:45:00,2022-03-07 22:54:00,S_17,4781,0,4426844,CKB +LINE_6,S_17,2022-03-07 22:54:00,2022-03-07 23:03:00,S_16,5139,0,4426844,CKB +LINE_6,S_16,2022-03-07 23:03:00,2022-03-07 23:03:00,DEPS_1,0.06,0,4426844,CKB +LINE_7,DEPS_1,2022-03-08 00:06:00,2022-03-08 00:06:00,S_18,0.06,0,4708594,CKB +LINE_7,S_18,2022-03-08 00:06:00,2022-03-08 00:27:00,S_19,7827,0,4708594,CKB +LINE_8,S_19,2022-03-08 00:27:00,2022-03-08 00:48:00,S_20,11079,0,4708594,CKB +LINE_8,S_20,2022-03-08 00:48:00,2022-03-08 01:25:00,OPPS_21,20641,8,4708594,CKB +LINE_8,OPPS_21,2022-03-08 01:33:00,2022-03-08 02:16:00,S_20,20579,1,4708594,CKB +LINE_8,S_20,2022-03-08 02:17:00,2022-03-08 02:55:00,OPPS_21,20641,8,4708594,CKB +LINE_8,OPPS_21,2022-03-08 03:03:00,2022-03-08 03:46:00,S_20,20579,1,4708594,CKB +LINE_8,S_20,2022-03-08 03:47:00,2022-03-08 04:25:00,OPPS_21,20641,0,4708594,CKB +LINE_8,OPPS_21,2022-03-08 04:25:00,2022-03-08 04:25:00,DEPS_1,0.06,0,4708594,CKB +LINE_9,DEPS_23,2022-03-07 05:15:00,2022-03-07 06:01:00,S_22,17.9,0,4317624,VDL +LINE_9,S_22,2022-03-07 06:01:00,2022-03-07 06:15:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 06:23:00,2022-03-07 06:37:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 06:41:00,2022-03-07 06:55:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 07:03:00,2022-03-07 07:17:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 07:21:00,2022-03-07 07:35:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 07:43:00,2022-03-07 07:57:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 08:01:00,2022-03-07 08:15:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 08:23:00,2022-03-07 08:37:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 08:41:00,2022-03-07 08:55:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 09:03:00,2022-03-07 09:17:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 09:21:00,2022-03-07 09:35:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 09:43:00,2022-03-07 09:57:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 10:01:00,2022-03-07 10:15:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 10:23:00,2022-03-07 10:37:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 10:41:00,2022-03-07 10:55:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 11:03:00,2022-03-07 11:17:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 11:21:00,2022-03-07 11:35:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 11:43:00,2022-03-07 11:57:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 12:01:00,2022-03-07 12:15:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 12:23:00,2022-03-07 12:37:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 12:41:00,2022-03-07 12:55:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 13:03:00,2022-03-07 13:17:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 13:21:00,2022-03-07 13:35:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 13:43:00,2022-03-07 13:57:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 14:01:00,2022-03-07 14:15:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 14:23:00,2022-03-07 14:37:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 14:41:00,2022-03-07 14:55:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 15:03:00,2022-03-07 15:17:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 15:21:00,2022-03-07 15:35:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 15:43:00,2022-03-07 15:57:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 16:01:00,2022-03-07 16:15:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 16:23:00,2022-03-07 16:37:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 16:41:00,2022-03-07 16:55:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 17:03:00,2022-03-07 17:17:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 17:21:00,2022-03-07 17:35:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 17:43:00,2022-03-07 17:57:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 18:01:00,2022-03-07 18:15:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 18:23:00,2022-03-07 18:37:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 18:41:00,2022-03-07 18:55:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 19:03:00,2022-03-07 19:17:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 19:21:00,2022-03-07 19:35:00,S_22,4637,8,4317624,VDL +LINE_9,S_22,2022-03-07 19:43:00,2022-03-07 19:57:00,S_22,4637,4,4317624,VDL +LINE_9,S_22,2022-03-07 20:01:00,2022-03-07 20:14:00,S_22,4637,9,4317624,VDL +LINE_9,S_22,2022-03-07 20:23:00,2022-03-07 20:36:00,S_22,4637,0,4317624,VDL +LINE_9,S_22,2022-03-07 20:36:00,2022-03-07 21:15:00,DEPS_23,19.8,0,4317624,VDL +LINE_10,DEPS_1,2022-03-07 04:56:00,2022-03-07 04:56:00,S_24,0.06,18,4425667,CKB +LINE_10,S_24,2022-03-07 05:14:00,2022-03-07 05:20:00,S_25,3.29,0,4425667,CKB +LINE_10,S_25,2022-03-07 05:20:00,2022-03-07 05:24:00,S_24,2954,20,4425667,CKB +LINE_10,S_24,2022-03-07 05:44:00,2022-03-07 05:50:00,S_25,3.29,0,4425667,CKB +LINE_10,S_25,2022-03-07 05:50:00,2022-03-07 05:54:00,S_24,2954,5,4425667,CKB +LINE_10,S_24,2022-03-07 05:59:00,2022-03-07 06:06:00,S_25,3.29,2,4425667,CKB +LINE_10,S_25,2022-03-07 06:08:00,2022-03-07 06:13:00,S_24,2954,19,4425667,CKB +LINE_10,S_24,2022-03-07 06:32:00,2022-03-07 06:39:00,S_25,3.29,1,4425667,CKB +LINE_10,S_25,2022-03-07 06:40:00,2022-03-07 06:45:00,S_24,2954,7,4425667,CKB +LINE_10,S_24,2022-03-07 06:52:00,2022-03-07 06:59:00,S_25,3.29,1,4425667,CKB +LINE_10,S_25,2022-03-07 07:00:00,2022-03-07 07:05:00,S_24,2954,7,4425667,CKB +LINE_10,S_24,2022-03-07 07:12:00,2022-03-07 07:19:00,S_25,3.29,1,4425667,CKB +LINE_10,S_25,2022-03-07 07:20:00,2022-03-07 07:25:00,S_24,2954,7,4425667,CKB +LINE_10,S_24,2022-03-07 07:32:00,2022-03-07 07:39:00,S_25,3.29,1,4425667,CKB +LINE_10,S_25,2022-03-07 07:40:00,2022-03-07 07:45:00,S_24,2954,295,4425667,CKB +LINE_10,S_24,2022-03-07 12:40:00,2022-03-07 12:47:00,S_25,3.29,2,4425667,CKB +LINE_10,S_25,2022-03-07 12:49:00,2022-03-07 12:54:00,S_24,2954,46,4425667,CKB +LINE_10,S_24,2022-03-07 13:40:00,2022-03-07 13:47:00,S_25,3.29,2,4425667,CKB +LINE_10,S_25,2022-03-07 13:49:00,2022-03-07 13:54:00,S_24,2954,434,4425667,CKB +LINE_10,S_24,2022-03-07 21:08:00,2022-03-07 21:08:00,DEPS_1,0.06,0,4425667,CKB +LINE_11,DEPS_1,2022-03-07 07:20:00,2022-03-07 07:20:00,OPPS_26,0.06,0,4448149,CKB +LINE_11,OPPS_26,2022-03-07 07:20:00,2022-03-07 07:50:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 08:00:00,2022-03-07 08:30:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 08:40:00,2022-03-07 09:10:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 09:20:00,2022-03-07 09:50:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 10:00:00,2022-03-07 10:30:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 10:40:00,2022-03-07 11:10:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 11:20:00,2022-03-07 11:50:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 12:00:00,2022-03-07 12:30:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 12:40:00,2022-03-07 13:10:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 13:20:00,2022-03-07 13:50:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 14:00:00,2022-03-07 14:30:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 14:40:00,2022-03-07 15:10:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 15:20:00,2022-03-07 15:50:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 16:00:00,2022-03-07 16:30:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 16:40:00,2022-03-07 17:10:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 17:20:00,2022-03-07 17:50:00,OPPS_26,9266,10,4448149,CKB +LINE_11,OPPS_26,2022-03-07 18:00:00,2022-03-07 18:30:00,OPPS_26,9266,0,4448149,CKB +LINE_11,OPPS_26,2022-03-07 18:30:00,2022-03-07 18:30:00,DEPS_1,0.06,0,4448149,CKB +LINE_12,DEPS_1,2022-03-07 07:10:00,2022-03-07 07:10:00,S_27,0.06,0,4733894,CKB +LINE_12,S_27,2022-03-07 07:10:00,2022-03-07 07:18:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 07:28:00,2022-03-07 07:40:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 07:40:00,2022-03-07 07:48:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 07:58:00,2022-03-07 08:10:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 08:10:00,2022-03-07 08:18:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 08:28:00,2022-03-07 08:40:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 08:40:00,2022-03-07 08:48:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 08:58:00,2022-03-07 09:10:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 09:10:00,2022-03-07 09:18:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 09:28:00,2022-03-07 09:40:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 09:40:00,2022-03-07 09:48:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 09:58:00,2022-03-07 10:10:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 10:10:00,2022-03-07 10:18:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 10:28:00,2022-03-07 10:40:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 10:40:00,2022-03-07 10:48:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 10:58:00,2022-03-07 11:10:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 11:10:00,2022-03-07 11:18:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 11:28:00,2022-03-07 11:40:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 11:40:00,2022-03-07 11:48:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 11:58:00,2022-03-07 12:10:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 12:10:00,2022-03-07 12:18:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 12:28:00,2022-03-07 12:40:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 12:40:00,2022-03-07 12:48:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 12:58:00,2022-03-07 13:10:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 13:10:00,2022-03-07 13:18:00,OPPS_28,2169,10,4733894,CKB +LINE_12,OPPS_28,2022-03-07 13:28:00,2022-03-07 13:40:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 13:40:00,2022-03-07 13:48:00,OPPS_28,2169,8,4733894,CKB +LINE_12,OPPS_28,2022-03-07 13:56:00,2022-03-07 14:10:00,S_27,2952,0,4733894,CKB +LINE_12,S_27,2022-03-07 14:10:00,2022-03-07 14:19:00,OPPS_28,2169,14,4733894,CKB +LINE_12,OPPS_28,2022-03-07 14:33:00,2022-03-07 14:47:00,S_27,2952,3,4733894,CKB +LINE_12,S_27,2022-03-07 14:50:00,2022-03-07 14:59:00,OPPS_28,2169,14,4733894,CKB +LINE_12,OPPS_28,2022-03-07 15:13:00,2022-03-07 15:27:00,S_27,2952,3,4733894,CKB +LINE_12,S_27,2022-03-07 15:30:00,2022-03-07 15:39:00,OPPS_28,2169,14,4733894,CKB +LINE_12,OPPS_28,2022-03-07 15:53:00,2022-03-07 16:07:00,S_27,2952,3,4733894,CKB +LINE_12,S_27,2022-03-07 16:10:00,2022-03-07 16:19:00,OPPS_28,2169,14,4733894,CKB +LINE_12,OPPS_28,2022-03-07 16:33:00,2022-03-07 16:47:00,S_27,2952,3,4733894,CKB +LINE_12,S_27,2022-03-07 16:50:00,2022-03-07 16:59:00,OPPS_28,2169,14,4733894,CKB +LINE_12,OPPS_28,2022-03-07 17:13:00,2022-03-07 17:27:00,S_27,2952,3,4733894,CKB +LINE_12,S_27,2022-03-07 17:30:00,2022-03-07 17:39:00,OPPS_28,2169,13,4733894,CKB +LINE_12,OPPS_28,2022-03-07 17:52:00,2022-03-07 18:05:00,S_27,2952,5,4733894,CKB +LINE_12,S_27,2022-03-07 18:10:00,2022-03-07 18:18:00,OPPS_28,2169,0,4733894,CKB +LINE_12,OPPS_28,2022-03-07 18:18:00,2022-03-07 18:18:00,DEPS_1,0.06,0,4733894,CKB +LINE_12,DEPS_1,2022-03-07 14:13:00,2022-03-07 14:13:00,OPPS_28,0.06,0,4734199,CKB +LINE_12,OPPS_28,2022-03-07 14:13:00,2022-03-07 14:27:00,S_27,2952,3,4734199,CKB +LINE_12,S_27,2022-03-07 14:30:00,2022-03-07 14:39:00,OPPS_28,2169,14,4734199,CKB +LINE_12,OPPS_28,2022-03-07 14:53:00,2022-03-07 15:07:00,S_27,2952,3,4734199,CKB +LINE_12,S_27,2022-03-07 15:10:00,2022-03-07 15:19:00,OPPS_28,2169,14,4734199,CKB +LINE_12,OPPS_28,2022-03-07 15:33:00,2022-03-07 15:47:00,S_27,2952,3,4734199,CKB +LINE_12,S_27,2022-03-07 15:50:00,2022-03-07 15:59:00,OPPS_28,2169,14,4734199,CKB +LINE_12,OPPS_28,2022-03-07 16:13:00,2022-03-07 16:27:00,S_27,2952,3,4734199,CKB +LINE_12,S_27,2022-03-07 16:30:00,2022-03-07 16:39:00,OPPS_28,2169,14,4734199,CKB +LINE_12,OPPS_28,2022-03-07 16:53:00,2022-03-07 17:07:00,S_27,2952,3,4734199,CKB +LINE_12,S_27,2022-03-07 17:10:00,2022-03-07 17:19:00,OPPS_28,2169,14,4734199,CKB +LINE_12,OPPS_28,2022-03-07 17:33:00,2022-03-07 17:47:00,S_27,2952,3,4734199,CKB +LINE_12,S_27,2022-03-07 17:50:00,2022-03-07 17:59:00,OPPS_28,2169,14,4734199,CKB +LINE_12,OPPS_28,2022-03-07 18:13:00,2022-03-07 18:25:00,S_27,2952,0,4734199,CKB +LINE_12,S_27,2022-03-07 18:25:00,2022-03-07 18:25:00,DEPS_1,0.06,0,4734199,CKB +LINE_13,DEPS_1,2022-03-08 00:23:00,2022-03-08 00:23:00,S_29,0.06,0,4318156,CKB +LINE_13,S_29,2022-03-08 00:23:00,2022-03-08 00:30:00,OPPS_30,2577,9,4318156,CKB +LINE_14,OPPS_30,2022-03-08 00:39:00,2022-03-08 00:54:00,S_31,5937,9,4318156,CKB +LINE_14,S_31,2022-03-08 01:03:00,2022-03-08 01:17:00,OPPS_30,6.19,0,4318156,CKB +LINE_13,OPPS_30,2022-03-08 01:17:00,2022-03-08 01:23:00,S_29,2555,0,4318156,CKB +LINE_13,S_29,2022-03-08 01:23:00,2022-03-08 01:30:00,OPPS_30,2577,9,4318156,CKB +LINE_14,OPPS_30,2022-03-08 01:39:00,2022-03-08 01:54:00,S_31,5937,9,4318156,CKB +LINE_14,S_31,2022-03-08 02:03:00,2022-03-08 02:17:00,OPPS_30,6.19,0,4318156,CKB +LINE_13,OPPS_30,2022-03-08 02:17:00,2022-03-08 02:23:00,S_29,2555,0,4318156,CKB +LINE_13,S_29,2022-03-08 02:23:00,2022-03-08 02:30:00,OPPS_30,2577,9,4318156,CKB +LINE_14,OPPS_30,2022-03-08 02:39:00,2022-03-08 02:54:00,S_31,5937,9,4318156,CKB +LINE_14,S_31,2022-03-08 03:03:00,2022-03-08 03:17:00,OPPS_30,6.19,0,4318156,CKB +LINE_13,OPPS_30,2022-03-08 03:17:00,2022-03-08 03:23:00,S_29,2555,0,4318156,CKB +LINE_13,S_29,2022-03-08 03:23:00,2022-03-08 03:30:00,OPPS_30,2577,9,4318156,CKB +LINE_14,OPPS_30,2022-03-08 03:39:00,2022-03-08 03:54:00,S_31,5937,9,4318156,CKB +LINE_14,S_31,2022-03-08 04:03:00,2022-03-08 04:17:00,OPPS_30,6.19,0,4318156,CKB +LINE_13,OPPS_30,2022-03-08 04:17:00,2022-03-08 04:23:00,S_29,2555,0,4318156,CKB +LINE_13,S_29,2022-03-08 04:23:00,2022-03-08 04:23:00,DEPS_1,0.06,0,4318156,CKB +LINE_14,DEPS_1,2022-03-08 00:33:00,2022-03-08 00:33:00,S_31,0.06,0,4318176,CKB +LINE_14,S_31,2022-03-08 00:33:00,2022-03-08 00:47:00,OPPS_30,6.19,0,4318176,CKB +LINE_13,OPPS_30,2022-03-08 00:47:00,2022-03-08 00:53:00,S_29,2555,0,4318176,CKB +LINE_13,S_29,2022-03-08 00:53:00,2022-03-08 01:00:00,OPPS_30,2577,9,4318176,CKB +LINE_14,OPPS_30,2022-03-08 01:09:00,2022-03-08 01:24:00,S_31,5937,9,4318176,CKB +LINE_14,S_31,2022-03-08 01:33:00,2022-03-08 01:47:00,OPPS_30,6.19,0,4318176,CKB +LINE_13,OPPS_30,2022-03-08 01:47:00,2022-03-08 01:53:00,S_29,2555,0,4318176,CKB +LINE_13,S_29,2022-03-08 01:53:00,2022-03-08 02:00:00,OPPS_30,2577,9,4318176,CKB +LINE_14,OPPS_30,2022-03-08 02:09:00,2022-03-08 02:24:00,S_31,5937,9,4318176,CKB +LINE_14,S_31,2022-03-08 02:33:00,2022-03-08 02:47:00,OPPS_30,6.19,0,4318176,CKB +LINE_13,OPPS_30,2022-03-08 02:47:00,2022-03-08 02:53:00,S_29,2555,0,4318176,CKB +LINE_13,S_29,2022-03-08 02:53:00,2022-03-08 03:00:00,OPPS_30,2577,9,4318176,CKB +LINE_14,OPPS_30,2022-03-08 03:09:00,2022-03-08 03:24:00,S_31,5937,9,4318176,CKB +LINE_14,S_31,2022-03-08 03:33:00,2022-03-08 03:47:00,OPPS_30,6.19,0,4318176,CKB +LINE_13,OPPS_30,2022-03-08 03:47:00,2022-03-08 03:53:00,S_29,2555,0,4318176,CKB +LINE_13,S_29,2022-03-08 03:53:00,2022-03-08 04:00:00,OPPS_30,2577,9,4318176,CKB +LINE_14,OPPS_30,2022-03-08 04:09:00,2022-03-08 04:24:00,S_31,5937,0,4318176,CKB +LINE_14,S_31,2022-03-08 04:24:00,2022-03-08 04:24:00,DEPS_1,0.06,0,4318176,CKB +LINE_15,DEPS_1,2022-03-08 00:57:00,2022-03-08 00:57:00,OPPS_32,0.06,0,4319351,CKB +LINE_15,OPPS_32,2022-03-08 00:57:00,2022-03-08 01:06:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 01:06:00,2022-03-08 01:11:00,OPPS_32,2936,16,4319351,CKB +LINE_15,OPPS_32,2022-03-08 01:27:00,2022-03-08 01:36:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 01:36:00,2022-03-08 01:41:00,OPPS_32,2936,16,4319351,CKB +LINE_15,OPPS_32,2022-03-08 01:57:00,2022-03-08 02:06:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 02:06:00,2022-03-08 02:11:00,OPPS_32,2936,16,4319351,CKB +LINE_15,OPPS_32,2022-03-08 02:27:00,2022-03-08 02:36:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 02:36:00,2022-03-08 02:41:00,OPPS_32,2936,16,4319351,CKB +LINE_15,OPPS_32,2022-03-08 02:57:00,2022-03-08 03:06:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 03:06:00,2022-03-08 03:11:00,OPPS_32,2936,16,4319351,CKB +LINE_15,OPPS_32,2022-03-08 03:27:00,2022-03-08 03:36:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 03:36:00,2022-03-08 03:41:00,OPPS_32,2936,16,4319351,CKB +LINE_15,OPPS_32,2022-03-08 03:57:00,2022-03-08 04:06:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 04:06:00,2022-03-08 04:11:00,OPPS_32,2936,16,4319351,CKB +LINE_15,OPPS_32,2022-03-08 04:27:00,2022-03-08 04:36:00,S_33,4343,0,4319351,CKB +LINE_15,S_33,2022-03-08 04:36:00,2022-03-08 04:36:00,DEPS_1,0.06,0,4319351,CKB +LINE_16,DEPS_1,2022-03-08 00:29:00,2022-03-08 00:29:00,S_34,0.06,0,4751086,CKB +LINE_16,S_34,2022-03-08 00:29:00,2022-03-08 00:41:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 00:47:00,2022-03-08 00:57:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 00:59:00,2022-03-08 01:11:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 01:17:00,2022-03-08 01:27:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 01:29:00,2022-03-08 01:41:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 01:47:00,2022-03-08 01:57:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 01:59:00,2022-03-08 02:11:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 02:17:00,2022-03-08 02:27:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 02:29:00,2022-03-08 02:41:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 02:47:00,2022-03-08 02:57:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 02:59:00,2022-03-08 03:11:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 03:17:00,2022-03-08 03:27:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 03:29:00,2022-03-08 03:41:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 03:47:00,2022-03-08 03:57:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 03:59:00,2022-03-08 04:11:00,S_35,4481,6,4751086,CKB +LINE_16,S_35,2022-03-08 04:17:00,2022-03-08 04:27:00,S_34,4031,2,4751086,CKB +LINE_16,S_34,2022-03-08 04:29:00,2022-03-08 04:41:00,S_35,4481,0,4751086,CKB +LINE_16,S_35,2022-03-08 04:41:00,2022-03-08 04:41:00,DEPS_1,0.06,0,4751086,CKB +LINE_17,DEPS_1,2022-03-08 00:30:00,2022-03-08 00:30:00,S_34,0.06,0,4453544,CKB +LINE_17,S_34,2022-03-08 00:30:00,2022-03-08 00:44:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 00:44:00,2022-03-08 00:57:00,S_34,5302,3,4453544,CKB +LINE_17,S_34,2022-03-08 01:00:00,2022-03-08 01:14:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 01:14:00,2022-03-08 01:27:00,S_34,5302,3,4453544,CKB +LINE_17,S_34,2022-03-08 01:30:00,2022-03-08 01:44:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 01:44:00,2022-03-08 01:57:00,S_34,5302,3,4453544,CKB +LINE_17,S_34,2022-03-08 02:00:00,2022-03-08 02:14:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 02:14:00,2022-03-08 02:27:00,S_34,5302,3,4453544,CKB +LINE_17,S_34,2022-03-08 02:30:00,2022-03-08 02:44:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 02:44:00,2022-03-08 02:57:00,S_34,5302,3,4453544,CKB +LINE_17,S_34,2022-03-08 03:00:00,2022-03-08 03:14:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 03:14:00,2022-03-08 03:27:00,S_34,5302,3,4453544,CKB +LINE_17,S_34,2022-03-08 03:30:00,2022-03-08 03:44:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 03:44:00,2022-03-08 03:57:00,S_34,5302,3,4453544,CKB +LINE_17,S_34,2022-03-08 04:00:00,2022-03-08 04:14:00,S_36,4801,0,4453544,CKB +LINE_17,S_36,2022-03-08 04:14:00,2022-03-08 04:27:00,S_34,5302,0,4453544,CKB +LINE_17,S_34,2022-03-08 04:27:00,2022-03-08 04:27:00,DEPS_1,0.06,0,4453544,CKB +LINE_18,DEPS_1,2022-03-08 00:43:00,2022-03-08 00:43:00,S_37,0.06,0,4374466,CKB +LINE_18,S_37,2022-03-08 00:43:00,2022-03-08 01:33:00,S_37,20434,10,4374466,CKB +LINE_18,S_37,2022-03-08 01:43:00,2022-03-08 02:33:00,S_37,20434,10,4374466,CKB +LINE_18,S_37,2022-03-08 02:43:00,2022-03-08 03:33:00,S_37,20434,10,4374466,CKB +LINE_18,S_37,2022-03-08 03:43:00,2022-03-08 04:33:00,S_37,20434,0,4374466,CKB +LINE_18,S_37,2022-03-08 04:33:00,2022-03-08 04:33:00,DEPS_1,0.06,0,4374466,CKB +LINE_18,DEPS_1,2022-03-08 00:13:00,2022-03-08 00:13:00,S_37,0.06,0,4374471,CKB +LINE_18,S_37,2022-03-08 00:13:00,2022-03-08 01:03:00,S_37,20434,10,4374471,CKB +LINE_18,S_37,2022-03-08 01:13:00,2022-03-08 02:03:00,S_37,20434,10,4374471,CKB +LINE_18,S_37,2022-03-08 02:13:00,2022-03-08 03:03:00,S_37,20434,10,4374471,CKB +LINE_18,S_37,2022-03-08 03:13:00,2022-03-08 04:03:00,S_37,20434,0,4374471,CKB +LINE_18,S_37,2022-03-08 04:03:00,2022-03-08 04:03:00,DEPS_1,0.06,0,4374471,CKB +LINE_19,DEPS_1,2022-03-08 00:24:00,2022-03-08 00:24:00,S_38,0.06,0,4456447,CKB +LINE_19,S_38,2022-03-08 00:24:00,2022-03-08 00:48:00,OPPS_39,11.86,4,4456447,CKB +LINE_19,OPPS_39,2022-03-08 00:52:00,2022-03-08 01:14:00,S_38,11139,10,4456447,CKB +LINE_19,S_38,2022-03-08 01:24:00,2022-03-08 01:48:00,OPPS_39,11.86,4,4456447,CKB +LINE_19,OPPS_39,2022-03-08 01:52:00,2022-03-08 02:14:00,S_38,11139,10,4456447,CKB +LINE_19,S_38,2022-03-08 02:24:00,2022-03-08 02:48:00,OPPS_39,11.86,4,4456447,CKB +LINE_19,OPPS_39,2022-03-08 02:52:00,2022-03-08 03:14:00,S_38,11139,10,4456447,CKB +LINE_19,S_38,2022-03-08 03:24:00,2022-03-08 03:48:00,OPPS_39,11.86,4,4456447,CKB +LINE_19,OPPS_39,2022-03-08 03:52:00,2022-03-08 04:14:00,S_38,11139,0,4456447,CKB +LINE_19,S_38,2022-03-08 04:14:00,2022-03-08 04:14:00,DEPS_1,0.06,0,4456447,CKB +LINE_19,DEPS_1,2022-03-08 00:22:00,2022-03-08 00:22:00,OPPS_39,0.06,0,4456455,CKB +LINE_19,OPPS_39,2022-03-08 00:22:00,2022-03-08 00:44:00,S_38,11139,10,4456455,CKB +LINE_19,S_38,2022-03-08 00:54:00,2022-03-08 01:18:00,OPPS_39,11.86,4,4456455,CKB +LINE_19,OPPS_39,2022-03-08 01:22:00,2022-03-08 01:44:00,S_38,11139,10,4456455,CKB +LINE_19,S_38,2022-03-08 01:54:00,2022-03-08 02:18:00,OPPS_39,11.86,4,4456455,CKB +LINE_19,OPPS_39,2022-03-08 02:22:00,2022-03-08 02:44:00,S_38,11139,10,4456455,CKB +LINE_19,S_38,2022-03-08 02:54:00,2022-03-08 03:18:00,OPPS_39,11.86,4,4456455,CKB +LINE_19,OPPS_39,2022-03-08 03:22:00,2022-03-08 03:44:00,S_38,11139,10,4456455,CKB +LINE_19,S_38,2022-03-08 03:54:00,2022-03-08 04:18:00,OPPS_39,11.86,4,4456455,CKB +LINE_19,OPPS_39,2022-03-08 04:22:00,2022-03-08 04:44:00,S_38,11139,0,4456455,CKB +LINE_19,S_38,2022-03-08 04:44:00,2022-03-08 04:44:00,DEPS_1,0.06,0,4456455,CKB +LINE_20,DEPS_1,2022-03-08 00:32:00,2022-03-08 00:32:00,S_13,0.06,0,4747649,CKB +LINE_20,S_13,2022-03-08 00:32:00,2022-03-08 00:44:00,S_40,4212,3,4747649,CKB +LINE_20,S_40,2022-03-08 00:47:00,2022-03-08 01:16:00,S_41,13048,0,4747649,CKB +LINE_20,S_41,2022-03-08 01:16:00,2022-03-08 01:42:00,S_40,12869,5,4747649,CKB +LINE_20,S_40,2022-03-08 01:47:00,2022-03-08 02:16:00,S_41,13048,0,4747649,CKB +LINE_20,S_41,2022-03-08 02:16:00,2022-03-08 02:42:00,S_40,12869,5,4747649,CKB +LINE_20,S_40,2022-03-08 02:47:00,2022-03-08 03:16:00,S_41,13048,0,4747649,CKB +LINE_20,S_41,2022-03-08 03:16:00,2022-03-08 03:42:00,S_40,12869,5,4747649,CKB +LINE_20,S_40,2022-03-08 03:47:00,2022-03-08 04:16:00,S_41,13048,0,4747649,CKB +LINE_20,S_41,2022-03-08 04:16:00,2022-03-08 04:34:00,DEPS_42,9538,0,4747649,CKB +LINE_20,DEPS_42,2022-03-08 04:34:00,2022-03-08 04:34:00,DEPS_1,0.06,0,4747649,CKB +LINE_20,DEPS_1,2022-03-08 00:17:00,2022-03-08 00:17:00,S_40,0.06,0,4747659,CKB +LINE_20,S_40,2022-03-08 00:17:00,2022-03-08 00:46:00,S_41,13048,0,4747659,CKB +LINE_20,S_41,2022-03-08 00:46:00,2022-03-08 01:12:00,S_40,12869,5,4747659,CKB +LINE_20,S_40,2022-03-08 01:17:00,2022-03-08 01:46:00,S_41,13048,0,4747659,CKB +LINE_20,S_41,2022-03-08 01:46:00,2022-03-08 02:12:00,S_40,12869,5,4747659,CKB +LINE_20,S_40,2022-03-08 02:17:00,2022-03-08 02:46:00,S_41,13048,0,4747659,CKB +LINE_20,S_41,2022-03-08 02:46:00,2022-03-08 03:12:00,S_40,12869,5,4747659,CKB +LINE_20,S_40,2022-03-08 03:17:00,2022-03-08 03:46:00,S_41,13048,0,4747659,CKB +LINE_20,S_41,2022-03-08 03:46:00,2022-03-08 04:12:00,S_40,12869,5,4747659,CKB +LINE_20,S_40,2022-03-08 04:17:00,2022-03-08 04:28:00,S_13,4316,0,4747659,CKB +LINE_20,S_13,2022-03-08 04:28:00,2022-03-08 04:28:00,DEPS_1,0.06,0,4747659,CKB +LINE_21,DEPS_1,2022-03-08 00:49:00,2022-03-08 00:49:00,OPPS_3,0.06,0,4434340,CKB +LINE_21,OPPS_3,2022-03-08 00:49:00,2022-03-08 01:04:00,S_16,10229,0,4434340,CKB +LINE_21,S_16,2022-03-08 01:04:00,2022-03-08 01:19:00,OPPS_3,11801,0,4434340,CKB +LINE_21,OPPS_3,2022-03-08 01:19:00,2022-03-08 01:34:00,S_16,10229,0,4434340,CKB +LINE_21,S_16,2022-03-08 01:34:00,2022-03-08 01:49:00,OPPS_3,11801,0,4434340,CKB +LINE_21,OPPS_3,2022-03-08 01:49:00,2022-03-08 02:04:00,S_16,10229,0,4434340,CKB +LINE_21,S_16,2022-03-08 02:04:00,2022-03-08 02:19:00,OPPS_3,11801,0,4434340,CKB +LINE_21,OPPS_3,2022-03-08 02:19:00,2022-03-08 02:34:00,S_16,10229,0,4434340,CKB +LINE_21,S_16,2022-03-08 02:34:00,2022-03-08 02:49:00,OPPS_3,11801,0,4434340,CKB +LINE_21,OPPS_3,2022-03-08 02:49:00,2022-03-08 03:04:00,S_16,10229,0,4434340,CKB +LINE_21,S_16,2022-03-08 03:04:00,2022-03-08 03:19:00,OPPS_3,11801,0,4434340,CKB +LINE_21,OPPS_3,2022-03-08 03:19:00,2022-03-08 03:34:00,S_16,10229,0,4434340,CKB +LINE_21,S_16,2022-03-08 03:34:00,2022-03-08 03:49:00,OPPS_3,11801,0,4434340,CKB +LINE_21,OPPS_3,2022-03-08 03:49:00,2022-03-08 04:04:00,S_16,10229,0,4434340,CKB +LINE_21,S_16,2022-03-08 04:04:00,2022-03-08 04:19:00,OPPS_3,11801,23,4434340,CKB +LINE_22,OPPS_3,2022-03-08 04:42:00,2022-03-08 05:04:00,S_43,6.81,0,4434340,CKB +LINE_22,S_43,2022-03-08 05:04:00,2022-03-08 05:04:00,DEPS_1,0.06,0,4434340,CKB +LINE_8,DEPS_1,2022-03-08 00:32:00,2022-03-08 00:32:00,S_13,0.06,0,4434896,CKB +LINE_8,S_13,2022-03-08 00:32:00,2022-03-08 00:57:00,OPPS_21,11545,6,4434896,CKB +LINE_8,OPPS_21,2022-03-08 01:03:00,2022-03-08 01:46:00,S_20,20579,1,4434896,CKB +LINE_8,S_20,2022-03-08 01:47:00,2022-03-08 02:25:00,OPPS_21,20641,8,4434896,CKB +LINE_8,OPPS_21,2022-03-08 02:33:00,2022-03-08 03:16:00,S_20,20579,1,4434896,CKB +LINE_8,S_20,2022-03-08 03:17:00,2022-03-08 03:55:00,OPPS_21,20641,8,4434896,CKB +LINE_8,OPPS_21,2022-03-08 04:03:00,2022-03-08 04:28:00,S_13,11499,0,4434896,CKB +LINE_8,S_13,2022-03-08 04:28:00,2022-03-08 04:28:00,DEPS_1,0.06,0,4434896,CKB +LINE_8,DEPS_1,2022-03-08 00:33:00,2022-03-08 00:33:00,OPPS_21,0.06,0,4434901,CKB +LINE_8,OPPS_21,2022-03-08 00:33:00,2022-03-08 01:16:00,S_20,20579,1,4434901,CKB +LINE_8,S_20,2022-03-08 01:17:00,2022-03-08 01:55:00,OPPS_21,20641,8,4434901,CKB +LINE_8,OPPS_21,2022-03-08 02:03:00,2022-03-08 02:46:00,S_20,20579,1,4434901,CKB +LINE_8,S_20,2022-03-08 02:47:00,2022-03-08 03:25:00,OPPS_21,20641,8,4434901,CKB +LINE_8,OPPS_21,2022-03-08 03:33:00,2022-03-08 04:16:00,S_20,20579,1,4434901,CKB +LINE_8,S_20,2022-03-08 04:17:00,2022-03-08 04:51:00,S_44,18752,0,4434901,CKB +LINE_8,S_44,2022-03-08 04:51:00,2022-03-08 04:51:00,DEPS_1,0.06,0,4434901,CKB +LINE_23,DEPS_1,2022-03-08 00:34:00,2022-03-08 00:34:00,S_45,0.06,0,4619765,CKB +LINE_23,S_45,2022-03-08 00:34:00,2022-03-08 01:00:00,S_46,9016,0,4619765,CKB +LINE_23,S_46,2022-03-08 01:00:00,2022-03-08 01:27:00,S_45,10083,7,4619765,CKB +LINE_23,S_45,2022-03-08 01:34:00,2022-03-08 02:00:00,S_46,9016,0,4619765,CKB +LINE_23,S_46,2022-03-08 02:00:00,2022-03-08 02:27:00,S_45,10083,7,4619765,CKB +LINE_23,S_45,2022-03-08 02:34:00,2022-03-08 03:00:00,S_46,9016,0,4619765,CKB +LINE_23,S_46,2022-03-08 03:00:00,2022-03-08 03:27:00,S_45,10083,7,4619765,CKB +LINE_23,S_45,2022-03-08 03:34:00,2022-03-08 04:00:00,S_46,9016,0,4619765,CKB +LINE_23,S_46,2022-03-08 04:00:00,2022-03-08 04:27:00,S_45,10083,0,4619765,CKB +LINE_23,S_45,2022-03-08 04:27:00,2022-03-08 04:27:00,DEPS_1,0.06,0,4619765,CKB +LINE_23,DEPS_1,2022-03-08 00:30:00,2022-03-08 00:30:00,S_46,0.06,0,4619990,CKB +LINE_23,S_46,2022-03-08 00:30:00,2022-03-08 00:57:00,S_45,10083,7,4619990,CKB +LINE_23,S_45,2022-03-08 01:04:00,2022-03-08 01:30:00,S_46,9016,0,4619990,CKB +LINE_23,S_46,2022-03-08 01:30:00,2022-03-08 01:57:00,S_45,10083,7,4619990,CKB +LINE_23,S_45,2022-03-08 02:04:00,2022-03-08 02:30:00,S_46,9016,0,4619990,CKB +LINE_23,S_46,2022-03-08 02:30:00,2022-03-08 02:57:00,S_45,10083,7,4619990,CKB +LINE_23,S_45,2022-03-08 03:04:00,2022-03-08 03:30:00,S_46,9016,0,4619990,CKB +LINE_23,S_46,2022-03-08 03:30:00,2022-03-08 03:57:00,S_45,10083,7,4619990,CKB +LINE_23,S_45,2022-03-08 04:04:00,2022-03-08 04:30:00,S_46,9016,0,4619990,CKB +LINE_23,S_46,2022-03-08 04:30:00,2022-03-08 04:57:00,S_45,10083,0,4619990,CKB +LINE_23,S_45,2022-03-08 04:57:00,2022-03-08 04:57:00,DEPS_1,0.06,0,4619990,CKB +LINE_24,DEPS_1,2022-03-08 00:31:00,2022-03-08 00:31:00,OPPS_21,0.06,0,4374743,CKB +LINE_24,OPPS_21,2022-03-08 00:31:00,2022-03-08 00:44:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 00:44:00,2022-03-08 00:56:00,OPPS_21,5362,5,4374743,CKB +LINE_24,OPPS_21,2022-03-08 01:01:00,2022-03-08 01:14:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 01:14:00,2022-03-08 01:26:00,OPPS_21,5362,5,4374743,CKB +LINE_24,OPPS_21,2022-03-08 01:31:00,2022-03-08 01:44:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 01:44:00,2022-03-08 01:56:00,OPPS_21,5362,5,4374743,CKB +LINE_24,OPPS_21,2022-03-08 02:01:00,2022-03-08 02:14:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 02:14:00,2022-03-08 02:26:00,OPPS_21,5362,5,4374743,CKB +LINE_24,OPPS_21,2022-03-08 02:31:00,2022-03-08 02:44:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 02:44:00,2022-03-08 02:56:00,OPPS_21,5362,5,4374743,CKB +LINE_24,OPPS_21,2022-03-08 03:01:00,2022-03-08 03:14:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 03:14:00,2022-03-08 03:26:00,OPPS_21,5362,5,4374743,CKB +LINE_24,OPPS_21,2022-03-08 03:31:00,2022-03-08 03:44:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 03:44:00,2022-03-08 03:56:00,OPPS_21,5362,5,4374743,CKB +LINE_24,OPPS_21,2022-03-08 04:01:00,2022-03-08 04:14:00,S_47,4872,0,4374743,CKB +LINE_24,S_47,2022-03-08 04:14:00,2022-03-08 04:26:00,OPPS_21,5362,0,4374743,CKB +LINE_24,OPPS_21,2022-03-08 04:26:00,2022-03-08 04:26:00,DEPS_1,0.06,0,4374743,CKB +LINE_25,DEPS_1,2022-03-08 00:31:00,2022-03-08 00:31:00,OPPS_21,0.06,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 00:31:00,2022-03-08 00:45:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 00:47:00,2022-03-08 01:01:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 01:01:00,2022-03-08 01:15:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 01:17:00,2022-03-08 01:31:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 01:31:00,2022-03-08 01:45:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 01:47:00,2022-03-08 02:01:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 02:01:00,2022-03-08 02:15:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 02:17:00,2022-03-08 02:31:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 02:31:00,2022-03-08 02:45:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 02:47:00,2022-03-08 03:01:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 03:01:00,2022-03-08 03:15:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 03:17:00,2022-03-08 03:31:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 03:31:00,2022-03-08 03:45:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 03:47:00,2022-03-08 04:01:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 04:01:00,2022-03-08 04:15:00,S_48,5225,2,4374865,CKB +LINE_25,S_48,2022-03-08 04:17:00,2022-03-08 04:31:00,OPPS_21,7617,0,4374865,CKB +LINE_25,OPPS_21,2022-03-08 04:31:00,2022-03-08 04:31:00,DEPS_1,0.06,0,4374865,CKB +LINE_26,DEPS_1,2022-03-08 00:43:00,2022-03-08 00:43:00,S_49,0.06,0,4375012,CKB +LINE_26,S_49,2022-03-08 00:43:00,2022-03-08 00:53:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 00:53:00,2022-03-08 01:03:00,S_49,4408,10,4375012,CKB +LINE_26,S_49,2022-03-08 01:13:00,2022-03-08 01:23:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 01:23:00,2022-03-08 01:33:00,S_49,4408,10,4375012,CKB +LINE_26,S_49,2022-03-08 01:43:00,2022-03-08 01:53:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 01:53:00,2022-03-08 02:03:00,S_49,4408,10,4375012,CKB +LINE_26,S_49,2022-03-08 02:13:00,2022-03-08 02:23:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 02:23:00,2022-03-08 02:33:00,S_49,4408,10,4375012,CKB +LINE_26,S_49,2022-03-08 02:43:00,2022-03-08 02:53:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 02:53:00,2022-03-08 03:03:00,S_49,4408,10,4375012,CKB +LINE_26,S_49,2022-03-08 03:13:00,2022-03-08 03:23:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 03:23:00,2022-03-08 03:33:00,S_49,4408,10,4375012,CKB +LINE_26,S_49,2022-03-08 03:43:00,2022-03-08 03:53:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 03:53:00,2022-03-08 04:03:00,S_49,4408,10,4375012,CKB +LINE_26,S_49,2022-03-08 04:13:00,2022-03-08 04:23:00,S_50,4507,0,4375012,CKB +LINE_26,S_50,2022-03-08 04:23:00,2022-03-08 04:33:00,S_49,4408,0,4375012,CKB +LINE_26,S_49,2022-03-08 04:33:00,2022-03-08 04:33:00,DEPS_1,0.06,0,4375012,CKB +LINE_21,DEPS_1,2022-03-07 00:49:00,2022-03-07 00:49:00,OPPS_3,0.06,0,4434215,CKB +LINE_21,OPPS_3,2022-03-07 00:49:00,2022-03-07 01:04:00,S_16,10229,0,4434215,CKB +LINE_21,S_16,2022-03-07 01:04:00,2022-03-07 01:19:00,OPPS_3,11801,0,4434215,CKB +LINE_21,OPPS_3,2022-03-07 01:19:00,2022-03-07 01:34:00,S_16,10229,0,4434215,CKB +LINE_21,S_16,2022-03-07 01:34:00,2022-03-07 01:49:00,OPPS_3,11801,0,4434215,CKB +LINE_21,OPPS_3,2022-03-07 01:49:00,2022-03-07 02:04:00,S_16,10229,0,4434215,CKB +LINE_21,S_16,2022-03-07 02:04:00,2022-03-07 02:19:00,OPPS_3,11801,0,4434215,CKB +LINE_21,OPPS_3,2022-03-07 02:19:00,2022-03-07 02:34:00,S_16,10229,0,4434215,CKB +LINE_21,S_16,2022-03-07 02:34:00,2022-03-07 02:49:00,OPPS_3,11801,0,4434215,CKB +LINE_21,OPPS_3,2022-03-07 02:49:00,2022-03-07 03:04:00,S_16,10229,0,4434215,CKB +LINE_21,S_16,2022-03-07 03:04:00,2022-03-07 03:19:00,OPPS_3,11801,0,4434215,CKB +LINE_21,OPPS_3,2022-03-07 03:19:00,2022-03-07 03:34:00,S_16,10229,0,4434215,CKB +LINE_21,S_16,2022-03-07 03:34:00,2022-03-07 03:49:00,OPPS_3,11801,0,4434215,CKB +LINE_21,OPPS_3,2022-03-07 03:49:00,2022-03-07 04:04:00,S_16,10229,0,4434215,CKB +LINE_21,S_16,2022-03-07 04:04:00,2022-03-07 04:19:00,OPPS_3,11801,23,4434215,CKB +LINE_22,OPPS_3,2022-03-07 04:42:00,2022-03-07 05:04:00,S_43,6.81,0,4434215,CKB +LINE_22,S_43,2022-03-07 05:04:00,2022-03-07 05:04:00,DEPS_1,0.06,0,4434215,CKB +LINE_13,DEPS_1,2022-03-07 00:23:00,2022-03-07 00:23:00,S_29,0.06,0,4318071,CKB +LINE_13,S_29,2022-03-07 00:23:00,2022-03-07 00:30:00,OPPS_30,2577,9,4318071,CKB +LINE_14,OPPS_30,2022-03-07 00:39:00,2022-03-07 00:54:00,S_31,5937,9,4318071,CKB +LINE_14,S_31,2022-03-07 01:03:00,2022-03-07 01:17:00,OPPS_30,6.19,0,4318071,CKB +LINE_13,OPPS_30,2022-03-07 01:17:00,2022-03-07 01:23:00,S_29,2555,0,4318071,CKB +LINE_13,S_29,2022-03-07 01:23:00,2022-03-07 01:30:00,OPPS_30,2577,9,4318071,CKB +LINE_14,OPPS_30,2022-03-07 01:39:00,2022-03-07 01:54:00,S_31,5937,9,4318071,CKB +LINE_14,S_31,2022-03-07 02:03:00,2022-03-07 02:17:00,OPPS_30,6.19,0,4318071,CKB +LINE_13,OPPS_30,2022-03-07 02:17:00,2022-03-07 02:23:00,S_29,2555,0,4318071,CKB +LINE_13,S_29,2022-03-07 02:23:00,2022-03-07 02:30:00,OPPS_30,2577,9,4318071,CKB +LINE_14,OPPS_30,2022-03-07 02:39:00,2022-03-07 02:54:00,S_31,5937,9,4318071,CKB +LINE_14,S_31,2022-03-07 03:03:00,2022-03-07 03:17:00,OPPS_30,6.19,0,4318071,CKB +LINE_13,OPPS_30,2022-03-07 03:17:00,2022-03-07 03:23:00,S_29,2555,0,4318071,CKB +LINE_13,S_29,2022-03-07 03:23:00,2022-03-07 03:30:00,OPPS_30,2577,9,4318071,CKB +LINE_14,OPPS_30,2022-03-07 03:39:00,2022-03-07 03:54:00,S_31,5937,9,4318071,CKB +LINE_14,S_31,2022-03-07 04:03:00,2022-03-07 04:17:00,OPPS_30,6.19,0,4318071,CKB +LINE_13,OPPS_30,2022-03-07 04:17:00,2022-03-07 04:23:00,S_29,2555,0,4318071,CKB +LINE_13,S_29,2022-03-07 04:23:00,2022-03-07 04:23:00,DEPS_1,0.06,0,4318071,CKB +LINE_14,DEPS_1,2022-03-07 00:33:00,2022-03-07 00:33:00,S_31,0.06,0,4318083,CKB +LINE_14,S_31,2022-03-07 00:33:00,2022-03-07 00:47:00,OPPS_30,6.19,0,4318083,CKB +LINE_13,OPPS_30,2022-03-07 00:47:00,2022-03-07 00:53:00,S_29,2555,0,4318083,CKB +LINE_13,S_29,2022-03-07 00:53:00,2022-03-07 01:00:00,OPPS_30,2577,9,4318083,CKB +LINE_14,OPPS_30,2022-03-07 01:09:00,2022-03-07 01:24:00,S_31,5937,9,4318083,CKB +LINE_14,S_31,2022-03-07 01:33:00,2022-03-07 01:47:00,OPPS_30,6.19,0,4318083,CKB +LINE_13,OPPS_30,2022-03-07 01:47:00,2022-03-07 01:53:00,S_29,2555,0,4318083,CKB +LINE_13,S_29,2022-03-07 01:53:00,2022-03-07 02:00:00,OPPS_30,2577,9,4318083,CKB +LINE_14,OPPS_30,2022-03-07 02:09:00,2022-03-07 02:24:00,S_31,5937,9,4318083,CKB +LINE_14,S_31,2022-03-07 02:33:00,2022-03-07 02:47:00,OPPS_30,6.19,0,4318083,CKB +LINE_13,OPPS_30,2022-03-07 02:47:00,2022-03-07 02:53:00,S_29,2555,0,4318083,CKB +LINE_13,S_29,2022-03-07 02:53:00,2022-03-07 03:00:00,OPPS_30,2577,9,4318083,CKB +LINE_14,OPPS_30,2022-03-07 03:09:00,2022-03-07 03:24:00,S_31,5937,9,4318083,CKB +LINE_14,S_31,2022-03-07 03:33:00,2022-03-07 03:47:00,OPPS_30,6.19,0,4318083,CKB +LINE_13,OPPS_30,2022-03-07 03:47:00,2022-03-07 03:53:00,S_29,2555,0,4318083,CKB +LINE_13,S_29,2022-03-07 03:53:00,2022-03-07 04:00:00,OPPS_30,2577,9,4318083,CKB +LINE_14,OPPS_30,2022-03-07 04:09:00,2022-03-07 04:24:00,S_31,5937,0,4318083,CKB +LINE_14,S_31,2022-03-07 04:24:00,2022-03-07 04:24:00,DEPS_1,0.06,0,4318083,CKB +LINE_15,DEPS_1,2022-03-07 00:57:00,2022-03-07 00:57:00,OPPS_32,0.06,0,4319428,CKB +LINE_15,OPPS_32,2022-03-07 00:57:00,2022-03-07 01:06:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 01:06:00,2022-03-07 01:11:00,OPPS_32,2936,16,4319428,CKB +LINE_15,OPPS_32,2022-03-07 01:27:00,2022-03-07 01:36:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 01:36:00,2022-03-07 01:41:00,OPPS_32,2936,16,4319428,CKB +LINE_15,OPPS_32,2022-03-07 01:57:00,2022-03-07 02:06:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 02:06:00,2022-03-07 02:11:00,OPPS_32,2936,16,4319428,CKB +LINE_15,OPPS_32,2022-03-07 02:27:00,2022-03-07 02:36:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 02:36:00,2022-03-07 02:41:00,OPPS_32,2936,16,4319428,CKB +LINE_15,OPPS_32,2022-03-07 02:57:00,2022-03-07 03:06:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 03:06:00,2022-03-07 03:11:00,OPPS_32,2936,16,4319428,CKB +LINE_15,OPPS_32,2022-03-07 03:27:00,2022-03-07 03:36:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 03:36:00,2022-03-07 03:41:00,OPPS_32,2936,16,4319428,CKB +LINE_15,OPPS_32,2022-03-07 03:57:00,2022-03-07 04:06:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 04:06:00,2022-03-07 04:11:00,OPPS_32,2936,16,4319428,CKB +LINE_15,OPPS_32,2022-03-07 04:27:00,2022-03-07 04:36:00,S_33,4343,0,4319428,CKB +LINE_15,S_33,2022-03-07 04:36:00,2022-03-07 04:36:00,DEPS_1,0.06,0,4319428,CKB +LINE_16,DEPS_1,2022-03-07 00:29:00,2022-03-07 00:29:00,S_34,0.06,0,4751093,CKB +LINE_16,S_34,2022-03-07 00:29:00,2022-03-07 00:41:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 00:47:00,2022-03-07 00:57:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 00:59:00,2022-03-07 01:11:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 01:17:00,2022-03-07 01:27:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 01:29:00,2022-03-07 01:41:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 01:47:00,2022-03-07 01:57:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 01:59:00,2022-03-07 02:11:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 02:17:00,2022-03-07 02:27:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 02:29:00,2022-03-07 02:41:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 02:47:00,2022-03-07 02:57:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 02:59:00,2022-03-07 03:11:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 03:17:00,2022-03-07 03:27:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 03:29:00,2022-03-07 03:41:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 03:47:00,2022-03-07 03:57:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 03:59:00,2022-03-07 04:11:00,S_35,4481,6,4751093,CKB +LINE_16,S_35,2022-03-07 04:17:00,2022-03-07 04:27:00,S_34,4031,2,4751093,CKB +LINE_16,S_34,2022-03-07 04:29:00,2022-03-07 04:41:00,S_35,4481,0,4751093,CKB +LINE_16,S_35,2022-03-07 04:41:00,2022-03-07 04:41:00,DEPS_1,0.06,0,4751093,CKB +LINE_17,DEPS_1,2022-03-07 00:30:00,2022-03-07 00:30:00,S_34,0.06,0,4454017,CKB +LINE_17,S_34,2022-03-07 00:30:00,2022-03-07 00:44:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 00:44:00,2022-03-07 00:57:00,S_34,5302,3,4454017,CKB +LINE_17,S_34,2022-03-07 01:00:00,2022-03-07 01:14:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 01:14:00,2022-03-07 01:27:00,S_34,5302,3,4454017,CKB +LINE_17,S_34,2022-03-07 01:30:00,2022-03-07 01:44:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 01:44:00,2022-03-07 01:57:00,S_34,5302,3,4454017,CKB +LINE_17,S_34,2022-03-07 02:00:00,2022-03-07 02:14:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 02:14:00,2022-03-07 02:27:00,S_34,5302,3,4454017,CKB +LINE_17,S_34,2022-03-07 02:30:00,2022-03-07 02:44:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 02:44:00,2022-03-07 02:57:00,S_34,5302,3,4454017,CKB +LINE_17,S_34,2022-03-07 03:00:00,2022-03-07 03:14:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 03:14:00,2022-03-07 03:27:00,S_34,5302,3,4454017,CKB +LINE_17,S_34,2022-03-07 03:30:00,2022-03-07 03:44:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 03:44:00,2022-03-07 03:57:00,S_34,5302,3,4454017,CKB +LINE_17,S_34,2022-03-07 04:00:00,2022-03-07 04:14:00,S_36,4801,0,4454017,CKB +LINE_17,S_36,2022-03-07 04:14:00,2022-03-07 04:27:00,S_34,5302,0,4454017,CKB +LINE_17,S_34,2022-03-07 04:27:00,2022-03-07 04:27:00,DEPS_1,0.06,0,4454017,CKB +LINE_18,DEPS_1,2022-03-07 00:43:00,2022-03-07 00:43:00,S_37,0.06,0,4374470,CKB +LINE_18,S_37,2022-03-07 00:43:00,2022-03-07 01:33:00,S_37,20434,10,4374470,CKB +LINE_18,S_37,2022-03-07 01:43:00,2022-03-07 02:33:00,S_37,20434,10,4374470,CKB +LINE_18,S_37,2022-03-07 02:43:00,2022-03-07 03:33:00,S_37,20434,10,4374470,CKB +LINE_18,S_37,2022-03-07 03:43:00,2022-03-07 04:33:00,S_37,20434,0,4374470,CKB +LINE_18,S_37,2022-03-07 04:33:00,2022-03-07 04:33:00,DEPS_1,0.06,0,4374470,CKB +LINE_18,DEPS_1,2022-03-07 00:13:00,2022-03-07 00:13:00,S_37,0.06,0,4374475,CKB +LINE_18,S_37,2022-03-07 00:13:00,2022-03-07 01:03:00,S_37,20434,10,4374475,CKB +LINE_18,S_37,2022-03-07 01:13:00,2022-03-07 02:03:00,S_37,20434,10,4374475,CKB +LINE_18,S_37,2022-03-07 02:13:00,2022-03-07 03:03:00,S_37,20434,10,4374475,CKB +LINE_18,S_37,2022-03-07 03:13:00,2022-03-07 04:03:00,S_37,20434,0,4374475,CKB +LINE_18,S_37,2022-03-07 04:03:00,2022-03-07 04:03:00,DEPS_1,0.06,0,4374475,CKB +LINE_19,DEPS_1,2022-03-07 00:24:00,2022-03-07 00:24:00,S_38,0.06,0,4456537,CKB +LINE_19,S_38,2022-03-07 00:24:00,2022-03-07 00:48:00,OPPS_39,11.86,4,4456537,CKB +LINE_19,OPPS_39,2022-03-07 00:52:00,2022-03-07 01:14:00,S_38,11139,10,4456537,CKB +LINE_19,S_38,2022-03-07 01:24:00,2022-03-07 01:48:00,OPPS_39,11.86,4,4456537,CKB +LINE_19,OPPS_39,2022-03-07 01:52:00,2022-03-07 02:14:00,S_38,11139,10,4456537,CKB +LINE_19,S_38,2022-03-07 02:24:00,2022-03-07 02:48:00,OPPS_39,11.86,4,4456537,CKB +LINE_19,OPPS_39,2022-03-07 02:52:00,2022-03-07 03:14:00,S_38,11139,10,4456537,CKB +LINE_19,S_38,2022-03-07 03:24:00,2022-03-07 03:48:00,OPPS_39,11.86,4,4456537,CKB +LINE_19,OPPS_39,2022-03-07 03:52:00,2022-03-07 04:14:00,S_38,11139,0,4456537,CKB +LINE_19,S_38,2022-03-07 04:14:00,2022-03-07 04:14:00,DEPS_1,0.06,0,4456537,CKB +LINE_19,DEPS_1,2022-03-07 00:22:00,2022-03-07 00:22:00,OPPS_39,0.06,0,4456538,CKB +LINE_19,OPPS_39,2022-03-07 00:22:00,2022-03-07 00:44:00,S_38,11139,10,4456538,CKB +LINE_19,S_38,2022-03-07 00:54:00,2022-03-07 01:18:00,OPPS_39,11.86,4,4456538,CKB +LINE_19,OPPS_39,2022-03-07 01:22:00,2022-03-07 01:44:00,S_38,11139,10,4456538,CKB +LINE_19,S_38,2022-03-07 01:54:00,2022-03-07 02:18:00,OPPS_39,11.86,4,4456538,CKB +LINE_19,OPPS_39,2022-03-07 02:22:00,2022-03-07 02:44:00,S_38,11139,10,4456538,CKB +LINE_19,S_38,2022-03-07 02:54:00,2022-03-07 03:18:00,OPPS_39,11.86,4,4456538,CKB +LINE_19,OPPS_39,2022-03-07 03:22:00,2022-03-07 03:44:00,S_38,11139,10,4456538,CKB +LINE_19,S_38,2022-03-07 03:54:00,2022-03-07 04:18:00,OPPS_39,11.86,4,4456538,CKB +LINE_19,OPPS_39,2022-03-07 04:22:00,2022-03-07 04:44:00,S_38,11139,0,4456538,CKB +LINE_19,S_38,2022-03-07 04:44:00,2022-03-07 04:44:00,DEPS_1,0.06,0,4456538,CKB +LINE_0,DEPS_1,2022-03-13 20:51:00,2022-03-13 20:51:00,S_0,0.06,0,4454973,CKB +LINE_0,S_0,2022-03-13 20:51:00,2022-03-13 21:24:00,S_2,14519,4,4454973,CKB +LINE_0,S_2,2022-03-13 21:28:00,2022-03-13 22:03:00,S_0,13541,8,4454973,CKB +LINE_0,S_0,2022-03-13 22:11:00,2022-03-13 22:44:00,S_2,14519,4,4454973,CKB +LINE_0,S_2,2022-03-13 22:48:00,2022-03-13 23:23:00,S_0,13541,8,4454973,CKB +LINE_0,S_0,2022-03-13 23:31:00,2022-03-14 00:04:00,S_2,14519,4,4454973,CKB +LINE_0,S_2,2022-03-14 00:08:00,2022-03-14 00:39:00,S_5,12213,0,4454973,CKB +LINE_1,S_5,2022-03-14 00:39:00,2022-03-14 00:47:00,OPPS_3,4.0,2,4454973,CKB +LINE_1,OPPS_3,2022-03-14 00:49:00,2022-03-14 01:12:00,S_4,8.36,6,4454973,CKB +LINE_1,S_4,2022-03-14 01:18:00,2022-03-14 01:36:00,OPPS_3,9067,13,4454973,CKB +LINE_1,OPPS_3,2022-03-14 01:49:00,2022-03-14 02:12:00,S_4,8.36,6,4454973,CKB +LINE_1,S_4,2022-03-14 02:18:00,2022-03-14 02:36:00,OPPS_3,9067,13,4454973,CKB +LINE_1,OPPS_3,2022-03-14 02:49:00,2022-03-14 03:12:00,S_4,8.36,6,4454973,CKB +LINE_1,S_4,2022-03-14 03:18:00,2022-03-14 03:36:00,OPPS_3,9067,13,4454973,CKB +LINE_1,OPPS_3,2022-03-14 03:49:00,2022-03-14 04:12:00,S_4,8.36,0,4454973,CKB +LINE_1,S_4,2022-03-14 04:12:00,2022-03-14 04:12:00,DEPS_1,0.06,0,4454973,CKB +LINE_0,DEPS_1,2022-03-13 21:31:00,2022-03-13 21:31:00,S_0,0.06,0,4454974,CKB +LINE_0,S_0,2022-03-13 21:31:00,2022-03-13 22:04:00,S_2,14519,4,4454974,CKB +LINE_0,S_2,2022-03-13 22:08:00,2022-03-13 22:43:00,S_0,13541,8,4454974,CKB +LINE_0,S_0,2022-03-13 22:51:00,2022-03-13 23:24:00,S_2,14519,4,4454974,CKB +LINE_0,S_2,2022-03-13 23:28:00,2022-03-14 00:03:00,S_0,13541,8,4454974,CKB +LINE_0,S_0,2022-03-14 00:11:00,2022-03-14 00:44:00,S_2,14519,0,4454974,CKB +LINE_1,S_2,2022-03-14 00:44:00,2022-03-14 00:54:00,OPPS_3,4.1,25,4454974,CKB +LINE_1,OPPS_3,2022-03-14 01:19:00,2022-03-14 01:42:00,S_4,8.36,6,4454974,CKB +LINE_1,S_4,2022-03-14 01:48:00,2022-03-14 02:06:00,OPPS_3,9067,13,4454974,CKB +LINE_1,OPPS_3,2022-03-14 02:19:00,2022-03-14 02:42:00,S_4,8.36,6,4454974,CKB +LINE_1,S_4,2022-03-14 02:48:00,2022-03-14 03:06:00,OPPS_3,9067,13,4454974,CKB +LINE_1,OPPS_3,2022-03-14 03:19:00,2022-03-14 03:42:00,S_4,8.36,6,4454974,CKB +LINE_1,S_4,2022-03-14 03:48:00,2022-03-14 04:06:00,OPPS_3,9067,0,4454974,CKB +LINE_1,OPPS_3,2022-03-14 04:06:00,2022-03-14 04:06:00,DEPS_1,0.06,0,4454974,CKB +LINE_2,DEPS_1,2022-03-13 21:06:00,2022-03-13 21:06:00,S_6,0.06,0,4664782,CKB +LINE_2,S_6,2022-03-13 21:06:00,2022-03-13 21:34:00,S_7,13018,19,4664782,CKB +LINE_2,S_7,2022-03-13 21:53:00,2022-03-13 22:13:00,S_8,10332,17,4664782,CKB +LINE_2,S_8,2022-03-13 22:30:00,2022-03-13 22:54:00,S_7,10.48,19,4664782,CKB +LINE_2,S_7,2022-03-13 23:13:00,2022-03-13 23:33:00,S_8,10332,17,4664782,CKB +LINE_2,S_8,2022-03-13 23:50:00,2022-03-14 00:14:00,S_7,10.48,2,4664782,CKB +LINE_2,S_7,2022-03-14 00:16:00,2022-03-14 00:23:00,S_9,3709,5,4664782,CKB +LINE_3,S_9,2022-03-14 00:28:00,2022-03-14 00:44:00,OPPS_10,6404,3,4664782,CKB +LINE_3,OPPS_10,2022-03-14 00:47:00,2022-03-14 01:10:00,S_11,10579,7,4664782,CKB +LINE_3,S_11,2022-03-14 01:17:00,2022-03-14 01:44:00,OPPS_10,12007,3,4664782,CKB +LINE_3,OPPS_10,2022-03-14 01:47:00,2022-03-14 02:10:00,S_11,10579,7,4664782,CKB +LINE_3,S_11,2022-03-14 02:17:00,2022-03-14 02:44:00,OPPS_10,12007,3,4664782,CKB +LINE_3,OPPS_10,2022-03-14 02:47:00,2022-03-14 03:10:00,S_11,10579,7,4664782,CKB +LINE_3,S_11,2022-03-14 03:17:00,2022-03-14 03:44:00,OPPS_10,12007,3,4664782,CKB +LINE_3,OPPS_10,2022-03-14 03:47:00,2022-03-14 04:10:00,S_11,10579,7,4664782,CKB +LINE_3,S_11,2022-03-14 04:17:00,2022-03-14 04:44:00,OPPS_10,12007,0,4664782,CKB +LINE_3,OPPS_10,2022-03-14 04:44:00,2022-03-14 04:44:00,DEPS_1,0.06,0,4664782,CKB +LINE_2,DEPS_1,2022-03-13 20:26:00,2022-03-13 20:26:00,S_6,0.06,0,4762788,CKB +LINE_2,S_6,2022-03-13 20:26:00,2022-03-13 20:56:00,S_12,14097,14,4762788,CKB +LINE_2,S_12,2022-03-13 21:10:00,2022-03-13 21:38:00,S_6,13.19,8,4762788,CKB +LINE_2,S_6,2022-03-13 21:46:00,2022-03-13 22:14:00,S_7,13018,19,4762788,CKB +LINE_2,S_7,2022-03-13 22:33:00,2022-03-13 22:53:00,S_8,10332,17,4762788,CKB +LINE_2,S_8,2022-03-13 23:10:00,2022-03-13 23:34:00,S_7,10.48,19,4762788,CKB +LINE_2,S_7,2022-03-13 23:53:00,2022-03-14 00:13:00,S_8,10332,2,4762788,CKB +LINE_2,S_8,2022-03-14 00:15:00,2022-03-14 00:16:00,OPPS_10,506,1,4762788,CKB +LINE_3,OPPS_10,2022-03-14 00:17:00,2022-03-14 00:40:00,S_11,10579,7,4762788,CKB +LINE_3,S_11,2022-03-14 00:47:00,2022-03-14 01:14:00,OPPS_10,12007,3,4762788,CKB +LINE_3,OPPS_10,2022-03-14 01:17:00,2022-03-14 01:40:00,S_11,10579,7,4762788,CKB +LINE_3,S_11,2022-03-14 01:47:00,2022-03-14 02:14:00,OPPS_10,12007,3,4762788,CKB +LINE_3,OPPS_10,2022-03-14 02:17:00,2022-03-14 02:40:00,S_11,10579,7,4762788,CKB +LINE_3,S_11,2022-03-14 02:47:00,2022-03-14 03:14:00,OPPS_10,12007,3,4762788,CKB +LINE_3,OPPS_10,2022-03-14 03:17:00,2022-03-14 03:40:00,S_11,10579,7,4762788,CKB +LINE_3,S_11,2022-03-14 03:47:00,2022-03-14 04:14:00,OPPS_10,12007,3,4762788,CKB +LINE_3,OPPS_10,2022-03-14 04:17:00,2022-03-14 04:40:00,S_11,10579,3,4762788,CKB +LINE_4,S_11,2022-03-14 04:43:00,2022-03-14 04:58:00,S_13,6161,0,4762788,CKB +LINE_4,S_13,2022-03-14 04:58:00,2022-03-14 04:58:00,DEPS_1,0.06,0,4762788,CKB +LINE_20,DEPS_1,2022-03-07 00:32:00,2022-03-07 00:32:00,S_13,0.06,0,4747688,CKB +LINE_20,S_13,2022-03-07 00:32:00,2022-03-07 00:44:00,S_40,4212,3,4747688,CKB +LINE_20,S_40,2022-03-07 00:47:00,2022-03-07 01:16:00,S_41,13048,0,4747688,CKB +LINE_20,S_41,2022-03-07 01:16:00,2022-03-07 01:42:00,S_40,12869,5,4747688,CKB +LINE_20,S_40,2022-03-07 01:47:00,2022-03-07 02:16:00,S_41,13048,0,4747688,CKB +LINE_20,S_41,2022-03-07 02:16:00,2022-03-07 02:42:00,S_40,12869,5,4747688,CKB +LINE_20,S_40,2022-03-07 02:47:00,2022-03-07 03:16:00,S_41,13048,0,4747688,CKB +LINE_20,S_41,2022-03-07 03:16:00,2022-03-07 03:42:00,S_40,12869,5,4747688,CKB +LINE_20,S_40,2022-03-07 03:47:00,2022-03-07 04:16:00,S_41,13048,0,4747688,CKB +LINE_20,S_41,2022-03-07 04:16:00,2022-03-07 04:34:00,DEPS_42,9538,0,4747688,CKB +LINE_20,DEPS_42,2022-03-07 04:34:00,2022-03-07 04:34:00,DEPS_1,0.06,0,4747688,CKB +LINE_20,DEPS_1,2022-03-07 00:17:00,2022-03-07 00:17:00,S_40,0.06,0,4747699,CKB +LINE_20,S_40,2022-03-07 00:17:00,2022-03-07 00:46:00,S_41,13048,0,4747699,CKB +LINE_20,S_41,2022-03-07 00:46:00,2022-03-07 01:12:00,S_40,12869,5,4747699,CKB +LINE_20,S_40,2022-03-07 01:17:00,2022-03-07 01:46:00,S_41,13048,0,4747699,CKB +LINE_20,S_41,2022-03-07 01:46:00,2022-03-07 02:12:00,S_40,12869,5,4747699,CKB +LINE_20,S_40,2022-03-07 02:17:00,2022-03-07 02:46:00,S_41,13048,0,4747699,CKB +LINE_20,S_41,2022-03-07 02:46:00,2022-03-07 03:12:00,S_40,12869,5,4747699,CKB +LINE_20,S_40,2022-03-07 03:17:00,2022-03-07 03:46:00,S_41,13048,0,4747699,CKB +LINE_20,S_41,2022-03-07 03:46:00,2022-03-07 04:12:00,S_40,12869,5,4747699,CKB +LINE_20,S_40,2022-03-07 04:17:00,2022-03-07 04:28:00,S_13,4316,0,4747699,CKB +LINE_20,S_13,2022-03-07 04:28:00,2022-03-07 04:28:00,DEPS_1,0.06,0,4747699,CKB +LINE_8,DEPS_1,2022-03-07 00:32:00,2022-03-07 00:32:00,S_13,0.06,0,4627068,CKB +LINE_8,S_13,2022-03-07 00:32:00,2022-03-07 00:57:00,OPPS_21,11545,6,4627068,CKB +LINE_8,OPPS_21,2022-03-07 01:03:00,2022-03-07 01:46:00,S_20,20579,1,4627068,CKB +LINE_8,S_20,2022-03-07 01:47:00,2022-03-07 02:25:00,OPPS_21,20641,8,4627068,CKB +LINE_8,OPPS_21,2022-03-07 02:33:00,2022-03-07 03:16:00,S_20,20579,1,4627068,CKB +LINE_8,S_20,2022-03-07 03:17:00,2022-03-07 03:55:00,OPPS_21,20641,8,4627068,CKB +LINE_8,OPPS_21,2022-03-07 04:03:00,2022-03-07 04:28:00,S_13,11499,0,4627068,CKB +LINE_8,S_13,2022-03-07 04:28:00,2022-03-07 04:28:00,DEPS_1,0.06,0,4627068,CKB +LINE_8,DEPS_1,2022-03-07 00:33:00,2022-03-07 00:33:00,OPPS_21,0.06,0,4627069,CKB +LINE_8,OPPS_21,2022-03-07 00:33:00,2022-03-07 01:16:00,S_20,20579,1,4627069,CKB +LINE_8,S_20,2022-03-07 01:17:00,2022-03-07 01:55:00,OPPS_21,20641,8,4627069,CKB +LINE_8,OPPS_21,2022-03-07 02:03:00,2022-03-07 02:46:00,S_20,20579,1,4627069,CKB +LINE_8,S_20,2022-03-07 02:47:00,2022-03-07 03:25:00,OPPS_21,20641,8,4627069,CKB +LINE_8,OPPS_21,2022-03-07 03:33:00,2022-03-07 04:16:00,S_20,20579,1,4627069,CKB +LINE_8,S_20,2022-03-07 04:17:00,2022-03-07 04:51:00,S_44,18752,0,4627069,CKB +LINE_8,S_44,2022-03-07 04:51:00,2022-03-07 04:51:00,DEPS_1,0.06,0,4627069,CKB +LINE_7,DEPS_1,2022-03-07 00:08:00,2022-03-07 00:08:00,S_18,0.06,0,4710317,CKB +LINE_7,S_18,2022-03-07 00:08:00,2022-03-07 00:27:00,S_19,7827,0,4710317,CKB +LINE_8,S_19,2022-03-07 00:27:00,2022-03-07 00:48:00,S_20,11079,0,4710317,CKB +LINE_8,S_20,2022-03-07 00:48:00,2022-03-07 01:25:00,OPPS_21,20641,8,4710317,CKB +LINE_8,OPPS_21,2022-03-07 01:33:00,2022-03-07 02:16:00,S_20,20579,1,4710317,CKB +LINE_8,S_20,2022-03-07 02:17:00,2022-03-07 02:55:00,OPPS_21,20641,8,4710317,CKB +LINE_8,OPPS_21,2022-03-07 03:03:00,2022-03-07 03:46:00,S_20,20579,1,4710317,CKB +LINE_8,S_20,2022-03-07 03:47:00,2022-03-07 04:25:00,OPPS_21,20641,0,4710317,CKB +LINE_8,OPPS_21,2022-03-07 04:25:00,2022-03-07 04:25:00,DEPS_1,0.06,0,4710317,CKB +LINE_23,DEPS_1,2022-03-07 00:30:00,2022-03-07 00:30:00,S_46,0.06,0,4619816,CKB +LINE_23,S_46,2022-03-07 00:30:00,2022-03-07 00:57:00,S_45,10083,7,4619816,CKB +LINE_23,S_45,2022-03-07 01:04:00,2022-03-07 01:30:00,S_46,9016,0,4619816,CKB +LINE_23,S_46,2022-03-07 01:30:00,2022-03-07 01:57:00,S_45,10083,7,4619816,CKB +LINE_23,S_45,2022-03-07 02:04:00,2022-03-07 02:30:00,S_46,9016,0,4619816,CKB +LINE_23,S_46,2022-03-07 02:30:00,2022-03-07 02:57:00,S_45,10083,7,4619816,CKB +LINE_23,S_45,2022-03-07 03:04:00,2022-03-07 03:30:00,S_46,9016,0,4619816,CKB +LINE_23,S_46,2022-03-07 03:30:00,2022-03-07 03:57:00,S_45,10083,7,4619816,CKB +LINE_23,S_45,2022-03-07 04:04:00,2022-03-07 04:30:00,S_46,9016,0,4619816,CKB +LINE_23,S_46,2022-03-07 04:30:00,2022-03-07 04:57:00,S_45,10083,0,4619816,CKB +LINE_23,S_45,2022-03-07 04:57:00,2022-03-07 04:57:00,DEPS_1,0.06,0,4619816,CKB +LINE_23,DEPS_1,2022-03-07 00:34:00,2022-03-07 00:34:00,S_45,0.06,0,4619817,CKB +LINE_23,S_45,2022-03-07 00:34:00,2022-03-07 01:00:00,S_46,9016,0,4619817,CKB +LINE_23,S_46,2022-03-07 01:00:00,2022-03-07 01:27:00,S_45,10083,7,4619817,CKB +LINE_23,S_45,2022-03-07 01:34:00,2022-03-07 02:00:00,S_46,9016,0,4619817,CKB +LINE_23,S_46,2022-03-07 02:00:00,2022-03-07 02:27:00,S_45,10083,7,4619817,CKB +LINE_23,S_45,2022-03-07 02:34:00,2022-03-07 03:00:00,S_46,9016,0,4619817,CKB +LINE_23,S_46,2022-03-07 03:00:00,2022-03-07 03:27:00,S_45,10083,7,4619817,CKB +LINE_23,S_45,2022-03-07 03:34:00,2022-03-07 04:00:00,S_46,9016,0,4619817,CKB +LINE_23,S_46,2022-03-07 04:00:00,2022-03-07 04:27:00,S_45,10083,0,4619817,CKB +LINE_23,S_45,2022-03-07 04:27:00,2022-03-07 04:27:00,DEPS_1,0.06,0,4619817,CKB +LINE_24,DEPS_1,2022-03-07 00:31:00,2022-03-07 00:31:00,OPPS_21,0.06,0,4374749,CKB +LINE_24,OPPS_21,2022-03-07 00:31:00,2022-03-07 00:44:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 00:44:00,2022-03-07 00:56:00,OPPS_21,5362,5,4374749,CKB +LINE_24,OPPS_21,2022-03-07 01:01:00,2022-03-07 01:14:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 01:14:00,2022-03-07 01:26:00,OPPS_21,5362,5,4374749,CKB +LINE_24,OPPS_21,2022-03-07 01:31:00,2022-03-07 01:44:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 01:44:00,2022-03-07 01:56:00,OPPS_21,5362,5,4374749,CKB +LINE_24,OPPS_21,2022-03-07 02:01:00,2022-03-07 02:14:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 02:14:00,2022-03-07 02:26:00,OPPS_21,5362,5,4374749,CKB +LINE_24,OPPS_21,2022-03-07 02:31:00,2022-03-07 02:44:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 02:44:00,2022-03-07 02:56:00,OPPS_21,5362,5,4374749,CKB +LINE_24,OPPS_21,2022-03-07 03:01:00,2022-03-07 03:14:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 03:14:00,2022-03-07 03:26:00,OPPS_21,5362,5,4374749,CKB +LINE_24,OPPS_21,2022-03-07 03:31:00,2022-03-07 03:44:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 03:44:00,2022-03-07 03:56:00,OPPS_21,5362,5,4374749,CKB +LINE_24,OPPS_21,2022-03-07 04:01:00,2022-03-07 04:14:00,S_47,4872,0,4374749,CKB +LINE_24,S_47,2022-03-07 04:14:00,2022-03-07 04:26:00,OPPS_21,5362,0,4374749,CKB +LINE_24,OPPS_21,2022-03-07 04:26:00,2022-03-07 04:26:00,DEPS_1,0.06,0,4374749,CKB +LINE_25,DEPS_1,2022-03-07 00:31:00,2022-03-07 00:31:00,OPPS_21,0.06,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 00:31:00,2022-03-07 00:45:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 00:47:00,2022-03-07 01:01:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 01:01:00,2022-03-07 01:15:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 01:17:00,2022-03-07 01:31:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 01:31:00,2022-03-07 01:45:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 01:47:00,2022-03-07 02:01:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 02:01:00,2022-03-07 02:15:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 02:17:00,2022-03-07 02:31:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 02:31:00,2022-03-07 02:45:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 02:47:00,2022-03-07 03:01:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 03:01:00,2022-03-07 03:15:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 03:17:00,2022-03-07 03:31:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 03:31:00,2022-03-07 03:45:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 03:47:00,2022-03-07 04:01:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 04:01:00,2022-03-07 04:15:00,S_48,5225,2,4374873,CKB +LINE_25,S_48,2022-03-07 04:17:00,2022-03-07 04:31:00,OPPS_21,7617,0,4374873,CKB +LINE_25,OPPS_21,2022-03-07 04:31:00,2022-03-07 04:31:00,DEPS_1,0.06,0,4374873,CKB +LINE_26,DEPS_1,2022-03-07 00:43:00,2022-03-07 00:43:00,S_49,0.06,0,4375018,CKB +LINE_26,S_49,2022-03-07 00:43:00,2022-03-07 00:53:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 00:53:00,2022-03-07 01:03:00,S_49,4408,10,4375018,CKB +LINE_26,S_49,2022-03-07 01:13:00,2022-03-07 01:23:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 01:23:00,2022-03-07 01:33:00,S_49,4408,10,4375018,CKB +LINE_26,S_49,2022-03-07 01:43:00,2022-03-07 01:53:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 01:53:00,2022-03-07 02:03:00,S_49,4408,10,4375018,CKB +LINE_26,S_49,2022-03-07 02:13:00,2022-03-07 02:23:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 02:23:00,2022-03-07 02:33:00,S_49,4408,10,4375018,CKB +LINE_26,S_49,2022-03-07 02:43:00,2022-03-07 02:53:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 02:53:00,2022-03-07 03:03:00,S_49,4408,10,4375018,CKB +LINE_26,S_49,2022-03-07 03:13:00,2022-03-07 03:23:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 03:23:00,2022-03-07 03:33:00,S_49,4408,10,4375018,CKB +LINE_26,S_49,2022-03-07 03:43:00,2022-03-07 03:53:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 03:53:00,2022-03-07 04:03:00,S_49,4408,10,4375018,CKB +LINE_26,S_49,2022-03-07 04:13:00,2022-03-07 04:23:00,S_50,4507,0,4375018,CKB +LINE_26,S_50,2022-03-07 04:23:00,2022-03-07 04:33:00,S_49,4408,0,4375018,CKB +LINE_26,S_49,2022-03-07 04:33:00,2022-03-07 04:33:00,DEPS_1,0.06,0,4375018,CKB +LINE_27,DEPS_1,2022-03-13 15:46:00,2022-03-13 15:46:00,S_14,0.06,0,4458713,CKB +LINE_27,S_14,2022-03-13 15:46:00,2022-03-13 15:53:00,S_51,3147,12,4458713,CKB +LINE_27,S_51,2022-03-13 16:05:00,2022-03-13 16:15:00,S_14,3469,0,4458713,CKB +LINE_27,S_14,2022-03-13 16:15:00,2022-03-13 16:23:00,S_51,3351,12,4458713,CKB +LINE_27,S_51,2022-03-13 16:35:00,2022-03-13 16:45:00,S_14,3469,0,4458713,CKB +LINE_27,S_14,2022-03-13 16:45:00,2022-03-13 16:53:00,S_51,3351,12,4458713,CKB +LINE_27,S_51,2022-03-13 17:05:00,2022-03-13 17:15:00,S_14,3469,0,4458713,CKB +LINE_27,S_14,2022-03-13 17:15:00,2022-03-13 17:23:00,S_51,3351,12,4458713,CKB +LINE_27,S_51,2022-03-13 17:35:00,2022-03-13 17:45:00,S_14,3469,0,4458713,CKB +LINE_27,S_14,2022-03-13 17:45:00,2022-03-13 17:53:00,S_51,3351,12,4458713,CKB +LINE_27,S_51,2022-03-13 18:05:00,2022-03-13 18:15:00,S_14,3469,0,4458713,CKB +LINE_27,S_14,2022-03-13 18:15:00,2022-03-13 18:23:00,S_51,3351,0,4458713,CKB +LINE_28,S_51,2022-03-13 18:23:00,2022-03-13 18:29:00,S_14,3.1,22,4458713,CKB +LINE_28,S_14,2022-03-13 18:51:00,2022-03-13 19:02:00,S_52,4338,0,4458713,CKB +LINE_28,S_52,2022-03-13 19:02:00,2022-03-13 19:13:00,S_14,4427,12,4458713,CKB +LINE_5,S_14,2022-03-13 19:25:00,2022-03-13 19:38:00,S_15,6086,3,4458713,CKB +LINE_5,S_15,2022-03-13 19:41:00,2022-03-13 19:55:00,S_14,6232,0,4458713,CKB +LINE_5,S_14,2022-03-13 19:55:00,2022-03-13 20:08:00,S_15,6086,3,4458713,CKB +LINE_5,S_15,2022-03-13 20:11:00,2022-03-13 20:25:00,S_14,6232,6,4458713,CKB +LINE_28,S_14,2022-03-13 20:31:00,2022-03-13 20:42:00,S_52,4338,0,4458713,CKB +LINE_28,S_52,2022-03-13 20:42:00,2022-03-13 20:53:00,S_14,4427,18,4458713,CKB +LINE_28,S_14,2022-03-13 21:11:00,2022-03-13 21:22:00,S_52,4338,0,4458713,CKB +LINE_28,S_52,2022-03-13 21:22:00,2022-03-13 21:33:00,S_14,4427,18,4458713,CKB +LINE_28,S_14,2022-03-13 21:51:00,2022-03-13 22:02:00,S_52,4338,0,4458713,CKB +LINE_28,S_52,2022-03-13 22:02:00,2022-03-13 22:13:00,S_14,4427,18,4458713,CKB +LINE_28,S_14,2022-03-13 22:31:00,2022-03-13 22:42:00,S_52,4338,0,4458713,CKB +LINE_28,S_52,2022-03-13 22:42:00,2022-03-13 22:53:00,S_14,4427,2,4458713,CKB +LINE_5,S_14,2022-03-13 22:55:00,2022-03-13 23:08:00,S_15,6086,3,4458713,CKB +LINE_5,S_15,2022-03-13 23:11:00,2022-03-13 23:25:00,S_14,6232,0,4458713,CKB +LINE_5,S_14,2022-03-13 23:25:00,2022-03-13 23:38:00,S_15,6086,3,4458713,CKB +LINE_5,S_15,2022-03-13 23:41:00,2022-03-13 23:55:00,S_14,6232,0,4458713,CKB +LINE_5,S_14,2022-03-13 23:55:00,2022-03-14 00:08:00,S_15,6086,0,4458713,CKB +LINE_5,S_15,2022-03-14 00:08:00,2022-03-14 00:08:00,DEPS_1,0.06,0,4458713,CKB +LINE_6,DEPS_1,2022-03-13 07:05:00,2022-03-13 07:05:00,S_16,0.06,0,4426903,CKB +LINE_6,S_16,2022-03-13 07:05:00,2022-03-13 07:14:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 07:14:00,2022-03-13 07:23:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 07:25:00,2022-03-13 07:34:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 07:34:00,2022-03-13 07:43:00,S_16,5139,22,4426903,CKB +LINE_6,S_16,2022-03-13 08:05:00,2022-03-13 08:14:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 08:14:00,2022-03-13 08:23:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 08:25:00,2022-03-13 08:34:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 08:34:00,2022-03-13 08:43:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 08:45:00,2022-03-13 08:54:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 08:54:00,2022-03-13 09:03:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 09:05:00,2022-03-13 09:14:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 09:14:00,2022-03-13 09:23:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 09:25:00,2022-03-13 09:34:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 09:34:00,2022-03-13 09:43:00,S_16,5139,23,4426903,CKB +LINE_6,S_16,2022-03-13 10:06:00,2022-03-13 10:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 10:15:00,2022-03-13 10:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 10:26:00,2022-03-13 10:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 10:35:00,2022-03-13 10:44:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 10:46:00,2022-03-13 10:55:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 10:55:00,2022-03-13 11:04:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 11:06:00,2022-03-13 11:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 11:15:00,2022-03-13 11:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 11:26:00,2022-03-13 11:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 11:35:00,2022-03-13 11:44:00,S_16,5139,22,4426903,CKB +LINE_6,S_16,2022-03-13 12:06:00,2022-03-13 12:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 12:15:00,2022-03-13 12:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 12:26:00,2022-03-13 12:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 12:35:00,2022-03-13 12:44:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 12:46:00,2022-03-13 12:55:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 12:55:00,2022-03-13 13:04:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 13:06:00,2022-03-13 13:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 13:15:00,2022-03-13 13:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 13:26:00,2022-03-13 13:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 13:35:00,2022-03-13 13:44:00,S_16,5139,22,4426903,CKB +LINE_6,S_16,2022-03-13 14:06:00,2022-03-13 14:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 14:15:00,2022-03-13 14:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 14:26:00,2022-03-13 14:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 14:35:00,2022-03-13 14:44:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 14:46:00,2022-03-13 14:55:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 14:55:00,2022-03-13 15:04:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 15:06:00,2022-03-13 15:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 15:15:00,2022-03-13 15:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 15:26:00,2022-03-13 15:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 15:35:00,2022-03-13 15:44:00,S_16,5139,22,4426903,CKB +LINE_6,S_16,2022-03-13 16:06:00,2022-03-13 16:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 16:15:00,2022-03-13 16:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 16:26:00,2022-03-13 16:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 16:35:00,2022-03-13 16:44:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 16:46:00,2022-03-13 16:55:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 16:55:00,2022-03-13 17:04:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 17:06:00,2022-03-13 17:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 17:15:00,2022-03-13 17:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 17:26:00,2022-03-13 17:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 17:35:00,2022-03-13 17:44:00,S_16,5139,22,4426903,CKB +LINE_6,S_16,2022-03-13 18:06:00,2022-03-13 18:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 18:15:00,2022-03-13 18:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 18:26:00,2022-03-13 18:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 18:35:00,2022-03-13 18:44:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 18:46:00,2022-03-13 18:55:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 18:55:00,2022-03-13 19:04:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 19:06:00,2022-03-13 19:15:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 19:15:00,2022-03-13 19:24:00,S_16,5139,2,4426903,CKB +LINE_6,S_16,2022-03-13 19:26:00,2022-03-13 19:35:00,S_17,4781,0,4426903,CKB +LINE_6,S_17,2022-03-13 19:35:00,2022-03-13 19:44:00,S_16,5139,21,4426903,CKB +LINE_6,S_16,2022-03-13 20:05:00,2022-03-13 20:14:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 20:15:00,2022-03-13 20:24:00,S_16,5139,1,4426903,CKB +LINE_6,S_16,2022-03-13 20:25:00,2022-03-13 20:34:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 20:35:00,2022-03-13 20:44:00,S_16,5139,1,4426903,CKB +LINE_6,S_16,2022-03-13 20:45:00,2022-03-13 20:54:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 20:55:00,2022-03-13 21:04:00,S_16,5139,1,4426903,CKB +LINE_6,S_16,2022-03-13 21:05:00,2022-03-13 21:14:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 21:15:00,2022-03-13 21:24:00,S_16,5139,1,4426903,CKB +LINE_6,S_16,2022-03-13 21:25:00,2022-03-13 21:34:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 21:35:00,2022-03-13 21:44:00,S_16,5139,21,4426903,CKB +LINE_6,S_16,2022-03-13 22:05:00,2022-03-13 22:14:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 22:15:00,2022-03-13 22:24:00,S_16,5139,1,4426903,CKB +LINE_6,S_16,2022-03-13 22:25:00,2022-03-13 22:34:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 22:35:00,2022-03-13 22:44:00,S_16,5139,1,4426903,CKB +LINE_6,S_16,2022-03-13 22:45:00,2022-03-13 22:54:00,S_17,4781,1,4426903,CKB +LINE_6,S_17,2022-03-13 22:55:00,2022-03-13 23:04:00,S_16,5139,0,4426903,CKB +LINE_6,S_16,2022-03-13 23:04:00,2022-03-13 23:04:00,DEPS_1,0.06,0,4426903,CKB +LINE_29,DEPS_1,2022-03-13 07:30:00,2022-03-13 07:30:00,S_53,0.06,0,4369706,CKB +LINE_29,S_53,2022-03-13 07:30:00,2022-03-13 07:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 07:39:00,2022-03-13 07:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 07:50:00,2022-03-13 07:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 07:59:00,2022-03-13 08:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 08:10:00,2022-03-13 08:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 08:19:00,2022-03-13 08:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 08:30:00,2022-03-13 08:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 08:39:00,2022-03-13 08:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 08:50:00,2022-03-13 08:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 08:59:00,2022-03-13 09:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 09:10:00,2022-03-13 09:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 09:19:00,2022-03-13 09:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 09:30:00,2022-03-13 09:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 09:39:00,2022-03-13 09:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 09:50:00,2022-03-13 09:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 09:59:00,2022-03-13 10:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 10:10:00,2022-03-13 10:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 10:19:00,2022-03-13 10:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 10:30:00,2022-03-13 10:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 10:39:00,2022-03-13 10:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 10:50:00,2022-03-13 10:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 10:59:00,2022-03-13 11:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 11:10:00,2022-03-13 11:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 11:19:00,2022-03-13 11:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 11:30:00,2022-03-13 11:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 11:39:00,2022-03-13 11:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 11:50:00,2022-03-13 11:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 11:59:00,2022-03-13 12:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 12:10:00,2022-03-13 12:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 12:19:00,2022-03-13 12:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 12:30:00,2022-03-13 12:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 12:39:00,2022-03-13 12:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 12:50:00,2022-03-13 12:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 12:59:00,2022-03-13 13:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 13:10:00,2022-03-13 13:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 13:19:00,2022-03-13 13:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 13:30:00,2022-03-13 13:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 13:39:00,2022-03-13 13:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 13:50:00,2022-03-13 13:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 13:59:00,2022-03-13 14:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 14:10:00,2022-03-13 14:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 14:19:00,2022-03-13 14:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 14:30:00,2022-03-13 14:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 14:39:00,2022-03-13 14:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 14:50:00,2022-03-13 14:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 14:59:00,2022-03-13 15:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 15:10:00,2022-03-13 15:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 15:19:00,2022-03-13 15:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 15:30:00,2022-03-13 15:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 15:39:00,2022-03-13 15:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 15:50:00,2022-03-13 15:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 15:59:00,2022-03-13 16:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 16:10:00,2022-03-13 16:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 16:19:00,2022-03-13 16:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 16:30:00,2022-03-13 16:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 16:39:00,2022-03-13 16:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 16:50:00,2022-03-13 16:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 16:59:00,2022-03-13 17:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 17:10:00,2022-03-13 17:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 17:19:00,2022-03-13 17:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 17:30:00,2022-03-13 17:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 17:39:00,2022-03-13 17:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 17:50:00,2022-03-13 17:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 17:59:00,2022-03-13 18:10:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 18:10:00,2022-03-13 18:15:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 18:19:00,2022-03-13 18:30:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 18:30:00,2022-03-13 18:35:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 18:39:00,2022-03-13 18:50:00,S_53,4341,0,4369706,CKB +LINE_29,S_53,2022-03-13 18:50:00,2022-03-13 18:55:00,S_54,2217,4,4369706,CKB +LINE_29,S_54,2022-03-13 18:59:00,2022-03-13 19:10:00,S_53,4288,0,4369706,CKB +LINE_29,S_53,2022-03-13 19:10:00,2022-03-13 19:10:00,DEPS_1,0.06,0,4369706,CKB +LINE_10,DEPS_1,2022-03-13 07:56:00,2022-03-13 07:56:00,S_24,0.06,0,4419537,CKB +LINE_10,S_24,2022-03-13 07:56:00,2022-03-13 07:56:00,S_24,0.0,792,4419537,CKB +LINE_10,S_24,2022-03-13 21:08:00,2022-03-13 21:08:00,S_24,0.0,0,4419537,CKB +LINE_10,S_24,2022-03-13 21:08:00,2022-03-13 21:08:00,DEPS_1,0.06,0,4419537,CKB +LINE_30,DEPS_1,2022-03-13 07:18:00,2022-03-13 07:18:00,S_55,0.06,0,4688586,CKB +LINE_30,S_55,2022-03-13 07:18:00,2022-03-13 07:26:00,S_56,5562,10,4688586,CKB +LINE_30,S_56,2022-03-13 07:36:00,2022-03-13 07:45:00,S_57,5941,32,4688586,CKB +LINE_30,S_57,2022-03-13 08:17:00,2022-03-13 08:26:00,S_56,5994,10,4688586,CKB +LINE_30,S_56,2022-03-13 08:36:00,2022-03-13 08:45:00,S_57,5941,32,4688586,CKB +LINE_30,S_57,2022-03-13 09:17:00,2022-03-13 09:26:00,S_56,5994,8,4688586,CKB +LINE_30,S_56,2022-03-13 09:34:00,2022-03-13 09:43:00,S_57,5941,36,4688586,CKB +LINE_30,S_57,2022-03-13 10:19:00,2022-03-13 10:30:00,S_56,5994,2,4688586,CKB +LINE_30,S_56,2022-03-13 10:32:00,2022-03-13 10:41:00,S_55,5566,0,4688586,CKB +LINE_30,S_55,2022-03-13 10:41:00,2022-03-13 10:41:00,DEPS_1,0.06,0,4688586,CKB +LINE_0,DEPS_1,2022-03-08 21:31:00,2022-03-08 21:31:00,S_0,0.06,0,4454944,CKB +LINE_0,S_0,2022-03-08 21:31:00,2022-03-08 22:04:00,S_2,14519,4,4454944,CKB +LINE_0,S_2,2022-03-08 22:08:00,2022-03-08 22:43:00,S_0,13541,8,4454944,CKB +LINE_0,S_0,2022-03-08 22:51:00,2022-03-08 23:24:00,S_2,14519,4,4454944,CKB +LINE_0,S_2,2022-03-08 23:28:00,2022-03-09 00:03:00,S_0,13541,8,4454944,CKB +LINE_0,S_0,2022-03-09 00:11:00,2022-03-09 00:44:00,S_2,14519,0,4454944,CKB +LINE_1,S_2,2022-03-09 00:44:00,2022-03-09 00:54:00,OPPS_3,4.1,25,4454944,CKB +LINE_1,OPPS_3,2022-03-09 01:19:00,2022-03-09 01:42:00,S_4,8.36,6,4454944,CKB +LINE_1,S_4,2022-03-09 01:48:00,2022-03-09 02:06:00,OPPS_3,9067,13,4454944,CKB +LINE_1,OPPS_3,2022-03-09 02:19:00,2022-03-09 02:42:00,S_4,8.36,6,4454944,CKB +LINE_1,S_4,2022-03-09 02:48:00,2022-03-09 03:06:00,OPPS_3,9067,13,4454944,CKB +LINE_1,OPPS_3,2022-03-09 03:19:00,2022-03-09 03:42:00,S_4,8.36,6,4454944,CKB +LINE_1,S_4,2022-03-09 03:48:00,2022-03-09 04:06:00,OPPS_3,9067,0,4454944,CKB +LINE_1,OPPS_3,2022-03-09 04:06:00,2022-03-09 04:06:00,DEPS_1,0.06,0,4454944,CKB +LINE_0,DEPS_1,2022-03-08 22:11:00,2022-03-08 22:11:00,S_0,0.06,0,4454949,CKB +LINE_0,S_0,2022-03-08 22:11:00,2022-03-08 22:44:00,S_2,14519,4,4454949,CKB +LINE_0,S_2,2022-03-08 22:48:00,2022-03-08 23:23:00,S_0,13541,8,4454949,CKB +LINE_0,S_0,2022-03-08 23:31:00,2022-03-09 00:04:00,S_2,14519,4,4454949,CKB +LINE_0,S_2,2022-03-09 00:08:00,2022-03-09 00:39:00,S_5,12213,0,4454949,CKB +LINE_1,S_5,2022-03-09 00:39:00,2022-03-09 00:47:00,OPPS_3,4.0,2,4454949,CKB +LINE_1,OPPS_3,2022-03-09 00:49:00,2022-03-09 01:12:00,S_4,8.36,6,4454949,CKB +LINE_1,S_4,2022-03-09 01:18:00,2022-03-09 01:36:00,OPPS_3,9067,13,4454949,CKB +LINE_1,OPPS_3,2022-03-09 01:49:00,2022-03-09 02:12:00,S_4,8.36,6,4454949,CKB +LINE_1,S_4,2022-03-09 02:18:00,2022-03-09 02:36:00,OPPS_3,9067,13,4454949,CKB +LINE_1,OPPS_3,2022-03-09 02:49:00,2022-03-09 03:12:00,S_4,8.36,6,4454949,CKB +LINE_1,S_4,2022-03-09 03:18:00,2022-03-09 03:36:00,OPPS_3,9067,13,4454949,CKB +LINE_1,OPPS_3,2022-03-09 03:49:00,2022-03-09 04:12:00,S_4,8.36,0,4454949,CKB +LINE_1,S_4,2022-03-09 04:12:00,2022-03-09 04:12:00,DEPS_1,0.06,0,4454949,CKB +LINE_2,DEPS_1,2022-03-08 21:06:00,2022-03-08 21:06:00,S_6,0.06,0,4664623,CKB +LINE_2,S_6,2022-03-08 21:06:00,2022-03-08 21:34:00,S_7,13018,19,4664623,CKB +LINE_2,S_7,2022-03-08 21:53:00,2022-03-08 22:13:00,S_8,10332,17,4664623,CKB +LINE_2,S_8,2022-03-08 22:30:00,2022-03-08 22:54:00,S_7,10.48,19,4664623,CKB +LINE_2,S_7,2022-03-08 23:13:00,2022-03-08 23:33:00,S_8,10332,17,4664623,CKB +LINE_2,S_8,2022-03-08 23:50:00,2022-03-09 00:14:00,S_7,10.48,2,4664623,CKB +LINE_2,S_7,2022-03-09 00:16:00,2022-03-09 00:23:00,S_9,3709,5,4664623,CKB +LINE_3,S_9,2022-03-09 00:28:00,2022-03-09 00:44:00,OPPS_10,6404,3,4664623,CKB +LINE_3,OPPS_10,2022-03-09 00:47:00,2022-03-09 01:10:00,S_11,10579,7,4664623,CKB +LINE_3,S_11,2022-03-09 01:17:00,2022-03-09 01:44:00,OPPS_10,12007,3,4664623,CKB +LINE_3,OPPS_10,2022-03-09 01:47:00,2022-03-09 02:10:00,S_11,10579,7,4664623,CKB +LINE_3,S_11,2022-03-09 02:17:00,2022-03-09 02:44:00,OPPS_10,12007,3,4664623,CKB +LINE_3,OPPS_10,2022-03-09 02:47:00,2022-03-09 03:10:00,S_11,10579,7,4664623,CKB +LINE_3,S_11,2022-03-09 03:17:00,2022-03-09 03:44:00,OPPS_10,12007,3,4664623,CKB +LINE_3,OPPS_10,2022-03-09 03:47:00,2022-03-09 04:10:00,S_11,10579,7,4664623,CKB +LINE_3,S_11,2022-03-09 04:17:00,2022-03-09 04:44:00,OPPS_10,12007,0,4664623,CKB +LINE_3,OPPS_10,2022-03-09 04:44:00,2022-03-09 04:44:00,DEPS_1,0.06,0,4664623,CKB +LINE_2,DEPS_1,2022-03-08 20:26:00,2022-03-08 20:26:00,S_6,0.06,0,4762733,CKB +LINE_2,S_6,2022-03-08 20:26:00,2022-03-08 20:56:00,S_12,14097,14,4762733,CKB +LINE_2,S_12,2022-03-08 21:10:00,2022-03-08 21:38:00,S_6,13.19,8,4762733,CKB +LINE_2,S_6,2022-03-08 21:46:00,2022-03-08 22:14:00,S_7,13018,19,4762733,CKB +LINE_2,S_7,2022-03-08 22:33:00,2022-03-08 22:53:00,S_8,10332,17,4762733,CKB +LINE_2,S_8,2022-03-08 23:10:00,2022-03-08 23:34:00,S_7,10.48,19,4762733,CKB +LINE_2,S_7,2022-03-08 23:53:00,2022-03-09 00:13:00,S_8,10332,2,4762733,CKB +LINE_2,S_8,2022-03-09 00:15:00,2022-03-09 00:16:00,OPPS_10,506,1,4762733,CKB +LINE_3,OPPS_10,2022-03-09 00:17:00,2022-03-09 00:40:00,S_11,10579,7,4762733,CKB +LINE_3,S_11,2022-03-09 00:47:00,2022-03-09 01:14:00,OPPS_10,12007,3,4762733,CKB +LINE_3,OPPS_10,2022-03-09 01:17:00,2022-03-09 01:40:00,S_11,10579,7,4762733,CKB +LINE_3,S_11,2022-03-09 01:47:00,2022-03-09 02:14:00,OPPS_10,12007,3,4762733,CKB +LINE_3,OPPS_10,2022-03-09 02:17:00,2022-03-09 02:40:00,S_11,10579,7,4762733,CKB +LINE_3,S_11,2022-03-09 02:47:00,2022-03-09 03:14:00,OPPS_10,12007,3,4762733,CKB +LINE_3,OPPS_10,2022-03-09 03:17:00,2022-03-09 03:40:00,S_11,10579,7,4762733,CKB +LINE_3,S_11,2022-03-09 03:47:00,2022-03-09 04:14:00,OPPS_10,12007,3,4762733,CKB +LINE_3,OPPS_10,2022-03-09 04:17:00,2022-03-09 04:40:00,S_11,10579,3,4762733,CKB +LINE_4,S_11,2022-03-09 04:43:00,2022-03-09 04:58:00,S_13,6161,0,4762733,CKB +LINE_4,S_13,2022-03-09 04:58:00,2022-03-09 04:58:00,DEPS_1,0.06,0,4762733,CKB +LINE_5,DEPS_1,2022-03-08 22:56:00,2022-03-08 22:56:00,S_14,0.06,0,4617408,CKB +LINE_5,S_14,2022-03-08 22:56:00,2022-03-08 23:08:00,S_15,5882,3,4617408,CKB +LINE_5,S_15,2022-03-08 23:11:00,2022-03-08 23:25:00,S_14,6232,0,4617408,CKB +LINE_5,S_14,2022-03-08 23:25:00,2022-03-08 23:38:00,S_15,6086,3,4617408,CKB +LINE_5,S_15,2022-03-08 23:41:00,2022-03-08 23:55:00,S_14,6232,0,4617408,CKB +LINE_5,S_14,2022-03-08 23:55:00,2022-03-09 00:08:00,S_15,6086,0,4617408,CKB +LINE_5,S_15,2022-03-09 00:08:00,2022-03-09 00:08:00,DEPS_1,0.06,0,4617408,CKB +LINE_6,DEPS_1,2022-03-08 05:05:00,2022-03-08 05:05:00,S_16,0.06,0,4426845,CKB +LINE_6,S_16,2022-03-08 05:05:00,2022-03-08 05:14:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 05:14:00,2022-03-08 05:23:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 05:25:00,2022-03-08 05:34:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 05:34:00,2022-03-08 05:43:00,S_16,5139,23,4426845,CKB +LINE_6,S_16,2022-03-08 06:06:00,2022-03-08 06:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 06:15:00,2022-03-08 06:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 06:26:00,2022-03-08 06:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 06:35:00,2022-03-08 06:44:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 06:46:00,2022-03-08 06:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 06:55:00,2022-03-08 07:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 07:06:00,2022-03-08 07:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 07:15:00,2022-03-08 07:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 07:26:00,2022-03-08 07:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 07:35:00,2022-03-08 07:44:00,S_16,5139,22,4426845,CKB +LINE_6,S_16,2022-03-08 08:06:00,2022-03-08 08:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 08:15:00,2022-03-08 08:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 08:26:00,2022-03-08 08:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 08:35:00,2022-03-08 08:44:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 08:46:00,2022-03-08 08:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 08:55:00,2022-03-08 09:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 09:06:00,2022-03-08 09:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 09:15:00,2022-03-08 09:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 09:26:00,2022-03-08 09:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 09:35:00,2022-03-08 09:44:00,S_16,5139,22,4426845,CKB +LINE_6,S_16,2022-03-08 10:06:00,2022-03-08 10:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 10:15:00,2022-03-08 10:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 10:26:00,2022-03-08 10:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 10:35:00,2022-03-08 10:44:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 10:46:00,2022-03-08 10:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 10:55:00,2022-03-08 11:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 11:06:00,2022-03-08 11:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 11:15:00,2022-03-08 11:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 11:26:00,2022-03-08 11:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 11:35:00,2022-03-08 11:44:00,S_16,5139,22,4426845,CKB +LINE_6,S_16,2022-03-08 12:06:00,2022-03-08 12:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 12:15:00,2022-03-08 12:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 12:26:00,2022-03-08 12:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 12:35:00,2022-03-08 12:44:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 12:46:00,2022-03-08 12:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 12:55:00,2022-03-08 13:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 13:06:00,2022-03-08 13:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 13:15:00,2022-03-08 13:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 13:26:00,2022-03-08 13:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 13:35:00,2022-03-08 13:44:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 13:46:00,2022-03-08 13:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 13:55:00,2022-03-08 14:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 14:06:00,2022-03-08 14:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 14:15:00,2022-03-08 14:24:00,S_16,5139,22,4426845,CKB +LINE_6,S_16,2022-03-08 14:46:00,2022-03-08 14:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 14:55:00,2022-03-08 15:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 15:06:00,2022-03-08 15:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 15:15:00,2022-03-08 15:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 15:26:00,2022-03-08 15:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 15:35:00,2022-03-08 15:44:00,S_16,5139,22,4426845,CKB +LINE_6,S_16,2022-03-08 16:06:00,2022-03-08 16:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 16:15:00,2022-03-08 16:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 16:26:00,2022-03-08 16:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 16:35:00,2022-03-08 16:44:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 16:46:00,2022-03-08 16:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 16:55:00,2022-03-08 17:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 17:06:00,2022-03-08 17:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 17:15:00,2022-03-08 17:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 17:26:00,2022-03-08 17:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 17:35:00,2022-03-08 17:44:00,S_16,5139,22,4426845,CKB +LINE_6,S_16,2022-03-08 18:06:00,2022-03-08 18:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 18:15:00,2022-03-08 18:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 18:26:00,2022-03-08 18:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 18:35:00,2022-03-08 18:44:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 18:46:00,2022-03-08 18:55:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 18:55:00,2022-03-08 19:04:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 19:06:00,2022-03-08 19:15:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 19:15:00,2022-03-08 19:24:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 19:26:00,2022-03-08 19:35:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 19:35:00,2022-03-08 19:44:00,S_16,5139,21,4426845,CKB +LINE_6,S_16,2022-03-08 20:05:00,2022-03-08 20:14:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 20:14:00,2022-03-08 20:23:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 20:25:00,2022-03-08 20:34:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 20:34:00,2022-03-08 20:43:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 20:45:00,2022-03-08 20:54:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 20:54:00,2022-03-08 21:03:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 21:05:00,2022-03-08 21:14:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 21:14:00,2022-03-08 21:23:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 21:25:00,2022-03-08 21:34:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 21:34:00,2022-03-08 21:43:00,S_16,5139,22,4426845,CKB +LINE_6,S_16,2022-03-08 22:05:00,2022-03-08 22:14:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 22:14:00,2022-03-08 22:23:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 22:25:00,2022-03-08 22:34:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 22:34:00,2022-03-08 22:43:00,S_16,5139,2,4426845,CKB +LINE_6,S_16,2022-03-08 22:45:00,2022-03-08 22:54:00,S_17,4781,0,4426845,CKB +LINE_6,S_17,2022-03-08 22:54:00,2022-03-08 23:03:00,S_16,5139,0,4426845,CKB +LINE_6,S_16,2022-03-08 23:03:00,2022-03-08 23:03:00,DEPS_1,0.06,0,4426845,CKB +LINE_7,DEPS_1,2022-03-09 00:06:00,2022-03-09 00:06:00,S_18,0.06,0,4708595,CKB +LINE_7,S_18,2022-03-09 00:06:00,2022-03-09 00:27:00,S_19,7827,0,4708595,CKB +LINE_8,S_19,2022-03-09 00:27:00,2022-03-09 00:48:00,S_20,11079,0,4708595,CKB +LINE_8,S_20,2022-03-09 00:48:00,2022-03-09 01:25:00,OPPS_21,20641,8,4708595,CKB +LINE_8,OPPS_21,2022-03-09 01:33:00,2022-03-09 02:16:00,S_20,20579,1,4708595,CKB +LINE_8,S_20,2022-03-09 02:17:00,2022-03-09 02:55:00,OPPS_21,20641,8,4708595,CKB +LINE_8,OPPS_21,2022-03-09 03:03:00,2022-03-09 03:46:00,S_20,20579,1,4708595,CKB +LINE_8,S_20,2022-03-09 03:47:00,2022-03-09 04:25:00,OPPS_21,20641,0,4708595,CKB +LINE_8,OPPS_21,2022-03-09 04:25:00,2022-03-09 04:25:00,DEPS_1,0.06,0,4708595,CKB +LINE_9,DEPS_23,2022-03-08 05:15:00,2022-03-08 06:01:00,S_22,17.9,0,4317625,VDL +LINE_9,S_22,2022-03-08 06:01:00,2022-03-08 06:15:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 06:23:00,2022-03-08 06:37:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 06:41:00,2022-03-08 06:55:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 07:03:00,2022-03-08 07:17:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 07:21:00,2022-03-08 07:35:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 07:43:00,2022-03-08 07:57:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 08:01:00,2022-03-08 08:15:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 08:23:00,2022-03-08 08:37:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 08:41:00,2022-03-08 08:55:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 09:03:00,2022-03-08 09:17:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 09:21:00,2022-03-08 09:35:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 09:43:00,2022-03-08 09:57:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 10:01:00,2022-03-08 10:15:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 10:23:00,2022-03-08 10:37:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 10:41:00,2022-03-08 10:55:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 11:03:00,2022-03-08 11:17:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 11:21:00,2022-03-08 11:35:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 11:43:00,2022-03-08 11:57:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 12:01:00,2022-03-08 12:15:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 12:23:00,2022-03-08 12:37:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 12:41:00,2022-03-08 12:55:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 13:03:00,2022-03-08 13:17:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 13:21:00,2022-03-08 13:35:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 13:43:00,2022-03-08 13:57:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 14:01:00,2022-03-08 14:15:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 14:23:00,2022-03-08 14:37:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 14:41:00,2022-03-08 14:55:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 15:03:00,2022-03-08 15:17:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 15:21:00,2022-03-08 15:35:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 15:43:00,2022-03-08 15:57:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 16:01:00,2022-03-08 16:15:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 16:23:00,2022-03-08 16:37:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 16:41:00,2022-03-08 16:55:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 17:03:00,2022-03-08 17:17:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 17:21:00,2022-03-08 17:35:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 17:43:00,2022-03-08 17:57:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 18:01:00,2022-03-08 18:15:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 18:23:00,2022-03-08 18:37:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 18:41:00,2022-03-08 18:55:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 19:03:00,2022-03-08 19:17:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 19:21:00,2022-03-08 19:35:00,S_22,4637,8,4317625,VDL +LINE_9,S_22,2022-03-08 19:43:00,2022-03-08 19:57:00,S_22,4637,4,4317625,VDL +LINE_9,S_22,2022-03-08 20:01:00,2022-03-08 20:14:00,S_22,4637,9,4317625,VDL +LINE_9,S_22,2022-03-08 20:23:00,2022-03-08 20:36:00,S_22,4637,0,4317625,VDL +LINE_9,S_22,2022-03-08 20:36:00,2022-03-08 21:15:00,DEPS_23,19.8,0,4317625,VDL +LINE_10,DEPS_1,2022-03-08 04:56:00,2022-03-08 04:56:00,S_24,0.06,18,4425668,CKB +LINE_10,S_24,2022-03-08 05:14:00,2022-03-08 05:20:00,S_25,3.29,0,4425668,CKB +LINE_10,S_25,2022-03-08 05:20:00,2022-03-08 05:24:00,S_24,2954,20,4425668,CKB +LINE_10,S_24,2022-03-08 05:44:00,2022-03-08 05:50:00,S_25,3.29,0,4425668,CKB +LINE_10,S_25,2022-03-08 05:50:00,2022-03-08 05:54:00,S_24,2954,5,4425668,CKB +LINE_10,S_24,2022-03-08 05:59:00,2022-03-08 06:06:00,S_25,3.29,2,4425668,CKB +LINE_10,S_25,2022-03-08 06:08:00,2022-03-08 06:13:00,S_24,2954,19,4425668,CKB +LINE_10,S_24,2022-03-08 06:32:00,2022-03-08 06:39:00,S_25,3.29,1,4425668,CKB +LINE_10,S_25,2022-03-08 06:40:00,2022-03-08 06:45:00,S_24,2954,7,4425668,CKB +LINE_10,S_24,2022-03-08 06:52:00,2022-03-08 06:59:00,S_25,3.29,1,4425668,CKB +LINE_10,S_25,2022-03-08 07:00:00,2022-03-08 07:05:00,S_24,2954,7,4425668,CKB +LINE_10,S_24,2022-03-08 07:12:00,2022-03-08 07:19:00,S_25,3.29,1,4425668,CKB +LINE_10,S_25,2022-03-08 07:20:00,2022-03-08 07:25:00,S_24,2954,7,4425668,CKB +LINE_10,S_24,2022-03-08 07:32:00,2022-03-08 07:39:00,S_25,3.29,1,4425668,CKB +LINE_10,S_25,2022-03-08 07:40:00,2022-03-08 07:45:00,S_24,2954,295,4425668,CKB +LINE_10,S_24,2022-03-08 12:40:00,2022-03-08 12:47:00,S_25,3.29,2,4425668,CKB +LINE_10,S_25,2022-03-08 12:49:00,2022-03-08 12:54:00,S_24,2954,46,4425668,CKB +LINE_10,S_24,2022-03-08 13:40:00,2022-03-08 13:47:00,S_25,3.29,2,4425668,CKB +LINE_10,S_25,2022-03-08 13:49:00,2022-03-08 13:54:00,S_24,2954,434,4425668,CKB +LINE_10,S_24,2022-03-08 21:08:00,2022-03-08 21:08:00,DEPS_1,0.06,0,4425668,CKB +LINE_11,DEPS_1,2022-03-08 07:20:00,2022-03-08 07:20:00,OPPS_26,0.06,0,4448150,CKB +LINE_11,OPPS_26,2022-03-08 07:20:00,2022-03-08 07:50:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 08:00:00,2022-03-08 08:30:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 08:40:00,2022-03-08 09:10:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 09:20:00,2022-03-08 09:50:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 10:00:00,2022-03-08 10:30:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 10:40:00,2022-03-08 11:10:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 11:20:00,2022-03-08 11:50:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 12:00:00,2022-03-08 12:30:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 12:40:00,2022-03-08 13:10:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 13:20:00,2022-03-08 13:50:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 14:00:00,2022-03-08 14:30:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 14:40:00,2022-03-08 15:10:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 15:20:00,2022-03-08 15:50:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 16:00:00,2022-03-08 16:30:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 16:40:00,2022-03-08 17:10:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 17:20:00,2022-03-08 17:50:00,OPPS_26,9266,10,4448150,CKB +LINE_11,OPPS_26,2022-03-08 18:00:00,2022-03-08 18:30:00,OPPS_26,9266,0,4448150,CKB +LINE_11,OPPS_26,2022-03-08 18:30:00,2022-03-08 18:30:00,DEPS_1,0.06,0,4448150,CKB +LINE_12,DEPS_1,2022-03-08 07:10:00,2022-03-08 07:10:00,S_27,0.06,0,4733895,CKB +LINE_12,S_27,2022-03-08 07:10:00,2022-03-08 07:18:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 07:28:00,2022-03-08 07:40:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 07:40:00,2022-03-08 07:48:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 07:58:00,2022-03-08 08:10:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 08:10:00,2022-03-08 08:18:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 08:28:00,2022-03-08 08:40:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 08:40:00,2022-03-08 08:48:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 08:58:00,2022-03-08 09:10:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 09:10:00,2022-03-08 09:18:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 09:28:00,2022-03-08 09:40:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 09:40:00,2022-03-08 09:48:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 09:58:00,2022-03-08 10:10:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 10:10:00,2022-03-08 10:18:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 10:28:00,2022-03-08 10:40:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 10:40:00,2022-03-08 10:48:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 10:58:00,2022-03-08 11:10:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 11:10:00,2022-03-08 11:18:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 11:28:00,2022-03-08 11:40:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 11:40:00,2022-03-08 11:48:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 11:58:00,2022-03-08 12:10:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 12:10:00,2022-03-08 12:18:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 12:28:00,2022-03-08 12:40:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 12:40:00,2022-03-08 12:48:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 12:58:00,2022-03-08 13:10:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 13:10:00,2022-03-08 13:18:00,OPPS_28,2169,10,4733895,CKB +LINE_12,OPPS_28,2022-03-08 13:28:00,2022-03-08 13:40:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 13:40:00,2022-03-08 13:48:00,OPPS_28,2169,8,4733895,CKB +LINE_12,OPPS_28,2022-03-08 13:56:00,2022-03-08 14:10:00,S_27,2952,0,4733895,CKB +LINE_12,S_27,2022-03-08 14:10:00,2022-03-08 14:19:00,OPPS_28,2169,14,4733895,CKB +LINE_12,OPPS_28,2022-03-08 14:33:00,2022-03-08 14:47:00,S_27,2952,3,4733895,CKB +LINE_12,S_27,2022-03-08 14:50:00,2022-03-08 14:59:00,OPPS_28,2169,14,4733895,CKB +LINE_12,OPPS_28,2022-03-08 15:13:00,2022-03-08 15:27:00,S_27,2952,3,4733895,CKB +LINE_12,S_27,2022-03-08 15:30:00,2022-03-08 15:39:00,OPPS_28,2169,14,4733895,CKB +LINE_12,OPPS_28,2022-03-08 15:53:00,2022-03-08 16:07:00,S_27,2952,3,4733895,CKB +LINE_12,S_27,2022-03-08 16:10:00,2022-03-08 16:19:00,OPPS_28,2169,14,4733895,CKB +LINE_12,OPPS_28,2022-03-08 16:33:00,2022-03-08 16:47:00,S_27,2952,3,4733895,CKB +LINE_12,S_27,2022-03-08 16:50:00,2022-03-08 16:59:00,OPPS_28,2169,14,4733895,CKB +LINE_12,OPPS_28,2022-03-08 17:13:00,2022-03-08 17:27:00,S_27,2952,3,4733895,CKB +LINE_12,S_27,2022-03-08 17:30:00,2022-03-08 17:39:00,OPPS_28,2169,13,4733895,CKB +LINE_12,OPPS_28,2022-03-08 17:52:00,2022-03-08 18:05:00,S_27,2952,5,4733895,CKB +LINE_12,S_27,2022-03-08 18:10:00,2022-03-08 18:18:00,OPPS_28,2169,0,4733895,CKB +LINE_12,OPPS_28,2022-03-08 18:18:00,2022-03-08 18:18:00,DEPS_1,0.06,0,4733895,CKB +LINE_12,DEPS_1,2022-03-08 14:13:00,2022-03-08 14:13:00,OPPS_28,0.06,0,4734200,CKB +LINE_12,OPPS_28,2022-03-08 14:13:00,2022-03-08 14:27:00,S_27,2952,3,4734200,CKB +LINE_12,S_27,2022-03-08 14:30:00,2022-03-08 14:39:00,OPPS_28,2169,14,4734200,CKB +LINE_12,OPPS_28,2022-03-08 14:53:00,2022-03-08 15:07:00,S_27,2952,3,4734200,CKB +LINE_12,S_27,2022-03-08 15:10:00,2022-03-08 15:19:00,OPPS_28,2169,14,4734200,CKB +LINE_12,OPPS_28,2022-03-08 15:33:00,2022-03-08 15:47:00,S_27,2952,3,4734200,CKB +LINE_12,S_27,2022-03-08 15:50:00,2022-03-08 15:59:00,OPPS_28,2169,14,4734200,CKB +LINE_12,OPPS_28,2022-03-08 16:13:00,2022-03-08 16:27:00,S_27,2952,3,4734200,CKB +LINE_12,S_27,2022-03-08 16:30:00,2022-03-08 16:39:00,OPPS_28,2169,14,4734200,CKB +LINE_12,OPPS_28,2022-03-08 16:53:00,2022-03-08 17:07:00,S_27,2952,3,4734200,CKB +LINE_12,S_27,2022-03-08 17:10:00,2022-03-08 17:19:00,OPPS_28,2169,14,4734200,CKB +LINE_12,OPPS_28,2022-03-08 17:33:00,2022-03-08 17:47:00,S_27,2952,3,4734200,CKB +LINE_12,S_27,2022-03-08 17:50:00,2022-03-08 17:59:00,OPPS_28,2169,14,4734200,CKB +LINE_12,OPPS_28,2022-03-08 18:13:00,2022-03-08 18:25:00,S_27,2952,0,4734200,CKB +LINE_12,S_27,2022-03-08 18:25:00,2022-03-08 18:25:00,DEPS_1,0.06,0,4734200,CKB +LINE_13,DEPS_1,2022-03-09 00:23:00,2022-03-09 00:23:00,S_29,0.06,0,4318157,CKB +LINE_13,S_29,2022-03-09 00:23:00,2022-03-09 00:30:00,OPPS_30,2577,9,4318157,CKB +LINE_14,OPPS_30,2022-03-09 00:39:00,2022-03-09 00:54:00,S_31,5937,9,4318157,CKB +LINE_14,S_31,2022-03-09 01:03:00,2022-03-09 01:17:00,OPPS_30,6.19,0,4318157,CKB +LINE_13,OPPS_30,2022-03-09 01:17:00,2022-03-09 01:23:00,S_29,2555,0,4318157,CKB +LINE_13,S_29,2022-03-09 01:23:00,2022-03-09 01:30:00,OPPS_30,2577,9,4318157,CKB +LINE_14,OPPS_30,2022-03-09 01:39:00,2022-03-09 01:54:00,S_31,5937,9,4318157,CKB +LINE_14,S_31,2022-03-09 02:03:00,2022-03-09 02:17:00,OPPS_30,6.19,0,4318157,CKB +LINE_13,OPPS_30,2022-03-09 02:17:00,2022-03-09 02:23:00,S_29,2555,0,4318157,CKB +LINE_13,S_29,2022-03-09 02:23:00,2022-03-09 02:30:00,OPPS_30,2577,9,4318157,CKB +LINE_14,OPPS_30,2022-03-09 02:39:00,2022-03-09 02:54:00,S_31,5937,9,4318157,CKB +LINE_14,S_31,2022-03-09 03:03:00,2022-03-09 03:17:00,OPPS_30,6.19,0,4318157,CKB +LINE_13,OPPS_30,2022-03-09 03:17:00,2022-03-09 03:23:00,S_29,2555,0,4318157,CKB +LINE_13,S_29,2022-03-09 03:23:00,2022-03-09 03:30:00,OPPS_30,2577,9,4318157,CKB +LINE_14,OPPS_30,2022-03-09 03:39:00,2022-03-09 03:54:00,S_31,5937,9,4318157,CKB +LINE_14,S_31,2022-03-09 04:03:00,2022-03-09 04:17:00,OPPS_30,6.19,0,4318157,CKB +LINE_13,OPPS_30,2022-03-09 04:17:00,2022-03-09 04:23:00,S_29,2555,0,4318157,CKB +LINE_13,S_29,2022-03-09 04:23:00,2022-03-09 04:23:00,DEPS_1,0.06,0,4318157,CKB +LINE_14,DEPS_1,2022-03-09 00:33:00,2022-03-09 00:33:00,S_31,0.06,0,4318177,CKB +LINE_14,S_31,2022-03-09 00:33:00,2022-03-09 00:47:00,OPPS_30,6.19,0,4318177,CKB +LINE_13,OPPS_30,2022-03-09 00:47:00,2022-03-09 00:53:00,S_29,2555,0,4318177,CKB +LINE_13,S_29,2022-03-09 00:53:00,2022-03-09 01:00:00,OPPS_30,2577,9,4318177,CKB +LINE_14,OPPS_30,2022-03-09 01:09:00,2022-03-09 01:24:00,S_31,5937,9,4318177,CKB +LINE_14,S_31,2022-03-09 01:33:00,2022-03-09 01:47:00,OPPS_30,6.19,0,4318177,CKB +LINE_13,OPPS_30,2022-03-09 01:47:00,2022-03-09 01:53:00,S_29,2555,0,4318177,CKB +LINE_13,S_29,2022-03-09 01:53:00,2022-03-09 02:00:00,OPPS_30,2577,9,4318177,CKB +LINE_14,OPPS_30,2022-03-09 02:09:00,2022-03-09 02:24:00,S_31,5937,9,4318177,CKB +LINE_14,S_31,2022-03-09 02:33:00,2022-03-09 02:47:00,OPPS_30,6.19,0,4318177,CKB +LINE_13,OPPS_30,2022-03-09 02:47:00,2022-03-09 02:53:00,S_29,2555,0,4318177,CKB +LINE_13,S_29,2022-03-09 02:53:00,2022-03-09 03:00:00,OPPS_30,2577,9,4318177,CKB +LINE_14,OPPS_30,2022-03-09 03:09:00,2022-03-09 03:24:00,S_31,5937,9,4318177,CKB +LINE_14,S_31,2022-03-09 03:33:00,2022-03-09 03:47:00,OPPS_30,6.19,0,4318177,CKB +LINE_13,OPPS_30,2022-03-09 03:47:00,2022-03-09 03:53:00,S_29,2555,0,4318177,CKB +LINE_13,S_29,2022-03-09 03:53:00,2022-03-09 04:00:00,OPPS_30,2577,9,4318177,CKB +LINE_14,OPPS_30,2022-03-09 04:09:00,2022-03-09 04:24:00,S_31,5937,0,4318177,CKB +LINE_14,S_31,2022-03-09 04:24:00,2022-03-09 04:24:00,DEPS_1,0.06,0,4318177,CKB +LINE_15,DEPS_1,2022-03-09 00:57:00,2022-03-09 00:57:00,OPPS_32,0.06,0,4319352,CKB +LINE_15,OPPS_32,2022-03-09 00:57:00,2022-03-09 01:06:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 01:06:00,2022-03-09 01:11:00,OPPS_32,2936,16,4319352,CKB +LINE_15,OPPS_32,2022-03-09 01:27:00,2022-03-09 01:36:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 01:36:00,2022-03-09 01:41:00,OPPS_32,2936,16,4319352,CKB +LINE_15,OPPS_32,2022-03-09 01:57:00,2022-03-09 02:06:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 02:06:00,2022-03-09 02:11:00,OPPS_32,2936,16,4319352,CKB +LINE_15,OPPS_32,2022-03-09 02:27:00,2022-03-09 02:36:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 02:36:00,2022-03-09 02:41:00,OPPS_32,2936,16,4319352,CKB +LINE_15,OPPS_32,2022-03-09 02:57:00,2022-03-09 03:06:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 03:06:00,2022-03-09 03:11:00,OPPS_32,2936,16,4319352,CKB +LINE_15,OPPS_32,2022-03-09 03:27:00,2022-03-09 03:36:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 03:36:00,2022-03-09 03:41:00,OPPS_32,2936,16,4319352,CKB +LINE_15,OPPS_32,2022-03-09 03:57:00,2022-03-09 04:06:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 04:06:00,2022-03-09 04:11:00,OPPS_32,2936,16,4319352,CKB +LINE_15,OPPS_32,2022-03-09 04:27:00,2022-03-09 04:36:00,S_33,4343,0,4319352,CKB +LINE_15,S_33,2022-03-09 04:36:00,2022-03-09 04:36:00,DEPS_1,0.06,0,4319352,CKB +LINE_16,DEPS_1,2022-03-09 00:29:00,2022-03-09 00:29:00,S_34,0.06,0,4751087,CKB +LINE_16,S_34,2022-03-09 00:29:00,2022-03-09 00:41:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 00:47:00,2022-03-09 00:57:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 00:59:00,2022-03-09 01:11:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 01:17:00,2022-03-09 01:27:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 01:29:00,2022-03-09 01:41:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 01:47:00,2022-03-09 01:57:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 01:59:00,2022-03-09 02:11:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 02:17:00,2022-03-09 02:27:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 02:29:00,2022-03-09 02:41:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 02:47:00,2022-03-09 02:57:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 02:59:00,2022-03-09 03:11:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 03:17:00,2022-03-09 03:27:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 03:29:00,2022-03-09 03:41:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 03:47:00,2022-03-09 03:57:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 03:59:00,2022-03-09 04:11:00,S_35,4481,6,4751087,CKB +LINE_16,S_35,2022-03-09 04:17:00,2022-03-09 04:27:00,S_34,4031,2,4751087,CKB +LINE_16,S_34,2022-03-09 04:29:00,2022-03-09 04:41:00,S_35,4481,0,4751087,CKB +LINE_16,S_35,2022-03-09 04:41:00,2022-03-09 04:41:00,DEPS_1,0.06,0,4751087,CKB +LINE_17,DEPS_1,2022-03-09 00:30:00,2022-03-09 00:30:00,S_34,0.06,0,4453545,CKB +LINE_17,S_34,2022-03-09 00:30:00,2022-03-09 00:44:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 00:44:00,2022-03-09 00:57:00,S_34,5302,3,4453545,CKB +LINE_17,S_34,2022-03-09 01:00:00,2022-03-09 01:14:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 01:14:00,2022-03-09 01:27:00,S_34,5302,3,4453545,CKB +LINE_17,S_34,2022-03-09 01:30:00,2022-03-09 01:44:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 01:44:00,2022-03-09 01:57:00,S_34,5302,3,4453545,CKB +LINE_17,S_34,2022-03-09 02:00:00,2022-03-09 02:14:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 02:14:00,2022-03-09 02:27:00,S_34,5302,3,4453545,CKB +LINE_17,S_34,2022-03-09 02:30:00,2022-03-09 02:44:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 02:44:00,2022-03-09 02:57:00,S_34,5302,3,4453545,CKB +LINE_17,S_34,2022-03-09 03:00:00,2022-03-09 03:14:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 03:14:00,2022-03-09 03:27:00,S_34,5302,3,4453545,CKB +LINE_17,S_34,2022-03-09 03:30:00,2022-03-09 03:44:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 03:44:00,2022-03-09 03:57:00,S_34,5302,3,4453545,CKB +LINE_17,S_34,2022-03-09 04:00:00,2022-03-09 04:14:00,S_36,4801,0,4453545,CKB +LINE_17,S_36,2022-03-09 04:14:00,2022-03-09 04:27:00,S_34,5302,0,4453545,CKB +LINE_17,S_34,2022-03-09 04:27:00,2022-03-09 04:27:00,DEPS_1,0.06,0,4453545,CKB +LINE_18,DEPS_1,2022-03-09 00:43:00,2022-03-09 00:43:00,S_37,0.06,0,4374467,CKB +LINE_18,S_37,2022-03-09 00:43:00,2022-03-09 01:33:00,S_37,20434,10,4374467,CKB +LINE_18,S_37,2022-03-09 01:43:00,2022-03-09 02:33:00,S_37,20434,10,4374467,CKB +LINE_18,S_37,2022-03-09 02:43:00,2022-03-09 03:33:00,S_37,20434,10,4374467,CKB +LINE_18,S_37,2022-03-09 03:43:00,2022-03-09 04:33:00,S_37,20434,0,4374467,CKB +LINE_18,S_37,2022-03-09 04:33:00,2022-03-09 04:33:00,DEPS_1,0.06,0,4374467,CKB +LINE_18,DEPS_1,2022-03-09 00:13:00,2022-03-09 00:13:00,S_37,0.06,0,4374472,CKB +LINE_18,S_37,2022-03-09 00:13:00,2022-03-09 01:03:00,S_37,20434,10,4374472,CKB +LINE_18,S_37,2022-03-09 01:13:00,2022-03-09 02:03:00,S_37,20434,10,4374472,CKB +LINE_18,S_37,2022-03-09 02:13:00,2022-03-09 03:03:00,S_37,20434,10,4374472,CKB +LINE_18,S_37,2022-03-09 03:13:00,2022-03-09 04:03:00,S_37,20434,0,4374472,CKB +LINE_18,S_37,2022-03-09 04:03:00,2022-03-09 04:03:00,DEPS_1,0.06,0,4374472,CKB +LINE_19,DEPS_1,2022-03-09 00:24:00,2022-03-09 00:24:00,S_38,0.06,0,4456448,CKB +LINE_19,S_38,2022-03-09 00:24:00,2022-03-09 00:48:00,OPPS_39,11.86,4,4456448,CKB +LINE_19,OPPS_39,2022-03-09 00:52:00,2022-03-09 01:14:00,S_38,11139,10,4456448,CKB +LINE_19,S_38,2022-03-09 01:24:00,2022-03-09 01:48:00,OPPS_39,11.86,4,4456448,CKB +LINE_19,OPPS_39,2022-03-09 01:52:00,2022-03-09 02:14:00,S_38,11139,10,4456448,CKB +LINE_19,S_38,2022-03-09 02:24:00,2022-03-09 02:48:00,OPPS_39,11.86,4,4456448,CKB +LINE_19,OPPS_39,2022-03-09 02:52:00,2022-03-09 03:14:00,S_38,11139,10,4456448,CKB +LINE_19,S_38,2022-03-09 03:24:00,2022-03-09 03:48:00,OPPS_39,11.86,4,4456448,CKB +LINE_19,OPPS_39,2022-03-09 03:52:00,2022-03-09 04:14:00,S_38,11139,0,4456448,CKB +LINE_19,S_38,2022-03-09 04:14:00,2022-03-09 04:14:00,DEPS_1,0.06,0,4456448,CKB +LINE_19,DEPS_1,2022-03-09 00:22:00,2022-03-09 00:22:00,OPPS_39,0.06,0,4456456,CKB +LINE_19,OPPS_39,2022-03-09 00:22:00,2022-03-09 00:44:00,S_38,11139,10,4456456,CKB +LINE_19,S_38,2022-03-09 00:54:00,2022-03-09 01:18:00,OPPS_39,11.86,4,4456456,CKB +LINE_19,OPPS_39,2022-03-09 01:22:00,2022-03-09 01:44:00,S_38,11139,10,4456456,CKB +LINE_19,S_38,2022-03-09 01:54:00,2022-03-09 02:18:00,OPPS_39,11.86,4,4456456,CKB +LINE_19,OPPS_39,2022-03-09 02:22:00,2022-03-09 02:44:00,S_38,11139,10,4456456,CKB +LINE_19,S_38,2022-03-09 02:54:00,2022-03-09 03:18:00,OPPS_39,11.86,4,4456456,CKB +LINE_19,OPPS_39,2022-03-09 03:22:00,2022-03-09 03:44:00,S_38,11139,10,4456456,CKB +LINE_19,S_38,2022-03-09 03:54:00,2022-03-09 04:18:00,OPPS_39,11.86,4,4456456,CKB +LINE_19,OPPS_39,2022-03-09 04:22:00,2022-03-09 04:44:00,S_38,11139,0,4456456,CKB +LINE_19,S_38,2022-03-09 04:44:00,2022-03-09 04:44:00,DEPS_1,0.06,0,4456456,CKB +LINE_20,DEPS_1,2022-03-09 00:32:00,2022-03-09 00:32:00,S_13,0.06,0,4747650,CKB +LINE_20,S_13,2022-03-09 00:32:00,2022-03-09 00:44:00,S_40,4212,3,4747650,CKB +LINE_20,S_40,2022-03-09 00:47:00,2022-03-09 01:16:00,S_41,13048,0,4747650,CKB +LINE_20,S_41,2022-03-09 01:16:00,2022-03-09 01:42:00,S_40,12869,5,4747650,CKB +LINE_20,S_40,2022-03-09 01:47:00,2022-03-09 02:16:00,S_41,13048,0,4747650,CKB +LINE_20,S_41,2022-03-09 02:16:00,2022-03-09 02:42:00,S_40,12869,5,4747650,CKB +LINE_20,S_40,2022-03-09 02:47:00,2022-03-09 03:16:00,S_41,13048,0,4747650,CKB +LINE_20,S_41,2022-03-09 03:16:00,2022-03-09 03:42:00,S_40,12869,5,4747650,CKB +LINE_20,S_40,2022-03-09 03:47:00,2022-03-09 04:16:00,S_41,13048,0,4747650,CKB +LINE_20,S_41,2022-03-09 04:16:00,2022-03-09 04:34:00,DEPS_42,9538,0,4747650,CKB +LINE_20,DEPS_42,2022-03-09 04:34:00,2022-03-09 04:34:00,DEPS_1,0.06,0,4747650,CKB +LINE_20,DEPS_1,2022-03-09 00:17:00,2022-03-09 00:17:00,S_40,0.06,0,4747660,CKB +LINE_20,S_40,2022-03-09 00:17:00,2022-03-09 00:46:00,S_41,13048,0,4747660,CKB +LINE_20,S_41,2022-03-09 00:46:00,2022-03-09 01:12:00,S_40,12869,5,4747660,CKB +LINE_20,S_40,2022-03-09 01:17:00,2022-03-09 01:46:00,S_41,13048,0,4747660,CKB +LINE_20,S_41,2022-03-09 01:46:00,2022-03-09 02:12:00,S_40,12869,5,4747660,CKB +LINE_20,S_40,2022-03-09 02:17:00,2022-03-09 02:46:00,S_41,13048,0,4747660,CKB +LINE_20,S_41,2022-03-09 02:46:00,2022-03-09 03:12:00,S_40,12869,5,4747660,CKB +LINE_20,S_40,2022-03-09 03:17:00,2022-03-09 03:46:00,S_41,13048,0,4747660,CKB +LINE_20,S_41,2022-03-09 03:46:00,2022-03-09 04:12:00,S_40,12869,5,4747660,CKB +LINE_20,S_40,2022-03-09 04:17:00,2022-03-09 04:28:00,S_13,4316,0,4747660,CKB +LINE_20,S_13,2022-03-09 04:28:00,2022-03-09 04:28:00,DEPS_1,0.06,0,4747660,CKB +LINE_21,DEPS_1,2022-03-09 00:49:00,2022-03-09 00:49:00,OPPS_3,0.06,0,4434341,CKB +LINE_21,OPPS_3,2022-03-09 00:49:00,2022-03-09 01:04:00,S_16,10229,0,4434341,CKB +LINE_21,S_16,2022-03-09 01:04:00,2022-03-09 01:19:00,OPPS_3,11801,0,4434341,CKB +LINE_21,OPPS_3,2022-03-09 01:19:00,2022-03-09 01:34:00,S_16,10229,0,4434341,CKB +LINE_21,S_16,2022-03-09 01:34:00,2022-03-09 01:49:00,OPPS_3,11801,0,4434341,CKB +LINE_21,OPPS_3,2022-03-09 01:49:00,2022-03-09 02:04:00,S_16,10229,0,4434341,CKB +LINE_21,S_16,2022-03-09 02:04:00,2022-03-09 02:19:00,OPPS_3,11801,0,4434341,CKB +LINE_21,OPPS_3,2022-03-09 02:19:00,2022-03-09 02:34:00,S_16,10229,0,4434341,CKB +LINE_21,S_16,2022-03-09 02:34:00,2022-03-09 02:49:00,OPPS_3,11801,0,4434341,CKB +LINE_21,OPPS_3,2022-03-09 02:49:00,2022-03-09 03:04:00,S_16,10229,0,4434341,CKB +LINE_21,S_16,2022-03-09 03:04:00,2022-03-09 03:19:00,OPPS_3,11801,0,4434341,CKB +LINE_21,OPPS_3,2022-03-09 03:19:00,2022-03-09 03:34:00,S_16,10229,0,4434341,CKB +LINE_21,S_16,2022-03-09 03:34:00,2022-03-09 03:49:00,OPPS_3,11801,0,4434341,CKB +LINE_21,OPPS_3,2022-03-09 03:49:00,2022-03-09 04:04:00,S_16,10229,0,4434341,CKB +LINE_21,S_16,2022-03-09 04:04:00,2022-03-09 04:19:00,OPPS_3,11801,23,4434341,CKB +LINE_22,OPPS_3,2022-03-09 04:42:00,2022-03-09 05:04:00,S_43,6.81,0,4434341,CKB +LINE_22,S_43,2022-03-09 05:04:00,2022-03-09 05:04:00,DEPS_1,0.06,0,4434341,CKB +LINE_8,DEPS_1,2022-03-09 00:32:00,2022-03-09 00:32:00,S_13,0.06,0,4434897,CKB +LINE_8,S_13,2022-03-09 00:32:00,2022-03-09 00:57:00,OPPS_21,11545,6,4434897,CKB +LINE_8,OPPS_21,2022-03-09 01:03:00,2022-03-09 01:46:00,S_20,20579,1,4434897,CKB +LINE_8,S_20,2022-03-09 01:47:00,2022-03-09 02:25:00,OPPS_21,20641,8,4434897,CKB +LINE_8,OPPS_21,2022-03-09 02:33:00,2022-03-09 03:16:00,S_20,20579,1,4434897,CKB +LINE_8,S_20,2022-03-09 03:17:00,2022-03-09 03:55:00,OPPS_21,20641,8,4434897,CKB +LINE_8,OPPS_21,2022-03-09 04:03:00,2022-03-09 04:28:00,S_13,11499,0,4434897,CKB +LINE_8,S_13,2022-03-09 04:28:00,2022-03-09 04:28:00,DEPS_1,0.06,0,4434897,CKB +LINE_8,DEPS_1,2022-03-09 00:33:00,2022-03-09 00:33:00,OPPS_21,0.06,0,4434902,CKB +LINE_8,OPPS_21,2022-03-09 00:33:00,2022-03-09 01:16:00,S_20,20579,1,4434902,CKB +LINE_8,S_20,2022-03-09 01:17:00,2022-03-09 01:55:00,OPPS_21,20641,8,4434902,CKB +LINE_8,OPPS_21,2022-03-09 02:03:00,2022-03-09 02:46:00,S_20,20579,1,4434902,CKB +LINE_8,S_20,2022-03-09 02:47:00,2022-03-09 03:25:00,OPPS_21,20641,8,4434902,CKB +LINE_8,OPPS_21,2022-03-09 03:33:00,2022-03-09 04:16:00,S_20,20579,1,4434902,CKB +LINE_8,S_20,2022-03-09 04:17:00,2022-03-09 04:51:00,S_44,18752,0,4434902,CKB +LINE_8,S_44,2022-03-09 04:51:00,2022-03-09 04:51:00,DEPS_1,0.06,0,4434902,CKB +LINE_23,DEPS_1,2022-03-09 00:34:00,2022-03-09 00:34:00,S_45,0.06,0,4619766,CKB +LINE_23,S_45,2022-03-09 00:34:00,2022-03-09 01:00:00,S_46,9016,0,4619766,CKB +LINE_23,S_46,2022-03-09 01:00:00,2022-03-09 01:27:00,S_45,10083,7,4619766,CKB +LINE_23,S_45,2022-03-09 01:34:00,2022-03-09 02:00:00,S_46,9016,0,4619766,CKB +LINE_23,S_46,2022-03-09 02:00:00,2022-03-09 02:27:00,S_45,10083,7,4619766,CKB +LINE_23,S_45,2022-03-09 02:34:00,2022-03-09 03:00:00,S_46,9016,0,4619766,CKB +LINE_23,S_46,2022-03-09 03:00:00,2022-03-09 03:27:00,S_45,10083,7,4619766,CKB +LINE_23,S_45,2022-03-09 03:34:00,2022-03-09 04:00:00,S_46,9016,0,4619766,CKB +LINE_23,S_46,2022-03-09 04:00:00,2022-03-09 04:27:00,S_45,10083,0,4619766,CKB +LINE_23,S_45,2022-03-09 04:27:00,2022-03-09 04:27:00,DEPS_1,0.06,0,4619766,CKB +LINE_23,DEPS_1,2022-03-09 00:30:00,2022-03-09 00:30:00,S_46,0.06,0,4619991,CKB +LINE_23,S_46,2022-03-09 00:30:00,2022-03-09 00:57:00,S_45,10083,7,4619991,CKB +LINE_23,S_45,2022-03-09 01:04:00,2022-03-09 01:30:00,S_46,9016,0,4619991,CKB +LINE_23,S_46,2022-03-09 01:30:00,2022-03-09 01:57:00,S_45,10083,7,4619991,CKB +LINE_23,S_45,2022-03-09 02:04:00,2022-03-09 02:30:00,S_46,9016,0,4619991,CKB +LINE_23,S_46,2022-03-09 02:30:00,2022-03-09 02:57:00,S_45,10083,7,4619991,CKB +LINE_23,S_45,2022-03-09 03:04:00,2022-03-09 03:30:00,S_46,9016,0,4619991,CKB +LINE_23,S_46,2022-03-09 03:30:00,2022-03-09 03:57:00,S_45,10083,7,4619991,CKB +LINE_23,S_45,2022-03-09 04:04:00,2022-03-09 04:30:00,S_46,9016,0,4619991,CKB +LINE_23,S_46,2022-03-09 04:30:00,2022-03-09 04:57:00,S_45,10083,0,4619991,CKB +LINE_23,S_45,2022-03-09 04:57:00,2022-03-09 04:57:00,DEPS_1,0.06,0,4619991,CKB +LINE_24,DEPS_1,2022-03-09 00:31:00,2022-03-09 00:31:00,OPPS_21,0.06,0,4374744,CKB +LINE_24,OPPS_21,2022-03-09 00:31:00,2022-03-09 00:44:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 00:44:00,2022-03-09 00:56:00,OPPS_21,5362,5,4374744,CKB +LINE_24,OPPS_21,2022-03-09 01:01:00,2022-03-09 01:14:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 01:14:00,2022-03-09 01:26:00,OPPS_21,5362,5,4374744,CKB +LINE_24,OPPS_21,2022-03-09 01:31:00,2022-03-09 01:44:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 01:44:00,2022-03-09 01:56:00,OPPS_21,5362,5,4374744,CKB +LINE_24,OPPS_21,2022-03-09 02:01:00,2022-03-09 02:14:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 02:14:00,2022-03-09 02:26:00,OPPS_21,5362,5,4374744,CKB +LINE_24,OPPS_21,2022-03-09 02:31:00,2022-03-09 02:44:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 02:44:00,2022-03-09 02:56:00,OPPS_21,5362,5,4374744,CKB +LINE_24,OPPS_21,2022-03-09 03:01:00,2022-03-09 03:14:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 03:14:00,2022-03-09 03:26:00,OPPS_21,5362,5,4374744,CKB +LINE_24,OPPS_21,2022-03-09 03:31:00,2022-03-09 03:44:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 03:44:00,2022-03-09 03:56:00,OPPS_21,5362,5,4374744,CKB +LINE_24,OPPS_21,2022-03-09 04:01:00,2022-03-09 04:14:00,S_47,4872,0,4374744,CKB +LINE_24,S_47,2022-03-09 04:14:00,2022-03-09 04:26:00,OPPS_21,5362,0,4374744,CKB +LINE_24,OPPS_21,2022-03-09 04:26:00,2022-03-09 04:26:00,DEPS_1,0.06,0,4374744,CKB +LINE_25,DEPS_1,2022-03-09 00:31:00,2022-03-09 00:31:00,OPPS_21,0.06,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 00:31:00,2022-03-09 00:45:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 00:47:00,2022-03-09 01:01:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 01:01:00,2022-03-09 01:15:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 01:17:00,2022-03-09 01:31:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 01:31:00,2022-03-09 01:45:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 01:47:00,2022-03-09 02:01:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 02:01:00,2022-03-09 02:15:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 02:17:00,2022-03-09 02:31:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 02:31:00,2022-03-09 02:45:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 02:47:00,2022-03-09 03:01:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 03:01:00,2022-03-09 03:15:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 03:17:00,2022-03-09 03:31:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 03:31:00,2022-03-09 03:45:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 03:47:00,2022-03-09 04:01:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 04:01:00,2022-03-09 04:15:00,S_48,5225,2,4374866,CKB +LINE_25,S_48,2022-03-09 04:17:00,2022-03-09 04:31:00,OPPS_21,7617,0,4374866,CKB +LINE_25,OPPS_21,2022-03-09 04:31:00,2022-03-09 04:31:00,DEPS_1,0.06,0,4374866,CKB +LINE_26,DEPS_1,2022-03-09 00:43:00,2022-03-09 00:43:00,S_49,0.06,0,4375013,CKB +LINE_26,S_49,2022-03-09 00:43:00,2022-03-09 00:53:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 00:53:00,2022-03-09 01:03:00,S_49,4408,10,4375013,CKB +LINE_26,S_49,2022-03-09 01:13:00,2022-03-09 01:23:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 01:23:00,2022-03-09 01:33:00,S_49,4408,10,4375013,CKB +LINE_26,S_49,2022-03-09 01:43:00,2022-03-09 01:53:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 01:53:00,2022-03-09 02:03:00,S_49,4408,10,4375013,CKB +LINE_26,S_49,2022-03-09 02:13:00,2022-03-09 02:23:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 02:23:00,2022-03-09 02:33:00,S_49,4408,10,4375013,CKB +LINE_26,S_49,2022-03-09 02:43:00,2022-03-09 02:53:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 02:53:00,2022-03-09 03:03:00,S_49,4408,10,4375013,CKB +LINE_26,S_49,2022-03-09 03:13:00,2022-03-09 03:23:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 03:23:00,2022-03-09 03:33:00,S_49,4408,10,4375013,CKB +LINE_26,S_49,2022-03-09 03:43:00,2022-03-09 03:53:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 03:53:00,2022-03-09 04:03:00,S_49,4408,10,4375013,CKB +LINE_26,S_49,2022-03-09 04:13:00,2022-03-09 04:23:00,S_50,4507,0,4375013,CKB +LINE_26,S_50,2022-03-09 04:23:00,2022-03-09 04:33:00,S_49,4408,0,4375013,CKB +LINE_26,S_49,2022-03-09 04:33:00,2022-03-09 04:33:00,DEPS_1,0.06,0,4375013,CKB +LINE_0,DEPS_1,2022-03-09 21:31:00,2022-03-09 21:31:00,S_0,0.06,0,4454945,CKB +LINE_0,S_0,2022-03-09 21:31:00,2022-03-09 22:04:00,S_2,14519,4,4454945,CKB +LINE_0,S_2,2022-03-09 22:08:00,2022-03-09 22:43:00,S_0,13541,8,4454945,CKB +LINE_0,S_0,2022-03-09 22:51:00,2022-03-09 23:24:00,S_2,14519,4,4454945,CKB +LINE_0,S_2,2022-03-09 23:28:00,2022-03-10 00:03:00,S_0,13541,8,4454945,CKB +LINE_0,S_0,2022-03-10 00:11:00,2022-03-10 00:44:00,S_2,14519,0,4454945,CKB +LINE_1,S_2,2022-03-10 00:44:00,2022-03-10 00:54:00,OPPS_3,4.1,25,4454945,CKB +LINE_1,OPPS_3,2022-03-10 01:19:00,2022-03-10 01:42:00,S_4,8.36,6,4454945,CKB +LINE_1,S_4,2022-03-10 01:48:00,2022-03-10 02:06:00,OPPS_3,9067,13,4454945,CKB +LINE_1,OPPS_3,2022-03-10 02:19:00,2022-03-10 02:42:00,S_4,8.36,6,4454945,CKB +LINE_1,S_4,2022-03-10 02:48:00,2022-03-10 03:06:00,OPPS_3,9067,13,4454945,CKB +LINE_1,OPPS_3,2022-03-10 03:19:00,2022-03-10 03:42:00,S_4,8.36,6,4454945,CKB +LINE_1,S_4,2022-03-10 03:48:00,2022-03-10 04:06:00,OPPS_3,9067,0,4454945,CKB +LINE_1,OPPS_3,2022-03-10 04:06:00,2022-03-10 04:06:00,DEPS_1,0.06,0,4454945,CKB +LINE_0,DEPS_1,2022-03-09 22:11:00,2022-03-09 22:11:00,S_0,0.06,0,4454950,CKB +LINE_0,S_0,2022-03-09 22:11:00,2022-03-09 22:44:00,S_2,14519,4,4454950,CKB +LINE_0,S_2,2022-03-09 22:48:00,2022-03-09 23:23:00,S_0,13541,8,4454950,CKB +LINE_0,S_0,2022-03-09 23:31:00,2022-03-10 00:04:00,S_2,14519,4,4454950,CKB +LINE_0,S_2,2022-03-10 00:08:00,2022-03-10 00:39:00,S_5,12213,0,4454950,CKB +LINE_1,S_5,2022-03-10 00:39:00,2022-03-10 00:47:00,OPPS_3,4.0,2,4454950,CKB +LINE_1,OPPS_3,2022-03-10 00:49:00,2022-03-10 01:12:00,S_4,8.36,6,4454950,CKB +LINE_1,S_4,2022-03-10 01:18:00,2022-03-10 01:36:00,OPPS_3,9067,13,4454950,CKB +LINE_1,OPPS_3,2022-03-10 01:49:00,2022-03-10 02:12:00,S_4,8.36,6,4454950,CKB +LINE_1,S_4,2022-03-10 02:18:00,2022-03-10 02:36:00,OPPS_3,9067,13,4454950,CKB +LINE_1,OPPS_3,2022-03-10 02:49:00,2022-03-10 03:12:00,S_4,8.36,6,4454950,CKB +LINE_1,S_4,2022-03-10 03:18:00,2022-03-10 03:36:00,OPPS_3,9067,13,4454950,CKB +LINE_1,OPPS_3,2022-03-10 03:49:00,2022-03-10 04:12:00,S_4,8.36,0,4454950,CKB +LINE_1,S_4,2022-03-10 04:12:00,2022-03-10 04:12:00,DEPS_1,0.06,0,4454950,CKB +LINE_2,DEPS_1,2022-03-09 21:06:00,2022-03-09 21:06:00,S_6,0.06,0,4664624,CKB +LINE_2,S_6,2022-03-09 21:06:00,2022-03-09 21:34:00,S_7,13018,19,4664624,CKB +LINE_2,S_7,2022-03-09 21:53:00,2022-03-09 22:13:00,S_8,10332,17,4664624,CKB +LINE_2,S_8,2022-03-09 22:30:00,2022-03-09 22:54:00,S_7,10.48,19,4664624,CKB +LINE_2,S_7,2022-03-09 23:13:00,2022-03-09 23:33:00,S_8,10332,17,4664624,CKB +LINE_2,S_8,2022-03-09 23:50:00,2022-03-10 00:14:00,S_7,10.48,2,4664624,CKB +LINE_2,S_7,2022-03-10 00:16:00,2022-03-10 00:23:00,S_9,3709,5,4664624,CKB +LINE_3,S_9,2022-03-10 00:28:00,2022-03-10 00:44:00,OPPS_10,6404,3,4664624,CKB +LINE_3,OPPS_10,2022-03-10 00:47:00,2022-03-10 01:10:00,S_11,10579,7,4664624,CKB +LINE_3,S_11,2022-03-10 01:17:00,2022-03-10 01:44:00,OPPS_10,12007,3,4664624,CKB +LINE_3,OPPS_10,2022-03-10 01:47:00,2022-03-10 02:10:00,S_11,10579,7,4664624,CKB +LINE_3,S_11,2022-03-10 02:17:00,2022-03-10 02:44:00,OPPS_10,12007,3,4664624,CKB +LINE_3,OPPS_10,2022-03-10 02:47:00,2022-03-10 03:10:00,S_11,10579,7,4664624,CKB +LINE_3,S_11,2022-03-10 03:17:00,2022-03-10 03:44:00,OPPS_10,12007,3,4664624,CKB +LINE_3,OPPS_10,2022-03-10 03:47:00,2022-03-10 04:10:00,S_11,10579,7,4664624,CKB +LINE_3,S_11,2022-03-10 04:17:00,2022-03-10 04:44:00,OPPS_10,12007,0,4664624,CKB +LINE_3,OPPS_10,2022-03-10 04:44:00,2022-03-10 04:44:00,DEPS_1,0.06,0,4664624,CKB +LINE_2,DEPS_1,2022-03-09 20:26:00,2022-03-09 20:26:00,S_6,0.06,0,4762734,CKB +LINE_2,S_6,2022-03-09 20:26:00,2022-03-09 20:56:00,S_12,14097,14,4762734,CKB +LINE_2,S_12,2022-03-09 21:10:00,2022-03-09 21:38:00,S_6,13.19,8,4762734,CKB +LINE_2,S_6,2022-03-09 21:46:00,2022-03-09 22:14:00,S_7,13018,19,4762734,CKB +LINE_2,S_7,2022-03-09 22:33:00,2022-03-09 22:53:00,S_8,10332,17,4762734,CKB +LINE_2,S_8,2022-03-09 23:10:00,2022-03-09 23:34:00,S_7,10.48,19,4762734,CKB +LINE_2,S_7,2022-03-09 23:53:00,2022-03-10 00:13:00,S_8,10332,2,4762734,CKB +LINE_2,S_8,2022-03-10 00:15:00,2022-03-10 00:16:00,OPPS_10,506,1,4762734,CKB +LINE_3,OPPS_10,2022-03-10 00:17:00,2022-03-10 00:40:00,S_11,10579,7,4762734,CKB +LINE_3,S_11,2022-03-10 00:47:00,2022-03-10 01:14:00,OPPS_10,12007,3,4762734,CKB +LINE_3,OPPS_10,2022-03-10 01:17:00,2022-03-10 01:40:00,S_11,10579,7,4762734,CKB +LINE_3,S_11,2022-03-10 01:47:00,2022-03-10 02:14:00,OPPS_10,12007,3,4762734,CKB +LINE_3,OPPS_10,2022-03-10 02:17:00,2022-03-10 02:40:00,S_11,10579,7,4762734,CKB +LINE_3,S_11,2022-03-10 02:47:00,2022-03-10 03:14:00,OPPS_10,12007,3,4762734,CKB +LINE_3,OPPS_10,2022-03-10 03:17:00,2022-03-10 03:40:00,S_11,10579,7,4762734,CKB +LINE_3,S_11,2022-03-10 03:47:00,2022-03-10 04:14:00,OPPS_10,12007,3,4762734,CKB +LINE_3,OPPS_10,2022-03-10 04:17:00,2022-03-10 04:40:00,S_11,10579,3,4762734,CKB +LINE_4,S_11,2022-03-10 04:43:00,2022-03-10 04:58:00,S_13,6161,0,4762734,CKB +LINE_4,S_13,2022-03-10 04:58:00,2022-03-10 04:58:00,DEPS_1,0.06,0,4762734,CKB +LINE_5,DEPS_1,2022-03-09 22:56:00,2022-03-09 22:56:00,S_14,0.06,0,4617415,CKB +LINE_5,S_14,2022-03-09 22:56:00,2022-03-09 23:08:00,S_15,5882,3,4617415,CKB +LINE_5,S_15,2022-03-09 23:11:00,2022-03-09 23:25:00,S_14,6232,0,4617415,CKB +LINE_5,S_14,2022-03-09 23:25:00,2022-03-09 23:38:00,S_15,6086,3,4617415,CKB +LINE_5,S_15,2022-03-09 23:41:00,2022-03-09 23:55:00,S_14,6232,0,4617415,CKB +LINE_5,S_14,2022-03-09 23:55:00,2022-03-10 00:08:00,S_15,6086,0,4617415,CKB +LINE_5,S_15,2022-03-10 00:08:00,2022-03-10 00:08:00,DEPS_1,0.06,0,4617415,CKB +LINE_6,DEPS_1,2022-03-09 05:05:00,2022-03-09 05:05:00,S_16,0.06,0,4426846,CKB +LINE_6,S_16,2022-03-09 05:05:00,2022-03-09 05:14:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 05:14:00,2022-03-09 05:23:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 05:25:00,2022-03-09 05:34:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 05:34:00,2022-03-09 05:43:00,S_16,5139,23,4426846,CKB +LINE_6,S_16,2022-03-09 06:06:00,2022-03-09 06:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 06:15:00,2022-03-09 06:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 06:26:00,2022-03-09 06:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 06:35:00,2022-03-09 06:44:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 06:46:00,2022-03-09 06:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 06:55:00,2022-03-09 07:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 07:06:00,2022-03-09 07:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 07:15:00,2022-03-09 07:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 07:26:00,2022-03-09 07:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 07:35:00,2022-03-09 07:44:00,S_16,5139,22,4426846,CKB +LINE_6,S_16,2022-03-09 08:06:00,2022-03-09 08:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 08:15:00,2022-03-09 08:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 08:26:00,2022-03-09 08:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 08:35:00,2022-03-09 08:44:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 08:46:00,2022-03-09 08:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 08:55:00,2022-03-09 09:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 09:06:00,2022-03-09 09:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 09:15:00,2022-03-09 09:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 09:26:00,2022-03-09 09:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 09:35:00,2022-03-09 09:44:00,S_16,5139,22,4426846,CKB +LINE_6,S_16,2022-03-09 10:06:00,2022-03-09 10:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 10:15:00,2022-03-09 10:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 10:26:00,2022-03-09 10:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 10:35:00,2022-03-09 10:44:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 10:46:00,2022-03-09 10:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 10:55:00,2022-03-09 11:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 11:06:00,2022-03-09 11:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 11:15:00,2022-03-09 11:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 11:26:00,2022-03-09 11:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 11:35:00,2022-03-09 11:44:00,S_16,5139,22,4426846,CKB +LINE_6,S_16,2022-03-09 12:06:00,2022-03-09 12:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 12:15:00,2022-03-09 12:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 12:26:00,2022-03-09 12:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 12:35:00,2022-03-09 12:44:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 12:46:00,2022-03-09 12:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 12:55:00,2022-03-09 13:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 13:06:00,2022-03-09 13:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 13:15:00,2022-03-09 13:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 13:26:00,2022-03-09 13:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 13:35:00,2022-03-09 13:44:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 13:46:00,2022-03-09 13:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 13:55:00,2022-03-09 14:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 14:06:00,2022-03-09 14:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 14:15:00,2022-03-09 14:24:00,S_16,5139,22,4426846,CKB +LINE_6,S_16,2022-03-09 14:46:00,2022-03-09 14:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 14:55:00,2022-03-09 15:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 15:06:00,2022-03-09 15:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 15:15:00,2022-03-09 15:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 15:26:00,2022-03-09 15:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 15:35:00,2022-03-09 15:44:00,S_16,5139,22,4426846,CKB +LINE_6,S_16,2022-03-09 16:06:00,2022-03-09 16:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 16:15:00,2022-03-09 16:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 16:26:00,2022-03-09 16:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 16:35:00,2022-03-09 16:44:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 16:46:00,2022-03-09 16:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 16:55:00,2022-03-09 17:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 17:06:00,2022-03-09 17:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 17:15:00,2022-03-09 17:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 17:26:00,2022-03-09 17:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 17:35:00,2022-03-09 17:44:00,S_16,5139,22,4426846,CKB +LINE_6,S_16,2022-03-09 18:06:00,2022-03-09 18:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 18:15:00,2022-03-09 18:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 18:26:00,2022-03-09 18:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 18:35:00,2022-03-09 18:44:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 18:46:00,2022-03-09 18:55:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 18:55:00,2022-03-09 19:04:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 19:06:00,2022-03-09 19:15:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 19:15:00,2022-03-09 19:24:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 19:26:00,2022-03-09 19:35:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 19:35:00,2022-03-09 19:44:00,S_16,5139,21,4426846,CKB +LINE_6,S_16,2022-03-09 20:05:00,2022-03-09 20:14:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 20:14:00,2022-03-09 20:23:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 20:25:00,2022-03-09 20:34:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 20:34:00,2022-03-09 20:43:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 20:45:00,2022-03-09 20:54:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 20:54:00,2022-03-09 21:03:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 21:05:00,2022-03-09 21:14:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 21:14:00,2022-03-09 21:23:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 21:25:00,2022-03-09 21:34:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 21:34:00,2022-03-09 21:43:00,S_16,5139,22,4426846,CKB +LINE_6,S_16,2022-03-09 22:05:00,2022-03-09 22:14:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 22:14:00,2022-03-09 22:23:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 22:25:00,2022-03-09 22:34:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 22:34:00,2022-03-09 22:43:00,S_16,5139,2,4426846,CKB +LINE_6,S_16,2022-03-09 22:45:00,2022-03-09 22:54:00,S_17,4781,0,4426846,CKB +LINE_6,S_17,2022-03-09 22:54:00,2022-03-09 23:03:00,S_16,5139,0,4426846,CKB +LINE_6,S_16,2022-03-09 23:03:00,2022-03-09 23:03:00,DEPS_1,0.06,0,4426846,CKB +LINE_7,DEPS_1,2022-03-10 00:06:00,2022-03-10 00:06:00,S_18,0.06,0,4708596,CKB +LINE_7,S_18,2022-03-10 00:06:00,2022-03-10 00:27:00,S_19,7827,0,4708596,CKB +LINE_8,S_19,2022-03-10 00:27:00,2022-03-10 00:48:00,S_20,11079,0,4708596,CKB +LINE_8,S_20,2022-03-10 00:48:00,2022-03-10 01:25:00,OPPS_21,20641,8,4708596,CKB +LINE_8,OPPS_21,2022-03-10 01:33:00,2022-03-10 02:16:00,S_20,20579,1,4708596,CKB +LINE_8,S_20,2022-03-10 02:17:00,2022-03-10 02:55:00,OPPS_21,20641,8,4708596,CKB +LINE_8,OPPS_21,2022-03-10 03:03:00,2022-03-10 03:46:00,S_20,20579,1,4708596,CKB +LINE_8,S_20,2022-03-10 03:47:00,2022-03-10 04:25:00,OPPS_21,20641,0,4708596,CKB +LINE_8,OPPS_21,2022-03-10 04:25:00,2022-03-10 04:25:00,DEPS_1,0.06,0,4708596,CKB +LINE_9,DEPS_23,2022-03-09 05:15:00,2022-03-09 06:01:00,S_22,17.9,0,4317626,VDL +LINE_9,S_22,2022-03-09 06:01:00,2022-03-09 06:15:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 06:23:00,2022-03-09 06:37:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 06:41:00,2022-03-09 06:55:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 07:03:00,2022-03-09 07:17:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 07:21:00,2022-03-09 07:35:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 07:43:00,2022-03-09 07:57:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 08:01:00,2022-03-09 08:15:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 08:23:00,2022-03-09 08:37:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 08:41:00,2022-03-09 08:55:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 09:03:00,2022-03-09 09:17:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 09:21:00,2022-03-09 09:35:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 09:43:00,2022-03-09 09:57:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 10:01:00,2022-03-09 10:15:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 10:23:00,2022-03-09 10:37:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 10:41:00,2022-03-09 10:55:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 11:03:00,2022-03-09 11:17:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 11:21:00,2022-03-09 11:35:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 11:43:00,2022-03-09 11:57:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 12:01:00,2022-03-09 12:15:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 12:23:00,2022-03-09 12:37:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 12:41:00,2022-03-09 12:55:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 13:03:00,2022-03-09 13:17:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 13:21:00,2022-03-09 13:35:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 13:43:00,2022-03-09 13:57:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 14:01:00,2022-03-09 14:15:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 14:23:00,2022-03-09 14:37:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 14:41:00,2022-03-09 14:55:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 15:03:00,2022-03-09 15:17:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 15:21:00,2022-03-09 15:35:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 15:43:00,2022-03-09 15:57:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 16:01:00,2022-03-09 16:15:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 16:23:00,2022-03-09 16:37:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 16:41:00,2022-03-09 16:55:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 17:03:00,2022-03-09 17:17:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 17:21:00,2022-03-09 17:35:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 17:43:00,2022-03-09 17:57:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 18:01:00,2022-03-09 18:15:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 18:23:00,2022-03-09 18:37:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 18:41:00,2022-03-09 18:55:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 19:03:00,2022-03-09 19:17:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 19:21:00,2022-03-09 19:35:00,S_22,4637,8,4317626,VDL +LINE_9,S_22,2022-03-09 19:43:00,2022-03-09 19:57:00,S_22,4637,4,4317626,VDL +LINE_9,S_22,2022-03-09 20:01:00,2022-03-09 20:14:00,S_22,4637,9,4317626,VDL +LINE_9,S_22,2022-03-09 20:23:00,2022-03-09 20:36:00,S_22,4637,0,4317626,VDL +LINE_9,S_22,2022-03-09 20:36:00,2022-03-09 21:15:00,DEPS_23,19.8,0,4317626,VDL +LINE_10,DEPS_1,2022-03-09 04:56:00,2022-03-09 04:56:00,S_24,0.06,18,4425669,CKB +LINE_10,S_24,2022-03-09 05:14:00,2022-03-09 05:20:00,S_25,3.29,0,4425669,CKB +LINE_10,S_25,2022-03-09 05:20:00,2022-03-09 05:24:00,S_24,2954,20,4425669,CKB +LINE_10,S_24,2022-03-09 05:44:00,2022-03-09 05:50:00,S_25,3.29,0,4425669,CKB +LINE_10,S_25,2022-03-09 05:50:00,2022-03-09 05:54:00,S_24,2954,5,4425669,CKB +LINE_10,S_24,2022-03-09 05:59:00,2022-03-09 06:06:00,S_25,3.29,2,4425669,CKB +LINE_10,S_25,2022-03-09 06:08:00,2022-03-09 06:13:00,S_24,2954,19,4425669,CKB +LINE_10,S_24,2022-03-09 06:32:00,2022-03-09 06:39:00,S_25,3.29,1,4425669,CKB +LINE_10,S_25,2022-03-09 06:40:00,2022-03-09 06:45:00,S_24,2954,7,4425669,CKB +LINE_10,S_24,2022-03-09 06:52:00,2022-03-09 06:59:00,S_25,3.29,1,4425669,CKB +LINE_10,S_25,2022-03-09 07:00:00,2022-03-09 07:05:00,S_24,2954,7,4425669,CKB +LINE_10,S_24,2022-03-09 07:12:00,2022-03-09 07:19:00,S_25,3.29,1,4425669,CKB +LINE_10,S_25,2022-03-09 07:20:00,2022-03-09 07:25:00,S_24,2954,7,4425669,CKB +LINE_10,S_24,2022-03-09 07:32:00,2022-03-09 07:39:00,S_25,3.29,1,4425669,CKB +LINE_10,S_25,2022-03-09 07:40:00,2022-03-09 07:45:00,S_24,2954,295,4425669,CKB +LINE_10,S_24,2022-03-09 12:40:00,2022-03-09 12:47:00,S_25,3.29,2,4425669,CKB +LINE_10,S_25,2022-03-09 12:49:00,2022-03-09 12:54:00,S_24,2954,46,4425669,CKB +LINE_10,S_24,2022-03-09 13:40:00,2022-03-09 13:47:00,S_25,3.29,2,4425669,CKB +LINE_10,S_25,2022-03-09 13:49:00,2022-03-09 13:54:00,S_24,2954,434,4425669,CKB +LINE_10,S_24,2022-03-09 21:08:00,2022-03-09 21:08:00,DEPS_1,0.06,0,4425669,CKB +LINE_11,DEPS_1,2022-03-09 07:20:00,2022-03-09 07:20:00,OPPS_26,0.06,0,4448151,CKB +LINE_11,OPPS_26,2022-03-09 07:20:00,2022-03-09 07:50:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 08:00:00,2022-03-09 08:30:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 08:40:00,2022-03-09 09:10:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 09:20:00,2022-03-09 09:50:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 10:00:00,2022-03-09 10:30:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 10:40:00,2022-03-09 11:10:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 11:20:00,2022-03-09 11:50:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 12:00:00,2022-03-09 12:30:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 12:40:00,2022-03-09 13:10:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 13:20:00,2022-03-09 13:50:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 14:00:00,2022-03-09 14:30:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 14:40:00,2022-03-09 15:10:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 15:20:00,2022-03-09 15:50:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 16:00:00,2022-03-09 16:30:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 16:40:00,2022-03-09 17:10:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 17:20:00,2022-03-09 17:50:00,OPPS_26,9266,10,4448151,CKB +LINE_11,OPPS_26,2022-03-09 18:00:00,2022-03-09 18:30:00,OPPS_26,9266,0,4448151,CKB +LINE_11,OPPS_26,2022-03-09 18:30:00,2022-03-09 18:30:00,DEPS_1,0.06,0,4448151,CKB +LINE_12,DEPS_1,2022-03-09 07:10:00,2022-03-09 07:10:00,S_27,0.06,0,4733896,CKB +LINE_12,S_27,2022-03-09 07:10:00,2022-03-09 07:18:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 07:28:00,2022-03-09 07:40:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 07:40:00,2022-03-09 07:48:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 07:58:00,2022-03-09 08:10:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 08:10:00,2022-03-09 08:18:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 08:28:00,2022-03-09 08:40:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 08:40:00,2022-03-09 08:48:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 08:58:00,2022-03-09 09:10:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 09:10:00,2022-03-09 09:18:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 09:28:00,2022-03-09 09:40:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 09:40:00,2022-03-09 09:48:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 09:58:00,2022-03-09 10:10:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 10:10:00,2022-03-09 10:18:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 10:28:00,2022-03-09 10:40:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 10:40:00,2022-03-09 10:48:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 10:58:00,2022-03-09 11:10:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 11:10:00,2022-03-09 11:18:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 11:28:00,2022-03-09 11:40:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 11:40:00,2022-03-09 11:48:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 11:58:00,2022-03-09 12:10:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 12:10:00,2022-03-09 12:18:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 12:28:00,2022-03-09 12:40:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 12:40:00,2022-03-09 12:48:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 12:58:00,2022-03-09 13:10:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 13:10:00,2022-03-09 13:18:00,OPPS_28,2169,10,4733896,CKB +LINE_12,OPPS_28,2022-03-09 13:28:00,2022-03-09 13:40:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 13:40:00,2022-03-09 13:48:00,OPPS_28,2169,8,4733896,CKB +LINE_12,OPPS_28,2022-03-09 13:56:00,2022-03-09 14:10:00,S_27,2952,0,4733896,CKB +LINE_12,S_27,2022-03-09 14:10:00,2022-03-09 14:19:00,OPPS_28,2169,14,4733896,CKB +LINE_12,OPPS_28,2022-03-09 14:33:00,2022-03-09 14:47:00,S_27,2952,3,4733896,CKB +LINE_12,S_27,2022-03-09 14:50:00,2022-03-09 14:59:00,OPPS_28,2169,14,4733896,CKB +LINE_12,OPPS_28,2022-03-09 15:13:00,2022-03-09 15:27:00,S_27,2952,3,4733896,CKB +LINE_12,S_27,2022-03-09 15:30:00,2022-03-09 15:39:00,OPPS_28,2169,14,4733896,CKB +LINE_12,OPPS_28,2022-03-09 15:53:00,2022-03-09 16:07:00,S_27,2952,3,4733896,CKB +LINE_12,S_27,2022-03-09 16:10:00,2022-03-09 16:19:00,OPPS_28,2169,14,4733896,CKB +LINE_12,OPPS_28,2022-03-09 16:33:00,2022-03-09 16:47:00,S_27,2952,3,4733896,CKB +LINE_12,S_27,2022-03-09 16:50:00,2022-03-09 16:59:00,OPPS_28,2169,14,4733896,CKB +LINE_12,OPPS_28,2022-03-09 17:13:00,2022-03-09 17:27:00,S_27,2952,3,4733896,CKB +LINE_12,S_27,2022-03-09 17:30:00,2022-03-09 17:39:00,OPPS_28,2169,13,4733896,CKB +LINE_12,OPPS_28,2022-03-09 17:52:00,2022-03-09 18:05:00,S_27,2952,5,4733896,CKB +LINE_12,S_27,2022-03-09 18:10:00,2022-03-09 18:18:00,OPPS_28,2169,0,4733896,CKB +LINE_12,OPPS_28,2022-03-09 18:18:00,2022-03-09 18:18:00,DEPS_1,0.06,0,4733896,CKB +LINE_12,DEPS_1,2022-03-09 14:13:00,2022-03-09 14:13:00,OPPS_28,0.06,0,4734201,CKB +LINE_12,OPPS_28,2022-03-09 14:13:00,2022-03-09 14:27:00,S_27,2952,3,4734201,CKB +LINE_12,S_27,2022-03-09 14:30:00,2022-03-09 14:39:00,OPPS_28,2169,14,4734201,CKB +LINE_12,OPPS_28,2022-03-09 14:53:00,2022-03-09 15:07:00,S_27,2952,3,4734201,CKB +LINE_12,S_27,2022-03-09 15:10:00,2022-03-09 15:19:00,OPPS_28,2169,14,4734201,CKB +LINE_12,OPPS_28,2022-03-09 15:33:00,2022-03-09 15:47:00,S_27,2952,3,4734201,CKB +LINE_12,S_27,2022-03-09 15:50:00,2022-03-09 15:59:00,OPPS_28,2169,14,4734201,CKB +LINE_12,OPPS_28,2022-03-09 16:13:00,2022-03-09 16:27:00,S_27,2952,3,4734201,CKB +LINE_12,S_27,2022-03-09 16:30:00,2022-03-09 16:39:00,OPPS_28,2169,14,4734201,CKB +LINE_12,OPPS_28,2022-03-09 16:53:00,2022-03-09 17:07:00,S_27,2952,3,4734201,CKB +LINE_12,S_27,2022-03-09 17:10:00,2022-03-09 17:19:00,OPPS_28,2169,14,4734201,CKB +LINE_12,OPPS_28,2022-03-09 17:33:00,2022-03-09 17:47:00,S_27,2952,3,4734201,CKB +LINE_12,S_27,2022-03-09 17:50:00,2022-03-09 17:59:00,OPPS_28,2169,14,4734201,CKB +LINE_12,OPPS_28,2022-03-09 18:13:00,2022-03-09 18:25:00,S_27,2952,0,4734201,CKB +LINE_12,S_27,2022-03-09 18:25:00,2022-03-09 18:25:00,DEPS_1,0.06,0,4734201,CKB +LINE_13,DEPS_1,2022-03-10 00:23:00,2022-03-10 00:23:00,S_29,0.06,0,4318158,CKB +LINE_13,S_29,2022-03-10 00:23:00,2022-03-10 00:30:00,OPPS_30,2577,9,4318158,CKB +LINE_14,OPPS_30,2022-03-10 00:39:00,2022-03-10 00:54:00,S_31,5937,9,4318158,CKB +LINE_14,S_31,2022-03-10 01:03:00,2022-03-10 01:17:00,OPPS_30,6.19,0,4318158,CKB +LINE_13,OPPS_30,2022-03-10 01:17:00,2022-03-10 01:23:00,S_29,2555,0,4318158,CKB +LINE_13,S_29,2022-03-10 01:23:00,2022-03-10 01:30:00,OPPS_30,2577,9,4318158,CKB +LINE_14,OPPS_30,2022-03-10 01:39:00,2022-03-10 01:54:00,S_31,5937,9,4318158,CKB +LINE_14,S_31,2022-03-10 02:03:00,2022-03-10 02:17:00,OPPS_30,6.19,0,4318158,CKB +LINE_13,OPPS_30,2022-03-10 02:17:00,2022-03-10 02:23:00,S_29,2555,0,4318158,CKB +LINE_13,S_29,2022-03-10 02:23:00,2022-03-10 02:30:00,OPPS_30,2577,9,4318158,CKB +LINE_14,OPPS_30,2022-03-10 02:39:00,2022-03-10 02:54:00,S_31,5937,9,4318158,CKB +LINE_14,S_31,2022-03-10 03:03:00,2022-03-10 03:17:00,OPPS_30,6.19,0,4318158,CKB +LINE_13,OPPS_30,2022-03-10 03:17:00,2022-03-10 03:23:00,S_29,2555,0,4318158,CKB +LINE_13,S_29,2022-03-10 03:23:00,2022-03-10 03:30:00,OPPS_30,2577,9,4318158,CKB +LINE_14,OPPS_30,2022-03-10 03:39:00,2022-03-10 03:54:00,S_31,5937,9,4318158,CKB +LINE_14,S_31,2022-03-10 04:03:00,2022-03-10 04:17:00,OPPS_30,6.19,0,4318158,CKB +LINE_13,OPPS_30,2022-03-10 04:17:00,2022-03-10 04:23:00,S_29,2555,0,4318158,CKB +LINE_13,S_29,2022-03-10 04:23:00,2022-03-10 04:23:00,DEPS_1,0.06,0,4318158,CKB +LINE_14,DEPS_1,2022-03-10 00:33:00,2022-03-10 00:33:00,S_31,0.06,0,4318178,CKB +LINE_14,S_31,2022-03-10 00:33:00,2022-03-10 00:47:00,OPPS_30,6.19,0,4318178,CKB +LINE_13,OPPS_30,2022-03-10 00:47:00,2022-03-10 00:53:00,S_29,2555,0,4318178,CKB +LINE_13,S_29,2022-03-10 00:53:00,2022-03-10 01:00:00,OPPS_30,2577,9,4318178,CKB +LINE_14,OPPS_30,2022-03-10 01:09:00,2022-03-10 01:24:00,S_31,5937,9,4318178,CKB +LINE_14,S_31,2022-03-10 01:33:00,2022-03-10 01:47:00,OPPS_30,6.19,0,4318178,CKB +LINE_13,OPPS_30,2022-03-10 01:47:00,2022-03-10 01:53:00,S_29,2555,0,4318178,CKB +LINE_13,S_29,2022-03-10 01:53:00,2022-03-10 02:00:00,OPPS_30,2577,9,4318178,CKB +LINE_14,OPPS_30,2022-03-10 02:09:00,2022-03-10 02:24:00,S_31,5937,9,4318178,CKB +LINE_14,S_31,2022-03-10 02:33:00,2022-03-10 02:47:00,OPPS_30,6.19,0,4318178,CKB +LINE_13,OPPS_30,2022-03-10 02:47:00,2022-03-10 02:53:00,S_29,2555,0,4318178,CKB +LINE_13,S_29,2022-03-10 02:53:00,2022-03-10 03:00:00,OPPS_30,2577,9,4318178,CKB +LINE_14,OPPS_30,2022-03-10 03:09:00,2022-03-10 03:24:00,S_31,5937,9,4318178,CKB +LINE_14,S_31,2022-03-10 03:33:00,2022-03-10 03:47:00,OPPS_30,6.19,0,4318178,CKB +LINE_13,OPPS_30,2022-03-10 03:47:00,2022-03-10 03:53:00,S_29,2555,0,4318178,CKB +LINE_13,S_29,2022-03-10 03:53:00,2022-03-10 04:00:00,OPPS_30,2577,9,4318178,CKB +LINE_14,OPPS_30,2022-03-10 04:09:00,2022-03-10 04:24:00,S_31,5937,0,4318178,CKB +LINE_14,S_31,2022-03-10 04:24:00,2022-03-10 04:24:00,DEPS_1,0.06,0,4318178,CKB +LINE_15,DEPS_1,2022-03-10 00:57:00,2022-03-10 00:57:00,OPPS_32,0.06,0,4319353,CKB +LINE_15,OPPS_32,2022-03-10 00:57:00,2022-03-10 01:06:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 01:06:00,2022-03-10 01:11:00,OPPS_32,2936,16,4319353,CKB +LINE_15,OPPS_32,2022-03-10 01:27:00,2022-03-10 01:36:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 01:36:00,2022-03-10 01:41:00,OPPS_32,2936,16,4319353,CKB +LINE_15,OPPS_32,2022-03-10 01:57:00,2022-03-10 02:06:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 02:06:00,2022-03-10 02:11:00,OPPS_32,2936,16,4319353,CKB +LINE_15,OPPS_32,2022-03-10 02:27:00,2022-03-10 02:36:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 02:36:00,2022-03-10 02:41:00,OPPS_32,2936,16,4319353,CKB +LINE_15,OPPS_32,2022-03-10 02:57:00,2022-03-10 03:06:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 03:06:00,2022-03-10 03:11:00,OPPS_32,2936,16,4319353,CKB +LINE_15,OPPS_32,2022-03-10 03:27:00,2022-03-10 03:36:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 03:36:00,2022-03-10 03:41:00,OPPS_32,2936,16,4319353,CKB +LINE_15,OPPS_32,2022-03-10 03:57:00,2022-03-10 04:06:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 04:06:00,2022-03-10 04:11:00,OPPS_32,2936,16,4319353,CKB +LINE_15,OPPS_32,2022-03-10 04:27:00,2022-03-10 04:36:00,S_33,4343,0,4319353,CKB +LINE_15,S_33,2022-03-10 04:36:00,2022-03-10 04:36:00,DEPS_1,0.06,0,4319353,CKB +LINE_16,DEPS_1,2022-03-10 00:29:00,2022-03-10 00:29:00,S_34,0.06,0,4751088,CKB +LINE_16,S_34,2022-03-10 00:29:00,2022-03-10 00:41:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 00:47:00,2022-03-10 00:57:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 00:59:00,2022-03-10 01:11:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 01:17:00,2022-03-10 01:27:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 01:29:00,2022-03-10 01:41:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 01:47:00,2022-03-10 01:57:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 01:59:00,2022-03-10 02:11:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 02:17:00,2022-03-10 02:27:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 02:29:00,2022-03-10 02:41:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 02:47:00,2022-03-10 02:57:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 02:59:00,2022-03-10 03:11:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 03:17:00,2022-03-10 03:27:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 03:29:00,2022-03-10 03:41:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 03:47:00,2022-03-10 03:57:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 03:59:00,2022-03-10 04:11:00,S_35,4481,6,4751088,CKB +LINE_16,S_35,2022-03-10 04:17:00,2022-03-10 04:27:00,S_34,4031,2,4751088,CKB +LINE_16,S_34,2022-03-10 04:29:00,2022-03-10 04:41:00,S_35,4481,0,4751088,CKB +LINE_16,S_35,2022-03-10 04:41:00,2022-03-10 04:41:00,DEPS_1,0.06,0,4751088,CKB +LINE_17,DEPS_1,2022-03-10 00:30:00,2022-03-10 00:30:00,S_34,0.06,0,4453546,CKB +LINE_17,S_34,2022-03-10 00:30:00,2022-03-10 00:44:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 00:44:00,2022-03-10 00:57:00,S_34,5302,3,4453546,CKB +LINE_17,S_34,2022-03-10 01:00:00,2022-03-10 01:14:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 01:14:00,2022-03-10 01:27:00,S_34,5302,3,4453546,CKB +LINE_17,S_34,2022-03-10 01:30:00,2022-03-10 01:44:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 01:44:00,2022-03-10 01:57:00,S_34,5302,3,4453546,CKB +LINE_17,S_34,2022-03-10 02:00:00,2022-03-10 02:14:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 02:14:00,2022-03-10 02:27:00,S_34,5302,3,4453546,CKB +LINE_17,S_34,2022-03-10 02:30:00,2022-03-10 02:44:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 02:44:00,2022-03-10 02:57:00,S_34,5302,3,4453546,CKB +LINE_17,S_34,2022-03-10 03:00:00,2022-03-10 03:14:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 03:14:00,2022-03-10 03:27:00,S_34,5302,3,4453546,CKB +LINE_17,S_34,2022-03-10 03:30:00,2022-03-10 03:44:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 03:44:00,2022-03-10 03:57:00,S_34,5302,3,4453546,CKB +LINE_17,S_34,2022-03-10 04:00:00,2022-03-10 04:14:00,S_36,4801,0,4453546,CKB +LINE_17,S_36,2022-03-10 04:14:00,2022-03-10 04:27:00,S_34,5302,0,4453546,CKB +LINE_17,S_34,2022-03-10 04:27:00,2022-03-10 04:27:00,DEPS_1,0.06,0,4453546,CKB +LINE_18,DEPS_1,2022-03-10 00:43:00,2022-03-10 00:43:00,S_37,0.06,0,4374468,CKB +LINE_18,S_37,2022-03-10 00:43:00,2022-03-10 01:33:00,S_37,20434,10,4374468,CKB +LINE_18,S_37,2022-03-10 01:43:00,2022-03-10 02:33:00,S_37,20434,10,4374468,CKB +LINE_18,S_37,2022-03-10 02:43:00,2022-03-10 03:33:00,S_37,20434,10,4374468,CKB +LINE_18,S_37,2022-03-10 03:43:00,2022-03-10 04:33:00,S_37,20434,0,4374468,CKB +LINE_18,S_37,2022-03-10 04:33:00,2022-03-10 04:33:00,DEPS_1,0.06,0,4374468,CKB +LINE_18,DEPS_1,2022-03-10 00:13:00,2022-03-10 00:13:00,S_37,0.06,0,4374473,CKB +LINE_18,S_37,2022-03-10 00:13:00,2022-03-10 01:03:00,S_37,20434,10,4374473,CKB +LINE_18,S_37,2022-03-10 01:13:00,2022-03-10 02:03:00,S_37,20434,10,4374473,CKB +LINE_18,S_37,2022-03-10 02:13:00,2022-03-10 03:03:00,S_37,20434,10,4374473,CKB +LINE_18,S_37,2022-03-10 03:13:00,2022-03-10 04:03:00,S_37,20434,0,4374473,CKB +LINE_18,S_37,2022-03-10 04:03:00,2022-03-10 04:03:00,DEPS_1,0.06,0,4374473,CKB +LINE_19,DEPS_1,2022-03-10 00:24:00,2022-03-10 00:24:00,S_38,0.06,0,4456449,CKB +LINE_19,S_38,2022-03-10 00:24:00,2022-03-10 00:48:00,OPPS_39,11.86,4,4456449,CKB +LINE_19,OPPS_39,2022-03-10 00:52:00,2022-03-10 01:14:00,S_38,11139,10,4456449,CKB +LINE_19,S_38,2022-03-10 01:24:00,2022-03-10 01:48:00,OPPS_39,11.86,4,4456449,CKB +LINE_19,OPPS_39,2022-03-10 01:52:00,2022-03-10 02:14:00,S_38,11139,10,4456449,CKB +LINE_19,S_38,2022-03-10 02:24:00,2022-03-10 02:48:00,OPPS_39,11.86,4,4456449,CKB +LINE_19,OPPS_39,2022-03-10 02:52:00,2022-03-10 03:14:00,S_38,11139,10,4456449,CKB +LINE_19,S_38,2022-03-10 03:24:00,2022-03-10 03:48:00,OPPS_39,11.86,4,4456449,CKB +LINE_19,OPPS_39,2022-03-10 03:52:00,2022-03-10 04:14:00,S_38,11139,0,4456449,CKB +LINE_19,S_38,2022-03-10 04:14:00,2022-03-10 04:14:00,DEPS_1,0.06,0,4456449,CKB +LINE_19,DEPS_1,2022-03-10 00:22:00,2022-03-10 00:22:00,OPPS_39,0.06,0,4456457,CKB +LINE_19,OPPS_39,2022-03-10 00:22:00,2022-03-10 00:44:00,S_38,11139,10,4456457,CKB +LINE_19,S_38,2022-03-10 00:54:00,2022-03-10 01:18:00,OPPS_39,11.86,4,4456457,CKB +LINE_19,OPPS_39,2022-03-10 01:22:00,2022-03-10 01:44:00,S_38,11139,10,4456457,CKB +LINE_19,S_38,2022-03-10 01:54:00,2022-03-10 02:18:00,OPPS_39,11.86,4,4456457,CKB +LINE_19,OPPS_39,2022-03-10 02:22:00,2022-03-10 02:44:00,S_38,11139,10,4456457,CKB +LINE_19,S_38,2022-03-10 02:54:00,2022-03-10 03:18:00,OPPS_39,11.86,4,4456457,CKB +LINE_19,OPPS_39,2022-03-10 03:22:00,2022-03-10 03:44:00,S_38,11139,10,4456457,CKB +LINE_19,S_38,2022-03-10 03:54:00,2022-03-10 04:18:00,OPPS_39,11.86,4,4456457,CKB +LINE_19,OPPS_39,2022-03-10 04:22:00,2022-03-10 04:44:00,S_38,11139,0,4456457,CKB +LINE_19,S_38,2022-03-10 04:44:00,2022-03-10 04:44:00,DEPS_1,0.06,0,4456457,CKB +LINE_20,DEPS_1,2022-03-10 00:32:00,2022-03-10 00:32:00,S_13,0.06,0,4747651,CKB +LINE_20,S_13,2022-03-10 00:32:00,2022-03-10 00:44:00,S_40,4212,3,4747651,CKB +LINE_20,S_40,2022-03-10 00:47:00,2022-03-10 01:16:00,S_41,13048,0,4747651,CKB +LINE_20,S_41,2022-03-10 01:16:00,2022-03-10 01:42:00,S_40,12869,5,4747651,CKB +LINE_20,S_40,2022-03-10 01:47:00,2022-03-10 02:16:00,S_41,13048,0,4747651,CKB +LINE_20,S_41,2022-03-10 02:16:00,2022-03-10 02:42:00,S_40,12869,5,4747651,CKB +LINE_20,S_40,2022-03-10 02:47:00,2022-03-10 03:16:00,S_41,13048,0,4747651,CKB +LINE_20,S_41,2022-03-10 03:16:00,2022-03-10 03:42:00,S_40,12869,5,4747651,CKB +LINE_20,S_40,2022-03-10 03:47:00,2022-03-10 04:16:00,S_41,13048,0,4747651,CKB +LINE_20,S_41,2022-03-10 04:16:00,2022-03-10 04:34:00,DEPS_42,9538,0,4747651,CKB +LINE_20,DEPS_42,2022-03-10 04:34:00,2022-03-10 04:34:00,DEPS_1,0.06,0,4747651,CKB +LINE_20,DEPS_1,2022-03-10 00:17:00,2022-03-10 00:17:00,S_40,0.06,0,4747661,CKB +LINE_20,S_40,2022-03-10 00:17:00,2022-03-10 00:46:00,S_41,13048,0,4747661,CKB +LINE_20,S_41,2022-03-10 00:46:00,2022-03-10 01:12:00,S_40,12869,5,4747661,CKB +LINE_20,S_40,2022-03-10 01:17:00,2022-03-10 01:46:00,S_41,13048,0,4747661,CKB +LINE_20,S_41,2022-03-10 01:46:00,2022-03-10 02:12:00,S_40,12869,5,4747661,CKB +LINE_20,S_40,2022-03-10 02:17:00,2022-03-10 02:46:00,S_41,13048,0,4747661,CKB +LINE_20,S_41,2022-03-10 02:46:00,2022-03-10 03:12:00,S_40,12869,5,4747661,CKB +LINE_20,S_40,2022-03-10 03:17:00,2022-03-10 03:46:00,S_41,13048,0,4747661,CKB +LINE_20,S_41,2022-03-10 03:46:00,2022-03-10 04:12:00,S_40,12869,5,4747661,CKB +LINE_20,S_40,2022-03-10 04:17:00,2022-03-10 04:28:00,S_13,4316,0,4747661,CKB +LINE_20,S_13,2022-03-10 04:28:00,2022-03-10 04:28:00,DEPS_1,0.06,0,4747661,CKB +LINE_21,DEPS_1,2022-03-10 00:49:00,2022-03-10 00:49:00,OPPS_3,0.06,0,4434342,CKB +LINE_21,OPPS_3,2022-03-10 00:49:00,2022-03-10 01:04:00,S_16,10229,0,4434342,CKB +LINE_21,S_16,2022-03-10 01:04:00,2022-03-10 01:19:00,OPPS_3,11801,0,4434342,CKB +LINE_21,OPPS_3,2022-03-10 01:19:00,2022-03-10 01:34:00,S_16,10229,0,4434342,CKB +LINE_21,S_16,2022-03-10 01:34:00,2022-03-10 01:49:00,OPPS_3,11801,0,4434342,CKB +LINE_21,OPPS_3,2022-03-10 01:49:00,2022-03-10 02:04:00,S_16,10229,0,4434342,CKB +LINE_21,S_16,2022-03-10 02:04:00,2022-03-10 02:19:00,OPPS_3,11801,0,4434342,CKB +LINE_21,OPPS_3,2022-03-10 02:19:00,2022-03-10 02:34:00,S_16,10229,0,4434342,CKB +LINE_21,S_16,2022-03-10 02:34:00,2022-03-10 02:49:00,OPPS_3,11801,0,4434342,CKB +LINE_21,OPPS_3,2022-03-10 02:49:00,2022-03-10 03:04:00,S_16,10229,0,4434342,CKB +LINE_21,S_16,2022-03-10 03:04:00,2022-03-10 03:19:00,OPPS_3,11801,0,4434342,CKB +LINE_21,OPPS_3,2022-03-10 03:19:00,2022-03-10 03:34:00,S_16,10229,0,4434342,CKB +LINE_21,S_16,2022-03-10 03:34:00,2022-03-10 03:49:00,OPPS_3,11801,0,4434342,CKB +LINE_21,OPPS_3,2022-03-10 03:49:00,2022-03-10 04:04:00,S_16,10229,0,4434342,CKB +LINE_21,S_16,2022-03-10 04:04:00,2022-03-10 04:19:00,OPPS_3,11801,23,4434342,CKB +LINE_22,OPPS_3,2022-03-10 04:42:00,2022-03-10 05:04:00,S_43,6.81,0,4434342,CKB +LINE_22,S_43,2022-03-10 05:04:00,2022-03-10 05:04:00,DEPS_1,0.06,0,4434342,CKB +LINE_8,DEPS_1,2022-03-10 00:32:00,2022-03-10 00:32:00,S_13,0.06,0,4434898,CKB +LINE_8,S_13,2022-03-10 00:32:00,2022-03-10 00:57:00,OPPS_21,11545,6,4434898,CKB +LINE_8,OPPS_21,2022-03-10 01:03:00,2022-03-10 01:46:00,S_20,20579,1,4434898,CKB +LINE_8,S_20,2022-03-10 01:47:00,2022-03-10 02:25:00,OPPS_21,20641,8,4434898,CKB +LINE_8,OPPS_21,2022-03-10 02:33:00,2022-03-10 03:16:00,S_20,20579,1,4434898,CKB +LINE_8,S_20,2022-03-10 03:17:00,2022-03-10 03:55:00,OPPS_21,20641,8,4434898,CKB +LINE_8,OPPS_21,2022-03-10 04:03:00,2022-03-10 04:28:00,S_13,11499,0,4434898,CKB +LINE_8,S_13,2022-03-10 04:28:00,2022-03-10 04:28:00,DEPS_1,0.06,0,4434898,CKB +LINE_8,DEPS_1,2022-03-10 00:33:00,2022-03-10 00:33:00,OPPS_21,0.06,0,4434903,CKB +LINE_8,OPPS_21,2022-03-10 00:33:00,2022-03-10 01:16:00,S_20,20579,1,4434903,CKB +LINE_8,S_20,2022-03-10 01:17:00,2022-03-10 01:55:00,OPPS_21,20641,8,4434903,CKB +LINE_8,OPPS_21,2022-03-10 02:03:00,2022-03-10 02:46:00,S_20,20579,1,4434903,CKB +LINE_8,S_20,2022-03-10 02:47:00,2022-03-10 03:25:00,OPPS_21,20641,8,4434903,CKB +LINE_8,OPPS_21,2022-03-10 03:33:00,2022-03-10 04:16:00,S_20,20579,1,4434903,CKB +LINE_8,S_20,2022-03-10 04:17:00,2022-03-10 04:51:00,S_44,18752,0,4434903,CKB +LINE_8,S_44,2022-03-10 04:51:00,2022-03-10 04:51:00,DEPS_1,0.06,0,4434903,CKB +LINE_23,DEPS_1,2022-03-10 00:34:00,2022-03-10 00:34:00,S_45,0.06,0,4619767,CKB +LINE_23,S_45,2022-03-10 00:34:00,2022-03-10 01:00:00,S_46,9016,0,4619767,CKB +LINE_23,S_46,2022-03-10 01:00:00,2022-03-10 01:27:00,S_45,10083,7,4619767,CKB +LINE_23,S_45,2022-03-10 01:34:00,2022-03-10 02:00:00,S_46,9016,0,4619767,CKB +LINE_23,S_46,2022-03-10 02:00:00,2022-03-10 02:27:00,S_45,10083,7,4619767,CKB +LINE_23,S_45,2022-03-10 02:34:00,2022-03-10 03:00:00,S_46,9016,0,4619767,CKB +LINE_23,S_46,2022-03-10 03:00:00,2022-03-10 03:27:00,S_45,10083,7,4619767,CKB +LINE_23,S_45,2022-03-10 03:34:00,2022-03-10 04:00:00,S_46,9016,0,4619767,CKB +LINE_23,S_46,2022-03-10 04:00:00,2022-03-10 04:27:00,S_45,10083,0,4619767,CKB +LINE_23,S_45,2022-03-10 04:27:00,2022-03-10 04:27:00,DEPS_1,0.06,0,4619767,CKB +LINE_23,DEPS_1,2022-03-10 00:30:00,2022-03-10 00:30:00,S_46,0.06,0,4619992,CKB +LINE_23,S_46,2022-03-10 00:30:00,2022-03-10 00:57:00,S_45,10083,7,4619992,CKB +LINE_23,S_45,2022-03-10 01:04:00,2022-03-10 01:30:00,S_46,9016,0,4619992,CKB +LINE_23,S_46,2022-03-10 01:30:00,2022-03-10 01:57:00,S_45,10083,7,4619992,CKB +LINE_23,S_45,2022-03-10 02:04:00,2022-03-10 02:30:00,S_46,9016,0,4619992,CKB +LINE_23,S_46,2022-03-10 02:30:00,2022-03-10 02:57:00,S_45,10083,7,4619992,CKB +LINE_23,S_45,2022-03-10 03:04:00,2022-03-10 03:30:00,S_46,9016,0,4619992,CKB +LINE_23,S_46,2022-03-10 03:30:00,2022-03-10 03:57:00,S_45,10083,7,4619992,CKB +LINE_23,S_45,2022-03-10 04:04:00,2022-03-10 04:30:00,S_46,9016,0,4619992,CKB +LINE_23,S_46,2022-03-10 04:30:00,2022-03-10 04:57:00,S_45,10083,0,4619992,CKB +LINE_23,S_45,2022-03-10 04:57:00,2022-03-10 04:57:00,DEPS_1,0.06,0,4619992,CKB +LINE_24,DEPS_1,2022-03-10 00:31:00,2022-03-10 00:31:00,OPPS_21,0.06,0,4374745,CKB +LINE_24,OPPS_21,2022-03-10 00:31:00,2022-03-10 00:44:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 00:44:00,2022-03-10 00:56:00,OPPS_21,5362,5,4374745,CKB +LINE_24,OPPS_21,2022-03-10 01:01:00,2022-03-10 01:14:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 01:14:00,2022-03-10 01:26:00,OPPS_21,5362,5,4374745,CKB +LINE_24,OPPS_21,2022-03-10 01:31:00,2022-03-10 01:44:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 01:44:00,2022-03-10 01:56:00,OPPS_21,5362,5,4374745,CKB +LINE_24,OPPS_21,2022-03-10 02:01:00,2022-03-10 02:14:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 02:14:00,2022-03-10 02:26:00,OPPS_21,5362,5,4374745,CKB +LINE_24,OPPS_21,2022-03-10 02:31:00,2022-03-10 02:44:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 02:44:00,2022-03-10 02:56:00,OPPS_21,5362,5,4374745,CKB +LINE_24,OPPS_21,2022-03-10 03:01:00,2022-03-10 03:14:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 03:14:00,2022-03-10 03:26:00,OPPS_21,5362,5,4374745,CKB +LINE_24,OPPS_21,2022-03-10 03:31:00,2022-03-10 03:44:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 03:44:00,2022-03-10 03:56:00,OPPS_21,5362,5,4374745,CKB +LINE_24,OPPS_21,2022-03-10 04:01:00,2022-03-10 04:14:00,S_47,4872,0,4374745,CKB +LINE_24,S_47,2022-03-10 04:14:00,2022-03-10 04:26:00,OPPS_21,5362,0,4374745,CKB +LINE_24,OPPS_21,2022-03-10 04:26:00,2022-03-10 04:26:00,DEPS_1,0.06,0,4374745,CKB +LINE_25,DEPS_1,2022-03-10 00:31:00,2022-03-10 00:31:00,OPPS_21,0.06,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 00:31:00,2022-03-10 00:45:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 00:47:00,2022-03-10 01:01:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 01:01:00,2022-03-10 01:15:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 01:17:00,2022-03-10 01:31:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 01:31:00,2022-03-10 01:45:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 01:47:00,2022-03-10 02:01:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 02:01:00,2022-03-10 02:15:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 02:17:00,2022-03-10 02:31:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 02:31:00,2022-03-10 02:45:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 02:47:00,2022-03-10 03:01:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 03:01:00,2022-03-10 03:15:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 03:17:00,2022-03-10 03:31:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 03:31:00,2022-03-10 03:45:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 03:47:00,2022-03-10 04:01:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 04:01:00,2022-03-10 04:15:00,S_48,5225,2,4374868,CKB +LINE_25,S_48,2022-03-10 04:17:00,2022-03-10 04:31:00,OPPS_21,7617,0,4374868,CKB +LINE_25,OPPS_21,2022-03-10 04:31:00,2022-03-10 04:31:00,DEPS_1,0.06,0,4374868,CKB +LINE_26,DEPS_1,2022-03-10 00:43:00,2022-03-10 00:43:00,S_49,0.06,0,4375014,CKB +LINE_26,S_49,2022-03-10 00:43:00,2022-03-10 00:53:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 00:53:00,2022-03-10 01:03:00,S_49,4408,10,4375014,CKB +LINE_26,S_49,2022-03-10 01:13:00,2022-03-10 01:23:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 01:23:00,2022-03-10 01:33:00,S_49,4408,10,4375014,CKB +LINE_26,S_49,2022-03-10 01:43:00,2022-03-10 01:53:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 01:53:00,2022-03-10 02:03:00,S_49,4408,10,4375014,CKB +LINE_26,S_49,2022-03-10 02:13:00,2022-03-10 02:23:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 02:23:00,2022-03-10 02:33:00,S_49,4408,10,4375014,CKB +LINE_26,S_49,2022-03-10 02:43:00,2022-03-10 02:53:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 02:53:00,2022-03-10 03:03:00,S_49,4408,10,4375014,CKB +LINE_26,S_49,2022-03-10 03:13:00,2022-03-10 03:23:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 03:23:00,2022-03-10 03:33:00,S_49,4408,10,4375014,CKB +LINE_26,S_49,2022-03-10 03:43:00,2022-03-10 03:53:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 03:53:00,2022-03-10 04:03:00,S_49,4408,10,4375014,CKB +LINE_26,S_49,2022-03-10 04:13:00,2022-03-10 04:23:00,S_50,4507,0,4375014,CKB +LINE_26,S_50,2022-03-10 04:23:00,2022-03-10 04:33:00,S_49,4408,0,4375014,CKB +LINE_26,S_49,2022-03-10 04:33:00,2022-03-10 04:33:00,DEPS_1,0.06,0,4375014,CKB +LINE_0,DEPS_1,2022-03-10 21:31:00,2022-03-10 21:31:00,S_0,0.06,0,4454946,CKB +LINE_0,S_0,2022-03-10 21:31:00,2022-03-10 22:04:00,S_2,14519,4,4454946,CKB +LINE_0,S_2,2022-03-10 22:08:00,2022-03-10 22:43:00,S_0,13541,8,4454946,CKB +LINE_0,S_0,2022-03-10 22:51:00,2022-03-10 23:24:00,S_2,14519,4,4454946,CKB +LINE_0,S_2,2022-03-10 23:28:00,2022-03-11 00:03:00,S_0,13541,8,4454946,CKB +LINE_0,S_0,2022-03-11 00:11:00,2022-03-11 00:44:00,S_2,14519,0,4454946,CKB +LINE_1,S_2,2022-03-11 00:44:00,2022-03-11 00:54:00,OPPS_3,4.1,25,4454946,CKB +LINE_1,OPPS_3,2022-03-11 01:19:00,2022-03-11 01:42:00,S_4,8.36,6,4454946,CKB +LINE_1,S_4,2022-03-11 01:48:00,2022-03-11 02:06:00,OPPS_3,9067,13,4454946,CKB +LINE_1,OPPS_3,2022-03-11 02:19:00,2022-03-11 02:42:00,S_4,8.36,6,4454946,CKB +LINE_1,S_4,2022-03-11 02:48:00,2022-03-11 03:06:00,OPPS_3,9067,13,4454946,CKB +LINE_1,OPPS_3,2022-03-11 03:19:00,2022-03-11 03:42:00,S_4,8.36,6,4454946,CKB +LINE_1,S_4,2022-03-11 03:48:00,2022-03-11 04:06:00,OPPS_3,9067,0,4454946,CKB +LINE_1,OPPS_3,2022-03-11 04:06:00,2022-03-11 04:06:00,DEPS_1,0.06,0,4454946,CKB +LINE_0,DEPS_1,2022-03-10 22:11:00,2022-03-10 22:11:00,S_0,0.06,0,4454951,CKB +LINE_0,S_0,2022-03-10 22:11:00,2022-03-10 22:44:00,S_2,14519,4,4454951,CKB +LINE_0,S_2,2022-03-10 22:48:00,2022-03-10 23:23:00,S_0,13541,8,4454951,CKB +LINE_0,S_0,2022-03-10 23:31:00,2022-03-11 00:04:00,S_2,14519,4,4454951,CKB +LINE_0,S_2,2022-03-11 00:08:00,2022-03-11 00:39:00,S_5,12213,0,4454951,CKB +LINE_1,S_5,2022-03-11 00:39:00,2022-03-11 00:47:00,OPPS_3,4.0,2,4454951,CKB +LINE_1,OPPS_3,2022-03-11 00:49:00,2022-03-11 01:12:00,S_4,8.36,6,4454951,CKB +LINE_1,S_4,2022-03-11 01:18:00,2022-03-11 01:36:00,OPPS_3,9067,13,4454951,CKB +LINE_1,OPPS_3,2022-03-11 01:49:00,2022-03-11 02:12:00,S_4,8.36,6,4454951,CKB +LINE_1,S_4,2022-03-11 02:18:00,2022-03-11 02:36:00,OPPS_3,9067,13,4454951,CKB +LINE_1,OPPS_3,2022-03-11 02:49:00,2022-03-11 03:12:00,S_4,8.36,6,4454951,CKB +LINE_1,S_4,2022-03-11 03:18:00,2022-03-11 03:36:00,OPPS_3,9067,13,4454951,CKB +LINE_1,OPPS_3,2022-03-11 03:49:00,2022-03-11 04:12:00,S_4,8.36,0,4454951,CKB +LINE_1,S_4,2022-03-11 04:12:00,2022-03-11 04:12:00,DEPS_1,0.06,0,4454951,CKB +LINE_2,DEPS_1,2022-03-10 21:06:00,2022-03-10 21:06:00,S_6,0.06,0,4664625,CKB +LINE_2,S_6,2022-03-10 21:06:00,2022-03-10 21:34:00,S_7,13018,19,4664625,CKB +LINE_2,S_7,2022-03-10 21:53:00,2022-03-10 22:13:00,S_8,10332,17,4664625,CKB +LINE_2,S_8,2022-03-10 22:30:00,2022-03-10 22:54:00,S_7,10.48,19,4664625,CKB +LINE_2,S_7,2022-03-10 23:13:00,2022-03-10 23:33:00,S_8,10332,17,4664625,CKB +LINE_2,S_8,2022-03-10 23:50:00,2022-03-11 00:14:00,S_7,10.48,2,4664625,CKB +LINE_2,S_7,2022-03-11 00:16:00,2022-03-11 00:23:00,S_9,3709,5,4664625,CKB +LINE_3,S_9,2022-03-11 00:28:00,2022-03-11 00:44:00,OPPS_10,6404,3,4664625,CKB +LINE_3,OPPS_10,2022-03-11 00:47:00,2022-03-11 01:10:00,S_11,10579,7,4664625,CKB +LINE_3,S_11,2022-03-11 01:17:00,2022-03-11 01:44:00,OPPS_10,12007,3,4664625,CKB +LINE_3,OPPS_10,2022-03-11 01:47:00,2022-03-11 02:10:00,S_11,10579,7,4664625,CKB +LINE_3,S_11,2022-03-11 02:17:00,2022-03-11 02:44:00,OPPS_10,12007,3,4664625,CKB +LINE_3,OPPS_10,2022-03-11 02:47:00,2022-03-11 03:10:00,S_11,10579,7,4664625,CKB +LINE_3,S_11,2022-03-11 03:17:00,2022-03-11 03:44:00,OPPS_10,12007,3,4664625,CKB +LINE_3,OPPS_10,2022-03-11 03:47:00,2022-03-11 04:10:00,S_11,10579,7,4664625,CKB +LINE_3,S_11,2022-03-11 04:17:00,2022-03-11 04:44:00,OPPS_10,12007,0,4664625,CKB +LINE_3,OPPS_10,2022-03-11 04:44:00,2022-03-11 04:44:00,DEPS_1,0.06,0,4664625,CKB +LINE_2,DEPS_1,2022-03-10 20:26:00,2022-03-10 20:26:00,S_6,0.06,0,4762777,CKB +LINE_2,S_6,2022-03-10 20:26:00,2022-03-10 20:56:00,S_12,14097,14,4762777,CKB +LINE_2,S_12,2022-03-10 21:10:00,2022-03-10 21:38:00,S_6,13.19,8,4762777,CKB +LINE_2,S_6,2022-03-10 21:46:00,2022-03-10 22:14:00,S_7,13018,19,4762777,CKB +LINE_2,S_7,2022-03-10 22:33:00,2022-03-10 22:53:00,S_8,10332,17,4762777,CKB +LINE_2,S_8,2022-03-10 23:10:00,2022-03-10 23:34:00,S_7,10.48,19,4762777,CKB +LINE_2,S_7,2022-03-10 23:53:00,2022-03-11 00:13:00,S_8,10332,2,4762777,CKB +LINE_2,S_8,2022-03-11 00:15:00,2022-03-11 00:16:00,OPPS_10,506,1,4762777,CKB +LINE_3,OPPS_10,2022-03-11 00:17:00,2022-03-11 00:40:00,S_11,10579,7,4762777,CKB +LINE_3,S_11,2022-03-11 00:47:00,2022-03-11 01:14:00,OPPS_10,12007,3,4762777,CKB +LINE_3,OPPS_10,2022-03-11 01:17:00,2022-03-11 01:40:00,S_11,10579,7,4762777,CKB +LINE_3,S_11,2022-03-11 01:47:00,2022-03-11 02:14:00,OPPS_10,12007,3,4762777,CKB +LINE_3,OPPS_10,2022-03-11 02:17:00,2022-03-11 02:40:00,S_11,10579,7,4762777,CKB +LINE_3,S_11,2022-03-11 02:47:00,2022-03-11 03:14:00,OPPS_10,12007,3,4762777,CKB +LINE_3,OPPS_10,2022-03-11 03:17:00,2022-03-11 03:40:00,S_11,10579,7,4762777,CKB +LINE_3,S_11,2022-03-11 03:47:00,2022-03-11 04:14:00,OPPS_10,12007,3,4762777,CKB +LINE_3,OPPS_10,2022-03-11 04:17:00,2022-03-11 04:40:00,S_11,10579,3,4762777,CKB +LINE_4,S_11,2022-03-11 04:43:00,2022-03-11 04:58:00,S_13,6161,0,4762777,CKB +LINE_4,S_13,2022-03-11 04:58:00,2022-03-11 04:58:00,DEPS_1,0.06,0,4762777,CKB +LINE_5,DEPS_1,2022-03-10 22:56:00,2022-03-10 22:56:00,S_14,0.06,0,4617422,CKB +LINE_5,S_14,2022-03-10 22:56:00,2022-03-10 23:08:00,S_15,5882,3,4617422,CKB +LINE_5,S_15,2022-03-10 23:11:00,2022-03-10 23:25:00,S_14,6232,0,4617422,CKB +LINE_5,S_14,2022-03-10 23:25:00,2022-03-10 23:38:00,S_15,6086,3,4617422,CKB +LINE_5,S_15,2022-03-10 23:41:00,2022-03-10 23:55:00,S_14,6232,0,4617422,CKB +LINE_5,S_14,2022-03-10 23:55:00,2022-03-11 00:08:00,S_15,6086,0,4617422,CKB +LINE_5,S_15,2022-03-11 00:08:00,2022-03-11 00:08:00,DEPS_1,0.06,0,4617422,CKB +LINE_6,DEPS_1,2022-03-10 05:05:00,2022-03-10 05:05:00,S_16,0.06,0,4426847,CKB +LINE_6,S_16,2022-03-10 05:05:00,2022-03-10 05:14:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 05:14:00,2022-03-10 05:23:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 05:25:00,2022-03-10 05:34:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 05:34:00,2022-03-10 05:43:00,S_16,5139,23,4426847,CKB +LINE_6,S_16,2022-03-10 06:06:00,2022-03-10 06:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 06:15:00,2022-03-10 06:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 06:26:00,2022-03-10 06:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 06:35:00,2022-03-10 06:44:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 06:46:00,2022-03-10 06:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 06:55:00,2022-03-10 07:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 07:06:00,2022-03-10 07:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 07:15:00,2022-03-10 07:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 07:26:00,2022-03-10 07:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 07:35:00,2022-03-10 07:44:00,S_16,5139,22,4426847,CKB +LINE_6,S_16,2022-03-10 08:06:00,2022-03-10 08:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 08:15:00,2022-03-10 08:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 08:26:00,2022-03-10 08:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 08:35:00,2022-03-10 08:44:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 08:46:00,2022-03-10 08:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 08:55:00,2022-03-10 09:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 09:06:00,2022-03-10 09:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 09:15:00,2022-03-10 09:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 09:26:00,2022-03-10 09:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 09:35:00,2022-03-10 09:44:00,S_16,5139,22,4426847,CKB +LINE_6,S_16,2022-03-10 10:06:00,2022-03-10 10:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 10:15:00,2022-03-10 10:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 10:26:00,2022-03-10 10:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 10:35:00,2022-03-10 10:44:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 10:46:00,2022-03-10 10:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 10:55:00,2022-03-10 11:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 11:06:00,2022-03-10 11:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 11:15:00,2022-03-10 11:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 11:26:00,2022-03-10 11:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 11:35:00,2022-03-10 11:44:00,S_16,5139,22,4426847,CKB +LINE_6,S_16,2022-03-10 12:06:00,2022-03-10 12:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 12:15:00,2022-03-10 12:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 12:26:00,2022-03-10 12:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 12:35:00,2022-03-10 12:44:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 12:46:00,2022-03-10 12:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 12:55:00,2022-03-10 13:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 13:06:00,2022-03-10 13:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 13:15:00,2022-03-10 13:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 13:26:00,2022-03-10 13:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 13:35:00,2022-03-10 13:44:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 13:46:00,2022-03-10 13:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 13:55:00,2022-03-10 14:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 14:06:00,2022-03-10 14:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 14:15:00,2022-03-10 14:24:00,S_16,5139,22,4426847,CKB +LINE_6,S_16,2022-03-10 14:46:00,2022-03-10 14:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 14:55:00,2022-03-10 15:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 15:06:00,2022-03-10 15:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 15:15:00,2022-03-10 15:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 15:26:00,2022-03-10 15:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 15:35:00,2022-03-10 15:44:00,S_16,5139,22,4426847,CKB +LINE_6,S_16,2022-03-10 16:06:00,2022-03-10 16:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 16:15:00,2022-03-10 16:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 16:26:00,2022-03-10 16:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 16:35:00,2022-03-10 16:44:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 16:46:00,2022-03-10 16:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 16:55:00,2022-03-10 17:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 17:06:00,2022-03-10 17:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 17:15:00,2022-03-10 17:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 17:26:00,2022-03-10 17:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 17:35:00,2022-03-10 17:44:00,S_16,5139,22,4426847,CKB +LINE_6,S_16,2022-03-10 18:06:00,2022-03-10 18:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 18:15:00,2022-03-10 18:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 18:26:00,2022-03-10 18:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 18:35:00,2022-03-10 18:44:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 18:46:00,2022-03-10 18:55:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 18:55:00,2022-03-10 19:04:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 19:06:00,2022-03-10 19:15:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 19:15:00,2022-03-10 19:24:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 19:26:00,2022-03-10 19:35:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 19:35:00,2022-03-10 19:44:00,S_16,5139,21,4426847,CKB +LINE_6,S_16,2022-03-10 20:05:00,2022-03-10 20:14:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 20:14:00,2022-03-10 20:23:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 20:25:00,2022-03-10 20:34:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 20:34:00,2022-03-10 20:43:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 20:45:00,2022-03-10 20:54:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 20:54:00,2022-03-10 21:03:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 21:05:00,2022-03-10 21:14:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 21:14:00,2022-03-10 21:23:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 21:25:00,2022-03-10 21:34:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 21:34:00,2022-03-10 21:43:00,S_16,5139,22,4426847,CKB +LINE_6,S_16,2022-03-10 22:05:00,2022-03-10 22:14:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 22:14:00,2022-03-10 22:23:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 22:25:00,2022-03-10 22:34:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 22:34:00,2022-03-10 22:43:00,S_16,5139,2,4426847,CKB +LINE_6,S_16,2022-03-10 22:45:00,2022-03-10 22:54:00,S_17,4781,0,4426847,CKB +LINE_6,S_17,2022-03-10 22:54:00,2022-03-10 23:03:00,S_16,5139,0,4426847,CKB +LINE_6,S_16,2022-03-10 23:03:00,2022-03-10 23:03:00,DEPS_1,0.06,0,4426847,CKB +LINE_7,DEPS_1,2022-03-11 00:06:00,2022-03-11 00:06:00,S_18,0.06,0,4708597,CKB +LINE_7,S_18,2022-03-11 00:06:00,2022-03-11 00:27:00,S_19,7827,0,4708597,CKB +LINE_8,S_19,2022-03-11 00:27:00,2022-03-11 00:48:00,S_20,11079,0,4708597,CKB +LINE_8,S_20,2022-03-11 00:48:00,2022-03-11 01:25:00,OPPS_21,20641,8,4708597,CKB +LINE_8,OPPS_21,2022-03-11 01:33:00,2022-03-11 02:16:00,S_20,20579,1,4708597,CKB +LINE_8,S_20,2022-03-11 02:17:00,2022-03-11 02:55:00,OPPS_21,20641,8,4708597,CKB +LINE_8,OPPS_21,2022-03-11 03:03:00,2022-03-11 03:46:00,S_20,20579,1,4708597,CKB +LINE_8,S_20,2022-03-11 03:47:00,2022-03-11 04:25:00,OPPS_21,20641,0,4708597,CKB +LINE_8,OPPS_21,2022-03-11 04:25:00,2022-03-11 04:25:00,DEPS_1,0.06,0,4708597,CKB +LINE_9,DEPS_23,2022-03-10 05:15:00,2022-03-10 06:01:00,S_22,17.9,0,4317627,VDL +LINE_9,S_22,2022-03-10 06:01:00,2022-03-10 06:15:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 06:23:00,2022-03-10 06:37:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 06:41:00,2022-03-10 06:55:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 07:03:00,2022-03-10 07:17:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 07:21:00,2022-03-10 07:35:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 07:43:00,2022-03-10 07:57:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 08:01:00,2022-03-10 08:15:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 08:23:00,2022-03-10 08:37:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 08:41:00,2022-03-10 08:55:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 09:03:00,2022-03-10 09:17:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 09:21:00,2022-03-10 09:35:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 09:43:00,2022-03-10 09:57:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 10:01:00,2022-03-10 10:15:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 10:23:00,2022-03-10 10:37:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 10:41:00,2022-03-10 10:55:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 11:03:00,2022-03-10 11:17:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 11:21:00,2022-03-10 11:35:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 11:43:00,2022-03-10 11:57:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 12:01:00,2022-03-10 12:15:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 12:23:00,2022-03-10 12:37:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 12:41:00,2022-03-10 12:55:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 13:03:00,2022-03-10 13:17:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 13:21:00,2022-03-10 13:35:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 13:43:00,2022-03-10 13:57:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 14:01:00,2022-03-10 14:15:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 14:23:00,2022-03-10 14:37:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 14:41:00,2022-03-10 14:55:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 15:03:00,2022-03-10 15:17:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 15:21:00,2022-03-10 15:35:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 15:43:00,2022-03-10 15:57:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 16:01:00,2022-03-10 16:15:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 16:23:00,2022-03-10 16:37:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 16:41:00,2022-03-10 16:55:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 17:03:00,2022-03-10 17:17:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 17:21:00,2022-03-10 17:35:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 17:43:00,2022-03-10 17:57:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 18:01:00,2022-03-10 18:15:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 18:23:00,2022-03-10 18:37:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 18:41:00,2022-03-10 18:55:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 19:03:00,2022-03-10 19:17:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 19:21:00,2022-03-10 19:35:00,S_22,4637,8,4317627,VDL +LINE_9,S_22,2022-03-10 19:43:00,2022-03-10 19:57:00,S_22,4637,4,4317627,VDL +LINE_9,S_22,2022-03-10 20:01:00,2022-03-10 20:14:00,S_22,4637,9,4317627,VDL +LINE_9,S_22,2022-03-10 20:23:00,2022-03-10 20:36:00,S_22,4637,0,4317627,VDL +LINE_9,S_22,2022-03-10 20:36:00,2022-03-10 21:15:00,DEPS_23,19.8,0,4317627,VDL +LINE_10,DEPS_1,2022-03-10 04:56:00,2022-03-10 04:56:00,S_24,0.06,18,4425670,CKB +LINE_10,S_24,2022-03-10 05:14:00,2022-03-10 05:20:00,S_25,3.29,0,4425670,CKB +LINE_10,S_25,2022-03-10 05:20:00,2022-03-10 05:24:00,S_24,2954,20,4425670,CKB +LINE_10,S_24,2022-03-10 05:44:00,2022-03-10 05:50:00,S_25,3.29,0,4425670,CKB +LINE_10,S_25,2022-03-10 05:50:00,2022-03-10 05:54:00,S_24,2954,5,4425670,CKB +LINE_10,S_24,2022-03-10 05:59:00,2022-03-10 06:06:00,S_25,3.29,2,4425670,CKB +LINE_10,S_25,2022-03-10 06:08:00,2022-03-10 06:13:00,S_24,2954,19,4425670,CKB +LINE_10,S_24,2022-03-10 06:32:00,2022-03-10 06:39:00,S_25,3.29,1,4425670,CKB +LINE_10,S_25,2022-03-10 06:40:00,2022-03-10 06:45:00,S_24,2954,7,4425670,CKB +LINE_10,S_24,2022-03-10 06:52:00,2022-03-10 06:59:00,S_25,3.29,1,4425670,CKB +LINE_10,S_25,2022-03-10 07:00:00,2022-03-10 07:05:00,S_24,2954,7,4425670,CKB +LINE_10,S_24,2022-03-10 07:12:00,2022-03-10 07:19:00,S_25,3.29,1,4425670,CKB +LINE_10,S_25,2022-03-10 07:20:00,2022-03-10 07:25:00,S_24,2954,7,4425670,CKB +LINE_10,S_24,2022-03-10 07:32:00,2022-03-10 07:39:00,S_25,3.29,1,4425670,CKB +LINE_10,S_25,2022-03-10 07:40:00,2022-03-10 07:45:00,S_24,2954,295,4425670,CKB +LINE_10,S_24,2022-03-10 12:40:00,2022-03-10 12:47:00,S_25,3.29,2,4425670,CKB +LINE_10,S_25,2022-03-10 12:49:00,2022-03-10 12:54:00,S_24,2954,46,4425670,CKB +LINE_10,S_24,2022-03-10 13:40:00,2022-03-10 13:47:00,S_25,3.29,2,4425670,CKB +LINE_10,S_25,2022-03-10 13:49:00,2022-03-10 13:54:00,S_24,2954,434,4425670,CKB +LINE_10,S_24,2022-03-10 21:08:00,2022-03-10 21:08:00,DEPS_1,0.06,0,4425670,CKB +LINE_11,DEPS_1,2022-03-10 07:20:00,2022-03-10 07:20:00,OPPS_26,0.06,0,4448152,CKB +LINE_11,OPPS_26,2022-03-10 07:20:00,2022-03-10 07:50:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 08:00:00,2022-03-10 08:30:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 08:40:00,2022-03-10 09:10:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 09:20:00,2022-03-10 09:50:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 10:00:00,2022-03-10 10:30:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 10:40:00,2022-03-10 11:10:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 11:20:00,2022-03-10 11:50:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 12:00:00,2022-03-10 12:30:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 12:40:00,2022-03-10 13:10:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 13:20:00,2022-03-10 13:50:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 14:00:00,2022-03-10 14:30:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 14:40:00,2022-03-10 15:10:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 15:20:00,2022-03-10 15:50:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 16:00:00,2022-03-10 16:30:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 16:40:00,2022-03-10 17:10:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 17:20:00,2022-03-10 17:50:00,OPPS_26,9266,10,4448152,CKB +LINE_11,OPPS_26,2022-03-10 18:00:00,2022-03-10 18:30:00,OPPS_26,9266,0,4448152,CKB +LINE_11,OPPS_26,2022-03-10 18:30:00,2022-03-10 18:30:00,DEPS_1,0.06,0,4448152,CKB +LINE_12,DEPS_1,2022-03-10 07:10:00,2022-03-10 07:10:00,S_27,0.06,0,4733897,CKB +LINE_12,S_27,2022-03-10 07:10:00,2022-03-10 07:18:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 07:28:00,2022-03-10 07:40:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 07:40:00,2022-03-10 07:48:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 07:58:00,2022-03-10 08:10:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 08:10:00,2022-03-10 08:18:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 08:28:00,2022-03-10 08:40:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 08:40:00,2022-03-10 08:48:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 08:58:00,2022-03-10 09:10:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 09:10:00,2022-03-10 09:18:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 09:28:00,2022-03-10 09:40:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 09:40:00,2022-03-10 09:48:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 09:58:00,2022-03-10 10:10:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 10:10:00,2022-03-10 10:18:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 10:28:00,2022-03-10 10:40:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 10:40:00,2022-03-10 10:48:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 10:58:00,2022-03-10 11:10:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 11:10:00,2022-03-10 11:18:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 11:28:00,2022-03-10 11:40:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 11:40:00,2022-03-10 11:48:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 11:58:00,2022-03-10 12:10:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 12:10:00,2022-03-10 12:18:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 12:28:00,2022-03-10 12:40:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 12:40:00,2022-03-10 12:48:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 12:58:00,2022-03-10 13:10:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 13:10:00,2022-03-10 13:18:00,OPPS_28,2169,10,4733897,CKB +LINE_12,OPPS_28,2022-03-10 13:28:00,2022-03-10 13:40:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 13:40:00,2022-03-10 13:48:00,OPPS_28,2169,8,4733897,CKB +LINE_12,OPPS_28,2022-03-10 13:56:00,2022-03-10 14:10:00,S_27,2952,0,4733897,CKB +LINE_12,S_27,2022-03-10 14:10:00,2022-03-10 14:19:00,OPPS_28,2169,14,4733897,CKB +LINE_12,OPPS_28,2022-03-10 14:33:00,2022-03-10 14:47:00,S_27,2952,3,4733897,CKB +LINE_12,S_27,2022-03-10 14:50:00,2022-03-10 14:59:00,OPPS_28,2169,14,4733897,CKB +LINE_12,OPPS_28,2022-03-10 15:13:00,2022-03-10 15:27:00,S_27,2952,3,4733897,CKB +LINE_12,S_27,2022-03-10 15:30:00,2022-03-10 15:39:00,OPPS_28,2169,14,4733897,CKB +LINE_12,OPPS_28,2022-03-10 15:53:00,2022-03-10 16:07:00,S_27,2952,3,4733897,CKB +LINE_12,S_27,2022-03-10 16:10:00,2022-03-10 16:19:00,OPPS_28,2169,14,4733897,CKB +LINE_12,OPPS_28,2022-03-10 16:33:00,2022-03-10 16:47:00,S_27,2952,3,4733897,CKB +LINE_12,S_27,2022-03-10 16:50:00,2022-03-10 16:59:00,OPPS_28,2169,14,4733897,CKB +LINE_12,OPPS_28,2022-03-10 17:13:00,2022-03-10 17:27:00,S_27,2952,3,4733897,CKB +LINE_12,S_27,2022-03-10 17:30:00,2022-03-10 17:39:00,OPPS_28,2169,13,4733897,CKB +LINE_12,OPPS_28,2022-03-10 17:52:00,2022-03-10 18:05:00,S_27,2952,5,4733897,CKB +LINE_12,S_27,2022-03-10 18:10:00,2022-03-10 18:18:00,OPPS_28,2169,0,4733897,CKB +LINE_12,OPPS_28,2022-03-10 18:18:00,2022-03-10 18:18:00,DEPS_1,0.06,0,4733897,CKB +LINE_12,DEPS_1,2022-03-10 14:13:00,2022-03-10 14:13:00,OPPS_28,0.06,0,4734202,CKB +LINE_12,OPPS_28,2022-03-10 14:13:00,2022-03-10 14:27:00,S_27,2952,3,4734202,CKB +LINE_12,S_27,2022-03-10 14:30:00,2022-03-10 14:39:00,OPPS_28,2169,14,4734202,CKB +LINE_12,OPPS_28,2022-03-10 14:53:00,2022-03-10 15:07:00,S_27,2952,3,4734202,CKB +LINE_12,S_27,2022-03-10 15:10:00,2022-03-10 15:19:00,OPPS_28,2169,14,4734202,CKB +LINE_12,OPPS_28,2022-03-10 15:33:00,2022-03-10 15:47:00,S_27,2952,3,4734202,CKB +LINE_12,S_27,2022-03-10 15:50:00,2022-03-10 15:59:00,OPPS_28,2169,14,4734202,CKB +LINE_12,OPPS_28,2022-03-10 16:13:00,2022-03-10 16:27:00,S_27,2952,3,4734202,CKB +LINE_12,S_27,2022-03-10 16:30:00,2022-03-10 16:39:00,OPPS_28,2169,14,4734202,CKB +LINE_12,OPPS_28,2022-03-10 16:53:00,2022-03-10 17:07:00,S_27,2952,3,4734202,CKB +LINE_12,S_27,2022-03-10 17:10:00,2022-03-10 17:19:00,OPPS_28,2169,14,4734202,CKB +LINE_12,OPPS_28,2022-03-10 17:33:00,2022-03-10 17:47:00,S_27,2952,3,4734202,CKB +LINE_12,S_27,2022-03-10 17:50:00,2022-03-10 17:59:00,OPPS_28,2169,14,4734202,CKB +LINE_12,OPPS_28,2022-03-10 18:13:00,2022-03-10 18:25:00,S_27,2952,0,4734202,CKB +LINE_12,S_27,2022-03-10 18:25:00,2022-03-10 18:25:00,DEPS_1,0.06,0,4734202,CKB +LINE_13,DEPS_1,2022-03-11 00:23:00,2022-03-11 00:23:00,S_29,0.06,0,4318159,CKB +LINE_13,S_29,2022-03-11 00:23:00,2022-03-11 00:30:00,OPPS_30,2577,9,4318159,CKB +LINE_14,OPPS_30,2022-03-11 00:39:00,2022-03-11 00:54:00,S_31,5937,9,4318159,CKB +LINE_14,S_31,2022-03-11 01:03:00,2022-03-11 01:17:00,OPPS_30,6.19,0,4318159,CKB +LINE_13,OPPS_30,2022-03-11 01:17:00,2022-03-11 01:23:00,S_29,2555,0,4318159,CKB +LINE_13,S_29,2022-03-11 01:23:00,2022-03-11 01:30:00,OPPS_30,2577,9,4318159,CKB +LINE_14,OPPS_30,2022-03-11 01:39:00,2022-03-11 01:54:00,S_31,5937,9,4318159,CKB +LINE_14,S_31,2022-03-11 02:03:00,2022-03-11 02:17:00,OPPS_30,6.19,0,4318159,CKB +LINE_13,OPPS_30,2022-03-11 02:17:00,2022-03-11 02:23:00,S_29,2555,0,4318159,CKB +LINE_13,S_29,2022-03-11 02:23:00,2022-03-11 02:30:00,OPPS_30,2577,9,4318159,CKB +LINE_14,OPPS_30,2022-03-11 02:39:00,2022-03-11 02:54:00,S_31,5937,9,4318159,CKB +LINE_14,S_31,2022-03-11 03:03:00,2022-03-11 03:17:00,OPPS_30,6.19,0,4318159,CKB +LINE_13,OPPS_30,2022-03-11 03:17:00,2022-03-11 03:23:00,S_29,2555,0,4318159,CKB +LINE_13,S_29,2022-03-11 03:23:00,2022-03-11 03:30:00,OPPS_30,2577,9,4318159,CKB +LINE_14,OPPS_30,2022-03-11 03:39:00,2022-03-11 03:54:00,S_31,5937,9,4318159,CKB +LINE_14,S_31,2022-03-11 04:03:00,2022-03-11 04:17:00,OPPS_30,6.19,0,4318159,CKB +LINE_13,OPPS_30,2022-03-11 04:17:00,2022-03-11 04:23:00,S_29,2555,0,4318159,CKB +LINE_13,S_29,2022-03-11 04:23:00,2022-03-11 04:23:00,DEPS_1,0.06,0,4318159,CKB +LINE_14,DEPS_1,2022-03-11 00:33:00,2022-03-11 00:33:00,S_31,0.06,0,4318179,CKB +LINE_14,S_31,2022-03-11 00:33:00,2022-03-11 00:47:00,OPPS_30,6.19,0,4318179,CKB +LINE_13,OPPS_30,2022-03-11 00:47:00,2022-03-11 00:53:00,S_29,2555,0,4318179,CKB +LINE_13,S_29,2022-03-11 00:53:00,2022-03-11 01:00:00,OPPS_30,2577,9,4318179,CKB +LINE_14,OPPS_30,2022-03-11 01:09:00,2022-03-11 01:24:00,S_31,5937,9,4318179,CKB +LINE_14,S_31,2022-03-11 01:33:00,2022-03-11 01:47:00,OPPS_30,6.19,0,4318179,CKB +LINE_13,OPPS_30,2022-03-11 01:47:00,2022-03-11 01:53:00,S_29,2555,0,4318179,CKB +LINE_13,S_29,2022-03-11 01:53:00,2022-03-11 02:00:00,OPPS_30,2577,9,4318179,CKB +LINE_14,OPPS_30,2022-03-11 02:09:00,2022-03-11 02:24:00,S_31,5937,9,4318179,CKB +LINE_14,S_31,2022-03-11 02:33:00,2022-03-11 02:47:00,OPPS_30,6.19,0,4318179,CKB +LINE_13,OPPS_30,2022-03-11 02:47:00,2022-03-11 02:53:00,S_29,2555,0,4318179,CKB +LINE_13,S_29,2022-03-11 02:53:00,2022-03-11 03:00:00,OPPS_30,2577,9,4318179,CKB +LINE_14,OPPS_30,2022-03-11 03:09:00,2022-03-11 03:24:00,S_31,5937,9,4318179,CKB +LINE_14,S_31,2022-03-11 03:33:00,2022-03-11 03:47:00,OPPS_30,6.19,0,4318179,CKB +LINE_13,OPPS_30,2022-03-11 03:47:00,2022-03-11 03:53:00,S_29,2555,0,4318179,CKB +LINE_13,S_29,2022-03-11 03:53:00,2022-03-11 04:00:00,OPPS_30,2577,9,4318179,CKB +LINE_14,OPPS_30,2022-03-11 04:09:00,2022-03-11 04:24:00,S_31,5937,0,4318179,CKB +LINE_14,S_31,2022-03-11 04:24:00,2022-03-11 04:24:00,DEPS_1,0.06,0,4318179,CKB +LINE_15,DEPS_1,2022-03-11 00:57:00,2022-03-11 00:57:00,OPPS_32,0.06,0,4319354,CKB +LINE_15,OPPS_32,2022-03-11 00:57:00,2022-03-11 01:06:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 01:06:00,2022-03-11 01:11:00,OPPS_32,2936,16,4319354,CKB +LINE_15,OPPS_32,2022-03-11 01:27:00,2022-03-11 01:36:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 01:36:00,2022-03-11 01:41:00,OPPS_32,2936,16,4319354,CKB +LINE_15,OPPS_32,2022-03-11 01:57:00,2022-03-11 02:06:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 02:06:00,2022-03-11 02:11:00,OPPS_32,2936,16,4319354,CKB +LINE_15,OPPS_32,2022-03-11 02:27:00,2022-03-11 02:36:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 02:36:00,2022-03-11 02:41:00,OPPS_32,2936,16,4319354,CKB +LINE_15,OPPS_32,2022-03-11 02:57:00,2022-03-11 03:06:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 03:06:00,2022-03-11 03:11:00,OPPS_32,2936,16,4319354,CKB +LINE_15,OPPS_32,2022-03-11 03:27:00,2022-03-11 03:36:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 03:36:00,2022-03-11 03:41:00,OPPS_32,2936,16,4319354,CKB +LINE_15,OPPS_32,2022-03-11 03:57:00,2022-03-11 04:06:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 04:06:00,2022-03-11 04:11:00,OPPS_32,2936,16,4319354,CKB +LINE_15,OPPS_32,2022-03-11 04:27:00,2022-03-11 04:36:00,S_33,4343,0,4319354,CKB +LINE_15,S_33,2022-03-11 04:36:00,2022-03-11 04:36:00,DEPS_1,0.06,0,4319354,CKB +LINE_16,DEPS_1,2022-03-11 00:29:00,2022-03-11 00:29:00,S_34,0.06,0,4751089,CKB +LINE_16,S_34,2022-03-11 00:29:00,2022-03-11 00:41:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 00:47:00,2022-03-11 00:57:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 00:59:00,2022-03-11 01:11:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 01:17:00,2022-03-11 01:27:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 01:29:00,2022-03-11 01:41:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 01:47:00,2022-03-11 01:57:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 01:59:00,2022-03-11 02:11:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 02:17:00,2022-03-11 02:27:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 02:29:00,2022-03-11 02:41:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 02:47:00,2022-03-11 02:57:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 02:59:00,2022-03-11 03:11:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 03:17:00,2022-03-11 03:27:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 03:29:00,2022-03-11 03:41:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 03:47:00,2022-03-11 03:57:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 03:59:00,2022-03-11 04:11:00,S_35,4481,6,4751089,CKB +LINE_16,S_35,2022-03-11 04:17:00,2022-03-11 04:27:00,S_34,4031,2,4751089,CKB +LINE_16,S_34,2022-03-11 04:29:00,2022-03-11 04:41:00,S_35,4481,0,4751089,CKB +LINE_16,S_35,2022-03-11 04:41:00,2022-03-11 04:41:00,DEPS_1,0.06,0,4751089,CKB +LINE_17,DEPS_1,2022-03-11 00:30:00,2022-03-11 00:30:00,S_34,0.06,0,4453547,CKB +LINE_17,S_34,2022-03-11 00:30:00,2022-03-11 00:44:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 00:44:00,2022-03-11 00:57:00,S_34,5302,3,4453547,CKB +LINE_17,S_34,2022-03-11 01:00:00,2022-03-11 01:14:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 01:14:00,2022-03-11 01:27:00,S_34,5302,3,4453547,CKB +LINE_17,S_34,2022-03-11 01:30:00,2022-03-11 01:44:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 01:44:00,2022-03-11 01:57:00,S_34,5302,3,4453547,CKB +LINE_17,S_34,2022-03-11 02:00:00,2022-03-11 02:14:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 02:14:00,2022-03-11 02:27:00,S_34,5302,3,4453547,CKB +LINE_17,S_34,2022-03-11 02:30:00,2022-03-11 02:44:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 02:44:00,2022-03-11 02:57:00,S_34,5302,3,4453547,CKB +LINE_17,S_34,2022-03-11 03:00:00,2022-03-11 03:14:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 03:14:00,2022-03-11 03:27:00,S_34,5302,3,4453547,CKB +LINE_17,S_34,2022-03-11 03:30:00,2022-03-11 03:44:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 03:44:00,2022-03-11 03:57:00,S_34,5302,3,4453547,CKB +LINE_17,S_34,2022-03-11 04:00:00,2022-03-11 04:14:00,S_36,4801,0,4453547,CKB +LINE_17,S_36,2022-03-11 04:14:00,2022-03-11 04:27:00,S_34,5302,0,4453547,CKB +LINE_17,S_34,2022-03-11 04:27:00,2022-03-11 04:27:00,DEPS_1,0.06,0,4453547,CKB +LINE_18,DEPS_1,2022-03-11 00:43:00,2022-03-11 00:43:00,S_37,0.06,0,4374469,CKB +LINE_18,S_37,2022-03-11 00:43:00,2022-03-11 01:33:00,S_37,20434,10,4374469,CKB +LINE_18,S_37,2022-03-11 01:43:00,2022-03-11 02:33:00,S_37,20434,10,4374469,CKB +LINE_18,S_37,2022-03-11 02:43:00,2022-03-11 03:33:00,S_37,20434,10,4374469,CKB +LINE_18,S_37,2022-03-11 03:43:00,2022-03-11 04:33:00,S_37,20434,0,4374469,CKB +LINE_18,S_37,2022-03-11 04:33:00,2022-03-11 04:33:00,DEPS_1,0.06,0,4374469,CKB +LINE_18,DEPS_1,2022-03-11 00:13:00,2022-03-11 00:13:00,S_37,0.06,0,4374474,CKB +LINE_18,S_37,2022-03-11 00:13:00,2022-03-11 01:03:00,S_37,20434,10,4374474,CKB +LINE_18,S_37,2022-03-11 01:13:00,2022-03-11 02:03:00,S_37,20434,10,4374474,CKB +LINE_18,S_37,2022-03-11 02:13:00,2022-03-11 03:03:00,S_37,20434,10,4374474,CKB +LINE_18,S_37,2022-03-11 03:13:00,2022-03-11 04:03:00,S_37,20434,0,4374474,CKB +LINE_18,S_37,2022-03-11 04:03:00,2022-03-11 04:03:00,DEPS_1,0.06,0,4374474,CKB +LINE_19,DEPS_1,2022-03-11 00:24:00,2022-03-11 00:24:00,S_38,0.06,0,4456450,CKB +LINE_19,S_38,2022-03-11 00:24:00,2022-03-11 00:48:00,OPPS_39,11.86,4,4456450,CKB +LINE_19,OPPS_39,2022-03-11 00:52:00,2022-03-11 01:14:00,S_38,11139,10,4456450,CKB +LINE_19,S_38,2022-03-11 01:24:00,2022-03-11 01:48:00,OPPS_39,11.86,4,4456450,CKB +LINE_19,OPPS_39,2022-03-11 01:52:00,2022-03-11 02:14:00,S_38,11139,10,4456450,CKB +LINE_19,S_38,2022-03-11 02:24:00,2022-03-11 02:48:00,OPPS_39,11.86,4,4456450,CKB +LINE_19,OPPS_39,2022-03-11 02:52:00,2022-03-11 03:14:00,S_38,11139,10,4456450,CKB +LINE_19,S_38,2022-03-11 03:24:00,2022-03-11 03:48:00,OPPS_39,11.86,4,4456450,CKB +LINE_19,OPPS_39,2022-03-11 03:52:00,2022-03-11 04:14:00,S_38,11139,0,4456450,CKB +LINE_19,S_38,2022-03-11 04:14:00,2022-03-11 04:14:00,DEPS_1,0.06,0,4456450,CKB +LINE_19,DEPS_1,2022-03-11 00:22:00,2022-03-11 00:22:00,OPPS_39,0.06,0,4456458,CKB +LINE_19,OPPS_39,2022-03-11 00:22:00,2022-03-11 00:44:00,S_38,11139,10,4456458,CKB +LINE_19,S_38,2022-03-11 00:54:00,2022-03-11 01:18:00,OPPS_39,11.86,4,4456458,CKB +LINE_19,OPPS_39,2022-03-11 01:22:00,2022-03-11 01:44:00,S_38,11139,10,4456458,CKB +LINE_19,S_38,2022-03-11 01:54:00,2022-03-11 02:18:00,OPPS_39,11.86,4,4456458,CKB +LINE_19,OPPS_39,2022-03-11 02:22:00,2022-03-11 02:44:00,S_38,11139,10,4456458,CKB +LINE_19,S_38,2022-03-11 02:54:00,2022-03-11 03:18:00,OPPS_39,11.86,4,4456458,CKB +LINE_19,OPPS_39,2022-03-11 03:22:00,2022-03-11 03:44:00,S_38,11139,10,4456458,CKB +LINE_19,S_38,2022-03-11 03:54:00,2022-03-11 04:18:00,OPPS_39,11.86,4,4456458,CKB +LINE_19,OPPS_39,2022-03-11 04:22:00,2022-03-11 04:44:00,S_38,11139,0,4456458,CKB +LINE_19,S_38,2022-03-11 04:44:00,2022-03-11 04:44:00,DEPS_1,0.06,0,4456458,CKB +LINE_20,DEPS_1,2022-03-11 00:32:00,2022-03-11 00:32:00,S_13,0.06,0,4747652,CKB +LINE_20,S_13,2022-03-11 00:32:00,2022-03-11 00:44:00,S_40,4212,3,4747652,CKB +LINE_20,S_40,2022-03-11 00:47:00,2022-03-11 01:16:00,S_41,13048,0,4747652,CKB +LINE_20,S_41,2022-03-11 01:16:00,2022-03-11 01:42:00,S_40,12869,5,4747652,CKB +LINE_20,S_40,2022-03-11 01:47:00,2022-03-11 02:16:00,S_41,13048,0,4747652,CKB +LINE_20,S_41,2022-03-11 02:16:00,2022-03-11 02:42:00,S_40,12869,5,4747652,CKB +LINE_20,S_40,2022-03-11 02:47:00,2022-03-11 03:16:00,S_41,13048,0,4747652,CKB +LINE_20,S_41,2022-03-11 03:16:00,2022-03-11 03:42:00,S_40,12869,5,4747652,CKB +LINE_20,S_40,2022-03-11 03:47:00,2022-03-11 04:16:00,S_41,13048,0,4747652,CKB +LINE_20,S_41,2022-03-11 04:16:00,2022-03-11 04:34:00,DEPS_42,9538,0,4747652,CKB +LINE_20,DEPS_42,2022-03-11 04:34:00,2022-03-11 04:34:00,DEPS_1,0.06,0,4747652,CKB +LINE_20,DEPS_1,2022-03-11 00:17:00,2022-03-11 00:17:00,S_40,0.06,0,4747662,CKB +LINE_20,S_40,2022-03-11 00:17:00,2022-03-11 00:46:00,S_41,13048,0,4747662,CKB +LINE_20,S_41,2022-03-11 00:46:00,2022-03-11 01:12:00,S_40,12869,5,4747662,CKB +LINE_20,S_40,2022-03-11 01:17:00,2022-03-11 01:46:00,S_41,13048,0,4747662,CKB +LINE_20,S_41,2022-03-11 01:46:00,2022-03-11 02:12:00,S_40,12869,5,4747662,CKB +LINE_20,S_40,2022-03-11 02:17:00,2022-03-11 02:46:00,S_41,13048,0,4747662,CKB +LINE_20,S_41,2022-03-11 02:46:00,2022-03-11 03:12:00,S_40,12869,5,4747662,CKB +LINE_20,S_40,2022-03-11 03:17:00,2022-03-11 03:46:00,S_41,13048,0,4747662,CKB +LINE_20,S_41,2022-03-11 03:46:00,2022-03-11 04:12:00,S_40,12869,5,4747662,CKB +LINE_20,S_40,2022-03-11 04:17:00,2022-03-11 04:28:00,S_13,4316,0,4747662,CKB +LINE_20,S_13,2022-03-11 04:28:00,2022-03-11 04:28:00,DEPS_1,0.06,0,4747662,CKB +LINE_21,DEPS_1,2022-03-11 00:49:00,2022-03-11 00:49:00,OPPS_3,0.06,0,4434343,CKB +LINE_21,OPPS_3,2022-03-11 00:49:00,2022-03-11 01:04:00,S_16,10229,0,4434343,CKB +LINE_21,S_16,2022-03-11 01:04:00,2022-03-11 01:19:00,OPPS_3,11801,0,4434343,CKB +LINE_21,OPPS_3,2022-03-11 01:19:00,2022-03-11 01:34:00,S_16,10229,0,4434343,CKB +LINE_21,S_16,2022-03-11 01:34:00,2022-03-11 01:49:00,OPPS_3,11801,0,4434343,CKB +LINE_21,OPPS_3,2022-03-11 01:49:00,2022-03-11 02:04:00,S_16,10229,0,4434343,CKB +LINE_21,S_16,2022-03-11 02:04:00,2022-03-11 02:19:00,OPPS_3,11801,0,4434343,CKB +LINE_21,OPPS_3,2022-03-11 02:19:00,2022-03-11 02:34:00,S_16,10229,0,4434343,CKB +LINE_21,S_16,2022-03-11 02:34:00,2022-03-11 02:49:00,OPPS_3,11801,0,4434343,CKB +LINE_21,OPPS_3,2022-03-11 02:49:00,2022-03-11 03:04:00,S_16,10229,0,4434343,CKB +LINE_21,S_16,2022-03-11 03:04:00,2022-03-11 03:19:00,OPPS_3,11801,0,4434343,CKB +LINE_21,OPPS_3,2022-03-11 03:19:00,2022-03-11 03:34:00,S_16,10229,0,4434343,CKB +LINE_21,S_16,2022-03-11 03:34:00,2022-03-11 03:49:00,OPPS_3,11801,0,4434343,CKB +LINE_21,OPPS_3,2022-03-11 03:49:00,2022-03-11 04:04:00,S_16,10229,0,4434343,CKB +LINE_21,S_16,2022-03-11 04:04:00,2022-03-11 04:19:00,OPPS_3,11801,23,4434343,CKB +LINE_22,OPPS_3,2022-03-11 04:42:00,2022-03-11 05:04:00,S_43,6.81,0,4434343,CKB +LINE_22,S_43,2022-03-11 05:04:00,2022-03-11 05:04:00,DEPS_1,0.06,0,4434343,CKB +LINE_8,DEPS_1,2022-03-11 00:32:00,2022-03-11 00:32:00,S_13,0.06,0,4434899,CKB +LINE_8,S_13,2022-03-11 00:32:00,2022-03-11 00:57:00,OPPS_21,11545,6,4434899,CKB +LINE_8,OPPS_21,2022-03-11 01:03:00,2022-03-11 01:46:00,S_20,20579,1,4434899,CKB +LINE_8,S_20,2022-03-11 01:47:00,2022-03-11 02:25:00,OPPS_21,20641,8,4434899,CKB +LINE_8,OPPS_21,2022-03-11 02:33:00,2022-03-11 03:16:00,S_20,20579,1,4434899,CKB +LINE_8,S_20,2022-03-11 03:17:00,2022-03-11 03:55:00,OPPS_21,20641,8,4434899,CKB +LINE_8,OPPS_21,2022-03-11 04:03:00,2022-03-11 04:28:00,S_13,11499,0,4434899,CKB +LINE_8,S_13,2022-03-11 04:28:00,2022-03-11 04:28:00,DEPS_1,0.06,0,4434899,CKB +LINE_8,DEPS_1,2022-03-11 00:33:00,2022-03-11 00:33:00,OPPS_21,0.06,0,4434904,CKB +LINE_8,OPPS_21,2022-03-11 00:33:00,2022-03-11 01:16:00,S_20,20579,1,4434904,CKB +LINE_8,S_20,2022-03-11 01:17:00,2022-03-11 01:55:00,OPPS_21,20641,8,4434904,CKB +LINE_8,OPPS_21,2022-03-11 02:03:00,2022-03-11 02:46:00,S_20,20579,1,4434904,CKB +LINE_8,S_20,2022-03-11 02:47:00,2022-03-11 03:25:00,OPPS_21,20641,8,4434904,CKB +LINE_8,OPPS_21,2022-03-11 03:33:00,2022-03-11 04:16:00,S_20,20579,1,4434904,CKB +LINE_8,S_20,2022-03-11 04:17:00,2022-03-11 04:51:00,S_44,18752,0,4434904,CKB +LINE_8,S_44,2022-03-11 04:51:00,2022-03-11 04:51:00,DEPS_1,0.06,0,4434904,CKB +LINE_23,DEPS_1,2022-03-11 00:34:00,2022-03-11 00:34:00,S_45,0.06,0,4619768,CKB +LINE_23,S_45,2022-03-11 00:34:00,2022-03-11 01:00:00,S_46,9016,0,4619768,CKB +LINE_23,S_46,2022-03-11 01:00:00,2022-03-11 01:27:00,S_45,10083,7,4619768,CKB +LINE_23,S_45,2022-03-11 01:34:00,2022-03-11 02:00:00,S_46,9016,0,4619768,CKB +LINE_23,S_46,2022-03-11 02:00:00,2022-03-11 02:27:00,S_45,10083,7,4619768,CKB +LINE_23,S_45,2022-03-11 02:34:00,2022-03-11 03:00:00,S_46,9016,0,4619768,CKB +LINE_23,S_46,2022-03-11 03:00:00,2022-03-11 03:27:00,S_45,10083,7,4619768,CKB +LINE_23,S_45,2022-03-11 03:34:00,2022-03-11 04:00:00,S_46,9016,0,4619768,CKB +LINE_23,S_46,2022-03-11 04:00:00,2022-03-11 04:27:00,S_45,10083,0,4619768,CKB +LINE_23,S_45,2022-03-11 04:27:00,2022-03-11 04:27:00,DEPS_1,0.06,0,4619768,CKB +LINE_23,DEPS_1,2022-03-11 00:30:00,2022-03-11 00:30:00,S_46,0.06,0,4619993,CKB +LINE_23,S_46,2022-03-11 00:30:00,2022-03-11 00:57:00,S_45,10083,7,4619993,CKB +LINE_23,S_45,2022-03-11 01:04:00,2022-03-11 01:30:00,S_46,9016,0,4619993,CKB +LINE_23,S_46,2022-03-11 01:30:00,2022-03-11 01:57:00,S_45,10083,7,4619993,CKB +LINE_23,S_45,2022-03-11 02:04:00,2022-03-11 02:30:00,S_46,9016,0,4619993,CKB +LINE_23,S_46,2022-03-11 02:30:00,2022-03-11 02:57:00,S_45,10083,7,4619993,CKB +LINE_23,S_45,2022-03-11 03:04:00,2022-03-11 03:30:00,S_46,9016,0,4619993,CKB +LINE_23,S_46,2022-03-11 03:30:00,2022-03-11 03:57:00,S_45,10083,7,4619993,CKB +LINE_23,S_45,2022-03-11 04:04:00,2022-03-11 04:30:00,S_46,9016,0,4619993,CKB +LINE_23,S_46,2022-03-11 04:30:00,2022-03-11 04:57:00,S_45,10083,0,4619993,CKB +LINE_23,S_45,2022-03-11 04:57:00,2022-03-11 04:57:00,DEPS_1,0.06,0,4619993,CKB +LINE_24,DEPS_1,2022-03-11 00:31:00,2022-03-11 00:31:00,OPPS_21,0.06,0,4374746,CKB +LINE_24,OPPS_21,2022-03-11 00:31:00,2022-03-11 00:44:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 00:44:00,2022-03-11 00:56:00,OPPS_21,5362,5,4374746,CKB +LINE_24,OPPS_21,2022-03-11 01:01:00,2022-03-11 01:14:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 01:14:00,2022-03-11 01:26:00,OPPS_21,5362,5,4374746,CKB +LINE_24,OPPS_21,2022-03-11 01:31:00,2022-03-11 01:44:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 01:44:00,2022-03-11 01:56:00,OPPS_21,5362,5,4374746,CKB +LINE_24,OPPS_21,2022-03-11 02:01:00,2022-03-11 02:14:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 02:14:00,2022-03-11 02:26:00,OPPS_21,5362,5,4374746,CKB +LINE_24,OPPS_21,2022-03-11 02:31:00,2022-03-11 02:44:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 02:44:00,2022-03-11 02:56:00,OPPS_21,5362,5,4374746,CKB +LINE_24,OPPS_21,2022-03-11 03:01:00,2022-03-11 03:14:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 03:14:00,2022-03-11 03:26:00,OPPS_21,5362,5,4374746,CKB +LINE_24,OPPS_21,2022-03-11 03:31:00,2022-03-11 03:44:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 03:44:00,2022-03-11 03:56:00,OPPS_21,5362,5,4374746,CKB +LINE_24,OPPS_21,2022-03-11 04:01:00,2022-03-11 04:14:00,S_47,4872,0,4374746,CKB +LINE_24,S_47,2022-03-11 04:14:00,2022-03-11 04:26:00,OPPS_21,5362,0,4374746,CKB +LINE_24,OPPS_21,2022-03-11 04:26:00,2022-03-11 04:26:00,DEPS_1,0.06,0,4374746,CKB +LINE_25,DEPS_1,2022-03-11 00:31:00,2022-03-11 00:31:00,OPPS_21,0.06,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 00:31:00,2022-03-11 00:45:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 00:47:00,2022-03-11 01:01:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 01:01:00,2022-03-11 01:15:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 01:17:00,2022-03-11 01:31:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 01:31:00,2022-03-11 01:45:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 01:47:00,2022-03-11 02:01:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 02:01:00,2022-03-11 02:15:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 02:17:00,2022-03-11 02:31:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 02:31:00,2022-03-11 02:45:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 02:47:00,2022-03-11 03:01:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 03:01:00,2022-03-11 03:15:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 03:17:00,2022-03-11 03:31:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 03:31:00,2022-03-11 03:45:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 03:47:00,2022-03-11 04:01:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 04:01:00,2022-03-11 04:15:00,S_48,5225,2,4374869,CKB +LINE_25,S_48,2022-03-11 04:17:00,2022-03-11 04:31:00,OPPS_21,7617,0,4374869,CKB +LINE_25,OPPS_21,2022-03-11 04:31:00,2022-03-11 04:31:00,DEPS_1,0.06,0,4374869,CKB +LINE_26,DEPS_1,2022-03-11 00:43:00,2022-03-11 00:43:00,S_49,0.06,0,4375015,CKB +LINE_26,S_49,2022-03-11 00:43:00,2022-03-11 00:53:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 00:53:00,2022-03-11 01:03:00,S_49,4408,10,4375015,CKB +LINE_26,S_49,2022-03-11 01:13:00,2022-03-11 01:23:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 01:23:00,2022-03-11 01:33:00,S_49,4408,10,4375015,CKB +LINE_26,S_49,2022-03-11 01:43:00,2022-03-11 01:53:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 01:53:00,2022-03-11 02:03:00,S_49,4408,10,4375015,CKB +LINE_26,S_49,2022-03-11 02:13:00,2022-03-11 02:23:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 02:23:00,2022-03-11 02:33:00,S_49,4408,10,4375015,CKB +LINE_26,S_49,2022-03-11 02:43:00,2022-03-11 02:53:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 02:53:00,2022-03-11 03:03:00,S_49,4408,10,4375015,CKB +LINE_26,S_49,2022-03-11 03:13:00,2022-03-11 03:23:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 03:23:00,2022-03-11 03:33:00,S_49,4408,10,4375015,CKB +LINE_26,S_49,2022-03-11 03:43:00,2022-03-11 03:53:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 03:53:00,2022-03-11 04:03:00,S_49,4408,10,4375015,CKB +LINE_26,S_49,2022-03-11 04:13:00,2022-03-11 04:23:00,S_50,4507,0,4375015,CKB +LINE_26,S_50,2022-03-11 04:23:00,2022-03-11 04:33:00,S_49,4408,0,4375015,CKB +LINE_26,S_49,2022-03-11 04:33:00,2022-03-11 04:33:00,DEPS_1,0.06,0,4375015,CKB +LINE_0,DEPS_1,2022-03-11 21:31:00,2022-03-11 21:31:00,S_0,0.06,0,4454947,CKB +LINE_0,S_0,2022-03-11 21:31:00,2022-03-11 22:04:00,S_2,14519,4,4454947,CKB +LINE_0,S_2,2022-03-11 22:08:00,2022-03-11 22:43:00,S_0,13541,8,4454947,CKB +LINE_0,S_0,2022-03-11 22:51:00,2022-03-11 23:24:00,S_2,14519,4,4454947,CKB +LINE_0,S_2,2022-03-11 23:28:00,2022-03-12 00:03:00,S_0,13541,8,4454947,CKB +LINE_0,S_0,2022-03-12 00:11:00,2022-03-12 00:44:00,S_2,14519,0,4454947,CKB +LINE_1,S_2,2022-03-12 00:44:00,2022-03-12 00:54:00,OPPS_3,4.1,25,4454947,CKB +LINE_1,OPPS_3,2022-03-12 01:19:00,2022-03-12 01:42:00,S_4,8.36,6,4454947,CKB +LINE_1,S_4,2022-03-12 01:48:00,2022-03-12 02:06:00,OPPS_3,9067,13,4454947,CKB +LINE_1,OPPS_3,2022-03-12 02:19:00,2022-03-12 02:42:00,S_4,8.36,6,4454947,CKB +LINE_1,S_4,2022-03-12 02:48:00,2022-03-12 03:06:00,OPPS_3,9067,13,4454947,CKB +LINE_1,OPPS_3,2022-03-12 03:19:00,2022-03-12 03:42:00,S_4,8.36,6,4454947,CKB +LINE_1,S_4,2022-03-12 03:48:00,2022-03-12 04:06:00,OPPS_3,9067,13,4454947,CKB +LINE_1,OPPS_3,2022-03-12 04:19:00,2022-03-12 04:42:00,S_4,8.36,6,4454947,CKB +LINE_1,S_4,2022-03-12 04:48:00,2022-03-12 05:06:00,OPPS_3,9067,13,4454947,CKB +LINE_1,OPPS_3,2022-03-12 05:19:00,2022-03-12 05:42:00,S_4,8.36,16,4454947,CKB +LINE_22,S_4,2022-03-12 05:58:00,2022-03-12 06:34:00,S_43,12968,0,4454947,CKB +LINE_22,S_43,2022-03-12 06:34:00,2022-03-12 06:34:00,DEPS_1,0.06,0,4454947,CKB +LINE_0,DEPS_1,2022-03-11 22:11:00,2022-03-11 22:11:00,S_0,0.06,0,4454952,CKB +LINE_0,S_0,2022-03-11 22:11:00,2022-03-11 22:44:00,S_2,14519,4,4454952,CKB +LINE_0,S_2,2022-03-11 22:48:00,2022-03-11 23:23:00,S_0,13541,8,4454952,CKB +LINE_0,S_0,2022-03-11 23:31:00,2022-03-12 00:04:00,S_2,14519,4,4454952,CKB +LINE_0,S_2,2022-03-12 00:08:00,2022-03-12 00:39:00,S_5,12213,0,4454952,CKB +LINE_1,S_5,2022-03-12 00:39:00,2022-03-12 00:47:00,OPPS_3,4.0,2,4454952,CKB +LINE_1,OPPS_3,2022-03-12 00:49:00,2022-03-12 01:12:00,S_4,8.36,6,4454952,CKB +LINE_1,S_4,2022-03-12 01:18:00,2022-03-12 01:36:00,OPPS_3,9067,13,4454952,CKB +LINE_1,OPPS_3,2022-03-12 01:49:00,2022-03-12 02:12:00,S_4,8.36,6,4454952,CKB +LINE_1,S_4,2022-03-12 02:18:00,2022-03-12 02:36:00,OPPS_3,9067,13,4454952,CKB +LINE_1,OPPS_3,2022-03-12 02:49:00,2022-03-12 03:12:00,S_4,8.36,6,4454952,CKB +LINE_1,S_4,2022-03-12 03:18:00,2022-03-12 03:36:00,OPPS_3,9067,13,4454952,CKB +LINE_1,OPPS_3,2022-03-12 03:49:00,2022-03-12 04:12:00,S_4,8.36,6,4454952,CKB +LINE_1,S_4,2022-03-12 04:18:00,2022-03-12 04:36:00,OPPS_3,9067,13,4454952,CKB +LINE_1,OPPS_3,2022-03-12 04:49:00,2022-03-12 05:12:00,S_4,8.36,6,4454952,CKB +LINE_1,S_4,2022-03-12 05:18:00,2022-03-12 05:36:00,OPPS_3,9067,0,4454952,CKB +LINE_1,OPPS_3,2022-03-12 05:36:00,2022-03-12 05:36:00,DEPS_1,0.06,0,4454952,CKB +LINE_2,DEPS_1,2022-03-11 21:06:00,2022-03-11 21:06:00,S_6,0.06,0,4664738,CKB +LINE_2,S_6,2022-03-11 21:06:00,2022-03-11 21:34:00,S_7,13018,19,4664738,CKB +LINE_2,S_7,2022-03-11 21:53:00,2022-03-11 22:13:00,S_8,10332,17,4664738,CKB +LINE_2,S_8,2022-03-11 22:30:00,2022-03-11 22:54:00,S_7,10.48,19,4664738,CKB +LINE_2,S_7,2022-03-11 23:13:00,2022-03-11 23:33:00,S_8,10332,17,4664738,CKB +LINE_2,S_8,2022-03-11 23:50:00,2022-03-12 00:14:00,S_7,10.48,8,4664738,CKB +LINE_2,S_7,2022-03-12 00:22:00,2022-03-12 00:27:00,S_58,2533,2,4664738,CKB +LINE_3,S_58,2022-03-12 00:29:00,2022-03-12 00:47:00,OPPS_10,7.58,0,4664738,CKB +LINE_3,OPPS_10,2022-03-12 00:47:00,2022-03-12 01:14:00,S_11,12841,3,4664738,CKB +LINE_3,S_11,2022-03-12 01:17:00,2022-03-12 01:47:00,OPPS_10,14281,0,4664738,CKB +LINE_3,OPPS_10,2022-03-12 01:47:00,2022-03-12 02:14:00,S_11,12841,3,4664738,CKB +LINE_3,S_11,2022-03-12 02:17:00,2022-03-12 02:47:00,OPPS_10,14281,0,4664738,CKB +LINE_3,OPPS_10,2022-03-12 02:47:00,2022-03-12 03:14:00,S_11,12841,3,4664738,CKB +LINE_3,S_11,2022-03-12 03:17:00,2022-03-12 03:47:00,OPPS_10,14281,0,4664738,CKB +LINE_3,OPPS_10,2022-03-12 03:47:00,2022-03-12 04:14:00,S_11,12841,3,4664738,CKB +LINE_3,S_11,2022-03-12 04:17:00,2022-03-12 04:47:00,OPPS_10,14281,0,4664738,CKB +LINE_3,OPPS_10,2022-03-12 04:47:00,2022-03-12 05:14:00,S_11,12841,3,4664738,CKB +LINE_3,S_11,2022-03-12 05:17:00,2022-03-12 05:47:00,OPPS_10,14281,0,4664738,CKB +LINE_3,OPPS_10,2022-03-12 05:47:00,2022-03-12 05:47:00,DEPS_1,0.06,0,4664738,CKB +LINE_2,DEPS_1,2022-03-11 20:26:00,2022-03-11 20:26:00,S_6,0.06,0,4762763,CKB +LINE_2,S_6,2022-03-11 20:26:00,2022-03-11 20:56:00,S_12,14097,14,4762763,CKB +LINE_2,S_12,2022-03-11 21:10:00,2022-03-11 21:38:00,S_6,13.19,8,4762763,CKB +LINE_2,S_6,2022-03-11 21:46:00,2022-03-11 22:14:00,S_7,13018,19,4762763,CKB +LINE_2,S_7,2022-03-11 22:33:00,2022-03-11 22:53:00,S_8,10332,17,4762763,CKB +LINE_2,S_8,2022-03-11 23:10:00,2022-03-11 23:34:00,S_7,10.48,19,4762763,CKB +LINE_2,S_7,2022-03-11 23:53:00,2022-03-12 00:13:00,S_8,10332,2,4762763,CKB +LINE_2,S_8,2022-03-12 00:15:00,2022-03-12 00:16:00,OPPS_10,506,1,4762763,CKB +LINE_3,OPPS_10,2022-03-12 00:17:00,2022-03-12 00:44:00,S_11,12841,3,4762763,CKB +LINE_3,S_11,2022-03-12 00:47:00,2022-03-12 01:17:00,OPPS_10,14281,0,4762763,CKB +LINE_3,OPPS_10,2022-03-12 01:17:00,2022-03-12 01:44:00,S_11,12841,3,4762763,CKB +LINE_3,S_11,2022-03-12 01:47:00,2022-03-12 02:17:00,OPPS_10,14281,0,4762763,CKB +LINE_3,OPPS_10,2022-03-12 02:17:00,2022-03-12 02:44:00,S_11,12841,3,4762763,CKB +LINE_3,S_11,2022-03-12 02:47:00,2022-03-12 03:17:00,OPPS_10,14281,0,4762763,CKB +LINE_3,OPPS_10,2022-03-12 03:17:00,2022-03-12 03:44:00,S_11,12841,3,4762763,CKB +LINE_3,S_11,2022-03-12 03:47:00,2022-03-12 04:17:00,OPPS_10,14281,0,4762763,CKB +LINE_3,OPPS_10,2022-03-12 04:17:00,2022-03-12 04:44:00,S_11,12841,3,4762763,CKB +LINE_3,S_11,2022-03-12 04:47:00,2022-03-12 05:17:00,OPPS_10,14281,0,4762763,CKB +LINE_3,OPPS_10,2022-03-12 05:17:00,2022-03-12 05:29:00,S_58,5474,0,4762763,CKB +LINE_3,S_58,2022-03-12 05:29:00,2022-03-12 05:29:00,DEPS_1,0.06,0,4762763,CKB +LINE_5,DEPS_1,2022-03-11 22:56:00,2022-03-11 22:56:00,S_14,0.06,0,4617429,CKB +LINE_5,S_14,2022-03-11 22:56:00,2022-03-11 23:08:00,S_15,5882,3,4617429,CKB +LINE_5,S_15,2022-03-11 23:11:00,2022-03-11 23:25:00,S_14,6232,0,4617429,CKB +LINE_5,S_14,2022-03-11 23:25:00,2022-03-11 23:38:00,S_15,6086,3,4617429,CKB +LINE_5,S_15,2022-03-11 23:41:00,2022-03-11 23:55:00,S_14,6232,0,4617429,CKB +LINE_5,S_14,2022-03-11 23:55:00,2022-03-12 00:08:00,S_15,6086,0,4617429,CKB +LINE_5,S_15,2022-03-12 00:08:00,2022-03-12 00:08:00,DEPS_1,0.06,0,4617429,CKB +LINE_6,DEPS_1,2022-03-11 05:05:00,2022-03-11 05:05:00,S_16,0.06,0,4426848,CKB +LINE_6,S_16,2022-03-11 05:05:00,2022-03-11 05:14:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 05:14:00,2022-03-11 05:23:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 05:25:00,2022-03-11 05:34:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 05:34:00,2022-03-11 05:43:00,S_16,5139,23,4426848,CKB +LINE_6,S_16,2022-03-11 06:06:00,2022-03-11 06:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 06:15:00,2022-03-11 06:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 06:26:00,2022-03-11 06:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 06:35:00,2022-03-11 06:44:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 06:46:00,2022-03-11 06:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 06:55:00,2022-03-11 07:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 07:06:00,2022-03-11 07:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 07:15:00,2022-03-11 07:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 07:26:00,2022-03-11 07:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 07:35:00,2022-03-11 07:44:00,S_16,5139,22,4426848,CKB +LINE_6,S_16,2022-03-11 08:06:00,2022-03-11 08:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 08:15:00,2022-03-11 08:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 08:26:00,2022-03-11 08:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 08:35:00,2022-03-11 08:44:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 08:46:00,2022-03-11 08:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 08:55:00,2022-03-11 09:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 09:06:00,2022-03-11 09:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 09:15:00,2022-03-11 09:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 09:26:00,2022-03-11 09:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 09:35:00,2022-03-11 09:44:00,S_16,5139,22,4426848,CKB +LINE_6,S_16,2022-03-11 10:06:00,2022-03-11 10:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 10:15:00,2022-03-11 10:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 10:26:00,2022-03-11 10:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 10:35:00,2022-03-11 10:44:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 10:46:00,2022-03-11 10:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 10:55:00,2022-03-11 11:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 11:06:00,2022-03-11 11:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 11:15:00,2022-03-11 11:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 11:26:00,2022-03-11 11:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 11:35:00,2022-03-11 11:44:00,S_16,5139,22,4426848,CKB +LINE_6,S_16,2022-03-11 12:06:00,2022-03-11 12:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 12:15:00,2022-03-11 12:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 12:26:00,2022-03-11 12:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 12:35:00,2022-03-11 12:44:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 12:46:00,2022-03-11 12:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 12:55:00,2022-03-11 13:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 13:06:00,2022-03-11 13:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 13:15:00,2022-03-11 13:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 13:26:00,2022-03-11 13:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 13:35:00,2022-03-11 13:44:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 13:46:00,2022-03-11 13:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 13:55:00,2022-03-11 14:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 14:06:00,2022-03-11 14:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 14:15:00,2022-03-11 14:24:00,S_16,5139,22,4426848,CKB +LINE_6,S_16,2022-03-11 14:46:00,2022-03-11 14:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 14:55:00,2022-03-11 15:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 15:06:00,2022-03-11 15:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 15:15:00,2022-03-11 15:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 15:26:00,2022-03-11 15:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 15:35:00,2022-03-11 15:44:00,S_16,5139,22,4426848,CKB +LINE_6,S_16,2022-03-11 16:06:00,2022-03-11 16:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 16:15:00,2022-03-11 16:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 16:26:00,2022-03-11 16:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 16:35:00,2022-03-11 16:44:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 16:46:00,2022-03-11 16:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 16:55:00,2022-03-11 17:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 17:06:00,2022-03-11 17:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 17:15:00,2022-03-11 17:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 17:26:00,2022-03-11 17:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 17:35:00,2022-03-11 17:44:00,S_16,5139,22,4426848,CKB +LINE_6,S_16,2022-03-11 18:06:00,2022-03-11 18:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 18:15:00,2022-03-11 18:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 18:26:00,2022-03-11 18:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 18:35:00,2022-03-11 18:44:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 18:46:00,2022-03-11 18:55:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 18:55:00,2022-03-11 19:04:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 19:06:00,2022-03-11 19:15:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 19:15:00,2022-03-11 19:24:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 19:26:00,2022-03-11 19:35:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 19:35:00,2022-03-11 19:44:00,S_16,5139,21,4426848,CKB +LINE_6,S_16,2022-03-11 20:05:00,2022-03-11 20:14:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 20:14:00,2022-03-11 20:23:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 20:25:00,2022-03-11 20:34:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 20:34:00,2022-03-11 20:43:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 20:45:00,2022-03-11 20:54:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 20:54:00,2022-03-11 21:03:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 21:05:00,2022-03-11 21:14:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 21:14:00,2022-03-11 21:23:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 21:25:00,2022-03-11 21:34:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 21:34:00,2022-03-11 21:43:00,S_16,5139,22,4426848,CKB +LINE_6,S_16,2022-03-11 22:05:00,2022-03-11 22:14:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 22:14:00,2022-03-11 22:23:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 22:25:00,2022-03-11 22:34:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 22:34:00,2022-03-11 22:43:00,S_16,5139,2,4426848,CKB +LINE_6,S_16,2022-03-11 22:45:00,2022-03-11 22:54:00,S_17,4781,0,4426848,CKB +LINE_6,S_17,2022-03-11 22:54:00,2022-03-11 23:03:00,S_16,5139,0,4426848,CKB +LINE_6,S_16,2022-03-11 23:03:00,2022-03-11 23:03:00,DEPS_1,0.06,0,4426848,CKB +LINE_9,DEPS_23,2022-03-11 05:15:00,2022-03-11 06:01:00,S_22,17.9,0,4317628,VDL +LINE_9,S_22,2022-03-11 06:01:00,2022-03-11 06:15:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 06:23:00,2022-03-11 06:37:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 06:41:00,2022-03-11 06:55:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 07:03:00,2022-03-11 07:17:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 07:21:00,2022-03-11 07:35:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 07:43:00,2022-03-11 07:57:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 08:01:00,2022-03-11 08:15:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 08:23:00,2022-03-11 08:37:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 08:41:00,2022-03-11 08:55:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 09:03:00,2022-03-11 09:17:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 09:21:00,2022-03-11 09:35:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 09:43:00,2022-03-11 09:57:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 10:01:00,2022-03-11 10:15:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 10:23:00,2022-03-11 10:37:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 10:41:00,2022-03-11 10:55:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 11:03:00,2022-03-11 11:17:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 11:21:00,2022-03-11 11:35:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 11:43:00,2022-03-11 11:57:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 12:01:00,2022-03-11 12:15:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 12:23:00,2022-03-11 12:37:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 12:41:00,2022-03-11 12:55:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 13:03:00,2022-03-11 13:17:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 13:21:00,2022-03-11 13:35:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 13:43:00,2022-03-11 13:57:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 14:01:00,2022-03-11 14:15:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 14:23:00,2022-03-11 14:37:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 14:41:00,2022-03-11 14:55:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 15:03:00,2022-03-11 15:17:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 15:21:00,2022-03-11 15:35:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 15:43:00,2022-03-11 15:57:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 16:01:00,2022-03-11 16:15:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 16:23:00,2022-03-11 16:37:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 16:41:00,2022-03-11 16:55:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 17:03:00,2022-03-11 17:17:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 17:21:00,2022-03-11 17:35:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 17:43:00,2022-03-11 17:57:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 18:01:00,2022-03-11 18:15:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 18:23:00,2022-03-11 18:37:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 18:41:00,2022-03-11 18:55:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 19:03:00,2022-03-11 19:17:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 19:21:00,2022-03-11 19:35:00,S_22,4637,8,4317628,VDL +LINE_9,S_22,2022-03-11 19:43:00,2022-03-11 19:57:00,S_22,4637,4,4317628,VDL +LINE_9,S_22,2022-03-11 20:01:00,2022-03-11 20:14:00,S_22,4637,9,4317628,VDL +LINE_9,S_22,2022-03-11 20:23:00,2022-03-11 20:36:00,S_22,4637,0,4317628,VDL +LINE_9,S_22,2022-03-11 20:36:00,2022-03-11 21:15:00,DEPS_23,19.8,0,4317628,VDL +LINE_10,DEPS_1,2022-03-11 04:56:00,2022-03-11 04:56:00,S_24,0.06,18,4425671,CKB +LINE_10,S_24,2022-03-11 05:14:00,2022-03-11 05:20:00,S_25,3.29,0,4425671,CKB +LINE_10,S_25,2022-03-11 05:20:00,2022-03-11 05:24:00,S_24,2954,20,4425671,CKB +LINE_10,S_24,2022-03-11 05:44:00,2022-03-11 05:50:00,S_25,3.29,0,4425671,CKB +LINE_10,S_25,2022-03-11 05:50:00,2022-03-11 05:54:00,S_24,2954,5,4425671,CKB +LINE_10,S_24,2022-03-11 05:59:00,2022-03-11 06:06:00,S_25,3.29,2,4425671,CKB +LINE_10,S_25,2022-03-11 06:08:00,2022-03-11 06:13:00,S_24,2954,19,4425671,CKB +LINE_10,S_24,2022-03-11 06:32:00,2022-03-11 06:39:00,S_25,3.29,1,4425671,CKB +LINE_10,S_25,2022-03-11 06:40:00,2022-03-11 06:45:00,S_24,2954,7,4425671,CKB +LINE_10,S_24,2022-03-11 06:52:00,2022-03-11 06:59:00,S_25,3.29,1,4425671,CKB +LINE_10,S_25,2022-03-11 07:00:00,2022-03-11 07:05:00,S_24,2954,7,4425671,CKB +LINE_10,S_24,2022-03-11 07:12:00,2022-03-11 07:19:00,S_25,3.29,1,4425671,CKB +LINE_10,S_25,2022-03-11 07:20:00,2022-03-11 07:25:00,S_24,2954,7,4425671,CKB +LINE_10,S_24,2022-03-11 07:32:00,2022-03-11 07:39:00,S_25,3.29,1,4425671,CKB +LINE_10,S_25,2022-03-11 07:40:00,2022-03-11 07:45:00,S_24,2954,295,4425671,CKB +LINE_10,S_24,2022-03-11 12:40:00,2022-03-11 12:47:00,S_25,3.29,2,4425671,CKB +LINE_10,S_25,2022-03-11 12:49:00,2022-03-11 12:54:00,S_24,2954,46,4425671,CKB +LINE_10,S_24,2022-03-11 13:40:00,2022-03-11 13:47:00,S_25,3.29,2,4425671,CKB +LINE_10,S_25,2022-03-11 13:49:00,2022-03-11 13:54:00,S_24,2954,434,4425671,CKB +LINE_10,S_24,2022-03-11 21:08:00,2022-03-11 21:08:00,DEPS_1,0.06,0,4425671,CKB +LINE_11,DEPS_1,2022-03-11 07:20:00,2022-03-11 07:20:00,OPPS_26,0.06,0,4448153,CKB +LINE_11,OPPS_26,2022-03-11 07:20:00,2022-03-11 07:50:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 08:00:00,2022-03-11 08:30:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 08:40:00,2022-03-11 09:10:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 09:20:00,2022-03-11 09:50:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 10:00:00,2022-03-11 10:30:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 10:40:00,2022-03-11 11:10:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 11:20:00,2022-03-11 11:50:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 12:00:00,2022-03-11 12:30:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 12:40:00,2022-03-11 13:10:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 13:20:00,2022-03-11 13:50:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 14:00:00,2022-03-11 14:30:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 14:40:00,2022-03-11 15:10:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 15:20:00,2022-03-11 15:50:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 16:00:00,2022-03-11 16:30:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 16:40:00,2022-03-11 17:10:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 17:20:00,2022-03-11 17:50:00,OPPS_26,9266,10,4448153,CKB +LINE_11,OPPS_26,2022-03-11 18:00:00,2022-03-11 18:30:00,OPPS_26,9266,0,4448153,CKB +LINE_11,OPPS_26,2022-03-11 18:30:00,2022-03-11 18:30:00,DEPS_1,0.06,0,4448153,CKB +LINE_12,DEPS_1,2022-03-11 07:10:00,2022-03-11 07:10:00,S_27,0.06,0,4733898,CKB +LINE_12,S_27,2022-03-11 07:10:00,2022-03-11 07:18:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 07:28:00,2022-03-11 07:40:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 07:40:00,2022-03-11 07:48:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 07:58:00,2022-03-11 08:10:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 08:10:00,2022-03-11 08:18:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 08:28:00,2022-03-11 08:40:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 08:40:00,2022-03-11 08:48:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 08:58:00,2022-03-11 09:10:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 09:10:00,2022-03-11 09:18:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 09:28:00,2022-03-11 09:40:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 09:40:00,2022-03-11 09:48:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 09:58:00,2022-03-11 10:10:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 10:10:00,2022-03-11 10:18:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 10:28:00,2022-03-11 10:40:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 10:40:00,2022-03-11 10:48:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 10:58:00,2022-03-11 11:10:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 11:10:00,2022-03-11 11:18:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 11:28:00,2022-03-11 11:40:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 11:40:00,2022-03-11 11:48:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 11:58:00,2022-03-11 12:10:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 12:10:00,2022-03-11 12:18:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 12:28:00,2022-03-11 12:40:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 12:40:00,2022-03-11 12:48:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 12:58:00,2022-03-11 13:10:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 13:10:00,2022-03-11 13:18:00,OPPS_28,2169,10,4733898,CKB +LINE_12,OPPS_28,2022-03-11 13:28:00,2022-03-11 13:40:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 13:40:00,2022-03-11 13:48:00,OPPS_28,2169,8,4733898,CKB +LINE_12,OPPS_28,2022-03-11 13:56:00,2022-03-11 14:10:00,S_27,2952,0,4733898,CKB +LINE_12,S_27,2022-03-11 14:10:00,2022-03-11 14:19:00,OPPS_28,2169,14,4733898,CKB +LINE_12,OPPS_28,2022-03-11 14:33:00,2022-03-11 14:47:00,S_27,2952,3,4733898,CKB +LINE_12,S_27,2022-03-11 14:50:00,2022-03-11 14:59:00,OPPS_28,2169,14,4733898,CKB +LINE_12,OPPS_28,2022-03-11 15:13:00,2022-03-11 15:27:00,S_27,2952,3,4733898,CKB +LINE_12,S_27,2022-03-11 15:30:00,2022-03-11 15:39:00,OPPS_28,2169,14,4733898,CKB +LINE_12,OPPS_28,2022-03-11 15:53:00,2022-03-11 16:07:00,S_27,2952,3,4733898,CKB +LINE_12,S_27,2022-03-11 16:10:00,2022-03-11 16:19:00,OPPS_28,2169,14,4733898,CKB +LINE_12,OPPS_28,2022-03-11 16:33:00,2022-03-11 16:47:00,S_27,2952,3,4733898,CKB +LINE_12,S_27,2022-03-11 16:50:00,2022-03-11 16:59:00,OPPS_28,2169,14,4733898,CKB +LINE_12,OPPS_28,2022-03-11 17:13:00,2022-03-11 17:27:00,S_27,2952,3,4733898,CKB +LINE_12,S_27,2022-03-11 17:30:00,2022-03-11 17:39:00,OPPS_28,2169,13,4733898,CKB +LINE_12,OPPS_28,2022-03-11 17:52:00,2022-03-11 18:05:00,S_27,2952,5,4733898,CKB +LINE_12,S_27,2022-03-11 18:10:00,2022-03-11 18:18:00,OPPS_28,2169,0,4733898,CKB +LINE_12,OPPS_28,2022-03-11 18:18:00,2022-03-11 18:18:00,DEPS_1,0.06,0,4733898,CKB +LINE_12,DEPS_1,2022-03-11 14:13:00,2022-03-11 14:13:00,OPPS_28,0.06,0,4734203,CKB +LINE_12,OPPS_28,2022-03-11 14:13:00,2022-03-11 14:27:00,S_27,2952,3,4734203,CKB +LINE_12,S_27,2022-03-11 14:30:00,2022-03-11 14:39:00,OPPS_28,2169,14,4734203,CKB +LINE_12,OPPS_28,2022-03-11 14:53:00,2022-03-11 15:07:00,S_27,2952,3,4734203,CKB +LINE_12,S_27,2022-03-11 15:10:00,2022-03-11 15:19:00,OPPS_28,2169,14,4734203,CKB +LINE_12,OPPS_28,2022-03-11 15:33:00,2022-03-11 15:47:00,S_27,2952,3,4734203,CKB +LINE_12,S_27,2022-03-11 15:50:00,2022-03-11 15:59:00,OPPS_28,2169,14,4734203,CKB +LINE_12,OPPS_28,2022-03-11 16:13:00,2022-03-11 16:27:00,S_27,2952,3,4734203,CKB +LINE_12,S_27,2022-03-11 16:30:00,2022-03-11 16:39:00,OPPS_28,2169,14,4734203,CKB +LINE_12,OPPS_28,2022-03-11 16:53:00,2022-03-11 17:07:00,S_27,2952,3,4734203,CKB +LINE_12,S_27,2022-03-11 17:10:00,2022-03-11 17:19:00,OPPS_28,2169,14,4734203,CKB +LINE_12,OPPS_28,2022-03-11 17:33:00,2022-03-11 17:47:00,S_27,2952,3,4734203,CKB +LINE_12,S_27,2022-03-11 17:50:00,2022-03-11 17:59:00,OPPS_28,2169,14,4734203,CKB +LINE_12,OPPS_28,2022-03-11 18:13:00,2022-03-11 18:25:00,S_27,2952,0,4734203,CKB +LINE_12,S_27,2022-03-11 18:25:00,2022-03-11 18:25:00,DEPS_1,0.06,0,4734203,CKB +LINE_13,DEPS_1,2022-03-12 00:23:00,2022-03-12 00:23:00,S_29,0.06,0,4318160,CKB +LINE_13,S_29,2022-03-12 00:23:00,2022-03-12 00:30:00,OPPS_30,2577,9,4318160,CKB +LINE_14,OPPS_30,2022-03-12 00:39:00,2022-03-12 00:54:00,S_31,5937,9,4318160,CKB +LINE_14,S_31,2022-03-12 01:03:00,2022-03-12 01:17:00,OPPS_30,6.19,0,4318160,CKB +LINE_13,OPPS_30,2022-03-12 01:17:00,2022-03-12 01:23:00,S_29,2555,0,4318160,CKB +LINE_13,S_29,2022-03-12 01:23:00,2022-03-12 01:30:00,OPPS_30,2577,9,4318160,CKB +LINE_14,OPPS_30,2022-03-12 01:39:00,2022-03-12 01:54:00,S_31,5937,9,4318160,CKB +LINE_14,S_31,2022-03-12 02:03:00,2022-03-12 02:17:00,OPPS_30,6.19,0,4318160,CKB +LINE_13,OPPS_30,2022-03-12 02:17:00,2022-03-12 02:23:00,S_29,2555,0,4318160,CKB +LINE_13,S_29,2022-03-12 02:23:00,2022-03-12 02:30:00,OPPS_30,2577,9,4318160,CKB +LINE_14,OPPS_30,2022-03-12 02:39:00,2022-03-12 02:54:00,S_31,5937,9,4318160,CKB +LINE_14,S_31,2022-03-12 03:03:00,2022-03-12 03:17:00,OPPS_30,6.19,0,4318160,CKB +LINE_13,OPPS_30,2022-03-12 03:17:00,2022-03-12 03:23:00,S_29,2555,0,4318160,CKB +LINE_13,S_29,2022-03-12 03:23:00,2022-03-12 03:30:00,OPPS_30,2577,9,4318160,CKB +LINE_14,OPPS_30,2022-03-12 03:39:00,2022-03-12 03:54:00,S_31,5937,9,4318160,CKB +LINE_14,S_31,2022-03-12 04:03:00,2022-03-12 04:17:00,OPPS_30,6.19,0,4318160,CKB +LINE_13,OPPS_30,2022-03-12 04:17:00,2022-03-12 04:23:00,S_29,2555,0,4318160,CKB +LINE_13,S_29,2022-03-12 04:23:00,2022-03-12 04:30:00,OPPS_30,2577,9,4318160,CKB +LINE_14,OPPS_30,2022-03-12 04:39:00,2022-03-12 04:54:00,S_31,5937,9,4318160,CKB +LINE_14,S_31,2022-03-12 05:03:00,2022-03-12 05:17:00,OPPS_30,6.19,0,4318160,CKB +LINE_15,OPPS_30,2022-03-12 05:17:00,2022-03-12 05:38:00,S_33,12.0,28,4318160,CKB +LINE_15,S_33,2022-03-12 06:06:00,2022-03-12 06:11:00,OPPS_32,2936,16,4318160,CKB +LINE_15,OPPS_32,2022-03-12 06:27:00,2022-03-12 06:36:00,S_33,4343,10,4318160,CKB +LINE_15,S_33,2022-03-12 06:46:00,2022-03-12 06:51:00,OPPS_32,2936,0,4318160,CKB +LINE_10,OPPS_32,2022-03-12 06:51:00,2022-03-12 07:00:00,S_24,4.6,12,4318160,CKB +LINE_10,S_24,2022-03-12 07:12:00,2022-03-12 07:12:00,S_24,0.0,836,4318160,CKB +LINE_10,S_24,2022-03-12 21:08:00,2022-03-12 21:08:00,S_24,0.0,0,4318160,CKB +LINE_10,S_24,2022-03-12 21:08:00,2022-03-12 21:08:00,DEPS_1,0.06,0,4318160,CKB +LINE_14,DEPS_1,2022-03-12 00:33:00,2022-03-12 00:33:00,S_31,0.06,0,4318180,CKB +LINE_14,S_31,2022-03-12 00:33:00,2022-03-12 00:47:00,OPPS_30,6.19,0,4318180,CKB +LINE_13,OPPS_30,2022-03-12 00:47:00,2022-03-12 00:53:00,S_29,2555,0,4318180,CKB +LINE_13,S_29,2022-03-12 00:53:00,2022-03-12 01:00:00,OPPS_30,2577,9,4318180,CKB +LINE_14,OPPS_30,2022-03-12 01:09:00,2022-03-12 01:24:00,S_31,5937,9,4318180,CKB +LINE_14,S_31,2022-03-12 01:33:00,2022-03-12 01:47:00,OPPS_30,6.19,0,4318180,CKB +LINE_13,OPPS_30,2022-03-12 01:47:00,2022-03-12 01:53:00,S_29,2555,0,4318180,CKB +LINE_13,S_29,2022-03-12 01:53:00,2022-03-12 02:00:00,OPPS_30,2577,9,4318180,CKB +LINE_14,OPPS_30,2022-03-12 02:09:00,2022-03-12 02:24:00,S_31,5937,9,4318180,CKB +LINE_14,S_31,2022-03-12 02:33:00,2022-03-12 02:47:00,OPPS_30,6.19,0,4318180,CKB +LINE_13,OPPS_30,2022-03-12 02:47:00,2022-03-12 02:53:00,S_29,2555,0,4318180,CKB +LINE_13,S_29,2022-03-12 02:53:00,2022-03-12 03:00:00,OPPS_30,2577,9,4318180,CKB +LINE_14,OPPS_30,2022-03-12 03:09:00,2022-03-12 03:24:00,S_31,5937,9,4318180,CKB +LINE_14,S_31,2022-03-12 03:33:00,2022-03-12 03:47:00,OPPS_30,6.19,0,4318180,CKB +LINE_13,OPPS_30,2022-03-12 03:47:00,2022-03-12 03:53:00,S_29,2555,0,4318180,CKB +LINE_13,S_29,2022-03-12 03:53:00,2022-03-12 04:00:00,OPPS_30,2577,9,4318180,CKB +LINE_14,OPPS_30,2022-03-12 04:09:00,2022-03-12 04:24:00,S_31,5937,9,4318180,CKB +LINE_14,S_31,2022-03-12 04:33:00,2022-03-12 04:47:00,OPPS_30,6.19,0,4318180,CKB +LINE_13,OPPS_30,2022-03-12 04:47:00,2022-03-12 04:53:00,S_29,2555,0,4318180,CKB +LINE_13,S_29,2022-03-12 04:53:00,2022-03-12 05:00:00,OPPS_30,2577,9,4318180,CKB +LINE_14,OPPS_30,2022-03-12 05:09:00,2022-03-12 05:24:00,S_31,5937,0,4318180,CKB +LINE_14,S_31,2022-03-12 05:24:00,2022-03-12 05:24:00,DEPS_1,0.06,0,4318180,CKB +LINE_15,DEPS_1,2022-03-12 00:57:00,2022-03-12 00:57:00,OPPS_32,0.06,0,4319355,CKB +LINE_15,OPPS_32,2022-03-12 00:57:00,2022-03-12 01:06:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 01:06:00,2022-03-12 01:11:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 01:27:00,2022-03-12 01:36:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 01:36:00,2022-03-12 01:41:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 01:57:00,2022-03-12 02:06:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 02:06:00,2022-03-12 02:11:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 02:27:00,2022-03-12 02:36:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 02:36:00,2022-03-12 02:41:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 02:57:00,2022-03-12 03:06:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 03:06:00,2022-03-12 03:11:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 03:27:00,2022-03-12 03:36:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 03:36:00,2022-03-12 03:41:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 03:57:00,2022-03-12 04:06:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 04:06:00,2022-03-12 04:11:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 04:27:00,2022-03-12 04:36:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 04:36:00,2022-03-12 04:41:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 04:57:00,2022-03-12 05:06:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 05:06:00,2022-03-12 05:11:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 05:27:00,2022-03-12 05:36:00,S_33,4343,0,4319355,CKB +LINE_15,S_33,2022-03-12 05:36:00,2022-03-12 05:41:00,OPPS_32,2936,16,4319355,CKB +LINE_15,OPPS_32,2022-03-12 05:57:00,2022-03-12 06:06:00,S_33,4343,20,4319355,CKB +LINE_15,S_33,2022-03-12 06:26:00,2022-03-12 06:31:00,OPPS_32,2936,0,4319355,CKB +LINE_15,OPPS_32,2022-03-12 06:31:00,2022-03-12 06:31:00,DEPS_1,0.06,0,4319355,CKB +LINE_17,DEPS_1,2022-03-12 00:30:00,2022-03-12 00:30:00,S_34,0.06,0,4453548,CKB +LINE_17,S_34,2022-03-12 00:30:00,2022-03-12 00:44:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 00:44:00,2022-03-12 00:57:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 01:00:00,2022-03-12 01:14:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 01:14:00,2022-03-12 01:27:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 01:30:00,2022-03-12 01:44:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 01:44:00,2022-03-12 01:57:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 02:00:00,2022-03-12 02:14:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 02:14:00,2022-03-12 02:27:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 02:30:00,2022-03-12 02:44:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 02:44:00,2022-03-12 02:57:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 03:00:00,2022-03-12 03:14:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 03:14:00,2022-03-12 03:27:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 03:30:00,2022-03-12 03:44:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 03:44:00,2022-03-12 03:57:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 04:00:00,2022-03-12 04:14:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 04:14:00,2022-03-12 04:27:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 04:30:00,2022-03-12 04:44:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 04:44:00,2022-03-12 04:57:00,S_34,5302,3,4453548,CKB +LINE_17,S_34,2022-03-12 05:00:00,2022-03-12 05:14:00,S_36,4801,0,4453548,CKB +LINE_17,S_36,2022-03-12 05:14:00,2022-03-12 05:27:00,S_34,5302,0,4453548,CKB +LINE_17,S_34,2022-03-12 05:27:00,2022-03-12 05:27:00,DEPS_1,0.06,0,4453548,CKB +LINE_20,DEPS_1,2022-03-12 00:32:00,2022-03-12 00:32:00,S_13,0.06,0,4747653,CKB +LINE_20,S_13,2022-03-12 00:32:00,2022-03-12 00:44:00,S_40,4212,3,4747653,CKB +LINE_20,S_40,2022-03-12 00:47:00,2022-03-12 01:16:00,S_41,13048,0,4747653,CKB +LINE_20,S_41,2022-03-12 01:16:00,2022-03-12 01:42:00,S_40,12869,5,4747653,CKB +LINE_20,S_40,2022-03-12 01:47:00,2022-03-12 02:16:00,S_41,13048,0,4747653,CKB +LINE_20,S_41,2022-03-12 02:16:00,2022-03-12 02:42:00,S_40,12869,5,4747653,CKB +LINE_20,S_40,2022-03-12 02:47:00,2022-03-12 03:16:00,S_41,13048,0,4747653,CKB +LINE_20,S_41,2022-03-12 03:16:00,2022-03-12 03:42:00,S_40,12869,5,4747653,CKB +LINE_20,S_40,2022-03-12 03:47:00,2022-03-12 04:16:00,S_41,13048,0,4747653,CKB +LINE_20,S_41,2022-03-12 04:16:00,2022-03-12 04:42:00,S_40,12869,5,4747653,CKB +LINE_20,S_40,2022-03-12 04:47:00,2022-03-12 05:16:00,S_41,13048,0,4747653,CKB +LINE_20,S_41,2022-03-12 05:16:00,2022-03-12 05:34:00,DEPS_42,9538,0,4747653,CKB +LINE_20,DEPS_42,2022-03-12 05:34:00,2022-03-12 05:34:00,DEPS_1,0.06,0,4747653,CKB +LINE_20,DEPS_1,2022-03-12 00:17:00,2022-03-12 00:17:00,S_40,0.06,0,4747663,CKB +LINE_20,S_40,2022-03-12 00:17:00,2022-03-12 00:46:00,S_41,13048,0,4747663,CKB +LINE_20,S_41,2022-03-12 00:46:00,2022-03-12 01:12:00,S_40,12869,5,4747663,CKB +LINE_20,S_40,2022-03-12 01:17:00,2022-03-12 01:46:00,S_41,13048,0,4747663,CKB +LINE_20,S_41,2022-03-12 01:46:00,2022-03-12 02:12:00,S_40,12869,5,4747663,CKB +LINE_20,S_40,2022-03-12 02:17:00,2022-03-12 02:46:00,S_41,13048,0,4747663,CKB +LINE_20,S_41,2022-03-12 02:46:00,2022-03-12 03:12:00,S_40,12869,5,4747663,CKB +LINE_20,S_40,2022-03-12 03:17:00,2022-03-12 03:46:00,S_41,13048,0,4747663,CKB +LINE_20,S_41,2022-03-12 03:46:00,2022-03-12 04:12:00,S_40,12869,5,4747663,CKB +LINE_20,S_40,2022-03-12 04:17:00,2022-03-12 04:46:00,S_41,13048,0,4747663,CKB +LINE_20,S_41,2022-03-12 04:46:00,2022-03-12 05:12:00,S_40,12869,0,4747663,CKB +LINE_20,S_40,2022-03-12 05:12:00,2022-03-12 05:12:00,DEPS_1,0.06,0,4747663,CKB +LINE_21,DEPS_1,2022-03-12 00:49:00,2022-03-12 00:49:00,OPPS_3,0.06,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 00:49:00,2022-03-12 01:04:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 01:04:00,2022-03-12 01:19:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 01:19:00,2022-03-12 01:34:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 01:34:00,2022-03-12 01:49:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 01:49:00,2022-03-12 02:04:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 02:04:00,2022-03-12 02:19:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 02:19:00,2022-03-12 02:34:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 02:34:00,2022-03-12 02:49:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 02:49:00,2022-03-12 03:04:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 03:04:00,2022-03-12 03:19:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 03:19:00,2022-03-12 03:34:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 03:34:00,2022-03-12 03:49:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 03:49:00,2022-03-12 04:04:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 04:04:00,2022-03-12 04:19:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 04:19:00,2022-03-12 04:34:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 04:34:00,2022-03-12 04:49:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 04:49:00,2022-03-12 05:04:00,S_16,10229,0,4434344,CKB +LINE_21,S_16,2022-03-12 05:04:00,2022-03-12 05:19:00,OPPS_3,11801,0,4434344,CKB +LINE_21,OPPS_3,2022-03-12 05:19:00,2022-03-12 05:19:00,DEPS_1,0.06,0,4434344,CKB +LINE_23,DEPS_1,2022-03-12 02:34:00,2022-03-12 02:34:00,S_45,0.06,0,4514364,CKB +LINE_23,S_45,2022-03-12 02:34:00,2022-03-12 03:00:00,S_46,9016,0,4514364,CKB +LINE_23,S_46,2022-03-12 03:00:00,2022-03-12 03:27:00,S_45,10083,7,4514364,CKB +LINE_23,S_45,2022-03-12 03:34:00,2022-03-12 04:00:00,S_46,9016,0,4514364,CKB +LINE_23,S_46,2022-03-12 04:00:00,2022-03-12 04:27:00,S_45,10083,7,4514364,CKB +LINE_23,S_45,2022-03-12 04:34:00,2022-03-12 05:00:00,S_46,9016,0,4514364,CKB +LINE_23,S_46,2022-03-12 05:00:00,2022-03-12 05:27:00,S_45,10083,0,4514364,CKB +LINE_23,S_45,2022-03-12 05:27:00,2022-03-12 05:27:00,DEPS_1,0.06,0,4514364,CKB +LINE_23,DEPS_1,2022-03-12 02:04:00,2022-03-12 02:04:00,S_45,0.06,0,4619999,CKB +LINE_23,S_45,2022-03-12 02:04:00,2022-03-12 02:30:00,S_46,9016,0,4619999,CKB +LINE_23,S_46,2022-03-12 02:30:00,2022-03-12 02:57:00,S_45,10083,7,4619999,CKB +LINE_23,S_45,2022-03-12 03:04:00,2022-03-12 03:30:00,S_46,9016,0,4619999,CKB +LINE_23,S_46,2022-03-12 03:30:00,2022-03-12 03:57:00,S_45,10083,7,4619999,CKB +LINE_23,S_45,2022-03-12 04:04:00,2022-03-12 04:30:00,S_46,9016,0,4619999,CKB +LINE_23,S_46,2022-03-12 04:30:00,2022-03-12 04:57:00,S_45,10083,7,4619999,CKB +LINE_23,S_45,2022-03-12 05:04:00,2022-03-12 05:30:00,S_46,9016,0,4619999,CKB +LINE_23,S_46,2022-03-12 05:30:00,2022-03-12 05:30:00,DEPS_1,0.06,0,4619999,CKB +LINE_24,DEPS_1,2022-03-12 00:31:00,2022-03-12 00:31:00,OPPS_21,0.06,0,4374747,CKB +LINE_24,OPPS_21,2022-03-12 00:31:00,2022-03-12 00:44:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 00:44:00,2022-03-12 00:56:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 01:01:00,2022-03-12 01:14:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 01:14:00,2022-03-12 01:26:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 01:31:00,2022-03-12 01:44:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 01:44:00,2022-03-12 01:56:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 02:01:00,2022-03-12 02:14:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 02:14:00,2022-03-12 02:26:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 02:31:00,2022-03-12 02:44:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 02:44:00,2022-03-12 02:56:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 03:01:00,2022-03-12 03:14:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 03:14:00,2022-03-12 03:26:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 03:31:00,2022-03-12 03:44:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 03:44:00,2022-03-12 03:56:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 04:01:00,2022-03-12 04:14:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 04:14:00,2022-03-12 04:26:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 04:31:00,2022-03-12 04:44:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 04:44:00,2022-03-12 04:56:00,OPPS_21,5362,5,4374747,CKB +LINE_24,OPPS_21,2022-03-12 05:01:00,2022-03-12 05:14:00,S_47,4872,0,4374747,CKB +LINE_24,S_47,2022-03-12 05:14:00,2022-03-12 05:26:00,OPPS_21,5362,0,4374747,CKB +LINE_24,OPPS_21,2022-03-12 05:26:00,2022-03-12 05:26:00,DEPS_1,0.06,0,4374747,CKB +LINE_25,DEPS_1,2022-03-12 00:31:00,2022-03-12 00:31:00,OPPS_21,0.06,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 00:31:00,2022-03-12 00:45:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 00:47:00,2022-03-12 01:01:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 01:01:00,2022-03-12 01:15:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 01:17:00,2022-03-12 01:31:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 01:31:00,2022-03-12 01:45:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 01:47:00,2022-03-12 02:01:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 02:01:00,2022-03-12 02:15:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 02:17:00,2022-03-12 02:31:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 02:31:00,2022-03-12 02:45:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 02:47:00,2022-03-12 03:01:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 03:01:00,2022-03-12 03:15:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 03:17:00,2022-03-12 03:31:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 03:31:00,2022-03-12 03:45:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 03:47:00,2022-03-12 04:01:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 04:01:00,2022-03-12 04:15:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 04:17:00,2022-03-12 04:31:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 04:31:00,2022-03-12 04:45:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 04:47:00,2022-03-12 05:01:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 05:01:00,2022-03-12 05:15:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 05:17:00,2022-03-12 05:31:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 05:31:00,2022-03-12 05:45:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 05:47:00,2022-03-12 06:01:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 06:01:00,2022-03-12 06:15:00,S_48,5225,2,4374870,CKB +LINE_25,S_48,2022-03-12 06:17:00,2022-03-12 06:31:00,OPPS_21,7617,0,4374870,CKB +LINE_25,OPPS_21,2022-03-12 06:31:00,2022-03-12 06:45:00,S_48,5096,0,4374870,CKB +LINE_25,S_48,2022-03-12 06:45:00,2022-03-12 06:45:00,DEPS_1,0.06,0,4374870,CKB +LINE_26,DEPS_1,2022-03-12 00:43:00,2022-03-12 00:43:00,S_49,0.06,0,4375016,CKB +LINE_26,S_49,2022-03-12 00:43:00,2022-03-12 00:53:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 00:53:00,2022-03-12 01:03:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 01:13:00,2022-03-12 01:23:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 01:23:00,2022-03-12 01:33:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 01:43:00,2022-03-12 01:53:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 01:53:00,2022-03-12 02:03:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 02:13:00,2022-03-12 02:23:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 02:23:00,2022-03-12 02:33:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 02:43:00,2022-03-12 02:53:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 02:53:00,2022-03-12 03:03:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 03:13:00,2022-03-12 03:23:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 03:23:00,2022-03-12 03:33:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 03:43:00,2022-03-12 03:53:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 03:53:00,2022-03-12 04:03:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 04:13:00,2022-03-12 04:23:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 04:23:00,2022-03-12 04:33:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 04:43:00,2022-03-12 04:53:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 04:53:00,2022-03-12 05:03:00,S_49,4408,10,4375016,CKB +LINE_26,S_49,2022-03-12 05:13:00,2022-03-12 05:23:00,S_50,4507,0,4375016,CKB +LINE_26,S_50,2022-03-12 05:23:00,2022-03-12 05:23:00,DEPS_1,0.06,0,4375016,CKB +LINE_0,DEPS_1,2022-03-12 20:51:00,2022-03-12 20:51:00,S_0,0.06,0,4454966,CKB +LINE_0,S_0,2022-03-12 20:51:00,2022-03-12 21:24:00,S_2,14519,4,4454966,CKB +LINE_0,S_2,2022-03-12 21:28:00,2022-03-12 22:03:00,S_0,13541,8,4454966,CKB +LINE_0,S_0,2022-03-12 22:11:00,2022-03-12 22:44:00,S_2,14519,4,4454966,CKB +LINE_0,S_2,2022-03-12 22:48:00,2022-03-12 23:23:00,S_0,13541,8,4454966,CKB +LINE_0,S_0,2022-03-12 23:31:00,2022-03-13 00:04:00,S_2,14519,4,4454966,CKB +LINE_0,S_2,2022-03-13 00:08:00,2022-03-13 00:39:00,S_5,12213,0,4454966,CKB +LINE_1,S_5,2022-03-13 00:39:00,2022-03-13 00:47:00,OPPS_3,4.0,2,4454966,CKB +LINE_1,OPPS_3,2022-03-13 00:49:00,2022-03-13 01:12:00,S_4,8.36,6,4454966,CKB +LINE_1,S_4,2022-03-13 01:18:00,2022-03-13 01:36:00,OPPS_3,9067,13,4454966,CKB +LINE_1,OPPS_3,2022-03-13 01:49:00,2022-03-13 02:12:00,S_4,8.36,6,4454966,CKB +LINE_1,S_4,2022-03-13 02:18:00,2022-03-13 02:36:00,OPPS_3,9067,13,4454966,CKB +LINE_1,OPPS_3,2022-03-13 02:49:00,2022-03-13 03:12:00,S_4,8.36,6,4454966,CKB +LINE_1,S_4,2022-03-13 03:18:00,2022-03-13 03:36:00,OPPS_3,9067,13,4454966,CKB +LINE_1,OPPS_3,2022-03-13 03:49:00,2022-03-13 04:12:00,S_4,8.36,6,4454966,CKB +LINE_1,S_4,2022-03-13 04:18:00,2022-03-13 04:36:00,OPPS_3,9067,13,4454966,CKB +LINE_1,OPPS_3,2022-03-13 04:49:00,2022-03-13 05:12:00,S_4,8.36,6,4454966,CKB +LINE_1,S_4,2022-03-13 05:18:00,2022-03-13 05:36:00,OPPS_3,9067,13,4454966,CKB +LINE_1,OPPS_3,2022-03-13 05:49:00,2022-03-13 06:08:00,S_4,8762,10,4454966,CKB +LINE_1,S_4,2022-03-13 06:18:00,2022-03-13 06:36:00,OPPS_3,9067,13,4454966,CKB +LINE_1,OPPS_3,2022-03-13 06:49:00,2022-03-13 07:08:00,S_4,8762,0,4454966,CKB +LINE_1,S_4,2022-03-13 07:08:00,2022-03-13 07:08:00,DEPS_1,0.06,0,4454966,CKB +LINE_0,DEPS_1,2022-03-12 21:31:00,2022-03-12 21:31:00,S_0,0.06,0,4454967,CKB +LINE_0,S_0,2022-03-12 21:31:00,2022-03-12 22:04:00,S_2,14519,4,4454967,CKB +LINE_0,S_2,2022-03-12 22:08:00,2022-03-12 22:43:00,S_0,13541,8,4454967,CKB +LINE_0,S_0,2022-03-12 22:51:00,2022-03-12 23:24:00,S_2,14519,4,4454967,CKB +LINE_0,S_2,2022-03-12 23:28:00,2022-03-13 00:03:00,S_0,13541,8,4454967,CKB +LINE_0,S_0,2022-03-13 00:11:00,2022-03-13 00:44:00,S_2,14519,0,4454967,CKB +LINE_1,S_2,2022-03-13 00:44:00,2022-03-13 00:54:00,OPPS_3,4.1,25,4454967,CKB +LINE_1,OPPS_3,2022-03-13 01:19:00,2022-03-13 01:42:00,S_4,8.36,6,4454967,CKB +LINE_1,S_4,2022-03-13 01:48:00,2022-03-13 02:06:00,OPPS_3,9067,13,4454967,CKB +LINE_1,OPPS_3,2022-03-13 02:19:00,2022-03-13 02:42:00,S_4,8.36,6,4454967,CKB +LINE_1,S_4,2022-03-13 02:48:00,2022-03-13 03:06:00,OPPS_3,9067,13,4454967,CKB +LINE_1,OPPS_3,2022-03-13 03:19:00,2022-03-13 03:42:00,S_4,8.36,6,4454967,CKB +LINE_1,S_4,2022-03-13 03:48:00,2022-03-13 04:06:00,OPPS_3,9067,13,4454967,CKB +LINE_1,OPPS_3,2022-03-13 04:19:00,2022-03-13 04:42:00,S_4,8.36,6,4454967,CKB +LINE_1,S_4,2022-03-13 04:48:00,2022-03-13 05:06:00,OPPS_3,9067,13,4454967,CKB +LINE_1,OPPS_3,2022-03-13 05:19:00,2022-03-13 05:42:00,S_4,8.36,6,4454967,CKB +LINE_1,S_4,2022-03-13 05:48:00,2022-03-13 06:06:00,OPPS_3,9067,0,4454967,CKB +LINE_1,OPPS_3,2022-03-13 06:06:00,2022-03-13 06:06:00,DEPS_1,0.06,0,4454967,CKB +LINE_2,DEPS_1,2022-03-12 21:06:00,2022-03-12 21:06:00,S_6,0.06,0,4664765,CKB +LINE_2,S_6,2022-03-12 21:06:00,2022-03-12 21:34:00,S_7,13018,19,4664765,CKB +LINE_2,S_7,2022-03-12 21:53:00,2022-03-12 22:13:00,S_8,10332,17,4664765,CKB +LINE_2,S_8,2022-03-12 22:30:00,2022-03-12 22:54:00,S_7,10.48,19,4664765,CKB +LINE_2,S_7,2022-03-12 23:13:00,2022-03-12 23:33:00,S_8,10332,17,4664765,CKB +LINE_2,S_8,2022-03-12 23:50:00,2022-03-13 00:14:00,S_7,10.48,8,4664765,CKB +LINE_2,S_7,2022-03-13 00:22:00,2022-03-13 00:27:00,S_58,2533,2,4664765,CKB +LINE_3,S_58,2022-03-13 00:29:00,2022-03-13 00:47:00,OPPS_10,7.58,0,4664765,CKB +LINE_3,OPPS_10,2022-03-13 00:47:00,2022-03-13 01:14:00,S_11,12841,3,4664765,CKB +LINE_3,S_11,2022-03-13 01:17:00,2022-03-13 01:47:00,OPPS_10,14281,0,4664765,CKB +LINE_3,OPPS_10,2022-03-13 01:47:00,2022-03-13 02:14:00,S_11,12841,3,4664765,CKB +LINE_3,S_11,2022-03-13 02:17:00,2022-03-13 02:47:00,OPPS_10,14281,0,4664765,CKB +LINE_3,OPPS_10,2022-03-13 02:47:00,2022-03-13 03:14:00,S_11,12841,3,4664765,CKB +LINE_3,S_11,2022-03-13 03:17:00,2022-03-13 03:47:00,OPPS_10,14281,0,4664765,CKB +LINE_3,OPPS_10,2022-03-13 03:47:00,2022-03-13 04:14:00,S_11,12841,3,4664765,CKB +LINE_3,S_11,2022-03-13 04:17:00,2022-03-13 04:47:00,OPPS_10,14281,0,4664765,CKB +LINE_3,OPPS_10,2022-03-13 04:47:00,2022-03-13 05:14:00,S_11,12841,3,4664765,CKB +LINE_3,S_11,2022-03-13 05:17:00,2022-03-13 05:47:00,OPPS_10,14281,0,4664765,CKB +LINE_3,OPPS_10,2022-03-13 05:47:00,2022-03-13 06:14:00,S_11,12841,3,4664765,CKB +LINE_3,S_11,2022-03-13 06:17:00,2022-03-13 06:47:00,OPPS_10,14281,0,4664765,CKB +LINE_3,OPPS_10,2022-03-13 06:47:00,2022-03-13 06:59:00,S_58,5474,0,4664765,CKB +LINE_3,S_58,2022-03-13 06:59:00,2022-03-13 06:59:00,DEPS_1,0.06,0,4664765,CKB +LINE_2,DEPS_1,2022-03-12 20:26:00,2022-03-12 20:26:00,S_6,0.06,0,4762771,CKB +LINE_2,S_6,2022-03-12 20:26:00,2022-03-12 20:56:00,S_12,14097,14,4762771,CKB +LINE_2,S_12,2022-03-12 21:10:00,2022-03-12 21:38:00,S_6,13.19,8,4762771,CKB +LINE_2,S_6,2022-03-12 21:46:00,2022-03-12 22:14:00,S_7,13018,19,4762771,CKB +LINE_2,S_7,2022-03-12 22:33:00,2022-03-12 22:53:00,S_8,10332,17,4762771,CKB +LINE_2,S_8,2022-03-12 23:10:00,2022-03-12 23:34:00,S_7,10.48,19,4762771,CKB +LINE_2,S_7,2022-03-12 23:53:00,2022-03-13 00:13:00,S_8,10332,2,4762771,CKB +LINE_2,S_8,2022-03-13 00:15:00,2022-03-13 00:16:00,OPPS_10,506,1,4762771,CKB +LINE_3,OPPS_10,2022-03-13 00:17:00,2022-03-13 00:44:00,S_11,12841,3,4762771,CKB +LINE_3,S_11,2022-03-13 00:47:00,2022-03-13 01:17:00,OPPS_10,14281,0,4762771,CKB +LINE_3,OPPS_10,2022-03-13 01:17:00,2022-03-13 01:44:00,S_11,12841,3,4762771,CKB +LINE_3,S_11,2022-03-13 01:47:00,2022-03-13 02:17:00,OPPS_10,14281,0,4762771,CKB +LINE_3,OPPS_10,2022-03-13 02:17:00,2022-03-13 02:44:00,S_11,12841,3,4762771,CKB +LINE_3,S_11,2022-03-13 02:47:00,2022-03-13 03:17:00,OPPS_10,14281,0,4762771,CKB +LINE_3,OPPS_10,2022-03-13 03:17:00,2022-03-13 03:44:00,S_11,12841,3,4762771,CKB +LINE_3,S_11,2022-03-13 03:47:00,2022-03-13 04:17:00,OPPS_10,14281,0,4762771,CKB +LINE_3,OPPS_10,2022-03-13 04:17:00,2022-03-13 04:44:00,S_11,12841,3,4762771,CKB +LINE_3,S_11,2022-03-13 04:47:00,2022-03-13 05:17:00,OPPS_10,14281,0,4762771,CKB +LINE_3,OPPS_10,2022-03-13 05:17:00,2022-03-13 05:44:00,S_11,12841,3,4762771,CKB +LINE_3,S_11,2022-03-13 05:47:00,2022-03-13 06:17:00,OPPS_10,14281,0,4762771,CKB +LINE_3,OPPS_10,2022-03-13 06:17:00,2022-03-13 06:44:00,S_11,12841,3,4762771,CKB +LINE_3,S_11,2022-03-13 06:47:00,2022-03-13 07:17:00,OPPS_10,14281,0,4762771,CKB +LINE_3,OPPS_10,2022-03-13 07:17:00,2022-03-13 07:17:00,DEPS_1,0.06,0,4762771,CKB +LINE_5,DEPS_1,2022-03-12 20:26:00,2022-03-12 20:26:00,S_14,0.06,0,4617438,CKB +LINE_5,S_14,2022-03-12 20:26:00,2022-03-12 20:38:00,S_15,5882,3,4617438,CKB +LINE_5,S_15,2022-03-12 20:41:00,2022-03-12 20:55:00,S_14,6232,0,4617438,CKB +LINE_5,S_14,2022-03-12 20:55:00,2022-03-12 21:08:00,S_15,6086,3,4617438,CKB +LINE_5,S_15,2022-03-12 21:11:00,2022-03-12 21:25:00,S_14,6232,0,4617438,CKB +LINE_5,S_14,2022-03-12 21:25:00,2022-03-12 21:38:00,S_15,6086,3,4617438,CKB +LINE_5,S_15,2022-03-12 21:41:00,2022-03-12 21:55:00,S_14,6232,0,4617438,CKB +LINE_5,S_14,2022-03-12 21:55:00,2022-03-12 22:08:00,S_15,6086,3,4617438,CKB +LINE_5,S_15,2022-03-12 22:11:00,2022-03-12 22:25:00,S_14,6232,0,4617438,CKB +LINE_5,S_14,2022-03-12 22:25:00,2022-03-12 22:38:00,S_15,6086,3,4617438,CKB +LINE_5,S_15,2022-03-12 22:41:00,2022-03-12 22:55:00,S_14,6232,0,4617438,CKB +LINE_5,S_14,2022-03-12 22:55:00,2022-03-12 23:08:00,S_15,6086,3,4617438,CKB +LINE_5,S_15,2022-03-12 23:11:00,2022-03-12 23:25:00,S_14,6232,0,4617438,CKB +LINE_5,S_14,2022-03-12 23:25:00,2022-03-12 23:38:00,S_15,6086,3,4617438,CKB +LINE_5,S_15,2022-03-12 23:41:00,2022-03-12 23:55:00,S_14,6232,0,4617438,CKB +LINE_5,S_14,2022-03-12 23:55:00,2022-03-13 00:08:00,S_15,6086,0,4617438,CKB +LINE_5,S_15,2022-03-13 00:08:00,2022-03-13 00:08:00,DEPS_1,0.06,0,4617438,CKB +LINE_6,DEPS_1,2022-03-12 05:25:00,2022-03-12 05:25:00,S_16,0.06,0,4426894,CKB +LINE_6,S_16,2022-03-12 05:25:00,2022-03-12 05:34:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 05:34:00,2022-03-12 05:43:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 06:05:00,2022-03-12 06:14:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 06:14:00,2022-03-12 06:23:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 06:25:00,2022-03-12 06:34:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 06:34:00,2022-03-12 06:43:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 06:45:00,2022-03-12 06:54:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 06:54:00,2022-03-12 07:03:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 07:05:00,2022-03-12 07:14:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 07:14:00,2022-03-12 07:23:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 07:25:00,2022-03-12 07:34:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 07:34:00,2022-03-12 07:43:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 08:05:00,2022-03-12 08:14:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 08:14:00,2022-03-12 08:23:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 08:25:00,2022-03-12 08:34:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 08:34:00,2022-03-12 08:43:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 08:45:00,2022-03-12 08:54:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 08:54:00,2022-03-12 09:03:00,S_16,5139,3,4426894,CKB +LINE_6,S_16,2022-03-12 09:06:00,2022-03-12 09:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 09:15:00,2022-03-12 09:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 09:26:00,2022-03-12 09:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 09:35:00,2022-03-12 09:44:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 10:06:00,2022-03-12 10:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 10:15:00,2022-03-12 10:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 10:26:00,2022-03-12 10:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 10:35:00,2022-03-12 10:44:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 10:46:00,2022-03-12 10:55:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 10:55:00,2022-03-12 11:04:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 11:06:00,2022-03-12 11:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 11:15:00,2022-03-12 11:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 11:26:00,2022-03-12 11:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 11:35:00,2022-03-12 11:44:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 12:06:00,2022-03-12 12:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 12:15:00,2022-03-12 12:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 12:26:00,2022-03-12 12:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 12:35:00,2022-03-12 12:44:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 12:46:00,2022-03-12 12:55:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 12:55:00,2022-03-12 13:04:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 13:06:00,2022-03-12 13:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 13:15:00,2022-03-12 13:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 13:26:00,2022-03-12 13:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 13:35:00,2022-03-12 13:44:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 14:06:00,2022-03-12 14:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 14:15:00,2022-03-12 14:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 14:26:00,2022-03-12 14:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 14:35:00,2022-03-12 14:44:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 14:46:00,2022-03-12 14:55:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 14:55:00,2022-03-12 15:04:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 15:06:00,2022-03-12 15:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 15:15:00,2022-03-12 15:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 15:26:00,2022-03-12 15:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 15:35:00,2022-03-12 15:44:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 16:06:00,2022-03-12 16:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 16:15:00,2022-03-12 16:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 16:26:00,2022-03-12 16:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 16:35:00,2022-03-12 16:44:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 16:46:00,2022-03-12 16:55:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 16:55:00,2022-03-12 17:04:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 17:06:00,2022-03-12 17:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 17:15:00,2022-03-12 17:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 17:26:00,2022-03-12 17:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 17:35:00,2022-03-12 17:44:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 18:06:00,2022-03-12 18:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 18:15:00,2022-03-12 18:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 18:26:00,2022-03-12 18:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 18:35:00,2022-03-12 18:44:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 18:46:00,2022-03-12 18:55:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 18:55:00,2022-03-12 19:04:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 19:06:00,2022-03-12 19:15:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 19:15:00,2022-03-12 19:24:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 19:26:00,2022-03-12 19:35:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 19:35:00,2022-03-12 19:44:00,S_16,5139,21,4426894,CKB +LINE_6,S_16,2022-03-12 20:05:00,2022-03-12 20:14:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 20:14:00,2022-03-12 20:23:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 20:25:00,2022-03-12 20:34:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 20:34:00,2022-03-12 20:43:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 20:45:00,2022-03-12 20:54:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 20:54:00,2022-03-12 21:03:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 21:05:00,2022-03-12 21:14:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 21:14:00,2022-03-12 21:23:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 21:25:00,2022-03-12 21:34:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 21:34:00,2022-03-12 21:43:00,S_16,5139,22,4426894,CKB +LINE_6,S_16,2022-03-12 22:05:00,2022-03-12 22:14:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 22:14:00,2022-03-12 22:23:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 22:25:00,2022-03-12 22:34:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 22:34:00,2022-03-12 22:43:00,S_16,5139,2,4426894,CKB +LINE_6,S_16,2022-03-12 22:45:00,2022-03-12 22:54:00,S_17,4781,0,4426894,CKB +LINE_6,S_17,2022-03-12 22:54:00,2022-03-12 23:03:00,S_16,5139,0,4426894,CKB +LINE_6,S_16,2022-03-12 23:03:00,2022-03-12 23:03:00,DEPS_1,0.06,0,4426894,CKB +LINE_29,DEPS_1,2022-03-12 07:30:00,2022-03-12 07:30:00,S_53,0.06,0,4369705,CKB +LINE_29,S_53,2022-03-12 07:30:00,2022-03-12 07:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 07:39:00,2022-03-12 07:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 07:50:00,2022-03-12 07:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 07:59:00,2022-03-12 08:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 08:10:00,2022-03-12 08:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 08:19:00,2022-03-12 08:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 08:30:00,2022-03-12 08:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 08:39:00,2022-03-12 08:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 08:50:00,2022-03-12 08:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 08:59:00,2022-03-12 09:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 09:10:00,2022-03-12 09:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 09:19:00,2022-03-12 09:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 09:30:00,2022-03-12 09:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 09:39:00,2022-03-12 09:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 09:50:00,2022-03-12 09:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 09:59:00,2022-03-12 10:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 10:10:00,2022-03-12 10:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 10:19:00,2022-03-12 10:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 10:30:00,2022-03-12 10:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 10:39:00,2022-03-12 10:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 10:50:00,2022-03-12 10:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 10:59:00,2022-03-12 11:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 11:10:00,2022-03-12 11:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 11:19:00,2022-03-12 11:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 11:30:00,2022-03-12 11:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 11:39:00,2022-03-12 11:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 11:50:00,2022-03-12 11:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 11:59:00,2022-03-12 12:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 12:10:00,2022-03-12 12:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 12:19:00,2022-03-12 12:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 12:30:00,2022-03-12 12:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 12:39:00,2022-03-12 12:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 12:50:00,2022-03-12 12:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 12:59:00,2022-03-12 13:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 13:10:00,2022-03-12 13:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 13:19:00,2022-03-12 13:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 13:30:00,2022-03-12 13:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 13:39:00,2022-03-12 13:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 13:50:00,2022-03-12 13:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 13:59:00,2022-03-12 14:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 14:10:00,2022-03-12 14:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 14:19:00,2022-03-12 14:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 14:30:00,2022-03-12 14:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 14:39:00,2022-03-12 14:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 14:50:00,2022-03-12 14:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 14:59:00,2022-03-12 15:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 15:10:00,2022-03-12 15:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 15:19:00,2022-03-12 15:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 15:30:00,2022-03-12 15:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 15:39:00,2022-03-12 15:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 15:50:00,2022-03-12 15:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 15:59:00,2022-03-12 16:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 16:10:00,2022-03-12 16:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 16:19:00,2022-03-12 16:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 16:30:00,2022-03-12 16:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 16:39:00,2022-03-12 16:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 16:50:00,2022-03-12 16:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 16:59:00,2022-03-12 17:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 17:10:00,2022-03-12 17:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 17:19:00,2022-03-12 17:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 17:30:00,2022-03-12 17:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 17:39:00,2022-03-12 17:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 17:50:00,2022-03-12 17:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 17:59:00,2022-03-12 18:10:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 18:10:00,2022-03-12 18:15:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 18:19:00,2022-03-12 18:30:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 18:30:00,2022-03-12 18:35:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 18:39:00,2022-03-12 18:50:00,S_53,4341,0,4369705,CKB +LINE_29,S_53,2022-03-12 18:50:00,2022-03-12 18:55:00,S_54,2217,4,4369705,CKB +LINE_29,S_54,2022-03-12 18:59:00,2022-03-12 19:10:00,S_53,4288,0,4369705,CKB +LINE_29,S_53,2022-03-12 19:10:00,2022-03-12 19:10:00,DEPS_1,0.06,0,4369705,CKB +LINE_9,DEPS_23,2022-03-12 08:08:00,2022-03-12 08:41:00,S_22,17.9,0,4317640,VDL +LINE_9,S_22,2022-03-12 08:41:00,2022-03-12 08:54:00,S_22,4637,9,4317640,VDL +LINE_9,S_22,2022-03-12 09:03:00,2022-03-12 09:17:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 09:21:00,2022-03-12 09:35:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 09:43:00,2022-03-12 09:57:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 10:01:00,2022-03-12 10:15:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 10:23:00,2022-03-12 10:37:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 10:41:00,2022-03-12 10:55:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 11:03:00,2022-03-12 11:17:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 11:21:00,2022-03-12 11:35:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 11:43:00,2022-03-12 11:57:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 12:01:00,2022-03-12 12:15:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 12:23:00,2022-03-12 12:37:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 12:41:00,2022-03-12 12:55:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 13:03:00,2022-03-12 13:17:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 13:21:00,2022-03-12 13:35:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 13:43:00,2022-03-12 13:57:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 14:01:00,2022-03-12 14:15:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 14:23:00,2022-03-12 14:37:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 14:41:00,2022-03-12 14:55:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 15:03:00,2022-03-12 15:17:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 15:21:00,2022-03-12 15:35:00,S_22,4637,8,4317640,VDL +LINE_9,S_22,2022-03-12 15:43:00,2022-03-12 15:57:00,S_22,4637,4,4317640,VDL +LINE_9,S_22,2022-03-12 16:01:00,2022-03-12 16:14:00,S_22,4637,0,4317640,VDL +LINE_9,S_22,2022-03-12 16:14:00,2022-03-12 16:57:00,DEPS_23,19.8,0,4317640,VDL +LINE_30,DEPS_1,2022-03-12 07:18:00,2022-03-12 07:18:00,S_55,0.06,0,4706426,CKB +LINE_30,S_55,2022-03-12 07:18:00,2022-03-12 07:26:00,S_56,5562,10,4706426,CKB +LINE_30,S_56,2022-03-12 07:36:00,2022-03-12 07:45:00,S_57,5941,32,4706426,CKB +LINE_30,S_57,2022-03-12 08:17:00,2022-03-12 08:26:00,S_56,5994,8,4706426,CKB +LINE_30,S_56,2022-03-12 08:34:00,2022-03-12 08:42:00,S_55,5566,0,4706426,CKB +LINE_30,S_55,2022-03-12 08:42:00,2022-03-12 08:42:00,DEPS_1,0.06,0,4706426,CKB +LINE_12,DEPS_1,2022-03-12 08:10:00,2022-03-12 08:10:00,S_27,0.06,0,4731254,CKB +LINE_12,S_27,2022-03-12 08:10:00,2022-03-12 08:16:00,OPPS_28,2169,12,4731254,CKB +LINE_12,OPPS_28,2022-03-12 08:28:00,2022-03-12 08:38:00,S_27,2952,2,4731254,CKB +LINE_12,S_27,2022-03-12 08:40:00,2022-03-12 08:46:00,OPPS_28,2169,12,4731254,CKB +LINE_12,OPPS_28,2022-03-12 08:58:00,2022-03-12 09:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 09:10:00,2022-03-12 09:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 09:28:00,2022-03-12 09:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 09:40:00,2022-03-12 09:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 09:58:00,2022-03-12 10:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 10:10:00,2022-03-12 10:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 10:28:00,2022-03-12 10:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 10:40:00,2022-03-12 10:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 10:58:00,2022-03-12 11:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 11:10:00,2022-03-12 11:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 11:28:00,2022-03-12 11:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 11:40:00,2022-03-12 11:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 11:58:00,2022-03-12 12:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 12:10:00,2022-03-12 12:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 12:28:00,2022-03-12 12:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 12:40:00,2022-03-12 12:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 12:58:00,2022-03-12 13:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 13:10:00,2022-03-12 13:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 13:28:00,2022-03-12 13:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 13:40:00,2022-03-12 13:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 13:58:00,2022-03-12 14:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 14:10:00,2022-03-12 14:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 14:28:00,2022-03-12 14:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 14:40:00,2022-03-12 14:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 14:58:00,2022-03-12 15:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 15:10:00,2022-03-12 15:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 15:28:00,2022-03-12 15:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 15:40:00,2022-03-12 15:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 15:58:00,2022-03-12 16:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 16:10:00,2022-03-12 16:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 16:28:00,2022-03-12 16:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 16:40:00,2022-03-12 16:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 16:58:00,2022-03-12 17:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 17:10:00,2022-03-12 17:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 17:28:00,2022-03-12 17:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 17:40:00,2022-03-12 17:48:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 17:58:00,2022-03-12 18:10:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 18:10:00,2022-03-12 18:18:00,OPPS_28,2169,10,4731254,CKB +LINE_12,OPPS_28,2022-03-12 18:28:00,2022-03-12 18:40:00,S_27,2952,0,4731254,CKB +LINE_12,S_27,2022-03-12 18:40:00,2022-03-12 18:48:00,OPPS_28,2169,0,4731254,CKB +LINE_12,OPPS_28,2022-03-12 18:48:00,2022-03-12 18:48:00,DEPS_1,0.06,0,4731254,CKB +LINE_13,DEPS_1,2022-03-13 00:23:00,2022-03-13 00:23:00,S_29,0.06,0,4317771,CKB +LINE_13,S_29,2022-03-13 00:23:00,2022-03-13 00:30:00,OPPS_30,2577,9,4317771,CKB +LINE_14,OPPS_30,2022-03-13 00:39:00,2022-03-13 00:54:00,S_31,5937,9,4317771,CKB +LINE_14,S_31,2022-03-13 01:03:00,2022-03-13 01:17:00,OPPS_30,6.19,0,4317771,CKB +LINE_13,OPPS_30,2022-03-13 01:17:00,2022-03-13 01:23:00,S_29,2555,0,4317771,CKB +LINE_13,S_29,2022-03-13 01:23:00,2022-03-13 01:30:00,OPPS_30,2577,9,4317771,CKB +LINE_14,OPPS_30,2022-03-13 01:39:00,2022-03-13 01:54:00,S_31,5937,9,4317771,CKB +LINE_14,S_31,2022-03-13 02:03:00,2022-03-13 02:17:00,OPPS_30,6.19,0,4317771,CKB +LINE_13,OPPS_30,2022-03-13 02:17:00,2022-03-13 02:23:00,S_29,2555,0,4317771,CKB +LINE_13,S_29,2022-03-13 02:23:00,2022-03-13 02:30:00,OPPS_30,2577,9,4317771,CKB +LINE_14,OPPS_30,2022-03-13 02:39:00,2022-03-13 02:54:00,S_31,5937,9,4317771,CKB +LINE_14,S_31,2022-03-13 03:03:00,2022-03-13 03:17:00,OPPS_30,6.19,0,4317771,CKB +LINE_13,OPPS_30,2022-03-13 03:17:00,2022-03-13 03:23:00,S_29,2555,0,4317771,CKB +LINE_13,S_29,2022-03-13 03:23:00,2022-03-13 03:30:00,OPPS_30,2577,9,4317771,CKB +LINE_14,OPPS_30,2022-03-13 03:39:00,2022-03-13 03:54:00,S_31,5937,9,4317771,CKB +LINE_14,S_31,2022-03-13 04:03:00,2022-03-13 04:17:00,OPPS_30,6.19,0,4317771,CKB +LINE_13,OPPS_30,2022-03-13 04:17:00,2022-03-13 04:23:00,S_29,2555,0,4317771,CKB +LINE_13,S_29,2022-03-13 04:23:00,2022-03-13 04:30:00,OPPS_30,2577,9,4317771,CKB +LINE_14,OPPS_30,2022-03-13 04:39:00,2022-03-13 04:54:00,S_31,5937,9,4317771,CKB +LINE_14,S_31,2022-03-13 05:03:00,2022-03-13 05:17:00,OPPS_30,6.19,0,4317771,CKB +LINE_13,OPPS_30,2022-03-13 05:17:00,2022-03-13 05:23:00,S_29,2555,0,4317771,CKB +LINE_13,S_29,2022-03-13 05:23:00,2022-03-13 05:30:00,OPPS_30,2577,9,4317771,CKB +LINE_14,OPPS_30,2022-03-13 05:39:00,2022-03-13 05:54:00,S_31,5937,9,4317771,CKB +LINE_14,S_31,2022-03-13 06:03:00,2022-03-13 06:17:00,OPPS_30,6.19,0,4317771,CKB +LINE_13,OPPS_30,2022-03-13 06:17:00,2022-03-13 06:23:00,S_29,2555,0,4317771,CKB +LINE_13,S_29,2022-03-13 06:23:00,2022-03-13 06:30:00,OPPS_30,2577,9,4317771,CKB +LINE_14,OPPS_30,2022-03-13 06:39:00,2022-03-13 06:54:00,S_31,5937,0,4317771,CKB +LINE_14,S_31,2022-03-13 06:54:00,2022-03-13 06:54:00,DEPS_1,0.06,0,4317771,CKB +LINE_14,DEPS_1,2022-03-13 00:33:00,2022-03-13 00:33:00,S_31,0.06,0,4317937,CKB +LINE_14,S_31,2022-03-13 00:33:00,2022-03-13 00:47:00,OPPS_30,6.19,0,4317937,CKB +LINE_13,OPPS_30,2022-03-13 00:47:00,2022-03-13 00:53:00,S_29,2555,0,4317937,CKB +LINE_13,S_29,2022-03-13 00:53:00,2022-03-13 01:00:00,OPPS_30,2577,9,4317937,CKB +LINE_14,OPPS_30,2022-03-13 01:09:00,2022-03-13 01:24:00,S_31,5937,9,4317937,CKB +LINE_14,S_31,2022-03-13 01:33:00,2022-03-13 01:47:00,OPPS_30,6.19,0,4317937,CKB +LINE_13,OPPS_30,2022-03-13 01:47:00,2022-03-13 01:53:00,S_29,2555,0,4317937,CKB +LINE_13,S_29,2022-03-13 01:53:00,2022-03-13 02:00:00,OPPS_30,2577,9,4317937,CKB +LINE_14,OPPS_30,2022-03-13 02:09:00,2022-03-13 02:24:00,S_31,5937,9,4317937,CKB +LINE_14,S_31,2022-03-13 02:33:00,2022-03-13 02:47:00,OPPS_30,6.19,0,4317937,CKB +LINE_13,OPPS_30,2022-03-13 02:47:00,2022-03-13 02:53:00,S_29,2555,0,4317937,CKB +LINE_13,S_29,2022-03-13 02:53:00,2022-03-13 03:00:00,OPPS_30,2577,9,4317937,CKB +LINE_14,OPPS_30,2022-03-13 03:09:00,2022-03-13 03:24:00,S_31,5937,9,4317937,CKB +LINE_14,S_31,2022-03-13 03:33:00,2022-03-13 03:47:00,OPPS_30,6.19,0,4317937,CKB +LINE_13,OPPS_30,2022-03-13 03:47:00,2022-03-13 03:53:00,S_29,2555,0,4317937,CKB +LINE_13,S_29,2022-03-13 03:53:00,2022-03-13 04:00:00,OPPS_30,2577,9,4317937,CKB +LINE_14,OPPS_30,2022-03-13 04:09:00,2022-03-13 04:24:00,S_31,5937,9,4317937,CKB +LINE_14,S_31,2022-03-13 04:33:00,2022-03-13 04:47:00,OPPS_30,6.19,0,4317937,CKB +LINE_13,OPPS_30,2022-03-13 04:47:00,2022-03-13 04:53:00,S_29,2555,0,4317937,CKB +LINE_13,S_29,2022-03-13 04:53:00,2022-03-13 05:00:00,OPPS_30,2577,9,4317937,CKB +LINE_14,OPPS_30,2022-03-13 05:09:00,2022-03-13 05:24:00,S_31,5937,9,4317937,CKB +LINE_14,S_31,2022-03-13 05:33:00,2022-03-13 05:47:00,OPPS_30,6.19,0,4317937,CKB +LINE_13,OPPS_30,2022-03-13 05:47:00,2022-03-13 05:53:00,S_29,2555,0,4317937,CKB +LINE_13,S_29,2022-03-13 05:53:00,2022-03-13 06:00:00,OPPS_30,2577,9,4317937,CKB +LINE_14,OPPS_30,2022-03-13 06:09:00,2022-03-13 06:24:00,S_31,5937,9,4317937,CKB +LINE_14,S_31,2022-03-13 06:33:00,2022-03-13 06:47:00,OPPS_30,6.19,0,4317937,CKB +LINE_14,OPPS_30,2022-03-13 06:47:00,2022-03-13 06:47:00,DEPS_1,0.06,0,4317937,CKB +LINE_15,DEPS_1,2022-03-13 00:57:00,2022-03-13 00:57:00,OPPS_32,0.06,0,4319402,CKB +LINE_15,OPPS_32,2022-03-13 00:57:00,2022-03-13 01:06:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 01:06:00,2022-03-13 01:11:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 01:27:00,2022-03-13 01:36:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 01:36:00,2022-03-13 01:41:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 01:57:00,2022-03-13 02:06:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 02:06:00,2022-03-13 02:11:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 02:27:00,2022-03-13 02:36:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 02:36:00,2022-03-13 02:41:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 02:57:00,2022-03-13 03:06:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 03:06:00,2022-03-13 03:11:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 03:27:00,2022-03-13 03:36:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 03:36:00,2022-03-13 03:41:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 03:57:00,2022-03-13 04:06:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 04:06:00,2022-03-13 04:11:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 04:27:00,2022-03-13 04:36:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 04:36:00,2022-03-13 04:41:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 04:57:00,2022-03-13 05:06:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 05:06:00,2022-03-13 05:11:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 05:27:00,2022-03-13 05:36:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 05:36:00,2022-03-13 05:41:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 05:57:00,2022-03-13 06:06:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 06:06:00,2022-03-13 06:11:00,OPPS_32,2936,16,4319402,CKB +LINE_15,OPPS_32,2022-03-13 06:27:00,2022-03-13 06:36:00,S_33,4343,0,4319402,CKB +LINE_15,S_33,2022-03-13 06:36:00,2022-03-13 06:41:00,OPPS_32,2936,0,4319402,CKB +LINE_15,OPPS_32,2022-03-13 06:41:00,2022-03-13 06:41:00,DEPS_1,0.06,0,4319402,CKB +LINE_17,DEPS_1,2022-03-13 00:30:00,2022-03-13 00:30:00,S_34,0.06,0,4453948,CKB +LINE_17,S_34,2022-03-13 00:30:00,2022-03-13 00:44:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 00:44:00,2022-03-13 00:57:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 01:00:00,2022-03-13 01:14:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 01:14:00,2022-03-13 01:27:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 01:30:00,2022-03-13 01:44:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 01:44:00,2022-03-13 01:57:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 02:00:00,2022-03-13 02:14:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 02:14:00,2022-03-13 02:27:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 02:30:00,2022-03-13 02:44:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 02:44:00,2022-03-13 02:57:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 03:00:00,2022-03-13 03:14:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 03:14:00,2022-03-13 03:27:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 03:30:00,2022-03-13 03:44:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 03:44:00,2022-03-13 03:57:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 04:00:00,2022-03-13 04:14:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 04:14:00,2022-03-13 04:27:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 04:30:00,2022-03-13 04:44:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 04:44:00,2022-03-13 04:57:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 05:00:00,2022-03-13 05:14:00,S_36,4801,0,4453948,CKB +LINE_17,S_36,2022-03-13 05:14:00,2022-03-13 05:27:00,S_34,5302,3,4453948,CKB +LINE_17,S_34,2022-03-13 05:30:00,2022-03-13 05:44:00,S_36,4.8,0,4453948,CKB +LINE_17,S_36,2022-03-13 05:44:00,2022-03-13 05:56:00,S_34,5301,4,4453948,CKB +LINE_17,S_34,2022-03-13 06:00:00,2022-03-13 06:14:00,S_36,4.8,0,4453948,CKB +LINE_17,S_36,2022-03-13 06:14:00,2022-03-13 06:26:00,S_34,5301,4,4453948,CKB +LINE_17,S_34,2022-03-13 06:30:00,2022-03-13 06:44:00,S_36,4.8,0,4453948,CKB +LINE_17,S_36,2022-03-13 06:44:00,2022-03-13 06:56:00,S_34,5301,0,4453948,CKB +LINE_17,S_34,2022-03-13 06:56:00,2022-03-13 06:56:00,DEPS_1,0.06,0,4453948,CKB +LINE_20,DEPS_1,2022-03-13 00:32:00,2022-03-13 00:32:00,S_13,0.06,0,4747669,CKB +LINE_20,S_13,2022-03-13 00:32:00,2022-03-13 00:44:00,S_40,4212,3,4747669,CKB +LINE_20,S_40,2022-03-13 00:47:00,2022-03-13 01:16:00,S_41,13048,0,4747669,CKB +LINE_20,S_41,2022-03-13 01:16:00,2022-03-13 01:42:00,S_40,12869,5,4747669,CKB +LINE_20,S_40,2022-03-13 01:47:00,2022-03-13 02:16:00,S_41,13048,0,4747669,CKB +LINE_20,S_41,2022-03-13 02:16:00,2022-03-13 02:42:00,S_40,12869,5,4747669,CKB +LINE_20,S_40,2022-03-13 02:47:00,2022-03-13 03:16:00,S_41,13048,0,4747669,CKB +LINE_20,S_41,2022-03-13 03:16:00,2022-03-13 03:42:00,S_40,12869,5,4747669,CKB +LINE_20,S_40,2022-03-13 03:47:00,2022-03-13 04:16:00,S_41,13048,0,4747669,CKB +LINE_20,S_41,2022-03-13 04:16:00,2022-03-13 04:42:00,S_40,12869,5,4747669,CKB +LINE_20,S_40,2022-03-13 04:47:00,2022-03-13 05:16:00,S_41,13048,0,4747669,CKB +LINE_20,S_41,2022-03-13 05:16:00,2022-03-13 05:42:00,S_40,12869,5,4747669,CKB +LINE_20,S_40,2022-03-13 05:47:00,2022-03-13 06:16:00,S_41,13048,0,4747669,CKB +LINE_20,S_41,2022-03-13 06:16:00,2022-03-13 06:42:00,S_40,12869,0,4747669,CKB +LINE_20,S_40,2022-03-13 06:42:00,2022-03-13 06:42:00,DEPS_1,0.06,0,4747669,CKB +LINE_20,DEPS_1,2022-03-13 00:17:00,2022-03-13 00:17:00,S_40,0.06,0,4747671,CKB +LINE_20,S_40,2022-03-13 00:17:00,2022-03-13 00:46:00,S_41,13048,0,4747671,CKB +LINE_20,S_41,2022-03-13 00:46:00,2022-03-13 01:12:00,S_40,12869,5,4747671,CKB +LINE_20,S_40,2022-03-13 01:17:00,2022-03-13 01:46:00,S_41,13048,0,4747671,CKB +LINE_20,S_41,2022-03-13 01:46:00,2022-03-13 02:12:00,S_40,12869,5,4747671,CKB +LINE_20,S_40,2022-03-13 02:17:00,2022-03-13 02:46:00,S_41,13048,0,4747671,CKB +LINE_20,S_41,2022-03-13 02:46:00,2022-03-13 03:12:00,S_40,12869,5,4747671,CKB +LINE_20,S_40,2022-03-13 03:17:00,2022-03-13 03:46:00,S_41,13048,0,4747671,CKB +LINE_20,S_41,2022-03-13 03:46:00,2022-03-13 04:12:00,S_40,12869,5,4747671,CKB +LINE_20,S_40,2022-03-13 04:17:00,2022-03-13 04:46:00,S_41,13048,0,4747671,CKB +LINE_20,S_41,2022-03-13 04:46:00,2022-03-13 05:12:00,S_40,12869,5,4747671,CKB +LINE_20,S_40,2022-03-13 05:17:00,2022-03-13 05:46:00,S_41,13048,0,4747671,CKB +LINE_20,S_41,2022-03-13 05:46:00,2022-03-13 06:12:00,S_40,12869,5,4747671,CKB +LINE_20,S_40,2022-03-13 06:17:00,2022-03-13 06:46:00,S_41,13048,0,4747671,CKB +LINE_20,S_41,2022-03-13 06:46:00,2022-03-13 07:12:00,S_40,12869,0,4747671,CKB +LINE_20,S_40,2022-03-13 07:12:00,2022-03-13 07:12:00,DEPS_1,0.06,0,4747671,CKB +LINE_21,DEPS_1,2022-03-13 00:49:00,2022-03-13 00:49:00,OPPS_3,0.06,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 00:49:00,2022-03-13 01:04:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 01:04:00,2022-03-13 01:19:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 01:19:00,2022-03-13 01:34:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 01:34:00,2022-03-13 01:49:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 01:49:00,2022-03-13 02:04:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 02:04:00,2022-03-13 02:19:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 02:19:00,2022-03-13 02:34:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 02:34:00,2022-03-13 02:49:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 02:49:00,2022-03-13 03:04:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 03:04:00,2022-03-13 03:19:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 03:19:00,2022-03-13 03:34:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 03:34:00,2022-03-13 03:49:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 03:49:00,2022-03-13 04:04:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 04:04:00,2022-03-13 04:19:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 04:19:00,2022-03-13 04:34:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 04:34:00,2022-03-13 04:49:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 04:49:00,2022-03-13 05:04:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 05:04:00,2022-03-13 05:19:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 05:19:00,2022-03-13 05:34:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 05:34:00,2022-03-13 05:49:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 05:49:00,2022-03-13 06:04:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 06:04:00,2022-03-13 06:19:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 06:19:00,2022-03-13 06:34:00,S_16,10229,0,4434314,CKB +LINE_21,S_16,2022-03-13 06:34:00,2022-03-13 06:49:00,OPPS_3,11801,0,4434314,CKB +LINE_21,OPPS_3,2022-03-13 06:49:00,2022-03-13 06:49:00,DEPS_1,0.06,0,4434314,CKB +LINE_23,DEPS_1,2022-03-13 02:34:00,2022-03-13 02:34:00,S_45,0.06,0,4524178,CKB +LINE_23,S_45,2022-03-13 02:34:00,2022-03-13 03:00:00,S_46,9016,0,4524178,CKB +LINE_23,S_46,2022-03-13 03:00:00,2022-03-13 03:27:00,S_45,10083,7,4524178,CKB +LINE_23,S_45,2022-03-13 03:34:00,2022-03-13 04:00:00,S_46,9016,0,4524178,CKB +LINE_23,S_46,2022-03-13 04:00:00,2022-03-13 04:27:00,S_45,10083,7,4524178,CKB +LINE_23,S_45,2022-03-13 04:34:00,2022-03-13 05:00:00,S_46,9016,0,4524178,CKB +LINE_23,S_46,2022-03-13 05:00:00,2022-03-13 05:27:00,S_45,10083,7,4524178,CKB +LINE_23,S_45,2022-03-13 05:34:00,2022-03-13 06:00:00,S_46,9016,0,4524178,CKB +LINE_23,S_46,2022-03-13 06:00:00,2022-03-13 06:27:00,S_45,10083,7,4524178,CKB +LINE_23,S_45,2022-03-13 06:34:00,2022-03-13 07:00:00,S_46,9016,0,4524178,CKB +LINE_23,S_46,2022-03-13 07:00:00,2022-03-13 07:00:00,DEPS_1,0.06,0,4524178,CKB +LINE_23,DEPS_1,2022-03-13 02:04:00,2022-03-13 02:04:00,S_45,0.06,0,4619808,CKB +LINE_23,S_45,2022-03-13 02:04:00,2022-03-13 02:30:00,S_46,9016,0,4619808,CKB +LINE_23,S_46,2022-03-13 02:30:00,2022-03-13 02:57:00,S_45,10083,7,4619808,CKB +LINE_23,S_45,2022-03-13 03:04:00,2022-03-13 03:30:00,S_46,9016,0,4619808,CKB +LINE_23,S_46,2022-03-13 03:30:00,2022-03-13 03:57:00,S_45,10083,7,4619808,CKB +LINE_23,S_45,2022-03-13 04:04:00,2022-03-13 04:30:00,S_46,9016,0,4619808,CKB +LINE_23,S_46,2022-03-13 04:30:00,2022-03-13 04:57:00,S_45,10083,7,4619808,CKB +LINE_23,S_45,2022-03-13 05:04:00,2022-03-13 05:30:00,S_46,9016,0,4619808,CKB +LINE_23,S_46,2022-03-13 05:30:00,2022-03-13 05:57:00,S_45,10083,7,4619808,CKB +LINE_23,S_45,2022-03-13 06:04:00,2022-03-13 06:30:00,S_46,9016,0,4619808,CKB +LINE_23,S_46,2022-03-13 06:30:00,2022-03-13 06:57:00,S_45,10083,0,4619808,CKB +LINE_23,S_45,2022-03-13 06:57:00,2022-03-13 06:57:00,DEPS_1,0.06,0,4619808,CKB +LINE_24,DEPS_1,2022-03-13 00:31:00,2022-03-13 00:31:00,OPPS_21,0.06,0,4374748,CKB +LINE_24,OPPS_21,2022-03-13 00:31:00,2022-03-13 00:44:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 00:44:00,2022-03-13 00:56:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 01:01:00,2022-03-13 01:14:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 01:14:00,2022-03-13 01:26:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 01:31:00,2022-03-13 01:44:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 01:44:00,2022-03-13 01:56:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 02:01:00,2022-03-13 02:14:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 02:14:00,2022-03-13 02:26:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 02:31:00,2022-03-13 02:44:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 02:44:00,2022-03-13 02:56:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 03:01:00,2022-03-13 03:14:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 03:14:00,2022-03-13 03:26:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 03:31:00,2022-03-13 03:44:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 03:44:00,2022-03-13 03:56:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 04:01:00,2022-03-13 04:14:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 04:14:00,2022-03-13 04:26:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 04:31:00,2022-03-13 04:44:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 04:44:00,2022-03-13 04:56:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 05:01:00,2022-03-13 05:14:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 05:14:00,2022-03-13 05:26:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 05:31:00,2022-03-13 05:44:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 05:44:00,2022-03-13 05:56:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 06:01:00,2022-03-13 06:14:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 06:14:00,2022-03-13 06:26:00,OPPS_21,5362,5,4374748,CKB +LINE_24,OPPS_21,2022-03-13 06:31:00,2022-03-13 06:44:00,S_47,4872,0,4374748,CKB +LINE_24,S_47,2022-03-13 06:44:00,2022-03-13 06:56:00,OPPS_21,5362,0,4374748,CKB +LINE_24,OPPS_21,2022-03-13 06:56:00,2022-03-13 06:56:00,DEPS_1,0.06,0,4374748,CKB +LINE_25,DEPS_1,2022-03-13 00:31:00,2022-03-13 00:31:00,OPPS_21,0.06,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 00:31:00,2022-03-13 00:45:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 00:47:00,2022-03-13 01:01:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 01:01:00,2022-03-13 01:15:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 01:17:00,2022-03-13 01:31:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 01:31:00,2022-03-13 01:45:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 01:47:00,2022-03-13 02:01:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 02:01:00,2022-03-13 02:15:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 02:17:00,2022-03-13 02:31:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 02:31:00,2022-03-13 02:45:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 02:47:00,2022-03-13 03:01:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 03:01:00,2022-03-13 03:15:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 03:17:00,2022-03-13 03:31:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 03:31:00,2022-03-13 03:45:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 03:47:00,2022-03-13 04:01:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 04:01:00,2022-03-13 04:15:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 04:17:00,2022-03-13 04:31:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 04:31:00,2022-03-13 04:45:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 04:47:00,2022-03-13 05:01:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 05:01:00,2022-03-13 05:15:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 05:17:00,2022-03-13 05:31:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 05:31:00,2022-03-13 05:45:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 05:47:00,2022-03-13 06:01:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 06:01:00,2022-03-13 06:15:00,S_48,5225,2,4374871,CKB +LINE_25,S_48,2022-03-13 06:17:00,2022-03-13 06:31:00,OPPS_21,7617,0,4374871,CKB +LINE_25,OPPS_21,2022-03-13 06:31:00,2022-03-13 06:45:00,S_48,5096,0,4374871,CKB +LINE_25,S_48,2022-03-13 06:45:00,2022-03-13 06:45:00,DEPS_1,0.06,0,4374871,CKB +LINE_26,DEPS_1,2022-03-13 00:43:00,2022-03-13 00:43:00,S_49,0.06,0,4375017,CKB +LINE_26,S_49,2022-03-13 00:43:00,2022-03-13 00:53:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 00:53:00,2022-03-13 01:03:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 01:13:00,2022-03-13 01:23:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 01:23:00,2022-03-13 01:33:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 01:43:00,2022-03-13 01:53:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 01:53:00,2022-03-13 02:03:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 02:13:00,2022-03-13 02:23:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 02:23:00,2022-03-13 02:33:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 02:43:00,2022-03-13 02:53:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 02:53:00,2022-03-13 03:03:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 03:13:00,2022-03-13 03:23:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 03:23:00,2022-03-13 03:33:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 03:43:00,2022-03-13 03:53:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 03:53:00,2022-03-13 04:03:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 04:13:00,2022-03-13 04:23:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 04:23:00,2022-03-13 04:33:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 04:43:00,2022-03-13 04:53:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 04:53:00,2022-03-13 05:03:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 05:13:00,2022-03-13 05:23:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 05:23:00,2022-03-13 05:33:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 05:43:00,2022-03-13 05:53:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 05:53:00,2022-03-13 06:03:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 06:13:00,2022-03-13 06:23:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 06:23:00,2022-03-13 06:33:00,S_49,4408,10,4375017,CKB +LINE_26,S_49,2022-03-13 06:43:00,2022-03-13 06:53:00,S_50,4507,0,4375017,CKB +LINE_26,S_50,2022-03-13 06:53:00,2022-03-13 07:03:00,S_49,4408,0,4375017,CKB +LINE_26,S_49,2022-03-13 07:03:00,2022-03-13 07:03:00,DEPS_1,0.06,0,4375017,CKB From e1776c78087caa7c09495228bf4d207e17bab0b8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 19 Apr 2022 17:43:17 +0200 Subject: [PATCH 125/802] rename stations again --- data/examples/electrified_stations.json | 22 +- data/examples/trips_example.csv | 7914 +++++++++++------------ 2 files changed, 3968 insertions(+), 3968 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index d36f0f3b..0849c795 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -1,17 +1,17 @@ { "opp_stations": { - "OPPS_3": 3, - "OPPS_10": 1, - "OPPS_21": 2, - "OPPS_26": 5, - "OPPS_28": 4, - "OPPS_30": 4, - "OPPS_32": 3, - "OPPS_39": 5 + "Station-3": 3, + "Station-10": 1, + "Station-21": 2, + "Station-26": 5, + "Station-28": 4, + "Station-30": 4, + "Station-32": 3, + "Station-39": 5 }, "depot_stations": { - "DEPS_1": "None", - "DEPS_23": "None", - "DEPS_42": "None" + "Station-0": "None", + "Station-22": "None", + "Station-42": "None" } } \ No newline at end of file diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 97a79c3b..90b5a733 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,3958 +1,3958 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type -LINE_0,DEPS_1,2022-03-07 21:31:00,2022-03-07 21:31:00,S_0,0.06,0,4454943,CKB -LINE_0,S_0,2022-03-07 21:31:00,2022-03-07 22:04:00,S_2,14519,4,4454943,CKB -LINE_0,S_2,2022-03-07 22:08:00,2022-03-07 22:43:00,S_0,13541,8,4454943,CKB -LINE_0,S_0,2022-03-07 22:51:00,2022-03-07 23:24:00,S_2,14519,4,4454943,CKB -LINE_0,S_2,2022-03-07 23:28:00,2022-03-08 00:03:00,S_0,13541,8,4454943,CKB -LINE_0,S_0,2022-03-08 00:11:00,2022-03-08 00:44:00,S_2,14519,0,4454943,CKB -LINE_1,S_2,2022-03-08 00:44:00,2022-03-08 00:54:00,OPPS_3,4.1,25,4454943,CKB -LINE_1,OPPS_3,2022-03-08 01:19:00,2022-03-08 01:42:00,S_4,8.36,6,4454943,CKB -LINE_1,S_4,2022-03-08 01:48:00,2022-03-08 02:06:00,OPPS_3,9067,13,4454943,CKB -LINE_1,OPPS_3,2022-03-08 02:19:00,2022-03-08 02:42:00,S_4,8.36,6,4454943,CKB -LINE_1,S_4,2022-03-08 02:48:00,2022-03-08 03:06:00,OPPS_3,9067,13,4454943,CKB -LINE_1,OPPS_3,2022-03-08 03:19:00,2022-03-08 03:42:00,S_4,8.36,6,4454943,CKB -LINE_1,S_4,2022-03-08 03:48:00,2022-03-08 04:06:00,OPPS_3,9067,0,4454943,CKB -LINE_1,OPPS_3,2022-03-08 04:06:00,2022-03-08 04:06:00,DEPS_1,0.06,0,4454943,CKB -LINE_0,DEPS_1,2022-03-07 22:11:00,2022-03-07 22:11:00,S_0,0.06,0,4454948,CKB -LINE_0,S_0,2022-03-07 22:11:00,2022-03-07 22:44:00,S_2,14519,4,4454948,CKB -LINE_0,S_2,2022-03-07 22:48:00,2022-03-07 23:23:00,S_0,13541,8,4454948,CKB -LINE_0,S_0,2022-03-07 23:31:00,2022-03-08 00:04:00,S_2,14519,4,4454948,CKB -LINE_0,S_2,2022-03-08 00:08:00,2022-03-08 00:39:00,S_5,12213,0,4454948,CKB -LINE_1,S_5,2022-03-08 00:39:00,2022-03-08 00:47:00,OPPS_3,4.0,2,4454948,CKB -LINE_1,OPPS_3,2022-03-08 00:49:00,2022-03-08 01:12:00,S_4,8.36,6,4454948,CKB -LINE_1,S_4,2022-03-08 01:18:00,2022-03-08 01:36:00,OPPS_3,9067,13,4454948,CKB -LINE_1,OPPS_3,2022-03-08 01:49:00,2022-03-08 02:12:00,S_4,8.36,6,4454948,CKB -LINE_1,S_4,2022-03-08 02:18:00,2022-03-08 02:36:00,OPPS_3,9067,13,4454948,CKB -LINE_1,OPPS_3,2022-03-08 02:49:00,2022-03-08 03:12:00,S_4,8.36,6,4454948,CKB -LINE_1,S_4,2022-03-08 03:18:00,2022-03-08 03:36:00,OPPS_3,9067,13,4454948,CKB -LINE_1,OPPS_3,2022-03-08 03:49:00,2022-03-08 04:12:00,S_4,8.36,0,4454948,CKB -LINE_1,S_4,2022-03-08 04:12:00,2022-03-08 04:12:00,DEPS_1,0.06,0,4454948,CKB -LINE_2,DEPS_1,2022-03-07 21:06:00,2022-03-07 21:06:00,S_6,0.06,0,4664622,CKB -LINE_2,S_6,2022-03-07 21:06:00,2022-03-07 21:34:00,S_7,13018,19,4664622,CKB -LINE_2,S_7,2022-03-07 21:53:00,2022-03-07 22:13:00,S_8,10332,17,4664622,CKB -LINE_2,S_8,2022-03-07 22:30:00,2022-03-07 22:54:00,S_7,10.48,19,4664622,CKB -LINE_2,S_7,2022-03-07 23:13:00,2022-03-07 23:33:00,S_8,10332,17,4664622,CKB -LINE_2,S_8,2022-03-07 23:50:00,2022-03-08 00:14:00,S_7,10.48,2,4664622,CKB -LINE_2,S_7,2022-03-08 00:16:00,2022-03-08 00:23:00,S_9,3709,5,4664622,CKB -LINE_3,S_9,2022-03-08 00:28:00,2022-03-08 00:44:00,OPPS_10,6404,3,4664622,CKB -LINE_3,OPPS_10,2022-03-08 00:47:00,2022-03-08 01:10:00,S_11,10579,7,4664622,CKB -LINE_3,S_11,2022-03-08 01:17:00,2022-03-08 01:44:00,OPPS_10,12007,3,4664622,CKB -LINE_3,OPPS_10,2022-03-08 01:47:00,2022-03-08 02:10:00,S_11,10579,7,4664622,CKB -LINE_3,S_11,2022-03-08 02:17:00,2022-03-08 02:44:00,OPPS_10,12007,3,4664622,CKB -LINE_3,OPPS_10,2022-03-08 02:47:00,2022-03-08 03:10:00,S_11,10579,7,4664622,CKB -LINE_3,S_11,2022-03-08 03:17:00,2022-03-08 03:44:00,OPPS_10,12007,3,4664622,CKB -LINE_3,OPPS_10,2022-03-08 03:47:00,2022-03-08 04:10:00,S_11,10579,7,4664622,CKB -LINE_3,S_11,2022-03-08 04:17:00,2022-03-08 04:44:00,OPPS_10,12007,0,4664622,CKB -LINE_3,OPPS_10,2022-03-08 04:44:00,2022-03-08 04:44:00,DEPS_1,0.06,0,4664622,CKB -LINE_2,DEPS_1,2022-03-07 20:26:00,2022-03-07 20:26:00,S_6,0.06,0,4762732,CKB -LINE_2,S_6,2022-03-07 20:26:00,2022-03-07 20:56:00,S_12,14097,14,4762732,CKB -LINE_2,S_12,2022-03-07 21:10:00,2022-03-07 21:38:00,S_6,13.19,8,4762732,CKB -LINE_2,S_6,2022-03-07 21:46:00,2022-03-07 22:14:00,S_7,13018,19,4762732,CKB -LINE_2,S_7,2022-03-07 22:33:00,2022-03-07 22:53:00,S_8,10332,17,4762732,CKB -LINE_2,S_8,2022-03-07 23:10:00,2022-03-07 23:34:00,S_7,10.48,19,4762732,CKB -LINE_2,S_7,2022-03-07 23:53:00,2022-03-08 00:13:00,S_8,10332,2,4762732,CKB -LINE_2,S_8,2022-03-08 00:15:00,2022-03-08 00:16:00,OPPS_10,506,1,4762732,CKB -LINE_3,OPPS_10,2022-03-08 00:17:00,2022-03-08 00:40:00,S_11,10579,7,4762732,CKB -LINE_3,S_11,2022-03-08 00:47:00,2022-03-08 01:14:00,OPPS_10,12007,3,4762732,CKB -LINE_3,OPPS_10,2022-03-08 01:17:00,2022-03-08 01:40:00,S_11,10579,7,4762732,CKB -LINE_3,S_11,2022-03-08 01:47:00,2022-03-08 02:14:00,OPPS_10,12007,3,4762732,CKB -LINE_3,OPPS_10,2022-03-08 02:17:00,2022-03-08 02:40:00,S_11,10579,7,4762732,CKB -LINE_3,S_11,2022-03-08 02:47:00,2022-03-08 03:14:00,OPPS_10,12007,3,4762732,CKB -LINE_3,OPPS_10,2022-03-08 03:17:00,2022-03-08 03:40:00,S_11,10579,7,4762732,CKB -LINE_3,S_11,2022-03-08 03:47:00,2022-03-08 04:14:00,OPPS_10,12007,3,4762732,CKB -LINE_3,OPPS_10,2022-03-08 04:17:00,2022-03-08 04:40:00,S_11,10579,3,4762732,CKB -LINE_4,S_11,2022-03-08 04:43:00,2022-03-08 04:58:00,S_13,6161,0,4762732,CKB -LINE_4,S_13,2022-03-08 04:58:00,2022-03-08 04:58:00,DEPS_1,0.06,0,4762732,CKB -LINE_5,DEPS_1,2022-03-07 22:56:00,2022-03-07 22:56:00,S_14,0.06,0,4617401,CKB -LINE_5,S_14,2022-03-07 22:56:00,2022-03-07 23:08:00,S_15,5882,3,4617401,CKB -LINE_5,S_15,2022-03-07 23:11:00,2022-03-07 23:25:00,S_14,6232,0,4617401,CKB -LINE_5,S_14,2022-03-07 23:25:00,2022-03-07 23:38:00,S_15,6086,3,4617401,CKB -LINE_5,S_15,2022-03-07 23:41:00,2022-03-07 23:55:00,S_14,6232,0,4617401,CKB -LINE_5,S_14,2022-03-07 23:55:00,2022-03-08 00:08:00,S_15,6086,0,4617401,CKB -LINE_5,S_15,2022-03-08 00:08:00,2022-03-08 00:08:00,DEPS_1,0.06,0,4617401,CKB -LINE_6,DEPS_1,2022-03-07 05:05:00,2022-03-07 05:05:00,S_16,0.06,0,4426844,CKB -LINE_6,S_16,2022-03-07 05:05:00,2022-03-07 05:14:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 05:14:00,2022-03-07 05:23:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 05:25:00,2022-03-07 05:34:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 05:34:00,2022-03-07 05:43:00,S_16,5139,23,4426844,CKB -LINE_6,S_16,2022-03-07 06:06:00,2022-03-07 06:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 06:15:00,2022-03-07 06:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 06:26:00,2022-03-07 06:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 06:35:00,2022-03-07 06:44:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 06:46:00,2022-03-07 06:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 06:55:00,2022-03-07 07:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 07:06:00,2022-03-07 07:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 07:15:00,2022-03-07 07:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 07:26:00,2022-03-07 07:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 07:35:00,2022-03-07 07:44:00,S_16,5139,22,4426844,CKB -LINE_6,S_16,2022-03-07 08:06:00,2022-03-07 08:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 08:15:00,2022-03-07 08:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 08:26:00,2022-03-07 08:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 08:35:00,2022-03-07 08:44:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 08:46:00,2022-03-07 08:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 08:55:00,2022-03-07 09:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 09:06:00,2022-03-07 09:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 09:15:00,2022-03-07 09:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 09:26:00,2022-03-07 09:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 09:35:00,2022-03-07 09:44:00,S_16,5139,22,4426844,CKB -LINE_6,S_16,2022-03-07 10:06:00,2022-03-07 10:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 10:15:00,2022-03-07 10:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 10:26:00,2022-03-07 10:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 10:35:00,2022-03-07 10:44:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 10:46:00,2022-03-07 10:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 10:55:00,2022-03-07 11:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 11:06:00,2022-03-07 11:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 11:15:00,2022-03-07 11:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 11:26:00,2022-03-07 11:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 11:35:00,2022-03-07 11:44:00,S_16,5139,22,4426844,CKB -LINE_6,S_16,2022-03-07 12:06:00,2022-03-07 12:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 12:15:00,2022-03-07 12:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 12:26:00,2022-03-07 12:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 12:35:00,2022-03-07 12:44:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 12:46:00,2022-03-07 12:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 12:55:00,2022-03-07 13:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 13:06:00,2022-03-07 13:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 13:15:00,2022-03-07 13:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 13:26:00,2022-03-07 13:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 13:35:00,2022-03-07 13:44:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 13:46:00,2022-03-07 13:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 13:55:00,2022-03-07 14:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 14:06:00,2022-03-07 14:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 14:15:00,2022-03-07 14:24:00,S_16,5139,22,4426844,CKB -LINE_6,S_16,2022-03-07 14:46:00,2022-03-07 14:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 14:55:00,2022-03-07 15:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 15:06:00,2022-03-07 15:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 15:15:00,2022-03-07 15:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 15:26:00,2022-03-07 15:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 15:35:00,2022-03-07 15:44:00,S_16,5139,22,4426844,CKB -LINE_6,S_16,2022-03-07 16:06:00,2022-03-07 16:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 16:15:00,2022-03-07 16:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 16:26:00,2022-03-07 16:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 16:35:00,2022-03-07 16:44:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 16:46:00,2022-03-07 16:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 16:55:00,2022-03-07 17:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 17:06:00,2022-03-07 17:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 17:15:00,2022-03-07 17:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 17:26:00,2022-03-07 17:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 17:35:00,2022-03-07 17:44:00,S_16,5139,22,4426844,CKB -LINE_6,S_16,2022-03-07 18:06:00,2022-03-07 18:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 18:15:00,2022-03-07 18:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 18:26:00,2022-03-07 18:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 18:35:00,2022-03-07 18:44:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 18:46:00,2022-03-07 18:55:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 18:55:00,2022-03-07 19:04:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 19:06:00,2022-03-07 19:15:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 19:15:00,2022-03-07 19:24:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 19:26:00,2022-03-07 19:35:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 19:35:00,2022-03-07 19:44:00,S_16,5139,21,4426844,CKB -LINE_6,S_16,2022-03-07 20:05:00,2022-03-07 20:14:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 20:14:00,2022-03-07 20:23:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 20:25:00,2022-03-07 20:34:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 20:34:00,2022-03-07 20:43:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 20:45:00,2022-03-07 20:54:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 20:54:00,2022-03-07 21:03:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 21:05:00,2022-03-07 21:14:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 21:14:00,2022-03-07 21:23:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 21:25:00,2022-03-07 21:34:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 21:34:00,2022-03-07 21:43:00,S_16,5139,22,4426844,CKB -LINE_6,S_16,2022-03-07 22:05:00,2022-03-07 22:14:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 22:14:00,2022-03-07 22:23:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 22:25:00,2022-03-07 22:34:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 22:34:00,2022-03-07 22:43:00,S_16,5139,2,4426844,CKB -LINE_6,S_16,2022-03-07 22:45:00,2022-03-07 22:54:00,S_17,4781,0,4426844,CKB -LINE_6,S_17,2022-03-07 22:54:00,2022-03-07 23:03:00,S_16,5139,0,4426844,CKB -LINE_6,S_16,2022-03-07 23:03:00,2022-03-07 23:03:00,DEPS_1,0.06,0,4426844,CKB -LINE_7,DEPS_1,2022-03-08 00:06:00,2022-03-08 00:06:00,S_18,0.06,0,4708594,CKB -LINE_7,S_18,2022-03-08 00:06:00,2022-03-08 00:27:00,S_19,7827,0,4708594,CKB -LINE_8,S_19,2022-03-08 00:27:00,2022-03-08 00:48:00,S_20,11079,0,4708594,CKB -LINE_8,S_20,2022-03-08 00:48:00,2022-03-08 01:25:00,OPPS_21,20641,8,4708594,CKB -LINE_8,OPPS_21,2022-03-08 01:33:00,2022-03-08 02:16:00,S_20,20579,1,4708594,CKB -LINE_8,S_20,2022-03-08 02:17:00,2022-03-08 02:55:00,OPPS_21,20641,8,4708594,CKB -LINE_8,OPPS_21,2022-03-08 03:03:00,2022-03-08 03:46:00,S_20,20579,1,4708594,CKB -LINE_8,S_20,2022-03-08 03:47:00,2022-03-08 04:25:00,OPPS_21,20641,0,4708594,CKB -LINE_8,OPPS_21,2022-03-08 04:25:00,2022-03-08 04:25:00,DEPS_1,0.06,0,4708594,CKB -LINE_9,DEPS_23,2022-03-07 05:15:00,2022-03-07 06:01:00,S_22,17.9,0,4317624,VDL -LINE_9,S_22,2022-03-07 06:01:00,2022-03-07 06:15:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 06:23:00,2022-03-07 06:37:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 06:41:00,2022-03-07 06:55:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 07:03:00,2022-03-07 07:17:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 07:21:00,2022-03-07 07:35:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 07:43:00,2022-03-07 07:57:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 08:01:00,2022-03-07 08:15:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 08:23:00,2022-03-07 08:37:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 08:41:00,2022-03-07 08:55:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 09:03:00,2022-03-07 09:17:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 09:21:00,2022-03-07 09:35:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 09:43:00,2022-03-07 09:57:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 10:01:00,2022-03-07 10:15:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 10:23:00,2022-03-07 10:37:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 10:41:00,2022-03-07 10:55:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 11:03:00,2022-03-07 11:17:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 11:21:00,2022-03-07 11:35:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 11:43:00,2022-03-07 11:57:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 12:01:00,2022-03-07 12:15:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 12:23:00,2022-03-07 12:37:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 12:41:00,2022-03-07 12:55:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 13:03:00,2022-03-07 13:17:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 13:21:00,2022-03-07 13:35:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 13:43:00,2022-03-07 13:57:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 14:01:00,2022-03-07 14:15:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 14:23:00,2022-03-07 14:37:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 14:41:00,2022-03-07 14:55:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 15:03:00,2022-03-07 15:17:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 15:21:00,2022-03-07 15:35:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 15:43:00,2022-03-07 15:57:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 16:01:00,2022-03-07 16:15:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 16:23:00,2022-03-07 16:37:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 16:41:00,2022-03-07 16:55:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 17:03:00,2022-03-07 17:17:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 17:21:00,2022-03-07 17:35:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 17:43:00,2022-03-07 17:57:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 18:01:00,2022-03-07 18:15:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 18:23:00,2022-03-07 18:37:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 18:41:00,2022-03-07 18:55:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 19:03:00,2022-03-07 19:17:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 19:21:00,2022-03-07 19:35:00,S_22,4637,8,4317624,VDL -LINE_9,S_22,2022-03-07 19:43:00,2022-03-07 19:57:00,S_22,4637,4,4317624,VDL -LINE_9,S_22,2022-03-07 20:01:00,2022-03-07 20:14:00,S_22,4637,9,4317624,VDL -LINE_9,S_22,2022-03-07 20:23:00,2022-03-07 20:36:00,S_22,4637,0,4317624,VDL -LINE_9,S_22,2022-03-07 20:36:00,2022-03-07 21:15:00,DEPS_23,19.8,0,4317624,VDL -LINE_10,DEPS_1,2022-03-07 04:56:00,2022-03-07 04:56:00,S_24,0.06,18,4425667,CKB -LINE_10,S_24,2022-03-07 05:14:00,2022-03-07 05:20:00,S_25,3.29,0,4425667,CKB -LINE_10,S_25,2022-03-07 05:20:00,2022-03-07 05:24:00,S_24,2954,20,4425667,CKB -LINE_10,S_24,2022-03-07 05:44:00,2022-03-07 05:50:00,S_25,3.29,0,4425667,CKB -LINE_10,S_25,2022-03-07 05:50:00,2022-03-07 05:54:00,S_24,2954,5,4425667,CKB -LINE_10,S_24,2022-03-07 05:59:00,2022-03-07 06:06:00,S_25,3.29,2,4425667,CKB -LINE_10,S_25,2022-03-07 06:08:00,2022-03-07 06:13:00,S_24,2954,19,4425667,CKB -LINE_10,S_24,2022-03-07 06:32:00,2022-03-07 06:39:00,S_25,3.29,1,4425667,CKB -LINE_10,S_25,2022-03-07 06:40:00,2022-03-07 06:45:00,S_24,2954,7,4425667,CKB -LINE_10,S_24,2022-03-07 06:52:00,2022-03-07 06:59:00,S_25,3.29,1,4425667,CKB -LINE_10,S_25,2022-03-07 07:00:00,2022-03-07 07:05:00,S_24,2954,7,4425667,CKB -LINE_10,S_24,2022-03-07 07:12:00,2022-03-07 07:19:00,S_25,3.29,1,4425667,CKB -LINE_10,S_25,2022-03-07 07:20:00,2022-03-07 07:25:00,S_24,2954,7,4425667,CKB -LINE_10,S_24,2022-03-07 07:32:00,2022-03-07 07:39:00,S_25,3.29,1,4425667,CKB -LINE_10,S_25,2022-03-07 07:40:00,2022-03-07 07:45:00,S_24,2954,295,4425667,CKB -LINE_10,S_24,2022-03-07 12:40:00,2022-03-07 12:47:00,S_25,3.29,2,4425667,CKB -LINE_10,S_25,2022-03-07 12:49:00,2022-03-07 12:54:00,S_24,2954,46,4425667,CKB -LINE_10,S_24,2022-03-07 13:40:00,2022-03-07 13:47:00,S_25,3.29,2,4425667,CKB -LINE_10,S_25,2022-03-07 13:49:00,2022-03-07 13:54:00,S_24,2954,434,4425667,CKB -LINE_10,S_24,2022-03-07 21:08:00,2022-03-07 21:08:00,DEPS_1,0.06,0,4425667,CKB -LINE_11,DEPS_1,2022-03-07 07:20:00,2022-03-07 07:20:00,OPPS_26,0.06,0,4448149,CKB -LINE_11,OPPS_26,2022-03-07 07:20:00,2022-03-07 07:50:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 08:00:00,2022-03-07 08:30:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 08:40:00,2022-03-07 09:10:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 09:20:00,2022-03-07 09:50:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 10:00:00,2022-03-07 10:30:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 10:40:00,2022-03-07 11:10:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 11:20:00,2022-03-07 11:50:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 12:00:00,2022-03-07 12:30:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 12:40:00,2022-03-07 13:10:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 13:20:00,2022-03-07 13:50:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 14:00:00,2022-03-07 14:30:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 14:40:00,2022-03-07 15:10:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 15:20:00,2022-03-07 15:50:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 16:00:00,2022-03-07 16:30:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 16:40:00,2022-03-07 17:10:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 17:20:00,2022-03-07 17:50:00,OPPS_26,9266,10,4448149,CKB -LINE_11,OPPS_26,2022-03-07 18:00:00,2022-03-07 18:30:00,OPPS_26,9266,0,4448149,CKB -LINE_11,OPPS_26,2022-03-07 18:30:00,2022-03-07 18:30:00,DEPS_1,0.06,0,4448149,CKB -LINE_12,DEPS_1,2022-03-07 07:10:00,2022-03-07 07:10:00,S_27,0.06,0,4733894,CKB -LINE_12,S_27,2022-03-07 07:10:00,2022-03-07 07:18:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 07:28:00,2022-03-07 07:40:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 07:40:00,2022-03-07 07:48:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 07:58:00,2022-03-07 08:10:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 08:10:00,2022-03-07 08:18:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 08:28:00,2022-03-07 08:40:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 08:40:00,2022-03-07 08:48:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 08:58:00,2022-03-07 09:10:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 09:10:00,2022-03-07 09:18:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 09:28:00,2022-03-07 09:40:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 09:40:00,2022-03-07 09:48:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 09:58:00,2022-03-07 10:10:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 10:10:00,2022-03-07 10:18:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 10:28:00,2022-03-07 10:40:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 10:40:00,2022-03-07 10:48:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 10:58:00,2022-03-07 11:10:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 11:10:00,2022-03-07 11:18:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 11:28:00,2022-03-07 11:40:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 11:40:00,2022-03-07 11:48:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 11:58:00,2022-03-07 12:10:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 12:10:00,2022-03-07 12:18:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 12:28:00,2022-03-07 12:40:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 12:40:00,2022-03-07 12:48:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 12:58:00,2022-03-07 13:10:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 13:10:00,2022-03-07 13:18:00,OPPS_28,2169,10,4733894,CKB -LINE_12,OPPS_28,2022-03-07 13:28:00,2022-03-07 13:40:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 13:40:00,2022-03-07 13:48:00,OPPS_28,2169,8,4733894,CKB -LINE_12,OPPS_28,2022-03-07 13:56:00,2022-03-07 14:10:00,S_27,2952,0,4733894,CKB -LINE_12,S_27,2022-03-07 14:10:00,2022-03-07 14:19:00,OPPS_28,2169,14,4733894,CKB -LINE_12,OPPS_28,2022-03-07 14:33:00,2022-03-07 14:47:00,S_27,2952,3,4733894,CKB -LINE_12,S_27,2022-03-07 14:50:00,2022-03-07 14:59:00,OPPS_28,2169,14,4733894,CKB -LINE_12,OPPS_28,2022-03-07 15:13:00,2022-03-07 15:27:00,S_27,2952,3,4733894,CKB -LINE_12,S_27,2022-03-07 15:30:00,2022-03-07 15:39:00,OPPS_28,2169,14,4733894,CKB -LINE_12,OPPS_28,2022-03-07 15:53:00,2022-03-07 16:07:00,S_27,2952,3,4733894,CKB -LINE_12,S_27,2022-03-07 16:10:00,2022-03-07 16:19:00,OPPS_28,2169,14,4733894,CKB -LINE_12,OPPS_28,2022-03-07 16:33:00,2022-03-07 16:47:00,S_27,2952,3,4733894,CKB -LINE_12,S_27,2022-03-07 16:50:00,2022-03-07 16:59:00,OPPS_28,2169,14,4733894,CKB -LINE_12,OPPS_28,2022-03-07 17:13:00,2022-03-07 17:27:00,S_27,2952,3,4733894,CKB -LINE_12,S_27,2022-03-07 17:30:00,2022-03-07 17:39:00,OPPS_28,2169,13,4733894,CKB -LINE_12,OPPS_28,2022-03-07 17:52:00,2022-03-07 18:05:00,S_27,2952,5,4733894,CKB -LINE_12,S_27,2022-03-07 18:10:00,2022-03-07 18:18:00,OPPS_28,2169,0,4733894,CKB -LINE_12,OPPS_28,2022-03-07 18:18:00,2022-03-07 18:18:00,DEPS_1,0.06,0,4733894,CKB -LINE_12,DEPS_1,2022-03-07 14:13:00,2022-03-07 14:13:00,OPPS_28,0.06,0,4734199,CKB -LINE_12,OPPS_28,2022-03-07 14:13:00,2022-03-07 14:27:00,S_27,2952,3,4734199,CKB -LINE_12,S_27,2022-03-07 14:30:00,2022-03-07 14:39:00,OPPS_28,2169,14,4734199,CKB -LINE_12,OPPS_28,2022-03-07 14:53:00,2022-03-07 15:07:00,S_27,2952,3,4734199,CKB -LINE_12,S_27,2022-03-07 15:10:00,2022-03-07 15:19:00,OPPS_28,2169,14,4734199,CKB -LINE_12,OPPS_28,2022-03-07 15:33:00,2022-03-07 15:47:00,S_27,2952,3,4734199,CKB -LINE_12,S_27,2022-03-07 15:50:00,2022-03-07 15:59:00,OPPS_28,2169,14,4734199,CKB -LINE_12,OPPS_28,2022-03-07 16:13:00,2022-03-07 16:27:00,S_27,2952,3,4734199,CKB -LINE_12,S_27,2022-03-07 16:30:00,2022-03-07 16:39:00,OPPS_28,2169,14,4734199,CKB -LINE_12,OPPS_28,2022-03-07 16:53:00,2022-03-07 17:07:00,S_27,2952,3,4734199,CKB -LINE_12,S_27,2022-03-07 17:10:00,2022-03-07 17:19:00,OPPS_28,2169,14,4734199,CKB -LINE_12,OPPS_28,2022-03-07 17:33:00,2022-03-07 17:47:00,S_27,2952,3,4734199,CKB -LINE_12,S_27,2022-03-07 17:50:00,2022-03-07 17:59:00,OPPS_28,2169,14,4734199,CKB -LINE_12,OPPS_28,2022-03-07 18:13:00,2022-03-07 18:25:00,S_27,2952,0,4734199,CKB -LINE_12,S_27,2022-03-07 18:25:00,2022-03-07 18:25:00,DEPS_1,0.06,0,4734199,CKB -LINE_13,DEPS_1,2022-03-08 00:23:00,2022-03-08 00:23:00,S_29,0.06,0,4318156,CKB -LINE_13,S_29,2022-03-08 00:23:00,2022-03-08 00:30:00,OPPS_30,2577,9,4318156,CKB -LINE_14,OPPS_30,2022-03-08 00:39:00,2022-03-08 00:54:00,S_31,5937,9,4318156,CKB -LINE_14,S_31,2022-03-08 01:03:00,2022-03-08 01:17:00,OPPS_30,6.19,0,4318156,CKB -LINE_13,OPPS_30,2022-03-08 01:17:00,2022-03-08 01:23:00,S_29,2555,0,4318156,CKB -LINE_13,S_29,2022-03-08 01:23:00,2022-03-08 01:30:00,OPPS_30,2577,9,4318156,CKB -LINE_14,OPPS_30,2022-03-08 01:39:00,2022-03-08 01:54:00,S_31,5937,9,4318156,CKB -LINE_14,S_31,2022-03-08 02:03:00,2022-03-08 02:17:00,OPPS_30,6.19,0,4318156,CKB -LINE_13,OPPS_30,2022-03-08 02:17:00,2022-03-08 02:23:00,S_29,2555,0,4318156,CKB -LINE_13,S_29,2022-03-08 02:23:00,2022-03-08 02:30:00,OPPS_30,2577,9,4318156,CKB -LINE_14,OPPS_30,2022-03-08 02:39:00,2022-03-08 02:54:00,S_31,5937,9,4318156,CKB -LINE_14,S_31,2022-03-08 03:03:00,2022-03-08 03:17:00,OPPS_30,6.19,0,4318156,CKB -LINE_13,OPPS_30,2022-03-08 03:17:00,2022-03-08 03:23:00,S_29,2555,0,4318156,CKB -LINE_13,S_29,2022-03-08 03:23:00,2022-03-08 03:30:00,OPPS_30,2577,9,4318156,CKB -LINE_14,OPPS_30,2022-03-08 03:39:00,2022-03-08 03:54:00,S_31,5937,9,4318156,CKB -LINE_14,S_31,2022-03-08 04:03:00,2022-03-08 04:17:00,OPPS_30,6.19,0,4318156,CKB -LINE_13,OPPS_30,2022-03-08 04:17:00,2022-03-08 04:23:00,S_29,2555,0,4318156,CKB -LINE_13,S_29,2022-03-08 04:23:00,2022-03-08 04:23:00,DEPS_1,0.06,0,4318156,CKB -LINE_14,DEPS_1,2022-03-08 00:33:00,2022-03-08 00:33:00,S_31,0.06,0,4318176,CKB -LINE_14,S_31,2022-03-08 00:33:00,2022-03-08 00:47:00,OPPS_30,6.19,0,4318176,CKB -LINE_13,OPPS_30,2022-03-08 00:47:00,2022-03-08 00:53:00,S_29,2555,0,4318176,CKB -LINE_13,S_29,2022-03-08 00:53:00,2022-03-08 01:00:00,OPPS_30,2577,9,4318176,CKB -LINE_14,OPPS_30,2022-03-08 01:09:00,2022-03-08 01:24:00,S_31,5937,9,4318176,CKB -LINE_14,S_31,2022-03-08 01:33:00,2022-03-08 01:47:00,OPPS_30,6.19,0,4318176,CKB -LINE_13,OPPS_30,2022-03-08 01:47:00,2022-03-08 01:53:00,S_29,2555,0,4318176,CKB -LINE_13,S_29,2022-03-08 01:53:00,2022-03-08 02:00:00,OPPS_30,2577,9,4318176,CKB -LINE_14,OPPS_30,2022-03-08 02:09:00,2022-03-08 02:24:00,S_31,5937,9,4318176,CKB -LINE_14,S_31,2022-03-08 02:33:00,2022-03-08 02:47:00,OPPS_30,6.19,0,4318176,CKB -LINE_13,OPPS_30,2022-03-08 02:47:00,2022-03-08 02:53:00,S_29,2555,0,4318176,CKB -LINE_13,S_29,2022-03-08 02:53:00,2022-03-08 03:00:00,OPPS_30,2577,9,4318176,CKB -LINE_14,OPPS_30,2022-03-08 03:09:00,2022-03-08 03:24:00,S_31,5937,9,4318176,CKB -LINE_14,S_31,2022-03-08 03:33:00,2022-03-08 03:47:00,OPPS_30,6.19,0,4318176,CKB -LINE_13,OPPS_30,2022-03-08 03:47:00,2022-03-08 03:53:00,S_29,2555,0,4318176,CKB -LINE_13,S_29,2022-03-08 03:53:00,2022-03-08 04:00:00,OPPS_30,2577,9,4318176,CKB -LINE_14,OPPS_30,2022-03-08 04:09:00,2022-03-08 04:24:00,S_31,5937,0,4318176,CKB -LINE_14,S_31,2022-03-08 04:24:00,2022-03-08 04:24:00,DEPS_1,0.06,0,4318176,CKB -LINE_15,DEPS_1,2022-03-08 00:57:00,2022-03-08 00:57:00,OPPS_32,0.06,0,4319351,CKB -LINE_15,OPPS_32,2022-03-08 00:57:00,2022-03-08 01:06:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 01:06:00,2022-03-08 01:11:00,OPPS_32,2936,16,4319351,CKB -LINE_15,OPPS_32,2022-03-08 01:27:00,2022-03-08 01:36:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 01:36:00,2022-03-08 01:41:00,OPPS_32,2936,16,4319351,CKB -LINE_15,OPPS_32,2022-03-08 01:57:00,2022-03-08 02:06:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 02:06:00,2022-03-08 02:11:00,OPPS_32,2936,16,4319351,CKB -LINE_15,OPPS_32,2022-03-08 02:27:00,2022-03-08 02:36:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 02:36:00,2022-03-08 02:41:00,OPPS_32,2936,16,4319351,CKB -LINE_15,OPPS_32,2022-03-08 02:57:00,2022-03-08 03:06:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 03:06:00,2022-03-08 03:11:00,OPPS_32,2936,16,4319351,CKB -LINE_15,OPPS_32,2022-03-08 03:27:00,2022-03-08 03:36:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 03:36:00,2022-03-08 03:41:00,OPPS_32,2936,16,4319351,CKB -LINE_15,OPPS_32,2022-03-08 03:57:00,2022-03-08 04:06:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 04:06:00,2022-03-08 04:11:00,OPPS_32,2936,16,4319351,CKB -LINE_15,OPPS_32,2022-03-08 04:27:00,2022-03-08 04:36:00,S_33,4343,0,4319351,CKB -LINE_15,S_33,2022-03-08 04:36:00,2022-03-08 04:36:00,DEPS_1,0.06,0,4319351,CKB -LINE_16,DEPS_1,2022-03-08 00:29:00,2022-03-08 00:29:00,S_34,0.06,0,4751086,CKB -LINE_16,S_34,2022-03-08 00:29:00,2022-03-08 00:41:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 00:47:00,2022-03-08 00:57:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 00:59:00,2022-03-08 01:11:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 01:17:00,2022-03-08 01:27:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 01:29:00,2022-03-08 01:41:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 01:47:00,2022-03-08 01:57:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 01:59:00,2022-03-08 02:11:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 02:17:00,2022-03-08 02:27:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 02:29:00,2022-03-08 02:41:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 02:47:00,2022-03-08 02:57:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 02:59:00,2022-03-08 03:11:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 03:17:00,2022-03-08 03:27:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 03:29:00,2022-03-08 03:41:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 03:47:00,2022-03-08 03:57:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 03:59:00,2022-03-08 04:11:00,S_35,4481,6,4751086,CKB -LINE_16,S_35,2022-03-08 04:17:00,2022-03-08 04:27:00,S_34,4031,2,4751086,CKB -LINE_16,S_34,2022-03-08 04:29:00,2022-03-08 04:41:00,S_35,4481,0,4751086,CKB -LINE_16,S_35,2022-03-08 04:41:00,2022-03-08 04:41:00,DEPS_1,0.06,0,4751086,CKB -LINE_17,DEPS_1,2022-03-08 00:30:00,2022-03-08 00:30:00,S_34,0.06,0,4453544,CKB -LINE_17,S_34,2022-03-08 00:30:00,2022-03-08 00:44:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 00:44:00,2022-03-08 00:57:00,S_34,5302,3,4453544,CKB -LINE_17,S_34,2022-03-08 01:00:00,2022-03-08 01:14:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 01:14:00,2022-03-08 01:27:00,S_34,5302,3,4453544,CKB -LINE_17,S_34,2022-03-08 01:30:00,2022-03-08 01:44:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 01:44:00,2022-03-08 01:57:00,S_34,5302,3,4453544,CKB -LINE_17,S_34,2022-03-08 02:00:00,2022-03-08 02:14:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 02:14:00,2022-03-08 02:27:00,S_34,5302,3,4453544,CKB -LINE_17,S_34,2022-03-08 02:30:00,2022-03-08 02:44:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 02:44:00,2022-03-08 02:57:00,S_34,5302,3,4453544,CKB -LINE_17,S_34,2022-03-08 03:00:00,2022-03-08 03:14:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 03:14:00,2022-03-08 03:27:00,S_34,5302,3,4453544,CKB -LINE_17,S_34,2022-03-08 03:30:00,2022-03-08 03:44:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 03:44:00,2022-03-08 03:57:00,S_34,5302,3,4453544,CKB -LINE_17,S_34,2022-03-08 04:00:00,2022-03-08 04:14:00,S_36,4801,0,4453544,CKB -LINE_17,S_36,2022-03-08 04:14:00,2022-03-08 04:27:00,S_34,5302,0,4453544,CKB -LINE_17,S_34,2022-03-08 04:27:00,2022-03-08 04:27:00,DEPS_1,0.06,0,4453544,CKB -LINE_18,DEPS_1,2022-03-08 00:43:00,2022-03-08 00:43:00,S_37,0.06,0,4374466,CKB -LINE_18,S_37,2022-03-08 00:43:00,2022-03-08 01:33:00,S_37,20434,10,4374466,CKB -LINE_18,S_37,2022-03-08 01:43:00,2022-03-08 02:33:00,S_37,20434,10,4374466,CKB -LINE_18,S_37,2022-03-08 02:43:00,2022-03-08 03:33:00,S_37,20434,10,4374466,CKB -LINE_18,S_37,2022-03-08 03:43:00,2022-03-08 04:33:00,S_37,20434,0,4374466,CKB -LINE_18,S_37,2022-03-08 04:33:00,2022-03-08 04:33:00,DEPS_1,0.06,0,4374466,CKB -LINE_18,DEPS_1,2022-03-08 00:13:00,2022-03-08 00:13:00,S_37,0.06,0,4374471,CKB -LINE_18,S_37,2022-03-08 00:13:00,2022-03-08 01:03:00,S_37,20434,10,4374471,CKB -LINE_18,S_37,2022-03-08 01:13:00,2022-03-08 02:03:00,S_37,20434,10,4374471,CKB -LINE_18,S_37,2022-03-08 02:13:00,2022-03-08 03:03:00,S_37,20434,10,4374471,CKB -LINE_18,S_37,2022-03-08 03:13:00,2022-03-08 04:03:00,S_37,20434,0,4374471,CKB -LINE_18,S_37,2022-03-08 04:03:00,2022-03-08 04:03:00,DEPS_1,0.06,0,4374471,CKB -LINE_19,DEPS_1,2022-03-08 00:24:00,2022-03-08 00:24:00,S_38,0.06,0,4456447,CKB -LINE_19,S_38,2022-03-08 00:24:00,2022-03-08 00:48:00,OPPS_39,11.86,4,4456447,CKB -LINE_19,OPPS_39,2022-03-08 00:52:00,2022-03-08 01:14:00,S_38,11139,10,4456447,CKB -LINE_19,S_38,2022-03-08 01:24:00,2022-03-08 01:48:00,OPPS_39,11.86,4,4456447,CKB -LINE_19,OPPS_39,2022-03-08 01:52:00,2022-03-08 02:14:00,S_38,11139,10,4456447,CKB -LINE_19,S_38,2022-03-08 02:24:00,2022-03-08 02:48:00,OPPS_39,11.86,4,4456447,CKB -LINE_19,OPPS_39,2022-03-08 02:52:00,2022-03-08 03:14:00,S_38,11139,10,4456447,CKB -LINE_19,S_38,2022-03-08 03:24:00,2022-03-08 03:48:00,OPPS_39,11.86,4,4456447,CKB -LINE_19,OPPS_39,2022-03-08 03:52:00,2022-03-08 04:14:00,S_38,11139,0,4456447,CKB -LINE_19,S_38,2022-03-08 04:14:00,2022-03-08 04:14:00,DEPS_1,0.06,0,4456447,CKB -LINE_19,DEPS_1,2022-03-08 00:22:00,2022-03-08 00:22:00,OPPS_39,0.06,0,4456455,CKB -LINE_19,OPPS_39,2022-03-08 00:22:00,2022-03-08 00:44:00,S_38,11139,10,4456455,CKB -LINE_19,S_38,2022-03-08 00:54:00,2022-03-08 01:18:00,OPPS_39,11.86,4,4456455,CKB -LINE_19,OPPS_39,2022-03-08 01:22:00,2022-03-08 01:44:00,S_38,11139,10,4456455,CKB -LINE_19,S_38,2022-03-08 01:54:00,2022-03-08 02:18:00,OPPS_39,11.86,4,4456455,CKB -LINE_19,OPPS_39,2022-03-08 02:22:00,2022-03-08 02:44:00,S_38,11139,10,4456455,CKB -LINE_19,S_38,2022-03-08 02:54:00,2022-03-08 03:18:00,OPPS_39,11.86,4,4456455,CKB -LINE_19,OPPS_39,2022-03-08 03:22:00,2022-03-08 03:44:00,S_38,11139,10,4456455,CKB -LINE_19,S_38,2022-03-08 03:54:00,2022-03-08 04:18:00,OPPS_39,11.86,4,4456455,CKB -LINE_19,OPPS_39,2022-03-08 04:22:00,2022-03-08 04:44:00,S_38,11139,0,4456455,CKB -LINE_19,S_38,2022-03-08 04:44:00,2022-03-08 04:44:00,DEPS_1,0.06,0,4456455,CKB -LINE_20,DEPS_1,2022-03-08 00:32:00,2022-03-08 00:32:00,S_13,0.06,0,4747649,CKB -LINE_20,S_13,2022-03-08 00:32:00,2022-03-08 00:44:00,S_40,4212,3,4747649,CKB -LINE_20,S_40,2022-03-08 00:47:00,2022-03-08 01:16:00,S_41,13048,0,4747649,CKB -LINE_20,S_41,2022-03-08 01:16:00,2022-03-08 01:42:00,S_40,12869,5,4747649,CKB -LINE_20,S_40,2022-03-08 01:47:00,2022-03-08 02:16:00,S_41,13048,0,4747649,CKB -LINE_20,S_41,2022-03-08 02:16:00,2022-03-08 02:42:00,S_40,12869,5,4747649,CKB -LINE_20,S_40,2022-03-08 02:47:00,2022-03-08 03:16:00,S_41,13048,0,4747649,CKB -LINE_20,S_41,2022-03-08 03:16:00,2022-03-08 03:42:00,S_40,12869,5,4747649,CKB -LINE_20,S_40,2022-03-08 03:47:00,2022-03-08 04:16:00,S_41,13048,0,4747649,CKB -LINE_20,S_41,2022-03-08 04:16:00,2022-03-08 04:34:00,DEPS_42,9538,0,4747649,CKB -LINE_20,DEPS_42,2022-03-08 04:34:00,2022-03-08 04:34:00,DEPS_1,0.06,0,4747649,CKB -LINE_20,DEPS_1,2022-03-08 00:17:00,2022-03-08 00:17:00,S_40,0.06,0,4747659,CKB -LINE_20,S_40,2022-03-08 00:17:00,2022-03-08 00:46:00,S_41,13048,0,4747659,CKB -LINE_20,S_41,2022-03-08 00:46:00,2022-03-08 01:12:00,S_40,12869,5,4747659,CKB -LINE_20,S_40,2022-03-08 01:17:00,2022-03-08 01:46:00,S_41,13048,0,4747659,CKB -LINE_20,S_41,2022-03-08 01:46:00,2022-03-08 02:12:00,S_40,12869,5,4747659,CKB -LINE_20,S_40,2022-03-08 02:17:00,2022-03-08 02:46:00,S_41,13048,0,4747659,CKB -LINE_20,S_41,2022-03-08 02:46:00,2022-03-08 03:12:00,S_40,12869,5,4747659,CKB -LINE_20,S_40,2022-03-08 03:17:00,2022-03-08 03:46:00,S_41,13048,0,4747659,CKB -LINE_20,S_41,2022-03-08 03:46:00,2022-03-08 04:12:00,S_40,12869,5,4747659,CKB -LINE_20,S_40,2022-03-08 04:17:00,2022-03-08 04:28:00,S_13,4316,0,4747659,CKB -LINE_20,S_13,2022-03-08 04:28:00,2022-03-08 04:28:00,DEPS_1,0.06,0,4747659,CKB -LINE_21,DEPS_1,2022-03-08 00:49:00,2022-03-08 00:49:00,OPPS_3,0.06,0,4434340,CKB -LINE_21,OPPS_3,2022-03-08 00:49:00,2022-03-08 01:04:00,S_16,10229,0,4434340,CKB -LINE_21,S_16,2022-03-08 01:04:00,2022-03-08 01:19:00,OPPS_3,11801,0,4434340,CKB -LINE_21,OPPS_3,2022-03-08 01:19:00,2022-03-08 01:34:00,S_16,10229,0,4434340,CKB -LINE_21,S_16,2022-03-08 01:34:00,2022-03-08 01:49:00,OPPS_3,11801,0,4434340,CKB -LINE_21,OPPS_3,2022-03-08 01:49:00,2022-03-08 02:04:00,S_16,10229,0,4434340,CKB -LINE_21,S_16,2022-03-08 02:04:00,2022-03-08 02:19:00,OPPS_3,11801,0,4434340,CKB -LINE_21,OPPS_3,2022-03-08 02:19:00,2022-03-08 02:34:00,S_16,10229,0,4434340,CKB -LINE_21,S_16,2022-03-08 02:34:00,2022-03-08 02:49:00,OPPS_3,11801,0,4434340,CKB -LINE_21,OPPS_3,2022-03-08 02:49:00,2022-03-08 03:04:00,S_16,10229,0,4434340,CKB -LINE_21,S_16,2022-03-08 03:04:00,2022-03-08 03:19:00,OPPS_3,11801,0,4434340,CKB -LINE_21,OPPS_3,2022-03-08 03:19:00,2022-03-08 03:34:00,S_16,10229,0,4434340,CKB -LINE_21,S_16,2022-03-08 03:34:00,2022-03-08 03:49:00,OPPS_3,11801,0,4434340,CKB -LINE_21,OPPS_3,2022-03-08 03:49:00,2022-03-08 04:04:00,S_16,10229,0,4434340,CKB -LINE_21,S_16,2022-03-08 04:04:00,2022-03-08 04:19:00,OPPS_3,11801,23,4434340,CKB -LINE_22,OPPS_3,2022-03-08 04:42:00,2022-03-08 05:04:00,S_43,6.81,0,4434340,CKB -LINE_22,S_43,2022-03-08 05:04:00,2022-03-08 05:04:00,DEPS_1,0.06,0,4434340,CKB -LINE_8,DEPS_1,2022-03-08 00:32:00,2022-03-08 00:32:00,S_13,0.06,0,4434896,CKB -LINE_8,S_13,2022-03-08 00:32:00,2022-03-08 00:57:00,OPPS_21,11545,6,4434896,CKB -LINE_8,OPPS_21,2022-03-08 01:03:00,2022-03-08 01:46:00,S_20,20579,1,4434896,CKB -LINE_8,S_20,2022-03-08 01:47:00,2022-03-08 02:25:00,OPPS_21,20641,8,4434896,CKB -LINE_8,OPPS_21,2022-03-08 02:33:00,2022-03-08 03:16:00,S_20,20579,1,4434896,CKB -LINE_8,S_20,2022-03-08 03:17:00,2022-03-08 03:55:00,OPPS_21,20641,8,4434896,CKB -LINE_8,OPPS_21,2022-03-08 04:03:00,2022-03-08 04:28:00,S_13,11499,0,4434896,CKB -LINE_8,S_13,2022-03-08 04:28:00,2022-03-08 04:28:00,DEPS_1,0.06,0,4434896,CKB -LINE_8,DEPS_1,2022-03-08 00:33:00,2022-03-08 00:33:00,OPPS_21,0.06,0,4434901,CKB -LINE_8,OPPS_21,2022-03-08 00:33:00,2022-03-08 01:16:00,S_20,20579,1,4434901,CKB -LINE_8,S_20,2022-03-08 01:17:00,2022-03-08 01:55:00,OPPS_21,20641,8,4434901,CKB -LINE_8,OPPS_21,2022-03-08 02:03:00,2022-03-08 02:46:00,S_20,20579,1,4434901,CKB -LINE_8,S_20,2022-03-08 02:47:00,2022-03-08 03:25:00,OPPS_21,20641,8,4434901,CKB -LINE_8,OPPS_21,2022-03-08 03:33:00,2022-03-08 04:16:00,S_20,20579,1,4434901,CKB -LINE_8,S_20,2022-03-08 04:17:00,2022-03-08 04:51:00,S_44,18752,0,4434901,CKB -LINE_8,S_44,2022-03-08 04:51:00,2022-03-08 04:51:00,DEPS_1,0.06,0,4434901,CKB -LINE_23,DEPS_1,2022-03-08 00:34:00,2022-03-08 00:34:00,S_45,0.06,0,4619765,CKB -LINE_23,S_45,2022-03-08 00:34:00,2022-03-08 01:00:00,S_46,9016,0,4619765,CKB -LINE_23,S_46,2022-03-08 01:00:00,2022-03-08 01:27:00,S_45,10083,7,4619765,CKB -LINE_23,S_45,2022-03-08 01:34:00,2022-03-08 02:00:00,S_46,9016,0,4619765,CKB -LINE_23,S_46,2022-03-08 02:00:00,2022-03-08 02:27:00,S_45,10083,7,4619765,CKB -LINE_23,S_45,2022-03-08 02:34:00,2022-03-08 03:00:00,S_46,9016,0,4619765,CKB -LINE_23,S_46,2022-03-08 03:00:00,2022-03-08 03:27:00,S_45,10083,7,4619765,CKB -LINE_23,S_45,2022-03-08 03:34:00,2022-03-08 04:00:00,S_46,9016,0,4619765,CKB -LINE_23,S_46,2022-03-08 04:00:00,2022-03-08 04:27:00,S_45,10083,0,4619765,CKB -LINE_23,S_45,2022-03-08 04:27:00,2022-03-08 04:27:00,DEPS_1,0.06,0,4619765,CKB -LINE_23,DEPS_1,2022-03-08 00:30:00,2022-03-08 00:30:00,S_46,0.06,0,4619990,CKB -LINE_23,S_46,2022-03-08 00:30:00,2022-03-08 00:57:00,S_45,10083,7,4619990,CKB -LINE_23,S_45,2022-03-08 01:04:00,2022-03-08 01:30:00,S_46,9016,0,4619990,CKB -LINE_23,S_46,2022-03-08 01:30:00,2022-03-08 01:57:00,S_45,10083,7,4619990,CKB -LINE_23,S_45,2022-03-08 02:04:00,2022-03-08 02:30:00,S_46,9016,0,4619990,CKB -LINE_23,S_46,2022-03-08 02:30:00,2022-03-08 02:57:00,S_45,10083,7,4619990,CKB -LINE_23,S_45,2022-03-08 03:04:00,2022-03-08 03:30:00,S_46,9016,0,4619990,CKB -LINE_23,S_46,2022-03-08 03:30:00,2022-03-08 03:57:00,S_45,10083,7,4619990,CKB -LINE_23,S_45,2022-03-08 04:04:00,2022-03-08 04:30:00,S_46,9016,0,4619990,CKB -LINE_23,S_46,2022-03-08 04:30:00,2022-03-08 04:57:00,S_45,10083,0,4619990,CKB -LINE_23,S_45,2022-03-08 04:57:00,2022-03-08 04:57:00,DEPS_1,0.06,0,4619990,CKB -LINE_24,DEPS_1,2022-03-08 00:31:00,2022-03-08 00:31:00,OPPS_21,0.06,0,4374743,CKB -LINE_24,OPPS_21,2022-03-08 00:31:00,2022-03-08 00:44:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 00:44:00,2022-03-08 00:56:00,OPPS_21,5362,5,4374743,CKB -LINE_24,OPPS_21,2022-03-08 01:01:00,2022-03-08 01:14:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 01:14:00,2022-03-08 01:26:00,OPPS_21,5362,5,4374743,CKB -LINE_24,OPPS_21,2022-03-08 01:31:00,2022-03-08 01:44:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 01:44:00,2022-03-08 01:56:00,OPPS_21,5362,5,4374743,CKB -LINE_24,OPPS_21,2022-03-08 02:01:00,2022-03-08 02:14:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 02:14:00,2022-03-08 02:26:00,OPPS_21,5362,5,4374743,CKB -LINE_24,OPPS_21,2022-03-08 02:31:00,2022-03-08 02:44:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 02:44:00,2022-03-08 02:56:00,OPPS_21,5362,5,4374743,CKB -LINE_24,OPPS_21,2022-03-08 03:01:00,2022-03-08 03:14:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 03:14:00,2022-03-08 03:26:00,OPPS_21,5362,5,4374743,CKB -LINE_24,OPPS_21,2022-03-08 03:31:00,2022-03-08 03:44:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 03:44:00,2022-03-08 03:56:00,OPPS_21,5362,5,4374743,CKB -LINE_24,OPPS_21,2022-03-08 04:01:00,2022-03-08 04:14:00,S_47,4872,0,4374743,CKB -LINE_24,S_47,2022-03-08 04:14:00,2022-03-08 04:26:00,OPPS_21,5362,0,4374743,CKB -LINE_24,OPPS_21,2022-03-08 04:26:00,2022-03-08 04:26:00,DEPS_1,0.06,0,4374743,CKB -LINE_25,DEPS_1,2022-03-08 00:31:00,2022-03-08 00:31:00,OPPS_21,0.06,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 00:31:00,2022-03-08 00:45:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 00:47:00,2022-03-08 01:01:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 01:01:00,2022-03-08 01:15:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 01:17:00,2022-03-08 01:31:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 01:31:00,2022-03-08 01:45:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 01:47:00,2022-03-08 02:01:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 02:01:00,2022-03-08 02:15:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 02:17:00,2022-03-08 02:31:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 02:31:00,2022-03-08 02:45:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 02:47:00,2022-03-08 03:01:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 03:01:00,2022-03-08 03:15:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 03:17:00,2022-03-08 03:31:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 03:31:00,2022-03-08 03:45:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 03:47:00,2022-03-08 04:01:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 04:01:00,2022-03-08 04:15:00,S_48,5225,2,4374865,CKB -LINE_25,S_48,2022-03-08 04:17:00,2022-03-08 04:31:00,OPPS_21,7617,0,4374865,CKB -LINE_25,OPPS_21,2022-03-08 04:31:00,2022-03-08 04:31:00,DEPS_1,0.06,0,4374865,CKB -LINE_26,DEPS_1,2022-03-08 00:43:00,2022-03-08 00:43:00,S_49,0.06,0,4375012,CKB -LINE_26,S_49,2022-03-08 00:43:00,2022-03-08 00:53:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 00:53:00,2022-03-08 01:03:00,S_49,4408,10,4375012,CKB -LINE_26,S_49,2022-03-08 01:13:00,2022-03-08 01:23:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 01:23:00,2022-03-08 01:33:00,S_49,4408,10,4375012,CKB -LINE_26,S_49,2022-03-08 01:43:00,2022-03-08 01:53:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 01:53:00,2022-03-08 02:03:00,S_49,4408,10,4375012,CKB -LINE_26,S_49,2022-03-08 02:13:00,2022-03-08 02:23:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 02:23:00,2022-03-08 02:33:00,S_49,4408,10,4375012,CKB -LINE_26,S_49,2022-03-08 02:43:00,2022-03-08 02:53:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 02:53:00,2022-03-08 03:03:00,S_49,4408,10,4375012,CKB -LINE_26,S_49,2022-03-08 03:13:00,2022-03-08 03:23:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 03:23:00,2022-03-08 03:33:00,S_49,4408,10,4375012,CKB -LINE_26,S_49,2022-03-08 03:43:00,2022-03-08 03:53:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 03:53:00,2022-03-08 04:03:00,S_49,4408,10,4375012,CKB -LINE_26,S_49,2022-03-08 04:13:00,2022-03-08 04:23:00,S_50,4507,0,4375012,CKB -LINE_26,S_50,2022-03-08 04:23:00,2022-03-08 04:33:00,S_49,4408,0,4375012,CKB -LINE_26,S_49,2022-03-08 04:33:00,2022-03-08 04:33:00,DEPS_1,0.06,0,4375012,CKB -LINE_21,DEPS_1,2022-03-07 00:49:00,2022-03-07 00:49:00,OPPS_3,0.06,0,4434215,CKB -LINE_21,OPPS_3,2022-03-07 00:49:00,2022-03-07 01:04:00,S_16,10229,0,4434215,CKB -LINE_21,S_16,2022-03-07 01:04:00,2022-03-07 01:19:00,OPPS_3,11801,0,4434215,CKB -LINE_21,OPPS_3,2022-03-07 01:19:00,2022-03-07 01:34:00,S_16,10229,0,4434215,CKB -LINE_21,S_16,2022-03-07 01:34:00,2022-03-07 01:49:00,OPPS_3,11801,0,4434215,CKB -LINE_21,OPPS_3,2022-03-07 01:49:00,2022-03-07 02:04:00,S_16,10229,0,4434215,CKB -LINE_21,S_16,2022-03-07 02:04:00,2022-03-07 02:19:00,OPPS_3,11801,0,4434215,CKB -LINE_21,OPPS_3,2022-03-07 02:19:00,2022-03-07 02:34:00,S_16,10229,0,4434215,CKB -LINE_21,S_16,2022-03-07 02:34:00,2022-03-07 02:49:00,OPPS_3,11801,0,4434215,CKB -LINE_21,OPPS_3,2022-03-07 02:49:00,2022-03-07 03:04:00,S_16,10229,0,4434215,CKB -LINE_21,S_16,2022-03-07 03:04:00,2022-03-07 03:19:00,OPPS_3,11801,0,4434215,CKB -LINE_21,OPPS_3,2022-03-07 03:19:00,2022-03-07 03:34:00,S_16,10229,0,4434215,CKB -LINE_21,S_16,2022-03-07 03:34:00,2022-03-07 03:49:00,OPPS_3,11801,0,4434215,CKB -LINE_21,OPPS_3,2022-03-07 03:49:00,2022-03-07 04:04:00,S_16,10229,0,4434215,CKB -LINE_21,S_16,2022-03-07 04:04:00,2022-03-07 04:19:00,OPPS_3,11801,23,4434215,CKB -LINE_22,OPPS_3,2022-03-07 04:42:00,2022-03-07 05:04:00,S_43,6.81,0,4434215,CKB -LINE_22,S_43,2022-03-07 05:04:00,2022-03-07 05:04:00,DEPS_1,0.06,0,4434215,CKB -LINE_13,DEPS_1,2022-03-07 00:23:00,2022-03-07 00:23:00,S_29,0.06,0,4318071,CKB -LINE_13,S_29,2022-03-07 00:23:00,2022-03-07 00:30:00,OPPS_30,2577,9,4318071,CKB -LINE_14,OPPS_30,2022-03-07 00:39:00,2022-03-07 00:54:00,S_31,5937,9,4318071,CKB -LINE_14,S_31,2022-03-07 01:03:00,2022-03-07 01:17:00,OPPS_30,6.19,0,4318071,CKB -LINE_13,OPPS_30,2022-03-07 01:17:00,2022-03-07 01:23:00,S_29,2555,0,4318071,CKB -LINE_13,S_29,2022-03-07 01:23:00,2022-03-07 01:30:00,OPPS_30,2577,9,4318071,CKB -LINE_14,OPPS_30,2022-03-07 01:39:00,2022-03-07 01:54:00,S_31,5937,9,4318071,CKB -LINE_14,S_31,2022-03-07 02:03:00,2022-03-07 02:17:00,OPPS_30,6.19,0,4318071,CKB -LINE_13,OPPS_30,2022-03-07 02:17:00,2022-03-07 02:23:00,S_29,2555,0,4318071,CKB -LINE_13,S_29,2022-03-07 02:23:00,2022-03-07 02:30:00,OPPS_30,2577,9,4318071,CKB -LINE_14,OPPS_30,2022-03-07 02:39:00,2022-03-07 02:54:00,S_31,5937,9,4318071,CKB -LINE_14,S_31,2022-03-07 03:03:00,2022-03-07 03:17:00,OPPS_30,6.19,0,4318071,CKB -LINE_13,OPPS_30,2022-03-07 03:17:00,2022-03-07 03:23:00,S_29,2555,0,4318071,CKB -LINE_13,S_29,2022-03-07 03:23:00,2022-03-07 03:30:00,OPPS_30,2577,9,4318071,CKB -LINE_14,OPPS_30,2022-03-07 03:39:00,2022-03-07 03:54:00,S_31,5937,9,4318071,CKB -LINE_14,S_31,2022-03-07 04:03:00,2022-03-07 04:17:00,OPPS_30,6.19,0,4318071,CKB -LINE_13,OPPS_30,2022-03-07 04:17:00,2022-03-07 04:23:00,S_29,2555,0,4318071,CKB -LINE_13,S_29,2022-03-07 04:23:00,2022-03-07 04:23:00,DEPS_1,0.06,0,4318071,CKB -LINE_14,DEPS_1,2022-03-07 00:33:00,2022-03-07 00:33:00,S_31,0.06,0,4318083,CKB -LINE_14,S_31,2022-03-07 00:33:00,2022-03-07 00:47:00,OPPS_30,6.19,0,4318083,CKB -LINE_13,OPPS_30,2022-03-07 00:47:00,2022-03-07 00:53:00,S_29,2555,0,4318083,CKB -LINE_13,S_29,2022-03-07 00:53:00,2022-03-07 01:00:00,OPPS_30,2577,9,4318083,CKB -LINE_14,OPPS_30,2022-03-07 01:09:00,2022-03-07 01:24:00,S_31,5937,9,4318083,CKB -LINE_14,S_31,2022-03-07 01:33:00,2022-03-07 01:47:00,OPPS_30,6.19,0,4318083,CKB -LINE_13,OPPS_30,2022-03-07 01:47:00,2022-03-07 01:53:00,S_29,2555,0,4318083,CKB -LINE_13,S_29,2022-03-07 01:53:00,2022-03-07 02:00:00,OPPS_30,2577,9,4318083,CKB -LINE_14,OPPS_30,2022-03-07 02:09:00,2022-03-07 02:24:00,S_31,5937,9,4318083,CKB -LINE_14,S_31,2022-03-07 02:33:00,2022-03-07 02:47:00,OPPS_30,6.19,0,4318083,CKB -LINE_13,OPPS_30,2022-03-07 02:47:00,2022-03-07 02:53:00,S_29,2555,0,4318083,CKB -LINE_13,S_29,2022-03-07 02:53:00,2022-03-07 03:00:00,OPPS_30,2577,9,4318083,CKB -LINE_14,OPPS_30,2022-03-07 03:09:00,2022-03-07 03:24:00,S_31,5937,9,4318083,CKB -LINE_14,S_31,2022-03-07 03:33:00,2022-03-07 03:47:00,OPPS_30,6.19,0,4318083,CKB -LINE_13,OPPS_30,2022-03-07 03:47:00,2022-03-07 03:53:00,S_29,2555,0,4318083,CKB -LINE_13,S_29,2022-03-07 03:53:00,2022-03-07 04:00:00,OPPS_30,2577,9,4318083,CKB -LINE_14,OPPS_30,2022-03-07 04:09:00,2022-03-07 04:24:00,S_31,5937,0,4318083,CKB -LINE_14,S_31,2022-03-07 04:24:00,2022-03-07 04:24:00,DEPS_1,0.06,0,4318083,CKB -LINE_15,DEPS_1,2022-03-07 00:57:00,2022-03-07 00:57:00,OPPS_32,0.06,0,4319428,CKB -LINE_15,OPPS_32,2022-03-07 00:57:00,2022-03-07 01:06:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 01:06:00,2022-03-07 01:11:00,OPPS_32,2936,16,4319428,CKB -LINE_15,OPPS_32,2022-03-07 01:27:00,2022-03-07 01:36:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 01:36:00,2022-03-07 01:41:00,OPPS_32,2936,16,4319428,CKB -LINE_15,OPPS_32,2022-03-07 01:57:00,2022-03-07 02:06:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 02:06:00,2022-03-07 02:11:00,OPPS_32,2936,16,4319428,CKB -LINE_15,OPPS_32,2022-03-07 02:27:00,2022-03-07 02:36:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 02:36:00,2022-03-07 02:41:00,OPPS_32,2936,16,4319428,CKB -LINE_15,OPPS_32,2022-03-07 02:57:00,2022-03-07 03:06:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 03:06:00,2022-03-07 03:11:00,OPPS_32,2936,16,4319428,CKB -LINE_15,OPPS_32,2022-03-07 03:27:00,2022-03-07 03:36:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 03:36:00,2022-03-07 03:41:00,OPPS_32,2936,16,4319428,CKB -LINE_15,OPPS_32,2022-03-07 03:57:00,2022-03-07 04:06:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 04:06:00,2022-03-07 04:11:00,OPPS_32,2936,16,4319428,CKB -LINE_15,OPPS_32,2022-03-07 04:27:00,2022-03-07 04:36:00,S_33,4343,0,4319428,CKB -LINE_15,S_33,2022-03-07 04:36:00,2022-03-07 04:36:00,DEPS_1,0.06,0,4319428,CKB -LINE_16,DEPS_1,2022-03-07 00:29:00,2022-03-07 00:29:00,S_34,0.06,0,4751093,CKB -LINE_16,S_34,2022-03-07 00:29:00,2022-03-07 00:41:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 00:47:00,2022-03-07 00:57:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 00:59:00,2022-03-07 01:11:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 01:17:00,2022-03-07 01:27:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 01:29:00,2022-03-07 01:41:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 01:47:00,2022-03-07 01:57:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 01:59:00,2022-03-07 02:11:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 02:17:00,2022-03-07 02:27:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 02:29:00,2022-03-07 02:41:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 02:47:00,2022-03-07 02:57:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 02:59:00,2022-03-07 03:11:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 03:17:00,2022-03-07 03:27:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 03:29:00,2022-03-07 03:41:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 03:47:00,2022-03-07 03:57:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 03:59:00,2022-03-07 04:11:00,S_35,4481,6,4751093,CKB -LINE_16,S_35,2022-03-07 04:17:00,2022-03-07 04:27:00,S_34,4031,2,4751093,CKB -LINE_16,S_34,2022-03-07 04:29:00,2022-03-07 04:41:00,S_35,4481,0,4751093,CKB -LINE_16,S_35,2022-03-07 04:41:00,2022-03-07 04:41:00,DEPS_1,0.06,0,4751093,CKB -LINE_17,DEPS_1,2022-03-07 00:30:00,2022-03-07 00:30:00,S_34,0.06,0,4454017,CKB -LINE_17,S_34,2022-03-07 00:30:00,2022-03-07 00:44:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 00:44:00,2022-03-07 00:57:00,S_34,5302,3,4454017,CKB -LINE_17,S_34,2022-03-07 01:00:00,2022-03-07 01:14:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 01:14:00,2022-03-07 01:27:00,S_34,5302,3,4454017,CKB -LINE_17,S_34,2022-03-07 01:30:00,2022-03-07 01:44:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 01:44:00,2022-03-07 01:57:00,S_34,5302,3,4454017,CKB -LINE_17,S_34,2022-03-07 02:00:00,2022-03-07 02:14:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 02:14:00,2022-03-07 02:27:00,S_34,5302,3,4454017,CKB -LINE_17,S_34,2022-03-07 02:30:00,2022-03-07 02:44:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 02:44:00,2022-03-07 02:57:00,S_34,5302,3,4454017,CKB -LINE_17,S_34,2022-03-07 03:00:00,2022-03-07 03:14:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 03:14:00,2022-03-07 03:27:00,S_34,5302,3,4454017,CKB -LINE_17,S_34,2022-03-07 03:30:00,2022-03-07 03:44:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 03:44:00,2022-03-07 03:57:00,S_34,5302,3,4454017,CKB -LINE_17,S_34,2022-03-07 04:00:00,2022-03-07 04:14:00,S_36,4801,0,4454017,CKB -LINE_17,S_36,2022-03-07 04:14:00,2022-03-07 04:27:00,S_34,5302,0,4454017,CKB -LINE_17,S_34,2022-03-07 04:27:00,2022-03-07 04:27:00,DEPS_1,0.06,0,4454017,CKB -LINE_18,DEPS_1,2022-03-07 00:43:00,2022-03-07 00:43:00,S_37,0.06,0,4374470,CKB -LINE_18,S_37,2022-03-07 00:43:00,2022-03-07 01:33:00,S_37,20434,10,4374470,CKB -LINE_18,S_37,2022-03-07 01:43:00,2022-03-07 02:33:00,S_37,20434,10,4374470,CKB -LINE_18,S_37,2022-03-07 02:43:00,2022-03-07 03:33:00,S_37,20434,10,4374470,CKB -LINE_18,S_37,2022-03-07 03:43:00,2022-03-07 04:33:00,S_37,20434,0,4374470,CKB -LINE_18,S_37,2022-03-07 04:33:00,2022-03-07 04:33:00,DEPS_1,0.06,0,4374470,CKB -LINE_18,DEPS_1,2022-03-07 00:13:00,2022-03-07 00:13:00,S_37,0.06,0,4374475,CKB -LINE_18,S_37,2022-03-07 00:13:00,2022-03-07 01:03:00,S_37,20434,10,4374475,CKB -LINE_18,S_37,2022-03-07 01:13:00,2022-03-07 02:03:00,S_37,20434,10,4374475,CKB -LINE_18,S_37,2022-03-07 02:13:00,2022-03-07 03:03:00,S_37,20434,10,4374475,CKB -LINE_18,S_37,2022-03-07 03:13:00,2022-03-07 04:03:00,S_37,20434,0,4374475,CKB -LINE_18,S_37,2022-03-07 04:03:00,2022-03-07 04:03:00,DEPS_1,0.06,0,4374475,CKB -LINE_19,DEPS_1,2022-03-07 00:24:00,2022-03-07 00:24:00,S_38,0.06,0,4456537,CKB -LINE_19,S_38,2022-03-07 00:24:00,2022-03-07 00:48:00,OPPS_39,11.86,4,4456537,CKB -LINE_19,OPPS_39,2022-03-07 00:52:00,2022-03-07 01:14:00,S_38,11139,10,4456537,CKB -LINE_19,S_38,2022-03-07 01:24:00,2022-03-07 01:48:00,OPPS_39,11.86,4,4456537,CKB -LINE_19,OPPS_39,2022-03-07 01:52:00,2022-03-07 02:14:00,S_38,11139,10,4456537,CKB -LINE_19,S_38,2022-03-07 02:24:00,2022-03-07 02:48:00,OPPS_39,11.86,4,4456537,CKB -LINE_19,OPPS_39,2022-03-07 02:52:00,2022-03-07 03:14:00,S_38,11139,10,4456537,CKB -LINE_19,S_38,2022-03-07 03:24:00,2022-03-07 03:48:00,OPPS_39,11.86,4,4456537,CKB -LINE_19,OPPS_39,2022-03-07 03:52:00,2022-03-07 04:14:00,S_38,11139,0,4456537,CKB -LINE_19,S_38,2022-03-07 04:14:00,2022-03-07 04:14:00,DEPS_1,0.06,0,4456537,CKB -LINE_19,DEPS_1,2022-03-07 00:22:00,2022-03-07 00:22:00,OPPS_39,0.06,0,4456538,CKB -LINE_19,OPPS_39,2022-03-07 00:22:00,2022-03-07 00:44:00,S_38,11139,10,4456538,CKB -LINE_19,S_38,2022-03-07 00:54:00,2022-03-07 01:18:00,OPPS_39,11.86,4,4456538,CKB -LINE_19,OPPS_39,2022-03-07 01:22:00,2022-03-07 01:44:00,S_38,11139,10,4456538,CKB -LINE_19,S_38,2022-03-07 01:54:00,2022-03-07 02:18:00,OPPS_39,11.86,4,4456538,CKB -LINE_19,OPPS_39,2022-03-07 02:22:00,2022-03-07 02:44:00,S_38,11139,10,4456538,CKB -LINE_19,S_38,2022-03-07 02:54:00,2022-03-07 03:18:00,OPPS_39,11.86,4,4456538,CKB -LINE_19,OPPS_39,2022-03-07 03:22:00,2022-03-07 03:44:00,S_38,11139,10,4456538,CKB -LINE_19,S_38,2022-03-07 03:54:00,2022-03-07 04:18:00,OPPS_39,11.86,4,4456538,CKB -LINE_19,OPPS_39,2022-03-07 04:22:00,2022-03-07 04:44:00,S_38,11139,0,4456538,CKB -LINE_19,S_38,2022-03-07 04:44:00,2022-03-07 04:44:00,DEPS_1,0.06,0,4456538,CKB -LINE_0,DEPS_1,2022-03-13 20:51:00,2022-03-13 20:51:00,S_0,0.06,0,4454973,CKB -LINE_0,S_0,2022-03-13 20:51:00,2022-03-13 21:24:00,S_2,14519,4,4454973,CKB -LINE_0,S_2,2022-03-13 21:28:00,2022-03-13 22:03:00,S_0,13541,8,4454973,CKB -LINE_0,S_0,2022-03-13 22:11:00,2022-03-13 22:44:00,S_2,14519,4,4454973,CKB -LINE_0,S_2,2022-03-13 22:48:00,2022-03-13 23:23:00,S_0,13541,8,4454973,CKB -LINE_0,S_0,2022-03-13 23:31:00,2022-03-14 00:04:00,S_2,14519,4,4454973,CKB -LINE_0,S_2,2022-03-14 00:08:00,2022-03-14 00:39:00,S_5,12213,0,4454973,CKB -LINE_1,S_5,2022-03-14 00:39:00,2022-03-14 00:47:00,OPPS_3,4.0,2,4454973,CKB -LINE_1,OPPS_3,2022-03-14 00:49:00,2022-03-14 01:12:00,S_4,8.36,6,4454973,CKB -LINE_1,S_4,2022-03-14 01:18:00,2022-03-14 01:36:00,OPPS_3,9067,13,4454973,CKB -LINE_1,OPPS_3,2022-03-14 01:49:00,2022-03-14 02:12:00,S_4,8.36,6,4454973,CKB -LINE_1,S_4,2022-03-14 02:18:00,2022-03-14 02:36:00,OPPS_3,9067,13,4454973,CKB -LINE_1,OPPS_3,2022-03-14 02:49:00,2022-03-14 03:12:00,S_4,8.36,6,4454973,CKB -LINE_1,S_4,2022-03-14 03:18:00,2022-03-14 03:36:00,OPPS_3,9067,13,4454973,CKB -LINE_1,OPPS_3,2022-03-14 03:49:00,2022-03-14 04:12:00,S_4,8.36,0,4454973,CKB -LINE_1,S_4,2022-03-14 04:12:00,2022-03-14 04:12:00,DEPS_1,0.06,0,4454973,CKB -LINE_0,DEPS_1,2022-03-13 21:31:00,2022-03-13 21:31:00,S_0,0.06,0,4454974,CKB -LINE_0,S_0,2022-03-13 21:31:00,2022-03-13 22:04:00,S_2,14519,4,4454974,CKB -LINE_0,S_2,2022-03-13 22:08:00,2022-03-13 22:43:00,S_0,13541,8,4454974,CKB -LINE_0,S_0,2022-03-13 22:51:00,2022-03-13 23:24:00,S_2,14519,4,4454974,CKB -LINE_0,S_2,2022-03-13 23:28:00,2022-03-14 00:03:00,S_0,13541,8,4454974,CKB -LINE_0,S_0,2022-03-14 00:11:00,2022-03-14 00:44:00,S_2,14519,0,4454974,CKB -LINE_1,S_2,2022-03-14 00:44:00,2022-03-14 00:54:00,OPPS_3,4.1,25,4454974,CKB -LINE_1,OPPS_3,2022-03-14 01:19:00,2022-03-14 01:42:00,S_4,8.36,6,4454974,CKB -LINE_1,S_4,2022-03-14 01:48:00,2022-03-14 02:06:00,OPPS_3,9067,13,4454974,CKB -LINE_1,OPPS_3,2022-03-14 02:19:00,2022-03-14 02:42:00,S_4,8.36,6,4454974,CKB -LINE_1,S_4,2022-03-14 02:48:00,2022-03-14 03:06:00,OPPS_3,9067,13,4454974,CKB -LINE_1,OPPS_3,2022-03-14 03:19:00,2022-03-14 03:42:00,S_4,8.36,6,4454974,CKB -LINE_1,S_4,2022-03-14 03:48:00,2022-03-14 04:06:00,OPPS_3,9067,0,4454974,CKB -LINE_1,OPPS_3,2022-03-14 04:06:00,2022-03-14 04:06:00,DEPS_1,0.06,0,4454974,CKB -LINE_2,DEPS_1,2022-03-13 21:06:00,2022-03-13 21:06:00,S_6,0.06,0,4664782,CKB -LINE_2,S_6,2022-03-13 21:06:00,2022-03-13 21:34:00,S_7,13018,19,4664782,CKB -LINE_2,S_7,2022-03-13 21:53:00,2022-03-13 22:13:00,S_8,10332,17,4664782,CKB -LINE_2,S_8,2022-03-13 22:30:00,2022-03-13 22:54:00,S_7,10.48,19,4664782,CKB -LINE_2,S_7,2022-03-13 23:13:00,2022-03-13 23:33:00,S_8,10332,17,4664782,CKB -LINE_2,S_8,2022-03-13 23:50:00,2022-03-14 00:14:00,S_7,10.48,2,4664782,CKB -LINE_2,S_7,2022-03-14 00:16:00,2022-03-14 00:23:00,S_9,3709,5,4664782,CKB -LINE_3,S_9,2022-03-14 00:28:00,2022-03-14 00:44:00,OPPS_10,6404,3,4664782,CKB -LINE_3,OPPS_10,2022-03-14 00:47:00,2022-03-14 01:10:00,S_11,10579,7,4664782,CKB -LINE_3,S_11,2022-03-14 01:17:00,2022-03-14 01:44:00,OPPS_10,12007,3,4664782,CKB -LINE_3,OPPS_10,2022-03-14 01:47:00,2022-03-14 02:10:00,S_11,10579,7,4664782,CKB -LINE_3,S_11,2022-03-14 02:17:00,2022-03-14 02:44:00,OPPS_10,12007,3,4664782,CKB -LINE_3,OPPS_10,2022-03-14 02:47:00,2022-03-14 03:10:00,S_11,10579,7,4664782,CKB -LINE_3,S_11,2022-03-14 03:17:00,2022-03-14 03:44:00,OPPS_10,12007,3,4664782,CKB -LINE_3,OPPS_10,2022-03-14 03:47:00,2022-03-14 04:10:00,S_11,10579,7,4664782,CKB -LINE_3,S_11,2022-03-14 04:17:00,2022-03-14 04:44:00,OPPS_10,12007,0,4664782,CKB -LINE_3,OPPS_10,2022-03-14 04:44:00,2022-03-14 04:44:00,DEPS_1,0.06,0,4664782,CKB -LINE_2,DEPS_1,2022-03-13 20:26:00,2022-03-13 20:26:00,S_6,0.06,0,4762788,CKB -LINE_2,S_6,2022-03-13 20:26:00,2022-03-13 20:56:00,S_12,14097,14,4762788,CKB -LINE_2,S_12,2022-03-13 21:10:00,2022-03-13 21:38:00,S_6,13.19,8,4762788,CKB -LINE_2,S_6,2022-03-13 21:46:00,2022-03-13 22:14:00,S_7,13018,19,4762788,CKB -LINE_2,S_7,2022-03-13 22:33:00,2022-03-13 22:53:00,S_8,10332,17,4762788,CKB -LINE_2,S_8,2022-03-13 23:10:00,2022-03-13 23:34:00,S_7,10.48,19,4762788,CKB -LINE_2,S_7,2022-03-13 23:53:00,2022-03-14 00:13:00,S_8,10332,2,4762788,CKB -LINE_2,S_8,2022-03-14 00:15:00,2022-03-14 00:16:00,OPPS_10,506,1,4762788,CKB -LINE_3,OPPS_10,2022-03-14 00:17:00,2022-03-14 00:40:00,S_11,10579,7,4762788,CKB -LINE_3,S_11,2022-03-14 00:47:00,2022-03-14 01:14:00,OPPS_10,12007,3,4762788,CKB -LINE_3,OPPS_10,2022-03-14 01:17:00,2022-03-14 01:40:00,S_11,10579,7,4762788,CKB -LINE_3,S_11,2022-03-14 01:47:00,2022-03-14 02:14:00,OPPS_10,12007,3,4762788,CKB -LINE_3,OPPS_10,2022-03-14 02:17:00,2022-03-14 02:40:00,S_11,10579,7,4762788,CKB -LINE_3,S_11,2022-03-14 02:47:00,2022-03-14 03:14:00,OPPS_10,12007,3,4762788,CKB -LINE_3,OPPS_10,2022-03-14 03:17:00,2022-03-14 03:40:00,S_11,10579,7,4762788,CKB -LINE_3,S_11,2022-03-14 03:47:00,2022-03-14 04:14:00,OPPS_10,12007,3,4762788,CKB -LINE_3,OPPS_10,2022-03-14 04:17:00,2022-03-14 04:40:00,S_11,10579,3,4762788,CKB -LINE_4,S_11,2022-03-14 04:43:00,2022-03-14 04:58:00,S_13,6161,0,4762788,CKB -LINE_4,S_13,2022-03-14 04:58:00,2022-03-14 04:58:00,DEPS_1,0.06,0,4762788,CKB -LINE_20,DEPS_1,2022-03-07 00:32:00,2022-03-07 00:32:00,S_13,0.06,0,4747688,CKB -LINE_20,S_13,2022-03-07 00:32:00,2022-03-07 00:44:00,S_40,4212,3,4747688,CKB -LINE_20,S_40,2022-03-07 00:47:00,2022-03-07 01:16:00,S_41,13048,0,4747688,CKB -LINE_20,S_41,2022-03-07 01:16:00,2022-03-07 01:42:00,S_40,12869,5,4747688,CKB -LINE_20,S_40,2022-03-07 01:47:00,2022-03-07 02:16:00,S_41,13048,0,4747688,CKB -LINE_20,S_41,2022-03-07 02:16:00,2022-03-07 02:42:00,S_40,12869,5,4747688,CKB -LINE_20,S_40,2022-03-07 02:47:00,2022-03-07 03:16:00,S_41,13048,0,4747688,CKB -LINE_20,S_41,2022-03-07 03:16:00,2022-03-07 03:42:00,S_40,12869,5,4747688,CKB -LINE_20,S_40,2022-03-07 03:47:00,2022-03-07 04:16:00,S_41,13048,0,4747688,CKB -LINE_20,S_41,2022-03-07 04:16:00,2022-03-07 04:34:00,DEPS_42,9538,0,4747688,CKB -LINE_20,DEPS_42,2022-03-07 04:34:00,2022-03-07 04:34:00,DEPS_1,0.06,0,4747688,CKB -LINE_20,DEPS_1,2022-03-07 00:17:00,2022-03-07 00:17:00,S_40,0.06,0,4747699,CKB -LINE_20,S_40,2022-03-07 00:17:00,2022-03-07 00:46:00,S_41,13048,0,4747699,CKB -LINE_20,S_41,2022-03-07 00:46:00,2022-03-07 01:12:00,S_40,12869,5,4747699,CKB -LINE_20,S_40,2022-03-07 01:17:00,2022-03-07 01:46:00,S_41,13048,0,4747699,CKB -LINE_20,S_41,2022-03-07 01:46:00,2022-03-07 02:12:00,S_40,12869,5,4747699,CKB -LINE_20,S_40,2022-03-07 02:17:00,2022-03-07 02:46:00,S_41,13048,0,4747699,CKB -LINE_20,S_41,2022-03-07 02:46:00,2022-03-07 03:12:00,S_40,12869,5,4747699,CKB -LINE_20,S_40,2022-03-07 03:17:00,2022-03-07 03:46:00,S_41,13048,0,4747699,CKB -LINE_20,S_41,2022-03-07 03:46:00,2022-03-07 04:12:00,S_40,12869,5,4747699,CKB -LINE_20,S_40,2022-03-07 04:17:00,2022-03-07 04:28:00,S_13,4316,0,4747699,CKB -LINE_20,S_13,2022-03-07 04:28:00,2022-03-07 04:28:00,DEPS_1,0.06,0,4747699,CKB -LINE_8,DEPS_1,2022-03-07 00:32:00,2022-03-07 00:32:00,S_13,0.06,0,4627068,CKB -LINE_8,S_13,2022-03-07 00:32:00,2022-03-07 00:57:00,OPPS_21,11545,6,4627068,CKB -LINE_8,OPPS_21,2022-03-07 01:03:00,2022-03-07 01:46:00,S_20,20579,1,4627068,CKB -LINE_8,S_20,2022-03-07 01:47:00,2022-03-07 02:25:00,OPPS_21,20641,8,4627068,CKB -LINE_8,OPPS_21,2022-03-07 02:33:00,2022-03-07 03:16:00,S_20,20579,1,4627068,CKB -LINE_8,S_20,2022-03-07 03:17:00,2022-03-07 03:55:00,OPPS_21,20641,8,4627068,CKB -LINE_8,OPPS_21,2022-03-07 04:03:00,2022-03-07 04:28:00,S_13,11499,0,4627068,CKB -LINE_8,S_13,2022-03-07 04:28:00,2022-03-07 04:28:00,DEPS_1,0.06,0,4627068,CKB -LINE_8,DEPS_1,2022-03-07 00:33:00,2022-03-07 00:33:00,OPPS_21,0.06,0,4627069,CKB -LINE_8,OPPS_21,2022-03-07 00:33:00,2022-03-07 01:16:00,S_20,20579,1,4627069,CKB -LINE_8,S_20,2022-03-07 01:17:00,2022-03-07 01:55:00,OPPS_21,20641,8,4627069,CKB -LINE_8,OPPS_21,2022-03-07 02:03:00,2022-03-07 02:46:00,S_20,20579,1,4627069,CKB -LINE_8,S_20,2022-03-07 02:47:00,2022-03-07 03:25:00,OPPS_21,20641,8,4627069,CKB -LINE_8,OPPS_21,2022-03-07 03:33:00,2022-03-07 04:16:00,S_20,20579,1,4627069,CKB -LINE_8,S_20,2022-03-07 04:17:00,2022-03-07 04:51:00,S_44,18752,0,4627069,CKB -LINE_8,S_44,2022-03-07 04:51:00,2022-03-07 04:51:00,DEPS_1,0.06,0,4627069,CKB -LINE_7,DEPS_1,2022-03-07 00:08:00,2022-03-07 00:08:00,S_18,0.06,0,4710317,CKB -LINE_7,S_18,2022-03-07 00:08:00,2022-03-07 00:27:00,S_19,7827,0,4710317,CKB -LINE_8,S_19,2022-03-07 00:27:00,2022-03-07 00:48:00,S_20,11079,0,4710317,CKB -LINE_8,S_20,2022-03-07 00:48:00,2022-03-07 01:25:00,OPPS_21,20641,8,4710317,CKB -LINE_8,OPPS_21,2022-03-07 01:33:00,2022-03-07 02:16:00,S_20,20579,1,4710317,CKB -LINE_8,S_20,2022-03-07 02:17:00,2022-03-07 02:55:00,OPPS_21,20641,8,4710317,CKB -LINE_8,OPPS_21,2022-03-07 03:03:00,2022-03-07 03:46:00,S_20,20579,1,4710317,CKB -LINE_8,S_20,2022-03-07 03:47:00,2022-03-07 04:25:00,OPPS_21,20641,0,4710317,CKB -LINE_8,OPPS_21,2022-03-07 04:25:00,2022-03-07 04:25:00,DEPS_1,0.06,0,4710317,CKB -LINE_23,DEPS_1,2022-03-07 00:30:00,2022-03-07 00:30:00,S_46,0.06,0,4619816,CKB -LINE_23,S_46,2022-03-07 00:30:00,2022-03-07 00:57:00,S_45,10083,7,4619816,CKB -LINE_23,S_45,2022-03-07 01:04:00,2022-03-07 01:30:00,S_46,9016,0,4619816,CKB -LINE_23,S_46,2022-03-07 01:30:00,2022-03-07 01:57:00,S_45,10083,7,4619816,CKB -LINE_23,S_45,2022-03-07 02:04:00,2022-03-07 02:30:00,S_46,9016,0,4619816,CKB -LINE_23,S_46,2022-03-07 02:30:00,2022-03-07 02:57:00,S_45,10083,7,4619816,CKB -LINE_23,S_45,2022-03-07 03:04:00,2022-03-07 03:30:00,S_46,9016,0,4619816,CKB -LINE_23,S_46,2022-03-07 03:30:00,2022-03-07 03:57:00,S_45,10083,7,4619816,CKB -LINE_23,S_45,2022-03-07 04:04:00,2022-03-07 04:30:00,S_46,9016,0,4619816,CKB -LINE_23,S_46,2022-03-07 04:30:00,2022-03-07 04:57:00,S_45,10083,0,4619816,CKB -LINE_23,S_45,2022-03-07 04:57:00,2022-03-07 04:57:00,DEPS_1,0.06,0,4619816,CKB -LINE_23,DEPS_1,2022-03-07 00:34:00,2022-03-07 00:34:00,S_45,0.06,0,4619817,CKB -LINE_23,S_45,2022-03-07 00:34:00,2022-03-07 01:00:00,S_46,9016,0,4619817,CKB -LINE_23,S_46,2022-03-07 01:00:00,2022-03-07 01:27:00,S_45,10083,7,4619817,CKB -LINE_23,S_45,2022-03-07 01:34:00,2022-03-07 02:00:00,S_46,9016,0,4619817,CKB -LINE_23,S_46,2022-03-07 02:00:00,2022-03-07 02:27:00,S_45,10083,7,4619817,CKB -LINE_23,S_45,2022-03-07 02:34:00,2022-03-07 03:00:00,S_46,9016,0,4619817,CKB -LINE_23,S_46,2022-03-07 03:00:00,2022-03-07 03:27:00,S_45,10083,7,4619817,CKB -LINE_23,S_45,2022-03-07 03:34:00,2022-03-07 04:00:00,S_46,9016,0,4619817,CKB -LINE_23,S_46,2022-03-07 04:00:00,2022-03-07 04:27:00,S_45,10083,0,4619817,CKB -LINE_23,S_45,2022-03-07 04:27:00,2022-03-07 04:27:00,DEPS_1,0.06,0,4619817,CKB -LINE_24,DEPS_1,2022-03-07 00:31:00,2022-03-07 00:31:00,OPPS_21,0.06,0,4374749,CKB -LINE_24,OPPS_21,2022-03-07 00:31:00,2022-03-07 00:44:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 00:44:00,2022-03-07 00:56:00,OPPS_21,5362,5,4374749,CKB -LINE_24,OPPS_21,2022-03-07 01:01:00,2022-03-07 01:14:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 01:14:00,2022-03-07 01:26:00,OPPS_21,5362,5,4374749,CKB -LINE_24,OPPS_21,2022-03-07 01:31:00,2022-03-07 01:44:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 01:44:00,2022-03-07 01:56:00,OPPS_21,5362,5,4374749,CKB -LINE_24,OPPS_21,2022-03-07 02:01:00,2022-03-07 02:14:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 02:14:00,2022-03-07 02:26:00,OPPS_21,5362,5,4374749,CKB -LINE_24,OPPS_21,2022-03-07 02:31:00,2022-03-07 02:44:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 02:44:00,2022-03-07 02:56:00,OPPS_21,5362,5,4374749,CKB -LINE_24,OPPS_21,2022-03-07 03:01:00,2022-03-07 03:14:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 03:14:00,2022-03-07 03:26:00,OPPS_21,5362,5,4374749,CKB -LINE_24,OPPS_21,2022-03-07 03:31:00,2022-03-07 03:44:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 03:44:00,2022-03-07 03:56:00,OPPS_21,5362,5,4374749,CKB -LINE_24,OPPS_21,2022-03-07 04:01:00,2022-03-07 04:14:00,S_47,4872,0,4374749,CKB -LINE_24,S_47,2022-03-07 04:14:00,2022-03-07 04:26:00,OPPS_21,5362,0,4374749,CKB -LINE_24,OPPS_21,2022-03-07 04:26:00,2022-03-07 04:26:00,DEPS_1,0.06,0,4374749,CKB -LINE_25,DEPS_1,2022-03-07 00:31:00,2022-03-07 00:31:00,OPPS_21,0.06,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 00:31:00,2022-03-07 00:45:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 00:47:00,2022-03-07 01:01:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 01:01:00,2022-03-07 01:15:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 01:17:00,2022-03-07 01:31:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 01:31:00,2022-03-07 01:45:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 01:47:00,2022-03-07 02:01:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 02:01:00,2022-03-07 02:15:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 02:17:00,2022-03-07 02:31:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 02:31:00,2022-03-07 02:45:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 02:47:00,2022-03-07 03:01:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 03:01:00,2022-03-07 03:15:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 03:17:00,2022-03-07 03:31:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 03:31:00,2022-03-07 03:45:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 03:47:00,2022-03-07 04:01:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 04:01:00,2022-03-07 04:15:00,S_48,5225,2,4374873,CKB -LINE_25,S_48,2022-03-07 04:17:00,2022-03-07 04:31:00,OPPS_21,7617,0,4374873,CKB -LINE_25,OPPS_21,2022-03-07 04:31:00,2022-03-07 04:31:00,DEPS_1,0.06,0,4374873,CKB -LINE_26,DEPS_1,2022-03-07 00:43:00,2022-03-07 00:43:00,S_49,0.06,0,4375018,CKB -LINE_26,S_49,2022-03-07 00:43:00,2022-03-07 00:53:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 00:53:00,2022-03-07 01:03:00,S_49,4408,10,4375018,CKB -LINE_26,S_49,2022-03-07 01:13:00,2022-03-07 01:23:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 01:23:00,2022-03-07 01:33:00,S_49,4408,10,4375018,CKB -LINE_26,S_49,2022-03-07 01:43:00,2022-03-07 01:53:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 01:53:00,2022-03-07 02:03:00,S_49,4408,10,4375018,CKB -LINE_26,S_49,2022-03-07 02:13:00,2022-03-07 02:23:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 02:23:00,2022-03-07 02:33:00,S_49,4408,10,4375018,CKB -LINE_26,S_49,2022-03-07 02:43:00,2022-03-07 02:53:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 02:53:00,2022-03-07 03:03:00,S_49,4408,10,4375018,CKB -LINE_26,S_49,2022-03-07 03:13:00,2022-03-07 03:23:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 03:23:00,2022-03-07 03:33:00,S_49,4408,10,4375018,CKB -LINE_26,S_49,2022-03-07 03:43:00,2022-03-07 03:53:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 03:53:00,2022-03-07 04:03:00,S_49,4408,10,4375018,CKB -LINE_26,S_49,2022-03-07 04:13:00,2022-03-07 04:23:00,S_50,4507,0,4375018,CKB -LINE_26,S_50,2022-03-07 04:23:00,2022-03-07 04:33:00,S_49,4408,0,4375018,CKB -LINE_26,S_49,2022-03-07 04:33:00,2022-03-07 04:33:00,DEPS_1,0.06,0,4375018,CKB -LINE_27,DEPS_1,2022-03-13 15:46:00,2022-03-13 15:46:00,S_14,0.06,0,4458713,CKB -LINE_27,S_14,2022-03-13 15:46:00,2022-03-13 15:53:00,S_51,3147,12,4458713,CKB -LINE_27,S_51,2022-03-13 16:05:00,2022-03-13 16:15:00,S_14,3469,0,4458713,CKB -LINE_27,S_14,2022-03-13 16:15:00,2022-03-13 16:23:00,S_51,3351,12,4458713,CKB -LINE_27,S_51,2022-03-13 16:35:00,2022-03-13 16:45:00,S_14,3469,0,4458713,CKB -LINE_27,S_14,2022-03-13 16:45:00,2022-03-13 16:53:00,S_51,3351,12,4458713,CKB -LINE_27,S_51,2022-03-13 17:05:00,2022-03-13 17:15:00,S_14,3469,0,4458713,CKB -LINE_27,S_14,2022-03-13 17:15:00,2022-03-13 17:23:00,S_51,3351,12,4458713,CKB -LINE_27,S_51,2022-03-13 17:35:00,2022-03-13 17:45:00,S_14,3469,0,4458713,CKB -LINE_27,S_14,2022-03-13 17:45:00,2022-03-13 17:53:00,S_51,3351,12,4458713,CKB -LINE_27,S_51,2022-03-13 18:05:00,2022-03-13 18:15:00,S_14,3469,0,4458713,CKB -LINE_27,S_14,2022-03-13 18:15:00,2022-03-13 18:23:00,S_51,3351,0,4458713,CKB -LINE_28,S_51,2022-03-13 18:23:00,2022-03-13 18:29:00,S_14,3.1,22,4458713,CKB -LINE_28,S_14,2022-03-13 18:51:00,2022-03-13 19:02:00,S_52,4338,0,4458713,CKB -LINE_28,S_52,2022-03-13 19:02:00,2022-03-13 19:13:00,S_14,4427,12,4458713,CKB -LINE_5,S_14,2022-03-13 19:25:00,2022-03-13 19:38:00,S_15,6086,3,4458713,CKB -LINE_5,S_15,2022-03-13 19:41:00,2022-03-13 19:55:00,S_14,6232,0,4458713,CKB -LINE_5,S_14,2022-03-13 19:55:00,2022-03-13 20:08:00,S_15,6086,3,4458713,CKB -LINE_5,S_15,2022-03-13 20:11:00,2022-03-13 20:25:00,S_14,6232,6,4458713,CKB -LINE_28,S_14,2022-03-13 20:31:00,2022-03-13 20:42:00,S_52,4338,0,4458713,CKB -LINE_28,S_52,2022-03-13 20:42:00,2022-03-13 20:53:00,S_14,4427,18,4458713,CKB -LINE_28,S_14,2022-03-13 21:11:00,2022-03-13 21:22:00,S_52,4338,0,4458713,CKB -LINE_28,S_52,2022-03-13 21:22:00,2022-03-13 21:33:00,S_14,4427,18,4458713,CKB -LINE_28,S_14,2022-03-13 21:51:00,2022-03-13 22:02:00,S_52,4338,0,4458713,CKB -LINE_28,S_52,2022-03-13 22:02:00,2022-03-13 22:13:00,S_14,4427,18,4458713,CKB -LINE_28,S_14,2022-03-13 22:31:00,2022-03-13 22:42:00,S_52,4338,0,4458713,CKB -LINE_28,S_52,2022-03-13 22:42:00,2022-03-13 22:53:00,S_14,4427,2,4458713,CKB -LINE_5,S_14,2022-03-13 22:55:00,2022-03-13 23:08:00,S_15,6086,3,4458713,CKB -LINE_5,S_15,2022-03-13 23:11:00,2022-03-13 23:25:00,S_14,6232,0,4458713,CKB -LINE_5,S_14,2022-03-13 23:25:00,2022-03-13 23:38:00,S_15,6086,3,4458713,CKB -LINE_5,S_15,2022-03-13 23:41:00,2022-03-13 23:55:00,S_14,6232,0,4458713,CKB -LINE_5,S_14,2022-03-13 23:55:00,2022-03-14 00:08:00,S_15,6086,0,4458713,CKB -LINE_5,S_15,2022-03-14 00:08:00,2022-03-14 00:08:00,DEPS_1,0.06,0,4458713,CKB -LINE_6,DEPS_1,2022-03-13 07:05:00,2022-03-13 07:05:00,S_16,0.06,0,4426903,CKB -LINE_6,S_16,2022-03-13 07:05:00,2022-03-13 07:14:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 07:14:00,2022-03-13 07:23:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 07:25:00,2022-03-13 07:34:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 07:34:00,2022-03-13 07:43:00,S_16,5139,22,4426903,CKB -LINE_6,S_16,2022-03-13 08:05:00,2022-03-13 08:14:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 08:14:00,2022-03-13 08:23:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 08:25:00,2022-03-13 08:34:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 08:34:00,2022-03-13 08:43:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 08:45:00,2022-03-13 08:54:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 08:54:00,2022-03-13 09:03:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 09:05:00,2022-03-13 09:14:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 09:14:00,2022-03-13 09:23:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 09:25:00,2022-03-13 09:34:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 09:34:00,2022-03-13 09:43:00,S_16,5139,23,4426903,CKB -LINE_6,S_16,2022-03-13 10:06:00,2022-03-13 10:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 10:15:00,2022-03-13 10:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 10:26:00,2022-03-13 10:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 10:35:00,2022-03-13 10:44:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 10:46:00,2022-03-13 10:55:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 10:55:00,2022-03-13 11:04:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 11:06:00,2022-03-13 11:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 11:15:00,2022-03-13 11:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 11:26:00,2022-03-13 11:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 11:35:00,2022-03-13 11:44:00,S_16,5139,22,4426903,CKB -LINE_6,S_16,2022-03-13 12:06:00,2022-03-13 12:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 12:15:00,2022-03-13 12:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 12:26:00,2022-03-13 12:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 12:35:00,2022-03-13 12:44:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 12:46:00,2022-03-13 12:55:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 12:55:00,2022-03-13 13:04:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 13:06:00,2022-03-13 13:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 13:15:00,2022-03-13 13:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 13:26:00,2022-03-13 13:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 13:35:00,2022-03-13 13:44:00,S_16,5139,22,4426903,CKB -LINE_6,S_16,2022-03-13 14:06:00,2022-03-13 14:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 14:15:00,2022-03-13 14:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 14:26:00,2022-03-13 14:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 14:35:00,2022-03-13 14:44:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 14:46:00,2022-03-13 14:55:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 14:55:00,2022-03-13 15:04:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 15:06:00,2022-03-13 15:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 15:15:00,2022-03-13 15:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 15:26:00,2022-03-13 15:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 15:35:00,2022-03-13 15:44:00,S_16,5139,22,4426903,CKB -LINE_6,S_16,2022-03-13 16:06:00,2022-03-13 16:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 16:15:00,2022-03-13 16:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 16:26:00,2022-03-13 16:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 16:35:00,2022-03-13 16:44:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 16:46:00,2022-03-13 16:55:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 16:55:00,2022-03-13 17:04:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 17:06:00,2022-03-13 17:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 17:15:00,2022-03-13 17:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 17:26:00,2022-03-13 17:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 17:35:00,2022-03-13 17:44:00,S_16,5139,22,4426903,CKB -LINE_6,S_16,2022-03-13 18:06:00,2022-03-13 18:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 18:15:00,2022-03-13 18:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 18:26:00,2022-03-13 18:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 18:35:00,2022-03-13 18:44:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 18:46:00,2022-03-13 18:55:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 18:55:00,2022-03-13 19:04:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 19:06:00,2022-03-13 19:15:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 19:15:00,2022-03-13 19:24:00,S_16,5139,2,4426903,CKB -LINE_6,S_16,2022-03-13 19:26:00,2022-03-13 19:35:00,S_17,4781,0,4426903,CKB -LINE_6,S_17,2022-03-13 19:35:00,2022-03-13 19:44:00,S_16,5139,21,4426903,CKB -LINE_6,S_16,2022-03-13 20:05:00,2022-03-13 20:14:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 20:15:00,2022-03-13 20:24:00,S_16,5139,1,4426903,CKB -LINE_6,S_16,2022-03-13 20:25:00,2022-03-13 20:34:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 20:35:00,2022-03-13 20:44:00,S_16,5139,1,4426903,CKB -LINE_6,S_16,2022-03-13 20:45:00,2022-03-13 20:54:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 20:55:00,2022-03-13 21:04:00,S_16,5139,1,4426903,CKB -LINE_6,S_16,2022-03-13 21:05:00,2022-03-13 21:14:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 21:15:00,2022-03-13 21:24:00,S_16,5139,1,4426903,CKB -LINE_6,S_16,2022-03-13 21:25:00,2022-03-13 21:34:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 21:35:00,2022-03-13 21:44:00,S_16,5139,21,4426903,CKB -LINE_6,S_16,2022-03-13 22:05:00,2022-03-13 22:14:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 22:15:00,2022-03-13 22:24:00,S_16,5139,1,4426903,CKB -LINE_6,S_16,2022-03-13 22:25:00,2022-03-13 22:34:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 22:35:00,2022-03-13 22:44:00,S_16,5139,1,4426903,CKB -LINE_6,S_16,2022-03-13 22:45:00,2022-03-13 22:54:00,S_17,4781,1,4426903,CKB -LINE_6,S_17,2022-03-13 22:55:00,2022-03-13 23:04:00,S_16,5139,0,4426903,CKB -LINE_6,S_16,2022-03-13 23:04:00,2022-03-13 23:04:00,DEPS_1,0.06,0,4426903,CKB -LINE_29,DEPS_1,2022-03-13 07:30:00,2022-03-13 07:30:00,S_53,0.06,0,4369706,CKB -LINE_29,S_53,2022-03-13 07:30:00,2022-03-13 07:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 07:39:00,2022-03-13 07:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 07:50:00,2022-03-13 07:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 07:59:00,2022-03-13 08:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 08:10:00,2022-03-13 08:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 08:19:00,2022-03-13 08:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 08:30:00,2022-03-13 08:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 08:39:00,2022-03-13 08:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 08:50:00,2022-03-13 08:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 08:59:00,2022-03-13 09:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 09:10:00,2022-03-13 09:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 09:19:00,2022-03-13 09:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 09:30:00,2022-03-13 09:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 09:39:00,2022-03-13 09:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 09:50:00,2022-03-13 09:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 09:59:00,2022-03-13 10:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 10:10:00,2022-03-13 10:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 10:19:00,2022-03-13 10:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 10:30:00,2022-03-13 10:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 10:39:00,2022-03-13 10:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 10:50:00,2022-03-13 10:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 10:59:00,2022-03-13 11:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 11:10:00,2022-03-13 11:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 11:19:00,2022-03-13 11:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 11:30:00,2022-03-13 11:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 11:39:00,2022-03-13 11:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 11:50:00,2022-03-13 11:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 11:59:00,2022-03-13 12:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 12:10:00,2022-03-13 12:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 12:19:00,2022-03-13 12:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 12:30:00,2022-03-13 12:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 12:39:00,2022-03-13 12:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 12:50:00,2022-03-13 12:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 12:59:00,2022-03-13 13:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 13:10:00,2022-03-13 13:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 13:19:00,2022-03-13 13:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 13:30:00,2022-03-13 13:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 13:39:00,2022-03-13 13:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 13:50:00,2022-03-13 13:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 13:59:00,2022-03-13 14:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 14:10:00,2022-03-13 14:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 14:19:00,2022-03-13 14:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 14:30:00,2022-03-13 14:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 14:39:00,2022-03-13 14:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 14:50:00,2022-03-13 14:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 14:59:00,2022-03-13 15:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 15:10:00,2022-03-13 15:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 15:19:00,2022-03-13 15:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 15:30:00,2022-03-13 15:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 15:39:00,2022-03-13 15:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 15:50:00,2022-03-13 15:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 15:59:00,2022-03-13 16:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 16:10:00,2022-03-13 16:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 16:19:00,2022-03-13 16:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 16:30:00,2022-03-13 16:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 16:39:00,2022-03-13 16:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 16:50:00,2022-03-13 16:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 16:59:00,2022-03-13 17:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 17:10:00,2022-03-13 17:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 17:19:00,2022-03-13 17:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 17:30:00,2022-03-13 17:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 17:39:00,2022-03-13 17:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 17:50:00,2022-03-13 17:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 17:59:00,2022-03-13 18:10:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 18:10:00,2022-03-13 18:15:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 18:19:00,2022-03-13 18:30:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 18:30:00,2022-03-13 18:35:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 18:39:00,2022-03-13 18:50:00,S_53,4341,0,4369706,CKB -LINE_29,S_53,2022-03-13 18:50:00,2022-03-13 18:55:00,S_54,2217,4,4369706,CKB -LINE_29,S_54,2022-03-13 18:59:00,2022-03-13 19:10:00,S_53,4288,0,4369706,CKB -LINE_29,S_53,2022-03-13 19:10:00,2022-03-13 19:10:00,DEPS_1,0.06,0,4369706,CKB -LINE_10,DEPS_1,2022-03-13 07:56:00,2022-03-13 07:56:00,S_24,0.06,0,4419537,CKB -LINE_10,S_24,2022-03-13 07:56:00,2022-03-13 07:56:00,S_24,0.0,792,4419537,CKB -LINE_10,S_24,2022-03-13 21:08:00,2022-03-13 21:08:00,S_24,0.0,0,4419537,CKB -LINE_10,S_24,2022-03-13 21:08:00,2022-03-13 21:08:00,DEPS_1,0.06,0,4419537,CKB -LINE_30,DEPS_1,2022-03-13 07:18:00,2022-03-13 07:18:00,S_55,0.06,0,4688586,CKB -LINE_30,S_55,2022-03-13 07:18:00,2022-03-13 07:26:00,S_56,5562,10,4688586,CKB -LINE_30,S_56,2022-03-13 07:36:00,2022-03-13 07:45:00,S_57,5941,32,4688586,CKB -LINE_30,S_57,2022-03-13 08:17:00,2022-03-13 08:26:00,S_56,5994,10,4688586,CKB -LINE_30,S_56,2022-03-13 08:36:00,2022-03-13 08:45:00,S_57,5941,32,4688586,CKB -LINE_30,S_57,2022-03-13 09:17:00,2022-03-13 09:26:00,S_56,5994,8,4688586,CKB -LINE_30,S_56,2022-03-13 09:34:00,2022-03-13 09:43:00,S_57,5941,36,4688586,CKB -LINE_30,S_57,2022-03-13 10:19:00,2022-03-13 10:30:00,S_56,5994,2,4688586,CKB -LINE_30,S_56,2022-03-13 10:32:00,2022-03-13 10:41:00,S_55,5566,0,4688586,CKB -LINE_30,S_55,2022-03-13 10:41:00,2022-03-13 10:41:00,DEPS_1,0.06,0,4688586,CKB -LINE_0,DEPS_1,2022-03-08 21:31:00,2022-03-08 21:31:00,S_0,0.06,0,4454944,CKB -LINE_0,S_0,2022-03-08 21:31:00,2022-03-08 22:04:00,S_2,14519,4,4454944,CKB -LINE_0,S_2,2022-03-08 22:08:00,2022-03-08 22:43:00,S_0,13541,8,4454944,CKB -LINE_0,S_0,2022-03-08 22:51:00,2022-03-08 23:24:00,S_2,14519,4,4454944,CKB -LINE_0,S_2,2022-03-08 23:28:00,2022-03-09 00:03:00,S_0,13541,8,4454944,CKB -LINE_0,S_0,2022-03-09 00:11:00,2022-03-09 00:44:00,S_2,14519,0,4454944,CKB -LINE_1,S_2,2022-03-09 00:44:00,2022-03-09 00:54:00,OPPS_3,4.1,25,4454944,CKB -LINE_1,OPPS_3,2022-03-09 01:19:00,2022-03-09 01:42:00,S_4,8.36,6,4454944,CKB -LINE_1,S_4,2022-03-09 01:48:00,2022-03-09 02:06:00,OPPS_3,9067,13,4454944,CKB -LINE_1,OPPS_3,2022-03-09 02:19:00,2022-03-09 02:42:00,S_4,8.36,6,4454944,CKB -LINE_1,S_4,2022-03-09 02:48:00,2022-03-09 03:06:00,OPPS_3,9067,13,4454944,CKB -LINE_1,OPPS_3,2022-03-09 03:19:00,2022-03-09 03:42:00,S_4,8.36,6,4454944,CKB -LINE_1,S_4,2022-03-09 03:48:00,2022-03-09 04:06:00,OPPS_3,9067,0,4454944,CKB -LINE_1,OPPS_3,2022-03-09 04:06:00,2022-03-09 04:06:00,DEPS_1,0.06,0,4454944,CKB -LINE_0,DEPS_1,2022-03-08 22:11:00,2022-03-08 22:11:00,S_0,0.06,0,4454949,CKB -LINE_0,S_0,2022-03-08 22:11:00,2022-03-08 22:44:00,S_2,14519,4,4454949,CKB -LINE_0,S_2,2022-03-08 22:48:00,2022-03-08 23:23:00,S_0,13541,8,4454949,CKB -LINE_0,S_0,2022-03-08 23:31:00,2022-03-09 00:04:00,S_2,14519,4,4454949,CKB -LINE_0,S_2,2022-03-09 00:08:00,2022-03-09 00:39:00,S_5,12213,0,4454949,CKB -LINE_1,S_5,2022-03-09 00:39:00,2022-03-09 00:47:00,OPPS_3,4.0,2,4454949,CKB -LINE_1,OPPS_3,2022-03-09 00:49:00,2022-03-09 01:12:00,S_4,8.36,6,4454949,CKB -LINE_1,S_4,2022-03-09 01:18:00,2022-03-09 01:36:00,OPPS_3,9067,13,4454949,CKB -LINE_1,OPPS_3,2022-03-09 01:49:00,2022-03-09 02:12:00,S_4,8.36,6,4454949,CKB -LINE_1,S_4,2022-03-09 02:18:00,2022-03-09 02:36:00,OPPS_3,9067,13,4454949,CKB -LINE_1,OPPS_3,2022-03-09 02:49:00,2022-03-09 03:12:00,S_4,8.36,6,4454949,CKB -LINE_1,S_4,2022-03-09 03:18:00,2022-03-09 03:36:00,OPPS_3,9067,13,4454949,CKB -LINE_1,OPPS_3,2022-03-09 03:49:00,2022-03-09 04:12:00,S_4,8.36,0,4454949,CKB -LINE_1,S_4,2022-03-09 04:12:00,2022-03-09 04:12:00,DEPS_1,0.06,0,4454949,CKB -LINE_2,DEPS_1,2022-03-08 21:06:00,2022-03-08 21:06:00,S_6,0.06,0,4664623,CKB -LINE_2,S_6,2022-03-08 21:06:00,2022-03-08 21:34:00,S_7,13018,19,4664623,CKB -LINE_2,S_7,2022-03-08 21:53:00,2022-03-08 22:13:00,S_8,10332,17,4664623,CKB -LINE_2,S_8,2022-03-08 22:30:00,2022-03-08 22:54:00,S_7,10.48,19,4664623,CKB -LINE_2,S_7,2022-03-08 23:13:00,2022-03-08 23:33:00,S_8,10332,17,4664623,CKB -LINE_2,S_8,2022-03-08 23:50:00,2022-03-09 00:14:00,S_7,10.48,2,4664623,CKB -LINE_2,S_7,2022-03-09 00:16:00,2022-03-09 00:23:00,S_9,3709,5,4664623,CKB -LINE_3,S_9,2022-03-09 00:28:00,2022-03-09 00:44:00,OPPS_10,6404,3,4664623,CKB -LINE_3,OPPS_10,2022-03-09 00:47:00,2022-03-09 01:10:00,S_11,10579,7,4664623,CKB -LINE_3,S_11,2022-03-09 01:17:00,2022-03-09 01:44:00,OPPS_10,12007,3,4664623,CKB -LINE_3,OPPS_10,2022-03-09 01:47:00,2022-03-09 02:10:00,S_11,10579,7,4664623,CKB -LINE_3,S_11,2022-03-09 02:17:00,2022-03-09 02:44:00,OPPS_10,12007,3,4664623,CKB -LINE_3,OPPS_10,2022-03-09 02:47:00,2022-03-09 03:10:00,S_11,10579,7,4664623,CKB -LINE_3,S_11,2022-03-09 03:17:00,2022-03-09 03:44:00,OPPS_10,12007,3,4664623,CKB -LINE_3,OPPS_10,2022-03-09 03:47:00,2022-03-09 04:10:00,S_11,10579,7,4664623,CKB -LINE_3,S_11,2022-03-09 04:17:00,2022-03-09 04:44:00,OPPS_10,12007,0,4664623,CKB -LINE_3,OPPS_10,2022-03-09 04:44:00,2022-03-09 04:44:00,DEPS_1,0.06,0,4664623,CKB -LINE_2,DEPS_1,2022-03-08 20:26:00,2022-03-08 20:26:00,S_6,0.06,0,4762733,CKB -LINE_2,S_6,2022-03-08 20:26:00,2022-03-08 20:56:00,S_12,14097,14,4762733,CKB -LINE_2,S_12,2022-03-08 21:10:00,2022-03-08 21:38:00,S_6,13.19,8,4762733,CKB -LINE_2,S_6,2022-03-08 21:46:00,2022-03-08 22:14:00,S_7,13018,19,4762733,CKB -LINE_2,S_7,2022-03-08 22:33:00,2022-03-08 22:53:00,S_8,10332,17,4762733,CKB -LINE_2,S_8,2022-03-08 23:10:00,2022-03-08 23:34:00,S_7,10.48,19,4762733,CKB -LINE_2,S_7,2022-03-08 23:53:00,2022-03-09 00:13:00,S_8,10332,2,4762733,CKB -LINE_2,S_8,2022-03-09 00:15:00,2022-03-09 00:16:00,OPPS_10,506,1,4762733,CKB -LINE_3,OPPS_10,2022-03-09 00:17:00,2022-03-09 00:40:00,S_11,10579,7,4762733,CKB -LINE_3,S_11,2022-03-09 00:47:00,2022-03-09 01:14:00,OPPS_10,12007,3,4762733,CKB -LINE_3,OPPS_10,2022-03-09 01:17:00,2022-03-09 01:40:00,S_11,10579,7,4762733,CKB -LINE_3,S_11,2022-03-09 01:47:00,2022-03-09 02:14:00,OPPS_10,12007,3,4762733,CKB -LINE_3,OPPS_10,2022-03-09 02:17:00,2022-03-09 02:40:00,S_11,10579,7,4762733,CKB -LINE_3,S_11,2022-03-09 02:47:00,2022-03-09 03:14:00,OPPS_10,12007,3,4762733,CKB -LINE_3,OPPS_10,2022-03-09 03:17:00,2022-03-09 03:40:00,S_11,10579,7,4762733,CKB -LINE_3,S_11,2022-03-09 03:47:00,2022-03-09 04:14:00,OPPS_10,12007,3,4762733,CKB -LINE_3,OPPS_10,2022-03-09 04:17:00,2022-03-09 04:40:00,S_11,10579,3,4762733,CKB -LINE_4,S_11,2022-03-09 04:43:00,2022-03-09 04:58:00,S_13,6161,0,4762733,CKB -LINE_4,S_13,2022-03-09 04:58:00,2022-03-09 04:58:00,DEPS_1,0.06,0,4762733,CKB -LINE_5,DEPS_1,2022-03-08 22:56:00,2022-03-08 22:56:00,S_14,0.06,0,4617408,CKB -LINE_5,S_14,2022-03-08 22:56:00,2022-03-08 23:08:00,S_15,5882,3,4617408,CKB -LINE_5,S_15,2022-03-08 23:11:00,2022-03-08 23:25:00,S_14,6232,0,4617408,CKB -LINE_5,S_14,2022-03-08 23:25:00,2022-03-08 23:38:00,S_15,6086,3,4617408,CKB -LINE_5,S_15,2022-03-08 23:41:00,2022-03-08 23:55:00,S_14,6232,0,4617408,CKB -LINE_5,S_14,2022-03-08 23:55:00,2022-03-09 00:08:00,S_15,6086,0,4617408,CKB -LINE_5,S_15,2022-03-09 00:08:00,2022-03-09 00:08:00,DEPS_1,0.06,0,4617408,CKB -LINE_6,DEPS_1,2022-03-08 05:05:00,2022-03-08 05:05:00,S_16,0.06,0,4426845,CKB -LINE_6,S_16,2022-03-08 05:05:00,2022-03-08 05:14:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 05:14:00,2022-03-08 05:23:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 05:25:00,2022-03-08 05:34:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 05:34:00,2022-03-08 05:43:00,S_16,5139,23,4426845,CKB -LINE_6,S_16,2022-03-08 06:06:00,2022-03-08 06:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 06:15:00,2022-03-08 06:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 06:26:00,2022-03-08 06:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 06:35:00,2022-03-08 06:44:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 06:46:00,2022-03-08 06:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 06:55:00,2022-03-08 07:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 07:06:00,2022-03-08 07:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 07:15:00,2022-03-08 07:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 07:26:00,2022-03-08 07:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 07:35:00,2022-03-08 07:44:00,S_16,5139,22,4426845,CKB -LINE_6,S_16,2022-03-08 08:06:00,2022-03-08 08:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 08:15:00,2022-03-08 08:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 08:26:00,2022-03-08 08:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 08:35:00,2022-03-08 08:44:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 08:46:00,2022-03-08 08:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 08:55:00,2022-03-08 09:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 09:06:00,2022-03-08 09:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 09:15:00,2022-03-08 09:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 09:26:00,2022-03-08 09:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 09:35:00,2022-03-08 09:44:00,S_16,5139,22,4426845,CKB -LINE_6,S_16,2022-03-08 10:06:00,2022-03-08 10:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 10:15:00,2022-03-08 10:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 10:26:00,2022-03-08 10:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 10:35:00,2022-03-08 10:44:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 10:46:00,2022-03-08 10:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 10:55:00,2022-03-08 11:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 11:06:00,2022-03-08 11:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 11:15:00,2022-03-08 11:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 11:26:00,2022-03-08 11:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 11:35:00,2022-03-08 11:44:00,S_16,5139,22,4426845,CKB -LINE_6,S_16,2022-03-08 12:06:00,2022-03-08 12:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 12:15:00,2022-03-08 12:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 12:26:00,2022-03-08 12:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 12:35:00,2022-03-08 12:44:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 12:46:00,2022-03-08 12:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 12:55:00,2022-03-08 13:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 13:06:00,2022-03-08 13:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 13:15:00,2022-03-08 13:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 13:26:00,2022-03-08 13:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 13:35:00,2022-03-08 13:44:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 13:46:00,2022-03-08 13:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 13:55:00,2022-03-08 14:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 14:06:00,2022-03-08 14:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 14:15:00,2022-03-08 14:24:00,S_16,5139,22,4426845,CKB -LINE_6,S_16,2022-03-08 14:46:00,2022-03-08 14:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 14:55:00,2022-03-08 15:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 15:06:00,2022-03-08 15:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 15:15:00,2022-03-08 15:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 15:26:00,2022-03-08 15:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 15:35:00,2022-03-08 15:44:00,S_16,5139,22,4426845,CKB -LINE_6,S_16,2022-03-08 16:06:00,2022-03-08 16:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 16:15:00,2022-03-08 16:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 16:26:00,2022-03-08 16:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 16:35:00,2022-03-08 16:44:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 16:46:00,2022-03-08 16:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 16:55:00,2022-03-08 17:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 17:06:00,2022-03-08 17:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 17:15:00,2022-03-08 17:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 17:26:00,2022-03-08 17:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 17:35:00,2022-03-08 17:44:00,S_16,5139,22,4426845,CKB -LINE_6,S_16,2022-03-08 18:06:00,2022-03-08 18:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 18:15:00,2022-03-08 18:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 18:26:00,2022-03-08 18:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 18:35:00,2022-03-08 18:44:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 18:46:00,2022-03-08 18:55:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 18:55:00,2022-03-08 19:04:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 19:06:00,2022-03-08 19:15:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 19:15:00,2022-03-08 19:24:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 19:26:00,2022-03-08 19:35:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 19:35:00,2022-03-08 19:44:00,S_16,5139,21,4426845,CKB -LINE_6,S_16,2022-03-08 20:05:00,2022-03-08 20:14:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 20:14:00,2022-03-08 20:23:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 20:25:00,2022-03-08 20:34:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 20:34:00,2022-03-08 20:43:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 20:45:00,2022-03-08 20:54:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 20:54:00,2022-03-08 21:03:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 21:05:00,2022-03-08 21:14:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 21:14:00,2022-03-08 21:23:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 21:25:00,2022-03-08 21:34:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 21:34:00,2022-03-08 21:43:00,S_16,5139,22,4426845,CKB -LINE_6,S_16,2022-03-08 22:05:00,2022-03-08 22:14:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 22:14:00,2022-03-08 22:23:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 22:25:00,2022-03-08 22:34:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 22:34:00,2022-03-08 22:43:00,S_16,5139,2,4426845,CKB -LINE_6,S_16,2022-03-08 22:45:00,2022-03-08 22:54:00,S_17,4781,0,4426845,CKB -LINE_6,S_17,2022-03-08 22:54:00,2022-03-08 23:03:00,S_16,5139,0,4426845,CKB -LINE_6,S_16,2022-03-08 23:03:00,2022-03-08 23:03:00,DEPS_1,0.06,0,4426845,CKB -LINE_7,DEPS_1,2022-03-09 00:06:00,2022-03-09 00:06:00,S_18,0.06,0,4708595,CKB -LINE_7,S_18,2022-03-09 00:06:00,2022-03-09 00:27:00,S_19,7827,0,4708595,CKB -LINE_8,S_19,2022-03-09 00:27:00,2022-03-09 00:48:00,S_20,11079,0,4708595,CKB -LINE_8,S_20,2022-03-09 00:48:00,2022-03-09 01:25:00,OPPS_21,20641,8,4708595,CKB -LINE_8,OPPS_21,2022-03-09 01:33:00,2022-03-09 02:16:00,S_20,20579,1,4708595,CKB -LINE_8,S_20,2022-03-09 02:17:00,2022-03-09 02:55:00,OPPS_21,20641,8,4708595,CKB -LINE_8,OPPS_21,2022-03-09 03:03:00,2022-03-09 03:46:00,S_20,20579,1,4708595,CKB -LINE_8,S_20,2022-03-09 03:47:00,2022-03-09 04:25:00,OPPS_21,20641,0,4708595,CKB -LINE_8,OPPS_21,2022-03-09 04:25:00,2022-03-09 04:25:00,DEPS_1,0.06,0,4708595,CKB -LINE_9,DEPS_23,2022-03-08 05:15:00,2022-03-08 06:01:00,S_22,17.9,0,4317625,VDL -LINE_9,S_22,2022-03-08 06:01:00,2022-03-08 06:15:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 06:23:00,2022-03-08 06:37:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 06:41:00,2022-03-08 06:55:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 07:03:00,2022-03-08 07:17:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 07:21:00,2022-03-08 07:35:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 07:43:00,2022-03-08 07:57:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 08:01:00,2022-03-08 08:15:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 08:23:00,2022-03-08 08:37:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 08:41:00,2022-03-08 08:55:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 09:03:00,2022-03-08 09:17:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 09:21:00,2022-03-08 09:35:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 09:43:00,2022-03-08 09:57:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 10:01:00,2022-03-08 10:15:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 10:23:00,2022-03-08 10:37:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 10:41:00,2022-03-08 10:55:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 11:03:00,2022-03-08 11:17:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 11:21:00,2022-03-08 11:35:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 11:43:00,2022-03-08 11:57:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 12:01:00,2022-03-08 12:15:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 12:23:00,2022-03-08 12:37:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 12:41:00,2022-03-08 12:55:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 13:03:00,2022-03-08 13:17:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 13:21:00,2022-03-08 13:35:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 13:43:00,2022-03-08 13:57:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 14:01:00,2022-03-08 14:15:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 14:23:00,2022-03-08 14:37:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 14:41:00,2022-03-08 14:55:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 15:03:00,2022-03-08 15:17:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 15:21:00,2022-03-08 15:35:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 15:43:00,2022-03-08 15:57:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 16:01:00,2022-03-08 16:15:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 16:23:00,2022-03-08 16:37:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 16:41:00,2022-03-08 16:55:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 17:03:00,2022-03-08 17:17:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 17:21:00,2022-03-08 17:35:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 17:43:00,2022-03-08 17:57:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 18:01:00,2022-03-08 18:15:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 18:23:00,2022-03-08 18:37:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 18:41:00,2022-03-08 18:55:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 19:03:00,2022-03-08 19:17:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 19:21:00,2022-03-08 19:35:00,S_22,4637,8,4317625,VDL -LINE_9,S_22,2022-03-08 19:43:00,2022-03-08 19:57:00,S_22,4637,4,4317625,VDL -LINE_9,S_22,2022-03-08 20:01:00,2022-03-08 20:14:00,S_22,4637,9,4317625,VDL -LINE_9,S_22,2022-03-08 20:23:00,2022-03-08 20:36:00,S_22,4637,0,4317625,VDL -LINE_9,S_22,2022-03-08 20:36:00,2022-03-08 21:15:00,DEPS_23,19.8,0,4317625,VDL -LINE_10,DEPS_1,2022-03-08 04:56:00,2022-03-08 04:56:00,S_24,0.06,18,4425668,CKB -LINE_10,S_24,2022-03-08 05:14:00,2022-03-08 05:20:00,S_25,3.29,0,4425668,CKB -LINE_10,S_25,2022-03-08 05:20:00,2022-03-08 05:24:00,S_24,2954,20,4425668,CKB -LINE_10,S_24,2022-03-08 05:44:00,2022-03-08 05:50:00,S_25,3.29,0,4425668,CKB -LINE_10,S_25,2022-03-08 05:50:00,2022-03-08 05:54:00,S_24,2954,5,4425668,CKB -LINE_10,S_24,2022-03-08 05:59:00,2022-03-08 06:06:00,S_25,3.29,2,4425668,CKB -LINE_10,S_25,2022-03-08 06:08:00,2022-03-08 06:13:00,S_24,2954,19,4425668,CKB -LINE_10,S_24,2022-03-08 06:32:00,2022-03-08 06:39:00,S_25,3.29,1,4425668,CKB -LINE_10,S_25,2022-03-08 06:40:00,2022-03-08 06:45:00,S_24,2954,7,4425668,CKB -LINE_10,S_24,2022-03-08 06:52:00,2022-03-08 06:59:00,S_25,3.29,1,4425668,CKB -LINE_10,S_25,2022-03-08 07:00:00,2022-03-08 07:05:00,S_24,2954,7,4425668,CKB -LINE_10,S_24,2022-03-08 07:12:00,2022-03-08 07:19:00,S_25,3.29,1,4425668,CKB -LINE_10,S_25,2022-03-08 07:20:00,2022-03-08 07:25:00,S_24,2954,7,4425668,CKB -LINE_10,S_24,2022-03-08 07:32:00,2022-03-08 07:39:00,S_25,3.29,1,4425668,CKB -LINE_10,S_25,2022-03-08 07:40:00,2022-03-08 07:45:00,S_24,2954,295,4425668,CKB -LINE_10,S_24,2022-03-08 12:40:00,2022-03-08 12:47:00,S_25,3.29,2,4425668,CKB -LINE_10,S_25,2022-03-08 12:49:00,2022-03-08 12:54:00,S_24,2954,46,4425668,CKB -LINE_10,S_24,2022-03-08 13:40:00,2022-03-08 13:47:00,S_25,3.29,2,4425668,CKB -LINE_10,S_25,2022-03-08 13:49:00,2022-03-08 13:54:00,S_24,2954,434,4425668,CKB -LINE_10,S_24,2022-03-08 21:08:00,2022-03-08 21:08:00,DEPS_1,0.06,0,4425668,CKB -LINE_11,DEPS_1,2022-03-08 07:20:00,2022-03-08 07:20:00,OPPS_26,0.06,0,4448150,CKB -LINE_11,OPPS_26,2022-03-08 07:20:00,2022-03-08 07:50:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 08:00:00,2022-03-08 08:30:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 08:40:00,2022-03-08 09:10:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 09:20:00,2022-03-08 09:50:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 10:00:00,2022-03-08 10:30:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 10:40:00,2022-03-08 11:10:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 11:20:00,2022-03-08 11:50:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 12:00:00,2022-03-08 12:30:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 12:40:00,2022-03-08 13:10:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 13:20:00,2022-03-08 13:50:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 14:00:00,2022-03-08 14:30:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 14:40:00,2022-03-08 15:10:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 15:20:00,2022-03-08 15:50:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 16:00:00,2022-03-08 16:30:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 16:40:00,2022-03-08 17:10:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 17:20:00,2022-03-08 17:50:00,OPPS_26,9266,10,4448150,CKB -LINE_11,OPPS_26,2022-03-08 18:00:00,2022-03-08 18:30:00,OPPS_26,9266,0,4448150,CKB -LINE_11,OPPS_26,2022-03-08 18:30:00,2022-03-08 18:30:00,DEPS_1,0.06,0,4448150,CKB -LINE_12,DEPS_1,2022-03-08 07:10:00,2022-03-08 07:10:00,S_27,0.06,0,4733895,CKB -LINE_12,S_27,2022-03-08 07:10:00,2022-03-08 07:18:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 07:28:00,2022-03-08 07:40:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 07:40:00,2022-03-08 07:48:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 07:58:00,2022-03-08 08:10:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 08:10:00,2022-03-08 08:18:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 08:28:00,2022-03-08 08:40:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 08:40:00,2022-03-08 08:48:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 08:58:00,2022-03-08 09:10:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 09:10:00,2022-03-08 09:18:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 09:28:00,2022-03-08 09:40:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 09:40:00,2022-03-08 09:48:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 09:58:00,2022-03-08 10:10:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 10:10:00,2022-03-08 10:18:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 10:28:00,2022-03-08 10:40:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 10:40:00,2022-03-08 10:48:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 10:58:00,2022-03-08 11:10:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 11:10:00,2022-03-08 11:18:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 11:28:00,2022-03-08 11:40:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 11:40:00,2022-03-08 11:48:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 11:58:00,2022-03-08 12:10:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 12:10:00,2022-03-08 12:18:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 12:28:00,2022-03-08 12:40:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 12:40:00,2022-03-08 12:48:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 12:58:00,2022-03-08 13:10:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 13:10:00,2022-03-08 13:18:00,OPPS_28,2169,10,4733895,CKB -LINE_12,OPPS_28,2022-03-08 13:28:00,2022-03-08 13:40:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 13:40:00,2022-03-08 13:48:00,OPPS_28,2169,8,4733895,CKB -LINE_12,OPPS_28,2022-03-08 13:56:00,2022-03-08 14:10:00,S_27,2952,0,4733895,CKB -LINE_12,S_27,2022-03-08 14:10:00,2022-03-08 14:19:00,OPPS_28,2169,14,4733895,CKB -LINE_12,OPPS_28,2022-03-08 14:33:00,2022-03-08 14:47:00,S_27,2952,3,4733895,CKB -LINE_12,S_27,2022-03-08 14:50:00,2022-03-08 14:59:00,OPPS_28,2169,14,4733895,CKB -LINE_12,OPPS_28,2022-03-08 15:13:00,2022-03-08 15:27:00,S_27,2952,3,4733895,CKB -LINE_12,S_27,2022-03-08 15:30:00,2022-03-08 15:39:00,OPPS_28,2169,14,4733895,CKB -LINE_12,OPPS_28,2022-03-08 15:53:00,2022-03-08 16:07:00,S_27,2952,3,4733895,CKB -LINE_12,S_27,2022-03-08 16:10:00,2022-03-08 16:19:00,OPPS_28,2169,14,4733895,CKB -LINE_12,OPPS_28,2022-03-08 16:33:00,2022-03-08 16:47:00,S_27,2952,3,4733895,CKB -LINE_12,S_27,2022-03-08 16:50:00,2022-03-08 16:59:00,OPPS_28,2169,14,4733895,CKB -LINE_12,OPPS_28,2022-03-08 17:13:00,2022-03-08 17:27:00,S_27,2952,3,4733895,CKB -LINE_12,S_27,2022-03-08 17:30:00,2022-03-08 17:39:00,OPPS_28,2169,13,4733895,CKB -LINE_12,OPPS_28,2022-03-08 17:52:00,2022-03-08 18:05:00,S_27,2952,5,4733895,CKB -LINE_12,S_27,2022-03-08 18:10:00,2022-03-08 18:18:00,OPPS_28,2169,0,4733895,CKB -LINE_12,OPPS_28,2022-03-08 18:18:00,2022-03-08 18:18:00,DEPS_1,0.06,0,4733895,CKB -LINE_12,DEPS_1,2022-03-08 14:13:00,2022-03-08 14:13:00,OPPS_28,0.06,0,4734200,CKB -LINE_12,OPPS_28,2022-03-08 14:13:00,2022-03-08 14:27:00,S_27,2952,3,4734200,CKB -LINE_12,S_27,2022-03-08 14:30:00,2022-03-08 14:39:00,OPPS_28,2169,14,4734200,CKB -LINE_12,OPPS_28,2022-03-08 14:53:00,2022-03-08 15:07:00,S_27,2952,3,4734200,CKB -LINE_12,S_27,2022-03-08 15:10:00,2022-03-08 15:19:00,OPPS_28,2169,14,4734200,CKB -LINE_12,OPPS_28,2022-03-08 15:33:00,2022-03-08 15:47:00,S_27,2952,3,4734200,CKB -LINE_12,S_27,2022-03-08 15:50:00,2022-03-08 15:59:00,OPPS_28,2169,14,4734200,CKB -LINE_12,OPPS_28,2022-03-08 16:13:00,2022-03-08 16:27:00,S_27,2952,3,4734200,CKB -LINE_12,S_27,2022-03-08 16:30:00,2022-03-08 16:39:00,OPPS_28,2169,14,4734200,CKB -LINE_12,OPPS_28,2022-03-08 16:53:00,2022-03-08 17:07:00,S_27,2952,3,4734200,CKB -LINE_12,S_27,2022-03-08 17:10:00,2022-03-08 17:19:00,OPPS_28,2169,14,4734200,CKB -LINE_12,OPPS_28,2022-03-08 17:33:00,2022-03-08 17:47:00,S_27,2952,3,4734200,CKB -LINE_12,S_27,2022-03-08 17:50:00,2022-03-08 17:59:00,OPPS_28,2169,14,4734200,CKB -LINE_12,OPPS_28,2022-03-08 18:13:00,2022-03-08 18:25:00,S_27,2952,0,4734200,CKB -LINE_12,S_27,2022-03-08 18:25:00,2022-03-08 18:25:00,DEPS_1,0.06,0,4734200,CKB -LINE_13,DEPS_1,2022-03-09 00:23:00,2022-03-09 00:23:00,S_29,0.06,0,4318157,CKB -LINE_13,S_29,2022-03-09 00:23:00,2022-03-09 00:30:00,OPPS_30,2577,9,4318157,CKB -LINE_14,OPPS_30,2022-03-09 00:39:00,2022-03-09 00:54:00,S_31,5937,9,4318157,CKB -LINE_14,S_31,2022-03-09 01:03:00,2022-03-09 01:17:00,OPPS_30,6.19,0,4318157,CKB -LINE_13,OPPS_30,2022-03-09 01:17:00,2022-03-09 01:23:00,S_29,2555,0,4318157,CKB -LINE_13,S_29,2022-03-09 01:23:00,2022-03-09 01:30:00,OPPS_30,2577,9,4318157,CKB -LINE_14,OPPS_30,2022-03-09 01:39:00,2022-03-09 01:54:00,S_31,5937,9,4318157,CKB -LINE_14,S_31,2022-03-09 02:03:00,2022-03-09 02:17:00,OPPS_30,6.19,0,4318157,CKB -LINE_13,OPPS_30,2022-03-09 02:17:00,2022-03-09 02:23:00,S_29,2555,0,4318157,CKB -LINE_13,S_29,2022-03-09 02:23:00,2022-03-09 02:30:00,OPPS_30,2577,9,4318157,CKB -LINE_14,OPPS_30,2022-03-09 02:39:00,2022-03-09 02:54:00,S_31,5937,9,4318157,CKB -LINE_14,S_31,2022-03-09 03:03:00,2022-03-09 03:17:00,OPPS_30,6.19,0,4318157,CKB -LINE_13,OPPS_30,2022-03-09 03:17:00,2022-03-09 03:23:00,S_29,2555,0,4318157,CKB -LINE_13,S_29,2022-03-09 03:23:00,2022-03-09 03:30:00,OPPS_30,2577,9,4318157,CKB -LINE_14,OPPS_30,2022-03-09 03:39:00,2022-03-09 03:54:00,S_31,5937,9,4318157,CKB -LINE_14,S_31,2022-03-09 04:03:00,2022-03-09 04:17:00,OPPS_30,6.19,0,4318157,CKB -LINE_13,OPPS_30,2022-03-09 04:17:00,2022-03-09 04:23:00,S_29,2555,0,4318157,CKB -LINE_13,S_29,2022-03-09 04:23:00,2022-03-09 04:23:00,DEPS_1,0.06,0,4318157,CKB -LINE_14,DEPS_1,2022-03-09 00:33:00,2022-03-09 00:33:00,S_31,0.06,0,4318177,CKB -LINE_14,S_31,2022-03-09 00:33:00,2022-03-09 00:47:00,OPPS_30,6.19,0,4318177,CKB -LINE_13,OPPS_30,2022-03-09 00:47:00,2022-03-09 00:53:00,S_29,2555,0,4318177,CKB -LINE_13,S_29,2022-03-09 00:53:00,2022-03-09 01:00:00,OPPS_30,2577,9,4318177,CKB -LINE_14,OPPS_30,2022-03-09 01:09:00,2022-03-09 01:24:00,S_31,5937,9,4318177,CKB -LINE_14,S_31,2022-03-09 01:33:00,2022-03-09 01:47:00,OPPS_30,6.19,0,4318177,CKB -LINE_13,OPPS_30,2022-03-09 01:47:00,2022-03-09 01:53:00,S_29,2555,0,4318177,CKB -LINE_13,S_29,2022-03-09 01:53:00,2022-03-09 02:00:00,OPPS_30,2577,9,4318177,CKB -LINE_14,OPPS_30,2022-03-09 02:09:00,2022-03-09 02:24:00,S_31,5937,9,4318177,CKB -LINE_14,S_31,2022-03-09 02:33:00,2022-03-09 02:47:00,OPPS_30,6.19,0,4318177,CKB -LINE_13,OPPS_30,2022-03-09 02:47:00,2022-03-09 02:53:00,S_29,2555,0,4318177,CKB -LINE_13,S_29,2022-03-09 02:53:00,2022-03-09 03:00:00,OPPS_30,2577,9,4318177,CKB -LINE_14,OPPS_30,2022-03-09 03:09:00,2022-03-09 03:24:00,S_31,5937,9,4318177,CKB -LINE_14,S_31,2022-03-09 03:33:00,2022-03-09 03:47:00,OPPS_30,6.19,0,4318177,CKB -LINE_13,OPPS_30,2022-03-09 03:47:00,2022-03-09 03:53:00,S_29,2555,0,4318177,CKB -LINE_13,S_29,2022-03-09 03:53:00,2022-03-09 04:00:00,OPPS_30,2577,9,4318177,CKB -LINE_14,OPPS_30,2022-03-09 04:09:00,2022-03-09 04:24:00,S_31,5937,0,4318177,CKB -LINE_14,S_31,2022-03-09 04:24:00,2022-03-09 04:24:00,DEPS_1,0.06,0,4318177,CKB -LINE_15,DEPS_1,2022-03-09 00:57:00,2022-03-09 00:57:00,OPPS_32,0.06,0,4319352,CKB -LINE_15,OPPS_32,2022-03-09 00:57:00,2022-03-09 01:06:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 01:06:00,2022-03-09 01:11:00,OPPS_32,2936,16,4319352,CKB -LINE_15,OPPS_32,2022-03-09 01:27:00,2022-03-09 01:36:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 01:36:00,2022-03-09 01:41:00,OPPS_32,2936,16,4319352,CKB -LINE_15,OPPS_32,2022-03-09 01:57:00,2022-03-09 02:06:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 02:06:00,2022-03-09 02:11:00,OPPS_32,2936,16,4319352,CKB -LINE_15,OPPS_32,2022-03-09 02:27:00,2022-03-09 02:36:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 02:36:00,2022-03-09 02:41:00,OPPS_32,2936,16,4319352,CKB -LINE_15,OPPS_32,2022-03-09 02:57:00,2022-03-09 03:06:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 03:06:00,2022-03-09 03:11:00,OPPS_32,2936,16,4319352,CKB -LINE_15,OPPS_32,2022-03-09 03:27:00,2022-03-09 03:36:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 03:36:00,2022-03-09 03:41:00,OPPS_32,2936,16,4319352,CKB -LINE_15,OPPS_32,2022-03-09 03:57:00,2022-03-09 04:06:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 04:06:00,2022-03-09 04:11:00,OPPS_32,2936,16,4319352,CKB -LINE_15,OPPS_32,2022-03-09 04:27:00,2022-03-09 04:36:00,S_33,4343,0,4319352,CKB -LINE_15,S_33,2022-03-09 04:36:00,2022-03-09 04:36:00,DEPS_1,0.06,0,4319352,CKB -LINE_16,DEPS_1,2022-03-09 00:29:00,2022-03-09 00:29:00,S_34,0.06,0,4751087,CKB -LINE_16,S_34,2022-03-09 00:29:00,2022-03-09 00:41:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 00:47:00,2022-03-09 00:57:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 00:59:00,2022-03-09 01:11:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 01:17:00,2022-03-09 01:27:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 01:29:00,2022-03-09 01:41:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 01:47:00,2022-03-09 01:57:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 01:59:00,2022-03-09 02:11:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 02:17:00,2022-03-09 02:27:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 02:29:00,2022-03-09 02:41:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 02:47:00,2022-03-09 02:57:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 02:59:00,2022-03-09 03:11:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 03:17:00,2022-03-09 03:27:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 03:29:00,2022-03-09 03:41:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 03:47:00,2022-03-09 03:57:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 03:59:00,2022-03-09 04:11:00,S_35,4481,6,4751087,CKB -LINE_16,S_35,2022-03-09 04:17:00,2022-03-09 04:27:00,S_34,4031,2,4751087,CKB -LINE_16,S_34,2022-03-09 04:29:00,2022-03-09 04:41:00,S_35,4481,0,4751087,CKB -LINE_16,S_35,2022-03-09 04:41:00,2022-03-09 04:41:00,DEPS_1,0.06,0,4751087,CKB -LINE_17,DEPS_1,2022-03-09 00:30:00,2022-03-09 00:30:00,S_34,0.06,0,4453545,CKB -LINE_17,S_34,2022-03-09 00:30:00,2022-03-09 00:44:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 00:44:00,2022-03-09 00:57:00,S_34,5302,3,4453545,CKB -LINE_17,S_34,2022-03-09 01:00:00,2022-03-09 01:14:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 01:14:00,2022-03-09 01:27:00,S_34,5302,3,4453545,CKB -LINE_17,S_34,2022-03-09 01:30:00,2022-03-09 01:44:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 01:44:00,2022-03-09 01:57:00,S_34,5302,3,4453545,CKB -LINE_17,S_34,2022-03-09 02:00:00,2022-03-09 02:14:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 02:14:00,2022-03-09 02:27:00,S_34,5302,3,4453545,CKB -LINE_17,S_34,2022-03-09 02:30:00,2022-03-09 02:44:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 02:44:00,2022-03-09 02:57:00,S_34,5302,3,4453545,CKB -LINE_17,S_34,2022-03-09 03:00:00,2022-03-09 03:14:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 03:14:00,2022-03-09 03:27:00,S_34,5302,3,4453545,CKB -LINE_17,S_34,2022-03-09 03:30:00,2022-03-09 03:44:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 03:44:00,2022-03-09 03:57:00,S_34,5302,3,4453545,CKB -LINE_17,S_34,2022-03-09 04:00:00,2022-03-09 04:14:00,S_36,4801,0,4453545,CKB -LINE_17,S_36,2022-03-09 04:14:00,2022-03-09 04:27:00,S_34,5302,0,4453545,CKB -LINE_17,S_34,2022-03-09 04:27:00,2022-03-09 04:27:00,DEPS_1,0.06,0,4453545,CKB -LINE_18,DEPS_1,2022-03-09 00:43:00,2022-03-09 00:43:00,S_37,0.06,0,4374467,CKB -LINE_18,S_37,2022-03-09 00:43:00,2022-03-09 01:33:00,S_37,20434,10,4374467,CKB -LINE_18,S_37,2022-03-09 01:43:00,2022-03-09 02:33:00,S_37,20434,10,4374467,CKB -LINE_18,S_37,2022-03-09 02:43:00,2022-03-09 03:33:00,S_37,20434,10,4374467,CKB -LINE_18,S_37,2022-03-09 03:43:00,2022-03-09 04:33:00,S_37,20434,0,4374467,CKB -LINE_18,S_37,2022-03-09 04:33:00,2022-03-09 04:33:00,DEPS_1,0.06,0,4374467,CKB -LINE_18,DEPS_1,2022-03-09 00:13:00,2022-03-09 00:13:00,S_37,0.06,0,4374472,CKB -LINE_18,S_37,2022-03-09 00:13:00,2022-03-09 01:03:00,S_37,20434,10,4374472,CKB -LINE_18,S_37,2022-03-09 01:13:00,2022-03-09 02:03:00,S_37,20434,10,4374472,CKB -LINE_18,S_37,2022-03-09 02:13:00,2022-03-09 03:03:00,S_37,20434,10,4374472,CKB -LINE_18,S_37,2022-03-09 03:13:00,2022-03-09 04:03:00,S_37,20434,0,4374472,CKB -LINE_18,S_37,2022-03-09 04:03:00,2022-03-09 04:03:00,DEPS_1,0.06,0,4374472,CKB -LINE_19,DEPS_1,2022-03-09 00:24:00,2022-03-09 00:24:00,S_38,0.06,0,4456448,CKB -LINE_19,S_38,2022-03-09 00:24:00,2022-03-09 00:48:00,OPPS_39,11.86,4,4456448,CKB -LINE_19,OPPS_39,2022-03-09 00:52:00,2022-03-09 01:14:00,S_38,11139,10,4456448,CKB -LINE_19,S_38,2022-03-09 01:24:00,2022-03-09 01:48:00,OPPS_39,11.86,4,4456448,CKB -LINE_19,OPPS_39,2022-03-09 01:52:00,2022-03-09 02:14:00,S_38,11139,10,4456448,CKB -LINE_19,S_38,2022-03-09 02:24:00,2022-03-09 02:48:00,OPPS_39,11.86,4,4456448,CKB -LINE_19,OPPS_39,2022-03-09 02:52:00,2022-03-09 03:14:00,S_38,11139,10,4456448,CKB -LINE_19,S_38,2022-03-09 03:24:00,2022-03-09 03:48:00,OPPS_39,11.86,4,4456448,CKB -LINE_19,OPPS_39,2022-03-09 03:52:00,2022-03-09 04:14:00,S_38,11139,0,4456448,CKB -LINE_19,S_38,2022-03-09 04:14:00,2022-03-09 04:14:00,DEPS_1,0.06,0,4456448,CKB -LINE_19,DEPS_1,2022-03-09 00:22:00,2022-03-09 00:22:00,OPPS_39,0.06,0,4456456,CKB -LINE_19,OPPS_39,2022-03-09 00:22:00,2022-03-09 00:44:00,S_38,11139,10,4456456,CKB -LINE_19,S_38,2022-03-09 00:54:00,2022-03-09 01:18:00,OPPS_39,11.86,4,4456456,CKB -LINE_19,OPPS_39,2022-03-09 01:22:00,2022-03-09 01:44:00,S_38,11139,10,4456456,CKB -LINE_19,S_38,2022-03-09 01:54:00,2022-03-09 02:18:00,OPPS_39,11.86,4,4456456,CKB -LINE_19,OPPS_39,2022-03-09 02:22:00,2022-03-09 02:44:00,S_38,11139,10,4456456,CKB -LINE_19,S_38,2022-03-09 02:54:00,2022-03-09 03:18:00,OPPS_39,11.86,4,4456456,CKB -LINE_19,OPPS_39,2022-03-09 03:22:00,2022-03-09 03:44:00,S_38,11139,10,4456456,CKB -LINE_19,S_38,2022-03-09 03:54:00,2022-03-09 04:18:00,OPPS_39,11.86,4,4456456,CKB -LINE_19,OPPS_39,2022-03-09 04:22:00,2022-03-09 04:44:00,S_38,11139,0,4456456,CKB -LINE_19,S_38,2022-03-09 04:44:00,2022-03-09 04:44:00,DEPS_1,0.06,0,4456456,CKB -LINE_20,DEPS_1,2022-03-09 00:32:00,2022-03-09 00:32:00,S_13,0.06,0,4747650,CKB -LINE_20,S_13,2022-03-09 00:32:00,2022-03-09 00:44:00,S_40,4212,3,4747650,CKB -LINE_20,S_40,2022-03-09 00:47:00,2022-03-09 01:16:00,S_41,13048,0,4747650,CKB -LINE_20,S_41,2022-03-09 01:16:00,2022-03-09 01:42:00,S_40,12869,5,4747650,CKB -LINE_20,S_40,2022-03-09 01:47:00,2022-03-09 02:16:00,S_41,13048,0,4747650,CKB -LINE_20,S_41,2022-03-09 02:16:00,2022-03-09 02:42:00,S_40,12869,5,4747650,CKB -LINE_20,S_40,2022-03-09 02:47:00,2022-03-09 03:16:00,S_41,13048,0,4747650,CKB -LINE_20,S_41,2022-03-09 03:16:00,2022-03-09 03:42:00,S_40,12869,5,4747650,CKB -LINE_20,S_40,2022-03-09 03:47:00,2022-03-09 04:16:00,S_41,13048,0,4747650,CKB -LINE_20,S_41,2022-03-09 04:16:00,2022-03-09 04:34:00,DEPS_42,9538,0,4747650,CKB -LINE_20,DEPS_42,2022-03-09 04:34:00,2022-03-09 04:34:00,DEPS_1,0.06,0,4747650,CKB -LINE_20,DEPS_1,2022-03-09 00:17:00,2022-03-09 00:17:00,S_40,0.06,0,4747660,CKB -LINE_20,S_40,2022-03-09 00:17:00,2022-03-09 00:46:00,S_41,13048,0,4747660,CKB -LINE_20,S_41,2022-03-09 00:46:00,2022-03-09 01:12:00,S_40,12869,5,4747660,CKB -LINE_20,S_40,2022-03-09 01:17:00,2022-03-09 01:46:00,S_41,13048,0,4747660,CKB -LINE_20,S_41,2022-03-09 01:46:00,2022-03-09 02:12:00,S_40,12869,5,4747660,CKB -LINE_20,S_40,2022-03-09 02:17:00,2022-03-09 02:46:00,S_41,13048,0,4747660,CKB -LINE_20,S_41,2022-03-09 02:46:00,2022-03-09 03:12:00,S_40,12869,5,4747660,CKB -LINE_20,S_40,2022-03-09 03:17:00,2022-03-09 03:46:00,S_41,13048,0,4747660,CKB -LINE_20,S_41,2022-03-09 03:46:00,2022-03-09 04:12:00,S_40,12869,5,4747660,CKB -LINE_20,S_40,2022-03-09 04:17:00,2022-03-09 04:28:00,S_13,4316,0,4747660,CKB -LINE_20,S_13,2022-03-09 04:28:00,2022-03-09 04:28:00,DEPS_1,0.06,0,4747660,CKB -LINE_21,DEPS_1,2022-03-09 00:49:00,2022-03-09 00:49:00,OPPS_3,0.06,0,4434341,CKB -LINE_21,OPPS_3,2022-03-09 00:49:00,2022-03-09 01:04:00,S_16,10229,0,4434341,CKB -LINE_21,S_16,2022-03-09 01:04:00,2022-03-09 01:19:00,OPPS_3,11801,0,4434341,CKB -LINE_21,OPPS_3,2022-03-09 01:19:00,2022-03-09 01:34:00,S_16,10229,0,4434341,CKB -LINE_21,S_16,2022-03-09 01:34:00,2022-03-09 01:49:00,OPPS_3,11801,0,4434341,CKB -LINE_21,OPPS_3,2022-03-09 01:49:00,2022-03-09 02:04:00,S_16,10229,0,4434341,CKB -LINE_21,S_16,2022-03-09 02:04:00,2022-03-09 02:19:00,OPPS_3,11801,0,4434341,CKB -LINE_21,OPPS_3,2022-03-09 02:19:00,2022-03-09 02:34:00,S_16,10229,0,4434341,CKB -LINE_21,S_16,2022-03-09 02:34:00,2022-03-09 02:49:00,OPPS_3,11801,0,4434341,CKB -LINE_21,OPPS_3,2022-03-09 02:49:00,2022-03-09 03:04:00,S_16,10229,0,4434341,CKB -LINE_21,S_16,2022-03-09 03:04:00,2022-03-09 03:19:00,OPPS_3,11801,0,4434341,CKB -LINE_21,OPPS_3,2022-03-09 03:19:00,2022-03-09 03:34:00,S_16,10229,0,4434341,CKB -LINE_21,S_16,2022-03-09 03:34:00,2022-03-09 03:49:00,OPPS_3,11801,0,4434341,CKB -LINE_21,OPPS_3,2022-03-09 03:49:00,2022-03-09 04:04:00,S_16,10229,0,4434341,CKB -LINE_21,S_16,2022-03-09 04:04:00,2022-03-09 04:19:00,OPPS_3,11801,23,4434341,CKB -LINE_22,OPPS_3,2022-03-09 04:42:00,2022-03-09 05:04:00,S_43,6.81,0,4434341,CKB -LINE_22,S_43,2022-03-09 05:04:00,2022-03-09 05:04:00,DEPS_1,0.06,0,4434341,CKB -LINE_8,DEPS_1,2022-03-09 00:32:00,2022-03-09 00:32:00,S_13,0.06,0,4434897,CKB -LINE_8,S_13,2022-03-09 00:32:00,2022-03-09 00:57:00,OPPS_21,11545,6,4434897,CKB -LINE_8,OPPS_21,2022-03-09 01:03:00,2022-03-09 01:46:00,S_20,20579,1,4434897,CKB -LINE_8,S_20,2022-03-09 01:47:00,2022-03-09 02:25:00,OPPS_21,20641,8,4434897,CKB -LINE_8,OPPS_21,2022-03-09 02:33:00,2022-03-09 03:16:00,S_20,20579,1,4434897,CKB -LINE_8,S_20,2022-03-09 03:17:00,2022-03-09 03:55:00,OPPS_21,20641,8,4434897,CKB -LINE_8,OPPS_21,2022-03-09 04:03:00,2022-03-09 04:28:00,S_13,11499,0,4434897,CKB -LINE_8,S_13,2022-03-09 04:28:00,2022-03-09 04:28:00,DEPS_1,0.06,0,4434897,CKB -LINE_8,DEPS_1,2022-03-09 00:33:00,2022-03-09 00:33:00,OPPS_21,0.06,0,4434902,CKB -LINE_8,OPPS_21,2022-03-09 00:33:00,2022-03-09 01:16:00,S_20,20579,1,4434902,CKB -LINE_8,S_20,2022-03-09 01:17:00,2022-03-09 01:55:00,OPPS_21,20641,8,4434902,CKB -LINE_8,OPPS_21,2022-03-09 02:03:00,2022-03-09 02:46:00,S_20,20579,1,4434902,CKB -LINE_8,S_20,2022-03-09 02:47:00,2022-03-09 03:25:00,OPPS_21,20641,8,4434902,CKB -LINE_8,OPPS_21,2022-03-09 03:33:00,2022-03-09 04:16:00,S_20,20579,1,4434902,CKB -LINE_8,S_20,2022-03-09 04:17:00,2022-03-09 04:51:00,S_44,18752,0,4434902,CKB -LINE_8,S_44,2022-03-09 04:51:00,2022-03-09 04:51:00,DEPS_1,0.06,0,4434902,CKB -LINE_23,DEPS_1,2022-03-09 00:34:00,2022-03-09 00:34:00,S_45,0.06,0,4619766,CKB -LINE_23,S_45,2022-03-09 00:34:00,2022-03-09 01:00:00,S_46,9016,0,4619766,CKB -LINE_23,S_46,2022-03-09 01:00:00,2022-03-09 01:27:00,S_45,10083,7,4619766,CKB -LINE_23,S_45,2022-03-09 01:34:00,2022-03-09 02:00:00,S_46,9016,0,4619766,CKB -LINE_23,S_46,2022-03-09 02:00:00,2022-03-09 02:27:00,S_45,10083,7,4619766,CKB -LINE_23,S_45,2022-03-09 02:34:00,2022-03-09 03:00:00,S_46,9016,0,4619766,CKB -LINE_23,S_46,2022-03-09 03:00:00,2022-03-09 03:27:00,S_45,10083,7,4619766,CKB -LINE_23,S_45,2022-03-09 03:34:00,2022-03-09 04:00:00,S_46,9016,0,4619766,CKB -LINE_23,S_46,2022-03-09 04:00:00,2022-03-09 04:27:00,S_45,10083,0,4619766,CKB -LINE_23,S_45,2022-03-09 04:27:00,2022-03-09 04:27:00,DEPS_1,0.06,0,4619766,CKB -LINE_23,DEPS_1,2022-03-09 00:30:00,2022-03-09 00:30:00,S_46,0.06,0,4619991,CKB -LINE_23,S_46,2022-03-09 00:30:00,2022-03-09 00:57:00,S_45,10083,7,4619991,CKB -LINE_23,S_45,2022-03-09 01:04:00,2022-03-09 01:30:00,S_46,9016,0,4619991,CKB -LINE_23,S_46,2022-03-09 01:30:00,2022-03-09 01:57:00,S_45,10083,7,4619991,CKB -LINE_23,S_45,2022-03-09 02:04:00,2022-03-09 02:30:00,S_46,9016,0,4619991,CKB -LINE_23,S_46,2022-03-09 02:30:00,2022-03-09 02:57:00,S_45,10083,7,4619991,CKB -LINE_23,S_45,2022-03-09 03:04:00,2022-03-09 03:30:00,S_46,9016,0,4619991,CKB -LINE_23,S_46,2022-03-09 03:30:00,2022-03-09 03:57:00,S_45,10083,7,4619991,CKB -LINE_23,S_45,2022-03-09 04:04:00,2022-03-09 04:30:00,S_46,9016,0,4619991,CKB -LINE_23,S_46,2022-03-09 04:30:00,2022-03-09 04:57:00,S_45,10083,0,4619991,CKB -LINE_23,S_45,2022-03-09 04:57:00,2022-03-09 04:57:00,DEPS_1,0.06,0,4619991,CKB -LINE_24,DEPS_1,2022-03-09 00:31:00,2022-03-09 00:31:00,OPPS_21,0.06,0,4374744,CKB -LINE_24,OPPS_21,2022-03-09 00:31:00,2022-03-09 00:44:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 00:44:00,2022-03-09 00:56:00,OPPS_21,5362,5,4374744,CKB -LINE_24,OPPS_21,2022-03-09 01:01:00,2022-03-09 01:14:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 01:14:00,2022-03-09 01:26:00,OPPS_21,5362,5,4374744,CKB -LINE_24,OPPS_21,2022-03-09 01:31:00,2022-03-09 01:44:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 01:44:00,2022-03-09 01:56:00,OPPS_21,5362,5,4374744,CKB -LINE_24,OPPS_21,2022-03-09 02:01:00,2022-03-09 02:14:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 02:14:00,2022-03-09 02:26:00,OPPS_21,5362,5,4374744,CKB -LINE_24,OPPS_21,2022-03-09 02:31:00,2022-03-09 02:44:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 02:44:00,2022-03-09 02:56:00,OPPS_21,5362,5,4374744,CKB -LINE_24,OPPS_21,2022-03-09 03:01:00,2022-03-09 03:14:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 03:14:00,2022-03-09 03:26:00,OPPS_21,5362,5,4374744,CKB -LINE_24,OPPS_21,2022-03-09 03:31:00,2022-03-09 03:44:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 03:44:00,2022-03-09 03:56:00,OPPS_21,5362,5,4374744,CKB -LINE_24,OPPS_21,2022-03-09 04:01:00,2022-03-09 04:14:00,S_47,4872,0,4374744,CKB -LINE_24,S_47,2022-03-09 04:14:00,2022-03-09 04:26:00,OPPS_21,5362,0,4374744,CKB -LINE_24,OPPS_21,2022-03-09 04:26:00,2022-03-09 04:26:00,DEPS_1,0.06,0,4374744,CKB -LINE_25,DEPS_1,2022-03-09 00:31:00,2022-03-09 00:31:00,OPPS_21,0.06,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 00:31:00,2022-03-09 00:45:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 00:47:00,2022-03-09 01:01:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 01:01:00,2022-03-09 01:15:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 01:17:00,2022-03-09 01:31:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 01:31:00,2022-03-09 01:45:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 01:47:00,2022-03-09 02:01:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 02:01:00,2022-03-09 02:15:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 02:17:00,2022-03-09 02:31:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 02:31:00,2022-03-09 02:45:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 02:47:00,2022-03-09 03:01:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 03:01:00,2022-03-09 03:15:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 03:17:00,2022-03-09 03:31:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 03:31:00,2022-03-09 03:45:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 03:47:00,2022-03-09 04:01:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 04:01:00,2022-03-09 04:15:00,S_48,5225,2,4374866,CKB -LINE_25,S_48,2022-03-09 04:17:00,2022-03-09 04:31:00,OPPS_21,7617,0,4374866,CKB -LINE_25,OPPS_21,2022-03-09 04:31:00,2022-03-09 04:31:00,DEPS_1,0.06,0,4374866,CKB -LINE_26,DEPS_1,2022-03-09 00:43:00,2022-03-09 00:43:00,S_49,0.06,0,4375013,CKB -LINE_26,S_49,2022-03-09 00:43:00,2022-03-09 00:53:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 00:53:00,2022-03-09 01:03:00,S_49,4408,10,4375013,CKB -LINE_26,S_49,2022-03-09 01:13:00,2022-03-09 01:23:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 01:23:00,2022-03-09 01:33:00,S_49,4408,10,4375013,CKB -LINE_26,S_49,2022-03-09 01:43:00,2022-03-09 01:53:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 01:53:00,2022-03-09 02:03:00,S_49,4408,10,4375013,CKB -LINE_26,S_49,2022-03-09 02:13:00,2022-03-09 02:23:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 02:23:00,2022-03-09 02:33:00,S_49,4408,10,4375013,CKB -LINE_26,S_49,2022-03-09 02:43:00,2022-03-09 02:53:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 02:53:00,2022-03-09 03:03:00,S_49,4408,10,4375013,CKB -LINE_26,S_49,2022-03-09 03:13:00,2022-03-09 03:23:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 03:23:00,2022-03-09 03:33:00,S_49,4408,10,4375013,CKB -LINE_26,S_49,2022-03-09 03:43:00,2022-03-09 03:53:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 03:53:00,2022-03-09 04:03:00,S_49,4408,10,4375013,CKB -LINE_26,S_49,2022-03-09 04:13:00,2022-03-09 04:23:00,S_50,4507,0,4375013,CKB -LINE_26,S_50,2022-03-09 04:23:00,2022-03-09 04:33:00,S_49,4408,0,4375013,CKB -LINE_26,S_49,2022-03-09 04:33:00,2022-03-09 04:33:00,DEPS_1,0.06,0,4375013,CKB -LINE_0,DEPS_1,2022-03-09 21:31:00,2022-03-09 21:31:00,S_0,0.06,0,4454945,CKB -LINE_0,S_0,2022-03-09 21:31:00,2022-03-09 22:04:00,S_2,14519,4,4454945,CKB -LINE_0,S_2,2022-03-09 22:08:00,2022-03-09 22:43:00,S_0,13541,8,4454945,CKB -LINE_0,S_0,2022-03-09 22:51:00,2022-03-09 23:24:00,S_2,14519,4,4454945,CKB -LINE_0,S_2,2022-03-09 23:28:00,2022-03-10 00:03:00,S_0,13541,8,4454945,CKB -LINE_0,S_0,2022-03-10 00:11:00,2022-03-10 00:44:00,S_2,14519,0,4454945,CKB -LINE_1,S_2,2022-03-10 00:44:00,2022-03-10 00:54:00,OPPS_3,4.1,25,4454945,CKB -LINE_1,OPPS_3,2022-03-10 01:19:00,2022-03-10 01:42:00,S_4,8.36,6,4454945,CKB -LINE_1,S_4,2022-03-10 01:48:00,2022-03-10 02:06:00,OPPS_3,9067,13,4454945,CKB -LINE_1,OPPS_3,2022-03-10 02:19:00,2022-03-10 02:42:00,S_4,8.36,6,4454945,CKB -LINE_1,S_4,2022-03-10 02:48:00,2022-03-10 03:06:00,OPPS_3,9067,13,4454945,CKB -LINE_1,OPPS_3,2022-03-10 03:19:00,2022-03-10 03:42:00,S_4,8.36,6,4454945,CKB -LINE_1,S_4,2022-03-10 03:48:00,2022-03-10 04:06:00,OPPS_3,9067,0,4454945,CKB -LINE_1,OPPS_3,2022-03-10 04:06:00,2022-03-10 04:06:00,DEPS_1,0.06,0,4454945,CKB -LINE_0,DEPS_1,2022-03-09 22:11:00,2022-03-09 22:11:00,S_0,0.06,0,4454950,CKB -LINE_0,S_0,2022-03-09 22:11:00,2022-03-09 22:44:00,S_2,14519,4,4454950,CKB -LINE_0,S_2,2022-03-09 22:48:00,2022-03-09 23:23:00,S_0,13541,8,4454950,CKB -LINE_0,S_0,2022-03-09 23:31:00,2022-03-10 00:04:00,S_2,14519,4,4454950,CKB -LINE_0,S_2,2022-03-10 00:08:00,2022-03-10 00:39:00,S_5,12213,0,4454950,CKB -LINE_1,S_5,2022-03-10 00:39:00,2022-03-10 00:47:00,OPPS_3,4.0,2,4454950,CKB -LINE_1,OPPS_3,2022-03-10 00:49:00,2022-03-10 01:12:00,S_4,8.36,6,4454950,CKB -LINE_1,S_4,2022-03-10 01:18:00,2022-03-10 01:36:00,OPPS_3,9067,13,4454950,CKB -LINE_1,OPPS_3,2022-03-10 01:49:00,2022-03-10 02:12:00,S_4,8.36,6,4454950,CKB -LINE_1,S_4,2022-03-10 02:18:00,2022-03-10 02:36:00,OPPS_3,9067,13,4454950,CKB -LINE_1,OPPS_3,2022-03-10 02:49:00,2022-03-10 03:12:00,S_4,8.36,6,4454950,CKB -LINE_1,S_4,2022-03-10 03:18:00,2022-03-10 03:36:00,OPPS_3,9067,13,4454950,CKB -LINE_1,OPPS_3,2022-03-10 03:49:00,2022-03-10 04:12:00,S_4,8.36,0,4454950,CKB -LINE_1,S_4,2022-03-10 04:12:00,2022-03-10 04:12:00,DEPS_1,0.06,0,4454950,CKB -LINE_2,DEPS_1,2022-03-09 21:06:00,2022-03-09 21:06:00,S_6,0.06,0,4664624,CKB -LINE_2,S_6,2022-03-09 21:06:00,2022-03-09 21:34:00,S_7,13018,19,4664624,CKB -LINE_2,S_7,2022-03-09 21:53:00,2022-03-09 22:13:00,S_8,10332,17,4664624,CKB -LINE_2,S_8,2022-03-09 22:30:00,2022-03-09 22:54:00,S_7,10.48,19,4664624,CKB -LINE_2,S_7,2022-03-09 23:13:00,2022-03-09 23:33:00,S_8,10332,17,4664624,CKB -LINE_2,S_8,2022-03-09 23:50:00,2022-03-10 00:14:00,S_7,10.48,2,4664624,CKB -LINE_2,S_7,2022-03-10 00:16:00,2022-03-10 00:23:00,S_9,3709,5,4664624,CKB -LINE_3,S_9,2022-03-10 00:28:00,2022-03-10 00:44:00,OPPS_10,6404,3,4664624,CKB -LINE_3,OPPS_10,2022-03-10 00:47:00,2022-03-10 01:10:00,S_11,10579,7,4664624,CKB -LINE_3,S_11,2022-03-10 01:17:00,2022-03-10 01:44:00,OPPS_10,12007,3,4664624,CKB -LINE_3,OPPS_10,2022-03-10 01:47:00,2022-03-10 02:10:00,S_11,10579,7,4664624,CKB -LINE_3,S_11,2022-03-10 02:17:00,2022-03-10 02:44:00,OPPS_10,12007,3,4664624,CKB -LINE_3,OPPS_10,2022-03-10 02:47:00,2022-03-10 03:10:00,S_11,10579,7,4664624,CKB -LINE_3,S_11,2022-03-10 03:17:00,2022-03-10 03:44:00,OPPS_10,12007,3,4664624,CKB -LINE_3,OPPS_10,2022-03-10 03:47:00,2022-03-10 04:10:00,S_11,10579,7,4664624,CKB -LINE_3,S_11,2022-03-10 04:17:00,2022-03-10 04:44:00,OPPS_10,12007,0,4664624,CKB -LINE_3,OPPS_10,2022-03-10 04:44:00,2022-03-10 04:44:00,DEPS_1,0.06,0,4664624,CKB -LINE_2,DEPS_1,2022-03-09 20:26:00,2022-03-09 20:26:00,S_6,0.06,0,4762734,CKB -LINE_2,S_6,2022-03-09 20:26:00,2022-03-09 20:56:00,S_12,14097,14,4762734,CKB -LINE_2,S_12,2022-03-09 21:10:00,2022-03-09 21:38:00,S_6,13.19,8,4762734,CKB -LINE_2,S_6,2022-03-09 21:46:00,2022-03-09 22:14:00,S_7,13018,19,4762734,CKB -LINE_2,S_7,2022-03-09 22:33:00,2022-03-09 22:53:00,S_8,10332,17,4762734,CKB -LINE_2,S_8,2022-03-09 23:10:00,2022-03-09 23:34:00,S_7,10.48,19,4762734,CKB -LINE_2,S_7,2022-03-09 23:53:00,2022-03-10 00:13:00,S_8,10332,2,4762734,CKB -LINE_2,S_8,2022-03-10 00:15:00,2022-03-10 00:16:00,OPPS_10,506,1,4762734,CKB -LINE_3,OPPS_10,2022-03-10 00:17:00,2022-03-10 00:40:00,S_11,10579,7,4762734,CKB -LINE_3,S_11,2022-03-10 00:47:00,2022-03-10 01:14:00,OPPS_10,12007,3,4762734,CKB -LINE_3,OPPS_10,2022-03-10 01:17:00,2022-03-10 01:40:00,S_11,10579,7,4762734,CKB -LINE_3,S_11,2022-03-10 01:47:00,2022-03-10 02:14:00,OPPS_10,12007,3,4762734,CKB -LINE_3,OPPS_10,2022-03-10 02:17:00,2022-03-10 02:40:00,S_11,10579,7,4762734,CKB -LINE_3,S_11,2022-03-10 02:47:00,2022-03-10 03:14:00,OPPS_10,12007,3,4762734,CKB -LINE_3,OPPS_10,2022-03-10 03:17:00,2022-03-10 03:40:00,S_11,10579,7,4762734,CKB -LINE_3,S_11,2022-03-10 03:47:00,2022-03-10 04:14:00,OPPS_10,12007,3,4762734,CKB -LINE_3,OPPS_10,2022-03-10 04:17:00,2022-03-10 04:40:00,S_11,10579,3,4762734,CKB -LINE_4,S_11,2022-03-10 04:43:00,2022-03-10 04:58:00,S_13,6161,0,4762734,CKB -LINE_4,S_13,2022-03-10 04:58:00,2022-03-10 04:58:00,DEPS_1,0.06,0,4762734,CKB -LINE_5,DEPS_1,2022-03-09 22:56:00,2022-03-09 22:56:00,S_14,0.06,0,4617415,CKB -LINE_5,S_14,2022-03-09 22:56:00,2022-03-09 23:08:00,S_15,5882,3,4617415,CKB -LINE_5,S_15,2022-03-09 23:11:00,2022-03-09 23:25:00,S_14,6232,0,4617415,CKB -LINE_5,S_14,2022-03-09 23:25:00,2022-03-09 23:38:00,S_15,6086,3,4617415,CKB -LINE_5,S_15,2022-03-09 23:41:00,2022-03-09 23:55:00,S_14,6232,0,4617415,CKB -LINE_5,S_14,2022-03-09 23:55:00,2022-03-10 00:08:00,S_15,6086,0,4617415,CKB -LINE_5,S_15,2022-03-10 00:08:00,2022-03-10 00:08:00,DEPS_1,0.06,0,4617415,CKB -LINE_6,DEPS_1,2022-03-09 05:05:00,2022-03-09 05:05:00,S_16,0.06,0,4426846,CKB -LINE_6,S_16,2022-03-09 05:05:00,2022-03-09 05:14:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 05:14:00,2022-03-09 05:23:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 05:25:00,2022-03-09 05:34:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 05:34:00,2022-03-09 05:43:00,S_16,5139,23,4426846,CKB -LINE_6,S_16,2022-03-09 06:06:00,2022-03-09 06:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 06:15:00,2022-03-09 06:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 06:26:00,2022-03-09 06:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 06:35:00,2022-03-09 06:44:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 06:46:00,2022-03-09 06:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 06:55:00,2022-03-09 07:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 07:06:00,2022-03-09 07:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 07:15:00,2022-03-09 07:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 07:26:00,2022-03-09 07:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 07:35:00,2022-03-09 07:44:00,S_16,5139,22,4426846,CKB -LINE_6,S_16,2022-03-09 08:06:00,2022-03-09 08:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 08:15:00,2022-03-09 08:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 08:26:00,2022-03-09 08:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 08:35:00,2022-03-09 08:44:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 08:46:00,2022-03-09 08:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 08:55:00,2022-03-09 09:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 09:06:00,2022-03-09 09:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 09:15:00,2022-03-09 09:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 09:26:00,2022-03-09 09:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 09:35:00,2022-03-09 09:44:00,S_16,5139,22,4426846,CKB -LINE_6,S_16,2022-03-09 10:06:00,2022-03-09 10:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 10:15:00,2022-03-09 10:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 10:26:00,2022-03-09 10:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 10:35:00,2022-03-09 10:44:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 10:46:00,2022-03-09 10:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 10:55:00,2022-03-09 11:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 11:06:00,2022-03-09 11:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 11:15:00,2022-03-09 11:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 11:26:00,2022-03-09 11:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 11:35:00,2022-03-09 11:44:00,S_16,5139,22,4426846,CKB -LINE_6,S_16,2022-03-09 12:06:00,2022-03-09 12:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 12:15:00,2022-03-09 12:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 12:26:00,2022-03-09 12:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 12:35:00,2022-03-09 12:44:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 12:46:00,2022-03-09 12:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 12:55:00,2022-03-09 13:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 13:06:00,2022-03-09 13:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 13:15:00,2022-03-09 13:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 13:26:00,2022-03-09 13:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 13:35:00,2022-03-09 13:44:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 13:46:00,2022-03-09 13:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 13:55:00,2022-03-09 14:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 14:06:00,2022-03-09 14:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 14:15:00,2022-03-09 14:24:00,S_16,5139,22,4426846,CKB -LINE_6,S_16,2022-03-09 14:46:00,2022-03-09 14:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 14:55:00,2022-03-09 15:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 15:06:00,2022-03-09 15:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 15:15:00,2022-03-09 15:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 15:26:00,2022-03-09 15:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 15:35:00,2022-03-09 15:44:00,S_16,5139,22,4426846,CKB -LINE_6,S_16,2022-03-09 16:06:00,2022-03-09 16:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 16:15:00,2022-03-09 16:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 16:26:00,2022-03-09 16:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 16:35:00,2022-03-09 16:44:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 16:46:00,2022-03-09 16:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 16:55:00,2022-03-09 17:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 17:06:00,2022-03-09 17:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 17:15:00,2022-03-09 17:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 17:26:00,2022-03-09 17:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 17:35:00,2022-03-09 17:44:00,S_16,5139,22,4426846,CKB -LINE_6,S_16,2022-03-09 18:06:00,2022-03-09 18:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 18:15:00,2022-03-09 18:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 18:26:00,2022-03-09 18:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 18:35:00,2022-03-09 18:44:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 18:46:00,2022-03-09 18:55:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 18:55:00,2022-03-09 19:04:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 19:06:00,2022-03-09 19:15:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 19:15:00,2022-03-09 19:24:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 19:26:00,2022-03-09 19:35:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 19:35:00,2022-03-09 19:44:00,S_16,5139,21,4426846,CKB -LINE_6,S_16,2022-03-09 20:05:00,2022-03-09 20:14:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 20:14:00,2022-03-09 20:23:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 20:25:00,2022-03-09 20:34:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 20:34:00,2022-03-09 20:43:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 20:45:00,2022-03-09 20:54:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 20:54:00,2022-03-09 21:03:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 21:05:00,2022-03-09 21:14:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 21:14:00,2022-03-09 21:23:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 21:25:00,2022-03-09 21:34:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 21:34:00,2022-03-09 21:43:00,S_16,5139,22,4426846,CKB -LINE_6,S_16,2022-03-09 22:05:00,2022-03-09 22:14:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 22:14:00,2022-03-09 22:23:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 22:25:00,2022-03-09 22:34:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 22:34:00,2022-03-09 22:43:00,S_16,5139,2,4426846,CKB -LINE_6,S_16,2022-03-09 22:45:00,2022-03-09 22:54:00,S_17,4781,0,4426846,CKB -LINE_6,S_17,2022-03-09 22:54:00,2022-03-09 23:03:00,S_16,5139,0,4426846,CKB -LINE_6,S_16,2022-03-09 23:03:00,2022-03-09 23:03:00,DEPS_1,0.06,0,4426846,CKB -LINE_7,DEPS_1,2022-03-10 00:06:00,2022-03-10 00:06:00,S_18,0.06,0,4708596,CKB -LINE_7,S_18,2022-03-10 00:06:00,2022-03-10 00:27:00,S_19,7827,0,4708596,CKB -LINE_8,S_19,2022-03-10 00:27:00,2022-03-10 00:48:00,S_20,11079,0,4708596,CKB -LINE_8,S_20,2022-03-10 00:48:00,2022-03-10 01:25:00,OPPS_21,20641,8,4708596,CKB -LINE_8,OPPS_21,2022-03-10 01:33:00,2022-03-10 02:16:00,S_20,20579,1,4708596,CKB -LINE_8,S_20,2022-03-10 02:17:00,2022-03-10 02:55:00,OPPS_21,20641,8,4708596,CKB -LINE_8,OPPS_21,2022-03-10 03:03:00,2022-03-10 03:46:00,S_20,20579,1,4708596,CKB -LINE_8,S_20,2022-03-10 03:47:00,2022-03-10 04:25:00,OPPS_21,20641,0,4708596,CKB -LINE_8,OPPS_21,2022-03-10 04:25:00,2022-03-10 04:25:00,DEPS_1,0.06,0,4708596,CKB -LINE_9,DEPS_23,2022-03-09 05:15:00,2022-03-09 06:01:00,S_22,17.9,0,4317626,VDL -LINE_9,S_22,2022-03-09 06:01:00,2022-03-09 06:15:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 06:23:00,2022-03-09 06:37:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 06:41:00,2022-03-09 06:55:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 07:03:00,2022-03-09 07:17:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 07:21:00,2022-03-09 07:35:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 07:43:00,2022-03-09 07:57:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 08:01:00,2022-03-09 08:15:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 08:23:00,2022-03-09 08:37:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 08:41:00,2022-03-09 08:55:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 09:03:00,2022-03-09 09:17:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 09:21:00,2022-03-09 09:35:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 09:43:00,2022-03-09 09:57:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 10:01:00,2022-03-09 10:15:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 10:23:00,2022-03-09 10:37:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 10:41:00,2022-03-09 10:55:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 11:03:00,2022-03-09 11:17:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 11:21:00,2022-03-09 11:35:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 11:43:00,2022-03-09 11:57:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 12:01:00,2022-03-09 12:15:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 12:23:00,2022-03-09 12:37:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 12:41:00,2022-03-09 12:55:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 13:03:00,2022-03-09 13:17:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 13:21:00,2022-03-09 13:35:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 13:43:00,2022-03-09 13:57:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 14:01:00,2022-03-09 14:15:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 14:23:00,2022-03-09 14:37:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 14:41:00,2022-03-09 14:55:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 15:03:00,2022-03-09 15:17:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 15:21:00,2022-03-09 15:35:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 15:43:00,2022-03-09 15:57:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 16:01:00,2022-03-09 16:15:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 16:23:00,2022-03-09 16:37:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 16:41:00,2022-03-09 16:55:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 17:03:00,2022-03-09 17:17:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 17:21:00,2022-03-09 17:35:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 17:43:00,2022-03-09 17:57:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 18:01:00,2022-03-09 18:15:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 18:23:00,2022-03-09 18:37:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 18:41:00,2022-03-09 18:55:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 19:03:00,2022-03-09 19:17:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 19:21:00,2022-03-09 19:35:00,S_22,4637,8,4317626,VDL -LINE_9,S_22,2022-03-09 19:43:00,2022-03-09 19:57:00,S_22,4637,4,4317626,VDL -LINE_9,S_22,2022-03-09 20:01:00,2022-03-09 20:14:00,S_22,4637,9,4317626,VDL -LINE_9,S_22,2022-03-09 20:23:00,2022-03-09 20:36:00,S_22,4637,0,4317626,VDL -LINE_9,S_22,2022-03-09 20:36:00,2022-03-09 21:15:00,DEPS_23,19.8,0,4317626,VDL -LINE_10,DEPS_1,2022-03-09 04:56:00,2022-03-09 04:56:00,S_24,0.06,18,4425669,CKB -LINE_10,S_24,2022-03-09 05:14:00,2022-03-09 05:20:00,S_25,3.29,0,4425669,CKB -LINE_10,S_25,2022-03-09 05:20:00,2022-03-09 05:24:00,S_24,2954,20,4425669,CKB -LINE_10,S_24,2022-03-09 05:44:00,2022-03-09 05:50:00,S_25,3.29,0,4425669,CKB -LINE_10,S_25,2022-03-09 05:50:00,2022-03-09 05:54:00,S_24,2954,5,4425669,CKB -LINE_10,S_24,2022-03-09 05:59:00,2022-03-09 06:06:00,S_25,3.29,2,4425669,CKB -LINE_10,S_25,2022-03-09 06:08:00,2022-03-09 06:13:00,S_24,2954,19,4425669,CKB -LINE_10,S_24,2022-03-09 06:32:00,2022-03-09 06:39:00,S_25,3.29,1,4425669,CKB -LINE_10,S_25,2022-03-09 06:40:00,2022-03-09 06:45:00,S_24,2954,7,4425669,CKB -LINE_10,S_24,2022-03-09 06:52:00,2022-03-09 06:59:00,S_25,3.29,1,4425669,CKB -LINE_10,S_25,2022-03-09 07:00:00,2022-03-09 07:05:00,S_24,2954,7,4425669,CKB -LINE_10,S_24,2022-03-09 07:12:00,2022-03-09 07:19:00,S_25,3.29,1,4425669,CKB -LINE_10,S_25,2022-03-09 07:20:00,2022-03-09 07:25:00,S_24,2954,7,4425669,CKB -LINE_10,S_24,2022-03-09 07:32:00,2022-03-09 07:39:00,S_25,3.29,1,4425669,CKB -LINE_10,S_25,2022-03-09 07:40:00,2022-03-09 07:45:00,S_24,2954,295,4425669,CKB -LINE_10,S_24,2022-03-09 12:40:00,2022-03-09 12:47:00,S_25,3.29,2,4425669,CKB -LINE_10,S_25,2022-03-09 12:49:00,2022-03-09 12:54:00,S_24,2954,46,4425669,CKB -LINE_10,S_24,2022-03-09 13:40:00,2022-03-09 13:47:00,S_25,3.29,2,4425669,CKB -LINE_10,S_25,2022-03-09 13:49:00,2022-03-09 13:54:00,S_24,2954,434,4425669,CKB -LINE_10,S_24,2022-03-09 21:08:00,2022-03-09 21:08:00,DEPS_1,0.06,0,4425669,CKB -LINE_11,DEPS_1,2022-03-09 07:20:00,2022-03-09 07:20:00,OPPS_26,0.06,0,4448151,CKB -LINE_11,OPPS_26,2022-03-09 07:20:00,2022-03-09 07:50:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 08:00:00,2022-03-09 08:30:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 08:40:00,2022-03-09 09:10:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 09:20:00,2022-03-09 09:50:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 10:00:00,2022-03-09 10:30:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 10:40:00,2022-03-09 11:10:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 11:20:00,2022-03-09 11:50:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 12:00:00,2022-03-09 12:30:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 12:40:00,2022-03-09 13:10:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 13:20:00,2022-03-09 13:50:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 14:00:00,2022-03-09 14:30:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 14:40:00,2022-03-09 15:10:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 15:20:00,2022-03-09 15:50:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 16:00:00,2022-03-09 16:30:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 16:40:00,2022-03-09 17:10:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 17:20:00,2022-03-09 17:50:00,OPPS_26,9266,10,4448151,CKB -LINE_11,OPPS_26,2022-03-09 18:00:00,2022-03-09 18:30:00,OPPS_26,9266,0,4448151,CKB -LINE_11,OPPS_26,2022-03-09 18:30:00,2022-03-09 18:30:00,DEPS_1,0.06,0,4448151,CKB -LINE_12,DEPS_1,2022-03-09 07:10:00,2022-03-09 07:10:00,S_27,0.06,0,4733896,CKB -LINE_12,S_27,2022-03-09 07:10:00,2022-03-09 07:18:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 07:28:00,2022-03-09 07:40:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 07:40:00,2022-03-09 07:48:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 07:58:00,2022-03-09 08:10:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 08:10:00,2022-03-09 08:18:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 08:28:00,2022-03-09 08:40:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 08:40:00,2022-03-09 08:48:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 08:58:00,2022-03-09 09:10:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 09:10:00,2022-03-09 09:18:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 09:28:00,2022-03-09 09:40:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 09:40:00,2022-03-09 09:48:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 09:58:00,2022-03-09 10:10:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 10:10:00,2022-03-09 10:18:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 10:28:00,2022-03-09 10:40:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 10:40:00,2022-03-09 10:48:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 10:58:00,2022-03-09 11:10:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 11:10:00,2022-03-09 11:18:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 11:28:00,2022-03-09 11:40:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 11:40:00,2022-03-09 11:48:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 11:58:00,2022-03-09 12:10:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 12:10:00,2022-03-09 12:18:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 12:28:00,2022-03-09 12:40:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 12:40:00,2022-03-09 12:48:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 12:58:00,2022-03-09 13:10:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 13:10:00,2022-03-09 13:18:00,OPPS_28,2169,10,4733896,CKB -LINE_12,OPPS_28,2022-03-09 13:28:00,2022-03-09 13:40:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 13:40:00,2022-03-09 13:48:00,OPPS_28,2169,8,4733896,CKB -LINE_12,OPPS_28,2022-03-09 13:56:00,2022-03-09 14:10:00,S_27,2952,0,4733896,CKB -LINE_12,S_27,2022-03-09 14:10:00,2022-03-09 14:19:00,OPPS_28,2169,14,4733896,CKB -LINE_12,OPPS_28,2022-03-09 14:33:00,2022-03-09 14:47:00,S_27,2952,3,4733896,CKB -LINE_12,S_27,2022-03-09 14:50:00,2022-03-09 14:59:00,OPPS_28,2169,14,4733896,CKB -LINE_12,OPPS_28,2022-03-09 15:13:00,2022-03-09 15:27:00,S_27,2952,3,4733896,CKB -LINE_12,S_27,2022-03-09 15:30:00,2022-03-09 15:39:00,OPPS_28,2169,14,4733896,CKB -LINE_12,OPPS_28,2022-03-09 15:53:00,2022-03-09 16:07:00,S_27,2952,3,4733896,CKB -LINE_12,S_27,2022-03-09 16:10:00,2022-03-09 16:19:00,OPPS_28,2169,14,4733896,CKB -LINE_12,OPPS_28,2022-03-09 16:33:00,2022-03-09 16:47:00,S_27,2952,3,4733896,CKB -LINE_12,S_27,2022-03-09 16:50:00,2022-03-09 16:59:00,OPPS_28,2169,14,4733896,CKB -LINE_12,OPPS_28,2022-03-09 17:13:00,2022-03-09 17:27:00,S_27,2952,3,4733896,CKB -LINE_12,S_27,2022-03-09 17:30:00,2022-03-09 17:39:00,OPPS_28,2169,13,4733896,CKB -LINE_12,OPPS_28,2022-03-09 17:52:00,2022-03-09 18:05:00,S_27,2952,5,4733896,CKB -LINE_12,S_27,2022-03-09 18:10:00,2022-03-09 18:18:00,OPPS_28,2169,0,4733896,CKB -LINE_12,OPPS_28,2022-03-09 18:18:00,2022-03-09 18:18:00,DEPS_1,0.06,0,4733896,CKB -LINE_12,DEPS_1,2022-03-09 14:13:00,2022-03-09 14:13:00,OPPS_28,0.06,0,4734201,CKB -LINE_12,OPPS_28,2022-03-09 14:13:00,2022-03-09 14:27:00,S_27,2952,3,4734201,CKB -LINE_12,S_27,2022-03-09 14:30:00,2022-03-09 14:39:00,OPPS_28,2169,14,4734201,CKB -LINE_12,OPPS_28,2022-03-09 14:53:00,2022-03-09 15:07:00,S_27,2952,3,4734201,CKB -LINE_12,S_27,2022-03-09 15:10:00,2022-03-09 15:19:00,OPPS_28,2169,14,4734201,CKB -LINE_12,OPPS_28,2022-03-09 15:33:00,2022-03-09 15:47:00,S_27,2952,3,4734201,CKB -LINE_12,S_27,2022-03-09 15:50:00,2022-03-09 15:59:00,OPPS_28,2169,14,4734201,CKB -LINE_12,OPPS_28,2022-03-09 16:13:00,2022-03-09 16:27:00,S_27,2952,3,4734201,CKB -LINE_12,S_27,2022-03-09 16:30:00,2022-03-09 16:39:00,OPPS_28,2169,14,4734201,CKB -LINE_12,OPPS_28,2022-03-09 16:53:00,2022-03-09 17:07:00,S_27,2952,3,4734201,CKB -LINE_12,S_27,2022-03-09 17:10:00,2022-03-09 17:19:00,OPPS_28,2169,14,4734201,CKB -LINE_12,OPPS_28,2022-03-09 17:33:00,2022-03-09 17:47:00,S_27,2952,3,4734201,CKB -LINE_12,S_27,2022-03-09 17:50:00,2022-03-09 17:59:00,OPPS_28,2169,14,4734201,CKB -LINE_12,OPPS_28,2022-03-09 18:13:00,2022-03-09 18:25:00,S_27,2952,0,4734201,CKB -LINE_12,S_27,2022-03-09 18:25:00,2022-03-09 18:25:00,DEPS_1,0.06,0,4734201,CKB -LINE_13,DEPS_1,2022-03-10 00:23:00,2022-03-10 00:23:00,S_29,0.06,0,4318158,CKB -LINE_13,S_29,2022-03-10 00:23:00,2022-03-10 00:30:00,OPPS_30,2577,9,4318158,CKB -LINE_14,OPPS_30,2022-03-10 00:39:00,2022-03-10 00:54:00,S_31,5937,9,4318158,CKB -LINE_14,S_31,2022-03-10 01:03:00,2022-03-10 01:17:00,OPPS_30,6.19,0,4318158,CKB -LINE_13,OPPS_30,2022-03-10 01:17:00,2022-03-10 01:23:00,S_29,2555,0,4318158,CKB -LINE_13,S_29,2022-03-10 01:23:00,2022-03-10 01:30:00,OPPS_30,2577,9,4318158,CKB -LINE_14,OPPS_30,2022-03-10 01:39:00,2022-03-10 01:54:00,S_31,5937,9,4318158,CKB -LINE_14,S_31,2022-03-10 02:03:00,2022-03-10 02:17:00,OPPS_30,6.19,0,4318158,CKB -LINE_13,OPPS_30,2022-03-10 02:17:00,2022-03-10 02:23:00,S_29,2555,0,4318158,CKB -LINE_13,S_29,2022-03-10 02:23:00,2022-03-10 02:30:00,OPPS_30,2577,9,4318158,CKB -LINE_14,OPPS_30,2022-03-10 02:39:00,2022-03-10 02:54:00,S_31,5937,9,4318158,CKB -LINE_14,S_31,2022-03-10 03:03:00,2022-03-10 03:17:00,OPPS_30,6.19,0,4318158,CKB -LINE_13,OPPS_30,2022-03-10 03:17:00,2022-03-10 03:23:00,S_29,2555,0,4318158,CKB -LINE_13,S_29,2022-03-10 03:23:00,2022-03-10 03:30:00,OPPS_30,2577,9,4318158,CKB -LINE_14,OPPS_30,2022-03-10 03:39:00,2022-03-10 03:54:00,S_31,5937,9,4318158,CKB -LINE_14,S_31,2022-03-10 04:03:00,2022-03-10 04:17:00,OPPS_30,6.19,0,4318158,CKB -LINE_13,OPPS_30,2022-03-10 04:17:00,2022-03-10 04:23:00,S_29,2555,0,4318158,CKB -LINE_13,S_29,2022-03-10 04:23:00,2022-03-10 04:23:00,DEPS_1,0.06,0,4318158,CKB -LINE_14,DEPS_1,2022-03-10 00:33:00,2022-03-10 00:33:00,S_31,0.06,0,4318178,CKB -LINE_14,S_31,2022-03-10 00:33:00,2022-03-10 00:47:00,OPPS_30,6.19,0,4318178,CKB -LINE_13,OPPS_30,2022-03-10 00:47:00,2022-03-10 00:53:00,S_29,2555,0,4318178,CKB -LINE_13,S_29,2022-03-10 00:53:00,2022-03-10 01:00:00,OPPS_30,2577,9,4318178,CKB -LINE_14,OPPS_30,2022-03-10 01:09:00,2022-03-10 01:24:00,S_31,5937,9,4318178,CKB -LINE_14,S_31,2022-03-10 01:33:00,2022-03-10 01:47:00,OPPS_30,6.19,0,4318178,CKB -LINE_13,OPPS_30,2022-03-10 01:47:00,2022-03-10 01:53:00,S_29,2555,0,4318178,CKB -LINE_13,S_29,2022-03-10 01:53:00,2022-03-10 02:00:00,OPPS_30,2577,9,4318178,CKB -LINE_14,OPPS_30,2022-03-10 02:09:00,2022-03-10 02:24:00,S_31,5937,9,4318178,CKB -LINE_14,S_31,2022-03-10 02:33:00,2022-03-10 02:47:00,OPPS_30,6.19,0,4318178,CKB -LINE_13,OPPS_30,2022-03-10 02:47:00,2022-03-10 02:53:00,S_29,2555,0,4318178,CKB -LINE_13,S_29,2022-03-10 02:53:00,2022-03-10 03:00:00,OPPS_30,2577,9,4318178,CKB -LINE_14,OPPS_30,2022-03-10 03:09:00,2022-03-10 03:24:00,S_31,5937,9,4318178,CKB -LINE_14,S_31,2022-03-10 03:33:00,2022-03-10 03:47:00,OPPS_30,6.19,0,4318178,CKB -LINE_13,OPPS_30,2022-03-10 03:47:00,2022-03-10 03:53:00,S_29,2555,0,4318178,CKB -LINE_13,S_29,2022-03-10 03:53:00,2022-03-10 04:00:00,OPPS_30,2577,9,4318178,CKB -LINE_14,OPPS_30,2022-03-10 04:09:00,2022-03-10 04:24:00,S_31,5937,0,4318178,CKB -LINE_14,S_31,2022-03-10 04:24:00,2022-03-10 04:24:00,DEPS_1,0.06,0,4318178,CKB -LINE_15,DEPS_1,2022-03-10 00:57:00,2022-03-10 00:57:00,OPPS_32,0.06,0,4319353,CKB -LINE_15,OPPS_32,2022-03-10 00:57:00,2022-03-10 01:06:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 01:06:00,2022-03-10 01:11:00,OPPS_32,2936,16,4319353,CKB -LINE_15,OPPS_32,2022-03-10 01:27:00,2022-03-10 01:36:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 01:36:00,2022-03-10 01:41:00,OPPS_32,2936,16,4319353,CKB -LINE_15,OPPS_32,2022-03-10 01:57:00,2022-03-10 02:06:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 02:06:00,2022-03-10 02:11:00,OPPS_32,2936,16,4319353,CKB -LINE_15,OPPS_32,2022-03-10 02:27:00,2022-03-10 02:36:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 02:36:00,2022-03-10 02:41:00,OPPS_32,2936,16,4319353,CKB -LINE_15,OPPS_32,2022-03-10 02:57:00,2022-03-10 03:06:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 03:06:00,2022-03-10 03:11:00,OPPS_32,2936,16,4319353,CKB -LINE_15,OPPS_32,2022-03-10 03:27:00,2022-03-10 03:36:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 03:36:00,2022-03-10 03:41:00,OPPS_32,2936,16,4319353,CKB -LINE_15,OPPS_32,2022-03-10 03:57:00,2022-03-10 04:06:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 04:06:00,2022-03-10 04:11:00,OPPS_32,2936,16,4319353,CKB -LINE_15,OPPS_32,2022-03-10 04:27:00,2022-03-10 04:36:00,S_33,4343,0,4319353,CKB -LINE_15,S_33,2022-03-10 04:36:00,2022-03-10 04:36:00,DEPS_1,0.06,0,4319353,CKB -LINE_16,DEPS_1,2022-03-10 00:29:00,2022-03-10 00:29:00,S_34,0.06,0,4751088,CKB -LINE_16,S_34,2022-03-10 00:29:00,2022-03-10 00:41:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 00:47:00,2022-03-10 00:57:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 00:59:00,2022-03-10 01:11:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 01:17:00,2022-03-10 01:27:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 01:29:00,2022-03-10 01:41:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 01:47:00,2022-03-10 01:57:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 01:59:00,2022-03-10 02:11:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 02:17:00,2022-03-10 02:27:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 02:29:00,2022-03-10 02:41:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 02:47:00,2022-03-10 02:57:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 02:59:00,2022-03-10 03:11:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 03:17:00,2022-03-10 03:27:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 03:29:00,2022-03-10 03:41:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 03:47:00,2022-03-10 03:57:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 03:59:00,2022-03-10 04:11:00,S_35,4481,6,4751088,CKB -LINE_16,S_35,2022-03-10 04:17:00,2022-03-10 04:27:00,S_34,4031,2,4751088,CKB -LINE_16,S_34,2022-03-10 04:29:00,2022-03-10 04:41:00,S_35,4481,0,4751088,CKB -LINE_16,S_35,2022-03-10 04:41:00,2022-03-10 04:41:00,DEPS_1,0.06,0,4751088,CKB -LINE_17,DEPS_1,2022-03-10 00:30:00,2022-03-10 00:30:00,S_34,0.06,0,4453546,CKB -LINE_17,S_34,2022-03-10 00:30:00,2022-03-10 00:44:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 00:44:00,2022-03-10 00:57:00,S_34,5302,3,4453546,CKB -LINE_17,S_34,2022-03-10 01:00:00,2022-03-10 01:14:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 01:14:00,2022-03-10 01:27:00,S_34,5302,3,4453546,CKB -LINE_17,S_34,2022-03-10 01:30:00,2022-03-10 01:44:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 01:44:00,2022-03-10 01:57:00,S_34,5302,3,4453546,CKB -LINE_17,S_34,2022-03-10 02:00:00,2022-03-10 02:14:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 02:14:00,2022-03-10 02:27:00,S_34,5302,3,4453546,CKB -LINE_17,S_34,2022-03-10 02:30:00,2022-03-10 02:44:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 02:44:00,2022-03-10 02:57:00,S_34,5302,3,4453546,CKB -LINE_17,S_34,2022-03-10 03:00:00,2022-03-10 03:14:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 03:14:00,2022-03-10 03:27:00,S_34,5302,3,4453546,CKB -LINE_17,S_34,2022-03-10 03:30:00,2022-03-10 03:44:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 03:44:00,2022-03-10 03:57:00,S_34,5302,3,4453546,CKB -LINE_17,S_34,2022-03-10 04:00:00,2022-03-10 04:14:00,S_36,4801,0,4453546,CKB -LINE_17,S_36,2022-03-10 04:14:00,2022-03-10 04:27:00,S_34,5302,0,4453546,CKB -LINE_17,S_34,2022-03-10 04:27:00,2022-03-10 04:27:00,DEPS_1,0.06,0,4453546,CKB -LINE_18,DEPS_1,2022-03-10 00:43:00,2022-03-10 00:43:00,S_37,0.06,0,4374468,CKB -LINE_18,S_37,2022-03-10 00:43:00,2022-03-10 01:33:00,S_37,20434,10,4374468,CKB -LINE_18,S_37,2022-03-10 01:43:00,2022-03-10 02:33:00,S_37,20434,10,4374468,CKB -LINE_18,S_37,2022-03-10 02:43:00,2022-03-10 03:33:00,S_37,20434,10,4374468,CKB -LINE_18,S_37,2022-03-10 03:43:00,2022-03-10 04:33:00,S_37,20434,0,4374468,CKB -LINE_18,S_37,2022-03-10 04:33:00,2022-03-10 04:33:00,DEPS_1,0.06,0,4374468,CKB -LINE_18,DEPS_1,2022-03-10 00:13:00,2022-03-10 00:13:00,S_37,0.06,0,4374473,CKB -LINE_18,S_37,2022-03-10 00:13:00,2022-03-10 01:03:00,S_37,20434,10,4374473,CKB -LINE_18,S_37,2022-03-10 01:13:00,2022-03-10 02:03:00,S_37,20434,10,4374473,CKB -LINE_18,S_37,2022-03-10 02:13:00,2022-03-10 03:03:00,S_37,20434,10,4374473,CKB -LINE_18,S_37,2022-03-10 03:13:00,2022-03-10 04:03:00,S_37,20434,0,4374473,CKB -LINE_18,S_37,2022-03-10 04:03:00,2022-03-10 04:03:00,DEPS_1,0.06,0,4374473,CKB -LINE_19,DEPS_1,2022-03-10 00:24:00,2022-03-10 00:24:00,S_38,0.06,0,4456449,CKB -LINE_19,S_38,2022-03-10 00:24:00,2022-03-10 00:48:00,OPPS_39,11.86,4,4456449,CKB -LINE_19,OPPS_39,2022-03-10 00:52:00,2022-03-10 01:14:00,S_38,11139,10,4456449,CKB -LINE_19,S_38,2022-03-10 01:24:00,2022-03-10 01:48:00,OPPS_39,11.86,4,4456449,CKB -LINE_19,OPPS_39,2022-03-10 01:52:00,2022-03-10 02:14:00,S_38,11139,10,4456449,CKB -LINE_19,S_38,2022-03-10 02:24:00,2022-03-10 02:48:00,OPPS_39,11.86,4,4456449,CKB -LINE_19,OPPS_39,2022-03-10 02:52:00,2022-03-10 03:14:00,S_38,11139,10,4456449,CKB -LINE_19,S_38,2022-03-10 03:24:00,2022-03-10 03:48:00,OPPS_39,11.86,4,4456449,CKB -LINE_19,OPPS_39,2022-03-10 03:52:00,2022-03-10 04:14:00,S_38,11139,0,4456449,CKB -LINE_19,S_38,2022-03-10 04:14:00,2022-03-10 04:14:00,DEPS_1,0.06,0,4456449,CKB -LINE_19,DEPS_1,2022-03-10 00:22:00,2022-03-10 00:22:00,OPPS_39,0.06,0,4456457,CKB -LINE_19,OPPS_39,2022-03-10 00:22:00,2022-03-10 00:44:00,S_38,11139,10,4456457,CKB -LINE_19,S_38,2022-03-10 00:54:00,2022-03-10 01:18:00,OPPS_39,11.86,4,4456457,CKB -LINE_19,OPPS_39,2022-03-10 01:22:00,2022-03-10 01:44:00,S_38,11139,10,4456457,CKB -LINE_19,S_38,2022-03-10 01:54:00,2022-03-10 02:18:00,OPPS_39,11.86,4,4456457,CKB -LINE_19,OPPS_39,2022-03-10 02:22:00,2022-03-10 02:44:00,S_38,11139,10,4456457,CKB -LINE_19,S_38,2022-03-10 02:54:00,2022-03-10 03:18:00,OPPS_39,11.86,4,4456457,CKB -LINE_19,OPPS_39,2022-03-10 03:22:00,2022-03-10 03:44:00,S_38,11139,10,4456457,CKB -LINE_19,S_38,2022-03-10 03:54:00,2022-03-10 04:18:00,OPPS_39,11.86,4,4456457,CKB -LINE_19,OPPS_39,2022-03-10 04:22:00,2022-03-10 04:44:00,S_38,11139,0,4456457,CKB -LINE_19,S_38,2022-03-10 04:44:00,2022-03-10 04:44:00,DEPS_1,0.06,0,4456457,CKB -LINE_20,DEPS_1,2022-03-10 00:32:00,2022-03-10 00:32:00,S_13,0.06,0,4747651,CKB -LINE_20,S_13,2022-03-10 00:32:00,2022-03-10 00:44:00,S_40,4212,3,4747651,CKB -LINE_20,S_40,2022-03-10 00:47:00,2022-03-10 01:16:00,S_41,13048,0,4747651,CKB -LINE_20,S_41,2022-03-10 01:16:00,2022-03-10 01:42:00,S_40,12869,5,4747651,CKB -LINE_20,S_40,2022-03-10 01:47:00,2022-03-10 02:16:00,S_41,13048,0,4747651,CKB -LINE_20,S_41,2022-03-10 02:16:00,2022-03-10 02:42:00,S_40,12869,5,4747651,CKB -LINE_20,S_40,2022-03-10 02:47:00,2022-03-10 03:16:00,S_41,13048,0,4747651,CKB -LINE_20,S_41,2022-03-10 03:16:00,2022-03-10 03:42:00,S_40,12869,5,4747651,CKB -LINE_20,S_40,2022-03-10 03:47:00,2022-03-10 04:16:00,S_41,13048,0,4747651,CKB -LINE_20,S_41,2022-03-10 04:16:00,2022-03-10 04:34:00,DEPS_42,9538,0,4747651,CKB -LINE_20,DEPS_42,2022-03-10 04:34:00,2022-03-10 04:34:00,DEPS_1,0.06,0,4747651,CKB -LINE_20,DEPS_1,2022-03-10 00:17:00,2022-03-10 00:17:00,S_40,0.06,0,4747661,CKB -LINE_20,S_40,2022-03-10 00:17:00,2022-03-10 00:46:00,S_41,13048,0,4747661,CKB -LINE_20,S_41,2022-03-10 00:46:00,2022-03-10 01:12:00,S_40,12869,5,4747661,CKB -LINE_20,S_40,2022-03-10 01:17:00,2022-03-10 01:46:00,S_41,13048,0,4747661,CKB -LINE_20,S_41,2022-03-10 01:46:00,2022-03-10 02:12:00,S_40,12869,5,4747661,CKB -LINE_20,S_40,2022-03-10 02:17:00,2022-03-10 02:46:00,S_41,13048,0,4747661,CKB -LINE_20,S_41,2022-03-10 02:46:00,2022-03-10 03:12:00,S_40,12869,5,4747661,CKB -LINE_20,S_40,2022-03-10 03:17:00,2022-03-10 03:46:00,S_41,13048,0,4747661,CKB -LINE_20,S_41,2022-03-10 03:46:00,2022-03-10 04:12:00,S_40,12869,5,4747661,CKB -LINE_20,S_40,2022-03-10 04:17:00,2022-03-10 04:28:00,S_13,4316,0,4747661,CKB -LINE_20,S_13,2022-03-10 04:28:00,2022-03-10 04:28:00,DEPS_1,0.06,0,4747661,CKB -LINE_21,DEPS_1,2022-03-10 00:49:00,2022-03-10 00:49:00,OPPS_3,0.06,0,4434342,CKB -LINE_21,OPPS_3,2022-03-10 00:49:00,2022-03-10 01:04:00,S_16,10229,0,4434342,CKB -LINE_21,S_16,2022-03-10 01:04:00,2022-03-10 01:19:00,OPPS_3,11801,0,4434342,CKB -LINE_21,OPPS_3,2022-03-10 01:19:00,2022-03-10 01:34:00,S_16,10229,0,4434342,CKB -LINE_21,S_16,2022-03-10 01:34:00,2022-03-10 01:49:00,OPPS_3,11801,0,4434342,CKB -LINE_21,OPPS_3,2022-03-10 01:49:00,2022-03-10 02:04:00,S_16,10229,0,4434342,CKB -LINE_21,S_16,2022-03-10 02:04:00,2022-03-10 02:19:00,OPPS_3,11801,0,4434342,CKB -LINE_21,OPPS_3,2022-03-10 02:19:00,2022-03-10 02:34:00,S_16,10229,0,4434342,CKB -LINE_21,S_16,2022-03-10 02:34:00,2022-03-10 02:49:00,OPPS_3,11801,0,4434342,CKB -LINE_21,OPPS_3,2022-03-10 02:49:00,2022-03-10 03:04:00,S_16,10229,0,4434342,CKB -LINE_21,S_16,2022-03-10 03:04:00,2022-03-10 03:19:00,OPPS_3,11801,0,4434342,CKB -LINE_21,OPPS_3,2022-03-10 03:19:00,2022-03-10 03:34:00,S_16,10229,0,4434342,CKB -LINE_21,S_16,2022-03-10 03:34:00,2022-03-10 03:49:00,OPPS_3,11801,0,4434342,CKB -LINE_21,OPPS_3,2022-03-10 03:49:00,2022-03-10 04:04:00,S_16,10229,0,4434342,CKB -LINE_21,S_16,2022-03-10 04:04:00,2022-03-10 04:19:00,OPPS_3,11801,23,4434342,CKB -LINE_22,OPPS_3,2022-03-10 04:42:00,2022-03-10 05:04:00,S_43,6.81,0,4434342,CKB -LINE_22,S_43,2022-03-10 05:04:00,2022-03-10 05:04:00,DEPS_1,0.06,0,4434342,CKB -LINE_8,DEPS_1,2022-03-10 00:32:00,2022-03-10 00:32:00,S_13,0.06,0,4434898,CKB -LINE_8,S_13,2022-03-10 00:32:00,2022-03-10 00:57:00,OPPS_21,11545,6,4434898,CKB -LINE_8,OPPS_21,2022-03-10 01:03:00,2022-03-10 01:46:00,S_20,20579,1,4434898,CKB -LINE_8,S_20,2022-03-10 01:47:00,2022-03-10 02:25:00,OPPS_21,20641,8,4434898,CKB -LINE_8,OPPS_21,2022-03-10 02:33:00,2022-03-10 03:16:00,S_20,20579,1,4434898,CKB -LINE_8,S_20,2022-03-10 03:17:00,2022-03-10 03:55:00,OPPS_21,20641,8,4434898,CKB -LINE_8,OPPS_21,2022-03-10 04:03:00,2022-03-10 04:28:00,S_13,11499,0,4434898,CKB -LINE_8,S_13,2022-03-10 04:28:00,2022-03-10 04:28:00,DEPS_1,0.06,0,4434898,CKB -LINE_8,DEPS_1,2022-03-10 00:33:00,2022-03-10 00:33:00,OPPS_21,0.06,0,4434903,CKB -LINE_8,OPPS_21,2022-03-10 00:33:00,2022-03-10 01:16:00,S_20,20579,1,4434903,CKB -LINE_8,S_20,2022-03-10 01:17:00,2022-03-10 01:55:00,OPPS_21,20641,8,4434903,CKB -LINE_8,OPPS_21,2022-03-10 02:03:00,2022-03-10 02:46:00,S_20,20579,1,4434903,CKB -LINE_8,S_20,2022-03-10 02:47:00,2022-03-10 03:25:00,OPPS_21,20641,8,4434903,CKB -LINE_8,OPPS_21,2022-03-10 03:33:00,2022-03-10 04:16:00,S_20,20579,1,4434903,CKB -LINE_8,S_20,2022-03-10 04:17:00,2022-03-10 04:51:00,S_44,18752,0,4434903,CKB -LINE_8,S_44,2022-03-10 04:51:00,2022-03-10 04:51:00,DEPS_1,0.06,0,4434903,CKB -LINE_23,DEPS_1,2022-03-10 00:34:00,2022-03-10 00:34:00,S_45,0.06,0,4619767,CKB -LINE_23,S_45,2022-03-10 00:34:00,2022-03-10 01:00:00,S_46,9016,0,4619767,CKB -LINE_23,S_46,2022-03-10 01:00:00,2022-03-10 01:27:00,S_45,10083,7,4619767,CKB -LINE_23,S_45,2022-03-10 01:34:00,2022-03-10 02:00:00,S_46,9016,0,4619767,CKB -LINE_23,S_46,2022-03-10 02:00:00,2022-03-10 02:27:00,S_45,10083,7,4619767,CKB -LINE_23,S_45,2022-03-10 02:34:00,2022-03-10 03:00:00,S_46,9016,0,4619767,CKB -LINE_23,S_46,2022-03-10 03:00:00,2022-03-10 03:27:00,S_45,10083,7,4619767,CKB -LINE_23,S_45,2022-03-10 03:34:00,2022-03-10 04:00:00,S_46,9016,0,4619767,CKB -LINE_23,S_46,2022-03-10 04:00:00,2022-03-10 04:27:00,S_45,10083,0,4619767,CKB -LINE_23,S_45,2022-03-10 04:27:00,2022-03-10 04:27:00,DEPS_1,0.06,0,4619767,CKB -LINE_23,DEPS_1,2022-03-10 00:30:00,2022-03-10 00:30:00,S_46,0.06,0,4619992,CKB -LINE_23,S_46,2022-03-10 00:30:00,2022-03-10 00:57:00,S_45,10083,7,4619992,CKB -LINE_23,S_45,2022-03-10 01:04:00,2022-03-10 01:30:00,S_46,9016,0,4619992,CKB -LINE_23,S_46,2022-03-10 01:30:00,2022-03-10 01:57:00,S_45,10083,7,4619992,CKB -LINE_23,S_45,2022-03-10 02:04:00,2022-03-10 02:30:00,S_46,9016,0,4619992,CKB -LINE_23,S_46,2022-03-10 02:30:00,2022-03-10 02:57:00,S_45,10083,7,4619992,CKB -LINE_23,S_45,2022-03-10 03:04:00,2022-03-10 03:30:00,S_46,9016,0,4619992,CKB -LINE_23,S_46,2022-03-10 03:30:00,2022-03-10 03:57:00,S_45,10083,7,4619992,CKB -LINE_23,S_45,2022-03-10 04:04:00,2022-03-10 04:30:00,S_46,9016,0,4619992,CKB -LINE_23,S_46,2022-03-10 04:30:00,2022-03-10 04:57:00,S_45,10083,0,4619992,CKB -LINE_23,S_45,2022-03-10 04:57:00,2022-03-10 04:57:00,DEPS_1,0.06,0,4619992,CKB -LINE_24,DEPS_1,2022-03-10 00:31:00,2022-03-10 00:31:00,OPPS_21,0.06,0,4374745,CKB -LINE_24,OPPS_21,2022-03-10 00:31:00,2022-03-10 00:44:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 00:44:00,2022-03-10 00:56:00,OPPS_21,5362,5,4374745,CKB -LINE_24,OPPS_21,2022-03-10 01:01:00,2022-03-10 01:14:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 01:14:00,2022-03-10 01:26:00,OPPS_21,5362,5,4374745,CKB -LINE_24,OPPS_21,2022-03-10 01:31:00,2022-03-10 01:44:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 01:44:00,2022-03-10 01:56:00,OPPS_21,5362,5,4374745,CKB -LINE_24,OPPS_21,2022-03-10 02:01:00,2022-03-10 02:14:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 02:14:00,2022-03-10 02:26:00,OPPS_21,5362,5,4374745,CKB -LINE_24,OPPS_21,2022-03-10 02:31:00,2022-03-10 02:44:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 02:44:00,2022-03-10 02:56:00,OPPS_21,5362,5,4374745,CKB -LINE_24,OPPS_21,2022-03-10 03:01:00,2022-03-10 03:14:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 03:14:00,2022-03-10 03:26:00,OPPS_21,5362,5,4374745,CKB -LINE_24,OPPS_21,2022-03-10 03:31:00,2022-03-10 03:44:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 03:44:00,2022-03-10 03:56:00,OPPS_21,5362,5,4374745,CKB -LINE_24,OPPS_21,2022-03-10 04:01:00,2022-03-10 04:14:00,S_47,4872,0,4374745,CKB -LINE_24,S_47,2022-03-10 04:14:00,2022-03-10 04:26:00,OPPS_21,5362,0,4374745,CKB -LINE_24,OPPS_21,2022-03-10 04:26:00,2022-03-10 04:26:00,DEPS_1,0.06,0,4374745,CKB -LINE_25,DEPS_1,2022-03-10 00:31:00,2022-03-10 00:31:00,OPPS_21,0.06,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 00:31:00,2022-03-10 00:45:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 00:47:00,2022-03-10 01:01:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 01:01:00,2022-03-10 01:15:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 01:17:00,2022-03-10 01:31:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 01:31:00,2022-03-10 01:45:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 01:47:00,2022-03-10 02:01:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 02:01:00,2022-03-10 02:15:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 02:17:00,2022-03-10 02:31:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 02:31:00,2022-03-10 02:45:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 02:47:00,2022-03-10 03:01:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 03:01:00,2022-03-10 03:15:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 03:17:00,2022-03-10 03:31:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 03:31:00,2022-03-10 03:45:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 03:47:00,2022-03-10 04:01:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 04:01:00,2022-03-10 04:15:00,S_48,5225,2,4374868,CKB -LINE_25,S_48,2022-03-10 04:17:00,2022-03-10 04:31:00,OPPS_21,7617,0,4374868,CKB -LINE_25,OPPS_21,2022-03-10 04:31:00,2022-03-10 04:31:00,DEPS_1,0.06,0,4374868,CKB -LINE_26,DEPS_1,2022-03-10 00:43:00,2022-03-10 00:43:00,S_49,0.06,0,4375014,CKB -LINE_26,S_49,2022-03-10 00:43:00,2022-03-10 00:53:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 00:53:00,2022-03-10 01:03:00,S_49,4408,10,4375014,CKB -LINE_26,S_49,2022-03-10 01:13:00,2022-03-10 01:23:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 01:23:00,2022-03-10 01:33:00,S_49,4408,10,4375014,CKB -LINE_26,S_49,2022-03-10 01:43:00,2022-03-10 01:53:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 01:53:00,2022-03-10 02:03:00,S_49,4408,10,4375014,CKB -LINE_26,S_49,2022-03-10 02:13:00,2022-03-10 02:23:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 02:23:00,2022-03-10 02:33:00,S_49,4408,10,4375014,CKB -LINE_26,S_49,2022-03-10 02:43:00,2022-03-10 02:53:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 02:53:00,2022-03-10 03:03:00,S_49,4408,10,4375014,CKB -LINE_26,S_49,2022-03-10 03:13:00,2022-03-10 03:23:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 03:23:00,2022-03-10 03:33:00,S_49,4408,10,4375014,CKB -LINE_26,S_49,2022-03-10 03:43:00,2022-03-10 03:53:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 03:53:00,2022-03-10 04:03:00,S_49,4408,10,4375014,CKB -LINE_26,S_49,2022-03-10 04:13:00,2022-03-10 04:23:00,S_50,4507,0,4375014,CKB -LINE_26,S_50,2022-03-10 04:23:00,2022-03-10 04:33:00,S_49,4408,0,4375014,CKB -LINE_26,S_49,2022-03-10 04:33:00,2022-03-10 04:33:00,DEPS_1,0.06,0,4375014,CKB -LINE_0,DEPS_1,2022-03-10 21:31:00,2022-03-10 21:31:00,S_0,0.06,0,4454946,CKB -LINE_0,S_0,2022-03-10 21:31:00,2022-03-10 22:04:00,S_2,14519,4,4454946,CKB -LINE_0,S_2,2022-03-10 22:08:00,2022-03-10 22:43:00,S_0,13541,8,4454946,CKB -LINE_0,S_0,2022-03-10 22:51:00,2022-03-10 23:24:00,S_2,14519,4,4454946,CKB -LINE_0,S_2,2022-03-10 23:28:00,2022-03-11 00:03:00,S_0,13541,8,4454946,CKB -LINE_0,S_0,2022-03-11 00:11:00,2022-03-11 00:44:00,S_2,14519,0,4454946,CKB -LINE_1,S_2,2022-03-11 00:44:00,2022-03-11 00:54:00,OPPS_3,4.1,25,4454946,CKB -LINE_1,OPPS_3,2022-03-11 01:19:00,2022-03-11 01:42:00,S_4,8.36,6,4454946,CKB -LINE_1,S_4,2022-03-11 01:48:00,2022-03-11 02:06:00,OPPS_3,9067,13,4454946,CKB -LINE_1,OPPS_3,2022-03-11 02:19:00,2022-03-11 02:42:00,S_4,8.36,6,4454946,CKB -LINE_1,S_4,2022-03-11 02:48:00,2022-03-11 03:06:00,OPPS_3,9067,13,4454946,CKB -LINE_1,OPPS_3,2022-03-11 03:19:00,2022-03-11 03:42:00,S_4,8.36,6,4454946,CKB -LINE_1,S_4,2022-03-11 03:48:00,2022-03-11 04:06:00,OPPS_3,9067,0,4454946,CKB -LINE_1,OPPS_3,2022-03-11 04:06:00,2022-03-11 04:06:00,DEPS_1,0.06,0,4454946,CKB -LINE_0,DEPS_1,2022-03-10 22:11:00,2022-03-10 22:11:00,S_0,0.06,0,4454951,CKB -LINE_0,S_0,2022-03-10 22:11:00,2022-03-10 22:44:00,S_2,14519,4,4454951,CKB -LINE_0,S_2,2022-03-10 22:48:00,2022-03-10 23:23:00,S_0,13541,8,4454951,CKB -LINE_0,S_0,2022-03-10 23:31:00,2022-03-11 00:04:00,S_2,14519,4,4454951,CKB -LINE_0,S_2,2022-03-11 00:08:00,2022-03-11 00:39:00,S_5,12213,0,4454951,CKB -LINE_1,S_5,2022-03-11 00:39:00,2022-03-11 00:47:00,OPPS_3,4.0,2,4454951,CKB -LINE_1,OPPS_3,2022-03-11 00:49:00,2022-03-11 01:12:00,S_4,8.36,6,4454951,CKB -LINE_1,S_4,2022-03-11 01:18:00,2022-03-11 01:36:00,OPPS_3,9067,13,4454951,CKB -LINE_1,OPPS_3,2022-03-11 01:49:00,2022-03-11 02:12:00,S_4,8.36,6,4454951,CKB -LINE_1,S_4,2022-03-11 02:18:00,2022-03-11 02:36:00,OPPS_3,9067,13,4454951,CKB -LINE_1,OPPS_3,2022-03-11 02:49:00,2022-03-11 03:12:00,S_4,8.36,6,4454951,CKB -LINE_1,S_4,2022-03-11 03:18:00,2022-03-11 03:36:00,OPPS_3,9067,13,4454951,CKB -LINE_1,OPPS_3,2022-03-11 03:49:00,2022-03-11 04:12:00,S_4,8.36,0,4454951,CKB -LINE_1,S_4,2022-03-11 04:12:00,2022-03-11 04:12:00,DEPS_1,0.06,0,4454951,CKB -LINE_2,DEPS_1,2022-03-10 21:06:00,2022-03-10 21:06:00,S_6,0.06,0,4664625,CKB -LINE_2,S_6,2022-03-10 21:06:00,2022-03-10 21:34:00,S_7,13018,19,4664625,CKB -LINE_2,S_7,2022-03-10 21:53:00,2022-03-10 22:13:00,S_8,10332,17,4664625,CKB -LINE_2,S_8,2022-03-10 22:30:00,2022-03-10 22:54:00,S_7,10.48,19,4664625,CKB -LINE_2,S_7,2022-03-10 23:13:00,2022-03-10 23:33:00,S_8,10332,17,4664625,CKB -LINE_2,S_8,2022-03-10 23:50:00,2022-03-11 00:14:00,S_7,10.48,2,4664625,CKB -LINE_2,S_7,2022-03-11 00:16:00,2022-03-11 00:23:00,S_9,3709,5,4664625,CKB -LINE_3,S_9,2022-03-11 00:28:00,2022-03-11 00:44:00,OPPS_10,6404,3,4664625,CKB -LINE_3,OPPS_10,2022-03-11 00:47:00,2022-03-11 01:10:00,S_11,10579,7,4664625,CKB -LINE_3,S_11,2022-03-11 01:17:00,2022-03-11 01:44:00,OPPS_10,12007,3,4664625,CKB -LINE_3,OPPS_10,2022-03-11 01:47:00,2022-03-11 02:10:00,S_11,10579,7,4664625,CKB -LINE_3,S_11,2022-03-11 02:17:00,2022-03-11 02:44:00,OPPS_10,12007,3,4664625,CKB -LINE_3,OPPS_10,2022-03-11 02:47:00,2022-03-11 03:10:00,S_11,10579,7,4664625,CKB -LINE_3,S_11,2022-03-11 03:17:00,2022-03-11 03:44:00,OPPS_10,12007,3,4664625,CKB -LINE_3,OPPS_10,2022-03-11 03:47:00,2022-03-11 04:10:00,S_11,10579,7,4664625,CKB -LINE_3,S_11,2022-03-11 04:17:00,2022-03-11 04:44:00,OPPS_10,12007,0,4664625,CKB -LINE_3,OPPS_10,2022-03-11 04:44:00,2022-03-11 04:44:00,DEPS_1,0.06,0,4664625,CKB -LINE_2,DEPS_1,2022-03-10 20:26:00,2022-03-10 20:26:00,S_6,0.06,0,4762777,CKB -LINE_2,S_6,2022-03-10 20:26:00,2022-03-10 20:56:00,S_12,14097,14,4762777,CKB -LINE_2,S_12,2022-03-10 21:10:00,2022-03-10 21:38:00,S_6,13.19,8,4762777,CKB -LINE_2,S_6,2022-03-10 21:46:00,2022-03-10 22:14:00,S_7,13018,19,4762777,CKB -LINE_2,S_7,2022-03-10 22:33:00,2022-03-10 22:53:00,S_8,10332,17,4762777,CKB -LINE_2,S_8,2022-03-10 23:10:00,2022-03-10 23:34:00,S_7,10.48,19,4762777,CKB -LINE_2,S_7,2022-03-10 23:53:00,2022-03-11 00:13:00,S_8,10332,2,4762777,CKB -LINE_2,S_8,2022-03-11 00:15:00,2022-03-11 00:16:00,OPPS_10,506,1,4762777,CKB -LINE_3,OPPS_10,2022-03-11 00:17:00,2022-03-11 00:40:00,S_11,10579,7,4762777,CKB -LINE_3,S_11,2022-03-11 00:47:00,2022-03-11 01:14:00,OPPS_10,12007,3,4762777,CKB -LINE_3,OPPS_10,2022-03-11 01:17:00,2022-03-11 01:40:00,S_11,10579,7,4762777,CKB -LINE_3,S_11,2022-03-11 01:47:00,2022-03-11 02:14:00,OPPS_10,12007,3,4762777,CKB -LINE_3,OPPS_10,2022-03-11 02:17:00,2022-03-11 02:40:00,S_11,10579,7,4762777,CKB -LINE_3,S_11,2022-03-11 02:47:00,2022-03-11 03:14:00,OPPS_10,12007,3,4762777,CKB -LINE_3,OPPS_10,2022-03-11 03:17:00,2022-03-11 03:40:00,S_11,10579,7,4762777,CKB -LINE_3,S_11,2022-03-11 03:47:00,2022-03-11 04:14:00,OPPS_10,12007,3,4762777,CKB -LINE_3,OPPS_10,2022-03-11 04:17:00,2022-03-11 04:40:00,S_11,10579,3,4762777,CKB -LINE_4,S_11,2022-03-11 04:43:00,2022-03-11 04:58:00,S_13,6161,0,4762777,CKB -LINE_4,S_13,2022-03-11 04:58:00,2022-03-11 04:58:00,DEPS_1,0.06,0,4762777,CKB -LINE_5,DEPS_1,2022-03-10 22:56:00,2022-03-10 22:56:00,S_14,0.06,0,4617422,CKB -LINE_5,S_14,2022-03-10 22:56:00,2022-03-10 23:08:00,S_15,5882,3,4617422,CKB -LINE_5,S_15,2022-03-10 23:11:00,2022-03-10 23:25:00,S_14,6232,0,4617422,CKB -LINE_5,S_14,2022-03-10 23:25:00,2022-03-10 23:38:00,S_15,6086,3,4617422,CKB -LINE_5,S_15,2022-03-10 23:41:00,2022-03-10 23:55:00,S_14,6232,0,4617422,CKB -LINE_5,S_14,2022-03-10 23:55:00,2022-03-11 00:08:00,S_15,6086,0,4617422,CKB -LINE_5,S_15,2022-03-11 00:08:00,2022-03-11 00:08:00,DEPS_1,0.06,0,4617422,CKB -LINE_6,DEPS_1,2022-03-10 05:05:00,2022-03-10 05:05:00,S_16,0.06,0,4426847,CKB -LINE_6,S_16,2022-03-10 05:05:00,2022-03-10 05:14:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 05:14:00,2022-03-10 05:23:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 05:25:00,2022-03-10 05:34:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 05:34:00,2022-03-10 05:43:00,S_16,5139,23,4426847,CKB -LINE_6,S_16,2022-03-10 06:06:00,2022-03-10 06:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 06:15:00,2022-03-10 06:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 06:26:00,2022-03-10 06:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 06:35:00,2022-03-10 06:44:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 06:46:00,2022-03-10 06:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 06:55:00,2022-03-10 07:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 07:06:00,2022-03-10 07:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 07:15:00,2022-03-10 07:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 07:26:00,2022-03-10 07:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 07:35:00,2022-03-10 07:44:00,S_16,5139,22,4426847,CKB -LINE_6,S_16,2022-03-10 08:06:00,2022-03-10 08:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 08:15:00,2022-03-10 08:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 08:26:00,2022-03-10 08:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 08:35:00,2022-03-10 08:44:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 08:46:00,2022-03-10 08:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 08:55:00,2022-03-10 09:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 09:06:00,2022-03-10 09:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 09:15:00,2022-03-10 09:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 09:26:00,2022-03-10 09:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 09:35:00,2022-03-10 09:44:00,S_16,5139,22,4426847,CKB -LINE_6,S_16,2022-03-10 10:06:00,2022-03-10 10:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 10:15:00,2022-03-10 10:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 10:26:00,2022-03-10 10:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 10:35:00,2022-03-10 10:44:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 10:46:00,2022-03-10 10:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 10:55:00,2022-03-10 11:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 11:06:00,2022-03-10 11:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 11:15:00,2022-03-10 11:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 11:26:00,2022-03-10 11:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 11:35:00,2022-03-10 11:44:00,S_16,5139,22,4426847,CKB -LINE_6,S_16,2022-03-10 12:06:00,2022-03-10 12:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 12:15:00,2022-03-10 12:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 12:26:00,2022-03-10 12:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 12:35:00,2022-03-10 12:44:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 12:46:00,2022-03-10 12:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 12:55:00,2022-03-10 13:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 13:06:00,2022-03-10 13:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 13:15:00,2022-03-10 13:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 13:26:00,2022-03-10 13:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 13:35:00,2022-03-10 13:44:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 13:46:00,2022-03-10 13:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 13:55:00,2022-03-10 14:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 14:06:00,2022-03-10 14:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 14:15:00,2022-03-10 14:24:00,S_16,5139,22,4426847,CKB -LINE_6,S_16,2022-03-10 14:46:00,2022-03-10 14:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 14:55:00,2022-03-10 15:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 15:06:00,2022-03-10 15:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 15:15:00,2022-03-10 15:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 15:26:00,2022-03-10 15:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 15:35:00,2022-03-10 15:44:00,S_16,5139,22,4426847,CKB -LINE_6,S_16,2022-03-10 16:06:00,2022-03-10 16:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 16:15:00,2022-03-10 16:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 16:26:00,2022-03-10 16:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 16:35:00,2022-03-10 16:44:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 16:46:00,2022-03-10 16:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 16:55:00,2022-03-10 17:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 17:06:00,2022-03-10 17:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 17:15:00,2022-03-10 17:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 17:26:00,2022-03-10 17:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 17:35:00,2022-03-10 17:44:00,S_16,5139,22,4426847,CKB -LINE_6,S_16,2022-03-10 18:06:00,2022-03-10 18:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 18:15:00,2022-03-10 18:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 18:26:00,2022-03-10 18:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 18:35:00,2022-03-10 18:44:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 18:46:00,2022-03-10 18:55:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 18:55:00,2022-03-10 19:04:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 19:06:00,2022-03-10 19:15:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 19:15:00,2022-03-10 19:24:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 19:26:00,2022-03-10 19:35:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 19:35:00,2022-03-10 19:44:00,S_16,5139,21,4426847,CKB -LINE_6,S_16,2022-03-10 20:05:00,2022-03-10 20:14:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 20:14:00,2022-03-10 20:23:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 20:25:00,2022-03-10 20:34:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 20:34:00,2022-03-10 20:43:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 20:45:00,2022-03-10 20:54:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 20:54:00,2022-03-10 21:03:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 21:05:00,2022-03-10 21:14:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 21:14:00,2022-03-10 21:23:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 21:25:00,2022-03-10 21:34:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 21:34:00,2022-03-10 21:43:00,S_16,5139,22,4426847,CKB -LINE_6,S_16,2022-03-10 22:05:00,2022-03-10 22:14:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 22:14:00,2022-03-10 22:23:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 22:25:00,2022-03-10 22:34:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 22:34:00,2022-03-10 22:43:00,S_16,5139,2,4426847,CKB -LINE_6,S_16,2022-03-10 22:45:00,2022-03-10 22:54:00,S_17,4781,0,4426847,CKB -LINE_6,S_17,2022-03-10 22:54:00,2022-03-10 23:03:00,S_16,5139,0,4426847,CKB -LINE_6,S_16,2022-03-10 23:03:00,2022-03-10 23:03:00,DEPS_1,0.06,0,4426847,CKB -LINE_7,DEPS_1,2022-03-11 00:06:00,2022-03-11 00:06:00,S_18,0.06,0,4708597,CKB -LINE_7,S_18,2022-03-11 00:06:00,2022-03-11 00:27:00,S_19,7827,0,4708597,CKB -LINE_8,S_19,2022-03-11 00:27:00,2022-03-11 00:48:00,S_20,11079,0,4708597,CKB -LINE_8,S_20,2022-03-11 00:48:00,2022-03-11 01:25:00,OPPS_21,20641,8,4708597,CKB -LINE_8,OPPS_21,2022-03-11 01:33:00,2022-03-11 02:16:00,S_20,20579,1,4708597,CKB -LINE_8,S_20,2022-03-11 02:17:00,2022-03-11 02:55:00,OPPS_21,20641,8,4708597,CKB -LINE_8,OPPS_21,2022-03-11 03:03:00,2022-03-11 03:46:00,S_20,20579,1,4708597,CKB -LINE_8,S_20,2022-03-11 03:47:00,2022-03-11 04:25:00,OPPS_21,20641,0,4708597,CKB -LINE_8,OPPS_21,2022-03-11 04:25:00,2022-03-11 04:25:00,DEPS_1,0.06,0,4708597,CKB -LINE_9,DEPS_23,2022-03-10 05:15:00,2022-03-10 06:01:00,S_22,17.9,0,4317627,VDL -LINE_9,S_22,2022-03-10 06:01:00,2022-03-10 06:15:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 06:23:00,2022-03-10 06:37:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 06:41:00,2022-03-10 06:55:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 07:03:00,2022-03-10 07:17:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 07:21:00,2022-03-10 07:35:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 07:43:00,2022-03-10 07:57:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 08:01:00,2022-03-10 08:15:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 08:23:00,2022-03-10 08:37:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 08:41:00,2022-03-10 08:55:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 09:03:00,2022-03-10 09:17:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 09:21:00,2022-03-10 09:35:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 09:43:00,2022-03-10 09:57:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 10:01:00,2022-03-10 10:15:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 10:23:00,2022-03-10 10:37:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 10:41:00,2022-03-10 10:55:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 11:03:00,2022-03-10 11:17:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 11:21:00,2022-03-10 11:35:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 11:43:00,2022-03-10 11:57:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 12:01:00,2022-03-10 12:15:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 12:23:00,2022-03-10 12:37:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 12:41:00,2022-03-10 12:55:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 13:03:00,2022-03-10 13:17:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 13:21:00,2022-03-10 13:35:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 13:43:00,2022-03-10 13:57:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 14:01:00,2022-03-10 14:15:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 14:23:00,2022-03-10 14:37:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 14:41:00,2022-03-10 14:55:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 15:03:00,2022-03-10 15:17:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 15:21:00,2022-03-10 15:35:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 15:43:00,2022-03-10 15:57:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 16:01:00,2022-03-10 16:15:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 16:23:00,2022-03-10 16:37:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 16:41:00,2022-03-10 16:55:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 17:03:00,2022-03-10 17:17:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 17:21:00,2022-03-10 17:35:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 17:43:00,2022-03-10 17:57:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 18:01:00,2022-03-10 18:15:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 18:23:00,2022-03-10 18:37:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 18:41:00,2022-03-10 18:55:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 19:03:00,2022-03-10 19:17:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 19:21:00,2022-03-10 19:35:00,S_22,4637,8,4317627,VDL -LINE_9,S_22,2022-03-10 19:43:00,2022-03-10 19:57:00,S_22,4637,4,4317627,VDL -LINE_9,S_22,2022-03-10 20:01:00,2022-03-10 20:14:00,S_22,4637,9,4317627,VDL -LINE_9,S_22,2022-03-10 20:23:00,2022-03-10 20:36:00,S_22,4637,0,4317627,VDL -LINE_9,S_22,2022-03-10 20:36:00,2022-03-10 21:15:00,DEPS_23,19.8,0,4317627,VDL -LINE_10,DEPS_1,2022-03-10 04:56:00,2022-03-10 04:56:00,S_24,0.06,18,4425670,CKB -LINE_10,S_24,2022-03-10 05:14:00,2022-03-10 05:20:00,S_25,3.29,0,4425670,CKB -LINE_10,S_25,2022-03-10 05:20:00,2022-03-10 05:24:00,S_24,2954,20,4425670,CKB -LINE_10,S_24,2022-03-10 05:44:00,2022-03-10 05:50:00,S_25,3.29,0,4425670,CKB -LINE_10,S_25,2022-03-10 05:50:00,2022-03-10 05:54:00,S_24,2954,5,4425670,CKB -LINE_10,S_24,2022-03-10 05:59:00,2022-03-10 06:06:00,S_25,3.29,2,4425670,CKB -LINE_10,S_25,2022-03-10 06:08:00,2022-03-10 06:13:00,S_24,2954,19,4425670,CKB -LINE_10,S_24,2022-03-10 06:32:00,2022-03-10 06:39:00,S_25,3.29,1,4425670,CKB -LINE_10,S_25,2022-03-10 06:40:00,2022-03-10 06:45:00,S_24,2954,7,4425670,CKB -LINE_10,S_24,2022-03-10 06:52:00,2022-03-10 06:59:00,S_25,3.29,1,4425670,CKB -LINE_10,S_25,2022-03-10 07:00:00,2022-03-10 07:05:00,S_24,2954,7,4425670,CKB -LINE_10,S_24,2022-03-10 07:12:00,2022-03-10 07:19:00,S_25,3.29,1,4425670,CKB -LINE_10,S_25,2022-03-10 07:20:00,2022-03-10 07:25:00,S_24,2954,7,4425670,CKB -LINE_10,S_24,2022-03-10 07:32:00,2022-03-10 07:39:00,S_25,3.29,1,4425670,CKB -LINE_10,S_25,2022-03-10 07:40:00,2022-03-10 07:45:00,S_24,2954,295,4425670,CKB -LINE_10,S_24,2022-03-10 12:40:00,2022-03-10 12:47:00,S_25,3.29,2,4425670,CKB -LINE_10,S_25,2022-03-10 12:49:00,2022-03-10 12:54:00,S_24,2954,46,4425670,CKB -LINE_10,S_24,2022-03-10 13:40:00,2022-03-10 13:47:00,S_25,3.29,2,4425670,CKB -LINE_10,S_25,2022-03-10 13:49:00,2022-03-10 13:54:00,S_24,2954,434,4425670,CKB -LINE_10,S_24,2022-03-10 21:08:00,2022-03-10 21:08:00,DEPS_1,0.06,0,4425670,CKB -LINE_11,DEPS_1,2022-03-10 07:20:00,2022-03-10 07:20:00,OPPS_26,0.06,0,4448152,CKB -LINE_11,OPPS_26,2022-03-10 07:20:00,2022-03-10 07:50:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 08:00:00,2022-03-10 08:30:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 08:40:00,2022-03-10 09:10:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 09:20:00,2022-03-10 09:50:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 10:00:00,2022-03-10 10:30:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 10:40:00,2022-03-10 11:10:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 11:20:00,2022-03-10 11:50:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 12:00:00,2022-03-10 12:30:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 12:40:00,2022-03-10 13:10:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 13:20:00,2022-03-10 13:50:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 14:00:00,2022-03-10 14:30:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 14:40:00,2022-03-10 15:10:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 15:20:00,2022-03-10 15:50:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 16:00:00,2022-03-10 16:30:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 16:40:00,2022-03-10 17:10:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 17:20:00,2022-03-10 17:50:00,OPPS_26,9266,10,4448152,CKB -LINE_11,OPPS_26,2022-03-10 18:00:00,2022-03-10 18:30:00,OPPS_26,9266,0,4448152,CKB -LINE_11,OPPS_26,2022-03-10 18:30:00,2022-03-10 18:30:00,DEPS_1,0.06,0,4448152,CKB -LINE_12,DEPS_1,2022-03-10 07:10:00,2022-03-10 07:10:00,S_27,0.06,0,4733897,CKB -LINE_12,S_27,2022-03-10 07:10:00,2022-03-10 07:18:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 07:28:00,2022-03-10 07:40:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 07:40:00,2022-03-10 07:48:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 07:58:00,2022-03-10 08:10:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 08:10:00,2022-03-10 08:18:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 08:28:00,2022-03-10 08:40:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 08:40:00,2022-03-10 08:48:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 08:58:00,2022-03-10 09:10:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 09:10:00,2022-03-10 09:18:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 09:28:00,2022-03-10 09:40:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 09:40:00,2022-03-10 09:48:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 09:58:00,2022-03-10 10:10:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 10:10:00,2022-03-10 10:18:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 10:28:00,2022-03-10 10:40:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 10:40:00,2022-03-10 10:48:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 10:58:00,2022-03-10 11:10:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 11:10:00,2022-03-10 11:18:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 11:28:00,2022-03-10 11:40:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 11:40:00,2022-03-10 11:48:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 11:58:00,2022-03-10 12:10:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 12:10:00,2022-03-10 12:18:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 12:28:00,2022-03-10 12:40:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 12:40:00,2022-03-10 12:48:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 12:58:00,2022-03-10 13:10:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 13:10:00,2022-03-10 13:18:00,OPPS_28,2169,10,4733897,CKB -LINE_12,OPPS_28,2022-03-10 13:28:00,2022-03-10 13:40:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 13:40:00,2022-03-10 13:48:00,OPPS_28,2169,8,4733897,CKB -LINE_12,OPPS_28,2022-03-10 13:56:00,2022-03-10 14:10:00,S_27,2952,0,4733897,CKB -LINE_12,S_27,2022-03-10 14:10:00,2022-03-10 14:19:00,OPPS_28,2169,14,4733897,CKB -LINE_12,OPPS_28,2022-03-10 14:33:00,2022-03-10 14:47:00,S_27,2952,3,4733897,CKB -LINE_12,S_27,2022-03-10 14:50:00,2022-03-10 14:59:00,OPPS_28,2169,14,4733897,CKB -LINE_12,OPPS_28,2022-03-10 15:13:00,2022-03-10 15:27:00,S_27,2952,3,4733897,CKB -LINE_12,S_27,2022-03-10 15:30:00,2022-03-10 15:39:00,OPPS_28,2169,14,4733897,CKB -LINE_12,OPPS_28,2022-03-10 15:53:00,2022-03-10 16:07:00,S_27,2952,3,4733897,CKB -LINE_12,S_27,2022-03-10 16:10:00,2022-03-10 16:19:00,OPPS_28,2169,14,4733897,CKB -LINE_12,OPPS_28,2022-03-10 16:33:00,2022-03-10 16:47:00,S_27,2952,3,4733897,CKB -LINE_12,S_27,2022-03-10 16:50:00,2022-03-10 16:59:00,OPPS_28,2169,14,4733897,CKB -LINE_12,OPPS_28,2022-03-10 17:13:00,2022-03-10 17:27:00,S_27,2952,3,4733897,CKB -LINE_12,S_27,2022-03-10 17:30:00,2022-03-10 17:39:00,OPPS_28,2169,13,4733897,CKB -LINE_12,OPPS_28,2022-03-10 17:52:00,2022-03-10 18:05:00,S_27,2952,5,4733897,CKB -LINE_12,S_27,2022-03-10 18:10:00,2022-03-10 18:18:00,OPPS_28,2169,0,4733897,CKB -LINE_12,OPPS_28,2022-03-10 18:18:00,2022-03-10 18:18:00,DEPS_1,0.06,0,4733897,CKB -LINE_12,DEPS_1,2022-03-10 14:13:00,2022-03-10 14:13:00,OPPS_28,0.06,0,4734202,CKB -LINE_12,OPPS_28,2022-03-10 14:13:00,2022-03-10 14:27:00,S_27,2952,3,4734202,CKB -LINE_12,S_27,2022-03-10 14:30:00,2022-03-10 14:39:00,OPPS_28,2169,14,4734202,CKB -LINE_12,OPPS_28,2022-03-10 14:53:00,2022-03-10 15:07:00,S_27,2952,3,4734202,CKB -LINE_12,S_27,2022-03-10 15:10:00,2022-03-10 15:19:00,OPPS_28,2169,14,4734202,CKB -LINE_12,OPPS_28,2022-03-10 15:33:00,2022-03-10 15:47:00,S_27,2952,3,4734202,CKB -LINE_12,S_27,2022-03-10 15:50:00,2022-03-10 15:59:00,OPPS_28,2169,14,4734202,CKB -LINE_12,OPPS_28,2022-03-10 16:13:00,2022-03-10 16:27:00,S_27,2952,3,4734202,CKB -LINE_12,S_27,2022-03-10 16:30:00,2022-03-10 16:39:00,OPPS_28,2169,14,4734202,CKB -LINE_12,OPPS_28,2022-03-10 16:53:00,2022-03-10 17:07:00,S_27,2952,3,4734202,CKB -LINE_12,S_27,2022-03-10 17:10:00,2022-03-10 17:19:00,OPPS_28,2169,14,4734202,CKB -LINE_12,OPPS_28,2022-03-10 17:33:00,2022-03-10 17:47:00,S_27,2952,3,4734202,CKB -LINE_12,S_27,2022-03-10 17:50:00,2022-03-10 17:59:00,OPPS_28,2169,14,4734202,CKB -LINE_12,OPPS_28,2022-03-10 18:13:00,2022-03-10 18:25:00,S_27,2952,0,4734202,CKB -LINE_12,S_27,2022-03-10 18:25:00,2022-03-10 18:25:00,DEPS_1,0.06,0,4734202,CKB -LINE_13,DEPS_1,2022-03-11 00:23:00,2022-03-11 00:23:00,S_29,0.06,0,4318159,CKB -LINE_13,S_29,2022-03-11 00:23:00,2022-03-11 00:30:00,OPPS_30,2577,9,4318159,CKB -LINE_14,OPPS_30,2022-03-11 00:39:00,2022-03-11 00:54:00,S_31,5937,9,4318159,CKB -LINE_14,S_31,2022-03-11 01:03:00,2022-03-11 01:17:00,OPPS_30,6.19,0,4318159,CKB -LINE_13,OPPS_30,2022-03-11 01:17:00,2022-03-11 01:23:00,S_29,2555,0,4318159,CKB -LINE_13,S_29,2022-03-11 01:23:00,2022-03-11 01:30:00,OPPS_30,2577,9,4318159,CKB -LINE_14,OPPS_30,2022-03-11 01:39:00,2022-03-11 01:54:00,S_31,5937,9,4318159,CKB -LINE_14,S_31,2022-03-11 02:03:00,2022-03-11 02:17:00,OPPS_30,6.19,0,4318159,CKB -LINE_13,OPPS_30,2022-03-11 02:17:00,2022-03-11 02:23:00,S_29,2555,0,4318159,CKB -LINE_13,S_29,2022-03-11 02:23:00,2022-03-11 02:30:00,OPPS_30,2577,9,4318159,CKB -LINE_14,OPPS_30,2022-03-11 02:39:00,2022-03-11 02:54:00,S_31,5937,9,4318159,CKB -LINE_14,S_31,2022-03-11 03:03:00,2022-03-11 03:17:00,OPPS_30,6.19,0,4318159,CKB -LINE_13,OPPS_30,2022-03-11 03:17:00,2022-03-11 03:23:00,S_29,2555,0,4318159,CKB -LINE_13,S_29,2022-03-11 03:23:00,2022-03-11 03:30:00,OPPS_30,2577,9,4318159,CKB -LINE_14,OPPS_30,2022-03-11 03:39:00,2022-03-11 03:54:00,S_31,5937,9,4318159,CKB -LINE_14,S_31,2022-03-11 04:03:00,2022-03-11 04:17:00,OPPS_30,6.19,0,4318159,CKB -LINE_13,OPPS_30,2022-03-11 04:17:00,2022-03-11 04:23:00,S_29,2555,0,4318159,CKB -LINE_13,S_29,2022-03-11 04:23:00,2022-03-11 04:23:00,DEPS_1,0.06,0,4318159,CKB -LINE_14,DEPS_1,2022-03-11 00:33:00,2022-03-11 00:33:00,S_31,0.06,0,4318179,CKB -LINE_14,S_31,2022-03-11 00:33:00,2022-03-11 00:47:00,OPPS_30,6.19,0,4318179,CKB -LINE_13,OPPS_30,2022-03-11 00:47:00,2022-03-11 00:53:00,S_29,2555,0,4318179,CKB -LINE_13,S_29,2022-03-11 00:53:00,2022-03-11 01:00:00,OPPS_30,2577,9,4318179,CKB -LINE_14,OPPS_30,2022-03-11 01:09:00,2022-03-11 01:24:00,S_31,5937,9,4318179,CKB -LINE_14,S_31,2022-03-11 01:33:00,2022-03-11 01:47:00,OPPS_30,6.19,0,4318179,CKB -LINE_13,OPPS_30,2022-03-11 01:47:00,2022-03-11 01:53:00,S_29,2555,0,4318179,CKB -LINE_13,S_29,2022-03-11 01:53:00,2022-03-11 02:00:00,OPPS_30,2577,9,4318179,CKB -LINE_14,OPPS_30,2022-03-11 02:09:00,2022-03-11 02:24:00,S_31,5937,9,4318179,CKB -LINE_14,S_31,2022-03-11 02:33:00,2022-03-11 02:47:00,OPPS_30,6.19,0,4318179,CKB -LINE_13,OPPS_30,2022-03-11 02:47:00,2022-03-11 02:53:00,S_29,2555,0,4318179,CKB -LINE_13,S_29,2022-03-11 02:53:00,2022-03-11 03:00:00,OPPS_30,2577,9,4318179,CKB -LINE_14,OPPS_30,2022-03-11 03:09:00,2022-03-11 03:24:00,S_31,5937,9,4318179,CKB -LINE_14,S_31,2022-03-11 03:33:00,2022-03-11 03:47:00,OPPS_30,6.19,0,4318179,CKB -LINE_13,OPPS_30,2022-03-11 03:47:00,2022-03-11 03:53:00,S_29,2555,0,4318179,CKB -LINE_13,S_29,2022-03-11 03:53:00,2022-03-11 04:00:00,OPPS_30,2577,9,4318179,CKB -LINE_14,OPPS_30,2022-03-11 04:09:00,2022-03-11 04:24:00,S_31,5937,0,4318179,CKB -LINE_14,S_31,2022-03-11 04:24:00,2022-03-11 04:24:00,DEPS_1,0.06,0,4318179,CKB -LINE_15,DEPS_1,2022-03-11 00:57:00,2022-03-11 00:57:00,OPPS_32,0.06,0,4319354,CKB -LINE_15,OPPS_32,2022-03-11 00:57:00,2022-03-11 01:06:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 01:06:00,2022-03-11 01:11:00,OPPS_32,2936,16,4319354,CKB -LINE_15,OPPS_32,2022-03-11 01:27:00,2022-03-11 01:36:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 01:36:00,2022-03-11 01:41:00,OPPS_32,2936,16,4319354,CKB -LINE_15,OPPS_32,2022-03-11 01:57:00,2022-03-11 02:06:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 02:06:00,2022-03-11 02:11:00,OPPS_32,2936,16,4319354,CKB -LINE_15,OPPS_32,2022-03-11 02:27:00,2022-03-11 02:36:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 02:36:00,2022-03-11 02:41:00,OPPS_32,2936,16,4319354,CKB -LINE_15,OPPS_32,2022-03-11 02:57:00,2022-03-11 03:06:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 03:06:00,2022-03-11 03:11:00,OPPS_32,2936,16,4319354,CKB -LINE_15,OPPS_32,2022-03-11 03:27:00,2022-03-11 03:36:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 03:36:00,2022-03-11 03:41:00,OPPS_32,2936,16,4319354,CKB -LINE_15,OPPS_32,2022-03-11 03:57:00,2022-03-11 04:06:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 04:06:00,2022-03-11 04:11:00,OPPS_32,2936,16,4319354,CKB -LINE_15,OPPS_32,2022-03-11 04:27:00,2022-03-11 04:36:00,S_33,4343,0,4319354,CKB -LINE_15,S_33,2022-03-11 04:36:00,2022-03-11 04:36:00,DEPS_1,0.06,0,4319354,CKB -LINE_16,DEPS_1,2022-03-11 00:29:00,2022-03-11 00:29:00,S_34,0.06,0,4751089,CKB -LINE_16,S_34,2022-03-11 00:29:00,2022-03-11 00:41:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 00:47:00,2022-03-11 00:57:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 00:59:00,2022-03-11 01:11:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 01:17:00,2022-03-11 01:27:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 01:29:00,2022-03-11 01:41:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 01:47:00,2022-03-11 01:57:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 01:59:00,2022-03-11 02:11:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 02:17:00,2022-03-11 02:27:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 02:29:00,2022-03-11 02:41:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 02:47:00,2022-03-11 02:57:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 02:59:00,2022-03-11 03:11:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 03:17:00,2022-03-11 03:27:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 03:29:00,2022-03-11 03:41:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 03:47:00,2022-03-11 03:57:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 03:59:00,2022-03-11 04:11:00,S_35,4481,6,4751089,CKB -LINE_16,S_35,2022-03-11 04:17:00,2022-03-11 04:27:00,S_34,4031,2,4751089,CKB -LINE_16,S_34,2022-03-11 04:29:00,2022-03-11 04:41:00,S_35,4481,0,4751089,CKB -LINE_16,S_35,2022-03-11 04:41:00,2022-03-11 04:41:00,DEPS_1,0.06,0,4751089,CKB -LINE_17,DEPS_1,2022-03-11 00:30:00,2022-03-11 00:30:00,S_34,0.06,0,4453547,CKB -LINE_17,S_34,2022-03-11 00:30:00,2022-03-11 00:44:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 00:44:00,2022-03-11 00:57:00,S_34,5302,3,4453547,CKB -LINE_17,S_34,2022-03-11 01:00:00,2022-03-11 01:14:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 01:14:00,2022-03-11 01:27:00,S_34,5302,3,4453547,CKB -LINE_17,S_34,2022-03-11 01:30:00,2022-03-11 01:44:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 01:44:00,2022-03-11 01:57:00,S_34,5302,3,4453547,CKB -LINE_17,S_34,2022-03-11 02:00:00,2022-03-11 02:14:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 02:14:00,2022-03-11 02:27:00,S_34,5302,3,4453547,CKB -LINE_17,S_34,2022-03-11 02:30:00,2022-03-11 02:44:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 02:44:00,2022-03-11 02:57:00,S_34,5302,3,4453547,CKB -LINE_17,S_34,2022-03-11 03:00:00,2022-03-11 03:14:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 03:14:00,2022-03-11 03:27:00,S_34,5302,3,4453547,CKB -LINE_17,S_34,2022-03-11 03:30:00,2022-03-11 03:44:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 03:44:00,2022-03-11 03:57:00,S_34,5302,3,4453547,CKB -LINE_17,S_34,2022-03-11 04:00:00,2022-03-11 04:14:00,S_36,4801,0,4453547,CKB -LINE_17,S_36,2022-03-11 04:14:00,2022-03-11 04:27:00,S_34,5302,0,4453547,CKB -LINE_17,S_34,2022-03-11 04:27:00,2022-03-11 04:27:00,DEPS_1,0.06,0,4453547,CKB -LINE_18,DEPS_1,2022-03-11 00:43:00,2022-03-11 00:43:00,S_37,0.06,0,4374469,CKB -LINE_18,S_37,2022-03-11 00:43:00,2022-03-11 01:33:00,S_37,20434,10,4374469,CKB -LINE_18,S_37,2022-03-11 01:43:00,2022-03-11 02:33:00,S_37,20434,10,4374469,CKB -LINE_18,S_37,2022-03-11 02:43:00,2022-03-11 03:33:00,S_37,20434,10,4374469,CKB -LINE_18,S_37,2022-03-11 03:43:00,2022-03-11 04:33:00,S_37,20434,0,4374469,CKB -LINE_18,S_37,2022-03-11 04:33:00,2022-03-11 04:33:00,DEPS_1,0.06,0,4374469,CKB -LINE_18,DEPS_1,2022-03-11 00:13:00,2022-03-11 00:13:00,S_37,0.06,0,4374474,CKB -LINE_18,S_37,2022-03-11 00:13:00,2022-03-11 01:03:00,S_37,20434,10,4374474,CKB -LINE_18,S_37,2022-03-11 01:13:00,2022-03-11 02:03:00,S_37,20434,10,4374474,CKB -LINE_18,S_37,2022-03-11 02:13:00,2022-03-11 03:03:00,S_37,20434,10,4374474,CKB -LINE_18,S_37,2022-03-11 03:13:00,2022-03-11 04:03:00,S_37,20434,0,4374474,CKB -LINE_18,S_37,2022-03-11 04:03:00,2022-03-11 04:03:00,DEPS_1,0.06,0,4374474,CKB -LINE_19,DEPS_1,2022-03-11 00:24:00,2022-03-11 00:24:00,S_38,0.06,0,4456450,CKB -LINE_19,S_38,2022-03-11 00:24:00,2022-03-11 00:48:00,OPPS_39,11.86,4,4456450,CKB -LINE_19,OPPS_39,2022-03-11 00:52:00,2022-03-11 01:14:00,S_38,11139,10,4456450,CKB -LINE_19,S_38,2022-03-11 01:24:00,2022-03-11 01:48:00,OPPS_39,11.86,4,4456450,CKB -LINE_19,OPPS_39,2022-03-11 01:52:00,2022-03-11 02:14:00,S_38,11139,10,4456450,CKB -LINE_19,S_38,2022-03-11 02:24:00,2022-03-11 02:48:00,OPPS_39,11.86,4,4456450,CKB -LINE_19,OPPS_39,2022-03-11 02:52:00,2022-03-11 03:14:00,S_38,11139,10,4456450,CKB -LINE_19,S_38,2022-03-11 03:24:00,2022-03-11 03:48:00,OPPS_39,11.86,4,4456450,CKB -LINE_19,OPPS_39,2022-03-11 03:52:00,2022-03-11 04:14:00,S_38,11139,0,4456450,CKB -LINE_19,S_38,2022-03-11 04:14:00,2022-03-11 04:14:00,DEPS_1,0.06,0,4456450,CKB -LINE_19,DEPS_1,2022-03-11 00:22:00,2022-03-11 00:22:00,OPPS_39,0.06,0,4456458,CKB -LINE_19,OPPS_39,2022-03-11 00:22:00,2022-03-11 00:44:00,S_38,11139,10,4456458,CKB -LINE_19,S_38,2022-03-11 00:54:00,2022-03-11 01:18:00,OPPS_39,11.86,4,4456458,CKB -LINE_19,OPPS_39,2022-03-11 01:22:00,2022-03-11 01:44:00,S_38,11139,10,4456458,CKB -LINE_19,S_38,2022-03-11 01:54:00,2022-03-11 02:18:00,OPPS_39,11.86,4,4456458,CKB -LINE_19,OPPS_39,2022-03-11 02:22:00,2022-03-11 02:44:00,S_38,11139,10,4456458,CKB -LINE_19,S_38,2022-03-11 02:54:00,2022-03-11 03:18:00,OPPS_39,11.86,4,4456458,CKB -LINE_19,OPPS_39,2022-03-11 03:22:00,2022-03-11 03:44:00,S_38,11139,10,4456458,CKB -LINE_19,S_38,2022-03-11 03:54:00,2022-03-11 04:18:00,OPPS_39,11.86,4,4456458,CKB -LINE_19,OPPS_39,2022-03-11 04:22:00,2022-03-11 04:44:00,S_38,11139,0,4456458,CKB -LINE_19,S_38,2022-03-11 04:44:00,2022-03-11 04:44:00,DEPS_1,0.06,0,4456458,CKB -LINE_20,DEPS_1,2022-03-11 00:32:00,2022-03-11 00:32:00,S_13,0.06,0,4747652,CKB -LINE_20,S_13,2022-03-11 00:32:00,2022-03-11 00:44:00,S_40,4212,3,4747652,CKB -LINE_20,S_40,2022-03-11 00:47:00,2022-03-11 01:16:00,S_41,13048,0,4747652,CKB -LINE_20,S_41,2022-03-11 01:16:00,2022-03-11 01:42:00,S_40,12869,5,4747652,CKB -LINE_20,S_40,2022-03-11 01:47:00,2022-03-11 02:16:00,S_41,13048,0,4747652,CKB -LINE_20,S_41,2022-03-11 02:16:00,2022-03-11 02:42:00,S_40,12869,5,4747652,CKB -LINE_20,S_40,2022-03-11 02:47:00,2022-03-11 03:16:00,S_41,13048,0,4747652,CKB -LINE_20,S_41,2022-03-11 03:16:00,2022-03-11 03:42:00,S_40,12869,5,4747652,CKB -LINE_20,S_40,2022-03-11 03:47:00,2022-03-11 04:16:00,S_41,13048,0,4747652,CKB -LINE_20,S_41,2022-03-11 04:16:00,2022-03-11 04:34:00,DEPS_42,9538,0,4747652,CKB -LINE_20,DEPS_42,2022-03-11 04:34:00,2022-03-11 04:34:00,DEPS_1,0.06,0,4747652,CKB -LINE_20,DEPS_1,2022-03-11 00:17:00,2022-03-11 00:17:00,S_40,0.06,0,4747662,CKB -LINE_20,S_40,2022-03-11 00:17:00,2022-03-11 00:46:00,S_41,13048,0,4747662,CKB -LINE_20,S_41,2022-03-11 00:46:00,2022-03-11 01:12:00,S_40,12869,5,4747662,CKB -LINE_20,S_40,2022-03-11 01:17:00,2022-03-11 01:46:00,S_41,13048,0,4747662,CKB -LINE_20,S_41,2022-03-11 01:46:00,2022-03-11 02:12:00,S_40,12869,5,4747662,CKB -LINE_20,S_40,2022-03-11 02:17:00,2022-03-11 02:46:00,S_41,13048,0,4747662,CKB -LINE_20,S_41,2022-03-11 02:46:00,2022-03-11 03:12:00,S_40,12869,5,4747662,CKB -LINE_20,S_40,2022-03-11 03:17:00,2022-03-11 03:46:00,S_41,13048,0,4747662,CKB -LINE_20,S_41,2022-03-11 03:46:00,2022-03-11 04:12:00,S_40,12869,5,4747662,CKB -LINE_20,S_40,2022-03-11 04:17:00,2022-03-11 04:28:00,S_13,4316,0,4747662,CKB -LINE_20,S_13,2022-03-11 04:28:00,2022-03-11 04:28:00,DEPS_1,0.06,0,4747662,CKB -LINE_21,DEPS_1,2022-03-11 00:49:00,2022-03-11 00:49:00,OPPS_3,0.06,0,4434343,CKB -LINE_21,OPPS_3,2022-03-11 00:49:00,2022-03-11 01:04:00,S_16,10229,0,4434343,CKB -LINE_21,S_16,2022-03-11 01:04:00,2022-03-11 01:19:00,OPPS_3,11801,0,4434343,CKB -LINE_21,OPPS_3,2022-03-11 01:19:00,2022-03-11 01:34:00,S_16,10229,0,4434343,CKB -LINE_21,S_16,2022-03-11 01:34:00,2022-03-11 01:49:00,OPPS_3,11801,0,4434343,CKB -LINE_21,OPPS_3,2022-03-11 01:49:00,2022-03-11 02:04:00,S_16,10229,0,4434343,CKB -LINE_21,S_16,2022-03-11 02:04:00,2022-03-11 02:19:00,OPPS_3,11801,0,4434343,CKB -LINE_21,OPPS_3,2022-03-11 02:19:00,2022-03-11 02:34:00,S_16,10229,0,4434343,CKB -LINE_21,S_16,2022-03-11 02:34:00,2022-03-11 02:49:00,OPPS_3,11801,0,4434343,CKB -LINE_21,OPPS_3,2022-03-11 02:49:00,2022-03-11 03:04:00,S_16,10229,0,4434343,CKB -LINE_21,S_16,2022-03-11 03:04:00,2022-03-11 03:19:00,OPPS_3,11801,0,4434343,CKB -LINE_21,OPPS_3,2022-03-11 03:19:00,2022-03-11 03:34:00,S_16,10229,0,4434343,CKB -LINE_21,S_16,2022-03-11 03:34:00,2022-03-11 03:49:00,OPPS_3,11801,0,4434343,CKB -LINE_21,OPPS_3,2022-03-11 03:49:00,2022-03-11 04:04:00,S_16,10229,0,4434343,CKB -LINE_21,S_16,2022-03-11 04:04:00,2022-03-11 04:19:00,OPPS_3,11801,23,4434343,CKB -LINE_22,OPPS_3,2022-03-11 04:42:00,2022-03-11 05:04:00,S_43,6.81,0,4434343,CKB -LINE_22,S_43,2022-03-11 05:04:00,2022-03-11 05:04:00,DEPS_1,0.06,0,4434343,CKB -LINE_8,DEPS_1,2022-03-11 00:32:00,2022-03-11 00:32:00,S_13,0.06,0,4434899,CKB -LINE_8,S_13,2022-03-11 00:32:00,2022-03-11 00:57:00,OPPS_21,11545,6,4434899,CKB -LINE_8,OPPS_21,2022-03-11 01:03:00,2022-03-11 01:46:00,S_20,20579,1,4434899,CKB -LINE_8,S_20,2022-03-11 01:47:00,2022-03-11 02:25:00,OPPS_21,20641,8,4434899,CKB -LINE_8,OPPS_21,2022-03-11 02:33:00,2022-03-11 03:16:00,S_20,20579,1,4434899,CKB -LINE_8,S_20,2022-03-11 03:17:00,2022-03-11 03:55:00,OPPS_21,20641,8,4434899,CKB -LINE_8,OPPS_21,2022-03-11 04:03:00,2022-03-11 04:28:00,S_13,11499,0,4434899,CKB -LINE_8,S_13,2022-03-11 04:28:00,2022-03-11 04:28:00,DEPS_1,0.06,0,4434899,CKB -LINE_8,DEPS_1,2022-03-11 00:33:00,2022-03-11 00:33:00,OPPS_21,0.06,0,4434904,CKB -LINE_8,OPPS_21,2022-03-11 00:33:00,2022-03-11 01:16:00,S_20,20579,1,4434904,CKB -LINE_8,S_20,2022-03-11 01:17:00,2022-03-11 01:55:00,OPPS_21,20641,8,4434904,CKB -LINE_8,OPPS_21,2022-03-11 02:03:00,2022-03-11 02:46:00,S_20,20579,1,4434904,CKB -LINE_8,S_20,2022-03-11 02:47:00,2022-03-11 03:25:00,OPPS_21,20641,8,4434904,CKB -LINE_8,OPPS_21,2022-03-11 03:33:00,2022-03-11 04:16:00,S_20,20579,1,4434904,CKB -LINE_8,S_20,2022-03-11 04:17:00,2022-03-11 04:51:00,S_44,18752,0,4434904,CKB -LINE_8,S_44,2022-03-11 04:51:00,2022-03-11 04:51:00,DEPS_1,0.06,0,4434904,CKB -LINE_23,DEPS_1,2022-03-11 00:34:00,2022-03-11 00:34:00,S_45,0.06,0,4619768,CKB -LINE_23,S_45,2022-03-11 00:34:00,2022-03-11 01:00:00,S_46,9016,0,4619768,CKB -LINE_23,S_46,2022-03-11 01:00:00,2022-03-11 01:27:00,S_45,10083,7,4619768,CKB -LINE_23,S_45,2022-03-11 01:34:00,2022-03-11 02:00:00,S_46,9016,0,4619768,CKB -LINE_23,S_46,2022-03-11 02:00:00,2022-03-11 02:27:00,S_45,10083,7,4619768,CKB -LINE_23,S_45,2022-03-11 02:34:00,2022-03-11 03:00:00,S_46,9016,0,4619768,CKB -LINE_23,S_46,2022-03-11 03:00:00,2022-03-11 03:27:00,S_45,10083,7,4619768,CKB -LINE_23,S_45,2022-03-11 03:34:00,2022-03-11 04:00:00,S_46,9016,0,4619768,CKB -LINE_23,S_46,2022-03-11 04:00:00,2022-03-11 04:27:00,S_45,10083,0,4619768,CKB -LINE_23,S_45,2022-03-11 04:27:00,2022-03-11 04:27:00,DEPS_1,0.06,0,4619768,CKB -LINE_23,DEPS_1,2022-03-11 00:30:00,2022-03-11 00:30:00,S_46,0.06,0,4619993,CKB -LINE_23,S_46,2022-03-11 00:30:00,2022-03-11 00:57:00,S_45,10083,7,4619993,CKB -LINE_23,S_45,2022-03-11 01:04:00,2022-03-11 01:30:00,S_46,9016,0,4619993,CKB -LINE_23,S_46,2022-03-11 01:30:00,2022-03-11 01:57:00,S_45,10083,7,4619993,CKB -LINE_23,S_45,2022-03-11 02:04:00,2022-03-11 02:30:00,S_46,9016,0,4619993,CKB -LINE_23,S_46,2022-03-11 02:30:00,2022-03-11 02:57:00,S_45,10083,7,4619993,CKB -LINE_23,S_45,2022-03-11 03:04:00,2022-03-11 03:30:00,S_46,9016,0,4619993,CKB -LINE_23,S_46,2022-03-11 03:30:00,2022-03-11 03:57:00,S_45,10083,7,4619993,CKB -LINE_23,S_45,2022-03-11 04:04:00,2022-03-11 04:30:00,S_46,9016,0,4619993,CKB -LINE_23,S_46,2022-03-11 04:30:00,2022-03-11 04:57:00,S_45,10083,0,4619993,CKB -LINE_23,S_45,2022-03-11 04:57:00,2022-03-11 04:57:00,DEPS_1,0.06,0,4619993,CKB -LINE_24,DEPS_1,2022-03-11 00:31:00,2022-03-11 00:31:00,OPPS_21,0.06,0,4374746,CKB -LINE_24,OPPS_21,2022-03-11 00:31:00,2022-03-11 00:44:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 00:44:00,2022-03-11 00:56:00,OPPS_21,5362,5,4374746,CKB -LINE_24,OPPS_21,2022-03-11 01:01:00,2022-03-11 01:14:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 01:14:00,2022-03-11 01:26:00,OPPS_21,5362,5,4374746,CKB -LINE_24,OPPS_21,2022-03-11 01:31:00,2022-03-11 01:44:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 01:44:00,2022-03-11 01:56:00,OPPS_21,5362,5,4374746,CKB -LINE_24,OPPS_21,2022-03-11 02:01:00,2022-03-11 02:14:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 02:14:00,2022-03-11 02:26:00,OPPS_21,5362,5,4374746,CKB -LINE_24,OPPS_21,2022-03-11 02:31:00,2022-03-11 02:44:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 02:44:00,2022-03-11 02:56:00,OPPS_21,5362,5,4374746,CKB -LINE_24,OPPS_21,2022-03-11 03:01:00,2022-03-11 03:14:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 03:14:00,2022-03-11 03:26:00,OPPS_21,5362,5,4374746,CKB -LINE_24,OPPS_21,2022-03-11 03:31:00,2022-03-11 03:44:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 03:44:00,2022-03-11 03:56:00,OPPS_21,5362,5,4374746,CKB -LINE_24,OPPS_21,2022-03-11 04:01:00,2022-03-11 04:14:00,S_47,4872,0,4374746,CKB -LINE_24,S_47,2022-03-11 04:14:00,2022-03-11 04:26:00,OPPS_21,5362,0,4374746,CKB -LINE_24,OPPS_21,2022-03-11 04:26:00,2022-03-11 04:26:00,DEPS_1,0.06,0,4374746,CKB -LINE_25,DEPS_1,2022-03-11 00:31:00,2022-03-11 00:31:00,OPPS_21,0.06,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 00:31:00,2022-03-11 00:45:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 00:47:00,2022-03-11 01:01:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 01:01:00,2022-03-11 01:15:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 01:17:00,2022-03-11 01:31:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 01:31:00,2022-03-11 01:45:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 01:47:00,2022-03-11 02:01:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 02:01:00,2022-03-11 02:15:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 02:17:00,2022-03-11 02:31:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 02:31:00,2022-03-11 02:45:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 02:47:00,2022-03-11 03:01:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 03:01:00,2022-03-11 03:15:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 03:17:00,2022-03-11 03:31:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 03:31:00,2022-03-11 03:45:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 03:47:00,2022-03-11 04:01:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 04:01:00,2022-03-11 04:15:00,S_48,5225,2,4374869,CKB -LINE_25,S_48,2022-03-11 04:17:00,2022-03-11 04:31:00,OPPS_21,7617,0,4374869,CKB -LINE_25,OPPS_21,2022-03-11 04:31:00,2022-03-11 04:31:00,DEPS_1,0.06,0,4374869,CKB -LINE_26,DEPS_1,2022-03-11 00:43:00,2022-03-11 00:43:00,S_49,0.06,0,4375015,CKB -LINE_26,S_49,2022-03-11 00:43:00,2022-03-11 00:53:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 00:53:00,2022-03-11 01:03:00,S_49,4408,10,4375015,CKB -LINE_26,S_49,2022-03-11 01:13:00,2022-03-11 01:23:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 01:23:00,2022-03-11 01:33:00,S_49,4408,10,4375015,CKB -LINE_26,S_49,2022-03-11 01:43:00,2022-03-11 01:53:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 01:53:00,2022-03-11 02:03:00,S_49,4408,10,4375015,CKB -LINE_26,S_49,2022-03-11 02:13:00,2022-03-11 02:23:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 02:23:00,2022-03-11 02:33:00,S_49,4408,10,4375015,CKB -LINE_26,S_49,2022-03-11 02:43:00,2022-03-11 02:53:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 02:53:00,2022-03-11 03:03:00,S_49,4408,10,4375015,CKB -LINE_26,S_49,2022-03-11 03:13:00,2022-03-11 03:23:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 03:23:00,2022-03-11 03:33:00,S_49,4408,10,4375015,CKB -LINE_26,S_49,2022-03-11 03:43:00,2022-03-11 03:53:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 03:53:00,2022-03-11 04:03:00,S_49,4408,10,4375015,CKB -LINE_26,S_49,2022-03-11 04:13:00,2022-03-11 04:23:00,S_50,4507,0,4375015,CKB -LINE_26,S_50,2022-03-11 04:23:00,2022-03-11 04:33:00,S_49,4408,0,4375015,CKB -LINE_26,S_49,2022-03-11 04:33:00,2022-03-11 04:33:00,DEPS_1,0.06,0,4375015,CKB -LINE_0,DEPS_1,2022-03-11 21:31:00,2022-03-11 21:31:00,S_0,0.06,0,4454947,CKB -LINE_0,S_0,2022-03-11 21:31:00,2022-03-11 22:04:00,S_2,14519,4,4454947,CKB -LINE_0,S_2,2022-03-11 22:08:00,2022-03-11 22:43:00,S_0,13541,8,4454947,CKB -LINE_0,S_0,2022-03-11 22:51:00,2022-03-11 23:24:00,S_2,14519,4,4454947,CKB -LINE_0,S_2,2022-03-11 23:28:00,2022-03-12 00:03:00,S_0,13541,8,4454947,CKB -LINE_0,S_0,2022-03-12 00:11:00,2022-03-12 00:44:00,S_2,14519,0,4454947,CKB -LINE_1,S_2,2022-03-12 00:44:00,2022-03-12 00:54:00,OPPS_3,4.1,25,4454947,CKB -LINE_1,OPPS_3,2022-03-12 01:19:00,2022-03-12 01:42:00,S_4,8.36,6,4454947,CKB -LINE_1,S_4,2022-03-12 01:48:00,2022-03-12 02:06:00,OPPS_3,9067,13,4454947,CKB -LINE_1,OPPS_3,2022-03-12 02:19:00,2022-03-12 02:42:00,S_4,8.36,6,4454947,CKB -LINE_1,S_4,2022-03-12 02:48:00,2022-03-12 03:06:00,OPPS_3,9067,13,4454947,CKB -LINE_1,OPPS_3,2022-03-12 03:19:00,2022-03-12 03:42:00,S_4,8.36,6,4454947,CKB -LINE_1,S_4,2022-03-12 03:48:00,2022-03-12 04:06:00,OPPS_3,9067,13,4454947,CKB -LINE_1,OPPS_3,2022-03-12 04:19:00,2022-03-12 04:42:00,S_4,8.36,6,4454947,CKB -LINE_1,S_4,2022-03-12 04:48:00,2022-03-12 05:06:00,OPPS_3,9067,13,4454947,CKB -LINE_1,OPPS_3,2022-03-12 05:19:00,2022-03-12 05:42:00,S_4,8.36,16,4454947,CKB -LINE_22,S_4,2022-03-12 05:58:00,2022-03-12 06:34:00,S_43,12968,0,4454947,CKB -LINE_22,S_43,2022-03-12 06:34:00,2022-03-12 06:34:00,DEPS_1,0.06,0,4454947,CKB -LINE_0,DEPS_1,2022-03-11 22:11:00,2022-03-11 22:11:00,S_0,0.06,0,4454952,CKB -LINE_0,S_0,2022-03-11 22:11:00,2022-03-11 22:44:00,S_2,14519,4,4454952,CKB -LINE_0,S_2,2022-03-11 22:48:00,2022-03-11 23:23:00,S_0,13541,8,4454952,CKB -LINE_0,S_0,2022-03-11 23:31:00,2022-03-12 00:04:00,S_2,14519,4,4454952,CKB -LINE_0,S_2,2022-03-12 00:08:00,2022-03-12 00:39:00,S_5,12213,0,4454952,CKB -LINE_1,S_5,2022-03-12 00:39:00,2022-03-12 00:47:00,OPPS_3,4.0,2,4454952,CKB -LINE_1,OPPS_3,2022-03-12 00:49:00,2022-03-12 01:12:00,S_4,8.36,6,4454952,CKB -LINE_1,S_4,2022-03-12 01:18:00,2022-03-12 01:36:00,OPPS_3,9067,13,4454952,CKB -LINE_1,OPPS_3,2022-03-12 01:49:00,2022-03-12 02:12:00,S_4,8.36,6,4454952,CKB -LINE_1,S_4,2022-03-12 02:18:00,2022-03-12 02:36:00,OPPS_3,9067,13,4454952,CKB -LINE_1,OPPS_3,2022-03-12 02:49:00,2022-03-12 03:12:00,S_4,8.36,6,4454952,CKB -LINE_1,S_4,2022-03-12 03:18:00,2022-03-12 03:36:00,OPPS_3,9067,13,4454952,CKB -LINE_1,OPPS_3,2022-03-12 03:49:00,2022-03-12 04:12:00,S_4,8.36,6,4454952,CKB -LINE_1,S_4,2022-03-12 04:18:00,2022-03-12 04:36:00,OPPS_3,9067,13,4454952,CKB -LINE_1,OPPS_3,2022-03-12 04:49:00,2022-03-12 05:12:00,S_4,8.36,6,4454952,CKB -LINE_1,S_4,2022-03-12 05:18:00,2022-03-12 05:36:00,OPPS_3,9067,0,4454952,CKB -LINE_1,OPPS_3,2022-03-12 05:36:00,2022-03-12 05:36:00,DEPS_1,0.06,0,4454952,CKB -LINE_2,DEPS_1,2022-03-11 21:06:00,2022-03-11 21:06:00,S_6,0.06,0,4664738,CKB -LINE_2,S_6,2022-03-11 21:06:00,2022-03-11 21:34:00,S_7,13018,19,4664738,CKB -LINE_2,S_7,2022-03-11 21:53:00,2022-03-11 22:13:00,S_8,10332,17,4664738,CKB -LINE_2,S_8,2022-03-11 22:30:00,2022-03-11 22:54:00,S_7,10.48,19,4664738,CKB -LINE_2,S_7,2022-03-11 23:13:00,2022-03-11 23:33:00,S_8,10332,17,4664738,CKB -LINE_2,S_8,2022-03-11 23:50:00,2022-03-12 00:14:00,S_7,10.48,8,4664738,CKB -LINE_2,S_7,2022-03-12 00:22:00,2022-03-12 00:27:00,S_58,2533,2,4664738,CKB -LINE_3,S_58,2022-03-12 00:29:00,2022-03-12 00:47:00,OPPS_10,7.58,0,4664738,CKB -LINE_3,OPPS_10,2022-03-12 00:47:00,2022-03-12 01:14:00,S_11,12841,3,4664738,CKB -LINE_3,S_11,2022-03-12 01:17:00,2022-03-12 01:47:00,OPPS_10,14281,0,4664738,CKB -LINE_3,OPPS_10,2022-03-12 01:47:00,2022-03-12 02:14:00,S_11,12841,3,4664738,CKB -LINE_3,S_11,2022-03-12 02:17:00,2022-03-12 02:47:00,OPPS_10,14281,0,4664738,CKB -LINE_3,OPPS_10,2022-03-12 02:47:00,2022-03-12 03:14:00,S_11,12841,3,4664738,CKB -LINE_3,S_11,2022-03-12 03:17:00,2022-03-12 03:47:00,OPPS_10,14281,0,4664738,CKB -LINE_3,OPPS_10,2022-03-12 03:47:00,2022-03-12 04:14:00,S_11,12841,3,4664738,CKB -LINE_3,S_11,2022-03-12 04:17:00,2022-03-12 04:47:00,OPPS_10,14281,0,4664738,CKB -LINE_3,OPPS_10,2022-03-12 04:47:00,2022-03-12 05:14:00,S_11,12841,3,4664738,CKB -LINE_3,S_11,2022-03-12 05:17:00,2022-03-12 05:47:00,OPPS_10,14281,0,4664738,CKB -LINE_3,OPPS_10,2022-03-12 05:47:00,2022-03-12 05:47:00,DEPS_1,0.06,0,4664738,CKB -LINE_2,DEPS_1,2022-03-11 20:26:00,2022-03-11 20:26:00,S_6,0.06,0,4762763,CKB -LINE_2,S_6,2022-03-11 20:26:00,2022-03-11 20:56:00,S_12,14097,14,4762763,CKB -LINE_2,S_12,2022-03-11 21:10:00,2022-03-11 21:38:00,S_6,13.19,8,4762763,CKB -LINE_2,S_6,2022-03-11 21:46:00,2022-03-11 22:14:00,S_7,13018,19,4762763,CKB -LINE_2,S_7,2022-03-11 22:33:00,2022-03-11 22:53:00,S_8,10332,17,4762763,CKB -LINE_2,S_8,2022-03-11 23:10:00,2022-03-11 23:34:00,S_7,10.48,19,4762763,CKB -LINE_2,S_7,2022-03-11 23:53:00,2022-03-12 00:13:00,S_8,10332,2,4762763,CKB -LINE_2,S_8,2022-03-12 00:15:00,2022-03-12 00:16:00,OPPS_10,506,1,4762763,CKB -LINE_3,OPPS_10,2022-03-12 00:17:00,2022-03-12 00:44:00,S_11,12841,3,4762763,CKB -LINE_3,S_11,2022-03-12 00:47:00,2022-03-12 01:17:00,OPPS_10,14281,0,4762763,CKB -LINE_3,OPPS_10,2022-03-12 01:17:00,2022-03-12 01:44:00,S_11,12841,3,4762763,CKB -LINE_3,S_11,2022-03-12 01:47:00,2022-03-12 02:17:00,OPPS_10,14281,0,4762763,CKB -LINE_3,OPPS_10,2022-03-12 02:17:00,2022-03-12 02:44:00,S_11,12841,3,4762763,CKB -LINE_3,S_11,2022-03-12 02:47:00,2022-03-12 03:17:00,OPPS_10,14281,0,4762763,CKB -LINE_3,OPPS_10,2022-03-12 03:17:00,2022-03-12 03:44:00,S_11,12841,3,4762763,CKB -LINE_3,S_11,2022-03-12 03:47:00,2022-03-12 04:17:00,OPPS_10,14281,0,4762763,CKB -LINE_3,OPPS_10,2022-03-12 04:17:00,2022-03-12 04:44:00,S_11,12841,3,4762763,CKB -LINE_3,S_11,2022-03-12 04:47:00,2022-03-12 05:17:00,OPPS_10,14281,0,4762763,CKB -LINE_3,OPPS_10,2022-03-12 05:17:00,2022-03-12 05:29:00,S_58,5474,0,4762763,CKB -LINE_3,S_58,2022-03-12 05:29:00,2022-03-12 05:29:00,DEPS_1,0.06,0,4762763,CKB -LINE_5,DEPS_1,2022-03-11 22:56:00,2022-03-11 22:56:00,S_14,0.06,0,4617429,CKB -LINE_5,S_14,2022-03-11 22:56:00,2022-03-11 23:08:00,S_15,5882,3,4617429,CKB -LINE_5,S_15,2022-03-11 23:11:00,2022-03-11 23:25:00,S_14,6232,0,4617429,CKB -LINE_5,S_14,2022-03-11 23:25:00,2022-03-11 23:38:00,S_15,6086,3,4617429,CKB -LINE_5,S_15,2022-03-11 23:41:00,2022-03-11 23:55:00,S_14,6232,0,4617429,CKB -LINE_5,S_14,2022-03-11 23:55:00,2022-03-12 00:08:00,S_15,6086,0,4617429,CKB -LINE_5,S_15,2022-03-12 00:08:00,2022-03-12 00:08:00,DEPS_1,0.06,0,4617429,CKB -LINE_6,DEPS_1,2022-03-11 05:05:00,2022-03-11 05:05:00,S_16,0.06,0,4426848,CKB -LINE_6,S_16,2022-03-11 05:05:00,2022-03-11 05:14:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 05:14:00,2022-03-11 05:23:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 05:25:00,2022-03-11 05:34:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 05:34:00,2022-03-11 05:43:00,S_16,5139,23,4426848,CKB -LINE_6,S_16,2022-03-11 06:06:00,2022-03-11 06:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 06:15:00,2022-03-11 06:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 06:26:00,2022-03-11 06:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 06:35:00,2022-03-11 06:44:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 06:46:00,2022-03-11 06:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 06:55:00,2022-03-11 07:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 07:06:00,2022-03-11 07:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 07:15:00,2022-03-11 07:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 07:26:00,2022-03-11 07:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 07:35:00,2022-03-11 07:44:00,S_16,5139,22,4426848,CKB -LINE_6,S_16,2022-03-11 08:06:00,2022-03-11 08:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 08:15:00,2022-03-11 08:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 08:26:00,2022-03-11 08:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 08:35:00,2022-03-11 08:44:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 08:46:00,2022-03-11 08:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 08:55:00,2022-03-11 09:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 09:06:00,2022-03-11 09:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 09:15:00,2022-03-11 09:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 09:26:00,2022-03-11 09:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 09:35:00,2022-03-11 09:44:00,S_16,5139,22,4426848,CKB -LINE_6,S_16,2022-03-11 10:06:00,2022-03-11 10:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 10:15:00,2022-03-11 10:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 10:26:00,2022-03-11 10:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 10:35:00,2022-03-11 10:44:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 10:46:00,2022-03-11 10:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 10:55:00,2022-03-11 11:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 11:06:00,2022-03-11 11:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 11:15:00,2022-03-11 11:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 11:26:00,2022-03-11 11:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 11:35:00,2022-03-11 11:44:00,S_16,5139,22,4426848,CKB -LINE_6,S_16,2022-03-11 12:06:00,2022-03-11 12:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 12:15:00,2022-03-11 12:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 12:26:00,2022-03-11 12:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 12:35:00,2022-03-11 12:44:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 12:46:00,2022-03-11 12:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 12:55:00,2022-03-11 13:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 13:06:00,2022-03-11 13:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 13:15:00,2022-03-11 13:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 13:26:00,2022-03-11 13:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 13:35:00,2022-03-11 13:44:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 13:46:00,2022-03-11 13:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 13:55:00,2022-03-11 14:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 14:06:00,2022-03-11 14:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 14:15:00,2022-03-11 14:24:00,S_16,5139,22,4426848,CKB -LINE_6,S_16,2022-03-11 14:46:00,2022-03-11 14:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 14:55:00,2022-03-11 15:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 15:06:00,2022-03-11 15:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 15:15:00,2022-03-11 15:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 15:26:00,2022-03-11 15:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 15:35:00,2022-03-11 15:44:00,S_16,5139,22,4426848,CKB -LINE_6,S_16,2022-03-11 16:06:00,2022-03-11 16:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 16:15:00,2022-03-11 16:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 16:26:00,2022-03-11 16:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 16:35:00,2022-03-11 16:44:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 16:46:00,2022-03-11 16:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 16:55:00,2022-03-11 17:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 17:06:00,2022-03-11 17:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 17:15:00,2022-03-11 17:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 17:26:00,2022-03-11 17:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 17:35:00,2022-03-11 17:44:00,S_16,5139,22,4426848,CKB -LINE_6,S_16,2022-03-11 18:06:00,2022-03-11 18:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 18:15:00,2022-03-11 18:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 18:26:00,2022-03-11 18:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 18:35:00,2022-03-11 18:44:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 18:46:00,2022-03-11 18:55:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 18:55:00,2022-03-11 19:04:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 19:06:00,2022-03-11 19:15:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 19:15:00,2022-03-11 19:24:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 19:26:00,2022-03-11 19:35:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 19:35:00,2022-03-11 19:44:00,S_16,5139,21,4426848,CKB -LINE_6,S_16,2022-03-11 20:05:00,2022-03-11 20:14:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 20:14:00,2022-03-11 20:23:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 20:25:00,2022-03-11 20:34:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 20:34:00,2022-03-11 20:43:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 20:45:00,2022-03-11 20:54:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 20:54:00,2022-03-11 21:03:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 21:05:00,2022-03-11 21:14:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 21:14:00,2022-03-11 21:23:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 21:25:00,2022-03-11 21:34:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 21:34:00,2022-03-11 21:43:00,S_16,5139,22,4426848,CKB -LINE_6,S_16,2022-03-11 22:05:00,2022-03-11 22:14:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 22:14:00,2022-03-11 22:23:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 22:25:00,2022-03-11 22:34:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 22:34:00,2022-03-11 22:43:00,S_16,5139,2,4426848,CKB -LINE_6,S_16,2022-03-11 22:45:00,2022-03-11 22:54:00,S_17,4781,0,4426848,CKB -LINE_6,S_17,2022-03-11 22:54:00,2022-03-11 23:03:00,S_16,5139,0,4426848,CKB -LINE_6,S_16,2022-03-11 23:03:00,2022-03-11 23:03:00,DEPS_1,0.06,0,4426848,CKB -LINE_9,DEPS_23,2022-03-11 05:15:00,2022-03-11 06:01:00,S_22,17.9,0,4317628,VDL -LINE_9,S_22,2022-03-11 06:01:00,2022-03-11 06:15:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 06:23:00,2022-03-11 06:37:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 06:41:00,2022-03-11 06:55:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 07:03:00,2022-03-11 07:17:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 07:21:00,2022-03-11 07:35:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 07:43:00,2022-03-11 07:57:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 08:01:00,2022-03-11 08:15:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 08:23:00,2022-03-11 08:37:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 08:41:00,2022-03-11 08:55:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 09:03:00,2022-03-11 09:17:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 09:21:00,2022-03-11 09:35:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 09:43:00,2022-03-11 09:57:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 10:01:00,2022-03-11 10:15:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 10:23:00,2022-03-11 10:37:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 10:41:00,2022-03-11 10:55:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 11:03:00,2022-03-11 11:17:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 11:21:00,2022-03-11 11:35:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 11:43:00,2022-03-11 11:57:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 12:01:00,2022-03-11 12:15:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 12:23:00,2022-03-11 12:37:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 12:41:00,2022-03-11 12:55:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 13:03:00,2022-03-11 13:17:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 13:21:00,2022-03-11 13:35:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 13:43:00,2022-03-11 13:57:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 14:01:00,2022-03-11 14:15:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 14:23:00,2022-03-11 14:37:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 14:41:00,2022-03-11 14:55:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 15:03:00,2022-03-11 15:17:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 15:21:00,2022-03-11 15:35:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 15:43:00,2022-03-11 15:57:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 16:01:00,2022-03-11 16:15:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 16:23:00,2022-03-11 16:37:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 16:41:00,2022-03-11 16:55:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 17:03:00,2022-03-11 17:17:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 17:21:00,2022-03-11 17:35:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 17:43:00,2022-03-11 17:57:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 18:01:00,2022-03-11 18:15:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 18:23:00,2022-03-11 18:37:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 18:41:00,2022-03-11 18:55:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 19:03:00,2022-03-11 19:17:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 19:21:00,2022-03-11 19:35:00,S_22,4637,8,4317628,VDL -LINE_9,S_22,2022-03-11 19:43:00,2022-03-11 19:57:00,S_22,4637,4,4317628,VDL -LINE_9,S_22,2022-03-11 20:01:00,2022-03-11 20:14:00,S_22,4637,9,4317628,VDL -LINE_9,S_22,2022-03-11 20:23:00,2022-03-11 20:36:00,S_22,4637,0,4317628,VDL -LINE_9,S_22,2022-03-11 20:36:00,2022-03-11 21:15:00,DEPS_23,19.8,0,4317628,VDL -LINE_10,DEPS_1,2022-03-11 04:56:00,2022-03-11 04:56:00,S_24,0.06,18,4425671,CKB -LINE_10,S_24,2022-03-11 05:14:00,2022-03-11 05:20:00,S_25,3.29,0,4425671,CKB -LINE_10,S_25,2022-03-11 05:20:00,2022-03-11 05:24:00,S_24,2954,20,4425671,CKB -LINE_10,S_24,2022-03-11 05:44:00,2022-03-11 05:50:00,S_25,3.29,0,4425671,CKB -LINE_10,S_25,2022-03-11 05:50:00,2022-03-11 05:54:00,S_24,2954,5,4425671,CKB -LINE_10,S_24,2022-03-11 05:59:00,2022-03-11 06:06:00,S_25,3.29,2,4425671,CKB -LINE_10,S_25,2022-03-11 06:08:00,2022-03-11 06:13:00,S_24,2954,19,4425671,CKB -LINE_10,S_24,2022-03-11 06:32:00,2022-03-11 06:39:00,S_25,3.29,1,4425671,CKB -LINE_10,S_25,2022-03-11 06:40:00,2022-03-11 06:45:00,S_24,2954,7,4425671,CKB -LINE_10,S_24,2022-03-11 06:52:00,2022-03-11 06:59:00,S_25,3.29,1,4425671,CKB -LINE_10,S_25,2022-03-11 07:00:00,2022-03-11 07:05:00,S_24,2954,7,4425671,CKB -LINE_10,S_24,2022-03-11 07:12:00,2022-03-11 07:19:00,S_25,3.29,1,4425671,CKB -LINE_10,S_25,2022-03-11 07:20:00,2022-03-11 07:25:00,S_24,2954,7,4425671,CKB -LINE_10,S_24,2022-03-11 07:32:00,2022-03-11 07:39:00,S_25,3.29,1,4425671,CKB -LINE_10,S_25,2022-03-11 07:40:00,2022-03-11 07:45:00,S_24,2954,295,4425671,CKB -LINE_10,S_24,2022-03-11 12:40:00,2022-03-11 12:47:00,S_25,3.29,2,4425671,CKB -LINE_10,S_25,2022-03-11 12:49:00,2022-03-11 12:54:00,S_24,2954,46,4425671,CKB -LINE_10,S_24,2022-03-11 13:40:00,2022-03-11 13:47:00,S_25,3.29,2,4425671,CKB -LINE_10,S_25,2022-03-11 13:49:00,2022-03-11 13:54:00,S_24,2954,434,4425671,CKB -LINE_10,S_24,2022-03-11 21:08:00,2022-03-11 21:08:00,DEPS_1,0.06,0,4425671,CKB -LINE_11,DEPS_1,2022-03-11 07:20:00,2022-03-11 07:20:00,OPPS_26,0.06,0,4448153,CKB -LINE_11,OPPS_26,2022-03-11 07:20:00,2022-03-11 07:50:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 08:00:00,2022-03-11 08:30:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 08:40:00,2022-03-11 09:10:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 09:20:00,2022-03-11 09:50:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 10:00:00,2022-03-11 10:30:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 10:40:00,2022-03-11 11:10:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 11:20:00,2022-03-11 11:50:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 12:00:00,2022-03-11 12:30:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 12:40:00,2022-03-11 13:10:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 13:20:00,2022-03-11 13:50:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 14:00:00,2022-03-11 14:30:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 14:40:00,2022-03-11 15:10:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 15:20:00,2022-03-11 15:50:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 16:00:00,2022-03-11 16:30:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 16:40:00,2022-03-11 17:10:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 17:20:00,2022-03-11 17:50:00,OPPS_26,9266,10,4448153,CKB -LINE_11,OPPS_26,2022-03-11 18:00:00,2022-03-11 18:30:00,OPPS_26,9266,0,4448153,CKB -LINE_11,OPPS_26,2022-03-11 18:30:00,2022-03-11 18:30:00,DEPS_1,0.06,0,4448153,CKB -LINE_12,DEPS_1,2022-03-11 07:10:00,2022-03-11 07:10:00,S_27,0.06,0,4733898,CKB -LINE_12,S_27,2022-03-11 07:10:00,2022-03-11 07:18:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 07:28:00,2022-03-11 07:40:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 07:40:00,2022-03-11 07:48:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 07:58:00,2022-03-11 08:10:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 08:10:00,2022-03-11 08:18:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 08:28:00,2022-03-11 08:40:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 08:40:00,2022-03-11 08:48:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 08:58:00,2022-03-11 09:10:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 09:10:00,2022-03-11 09:18:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 09:28:00,2022-03-11 09:40:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 09:40:00,2022-03-11 09:48:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 09:58:00,2022-03-11 10:10:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 10:10:00,2022-03-11 10:18:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 10:28:00,2022-03-11 10:40:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 10:40:00,2022-03-11 10:48:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 10:58:00,2022-03-11 11:10:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 11:10:00,2022-03-11 11:18:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 11:28:00,2022-03-11 11:40:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 11:40:00,2022-03-11 11:48:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 11:58:00,2022-03-11 12:10:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 12:10:00,2022-03-11 12:18:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 12:28:00,2022-03-11 12:40:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 12:40:00,2022-03-11 12:48:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 12:58:00,2022-03-11 13:10:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 13:10:00,2022-03-11 13:18:00,OPPS_28,2169,10,4733898,CKB -LINE_12,OPPS_28,2022-03-11 13:28:00,2022-03-11 13:40:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 13:40:00,2022-03-11 13:48:00,OPPS_28,2169,8,4733898,CKB -LINE_12,OPPS_28,2022-03-11 13:56:00,2022-03-11 14:10:00,S_27,2952,0,4733898,CKB -LINE_12,S_27,2022-03-11 14:10:00,2022-03-11 14:19:00,OPPS_28,2169,14,4733898,CKB -LINE_12,OPPS_28,2022-03-11 14:33:00,2022-03-11 14:47:00,S_27,2952,3,4733898,CKB -LINE_12,S_27,2022-03-11 14:50:00,2022-03-11 14:59:00,OPPS_28,2169,14,4733898,CKB -LINE_12,OPPS_28,2022-03-11 15:13:00,2022-03-11 15:27:00,S_27,2952,3,4733898,CKB -LINE_12,S_27,2022-03-11 15:30:00,2022-03-11 15:39:00,OPPS_28,2169,14,4733898,CKB -LINE_12,OPPS_28,2022-03-11 15:53:00,2022-03-11 16:07:00,S_27,2952,3,4733898,CKB -LINE_12,S_27,2022-03-11 16:10:00,2022-03-11 16:19:00,OPPS_28,2169,14,4733898,CKB -LINE_12,OPPS_28,2022-03-11 16:33:00,2022-03-11 16:47:00,S_27,2952,3,4733898,CKB -LINE_12,S_27,2022-03-11 16:50:00,2022-03-11 16:59:00,OPPS_28,2169,14,4733898,CKB -LINE_12,OPPS_28,2022-03-11 17:13:00,2022-03-11 17:27:00,S_27,2952,3,4733898,CKB -LINE_12,S_27,2022-03-11 17:30:00,2022-03-11 17:39:00,OPPS_28,2169,13,4733898,CKB -LINE_12,OPPS_28,2022-03-11 17:52:00,2022-03-11 18:05:00,S_27,2952,5,4733898,CKB -LINE_12,S_27,2022-03-11 18:10:00,2022-03-11 18:18:00,OPPS_28,2169,0,4733898,CKB -LINE_12,OPPS_28,2022-03-11 18:18:00,2022-03-11 18:18:00,DEPS_1,0.06,0,4733898,CKB -LINE_12,DEPS_1,2022-03-11 14:13:00,2022-03-11 14:13:00,OPPS_28,0.06,0,4734203,CKB -LINE_12,OPPS_28,2022-03-11 14:13:00,2022-03-11 14:27:00,S_27,2952,3,4734203,CKB -LINE_12,S_27,2022-03-11 14:30:00,2022-03-11 14:39:00,OPPS_28,2169,14,4734203,CKB -LINE_12,OPPS_28,2022-03-11 14:53:00,2022-03-11 15:07:00,S_27,2952,3,4734203,CKB -LINE_12,S_27,2022-03-11 15:10:00,2022-03-11 15:19:00,OPPS_28,2169,14,4734203,CKB -LINE_12,OPPS_28,2022-03-11 15:33:00,2022-03-11 15:47:00,S_27,2952,3,4734203,CKB -LINE_12,S_27,2022-03-11 15:50:00,2022-03-11 15:59:00,OPPS_28,2169,14,4734203,CKB -LINE_12,OPPS_28,2022-03-11 16:13:00,2022-03-11 16:27:00,S_27,2952,3,4734203,CKB -LINE_12,S_27,2022-03-11 16:30:00,2022-03-11 16:39:00,OPPS_28,2169,14,4734203,CKB -LINE_12,OPPS_28,2022-03-11 16:53:00,2022-03-11 17:07:00,S_27,2952,3,4734203,CKB -LINE_12,S_27,2022-03-11 17:10:00,2022-03-11 17:19:00,OPPS_28,2169,14,4734203,CKB -LINE_12,OPPS_28,2022-03-11 17:33:00,2022-03-11 17:47:00,S_27,2952,3,4734203,CKB -LINE_12,S_27,2022-03-11 17:50:00,2022-03-11 17:59:00,OPPS_28,2169,14,4734203,CKB -LINE_12,OPPS_28,2022-03-11 18:13:00,2022-03-11 18:25:00,S_27,2952,0,4734203,CKB -LINE_12,S_27,2022-03-11 18:25:00,2022-03-11 18:25:00,DEPS_1,0.06,0,4734203,CKB -LINE_13,DEPS_1,2022-03-12 00:23:00,2022-03-12 00:23:00,S_29,0.06,0,4318160,CKB -LINE_13,S_29,2022-03-12 00:23:00,2022-03-12 00:30:00,OPPS_30,2577,9,4318160,CKB -LINE_14,OPPS_30,2022-03-12 00:39:00,2022-03-12 00:54:00,S_31,5937,9,4318160,CKB -LINE_14,S_31,2022-03-12 01:03:00,2022-03-12 01:17:00,OPPS_30,6.19,0,4318160,CKB -LINE_13,OPPS_30,2022-03-12 01:17:00,2022-03-12 01:23:00,S_29,2555,0,4318160,CKB -LINE_13,S_29,2022-03-12 01:23:00,2022-03-12 01:30:00,OPPS_30,2577,9,4318160,CKB -LINE_14,OPPS_30,2022-03-12 01:39:00,2022-03-12 01:54:00,S_31,5937,9,4318160,CKB -LINE_14,S_31,2022-03-12 02:03:00,2022-03-12 02:17:00,OPPS_30,6.19,0,4318160,CKB -LINE_13,OPPS_30,2022-03-12 02:17:00,2022-03-12 02:23:00,S_29,2555,0,4318160,CKB -LINE_13,S_29,2022-03-12 02:23:00,2022-03-12 02:30:00,OPPS_30,2577,9,4318160,CKB -LINE_14,OPPS_30,2022-03-12 02:39:00,2022-03-12 02:54:00,S_31,5937,9,4318160,CKB -LINE_14,S_31,2022-03-12 03:03:00,2022-03-12 03:17:00,OPPS_30,6.19,0,4318160,CKB -LINE_13,OPPS_30,2022-03-12 03:17:00,2022-03-12 03:23:00,S_29,2555,0,4318160,CKB -LINE_13,S_29,2022-03-12 03:23:00,2022-03-12 03:30:00,OPPS_30,2577,9,4318160,CKB -LINE_14,OPPS_30,2022-03-12 03:39:00,2022-03-12 03:54:00,S_31,5937,9,4318160,CKB -LINE_14,S_31,2022-03-12 04:03:00,2022-03-12 04:17:00,OPPS_30,6.19,0,4318160,CKB -LINE_13,OPPS_30,2022-03-12 04:17:00,2022-03-12 04:23:00,S_29,2555,0,4318160,CKB -LINE_13,S_29,2022-03-12 04:23:00,2022-03-12 04:30:00,OPPS_30,2577,9,4318160,CKB -LINE_14,OPPS_30,2022-03-12 04:39:00,2022-03-12 04:54:00,S_31,5937,9,4318160,CKB -LINE_14,S_31,2022-03-12 05:03:00,2022-03-12 05:17:00,OPPS_30,6.19,0,4318160,CKB -LINE_15,OPPS_30,2022-03-12 05:17:00,2022-03-12 05:38:00,S_33,12.0,28,4318160,CKB -LINE_15,S_33,2022-03-12 06:06:00,2022-03-12 06:11:00,OPPS_32,2936,16,4318160,CKB -LINE_15,OPPS_32,2022-03-12 06:27:00,2022-03-12 06:36:00,S_33,4343,10,4318160,CKB -LINE_15,S_33,2022-03-12 06:46:00,2022-03-12 06:51:00,OPPS_32,2936,0,4318160,CKB -LINE_10,OPPS_32,2022-03-12 06:51:00,2022-03-12 07:00:00,S_24,4.6,12,4318160,CKB -LINE_10,S_24,2022-03-12 07:12:00,2022-03-12 07:12:00,S_24,0.0,836,4318160,CKB -LINE_10,S_24,2022-03-12 21:08:00,2022-03-12 21:08:00,S_24,0.0,0,4318160,CKB -LINE_10,S_24,2022-03-12 21:08:00,2022-03-12 21:08:00,DEPS_1,0.06,0,4318160,CKB -LINE_14,DEPS_1,2022-03-12 00:33:00,2022-03-12 00:33:00,S_31,0.06,0,4318180,CKB -LINE_14,S_31,2022-03-12 00:33:00,2022-03-12 00:47:00,OPPS_30,6.19,0,4318180,CKB -LINE_13,OPPS_30,2022-03-12 00:47:00,2022-03-12 00:53:00,S_29,2555,0,4318180,CKB -LINE_13,S_29,2022-03-12 00:53:00,2022-03-12 01:00:00,OPPS_30,2577,9,4318180,CKB -LINE_14,OPPS_30,2022-03-12 01:09:00,2022-03-12 01:24:00,S_31,5937,9,4318180,CKB -LINE_14,S_31,2022-03-12 01:33:00,2022-03-12 01:47:00,OPPS_30,6.19,0,4318180,CKB -LINE_13,OPPS_30,2022-03-12 01:47:00,2022-03-12 01:53:00,S_29,2555,0,4318180,CKB -LINE_13,S_29,2022-03-12 01:53:00,2022-03-12 02:00:00,OPPS_30,2577,9,4318180,CKB -LINE_14,OPPS_30,2022-03-12 02:09:00,2022-03-12 02:24:00,S_31,5937,9,4318180,CKB -LINE_14,S_31,2022-03-12 02:33:00,2022-03-12 02:47:00,OPPS_30,6.19,0,4318180,CKB -LINE_13,OPPS_30,2022-03-12 02:47:00,2022-03-12 02:53:00,S_29,2555,0,4318180,CKB -LINE_13,S_29,2022-03-12 02:53:00,2022-03-12 03:00:00,OPPS_30,2577,9,4318180,CKB -LINE_14,OPPS_30,2022-03-12 03:09:00,2022-03-12 03:24:00,S_31,5937,9,4318180,CKB -LINE_14,S_31,2022-03-12 03:33:00,2022-03-12 03:47:00,OPPS_30,6.19,0,4318180,CKB -LINE_13,OPPS_30,2022-03-12 03:47:00,2022-03-12 03:53:00,S_29,2555,0,4318180,CKB -LINE_13,S_29,2022-03-12 03:53:00,2022-03-12 04:00:00,OPPS_30,2577,9,4318180,CKB -LINE_14,OPPS_30,2022-03-12 04:09:00,2022-03-12 04:24:00,S_31,5937,9,4318180,CKB -LINE_14,S_31,2022-03-12 04:33:00,2022-03-12 04:47:00,OPPS_30,6.19,0,4318180,CKB -LINE_13,OPPS_30,2022-03-12 04:47:00,2022-03-12 04:53:00,S_29,2555,0,4318180,CKB -LINE_13,S_29,2022-03-12 04:53:00,2022-03-12 05:00:00,OPPS_30,2577,9,4318180,CKB -LINE_14,OPPS_30,2022-03-12 05:09:00,2022-03-12 05:24:00,S_31,5937,0,4318180,CKB -LINE_14,S_31,2022-03-12 05:24:00,2022-03-12 05:24:00,DEPS_1,0.06,0,4318180,CKB -LINE_15,DEPS_1,2022-03-12 00:57:00,2022-03-12 00:57:00,OPPS_32,0.06,0,4319355,CKB -LINE_15,OPPS_32,2022-03-12 00:57:00,2022-03-12 01:06:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 01:06:00,2022-03-12 01:11:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 01:27:00,2022-03-12 01:36:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 01:36:00,2022-03-12 01:41:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 01:57:00,2022-03-12 02:06:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 02:06:00,2022-03-12 02:11:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 02:27:00,2022-03-12 02:36:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 02:36:00,2022-03-12 02:41:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 02:57:00,2022-03-12 03:06:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 03:06:00,2022-03-12 03:11:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 03:27:00,2022-03-12 03:36:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 03:36:00,2022-03-12 03:41:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 03:57:00,2022-03-12 04:06:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 04:06:00,2022-03-12 04:11:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 04:27:00,2022-03-12 04:36:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 04:36:00,2022-03-12 04:41:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 04:57:00,2022-03-12 05:06:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 05:06:00,2022-03-12 05:11:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 05:27:00,2022-03-12 05:36:00,S_33,4343,0,4319355,CKB -LINE_15,S_33,2022-03-12 05:36:00,2022-03-12 05:41:00,OPPS_32,2936,16,4319355,CKB -LINE_15,OPPS_32,2022-03-12 05:57:00,2022-03-12 06:06:00,S_33,4343,20,4319355,CKB -LINE_15,S_33,2022-03-12 06:26:00,2022-03-12 06:31:00,OPPS_32,2936,0,4319355,CKB -LINE_15,OPPS_32,2022-03-12 06:31:00,2022-03-12 06:31:00,DEPS_1,0.06,0,4319355,CKB -LINE_17,DEPS_1,2022-03-12 00:30:00,2022-03-12 00:30:00,S_34,0.06,0,4453548,CKB -LINE_17,S_34,2022-03-12 00:30:00,2022-03-12 00:44:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 00:44:00,2022-03-12 00:57:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 01:00:00,2022-03-12 01:14:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 01:14:00,2022-03-12 01:27:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 01:30:00,2022-03-12 01:44:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 01:44:00,2022-03-12 01:57:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 02:00:00,2022-03-12 02:14:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 02:14:00,2022-03-12 02:27:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 02:30:00,2022-03-12 02:44:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 02:44:00,2022-03-12 02:57:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 03:00:00,2022-03-12 03:14:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 03:14:00,2022-03-12 03:27:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 03:30:00,2022-03-12 03:44:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 03:44:00,2022-03-12 03:57:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 04:00:00,2022-03-12 04:14:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 04:14:00,2022-03-12 04:27:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 04:30:00,2022-03-12 04:44:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 04:44:00,2022-03-12 04:57:00,S_34,5302,3,4453548,CKB -LINE_17,S_34,2022-03-12 05:00:00,2022-03-12 05:14:00,S_36,4801,0,4453548,CKB -LINE_17,S_36,2022-03-12 05:14:00,2022-03-12 05:27:00,S_34,5302,0,4453548,CKB -LINE_17,S_34,2022-03-12 05:27:00,2022-03-12 05:27:00,DEPS_1,0.06,0,4453548,CKB -LINE_20,DEPS_1,2022-03-12 00:32:00,2022-03-12 00:32:00,S_13,0.06,0,4747653,CKB -LINE_20,S_13,2022-03-12 00:32:00,2022-03-12 00:44:00,S_40,4212,3,4747653,CKB -LINE_20,S_40,2022-03-12 00:47:00,2022-03-12 01:16:00,S_41,13048,0,4747653,CKB -LINE_20,S_41,2022-03-12 01:16:00,2022-03-12 01:42:00,S_40,12869,5,4747653,CKB -LINE_20,S_40,2022-03-12 01:47:00,2022-03-12 02:16:00,S_41,13048,0,4747653,CKB -LINE_20,S_41,2022-03-12 02:16:00,2022-03-12 02:42:00,S_40,12869,5,4747653,CKB -LINE_20,S_40,2022-03-12 02:47:00,2022-03-12 03:16:00,S_41,13048,0,4747653,CKB -LINE_20,S_41,2022-03-12 03:16:00,2022-03-12 03:42:00,S_40,12869,5,4747653,CKB -LINE_20,S_40,2022-03-12 03:47:00,2022-03-12 04:16:00,S_41,13048,0,4747653,CKB -LINE_20,S_41,2022-03-12 04:16:00,2022-03-12 04:42:00,S_40,12869,5,4747653,CKB -LINE_20,S_40,2022-03-12 04:47:00,2022-03-12 05:16:00,S_41,13048,0,4747653,CKB -LINE_20,S_41,2022-03-12 05:16:00,2022-03-12 05:34:00,DEPS_42,9538,0,4747653,CKB -LINE_20,DEPS_42,2022-03-12 05:34:00,2022-03-12 05:34:00,DEPS_1,0.06,0,4747653,CKB -LINE_20,DEPS_1,2022-03-12 00:17:00,2022-03-12 00:17:00,S_40,0.06,0,4747663,CKB -LINE_20,S_40,2022-03-12 00:17:00,2022-03-12 00:46:00,S_41,13048,0,4747663,CKB -LINE_20,S_41,2022-03-12 00:46:00,2022-03-12 01:12:00,S_40,12869,5,4747663,CKB -LINE_20,S_40,2022-03-12 01:17:00,2022-03-12 01:46:00,S_41,13048,0,4747663,CKB -LINE_20,S_41,2022-03-12 01:46:00,2022-03-12 02:12:00,S_40,12869,5,4747663,CKB -LINE_20,S_40,2022-03-12 02:17:00,2022-03-12 02:46:00,S_41,13048,0,4747663,CKB -LINE_20,S_41,2022-03-12 02:46:00,2022-03-12 03:12:00,S_40,12869,5,4747663,CKB -LINE_20,S_40,2022-03-12 03:17:00,2022-03-12 03:46:00,S_41,13048,0,4747663,CKB -LINE_20,S_41,2022-03-12 03:46:00,2022-03-12 04:12:00,S_40,12869,5,4747663,CKB -LINE_20,S_40,2022-03-12 04:17:00,2022-03-12 04:46:00,S_41,13048,0,4747663,CKB -LINE_20,S_41,2022-03-12 04:46:00,2022-03-12 05:12:00,S_40,12869,0,4747663,CKB -LINE_20,S_40,2022-03-12 05:12:00,2022-03-12 05:12:00,DEPS_1,0.06,0,4747663,CKB -LINE_21,DEPS_1,2022-03-12 00:49:00,2022-03-12 00:49:00,OPPS_3,0.06,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 00:49:00,2022-03-12 01:04:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 01:04:00,2022-03-12 01:19:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 01:19:00,2022-03-12 01:34:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 01:34:00,2022-03-12 01:49:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 01:49:00,2022-03-12 02:04:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 02:04:00,2022-03-12 02:19:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 02:19:00,2022-03-12 02:34:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 02:34:00,2022-03-12 02:49:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 02:49:00,2022-03-12 03:04:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 03:04:00,2022-03-12 03:19:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 03:19:00,2022-03-12 03:34:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 03:34:00,2022-03-12 03:49:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 03:49:00,2022-03-12 04:04:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 04:04:00,2022-03-12 04:19:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 04:19:00,2022-03-12 04:34:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 04:34:00,2022-03-12 04:49:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 04:49:00,2022-03-12 05:04:00,S_16,10229,0,4434344,CKB -LINE_21,S_16,2022-03-12 05:04:00,2022-03-12 05:19:00,OPPS_3,11801,0,4434344,CKB -LINE_21,OPPS_3,2022-03-12 05:19:00,2022-03-12 05:19:00,DEPS_1,0.06,0,4434344,CKB -LINE_23,DEPS_1,2022-03-12 02:34:00,2022-03-12 02:34:00,S_45,0.06,0,4514364,CKB -LINE_23,S_45,2022-03-12 02:34:00,2022-03-12 03:00:00,S_46,9016,0,4514364,CKB -LINE_23,S_46,2022-03-12 03:00:00,2022-03-12 03:27:00,S_45,10083,7,4514364,CKB -LINE_23,S_45,2022-03-12 03:34:00,2022-03-12 04:00:00,S_46,9016,0,4514364,CKB -LINE_23,S_46,2022-03-12 04:00:00,2022-03-12 04:27:00,S_45,10083,7,4514364,CKB -LINE_23,S_45,2022-03-12 04:34:00,2022-03-12 05:00:00,S_46,9016,0,4514364,CKB -LINE_23,S_46,2022-03-12 05:00:00,2022-03-12 05:27:00,S_45,10083,0,4514364,CKB -LINE_23,S_45,2022-03-12 05:27:00,2022-03-12 05:27:00,DEPS_1,0.06,0,4514364,CKB -LINE_23,DEPS_1,2022-03-12 02:04:00,2022-03-12 02:04:00,S_45,0.06,0,4619999,CKB -LINE_23,S_45,2022-03-12 02:04:00,2022-03-12 02:30:00,S_46,9016,0,4619999,CKB -LINE_23,S_46,2022-03-12 02:30:00,2022-03-12 02:57:00,S_45,10083,7,4619999,CKB -LINE_23,S_45,2022-03-12 03:04:00,2022-03-12 03:30:00,S_46,9016,0,4619999,CKB -LINE_23,S_46,2022-03-12 03:30:00,2022-03-12 03:57:00,S_45,10083,7,4619999,CKB -LINE_23,S_45,2022-03-12 04:04:00,2022-03-12 04:30:00,S_46,9016,0,4619999,CKB -LINE_23,S_46,2022-03-12 04:30:00,2022-03-12 04:57:00,S_45,10083,7,4619999,CKB -LINE_23,S_45,2022-03-12 05:04:00,2022-03-12 05:30:00,S_46,9016,0,4619999,CKB -LINE_23,S_46,2022-03-12 05:30:00,2022-03-12 05:30:00,DEPS_1,0.06,0,4619999,CKB -LINE_24,DEPS_1,2022-03-12 00:31:00,2022-03-12 00:31:00,OPPS_21,0.06,0,4374747,CKB -LINE_24,OPPS_21,2022-03-12 00:31:00,2022-03-12 00:44:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 00:44:00,2022-03-12 00:56:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 01:01:00,2022-03-12 01:14:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 01:14:00,2022-03-12 01:26:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 01:31:00,2022-03-12 01:44:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 01:44:00,2022-03-12 01:56:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 02:01:00,2022-03-12 02:14:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 02:14:00,2022-03-12 02:26:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 02:31:00,2022-03-12 02:44:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 02:44:00,2022-03-12 02:56:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 03:01:00,2022-03-12 03:14:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 03:14:00,2022-03-12 03:26:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 03:31:00,2022-03-12 03:44:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 03:44:00,2022-03-12 03:56:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 04:01:00,2022-03-12 04:14:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 04:14:00,2022-03-12 04:26:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 04:31:00,2022-03-12 04:44:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 04:44:00,2022-03-12 04:56:00,OPPS_21,5362,5,4374747,CKB -LINE_24,OPPS_21,2022-03-12 05:01:00,2022-03-12 05:14:00,S_47,4872,0,4374747,CKB -LINE_24,S_47,2022-03-12 05:14:00,2022-03-12 05:26:00,OPPS_21,5362,0,4374747,CKB -LINE_24,OPPS_21,2022-03-12 05:26:00,2022-03-12 05:26:00,DEPS_1,0.06,0,4374747,CKB -LINE_25,DEPS_1,2022-03-12 00:31:00,2022-03-12 00:31:00,OPPS_21,0.06,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 00:31:00,2022-03-12 00:45:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 00:47:00,2022-03-12 01:01:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 01:01:00,2022-03-12 01:15:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 01:17:00,2022-03-12 01:31:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 01:31:00,2022-03-12 01:45:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 01:47:00,2022-03-12 02:01:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 02:01:00,2022-03-12 02:15:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 02:17:00,2022-03-12 02:31:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 02:31:00,2022-03-12 02:45:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 02:47:00,2022-03-12 03:01:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 03:01:00,2022-03-12 03:15:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 03:17:00,2022-03-12 03:31:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 03:31:00,2022-03-12 03:45:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 03:47:00,2022-03-12 04:01:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 04:01:00,2022-03-12 04:15:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 04:17:00,2022-03-12 04:31:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 04:31:00,2022-03-12 04:45:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 04:47:00,2022-03-12 05:01:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 05:01:00,2022-03-12 05:15:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 05:17:00,2022-03-12 05:31:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 05:31:00,2022-03-12 05:45:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 05:47:00,2022-03-12 06:01:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 06:01:00,2022-03-12 06:15:00,S_48,5225,2,4374870,CKB -LINE_25,S_48,2022-03-12 06:17:00,2022-03-12 06:31:00,OPPS_21,7617,0,4374870,CKB -LINE_25,OPPS_21,2022-03-12 06:31:00,2022-03-12 06:45:00,S_48,5096,0,4374870,CKB -LINE_25,S_48,2022-03-12 06:45:00,2022-03-12 06:45:00,DEPS_1,0.06,0,4374870,CKB -LINE_26,DEPS_1,2022-03-12 00:43:00,2022-03-12 00:43:00,S_49,0.06,0,4375016,CKB -LINE_26,S_49,2022-03-12 00:43:00,2022-03-12 00:53:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 00:53:00,2022-03-12 01:03:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 01:13:00,2022-03-12 01:23:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 01:23:00,2022-03-12 01:33:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 01:43:00,2022-03-12 01:53:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 01:53:00,2022-03-12 02:03:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 02:13:00,2022-03-12 02:23:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 02:23:00,2022-03-12 02:33:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 02:43:00,2022-03-12 02:53:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 02:53:00,2022-03-12 03:03:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 03:13:00,2022-03-12 03:23:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 03:23:00,2022-03-12 03:33:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 03:43:00,2022-03-12 03:53:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 03:53:00,2022-03-12 04:03:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 04:13:00,2022-03-12 04:23:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 04:23:00,2022-03-12 04:33:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 04:43:00,2022-03-12 04:53:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 04:53:00,2022-03-12 05:03:00,S_49,4408,10,4375016,CKB -LINE_26,S_49,2022-03-12 05:13:00,2022-03-12 05:23:00,S_50,4507,0,4375016,CKB -LINE_26,S_50,2022-03-12 05:23:00,2022-03-12 05:23:00,DEPS_1,0.06,0,4375016,CKB -LINE_0,DEPS_1,2022-03-12 20:51:00,2022-03-12 20:51:00,S_0,0.06,0,4454966,CKB -LINE_0,S_0,2022-03-12 20:51:00,2022-03-12 21:24:00,S_2,14519,4,4454966,CKB -LINE_0,S_2,2022-03-12 21:28:00,2022-03-12 22:03:00,S_0,13541,8,4454966,CKB -LINE_0,S_0,2022-03-12 22:11:00,2022-03-12 22:44:00,S_2,14519,4,4454966,CKB -LINE_0,S_2,2022-03-12 22:48:00,2022-03-12 23:23:00,S_0,13541,8,4454966,CKB -LINE_0,S_0,2022-03-12 23:31:00,2022-03-13 00:04:00,S_2,14519,4,4454966,CKB -LINE_0,S_2,2022-03-13 00:08:00,2022-03-13 00:39:00,S_5,12213,0,4454966,CKB -LINE_1,S_5,2022-03-13 00:39:00,2022-03-13 00:47:00,OPPS_3,4.0,2,4454966,CKB -LINE_1,OPPS_3,2022-03-13 00:49:00,2022-03-13 01:12:00,S_4,8.36,6,4454966,CKB -LINE_1,S_4,2022-03-13 01:18:00,2022-03-13 01:36:00,OPPS_3,9067,13,4454966,CKB -LINE_1,OPPS_3,2022-03-13 01:49:00,2022-03-13 02:12:00,S_4,8.36,6,4454966,CKB -LINE_1,S_4,2022-03-13 02:18:00,2022-03-13 02:36:00,OPPS_3,9067,13,4454966,CKB -LINE_1,OPPS_3,2022-03-13 02:49:00,2022-03-13 03:12:00,S_4,8.36,6,4454966,CKB -LINE_1,S_4,2022-03-13 03:18:00,2022-03-13 03:36:00,OPPS_3,9067,13,4454966,CKB -LINE_1,OPPS_3,2022-03-13 03:49:00,2022-03-13 04:12:00,S_4,8.36,6,4454966,CKB -LINE_1,S_4,2022-03-13 04:18:00,2022-03-13 04:36:00,OPPS_3,9067,13,4454966,CKB -LINE_1,OPPS_3,2022-03-13 04:49:00,2022-03-13 05:12:00,S_4,8.36,6,4454966,CKB -LINE_1,S_4,2022-03-13 05:18:00,2022-03-13 05:36:00,OPPS_3,9067,13,4454966,CKB -LINE_1,OPPS_3,2022-03-13 05:49:00,2022-03-13 06:08:00,S_4,8762,10,4454966,CKB -LINE_1,S_4,2022-03-13 06:18:00,2022-03-13 06:36:00,OPPS_3,9067,13,4454966,CKB -LINE_1,OPPS_3,2022-03-13 06:49:00,2022-03-13 07:08:00,S_4,8762,0,4454966,CKB -LINE_1,S_4,2022-03-13 07:08:00,2022-03-13 07:08:00,DEPS_1,0.06,0,4454966,CKB -LINE_0,DEPS_1,2022-03-12 21:31:00,2022-03-12 21:31:00,S_0,0.06,0,4454967,CKB -LINE_0,S_0,2022-03-12 21:31:00,2022-03-12 22:04:00,S_2,14519,4,4454967,CKB -LINE_0,S_2,2022-03-12 22:08:00,2022-03-12 22:43:00,S_0,13541,8,4454967,CKB -LINE_0,S_0,2022-03-12 22:51:00,2022-03-12 23:24:00,S_2,14519,4,4454967,CKB -LINE_0,S_2,2022-03-12 23:28:00,2022-03-13 00:03:00,S_0,13541,8,4454967,CKB -LINE_0,S_0,2022-03-13 00:11:00,2022-03-13 00:44:00,S_2,14519,0,4454967,CKB -LINE_1,S_2,2022-03-13 00:44:00,2022-03-13 00:54:00,OPPS_3,4.1,25,4454967,CKB -LINE_1,OPPS_3,2022-03-13 01:19:00,2022-03-13 01:42:00,S_4,8.36,6,4454967,CKB -LINE_1,S_4,2022-03-13 01:48:00,2022-03-13 02:06:00,OPPS_3,9067,13,4454967,CKB -LINE_1,OPPS_3,2022-03-13 02:19:00,2022-03-13 02:42:00,S_4,8.36,6,4454967,CKB -LINE_1,S_4,2022-03-13 02:48:00,2022-03-13 03:06:00,OPPS_3,9067,13,4454967,CKB -LINE_1,OPPS_3,2022-03-13 03:19:00,2022-03-13 03:42:00,S_4,8.36,6,4454967,CKB -LINE_1,S_4,2022-03-13 03:48:00,2022-03-13 04:06:00,OPPS_3,9067,13,4454967,CKB -LINE_1,OPPS_3,2022-03-13 04:19:00,2022-03-13 04:42:00,S_4,8.36,6,4454967,CKB -LINE_1,S_4,2022-03-13 04:48:00,2022-03-13 05:06:00,OPPS_3,9067,13,4454967,CKB -LINE_1,OPPS_3,2022-03-13 05:19:00,2022-03-13 05:42:00,S_4,8.36,6,4454967,CKB -LINE_1,S_4,2022-03-13 05:48:00,2022-03-13 06:06:00,OPPS_3,9067,0,4454967,CKB -LINE_1,OPPS_3,2022-03-13 06:06:00,2022-03-13 06:06:00,DEPS_1,0.06,0,4454967,CKB -LINE_2,DEPS_1,2022-03-12 21:06:00,2022-03-12 21:06:00,S_6,0.06,0,4664765,CKB -LINE_2,S_6,2022-03-12 21:06:00,2022-03-12 21:34:00,S_7,13018,19,4664765,CKB -LINE_2,S_7,2022-03-12 21:53:00,2022-03-12 22:13:00,S_8,10332,17,4664765,CKB -LINE_2,S_8,2022-03-12 22:30:00,2022-03-12 22:54:00,S_7,10.48,19,4664765,CKB -LINE_2,S_7,2022-03-12 23:13:00,2022-03-12 23:33:00,S_8,10332,17,4664765,CKB -LINE_2,S_8,2022-03-12 23:50:00,2022-03-13 00:14:00,S_7,10.48,8,4664765,CKB -LINE_2,S_7,2022-03-13 00:22:00,2022-03-13 00:27:00,S_58,2533,2,4664765,CKB -LINE_3,S_58,2022-03-13 00:29:00,2022-03-13 00:47:00,OPPS_10,7.58,0,4664765,CKB -LINE_3,OPPS_10,2022-03-13 00:47:00,2022-03-13 01:14:00,S_11,12841,3,4664765,CKB -LINE_3,S_11,2022-03-13 01:17:00,2022-03-13 01:47:00,OPPS_10,14281,0,4664765,CKB -LINE_3,OPPS_10,2022-03-13 01:47:00,2022-03-13 02:14:00,S_11,12841,3,4664765,CKB -LINE_3,S_11,2022-03-13 02:17:00,2022-03-13 02:47:00,OPPS_10,14281,0,4664765,CKB -LINE_3,OPPS_10,2022-03-13 02:47:00,2022-03-13 03:14:00,S_11,12841,3,4664765,CKB -LINE_3,S_11,2022-03-13 03:17:00,2022-03-13 03:47:00,OPPS_10,14281,0,4664765,CKB -LINE_3,OPPS_10,2022-03-13 03:47:00,2022-03-13 04:14:00,S_11,12841,3,4664765,CKB -LINE_3,S_11,2022-03-13 04:17:00,2022-03-13 04:47:00,OPPS_10,14281,0,4664765,CKB -LINE_3,OPPS_10,2022-03-13 04:47:00,2022-03-13 05:14:00,S_11,12841,3,4664765,CKB -LINE_3,S_11,2022-03-13 05:17:00,2022-03-13 05:47:00,OPPS_10,14281,0,4664765,CKB -LINE_3,OPPS_10,2022-03-13 05:47:00,2022-03-13 06:14:00,S_11,12841,3,4664765,CKB -LINE_3,S_11,2022-03-13 06:17:00,2022-03-13 06:47:00,OPPS_10,14281,0,4664765,CKB -LINE_3,OPPS_10,2022-03-13 06:47:00,2022-03-13 06:59:00,S_58,5474,0,4664765,CKB -LINE_3,S_58,2022-03-13 06:59:00,2022-03-13 06:59:00,DEPS_1,0.06,0,4664765,CKB -LINE_2,DEPS_1,2022-03-12 20:26:00,2022-03-12 20:26:00,S_6,0.06,0,4762771,CKB -LINE_2,S_6,2022-03-12 20:26:00,2022-03-12 20:56:00,S_12,14097,14,4762771,CKB -LINE_2,S_12,2022-03-12 21:10:00,2022-03-12 21:38:00,S_6,13.19,8,4762771,CKB -LINE_2,S_6,2022-03-12 21:46:00,2022-03-12 22:14:00,S_7,13018,19,4762771,CKB -LINE_2,S_7,2022-03-12 22:33:00,2022-03-12 22:53:00,S_8,10332,17,4762771,CKB -LINE_2,S_8,2022-03-12 23:10:00,2022-03-12 23:34:00,S_7,10.48,19,4762771,CKB -LINE_2,S_7,2022-03-12 23:53:00,2022-03-13 00:13:00,S_8,10332,2,4762771,CKB -LINE_2,S_8,2022-03-13 00:15:00,2022-03-13 00:16:00,OPPS_10,506,1,4762771,CKB -LINE_3,OPPS_10,2022-03-13 00:17:00,2022-03-13 00:44:00,S_11,12841,3,4762771,CKB -LINE_3,S_11,2022-03-13 00:47:00,2022-03-13 01:17:00,OPPS_10,14281,0,4762771,CKB -LINE_3,OPPS_10,2022-03-13 01:17:00,2022-03-13 01:44:00,S_11,12841,3,4762771,CKB -LINE_3,S_11,2022-03-13 01:47:00,2022-03-13 02:17:00,OPPS_10,14281,0,4762771,CKB -LINE_3,OPPS_10,2022-03-13 02:17:00,2022-03-13 02:44:00,S_11,12841,3,4762771,CKB -LINE_3,S_11,2022-03-13 02:47:00,2022-03-13 03:17:00,OPPS_10,14281,0,4762771,CKB -LINE_3,OPPS_10,2022-03-13 03:17:00,2022-03-13 03:44:00,S_11,12841,3,4762771,CKB -LINE_3,S_11,2022-03-13 03:47:00,2022-03-13 04:17:00,OPPS_10,14281,0,4762771,CKB -LINE_3,OPPS_10,2022-03-13 04:17:00,2022-03-13 04:44:00,S_11,12841,3,4762771,CKB -LINE_3,S_11,2022-03-13 04:47:00,2022-03-13 05:17:00,OPPS_10,14281,0,4762771,CKB -LINE_3,OPPS_10,2022-03-13 05:17:00,2022-03-13 05:44:00,S_11,12841,3,4762771,CKB -LINE_3,S_11,2022-03-13 05:47:00,2022-03-13 06:17:00,OPPS_10,14281,0,4762771,CKB -LINE_3,OPPS_10,2022-03-13 06:17:00,2022-03-13 06:44:00,S_11,12841,3,4762771,CKB -LINE_3,S_11,2022-03-13 06:47:00,2022-03-13 07:17:00,OPPS_10,14281,0,4762771,CKB -LINE_3,OPPS_10,2022-03-13 07:17:00,2022-03-13 07:17:00,DEPS_1,0.06,0,4762771,CKB -LINE_5,DEPS_1,2022-03-12 20:26:00,2022-03-12 20:26:00,S_14,0.06,0,4617438,CKB -LINE_5,S_14,2022-03-12 20:26:00,2022-03-12 20:38:00,S_15,5882,3,4617438,CKB -LINE_5,S_15,2022-03-12 20:41:00,2022-03-12 20:55:00,S_14,6232,0,4617438,CKB -LINE_5,S_14,2022-03-12 20:55:00,2022-03-12 21:08:00,S_15,6086,3,4617438,CKB -LINE_5,S_15,2022-03-12 21:11:00,2022-03-12 21:25:00,S_14,6232,0,4617438,CKB -LINE_5,S_14,2022-03-12 21:25:00,2022-03-12 21:38:00,S_15,6086,3,4617438,CKB -LINE_5,S_15,2022-03-12 21:41:00,2022-03-12 21:55:00,S_14,6232,0,4617438,CKB -LINE_5,S_14,2022-03-12 21:55:00,2022-03-12 22:08:00,S_15,6086,3,4617438,CKB -LINE_5,S_15,2022-03-12 22:11:00,2022-03-12 22:25:00,S_14,6232,0,4617438,CKB -LINE_5,S_14,2022-03-12 22:25:00,2022-03-12 22:38:00,S_15,6086,3,4617438,CKB -LINE_5,S_15,2022-03-12 22:41:00,2022-03-12 22:55:00,S_14,6232,0,4617438,CKB -LINE_5,S_14,2022-03-12 22:55:00,2022-03-12 23:08:00,S_15,6086,3,4617438,CKB -LINE_5,S_15,2022-03-12 23:11:00,2022-03-12 23:25:00,S_14,6232,0,4617438,CKB -LINE_5,S_14,2022-03-12 23:25:00,2022-03-12 23:38:00,S_15,6086,3,4617438,CKB -LINE_5,S_15,2022-03-12 23:41:00,2022-03-12 23:55:00,S_14,6232,0,4617438,CKB -LINE_5,S_14,2022-03-12 23:55:00,2022-03-13 00:08:00,S_15,6086,0,4617438,CKB -LINE_5,S_15,2022-03-13 00:08:00,2022-03-13 00:08:00,DEPS_1,0.06,0,4617438,CKB -LINE_6,DEPS_1,2022-03-12 05:25:00,2022-03-12 05:25:00,S_16,0.06,0,4426894,CKB -LINE_6,S_16,2022-03-12 05:25:00,2022-03-12 05:34:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 05:34:00,2022-03-12 05:43:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 06:05:00,2022-03-12 06:14:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 06:14:00,2022-03-12 06:23:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 06:25:00,2022-03-12 06:34:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 06:34:00,2022-03-12 06:43:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 06:45:00,2022-03-12 06:54:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 06:54:00,2022-03-12 07:03:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 07:05:00,2022-03-12 07:14:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 07:14:00,2022-03-12 07:23:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 07:25:00,2022-03-12 07:34:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 07:34:00,2022-03-12 07:43:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 08:05:00,2022-03-12 08:14:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 08:14:00,2022-03-12 08:23:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 08:25:00,2022-03-12 08:34:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 08:34:00,2022-03-12 08:43:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 08:45:00,2022-03-12 08:54:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 08:54:00,2022-03-12 09:03:00,S_16,5139,3,4426894,CKB -LINE_6,S_16,2022-03-12 09:06:00,2022-03-12 09:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 09:15:00,2022-03-12 09:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 09:26:00,2022-03-12 09:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 09:35:00,2022-03-12 09:44:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 10:06:00,2022-03-12 10:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 10:15:00,2022-03-12 10:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 10:26:00,2022-03-12 10:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 10:35:00,2022-03-12 10:44:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 10:46:00,2022-03-12 10:55:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 10:55:00,2022-03-12 11:04:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 11:06:00,2022-03-12 11:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 11:15:00,2022-03-12 11:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 11:26:00,2022-03-12 11:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 11:35:00,2022-03-12 11:44:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 12:06:00,2022-03-12 12:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 12:15:00,2022-03-12 12:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 12:26:00,2022-03-12 12:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 12:35:00,2022-03-12 12:44:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 12:46:00,2022-03-12 12:55:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 12:55:00,2022-03-12 13:04:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 13:06:00,2022-03-12 13:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 13:15:00,2022-03-12 13:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 13:26:00,2022-03-12 13:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 13:35:00,2022-03-12 13:44:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 14:06:00,2022-03-12 14:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 14:15:00,2022-03-12 14:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 14:26:00,2022-03-12 14:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 14:35:00,2022-03-12 14:44:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 14:46:00,2022-03-12 14:55:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 14:55:00,2022-03-12 15:04:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 15:06:00,2022-03-12 15:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 15:15:00,2022-03-12 15:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 15:26:00,2022-03-12 15:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 15:35:00,2022-03-12 15:44:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 16:06:00,2022-03-12 16:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 16:15:00,2022-03-12 16:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 16:26:00,2022-03-12 16:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 16:35:00,2022-03-12 16:44:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 16:46:00,2022-03-12 16:55:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 16:55:00,2022-03-12 17:04:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 17:06:00,2022-03-12 17:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 17:15:00,2022-03-12 17:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 17:26:00,2022-03-12 17:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 17:35:00,2022-03-12 17:44:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 18:06:00,2022-03-12 18:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 18:15:00,2022-03-12 18:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 18:26:00,2022-03-12 18:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 18:35:00,2022-03-12 18:44:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 18:46:00,2022-03-12 18:55:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 18:55:00,2022-03-12 19:04:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 19:06:00,2022-03-12 19:15:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 19:15:00,2022-03-12 19:24:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 19:26:00,2022-03-12 19:35:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 19:35:00,2022-03-12 19:44:00,S_16,5139,21,4426894,CKB -LINE_6,S_16,2022-03-12 20:05:00,2022-03-12 20:14:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 20:14:00,2022-03-12 20:23:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 20:25:00,2022-03-12 20:34:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 20:34:00,2022-03-12 20:43:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 20:45:00,2022-03-12 20:54:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 20:54:00,2022-03-12 21:03:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 21:05:00,2022-03-12 21:14:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 21:14:00,2022-03-12 21:23:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 21:25:00,2022-03-12 21:34:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 21:34:00,2022-03-12 21:43:00,S_16,5139,22,4426894,CKB -LINE_6,S_16,2022-03-12 22:05:00,2022-03-12 22:14:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 22:14:00,2022-03-12 22:23:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 22:25:00,2022-03-12 22:34:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 22:34:00,2022-03-12 22:43:00,S_16,5139,2,4426894,CKB -LINE_6,S_16,2022-03-12 22:45:00,2022-03-12 22:54:00,S_17,4781,0,4426894,CKB -LINE_6,S_17,2022-03-12 22:54:00,2022-03-12 23:03:00,S_16,5139,0,4426894,CKB -LINE_6,S_16,2022-03-12 23:03:00,2022-03-12 23:03:00,DEPS_1,0.06,0,4426894,CKB -LINE_29,DEPS_1,2022-03-12 07:30:00,2022-03-12 07:30:00,S_53,0.06,0,4369705,CKB -LINE_29,S_53,2022-03-12 07:30:00,2022-03-12 07:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 07:39:00,2022-03-12 07:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 07:50:00,2022-03-12 07:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 07:59:00,2022-03-12 08:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 08:10:00,2022-03-12 08:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 08:19:00,2022-03-12 08:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 08:30:00,2022-03-12 08:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 08:39:00,2022-03-12 08:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 08:50:00,2022-03-12 08:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 08:59:00,2022-03-12 09:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 09:10:00,2022-03-12 09:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 09:19:00,2022-03-12 09:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 09:30:00,2022-03-12 09:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 09:39:00,2022-03-12 09:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 09:50:00,2022-03-12 09:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 09:59:00,2022-03-12 10:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 10:10:00,2022-03-12 10:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 10:19:00,2022-03-12 10:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 10:30:00,2022-03-12 10:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 10:39:00,2022-03-12 10:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 10:50:00,2022-03-12 10:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 10:59:00,2022-03-12 11:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 11:10:00,2022-03-12 11:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 11:19:00,2022-03-12 11:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 11:30:00,2022-03-12 11:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 11:39:00,2022-03-12 11:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 11:50:00,2022-03-12 11:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 11:59:00,2022-03-12 12:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 12:10:00,2022-03-12 12:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 12:19:00,2022-03-12 12:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 12:30:00,2022-03-12 12:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 12:39:00,2022-03-12 12:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 12:50:00,2022-03-12 12:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 12:59:00,2022-03-12 13:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 13:10:00,2022-03-12 13:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 13:19:00,2022-03-12 13:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 13:30:00,2022-03-12 13:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 13:39:00,2022-03-12 13:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 13:50:00,2022-03-12 13:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 13:59:00,2022-03-12 14:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 14:10:00,2022-03-12 14:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 14:19:00,2022-03-12 14:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 14:30:00,2022-03-12 14:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 14:39:00,2022-03-12 14:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 14:50:00,2022-03-12 14:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 14:59:00,2022-03-12 15:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 15:10:00,2022-03-12 15:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 15:19:00,2022-03-12 15:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 15:30:00,2022-03-12 15:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 15:39:00,2022-03-12 15:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 15:50:00,2022-03-12 15:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 15:59:00,2022-03-12 16:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 16:10:00,2022-03-12 16:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 16:19:00,2022-03-12 16:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 16:30:00,2022-03-12 16:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 16:39:00,2022-03-12 16:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 16:50:00,2022-03-12 16:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 16:59:00,2022-03-12 17:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 17:10:00,2022-03-12 17:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 17:19:00,2022-03-12 17:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 17:30:00,2022-03-12 17:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 17:39:00,2022-03-12 17:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 17:50:00,2022-03-12 17:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 17:59:00,2022-03-12 18:10:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 18:10:00,2022-03-12 18:15:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 18:19:00,2022-03-12 18:30:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 18:30:00,2022-03-12 18:35:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 18:39:00,2022-03-12 18:50:00,S_53,4341,0,4369705,CKB -LINE_29,S_53,2022-03-12 18:50:00,2022-03-12 18:55:00,S_54,2217,4,4369705,CKB -LINE_29,S_54,2022-03-12 18:59:00,2022-03-12 19:10:00,S_53,4288,0,4369705,CKB -LINE_29,S_53,2022-03-12 19:10:00,2022-03-12 19:10:00,DEPS_1,0.06,0,4369705,CKB -LINE_9,DEPS_23,2022-03-12 08:08:00,2022-03-12 08:41:00,S_22,17.9,0,4317640,VDL -LINE_9,S_22,2022-03-12 08:41:00,2022-03-12 08:54:00,S_22,4637,9,4317640,VDL -LINE_9,S_22,2022-03-12 09:03:00,2022-03-12 09:17:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 09:21:00,2022-03-12 09:35:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 09:43:00,2022-03-12 09:57:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 10:01:00,2022-03-12 10:15:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 10:23:00,2022-03-12 10:37:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 10:41:00,2022-03-12 10:55:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 11:03:00,2022-03-12 11:17:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 11:21:00,2022-03-12 11:35:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 11:43:00,2022-03-12 11:57:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 12:01:00,2022-03-12 12:15:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 12:23:00,2022-03-12 12:37:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 12:41:00,2022-03-12 12:55:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 13:03:00,2022-03-12 13:17:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 13:21:00,2022-03-12 13:35:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 13:43:00,2022-03-12 13:57:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 14:01:00,2022-03-12 14:15:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 14:23:00,2022-03-12 14:37:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 14:41:00,2022-03-12 14:55:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 15:03:00,2022-03-12 15:17:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 15:21:00,2022-03-12 15:35:00,S_22,4637,8,4317640,VDL -LINE_9,S_22,2022-03-12 15:43:00,2022-03-12 15:57:00,S_22,4637,4,4317640,VDL -LINE_9,S_22,2022-03-12 16:01:00,2022-03-12 16:14:00,S_22,4637,0,4317640,VDL -LINE_9,S_22,2022-03-12 16:14:00,2022-03-12 16:57:00,DEPS_23,19.8,0,4317640,VDL -LINE_30,DEPS_1,2022-03-12 07:18:00,2022-03-12 07:18:00,S_55,0.06,0,4706426,CKB -LINE_30,S_55,2022-03-12 07:18:00,2022-03-12 07:26:00,S_56,5562,10,4706426,CKB -LINE_30,S_56,2022-03-12 07:36:00,2022-03-12 07:45:00,S_57,5941,32,4706426,CKB -LINE_30,S_57,2022-03-12 08:17:00,2022-03-12 08:26:00,S_56,5994,8,4706426,CKB -LINE_30,S_56,2022-03-12 08:34:00,2022-03-12 08:42:00,S_55,5566,0,4706426,CKB -LINE_30,S_55,2022-03-12 08:42:00,2022-03-12 08:42:00,DEPS_1,0.06,0,4706426,CKB -LINE_12,DEPS_1,2022-03-12 08:10:00,2022-03-12 08:10:00,S_27,0.06,0,4731254,CKB -LINE_12,S_27,2022-03-12 08:10:00,2022-03-12 08:16:00,OPPS_28,2169,12,4731254,CKB -LINE_12,OPPS_28,2022-03-12 08:28:00,2022-03-12 08:38:00,S_27,2952,2,4731254,CKB -LINE_12,S_27,2022-03-12 08:40:00,2022-03-12 08:46:00,OPPS_28,2169,12,4731254,CKB -LINE_12,OPPS_28,2022-03-12 08:58:00,2022-03-12 09:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 09:10:00,2022-03-12 09:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 09:28:00,2022-03-12 09:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 09:40:00,2022-03-12 09:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 09:58:00,2022-03-12 10:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 10:10:00,2022-03-12 10:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 10:28:00,2022-03-12 10:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 10:40:00,2022-03-12 10:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 10:58:00,2022-03-12 11:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 11:10:00,2022-03-12 11:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 11:28:00,2022-03-12 11:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 11:40:00,2022-03-12 11:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 11:58:00,2022-03-12 12:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 12:10:00,2022-03-12 12:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 12:28:00,2022-03-12 12:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 12:40:00,2022-03-12 12:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 12:58:00,2022-03-12 13:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 13:10:00,2022-03-12 13:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 13:28:00,2022-03-12 13:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 13:40:00,2022-03-12 13:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 13:58:00,2022-03-12 14:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 14:10:00,2022-03-12 14:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 14:28:00,2022-03-12 14:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 14:40:00,2022-03-12 14:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 14:58:00,2022-03-12 15:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 15:10:00,2022-03-12 15:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 15:28:00,2022-03-12 15:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 15:40:00,2022-03-12 15:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 15:58:00,2022-03-12 16:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 16:10:00,2022-03-12 16:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 16:28:00,2022-03-12 16:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 16:40:00,2022-03-12 16:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 16:58:00,2022-03-12 17:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 17:10:00,2022-03-12 17:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 17:28:00,2022-03-12 17:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 17:40:00,2022-03-12 17:48:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 17:58:00,2022-03-12 18:10:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 18:10:00,2022-03-12 18:18:00,OPPS_28,2169,10,4731254,CKB -LINE_12,OPPS_28,2022-03-12 18:28:00,2022-03-12 18:40:00,S_27,2952,0,4731254,CKB -LINE_12,S_27,2022-03-12 18:40:00,2022-03-12 18:48:00,OPPS_28,2169,0,4731254,CKB -LINE_12,OPPS_28,2022-03-12 18:48:00,2022-03-12 18:48:00,DEPS_1,0.06,0,4731254,CKB -LINE_13,DEPS_1,2022-03-13 00:23:00,2022-03-13 00:23:00,S_29,0.06,0,4317771,CKB -LINE_13,S_29,2022-03-13 00:23:00,2022-03-13 00:30:00,OPPS_30,2577,9,4317771,CKB -LINE_14,OPPS_30,2022-03-13 00:39:00,2022-03-13 00:54:00,S_31,5937,9,4317771,CKB -LINE_14,S_31,2022-03-13 01:03:00,2022-03-13 01:17:00,OPPS_30,6.19,0,4317771,CKB -LINE_13,OPPS_30,2022-03-13 01:17:00,2022-03-13 01:23:00,S_29,2555,0,4317771,CKB -LINE_13,S_29,2022-03-13 01:23:00,2022-03-13 01:30:00,OPPS_30,2577,9,4317771,CKB -LINE_14,OPPS_30,2022-03-13 01:39:00,2022-03-13 01:54:00,S_31,5937,9,4317771,CKB -LINE_14,S_31,2022-03-13 02:03:00,2022-03-13 02:17:00,OPPS_30,6.19,0,4317771,CKB -LINE_13,OPPS_30,2022-03-13 02:17:00,2022-03-13 02:23:00,S_29,2555,0,4317771,CKB -LINE_13,S_29,2022-03-13 02:23:00,2022-03-13 02:30:00,OPPS_30,2577,9,4317771,CKB -LINE_14,OPPS_30,2022-03-13 02:39:00,2022-03-13 02:54:00,S_31,5937,9,4317771,CKB -LINE_14,S_31,2022-03-13 03:03:00,2022-03-13 03:17:00,OPPS_30,6.19,0,4317771,CKB -LINE_13,OPPS_30,2022-03-13 03:17:00,2022-03-13 03:23:00,S_29,2555,0,4317771,CKB -LINE_13,S_29,2022-03-13 03:23:00,2022-03-13 03:30:00,OPPS_30,2577,9,4317771,CKB -LINE_14,OPPS_30,2022-03-13 03:39:00,2022-03-13 03:54:00,S_31,5937,9,4317771,CKB -LINE_14,S_31,2022-03-13 04:03:00,2022-03-13 04:17:00,OPPS_30,6.19,0,4317771,CKB -LINE_13,OPPS_30,2022-03-13 04:17:00,2022-03-13 04:23:00,S_29,2555,0,4317771,CKB -LINE_13,S_29,2022-03-13 04:23:00,2022-03-13 04:30:00,OPPS_30,2577,9,4317771,CKB -LINE_14,OPPS_30,2022-03-13 04:39:00,2022-03-13 04:54:00,S_31,5937,9,4317771,CKB -LINE_14,S_31,2022-03-13 05:03:00,2022-03-13 05:17:00,OPPS_30,6.19,0,4317771,CKB -LINE_13,OPPS_30,2022-03-13 05:17:00,2022-03-13 05:23:00,S_29,2555,0,4317771,CKB -LINE_13,S_29,2022-03-13 05:23:00,2022-03-13 05:30:00,OPPS_30,2577,9,4317771,CKB -LINE_14,OPPS_30,2022-03-13 05:39:00,2022-03-13 05:54:00,S_31,5937,9,4317771,CKB -LINE_14,S_31,2022-03-13 06:03:00,2022-03-13 06:17:00,OPPS_30,6.19,0,4317771,CKB -LINE_13,OPPS_30,2022-03-13 06:17:00,2022-03-13 06:23:00,S_29,2555,0,4317771,CKB -LINE_13,S_29,2022-03-13 06:23:00,2022-03-13 06:30:00,OPPS_30,2577,9,4317771,CKB -LINE_14,OPPS_30,2022-03-13 06:39:00,2022-03-13 06:54:00,S_31,5937,0,4317771,CKB -LINE_14,S_31,2022-03-13 06:54:00,2022-03-13 06:54:00,DEPS_1,0.06,0,4317771,CKB -LINE_14,DEPS_1,2022-03-13 00:33:00,2022-03-13 00:33:00,S_31,0.06,0,4317937,CKB -LINE_14,S_31,2022-03-13 00:33:00,2022-03-13 00:47:00,OPPS_30,6.19,0,4317937,CKB -LINE_13,OPPS_30,2022-03-13 00:47:00,2022-03-13 00:53:00,S_29,2555,0,4317937,CKB -LINE_13,S_29,2022-03-13 00:53:00,2022-03-13 01:00:00,OPPS_30,2577,9,4317937,CKB -LINE_14,OPPS_30,2022-03-13 01:09:00,2022-03-13 01:24:00,S_31,5937,9,4317937,CKB -LINE_14,S_31,2022-03-13 01:33:00,2022-03-13 01:47:00,OPPS_30,6.19,0,4317937,CKB -LINE_13,OPPS_30,2022-03-13 01:47:00,2022-03-13 01:53:00,S_29,2555,0,4317937,CKB -LINE_13,S_29,2022-03-13 01:53:00,2022-03-13 02:00:00,OPPS_30,2577,9,4317937,CKB -LINE_14,OPPS_30,2022-03-13 02:09:00,2022-03-13 02:24:00,S_31,5937,9,4317937,CKB -LINE_14,S_31,2022-03-13 02:33:00,2022-03-13 02:47:00,OPPS_30,6.19,0,4317937,CKB -LINE_13,OPPS_30,2022-03-13 02:47:00,2022-03-13 02:53:00,S_29,2555,0,4317937,CKB -LINE_13,S_29,2022-03-13 02:53:00,2022-03-13 03:00:00,OPPS_30,2577,9,4317937,CKB -LINE_14,OPPS_30,2022-03-13 03:09:00,2022-03-13 03:24:00,S_31,5937,9,4317937,CKB -LINE_14,S_31,2022-03-13 03:33:00,2022-03-13 03:47:00,OPPS_30,6.19,0,4317937,CKB -LINE_13,OPPS_30,2022-03-13 03:47:00,2022-03-13 03:53:00,S_29,2555,0,4317937,CKB -LINE_13,S_29,2022-03-13 03:53:00,2022-03-13 04:00:00,OPPS_30,2577,9,4317937,CKB -LINE_14,OPPS_30,2022-03-13 04:09:00,2022-03-13 04:24:00,S_31,5937,9,4317937,CKB -LINE_14,S_31,2022-03-13 04:33:00,2022-03-13 04:47:00,OPPS_30,6.19,0,4317937,CKB -LINE_13,OPPS_30,2022-03-13 04:47:00,2022-03-13 04:53:00,S_29,2555,0,4317937,CKB -LINE_13,S_29,2022-03-13 04:53:00,2022-03-13 05:00:00,OPPS_30,2577,9,4317937,CKB -LINE_14,OPPS_30,2022-03-13 05:09:00,2022-03-13 05:24:00,S_31,5937,9,4317937,CKB -LINE_14,S_31,2022-03-13 05:33:00,2022-03-13 05:47:00,OPPS_30,6.19,0,4317937,CKB -LINE_13,OPPS_30,2022-03-13 05:47:00,2022-03-13 05:53:00,S_29,2555,0,4317937,CKB -LINE_13,S_29,2022-03-13 05:53:00,2022-03-13 06:00:00,OPPS_30,2577,9,4317937,CKB -LINE_14,OPPS_30,2022-03-13 06:09:00,2022-03-13 06:24:00,S_31,5937,9,4317937,CKB -LINE_14,S_31,2022-03-13 06:33:00,2022-03-13 06:47:00,OPPS_30,6.19,0,4317937,CKB -LINE_14,OPPS_30,2022-03-13 06:47:00,2022-03-13 06:47:00,DEPS_1,0.06,0,4317937,CKB -LINE_15,DEPS_1,2022-03-13 00:57:00,2022-03-13 00:57:00,OPPS_32,0.06,0,4319402,CKB -LINE_15,OPPS_32,2022-03-13 00:57:00,2022-03-13 01:06:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 01:06:00,2022-03-13 01:11:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 01:27:00,2022-03-13 01:36:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 01:36:00,2022-03-13 01:41:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 01:57:00,2022-03-13 02:06:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 02:06:00,2022-03-13 02:11:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 02:27:00,2022-03-13 02:36:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 02:36:00,2022-03-13 02:41:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 02:57:00,2022-03-13 03:06:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 03:06:00,2022-03-13 03:11:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 03:27:00,2022-03-13 03:36:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 03:36:00,2022-03-13 03:41:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 03:57:00,2022-03-13 04:06:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 04:06:00,2022-03-13 04:11:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 04:27:00,2022-03-13 04:36:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 04:36:00,2022-03-13 04:41:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 04:57:00,2022-03-13 05:06:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 05:06:00,2022-03-13 05:11:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 05:27:00,2022-03-13 05:36:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 05:36:00,2022-03-13 05:41:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 05:57:00,2022-03-13 06:06:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 06:06:00,2022-03-13 06:11:00,OPPS_32,2936,16,4319402,CKB -LINE_15,OPPS_32,2022-03-13 06:27:00,2022-03-13 06:36:00,S_33,4343,0,4319402,CKB -LINE_15,S_33,2022-03-13 06:36:00,2022-03-13 06:41:00,OPPS_32,2936,0,4319402,CKB -LINE_15,OPPS_32,2022-03-13 06:41:00,2022-03-13 06:41:00,DEPS_1,0.06,0,4319402,CKB -LINE_17,DEPS_1,2022-03-13 00:30:00,2022-03-13 00:30:00,S_34,0.06,0,4453948,CKB -LINE_17,S_34,2022-03-13 00:30:00,2022-03-13 00:44:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 00:44:00,2022-03-13 00:57:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 01:00:00,2022-03-13 01:14:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 01:14:00,2022-03-13 01:27:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 01:30:00,2022-03-13 01:44:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 01:44:00,2022-03-13 01:57:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 02:00:00,2022-03-13 02:14:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 02:14:00,2022-03-13 02:27:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 02:30:00,2022-03-13 02:44:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 02:44:00,2022-03-13 02:57:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 03:00:00,2022-03-13 03:14:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 03:14:00,2022-03-13 03:27:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 03:30:00,2022-03-13 03:44:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 03:44:00,2022-03-13 03:57:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 04:00:00,2022-03-13 04:14:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 04:14:00,2022-03-13 04:27:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 04:30:00,2022-03-13 04:44:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 04:44:00,2022-03-13 04:57:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 05:00:00,2022-03-13 05:14:00,S_36,4801,0,4453948,CKB -LINE_17,S_36,2022-03-13 05:14:00,2022-03-13 05:27:00,S_34,5302,3,4453948,CKB -LINE_17,S_34,2022-03-13 05:30:00,2022-03-13 05:44:00,S_36,4.8,0,4453948,CKB -LINE_17,S_36,2022-03-13 05:44:00,2022-03-13 05:56:00,S_34,5301,4,4453948,CKB -LINE_17,S_34,2022-03-13 06:00:00,2022-03-13 06:14:00,S_36,4.8,0,4453948,CKB -LINE_17,S_36,2022-03-13 06:14:00,2022-03-13 06:26:00,S_34,5301,4,4453948,CKB -LINE_17,S_34,2022-03-13 06:30:00,2022-03-13 06:44:00,S_36,4.8,0,4453948,CKB -LINE_17,S_36,2022-03-13 06:44:00,2022-03-13 06:56:00,S_34,5301,0,4453948,CKB -LINE_17,S_34,2022-03-13 06:56:00,2022-03-13 06:56:00,DEPS_1,0.06,0,4453948,CKB -LINE_20,DEPS_1,2022-03-13 00:32:00,2022-03-13 00:32:00,S_13,0.06,0,4747669,CKB -LINE_20,S_13,2022-03-13 00:32:00,2022-03-13 00:44:00,S_40,4212,3,4747669,CKB -LINE_20,S_40,2022-03-13 00:47:00,2022-03-13 01:16:00,S_41,13048,0,4747669,CKB -LINE_20,S_41,2022-03-13 01:16:00,2022-03-13 01:42:00,S_40,12869,5,4747669,CKB -LINE_20,S_40,2022-03-13 01:47:00,2022-03-13 02:16:00,S_41,13048,0,4747669,CKB -LINE_20,S_41,2022-03-13 02:16:00,2022-03-13 02:42:00,S_40,12869,5,4747669,CKB -LINE_20,S_40,2022-03-13 02:47:00,2022-03-13 03:16:00,S_41,13048,0,4747669,CKB -LINE_20,S_41,2022-03-13 03:16:00,2022-03-13 03:42:00,S_40,12869,5,4747669,CKB -LINE_20,S_40,2022-03-13 03:47:00,2022-03-13 04:16:00,S_41,13048,0,4747669,CKB -LINE_20,S_41,2022-03-13 04:16:00,2022-03-13 04:42:00,S_40,12869,5,4747669,CKB -LINE_20,S_40,2022-03-13 04:47:00,2022-03-13 05:16:00,S_41,13048,0,4747669,CKB -LINE_20,S_41,2022-03-13 05:16:00,2022-03-13 05:42:00,S_40,12869,5,4747669,CKB -LINE_20,S_40,2022-03-13 05:47:00,2022-03-13 06:16:00,S_41,13048,0,4747669,CKB -LINE_20,S_41,2022-03-13 06:16:00,2022-03-13 06:42:00,S_40,12869,0,4747669,CKB -LINE_20,S_40,2022-03-13 06:42:00,2022-03-13 06:42:00,DEPS_1,0.06,0,4747669,CKB -LINE_20,DEPS_1,2022-03-13 00:17:00,2022-03-13 00:17:00,S_40,0.06,0,4747671,CKB -LINE_20,S_40,2022-03-13 00:17:00,2022-03-13 00:46:00,S_41,13048,0,4747671,CKB -LINE_20,S_41,2022-03-13 00:46:00,2022-03-13 01:12:00,S_40,12869,5,4747671,CKB -LINE_20,S_40,2022-03-13 01:17:00,2022-03-13 01:46:00,S_41,13048,0,4747671,CKB -LINE_20,S_41,2022-03-13 01:46:00,2022-03-13 02:12:00,S_40,12869,5,4747671,CKB -LINE_20,S_40,2022-03-13 02:17:00,2022-03-13 02:46:00,S_41,13048,0,4747671,CKB -LINE_20,S_41,2022-03-13 02:46:00,2022-03-13 03:12:00,S_40,12869,5,4747671,CKB -LINE_20,S_40,2022-03-13 03:17:00,2022-03-13 03:46:00,S_41,13048,0,4747671,CKB -LINE_20,S_41,2022-03-13 03:46:00,2022-03-13 04:12:00,S_40,12869,5,4747671,CKB -LINE_20,S_40,2022-03-13 04:17:00,2022-03-13 04:46:00,S_41,13048,0,4747671,CKB -LINE_20,S_41,2022-03-13 04:46:00,2022-03-13 05:12:00,S_40,12869,5,4747671,CKB -LINE_20,S_40,2022-03-13 05:17:00,2022-03-13 05:46:00,S_41,13048,0,4747671,CKB -LINE_20,S_41,2022-03-13 05:46:00,2022-03-13 06:12:00,S_40,12869,5,4747671,CKB -LINE_20,S_40,2022-03-13 06:17:00,2022-03-13 06:46:00,S_41,13048,0,4747671,CKB -LINE_20,S_41,2022-03-13 06:46:00,2022-03-13 07:12:00,S_40,12869,0,4747671,CKB -LINE_20,S_40,2022-03-13 07:12:00,2022-03-13 07:12:00,DEPS_1,0.06,0,4747671,CKB -LINE_21,DEPS_1,2022-03-13 00:49:00,2022-03-13 00:49:00,OPPS_3,0.06,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 00:49:00,2022-03-13 01:04:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 01:04:00,2022-03-13 01:19:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 01:19:00,2022-03-13 01:34:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 01:34:00,2022-03-13 01:49:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 01:49:00,2022-03-13 02:04:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 02:04:00,2022-03-13 02:19:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 02:19:00,2022-03-13 02:34:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 02:34:00,2022-03-13 02:49:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 02:49:00,2022-03-13 03:04:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 03:04:00,2022-03-13 03:19:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 03:19:00,2022-03-13 03:34:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 03:34:00,2022-03-13 03:49:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 03:49:00,2022-03-13 04:04:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 04:04:00,2022-03-13 04:19:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 04:19:00,2022-03-13 04:34:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 04:34:00,2022-03-13 04:49:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 04:49:00,2022-03-13 05:04:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 05:04:00,2022-03-13 05:19:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 05:19:00,2022-03-13 05:34:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 05:34:00,2022-03-13 05:49:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 05:49:00,2022-03-13 06:04:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 06:04:00,2022-03-13 06:19:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 06:19:00,2022-03-13 06:34:00,S_16,10229,0,4434314,CKB -LINE_21,S_16,2022-03-13 06:34:00,2022-03-13 06:49:00,OPPS_3,11801,0,4434314,CKB -LINE_21,OPPS_3,2022-03-13 06:49:00,2022-03-13 06:49:00,DEPS_1,0.06,0,4434314,CKB -LINE_23,DEPS_1,2022-03-13 02:34:00,2022-03-13 02:34:00,S_45,0.06,0,4524178,CKB -LINE_23,S_45,2022-03-13 02:34:00,2022-03-13 03:00:00,S_46,9016,0,4524178,CKB -LINE_23,S_46,2022-03-13 03:00:00,2022-03-13 03:27:00,S_45,10083,7,4524178,CKB -LINE_23,S_45,2022-03-13 03:34:00,2022-03-13 04:00:00,S_46,9016,0,4524178,CKB -LINE_23,S_46,2022-03-13 04:00:00,2022-03-13 04:27:00,S_45,10083,7,4524178,CKB -LINE_23,S_45,2022-03-13 04:34:00,2022-03-13 05:00:00,S_46,9016,0,4524178,CKB -LINE_23,S_46,2022-03-13 05:00:00,2022-03-13 05:27:00,S_45,10083,7,4524178,CKB -LINE_23,S_45,2022-03-13 05:34:00,2022-03-13 06:00:00,S_46,9016,0,4524178,CKB -LINE_23,S_46,2022-03-13 06:00:00,2022-03-13 06:27:00,S_45,10083,7,4524178,CKB -LINE_23,S_45,2022-03-13 06:34:00,2022-03-13 07:00:00,S_46,9016,0,4524178,CKB -LINE_23,S_46,2022-03-13 07:00:00,2022-03-13 07:00:00,DEPS_1,0.06,0,4524178,CKB -LINE_23,DEPS_1,2022-03-13 02:04:00,2022-03-13 02:04:00,S_45,0.06,0,4619808,CKB -LINE_23,S_45,2022-03-13 02:04:00,2022-03-13 02:30:00,S_46,9016,0,4619808,CKB -LINE_23,S_46,2022-03-13 02:30:00,2022-03-13 02:57:00,S_45,10083,7,4619808,CKB -LINE_23,S_45,2022-03-13 03:04:00,2022-03-13 03:30:00,S_46,9016,0,4619808,CKB -LINE_23,S_46,2022-03-13 03:30:00,2022-03-13 03:57:00,S_45,10083,7,4619808,CKB -LINE_23,S_45,2022-03-13 04:04:00,2022-03-13 04:30:00,S_46,9016,0,4619808,CKB -LINE_23,S_46,2022-03-13 04:30:00,2022-03-13 04:57:00,S_45,10083,7,4619808,CKB -LINE_23,S_45,2022-03-13 05:04:00,2022-03-13 05:30:00,S_46,9016,0,4619808,CKB -LINE_23,S_46,2022-03-13 05:30:00,2022-03-13 05:57:00,S_45,10083,7,4619808,CKB -LINE_23,S_45,2022-03-13 06:04:00,2022-03-13 06:30:00,S_46,9016,0,4619808,CKB -LINE_23,S_46,2022-03-13 06:30:00,2022-03-13 06:57:00,S_45,10083,0,4619808,CKB -LINE_23,S_45,2022-03-13 06:57:00,2022-03-13 06:57:00,DEPS_1,0.06,0,4619808,CKB -LINE_24,DEPS_1,2022-03-13 00:31:00,2022-03-13 00:31:00,OPPS_21,0.06,0,4374748,CKB -LINE_24,OPPS_21,2022-03-13 00:31:00,2022-03-13 00:44:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 00:44:00,2022-03-13 00:56:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 01:01:00,2022-03-13 01:14:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 01:14:00,2022-03-13 01:26:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 01:31:00,2022-03-13 01:44:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 01:44:00,2022-03-13 01:56:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 02:01:00,2022-03-13 02:14:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 02:14:00,2022-03-13 02:26:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 02:31:00,2022-03-13 02:44:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 02:44:00,2022-03-13 02:56:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 03:01:00,2022-03-13 03:14:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 03:14:00,2022-03-13 03:26:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 03:31:00,2022-03-13 03:44:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 03:44:00,2022-03-13 03:56:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 04:01:00,2022-03-13 04:14:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 04:14:00,2022-03-13 04:26:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 04:31:00,2022-03-13 04:44:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 04:44:00,2022-03-13 04:56:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 05:01:00,2022-03-13 05:14:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 05:14:00,2022-03-13 05:26:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 05:31:00,2022-03-13 05:44:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 05:44:00,2022-03-13 05:56:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 06:01:00,2022-03-13 06:14:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 06:14:00,2022-03-13 06:26:00,OPPS_21,5362,5,4374748,CKB -LINE_24,OPPS_21,2022-03-13 06:31:00,2022-03-13 06:44:00,S_47,4872,0,4374748,CKB -LINE_24,S_47,2022-03-13 06:44:00,2022-03-13 06:56:00,OPPS_21,5362,0,4374748,CKB -LINE_24,OPPS_21,2022-03-13 06:56:00,2022-03-13 06:56:00,DEPS_1,0.06,0,4374748,CKB -LINE_25,DEPS_1,2022-03-13 00:31:00,2022-03-13 00:31:00,OPPS_21,0.06,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 00:31:00,2022-03-13 00:45:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 00:47:00,2022-03-13 01:01:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 01:01:00,2022-03-13 01:15:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 01:17:00,2022-03-13 01:31:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 01:31:00,2022-03-13 01:45:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 01:47:00,2022-03-13 02:01:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 02:01:00,2022-03-13 02:15:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 02:17:00,2022-03-13 02:31:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 02:31:00,2022-03-13 02:45:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 02:47:00,2022-03-13 03:01:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 03:01:00,2022-03-13 03:15:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 03:17:00,2022-03-13 03:31:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 03:31:00,2022-03-13 03:45:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 03:47:00,2022-03-13 04:01:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 04:01:00,2022-03-13 04:15:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 04:17:00,2022-03-13 04:31:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 04:31:00,2022-03-13 04:45:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 04:47:00,2022-03-13 05:01:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 05:01:00,2022-03-13 05:15:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 05:17:00,2022-03-13 05:31:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 05:31:00,2022-03-13 05:45:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 05:47:00,2022-03-13 06:01:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 06:01:00,2022-03-13 06:15:00,S_48,5225,2,4374871,CKB -LINE_25,S_48,2022-03-13 06:17:00,2022-03-13 06:31:00,OPPS_21,7617,0,4374871,CKB -LINE_25,OPPS_21,2022-03-13 06:31:00,2022-03-13 06:45:00,S_48,5096,0,4374871,CKB -LINE_25,S_48,2022-03-13 06:45:00,2022-03-13 06:45:00,DEPS_1,0.06,0,4374871,CKB -LINE_26,DEPS_1,2022-03-13 00:43:00,2022-03-13 00:43:00,S_49,0.06,0,4375017,CKB -LINE_26,S_49,2022-03-13 00:43:00,2022-03-13 00:53:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 00:53:00,2022-03-13 01:03:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 01:13:00,2022-03-13 01:23:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 01:23:00,2022-03-13 01:33:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 01:43:00,2022-03-13 01:53:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 01:53:00,2022-03-13 02:03:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 02:13:00,2022-03-13 02:23:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 02:23:00,2022-03-13 02:33:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 02:43:00,2022-03-13 02:53:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 02:53:00,2022-03-13 03:03:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 03:13:00,2022-03-13 03:23:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 03:23:00,2022-03-13 03:33:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 03:43:00,2022-03-13 03:53:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 03:53:00,2022-03-13 04:03:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 04:13:00,2022-03-13 04:23:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 04:23:00,2022-03-13 04:33:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 04:43:00,2022-03-13 04:53:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 04:53:00,2022-03-13 05:03:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 05:13:00,2022-03-13 05:23:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 05:23:00,2022-03-13 05:33:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 05:43:00,2022-03-13 05:53:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 05:53:00,2022-03-13 06:03:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 06:13:00,2022-03-13 06:23:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 06:23:00,2022-03-13 06:33:00,S_49,4408,10,4375017,CKB -LINE_26,S_49,2022-03-13 06:43:00,2022-03-13 06:53:00,S_50,4507,0,4375017,CKB -LINE_26,S_50,2022-03-13 06:53:00,2022-03-13 07:03:00,S_49,4408,0,4375017,CKB -LINE_26,S_49,2022-03-13 07:03:00,2022-03-13 07:03:00,DEPS_1,0.06,0,4375017,CKB +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,4454943,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,4454943,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,4454943,CKB +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,4454943,CKB +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,4454943,CKB +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,4454943,CKB +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,4454943,CKB +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,4454943,CKB +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,4454943,CKB +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,4454943,CKB +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,4454943,CKB +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,4454943,CKB +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,4454943,CKB +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,4454943,CKB +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,4454948,CKB +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,4454948,CKB +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,4454948,CKB +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,4454948,CKB +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,4454948,CKB +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,4454948,CKB +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,4454948,CKB +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,4454948,CKB +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,4454948,CKB +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,4454948,CKB +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,4454948,CKB +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,4454948,CKB +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,4454948,CKB +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,4454948,CKB +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,4664622,CKB +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,4664622,CKB +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,4664622,CKB +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,4664622,CKB +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,4664622,CKB +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,4664622,CKB +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,4664622,CKB +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,4664622,CKB +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,4664622,CKB +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,4664622,CKB +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,4664622,CKB +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,4664622,CKB +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,4664622,CKB +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,4664622,CKB +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,4664622,CKB +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,4664622,CKB +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,4664622,CKB +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4762732,CKB +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4762732,CKB +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4762732,CKB +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4762732,CKB +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4762732,CKB +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4762732,CKB +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4762732,CKB +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4762732,CKB +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4762732,CKB +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4762732,CKB +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4762732,CKB +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4762732,CKB +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4762732,CKB +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4762732,CKB +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4762732,CKB +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4762732,CKB +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4762732,CKB +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4762732,CKB +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4762732,CKB +LINE_5,Station-0,2022-03-07 22:56:00,2022-03-07 22:56:00,Station-14,0.06,0,4617401,CKB +LINE_5,Station-14,2022-03-07 22:56:00,2022-03-07 23:08:00,Station-15,5882,3,4617401,CKB +LINE_5,Station-15,2022-03-07 23:11:00,2022-03-07 23:25:00,Station-14,6232,0,4617401,CKB +LINE_5,Station-14,2022-03-07 23:25:00,2022-03-07 23:38:00,Station-15,6086,3,4617401,CKB +LINE_5,Station-15,2022-03-07 23:41:00,2022-03-07 23:55:00,Station-14,6232,0,4617401,CKB +LINE_5,Station-14,2022-03-07 23:55:00,2022-03-08 00:08:00,Station-15,6086,0,4617401,CKB +LINE_5,Station-15,2022-03-08 00:08:00,2022-03-08 00:08:00,Station-0,0.06,0,4617401,CKB +LINE_6,Station-0,2022-03-07 05:05:00,2022-03-07 05:05:00,Station-16,0.06,0,4426844,CKB +LINE_6,Station-16,2022-03-07 05:05:00,2022-03-07 05:14:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 05:14:00,2022-03-07 05:23:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 05:25:00,2022-03-07 05:34:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 05:34:00,2022-03-07 05:43:00,Station-16,5139,23,4426844,CKB +LINE_6,Station-16,2022-03-07 06:06:00,2022-03-07 06:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 06:15:00,2022-03-07 06:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 06:26:00,2022-03-07 06:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 06:35:00,2022-03-07 06:44:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 06:46:00,2022-03-07 06:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 06:55:00,2022-03-07 07:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 07:06:00,2022-03-07 07:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 07:15:00,2022-03-07 07:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 07:26:00,2022-03-07 07:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 07:35:00,2022-03-07 07:44:00,Station-16,5139,22,4426844,CKB +LINE_6,Station-16,2022-03-07 08:06:00,2022-03-07 08:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 08:15:00,2022-03-07 08:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 08:26:00,2022-03-07 08:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 08:35:00,2022-03-07 08:44:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 08:46:00,2022-03-07 08:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 08:55:00,2022-03-07 09:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 09:06:00,2022-03-07 09:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 09:15:00,2022-03-07 09:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 09:26:00,2022-03-07 09:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 09:35:00,2022-03-07 09:44:00,Station-16,5139,22,4426844,CKB +LINE_6,Station-16,2022-03-07 10:06:00,2022-03-07 10:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 10:15:00,2022-03-07 10:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 10:26:00,2022-03-07 10:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 10:35:00,2022-03-07 10:44:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 10:46:00,2022-03-07 10:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 10:55:00,2022-03-07 11:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 11:06:00,2022-03-07 11:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 11:15:00,2022-03-07 11:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 11:26:00,2022-03-07 11:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 11:35:00,2022-03-07 11:44:00,Station-16,5139,22,4426844,CKB +LINE_6,Station-16,2022-03-07 12:06:00,2022-03-07 12:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 12:15:00,2022-03-07 12:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 12:26:00,2022-03-07 12:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 12:35:00,2022-03-07 12:44:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 12:46:00,2022-03-07 12:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 12:55:00,2022-03-07 13:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 13:06:00,2022-03-07 13:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 13:15:00,2022-03-07 13:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 13:26:00,2022-03-07 13:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 13:35:00,2022-03-07 13:44:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 13:46:00,2022-03-07 13:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 13:55:00,2022-03-07 14:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 14:06:00,2022-03-07 14:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 14:15:00,2022-03-07 14:24:00,Station-16,5139,22,4426844,CKB +LINE_6,Station-16,2022-03-07 14:46:00,2022-03-07 14:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 14:55:00,2022-03-07 15:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 15:06:00,2022-03-07 15:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 15:15:00,2022-03-07 15:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 15:26:00,2022-03-07 15:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 15:35:00,2022-03-07 15:44:00,Station-16,5139,22,4426844,CKB +LINE_6,Station-16,2022-03-07 16:06:00,2022-03-07 16:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 16:15:00,2022-03-07 16:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 16:26:00,2022-03-07 16:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 16:35:00,2022-03-07 16:44:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 16:46:00,2022-03-07 16:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 16:55:00,2022-03-07 17:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 17:06:00,2022-03-07 17:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 17:15:00,2022-03-07 17:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 17:26:00,2022-03-07 17:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 17:35:00,2022-03-07 17:44:00,Station-16,5139,22,4426844,CKB +LINE_6,Station-16,2022-03-07 18:06:00,2022-03-07 18:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 18:15:00,2022-03-07 18:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 18:26:00,2022-03-07 18:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 18:35:00,2022-03-07 18:44:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 18:46:00,2022-03-07 18:55:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 18:55:00,2022-03-07 19:04:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 19:06:00,2022-03-07 19:15:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 19:15:00,2022-03-07 19:24:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 19:26:00,2022-03-07 19:35:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 19:35:00,2022-03-07 19:44:00,Station-16,5139,21,4426844,CKB +LINE_6,Station-16,2022-03-07 20:05:00,2022-03-07 20:14:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 20:14:00,2022-03-07 20:23:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 20:25:00,2022-03-07 20:34:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 20:34:00,2022-03-07 20:43:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 20:45:00,2022-03-07 20:54:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 20:54:00,2022-03-07 21:03:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 21:05:00,2022-03-07 21:14:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 21:14:00,2022-03-07 21:23:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 21:25:00,2022-03-07 21:34:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 21:34:00,2022-03-07 21:43:00,Station-16,5139,22,4426844,CKB +LINE_6,Station-16,2022-03-07 22:05:00,2022-03-07 22:14:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 22:14:00,2022-03-07 22:23:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 22:25:00,2022-03-07 22:34:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 22:34:00,2022-03-07 22:43:00,Station-16,5139,2,4426844,CKB +LINE_6,Station-16,2022-03-07 22:45:00,2022-03-07 22:54:00,Station-17,4781,0,4426844,CKB +LINE_6,Station-17,2022-03-07 22:54:00,2022-03-07 23:03:00,Station-16,5139,0,4426844,CKB +LINE_6,Station-16,2022-03-07 23:03:00,2022-03-07 23:03:00,Station-0,0.06,0,4426844,CKB +LINE_7,Station-0,2022-03-08 00:06:00,2022-03-08 00:06:00,Station-18,0.06,0,4708594,CKB +LINE_7,Station-18,2022-03-08 00:06:00,2022-03-08 00:27:00,Station-19,7827,0,4708594,CKB +LINE_8,Station-19,2022-03-08 00:27:00,2022-03-08 00:48:00,Station-20,11079,0,4708594,CKB +LINE_8,Station-20,2022-03-08 00:48:00,2022-03-08 01:25:00,Station-21,20641,8,4708594,CKB +LINE_8,Station-21,2022-03-08 01:33:00,2022-03-08 02:16:00,Station-20,20579,1,4708594,CKB +LINE_8,Station-20,2022-03-08 02:17:00,2022-03-08 02:55:00,Station-21,20641,8,4708594,CKB +LINE_8,Station-21,2022-03-08 03:03:00,2022-03-08 03:46:00,Station-20,20579,1,4708594,CKB +LINE_8,Station-20,2022-03-08 03:47:00,2022-03-08 04:25:00,Station-21,20641,0,4708594,CKB +LINE_8,Station-21,2022-03-08 04:25:00,2022-03-08 04:25:00,Station-0,0.06,0,4708594,CKB +LINE_9,Station-22,2022-03-07 05:15:00,2022-03-07 06:01:00,Station-23,17.9,0,4317624,VDL +LINE_9,Station-23,2022-03-07 06:01:00,2022-03-07 06:15:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 06:23:00,2022-03-07 06:37:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 06:41:00,2022-03-07 06:55:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 07:03:00,2022-03-07 07:17:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 07:21:00,2022-03-07 07:35:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 07:43:00,2022-03-07 07:57:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 08:01:00,2022-03-07 08:15:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 08:23:00,2022-03-07 08:37:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 08:41:00,2022-03-07 08:55:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 09:03:00,2022-03-07 09:17:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 09:21:00,2022-03-07 09:35:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 09:43:00,2022-03-07 09:57:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 10:01:00,2022-03-07 10:15:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 10:23:00,2022-03-07 10:37:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 10:41:00,2022-03-07 10:55:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 11:03:00,2022-03-07 11:17:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 11:21:00,2022-03-07 11:35:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 11:43:00,2022-03-07 11:57:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 12:01:00,2022-03-07 12:15:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 12:23:00,2022-03-07 12:37:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 12:41:00,2022-03-07 12:55:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 13:03:00,2022-03-07 13:17:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 13:21:00,2022-03-07 13:35:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 13:43:00,2022-03-07 13:57:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 14:01:00,2022-03-07 14:15:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 14:23:00,2022-03-07 14:37:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 14:41:00,2022-03-07 14:55:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 15:03:00,2022-03-07 15:17:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 15:21:00,2022-03-07 15:35:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 15:43:00,2022-03-07 15:57:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 16:01:00,2022-03-07 16:15:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 16:23:00,2022-03-07 16:37:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 16:41:00,2022-03-07 16:55:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 17:03:00,2022-03-07 17:17:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 17:21:00,2022-03-07 17:35:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 17:43:00,2022-03-07 17:57:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 18:01:00,2022-03-07 18:15:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 18:23:00,2022-03-07 18:37:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 18:41:00,2022-03-07 18:55:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 19:03:00,2022-03-07 19:17:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 19:21:00,2022-03-07 19:35:00,Station-23,4637,8,4317624,VDL +LINE_9,Station-23,2022-03-07 19:43:00,2022-03-07 19:57:00,Station-23,4637,4,4317624,VDL +LINE_9,Station-23,2022-03-07 20:01:00,2022-03-07 20:14:00,Station-23,4637,9,4317624,VDL +LINE_9,Station-23,2022-03-07 20:23:00,2022-03-07 20:36:00,Station-23,4637,0,4317624,VDL +LINE_9,Station-23,2022-03-07 20:36:00,2022-03-07 21:15:00,Station-22,19.8,0,4317624,VDL +LINE_10,Station-0,2022-03-07 04:56:00,2022-03-07 04:56:00,Station-24,0.06,18,4425667,CKB +LINE_10,Station-24,2022-03-07 05:14:00,2022-03-07 05:20:00,Station-25,3.29,0,4425667,CKB +LINE_10,Station-25,2022-03-07 05:20:00,2022-03-07 05:24:00,Station-24,2954,20,4425667,CKB +LINE_10,Station-24,2022-03-07 05:44:00,2022-03-07 05:50:00,Station-25,3.29,0,4425667,CKB +LINE_10,Station-25,2022-03-07 05:50:00,2022-03-07 05:54:00,Station-24,2954,5,4425667,CKB +LINE_10,Station-24,2022-03-07 05:59:00,2022-03-07 06:06:00,Station-25,3.29,2,4425667,CKB +LINE_10,Station-25,2022-03-07 06:08:00,2022-03-07 06:13:00,Station-24,2954,19,4425667,CKB +LINE_10,Station-24,2022-03-07 06:32:00,2022-03-07 06:39:00,Station-25,3.29,1,4425667,CKB +LINE_10,Station-25,2022-03-07 06:40:00,2022-03-07 06:45:00,Station-24,2954,7,4425667,CKB +LINE_10,Station-24,2022-03-07 06:52:00,2022-03-07 06:59:00,Station-25,3.29,1,4425667,CKB +LINE_10,Station-25,2022-03-07 07:00:00,2022-03-07 07:05:00,Station-24,2954,7,4425667,CKB +LINE_10,Station-24,2022-03-07 07:12:00,2022-03-07 07:19:00,Station-25,3.29,1,4425667,CKB +LINE_10,Station-25,2022-03-07 07:20:00,2022-03-07 07:25:00,Station-24,2954,7,4425667,CKB +LINE_10,Station-24,2022-03-07 07:32:00,2022-03-07 07:39:00,Station-25,3.29,1,4425667,CKB +LINE_10,Station-25,2022-03-07 07:40:00,2022-03-07 07:45:00,Station-24,2954,295,4425667,CKB +LINE_10,Station-24,2022-03-07 12:40:00,2022-03-07 12:47:00,Station-25,3.29,2,4425667,CKB +LINE_10,Station-25,2022-03-07 12:49:00,2022-03-07 12:54:00,Station-24,2954,46,4425667,CKB +LINE_10,Station-24,2022-03-07 13:40:00,2022-03-07 13:47:00,Station-25,3.29,2,4425667,CKB +LINE_10,Station-25,2022-03-07 13:49:00,2022-03-07 13:54:00,Station-24,2954,434,4425667,CKB +LINE_10,Station-24,2022-03-07 21:08:00,2022-03-07 21:08:00,Station-0,0.06,0,4425667,CKB +LINE_11,Station-0,2022-03-07 07:20:00,2022-03-07 07:20:00,Station-26,0.06,0,4448149,CKB +LINE_11,Station-26,2022-03-07 07:20:00,2022-03-07 07:50:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 08:00:00,2022-03-07 08:30:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 08:40:00,2022-03-07 09:10:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 09:20:00,2022-03-07 09:50:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 10:00:00,2022-03-07 10:30:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 10:40:00,2022-03-07 11:10:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 11:20:00,2022-03-07 11:50:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 12:00:00,2022-03-07 12:30:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 12:40:00,2022-03-07 13:10:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 13:20:00,2022-03-07 13:50:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 14:00:00,2022-03-07 14:30:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 14:40:00,2022-03-07 15:10:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 15:20:00,2022-03-07 15:50:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 16:00:00,2022-03-07 16:30:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 16:40:00,2022-03-07 17:10:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 17:20:00,2022-03-07 17:50:00,Station-26,9266,10,4448149,CKB +LINE_11,Station-26,2022-03-07 18:00:00,2022-03-07 18:30:00,Station-26,9266,0,4448149,CKB +LINE_11,Station-26,2022-03-07 18:30:00,2022-03-07 18:30:00,Station-0,0.06,0,4448149,CKB +LINE_12,Station-0,2022-03-07 07:10:00,2022-03-07 07:10:00,Station-27,0.06,0,4733894,CKB +LINE_12,Station-27,2022-03-07 07:10:00,2022-03-07 07:18:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 07:28:00,2022-03-07 07:40:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 07:40:00,2022-03-07 07:48:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 07:58:00,2022-03-07 08:10:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 08:10:00,2022-03-07 08:18:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 08:28:00,2022-03-07 08:40:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 08:40:00,2022-03-07 08:48:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 08:58:00,2022-03-07 09:10:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 09:10:00,2022-03-07 09:18:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 09:28:00,2022-03-07 09:40:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 09:40:00,2022-03-07 09:48:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 09:58:00,2022-03-07 10:10:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 10:10:00,2022-03-07 10:18:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 10:28:00,2022-03-07 10:40:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 10:40:00,2022-03-07 10:48:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 10:58:00,2022-03-07 11:10:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 11:10:00,2022-03-07 11:18:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 11:28:00,2022-03-07 11:40:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 11:40:00,2022-03-07 11:48:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 11:58:00,2022-03-07 12:10:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 12:10:00,2022-03-07 12:18:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 12:28:00,2022-03-07 12:40:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 12:40:00,2022-03-07 12:48:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 12:58:00,2022-03-07 13:10:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 13:10:00,2022-03-07 13:18:00,Station-28,2169,10,4733894,CKB +LINE_12,Station-28,2022-03-07 13:28:00,2022-03-07 13:40:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 13:40:00,2022-03-07 13:48:00,Station-28,2169,8,4733894,CKB +LINE_12,Station-28,2022-03-07 13:56:00,2022-03-07 14:10:00,Station-27,2952,0,4733894,CKB +LINE_12,Station-27,2022-03-07 14:10:00,2022-03-07 14:19:00,Station-28,2169,14,4733894,CKB +LINE_12,Station-28,2022-03-07 14:33:00,2022-03-07 14:47:00,Station-27,2952,3,4733894,CKB +LINE_12,Station-27,2022-03-07 14:50:00,2022-03-07 14:59:00,Station-28,2169,14,4733894,CKB +LINE_12,Station-28,2022-03-07 15:13:00,2022-03-07 15:27:00,Station-27,2952,3,4733894,CKB +LINE_12,Station-27,2022-03-07 15:30:00,2022-03-07 15:39:00,Station-28,2169,14,4733894,CKB +LINE_12,Station-28,2022-03-07 15:53:00,2022-03-07 16:07:00,Station-27,2952,3,4733894,CKB +LINE_12,Station-27,2022-03-07 16:10:00,2022-03-07 16:19:00,Station-28,2169,14,4733894,CKB +LINE_12,Station-28,2022-03-07 16:33:00,2022-03-07 16:47:00,Station-27,2952,3,4733894,CKB +LINE_12,Station-27,2022-03-07 16:50:00,2022-03-07 16:59:00,Station-28,2169,14,4733894,CKB +LINE_12,Station-28,2022-03-07 17:13:00,2022-03-07 17:27:00,Station-27,2952,3,4733894,CKB +LINE_12,Station-27,2022-03-07 17:30:00,2022-03-07 17:39:00,Station-28,2169,13,4733894,CKB +LINE_12,Station-28,2022-03-07 17:52:00,2022-03-07 18:05:00,Station-27,2952,5,4733894,CKB +LINE_12,Station-27,2022-03-07 18:10:00,2022-03-07 18:18:00,Station-28,2169,0,4733894,CKB +LINE_12,Station-28,2022-03-07 18:18:00,2022-03-07 18:18:00,Station-0,0.06,0,4733894,CKB +LINE_12,Station-0,2022-03-07 14:13:00,2022-03-07 14:13:00,Station-28,0.06,0,4734199,CKB +LINE_12,Station-28,2022-03-07 14:13:00,2022-03-07 14:27:00,Station-27,2952,3,4734199,CKB +LINE_12,Station-27,2022-03-07 14:30:00,2022-03-07 14:39:00,Station-28,2169,14,4734199,CKB +LINE_12,Station-28,2022-03-07 14:53:00,2022-03-07 15:07:00,Station-27,2952,3,4734199,CKB +LINE_12,Station-27,2022-03-07 15:10:00,2022-03-07 15:19:00,Station-28,2169,14,4734199,CKB +LINE_12,Station-28,2022-03-07 15:33:00,2022-03-07 15:47:00,Station-27,2952,3,4734199,CKB +LINE_12,Station-27,2022-03-07 15:50:00,2022-03-07 15:59:00,Station-28,2169,14,4734199,CKB +LINE_12,Station-28,2022-03-07 16:13:00,2022-03-07 16:27:00,Station-27,2952,3,4734199,CKB +LINE_12,Station-27,2022-03-07 16:30:00,2022-03-07 16:39:00,Station-28,2169,14,4734199,CKB +LINE_12,Station-28,2022-03-07 16:53:00,2022-03-07 17:07:00,Station-27,2952,3,4734199,CKB +LINE_12,Station-27,2022-03-07 17:10:00,2022-03-07 17:19:00,Station-28,2169,14,4734199,CKB +LINE_12,Station-28,2022-03-07 17:33:00,2022-03-07 17:47:00,Station-27,2952,3,4734199,CKB +LINE_12,Station-27,2022-03-07 17:50:00,2022-03-07 17:59:00,Station-28,2169,14,4734199,CKB +LINE_12,Station-28,2022-03-07 18:13:00,2022-03-07 18:25:00,Station-27,2952,0,4734199,CKB +LINE_12,Station-27,2022-03-07 18:25:00,2022-03-07 18:25:00,Station-0,0.06,0,4734199,CKB +LINE_13,Station-0,2022-03-08 00:23:00,2022-03-08 00:23:00,Station-29,0.06,0,4318156,CKB +LINE_13,Station-29,2022-03-08 00:23:00,2022-03-08 00:30:00,Station-30,2577,9,4318156,CKB +LINE_14,Station-30,2022-03-08 00:39:00,2022-03-08 00:54:00,Station-31,5937,9,4318156,CKB +LINE_14,Station-31,2022-03-08 01:03:00,2022-03-08 01:17:00,Station-30,6.19,0,4318156,CKB +LINE_13,Station-30,2022-03-08 01:17:00,2022-03-08 01:23:00,Station-29,2555,0,4318156,CKB +LINE_13,Station-29,2022-03-08 01:23:00,2022-03-08 01:30:00,Station-30,2577,9,4318156,CKB +LINE_14,Station-30,2022-03-08 01:39:00,2022-03-08 01:54:00,Station-31,5937,9,4318156,CKB +LINE_14,Station-31,2022-03-08 02:03:00,2022-03-08 02:17:00,Station-30,6.19,0,4318156,CKB +LINE_13,Station-30,2022-03-08 02:17:00,2022-03-08 02:23:00,Station-29,2555,0,4318156,CKB +LINE_13,Station-29,2022-03-08 02:23:00,2022-03-08 02:30:00,Station-30,2577,9,4318156,CKB +LINE_14,Station-30,2022-03-08 02:39:00,2022-03-08 02:54:00,Station-31,5937,9,4318156,CKB +LINE_14,Station-31,2022-03-08 03:03:00,2022-03-08 03:17:00,Station-30,6.19,0,4318156,CKB +LINE_13,Station-30,2022-03-08 03:17:00,2022-03-08 03:23:00,Station-29,2555,0,4318156,CKB +LINE_13,Station-29,2022-03-08 03:23:00,2022-03-08 03:30:00,Station-30,2577,9,4318156,CKB +LINE_14,Station-30,2022-03-08 03:39:00,2022-03-08 03:54:00,Station-31,5937,9,4318156,CKB +LINE_14,Station-31,2022-03-08 04:03:00,2022-03-08 04:17:00,Station-30,6.19,0,4318156,CKB +LINE_13,Station-30,2022-03-08 04:17:00,2022-03-08 04:23:00,Station-29,2555,0,4318156,CKB +LINE_13,Station-29,2022-03-08 04:23:00,2022-03-08 04:23:00,Station-0,0.06,0,4318156,CKB +LINE_14,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-31,0.06,0,4318176,CKB +LINE_14,Station-31,2022-03-08 00:33:00,2022-03-08 00:47:00,Station-30,6.19,0,4318176,CKB +LINE_13,Station-30,2022-03-08 00:47:00,2022-03-08 00:53:00,Station-29,2555,0,4318176,CKB +LINE_13,Station-29,2022-03-08 00:53:00,2022-03-08 01:00:00,Station-30,2577,9,4318176,CKB +LINE_14,Station-30,2022-03-08 01:09:00,2022-03-08 01:24:00,Station-31,5937,9,4318176,CKB +LINE_14,Station-31,2022-03-08 01:33:00,2022-03-08 01:47:00,Station-30,6.19,0,4318176,CKB +LINE_13,Station-30,2022-03-08 01:47:00,2022-03-08 01:53:00,Station-29,2555,0,4318176,CKB +LINE_13,Station-29,2022-03-08 01:53:00,2022-03-08 02:00:00,Station-30,2577,9,4318176,CKB +LINE_14,Station-30,2022-03-08 02:09:00,2022-03-08 02:24:00,Station-31,5937,9,4318176,CKB +LINE_14,Station-31,2022-03-08 02:33:00,2022-03-08 02:47:00,Station-30,6.19,0,4318176,CKB +LINE_13,Station-30,2022-03-08 02:47:00,2022-03-08 02:53:00,Station-29,2555,0,4318176,CKB +LINE_13,Station-29,2022-03-08 02:53:00,2022-03-08 03:00:00,Station-30,2577,9,4318176,CKB +LINE_14,Station-30,2022-03-08 03:09:00,2022-03-08 03:24:00,Station-31,5937,9,4318176,CKB +LINE_14,Station-31,2022-03-08 03:33:00,2022-03-08 03:47:00,Station-30,6.19,0,4318176,CKB +LINE_13,Station-30,2022-03-08 03:47:00,2022-03-08 03:53:00,Station-29,2555,0,4318176,CKB +LINE_13,Station-29,2022-03-08 03:53:00,2022-03-08 04:00:00,Station-30,2577,9,4318176,CKB +LINE_14,Station-30,2022-03-08 04:09:00,2022-03-08 04:24:00,Station-31,5937,0,4318176,CKB +LINE_14,Station-31,2022-03-08 04:24:00,2022-03-08 04:24:00,Station-0,0.06,0,4318176,CKB +LINE_15,Station-0,2022-03-08 00:57:00,2022-03-08 00:57:00,Station-32,0.06,0,4319351,CKB +LINE_15,Station-32,2022-03-08 00:57:00,2022-03-08 01:06:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 01:06:00,2022-03-08 01:11:00,Station-32,2936,16,4319351,CKB +LINE_15,Station-32,2022-03-08 01:27:00,2022-03-08 01:36:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 01:36:00,2022-03-08 01:41:00,Station-32,2936,16,4319351,CKB +LINE_15,Station-32,2022-03-08 01:57:00,2022-03-08 02:06:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 02:06:00,2022-03-08 02:11:00,Station-32,2936,16,4319351,CKB +LINE_15,Station-32,2022-03-08 02:27:00,2022-03-08 02:36:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 02:36:00,2022-03-08 02:41:00,Station-32,2936,16,4319351,CKB +LINE_15,Station-32,2022-03-08 02:57:00,2022-03-08 03:06:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 03:06:00,2022-03-08 03:11:00,Station-32,2936,16,4319351,CKB +LINE_15,Station-32,2022-03-08 03:27:00,2022-03-08 03:36:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 03:36:00,2022-03-08 03:41:00,Station-32,2936,16,4319351,CKB +LINE_15,Station-32,2022-03-08 03:57:00,2022-03-08 04:06:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 04:06:00,2022-03-08 04:11:00,Station-32,2936,16,4319351,CKB +LINE_15,Station-32,2022-03-08 04:27:00,2022-03-08 04:36:00,Station-33,4343,0,4319351,CKB +LINE_15,Station-33,2022-03-08 04:36:00,2022-03-08 04:36:00,Station-0,0.06,0,4319351,CKB +LINE_16,Station-0,2022-03-08 00:29:00,2022-03-08 00:29:00,Station-34,0.06,0,4751086,CKB +LINE_16,Station-34,2022-03-08 00:29:00,2022-03-08 00:41:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 00:47:00,2022-03-08 00:57:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 00:59:00,2022-03-08 01:11:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 01:17:00,2022-03-08 01:27:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 01:29:00,2022-03-08 01:41:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 01:47:00,2022-03-08 01:57:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 01:59:00,2022-03-08 02:11:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 02:17:00,2022-03-08 02:27:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 02:29:00,2022-03-08 02:41:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 02:47:00,2022-03-08 02:57:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 02:59:00,2022-03-08 03:11:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 03:17:00,2022-03-08 03:27:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 03:29:00,2022-03-08 03:41:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 03:47:00,2022-03-08 03:57:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 03:59:00,2022-03-08 04:11:00,Station-35,4481,6,4751086,CKB +LINE_16,Station-35,2022-03-08 04:17:00,2022-03-08 04:27:00,Station-34,4031,2,4751086,CKB +LINE_16,Station-34,2022-03-08 04:29:00,2022-03-08 04:41:00,Station-35,4481,0,4751086,CKB +LINE_16,Station-35,2022-03-08 04:41:00,2022-03-08 04:41:00,Station-0,0.06,0,4751086,CKB +LINE_17,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-34,0.06,0,4453544,CKB +LINE_17,Station-34,2022-03-08 00:30:00,2022-03-08 00:44:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 00:44:00,2022-03-08 00:57:00,Station-34,5302,3,4453544,CKB +LINE_17,Station-34,2022-03-08 01:00:00,2022-03-08 01:14:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 01:14:00,2022-03-08 01:27:00,Station-34,5302,3,4453544,CKB +LINE_17,Station-34,2022-03-08 01:30:00,2022-03-08 01:44:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 01:44:00,2022-03-08 01:57:00,Station-34,5302,3,4453544,CKB +LINE_17,Station-34,2022-03-08 02:00:00,2022-03-08 02:14:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 02:14:00,2022-03-08 02:27:00,Station-34,5302,3,4453544,CKB +LINE_17,Station-34,2022-03-08 02:30:00,2022-03-08 02:44:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 02:44:00,2022-03-08 02:57:00,Station-34,5302,3,4453544,CKB +LINE_17,Station-34,2022-03-08 03:00:00,2022-03-08 03:14:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 03:14:00,2022-03-08 03:27:00,Station-34,5302,3,4453544,CKB +LINE_17,Station-34,2022-03-08 03:30:00,2022-03-08 03:44:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 03:44:00,2022-03-08 03:57:00,Station-34,5302,3,4453544,CKB +LINE_17,Station-34,2022-03-08 04:00:00,2022-03-08 04:14:00,Station-36,4801,0,4453544,CKB +LINE_17,Station-36,2022-03-08 04:14:00,2022-03-08 04:27:00,Station-34,5302,0,4453544,CKB +LINE_17,Station-34,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,4453544,CKB +LINE_18,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-37,0.06,0,4374466,CKB +LINE_18,Station-37,2022-03-08 00:43:00,2022-03-08 01:33:00,Station-37,20434,10,4374466,CKB +LINE_18,Station-37,2022-03-08 01:43:00,2022-03-08 02:33:00,Station-37,20434,10,4374466,CKB +LINE_18,Station-37,2022-03-08 02:43:00,2022-03-08 03:33:00,Station-37,20434,10,4374466,CKB +LINE_18,Station-37,2022-03-08 03:43:00,2022-03-08 04:33:00,Station-37,20434,0,4374466,CKB +LINE_18,Station-37,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,4374466,CKB +LINE_18,Station-0,2022-03-08 00:13:00,2022-03-08 00:13:00,Station-37,0.06,0,4374471,CKB +LINE_18,Station-37,2022-03-08 00:13:00,2022-03-08 01:03:00,Station-37,20434,10,4374471,CKB +LINE_18,Station-37,2022-03-08 01:13:00,2022-03-08 02:03:00,Station-37,20434,10,4374471,CKB +LINE_18,Station-37,2022-03-08 02:13:00,2022-03-08 03:03:00,Station-37,20434,10,4374471,CKB +LINE_18,Station-37,2022-03-08 03:13:00,2022-03-08 04:03:00,Station-37,20434,0,4374471,CKB +LINE_18,Station-37,2022-03-08 04:03:00,2022-03-08 04:03:00,Station-0,0.06,0,4374471,CKB +LINE_19,Station-0,2022-03-08 00:24:00,2022-03-08 00:24:00,Station-38,0.06,0,4456447,CKB +LINE_19,Station-38,2022-03-08 00:24:00,2022-03-08 00:48:00,Station-39,11.86,4,4456447,CKB +LINE_19,Station-39,2022-03-08 00:52:00,2022-03-08 01:14:00,Station-38,11139,10,4456447,CKB +LINE_19,Station-38,2022-03-08 01:24:00,2022-03-08 01:48:00,Station-39,11.86,4,4456447,CKB +LINE_19,Station-39,2022-03-08 01:52:00,2022-03-08 02:14:00,Station-38,11139,10,4456447,CKB +LINE_19,Station-38,2022-03-08 02:24:00,2022-03-08 02:48:00,Station-39,11.86,4,4456447,CKB +LINE_19,Station-39,2022-03-08 02:52:00,2022-03-08 03:14:00,Station-38,11139,10,4456447,CKB +LINE_19,Station-38,2022-03-08 03:24:00,2022-03-08 03:48:00,Station-39,11.86,4,4456447,CKB +LINE_19,Station-39,2022-03-08 03:52:00,2022-03-08 04:14:00,Station-38,11139,0,4456447,CKB +LINE_19,Station-38,2022-03-08 04:14:00,2022-03-08 04:14:00,Station-0,0.06,0,4456447,CKB +LINE_19,Station-0,2022-03-08 00:22:00,2022-03-08 00:22:00,Station-39,0.06,0,4456455,CKB +LINE_19,Station-39,2022-03-08 00:22:00,2022-03-08 00:44:00,Station-38,11139,10,4456455,CKB +LINE_19,Station-38,2022-03-08 00:54:00,2022-03-08 01:18:00,Station-39,11.86,4,4456455,CKB +LINE_19,Station-39,2022-03-08 01:22:00,2022-03-08 01:44:00,Station-38,11139,10,4456455,CKB +LINE_19,Station-38,2022-03-08 01:54:00,2022-03-08 02:18:00,Station-39,11.86,4,4456455,CKB +LINE_19,Station-39,2022-03-08 02:22:00,2022-03-08 02:44:00,Station-38,11139,10,4456455,CKB +LINE_19,Station-38,2022-03-08 02:54:00,2022-03-08 03:18:00,Station-39,11.86,4,4456455,CKB +LINE_19,Station-39,2022-03-08 03:22:00,2022-03-08 03:44:00,Station-38,11139,10,4456455,CKB +LINE_19,Station-38,2022-03-08 03:54:00,2022-03-08 04:18:00,Station-39,11.86,4,4456455,CKB +LINE_19,Station-39,2022-03-08 04:22:00,2022-03-08 04:44:00,Station-38,11139,0,4456455,CKB +LINE_19,Station-38,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,4456455,CKB +LINE_20,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,4747649,CKB +LINE_20,Station-13,2022-03-08 00:32:00,2022-03-08 00:44:00,Station-40,4212,3,4747649,CKB +LINE_20,Station-40,2022-03-08 00:47:00,2022-03-08 01:16:00,Station-41,13048,0,4747649,CKB +LINE_20,Station-41,2022-03-08 01:16:00,2022-03-08 01:42:00,Station-40,12869,5,4747649,CKB +LINE_20,Station-40,2022-03-08 01:47:00,2022-03-08 02:16:00,Station-41,13048,0,4747649,CKB +LINE_20,Station-41,2022-03-08 02:16:00,2022-03-08 02:42:00,Station-40,12869,5,4747649,CKB +LINE_20,Station-40,2022-03-08 02:47:00,2022-03-08 03:16:00,Station-41,13048,0,4747649,CKB +LINE_20,Station-41,2022-03-08 03:16:00,2022-03-08 03:42:00,Station-40,12869,5,4747649,CKB +LINE_20,Station-40,2022-03-08 03:47:00,2022-03-08 04:16:00,Station-41,13048,0,4747649,CKB +LINE_20,Station-41,2022-03-08 04:16:00,2022-03-08 04:34:00,Station-42,9538,0,4747649,CKB +LINE_20,Station-42,2022-03-08 04:34:00,2022-03-08 04:34:00,Station-0,0.06,0,4747649,CKB +LINE_20,Station-0,2022-03-08 00:17:00,2022-03-08 00:17:00,Station-40,0.06,0,4747659,CKB +LINE_20,Station-40,2022-03-08 00:17:00,2022-03-08 00:46:00,Station-41,13048,0,4747659,CKB +LINE_20,Station-41,2022-03-08 00:46:00,2022-03-08 01:12:00,Station-40,12869,5,4747659,CKB +LINE_20,Station-40,2022-03-08 01:17:00,2022-03-08 01:46:00,Station-41,13048,0,4747659,CKB +LINE_20,Station-41,2022-03-08 01:46:00,2022-03-08 02:12:00,Station-40,12869,5,4747659,CKB +LINE_20,Station-40,2022-03-08 02:17:00,2022-03-08 02:46:00,Station-41,13048,0,4747659,CKB +LINE_20,Station-41,2022-03-08 02:46:00,2022-03-08 03:12:00,Station-40,12869,5,4747659,CKB +LINE_20,Station-40,2022-03-08 03:17:00,2022-03-08 03:46:00,Station-41,13048,0,4747659,CKB +LINE_20,Station-41,2022-03-08 03:46:00,2022-03-08 04:12:00,Station-40,12869,5,4747659,CKB +LINE_20,Station-40,2022-03-08 04:17:00,2022-03-08 04:28:00,Station-13,4316,0,4747659,CKB +LINE_20,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,4747659,CKB +LINE_21,Station-0,2022-03-08 00:49:00,2022-03-08 00:49:00,Station-3,0.06,0,4434340,CKB +LINE_21,Station-3,2022-03-08 00:49:00,2022-03-08 01:04:00,Station-16,10229,0,4434340,CKB +LINE_21,Station-16,2022-03-08 01:04:00,2022-03-08 01:19:00,Station-3,11801,0,4434340,CKB +LINE_21,Station-3,2022-03-08 01:19:00,2022-03-08 01:34:00,Station-16,10229,0,4434340,CKB +LINE_21,Station-16,2022-03-08 01:34:00,2022-03-08 01:49:00,Station-3,11801,0,4434340,CKB +LINE_21,Station-3,2022-03-08 01:49:00,2022-03-08 02:04:00,Station-16,10229,0,4434340,CKB +LINE_21,Station-16,2022-03-08 02:04:00,2022-03-08 02:19:00,Station-3,11801,0,4434340,CKB +LINE_21,Station-3,2022-03-08 02:19:00,2022-03-08 02:34:00,Station-16,10229,0,4434340,CKB +LINE_21,Station-16,2022-03-08 02:34:00,2022-03-08 02:49:00,Station-3,11801,0,4434340,CKB +LINE_21,Station-3,2022-03-08 02:49:00,2022-03-08 03:04:00,Station-16,10229,0,4434340,CKB +LINE_21,Station-16,2022-03-08 03:04:00,2022-03-08 03:19:00,Station-3,11801,0,4434340,CKB +LINE_21,Station-3,2022-03-08 03:19:00,2022-03-08 03:34:00,Station-16,10229,0,4434340,CKB +LINE_21,Station-16,2022-03-08 03:34:00,2022-03-08 03:49:00,Station-3,11801,0,4434340,CKB +LINE_21,Station-3,2022-03-08 03:49:00,2022-03-08 04:04:00,Station-16,10229,0,4434340,CKB +LINE_21,Station-16,2022-03-08 04:04:00,2022-03-08 04:19:00,Station-3,11801,23,4434340,CKB +LINE_22,Station-3,2022-03-08 04:42:00,2022-03-08 05:04:00,Station-43,6.81,0,4434340,CKB +LINE_22,Station-43,2022-03-08 05:04:00,2022-03-08 05:04:00,Station-0,0.06,0,4434340,CKB +LINE_8,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,4434896,CKB +LINE_8,Station-13,2022-03-08 00:32:00,2022-03-08 00:57:00,Station-21,11545,6,4434896,CKB +LINE_8,Station-21,2022-03-08 01:03:00,2022-03-08 01:46:00,Station-20,20579,1,4434896,CKB +LINE_8,Station-20,2022-03-08 01:47:00,2022-03-08 02:25:00,Station-21,20641,8,4434896,CKB +LINE_8,Station-21,2022-03-08 02:33:00,2022-03-08 03:16:00,Station-20,20579,1,4434896,CKB +LINE_8,Station-20,2022-03-08 03:17:00,2022-03-08 03:55:00,Station-21,20641,8,4434896,CKB +LINE_8,Station-21,2022-03-08 04:03:00,2022-03-08 04:28:00,Station-13,11499,0,4434896,CKB +LINE_8,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,4434896,CKB +LINE_8,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-21,0.06,0,4434901,CKB +LINE_8,Station-21,2022-03-08 00:33:00,2022-03-08 01:16:00,Station-20,20579,1,4434901,CKB +LINE_8,Station-20,2022-03-08 01:17:00,2022-03-08 01:55:00,Station-21,20641,8,4434901,CKB +LINE_8,Station-21,2022-03-08 02:03:00,2022-03-08 02:46:00,Station-20,20579,1,4434901,CKB +LINE_8,Station-20,2022-03-08 02:47:00,2022-03-08 03:25:00,Station-21,20641,8,4434901,CKB +LINE_8,Station-21,2022-03-08 03:33:00,2022-03-08 04:16:00,Station-20,20579,1,4434901,CKB +LINE_8,Station-20,2022-03-08 04:17:00,2022-03-08 04:51:00,Station-44,18752,0,4434901,CKB +LINE_8,Station-44,2022-03-08 04:51:00,2022-03-08 04:51:00,Station-0,0.06,0,4434901,CKB +LINE_23,Station-0,2022-03-08 00:34:00,2022-03-08 00:34:00,Station-45,0.06,0,4619765,CKB +LINE_23,Station-45,2022-03-08 00:34:00,2022-03-08 01:00:00,Station-46,9016,0,4619765,CKB +LINE_23,Station-46,2022-03-08 01:00:00,2022-03-08 01:27:00,Station-45,10083,7,4619765,CKB +LINE_23,Station-45,2022-03-08 01:34:00,2022-03-08 02:00:00,Station-46,9016,0,4619765,CKB +LINE_23,Station-46,2022-03-08 02:00:00,2022-03-08 02:27:00,Station-45,10083,7,4619765,CKB +LINE_23,Station-45,2022-03-08 02:34:00,2022-03-08 03:00:00,Station-46,9016,0,4619765,CKB +LINE_23,Station-46,2022-03-08 03:00:00,2022-03-08 03:27:00,Station-45,10083,7,4619765,CKB +LINE_23,Station-45,2022-03-08 03:34:00,2022-03-08 04:00:00,Station-46,9016,0,4619765,CKB +LINE_23,Station-46,2022-03-08 04:00:00,2022-03-08 04:27:00,Station-45,10083,0,4619765,CKB +LINE_23,Station-45,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,4619765,CKB +LINE_23,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-46,0.06,0,4619990,CKB +LINE_23,Station-46,2022-03-08 00:30:00,2022-03-08 00:57:00,Station-45,10083,7,4619990,CKB +LINE_23,Station-45,2022-03-08 01:04:00,2022-03-08 01:30:00,Station-46,9016,0,4619990,CKB +LINE_23,Station-46,2022-03-08 01:30:00,2022-03-08 01:57:00,Station-45,10083,7,4619990,CKB +LINE_23,Station-45,2022-03-08 02:04:00,2022-03-08 02:30:00,Station-46,9016,0,4619990,CKB +LINE_23,Station-46,2022-03-08 02:30:00,2022-03-08 02:57:00,Station-45,10083,7,4619990,CKB +LINE_23,Station-45,2022-03-08 03:04:00,2022-03-08 03:30:00,Station-46,9016,0,4619990,CKB +LINE_23,Station-46,2022-03-08 03:30:00,2022-03-08 03:57:00,Station-45,10083,7,4619990,CKB +LINE_23,Station-45,2022-03-08 04:04:00,2022-03-08 04:30:00,Station-46,9016,0,4619990,CKB +LINE_23,Station-46,2022-03-08 04:30:00,2022-03-08 04:57:00,Station-45,10083,0,4619990,CKB +LINE_23,Station-45,2022-03-08 04:57:00,2022-03-08 04:57:00,Station-0,0.06,0,4619990,CKB +LINE_24,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,4374743,CKB +LINE_24,Station-21,2022-03-08 00:31:00,2022-03-08 00:44:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 00:44:00,2022-03-08 00:56:00,Station-21,5362,5,4374743,CKB +LINE_24,Station-21,2022-03-08 01:01:00,2022-03-08 01:14:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 01:14:00,2022-03-08 01:26:00,Station-21,5362,5,4374743,CKB +LINE_24,Station-21,2022-03-08 01:31:00,2022-03-08 01:44:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 01:44:00,2022-03-08 01:56:00,Station-21,5362,5,4374743,CKB +LINE_24,Station-21,2022-03-08 02:01:00,2022-03-08 02:14:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 02:14:00,2022-03-08 02:26:00,Station-21,5362,5,4374743,CKB +LINE_24,Station-21,2022-03-08 02:31:00,2022-03-08 02:44:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 02:44:00,2022-03-08 02:56:00,Station-21,5362,5,4374743,CKB +LINE_24,Station-21,2022-03-08 03:01:00,2022-03-08 03:14:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 03:14:00,2022-03-08 03:26:00,Station-21,5362,5,4374743,CKB +LINE_24,Station-21,2022-03-08 03:31:00,2022-03-08 03:44:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 03:44:00,2022-03-08 03:56:00,Station-21,5362,5,4374743,CKB +LINE_24,Station-21,2022-03-08 04:01:00,2022-03-08 04:14:00,Station-47,4872,0,4374743,CKB +LINE_24,Station-47,2022-03-08 04:14:00,2022-03-08 04:26:00,Station-21,5362,0,4374743,CKB +LINE_24,Station-21,2022-03-08 04:26:00,2022-03-08 04:26:00,Station-0,0.06,0,4374743,CKB +LINE_25,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,4374865,CKB +LINE_25,Station-21,2022-03-08 00:31:00,2022-03-08 00:45:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 00:47:00,2022-03-08 01:01:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 01:01:00,2022-03-08 01:15:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 01:17:00,2022-03-08 01:31:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 01:31:00,2022-03-08 01:45:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 01:47:00,2022-03-08 02:01:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 02:01:00,2022-03-08 02:15:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 02:17:00,2022-03-08 02:31:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 02:31:00,2022-03-08 02:45:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 02:47:00,2022-03-08 03:01:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 03:01:00,2022-03-08 03:15:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 03:17:00,2022-03-08 03:31:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 03:31:00,2022-03-08 03:45:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 03:47:00,2022-03-08 04:01:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 04:01:00,2022-03-08 04:15:00,Station-48,5225,2,4374865,CKB +LINE_25,Station-48,2022-03-08 04:17:00,2022-03-08 04:31:00,Station-21,7617,0,4374865,CKB +LINE_25,Station-21,2022-03-08 04:31:00,2022-03-08 04:31:00,Station-0,0.06,0,4374865,CKB +LINE_26,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-49,0.06,0,4375012,CKB +LINE_26,Station-49,2022-03-08 00:43:00,2022-03-08 00:53:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 00:53:00,2022-03-08 01:03:00,Station-49,4408,10,4375012,CKB +LINE_26,Station-49,2022-03-08 01:13:00,2022-03-08 01:23:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 01:23:00,2022-03-08 01:33:00,Station-49,4408,10,4375012,CKB +LINE_26,Station-49,2022-03-08 01:43:00,2022-03-08 01:53:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 01:53:00,2022-03-08 02:03:00,Station-49,4408,10,4375012,CKB +LINE_26,Station-49,2022-03-08 02:13:00,2022-03-08 02:23:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 02:23:00,2022-03-08 02:33:00,Station-49,4408,10,4375012,CKB +LINE_26,Station-49,2022-03-08 02:43:00,2022-03-08 02:53:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 02:53:00,2022-03-08 03:03:00,Station-49,4408,10,4375012,CKB +LINE_26,Station-49,2022-03-08 03:13:00,2022-03-08 03:23:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 03:23:00,2022-03-08 03:33:00,Station-49,4408,10,4375012,CKB +LINE_26,Station-49,2022-03-08 03:43:00,2022-03-08 03:53:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 03:53:00,2022-03-08 04:03:00,Station-49,4408,10,4375012,CKB +LINE_26,Station-49,2022-03-08 04:13:00,2022-03-08 04:23:00,Station-50,4507,0,4375012,CKB +LINE_26,Station-50,2022-03-08 04:23:00,2022-03-08 04:33:00,Station-49,4408,0,4375012,CKB +LINE_26,Station-49,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,4375012,CKB +LINE_21,Station-0,2022-03-07 00:49:00,2022-03-07 00:49:00,Station-3,0.06,0,4434215,CKB +LINE_21,Station-3,2022-03-07 00:49:00,2022-03-07 01:04:00,Station-16,10229,0,4434215,CKB +LINE_21,Station-16,2022-03-07 01:04:00,2022-03-07 01:19:00,Station-3,11801,0,4434215,CKB +LINE_21,Station-3,2022-03-07 01:19:00,2022-03-07 01:34:00,Station-16,10229,0,4434215,CKB +LINE_21,Station-16,2022-03-07 01:34:00,2022-03-07 01:49:00,Station-3,11801,0,4434215,CKB +LINE_21,Station-3,2022-03-07 01:49:00,2022-03-07 02:04:00,Station-16,10229,0,4434215,CKB +LINE_21,Station-16,2022-03-07 02:04:00,2022-03-07 02:19:00,Station-3,11801,0,4434215,CKB +LINE_21,Station-3,2022-03-07 02:19:00,2022-03-07 02:34:00,Station-16,10229,0,4434215,CKB +LINE_21,Station-16,2022-03-07 02:34:00,2022-03-07 02:49:00,Station-3,11801,0,4434215,CKB +LINE_21,Station-3,2022-03-07 02:49:00,2022-03-07 03:04:00,Station-16,10229,0,4434215,CKB +LINE_21,Station-16,2022-03-07 03:04:00,2022-03-07 03:19:00,Station-3,11801,0,4434215,CKB +LINE_21,Station-3,2022-03-07 03:19:00,2022-03-07 03:34:00,Station-16,10229,0,4434215,CKB +LINE_21,Station-16,2022-03-07 03:34:00,2022-03-07 03:49:00,Station-3,11801,0,4434215,CKB +LINE_21,Station-3,2022-03-07 03:49:00,2022-03-07 04:04:00,Station-16,10229,0,4434215,CKB +LINE_21,Station-16,2022-03-07 04:04:00,2022-03-07 04:19:00,Station-3,11801,23,4434215,CKB +LINE_22,Station-3,2022-03-07 04:42:00,2022-03-07 05:04:00,Station-43,6.81,0,4434215,CKB +LINE_22,Station-43,2022-03-07 05:04:00,2022-03-07 05:04:00,Station-0,0.06,0,4434215,CKB +LINE_13,Station-0,2022-03-07 00:23:00,2022-03-07 00:23:00,Station-29,0.06,0,4318071,CKB +LINE_13,Station-29,2022-03-07 00:23:00,2022-03-07 00:30:00,Station-30,2577,9,4318071,CKB +LINE_14,Station-30,2022-03-07 00:39:00,2022-03-07 00:54:00,Station-31,5937,9,4318071,CKB +LINE_14,Station-31,2022-03-07 01:03:00,2022-03-07 01:17:00,Station-30,6.19,0,4318071,CKB +LINE_13,Station-30,2022-03-07 01:17:00,2022-03-07 01:23:00,Station-29,2555,0,4318071,CKB +LINE_13,Station-29,2022-03-07 01:23:00,2022-03-07 01:30:00,Station-30,2577,9,4318071,CKB +LINE_14,Station-30,2022-03-07 01:39:00,2022-03-07 01:54:00,Station-31,5937,9,4318071,CKB +LINE_14,Station-31,2022-03-07 02:03:00,2022-03-07 02:17:00,Station-30,6.19,0,4318071,CKB +LINE_13,Station-30,2022-03-07 02:17:00,2022-03-07 02:23:00,Station-29,2555,0,4318071,CKB +LINE_13,Station-29,2022-03-07 02:23:00,2022-03-07 02:30:00,Station-30,2577,9,4318071,CKB +LINE_14,Station-30,2022-03-07 02:39:00,2022-03-07 02:54:00,Station-31,5937,9,4318071,CKB +LINE_14,Station-31,2022-03-07 03:03:00,2022-03-07 03:17:00,Station-30,6.19,0,4318071,CKB +LINE_13,Station-30,2022-03-07 03:17:00,2022-03-07 03:23:00,Station-29,2555,0,4318071,CKB +LINE_13,Station-29,2022-03-07 03:23:00,2022-03-07 03:30:00,Station-30,2577,9,4318071,CKB +LINE_14,Station-30,2022-03-07 03:39:00,2022-03-07 03:54:00,Station-31,5937,9,4318071,CKB +LINE_14,Station-31,2022-03-07 04:03:00,2022-03-07 04:17:00,Station-30,6.19,0,4318071,CKB +LINE_13,Station-30,2022-03-07 04:17:00,2022-03-07 04:23:00,Station-29,2555,0,4318071,CKB +LINE_13,Station-29,2022-03-07 04:23:00,2022-03-07 04:23:00,Station-0,0.06,0,4318071,CKB +LINE_14,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-31,0.06,0,4318083,CKB +LINE_14,Station-31,2022-03-07 00:33:00,2022-03-07 00:47:00,Station-30,6.19,0,4318083,CKB +LINE_13,Station-30,2022-03-07 00:47:00,2022-03-07 00:53:00,Station-29,2555,0,4318083,CKB +LINE_13,Station-29,2022-03-07 00:53:00,2022-03-07 01:00:00,Station-30,2577,9,4318083,CKB +LINE_14,Station-30,2022-03-07 01:09:00,2022-03-07 01:24:00,Station-31,5937,9,4318083,CKB +LINE_14,Station-31,2022-03-07 01:33:00,2022-03-07 01:47:00,Station-30,6.19,0,4318083,CKB +LINE_13,Station-30,2022-03-07 01:47:00,2022-03-07 01:53:00,Station-29,2555,0,4318083,CKB +LINE_13,Station-29,2022-03-07 01:53:00,2022-03-07 02:00:00,Station-30,2577,9,4318083,CKB +LINE_14,Station-30,2022-03-07 02:09:00,2022-03-07 02:24:00,Station-31,5937,9,4318083,CKB +LINE_14,Station-31,2022-03-07 02:33:00,2022-03-07 02:47:00,Station-30,6.19,0,4318083,CKB +LINE_13,Station-30,2022-03-07 02:47:00,2022-03-07 02:53:00,Station-29,2555,0,4318083,CKB +LINE_13,Station-29,2022-03-07 02:53:00,2022-03-07 03:00:00,Station-30,2577,9,4318083,CKB +LINE_14,Station-30,2022-03-07 03:09:00,2022-03-07 03:24:00,Station-31,5937,9,4318083,CKB +LINE_14,Station-31,2022-03-07 03:33:00,2022-03-07 03:47:00,Station-30,6.19,0,4318083,CKB +LINE_13,Station-30,2022-03-07 03:47:00,2022-03-07 03:53:00,Station-29,2555,0,4318083,CKB +LINE_13,Station-29,2022-03-07 03:53:00,2022-03-07 04:00:00,Station-30,2577,9,4318083,CKB +LINE_14,Station-30,2022-03-07 04:09:00,2022-03-07 04:24:00,Station-31,5937,0,4318083,CKB +LINE_14,Station-31,2022-03-07 04:24:00,2022-03-07 04:24:00,Station-0,0.06,0,4318083,CKB +LINE_15,Station-0,2022-03-07 00:57:00,2022-03-07 00:57:00,Station-32,0.06,0,4319428,CKB +LINE_15,Station-32,2022-03-07 00:57:00,2022-03-07 01:06:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 01:06:00,2022-03-07 01:11:00,Station-32,2936,16,4319428,CKB +LINE_15,Station-32,2022-03-07 01:27:00,2022-03-07 01:36:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 01:36:00,2022-03-07 01:41:00,Station-32,2936,16,4319428,CKB +LINE_15,Station-32,2022-03-07 01:57:00,2022-03-07 02:06:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 02:06:00,2022-03-07 02:11:00,Station-32,2936,16,4319428,CKB +LINE_15,Station-32,2022-03-07 02:27:00,2022-03-07 02:36:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 02:36:00,2022-03-07 02:41:00,Station-32,2936,16,4319428,CKB +LINE_15,Station-32,2022-03-07 02:57:00,2022-03-07 03:06:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 03:06:00,2022-03-07 03:11:00,Station-32,2936,16,4319428,CKB +LINE_15,Station-32,2022-03-07 03:27:00,2022-03-07 03:36:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 03:36:00,2022-03-07 03:41:00,Station-32,2936,16,4319428,CKB +LINE_15,Station-32,2022-03-07 03:57:00,2022-03-07 04:06:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 04:06:00,2022-03-07 04:11:00,Station-32,2936,16,4319428,CKB +LINE_15,Station-32,2022-03-07 04:27:00,2022-03-07 04:36:00,Station-33,4343,0,4319428,CKB +LINE_15,Station-33,2022-03-07 04:36:00,2022-03-07 04:36:00,Station-0,0.06,0,4319428,CKB +LINE_16,Station-0,2022-03-07 00:29:00,2022-03-07 00:29:00,Station-34,0.06,0,4751093,CKB +LINE_16,Station-34,2022-03-07 00:29:00,2022-03-07 00:41:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 00:47:00,2022-03-07 00:57:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 00:59:00,2022-03-07 01:11:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 01:17:00,2022-03-07 01:27:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 01:29:00,2022-03-07 01:41:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 01:47:00,2022-03-07 01:57:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 01:59:00,2022-03-07 02:11:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 02:17:00,2022-03-07 02:27:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 02:29:00,2022-03-07 02:41:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 02:47:00,2022-03-07 02:57:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 02:59:00,2022-03-07 03:11:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 03:17:00,2022-03-07 03:27:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 03:29:00,2022-03-07 03:41:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 03:47:00,2022-03-07 03:57:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 03:59:00,2022-03-07 04:11:00,Station-35,4481,6,4751093,CKB +LINE_16,Station-35,2022-03-07 04:17:00,2022-03-07 04:27:00,Station-34,4031,2,4751093,CKB +LINE_16,Station-34,2022-03-07 04:29:00,2022-03-07 04:41:00,Station-35,4481,0,4751093,CKB +LINE_16,Station-35,2022-03-07 04:41:00,2022-03-07 04:41:00,Station-0,0.06,0,4751093,CKB +LINE_17,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-34,0.06,0,4454017,CKB +LINE_17,Station-34,2022-03-07 00:30:00,2022-03-07 00:44:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 00:44:00,2022-03-07 00:57:00,Station-34,5302,3,4454017,CKB +LINE_17,Station-34,2022-03-07 01:00:00,2022-03-07 01:14:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 01:14:00,2022-03-07 01:27:00,Station-34,5302,3,4454017,CKB +LINE_17,Station-34,2022-03-07 01:30:00,2022-03-07 01:44:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 01:44:00,2022-03-07 01:57:00,Station-34,5302,3,4454017,CKB +LINE_17,Station-34,2022-03-07 02:00:00,2022-03-07 02:14:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 02:14:00,2022-03-07 02:27:00,Station-34,5302,3,4454017,CKB +LINE_17,Station-34,2022-03-07 02:30:00,2022-03-07 02:44:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 02:44:00,2022-03-07 02:57:00,Station-34,5302,3,4454017,CKB +LINE_17,Station-34,2022-03-07 03:00:00,2022-03-07 03:14:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 03:14:00,2022-03-07 03:27:00,Station-34,5302,3,4454017,CKB +LINE_17,Station-34,2022-03-07 03:30:00,2022-03-07 03:44:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 03:44:00,2022-03-07 03:57:00,Station-34,5302,3,4454017,CKB +LINE_17,Station-34,2022-03-07 04:00:00,2022-03-07 04:14:00,Station-36,4801,0,4454017,CKB +LINE_17,Station-36,2022-03-07 04:14:00,2022-03-07 04:27:00,Station-34,5302,0,4454017,CKB +LINE_17,Station-34,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,4454017,CKB +LINE_18,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-37,0.06,0,4374470,CKB +LINE_18,Station-37,2022-03-07 00:43:00,2022-03-07 01:33:00,Station-37,20434,10,4374470,CKB +LINE_18,Station-37,2022-03-07 01:43:00,2022-03-07 02:33:00,Station-37,20434,10,4374470,CKB +LINE_18,Station-37,2022-03-07 02:43:00,2022-03-07 03:33:00,Station-37,20434,10,4374470,CKB +LINE_18,Station-37,2022-03-07 03:43:00,2022-03-07 04:33:00,Station-37,20434,0,4374470,CKB +LINE_18,Station-37,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,4374470,CKB +LINE_18,Station-0,2022-03-07 00:13:00,2022-03-07 00:13:00,Station-37,0.06,0,4374475,CKB +LINE_18,Station-37,2022-03-07 00:13:00,2022-03-07 01:03:00,Station-37,20434,10,4374475,CKB +LINE_18,Station-37,2022-03-07 01:13:00,2022-03-07 02:03:00,Station-37,20434,10,4374475,CKB +LINE_18,Station-37,2022-03-07 02:13:00,2022-03-07 03:03:00,Station-37,20434,10,4374475,CKB +LINE_18,Station-37,2022-03-07 03:13:00,2022-03-07 04:03:00,Station-37,20434,0,4374475,CKB +LINE_18,Station-37,2022-03-07 04:03:00,2022-03-07 04:03:00,Station-0,0.06,0,4374475,CKB +LINE_19,Station-0,2022-03-07 00:24:00,2022-03-07 00:24:00,Station-38,0.06,0,4456537,CKB +LINE_19,Station-38,2022-03-07 00:24:00,2022-03-07 00:48:00,Station-39,11.86,4,4456537,CKB +LINE_19,Station-39,2022-03-07 00:52:00,2022-03-07 01:14:00,Station-38,11139,10,4456537,CKB +LINE_19,Station-38,2022-03-07 01:24:00,2022-03-07 01:48:00,Station-39,11.86,4,4456537,CKB +LINE_19,Station-39,2022-03-07 01:52:00,2022-03-07 02:14:00,Station-38,11139,10,4456537,CKB +LINE_19,Station-38,2022-03-07 02:24:00,2022-03-07 02:48:00,Station-39,11.86,4,4456537,CKB +LINE_19,Station-39,2022-03-07 02:52:00,2022-03-07 03:14:00,Station-38,11139,10,4456537,CKB +LINE_19,Station-38,2022-03-07 03:24:00,2022-03-07 03:48:00,Station-39,11.86,4,4456537,CKB +LINE_19,Station-39,2022-03-07 03:52:00,2022-03-07 04:14:00,Station-38,11139,0,4456537,CKB +LINE_19,Station-38,2022-03-07 04:14:00,2022-03-07 04:14:00,Station-0,0.06,0,4456537,CKB +LINE_19,Station-0,2022-03-07 00:22:00,2022-03-07 00:22:00,Station-39,0.06,0,4456538,CKB +LINE_19,Station-39,2022-03-07 00:22:00,2022-03-07 00:44:00,Station-38,11139,10,4456538,CKB +LINE_19,Station-38,2022-03-07 00:54:00,2022-03-07 01:18:00,Station-39,11.86,4,4456538,CKB +LINE_19,Station-39,2022-03-07 01:22:00,2022-03-07 01:44:00,Station-38,11139,10,4456538,CKB +LINE_19,Station-38,2022-03-07 01:54:00,2022-03-07 02:18:00,Station-39,11.86,4,4456538,CKB +LINE_19,Station-39,2022-03-07 02:22:00,2022-03-07 02:44:00,Station-38,11139,10,4456538,CKB +LINE_19,Station-38,2022-03-07 02:54:00,2022-03-07 03:18:00,Station-39,11.86,4,4456538,CKB +LINE_19,Station-39,2022-03-07 03:22:00,2022-03-07 03:44:00,Station-38,11139,10,4456538,CKB +LINE_19,Station-38,2022-03-07 03:54:00,2022-03-07 04:18:00,Station-39,11.86,4,4456538,CKB +LINE_19,Station-39,2022-03-07 04:22:00,2022-03-07 04:44:00,Station-38,11139,0,4456538,CKB +LINE_19,Station-38,2022-03-07 04:44:00,2022-03-07 04:44:00,Station-0,0.06,0,4456538,CKB +LINE_0,Station-0,2022-03-13 20:51:00,2022-03-13 20:51:00,Station-1,0.06,0,4454973,CKB +LINE_0,Station-1,2022-03-13 20:51:00,2022-03-13 21:24:00,Station-2,14519,4,4454973,CKB +LINE_0,Station-2,2022-03-13 21:28:00,2022-03-13 22:03:00,Station-1,13541,8,4454973,CKB +LINE_0,Station-1,2022-03-13 22:11:00,2022-03-13 22:44:00,Station-2,14519,4,4454973,CKB +LINE_0,Station-2,2022-03-13 22:48:00,2022-03-13 23:23:00,Station-1,13541,8,4454973,CKB +LINE_0,Station-1,2022-03-13 23:31:00,2022-03-14 00:04:00,Station-2,14519,4,4454973,CKB +LINE_0,Station-2,2022-03-14 00:08:00,2022-03-14 00:39:00,Station-5,12213,0,4454973,CKB +LINE_1,Station-5,2022-03-14 00:39:00,2022-03-14 00:47:00,Station-3,4.0,2,4454973,CKB +LINE_1,Station-3,2022-03-14 00:49:00,2022-03-14 01:12:00,Station-4,8.36,6,4454973,CKB +LINE_1,Station-4,2022-03-14 01:18:00,2022-03-14 01:36:00,Station-3,9067,13,4454973,CKB +LINE_1,Station-3,2022-03-14 01:49:00,2022-03-14 02:12:00,Station-4,8.36,6,4454973,CKB +LINE_1,Station-4,2022-03-14 02:18:00,2022-03-14 02:36:00,Station-3,9067,13,4454973,CKB +LINE_1,Station-3,2022-03-14 02:49:00,2022-03-14 03:12:00,Station-4,8.36,6,4454973,CKB +LINE_1,Station-4,2022-03-14 03:18:00,2022-03-14 03:36:00,Station-3,9067,13,4454973,CKB +LINE_1,Station-3,2022-03-14 03:49:00,2022-03-14 04:12:00,Station-4,8.36,0,4454973,CKB +LINE_1,Station-4,2022-03-14 04:12:00,2022-03-14 04:12:00,Station-0,0.06,0,4454973,CKB +LINE_0,Station-0,2022-03-13 21:31:00,2022-03-13 21:31:00,Station-1,0.06,0,4454974,CKB +LINE_0,Station-1,2022-03-13 21:31:00,2022-03-13 22:04:00,Station-2,14519,4,4454974,CKB +LINE_0,Station-2,2022-03-13 22:08:00,2022-03-13 22:43:00,Station-1,13541,8,4454974,CKB +LINE_0,Station-1,2022-03-13 22:51:00,2022-03-13 23:24:00,Station-2,14519,4,4454974,CKB +LINE_0,Station-2,2022-03-13 23:28:00,2022-03-14 00:03:00,Station-1,13541,8,4454974,CKB +LINE_0,Station-1,2022-03-14 00:11:00,2022-03-14 00:44:00,Station-2,14519,0,4454974,CKB +LINE_1,Station-2,2022-03-14 00:44:00,2022-03-14 00:54:00,Station-3,4.1,25,4454974,CKB +LINE_1,Station-3,2022-03-14 01:19:00,2022-03-14 01:42:00,Station-4,8.36,6,4454974,CKB +LINE_1,Station-4,2022-03-14 01:48:00,2022-03-14 02:06:00,Station-3,9067,13,4454974,CKB +LINE_1,Station-3,2022-03-14 02:19:00,2022-03-14 02:42:00,Station-4,8.36,6,4454974,CKB +LINE_1,Station-4,2022-03-14 02:48:00,2022-03-14 03:06:00,Station-3,9067,13,4454974,CKB +LINE_1,Station-3,2022-03-14 03:19:00,2022-03-14 03:42:00,Station-4,8.36,6,4454974,CKB +LINE_1,Station-4,2022-03-14 03:48:00,2022-03-14 04:06:00,Station-3,9067,0,4454974,CKB +LINE_1,Station-3,2022-03-14 04:06:00,2022-03-14 04:06:00,Station-0,0.06,0,4454974,CKB +LINE_2,Station-0,2022-03-13 21:06:00,2022-03-13 21:06:00,Station-6,0.06,0,4664782,CKB +LINE_2,Station-6,2022-03-13 21:06:00,2022-03-13 21:34:00,Station-7,13018,19,4664782,CKB +LINE_2,Station-7,2022-03-13 21:53:00,2022-03-13 22:13:00,Station-8,10332,17,4664782,CKB +LINE_2,Station-8,2022-03-13 22:30:00,2022-03-13 22:54:00,Station-7,10.48,19,4664782,CKB +LINE_2,Station-7,2022-03-13 23:13:00,2022-03-13 23:33:00,Station-8,10332,17,4664782,CKB +LINE_2,Station-8,2022-03-13 23:50:00,2022-03-14 00:14:00,Station-7,10.48,2,4664782,CKB +LINE_2,Station-7,2022-03-14 00:16:00,2022-03-14 00:23:00,Station-9,3709,5,4664782,CKB +LINE_3,Station-9,2022-03-14 00:28:00,2022-03-14 00:44:00,Station-10,6404,3,4664782,CKB +LINE_3,Station-10,2022-03-14 00:47:00,2022-03-14 01:10:00,Station-11,10579,7,4664782,CKB +LINE_3,Station-11,2022-03-14 01:17:00,2022-03-14 01:44:00,Station-10,12007,3,4664782,CKB +LINE_3,Station-10,2022-03-14 01:47:00,2022-03-14 02:10:00,Station-11,10579,7,4664782,CKB +LINE_3,Station-11,2022-03-14 02:17:00,2022-03-14 02:44:00,Station-10,12007,3,4664782,CKB +LINE_3,Station-10,2022-03-14 02:47:00,2022-03-14 03:10:00,Station-11,10579,7,4664782,CKB +LINE_3,Station-11,2022-03-14 03:17:00,2022-03-14 03:44:00,Station-10,12007,3,4664782,CKB +LINE_3,Station-10,2022-03-14 03:47:00,2022-03-14 04:10:00,Station-11,10579,7,4664782,CKB +LINE_3,Station-11,2022-03-14 04:17:00,2022-03-14 04:44:00,Station-10,12007,0,4664782,CKB +LINE_3,Station-10,2022-03-14 04:44:00,2022-03-14 04:44:00,Station-0,0.06,0,4664782,CKB +LINE_2,Station-0,2022-03-13 20:26:00,2022-03-13 20:26:00,Station-6,0.06,0,4762788,CKB +LINE_2,Station-6,2022-03-13 20:26:00,2022-03-13 20:56:00,Station-12,14097,14,4762788,CKB +LINE_2,Station-12,2022-03-13 21:10:00,2022-03-13 21:38:00,Station-6,13.19,8,4762788,CKB +LINE_2,Station-6,2022-03-13 21:46:00,2022-03-13 22:14:00,Station-7,13018,19,4762788,CKB +LINE_2,Station-7,2022-03-13 22:33:00,2022-03-13 22:53:00,Station-8,10332,17,4762788,CKB +LINE_2,Station-8,2022-03-13 23:10:00,2022-03-13 23:34:00,Station-7,10.48,19,4762788,CKB +LINE_2,Station-7,2022-03-13 23:53:00,2022-03-14 00:13:00,Station-8,10332,2,4762788,CKB +LINE_2,Station-8,2022-03-14 00:15:00,2022-03-14 00:16:00,Station-10,506,1,4762788,CKB +LINE_3,Station-10,2022-03-14 00:17:00,2022-03-14 00:40:00,Station-11,10579,7,4762788,CKB +LINE_3,Station-11,2022-03-14 00:47:00,2022-03-14 01:14:00,Station-10,12007,3,4762788,CKB +LINE_3,Station-10,2022-03-14 01:17:00,2022-03-14 01:40:00,Station-11,10579,7,4762788,CKB +LINE_3,Station-11,2022-03-14 01:47:00,2022-03-14 02:14:00,Station-10,12007,3,4762788,CKB +LINE_3,Station-10,2022-03-14 02:17:00,2022-03-14 02:40:00,Station-11,10579,7,4762788,CKB +LINE_3,Station-11,2022-03-14 02:47:00,2022-03-14 03:14:00,Station-10,12007,3,4762788,CKB +LINE_3,Station-10,2022-03-14 03:17:00,2022-03-14 03:40:00,Station-11,10579,7,4762788,CKB +LINE_3,Station-11,2022-03-14 03:47:00,2022-03-14 04:14:00,Station-10,12007,3,4762788,CKB +LINE_3,Station-10,2022-03-14 04:17:00,2022-03-14 04:40:00,Station-11,10579,3,4762788,CKB +LINE_4,Station-11,2022-03-14 04:43:00,2022-03-14 04:58:00,Station-13,6161,0,4762788,CKB +LINE_4,Station-13,2022-03-14 04:58:00,2022-03-14 04:58:00,Station-0,0.06,0,4762788,CKB +LINE_20,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,4747688,CKB +LINE_20,Station-13,2022-03-07 00:32:00,2022-03-07 00:44:00,Station-40,4212,3,4747688,CKB +LINE_20,Station-40,2022-03-07 00:47:00,2022-03-07 01:16:00,Station-41,13048,0,4747688,CKB +LINE_20,Station-41,2022-03-07 01:16:00,2022-03-07 01:42:00,Station-40,12869,5,4747688,CKB +LINE_20,Station-40,2022-03-07 01:47:00,2022-03-07 02:16:00,Station-41,13048,0,4747688,CKB +LINE_20,Station-41,2022-03-07 02:16:00,2022-03-07 02:42:00,Station-40,12869,5,4747688,CKB +LINE_20,Station-40,2022-03-07 02:47:00,2022-03-07 03:16:00,Station-41,13048,0,4747688,CKB +LINE_20,Station-41,2022-03-07 03:16:00,2022-03-07 03:42:00,Station-40,12869,5,4747688,CKB +LINE_20,Station-40,2022-03-07 03:47:00,2022-03-07 04:16:00,Station-41,13048,0,4747688,CKB +LINE_20,Station-41,2022-03-07 04:16:00,2022-03-07 04:34:00,Station-42,9538,0,4747688,CKB +LINE_20,Station-42,2022-03-07 04:34:00,2022-03-07 04:34:00,Station-0,0.06,0,4747688,CKB +LINE_20,Station-0,2022-03-07 00:17:00,2022-03-07 00:17:00,Station-40,0.06,0,4747699,CKB +LINE_20,Station-40,2022-03-07 00:17:00,2022-03-07 00:46:00,Station-41,13048,0,4747699,CKB +LINE_20,Station-41,2022-03-07 00:46:00,2022-03-07 01:12:00,Station-40,12869,5,4747699,CKB +LINE_20,Station-40,2022-03-07 01:17:00,2022-03-07 01:46:00,Station-41,13048,0,4747699,CKB +LINE_20,Station-41,2022-03-07 01:46:00,2022-03-07 02:12:00,Station-40,12869,5,4747699,CKB +LINE_20,Station-40,2022-03-07 02:17:00,2022-03-07 02:46:00,Station-41,13048,0,4747699,CKB +LINE_20,Station-41,2022-03-07 02:46:00,2022-03-07 03:12:00,Station-40,12869,5,4747699,CKB +LINE_20,Station-40,2022-03-07 03:17:00,2022-03-07 03:46:00,Station-41,13048,0,4747699,CKB +LINE_20,Station-41,2022-03-07 03:46:00,2022-03-07 04:12:00,Station-40,12869,5,4747699,CKB +LINE_20,Station-40,2022-03-07 04:17:00,2022-03-07 04:28:00,Station-13,4316,0,4747699,CKB +LINE_20,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,4747699,CKB +LINE_8,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,4627068,CKB +LINE_8,Station-13,2022-03-07 00:32:00,2022-03-07 00:57:00,Station-21,11545,6,4627068,CKB +LINE_8,Station-21,2022-03-07 01:03:00,2022-03-07 01:46:00,Station-20,20579,1,4627068,CKB +LINE_8,Station-20,2022-03-07 01:47:00,2022-03-07 02:25:00,Station-21,20641,8,4627068,CKB +LINE_8,Station-21,2022-03-07 02:33:00,2022-03-07 03:16:00,Station-20,20579,1,4627068,CKB +LINE_8,Station-20,2022-03-07 03:17:00,2022-03-07 03:55:00,Station-21,20641,8,4627068,CKB +LINE_8,Station-21,2022-03-07 04:03:00,2022-03-07 04:28:00,Station-13,11499,0,4627068,CKB +LINE_8,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,4627068,CKB +LINE_8,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-21,0.06,0,4627069,CKB +LINE_8,Station-21,2022-03-07 00:33:00,2022-03-07 01:16:00,Station-20,20579,1,4627069,CKB +LINE_8,Station-20,2022-03-07 01:17:00,2022-03-07 01:55:00,Station-21,20641,8,4627069,CKB +LINE_8,Station-21,2022-03-07 02:03:00,2022-03-07 02:46:00,Station-20,20579,1,4627069,CKB +LINE_8,Station-20,2022-03-07 02:47:00,2022-03-07 03:25:00,Station-21,20641,8,4627069,CKB +LINE_8,Station-21,2022-03-07 03:33:00,2022-03-07 04:16:00,Station-20,20579,1,4627069,CKB +LINE_8,Station-20,2022-03-07 04:17:00,2022-03-07 04:51:00,Station-44,18752,0,4627069,CKB +LINE_8,Station-44,2022-03-07 04:51:00,2022-03-07 04:51:00,Station-0,0.06,0,4627069,CKB +LINE_7,Station-0,2022-03-07 00:08:00,2022-03-07 00:08:00,Station-18,0.06,0,4710317,CKB +LINE_7,Station-18,2022-03-07 00:08:00,2022-03-07 00:27:00,Station-19,7827,0,4710317,CKB +LINE_8,Station-19,2022-03-07 00:27:00,2022-03-07 00:48:00,Station-20,11079,0,4710317,CKB +LINE_8,Station-20,2022-03-07 00:48:00,2022-03-07 01:25:00,Station-21,20641,8,4710317,CKB +LINE_8,Station-21,2022-03-07 01:33:00,2022-03-07 02:16:00,Station-20,20579,1,4710317,CKB +LINE_8,Station-20,2022-03-07 02:17:00,2022-03-07 02:55:00,Station-21,20641,8,4710317,CKB +LINE_8,Station-21,2022-03-07 03:03:00,2022-03-07 03:46:00,Station-20,20579,1,4710317,CKB +LINE_8,Station-20,2022-03-07 03:47:00,2022-03-07 04:25:00,Station-21,20641,0,4710317,CKB +LINE_8,Station-21,2022-03-07 04:25:00,2022-03-07 04:25:00,Station-0,0.06,0,4710317,CKB +LINE_23,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-46,0.06,0,4619816,CKB +LINE_23,Station-46,2022-03-07 00:30:00,2022-03-07 00:57:00,Station-45,10083,7,4619816,CKB +LINE_23,Station-45,2022-03-07 01:04:00,2022-03-07 01:30:00,Station-46,9016,0,4619816,CKB +LINE_23,Station-46,2022-03-07 01:30:00,2022-03-07 01:57:00,Station-45,10083,7,4619816,CKB +LINE_23,Station-45,2022-03-07 02:04:00,2022-03-07 02:30:00,Station-46,9016,0,4619816,CKB +LINE_23,Station-46,2022-03-07 02:30:00,2022-03-07 02:57:00,Station-45,10083,7,4619816,CKB +LINE_23,Station-45,2022-03-07 03:04:00,2022-03-07 03:30:00,Station-46,9016,0,4619816,CKB +LINE_23,Station-46,2022-03-07 03:30:00,2022-03-07 03:57:00,Station-45,10083,7,4619816,CKB +LINE_23,Station-45,2022-03-07 04:04:00,2022-03-07 04:30:00,Station-46,9016,0,4619816,CKB +LINE_23,Station-46,2022-03-07 04:30:00,2022-03-07 04:57:00,Station-45,10083,0,4619816,CKB +LINE_23,Station-45,2022-03-07 04:57:00,2022-03-07 04:57:00,Station-0,0.06,0,4619816,CKB +LINE_23,Station-0,2022-03-07 00:34:00,2022-03-07 00:34:00,Station-45,0.06,0,4619817,CKB +LINE_23,Station-45,2022-03-07 00:34:00,2022-03-07 01:00:00,Station-46,9016,0,4619817,CKB +LINE_23,Station-46,2022-03-07 01:00:00,2022-03-07 01:27:00,Station-45,10083,7,4619817,CKB +LINE_23,Station-45,2022-03-07 01:34:00,2022-03-07 02:00:00,Station-46,9016,0,4619817,CKB +LINE_23,Station-46,2022-03-07 02:00:00,2022-03-07 02:27:00,Station-45,10083,7,4619817,CKB +LINE_23,Station-45,2022-03-07 02:34:00,2022-03-07 03:00:00,Station-46,9016,0,4619817,CKB +LINE_23,Station-46,2022-03-07 03:00:00,2022-03-07 03:27:00,Station-45,10083,7,4619817,CKB +LINE_23,Station-45,2022-03-07 03:34:00,2022-03-07 04:00:00,Station-46,9016,0,4619817,CKB +LINE_23,Station-46,2022-03-07 04:00:00,2022-03-07 04:27:00,Station-45,10083,0,4619817,CKB +LINE_23,Station-45,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,4619817,CKB +LINE_24,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,4374749,CKB +LINE_24,Station-21,2022-03-07 00:31:00,2022-03-07 00:44:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 00:44:00,2022-03-07 00:56:00,Station-21,5362,5,4374749,CKB +LINE_24,Station-21,2022-03-07 01:01:00,2022-03-07 01:14:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 01:14:00,2022-03-07 01:26:00,Station-21,5362,5,4374749,CKB +LINE_24,Station-21,2022-03-07 01:31:00,2022-03-07 01:44:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 01:44:00,2022-03-07 01:56:00,Station-21,5362,5,4374749,CKB +LINE_24,Station-21,2022-03-07 02:01:00,2022-03-07 02:14:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 02:14:00,2022-03-07 02:26:00,Station-21,5362,5,4374749,CKB +LINE_24,Station-21,2022-03-07 02:31:00,2022-03-07 02:44:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 02:44:00,2022-03-07 02:56:00,Station-21,5362,5,4374749,CKB +LINE_24,Station-21,2022-03-07 03:01:00,2022-03-07 03:14:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 03:14:00,2022-03-07 03:26:00,Station-21,5362,5,4374749,CKB +LINE_24,Station-21,2022-03-07 03:31:00,2022-03-07 03:44:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 03:44:00,2022-03-07 03:56:00,Station-21,5362,5,4374749,CKB +LINE_24,Station-21,2022-03-07 04:01:00,2022-03-07 04:14:00,Station-47,4872,0,4374749,CKB +LINE_24,Station-47,2022-03-07 04:14:00,2022-03-07 04:26:00,Station-21,5362,0,4374749,CKB +LINE_24,Station-21,2022-03-07 04:26:00,2022-03-07 04:26:00,Station-0,0.06,0,4374749,CKB +LINE_25,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,4374873,CKB +LINE_25,Station-21,2022-03-07 00:31:00,2022-03-07 00:45:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 00:47:00,2022-03-07 01:01:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 01:01:00,2022-03-07 01:15:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 01:17:00,2022-03-07 01:31:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 01:31:00,2022-03-07 01:45:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 01:47:00,2022-03-07 02:01:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 02:01:00,2022-03-07 02:15:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 02:17:00,2022-03-07 02:31:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 02:31:00,2022-03-07 02:45:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 02:47:00,2022-03-07 03:01:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 03:01:00,2022-03-07 03:15:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 03:17:00,2022-03-07 03:31:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 03:31:00,2022-03-07 03:45:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 03:47:00,2022-03-07 04:01:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 04:01:00,2022-03-07 04:15:00,Station-48,5225,2,4374873,CKB +LINE_25,Station-48,2022-03-07 04:17:00,2022-03-07 04:31:00,Station-21,7617,0,4374873,CKB +LINE_25,Station-21,2022-03-07 04:31:00,2022-03-07 04:31:00,Station-0,0.06,0,4374873,CKB +LINE_26,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-49,0.06,0,4375018,CKB +LINE_26,Station-49,2022-03-07 00:43:00,2022-03-07 00:53:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 00:53:00,2022-03-07 01:03:00,Station-49,4408,10,4375018,CKB +LINE_26,Station-49,2022-03-07 01:13:00,2022-03-07 01:23:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 01:23:00,2022-03-07 01:33:00,Station-49,4408,10,4375018,CKB +LINE_26,Station-49,2022-03-07 01:43:00,2022-03-07 01:53:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 01:53:00,2022-03-07 02:03:00,Station-49,4408,10,4375018,CKB +LINE_26,Station-49,2022-03-07 02:13:00,2022-03-07 02:23:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 02:23:00,2022-03-07 02:33:00,Station-49,4408,10,4375018,CKB +LINE_26,Station-49,2022-03-07 02:43:00,2022-03-07 02:53:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 02:53:00,2022-03-07 03:03:00,Station-49,4408,10,4375018,CKB +LINE_26,Station-49,2022-03-07 03:13:00,2022-03-07 03:23:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 03:23:00,2022-03-07 03:33:00,Station-49,4408,10,4375018,CKB +LINE_26,Station-49,2022-03-07 03:43:00,2022-03-07 03:53:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 03:53:00,2022-03-07 04:03:00,Station-49,4408,10,4375018,CKB +LINE_26,Station-49,2022-03-07 04:13:00,2022-03-07 04:23:00,Station-50,4507,0,4375018,CKB +LINE_26,Station-50,2022-03-07 04:23:00,2022-03-07 04:33:00,Station-49,4408,0,4375018,CKB +LINE_26,Station-49,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,4375018,CKB +LINE_27,Station-0,2022-03-13 15:46:00,2022-03-13 15:46:00,Station-14,0.06,0,4458713,CKB +LINE_27,Station-14,2022-03-13 15:46:00,2022-03-13 15:53:00,Station-51,3147,12,4458713,CKB +LINE_27,Station-51,2022-03-13 16:05:00,2022-03-13 16:15:00,Station-14,3469,0,4458713,CKB +LINE_27,Station-14,2022-03-13 16:15:00,2022-03-13 16:23:00,Station-51,3351,12,4458713,CKB +LINE_27,Station-51,2022-03-13 16:35:00,2022-03-13 16:45:00,Station-14,3469,0,4458713,CKB +LINE_27,Station-14,2022-03-13 16:45:00,2022-03-13 16:53:00,Station-51,3351,12,4458713,CKB +LINE_27,Station-51,2022-03-13 17:05:00,2022-03-13 17:15:00,Station-14,3469,0,4458713,CKB +LINE_27,Station-14,2022-03-13 17:15:00,2022-03-13 17:23:00,Station-51,3351,12,4458713,CKB +LINE_27,Station-51,2022-03-13 17:35:00,2022-03-13 17:45:00,Station-14,3469,0,4458713,CKB +LINE_27,Station-14,2022-03-13 17:45:00,2022-03-13 17:53:00,Station-51,3351,12,4458713,CKB +LINE_27,Station-51,2022-03-13 18:05:00,2022-03-13 18:15:00,Station-14,3469,0,4458713,CKB +LINE_27,Station-14,2022-03-13 18:15:00,2022-03-13 18:23:00,Station-51,3351,0,4458713,CKB +LINE_28,Station-51,2022-03-13 18:23:00,2022-03-13 18:29:00,Station-14,3.1,22,4458713,CKB +LINE_28,Station-14,2022-03-13 18:51:00,2022-03-13 19:02:00,Station-52,4338,0,4458713,CKB +LINE_28,Station-52,2022-03-13 19:02:00,2022-03-13 19:13:00,Station-14,4427,12,4458713,CKB +LINE_5,Station-14,2022-03-13 19:25:00,2022-03-13 19:38:00,Station-15,6086,3,4458713,CKB +LINE_5,Station-15,2022-03-13 19:41:00,2022-03-13 19:55:00,Station-14,6232,0,4458713,CKB +LINE_5,Station-14,2022-03-13 19:55:00,2022-03-13 20:08:00,Station-15,6086,3,4458713,CKB +LINE_5,Station-15,2022-03-13 20:11:00,2022-03-13 20:25:00,Station-14,6232,6,4458713,CKB +LINE_28,Station-14,2022-03-13 20:31:00,2022-03-13 20:42:00,Station-52,4338,0,4458713,CKB +LINE_28,Station-52,2022-03-13 20:42:00,2022-03-13 20:53:00,Station-14,4427,18,4458713,CKB +LINE_28,Station-14,2022-03-13 21:11:00,2022-03-13 21:22:00,Station-52,4338,0,4458713,CKB +LINE_28,Station-52,2022-03-13 21:22:00,2022-03-13 21:33:00,Station-14,4427,18,4458713,CKB +LINE_28,Station-14,2022-03-13 21:51:00,2022-03-13 22:02:00,Station-52,4338,0,4458713,CKB +LINE_28,Station-52,2022-03-13 22:02:00,2022-03-13 22:13:00,Station-14,4427,18,4458713,CKB +LINE_28,Station-14,2022-03-13 22:31:00,2022-03-13 22:42:00,Station-52,4338,0,4458713,CKB +LINE_28,Station-52,2022-03-13 22:42:00,2022-03-13 22:53:00,Station-14,4427,2,4458713,CKB +LINE_5,Station-14,2022-03-13 22:55:00,2022-03-13 23:08:00,Station-15,6086,3,4458713,CKB +LINE_5,Station-15,2022-03-13 23:11:00,2022-03-13 23:25:00,Station-14,6232,0,4458713,CKB +LINE_5,Station-14,2022-03-13 23:25:00,2022-03-13 23:38:00,Station-15,6086,3,4458713,CKB +LINE_5,Station-15,2022-03-13 23:41:00,2022-03-13 23:55:00,Station-14,6232,0,4458713,CKB +LINE_5,Station-14,2022-03-13 23:55:00,2022-03-14 00:08:00,Station-15,6086,0,4458713,CKB +LINE_5,Station-15,2022-03-14 00:08:00,2022-03-14 00:08:00,Station-0,0.06,0,4458713,CKB +LINE_6,Station-0,2022-03-13 07:05:00,2022-03-13 07:05:00,Station-16,0.06,0,4426903,CKB +LINE_6,Station-16,2022-03-13 07:05:00,2022-03-13 07:14:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 07:14:00,2022-03-13 07:23:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 07:25:00,2022-03-13 07:34:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 07:34:00,2022-03-13 07:43:00,Station-16,5139,22,4426903,CKB +LINE_6,Station-16,2022-03-13 08:05:00,2022-03-13 08:14:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 08:14:00,2022-03-13 08:23:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 08:25:00,2022-03-13 08:34:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 08:34:00,2022-03-13 08:43:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 08:45:00,2022-03-13 08:54:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 08:54:00,2022-03-13 09:03:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 09:05:00,2022-03-13 09:14:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 09:14:00,2022-03-13 09:23:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 09:25:00,2022-03-13 09:34:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-16,5139,23,4426903,CKB +LINE_6,Station-16,2022-03-13 10:06:00,2022-03-13 10:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 10:15:00,2022-03-13 10:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 10:26:00,2022-03-13 10:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 10:35:00,2022-03-13 10:44:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 10:46:00,2022-03-13 10:55:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 10:55:00,2022-03-13 11:04:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 11:06:00,2022-03-13 11:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 11:15:00,2022-03-13 11:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 11:26:00,2022-03-13 11:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 11:35:00,2022-03-13 11:44:00,Station-16,5139,22,4426903,CKB +LINE_6,Station-16,2022-03-13 12:06:00,2022-03-13 12:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 12:15:00,2022-03-13 12:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 12:26:00,2022-03-13 12:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 12:35:00,2022-03-13 12:44:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 12:46:00,2022-03-13 12:55:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 12:55:00,2022-03-13 13:04:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 13:06:00,2022-03-13 13:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 13:15:00,2022-03-13 13:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 13:26:00,2022-03-13 13:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 13:35:00,2022-03-13 13:44:00,Station-16,5139,22,4426903,CKB +LINE_6,Station-16,2022-03-13 14:06:00,2022-03-13 14:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 14:15:00,2022-03-13 14:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 14:26:00,2022-03-13 14:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 14:35:00,2022-03-13 14:44:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 14:46:00,2022-03-13 14:55:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 14:55:00,2022-03-13 15:04:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 15:06:00,2022-03-13 15:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 15:15:00,2022-03-13 15:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 15:26:00,2022-03-13 15:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 15:35:00,2022-03-13 15:44:00,Station-16,5139,22,4426903,CKB +LINE_6,Station-16,2022-03-13 16:06:00,2022-03-13 16:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 16:15:00,2022-03-13 16:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 16:26:00,2022-03-13 16:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 16:35:00,2022-03-13 16:44:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 16:46:00,2022-03-13 16:55:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 16:55:00,2022-03-13 17:04:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 17:06:00,2022-03-13 17:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 17:15:00,2022-03-13 17:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 17:26:00,2022-03-13 17:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 17:35:00,2022-03-13 17:44:00,Station-16,5139,22,4426903,CKB +LINE_6,Station-16,2022-03-13 18:06:00,2022-03-13 18:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 18:15:00,2022-03-13 18:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 18:26:00,2022-03-13 18:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 18:35:00,2022-03-13 18:44:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 18:46:00,2022-03-13 18:55:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 18:55:00,2022-03-13 19:04:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 19:06:00,2022-03-13 19:15:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 19:15:00,2022-03-13 19:24:00,Station-16,5139,2,4426903,CKB +LINE_6,Station-16,2022-03-13 19:26:00,2022-03-13 19:35:00,Station-17,4781,0,4426903,CKB +LINE_6,Station-17,2022-03-13 19:35:00,2022-03-13 19:44:00,Station-16,5139,21,4426903,CKB +LINE_6,Station-16,2022-03-13 20:05:00,2022-03-13 20:14:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 20:15:00,2022-03-13 20:24:00,Station-16,5139,1,4426903,CKB +LINE_6,Station-16,2022-03-13 20:25:00,2022-03-13 20:34:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 20:35:00,2022-03-13 20:44:00,Station-16,5139,1,4426903,CKB +LINE_6,Station-16,2022-03-13 20:45:00,2022-03-13 20:54:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 20:55:00,2022-03-13 21:04:00,Station-16,5139,1,4426903,CKB +LINE_6,Station-16,2022-03-13 21:05:00,2022-03-13 21:14:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 21:15:00,2022-03-13 21:24:00,Station-16,5139,1,4426903,CKB +LINE_6,Station-16,2022-03-13 21:25:00,2022-03-13 21:34:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 21:35:00,2022-03-13 21:44:00,Station-16,5139,21,4426903,CKB +LINE_6,Station-16,2022-03-13 22:05:00,2022-03-13 22:14:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 22:15:00,2022-03-13 22:24:00,Station-16,5139,1,4426903,CKB +LINE_6,Station-16,2022-03-13 22:25:00,2022-03-13 22:34:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 22:35:00,2022-03-13 22:44:00,Station-16,5139,1,4426903,CKB +LINE_6,Station-16,2022-03-13 22:45:00,2022-03-13 22:54:00,Station-17,4781,1,4426903,CKB +LINE_6,Station-17,2022-03-13 22:55:00,2022-03-13 23:04:00,Station-16,5139,0,4426903,CKB +LINE_6,Station-16,2022-03-13 23:04:00,2022-03-13 23:04:00,Station-0,0.06,0,4426903,CKB +LINE_29,Station-0,2022-03-13 07:30:00,2022-03-13 07:30:00,Station-53,0.06,0,4369706,CKB +LINE_29,Station-53,2022-03-13 07:30:00,2022-03-13 07:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 07:39:00,2022-03-13 07:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 07:50:00,2022-03-13 07:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 07:59:00,2022-03-13 08:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 08:10:00,2022-03-13 08:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 08:19:00,2022-03-13 08:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 08:30:00,2022-03-13 08:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 08:39:00,2022-03-13 08:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 08:50:00,2022-03-13 08:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 08:59:00,2022-03-13 09:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 09:10:00,2022-03-13 09:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 09:19:00,2022-03-13 09:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 09:30:00,2022-03-13 09:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 09:39:00,2022-03-13 09:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 09:50:00,2022-03-13 09:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 09:59:00,2022-03-13 10:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 10:10:00,2022-03-13 10:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 10:30:00,2022-03-13 10:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 10:39:00,2022-03-13 10:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 10:50:00,2022-03-13 10:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 10:59:00,2022-03-13 11:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 11:10:00,2022-03-13 11:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 11:19:00,2022-03-13 11:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 11:30:00,2022-03-13 11:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 11:39:00,2022-03-13 11:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 11:50:00,2022-03-13 11:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 11:59:00,2022-03-13 12:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 12:10:00,2022-03-13 12:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 12:19:00,2022-03-13 12:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 12:30:00,2022-03-13 12:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 12:39:00,2022-03-13 12:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 12:50:00,2022-03-13 12:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 12:59:00,2022-03-13 13:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 13:10:00,2022-03-13 13:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 13:19:00,2022-03-13 13:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 13:30:00,2022-03-13 13:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 13:39:00,2022-03-13 13:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 13:50:00,2022-03-13 13:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 13:59:00,2022-03-13 14:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 14:10:00,2022-03-13 14:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 14:19:00,2022-03-13 14:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 14:30:00,2022-03-13 14:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 14:39:00,2022-03-13 14:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 14:50:00,2022-03-13 14:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 14:59:00,2022-03-13 15:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 15:10:00,2022-03-13 15:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 15:19:00,2022-03-13 15:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 15:30:00,2022-03-13 15:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 15:39:00,2022-03-13 15:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 15:50:00,2022-03-13 15:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 15:59:00,2022-03-13 16:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 16:10:00,2022-03-13 16:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 16:19:00,2022-03-13 16:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 16:30:00,2022-03-13 16:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 16:39:00,2022-03-13 16:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 16:50:00,2022-03-13 16:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 16:59:00,2022-03-13 17:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 17:10:00,2022-03-13 17:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 17:19:00,2022-03-13 17:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 17:30:00,2022-03-13 17:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 17:39:00,2022-03-13 17:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 17:50:00,2022-03-13 17:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 17:59:00,2022-03-13 18:10:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 18:10:00,2022-03-13 18:15:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 18:19:00,2022-03-13 18:30:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 18:30:00,2022-03-13 18:35:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 18:39:00,2022-03-13 18:50:00,Station-53,4341,0,4369706,CKB +LINE_29,Station-53,2022-03-13 18:50:00,2022-03-13 18:55:00,Station-54,2217,4,4369706,CKB +LINE_29,Station-54,2022-03-13 18:59:00,2022-03-13 19:10:00,Station-53,4288,0,4369706,CKB +LINE_29,Station-53,2022-03-13 19:10:00,2022-03-13 19:10:00,Station-0,0.06,0,4369706,CKB +LINE_10,Station-0,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.06,0,4419537,CKB +LINE_10,Station-24,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.0,792,4419537,CKB +LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-24,0.0,0,4419537,CKB +LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-0,0.06,0,4419537,CKB +LINE_30,Station-0,2022-03-13 07:18:00,2022-03-13 07:18:00,Station-55,0.06,0,4688586,CKB +LINE_30,Station-55,2022-03-13 07:18:00,2022-03-13 07:26:00,Station-56,5562,10,4688586,CKB +LINE_30,Station-56,2022-03-13 07:36:00,2022-03-13 07:45:00,Station-57,5941,32,4688586,CKB +LINE_30,Station-57,2022-03-13 08:17:00,2022-03-13 08:26:00,Station-56,5994,10,4688586,CKB +LINE_30,Station-56,2022-03-13 08:36:00,2022-03-13 08:45:00,Station-57,5941,32,4688586,CKB +LINE_30,Station-57,2022-03-13 09:17:00,2022-03-13 09:26:00,Station-56,5994,8,4688586,CKB +LINE_30,Station-56,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-57,5941,36,4688586,CKB +LINE_30,Station-57,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-56,5994,2,4688586,CKB +LINE_30,Station-56,2022-03-13 10:32:00,2022-03-13 10:41:00,Station-55,5566,0,4688586,CKB +LINE_30,Station-55,2022-03-13 10:41:00,2022-03-13 10:41:00,Station-0,0.06,0,4688586,CKB +LINE_0,Station-0,2022-03-08 21:31:00,2022-03-08 21:31:00,Station-1,0.06,0,4454944,CKB +LINE_0,Station-1,2022-03-08 21:31:00,2022-03-08 22:04:00,Station-2,14519,4,4454944,CKB +LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-1,13541,8,4454944,CKB +LINE_0,Station-1,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-2,14519,4,4454944,CKB +LINE_0,Station-2,2022-03-08 23:28:00,2022-03-09 00:03:00,Station-1,13541,8,4454944,CKB +LINE_0,Station-1,2022-03-09 00:11:00,2022-03-09 00:44:00,Station-2,14519,0,4454944,CKB +LINE_1,Station-2,2022-03-09 00:44:00,2022-03-09 00:54:00,Station-3,4.1,25,4454944,CKB +LINE_1,Station-3,2022-03-09 01:19:00,2022-03-09 01:42:00,Station-4,8.36,6,4454944,CKB +LINE_1,Station-4,2022-03-09 01:48:00,2022-03-09 02:06:00,Station-3,9067,13,4454944,CKB +LINE_1,Station-3,2022-03-09 02:19:00,2022-03-09 02:42:00,Station-4,8.36,6,4454944,CKB +LINE_1,Station-4,2022-03-09 02:48:00,2022-03-09 03:06:00,Station-3,9067,13,4454944,CKB +LINE_1,Station-3,2022-03-09 03:19:00,2022-03-09 03:42:00,Station-4,8.36,6,4454944,CKB +LINE_1,Station-4,2022-03-09 03:48:00,2022-03-09 04:06:00,Station-3,9067,0,4454944,CKB +LINE_1,Station-3,2022-03-09 04:06:00,2022-03-09 04:06:00,Station-0,0.06,0,4454944,CKB +LINE_0,Station-0,2022-03-08 22:11:00,2022-03-08 22:11:00,Station-1,0.06,0,4454949,CKB +LINE_0,Station-1,2022-03-08 22:11:00,2022-03-08 22:44:00,Station-2,14519,4,4454949,CKB +LINE_0,Station-2,2022-03-08 22:48:00,2022-03-08 23:23:00,Station-1,13541,8,4454949,CKB +LINE_0,Station-1,2022-03-08 23:31:00,2022-03-09 00:04:00,Station-2,14519,4,4454949,CKB +LINE_0,Station-2,2022-03-09 00:08:00,2022-03-09 00:39:00,Station-5,12213,0,4454949,CKB +LINE_1,Station-5,2022-03-09 00:39:00,2022-03-09 00:47:00,Station-3,4.0,2,4454949,CKB +LINE_1,Station-3,2022-03-09 00:49:00,2022-03-09 01:12:00,Station-4,8.36,6,4454949,CKB +LINE_1,Station-4,2022-03-09 01:18:00,2022-03-09 01:36:00,Station-3,9067,13,4454949,CKB +LINE_1,Station-3,2022-03-09 01:49:00,2022-03-09 02:12:00,Station-4,8.36,6,4454949,CKB +LINE_1,Station-4,2022-03-09 02:18:00,2022-03-09 02:36:00,Station-3,9067,13,4454949,CKB +LINE_1,Station-3,2022-03-09 02:49:00,2022-03-09 03:12:00,Station-4,8.36,6,4454949,CKB +LINE_1,Station-4,2022-03-09 03:18:00,2022-03-09 03:36:00,Station-3,9067,13,4454949,CKB +LINE_1,Station-3,2022-03-09 03:49:00,2022-03-09 04:12:00,Station-4,8.36,0,4454949,CKB +LINE_1,Station-4,2022-03-09 04:12:00,2022-03-09 04:12:00,Station-0,0.06,0,4454949,CKB +LINE_2,Station-0,2022-03-08 21:06:00,2022-03-08 21:06:00,Station-6,0.06,0,4664623,CKB +LINE_2,Station-6,2022-03-08 21:06:00,2022-03-08 21:34:00,Station-7,13018,19,4664623,CKB +LINE_2,Station-7,2022-03-08 21:53:00,2022-03-08 22:13:00,Station-8,10332,17,4664623,CKB +LINE_2,Station-8,2022-03-08 22:30:00,2022-03-08 22:54:00,Station-7,10.48,19,4664623,CKB +LINE_2,Station-7,2022-03-08 23:13:00,2022-03-08 23:33:00,Station-8,10332,17,4664623,CKB +LINE_2,Station-8,2022-03-08 23:50:00,2022-03-09 00:14:00,Station-7,10.48,2,4664623,CKB +LINE_2,Station-7,2022-03-09 00:16:00,2022-03-09 00:23:00,Station-9,3709,5,4664623,CKB +LINE_3,Station-9,2022-03-09 00:28:00,2022-03-09 00:44:00,Station-10,6404,3,4664623,CKB +LINE_3,Station-10,2022-03-09 00:47:00,2022-03-09 01:10:00,Station-11,10579,7,4664623,CKB +LINE_3,Station-11,2022-03-09 01:17:00,2022-03-09 01:44:00,Station-10,12007,3,4664623,CKB +LINE_3,Station-10,2022-03-09 01:47:00,2022-03-09 02:10:00,Station-11,10579,7,4664623,CKB +LINE_3,Station-11,2022-03-09 02:17:00,2022-03-09 02:44:00,Station-10,12007,3,4664623,CKB +LINE_3,Station-10,2022-03-09 02:47:00,2022-03-09 03:10:00,Station-11,10579,7,4664623,CKB +LINE_3,Station-11,2022-03-09 03:17:00,2022-03-09 03:44:00,Station-10,12007,3,4664623,CKB +LINE_3,Station-10,2022-03-09 03:47:00,2022-03-09 04:10:00,Station-11,10579,7,4664623,CKB +LINE_3,Station-11,2022-03-09 04:17:00,2022-03-09 04:44:00,Station-10,12007,0,4664623,CKB +LINE_3,Station-10,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,4664623,CKB +LINE_2,Station-0,2022-03-08 20:26:00,2022-03-08 20:26:00,Station-6,0.06,0,4762733,CKB +LINE_2,Station-6,2022-03-08 20:26:00,2022-03-08 20:56:00,Station-12,14097,14,4762733,CKB +LINE_2,Station-12,2022-03-08 21:10:00,2022-03-08 21:38:00,Station-6,13.19,8,4762733,CKB +LINE_2,Station-6,2022-03-08 21:46:00,2022-03-08 22:14:00,Station-7,13018,19,4762733,CKB +LINE_2,Station-7,2022-03-08 22:33:00,2022-03-08 22:53:00,Station-8,10332,17,4762733,CKB +LINE_2,Station-8,2022-03-08 23:10:00,2022-03-08 23:34:00,Station-7,10.48,19,4762733,CKB +LINE_2,Station-7,2022-03-08 23:53:00,2022-03-09 00:13:00,Station-8,10332,2,4762733,CKB +LINE_2,Station-8,2022-03-09 00:15:00,2022-03-09 00:16:00,Station-10,506,1,4762733,CKB +LINE_3,Station-10,2022-03-09 00:17:00,2022-03-09 00:40:00,Station-11,10579,7,4762733,CKB +LINE_3,Station-11,2022-03-09 00:47:00,2022-03-09 01:14:00,Station-10,12007,3,4762733,CKB +LINE_3,Station-10,2022-03-09 01:17:00,2022-03-09 01:40:00,Station-11,10579,7,4762733,CKB +LINE_3,Station-11,2022-03-09 01:47:00,2022-03-09 02:14:00,Station-10,12007,3,4762733,CKB +LINE_3,Station-10,2022-03-09 02:17:00,2022-03-09 02:40:00,Station-11,10579,7,4762733,CKB +LINE_3,Station-11,2022-03-09 02:47:00,2022-03-09 03:14:00,Station-10,12007,3,4762733,CKB +LINE_3,Station-10,2022-03-09 03:17:00,2022-03-09 03:40:00,Station-11,10579,7,4762733,CKB +LINE_3,Station-11,2022-03-09 03:47:00,2022-03-09 04:14:00,Station-10,12007,3,4762733,CKB +LINE_3,Station-10,2022-03-09 04:17:00,2022-03-09 04:40:00,Station-11,10579,3,4762733,CKB +LINE_4,Station-11,2022-03-09 04:43:00,2022-03-09 04:58:00,Station-13,6161,0,4762733,CKB +LINE_4,Station-13,2022-03-09 04:58:00,2022-03-09 04:58:00,Station-0,0.06,0,4762733,CKB +LINE_5,Station-0,2022-03-08 22:56:00,2022-03-08 22:56:00,Station-14,0.06,0,4617408,CKB +LINE_5,Station-14,2022-03-08 22:56:00,2022-03-08 23:08:00,Station-15,5882,3,4617408,CKB +LINE_5,Station-15,2022-03-08 23:11:00,2022-03-08 23:25:00,Station-14,6232,0,4617408,CKB +LINE_5,Station-14,2022-03-08 23:25:00,2022-03-08 23:38:00,Station-15,6086,3,4617408,CKB +LINE_5,Station-15,2022-03-08 23:41:00,2022-03-08 23:55:00,Station-14,6232,0,4617408,CKB +LINE_5,Station-14,2022-03-08 23:55:00,2022-03-09 00:08:00,Station-15,6086,0,4617408,CKB +LINE_5,Station-15,2022-03-09 00:08:00,2022-03-09 00:08:00,Station-0,0.06,0,4617408,CKB +LINE_6,Station-0,2022-03-08 05:05:00,2022-03-08 05:05:00,Station-16,0.06,0,4426845,CKB +LINE_6,Station-16,2022-03-08 05:05:00,2022-03-08 05:14:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 05:14:00,2022-03-08 05:23:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 05:25:00,2022-03-08 05:34:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 05:34:00,2022-03-08 05:43:00,Station-16,5139,23,4426845,CKB +LINE_6,Station-16,2022-03-08 06:06:00,2022-03-08 06:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 06:15:00,2022-03-08 06:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 06:26:00,2022-03-08 06:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 06:35:00,2022-03-08 06:44:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 06:46:00,2022-03-08 06:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 06:55:00,2022-03-08 07:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 07:06:00,2022-03-08 07:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 07:15:00,2022-03-08 07:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 07:26:00,2022-03-08 07:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 07:35:00,2022-03-08 07:44:00,Station-16,5139,22,4426845,CKB +LINE_6,Station-16,2022-03-08 08:06:00,2022-03-08 08:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 08:15:00,2022-03-08 08:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 08:26:00,2022-03-08 08:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 08:35:00,2022-03-08 08:44:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 08:46:00,2022-03-08 08:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 08:55:00,2022-03-08 09:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 09:06:00,2022-03-08 09:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 09:15:00,2022-03-08 09:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 09:26:00,2022-03-08 09:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 09:35:00,2022-03-08 09:44:00,Station-16,5139,22,4426845,CKB +LINE_6,Station-16,2022-03-08 10:06:00,2022-03-08 10:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 10:15:00,2022-03-08 10:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 10:26:00,2022-03-08 10:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 10:35:00,2022-03-08 10:44:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 10:46:00,2022-03-08 10:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 10:55:00,2022-03-08 11:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 11:06:00,2022-03-08 11:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 11:15:00,2022-03-08 11:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 11:26:00,2022-03-08 11:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 11:35:00,2022-03-08 11:44:00,Station-16,5139,22,4426845,CKB +LINE_6,Station-16,2022-03-08 12:06:00,2022-03-08 12:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 12:15:00,2022-03-08 12:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 12:26:00,2022-03-08 12:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 12:35:00,2022-03-08 12:44:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 12:46:00,2022-03-08 12:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 12:55:00,2022-03-08 13:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 13:06:00,2022-03-08 13:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 13:15:00,2022-03-08 13:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 13:26:00,2022-03-08 13:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 13:35:00,2022-03-08 13:44:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 13:46:00,2022-03-08 13:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 13:55:00,2022-03-08 14:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 14:06:00,2022-03-08 14:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 14:15:00,2022-03-08 14:24:00,Station-16,5139,22,4426845,CKB +LINE_6,Station-16,2022-03-08 14:46:00,2022-03-08 14:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 14:55:00,2022-03-08 15:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 15:06:00,2022-03-08 15:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 15:15:00,2022-03-08 15:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 15:26:00,2022-03-08 15:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 15:35:00,2022-03-08 15:44:00,Station-16,5139,22,4426845,CKB +LINE_6,Station-16,2022-03-08 16:06:00,2022-03-08 16:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 16:15:00,2022-03-08 16:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 16:26:00,2022-03-08 16:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 16:35:00,2022-03-08 16:44:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 16:46:00,2022-03-08 16:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 16:55:00,2022-03-08 17:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 17:06:00,2022-03-08 17:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 17:15:00,2022-03-08 17:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 17:26:00,2022-03-08 17:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 17:35:00,2022-03-08 17:44:00,Station-16,5139,22,4426845,CKB +LINE_6,Station-16,2022-03-08 18:06:00,2022-03-08 18:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 18:15:00,2022-03-08 18:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 18:26:00,2022-03-08 18:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 18:35:00,2022-03-08 18:44:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 18:46:00,2022-03-08 18:55:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 18:55:00,2022-03-08 19:04:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 19:06:00,2022-03-08 19:15:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 19:15:00,2022-03-08 19:24:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 19:26:00,2022-03-08 19:35:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 19:35:00,2022-03-08 19:44:00,Station-16,5139,21,4426845,CKB +LINE_6,Station-16,2022-03-08 20:05:00,2022-03-08 20:14:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 20:14:00,2022-03-08 20:23:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 20:25:00,2022-03-08 20:34:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 20:34:00,2022-03-08 20:43:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 20:45:00,2022-03-08 20:54:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 20:54:00,2022-03-08 21:03:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 21:05:00,2022-03-08 21:14:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 21:14:00,2022-03-08 21:23:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 21:25:00,2022-03-08 21:34:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 21:34:00,2022-03-08 21:43:00,Station-16,5139,22,4426845,CKB +LINE_6,Station-16,2022-03-08 22:05:00,2022-03-08 22:14:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 22:14:00,2022-03-08 22:23:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 22:25:00,2022-03-08 22:34:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 22:34:00,2022-03-08 22:43:00,Station-16,5139,2,4426845,CKB +LINE_6,Station-16,2022-03-08 22:45:00,2022-03-08 22:54:00,Station-17,4781,0,4426845,CKB +LINE_6,Station-17,2022-03-08 22:54:00,2022-03-08 23:03:00,Station-16,5139,0,4426845,CKB +LINE_6,Station-16,2022-03-08 23:03:00,2022-03-08 23:03:00,Station-0,0.06,0,4426845,CKB +LINE_7,Station-0,2022-03-09 00:06:00,2022-03-09 00:06:00,Station-18,0.06,0,4708595,CKB +LINE_7,Station-18,2022-03-09 00:06:00,2022-03-09 00:27:00,Station-19,7827,0,4708595,CKB +LINE_8,Station-19,2022-03-09 00:27:00,2022-03-09 00:48:00,Station-20,11079,0,4708595,CKB +LINE_8,Station-20,2022-03-09 00:48:00,2022-03-09 01:25:00,Station-21,20641,8,4708595,CKB +LINE_8,Station-21,2022-03-09 01:33:00,2022-03-09 02:16:00,Station-20,20579,1,4708595,CKB +LINE_8,Station-20,2022-03-09 02:17:00,2022-03-09 02:55:00,Station-21,20641,8,4708595,CKB +LINE_8,Station-21,2022-03-09 03:03:00,2022-03-09 03:46:00,Station-20,20579,1,4708595,CKB +LINE_8,Station-20,2022-03-09 03:47:00,2022-03-09 04:25:00,Station-21,20641,0,4708595,CKB +LINE_8,Station-21,2022-03-09 04:25:00,2022-03-09 04:25:00,Station-0,0.06,0,4708595,CKB +LINE_9,Station-22,2022-03-08 05:15:00,2022-03-08 06:01:00,Station-23,17.9,0,4317625,VDL +LINE_9,Station-23,2022-03-08 06:01:00,2022-03-08 06:15:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 06:23:00,2022-03-08 06:37:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 06:41:00,2022-03-08 06:55:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 07:03:00,2022-03-08 07:17:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 07:21:00,2022-03-08 07:35:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 07:43:00,2022-03-08 07:57:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 08:01:00,2022-03-08 08:15:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 08:23:00,2022-03-08 08:37:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 08:41:00,2022-03-08 08:55:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 09:03:00,2022-03-08 09:17:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 09:21:00,2022-03-08 09:35:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 09:43:00,2022-03-08 09:57:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 10:01:00,2022-03-08 10:15:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 10:23:00,2022-03-08 10:37:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 10:41:00,2022-03-08 10:55:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 11:03:00,2022-03-08 11:17:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 11:21:00,2022-03-08 11:35:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 11:43:00,2022-03-08 11:57:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 12:01:00,2022-03-08 12:15:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 12:23:00,2022-03-08 12:37:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 12:41:00,2022-03-08 12:55:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 13:03:00,2022-03-08 13:17:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 13:21:00,2022-03-08 13:35:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 13:43:00,2022-03-08 13:57:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 14:01:00,2022-03-08 14:15:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 14:23:00,2022-03-08 14:37:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 14:41:00,2022-03-08 14:55:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 15:03:00,2022-03-08 15:17:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 15:21:00,2022-03-08 15:35:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 15:43:00,2022-03-08 15:57:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 16:01:00,2022-03-08 16:15:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 16:23:00,2022-03-08 16:37:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 16:41:00,2022-03-08 16:55:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 17:03:00,2022-03-08 17:17:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 17:21:00,2022-03-08 17:35:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 17:43:00,2022-03-08 17:57:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 18:01:00,2022-03-08 18:15:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 18:23:00,2022-03-08 18:37:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 18:41:00,2022-03-08 18:55:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 19:03:00,2022-03-08 19:17:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 19:21:00,2022-03-08 19:35:00,Station-23,4637,8,4317625,VDL +LINE_9,Station-23,2022-03-08 19:43:00,2022-03-08 19:57:00,Station-23,4637,4,4317625,VDL +LINE_9,Station-23,2022-03-08 20:01:00,2022-03-08 20:14:00,Station-23,4637,9,4317625,VDL +LINE_9,Station-23,2022-03-08 20:23:00,2022-03-08 20:36:00,Station-23,4637,0,4317625,VDL +LINE_9,Station-23,2022-03-08 20:36:00,2022-03-08 21:15:00,Station-22,19.8,0,4317625,VDL +LINE_10,Station-0,2022-03-08 04:56:00,2022-03-08 04:56:00,Station-24,0.06,18,4425668,CKB +LINE_10,Station-24,2022-03-08 05:14:00,2022-03-08 05:20:00,Station-25,3.29,0,4425668,CKB +LINE_10,Station-25,2022-03-08 05:20:00,2022-03-08 05:24:00,Station-24,2954,20,4425668,CKB +LINE_10,Station-24,2022-03-08 05:44:00,2022-03-08 05:50:00,Station-25,3.29,0,4425668,CKB +LINE_10,Station-25,2022-03-08 05:50:00,2022-03-08 05:54:00,Station-24,2954,5,4425668,CKB +LINE_10,Station-24,2022-03-08 05:59:00,2022-03-08 06:06:00,Station-25,3.29,2,4425668,CKB +LINE_10,Station-25,2022-03-08 06:08:00,2022-03-08 06:13:00,Station-24,2954,19,4425668,CKB +LINE_10,Station-24,2022-03-08 06:32:00,2022-03-08 06:39:00,Station-25,3.29,1,4425668,CKB +LINE_10,Station-25,2022-03-08 06:40:00,2022-03-08 06:45:00,Station-24,2954,7,4425668,CKB +LINE_10,Station-24,2022-03-08 06:52:00,2022-03-08 06:59:00,Station-25,3.29,1,4425668,CKB +LINE_10,Station-25,2022-03-08 07:00:00,2022-03-08 07:05:00,Station-24,2954,7,4425668,CKB +LINE_10,Station-24,2022-03-08 07:12:00,2022-03-08 07:19:00,Station-25,3.29,1,4425668,CKB +LINE_10,Station-25,2022-03-08 07:20:00,2022-03-08 07:25:00,Station-24,2954,7,4425668,CKB +LINE_10,Station-24,2022-03-08 07:32:00,2022-03-08 07:39:00,Station-25,3.29,1,4425668,CKB +LINE_10,Station-25,2022-03-08 07:40:00,2022-03-08 07:45:00,Station-24,2954,295,4425668,CKB +LINE_10,Station-24,2022-03-08 12:40:00,2022-03-08 12:47:00,Station-25,3.29,2,4425668,CKB +LINE_10,Station-25,2022-03-08 12:49:00,2022-03-08 12:54:00,Station-24,2954,46,4425668,CKB +LINE_10,Station-24,2022-03-08 13:40:00,2022-03-08 13:47:00,Station-25,3.29,2,4425668,CKB +LINE_10,Station-25,2022-03-08 13:49:00,2022-03-08 13:54:00,Station-24,2954,434,4425668,CKB +LINE_10,Station-24,2022-03-08 21:08:00,2022-03-08 21:08:00,Station-0,0.06,0,4425668,CKB +LINE_11,Station-0,2022-03-08 07:20:00,2022-03-08 07:20:00,Station-26,0.06,0,4448150,CKB +LINE_11,Station-26,2022-03-08 07:20:00,2022-03-08 07:50:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 08:00:00,2022-03-08 08:30:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 08:40:00,2022-03-08 09:10:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 09:20:00,2022-03-08 09:50:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 10:00:00,2022-03-08 10:30:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 10:40:00,2022-03-08 11:10:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 11:20:00,2022-03-08 11:50:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 12:00:00,2022-03-08 12:30:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 12:40:00,2022-03-08 13:10:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 13:20:00,2022-03-08 13:50:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 14:00:00,2022-03-08 14:30:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 14:40:00,2022-03-08 15:10:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 15:20:00,2022-03-08 15:50:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 16:00:00,2022-03-08 16:30:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 16:40:00,2022-03-08 17:10:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 17:20:00,2022-03-08 17:50:00,Station-26,9266,10,4448150,CKB +LINE_11,Station-26,2022-03-08 18:00:00,2022-03-08 18:30:00,Station-26,9266,0,4448150,CKB +LINE_11,Station-26,2022-03-08 18:30:00,2022-03-08 18:30:00,Station-0,0.06,0,4448150,CKB +LINE_12,Station-0,2022-03-08 07:10:00,2022-03-08 07:10:00,Station-27,0.06,0,4733895,CKB +LINE_12,Station-27,2022-03-08 07:10:00,2022-03-08 07:18:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 07:28:00,2022-03-08 07:40:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 07:40:00,2022-03-08 07:48:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 07:58:00,2022-03-08 08:10:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 08:10:00,2022-03-08 08:18:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 08:28:00,2022-03-08 08:40:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 08:40:00,2022-03-08 08:48:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 08:58:00,2022-03-08 09:10:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 09:10:00,2022-03-08 09:18:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 09:28:00,2022-03-08 09:40:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 09:40:00,2022-03-08 09:48:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 09:58:00,2022-03-08 10:10:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 10:10:00,2022-03-08 10:18:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 10:28:00,2022-03-08 10:40:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 10:40:00,2022-03-08 10:48:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 10:58:00,2022-03-08 11:10:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 11:10:00,2022-03-08 11:18:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 11:28:00,2022-03-08 11:40:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 11:40:00,2022-03-08 11:48:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 11:58:00,2022-03-08 12:10:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 12:10:00,2022-03-08 12:18:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 12:28:00,2022-03-08 12:40:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 12:40:00,2022-03-08 12:48:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 12:58:00,2022-03-08 13:10:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 13:10:00,2022-03-08 13:18:00,Station-28,2169,10,4733895,CKB +LINE_12,Station-28,2022-03-08 13:28:00,2022-03-08 13:40:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 13:40:00,2022-03-08 13:48:00,Station-28,2169,8,4733895,CKB +LINE_12,Station-28,2022-03-08 13:56:00,2022-03-08 14:10:00,Station-27,2952,0,4733895,CKB +LINE_12,Station-27,2022-03-08 14:10:00,2022-03-08 14:19:00,Station-28,2169,14,4733895,CKB +LINE_12,Station-28,2022-03-08 14:33:00,2022-03-08 14:47:00,Station-27,2952,3,4733895,CKB +LINE_12,Station-27,2022-03-08 14:50:00,2022-03-08 14:59:00,Station-28,2169,14,4733895,CKB +LINE_12,Station-28,2022-03-08 15:13:00,2022-03-08 15:27:00,Station-27,2952,3,4733895,CKB +LINE_12,Station-27,2022-03-08 15:30:00,2022-03-08 15:39:00,Station-28,2169,14,4733895,CKB +LINE_12,Station-28,2022-03-08 15:53:00,2022-03-08 16:07:00,Station-27,2952,3,4733895,CKB +LINE_12,Station-27,2022-03-08 16:10:00,2022-03-08 16:19:00,Station-28,2169,14,4733895,CKB +LINE_12,Station-28,2022-03-08 16:33:00,2022-03-08 16:47:00,Station-27,2952,3,4733895,CKB +LINE_12,Station-27,2022-03-08 16:50:00,2022-03-08 16:59:00,Station-28,2169,14,4733895,CKB +LINE_12,Station-28,2022-03-08 17:13:00,2022-03-08 17:27:00,Station-27,2952,3,4733895,CKB +LINE_12,Station-27,2022-03-08 17:30:00,2022-03-08 17:39:00,Station-28,2169,13,4733895,CKB +LINE_12,Station-28,2022-03-08 17:52:00,2022-03-08 18:05:00,Station-27,2952,5,4733895,CKB +LINE_12,Station-27,2022-03-08 18:10:00,2022-03-08 18:18:00,Station-28,2169,0,4733895,CKB +LINE_12,Station-28,2022-03-08 18:18:00,2022-03-08 18:18:00,Station-0,0.06,0,4733895,CKB +LINE_12,Station-0,2022-03-08 14:13:00,2022-03-08 14:13:00,Station-28,0.06,0,4734200,CKB +LINE_12,Station-28,2022-03-08 14:13:00,2022-03-08 14:27:00,Station-27,2952,3,4734200,CKB +LINE_12,Station-27,2022-03-08 14:30:00,2022-03-08 14:39:00,Station-28,2169,14,4734200,CKB +LINE_12,Station-28,2022-03-08 14:53:00,2022-03-08 15:07:00,Station-27,2952,3,4734200,CKB +LINE_12,Station-27,2022-03-08 15:10:00,2022-03-08 15:19:00,Station-28,2169,14,4734200,CKB +LINE_12,Station-28,2022-03-08 15:33:00,2022-03-08 15:47:00,Station-27,2952,3,4734200,CKB +LINE_12,Station-27,2022-03-08 15:50:00,2022-03-08 15:59:00,Station-28,2169,14,4734200,CKB +LINE_12,Station-28,2022-03-08 16:13:00,2022-03-08 16:27:00,Station-27,2952,3,4734200,CKB +LINE_12,Station-27,2022-03-08 16:30:00,2022-03-08 16:39:00,Station-28,2169,14,4734200,CKB +LINE_12,Station-28,2022-03-08 16:53:00,2022-03-08 17:07:00,Station-27,2952,3,4734200,CKB +LINE_12,Station-27,2022-03-08 17:10:00,2022-03-08 17:19:00,Station-28,2169,14,4734200,CKB +LINE_12,Station-28,2022-03-08 17:33:00,2022-03-08 17:47:00,Station-27,2952,3,4734200,CKB +LINE_12,Station-27,2022-03-08 17:50:00,2022-03-08 17:59:00,Station-28,2169,14,4734200,CKB +LINE_12,Station-28,2022-03-08 18:13:00,2022-03-08 18:25:00,Station-27,2952,0,4734200,CKB +LINE_12,Station-27,2022-03-08 18:25:00,2022-03-08 18:25:00,Station-0,0.06,0,4734200,CKB +LINE_13,Station-0,2022-03-09 00:23:00,2022-03-09 00:23:00,Station-29,0.06,0,4318157,CKB +LINE_13,Station-29,2022-03-09 00:23:00,2022-03-09 00:30:00,Station-30,2577,9,4318157,CKB +LINE_14,Station-30,2022-03-09 00:39:00,2022-03-09 00:54:00,Station-31,5937,9,4318157,CKB +LINE_14,Station-31,2022-03-09 01:03:00,2022-03-09 01:17:00,Station-30,6.19,0,4318157,CKB +LINE_13,Station-30,2022-03-09 01:17:00,2022-03-09 01:23:00,Station-29,2555,0,4318157,CKB +LINE_13,Station-29,2022-03-09 01:23:00,2022-03-09 01:30:00,Station-30,2577,9,4318157,CKB +LINE_14,Station-30,2022-03-09 01:39:00,2022-03-09 01:54:00,Station-31,5937,9,4318157,CKB +LINE_14,Station-31,2022-03-09 02:03:00,2022-03-09 02:17:00,Station-30,6.19,0,4318157,CKB +LINE_13,Station-30,2022-03-09 02:17:00,2022-03-09 02:23:00,Station-29,2555,0,4318157,CKB +LINE_13,Station-29,2022-03-09 02:23:00,2022-03-09 02:30:00,Station-30,2577,9,4318157,CKB +LINE_14,Station-30,2022-03-09 02:39:00,2022-03-09 02:54:00,Station-31,5937,9,4318157,CKB +LINE_14,Station-31,2022-03-09 03:03:00,2022-03-09 03:17:00,Station-30,6.19,0,4318157,CKB +LINE_13,Station-30,2022-03-09 03:17:00,2022-03-09 03:23:00,Station-29,2555,0,4318157,CKB +LINE_13,Station-29,2022-03-09 03:23:00,2022-03-09 03:30:00,Station-30,2577,9,4318157,CKB +LINE_14,Station-30,2022-03-09 03:39:00,2022-03-09 03:54:00,Station-31,5937,9,4318157,CKB +LINE_14,Station-31,2022-03-09 04:03:00,2022-03-09 04:17:00,Station-30,6.19,0,4318157,CKB +LINE_13,Station-30,2022-03-09 04:17:00,2022-03-09 04:23:00,Station-29,2555,0,4318157,CKB +LINE_13,Station-29,2022-03-09 04:23:00,2022-03-09 04:23:00,Station-0,0.06,0,4318157,CKB +LINE_14,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-31,0.06,0,4318177,CKB +LINE_14,Station-31,2022-03-09 00:33:00,2022-03-09 00:47:00,Station-30,6.19,0,4318177,CKB +LINE_13,Station-30,2022-03-09 00:47:00,2022-03-09 00:53:00,Station-29,2555,0,4318177,CKB +LINE_13,Station-29,2022-03-09 00:53:00,2022-03-09 01:00:00,Station-30,2577,9,4318177,CKB +LINE_14,Station-30,2022-03-09 01:09:00,2022-03-09 01:24:00,Station-31,5937,9,4318177,CKB +LINE_14,Station-31,2022-03-09 01:33:00,2022-03-09 01:47:00,Station-30,6.19,0,4318177,CKB +LINE_13,Station-30,2022-03-09 01:47:00,2022-03-09 01:53:00,Station-29,2555,0,4318177,CKB +LINE_13,Station-29,2022-03-09 01:53:00,2022-03-09 02:00:00,Station-30,2577,9,4318177,CKB +LINE_14,Station-30,2022-03-09 02:09:00,2022-03-09 02:24:00,Station-31,5937,9,4318177,CKB +LINE_14,Station-31,2022-03-09 02:33:00,2022-03-09 02:47:00,Station-30,6.19,0,4318177,CKB +LINE_13,Station-30,2022-03-09 02:47:00,2022-03-09 02:53:00,Station-29,2555,0,4318177,CKB +LINE_13,Station-29,2022-03-09 02:53:00,2022-03-09 03:00:00,Station-30,2577,9,4318177,CKB +LINE_14,Station-30,2022-03-09 03:09:00,2022-03-09 03:24:00,Station-31,5937,9,4318177,CKB +LINE_14,Station-31,2022-03-09 03:33:00,2022-03-09 03:47:00,Station-30,6.19,0,4318177,CKB +LINE_13,Station-30,2022-03-09 03:47:00,2022-03-09 03:53:00,Station-29,2555,0,4318177,CKB +LINE_13,Station-29,2022-03-09 03:53:00,2022-03-09 04:00:00,Station-30,2577,9,4318177,CKB +LINE_14,Station-30,2022-03-09 04:09:00,2022-03-09 04:24:00,Station-31,5937,0,4318177,CKB +LINE_14,Station-31,2022-03-09 04:24:00,2022-03-09 04:24:00,Station-0,0.06,0,4318177,CKB +LINE_15,Station-0,2022-03-09 00:57:00,2022-03-09 00:57:00,Station-32,0.06,0,4319352,CKB +LINE_15,Station-32,2022-03-09 00:57:00,2022-03-09 01:06:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 01:06:00,2022-03-09 01:11:00,Station-32,2936,16,4319352,CKB +LINE_15,Station-32,2022-03-09 01:27:00,2022-03-09 01:36:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 01:36:00,2022-03-09 01:41:00,Station-32,2936,16,4319352,CKB +LINE_15,Station-32,2022-03-09 01:57:00,2022-03-09 02:06:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 02:06:00,2022-03-09 02:11:00,Station-32,2936,16,4319352,CKB +LINE_15,Station-32,2022-03-09 02:27:00,2022-03-09 02:36:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 02:36:00,2022-03-09 02:41:00,Station-32,2936,16,4319352,CKB +LINE_15,Station-32,2022-03-09 02:57:00,2022-03-09 03:06:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 03:06:00,2022-03-09 03:11:00,Station-32,2936,16,4319352,CKB +LINE_15,Station-32,2022-03-09 03:27:00,2022-03-09 03:36:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 03:36:00,2022-03-09 03:41:00,Station-32,2936,16,4319352,CKB +LINE_15,Station-32,2022-03-09 03:57:00,2022-03-09 04:06:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 04:06:00,2022-03-09 04:11:00,Station-32,2936,16,4319352,CKB +LINE_15,Station-32,2022-03-09 04:27:00,2022-03-09 04:36:00,Station-33,4343,0,4319352,CKB +LINE_15,Station-33,2022-03-09 04:36:00,2022-03-09 04:36:00,Station-0,0.06,0,4319352,CKB +LINE_16,Station-0,2022-03-09 00:29:00,2022-03-09 00:29:00,Station-34,0.06,0,4751087,CKB +LINE_16,Station-34,2022-03-09 00:29:00,2022-03-09 00:41:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 00:47:00,2022-03-09 00:57:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 00:59:00,2022-03-09 01:11:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 01:17:00,2022-03-09 01:27:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 01:29:00,2022-03-09 01:41:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 01:47:00,2022-03-09 01:57:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 01:59:00,2022-03-09 02:11:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 02:17:00,2022-03-09 02:27:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 02:29:00,2022-03-09 02:41:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 02:47:00,2022-03-09 02:57:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 02:59:00,2022-03-09 03:11:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 03:17:00,2022-03-09 03:27:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 03:29:00,2022-03-09 03:41:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 03:47:00,2022-03-09 03:57:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 03:59:00,2022-03-09 04:11:00,Station-35,4481,6,4751087,CKB +LINE_16,Station-35,2022-03-09 04:17:00,2022-03-09 04:27:00,Station-34,4031,2,4751087,CKB +LINE_16,Station-34,2022-03-09 04:29:00,2022-03-09 04:41:00,Station-35,4481,0,4751087,CKB +LINE_16,Station-35,2022-03-09 04:41:00,2022-03-09 04:41:00,Station-0,0.06,0,4751087,CKB +LINE_17,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-34,0.06,0,4453545,CKB +LINE_17,Station-34,2022-03-09 00:30:00,2022-03-09 00:44:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 00:44:00,2022-03-09 00:57:00,Station-34,5302,3,4453545,CKB +LINE_17,Station-34,2022-03-09 01:00:00,2022-03-09 01:14:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 01:14:00,2022-03-09 01:27:00,Station-34,5302,3,4453545,CKB +LINE_17,Station-34,2022-03-09 01:30:00,2022-03-09 01:44:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 01:44:00,2022-03-09 01:57:00,Station-34,5302,3,4453545,CKB +LINE_17,Station-34,2022-03-09 02:00:00,2022-03-09 02:14:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 02:14:00,2022-03-09 02:27:00,Station-34,5302,3,4453545,CKB +LINE_17,Station-34,2022-03-09 02:30:00,2022-03-09 02:44:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 02:44:00,2022-03-09 02:57:00,Station-34,5302,3,4453545,CKB +LINE_17,Station-34,2022-03-09 03:00:00,2022-03-09 03:14:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 03:14:00,2022-03-09 03:27:00,Station-34,5302,3,4453545,CKB +LINE_17,Station-34,2022-03-09 03:30:00,2022-03-09 03:44:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 03:44:00,2022-03-09 03:57:00,Station-34,5302,3,4453545,CKB +LINE_17,Station-34,2022-03-09 04:00:00,2022-03-09 04:14:00,Station-36,4801,0,4453545,CKB +LINE_17,Station-36,2022-03-09 04:14:00,2022-03-09 04:27:00,Station-34,5302,0,4453545,CKB +LINE_17,Station-34,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,4453545,CKB +LINE_18,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-37,0.06,0,4374467,CKB +LINE_18,Station-37,2022-03-09 00:43:00,2022-03-09 01:33:00,Station-37,20434,10,4374467,CKB +LINE_18,Station-37,2022-03-09 01:43:00,2022-03-09 02:33:00,Station-37,20434,10,4374467,CKB +LINE_18,Station-37,2022-03-09 02:43:00,2022-03-09 03:33:00,Station-37,20434,10,4374467,CKB +LINE_18,Station-37,2022-03-09 03:43:00,2022-03-09 04:33:00,Station-37,20434,0,4374467,CKB +LINE_18,Station-37,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,4374467,CKB +LINE_18,Station-0,2022-03-09 00:13:00,2022-03-09 00:13:00,Station-37,0.06,0,4374472,CKB +LINE_18,Station-37,2022-03-09 00:13:00,2022-03-09 01:03:00,Station-37,20434,10,4374472,CKB +LINE_18,Station-37,2022-03-09 01:13:00,2022-03-09 02:03:00,Station-37,20434,10,4374472,CKB +LINE_18,Station-37,2022-03-09 02:13:00,2022-03-09 03:03:00,Station-37,20434,10,4374472,CKB +LINE_18,Station-37,2022-03-09 03:13:00,2022-03-09 04:03:00,Station-37,20434,0,4374472,CKB +LINE_18,Station-37,2022-03-09 04:03:00,2022-03-09 04:03:00,Station-0,0.06,0,4374472,CKB +LINE_19,Station-0,2022-03-09 00:24:00,2022-03-09 00:24:00,Station-38,0.06,0,4456448,CKB +LINE_19,Station-38,2022-03-09 00:24:00,2022-03-09 00:48:00,Station-39,11.86,4,4456448,CKB +LINE_19,Station-39,2022-03-09 00:52:00,2022-03-09 01:14:00,Station-38,11139,10,4456448,CKB +LINE_19,Station-38,2022-03-09 01:24:00,2022-03-09 01:48:00,Station-39,11.86,4,4456448,CKB +LINE_19,Station-39,2022-03-09 01:52:00,2022-03-09 02:14:00,Station-38,11139,10,4456448,CKB +LINE_19,Station-38,2022-03-09 02:24:00,2022-03-09 02:48:00,Station-39,11.86,4,4456448,CKB +LINE_19,Station-39,2022-03-09 02:52:00,2022-03-09 03:14:00,Station-38,11139,10,4456448,CKB +LINE_19,Station-38,2022-03-09 03:24:00,2022-03-09 03:48:00,Station-39,11.86,4,4456448,CKB +LINE_19,Station-39,2022-03-09 03:52:00,2022-03-09 04:14:00,Station-38,11139,0,4456448,CKB +LINE_19,Station-38,2022-03-09 04:14:00,2022-03-09 04:14:00,Station-0,0.06,0,4456448,CKB +LINE_19,Station-0,2022-03-09 00:22:00,2022-03-09 00:22:00,Station-39,0.06,0,4456456,CKB +LINE_19,Station-39,2022-03-09 00:22:00,2022-03-09 00:44:00,Station-38,11139,10,4456456,CKB +LINE_19,Station-38,2022-03-09 00:54:00,2022-03-09 01:18:00,Station-39,11.86,4,4456456,CKB +LINE_19,Station-39,2022-03-09 01:22:00,2022-03-09 01:44:00,Station-38,11139,10,4456456,CKB +LINE_19,Station-38,2022-03-09 01:54:00,2022-03-09 02:18:00,Station-39,11.86,4,4456456,CKB +LINE_19,Station-39,2022-03-09 02:22:00,2022-03-09 02:44:00,Station-38,11139,10,4456456,CKB +LINE_19,Station-38,2022-03-09 02:54:00,2022-03-09 03:18:00,Station-39,11.86,4,4456456,CKB +LINE_19,Station-39,2022-03-09 03:22:00,2022-03-09 03:44:00,Station-38,11139,10,4456456,CKB +LINE_19,Station-38,2022-03-09 03:54:00,2022-03-09 04:18:00,Station-39,11.86,4,4456456,CKB +LINE_19,Station-39,2022-03-09 04:22:00,2022-03-09 04:44:00,Station-38,11139,0,4456456,CKB +LINE_19,Station-38,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,4456456,CKB +LINE_20,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,4747650,CKB +LINE_20,Station-13,2022-03-09 00:32:00,2022-03-09 00:44:00,Station-40,4212,3,4747650,CKB +LINE_20,Station-40,2022-03-09 00:47:00,2022-03-09 01:16:00,Station-41,13048,0,4747650,CKB +LINE_20,Station-41,2022-03-09 01:16:00,2022-03-09 01:42:00,Station-40,12869,5,4747650,CKB +LINE_20,Station-40,2022-03-09 01:47:00,2022-03-09 02:16:00,Station-41,13048,0,4747650,CKB +LINE_20,Station-41,2022-03-09 02:16:00,2022-03-09 02:42:00,Station-40,12869,5,4747650,CKB +LINE_20,Station-40,2022-03-09 02:47:00,2022-03-09 03:16:00,Station-41,13048,0,4747650,CKB +LINE_20,Station-41,2022-03-09 03:16:00,2022-03-09 03:42:00,Station-40,12869,5,4747650,CKB +LINE_20,Station-40,2022-03-09 03:47:00,2022-03-09 04:16:00,Station-41,13048,0,4747650,CKB +LINE_20,Station-41,2022-03-09 04:16:00,2022-03-09 04:34:00,Station-42,9538,0,4747650,CKB +LINE_20,Station-42,2022-03-09 04:34:00,2022-03-09 04:34:00,Station-0,0.06,0,4747650,CKB +LINE_20,Station-0,2022-03-09 00:17:00,2022-03-09 00:17:00,Station-40,0.06,0,4747660,CKB +LINE_20,Station-40,2022-03-09 00:17:00,2022-03-09 00:46:00,Station-41,13048,0,4747660,CKB +LINE_20,Station-41,2022-03-09 00:46:00,2022-03-09 01:12:00,Station-40,12869,5,4747660,CKB +LINE_20,Station-40,2022-03-09 01:17:00,2022-03-09 01:46:00,Station-41,13048,0,4747660,CKB +LINE_20,Station-41,2022-03-09 01:46:00,2022-03-09 02:12:00,Station-40,12869,5,4747660,CKB +LINE_20,Station-40,2022-03-09 02:17:00,2022-03-09 02:46:00,Station-41,13048,0,4747660,CKB +LINE_20,Station-41,2022-03-09 02:46:00,2022-03-09 03:12:00,Station-40,12869,5,4747660,CKB +LINE_20,Station-40,2022-03-09 03:17:00,2022-03-09 03:46:00,Station-41,13048,0,4747660,CKB +LINE_20,Station-41,2022-03-09 03:46:00,2022-03-09 04:12:00,Station-40,12869,5,4747660,CKB +LINE_20,Station-40,2022-03-09 04:17:00,2022-03-09 04:28:00,Station-13,4316,0,4747660,CKB +LINE_20,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,4747660,CKB +LINE_21,Station-0,2022-03-09 00:49:00,2022-03-09 00:49:00,Station-3,0.06,0,4434341,CKB +LINE_21,Station-3,2022-03-09 00:49:00,2022-03-09 01:04:00,Station-16,10229,0,4434341,CKB +LINE_21,Station-16,2022-03-09 01:04:00,2022-03-09 01:19:00,Station-3,11801,0,4434341,CKB +LINE_21,Station-3,2022-03-09 01:19:00,2022-03-09 01:34:00,Station-16,10229,0,4434341,CKB +LINE_21,Station-16,2022-03-09 01:34:00,2022-03-09 01:49:00,Station-3,11801,0,4434341,CKB +LINE_21,Station-3,2022-03-09 01:49:00,2022-03-09 02:04:00,Station-16,10229,0,4434341,CKB +LINE_21,Station-16,2022-03-09 02:04:00,2022-03-09 02:19:00,Station-3,11801,0,4434341,CKB +LINE_21,Station-3,2022-03-09 02:19:00,2022-03-09 02:34:00,Station-16,10229,0,4434341,CKB +LINE_21,Station-16,2022-03-09 02:34:00,2022-03-09 02:49:00,Station-3,11801,0,4434341,CKB +LINE_21,Station-3,2022-03-09 02:49:00,2022-03-09 03:04:00,Station-16,10229,0,4434341,CKB +LINE_21,Station-16,2022-03-09 03:04:00,2022-03-09 03:19:00,Station-3,11801,0,4434341,CKB +LINE_21,Station-3,2022-03-09 03:19:00,2022-03-09 03:34:00,Station-16,10229,0,4434341,CKB +LINE_21,Station-16,2022-03-09 03:34:00,2022-03-09 03:49:00,Station-3,11801,0,4434341,CKB +LINE_21,Station-3,2022-03-09 03:49:00,2022-03-09 04:04:00,Station-16,10229,0,4434341,CKB +LINE_21,Station-16,2022-03-09 04:04:00,2022-03-09 04:19:00,Station-3,11801,23,4434341,CKB +LINE_22,Station-3,2022-03-09 04:42:00,2022-03-09 05:04:00,Station-43,6.81,0,4434341,CKB +LINE_22,Station-43,2022-03-09 05:04:00,2022-03-09 05:04:00,Station-0,0.06,0,4434341,CKB +LINE_8,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,4434897,CKB +LINE_8,Station-13,2022-03-09 00:32:00,2022-03-09 00:57:00,Station-21,11545,6,4434897,CKB +LINE_8,Station-21,2022-03-09 01:03:00,2022-03-09 01:46:00,Station-20,20579,1,4434897,CKB +LINE_8,Station-20,2022-03-09 01:47:00,2022-03-09 02:25:00,Station-21,20641,8,4434897,CKB +LINE_8,Station-21,2022-03-09 02:33:00,2022-03-09 03:16:00,Station-20,20579,1,4434897,CKB +LINE_8,Station-20,2022-03-09 03:17:00,2022-03-09 03:55:00,Station-21,20641,8,4434897,CKB +LINE_8,Station-21,2022-03-09 04:03:00,2022-03-09 04:28:00,Station-13,11499,0,4434897,CKB +LINE_8,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,4434897,CKB +LINE_8,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-21,0.06,0,4434902,CKB +LINE_8,Station-21,2022-03-09 00:33:00,2022-03-09 01:16:00,Station-20,20579,1,4434902,CKB +LINE_8,Station-20,2022-03-09 01:17:00,2022-03-09 01:55:00,Station-21,20641,8,4434902,CKB +LINE_8,Station-21,2022-03-09 02:03:00,2022-03-09 02:46:00,Station-20,20579,1,4434902,CKB +LINE_8,Station-20,2022-03-09 02:47:00,2022-03-09 03:25:00,Station-21,20641,8,4434902,CKB +LINE_8,Station-21,2022-03-09 03:33:00,2022-03-09 04:16:00,Station-20,20579,1,4434902,CKB +LINE_8,Station-20,2022-03-09 04:17:00,2022-03-09 04:51:00,Station-44,18752,0,4434902,CKB +LINE_8,Station-44,2022-03-09 04:51:00,2022-03-09 04:51:00,Station-0,0.06,0,4434902,CKB +LINE_23,Station-0,2022-03-09 00:34:00,2022-03-09 00:34:00,Station-45,0.06,0,4619766,CKB +LINE_23,Station-45,2022-03-09 00:34:00,2022-03-09 01:00:00,Station-46,9016,0,4619766,CKB +LINE_23,Station-46,2022-03-09 01:00:00,2022-03-09 01:27:00,Station-45,10083,7,4619766,CKB +LINE_23,Station-45,2022-03-09 01:34:00,2022-03-09 02:00:00,Station-46,9016,0,4619766,CKB +LINE_23,Station-46,2022-03-09 02:00:00,2022-03-09 02:27:00,Station-45,10083,7,4619766,CKB +LINE_23,Station-45,2022-03-09 02:34:00,2022-03-09 03:00:00,Station-46,9016,0,4619766,CKB +LINE_23,Station-46,2022-03-09 03:00:00,2022-03-09 03:27:00,Station-45,10083,7,4619766,CKB +LINE_23,Station-45,2022-03-09 03:34:00,2022-03-09 04:00:00,Station-46,9016,0,4619766,CKB +LINE_23,Station-46,2022-03-09 04:00:00,2022-03-09 04:27:00,Station-45,10083,0,4619766,CKB +LINE_23,Station-45,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,4619766,CKB +LINE_23,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-46,0.06,0,4619991,CKB +LINE_23,Station-46,2022-03-09 00:30:00,2022-03-09 00:57:00,Station-45,10083,7,4619991,CKB +LINE_23,Station-45,2022-03-09 01:04:00,2022-03-09 01:30:00,Station-46,9016,0,4619991,CKB +LINE_23,Station-46,2022-03-09 01:30:00,2022-03-09 01:57:00,Station-45,10083,7,4619991,CKB +LINE_23,Station-45,2022-03-09 02:04:00,2022-03-09 02:30:00,Station-46,9016,0,4619991,CKB +LINE_23,Station-46,2022-03-09 02:30:00,2022-03-09 02:57:00,Station-45,10083,7,4619991,CKB +LINE_23,Station-45,2022-03-09 03:04:00,2022-03-09 03:30:00,Station-46,9016,0,4619991,CKB +LINE_23,Station-46,2022-03-09 03:30:00,2022-03-09 03:57:00,Station-45,10083,7,4619991,CKB +LINE_23,Station-45,2022-03-09 04:04:00,2022-03-09 04:30:00,Station-46,9016,0,4619991,CKB +LINE_23,Station-46,2022-03-09 04:30:00,2022-03-09 04:57:00,Station-45,10083,0,4619991,CKB +LINE_23,Station-45,2022-03-09 04:57:00,2022-03-09 04:57:00,Station-0,0.06,0,4619991,CKB +LINE_24,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,4374744,CKB +LINE_24,Station-21,2022-03-09 00:31:00,2022-03-09 00:44:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 00:44:00,2022-03-09 00:56:00,Station-21,5362,5,4374744,CKB +LINE_24,Station-21,2022-03-09 01:01:00,2022-03-09 01:14:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 01:14:00,2022-03-09 01:26:00,Station-21,5362,5,4374744,CKB +LINE_24,Station-21,2022-03-09 01:31:00,2022-03-09 01:44:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 01:44:00,2022-03-09 01:56:00,Station-21,5362,5,4374744,CKB +LINE_24,Station-21,2022-03-09 02:01:00,2022-03-09 02:14:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 02:14:00,2022-03-09 02:26:00,Station-21,5362,5,4374744,CKB +LINE_24,Station-21,2022-03-09 02:31:00,2022-03-09 02:44:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 02:44:00,2022-03-09 02:56:00,Station-21,5362,5,4374744,CKB +LINE_24,Station-21,2022-03-09 03:01:00,2022-03-09 03:14:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 03:14:00,2022-03-09 03:26:00,Station-21,5362,5,4374744,CKB +LINE_24,Station-21,2022-03-09 03:31:00,2022-03-09 03:44:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 03:44:00,2022-03-09 03:56:00,Station-21,5362,5,4374744,CKB +LINE_24,Station-21,2022-03-09 04:01:00,2022-03-09 04:14:00,Station-47,4872,0,4374744,CKB +LINE_24,Station-47,2022-03-09 04:14:00,2022-03-09 04:26:00,Station-21,5362,0,4374744,CKB +LINE_24,Station-21,2022-03-09 04:26:00,2022-03-09 04:26:00,Station-0,0.06,0,4374744,CKB +LINE_25,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,4374866,CKB +LINE_25,Station-21,2022-03-09 00:31:00,2022-03-09 00:45:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 00:47:00,2022-03-09 01:01:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 01:01:00,2022-03-09 01:15:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 01:17:00,2022-03-09 01:31:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 01:31:00,2022-03-09 01:45:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 01:47:00,2022-03-09 02:01:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 02:01:00,2022-03-09 02:15:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 02:17:00,2022-03-09 02:31:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 02:31:00,2022-03-09 02:45:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 02:47:00,2022-03-09 03:01:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 03:01:00,2022-03-09 03:15:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 03:17:00,2022-03-09 03:31:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 03:31:00,2022-03-09 03:45:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 03:47:00,2022-03-09 04:01:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 04:01:00,2022-03-09 04:15:00,Station-48,5225,2,4374866,CKB +LINE_25,Station-48,2022-03-09 04:17:00,2022-03-09 04:31:00,Station-21,7617,0,4374866,CKB +LINE_25,Station-21,2022-03-09 04:31:00,2022-03-09 04:31:00,Station-0,0.06,0,4374866,CKB +LINE_26,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-49,0.06,0,4375013,CKB +LINE_26,Station-49,2022-03-09 00:43:00,2022-03-09 00:53:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 00:53:00,2022-03-09 01:03:00,Station-49,4408,10,4375013,CKB +LINE_26,Station-49,2022-03-09 01:13:00,2022-03-09 01:23:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 01:23:00,2022-03-09 01:33:00,Station-49,4408,10,4375013,CKB +LINE_26,Station-49,2022-03-09 01:43:00,2022-03-09 01:53:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 01:53:00,2022-03-09 02:03:00,Station-49,4408,10,4375013,CKB +LINE_26,Station-49,2022-03-09 02:13:00,2022-03-09 02:23:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 02:23:00,2022-03-09 02:33:00,Station-49,4408,10,4375013,CKB +LINE_26,Station-49,2022-03-09 02:43:00,2022-03-09 02:53:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 02:53:00,2022-03-09 03:03:00,Station-49,4408,10,4375013,CKB +LINE_26,Station-49,2022-03-09 03:13:00,2022-03-09 03:23:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 03:23:00,2022-03-09 03:33:00,Station-49,4408,10,4375013,CKB +LINE_26,Station-49,2022-03-09 03:43:00,2022-03-09 03:53:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 03:53:00,2022-03-09 04:03:00,Station-49,4408,10,4375013,CKB +LINE_26,Station-49,2022-03-09 04:13:00,2022-03-09 04:23:00,Station-50,4507,0,4375013,CKB +LINE_26,Station-50,2022-03-09 04:23:00,2022-03-09 04:33:00,Station-49,4408,0,4375013,CKB +LINE_26,Station-49,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,4375013,CKB +LINE_0,Station-0,2022-03-09 21:31:00,2022-03-09 21:31:00,Station-1,0.06,0,4454945,CKB +LINE_0,Station-1,2022-03-09 21:31:00,2022-03-09 22:04:00,Station-2,14519,4,4454945,CKB +LINE_0,Station-2,2022-03-09 22:08:00,2022-03-09 22:43:00,Station-1,13541,8,4454945,CKB +LINE_0,Station-1,2022-03-09 22:51:00,2022-03-09 23:24:00,Station-2,14519,4,4454945,CKB +LINE_0,Station-2,2022-03-09 23:28:00,2022-03-10 00:03:00,Station-1,13541,8,4454945,CKB +LINE_0,Station-1,2022-03-10 00:11:00,2022-03-10 00:44:00,Station-2,14519,0,4454945,CKB +LINE_1,Station-2,2022-03-10 00:44:00,2022-03-10 00:54:00,Station-3,4.1,25,4454945,CKB +LINE_1,Station-3,2022-03-10 01:19:00,2022-03-10 01:42:00,Station-4,8.36,6,4454945,CKB +LINE_1,Station-4,2022-03-10 01:48:00,2022-03-10 02:06:00,Station-3,9067,13,4454945,CKB +LINE_1,Station-3,2022-03-10 02:19:00,2022-03-10 02:42:00,Station-4,8.36,6,4454945,CKB +LINE_1,Station-4,2022-03-10 02:48:00,2022-03-10 03:06:00,Station-3,9067,13,4454945,CKB +LINE_1,Station-3,2022-03-10 03:19:00,2022-03-10 03:42:00,Station-4,8.36,6,4454945,CKB +LINE_1,Station-4,2022-03-10 03:48:00,2022-03-10 04:06:00,Station-3,9067,0,4454945,CKB +LINE_1,Station-3,2022-03-10 04:06:00,2022-03-10 04:06:00,Station-0,0.06,0,4454945,CKB +LINE_0,Station-0,2022-03-09 22:11:00,2022-03-09 22:11:00,Station-1,0.06,0,4454950,CKB +LINE_0,Station-1,2022-03-09 22:11:00,2022-03-09 22:44:00,Station-2,14519,4,4454950,CKB +LINE_0,Station-2,2022-03-09 22:48:00,2022-03-09 23:23:00,Station-1,13541,8,4454950,CKB +LINE_0,Station-1,2022-03-09 23:31:00,2022-03-10 00:04:00,Station-2,14519,4,4454950,CKB +LINE_0,Station-2,2022-03-10 00:08:00,2022-03-10 00:39:00,Station-5,12213,0,4454950,CKB +LINE_1,Station-5,2022-03-10 00:39:00,2022-03-10 00:47:00,Station-3,4.0,2,4454950,CKB +LINE_1,Station-3,2022-03-10 00:49:00,2022-03-10 01:12:00,Station-4,8.36,6,4454950,CKB +LINE_1,Station-4,2022-03-10 01:18:00,2022-03-10 01:36:00,Station-3,9067,13,4454950,CKB +LINE_1,Station-3,2022-03-10 01:49:00,2022-03-10 02:12:00,Station-4,8.36,6,4454950,CKB +LINE_1,Station-4,2022-03-10 02:18:00,2022-03-10 02:36:00,Station-3,9067,13,4454950,CKB +LINE_1,Station-3,2022-03-10 02:49:00,2022-03-10 03:12:00,Station-4,8.36,6,4454950,CKB +LINE_1,Station-4,2022-03-10 03:18:00,2022-03-10 03:36:00,Station-3,9067,13,4454950,CKB +LINE_1,Station-3,2022-03-10 03:49:00,2022-03-10 04:12:00,Station-4,8.36,0,4454950,CKB +LINE_1,Station-4,2022-03-10 04:12:00,2022-03-10 04:12:00,Station-0,0.06,0,4454950,CKB +LINE_2,Station-0,2022-03-09 21:06:00,2022-03-09 21:06:00,Station-6,0.06,0,4664624,CKB +LINE_2,Station-6,2022-03-09 21:06:00,2022-03-09 21:34:00,Station-7,13018,19,4664624,CKB +LINE_2,Station-7,2022-03-09 21:53:00,2022-03-09 22:13:00,Station-8,10332,17,4664624,CKB +LINE_2,Station-8,2022-03-09 22:30:00,2022-03-09 22:54:00,Station-7,10.48,19,4664624,CKB +LINE_2,Station-7,2022-03-09 23:13:00,2022-03-09 23:33:00,Station-8,10332,17,4664624,CKB +LINE_2,Station-8,2022-03-09 23:50:00,2022-03-10 00:14:00,Station-7,10.48,2,4664624,CKB +LINE_2,Station-7,2022-03-10 00:16:00,2022-03-10 00:23:00,Station-9,3709,5,4664624,CKB +LINE_3,Station-9,2022-03-10 00:28:00,2022-03-10 00:44:00,Station-10,6404,3,4664624,CKB +LINE_3,Station-10,2022-03-10 00:47:00,2022-03-10 01:10:00,Station-11,10579,7,4664624,CKB +LINE_3,Station-11,2022-03-10 01:17:00,2022-03-10 01:44:00,Station-10,12007,3,4664624,CKB +LINE_3,Station-10,2022-03-10 01:47:00,2022-03-10 02:10:00,Station-11,10579,7,4664624,CKB +LINE_3,Station-11,2022-03-10 02:17:00,2022-03-10 02:44:00,Station-10,12007,3,4664624,CKB +LINE_3,Station-10,2022-03-10 02:47:00,2022-03-10 03:10:00,Station-11,10579,7,4664624,CKB +LINE_3,Station-11,2022-03-10 03:17:00,2022-03-10 03:44:00,Station-10,12007,3,4664624,CKB +LINE_3,Station-10,2022-03-10 03:47:00,2022-03-10 04:10:00,Station-11,10579,7,4664624,CKB +LINE_3,Station-11,2022-03-10 04:17:00,2022-03-10 04:44:00,Station-10,12007,0,4664624,CKB +LINE_3,Station-10,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,4664624,CKB +LINE_2,Station-0,2022-03-09 20:26:00,2022-03-09 20:26:00,Station-6,0.06,0,4762734,CKB +LINE_2,Station-6,2022-03-09 20:26:00,2022-03-09 20:56:00,Station-12,14097,14,4762734,CKB +LINE_2,Station-12,2022-03-09 21:10:00,2022-03-09 21:38:00,Station-6,13.19,8,4762734,CKB +LINE_2,Station-6,2022-03-09 21:46:00,2022-03-09 22:14:00,Station-7,13018,19,4762734,CKB +LINE_2,Station-7,2022-03-09 22:33:00,2022-03-09 22:53:00,Station-8,10332,17,4762734,CKB +LINE_2,Station-8,2022-03-09 23:10:00,2022-03-09 23:34:00,Station-7,10.48,19,4762734,CKB +LINE_2,Station-7,2022-03-09 23:53:00,2022-03-10 00:13:00,Station-8,10332,2,4762734,CKB +LINE_2,Station-8,2022-03-10 00:15:00,2022-03-10 00:16:00,Station-10,506,1,4762734,CKB +LINE_3,Station-10,2022-03-10 00:17:00,2022-03-10 00:40:00,Station-11,10579,7,4762734,CKB +LINE_3,Station-11,2022-03-10 00:47:00,2022-03-10 01:14:00,Station-10,12007,3,4762734,CKB +LINE_3,Station-10,2022-03-10 01:17:00,2022-03-10 01:40:00,Station-11,10579,7,4762734,CKB +LINE_3,Station-11,2022-03-10 01:47:00,2022-03-10 02:14:00,Station-10,12007,3,4762734,CKB +LINE_3,Station-10,2022-03-10 02:17:00,2022-03-10 02:40:00,Station-11,10579,7,4762734,CKB +LINE_3,Station-11,2022-03-10 02:47:00,2022-03-10 03:14:00,Station-10,12007,3,4762734,CKB +LINE_3,Station-10,2022-03-10 03:17:00,2022-03-10 03:40:00,Station-11,10579,7,4762734,CKB +LINE_3,Station-11,2022-03-10 03:47:00,2022-03-10 04:14:00,Station-10,12007,3,4762734,CKB +LINE_3,Station-10,2022-03-10 04:17:00,2022-03-10 04:40:00,Station-11,10579,3,4762734,CKB +LINE_4,Station-11,2022-03-10 04:43:00,2022-03-10 04:58:00,Station-13,6161,0,4762734,CKB +LINE_4,Station-13,2022-03-10 04:58:00,2022-03-10 04:58:00,Station-0,0.06,0,4762734,CKB +LINE_5,Station-0,2022-03-09 22:56:00,2022-03-09 22:56:00,Station-14,0.06,0,4617415,CKB +LINE_5,Station-14,2022-03-09 22:56:00,2022-03-09 23:08:00,Station-15,5882,3,4617415,CKB +LINE_5,Station-15,2022-03-09 23:11:00,2022-03-09 23:25:00,Station-14,6232,0,4617415,CKB +LINE_5,Station-14,2022-03-09 23:25:00,2022-03-09 23:38:00,Station-15,6086,3,4617415,CKB +LINE_5,Station-15,2022-03-09 23:41:00,2022-03-09 23:55:00,Station-14,6232,0,4617415,CKB +LINE_5,Station-14,2022-03-09 23:55:00,2022-03-10 00:08:00,Station-15,6086,0,4617415,CKB +LINE_5,Station-15,2022-03-10 00:08:00,2022-03-10 00:08:00,Station-0,0.06,0,4617415,CKB +LINE_6,Station-0,2022-03-09 05:05:00,2022-03-09 05:05:00,Station-16,0.06,0,4426846,CKB +LINE_6,Station-16,2022-03-09 05:05:00,2022-03-09 05:14:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 05:14:00,2022-03-09 05:23:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 05:25:00,2022-03-09 05:34:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 05:34:00,2022-03-09 05:43:00,Station-16,5139,23,4426846,CKB +LINE_6,Station-16,2022-03-09 06:06:00,2022-03-09 06:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 06:15:00,2022-03-09 06:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 06:26:00,2022-03-09 06:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 06:35:00,2022-03-09 06:44:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 06:46:00,2022-03-09 06:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 06:55:00,2022-03-09 07:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 07:06:00,2022-03-09 07:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 07:15:00,2022-03-09 07:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 07:26:00,2022-03-09 07:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 07:35:00,2022-03-09 07:44:00,Station-16,5139,22,4426846,CKB +LINE_6,Station-16,2022-03-09 08:06:00,2022-03-09 08:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 08:15:00,2022-03-09 08:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 08:26:00,2022-03-09 08:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 08:35:00,2022-03-09 08:44:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 08:46:00,2022-03-09 08:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 08:55:00,2022-03-09 09:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 09:06:00,2022-03-09 09:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 09:15:00,2022-03-09 09:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 09:26:00,2022-03-09 09:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 09:35:00,2022-03-09 09:44:00,Station-16,5139,22,4426846,CKB +LINE_6,Station-16,2022-03-09 10:06:00,2022-03-09 10:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 10:15:00,2022-03-09 10:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 10:26:00,2022-03-09 10:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 10:35:00,2022-03-09 10:44:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 10:46:00,2022-03-09 10:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 10:55:00,2022-03-09 11:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 11:06:00,2022-03-09 11:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 11:15:00,2022-03-09 11:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 11:26:00,2022-03-09 11:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 11:35:00,2022-03-09 11:44:00,Station-16,5139,22,4426846,CKB +LINE_6,Station-16,2022-03-09 12:06:00,2022-03-09 12:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 12:15:00,2022-03-09 12:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 12:26:00,2022-03-09 12:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 12:35:00,2022-03-09 12:44:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 12:46:00,2022-03-09 12:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 12:55:00,2022-03-09 13:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 13:06:00,2022-03-09 13:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 13:15:00,2022-03-09 13:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 13:26:00,2022-03-09 13:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 13:35:00,2022-03-09 13:44:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 13:46:00,2022-03-09 13:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 13:55:00,2022-03-09 14:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 14:06:00,2022-03-09 14:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 14:15:00,2022-03-09 14:24:00,Station-16,5139,22,4426846,CKB +LINE_6,Station-16,2022-03-09 14:46:00,2022-03-09 14:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 14:55:00,2022-03-09 15:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 15:06:00,2022-03-09 15:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 15:15:00,2022-03-09 15:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 15:26:00,2022-03-09 15:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 15:35:00,2022-03-09 15:44:00,Station-16,5139,22,4426846,CKB +LINE_6,Station-16,2022-03-09 16:06:00,2022-03-09 16:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 16:15:00,2022-03-09 16:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 16:26:00,2022-03-09 16:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 16:35:00,2022-03-09 16:44:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 16:46:00,2022-03-09 16:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 16:55:00,2022-03-09 17:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 17:06:00,2022-03-09 17:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 17:15:00,2022-03-09 17:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 17:26:00,2022-03-09 17:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 17:35:00,2022-03-09 17:44:00,Station-16,5139,22,4426846,CKB +LINE_6,Station-16,2022-03-09 18:06:00,2022-03-09 18:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 18:15:00,2022-03-09 18:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 18:26:00,2022-03-09 18:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 18:35:00,2022-03-09 18:44:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 18:46:00,2022-03-09 18:55:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 18:55:00,2022-03-09 19:04:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 19:06:00,2022-03-09 19:15:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 19:15:00,2022-03-09 19:24:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 19:26:00,2022-03-09 19:35:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 19:35:00,2022-03-09 19:44:00,Station-16,5139,21,4426846,CKB +LINE_6,Station-16,2022-03-09 20:05:00,2022-03-09 20:14:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 20:14:00,2022-03-09 20:23:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 20:25:00,2022-03-09 20:34:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 20:34:00,2022-03-09 20:43:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 20:45:00,2022-03-09 20:54:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 20:54:00,2022-03-09 21:03:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 21:05:00,2022-03-09 21:14:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 21:14:00,2022-03-09 21:23:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 21:25:00,2022-03-09 21:34:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 21:34:00,2022-03-09 21:43:00,Station-16,5139,22,4426846,CKB +LINE_6,Station-16,2022-03-09 22:05:00,2022-03-09 22:14:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 22:14:00,2022-03-09 22:23:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 22:25:00,2022-03-09 22:34:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 22:34:00,2022-03-09 22:43:00,Station-16,5139,2,4426846,CKB +LINE_6,Station-16,2022-03-09 22:45:00,2022-03-09 22:54:00,Station-17,4781,0,4426846,CKB +LINE_6,Station-17,2022-03-09 22:54:00,2022-03-09 23:03:00,Station-16,5139,0,4426846,CKB +LINE_6,Station-16,2022-03-09 23:03:00,2022-03-09 23:03:00,Station-0,0.06,0,4426846,CKB +LINE_7,Station-0,2022-03-10 00:06:00,2022-03-10 00:06:00,Station-18,0.06,0,4708596,CKB +LINE_7,Station-18,2022-03-10 00:06:00,2022-03-10 00:27:00,Station-19,7827,0,4708596,CKB +LINE_8,Station-19,2022-03-10 00:27:00,2022-03-10 00:48:00,Station-20,11079,0,4708596,CKB +LINE_8,Station-20,2022-03-10 00:48:00,2022-03-10 01:25:00,Station-21,20641,8,4708596,CKB +LINE_8,Station-21,2022-03-10 01:33:00,2022-03-10 02:16:00,Station-20,20579,1,4708596,CKB +LINE_8,Station-20,2022-03-10 02:17:00,2022-03-10 02:55:00,Station-21,20641,8,4708596,CKB +LINE_8,Station-21,2022-03-10 03:03:00,2022-03-10 03:46:00,Station-20,20579,1,4708596,CKB +LINE_8,Station-20,2022-03-10 03:47:00,2022-03-10 04:25:00,Station-21,20641,0,4708596,CKB +LINE_8,Station-21,2022-03-10 04:25:00,2022-03-10 04:25:00,Station-0,0.06,0,4708596,CKB +LINE_9,Station-22,2022-03-09 05:15:00,2022-03-09 06:01:00,Station-23,17.9,0,4317626,VDL +LINE_9,Station-23,2022-03-09 06:01:00,2022-03-09 06:15:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 06:23:00,2022-03-09 06:37:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 06:41:00,2022-03-09 06:55:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 07:03:00,2022-03-09 07:17:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 07:21:00,2022-03-09 07:35:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 07:43:00,2022-03-09 07:57:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 08:01:00,2022-03-09 08:15:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 08:23:00,2022-03-09 08:37:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 08:41:00,2022-03-09 08:55:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 09:03:00,2022-03-09 09:17:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 09:21:00,2022-03-09 09:35:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 09:43:00,2022-03-09 09:57:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 10:01:00,2022-03-09 10:15:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 10:23:00,2022-03-09 10:37:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 10:41:00,2022-03-09 10:55:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 11:03:00,2022-03-09 11:17:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 11:21:00,2022-03-09 11:35:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 11:43:00,2022-03-09 11:57:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 12:01:00,2022-03-09 12:15:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 12:23:00,2022-03-09 12:37:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 12:41:00,2022-03-09 12:55:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 13:03:00,2022-03-09 13:17:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 13:21:00,2022-03-09 13:35:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 13:43:00,2022-03-09 13:57:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 14:01:00,2022-03-09 14:15:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 14:23:00,2022-03-09 14:37:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 14:41:00,2022-03-09 14:55:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 15:03:00,2022-03-09 15:17:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 15:21:00,2022-03-09 15:35:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 15:43:00,2022-03-09 15:57:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 16:01:00,2022-03-09 16:15:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 16:23:00,2022-03-09 16:37:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 16:41:00,2022-03-09 16:55:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 17:03:00,2022-03-09 17:17:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 17:21:00,2022-03-09 17:35:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 17:43:00,2022-03-09 17:57:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 18:01:00,2022-03-09 18:15:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 18:23:00,2022-03-09 18:37:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 18:41:00,2022-03-09 18:55:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 19:03:00,2022-03-09 19:17:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 19:21:00,2022-03-09 19:35:00,Station-23,4637,8,4317626,VDL +LINE_9,Station-23,2022-03-09 19:43:00,2022-03-09 19:57:00,Station-23,4637,4,4317626,VDL +LINE_9,Station-23,2022-03-09 20:01:00,2022-03-09 20:14:00,Station-23,4637,9,4317626,VDL +LINE_9,Station-23,2022-03-09 20:23:00,2022-03-09 20:36:00,Station-23,4637,0,4317626,VDL +LINE_9,Station-23,2022-03-09 20:36:00,2022-03-09 21:15:00,Station-22,19.8,0,4317626,VDL +LINE_10,Station-0,2022-03-09 04:56:00,2022-03-09 04:56:00,Station-24,0.06,18,4425669,CKB +LINE_10,Station-24,2022-03-09 05:14:00,2022-03-09 05:20:00,Station-25,3.29,0,4425669,CKB +LINE_10,Station-25,2022-03-09 05:20:00,2022-03-09 05:24:00,Station-24,2954,20,4425669,CKB +LINE_10,Station-24,2022-03-09 05:44:00,2022-03-09 05:50:00,Station-25,3.29,0,4425669,CKB +LINE_10,Station-25,2022-03-09 05:50:00,2022-03-09 05:54:00,Station-24,2954,5,4425669,CKB +LINE_10,Station-24,2022-03-09 05:59:00,2022-03-09 06:06:00,Station-25,3.29,2,4425669,CKB +LINE_10,Station-25,2022-03-09 06:08:00,2022-03-09 06:13:00,Station-24,2954,19,4425669,CKB +LINE_10,Station-24,2022-03-09 06:32:00,2022-03-09 06:39:00,Station-25,3.29,1,4425669,CKB +LINE_10,Station-25,2022-03-09 06:40:00,2022-03-09 06:45:00,Station-24,2954,7,4425669,CKB +LINE_10,Station-24,2022-03-09 06:52:00,2022-03-09 06:59:00,Station-25,3.29,1,4425669,CKB +LINE_10,Station-25,2022-03-09 07:00:00,2022-03-09 07:05:00,Station-24,2954,7,4425669,CKB +LINE_10,Station-24,2022-03-09 07:12:00,2022-03-09 07:19:00,Station-25,3.29,1,4425669,CKB +LINE_10,Station-25,2022-03-09 07:20:00,2022-03-09 07:25:00,Station-24,2954,7,4425669,CKB +LINE_10,Station-24,2022-03-09 07:32:00,2022-03-09 07:39:00,Station-25,3.29,1,4425669,CKB +LINE_10,Station-25,2022-03-09 07:40:00,2022-03-09 07:45:00,Station-24,2954,295,4425669,CKB +LINE_10,Station-24,2022-03-09 12:40:00,2022-03-09 12:47:00,Station-25,3.29,2,4425669,CKB +LINE_10,Station-25,2022-03-09 12:49:00,2022-03-09 12:54:00,Station-24,2954,46,4425669,CKB +LINE_10,Station-24,2022-03-09 13:40:00,2022-03-09 13:47:00,Station-25,3.29,2,4425669,CKB +LINE_10,Station-25,2022-03-09 13:49:00,2022-03-09 13:54:00,Station-24,2954,434,4425669,CKB +LINE_10,Station-24,2022-03-09 21:08:00,2022-03-09 21:08:00,Station-0,0.06,0,4425669,CKB +LINE_11,Station-0,2022-03-09 07:20:00,2022-03-09 07:20:00,Station-26,0.06,0,4448151,CKB +LINE_11,Station-26,2022-03-09 07:20:00,2022-03-09 07:50:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 08:00:00,2022-03-09 08:30:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 08:40:00,2022-03-09 09:10:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 09:20:00,2022-03-09 09:50:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 10:00:00,2022-03-09 10:30:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 10:40:00,2022-03-09 11:10:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 11:20:00,2022-03-09 11:50:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 12:00:00,2022-03-09 12:30:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 12:40:00,2022-03-09 13:10:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 13:20:00,2022-03-09 13:50:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 14:00:00,2022-03-09 14:30:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 14:40:00,2022-03-09 15:10:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 15:20:00,2022-03-09 15:50:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 16:00:00,2022-03-09 16:30:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 16:40:00,2022-03-09 17:10:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 17:20:00,2022-03-09 17:50:00,Station-26,9266,10,4448151,CKB +LINE_11,Station-26,2022-03-09 18:00:00,2022-03-09 18:30:00,Station-26,9266,0,4448151,CKB +LINE_11,Station-26,2022-03-09 18:30:00,2022-03-09 18:30:00,Station-0,0.06,0,4448151,CKB +LINE_12,Station-0,2022-03-09 07:10:00,2022-03-09 07:10:00,Station-27,0.06,0,4733896,CKB +LINE_12,Station-27,2022-03-09 07:10:00,2022-03-09 07:18:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 07:28:00,2022-03-09 07:40:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 07:40:00,2022-03-09 07:48:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 07:58:00,2022-03-09 08:10:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 08:10:00,2022-03-09 08:18:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 08:28:00,2022-03-09 08:40:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 08:40:00,2022-03-09 08:48:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 08:58:00,2022-03-09 09:10:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 09:10:00,2022-03-09 09:18:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 09:28:00,2022-03-09 09:40:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 09:40:00,2022-03-09 09:48:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 09:58:00,2022-03-09 10:10:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 10:10:00,2022-03-09 10:18:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 10:28:00,2022-03-09 10:40:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 10:40:00,2022-03-09 10:48:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 10:58:00,2022-03-09 11:10:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 11:10:00,2022-03-09 11:18:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 11:28:00,2022-03-09 11:40:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 11:40:00,2022-03-09 11:48:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 11:58:00,2022-03-09 12:10:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 12:10:00,2022-03-09 12:18:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 12:28:00,2022-03-09 12:40:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 12:40:00,2022-03-09 12:48:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 12:58:00,2022-03-09 13:10:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 13:10:00,2022-03-09 13:18:00,Station-28,2169,10,4733896,CKB +LINE_12,Station-28,2022-03-09 13:28:00,2022-03-09 13:40:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 13:40:00,2022-03-09 13:48:00,Station-28,2169,8,4733896,CKB +LINE_12,Station-28,2022-03-09 13:56:00,2022-03-09 14:10:00,Station-27,2952,0,4733896,CKB +LINE_12,Station-27,2022-03-09 14:10:00,2022-03-09 14:19:00,Station-28,2169,14,4733896,CKB +LINE_12,Station-28,2022-03-09 14:33:00,2022-03-09 14:47:00,Station-27,2952,3,4733896,CKB +LINE_12,Station-27,2022-03-09 14:50:00,2022-03-09 14:59:00,Station-28,2169,14,4733896,CKB +LINE_12,Station-28,2022-03-09 15:13:00,2022-03-09 15:27:00,Station-27,2952,3,4733896,CKB +LINE_12,Station-27,2022-03-09 15:30:00,2022-03-09 15:39:00,Station-28,2169,14,4733896,CKB +LINE_12,Station-28,2022-03-09 15:53:00,2022-03-09 16:07:00,Station-27,2952,3,4733896,CKB +LINE_12,Station-27,2022-03-09 16:10:00,2022-03-09 16:19:00,Station-28,2169,14,4733896,CKB +LINE_12,Station-28,2022-03-09 16:33:00,2022-03-09 16:47:00,Station-27,2952,3,4733896,CKB +LINE_12,Station-27,2022-03-09 16:50:00,2022-03-09 16:59:00,Station-28,2169,14,4733896,CKB +LINE_12,Station-28,2022-03-09 17:13:00,2022-03-09 17:27:00,Station-27,2952,3,4733896,CKB +LINE_12,Station-27,2022-03-09 17:30:00,2022-03-09 17:39:00,Station-28,2169,13,4733896,CKB +LINE_12,Station-28,2022-03-09 17:52:00,2022-03-09 18:05:00,Station-27,2952,5,4733896,CKB +LINE_12,Station-27,2022-03-09 18:10:00,2022-03-09 18:18:00,Station-28,2169,0,4733896,CKB +LINE_12,Station-28,2022-03-09 18:18:00,2022-03-09 18:18:00,Station-0,0.06,0,4733896,CKB +LINE_12,Station-0,2022-03-09 14:13:00,2022-03-09 14:13:00,Station-28,0.06,0,4734201,CKB +LINE_12,Station-28,2022-03-09 14:13:00,2022-03-09 14:27:00,Station-27,2952,3,4734201,CKB +LINE_12,Station-27,2022-03-09 14:30:00,2022-03-09 14:39:00,Station-28,2169,14,4734201,CKB +LINE_12,Station-28,2022-03-09 14:53:00,2022-03-09 15:07:00,Station-27,2952,3,4734201,CKB +LINE_12,Station-27,2022-03-09 15:10:00,2022-03-09 15:19:00,Station-28,2169,14,4734201,CKB +LINE_12,Station-28,2022-03-09 15:33:00,2022-03-09 15:47:00,Station-27,2952,3,4734201,CKB +LINE_12,Station-27,2022-03-09 15:50:00,2022-03-09 15:59:00,Station-28,2169,14,4734201,CKB +LINE_12,Station-28,2022-03-09 16:13:00,2022-03-09 16:27:00,Station-27,2952,3,4734201,CKB +LINE_12,Station-27,2022-03-09 16:30:00,2022-03-09 16:39:00,Station-28,2169,14,4734201,CKB +LINE_12,Station-28,2022-03-09 16:53:00,2022-03-09 17:07:00,Station-27,2952,3,4734201,CKB +LINE_12,Station-27,2022-03-09 17:10:00,2022-03-09 17:19:00,Station-28,2169,14,4734201,CKB +LINE_12,Station-28,2022-03-09 17:33:00,2022-03-09 17:47:00,Station-27,2952,3,4734201,CKB +LINE_12,Station-27,2022-03-09 17:50:00,2022-03-09 17:59:00,Station-28,2169,14,4734201,CKB +LINE_12,Station-28,2022-03-09 18:13:00,2022-03-09 18:25:00,Station-27,2952,0,4734201,CKB +LINE_12,Station-27,2022-03-09 18:25:00,2022-03-09 18:25:00,Station-0,0.06,0,4734201,CKB +LINE_13,Station-0,2022-03-10 00:23:00,2022-03-10 00:23:00,Station-29,0.06,0,4318158,CKB +LINE_13,Station-29,2022-03-10 00:23:00,2022-03-10 00:30:00,Station-30,2577,9,4318158,CKB +LINE_14,Station-30,2022-03-10 00:39:00,2022-03-10 00:54:00,Station-31,5937,9,4318158,CKB +LINE_14,Station-31,2022-03-10 01:03:00,2022-03-10 01:17:00,Station-30,6.19,0,4318158,CKB +LINE_13,Station-30,2022-03-10 01:17:00,2022-03-10 01:23:00,Station-29,2555,0,4318158,CKB +LINE_13,Station-29,2022-03-10 01:23:00,2022-03-10 01:30:00,Station-30,2577,9,4318158,CKB +LINE_14,Station-30,2022-03-10 01:39:00,2022-03-10 01:54:00,Station-31,5937,9,4318158,CKB +LINE_14,Station-31,2022-03-10 02:03:00,2022-03-10 02:17:00,Station-30,6.19,0,4318158,CKB +LINE_13,Station-30,2022-03-10 02:17:00,2022-03-10 02:23:00,Station-29,2555,0,4318158,CKB +LINE_13,Station-29,2022-03-10 02:23:00,2022-03-10 02:30:00,Station-30,2577,9,4318158,CKB +LINE_14,Station-30,2022-03-10 02:39:00,2022-03-10 02:54:00,Station-31,5937,9,4318158,CKB +LINE_14,Station-31,2022-03-10 03:03:00,2022-03-10 03:17:00,Station-30,6.19,0,4318158,CKB +LINE_13,Station-30,2022-03-10 03:17:00,2022-03-10 03:23:00,Station-29,2555,0,4318158,CKB +LINE_13,Station-29,2022-03-10 03:23:00,2022-03-10 03:30:00,Station-30,2577,9,4318158,CKB +LINE_14,Station-30,2022-03-10 03:39:00,2022-03-10 03:54:00,Station-31,5937,9,4318158,CKB +LINE_14,Station-31,2022-03-10 04:03:00,2022-03-10 04:17:00,Station-30,6.19,0,4318158,CKB +LINE_13,Station-30,2022-03-10 04:17:00,2022-03-10 04:23:00,Station-29,2555,0,4318158,CKB +LINE_13,Station-29,2022-03-10 04:23:00,2022-03-10 04:23:00,Station-0,0.06,0,4318158,CKB +LINE_14,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-31,0.06,0,4318178,CKB +LINE_14,Station-31,2022-03-10 00:33:00,2022-03-10 00:47:00,Station-30,6.19,0,4318178,CKB +LINE_13,Station-30,2022-03-10 00:47:00,2022-03-10 00:53:00,Station-29,2555,0,4318178,CKB +LINE_13,Station-29,2022-03-10 00:53:00,2022-03-10 01:00:00,Station-30,2577,9,4318178,CKB +LINE_14,Station-30,2022-03-10 01:09:00,2022-03-10 01:24:00,Station-31,5937,9,4318178,CKB +LINE_14,Station-31,2022-03-10 01:33:00,2022-03-10 01:47:00,Station-30,6.19,0,4318178,CKB +LINE_13,Station-30,2022-03-10 01:47:00,2022-03-10 01:53:00,Station-29,2555,0,4318178,CKB +LINE_13,Station-29,2022-03-10 01:53:00,2022-03-10 02:00:00,Station-30,2577,9,4318178,CKB +LINE_14,Station-30,2022-03-10 02:09:00,2022-03-10 02:24:00,Station-31,5937,9,4318178,CKB +LINE_14,Station-31,2022-03-10 02:33:00,2022-03-10 02:47:00,Station-30,6.19,0,4318178,CKB +LINE_13,Station-30,2022-03-10 02:47:00,2022-03-10 02:53:00,Station-29,2555,0,4318178,CKB +LINE_13,Station-29,2022-03-10 02:53:00,2022-03-10 03:00:00,Station-30,2577,9,4318178,CKB +LINE_14,Station-30,2022-03-10 03:09:00,2022-03-10 03:24:00,Station-31,5937,9,4318178,CKB +LINE_14,Station-31,2022-03-10 03:33:00,2022-03-10 03:47:00,Station-30,6.19,0,4318178,CKB +LINE_13,Station-30,2022-03-10 03:47:00,2022-03-10 03:53:00,Station-29,2555,0,4318178,CKB +LINE_13,Station-29,2022-03-10 03:53:00,2022-03-10 04:00:00,Station-30,2577,9,4318178,CKB +LINE_14,Station-30,2022-03-10 04:09:00,2022-03-10 04:24:00,Station-31,5937,0,4318178,CKB +LINE_14,Station-31,2022-03-10 04:24:00,2022-03-10 04:24:00,Station-0,0.06,0,4318178,CKB +LINE_15,Station-0,2022-03-10 00:57:00,2022-03-10 00:57:00,Station-32,0.06,0,4319353,CKB +LINE_15,Station-32,2022-03-10 00:57:00,2022-03-10 01:06:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 01:06:00,2022-03-10 01:11:00,Station-32,2936,16,4319353,CKB +LINE_15,Station-32,2022-03-10 01:27:00,2022-03-10 01:36:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 01:36:00,2022-03-10 01:41:00,Station-32,2936,16,4319353,CKB +LINE_15,Station-32,2022-03-10 01:57:00,2022-03-10 02:06:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 02:06:00,2022-03-10 02:11:00,Station-32,2936,16,4319353,CKB +LINE_15,Station-32,2022-03-10 02:27:00,2022-03-10 02:36:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 02:36:00,2022-03-10 02:41:00,Station-32,2936,16,4319353,CKB +LINE_15,Station-32,2022-03-10 02:57:00,2022-03-10 03:06:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 03:06:00,2022-03-10 03:11:00,Station-32,2936,16,4319353,CKB +LINE_15,Station-32,2022-03-10 03:27:00,2022-03-10 03:36:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 03:36:00,2022-03-10 03:41:00,Station-32,2936,16,4319353,CKB +LINE_15,Station-32,2022-03-10 03:57:00,2022-03-10 04:06:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 04:06:00,2022-03-10 04:11:00,Station-32,2936,16,4319353,CKB +LINE_15,Station-32,2022-03-10 04:27:00,2022-03-10 04:36:00,Station-33,4343,0,4319353,CKB +LINE_15,Station-33,2022-03-10 04:36:00,2022-03-10 04:36:00,Station-0,0.06,0,4319353,CKB +LINE_16,Station-0,2022-03-10 00:29:00,2022-03-10 00:29:00,Station-34,0.06,0,4751088,CKB +LINE_16,Station-34,2022-03-10 00:29:00,2022-03-10 00:41:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 00:47:00,2022-03-10 00:57:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 00:59:00,2022-03-10 01:11:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 01:17:00,2022-03-10 01:27:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 01:29:00,2022-03-10 01:41:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 01:47:00,2022-03-10 01:57:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 01:59:00,2022-03-10 02:11:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 02:17:00,2022-03-10 02:27:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 02:29:00,2022-03-10 02:41:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 02:47:00,2022-03-10 02:57:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 02:59:00,2022-03-10 03:11:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 03:17:00,2022-03-10 03:27:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 03:29:00,2022-03-10 03:41:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 03:47:00,2022-03-10 03:57:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 03:59:00,2022-03-10 04:11:00,Station-35,4481,6,4751088,CKB +LINE_16,Station-35,2022-03-10 04:17:00,2022-03-10 04:27:00,Station-34,4031,2,4751088,CKB +LINE_16,Station-34,2022-03-10 04:29:00,2022-03-10 04:41:00,Station-35,4481,0,4751088,CKB +LINE_16,Station-35,2022-03-10 04:41:00,2022-03-10 04:41:00,Station-0,0.06,0,4751088,CKB +LINE_17,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-34,0.06,0,4453546,CKB +LINE_17,Station-34,2022-03-10 00:30:00,2022-03-10 00:44:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 00:44:00,2022-03-10 00:57:00,Station-34,5302,3,4453546,CKB +LINE_17,Station-34,2022-03-10 01:00:00,2022-03-10 01:14:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 01:14:00,2022-03-10 01:27:00,Station-34,5302,3,4453546,CKB +LINE_17,Station-34,2022-03-10 01:30:00,2022-03-10 01:44:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 01:44:00,2022-03-10 01:57:00,Station-34,5302,3,4453546,CKB +LINE_17,Station-34,2022-03-10 02:00:00,2022-03-10 02:14:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 02:14:00,2022-03-10 02:27:00,Station-34,5302,3,4453546,CKB +LINE_17,Station-34,2022-03-10 02:30:00,2022-03-10 02:44:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 02:44:00,2022-03-10 02:57:00,Station-34,5302,3,4453546,CKB +LINE_17,Station-34,2022-03-10 03:00:00,2022-03-10 03:14:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 03:14:00,2022-03-10 03:27:00,Station-34,5302,3,4453546,CKB +LINE_17,Station-34,2022-03-10 03:30:00,2022-03-10 03:44:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 03:44:00,2022-03-10 03:57:00,Station-34,5302,3,4453546,CKB +LINE_17,Station-34,2022-03-10 04:00:00,2022-03-10 04:14:00,Station-36,4801,0,4453546,CKB +LINE_17,Station-36,2022-03-10 04:14:00,2022-03-10 04:27:00,Station-34,5302,0,4453546,CKB +LINE_17,Station-34,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,4453546,CKB +LINE_18,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-37,0.06,0,4374468,CKB +LINE_18,Station-37,2022-03-10 00:43:00,2022-03-10 01:33:00,Station-37,20434,10,4374468,CKB +LINE_18,Station-37,2022-03-10 01:43:00,2022-03-10 02:33:00,Station-37,20434,10,4374468,CKB +LINE_18,Station-37,2022-03-10 02:43:00,2022-03-10 03:33:00,Station-37,20434,10,4374468,CKB +LINE_18,Station-37,2022-03-10 03:43:00,2022-03-10 04:33:00,Station-37,20434,0,4374468,CKB +LINE_18,Station-37,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,4374468,CKB +LINE_18,Station-0,2022-03-10 00:13:00,2022-03-10 00:13:00,Station-37,0.06,0,4374473,CKB +LINE_18,Station-37,2022-03-10 00:13:00,2022-03-10 01:03:00,Station-37,20434,10,4374473,CKB +LINE_18,Station-37,2022-03-10 01:13:00,2022-03-10 02:03:00,Station-37,20434,10,4374473,CKB +LINE_18,Station-37,2022-03-10 02:13:00,2022-03-10 03:03:00,Station-37,20434,10,4374473,CKB +LINE_18,Station-37,2022-03-10 03:13:00,2022-03-10 04:03:00,Station-37,20434,0,4374473,CKB +LINE_18,Station-37,2022-03-10 04:03:00,2022-03-10 04:03:00,Station-0,0.06,0,4374473,CKB +LINE_19,Station-0,2022-03-10 00:24:00,2022-03-10 00:24:00,Station-38,0.06,0,4456449,CKB +LINE_19,Station-38,2022-03-10 00:24:00,2022-03-10 00:48:00,Station-39,11.86,4,4456449,CKB +LINE_19,Station-39,2022-03-10 00:52:00,2022-03-10 01:14:00,Station-38,11139,10,4456449,CKB +LINE_19,Station-38,2022-03-10 01:24:00,2022-03-10 01:48:00,Station-39,11.86,4,4456449,CKB +LINE_19,Station-39,2022-03-10 01:52:00,2022-03-10 02:14:00,Station-38,11139,10,4456449,CKB +LINE_19,Station-38,2022-03-10 02:24:00,2022-03-10 02:48:00,Station-39,11.86,4,4456449,CKB +LINE_19,Station-39,2022-03-10 02:52:00,2022-03-10 03:14:00,Station-38,11139,10,4456449,CKB +LINE_19,Station-38,2022-03-10 03:24:00,2022-03-10 03:48:00,Station-39,11.86,4,4456449,CKB +LINE_19,Station-39,2022-03-10 03:52:00,2022-03-10 04:14:00,Station-38,11139,0,4456449,CKB +LINE_19,Station-38,2022-03-10 04:14:00,2022-03-10 04:14:00,Station-0,0.06,0,4456449,CKB +LINE_19,Station-0,2022-03-10 00:22:00,2022-03-10 00:22:00,Station-39,0.06,0,4456457,CKB +LINE_19,Station-39,2022-03-10 00:22:00,2022-03-10 00:44:00,Station-38,11139,10,4456457,CKB +LINE_19,Station-38,2022-03-10 00:54:00,2022-03-10 01:18:00,Station-39,11.86,4,4456457,CKB +LINE_19,Station-39,2022-03-10 01:22:00,2022-03-10 01:44:00,Station-38,11139,10,4456457,CKB +LINE_19,Station-38,2022-03-10 01:54:00,2022-03-10 02:18:00,Station-39,11.86,4,4456457,CKB +LINE_19,Station-39,2022-03-10 02:22:00,2022-03-10 02:44:00,Station-38,11139,10,4456457,CKB +LINE_19,Station-38,2022-03-10 02:54:00,2022-03-10 03:18:00,Station-39,11.86,4,4456457,CKB +LINE_19,Station-39,2022-03-10 03:22:00,2022-03-10 03:44:00,Station-38,11139,10,4456457,CKB +LINE_19,Station-38,2022-03-10 03:54:00,2022-03-10 04:18:00,Station-39,11.86,4,4456457,CKB +LINE_19,Station-39,2022-03-10 04:22:00,2022-03-10 04:44:00,Station-38,11139,0,4456457,CKB +LINE_19,Station-38,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,4456457,CKB +LINE_20,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,4747651,CKB +LINE_20,Station-13,2022-03-10 00:32:00,2022-03-10 00:44:00,Station-40,4212,3,4747651,CKB +LINE_20,Station-40,2022-03-10 00:47:00,2022-03-10 01:16:00,Station-41,13048,0,4747651,CKB +LINE_20,Station-41,2022-03-10 01:16:00,2022-03-10 01:42:00,Station-40,12869,5,4747651,CKB +LINE_20,Station-40,2022-03-10 01:47:00,2022-03-10 02:16:00,Station-41,13048,0,4747651,CKB +LINE_20,Station-41,2022-03-10 02:16:00,2022-03-10 02:42:00,Station-40,12869,5,4747651,CKB +LINE_20,Station-40,2022-03-10 02:47:00,2022-03-10 03:16:00,Station-41,13048,0,4747651,CKB +LINE_20,Station-41,2022-03-10 03:16:00,2022-03-10 03:42:00,Station-40,12869,5,4747651,CKB +LINE_20,Station-40,2022-03-10 03:47:00,2022-03-10 04:16:00,Station-41,13048,0,4747651,CKB +LINE_20,Station-41,2022-03-10 04:16:00,2022-03-10 04:34:00,Station-42,9538,0,4747651,CKB +LINE_20,Station-42,2022-03-10 04:34:00,2022-03-10 04:34:00,Station-0,0.06,0,4747651,CKB +LINE_20,Station-0,2022-03-10 00:17:00,2022-03-10 00:17:00,Station-40,0.06,0,4747661,CKB +LINE_20,Station-40,2022-03-10 00:17:00,2022-03-10 00:46:00,Station-41,13048,0,4747661,CKB +LINE_20,Station-41,2022-03-10 00:46:00,2022-03-10 01:12:00,Station-40,12869,5,4747661,CKB +LINE_20,Station-40,2022-03-10 01:17:00,2022-03-10 01:46:00,Station-41,13048,0,4747661,CKB +LINE_20,Station-41,2022-03-10 01:46:00,2022-03-10 02:12:00,Station-40,12869,5,4747661,CKB +LINE_20,Station-40,2022-03-10 02:17:00,2022-03-10 02:46:00,Station-41,13048,0,4747661,CKB +LINE_20,Station-41,2022-03-10 02:46:00,2022-03-10 03:12:00,Station-40,12869,5,4747661,CKB +LINE_20,Station-40,2022-03-10 03:17:00,2022-03-10 03:46:00,Station-41,13048,0,4747661,CKB +LINE_20,Station-41,2022-03-10 03:46:00,2022-03-10 04:12:00,Station-40,12869,5,4747661,CKB +LINE_20,Station-40,2022-03-10 04:17:00,2022-03-10 04:28:00,Station-13,4316,0,4747661,CKB +LINE_20,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,4747661,CKB +LINE_21,Station-0,2022-03-10 00:49:00,2022-03-10 00:49:00,Station-3,0.06,0,4434342,CKB +LINE_21,Station-3,2022-03-10 00:49:00,2022-03-10 01:04:00,Station-16,10229,0,4434342,CKB +LINE_21,Station-16,2022-03-10 01:04:00,2022-03-10 01:19:00,Station-3,11801,0,4434342,CKB +LINE_21,Station-3,2022-03-10 01:19:00,2022-03-10 01:34:00,Station-16,10229,0,4434342,CKB +LINE_21,Station-16,2022-03-10 01:34:00,2022-03-10 01:49:00,Station-3,11801,0,4434342,CKB +LINE_21,Station-3,2022-03-10 01:49:00,2022-03-10 02:04:00,Station-16,10229,0,4434342,CKB +LINE_21,Station-16,2022-03-10 02:04:00,2022-03-10 02:19:00,Station-3,11801,0,4434342,CKB +LINE_21,Station-3,2022-03-10 02:19:00,2022-03-10 02:34:00,Station-16,10229,0,4434342,CKB +LINE_21,Station-16,2022-03-10 02:34:00,2022-03-10 02:49:00,Station-3,11801,0,4434342,CKB +LINE_21,Station-3,2022-03-10 02:49:00,2022-03-10 03:04:00,Station-16,10229,0,4434342,CKB +LINE_21,Station-16,2022-03-10 03:04:00,2022-03-10 03:19:00,Station-3,11801,0,4434342,CKB +LINE_21,Station-3,2022-03-10 03:19:00,2022-03-10 03:34:00,Station-16,10229,0,4434342,CKB +LINE_21,Station-16,2022-03-10 03:34:00,2022-03-10 03:49:00,Station-3,11801,0,4434342,CKB +LINE_21,Station-3,2022-03-10 03:49:00,2022-03-10 04:04:00,Station-16,10229,0,4434342,CKB +LINE_21,Station-16,2022-03-10 04:04:00,2022-03-10 04:19:00,Station-3,11801,23,4434342,CKB +LINE_22,Station-3,2022-03-10 04:42:00,2022-03-10 05:04:00,Station-43,6.81,0,4434342,CKB +LINE_22,Station-43,2022-03-10 05:04:00,2022-03-10 05:04:00,Station-0,0.06,0,4434342,CKB +LINE_8,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,4434898,CKB +LINE_8,Station-13,2022-03-10 00:32:00,2022-03-10 00:57:00,Station-21,11545,6,4434898,CKB +LINE_8,Station-21,2022-03-10 01:03:00,2022-03-10 01:46:00,Station-20,20579,1,4434898,CKB +LINE_8,Station-20,2022-03-10 01:47:00,2022-03-10 02:25:00,Station-21,20641,8,4434898,CKB +LINE_8,Station-21,2022-03-10 02:33:00,2022-03-10 03:16:00,Station-20,20579,1,4434898,CKB +LINE_8,Station-20,2022-03-10 03:17:00,2022-03-10 03:55:00,Station-21,20641,8,4434898,CKB +LINE_8,Station-21,2022-03-10 04:03:00,2022-03-10 04:28:00,Station-13,11499,0,4434898,CKB +LINE_8,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,4434898,CKB +LINE_8,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-21,0.06,0,4434903,CKB +LINE_8,Station-21,2022-03-10 00:33:00,2022-03-10 01:16:00,Station-20,20579,1,4434903,CKB +LINE_8,Station-20,2022-03-10 01:17:00,2022-03-10 01:55:00,Station-21,20641,8,4434903,CKB +LINE_8,Station-21,2022-03-10 02:03:00,2022-03-10 02:46:00,Station-20,20579,1,4434903,CKB +LINE_8,Station-20,2022-03-10 02:47:00,2022-03-10 03:25:00,Station-21,20641,8,4434903,CKB +LINE_8,Station-21,2022-03-10 03:33:00,2022-03-10 04:16:00,Station-20,20579,1,4434903,CKB +LINE_8,Station-20,2022-03-10 04:17:00,2022-03-10 04:51:00,Station-44,18752,0,4434903,CKB +LINE_8,Station-44,2022-03-10 04:51:00,2022-03-10 04:51:00,Station-0,0.06,0,4434903,CKB +LINE_23,Station-0,2022-03-10 00:34:00,2022-03-10 00:34:00,Station-45,0.06,0,4619767,CKB +LINE_23,Station-45,2022-03-10 00:34:00,2022-03-10 01:00:00,Station-46,9016,0,4619767,CKB +LINE_23,Station-46,2022-03-10 01:00:00,2022-03-10 01:27:00,Station-45,10083,7,4619767,CKB +LINE_23,Station-45,2022-03-10 01:34:00,2022-03-10 02:00:00,Station-46,9016,0,4619767,CKB +LINE_23,Station-46,2022-03-10 02:00:00,2022-03-10 02:27:00,Station-45,10083,7,4619767,CKB +LINE_23,Station-45,2022-03-10 02:34:00,2022-03-10 03:00:00,Station-46,9016,0,4619767,CKB +LINE_23,Station-46,2022-03-10 03:00:00,2022-03-10 03:27:00,Station-45,10083,7,4619767,CKB +LINE_23,Station-45,2022-03-10 03:34:00,2022-03-10 04:00:00,Station-46,9016,0,4619767,CKB +LINE_23,Station-46,2022-03-10 04:00:00,2022-03-10 04:27:00,Station-45,10083,0,4619767,CKB +LINE_23,Station-45,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,4619767,CKB +LINE_23,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-46,0.06,0,4619992,CKB +LINE_23,Station-46,2022-03-10 00:30:00,2022-03-10 00:57:00,Station-45,10083,7,4619992,CKB +LINE_23,Station-45,2022-03-10 01:04:00,2022-03-10 01:30:00,Station-46,9016,0,4619992,CKB +LINE_23,Station-46,2022-03-10 01:30:00,2022-03-10 01:57:00,Station-45,10083,7,4619992,CKB +LINE_23,Station-45,2022-03-10 02:04:00,2022-03-10 02:30:00,Station-46,9016,0,4619992,CKB +LINE_23,Station-46,2022-03-10 02:30:00,2022-03-10 02:57:00,Station-45,10083,7,4619992,CKB +LINE_23,Station-45,2022-03-10 03:04:00,2022-03-10 03:30:00,Station-46,9016,0,4619992,CKB +LINE_23,Station-46,2022-03-10 03:30:00,2022-03-10 03:57:00,Station-45,10083,7,4619992,CKB +LINE_23,Station-45,2022-03-10 04:04:00,2022-03-10 04:30:00,Station-46,9016,0,4619992,CKB +LINE_23,Station-46,2022-03-10 04:30:00,2022-03-10 04:57:00,Station-45,10083,0,4619992,CKB +LINE_23,Station-45,2022-03-10 04:57:00,2022-03-10 04:57:00,Station-0,0.06,0,4619992,CKB +LINE_24,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,4374745,CKB +LINE_24,Station-21,2022-03-10 00:31:00,2022-03-10 00:44:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 00:44:00,2022-03-10 00:56:00,Station-21,5362,5,4374745,CKB +LINE_24,Station-21,2022-03-10 01:01:00,2022-03-10 01:14:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 01:14:00,2022-03-10 01:26:00,Station-21,5362,5,4374745,CKB +LINE_24,Station-21,2022-03-10 01:31:00,2022-03-10 01:44:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 01:44:00,2022-03-10 01:56:00,Station-21,5362,5,4374745,CKB +LINE_24,Station-21,2022-03-10 02:01:00,2022-03-10 02:14:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 02:14:00,2022-03-10 02:26:00,Station-21,5362,5,4374745,CKB +LINE_24,Station-21,2022-03-10 02:31:00,2022-03-10 02:44:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 02:44:00,2022-03-10 02:56:00,Station-21,5362,5,4374745,CKB +LINE_24,Station-21,2022-03-10 03:01:00,2022-03-10 03:14:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 03:14:00,2022-03-10 03:26:00,Station-21,5362,5,4374745,CKB +LINE_24,Station-21,2022-03-10 03:31:00,2022-03-10 03:44:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 03:44:00,2022-03-10 03:56:00,Station-21,5362,5,4374745,CKB +LINE_24,Station-21,2022-03-10 04:01:00,2022-03-10 04:14:00,Station-47,4872,0,4374745,CKB +LINE_24,Station-47,2022-03-10 04:14:00,2022-03-10 04:26:00,Station-21,5362,0,4374745,CKB +LINE_24,Station-21,2022-03-10 04:26:00,2022-03-10 04:26:00,Station-0,0.06,0,4374745,CKB +LINE_25,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,4374868,CKB +LINE_25,Station-21,2022-03-10 00:31:00,2022-03-10 00:45:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 00:47:00,2022-03-10 01:01:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 01:01:00,2022-03-10 01:15:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 01:17:00,2022-03-10 01:31:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 01:31:00,2022-03-10 01:45:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 01:47:00,2022-03-10 02:01:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 02:01:00,2022-03-10 02:15:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 02:17:00,2022-03-10 02:31:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 02:31:00,2022-03-10 02:45:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 02:47:00,2022-03-10 03:01:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 03:01:00,2022-03-10 03:15:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 03:17:00,2022-03-10 03:31:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 03:31:00,2022-03-10 03:45:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 03:47:00,2022-03-10 04:01:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 04:01:00,2022-03-10 04:15:00,Station-48,5225,2,4374868,CKB +LINE_25,Station-48,2022-03-10 04:17:00,2022-03-10 04:31:00,Station-21,7617,0,4374868,CKB +LINE_25,Station-21,2022-03-10 04:31:00,2022-03-10 04:31:00,Station-0,0.06,0,4374868,CKB +LINE_26,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-49,0.06,0,4375014,CKB +LINE_26,Station-49,2022-03-10 00:43:00,2022-03-10 00:53:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 00:53:00,2022-03-10 01:03:00,Station-49,4408,10,4375014,CKB +LINE_26,Station-49,2022-03-10 01:13:00,2022-03-10 01:23:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 01:23:00,2022-03-10 01:33:00,Station-49,4408,10,4375014,CKB +LINE_26,Station-49,2022-03-10 01:43:00,2022-03-10 01:53:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 01:53:00,2022-03-10 02:03:00,Station-49,4408,10,4375014,CKB +LINE_26,Station-49,2022-03-10 02:13:00,2022-03-10 02:23:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 02:23:00,2022-03-10 02:33:00,Station-49,4408,10,4375014,CKB +LINE_26,Station-49,2022-03-10 02:43:00,2022-03-10 02:53:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 02:53:00,2022-03-10 03:03:00,Station-49,4408,10,4375014,CKB +LINE_26,Station-49,2022-03-10 03:13:00,2022-03-10 03:23:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 03:23:00,2022-03-10 03:33:00,Station-49,4408,10,4375014,CKB +LINE_26,Station-49,2022-03-10 03:43:00,2022-03-10 03:53:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 03:53:00,2022-03-10 04:03:00,Station-49,4408,10,4375014,CKB +LINE_26,Station-49,2022-03-10 04:13:00,2022-03-10 04:23:00,Station-50,4507,0,4375014,CKB +LINE_26,Station-50,2022-03-10 04:23:00,2022-03-10 04:33:00,Station-49,4408,0,4375014,CKB +LINE_26,Station-49,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,4375014,CKB +LINE_0,Station-0,2022-03-10 21:31:00,2022-03-10 21:31:00,Station-1,0.06,0,4454946,CKB +LINE_0,Station-1,2022-03-10 21:31:00,2022-03-10 22:04:00,Station-2,14519,4,4454946,CKB +LINE_0,Station-2,2022-03-10 22:08:00,2022-03-10 22:43:00,Station-1,13541,8,4454946,CKB +LINE_0,Station-1,2022-03-10 22:51:00,2022-03-10 23:24:00,Station-2,14519,4,4454946,CKB +LINE_0,Station-2,2022-03-10 23:28:00,2022-03-11 00:03:00,Station-1,13541,8,4454946,CKB +LINE_0,Station-1,2022-03-11 00:11:00,2022-03-11 00:44:00,Station-2,14519,0,4454946,CKB +LINE_1,Station-2,2022-03-11 00:44:00,2022-03-11 00:54:00,Station-3,4.1,25,4454946,CKB +LINE_1,Station-3,2022-03-11 01:19:00,2022-03-11 01:42:00,Station-4,8.36,6,4454946,CKB +LINE_1,Station-4,2022-03-11 01:48:00,2022-03-11 02:06:00,Station-3,9067,13,4454946,CKB +LINE_1,Station-3,2022-03-11 02:19:00,2022-03-11 02:42:00,Station-4,8.36,6,4454946,CKB +LINE_1,Station-4,2022-03-11 02:48:00,2022-03-11 03:06:00,Station-3,9067,13,4454946,CKB +LINE_1,Station-3,2022-03-11 03:19:00,2022-03-11 03:42:00,Station-4,8.36,6,4454946,CKB +LINE_1,Station-4,2022-03-11 03:48:00,2022-03-11 04:06:00,Station-3,9067,0,4454946,CKB +LINE_1,Station-3,2022-03-11 04:06:00,2022-03-11 04:06:00,Station-0,0.06,0,4454946,CKB +LINE_0,Station-0,2022-03-10 22:11:00,2022-03-10 22:11:00,Station-1,0.06,0,4454951,CKB +LINE_0,Station-1,2022-03-10 22:11:00,2022-03-10 22:44:00,Station-2,14519,4,4454951,CKB +LINE_0,Station-2,2022-03-10 22:48:00,2022-03-10 23:23:00,Station-1,13541,8,4454951,CKB +LINE_0,Station-1,2022-03-10 23:31:00,2022-03-11 00:04:00,Station-2,14519,4,4454951,CKB +LINE_0,Station-2,2022-03-11 00:08:00,2022-03-11 00:39:00,Station-5,12213,0,4454951,CKB +LINE_1,Station-5,2022-03-11 00:39:00,2022-03-11 00:47:00,Station-3,4.0,2,4454951,CKB +LINE_1,Station-3,2022-03-11 00:49:00,2022-03-11 01:12:00,Station-4,8.36,6,4454951,CKB +LINE_1,Station-4,2022-03-11 01:18:00,2022-03-11 01:36:00,Station-3,9067,13,4454951,CKB +LINE_1,Station-3,2022-03-11 01:49:00,2022-03-11 02:12:00,Station-4,8.36,6,4454951,CKB +LINE_1,Station-4,2022-03-11 02:18:00,2022-03-11 02:36:00,Station-3,9067,13,4454951,CKB +LINE_1,Station-3,2022-03-11 02:49:00,2022-03-11 03:12:00,Station-4,8.36,6,4454951,CKB +LINE_1,Station-4,2022-03-11 03:18:00,2022-03-11 03:36:00,Station-3,9067,13,4454951,CKB +LINE_1,Station-3,2022-03-11 03:49:00,2022-03-11 04:12:00,Station-4,8.36,0,4454951,CKB +LINE_1,Station-4,2022-03-11 04:12:00,2022-03-11 04:12:00,Station-0,0.06,0,4454951,CKB +LINE_2,Station-0,2022-03-10 21:06:00,2022-03-10 21:06:00,Station-6,0.06,0,4664625,CKB +LINE_2,Station-6,2022-03-10 21:06:00,2022-03-10 21:34:00,Station-7,13018,19,4664625,CKB +LINE_2,Station-7,2022-03-10 21:53:00,2022-03-10 22:13:00,Station-8,10332,17,4664625,CKB +LINE_2,Station-8,2022-03-10 22:30:00,2022-03-10 22:54:00,Station-7,10.48,19,4664625,CKB +LINE_2,Station-7,2022-03-10 23:13:00,2022-03-10 23:33:00,Station-8,10332,17,4664625,CKB +LINE_2,Station-8,2022-03-10 23:50:00,2022-03-11 00:14:00,Station-7,10.48,2,4664625,CKB +LINE_2,Station-7,2022-03-11 00:16:00,2022-03-11 00:23:00,Station-9,3709,5,4664625,CKB +LINE_3,Station-9,2022-03-11 00:28:00,2022-03-11 00:44:00,Station-10,6404,3,4664625,CKB +LINE_3,Station-10,2022-03-11 00:47:00,2022-03-11 01:10:00,Station-11,10579,7,4664625,CKB +LINE_3,Station-11,2022-03-11 01:17:00,2022-03-11 01:44:00,Station-10,12007,3,4664625,CKB +LINE_3,Station-10,2022-03-11 01:47:00,2022-03-11 02:10:00,Station-11,10579,7,4664625,CKB +LINE_3,Station-11,2022-03-11 02:17:00,2022-03-11 02:44:00,Station-10,12007,3,4664625,CKB +LINE_3,Station-10,2022-03-11 02:47:00,2022-03-11 03:10:00,Station-11,10579,7,4664625,CKB +LINE_3,Station-11,2022-03-11 03:17:00,2022-03-11 03:44:00,Station-10,12007,3,4664625,CKB +LINE_3,Station-10,2022-03-11 03:47:00,2022-03-11 04:10:00,Station-11,10579,7,4664625,CKB +LINE_3,Station-11,2022-03-11 04:17:00,2022-03-11 04:44:00,Station-10,12007,0,4664625,CKB +LINE_3,Station-10,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,4664625,CKB +LINE_2,Station-0,2022-03-10 20:26:00,2022-03-10 20:26:00,Station-6,0.06,0,4762777,CKB +LINE_2,Station-6,2022-03-10 20:26:00,2022-03-10 20:56:00,Station-12,14097,14,4762777,CKB +LINE_2,Station-12,2022-03-10 21:10:00,2022-03-10 21:38:00,Station-6,13.19,8,4762777,CKB +LINE_2,Station-6,2022-03-10 21:46:00,2022-03-10 22:14:00,Station-7,13018,19,4762777,CKB +LINE_2,Station-7,2022-03-10 22:33:00,2022-03-10 22:53:00,Station-8,10332,17,4762777,CKB +LINE_2,Station-8,2022-03-10 23:10:00,2022-03-10 23:34:00,Station-7,10.48,19,4762777,CKB +LINE_2,Station-7,2022-03-10 23:53:00,2022-03-11 00:13:00,Station-8,10332,2,4762777,CKB +LINE_2,Station-8,2022-03-11 00:15:00,2022-03-11 00:16:00,Station-10,506,1,4762777,CKB +LINE_3,Station-10,2022-03-11 00:17:00,2022-03-11 00:40:00,Station-11,10579,7,4762777,CKB +LINE_3,Station-11,2022-03-11 00:47:00,2022-03-11 01:14:00,Station-10,12007,3,4762777,CKB +LINE_3,Station-10,2022-03-11 01:17:00,2022-03-11 01:40:00,Station-11,10579,7,4762777,CKB +LINE_3,Station-11,2022-03-11 01:47:00,2022-03-11 02:14:00,Station-10,12007,3,4762777,CKB +LINE_3,Station-10,2022-03-11 02:17:00,2022-03-11 02:40:00,Station-11,10579,7,4762777,CKB +LINE_3,Station-11,2022-03-11 02:47:00,2022-03-11 03:14:00,Station-10,12007,3,4762777,CKB +LINE_3,Station-10,2022-03-11 03:17:00,2022-03-11 03:40:00,Station-11,10579,7,4762777,CKB +LINE_3,Station-11,2022-03-11 03:47:00,2022-03-11 04:14:00,Station-10,12007,3,4762777,CKB +LINE_3,Station-10,2022-03-11 04:17:00,2022-03-11 04:40:00,Station-11,10579,3,4762777,CKB +LINE_4,Station-11,2022-03-11 04:43:00,2022-03-11 04:58:00,Station-13,6161,0,4762777,CKB +LINE_4,Station-13,2022-03-11 04:58:00,2022-03-11 04:58:00,Station-0,0.06,0,4762777,CKB +LINE_5,Station-0,2022-03-10 22:56:00,2022-03-10 22:56:00,Station-14,0.06,0,4617422,CKB +LINE_5,Station-14,2022-03-10 22:56:00,2022-03-10 23:08:00,Station-15,5882,3,4617422,CKB +LINE_5,Station-15,2022-03-10 23:11:00,2022-03-10 23:25:00,Station-14,6232,0,4617422,CKB +LINE_5,Station-14,2022-03-10 23:25:00,2022-03-10 23:38:00,Station-15,6086,3,4617422,CKB +LINE_5,Station-15,2022-03-10 23:41:00,2022-03-10 23:55:00,Station-14,6232,0,4617422,CKB +LINE_5,Station-14,2022-03-10 23:55:00,2022-03-11 00:08:00,Station-15,6086,0,4617422,CKB +LINE_5,Station-15,2022-03-11 00:08:00,2022-03-11 00:08:00,Station-0,0.06,0,4617422,CKB +LINE_6,Station-0,2022-03-10 05:05:00,2022-03-10 05:05:00,Station-16,0.06,0,4426847,CKB +LINE_6,Station-16,2022-03-10 05:05:00,2022-03-10 05:14:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 05:14:00,2022-03-10 05:23:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 05:25:00,2022-03-10 05:34:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 05:34:00,2022-03-10 05:43:00,Station-16,5139,23,4426847,CKB +LINE_6,Station-16,2022-03-10 06:06:00,2022-03-10 06:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 06:15:00,2022-03-10 06:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 06:26:00,2022-03-10 06:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 06:35:00,2022-03-10 06:44:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 06:46:00,2022-03-10 06:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 06:55:00,2022-03-10 07:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 07:06:00,2022-03-10 07:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 07:15:00,2022-03-10 07:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 07:26:00,2022-03-10 07:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 07:35:00,2022-03-10 07:44:00,Station-16,5139,22,4426847,CKB +LINE_6,Station-16,2022-03-10 08:06:00,2022-03-10 08:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 08:15:00,2022-03-10 08:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 08:26:00,2022-03-10 08:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 08:35:00,2022-03-10 08:44:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 08:46:00,2022-03-10 08:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 08:55:00,2022-03-10 09:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 09:06:00,2022-03-10 09:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 09:15:00,2022-03-10 09:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 09:26:00,2022-03-10 09:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 09:35:00,2022-03-10 09:44:00,Station-16,5139,22,4426847,CKB +LINE_6,Station-16,2022-03-10 10:06:00,2022-03-10 10:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 10:15:00,2022-03-10 10:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 10:26:00,2022-03-10 10:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 10:35:00,2022-03-10 10:44:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 10:46:00,2022-03-10 10:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 10:55:00,2022-03-10 11:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 11:06:00,2022-03-10 11:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 11:15:00,2022-03-10 11:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 11:26:00,2022-03-10 11:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 11:35:00,2022-03-10 11:44:00,Station-16,5139,22,4426847,CKB +LINE_6,Station-16,2022-03-10 12:06:00,2022-03-10 12:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 12:15:00,2022-03-10 12:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 12:26:00,2022-03-10 12:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 12:35:00,2022-03-10 12:44:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 12:46:00,2022-03-10 12:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 12:55:00,2022-03-10 13:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 13:06:00,2022-03-10 13:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 13:15:00,2022-03-10 13:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 13:26:00,2022-03-10 13:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 13:35:00,2022-03-10 13:44:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 13:46:00,2022-03-10 13:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 13:55:00,2022-03-10 14:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 14:06:00,2022-03-10 14:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 14:15:00,2022-03-10 14:24:00,Station-16,5139,22,4426847,CKB +LINE_6,Station-16,2022-03-10 14:46:00,2022-03-10 14:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 14:55:00,2022-03-10 15:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 15:06:00,2022-03-10 15:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 15:15:00,2022-03-10 15:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 15:26:00,2022-03-10 15:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 15:35:00,2022-03-10 15:44:00,Station-16,5139,22,4426847,CKB +LINE_6,Station-16,2022-03-10 16:06:00,2022-03-10 16:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 16:15:00,2022-03-10 16:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 16:26:00,2022-03-10 16:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 16:35:00,2022-03-10 16:44:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 16:46:00,2022-03-10 16:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 16:55:00,2022-03-10 17:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 17:06:00,2022-03-10 17:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 17:15:00,2022-03-10 17:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 17:26:00,2022-03-10 17:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 17:35:00,2022-03-10 17:44:00,Station-16,5139,22,4426847,CKB +LINE_6,Station-16,2022-03-10 18:06:00,2022-03-10 18:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 18:15:00,2022-03-10 18:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 18:26:00,2022-03-10 18:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 18:35:00,2022-03-10 18:44:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 18:46:00,2022-03-10 18:55:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 18:55:00,2022-03-10 19:04:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 19:06:00,2022-03-10 19:15:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 19:15:00,2022-03-10 19:24:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 19:26:00,2022-03-10 19:35:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 19:35:00,2022-03-10 19:44:00,Station-16,5139,21,4426847,CKB +LINE_6,Station-16,2022-03-10 20:05:00,2022-03-10 20:14:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 20:14:00,2022-03-10 20:23:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 20:25:00,2022-03-10 20:34:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 20:34:00,2022-03-10 20:43:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 20:45:00,2022-03-10 20:54:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 20:54:00,2022-03-10 21:03:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 21:05:00,2022-03-10 21:14:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 21:14:00,2022-03-10 21:23:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 21:25:00,2022-03-10 21:34:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 21:34:00,2022-03-10 21:43:00,Station-16,5139,22,4426847,CKB +LINE_6,Station-16,2022-03-10 22:05:00,2022-03-10 22:14:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 22:14:00,2022-03-10 22:23:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 22:25:00,2022-03-10 22:34:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 22:34:00,2022-03-10 22:43:00,Station-16,5139,2,4426847,CKB +LINE_6,Station-16,2022-03-10 22:45:00,2022-03-10 22:54:00,Station-17,4781,0,4426847,CKB +LINE_6,Station-17,2022-03-10 22:54:00,2022-03-10 23:03:00,Station-16,5139,0,4426847,CKB +LINE_6,Station-16,2022-03-10 23:03:00,2022-03-10 23:03:00,Station-0,0.06,0,4426847,CKB +LINE_7,Station-0,2022-03-11 00:06:00,2022-03-11 00:06:00,Station-18,0.06,0,4708597,CKB +LINE_7,Station-18,2022-03-11 00:06:00,2022-03-11 00:27:00,Station-19,7827,0,4708597,CKB +LINE_8,Station-19,2022-03-11 00:27:00,2022-03-11 00:48:00,Station-20,11079,0,4708597,CKB +LINE_8,Station-20,2022-03-11 00:48:00,2022-03-11 01:25:00,Station-21,20641,8,4708597,CKB +LINE_8,Station-21,2022-03-11 01:33:00,2022-03-11 02:16:00,Station-20,20579,1,4708597,CKB +LINE_8,Station-20,2022-03-11 02:17:00,2022-03-11 02:55:00,Station-21,20641,8,4708597,CKB +LINE_8,Station-21,2022-03-11 03:03:00,2022-03-11 03:46:00,Station-20,20579,1,4708597,CKB +LINE_8,Station-20,2022-03-11 03:47:00,2022-03-11 04:25:00,Station-21,20641,0,4708597,CKB +LINE_8,Station-21,2022-03-11 04:25:00,2022-03-11 04:25:00,Station-0,0.06,0,4708597,CKB +LINE_9,Station-22,2022-03-10 05:15:00,2022-03-10 06:01:00,Station-23,17.9,0,4317627,VDL +LINE_9,Station-23,2022-03-10 06:01:00,2022-03-10 06:15:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 06:23:00,2022-03-10 06:37:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 06:41:00,2022-03-10 06:55:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 07:03:00,2022-03-10 07:17:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 07:21:00,2022-03-10 07:35:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 07:43:00,2022-03-10 07:57:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 08:01:00,2022-03-10 08:15:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 08:23:00,2022-03-10 08:37:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 08:41:00,2022-03-10 08:55:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 09:03:00,2022-03-10 09:17:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 09:21:00,2022-03-10 09:35:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 09:43:00,2022-03-10 09:57:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 10:01:00,2022-03-10 10:15:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 10:23:00,2022-03-10 10:37:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 10:41:00,2022-03-10 10:55:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 11:03:00,2022-03-10 11:17:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 11:21:00,2022-03-10 11:35:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 11:43:00,2022-03-10 11:57:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 12:01:00,2022-03-10 12:15:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 12:23:00,2022-03-10 12:37:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 12:41:00,2022-03-10 12:55:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 13:03:00,2022-03-10 13:17:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 13:21:00,2022-03-10 13:35:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 13:43:00,2022-03-10 13:57:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 14:01:00,2022-03-10 14:15:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 14:23:00,2022-03-10 14:37:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 14:41:00,2022-03-10 14:55:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 15:03:00,2022-03-10 15:17:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 15:21:00,2022-03-10 15:35:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 15:43:00,2022-03-10 15:57:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 16:01:00,2022-03-10 16:15:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 16:23:00,2022-03-10 16:37:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 16:41:00,2022-03-10 16:55:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 17:03:00,2022-03-10 17:17:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 17:21:00,2022-03-10 17:35:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 17:43:00,2022-03-10 17:57:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 18:01:00,2022-03-10 18:15:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 18:23:00,2022-03-10 18:37:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 18:41:00,2022-03-10 18:55:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 19:03:00,2022-03-10 19:17:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 19:21:00,2022-03-10 19:35:00,Station-23,4637,8,4317627,VDL +LINE_9,Station-23,2022-03-10 19:43:00,2022-03-10 19:57:00,Station-23,4637,4,4317627,VDL +LINE_9,Station-23,2022-03-10 20:01:00,2022-03-10 20:14:00,Station-23,4637,9,4317627,VDL +LINE_9,Station-23,2022-03-10 20:23:00,2022-03-10 20:36:00,Station-23,4637,0,4317627,VDL +LINE_9,Station-23,2022-03-10 20:36:00,2022-03-10 21:15:00,Station-22,19.8,0,4317627,VDL +LINE_10,Station-0,2022-03-10 04:56:00,2022-03-10 04:56:00,Station-24,0.06,18,4425670,CKB +LINE_10,Station-24,2022-03-10 05:14:00,2022-03-10 05:20:00,Station-25,3.29,0,4425670,CKB +LINE_10,Station-25,2022-03-10 05:20:00,2022-03-10 05:24:00,Station-24,2954,20,4425670,CKB +LINE_10,Station-24,2022-03-10 05:44:00,2022-03-10 05:50:00,Station-25,3.29,0,4425670,CKB +LINE_10,Station-25,2022-03-10 05:50:00,2022-03-10 05:54:00,Station-24,2954,5,4425670,CKB +LINE_10,Station-24,2022-03-10 05:59:00,2022-03-10 06:06:00,Station-25,3.29,2,4425670,CKB +LINE_10,Station-25,2022-03-10 06:08:00,2022-03-10 06:13:00,Station-24,2954,19,4425670,CKB +LINE_10,Station-24,2022-03-10 06:32:00,2022-03-10 06:39:00,Station-25,3.29,1,4425670,CKB +LINE_10,Station-25,2022-03-10 06:40:00,2022-03-10 06:45:00,Station-24,2954,7,4425670,CKB +LINE_10,Station-24,2022-03-10 06:52:00,2022-03-10 06:59:00,Station-25,3.29,1,4425670,CKB +LINE_10,Station-25,2022-03-10 07:00:00,2022-03-10 07:05:00,Station-24,2954,7,4425670,CKB +LINE_10,Station-24,2022-03-10 07:12:00,2022-03-10 07:19:00,Station-25,3.29,1,4425670,CKB +LINE_10,Station-25,2022-03-10 07:20:00,2022-03-10 07:25:00,Station-24,2954,7,4425670,CKB +LINE_10,Station-24,2022-03-10 07:32:00,2022-03-10 07:39:00,Station-25,3.29,1,4425670,CKB +LINE_10,Station-25,2022-03-10 07:40:00,2022-03-10 07:45:00,Station-24,2954,295,4425670,CKB +LINE_10,Station-24,2022-03-10 12:40:00,2022-03-10 12:47:00,Station-25,3.29,2,4425670,CKB +LINE_10,Station-25,2022-03-10 12:49:00,2022-03-10 12:54:00,Station-24,2954,46,4425670,CKB +LINE_10,Station-24,2022-03-10 13:40:00,2022-03-10 13:47:00,Station-25,3.29,2,4425670,CKB +LINE_10,Station-25,2022-03-10 13:49:00,2022-03-10 13:54:00,Station-24,2954,434,4425670,CKB +LINE_10,Station-24,2022-03-10 21:08:00,2022-03-10 21:08:00,Station-0,0.06,0,4425670,CKB +LINE_11,Station-0,2022-03-10 07:20:00,2022-03-10 07:20:00,Station-26,0.06,0,4448152,CKB +LINE_11,Station-26,2022-03-10 07:20:00,2022-03-10 07:50:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 08:00:00,2022-03-10 08:30:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 08:40:00,2022-03-10 09:10:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 09:20:00,2022-03-10 09:50:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 10:00:00,2022-03-10 10:30:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 10:40:00,2022-03-10 11:10:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 11:20:00,2022-03-10 11:50:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 12:00:00,2022-03-10 12:30:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 12:40:00,2022-03-10 13:10:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 13:20:00,2022-03-10 13:50:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 14:00:00,2022-03-10 14:30:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 14:40:00,2022-03-10 15:10:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 15:20:00,2022-03-10 15:50:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 16:00:00,2022-03-10 16:30:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 16:40:00,2022-03-10 17:10:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 17:20:00,2022-03-10 17:50:00,Station-26,9266,10,4448152,CKB +LINE_11,Station-26,2022-03-10 18:00:00,2022-03-10 18:30:00,Station-26,9266,0,4448152,CKB +LINE_11,Station-26,2022-03-10 18:30:00,2022-03-10 18:30:00,Station-0,0.06,0,4448152,CKB +LINE_12,Station-0,2022-03-10 07:10:00,2022-03-10 07:10:00,Station-27,0.06,0,4733897,CKB +LINE_12,Station-27,2022-03-10 07:10:00,2022-03-10 07:18:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 07:28:00,2022-03-10 07:40:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 07:40:00,2022-03-10 07:48:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 07:58:00,2022-03-10 08:10:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 08:10:00,2022-03-10 08:18:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 08:28:00,2022-03-10 08:40:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 08:40:00,2022-03-10 08:48:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 08:58:00,2022-03-10 09:10:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 09:10:00,2022-03-10 09:18:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 09:28:00,2022-03-10 09:40:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 09:40:00,2022-03-10 09:48:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 09:58:00,2022-03-10 10:10:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 10:10:00,2022-03-10 10:18:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 10:28:00,2022-03-10 10:40:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 10:40:00,2022-03-10 10:48:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 10:58:00,2022-03-10 11:10:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 11:10:00,2022-03-10 11:18:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 11:28:00,2022-03-10 11:40:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 11:40:00,2022-03-10 11:48:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 11:58:00,2022-03-10 12:10:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 12:10:00,2022-03-10 12:18:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 12:28:00,2022-03-10 12:40:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 12:40:00,2022-03-10 12:48:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 12:58:00,2022-03-10 13:10:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 13:10:00,2022-03-10 13:18:00,Station-28,2169,10,4733897,CKB +LINE_12,Station-28,2022-03-10 13:28:00,2022-03-10 13:40:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 13:40:00,2022-03-10 13:48:00,Station-28,2169,8,4733897,CKB +LINE_12,Station-28,2022-03-10 13:56:00,2022-03-10 14:10:00,Station-27,2952,0,4733897,CKB +LINE_12,Station-27,2022-03-10 14:10:00,2022-03-10 14:19:00,Station-28,2169,14,4733897,CKB +LINE_12,Station-28,2022-03-10 14:33:00,2022-03-10 14:47:00,Station-27,2952,3,4733897,CKB +LINE_12,Station-27,2022-03-10 14:50:00,2022-03-10 14:59:00,Station-28,2169,14,4733897,CKB +LINE_12,Station-28,2022-03-10 15:13:00,2022-03-10 15:27:00,Station-27,2952,3,4733897,CKB +LINE_12,Station-27,2022-03-10 15:30:00,2022-03-10 15:39:00,Station-28,2169,14,4733897,CKB +LINE_12,Station-28,2022-03-10 15:53:00,2022-03-10 16:07:00,Station-27,2952,3,4733897,CKB +LINE_12,Station-27,2022-03-10 16:10:00,2022-03-10 16:19:00,Station-28,2169,14,4733897,CKB +LINE_12,Station-28,2022-03-10 16:33:00,2022-03-10 16:47:00,Station-27,2952,3,4733897,CKB +LINE_12,Station-27,2022-03-10 16:50:00,2022-03-10 16:59:00,Station-28,2169,14,4733897,CKB +LINE_12,Station-28,2022-03-10 17:13:00,2022-03-10 17:27:00,Station-27,2952,3,4733897,CKB +LINE_12,Station-27,2022-03-10 17:30:00,2022-03-10 17:39:00,Station-28,2169,13,4733897,CKB +LINE_12,Station-28,2022-03-10 17:52:00,2022-03-10 18:05:00,Station-27,2952,5,4733897,CKB +LINE_12,Station-27,2022-03-10 18:10:00,2022-03-10 18:18:00,Station-28,2169,0,4733897,CKB +LINE_12,Station-28,2022-03-10 18:18:00,2022-03-10 18:18:00,Station-0,0.06,0,4733897,CKB +LINE_12,Station-0,2022-03-10 14:13:00,2022-03-10 14:13:00,Station-28,0.06,0,4734202,CKB +LINE_12,Station-28,2022-03-10 14:13:00,2022-03-10 14:27:00,Station-27,2952,3,4734202,CKB +LINE_12,Station-27,2022-03-10 14:30:00,2022-03-10 14:39:00,Station-28,2169,14,4734202,CKB +LINE_12,Station-28,2022-03-10 14:53:00,2022-03-10 15:07:00,Station-27,2952,3,4734202,CKB +LINE_12,Station-27,2022-03-10 15:10:00,2022-03-10 15:19:00,Station-28,2169,14,4734202,CKB +LINE_12,Station-28,2022-03-10 15:33:00,2022-03-10 15:47:00,Station-27,2952,3,4734202,CKB +LINE_12,Station-27,2022-03-10 15:50:00,2022-03-10 15:59:00,Station-28,2169,14,4734202,CKB +LINE_12,Station-28,2022-03-10 16:13:00,2022-03-10 16:27:00,Station-27,2952,3,4734202,CKB +LINE_12,Station-27,2022-03-10 16:30:00,2022-03-10 16:39:00,Station-28,2169,14,4734202,CKB +LINE_12,Station-28,2022-03-10 16:53:00,2022-03-10 17:07:00,Station-27,2952,3,4734202,CKB +LINE_12,Station-27,2022-03-10 17:10:00,2022-03-10 17:19:00,Station-28,2169,14,4734202,CKB +LINE_12,Station-28,2022-03-10 17:33:00,2022-03-10 17:47:00,Station-27,2952,3,4734202,CKB +LINE_12,Station-27,2022-03-10 17:50:00,2022-03-10 17:59:00,Station-28,2169,14,4734202,CKB +LINE_12,Station-28,2022-03-10 18:13:00,2022-03-10 18:25:00,Station-27,2952,0,4734202,CKB +LINE_12,Station-27,2022-03-10 18:25:00,2022-03-10 18:25:00,Station-0,0.06,0,4734202,CKB +LINE_13,Station-0,2022-03-11 00:23:00,2022-03-11 00:23:00,Station-29,0.06,0,4318159,CKB +LINE_13,Station-29,2022-03-11 00:23:00,2022-03-11 00:30:00,Station-30,2577,9,4318159,CKB +LINE_14,Station-30,2022-03-11 00:39:00,2022-03-11 00:54:00,Station-31,5937,9,4318159,CKB +LINE_14,Station-31,2022-03-11 01:03:00,2022-03-11 01:17:00,Station-30,6.19,0,4318159,CKB +LINE_13,Station-30,2022-03-11 01:17:00,2022-03-11 01:23:00,Station-29,2555,0,4318159,CKB +LINE_13,Station-29,2022-03-11 01:23:00,2022-03-11 01:30:00,Station-30,2577,9,4318159,CKB +LINE_14,Station-30,2022-03-11 01:39:00,2022-03-11 01:54:00,Station-31,5937,9,4318159,CKB +LINE_14,Station-31,2022-03-11 02:03:00,2022-03-11 02:17:00,Station-30,6.19,0,4318159,CKB +LINE_13,Station-30,2022-03-11 02:17:00,2022-03-11 02:23:00,Station-29,2555,0,4318159,CKB +LINE_13,Station-29,2022-03-11 02:23:00,2022-03-11 02:30:00,Station-30,2577,9,4318159,CKB +LINE_14,Station-30,2022-03-11 02:39:00,2022-03-11 02:54:00,Station-31,5937,9,4318159,CKB +LINE_14,Station-31,2022-03-11 03:03:00,2022-03-11 03:17:00,Station-30,6.19,0,4318159,CKB +LINE_13,Station-30,2022-03-11 03:17:00,2022-03-11 03:23:00,Station-29,2555,0,4318159,CKB +LINE_13,Station-29,2022-03-11 03:23:00,2022-03-11 03:30:00,Station-30,2577,9,4318159,CKB +LINE_14,Station-30,2022-03-11 03:39:00,2022-03-11 03:54:00,Station-31,5937,9,4318159,CKB +LINE_14,Station-31,2022-03-11 04:03:00,2022-03-11 04:17:00,Station-30,6.19,0,4318159,CKB +LINE_13,Station-30,2022-03-11 04:17:00,2022-03-11 04:23:00,Station-29,2555,0,4318159,CKB +LINE_13,Station-29,2022-03-11 04:23:00,2022-03-11 04:23:00,Station-0,0.06,0,4318159,CKB +LINE_14,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-31,0.06,0,4318179,CKB +LINE_14,Station-31,2022-03-11 00:33:00,2022-03-11 00:47:00,Station-30,6.19,0,4318179,CKB +LINE_13,Station-30,2022-03-11 00:47:00,2022-03-11 00:53:00,Station-29,2555,0,4318179,CKB +LINE_13,Station-29,2022-03-11 00:53:00,2022-03-11 01:00:00,Station-30,2577,9,4318179,CKB +LINE_14,Station-30,2022-03-11 01:09:00,2022-03-11 01:24:00,Station-31,5937,9,4318179,CKB +LINE_14,Station-31,2022-03-11 01:33:00,2022-03-11 01:47:00,Station-30,6.19,0,4318179,CKB +LINE_13,Station-30,2022-03-11 01:47:00,2022-03-11 01:53:00,Station-29,2555,0,4318179,CKB +LINE_13,Station-29,2022-03-11 01:53:00,2022-03-11 02:00:00,Station-30,2577,9,4318179,CKB +LINE_14,Station-30,2022-03-11 02:09:00,2022-03-11 02:24:00,Station-31,5937,9,4318179,CKB +LINE_14,Station-31,2022-03-11 02:33:00,2022-03-11 02:47:00,Station-30,6.19,0,4318179,CKB +LINE_13,Station-30,2022-03-11 02:47:00,2022-03-11 02:53:00,Station-29,2555,0,4318179,CKB +LINE_13,Station-29,2022-03-11 02:53:00,2022-03-11 03:00:00,Station-30,2577,9,4318179,CKB +LINE_14,Station-30,2022-03-11 03:09:00,2022-03-11 03:24:00,Station-31,5937,9,4318179,CKB +LINE_14,Station-31,2022-03-11 03:33:00,2022-03-11 03:47:00,Station-30,6.19,0,4318179,CKB +LINE_13,Station-30,2022-03-11 03:47:00,2022-03-11 03:53:00,Station-29,2555,0,4318179,CKB +LINE_13,Station-29,2022-03-11 03:53:00,2022-03-11 04:00:00,Station-30,2577,9,4318179,CKB +LINE_14,Station-30,2022-03-11 04:09:00,2022-03-11 04:24:00,Station-31,5937,0,4318179,CKB +LINE_14,Station-31,2022-03-11 04:24:00,2022-03-11 04:24:00,Station-0,0.06,0,4318179,CKB +LINE_15,Station-0,2022-03-11 00:57:00,2022-03-11 00:57:00,Station-32,0.06,0,4319354,CKB +LINE_15,Station-32,2022-03-11 00:57:00,2022-03-11 01:06:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 01:06:00,2022-03-11 01:11:00,Station-32,2936,16,4319354,CKB +LINE_15,Station-32,2022-03-11 01:27:00,2022-03-11 01:36:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 01:36:00,2022-03-11 01:41:00,Station-32,2936,16,4319354,CKB +LINE_15,Station-32,2022-03-11 01:57:00,2022-03-11 02:06:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 02:06:00,2022-03-11 02:11:00,Station-32,2936,16,4319354,CKB +LINE_15,Station-32,2022-03-11 02:27:00,2022-03-11 02:36:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 02:36:00,2022-03-11 02:41:00,Station-32,2936,16,4319354,CKB +LINE_15,Station-32,2022-03-11 02:57:00,2022-03-11 03:06:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 03:06:00,2022-03-11 03:11:00,Station-32,2936,16,4319354,CKB +LINE_15,Station-32,2022-03-11 03:27:00,2022-03-11 03:36:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 03:36:00,2022-03-11 03:41:00,Station-32,2936,16,4319354,CKB +LINE_15,Station-32,2022-03-11 03:57:00,2022-03-11 04:06:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 04:06:00,2022-03-11 04:11:00,Station-32,2936,16,4319354,CKB +LINE_15,Station-32,2022-03-11 04:27:00,2022-03-11 04:36:00,Station-33,4343,0,4319354,CKB +LINE_15,Station-33,2022-03-11 04:36:00,2022-03-11 04:36:00,Station-0,0.06,0,4319354,CKB +LINE_16,Station-0,2022-03-11 00:29:00,2022-03-11 00:29:00,Station-34,0.06,0,4751089,CKB +LINE_16,Station-34,2022-03-11 00:29:00,2022-03-11 00:41:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 00:47:00,2022-03-11 00:57:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 00:59:00,2022-03-11 01:11:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 01:17:00,2022-03-11 01:27:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 01:29:00,2022-03-11 01:41:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 01:47:00,2022-03-11 01:57:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 01:59:00,2022-03-11 02:11:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 02:17:00,2022-03-11 02:27:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 02:29:00,2022-03-11 02:41:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 02:47:00,2022-03-11 02:57:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 02:59:00,2022-03-11 03:11:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 03:17:00,2022-03-11 03:27:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 03:29:00,2022-03-11 03:41:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 03:47:00,2022-03-11 03:57:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 03:59:00,2022-03-11 04:11:00,Station-35,4481,6,4751089,CKB +LINE_16,Station-35,2022-03-11 04:17:00,2022-03-11 04:27:00,Station-34,4031,2,4751089,CKB +LINE_16,Station-34,2022-03-11 04:29:00,2022-03-11 04:41:00,Station-35,4481,0,4751089,CKB +LINE_16,Station-35,2022-03-11 04:41:00,2022-03-11 04:41:00,Station-0,0.06,0,4751089,CKB +LINE_17,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-34,0.06,0,4453547,CKB +LINE_17,Station-34,2022-03-11 00:30:00,2022-03-11 00:44:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 00:44:00,2022-03-11 00:57:00,Station-34,5302,3,4453547,CKB +LINE_17,Station-34,2022-03-11 01:00:00,2022-03-11 01:14:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 01:14:00,2022-03-11 01:27:00,Station-34,5302,3,4453547,CKB +LINE_17,Station-34,2022-03-11 01:30:00,2022-03-11 01:44:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 01:44:00,2022-03-11 01:57:00,Station-34,5302,3,4453547,CKB +LINE_17,Station-34,2022-03-11 02:00:00,2022-03-11 02:14:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 02:14:00,2022-03-11 02:27:00,Station-34,5302,3,4453547,CKB +LINE_17,Station-34,2022-03-11 02:30:00,2022-03-11 02:44:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 02:44:00,2022-03-11 02:57:00,Station-34,5302,3,4453547,CKB +LINE_17,Station-34,2022-03-11 03:00:00,2022-03-11 03:14:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 03:14:00,2022-03-11 03:27:00,Station-34,5302,3,4453547,CKB +LINE_17,Station-34,2022-03-11 03:30:00,2022-03-11 03:44:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 03:44:00,2022-03-11 03:57:00,Station-34,5302,3,4453547,CKB +LINE_17,Station-34,2022-03-11 04:00:00,2022-03-11 04:14:00,Station-36,4801,0,4453547,CKB +LINE_17,Station-36,2022-03-11 04:14:00,2022-03-11 04:27:00,Station-34,5302,0,4453547,CKB +LINE_17,Station-34,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,4453547,CKB +LINE_18,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-37,0.06,0,4374469,CKB +LINE_18,Station-37,2022-03-11 00:43:00,2022-03-11 01:33:00,Station-37,20434,10,4374469,CKB +LINE_18,Station-37,2022-03-11 01:43:00,2022-03-11 02:33:00,Station-37,20434,10,4374469,CKB +LINE_18,Station-37,2022-03-11 02:43:00,2022-03-11 03:33:00,Station-37,20434,10,4374469,CKB +LINE_18,Station-37,2022-03-11 03:43:00,2022-03-11 04:33:00,Station-37,20434,0,4374469,CKB +LINE_18,Station-37,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,4374469,CKB +LINE_18,Station-0,2022-03-11 00:13:00,2022-03-11 00:13:00,Station-37,0.06,0,4374474,CKB +LINE_18,Station-37,2022-03-11 00:13:00,2022-03-11 01:03:00,Station-37,20434,10,4374474,CKB +LINE_18,Station-37,2022-03-11 01:13:00,2022-03-11 02:03:00,Station-37,20434,10,4374474,CKB +LINE_18,Station-37,2022-03-11 02:13:00,2022-03-11 03:03:00,Station-37,20434,10,4374474,CKB +LINE_18,Station-37,2022-03-11 03:13:00,2022-03-11 04:03:00,Station-37,20434,0,4374474,CKB +LINE_18,Station-37,2022-03-11 04:03:00,2022-03-11 04:03:00,Station-0,0.06,0,4374474,CKB +LINE_19,Station-0,2022-03-11 00:24:00,2022-03-11 00:24:00,Station-38,0.06,0,4456450,CKB +LINE_19,Station-38,2022-03-11 00:24:00,2022-03-11 00:48:00,Station-39,11.86,4,4456450,CKB +LINE_19,Station-39,2022-03-11 00:52:00,2022-03-11 01:14:00,Station-38,11139,10,4456450,CKB +LINE_19,Station-38,2022-03-11 01:24:00,2022-03-11 01:48:00,Station-39,11.86,4,4456450,CKB +LINE_19,Station-39,2022-03-11 01:52:00,2022-03-11 02:14:00,Station-38,11139,10,4456450,CKB +LINE_19,Station-38,2022-03-11 02:24:00,2022-03-11 02:48:00,Station-39,11.86,4,4456450,CKB +LINE_19,Station-39,2022-03-11 02:52:00,2022-03-11 03:14:00,Station-38,11139,10,4456450,CKB +LINE_19,Station-38,2022-03-11 03:24:00,2022-03-11 03:48:00,Station-39,11.86,4,4456450,CKB +LINE_19,Station-39,2022-03-11 03:52:00,2022-03-11 04:14:00,Station-38,11139,0,4456450,CKB +LINE_19,Station-38,2022-03-11 04:14:00,2022-03-11 04:14:00,Station-0,0.06,0,4456450,CKB +LINE_19,Station-0,2022-03-11 00:22:00,2022-03-11 00:22:00,Station-39,0.06,0,4456458,CKB +LINE_19,Station-39,2022-03-11 00:22:00,2022-03-11 00:44:00,Station-38,11139,10,4456458,CKB +LINE_19,Station-38,2022-03-11 00:54:00,2022-03-11 01:18:00,Station-39,11.86,4,4456458,CKB +LINE_19,Station-39,2022-03-11 01:22:00,2022-03-11 01:44:00,Station-38,11139,10,4456458,CKB +LINE_19,Station-38,2022-03-11 01:54:00,2022-03-11 02:18:00,Station-39,11.86,4,4456458,CKB +LINE_19,Station-39,2022-03-11 02:22:00,2022-03-11 02:44:00,Station-38,11139,10,4456458,CKB +LINE_19,Station-38,2022-03-11 02:54:00,2022-03-11 03:18:00,Station-39,11.86,4,4456458,CKB +LINE_19,Station-39,2022-03-11 03:22:00,2022-03-11 03:44:00,Station-38,11139,10,4456458,CKB +LINE_19,Station-38,2022-03-11 03:54:00,2022-03-11 04:18:00,Station-39,11.86,4,4456458,CKB +LINE_19,Station-39,2022-03-11 04:22:00,2022-03-11 04:44:00,Station-38,11139,0,4456458,CKB +LINE_19,Station-38,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,4456458,CKB +LINE_20,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,4747652,CKB +LINE_20,Station-13,2022-03-11 00:32:00,2022-03-11 00:44:00,Station-40,4212,3,4747652,CKB +LINE_20,Station-40,2022-03-11 00:47:00,2022-03-11 01:16:00,Station-41,13048,0,4747652,CKB +LINE_20,Station-41,2022-03-11 01:16:00,2022-03-11 01:42:00,Station-40,12869,5,4747652,CKB +LINE_20,Station-40,2022-03-11 01:47:00,2022-03-11 02:16:00,Station-41,13048,0,4747652,CKB +LINE_20,Station-41,2022-03-11 02:16:00,2022-03-11 02:42:00,Station-40,12869,5,4747652,CKB +LINE_20,Station-40,2022-03-11 02:47:00,2022-03-11 03:16:00,Station-41,13048,0,4747652,CKB +LINE_20,Station-41,2022-03-11 03:16:00,2022-03-11 03:42:00,Station-40,12869,5,4747652,CKB +LINE_20,Station-40,2022-03-11 03:47:00,2022-03-11 04:16:00,Station-41,13048,0,4747652,CKB +LINE_20,Station-41,2022-03-11 04:16:00,2022-03-11 04:34:00,Station-42,9538,0,4747652,CKB +LINE_20,Station-42,2022-03-11 04:34:00,2022-03-11 04:34:00,Station-0,0.06,0,4747652,CKB +LINE_20,Station-0,2022-03-11 00:17:00,2022-03-11 00:17:00,Station-40,0.06,0,4747662,CKB +LINE_20,Station-40,2022-03-11 00:17:00,2022-03-11 00:46:00,Station-41,13048,0,4747662,CKB +LINE_20,Station-41,2022-03-11 00:46:00,2022-03-11 01:12:00,Station-40,12869,5,4747662,CKB +LINE_20,Station-40,2022-03-11 01:17:00,2022-03-11 01:46:00,Station-41,13048,0,4747662,CKB +LINE_20,Station-41,2022-03-11 01:46:00,2022-03-11 02:12:00,Station-40,12869,5,4747662,CKB +LINE_20,Station-40,2022-03-11 02:17:00,2022-03-11 02:46:00,Station-41,13048,0,4747662,CKB +LINE_20,Station-41,2022-03-11 02:46:00,2022-03-11 03:12:00,Station-40,12869,5,4747662,CKB +LINE_20,Station-40,2022-03-11 03:17:00,2022-03-11 03:46:00,Station-41,13048,0,4747662,CKB +LINE_20,Station-41,2022-03-11 03:46:00,2022-03-11 04:12:00,Station-40,12869,5,4747662,CKB +LINE_20,Station-40,2022-03-11 04:17:00,2022-03-11 04:28:00,Station-13,4316,0,4747662,CKB +LINE_20,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,4747662,CKB +LINE_21,Station-0,2022-03-11 00:49:00,2022-03-11 00:49:00,Station-3,0.06,0,4434343,CKB +LINE_21,Station-3,2022-03-11 00:49:00,2022-03-11 01:04:00,Station-16,10229,0,4434343,CKB +LINE_21,Station-16,2022-03-11 01:04:00,2022-03-11 01:19:00,Station-3,11801,0,4434343,CKB +LINE_21,Station-3,2022-03-11 01:19:00,2022-03-11 01:34:00,Station-16,10229,0,4434343,CKB +LINE_21,Station-16,2022-03-11 01:34:00,2022-03-11 01:49:00,Station-3,11801,0,4434343,CKB +LINE_21,Station-3,2022-03-11 01:49:00,2022-03-11 02:04:00,Station-16,10229,0,4434343,CKB +LINE_21,Station-16,2022-03-11 02:04:00,2022-03-11 02:19:00,Station-3,11801,0,4434343,CKB +LINE_21,Station-3,2022-03-11 02:19:00,2022-03-11 02:34:00,Station-16,10229,0,4434343,CKB +LINE_21,Station-16,2022-03-11 02:34:00,2022-03-11 02:49:00,Station-3,11801,0,4434343,CKB +LINE_21,Station-3,2022-03-11 02:49:00,2022-03-11 03:04:00,Station-16,10229,0,4434343,CKB +LINE_21,Station-16,2022-03-11 03:04:00,2022-03-11 03:19:00,Station-3,11801,0,4434343,CKB +LINE_21,Station-3,2022-03-11 03:19:00,2022-03-11 03:34:00,Station-16,10229,0,4434343,CKB +LINE_21,Station-16,2022-03-11 03:34:00,2022-03-11 03:49:00,Station-3,11801,0,4434343,CKB +LINE_21,Station-3,2022-03-11 03:49:00,2022-03-11 04:04:00,Station-16,10229,0,4434343,CKB +LINE_21,Station-16,2022-03-11 04:04:00,2022-03-11 04:19:00,Station-3,11801,23,4434343,CKB +LINE_22,Station-3,2022-03-11 04:42:00,2022-03-11 05:04:00,Station-43,6.81,0,4434343,CKB +LINE_22,Station-43,2022-03-11 05:04:00,2022-03-11 05:04:00,Station-0,0.06,0,4434343,CKB +LINE_8,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,4434899,CKB +LINE_8,Station-13,2022-03-11 00:32:00,2022-03-11 00:57:00,Station-21,11545,6,4434899,CKB +LINE_8,Station-21,2022-03-11 01:03:00,2022-03-11 01:46:00,Station-20,20579,1,4434899,CKB +LINE_8,Station-20,2022-03-11 01:47:00,2022-03-11 02:25:00,Station-21,20641,8,4434899,CKB +LINE_8,Station-21,2022-03-11 02:33:00,2022-03-11 03:16:00,Station-20,20579,1,4434899,CKB +LINE_8,Station-20,2022-03-11 03:17:00,2022-03-11 03:55:00,Station-21,20641,8,4434899,CKB +LINE_8,Station-21,2022-03-11 04:03:00,2022-03-11 04:28:00,Station-13,11499,0,4434899,CKB +LINE_8,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,4434899,CKB +LINE_8,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-21,0.06,0,4434904,CKB +LINE_8,Station-21,2022-03-11 00:33:00,2022-03-11 01:16:00,Station-20,20579,1,4434904,CKB +LINE_8,Station-20,2022-03-11 01:17:00,2022-03-11 01:55:00,Station-21,20641,8,4434904,CKB +LINE_8,Station-21,2022-03-11 02:03:00,2022-03-11 02:46:00,Station-20,20579,1,4434904,CKB +LINE_8,Station-20,2022-03-11 02:47:00,2022-03-11 03:25:00,Station-21,20641,8,4434904,CKB +LINE_8,Station-21,2022-03-11 03:33:00,2022-03-11 04:16:00,Station-20,20579,1,4434904,CKB +LINE_8,Station-20,2022-03-11 04:17:00,2022-03-11 04:51:00,Station-44,18752,0,4434904,CKB +LINE_8,Station-44,2022-03-11 04:51:00,2022-03-11 04:51:00,Station-0,0.06,0,4434904,CKB +LINE_23,Station-0,2022-03-11 00:34:00,2022-03-11 00:34:00,Station-45,0.06,0,4619768,CKB +LINE_23,Station-45,2022-03-11 00:34:00,2022-03-11 01:00:00,Station-46,9016,0,4619768,CKB +LINE_23,Station-46,2022-03-11 01:00:00,2022-03-11 01:27:00,Station-45,10083,7,4619768,CKB +LINE_23,Station-45,2022-03-11 01:34:00,2022-03-11 02:00:00,Station-46,9016,0,4619768,CKB +LINE_23,Station-46,2022-03-11 02:00:00,2022-03-11 02:27:00,Station-45,10083,7,4619768,CKB +LINE_23,Station-45,2022-03-11 02:34:00,2022-03-11 03:00:00,Station-46,9016,0,4619768,CKB +LINE_23,Station-46,2022-03-11 03:00:00,2022-03-11 03:27:00,Station-45,10083,7,4619768,CKB +LINE_23,Station-45,2022-03-11 03:34:00,2022-03-11 04:00:00,Station-46,9016,0,4619768,CKB +LINE_23,Station-46,2022-03-11 04:00:00,2022-03-11 04:27:00,Station-45,10083,0,4619768,CKB +LINE_23,Station-45,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,4619768,CKB +LINE_23,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-46,0.06,0,4619993,CKB +LINE_23,Station-46,2022-03-11 00:30:00,2022-03-11 00:57:00,Station-45,10083,7,4619993,CKB +LINE_23,Station-45,2022-03-11 01:04:00,2022-03-11 01:30:00,Station-46,9016,0,4619993,CKB +LINE_23,Station-46,2022-03-11 01:30:00,2022-03-11 01:57:00,Station-45,10083,7,4619993,CKB +LINE_23,Station-45,2022-03-11 02:04:00,2022-03-11 02:30:00,Station-46,9016,0,4619993,CKB +LINE_23,Station-46,2022-03-11 02:30:00,2022-03-11 02:57:00,Station-45,10083,7,4619993,CKB +LINE_23,Station-45,2022-03-11 03:04:00,2022-03-11 03:30:00,Station-46,9016,0,4619993,CKB +LINE_23,Station-46,2022-03-11 03:30:00,2022-03-11 03:57:00,Station-45,10083,7,4619993,CKB +LINE_23,Station-45,2022-03-11 04:04:00,2022-03-11 04:30:00,Station-46,9016,0,4619993,CKB +LINE_23,Station-46,2022-03-11 04:30:00,2022-03-11 04:57:00,Station-45,10083,0,4619993,CKB +LINE_23,Station-45,2022-03-11 04:57:00,2022-03-11 04:57:00,Station-0,0.06,0,4619993,CKB +LINE_24,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,4374746,CKB +LINE_24,Station-21,2022-03-11 00:31:00,2022-03-11 00:44:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 00:44:00,2022-03-11 00:56:00,Station-21,5362,5,4374746,CKB +LINE_24,Station-21,2022-03-11 01:01:00,2022-03-11 01:14:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 01:14:00,2022-03-11 01:26:00,Station-21,5362,5,4374746,CKB +LINE_24,Station-21,2022-03-11 01:31:00,2022-03-11 01:44:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 01:44:00,2022-03-11 01:56:00,Station-21,5362,5,4374746,CKB +LINE_24,Station-21,2022-03-11 02:01:00,2022-03-11 02:14:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 02:14:00,2022-03-11 02:26:00,Station-21,5362,5,4374746,CKB +LINE_24,Station-21,2022-03-11 02:31:00,2022-03-11 02:44:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 02:44:00,2022-03-11 02:56:00,Station-21,5362,5,4374746,CKB +LINE_24,Station-21,2022-03-11 03:01:00,2022-03-11 03:14:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 03:14:00,2022-03-11 03:26:00,Station-21,5362,5,4374746,CKB +LINE_24,Station-21,2022-03-11 03:31:00,2022-03-11 03:44:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 03:44:00,2022-03-11 03:56:00,Station-21,5362,5,4374746,CKB +LINE_24,Station-21,2022-03-11 04:01:00,2022-03-11 04:14:00,Station-47,4872,0,4374746,CKB +LINE_24,Station-47,2022-03-11 04:14:00,2022-03-11 04:26:00,Station-21,5362,0,4374746,CKB +LINE_24,Station-21,2022-03-11 04:26:00,2022-03-11 04:26:00,Station-0,0.06,0,4374746,CKB +LINE_25,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,4374869,CKB +LINE_25,Station-21,2022-03-11 00:31:00,2022-03-11 00:45:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 00:47:00,2022-03-11 01:01:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 01:01:00,2022-03-11 01:15:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 01:17:00,2022-03-11 01:31:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 01:31:00,2022-03-11 01:45:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 01:47:00,2022-03-11 02:01:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 02:01:00,2022-03-11 02:15:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 02:17:00,2022-03-11 02:31:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 02:31:00,2022-03-11 02:45:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 02:47:00,2022-03-11 03:01:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 03:01:00,2022-03-11 03:15:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 03:17:00,2022-03-11 03:31:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 03:31:00,2022-03-11 03:45:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 03:47:00,2022-03-11 04:01:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 04:01:00,2022-03-11 04:15:00,Station-48,5225,2,4374869,CKB +LINE_25,Station-48,2022-03-11 04:17:00,2022-03-11 04:31:00,Station-21,7617,0,4374869,CKB +LINE_25,Station-21,2022-03-11 04:31:00,2022-03-11 04:31:00,Station-0,0.06,0,4374869,CKB +LINE_26,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-49,0.06,0,4375015,CKB +LINE_26,Station-49,2022-03-11 00:43:00,2022-03-11 00:53:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 00:53:00,2022-03-11 01:03:00,Station-49,4408,10,4375015,CKB +LINE_26,Station-49,2022-03-11 01:13:00,2022-03-11 01:23:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 01:23:00,2022-03-11 01:33:00,Station-49,4408,10,4375015,CKB +LINE_26,Station-49,2022-03-11 01:43:00,2022-03-11 01:53:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 01:53:00,2022-03-11 02:03:00,Station-49,4408,10,4375015,CKB +LINE_26,Station-49,2022-03-11 02:13:00,2022-03-11 02:23:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 02:23:00,2022-03-11 02:33:00,Station-49,4408,10,4375015,CKB +LINE_26,Station-49,2022-03-11 02:43:00,2022-03-11 02:53:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 02:53:00,2022-03-11 03:03:00,Station-49,4408,10,4375015,CKB +LINE_26,Station-49,2022-03-11 03:13:00,2022-03-11 03:23:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 03:23:00,2022-03-11 03:33:00,Station-49,4408,10,4375015,CKB +LINE_26,Station-49,2022-03-11 03:43:00,2022-03-11 03:53:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 03:53:00,2022-03-11 04:03:00,Station-49,4408,10,4375015,CKB +LINE_26,Station-49,2022-03-11 04:13:00,2022-03-11 04:23:00,Station-50,4507,0,4375015,CKB +LINE_26,Station-50,2022-03-11 04:23:00,2022-03-11 04:33:00,Station-49,4408,0,4375015,CKB +LINE_26,Station-49,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,4375015,CKB +LINE_0,Station-0,2022-03-11 21:31:00,2022-03-11 21:31:00,Station-1,0.06,0,4454947,CKB +LINE_0,Station-1,2022-03-11 21:31:00,2022-03-11 22:04:00,Station-2,14519,4,4454947,CKB +LINE_0,Station-2,2022-03-11 22:08:00,2022-03-11 22:43:00,Station-1,13541,8,4454947,CKB +LINE_0,Station-1,2022-03-11 22:51:00,2022-03-11 23:24:00,Station-2,14519,4,4454947,CKB +LINE_0,Station-2,2022-03-11 23:28:00,2022-03-12 00:03:00,Station-1,13541,8,4454947,CKB +LINE_0,Station-1,2022-03-12 00:11:00,2022-03-12 00:44:00,Station-2,14519,0,4454947,CKB +LINE_1,Station-2,2022-03-12 00:44:00,2022-03-12 00:54:00,Station-3,4.1,25,4454947,CKB +LINE_1,Station-3,2022-03-12 01:19:00,2022-03-12 01:42:00,Station-4,8.36,6,4454947,CKB +LINE_1,Station-4,2022-03-12 01:48:00,2022-03-12 02:06:00,Station-3,9067,13,4454947,CKB +LINE_1,Station-3,2022-03-12 02:19:00,2022-03-12 02:42:00,Station-4,8.36,6,4454947,CKB +LINE_1,Station-4,2022-03-12 02:48:00,2022-03-12 03:06:00,Station-3,9067,13,4454947,CKB +LINE_1,Station-3,2022-03-12 03:19:00,2022-03-12 03:42:00,Station-4,8.36,6,4454947,CKB +LINE_1,Station-4,2022-03-12 03:48:00,2022-03-12 04:06:00,Station-3,9067,13,4454947,CKB +LINE_1,Station-3,2022-03-12 04:19:00,2022-03-12 04:42:00,Station-4,8.36,6,4454947,CKB +LINE_1,Station-4,2022-03-12 04:48:00,2022-03-12 05:06:00,Station-3,9067,13,4454947,CKB +LINE_1,Station-3,2022-03-12 05:19:00,2022-03-12 05:42:00,Station-4,8.36,16,4454947,CKB +LINE_22,Station-4,2022-03-12 05:58:00,2022-03-12 06:34:00,Station-43,12968,0,4454947,CKB +LINE_22,Station-43,2022-03-12 06:34:00,2022-03-12 06:34:00,Station-0,0.06,0,4454947,CKB +LINE_0,Station-0,2022-03-11 22:11:00,2022-03-11 22:11:00,Station-1,0.06,0,4454952,CKB +LINE_0,Station-1,2022-03-11 22:11:00,2022-03-11 22:44:00,Station-2,14519,4,4454952,CKB +LINE_0,Station-2,2022-03-11 22:48:00,2022-03-11 23:23:00,Station-1,13541,8,4454952,CKB +LINE_0,Station-1,2022-03-11 23:31:00,2022-03-12 00:04:00,Station-2,14519,4,4454952,CKB +LINE_0,Station-2,2022-03-12 00:08:00,2022-03-12 00:39:00,Station-5,12213,0,4454952,CKB +LINE_1,Station-5,2022-03-12 00:39:00,2022-03-12 00:47:00,Station-3,4.0,2,4454952,CKB +LINE_1,Station-3,2022-03-12 00:49:00,2022-03-12 01:12:00,Station-4,8.36,6,4454952,CKB +LINE_1,Station-4,2022-03-12 01:18:00,2022-03-12 01:36:00,Station-3,9067,13,4454952,CKB +LINE_1,Station-3,2022-03-12 01:49:00,2022-03-12 02:12:00,Station-4,8.36,6,4454952,CKB +LINE_1,Station-4,2022-03-12 02:18:00,2022-03-12 02:36:00,Station-3,9067,13,4454952,CKB +LINE_1,Station-3,2022-03-12 02:49:00,2022-03-12 03:12:00,Station-4,8.36,6,4454952,CKB +LINE_1,Station-4,2022-03-12 03:18:00,2022-03-12 03:36:00,Station-3,9067,13,4454952,CKB +LINE_1,Station-3,2022-03-12 03:49:00,2022-03-12 04:12:00,Station-4,8.36,6,4454952,CKB +LINE_1,Station-4,2022-03-12 04:18:00,2022-03-12 04:36:00,Station-3,9067,13,4454952,CKB +LINE_1,Station-3,2022-03-12 04:49:00,2022-03-12 05:12:00,Station-4,8.36,6,4454952,CKB +LINE_1,Station-4,2022-03-12 05:18:00,2022-03-12 05:36:00,Station-3,9067,0,4454952,CKB +LINE_1,Station-3,2022-03-12 05:36:00,2022-03-12 05:36:00,Station-0,0.06,0,4454952,CKB +LINE_2,Station-0,2022-03-11 21:06:00,2022-03-11 21:06:00,Station-6,0.06,0,4664738,CKB +LINE_2,Station-6,2022-03-11 21:06:00,2022-03-11 21:34:00,Station-7,13018,19,4664738,CKB +LINE_2,Station-7,2022-03-11 21:53:00,2022-03-11 22:13:00,Station-8,10332,17,4664738,CKB +LINE_2,Station-8,2022-03-11 22:30:00,2022-03-11 22:54:00,Station-7,10.48,19,4664738,CKB +LINE_2,Station-7,2022-03-11 23:13:00,2022-03-11 23:33:00,Station-8,10332,17,4664738,CKB +LINE_2,Station-8,2022-03-11 23:50:00,2022-03-12 00:14:00,Station-7,10.48,8,4664738,CKB +LINE_2,Station-7,2022-03-12 00:22:00,2022-03-12 00:27:00,Station-58,2533,2,4664738,CKB +LINE_3,Station-58,2022-03-12 00:29:00,2022-03-12 00:47:00,Station-10,7.58,0,4664738,CKB +LINE_3,Station-10,2022-03-12 00:47:00,2022-03-12 01:14:00,Station-11,12841,3,4664738,CKB +LINE_3,Station-11,2022-03-12 01:17:00,2022-03-12 01:47:00,Station-10,14281,0,4664738,CKB +LINE_3,Station-10,2022-03-12 01:47:00,2022-03-12 02:14:00,Station-11,12841,3,4664738,CKB +LINE_3,Station-11,2022-03-12 02:17:00,2022-03-12 02:47:00,Station-10,14281,0,4664738,CKB +LINE_3,Station-10,2022-03-12 02:47:00,2022-03-12 03:14:00,Station-11,12841,3,4664738,CKB +LINE_3,Station-11,2022-03-12 03:17:00,2022-03-12 03:47:00,Station-10,14281,0,4664738,CKB +LINE_3,Station-10,2022-03-12 03:47:00,2022-03-12 04:14:00,Station-11,12841,3,4664738,CKB +LINE_3,Station-11,2022-03-12 04:17:00,2022-03-12 04:47:00,Station-10,14281,0,4664738,CKB +LINE_3,Station-10,2022-03-12 04:47:00,2022-03-12 05:14:00,Station-11,12841,3,4664738,CKB +LINE_3,Station-11,2022-03-12 05:17:00,2022-03-12 05:47:00,Station-10,14281,0,4664738,CKB +LINE_3,Station-10,2022-03-12 05:47:00,2022-03-12 05:47:00,Station-0,0.06,0,4664738,CKB +LINE_2,Station-0,2022-03-11 20:26:00,2022-03-11 20:26:00,Station-6,0.06,0,4762763,CKB +LINE_2,Station-6,2022-03-11 20:26:00,2022-03-11 20:56:00,Station-12,14097,14,4762763,CKB +LINE_2,Station-12,2022-03-11 21:10:00,2022-03-11 21:38:00,Station-6,13.19,8,4762763,CKB +LINE_2,Station-6,2022-03-11 21:46:00,2022-03-11 22:14:00,Station-7,13018,19,4762763,CKB +LINE_2,Station-7,2022-03-11 22:33:00,2022-03-11 22:53:00,Station-8,10332,17,4762763,CKB +LINE_2,Station-8,2022-03-11 23:10:00,2022-03-11 23:34:00,Station-7,10.48,19,4762763,CKB +LINE_2,Station-7,2022-03-11 23:53:00,2022-03-12 00:13:00,Station-8,10332,2,4762763,CKB +LINE_2,Station-8,2022-03-12 00:15:00,2022-03-12 00:16:00,Station-10,506,1,4762763,CKB +LINE_3,Station-10,2022-03-12 00:17:00,2022-03-12 00:44:00,Station-11,12841,3,4762763,CKB +LINE_3,Station-11,2022-03-12 00:47:00,2022-03-12 01:17:00,Station-10,14281,0,4762763,CKB +LINE_3,Station-10,2022-03-12 01:17:00,2022-03-12 01:44:00,Station-11,12841,3,4762763,CKB +LINE_3,Station-11,2022-03-12 01:47:00,2022-03-12 02:17:00,Station-10,14281,0,4762763,CKB +LINE_3,Station-10,2022-03-12 02:17:00,2022-03-12 02:44:00,Station-11,12841,3,4762763,CKB +LINE_3,Station-11,2022-03-12 02:47:00,2022-03-12 03:17:00,Station-10,14281,0,4762763,CKB +LINE_3,Station-10,2022-03-12 03:17:00,2022-03-12 03:44:00,Station-11,12841,3,4762763,CKB +LINE_3,Station-11,2022-03-12 03:47:00,2022-03-12 04:17:00,Station-10,14281,0,4762763,CKB +LINE_3,Station-10,2022-03-12 04:17:00,2022-03-12 04:44:00,Station-11,12841,3,4762763,CKB +LINE_3,Station-11,2022-03-12 04:47:00,2022-03-12 05:17:00,Station-10,14281,0,4762763,CKB +LINE_3,Station-10,2022-03-12 05:17:00,2022-03-12 05:29:00,Station-58,5474,0,4762763,CKB +LINE_3,Station-58,2022-03-12 05:29:00,2022-03-12 05:29:00,Station-0,0.06,0,4762763,CKB +LINE_5,Station-0,2022-03-11 22:56:00,2022-03-11 22:56:00,Station-14,0.06,0,4617429,CKB +LINE_5,Station-14,2022-03-11 22:56:00,2022-03-11 23:08:00,Station-15,5882,3,4617429,CKB +LINE_5,Station-15,2022-03-11 23:11:00,2022-03-11 23:25:00,Station-14,6232,0,4617429,CKB +LINE_5,Station-14,2022-03-11 23:25:00,2022-03-11 23:38:00,Station-15,6086,3,4617429,CKB +LINE_5,Station-15,2022-03-11 23:41:00,2022-03-11 23:55:00,Station-14,6232,0,4617429,CKB +LINE_5,Station-14,2022-03-11 23:55:00,2022-03-12 00:08:00,Station-15,6086,0,4617429,CKB +LINE_5,Station-15,2022-03-12 00:08:00,2022-03-12 00:08:00,Station-0,0.06,0,4617429,CKB +LINE_6,Station-0,2022-03-11 05:05:00,2022-03-11 05:05:00,Station-16,0.06,0,4426848,CKB +LINE_6,Station-16,2022-03-11 05:05:00,2022-03-11 05:14:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 05:14:00,2022-03-11 05:23:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 05:25:00,2022-03-11 05:34:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 05:34:00,2022-03-11 05:43:00,Station-16,5139,23,4426848,CKB +LINE_6,Station-16,2022-03-11 06:06:00,2022-03-11 06:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 06:15:00,2022-03-11 06:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 06:26:00,2022-03-11 06:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 06:35:00,2022-03-11 06:44:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 06:46:00,2022-03-11 06:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 06:55:00,2022-03-11 07:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 07:06:00,2022-03-11 07:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 07:15:00,2022-03-11 07:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 07:26:00,2022-03-11 07:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 07:35:00,2022-03-11 07:44:00,Station-16,5139,22,4426848,CKB +LINE_6,Station-16,2022-03-11 08:06:00,2022-03-11 08:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 08:15:00,2022-03-11 08:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 08:26:00,2022-03-11 08:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 08:35:00,2022-03-11 08:44:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 08:46:00,2022-03-11 08:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 08:55:00,2022-03-11 09:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 09:06:00,2022-03-11 09:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 09:15:00,2022-03-11 09:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 09:26:00,2022-03-11 09:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 09:35:00,2022-03-11 09:44:00,Station-16,5139,22,4426848,CKB +LINE_6,Station-16,2022-03-11 10:06:00,2022-03-11 10:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 10:15:00,2022-03-11 10:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 10:26:00,2022-03-11 10:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 10:35:00,2022-03-11 10:44:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 10:46:00,2022-03-11 10:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 10:55:00,2022-03-11 11:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 11:06:00,2022-03-11 11:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 11:15:00,2022-03-11 11:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 11:26:00,2022-03-11 11:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 11:35:00,2022-03-11 11:44:00,Station-16,5139,22,4426848,CKB +LINE_6,Station-16,2022-03-11 12:06:00,2022-03-11 12:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 12:15:00,2022-03-11 12:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 12:26:00,2022-03-11 12:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 12:35:00,2022-03-11 12:44:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 12:46:00,2022-03-11 12:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 12:55:00,2022-03-11 13:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 13:06:00,2022-03-11 13:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 13:15:00,2022-03-11 13:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 13:26:00,2022-03-11 13:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 13:35:00,2022-03-11 13:44:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 13:46:00,2022-03-11 13:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 13:55:00,2022-03-11 14:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 14:06:00,2022-03-11 14:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 14:15:00,2022-03-11 14:24:00,Station-16,5139,22,4426848,CKB +LINE_6,Station-16,2022-03-11 14:46:00,2022-03-11 14:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 14:55:00,2022-03-11 15:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 15:06:00,2022-03-11 15:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 15:15:00,2022-03-11 15:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 15:26:00,2022-03-11 15:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 15:35:00,2022-03-11 15:44:00,Station-16,5139,22,4426848,CKB +LINE_6,Station-16,2022-03-11 16:06:00,2022-03-11 16:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 16:15:00,2022-03-11 16:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 16:26:00,2022-03-11 16:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 16:35:00,2022-03-11 16:44:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 16:46:00,2022-03-11 16:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 16:55:00,2022-03-11 17:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 17:06:00,2022-03-11 17:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 17:15:00,2022-03-11 17:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 17:26:00,2022-03-11 17:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 17:35:00,2022-03-11 17:44:00,Station-16,5139,22,4426848,CKB +LINE_6,Station-16,2022-03-11 18:06:00,2022-03-11 18:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 18:15:00,2022-03-11 18:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 18:26:00,2022-03-11 18:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 18:35:00,2022-03-11 18:44:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 18:46:00,2022-03-11 18:55:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 18:55:00,2022-03-11 19:04:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 19:06:00,2022-03-11 19:15:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 19:15:00,2022-03-11 19:24:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 19:26:00,2022-03-11 19:35:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 19:35:00,2022-03-11 19:44:00,Station-16,5139,21,4426848,CKB +LINE_6,Station-16,2022-03-11 20:05:00,2022-03-11 20:14:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 20:14:00,2022-03-11 20:23:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 20:25:00,2022-03-11 20:34:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 20:34:00,2022-03-11 20:43:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 20:45:00,2022-03-11 20:54:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 20:54:00,2022-03-11 21:03:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 21:05:00,2022-03-11 21:14:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 21:14:00,2022-03-11 21:23:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 21:25:00,2022-03-11 21:34:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 21:34:00,2022-03-11 21:43:00,Station-16,5139,22,4426848,CKB +LINE_6,Station-16,2022-03-11 22:05:00,2022-03-11 22:14:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 22:14:00,2022-03-11 22:23:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 22:25:00,2022-03-11 22:34:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 22:34:00,2022-03-11 22:43:00,Station-16,5139,2,4426848,CKB +LINE_6,Station-16,2022-03-11 22:45:00,2022-03-11 22:54:00,Station-17,4781,0,4426848,CKB +LINE_6,Station-17,2022-03-11 22:54:00,2022-03-11 23:03:00,Station-16,5139,0,4426848,CKB +LINE_6,Station-16,2022-03-11 23:03:00,2022-03-11 23:03:00,Station-0,0.06,0,4426848,CKB +LINE_9,Station-22,2022-03-11 05:15:00,2022-03-11 06:01:00,Station-23,17.9,0,4317628,VDL +LINE_9,Station-23,2022-03-11 06:01:00,2022-03-11 06:15:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 06:23:00,2022-03-11 06:37:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 06:41:00,2022-03-11 06:55:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 07:03:00,2022-03-11 07:17:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 07:21:00,2022-03-11 07:35:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 07:43:00,2022-03-11 07:57:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 08:01:00,2022-03-11 08:15:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 08:23:00,2022-03-11 08:37:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 08:41:00,2022-03-11 08:55:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 09:03:00,2022-03-11 09:17:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 09:21:00,2022-03-11 09:35:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 09:43:00,2022-03-11 09:57:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 10:01:00,2022-03-11 10:15:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 10:23:00,2022-03-11 10:37:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 10:41:00,2022-03-11 10:55:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 11:03:00,2022-03-11 11:17:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 11:21:00,2022-03-11 11:35:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 11:43:00,2022-03-11 11:57:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 12:01:00,2022-03-11 12:15:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 12:23:00,2022-03-11 12:37:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 12:41:00,2022-03-11 12:55:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 13:03:00,2022-03-11 13:17:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 13:21:00,2022-03-11 13:35:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 13:43:00,2022-03-11 13:57:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 14:01:00,2022-03-11 14:15:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 14:23:00,2022-03-11 14:37:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 14:41:00,2022-03-11 14:55:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 15:03:00,2022-03-11 15:17:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 15:21:00,2022-03-11 15:35:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 15:43:00,2022-03-11 15:57:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 16:01:00,2022-03-11 16:15:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 16:23:00,2022-03-11 16:37:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 16:41:00,2022-03-11 16:55:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 17:03:00,2022-03-11 17:17:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 17:21:00,2022-03-11 17:35:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 17:43:00,2022-03-11 17:57:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 18:01:00,2022-03-11 18:15:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 18:23:00,2022-03-11 18:37:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 18:41:00,2022-03-11 18:55:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 19:03:00,2022-03-11 19:17:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 19:21:00,2022-03-11 19:35:00,Station-23,4637,8,4317628,VDL +LINE_9,Station-23,2022-03-11 19:43:00,2022-03-11 19:57:00,Station-23,4637,4,4317628,VDL +LINE_9,Station-23,2022-03-11 20:01:00,2022-03-11 20:14:00,Station-23,4637,9,4317628,VDL +LINE_9,Station-23,2022-03-11 20:23:00,2022-03-11 20:36:00,Station-23,4637,0,4317628,VDL +LINE_9,Station-23,2022-03-11 20:36:00,2022-03-11 21:15:00,Station-22,19.8,0,4317628,VDL +LINE_10,Station-0,2022-03-11 04:56:00,2022-03-11 04:56:00,Station-24,0.06,18,4425671,CKB +LINE_10,Station-24,2022-03-11 05:14:00,2022-03-11 05:20:00,Station-25,3.29,0,4425671,CKB +LINE_10,Station-25,2022-03-11 05:20:00,2022-03-11 05:24:00,Station-24,2954,20,4425671,CKB +LINE_10,Station-24,2022-03-11 05:44:00,2022-03-11 05:50:00,Station-25,3.29,0,4425671,CKB +LINE_10,Station-25,2022-03-11 05:50:00,2022-03-11 05:54:00,Station-24,2954,5,4425671,CKB +LINE_10,Station-24,2022-03-11 05:59:00,2022-03-11 06:06:00,Station-25,3.29,2,4425671,CKB +LINE_10,Station-25,2022-03-11 06:08:00,2022-03-11 06:13:00,Station-24,2954,19,4425671,CKB +LINE_10,Station-24,2022-03-11 06:32:00,2022-03-11 06:39:00,Station-25,3.29,1,4425671,CKB +LINE_10,Station-25,2022-03-11 06:40:00,2022-03-11 06:45:00,Station-24,2954,7,4425671,CKB +LINE_10,Station-24,2022-03-11 06:52:00,2022-03-11 06:59:00,Station-25,3.29,1,4425671,CKB +LINE_10,Station-25,2022-03-11 07:00:00,2022-03-11 07:05:00,Station-24,2954,7,4425671,CKB +LINE_10,Station-24,2022-03-11 07:12:00,2022-03-11 07:19:00,Station-25,3.29,1,4425671,CKB +LINE_10,Station-25,2022-03-11 07:20:00,2022-03-11 07:25:00,Station-24,2954,7,4425671,CKB +LINE_10,Station-24,2022-03-11 07:32:00,2022-03-11 07:39:00,Station-25,3.29,1,4425671,CKB +LINE_10,Station-25,2022-03-11 07:40:00,2022-03-11 07:45:00,Station-24,2954,295,4425671,CKB +LINE_10,Station-24,2022-03-11 12:40:00,2022-03-11 12:47:00,Station-25,3.29,2,4425671,CKB +LINE_10,Station-25,2022-03-11 12:49:00,2022-03-11 12:54:00,Station-24,2954,46,4425671,CKB +LINE_10,Station-24,2022-03-11 13:40:00,2022-03-11 13:47:00,Station-25,3.29,2,4425671,CKB +LINE_10,Station-25,2022-03-11 13:49:00,2022-03-11 13:54:00,Station-24,2954,434,4425671,CKB +LINE_10,Station-24,2022-03-11 21:08:00,2022-03-11 21:08:00,Station-0,0.06,0,4425671,CKB +LINE_11,Station-0,2022-03-11 07:20:00,2022-03-11 07:20:00,Station-26,0.06,0,4448153,CKB +LINE_11,Station-26,2022-03-11 07:20:00,2022-03-11 07:50:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 08:00:00,2022-03-11 08:30:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 08:40:00,2022-03-11 09:10:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 09:20:00,2022-03-11 09:50:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 10:00:00,2022-03-11 10:30:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 10:40:00,2022-03-11 11:10:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 11:20:00,2022-03-11 11:50:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 12:00:00,2022-03-11 12:30:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 12:40:00,2022-03-11 13:10:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 13:20:00,2022-03-11 13:50:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 14:00:00,2022-03-11 14:30:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 14:40:00,2022-03-11 15:10:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 15:20:00,2022-03-11 15:50:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 16:00:00,2022-03-11 16:30:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 16:40:00,2022-03-11 17:10:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 17:20:00,2022-03-11 17:50:00,Station-26,9266,10,4448153,CKB +LINE_11,Station-26,2022-03-11 18:00:00,2022-03-11 18:30:00,Station-26,9266,0,4448153,CKB +LINE_11,Station-26,2022-03-11 18:30:00,2022-03-11 18:30:00,Station-0,0.06,0,4448153,CKB +LINE_12,Station-0,2022-03-11 07:10:00,2022-03-11 07:10:00,Station-27,0.06,0,4733898,CKB +LINE_12,Station-27,2022-03-11 07:10:00,2022-03-11 07:18:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 07:28:00,2022-03-11 07:40:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 07:40:00,2022-03-11 07:48:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 07:58:00,2022-03-11 08:10:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 08:10:00,2022-03-11 08:18:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 08:28:00,2022-03-11 08:40:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 08:40:00,2022-03-11 08:48:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 08:58:00,2022-03-11 09:10:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 09:10:00,2022-03-11 09:18:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 09:28:00,2022-03-11 09:40:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 09:40:00,2022-03-11 09:48:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 09:58:00,2022-03-11 10:10:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 10:10:00,2022-03-11 10:18:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 10:28:00,2022-03-11 10:40:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 10:40:00,2022-03-11 10:48:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 10:58:00,2022-03-11 11:10:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 11:10:00,2022-03-11 11:18:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 11:28:00,2022-03-11 11:40:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 11:40:00,2022-03-11 11:48:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 11:58:00,2022-03-11 12:10:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 12:10:00,2022-03-11 12:18:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 12:28:00,2022-03-11 12:40:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 12:40:00,2022-03-11 12:48:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 12:58:00,2022-03-11 13:10:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 13:10:00,2022-03-11 13:18:00,Station-28,2169,10,4733898,CKB +LINE_12,Station-28,2022-03-11 13:28:00,2022-03-11 13:40:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 13:40:00,2022-03-11 13:48:00,Station-28,2169,8,4733898,CKB +LINE_12,Station-28,2022-03-11 13:56:00,2022-03-11 14:10:00,Station-27,2952,0,4733898,CKB +LINE_12,Station-27,2022-03-11 14:10:00,2022-03-11 14:19:00,Station-28,2169,14,4733898,CKB +LINE_12,Station-28,2022-03-11 14:33:00,2022-03-11 14:47:00,Station-27,2952,3,4733898,CKB +LINE_12,Station-27,2022-03-11 14:50:00,2022-03-11 14:59:00,Station-28,2169,14,4733898,CKB +LINE_12,Station-28,2022-03-11 15:13:00,2022-03-11 15:27:00,Station-27,2952,3,4733898,CKB +LINE_12,Station-27,2022-03-11 15:30:00,2022-03-11 15:39:00,Station-28,2169,14,4733898,CKB +LINE_12,Station-28,2022-03-11 15:53:00,2022-03-11 16:07:00,Station-27,2952,3,4733898,CKB +LINE_12,Station-27,2022-03-11 16:10:00,2022-03-11 16:19:00,Station-28,2169,14,4733898,CKB +LINE_12,Station-28,2022-03-11 16:33:00,2022-03-11 16:47:00,Station-27,2952,3,4733898,CKB +LINE_12,Station-27,2022-03-11 16:50:00,2022-03-11 16:59:00,Station-28,2169,14,4733898,CKB +LINE_12,Station-28,2022-03-11 17:13:00,2022-03-11 17:27:00,Station-27,2952,3,4733898,CKB +LINE_12,Station-27,2022-03-11 17:30:00,2022-03-11 17:39:00,Station-28,2169,13,4733898,CKB +LINE_12,Station-28,2022-03-11 17:52:00,2022-03-11 18:05:00,Station-27,2952,5,4733898,CKB +LINE_12,Station-27,2022-03-11 18:10:00,2022-03-11 18:18:00,Station-28,2169,0,4733898,CKB +LINE_12,Station-28,2022-03-11 18:18:00,2022-03-11 18:18:00,Station-0,0.06,0,4733898,CKB +LINE_12,Station-0,2022-03-11 14:13:00,2022-03-11 14:13:00,Station-28,0.06,0,4734203,CKB +LINE_12,Station-28,2022-03-11 14:13:00,2022-03-11 14:27:00,Station-27,2952,3,4734203,CKB +LINE_12,Station-27,2022-03-11 14:30:00,2022-03-11 14:39:00,Station-28,2169,14,4734203,CKB +LINE_12,Station-28,2022-03-11 14:53:00,2022-03-11 15:07:00,Station-27,2952,3,4734203,CKB +LINE_12,Station-27,2022-03-11 15:10:00,2022-03-11 15:19:00,Station-28,2169,14,4734203,CKB +LINE_12,Station-28,2022-03-11 15:33:00,2022-03-11 15:47:00,Station-27,2952,3,4734203,CKB +LINE_12,Station-27,2022-03-11 15:50:00,2022-03-11 15:59:00,Station-28,2169,14,4734203,CKB +LINE_12,Station-28,2022-03-11 16:13:00,2022-03-11 16:27:00,Station-27,2952,3,4734203,CKB +LINE_12,Station-27,2022-03-11 16:30:00,2022-03-11 16:39:00,Station-28,2169,14,4734203,CKB +LINE_12,Station-28,2022-03-11 16:53:00,2022-03-11 17:07:00,Station-27,2952,3,4734203,CKB +LINE_12,Station-27,2022-03-11 17:10:00,2022-03-11 17:19:00,Station-28,2169,14,4734203,CKB +LINE_12,Station-28,2022-03-11 17:33:00,2022-03-11 17:47:00,Station-27,2952,3,4734203,CKB +LINE_12,Station-27,2022-03-11 17:50:00,2022-03-11 17:59:00,Station-28,2169,14,4734203,CKB +LINE_12,Station-28,2022-03-11 18:13:00,2022-03-11 18:25:00,Station-27,2952,0,4734203,CKB +LINE_12,Station-27,2022-03-11 18:25:00,2022-03-11 18:25:00,Station-0,0.06,0,4734203,CKB +LINE_13,Station-0,2022-03-12 00:23:00,2022-03-12 00:23:00,Station-29,0.06,0,4318160,CKB +LINE_13,Station-29,2022-03-12 00:23:00,2022-03-12 00:30:00,Station-30,2577,9,4318160,CKB +LINE_14,Station-30,2022-03-12 00:39:00,2022-03-12 00:54:00,Station-31,5937,9,4318160,CKB +LINE_14,Station-31,2022-03-12 01:03:00,2022-03-12 01:17:00,Station-30,6.19,0,4318160,CKB +LINE_13,Station-30,2022-03-12 01:17:00,2022-03-12 01:23:00,Station-29,2555,0,4318160,CKB +LINE_13,Station-29,2022-03-12 01:23:00,2022-03-12 01:30:00,Station-30,2577,9,4318160,CKB +LINE_14,Station-30,2022-03-12 01:39:00,2022-03-12 01:54:00,Station-31,5937,9,4318160,CKB +LINE_14,Station-31,2022-03-12 02:03:00,2022-03-12 02:17:00,Station-30,6.19,0,4318160,CKB +LINE_13,Station-30,2022-03-12 02:17:00,2022-03-12 02:23:00,Station-29,2555,0,4318160,CKB +LINE_13,Station-29,2022-03-12 02:23:00,2022-03-12 02:30:00,Station-30,2577,9,4318160,CKB +LINE_14,Station-30,2022-03-12 02:39:00,2022-03-12 02:54:00,Station-31,5937,9,4318160,CKB +LINE_14,Station-31,2022-03-12 03:03:00,2022-03-12 03:17:00,Station-30,6.19,0,4318160,CKB +LINE_13,Station-30,2022-03-12 03:17:00,2022-03-12 03:23:00,Station-29,2555,0,4318160,CKB +LINE_13,Station-29,2022-03-12 03:23:00,2022-03-12 03:30:00,Station-30,2577,9,4318160,CKB +LINE_14,Station-30,2022-03-12 03:39:00,2022-03-12 03:54:00,Station-31,5937,9,4318160,CKB +LINE_14,Station-31,2022-03-12 04:03:00,2022-03-12 04:17:00,Station-30,6.19,0,4318160,CKB +LINE_13,Station-30,2022-03-12 04:17:00,2022-03-12 04:23:00,Station-29,2555,0,4318160,CKB +LINE_13,Station-29,2022-03-12 04:23:00,2022-03-12 04:30:00,Station-30,2577,9,4318160,CKB +LINE_14,Station-30,2022-03-12 04:39:00,2022-03-12 04:54:00,Station-31,5937,9,4318160,CKB +LINE_14,Station-31,2022-03-12 05:03:00,2022-03-12 05:17:00,Station-30,6.19,0,4318160,CKB +LINE_15,Station-30,2022-03-12 05:17:00,2022-03-12 05:38:00,Station-33,12.0,28,4318160,CKB +LINE_15,Station-33,2022-03-12 06:06:00,2022-03-12 06:11:00,Station-32,2936,16,4318160,CKB +LINE_15,Station-32,2022-03-12 06:27:00,2022-03-12 06:36:00,Station-33,4343,10,4318160,CKB +LINE_15,Station-33,2022-03-12 06:46:00,2022-03-12 06:51:00,Station-32,2936,0,4318160,CKB +LINE_10,Station-32,2022-03-12 06:51:00,2022-03-12 07:00:00,Station-24,4.6,12,4318160,CKB +LINE_10,Station-24,2022-03-12 07:12:00,2022-03-12 07:12:00,Station-24,0.0,836,4318160,CKB +LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-24,0.0,0,4318160,CKB +LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-0,0.06,0,4318160,CKB +LINE_14,Station-0,2022-03-12 00:33:00,2022-03-12 00:33:00,Station-31,0.06,0,4318180,CKB +LINE_14,Station-31,2022-03-12 00:33:00,2022-03-12 00:47:00,Station-30,6.19,0,4318180,CKB +LINE_13,Station-30,2022-03-12 00:47:00,2022-03-12 00:53:00,Station-29,2555,0,4318180,CKB +LINE_13,Station-29,2022-03-12 00:53:00,2022-03-12 01:00:00,Station-30,2577,9,4318180,CKB +LINE_14,Station-30,2022-03-12 01:09:00,2022-03-12 01:24:00,Station-31,5937,9,4318180,CKB +LINE_14,Station-31,2022-03-12 01:33:00,2022-03-12 01:47:00,Station-30,6.19,0,4318180,CKB +LINE_13,Station-30,2022-03-12 01:47:00,2022-03-12 01:53:00,Station-29,2555,0,4318180,CKB +LINE_13,Station-29,2022-03-12 01:53:00,2022-03-12 02:00:00,Station-30,2577,9,4318180,CKB +LINE_14,Station-30,2022-03-12 02:09:00,2022-03-12 02:24:00,Station-31,5937,9,4318180,CKB +LINE_14,Station-31,2022-03-12 02:33:00,2022-03-12 02:47:00,Station-30,6.19,0,4318180,CKB +LINE_13,Station-30,2022-03-12 02:47:00,2022-03-12 02:53:00,Station-29,2555,0,4318180,CKB +LINE_13,Station-29,2022-03-12 02:53:00,2022-03-12 03:00:00,Station-30,2577,9,4318180,CKB +LINE_14,Station-30,2022-03-12 03:09:00,2022-03-12 03:24:00,Station-31,5937,9,4318180,CKB +LINE_14,Station-31,2022-03-12 03:33:00,2022-03-12 03:47:00,Station-30,6.19,0,4318180,CKB +LINE_13,Station-30,2022-03-12 03:47:00,2022-03-12 03:53:00,Station-29,2555,0,4318180,CKB +LINE_13,Station-29,2022-03-12 03:53:00,2022-03-12 04:00:00,Station-30,2577,9,4318180,CKB +LINE_14,Station-30,2022-03-12 04:09:00,2022-03-12 04:24:00,Station-31,5937,9,4318180,CKB +LINE_14,Station-31,2022-03-12 04:33:00,2022-03-12 04:47:00,Station-30,6.19,0,4318180,CKB +LINE_13,Station-30,2022-03-12 04:47:00,2022-03-12 04:53:00,Station-29,2555,0,4318180,CKB +LINE_13,Station-29,2022-03-12 04:53:00,2022-03-12 05:00:00,Station-30,2577,9,4318180,CKB +LINE_14,Station-30,2022-03-12 05:09:00,2022-03-12 05:24:00,Station-31,5937,0,4318180,CKB +LINE_14,Station-31,2022-03-12 05:24:00,2022-03-12 05:24:00,Station-0,0.06,0,4318180,CKB +LINE_15,Station-0,2022-03-12 00:57:00,2022-03-12 00:57:00,Station-32,0.06,0,4319355,CKB +LINE_15,Station-32,2022-03-12 00:57:00,2022-03-12 01:06:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 01:06:00,2022-03-12 01:11:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 01:27:00,2022-03-12 01:36:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 01:36:00,2022-03-12 01:41:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 01:57:00,2022-03-12 02:06:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 02:06:00,2022-03-12 02:11:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 02:27:00,2022-03-12 02:36:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 02:36:00,2022-03-12 02:41:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 02:57:00,2022-03-12 03:06:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 03:06:00,2022-03-12 03:11:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 03:27:00,2022-03-12 03:36:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 03:36:00,2022-03-12 03:41:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 03:57:00,2022-03-12 04:06:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 04:06:00,2022-03-12 04:11:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 04:27:00,2022-03-12 04:36:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 04:36:00,2022-03-12 04:41:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 04:57:00,2022-03-12 05:06:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 05:06:00,2022-03-12 05:11:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 05:27:00,2022-03-12 05:36:00,Station-33,4343,0,4319355,CKB +LINE_15,Station-33,2022-03-12 05:36:00,2022-03-12 05:41:00,Station-32,2936,16,4319355,CKB +LINE_15,Station-32,2022-03-12 05:57:00,2022-03-12 06:06:00,Station-33,4343,20,4319355,CKB +LINE_15,Station-33,2022-03-12 06:26:00,2022-03-12 06:31:00,Station-32,2936,0,4319355,CKB +LINE_15,Station-32,2022-03-12 06:31:00,2022-03-12 06:31:00,Station-0,0.06,0,4319355,CKB +LINE_17,Station-0,2022-03-12 00:30:00,2022-03-12 00:30:00,Station-34,0.06,0,4453548,CKB +LINE_17,Station-34,2022-03-12 00:30:00,2022-03-12 00:44:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 00:44:00,2022-03-12 00:57:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 01:00:00,2022-03-12 01:14:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 01:14:00,2022-03-12 01:27:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 01:30:00,2022-03-12 01:44:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 01:44:00,2022-03-12 01:57:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 02:00:00,2022-03-12 02:14:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 02:14:00,2022-03-12 02:27:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 02:30:00,2022-03-12 02:44:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 02:44:00,2022-03-12 02:57:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 03:00:00,2022-03-12 03:14:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 03:14:00,2022-03-12 03:27:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 03:30:00,2022-03-12 03:44:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 03:44:00,2022-03-12 03:57:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 04:00:00,2022-03-12 04:14:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 04:14:00,2022-03-12 04:27:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 04:30:00,2022-03-12 04:44:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 04:44:00,2022-03-12 04:57:00,Station-34,5302,3,4453548,CKB +LINE_17,Station-34,2022-03-12 05:00:00,2022-03-12 05:14:00,Station-36,4801,0,4453548,CKB +LINE_17,Station-36,2022-03-12 05:14:00,2022-03-12 05:27:00,Station-34,5302,0,4453548,CKB +LINE_17,Station-34,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,4453548,CKB +LINE_20,Station-0,2022-03-12 00:32:00,2022-03-12 00:32:00,Station-13,0.06,0,4747653,CKB +LINE_20,Station-13,2022-03-12 00:32:00,2022-03-12 00:44:00,Station-40,4212,3,4747653,CKB +LINE_20,Station-40,2022-03-12 00:47:00,2022-03-12 01:16:00,Station-41,13048,0,4747653,CKB +LINE_20,Station-41,2022-03-12 01:16:00,2022-03-12 01:42:00,Station-40,12869,5,4747653,CKB +LINE_20,Station-40,2022-03-12 01:47:00,2022-03-12 02:16:00,Station-41,13048,0,4747653,CKB +LINE_20,Station-41,2022-03-12 02:16:00,2022-03-12 02:42:00,Station-40,12869,5,4747653,CKB +LINE_20,Station-40,2022-03-12 02:47:00,2022-03-12 03:16:00,Station-41,13048,0,4747653,CKB +LINE_20,Station-41,2022-03-12 03:16:00,2022-03-12 03:42:00,Station-40,12869,5,4747653,CKB +LINE_20,Station-40,2022-03-12 03:47:00,2022-03-12 04:16:00,Station-41,13048,0,4747653,CKB +LINE_20,Station-41,2022-03-12 04:16:00,2022-03-12 04:42:00,Station-40,12869,5,4747653,CKB +LINE_20,Station-40,2022-03-12 04:47:00,2022-03-12 05:16:00,Station-41,13048,0,4747653,CKB +LINE_20,Station-41,2022-03-12 05:16:00,2022-03-12 05:34:00,Station-42,9538,0,4747653,CKB +LINE_20,Station-42,2022-03-12 05:34:00,2022-03-12 05:34:00,Station-0,0.06,0,4747653,CKB +LINE_20,Station-0,2022-03-12 00:17:00,2022-03-12 00:17:00,Station-40,0.06,0,4747663,CKB +LINE_20,Station-40,2022-03-12 00:17:00,2022-03-12 00:46:00,Station-41,13048,0,4747663,CKB +LINE_20,Station-41,2022-03-12 00:46:00,2022-03-12 01:12:00,Station-40,12869,5,4747663,CKB +LINE_20,Station-40,2022-03-12 01:17:00,2022-03-12 01:46:00,Station-41,13048,0,4747663,CKB +LINE_20,Station-41,2022-03-12 01:46:00,2022-03-12 02:12:00,Station-40,12869,5,4747663,CKB +LINE_20,Station-40,2022-03-12 02:17:00,2022-03-12 02:46:00,Station-41,13048,0,4747663,CKB +LINE_20,Station-41,2022-03-12 02:46:00,2022-03-12 03:12:00,Station-40,12869,5,4747663,CKB +LINE_20,Station-40,2022-03-12 03:17:00,2022-03-12 03:46:00,Station-41,13048,0,4747663,CKB +LINE_20,Station-41,2022-03-12 03:46:00,2022-03-12 04:12:00,Station-40,12869,5,4747663,CKB +LINE_20,Station-40,2022-03-12 04:17:00,2022-03-12 04:46:00,Station-41,13048,0,4747663,CKB +LINE_20,Station-41,2022-03-12 04:46:00,2022-03-12 05:12:00,Station-40,12869,0,4747663,CKB +LINE_20,Station-40,2022-03-12 05:12:00,2022-03-12 05:12:00,Station-0,0.06,0,4747663,CKB +LINE_21,Station-0,2022-03-12 00:49:00,2022-03-12 00:49:00,Station-3,0.06,0,4434344,CKB +LINE_21,Station-3,2022-03-12 00:49:00,2022-03-12 01:04:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 01:04:00,2022-03-12 01:19:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 01:19:00,2022-03-12 01:34:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 01:34:00,2022-03-12 01:49:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 01:49:00,2022-03-12 02:04:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 02:04:00,2022-03-12 02:19:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 02:19:00,2022-03-12 02:34:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 02:34:00,2022-03-12 02:49:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 02:49:00,2022-03-12 03:04:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 03:04:00,2022-03-12 03:19:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 03:19:00,2022-03-12 03:34:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 03:34:00,2022-03-12 03:49:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 03:49:00,2022-03-12 04:04:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 04:04:00,2022-03-12 04:19:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 04:19:00,2022-03-12 04:34:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 04:34:00,2022-03-12 04:49:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 04:49:00,2022-03-12 05:04:00,Station-16,10229,0,4434344,CKB +LINE_21,Station-16,2022-03-12 05:04:00,2022-03-12 05:19:00,Station-3,11801,0,4434344,CKB +LINE_21,Station-3,2022-03-12 05:19:00,2022-03-12 05:19:00,Station-0,0.06,0,4434344,CKB +LINE_23,Station-0,2022-03-12 02:34:00,2022-03-12 02:34:00,Station-45,0.06,0,4514364,CKB +LINE_23,Station-45,2022-03-12 02:34:00,2022-03-12 03:00:00,Station-46,9016,0,4514364,CKB +LINE_23,Station-46,2022-03-12 03:00:00,2022-03-12 03:27:00,Station-45,10083,7,4514364,CKB +LINE_23,Station-45,2022-03-12 03:34:00,2022-03-12 04:00:00,Station-46,9016,0,4514364,CKB +LINE_23,Station-46,2022-03-12 04:00:00,2022-03-12 04:27:00,Station-45,10083,7,4514364,CKB +LINE_23,Station-45,2022-03-12 04:34:00,2022-03-12 05:00:00,Station-46,9016,0,4514364,CKB +LINE_23,Station-46,2022-03-12 05:00:00,2022-03-12 05:27:00,Station-45,10083,0,4514364,CKB +LINE_23,Station-45,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,4514364,CKB +LINE_23,Station-0,2022-03-12 02:04:00,2022-03-12 02:04:00,Station-45,0.06,0,4619999,CKB +LINE_23,Station-45,2022-03-12 02:04:00,2022-03-12 02:30:00,Station-46,9016,0,4619999,CKB +LINE_23,Station-46,2022-03-12 02:30:00,2022-03-12 02:57:00,Station-45,10083,7,4619999,CKB +LINE_23,Station-45,2022-03-12 03:04:00,2022-03-12 03:30:00,Station-46,9016,0,4619999,CKB +LINE_23,Station-46,2022-03-12 03:30:00,2022-03-12 03:57:00,Station-45,10083,7,4619999,CKB +LINE_23,Station-45,2022-03-12 04:04:00,2022-03-12 04:30:00,Station-46,9016,0,4619999,CKB +LINE_23,Station-46,2022-03-12 04:30:00,2022-03-12 04:57:00,Station-45,10083,7,4619999,CKB +LINE_23,Station-45,2022-03-12 05:04:00,2022-03-12 05:30:00,Station-46,9016,0,4619999,CKB +LINE_23,Station-46,2022-03-12 05:30:00,2022-03-12 05:30:00,Station-0,0.06,0,4619999,CKB +LINE_24,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,4374747,CKB +LINE_24,Station-21,2022-03-12 00:31:00,2022-03-12 00:44:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 00:44:00,2022-03-12 00:56:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 01:01:00,2022-03-12 01:14:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 01:14:00,2022-03-12 01:26:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 01:31:00,2022-03-12 01:44:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 01:44:00,2022-03-12 01:56:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 02:01:00,2022-03-12 02:14:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 02:14:00,2022-03-12 02:26:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 02:31:00,2022-03-12 02:44:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 02:44:00,2022-03-12 02:56:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 03:01:00,2022-03-12 03:14:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 03:14:00,2022-03-12 03:26:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 03:31:00,2022-03-12 03:44:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 03:44:00,2022-03-12 03:56:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 04:01:00,2022-03-12 04:14:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 04:14:00,2022-03-12 04:26:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 04:31:00,2022-03-12 04:44:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 04:44:00,2022-03-12 04:56:00,Station-21,5362,5,4374747,CKB +LINE_24,Station-21,2022-03-12 05:01:00,2022-03-12 05:14:00,Station-47,4872,0,4374747,CKB +LINE_24,Station-47,2022-03-12 05:14:00,2022-03-12 05:26:00,Station-21,5362,0,4374747,CKB +LINE_24,Station-21,2022-03-12 05:26:00,2022-03-12 05:26:00,Station-0,0.06,0,4374747,CKB +LINE_25,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,4374870,CKB +LINE_25,Station-21,2022-03-12 00:31:00,2022-03-12 00:45:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 00:47:00,2022-03-12 01:01:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 01:01:00,2022-03-12 01:15:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 01:17:00,2022-03-12 01:31:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 01:31:00,2022-03-12 01:45:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 01:47:00,2022-03-12 02:01:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 02:01:00,2022-03-12 02:15:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 02:17:00,2022-03-12 02:31:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 02:31:00,2022-03-12 02:45:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 02:47:00,2022-03-12 03:01:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 03:01:00,2022-03-12 03:15:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 03:17:00,2022-03-12 03:31:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 03:31:00,2022-03-12 03:45:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 03:47:00,2022-03-12 04:01:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 04:01:00,2022-03-12 04:15:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 04:17:00,2022-03-12 04:31:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 04:31:00,2022-03-12 04:45:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 04:47:00,2022-03-12 05:01:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 05:01:00,2022-03-12 05:15:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 05:17:00,2022-03-12 05:31:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 05:31:00,2022-03-12 05:45:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 05:47:00,2022-03-12 06:01:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 06:01:00,2022-03-12 06:15:00,Station-48,5225,2,4374870,CKB +LINE_25,Station-48,2022-03-12 06:17:00,2022-03-12 06:31:00,Station-21,7617,0,4374870,CKB +LINE_25,Station-21,2022-03-12 06:31:00,2022-03-12 06:45:00,Station-48,5096,0,4374870,CKB +LINE_25,Station-48,2022-03-12 06:45:00,2022-03-12 06:45:00,Station-0,0.06,0,4374870,CKB +LINE_26,Station-0,2022-03-12 00:43:00,2022-03-12 00:43:00,Station-49,0.06,0,4375016,CKB +LINE_26,Station-49,2022-03-12 00:43:00,2022-03-12 00:53:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 00:53:00,2022-03-12 01:03:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 01:13:00,2022-03-12 01:23:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 01:23:00,2022-03-12 01:33:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 01:43:00,2022-03-12 01:53:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 01:53:00,2022-03-12 02:03:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 02:13:00,2022-03-12 02:23:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 02:23:00,2022-03-12 02:33:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 02:43:00,2022-03-12 02:53:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 02:53:00,2022-03-12 03:03:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 03:13:00,2022-03-12 03:23:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 03:23:00,2022-03-12 03:33:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 03:43:00,2022-03-12 03:53:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 03:53:00,2022-03-12 04:03:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 04:13:00,2022-03-12 04:23:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 04:23:00,2022-03-12 04:33:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 04:43:00,2022-03-12 04:53:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 04:53:00,2022-03-12 05:03:00,Station-49,4408,10,4375016,CKB +LINE_26,Station-49,2022-03-12 05:13:00,2022-03-12 05:23:00,Station-50,4507,0,4375016,CKB +LINE_26,Station-50,2022-03-12 05:23:00,2022-03-12 05:23:00,Station-0,0.06,0,4375016,CKB +LINE_0,Station-0,2022-03-12 20:51:00,2022-03-12 20:51:00,Station-1,0.06,0,4454966,CKB +LINE_0,Station-1,2022-03-12 20:51:00,2022-03-12 21:24:00,Station-2,14519,4,4454966,CKB +LINE_0,Station-2,2022-03-12 21:28:00,2022-03-12 22:03:00,Station-1,13541,8,4454966,CKB +LINE_0,Station-1,2022-03-12 22:11:00,2022-03-12 22:44:00,Station-2,14519,4,4454966,CKB +LINE_0,Station-2,2022-03-12 22:48:00,2022-03-12 23:23:00,Station-1,13541,8,4454966,CKB +LINE_0,Station-1,2022-03-12 23:31:00,2022-03-13 00:04:00,Station-2,14519,4,4454966,CKB +LINE_0,Station-2,2022-03-13 00:08:00,2022-03-13 00:39:00,Station-5,12213,0,4454966,CKB +LINE_1,Station-5,2022-03-13 00:39:00,2022-03-13 00:47:00,Station-3,4.0,2,4454966,CKB +LINE_1,Station-3,2022-03-13 00:49:00,2022-03-13 01:12:00,Station-4,8.36,6,4454966,CKB +LINE_1,Station-4,2022-03-13 01:18:00,2022-03-13 01:36:00,Station-3,9067,13,4454966,CKB +LINE_1,Station-3,2022-03-13 01:49:00,2022-03-13 02:12:00,Station-4,8.36,6,4454966,CKB +LINE_1,Station-4,2022-03-13 02:18:00,2022-03-13 02:36:00,Station-3,9067,13,4454966,CKB +LINE_1,Station-3,2022-03-13 02:49:00,2022-03-13 03:12:00,Station-4,8.36,6,4454966,CKB +LINE_1,Station-4,2022-03-13 03:18:00,2022-03-13 03:36:00,Station-3,9067,13,4454966,CKB +LINE_1,Station-3,2022-03-13 03:49:00,2022-03-13 04:12:00,Station-4,8.36,6,4454966,CKB +LINE_1,Station-4,2022-03-13 04:18:00,2022-03-13 04:36:00,Station-3,9067,13,4454966,CKB +LINE_1,Station-3,2022-03-13 04:49:00,2022-03-13 05:12:00,Station-4,8.36,6,4454966,CKB +LINE_1,Station-4,2022-03-13 05:18:00,2022-03-13 05:36:00,Station-3,9067,13,4454966,CKB +LINE_1,Station-3,2022-03-13 05:49:00,2022-03-13 06:08:00,Station-4,8762,10,4454966,CKB +LINE_1,Station-4,2022-03-13 06:18:00,2022-03-13 06:36:00,Station-3,9067,13,4454966,CKB +LINE_1,Station-3,2022-03-13 06:49:00,2022-03-13 07:08:00,Station-4,8762,0,4454966,CKB +LINE_1,Station-4,2022-03-13 07:08:00,2022-03-13 07:08:00,Station-0,0.06,0,4454966,CKB +LINE_0,Station-0,2022-03-12 21:31:00,2022-03-12 21:31:00,Station-1,0.06,0,4454967,CKB +LINE_0,Station-1,2022-03-12 21:31:00,2022-03-12 22:04:00,Station-2,14519,4,4454967,CKB +LINE_0,Station-2,2022-03-12 22:08:00,2022-03-12 22:43:00,Station-1,13541,8,4454967,CKB +LINE_0,Station-1,2022-03-12 22:51:00,2022-03-12 23:24:00,Station-2,14519,4,4454967,CKB +LINE_0,Station-2,2022-03-12 23:28:00,2022-03-13 00:03:00,Station-1,13541,8,4454967,CKB +LINE_0,Station-1,2022-03-13 00:11:00,2022-03-13 00:44:00,Station-2,14519,0,4454967,CKB +LINE_1,Station-2,2022-03-13 00:44:00,2022-03-13 00:54:00,Station-3,4.1,25,4454967,CKB +LINE_1,Station-3,2022-03-13 01:19:00,2022-03-13 01:42:00,Station-4,8.36,6,4454967,CKB +LINE_1,Station-4,2022-03-13 01:48:00,2022-03-13 02:06:00,Station-3,9067,13,4454967,CKB +LINE_1,Station-3,2022-03-13 02:19:00,2022-03-13 02:42:00,Station-4,8.36,6,4454967,CKB +LINE_1,Station-4,2022-03-13 02:48:00,2022-03-13 03:06:00,Station-3,9067,13,4454967,CKB +LINE_1,Station-3,2022-03-13 03:19:00,2022-03-13 03:42:00,Station-4,8.36,6,4454967,CKB +LINE_1,Station-4,2022-03-13 03:48:00,2022-03-13 04:06:00,Station-3,9067,13,4454967,CKB +LINE_1,Station-3,2022-03-13 04:19:00,2022-03-13 04:42:00,Station-4,8.36,6,4454967,CKB +LINE_1,Station-4,2022-03-13 04:48:00,2022-03-13 05:06:00,Station-3,9067,13,4454967,CKB +LINE_1,Station-3,2022-03-13 05:19:00,2022-03-13 05:42:00,Station-4,8.36,6,4454967,CKB +LINE_1,Station-4,2022-03-13 05:48:00,2022-03-13 06:06:00,Station-3,9067,0,4454967,CKB +LINE_1,Station-3,2022-03-13 06:06:00,2022-03-13 06:06:00,Station-0,0.06,0,4454967,CKB +LINE_2,Station-0,2022-03-12 21:06:00,2022-03-12 21:06:00,Station-6,0.06,0,4664765,CKB +LINE_2,Station-6,2022-03-12 21:06:00,2022-03-12 21:34:00,Station-7,13018,19,4664765,CKB +LINE_2,Station-7,2022-03-12 21:53:00,2022-03-12 22:13:00,Station-8,10332,17,4664765,CKB +LINE_2,Station-8,2022-03-12 22:30:00,2022-03-12 22:54:00,Station-7,10.48,19,4664765,CKB +LINE_2,Station-7,2022-03-12 23:13:00,2022-03-12 23:33:00,Station-8,10332,17,4664765,CKB +LINE_2,Station-8,2022-03-12 23:50:00,2022-03-13 00:14:00,Station-7,10.48,8,4664765,CKB +LINE_2,Station-7,2022-03-13 00:22:00,2022-03-13 00:27:00,Station-58,2533,2,4664765,CKB +LINE_3,Station-58,2022-03-13 00:29:00,2022-03-13 00:47:00,Station-10,7.58,0,4664765,CKB +LINE_3,Station-10,2022-03-13 00:47:00,2022-03-13 01:14:00,Station-11,12841,3,4664765,CKB +LINE_3,Station-11,2022-03-13 01:17:00,2022-03-13 01:47:00,Station-10,14281,0,4664765,CKB +LINE_3,Station-10,2022-03-13 01:47:00,2022-03-13 02:14:00,Station-11,12841,3,4664765,CKB +LINE_3,Station-11,2022-03-13 02:17:00,2022-03-13 02:47:00,Station-10,14281,0,4664765,CKB +LINE_3,Station-10,2022-03-13 02:47:00,2022-03-13 03:14:00,Station-11,12841,3,4664765,CKB +LINE_3,Station-11,2022-03-13 03:17:00,2022-03-13 03:47:00,Station-10,14281,0,4664765,CKB +LINE_3,Station-10,2022-03-13 03:47:00,2022-03-13 04:14:00,Station-11,12841,3,4664765,CKB +LINE_3,Station-11,2022-03-13 04:17:00,2022-03-13 04:47:00,Station-10,14281,0,4664765,CKB +LINE_3,Station-10,2022-03-13 04:47:00,2022-03-13 05:14:00,Station-11,12841,3,4664765,CKB +LINE_3,Station-11,2022-03-13 05:17:00,2022-03-13 05:47:00,Station-10,14281,0,4664765,CKB +LINE_3,Station-10,2022-03-13 05:47:00,2022-03-13 06:14:00,Station-11,12841,3,4664765,CKB +LINE_3,Station-11,2022-03-13 06:17:00,2022-03-13 06:47:00,Station-10,14281,0,4664765,CKB +LINE_3,Station-10,2022-03-13 06:47:00,2022-03-13 06:59:00,Station-58,5474,0,4664765,CKB +LINE_3,Station-58,2022-03-13 06:59:00,2022-03-13 06:59:00,Station-0,0.06,0,4664765,CKB +LINE_2,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-6,0.06,0,4762771,CKB +LINE_2,Station-6,2022-03-12 20:26:00,2022-03-12 20:56:00,Station-12,14097,14,4762771,CKB +LINE_2,Station-12,2022-03-12 21:10:00,2022-03-12 21:38:00,Station-6,13.19,8,4762771,CKB +LINE_2,Station-6,2022-03-12 21:46:00,2022-03-12 22:14:00,Station-7,13018,19,4762771,CKB +LINE_2,Station-7,2022-03-12 22:33:00,2022-03-12 22:53:00,Station-8,10332,17,4762771,CKB +LINE_2,Station-8,2022-03-12 23:10:00,2022-03-12 23:34:00,Station-7,10.48,19,4762771,CKB +LINE_2,Station-7,2022-03-12 23:53:00,2022-03-13 00:13:00,Station-8,10332,2,4762771,CKB +LINE_2,Station-8,2022-03-13 00:15:00,2022-03-13 00:16:00,Station-10,506,1,4762771,CKB +LINE_3,Station-10,2022-03-13 00:17:00,2022-03-13 00:44:00,Station-11,12841,3,4762771,CKB +LINE_3,Station-11,2022-03-13 00:47:00,2022-03-13 01:17:00,Station-10,14281,0,4762771,CKB +LINE_3,Station-10,2022-03-13 01:17:00,2022-03-13 01:44:00,Station-11,12841,3,4762771,CKB +LINE_3,Station-11,2022-03-13 01:47:00,2022-03-13 02:17:00,Station-10,14281,0,4762771,CKB +LINE_3,Station-10,2022-03-13 02:17:00,2022-03-13 02:44:00,Station-11,12841,3,4762771,CKB +LINE_3,Station-11,2022-03-13 02:47:00,2022-03-13 03:17:00,Station-10,14281,0,4762771,CKB +LINE_3,Station-10,2022-03-13 03:17:00,2022-03-13 03:44:00,Station-11,12841,3,4762771,CKB +LINE_3,Station-11,2022-03-13 03:47:00,2022-03-13 04:17:00,Station-10,14281,0,4762771,CKB +LINE_3,Station-10,2022-03-13 04:17:00,2022-03-13 04:44:00,Station-11,12841,3,4762771,CKB +LINE_3,Station-11,2022-03-13 04:47:00,2022-03-13 05:17:00,Station-10,14281,0,4762771,CKB +LINE_3,Station-10,2022-03-13 05:17:00,2022-03-13 05:44:00,Station-11,12841,3,4762771,CKB +LINE_3,Station-11,2022-03-13 05:47:00,2022-03-13 06:17:00,Station-10,14281,0,4762771,CKB +LINE_3,Station-10,2022-03-13 06:17:00,2022-03-13 06:44:00,Station-11,12841,3,4762771,CKB +LINE_3,Station-11,2022-03-13 06:47:00,2022-03-13 07:17:00,Station-10,14281,0,4762771,CKB +LINE_3,Station-10,2022-03-13 07:17:00,2022-03-13 07:17:00,Station-0,0.06,0,4762771,CKB +LINE_5,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-14,0.06,0,4617438,CKB +LINE_5,Station-14,2022-03-12 20:26:00,2022-03-12 20:38:00,Station-15,5882,3,4617438,CKB +LINE_5,Station-15,2022-03-12 20:41:00,2022-03-12 20:55:00,Station-14,6232,0,4617438,CKB +LINE_5,Station-14,2022-03-12 20:55:00,2022-03-12 21:08:00,Station-15,6086,3,4617438,CKB +LINE_5,Station-15,2022-03-12 21:11:00,2022-03-12 21:25:00,Station-14,6232,0,4617438,CKB +LINE_5,Station-14,2022-03-12 21:25:00,2022-03-12 21:38:00,Station-15,6086,3,4617438,CKB +LINE_5,Station-15,2022-03-12 21:41:00,2022-03-12 21:55:00,Station-14,6232,0,4617438,CKB +LINE_5,Station-14,2022-03-12 21:55:00,2022-03-12 22:08:00,Station-15,6086,3,4617438,CKB +LINE_5,Station-15,2022-03-12 22:11:00,2022-03-12 22:25:00,Station-14,6232,0,4617438,CKB +LINE_5,Station-14,2022-03-12 22:25:00,2022-03-12 22:38:00,Station-15,6086,3,4617438,CKB +LINE_5,Station-15,2022-03-12 22:41:00,2022-03-12 22:55:00,Station-14,6232,0,4617438,CKB +LINE_5,Station-14,2022-03-12 22:55:00,2022-03-12 23:08:00,Station-15,6086,3,4617438,CKB +LINE_5,Station-15,2022-03-12 23:11:00,2022-03-12 23:25:00,Station-14,6232,0,4617438,CKB +LINE_5,Station-14,2022-03-12 23:25:00,2022-03-12 23:38:00,Station-15,6086,3,4617438,CKB +LINE_5,Station-15,2022-03-12 23:41:00,2022-03-12 23:55:00,Station-14,6232,0,4617438,CKB +LINE_5,Station-14,2022-03-12 23:55:00,2022-03-13 00:08:00,Station-15,6086,0,4617438,CKB +LINE_5,Station-15,2022-03-13 00:08:00,2022-03-13 00:08:00,Station-0,0.06,0,4617438,CKB +LINE_6,Station-0,2022-03-12 05:25:00,2022-03-12 05:25:00,Station-16,0.06,0,4426894,CKB +LINE_6,Station-16,2022-03-12 05:25:00,2022-03-12 05:34:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 05:34:00,2022-03-12 05:43:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 06:05:00,2022-03-12 06:14:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 06:14:00,2022-03-12 06:23:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 06:25:00,2022-03-12 06:34:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 06:34:00,2022-03-12 06:43:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 06:45:00,2022-03-12 06:54:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 06:54:00,2022-03-12 07:03:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 07:05:00,2022-03-12 07:14:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 07:14:00,2022-03-12 07:23:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 07:25:00,2022-03-12 07:34:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 07:34:00,2022-03-12 07:43:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 08:05:00,2022-03-12 08:14:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 08:14:00,2022-03-12 08:23:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 08:25:00,2022-03-12 08:34:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 08:34:00,2022-03-12 08:43:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 08:45:00,2022-03-12 08:54:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 08:54:00,2022-03-12 09:03:00,Station-16,5139,3,4426894,CKB +LINE_6,Station-16,2022-03-12 09:06:00,2022-03-12 09:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 09:15:00,2022-03-12 09:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 09:26:00,2022-03-12 09:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 09:35:00,2022-03-12 09:44:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 10:06:00,2022-03-12 10:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 10:15:00,2022-03-12 10:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 10:26:00,2022-03-12 10:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 10:35:00,2022-03-12 10:44:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 10:46:00,2022-03-12 10:55:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 10:55:00,2022-03-12 11:04:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 11:06:00,2022-03-12 11:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 11:15:00,2022-03-12 11:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 11:26:00,2022-03-12 11:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 11:35:00,2022-03-12 11:44:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 12:06:00,2022-03-12 12:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 12:15:00,2022-03-12 12:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 12:26:00,2022-03-12 12:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 12:35:00,2022-03-12 12:44:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 12:46:00,2022-03-12 12:55:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 12:55:00,2022-03-12 13:04:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 13:06:00,2022-03-12 13:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 13:15:00,2022-03-12 13:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 13:26:00,2022-03-12 13:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 13:35:00,2022-03-12 13:44:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 14:06:00,2022-03-12 14:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 14:15:00,2022-03-12 14:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 14:26:00,2022-03-12 14:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 14:35:00,2022-03-12 14:44:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 14:46:00,2022-03-12 14:55:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 14:55:00,2022-03-12 15:04:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 15:06:00,2022-03-12 15:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 15:15:00,2022-03-12 15:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 15:26:00,2022-03-12 15:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 15:35:00,2022-03-12 15:44:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 16:06:00,2022-03-12 16:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 16:15:00,2022-03-12 16:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 16:26:00,2022-03-12 16:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 16:35:00,2022-03-12 16:44:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 16:46:00,2022-03-12 16:55:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 16:55:00,2022-03-12 17:04:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 17:06:00,2022-03-12 17:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 17:15:00,2022-03-12 17:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 17:26:00,2022-03-12 17:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 17:35:00,2022-03-12 17:44:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 18:06:00,2022-03-12 18:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 18:15:00,2022-03-12 18:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 18:26:00,2022-03-12 18:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 18:35:00,2022-03-12 18:44:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 18:46:00,2022-03-12 18:55:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 18:55:00,2022-03-12 19:04:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 19:06:00,2022-03-12 19:15:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 19:15:00,2022-03-12 19:24:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 19:26:00,2022-03-12 19:35:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 19:35:00,2022-03-12 19:44:00,Station-16,5139,21,4426894,CKB +LINE_6,Station-16,2022-03-12 20:05:00,2022-03-12 20:14:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 20:14:00,2022-03-12 20:23:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 20:25:00,2022-03-12 20:34:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 20:34:00,2022-03-12 20:43:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 20:45:00,2022-03-12 20:54:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 20:54:00,2022-03-12 21:03:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 21:05:00,2022-03-12 21:14:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 21:14:00,2022-03-12 21:23:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 21:25:00,2022-03-12 21:34:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 21:34:00,2022-03-12 21:43:00,Station-16,5139,22,4426894,CKB +LINE_6,Station-16,2022-03-12 22:05:00,2022-03-12 22:14:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 22:14:00,2022-03-12 22:23:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 22:25:00,2022-03-12 22:34:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 22:34:00,2022-03-12 22:43:00,Station-16,5139,2,4426894,CKB +LINE_6,Station-16,2022-03-12 22:45:00,2022-03-12 22:54:00,Station-17,4781,0,4426894,CKB +LINE_6,Station-17,2022-03-12 22:54:00,2022-03-12 23:03:00,Station-16,5139,0,4426894,CKB +LINE_6,Station-16,2022-03-12 23:03:00,2022-03-12 23:03:00,Station-0,0.06,0,4426894,CKB +LINE_29,Station-0,2022-03-12 07:30:00,2022-03-12 07:30:00,Station-53,0.06,0,4369705,CKB +LINE_29,Station-53,2022-03-12 07:30:00,2022-03-12 07:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 07:39:00,2022-03-12 07:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 07:50:00,2022-03-12 07:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 07:59:00,2022-03-12 08:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 08:10:00,2022-03-12 08:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 08:19:00,2022-03-12 08:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 08:30:00,2022-03-12 08:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 08:39:00,2022-03-12 08:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 08:50:00,2022-03-12 08:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 08:59:00,2022-03-12 09:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 09:10:00,2022-03-12 09:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 09:19:00,2022-03-12 09:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 09:30:00,2022-03-12 09:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 09:39:00,2022-03-12 09:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 09:50:00,2022-03-12 09:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 09:59:00,2022-03-12 10:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 10:10:00,2022-03-12 10:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 10:19:00,2022-03-12 10:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 10:30:00,2022-03-12 10:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 10:39:00,2022-03-12 10:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 10:50:00,2022-03-12 10:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 10:59:00,2022-03-12 11:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 11:10:00,2022-03-12 11:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 11:19:00,2022-03-12 11:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 11:30:00,2022-03-12 11:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 11:39:00,2022-03-12 11:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 11:50:00,2022-03-12 11:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 11:59:00,2022-03-12 12:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 12:10:00,2022-03-12 12:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 12:19:00,2022-03-12 12:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 12:30:00,2022-03-12 12:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 12:39:00,2022-03-12 12:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 12:50:00,2022-03-12 12:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 12:59:00,2022-03-12 13:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 13:10:00,2022-03-12 13:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 13:19:00,2022-03-12 13:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 13:30:00,2022-03-12 13:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 13:39:00,2022-03-12 13:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 13:50:00,2022-03-12 13:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 13:59:00,2022-03-12 14:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 14:10:00,2022-03-12 14:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 14:19:00,2022-03-12 14:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 14:30:00,2022-03-12 14:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 14:39:00,2022-03-12 14:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 14:50:00,2022-03-12 14:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 14:59:00,2022-03-12 15:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 15:10:00,2022-03-12 15:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 15:19:00,2022-03-12 15:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 15:30:00,2022-03-12 15:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 15:39:00,2022-03-12 15:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 15:50:00,2022-03-12 15:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 15:59:00,2022-03-12 16:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 16:10:00,2022-03-12 16:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 16:19:00,2022-03-12 16:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 16:30:00,2022-03-12 16:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 16:39:00,2022-03-12 16:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 16:50:00,2022-03-12 16:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 16:59:00,2022-03-12 17:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 17:10:00,2022-03-12 17:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 17:19:00,2022-03-12 17:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 17:30:00,2022-03-12 17:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 17:39:00,2022-03-12 17:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 17:50:00,2022-03-12 17:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 17:59:00,2022-03-12 18:10:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 18:10:00,2022-03-12 18:15:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 18:19:00,2022-03-12 18:30:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 18:30:00,2022-03-12 18:35:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 18:39:00,2022-03-12 18:50:00,Station-53,4341,0,4369705,CKB +LINE_29,Station-53,2022-03-12 18:50:00,2022-03-12 18:55:00,Station-54,2217,4,4369705,CKB +LINE_29,Station-54,2022-03-12 18:59:00,2022-03-12 19:10:00,Station-53,4288,0,4369705,CKB +LINE_29,Station-53,2022-03-12 19:10:00,2022-03-12 19:10:00,Station-0,0.06,0,4369705,CKB +LINE_9,Station-22,2022-03-12 08:08:00,2022-03-12 08:41:00,Station-23,17.9,0,4317640,VDL +LINE_9,Station-23,2022-03-12 08:41:00,2022-03-12 08:54:00,Station-23,4637,9,4317640,VDL +LINE_9,Station-23,2022-03-12 09:03:00,2022-03-12 09:17:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 09:21:00,2022-03-12 09:35:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 09:43:00,2022-03-12 09:57:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 10:01:00,2022-03-12 10:15:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 10:23:00,2022-03-12 10:37:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 10:41:00,2022-03-12 10:55:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 11:03:00,2022-03-12 11:17:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 11:21:00,2022-03-12 11:35:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 11:43:00,2022-03-12 11:57:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 12:01:00,2022-03-12 12:15:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 12:23:00,2022-03-12 12:37:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 12:41:00,2022-03-12 12:55:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 13:03:00,2022-03-12 13:17:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 13:21:00,2022-03-12 13:35:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 13:43:00,2022-03-12 13:57:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 14:01:00,2022-03-12 14:15:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 14:23:00,2022-03-12 14:37:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 14:41:00,2022-03-12 14:55:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 15:03:00,2022-03-12 15:17:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 15:21:00,2022-03-12 15:35:00,Station-23,4637,8,4317640,VDL +LINE_9,Station-23,2022-03-12 15:43:00,2022-03-12 15:57:00,Station-23,4637,4,4317640,VDL +LINE_9,Station-23,2022-03-12 16:01:00,2022-03-12 16:14:00,Station-23,4637,0,4317640,VDL +LINE_9,Station-23,2022-03-12 16:14:00,2022-03-12 16:57:00,Station-22,19.8,0,4317640,VDL +LINE_30,Station-0,2022-03-12 07:18:00,2022-03-12 07:18:00,Station-55,0.06,0,4706426,CKB +LINE_30,Station-55,2022-03-12 07:18:00,2022-03-12 07:26:00,Station-56,5562,10,4706426,CKB +LINE_30,Station-56,2022-03-12 07:36:00,2022-03-12 07:45:00,Station-57,5941,32,4706426,CKB +LINE_30,Station-57,2022-03-12 08:17:00,2022-03-12 08:26:00,Station-56,5994,8,4706426,CKB +LINE_30,Station-56,2022-03-12 08:34:00,2022-03-12 08:42:00,Station-55,5566,0,4706426,CKB +LINE_30,Station-55,2022-03-12 08:42:00,2022-03-12 08:42:00,Station-0,0.06,0,4706426,CKB +LINE_12,Station-0,2022-03-12 08:10:00,2022-03-12 08:10:00,Station-27,0.06,0,4731254,CKB +LINE_12,Station-27,2022-03-12 08:10:00,2022-03-12 08:16:00,Station-28,2169,12,4731254,CKB +LINE_12,Station-28,2022-03-12 08:28:00,2022-03-12 08:38:00,Station-27,2952,2,4731254,CKB +LINE_12,Station-27,2022-03-12 08:40:00,2022-03-12 08:46:00,Station-28,2169,12,4731254,CKB +LINE_12,Station-28,2022-03-12 08:58:00,2022-03-12 09:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 09:10:00,2022-03-12 09:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 09:28:00,2022-03-12 09:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 09:40:00,2022-03-12 09:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 09:58:00,2022-03-12 10:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 10:10:00,2022-03-12 10:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 10:28:00,2022-03-12 10:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 10:40:00,2022-03-12 10:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 10:58:00,2022-03-12 11:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 11:10:00,2022-03-12 11:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 11:28:00,2022-03-12 11:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 11:40:00,2022-03-12 11:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 11:58:00,2022-03-12 12:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 12:10:00,2022-03-12 12:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 12:28:00,2022-03-12 12:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 12:40:00,2022-03-12 12:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 12:58:00,2022-03-12 13:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 13:10:00,2022-03-12 13:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 13:28:00,2022-03-12 13:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 13:40:00,2022-03-12 13:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 13:58:00,2022-03-12 14:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 14:10:00,2022-03-12 14:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 14:28:00,2022-03-12 14:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 14:40:00,2022-03-12 14:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 14:58:00,2022-03-12 15:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 15:10:00,2022-03-12 15:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 15:28:00,2022-03-12 15:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 15:40:00,2022-03-12 15:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 15:58:00,2022-03-12 16:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 16:10:00,2022-03-12 16:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 16:28:00,2022-03-12 16:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 16:40:00,2022-03-12 16:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 16:58:00,2022-03-12 17:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 17:10:00,2022-03-12 17:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 17:28:00,2022-03-12 17:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 17:40:00,2022-03-12 17:48:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 17:58:00,2022-03-12 18:10:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 18:10:00,2022-03-12 18:18:00,Station-28,2169,10,4731254,CKB +LINE_12,Station-28,2022-03-12 18:28:00,2022-03-12 18:40:00,Station-27,2952,0,4731254,CKB +LINE_12,Station-27,2022-03-12 18:40:00,2022-03-12 18:48:00,Station-28,2169,0,4731254,CKB +LINE_12,Station-28,2022-03-12 18:48:00,2022-03-12 18:48:00,Station-0,0.06,0,4731254,CKB +LINE_13,Station-0,2022-03-13 00:23:00,2022-03-13 00:23:00,Station-29,0.06,0,4317771,CKB +LINE_13,Station-29,2022-03-13 00:23:00,2022-03-13 00:30:00,Station-30,2577,9,4317771,CKB +LINE_14,Station-30,2022-03-13 00:39:00,2022-03-13 00:54:00,Station-31,5937,9,4317771,CKB +LINE_14,Station-31,2022-03-13 01:03:00,2022-03-13 01:17:00,Station-30,6.19,0,4317771,CKB +LINE_13,Station-30,2022-03-13 01:17:00,2022-03-13 01:23:00,Station-29,2555,0,4317771,CKB +LINE_13,Station-29,2022-03-13 01:23:00,2022-03-13 01:30:00,Station-30,2577,9,4317771,CKB +LINE_14,Station-30,2022-03-13 01:39:00,2022-03-13 01:54:00,Station-31,5937,9,4317771,CKB +LINE_14,Station-31,2022-03-13 02:03:00,2022-03-13 02:17:00,Station-30,6.19,0,4317771,CKB +LINE_13,Station-30,2022-03-13 02:17:00,2022-03-13 02:23:00,Station-29,2555,0,4317771,CKB +LINE_13,Station-29,2022-03-13 02:23:00,2022-03-13 02:30:00,Station-30,2577,9,4317771,CKB +LINE_14,Station-30,2022-03-13 02:39:00,2022-03-13 02:54:00,Station-31,5937,9,4317771,CKB +LINE_14,Station-31,2022-03-13 03:03:00,2022-03-13 03:17:00,Station-30,6.19,0,4317771,CKB +LINE_13,Station-30,2022-03-13 03:17:00,2022-03-13 03:23:00,Station-29,2555,0,4317771,CKB +LINE_13,Station-29,2022-03-13 03:23:00,2022-03-13 03:30:00,Station-30,2577,9,4317771,CKB +LINE_14,Station-30,2022-03-13 03:39:00,2022-03-13 03:54:00,Station-31,5937,9,4317771,CKB +LINE_14,Station-31,2022-03-13 04:03:00,2022-03-13 04:17:00,Station-30,6.19,0,4317771,CKB +LINE_13,Station-30,2022-03-13 04:17:00,2022-03-13 04:23:00,Station-29,2555,0,4317771,CKB +LINE_13,Station-29,2022-03-13 04:23:00,2022-03-13 04:30:00,Station-30,2577,9,4317771,CKB +LINE_14,Station-30,2022-03-13 04:39:00,2022-03-13 04:54:00,Station-31,5937,9,4317771,CKB +LINE_14,Station-31,2022-03-13 05:03:00,2022-03-13 05:17:00,Station-30,6.19,0,4317771,CKB +LINE_13,Station-30,2022-03-13 05:17:00,2022-03-13 05:23:00,Station-29,2555,0,4317771,CKB +LINE_13,Station-29,2022-03-13 05:23:00,2022-03-13 05:30:00,Station-30,2577,9,4317771,CKB +LINE_14,Station-30,2022-03-13 05:39:00,2022-03-13 05:54:00,Station-31,5937,9,4317771,CKB +LINE_14,Station-31,2022-03-13 06:03:00,2022-03-13 06:17:00,Station-30,6.19,0,4317771,CKB +LINE_13,Station-30,2022-03-13 06:17:00,2022-03-13 06:23:00,Station-29,2555,0,4317771,CKB +LINE_13,Station-29,2022-03-13 06:23:00,2022-03-13 06:30:00,Station-30,2577,9,4317771,CKB +LINE_14,Station-30,2022-03-13 06:39:00,2022-03-13 06:54:00,Station-31,5937,0,4317771,CKB +LINE_14,Station-31,2022-03-13 06:54:00,2022-03-13 06:54:00,Station-0,0.06,0,4317771,CKB +LINE_14,Station-0,2022-03-13 00:33:00,2022-03-13 00:33:00,Station-31,0.06,0,4317937,CKB +LINE_14,Station-31,2022-03-13 00:33:00,2022-03-13 00:47:00,Station-30,6.19,0,4317937,CKB +LINE_13,Station-30,2022-03-13 00:47:00,2022-03-13 00:53:00,Station-29,2555,0,4317937,CKB +LINE_13,Station-29,2022-03-13 00:53:00,2022-03-13 01:00:00,Station-30,2577,9,4317937,CKB +LINE_14,Station-30,2022-03-13 01:09:00,2022-03-13 01:24:00,Station-31,5937,9,4317937,CKB +LINE_14,Station-31,2022-03-13 01:33:00,2022-03-13 01:47:00,Station-30,6.19,0,4317937,CKB +LINE_13,Station-30,2022-03-13 01:47:00,2022-03-13 01:53:00,Station-29,2555,0,4317937,CKB +LINE_13,Station-29,2022-03-13 01:53:00,2022-03-13 02:00:00,Station-30,2577,9,4317937,CKB +LINE_14,Station-30,2022-03-13 02:09:00,2022-03-13 02:24:00,Station-31,5937,9,4317937,CKB +LINE_14,Station-31,2022-03-13 02:33:00,2022-03-13 02:47:00,Station-30,6.19,0,4317937,CKB +LINE_13,Station-30,2022-03-13 02:47:00,2022-03-13 02:53:00,Station-29,2555,0,4317937,CKB +LINE_13,Station-29,2022-03-13 02:53:00,2022-03-13 03:00:00,Station-30,2577,9,4317937,CKB +LINE_14,Station-30,2022-03-13 03:09:00,2022-03-13 03:24:00,Station-31,5937,9,4317937,CKB +LINE_14,Station-31,2022-03-13 03:33:00,2022-03-13 03:47:00,Station-30,6.19,0,4317937,CKB +LINE_13,Station-30,2022-03-13 03:47:00,2022-03-13 03:53:00,Station-29,2555,0,4317937,CKB +LINE_13,Station-29,2022-03-13 03:53:00,2022-03-13 04:00:00,Station-30,2577,9,4317937,CKB +LINE_14,Station-30,2022-03-13 04:09:00,2022-03-13 04:24:00,Station-31,5937,9,4317937,CKB +LINE_14,Station-31,2022-03-13 04:33:00,2022-03-13 04:47:00,Station-30,6.19,0,4317937,CKB +LINE_13,Station-30,2022-03-13 04:47:00,2022-03-13 04:53:00,Station-29,2555,0,4317937,CKB +LINE_13,Station-29,2022-03-13 04:53:00,2022-03-13 05:00:00,Station-30,2577,9,4317937,CKB +LINE_14,Station-30,2022-03-13 05:09:00,2022-03-13 05:24:00,Station-31,5937,9,4317937,CKB +LINE_14,Station-31,2022-03-13 05:33:00,2022-03-13 05:47:00,Station-30,6.19,0,4317937,CKB +LINE_13,Station-30,2022-03-13 05:47:00,2022-03-13 05:53:00,Station-29,2555,0,4317937,CKB +LINE_13,Station-29,2022-03-13 05:53:00,2022-03-13 06:00:00,Station-30,2577,9,4317937,CKB +LINE_14,Station-30,2022-03-13 06:09:00,2022-03-13 06:24:00,Station-31,5937,9,4317937,CKB +LINE_14,Station-31,2022-03-13 06:33:00,2022-03-13 06:47:00,Station-30,6.19,0,4317937,CKB +LINE_14,Station-30,2022-03-13 06:47:00,2022-03-13 06:47:00,Station-0,0.06,0,4317937,CKB +LINE_15,Station-0,2022-03-13 00:57:00,2022-03-13 00:57:00,Station-32,0.06,0,4319402,CKB +LINE_15,Station-32,2022-03-13 00:57:00,2022-03-13 01:06:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 01:06:00,2022-03-13 01:11:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 01:27:00,2022-03-13 01:36:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 01:36:00,2022-03-13 01:41:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 01:57:00,2022-03-13 02:06:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 02:06:00,2022-03-13 02:11:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 02:27:00,2022-03-13 02:36:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 02:36:00,2022-03-13 02:41:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 02:57:00,2022-03-13 03:06:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 03:06:00,2022-03-13 03:11:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 03:27:00,2022-03-13 03:36:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 03:36:00,2022-03-13 03:41:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 03:57:00,2022-03-13 04:06:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 04:06:00,2022-03-13 04:11:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 04:27:00,2022-03-13 04:36:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 04:36:00,2022-03-13 04:41:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 04:57:00,2022-03-13 05:06:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 05:06:00,2022-03-13 05:11:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 05:27:00,2022-03-13 05:36:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 05:36:00,2022-03-13 05:41:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 05:57:00,2022-03-13 06:06:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 06:06:00,2022-03-13 06:11:00,Station-32,2936,16,4319402,CKB +LINE_15,Station-32,2022-03-13 06:27:00,2022-03-13 06:36:00,Station-33,4343,0,4319402,CKB +LINE_15,Station-33,2022-03-13 06:36:00,2022-03-13 06:41:00,Station-32,2936,0,4319402,CKB +LINE_15,Station-32,2022-03-13 06:41:00,2022-03-13 06:41:00,Station-0,0.06,0,4319402,CKB +LINE_17,Station-0,2022-03-13 00:30:00,2022-03-13 00:30:00,Station-34,0.06,0,4453948,CKB +LINE_17,Station-34,2022-03-13 00:30:00,2022-03-13 00:44:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 00:44:00,2022-03-13 00:57:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 01:00:00,2022-03-13 01:14:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 01:14:00,2022-03-13 01:27:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 01:30:00,2022-03-13 01:44:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 01:44:00,2022-03-13 01:57:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 02:00:00,2022-03-13 02:14:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 02:14:00,2022-03-13 02:27:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 02:30:00,2022-03-13 02:44:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 02:44:00,2022-03-13 02:57:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 03:00:00,2022-03-13 03:14:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 03:14:00,2022-03-13 03:27:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 03:30:00,2022-03-13 03:44:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 03:44:00,2022-03-13 03:57:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 04:00:00,2022-03-13 04:14:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 04:14:00,2022-03-13 04:27:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 04:30:00,2022-03-13 04:44:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 04:44:00,2022-03-13 04:57:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 05:00:00,2022-03-13 05:14:00,Station-36,4801,0,4453948,CKB +LINE_17,Station-36,2022-03-13 05:14:00,2022-03-13 05:27:00,Station-34,5302,3,4453948,CKB +LINE_17,Station-34,2022-03-13 05:30:00,2022-03-13 05:44:00,Station-36,4.8,0,4453948,CKB +LINE_17,Station-36,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-34,5301,4,4453948,CKB +LINE_17,Station-34,2022-03-13 06:00:00,2022-03-13 06:14:00,Station-36,4.8,0,4453948,CKB +LINE_17,Station-36,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-34,5301,4,4453948,CKB +LINE_17,Station-34,2022-03-13 06:30:00,2022-03-13 06:44:00,Station-36,4.8,0,4453948,CKB +LINE_17,Station-36,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-34,5301,0,4453948,CKB +LINE_17,Station-34,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,4453948,CKB +LINE_20,Station-0,2022-03-13 00:32:00,2022-03-13 00:32:00,Station-13,0.06,0,4747669,CKB +LINE_20,Station-13,2022-03-13 00:32:00,2022-03-13 00:44:00,Station-40,4212,3,4747669,CKB +LINE_20,Station-40,2022-03-13 00:47:00,2022-03-13 01:16:00,Station-41,13048,0,4747669,CKB +LINE_20,Station-41,2022-03-13 01:16:00,2022-03-13 01:42:00,Station-40,12869,5,4747669,CKB +LINE_20,Station-40,2022-03-13 01:47:00,2022-03-13 02:16:00,Station-41,13048,0,4747669,CKB +LINE_20,Station-41,2022-03-13 02:16:00,2022-03-13 02:42:00,Station-40,12869,5,4747669,CKB +LINE_20,Station-40,2022-03-13 02:47:00,2022-03-13 03:16:00,Station-41,13048,0,4747669,CKB +LINE_20,Station-41,2022-03-13 03:16:00,2022-03-13 03:42:00,Station-40,12869,5,4747669,CKB +LINE_20,Station-40,2022-03-13 03:47:00,2022-03-13 04:16:00,Station-41,13048,0,4747669,CKB +LINE_20,Station-41,2022-03-13 04:16:00,2022-03-13 04:42:00,Station-40,12869,5,4747669,CKB +LINE_20,Station-40,2022-03-13 04:47:00,2022-03-13 05:16:00,Station-41,13048,0,4747669,CKB +LINE_20,Station-41,2022-03-13 05:16:00,2022-03-13 05:42:00,Station-40,12869,5,4747669,CKB +LINE_20,Station-40,2022-03-13 05:47:00,2022-03-13 06:16:00,Station-41,13048,0,4747669,CKB +LINE_20,Station-41,2022-03-13 06:16:00,2022-03-13 06:42:00,Station-40,12869,0,4747669,CKB +LINE_20,Station-40,2022-03-13 06:42:00,2022-03-13 06:42:00,Station-0,0.06,0,4747669,CKB +LINE_20,Station-0,2022-03-13 00:17:00,2022-03-13 00:17:00,Station-40,0.06,0,4747671,CKB +LINE_20,Station-40,2022-03-13 00:17:00,2022-03-13 00:46:00,Station-41,13048,0,4747671,CKB +LINE_20,Station-41,2022-03-13 00:46:00,2022-03-13 01:12:00,Station-40,12869,5,4747671,CKB +LINE_20,Station-40,2022-03-13 01:17:00,2022-03-13 01:46:00,Station-41,13048,0,4747671,CKB +LINE_20,Station-41,2022-03-13 01:46:00,2022-03-13 02:12:00,Station-40,12869,5,4747671,CKB +LINE_20,Station-40,2022-03-13 02:17:00,2022-03-13 02:46:00,Station-41,13048,0,4747671,CKB +LINE_20,Station-41,2022-03-13 02:46:00,2022-03-13 03:12:00,Station-40,12869,5,4747671,CKB +LINE_20,Station-40,2022-03-13 03:17:00,2022-03-13 03:46:00,Station-41,13048,0,4747671,CKB +LINE_20,Station-41,2022-03-13 03:46:00,2022-03-13 04:12:00,Station-40,12869,5,4747671,CKB +LINE_20,Station-40,2022-03-13 04:17:00,2022-03-13 04:46:00,Station-41,13048,0,4747671,CKB +LINE_20,Station-41,2022-03-13 04:46:00,2022-03-13 05:12:00,Station-40,12869,5,4747671,CKB +LINE_20,Station-40,2022-03-13 05:17:00,2022-03-13 05:46:00,Station-41,13048,0,4747671,CKB +LINE_20,Station-41,2022-03-13 05:46:00,2022-03-13 06:12:00,Station-40,12869,5,4747671,CKB +LINE_20,Station-40,2022-03-13 06:17:00,2022-03-13 06:46:00,Station-41,13048,0,4747671,CKB +LINE_20,Station-41,2022-03-13 06:46:00,2022-03-13 07:12:00,Station-40,12869,0,4747671,CKB +LINE_20,Station-40,2022-03-13 07:12:00,2022-03-13 07:12:00,Station-0,0.06,0,4747671,CKB +LINE_21,Station-0,2022-03-13 00:49:00,2022-03-13 00:49:00,Station-3,0.06,0,4434314,CKB +LINE_21,Station-3,2022-03-13 00:49:00,2022-03-13 01:04:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 01:04:00,2022-03-13 01:19:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 01:19:00,2022-03-13 01:34:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 01:34:00,2022-03-13 01:49:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 01:49:00,2022-03-13 02:04:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 02:04:00,2022-03-13 02:19:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 02:19:00,2022-03-13 02:34:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 02:34:00,2022-03-13 02:49:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 02:49:00,2022-03-13 03:04:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 03:04:00,2022-03-13 03:19:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 03:19:00,2022-03-13 03:34:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 03:34:00,2022-03-13 03:49:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 03:49:00,2022-03-13 04:04:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 04:04:00,2022-03-13 04:19:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 04:19:00,2022-03-13 04:34:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 04:34:00,2022-03-13 04:49:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 04:49:00,2022-03-13 05:04:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 05:04:00,2022-03-13 05:19:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 05:19:00,2022-03-13 05:34:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 05:34:00,2022-03-13 05:49:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 05:49:00,2022-03-13 06:04:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 06:04:00,2022-03-13 06:19:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 06:19:00,2022-03-13 06:34:00,Station-16,10229,0,4434314,CKB +LINE_21,Station-16,2022-03-13 06:34:00,2022-03-13 06:49:00,Station-3,11801,0,4434314,CKB +LINE_21,Station-3,2022-03-13 06:49:00,2022-03-13 06:49:00,Station-0,0.06,0,4434314,CKB +LINE_23,Station-0,2022-03-13 02:34:00,2022-03-13 02:34:00,Station-45,0.06,0,4524178,CKB +LINE_23,Station-45,2022-03-13 02:34:00,2022-03-13 03:00:00,Station-46,9016,0,4524178,CKB +LINE_23,Station-46,2022-03-13 03:00:00,2022-03-13 03:27:00,Station-45,10083,7,4524178,CKB +LINE_23,Station-45,2022-03-13 03:34:00,2022-03-13 04:00:00,Station-46,9016,0,4524178,CKB +LINE_23,Station-46,2022-03-13 04:00:00,2022-03-13 04:27:00,Station-45,10083,7,4524178,CKB +LINE_23,Station-45,2022-03-13 04:34:00,2022-03-13 05:00:00,Station-46,9016,0,4524178,CKB +LINE_23,Station-46,2022-03-13 05:00:00,2022-03-13 05:27:00,Station-45,10083,7,4524178,CKB +LINE_23,Station-45,2022-03-13 05:34:00,2022-03-13 06:00:00,Station-46,9016,0,4524178,CKB +LINE_23,Station-46,2022-03-13 06:00:00,2022-03-13 06:27:00,Station-45,10083,7,4524178,CKB +LINE_23,Station-45,2022-03-13 06:34:00,2022-03-13 07:00:00,Station-46,9016,0,4524178,CKB +LINE_23,Station-46,2022-03-13 07:00:00,2022-03-13 07:00:00,Station-0,0.06,0,4524178,CKB +LINE_23,Station-0,2022-03-13 02:04:00,2022-03-13 02:04:00,Station-45,0.06,0,4619808,CKB +LINE_23,Station-45,2022-03-13 02:04:00,2022-03-13 02:30:00,Station-46,9016,0,4619808,CKB +LINE_23,Station-46,2022-03-13 02:30:00,2022-03-13 02:57:00,Station-45,10083,7,4619808,CKB +LINE_23,Station-45,2022-03-13 03:04:00,2022-03-13 03:30:00,Station-46,9016,0,4619808,CKB +LINE_23,Station-46,2022-03-13 03:30:00,2022-03-13 03:57:00,Station-45,10083,7,4619808,CKB +LINE_23,Station-45,2022-03-13 04:04:00,2022-03-13 04:30:00,Station-46,9016,0,4619808,CKB +LINE_23,Station-46,2022-03-13 04:30:00,2022-03-13 04:57:00,Station-45,10083,7,4619808,CKB +LINE_23,Station-45,2022-03-13 05:04:00,2022-03-13 05:30:00,Station-46,9016,0,4619808,CKB +LINE_23,Station-46,2022-03-13 05:30:00,2022-03-13 05:57:00,Station-45,10083,7,4619808,CKB +LINE_23,Station-45,2022-03-13 06:04:00,2022-03-13 06:30:00,Station-46,9016,0,4619808,CKB +LINE_23,Station-46,2022-03-13 06:30:00,2022-03-13 06:57:00,Station-45,10083,0,4619808,CKB +LINE_23,Station-45,2022-03-13 06:57:00,2022-03-13 06:57:00,Station-0,0.06,0,4619808,CKB +LINE_24,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,4374748,CKB +LINE_24,Station-21,2022-03-13 00:31:00,2022-03-13 00:44:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 00:44:00,2022-03-13 00:56:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 01:01:00,2022-03-13 01:14:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 01:14:00,2022-03-13 01:26:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 01:31:00,2022-03-13 01:44:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 01:44:00,2022-03-13 01:56:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 02:01:00,2022-03-13 02:14:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 02:14:00,2022-03-13 02:26:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 02:31:00,2022-03-13 02:44:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 02:44:00,2022-03-13 02:56:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 03:01:00,2022-03-13 03:14:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 03:14:00,2022-03-13 03:26:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 03:31:00,2022-03-13 03:44:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 03:44:00,2022-03-13 03:56:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 04:01:00,2022-03-13 04:14:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 04:14:00,2022-03-13 04:26:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 04:31:00,2022-03-13 04:44:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 04:44:00,2022-03-13 04:56:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 05:01:00,2022-03-13 05:14:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 05:14:00,2022-03-13 05:26:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 05:31:00,2022-03-13 05:44:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 06:01:00,2022-03-13 06:14:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-21,5362,5,4374748,CKB +LINE_24,Station-21,2022-03-13 06:31:00,2022-03-13 06:44:00,Station-47,4872,0,4374748,CKB +LINE_24,Station-47,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-21,5362,0,4374748,CKB +LINE_24,Station-21,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,4374748,CKB +LINE_25,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,4374871,CKB +LINE_25,Station-21,2022-03-13 00:31:00,2022-03-13 00:45:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 00:47:00,2022-03-13 01:01:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 01:01:00,2022-03-13 01:15:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 01:17:00,2022-03-13 01:31:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 01:31:00,2022-03-13 01:45:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 01:47:00,2022-03-13 02:01:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 02:01:00,2022-03-13 02:15:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 02:17:00,2022-03-13 02:31:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 02:31:00,2022-03-13 02:45:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 02:47:00,2022-03-13 03:01:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 03:01:00,2022-03-13 03:15:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 03:17:00,2022-03-13 03:31:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 03:31:00,2022-03-13 03:45:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 03:47:00,2022-03-13 04:01:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 04:01:00,2022-03-13 04:15:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 04:17:00,2022-03-13 04:31:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 04:31:00,2022-03-13 04:45:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 04:47:00,2022-03-13 05:01:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 05:01:00,2022-03-13 05:15:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 05:17:00,2022-03-13 05:31:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 05:31:00,2022-03-13 05:45:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 05:47:00,2022-03-13 06:01:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 06:01:00,2022-03-13 06:15:00,Station-48,5225,2,4374871,CKB +LINE_25,Station-48,2022-03-13 06:17:00,2022-03-13 06:31:00,Station-21,7617,0,4374871,CKB +LINE_25,Station-21,2022-03-13 06:31:00,2022-03-13 06:45:00,Station-48,5096,0,4374871,CKB +LINE_25,Station-48,2022-03-13 06:45:00,2022-03-13 06:45:00,Station-0,0.06,0,4374871,CKB +LINE_26,Station-0,2022-03-13 00:43:00,2022-03-13 00:43:00,Station-49,0.06,0,4375017,CKB +LINE_26,Station-49,2022-03-13 00:43:00,2022-03-13 00:53:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 00:53:00,2022-03-13 01:03:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 01:13:00,2022-03-13 01:23:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 01:23:00,2022-03-13 01:33:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 01:43:00,2022-03-13 01:53:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 01:53:00,2022-03-13 02:03:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 02:13:00,2022-03-13 02:23:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 02:23:00,2022-03-13 02:33:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 02:43:00,2022-03-13 02:53:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 02:53:00,2022-03-13 03:03:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 03:13:00,2022-03-13 03:23:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 03:23:00,2022-03-13 03:33:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 03:43:00,2022-03-13 03:53:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 03:53:00,2022-03-13 04:03:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 04:13:00,2022-03-13 04:23:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 04:23:00,2022-03-13 04:33:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 04:43:00,2022-03-13 04:53:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 04:53:00,2022-03-13 05:03:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 05:13:00,2022-03-13 05:23:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 05:23:00,2022-03-13 05:33:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 05:43:00,2022-03-13 05:53:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 05:53:00,2022-03-13 06:03:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 06:13:00,2022-03-13 06:23:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 06:23:00,2022-03-13 06:33:00,Station-49,4408,10,4375017,CKB +LINE_26,Station-49,2022-03-13 06:43:00,2022-03-13 06:53:00,Station-50,4507,0,4375017,CKB +LINE_26,Station-50,2022-03-13 06:53:00,2022-03-13 07:03:00,Station-49,4408,0,4375017,CKB +LINE_26,Station-49,2022-03-13 07:03:00,2022-03-13 07:03:00,Station-0,0.06,0,4375017,CKB From 4acac3693578295d54b14f81e1df833e0974e7f7 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 20 Apr 2022 10:30:59 +0200 Subject: [PATCH 126/802] Connect vehicles to first departure station --- ebus_toolbox/schedule.py | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 0607330b..ea0f043d 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -275,35 +275,41 @@ def generate_scenario_json(self, args): v_name = vehicle_id vt = vehicle_id.split("_")[0] ct = vehicle_id.split("_")[1] + + # filter all rides for that bus + vehicle_rotations = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} + # sort events for their departure time, so that the matching departure time of an + # arrival event can be read out of the next element in vid_list + vehicle_rotations = {k: v for k, v in sorted( + vehicle_rotations.items(), key=lambda x: x[1].departure_time)} + rotation_ids = list(vehicle_rotations.keys()) + # define start conditions + first_rotation = list(vehicle_rotations.values())[0] vehicles[v_name] = { - "connected_charging_station": None, - "estimated_time_of_departure": None, + "connected_charging_station": f'{v_name}_{first_rotation.departure_name}_deps', + "estimated_time_of_departure": first_rotation.departure_time.isoformat(), "desired_soc": None, "soc": args.desired_soc, "vehicle_type": vt + "_" + ct } - # filter all rides for that bus - v_id = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} - # sort events for their departure time, so that the matching departure time of an - # arrival event can be read out of the next element in vid_list - v_id = {k: v for k, v in sorted(v_id.items(), key=lambda x: x[1].departure_time)} - key_list = list(v_id.keys()) - for i, v in enumerate(key_list): + + for i, v in enumerate(rotation_ids): departure_event_in_input = True # create events for all trips of one rotation - for j, trip in enumerate(v_id[v].trips): + for j, trip in enumerate(vehicle_rotations[v].trips): cs_name = "{}_{}".format(v_name, trip.arrival_name) gc_name = trip.arrival_name arrival = trip.arrival_time try: - departure = v_id[v].trips[j + 1].departure_time - next_arrival = v_id[v].trips[j + 1].arrival_time + departure = vehicle_rotations[v].trips[j + 1].departure_time + next_arrival = vehicle_rotations[v].trips[j + 1].arrival_time except IndexError: # get departure of the first trip of the next rotation try: - departure = v_id[key_list[i + 1]].departure_time - next_arrival = v_id[key_list[i + 1]].trips[0].arrival_time + departure = vehicle_rotations[rotation_ids[i + 1]].departure_time + next_arrival = \ + vehicle_rotations[rotation_ids[i + 1]].trips[0].arrival_time except IndexError: departure_event_in_input = False departure = arrival + datetime.timedelta(hours=8) From d666a2c853d69294a049180d35713b8782e020e8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 20 Apr 2022 10:55:16 +0200 Subject: [PATCH 127/802] print negative rotation ids after last iteration --- ebus_toolbox/schedule.py | 2 +- ebus_toolbox/simulate.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ea0f043d..c680472b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -195,7 +195,7 @@ def readjust_charging_type(self, args): """ negative_rotations = self.get_negative_rotations(args) - print(f"Rotations {self.get_negative_rotations(args)} have negative SoC.") + print(f"Rotations {negative_rotations} have negative SoC.") print("Adjust charging types for rotations with negative soc.") for rot in negative_rotations: diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 66df77af..1af47840 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -51,6 +51,7 @@ def simulate(args): print("Spice EV simulation complete.") if i == args.iterations: + print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") break # TODO: replace with optimizer step in the future From 24cf00db372fc7002da586d19407e45f0bc2b811 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Apr 2022 14:47:46 +0200 Subject: [PATCH 128/802] do not print warnings generated by spiceev --- ebus_toolbox/simulate.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1af47840..3d6dfbe0 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,7 +1,5 @@ # imports import json -import sys -import os import warnings from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule @@ -32,10 +30,8 @@ def simulate(args): schedule.filter_rotations() schedule.calculate_consumption() schedule.set_charging_type(preferred_ct=args.preferred_charging_type, args=args) - # initialize optimizer - i = 0 - while(True): - i += 1 + + for i in range(args.iterations): # construct szenario and simulate in spice ev until optimizer is happy # if optimizer None, quit after single iteration schedule.delta_soc_all_trips() @@ -45,17 +41,16 @@ def simulate(args): # RUN SPICE EV print("Running Spice EV...") - sys.stdout = open(os.devnull, 'w') - spice_ev.simulate(args) - sys.stdout = sys.__stdout__ - print("Spice EV simulation complete.") + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + spice_ev.simulate(args) + print(f"Spice EV simulation complete. (Iteration {i})") - if i == args.iterations: - print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") - break + if i < args.iterations - 1: + # TODO: replace with optimizer step in the future + schedule.readjust_charging_type(args) - # TODO: replace with optimizer step in the future - schedule.readjust_charging_type(args) + print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") # create report report.generate() From b12d1d37df9af0d0cbccb717ffefe2376fa74510 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Apr 2022 15:14:24 +0200 Subject: [PATCH 129/802] Use spiceEV dev branch in requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 260cd279..dc2070c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ numpy >= 1.12.0 matplotlib --e git+https://github.com/rl-institut/spice_ev.git@feature/add_setup_v2#egg=spiceev +-e git+https://github.com/rl-institut/spice_ev.git@dev#egg=spiceev From a41111613634e9553a3f75fce74ff6f7a3b51adf Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Apr 2022 15:22:56 +0200 Subject: [PATCH 130/802] import spice_ev with original folder strucutre --- ebus_toolbox/simulate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 3d6dfbe0..1d007dc6 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -6,7 +6,7 @@ from ebus_toolbox.trip import Trip from ebus_toolbox import report # , optimizer # SPICE EV SIMULATE -from spice_ev import simulate as spice_ev +import simulate as spice_ev def simulate(args): From 69df0f7b95c30508a91237764d20f2f5f581aa45 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Apr 2022 16:30:16 +0200 Subject: [PATCH 131/802] anonymise rotation ids in trips examples --- data/examples/trips_example.csv | 7914 +++++++++++++++---------------- 1 file changed, 3957 insertions(+), 3957 deletions(-) diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 90b5a733..844fbe3b 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,3958 +1,3958 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,4454943,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,4454943,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,4454943,CKB -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,4454943,CKB -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,4454943,CKB -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,4454943,CKB -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,4454943,CKB -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,4454943,CKB -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,4454943,CKB -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,4454943,CKB -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,4454943,CKB -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,4454943,CKB -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,4454943,CKB -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,4454943,CKB -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,4454948,CKB -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,4454948,CKB -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,4454948,CKB -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,4454948,CKB -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,4454948,CKB -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,4454948,CKB -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,4454948,CKB -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,4454948,CKB -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,4454948,CKB -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,4454948,CKB -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,4454948,CKB -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,4454948,CKB -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,4454948,CKB -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,4454948,CKB -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,4664622,CKB -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,4664622,CKB -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,4664622,CKB -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,4664622,CKB -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,4664622,CKB -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,4664622,CKB -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,4664622,CKB -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,4664622,CKB -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,4664622,CKB -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,4664622,CKB -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,4664622,CKB -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,4664622,CKB -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,4664622,CKB -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,4664622,CKB -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,4664622,CKB -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,4664622,CKB -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,4664622,CKB -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4762732,CKB -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4762732,CKB -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4762732,CKB -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4762732,CKB -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4762732,CKB -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4762732,CKB -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4762732,CKB -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4762732,CKB -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4762732,CKB -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4762732,CKB -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4762732,CKB -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4762732,CKB -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4762732,CKB -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4762732,CKB -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4762732,CKB -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4762732,CKB -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4762732,CKB -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4762732,CKB -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4762732,CKB -LINE_5,Station-0,2022-03-07 22:56:00,2022-03-07 22:56:00,Station-14,0.06,0,4617401,CKB -LINE_5,Station-14,2022-03-07 22:56:00,2022-03-07 23:08:00,Station-15,5882,3,4617401,CKB -LINE_5,Station-15,2022-03-07 23:11:00,2022-03-07 23:25:00,Station-14,6232,0,4617401,CKB -LINE_5,Station-14,2022-03-07 23:25:00,2022-03-07 23:38:00,Station-15,6086,3,4617401,CKB -LINE_5,Station-15,2022-03-07 23:41:00,2022-03-07 23:55:00,Station-14,6232,0,4617401,CKB -LINE_5,Station-14,2022-03-07 23:55:00,2022-03-08 00:08:00,Station-15,6086,0,4617401,CKB -LINE_5,Station-15,2022-03-08 00:08:00,2022-03-08 00:08:00,Station-0,0.06,0,4617401,CKB -LINE_6,Station-0,2022-03-07 05:05:00,2022-03-07 05:05:00,Station-16,0.06,0,4426844,CKB -LINE_6,Station-16,2022-03-07 05:05:00,2022-03-07 05:14:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 05:14:00,2022-03-07 05:23:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 05:25:00,2022-03-07 05:34:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 05:34:00,2022-03-07 05:43:00,Station-16,5139,23,4426844,CKB -LINE_6,Station-16,2022-03-07 06:06:00,2022-03-07 06:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 06:15:00,2022-03-07 06:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 06:26:00,2022-03-07 06:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 06:35:00,2022-03-07 06:44:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 06:46:00,2022-03-07 06:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 06:55:00,2022-03-07 07:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 07:06:00,2022-03-07 07:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 07:15:00,2022-03-07 07:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 07:26:00,2022-03-07 07:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 07:35:00,2022-03-07 07:44:00,Station-16,5139,22,4426844,CKB -LINE_6,Station-16,2022-03-07 08:06:00,2022-03-07 08:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 08:15:00,2022-03-07 08:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 08:26:00,2022-03-07 08:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 08:35:00,2022-03-07 08:44:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 08:46:00,2022-03-07 08:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 08:55:00,2022-03-07 09:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 09:06:00,2022-03-07 09:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 09:15:00,2022-03-07 09:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 09:26:00,2022-03-07 09:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 09:35:00,2022-03-07 09:44:00,Station-16,5139,22,4426844,CKB -LINE_6,Station-16,2022-03-07 10:06:00,2022-03-07 10:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 10:15:00,2022-03-07 10:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 10:26:00,2022-03-07 10:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 10:35:00,2022-03-07 10:44:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 10:46:00,2022-03-07 10:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 10:55:00,2022-03-07 11:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 11:06:00,2022-03-07 11:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 11:15:00,2022-03-07 11:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 11:26:00,2022-03-07 11:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 11:35:00,2022-03-07 11:44:00,Station-16,5139,22,4426844,CKB -LINE_6,Station-16,2022-03-07 12:06:00,2022-03-07 12:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 12:15:00,2022-03-07 12:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 12:26:00,2022-03-07 12:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 12:35:00,2022-03-07 12:44:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 12:46:00,2022-03-07 12:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 12:55:00,2022-03-07 13:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 13:06:00,2022-03-07 13:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 13:15:00,2022-03-07 13:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 13:26:00,2022-03-07 13:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 13:35:00,2022-03-07 13:44:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 13:46:00,2022-03-07 13:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 13:55:00,2022-03-07 14:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 14:06:00,2022-03-07 14:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 14:15:00,2022-03-07 14:24:00,Station-16,5139,22,4426844,CKB -LINE_6,Station-16,2022-03-07 14:46:00,2022-03-07 14:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 14:55:00,2022-03-07 15:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 15:06:00,2022-03-07 15:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 15:15:00,2022-03-07 15:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 15:26:00,2022-03-07 15:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 15:35:00,2022-03-07 15:44:00,Station-16,5139,22,4426844,CKB -LINE_6,Station-16,2022-03-07 16:06:00,2022-03-07 16:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 16:15:00,2022-03-07 16:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 16:26:00,2022-03-07 16:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 16:35:00,2022-03-07 16:44:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 16:46:00,2022-03-07 16:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 16:55:00,2022-03-07 17:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 17:06:00,2022-03-07 17:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 17:15:00,2022-03-07 17:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 17:26:00,2022-03-07 17:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 17:35:00,2022-03-07 17:44:00,Station-16,5139,22,4426844,CKB -LINE_6,Station-16,2022-03-07 18:06:00,2022-03-07 18:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 18:15:00,2022-03-07 18:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 18:26:00,2022-03-07 18:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 18:35:00,2022-03-07 18:44:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 18:46:00,2022-03-07 18:55:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 18:55:00,2022-03-07 19:04:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 19:06:00,2022-03-07 19:15:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 19:15:00,2022-03-07 19:24:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 19:26:00,2022-03-07 19:35:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 19:35:00,2022-03-07 19:44:00,Station-16,5139,21,4426844,CKB -LINE_6,Station-16,2022-03-07 20:05:00,2022-03-07 20:14:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 20:14:00,2022-03-07 20:23:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 20:25:00,2022-03-07 20:34:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 20:34:00,2022-03-07 20:43:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 20:45:00,2022-03-07 20:54:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 20:54:00,2022-03-07 21:03:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 21:05:00,2022-03-07 21:14:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 21:14:00,2022-03-07 21:23:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 21:25:00,2022-03-07 21:34:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 21:34:00,2022-03-07 21:43:00,Station-16,5139,22,4426844,CKB -LINE_6,Station-16,2022-03-07 22:05:00,2022-03-07 22:14:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 22:14:00,2022-03-07 22:23:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 22:25:00,2022-03-07 22:34:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 22:34:00,2022-03-07 22:43:00,Station-16,5139,2,4426844,CKB -LINE_6,Station-16,2022-03-07 22:45:00,2022-03-07 22:54:00,Station-17,4781,0,4426844,CKB -LINE_6,Station-17,2022-03-07 22:54:00,2022-03-07 23:03:00,Station-16,5139,0,4426844,CKB -LINE_6,Station-16,2022-03-07 23:03:00,2022-03-07 23:03:00,Station-0,0.06,0,4426844,CKB -LINE_7,Station-0,2022-03-08 00:06:00,2022-03-08 00:06:00,Station-18,0.06,0,4708594,CKB -LINE_7,Station-18,2022-03-08 00:06:00,2022-03-08 00:27:00,Station-19,7827,0,4708594,CKB -LINE_8,Station-19,2022-03-08 00:27:00,2022-03-08 00:48:00,Station-20,11079,0,4708594,CKB -LINE_8,Station-20,2022-03-08 00:48:00,2022-03-08 01:25:00,Station-21,20641,8,4708594,CKB -LINE_8,Station-21,2022-03-08 01:33:00,2022-03-08 02:16:00,Station-20,20579,1,4708594,CKB -LINE_8,Station-20,2022-03-08 02:17:00,2022-03-08 02:55:00,Station-21,20641,8,4708594,CKB -LINE_8,Station-21,2022-03-08 03:03:00,2022-03-08 03:46:00,Station-20,20579,1,4708594,CKB -LINE_8,Station-20,2022-03-08 03:47:00,2022-03-08 04:25:00,Station-21,20641,0,4708594,CKB -LINE_8,Station-21,2022-03-08 04:25:00,2022-03-08 04:25:00,Station-0,0.06,0,4708594,CKB -LINE_9,Station-22,2022-03-07 05:15:00,2022-03-07 06:01:00,Station-23,17.9,0,4317624,VDL -LINE_9,Station-23,2022-03-07 06:01:00,2022-03-07 06:15:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 06:23:00,2022-03-07 06:37:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 06:41:00,2022-03-07 06:55:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 07:03:00,2022-03-07 07:17:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 07:21:00,2022-03-07 07:35:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 07:43:00,2022-03-07 07:57:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 08:01:00,2022-03-07 08:15:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 08:23:00,2022-03-07 08:37:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 08:41:00,2022-03-07 08:55:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 09:03:00,2022-03-07 09:17:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 09:21:00,2022-03-07 09:35:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 09:43:00,2022-03-07 09:57:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 10:01:00,2022-03-07 10:15:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 10:23:00,2022-03-07 10:37:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 10:41:00,2022-03-07 10:55:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 11:03:00,2022-03-07 11:17:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 11:21:00,2022-03-07 11:35:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 11:43:00,2022-03-07 11:57:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 12:01:00,2022-03-07 12:15:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 12:23:00,2022-03-07 12:37:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 12:41:00,2022-03-07 12:55:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 13:03:00,2022-03-07 13:17:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 13:21:00,2022-03-07 13:35:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 13:43:00,2022-03-07 13:57:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 14:01:00,2022-03-07 14:15:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 14:23:00,2022-03-07 14:37:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 14:41:00,2022-03-07 14:55:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 15:03:00,2022-03-07 15:17:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 15:21:00,2022-03-07 15:35:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 15:43:00,2022-03-07 15:57:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 16:01:00,2022-03-07 16:15:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 16:23:00,2022-03-07 16:37:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 16:41:00,2022-03-07 16:55:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 17:03:00,2022-03-07 17:17:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 17:21:00,2022-03-07 17:35:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 17:43:00,2022-03-07 17:57:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 18:01:00,2022-03-07 18:15:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 18:23:00,2022-03-07 18:37:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 18:41:00,2022-03-07 18:55:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 19:03:00,2022-03-07 19:17:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 19:21:00,2022-03-07 19:35:00,Station-23,4637,8,4317624,VDL -LINE_9,Station-23,2022-03-07 19:43:00,2022-03-07 19:57:00,Station-23,4637,4,4317624,VDL -LINE_9,Station-23,2022-03-07 20:01:00,2022-03-07 20:14:00,Station-23,4637,9,4317624,VDL -LINE_9,Station-23,2022-03-07 20:23:00,2022-03-07 20:36:00,Station-23,4637,0,4317624,VDL -LINE_9,Station-23,2022-03-07 20:36:00,2022-03-07 21:15:00,Station-22,19.8,0,4317624,VDL -LINE_10,Station-0,2022-03-07 04:56:00,2022-03-07 04:56:00,Station-24,0.06,18,4425667,CKB -LINE_10,Station-24,2022-03-07 05:14:00,2022-03-07 05:20:00,Station-25,3.29,0,4425667,CKB -LINE_10,Station-25,2022-03-07 05:20:00,2022-03-07 05:24:00,Station-24,2954,20,4425667,CKB -LINE_10,Station-24,2022-03-07 05:44:00,2022-03-07 05:50:00,Station-25,3.29,0,4425667,CKB -LINE_10,Station-25,2022-03-07 05:50:00,2022-03-07 05:54:00,Station-24,2954,5,4425667,CKB -LINE_10,Station-24,2022-03-07 05:59:00,2022-03-07 06:06:00,Station-25,3.29,2,4425667,CKB -LINE_10,Station-25,2022-03-07 06:08:00,2022-03-07 06:13:00,Station-24,2954,19,4425667,CKB -LINE_10,Station-24,2022-03-07 06:32:00,2022-03-07 06:39:00,Station-25,3.29,1,4425667,CKB -LINE_10,Station-25,2022-03-07 06:40:00,2022-03-07 06:45:00,Station-24,2954,7,4425667,CKB -LINE_10,Station-24,2022-03-07 06:52:00,2022-03-07 06:59:00,Station-25,3.29,1,4425667,CKB -LINE_10,Station-25,2022-03-07 07:00:00,2022-03-07 07:05:00,Station-24,2954,7,4425667,CKB -LINE_10,Station-24,2022-03-07 07:12:00,2022-03-07 07:19:00,Station-25,3.29,1,4425667,CKB -LINE_10,Station-25,2022-03-07 07:20:00,2022-03-07 07:25:00,Station-24,2954,7,4425667,CKB -LINE_10,Station-24,2022-03-07 07:32:00,2022-03-07 07:39:00,Station-25,3.29,1,4425667,CKB -LINE_10,Station-25,2022-03-07 07:40:00,2022-03-07 07:45:00,Station-24,2954,295,4425667,CKB -LINE_10,Station-24,2022-03-07 12:40:00,2022-03-07 12:47:00,Station-25,3.29,2,4425667,CKB -LINE_10,Station-25,2022-03-07 12:49:00,2022-03-07 12:54:00,Station-24,2954,46,4425667,CKB -LINE_10,Station-24,2022-03-07 13:40:00,2022-03-07 13:47:00,Station-25,3.29,2,4425667,CKB -LINE_10,Station-25,2022-03-07 13:49:00,2022-03-07 13:54:00,Station-24,2954,434,4425667,CKB -LINE_10,Station-24,2022-03-07 21:08:00,2022-03-07 21:08:00,Station-0,0.06,0,4425667,CKB -LINE_11,Station-0,2022-03-07 07:20:00,2022-03-07 07:20:00,Station-26,0.06,0,4448149,CKB -LINE_11,Station-26,2022-03-07 07:20:00,2022-03-07 07:50:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 08:00:00,2022-03-07 08:30:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 08:40:00,2022-03-07 09:10:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 09:20:00,2022-03-07 09:50:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 10:00:00,2022-03-07 10:30:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 10:40:00,2022-03-07 11:10:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 11:20:00,2022-03-07 11:50:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 12:00:00,2022-03-07 12:30:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 12:40:00,2022-03-07 13:10:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 13:20:00,2022-03-07 13:50:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 14:00:00,2022-03-07 14:30:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 14:40:00,2022-03-07 15:10:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 15:20:00,2022-03-07 15:50:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 16:00:00,2022-03-07 16:30:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 16:40:00,2022-03-07 17:10:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 17:20:00,2022-03-07 17:50:00,Station-26,9266,10,4448149,CKB -LINE_11,Station-26,2022-03-07 18:00:00,2022-03-07 18:30:00,Station-26,9266,0,4448149,CKB -LINE_11,Station-26,2022-03-07 18:30:00,2022-03-07 18:30:00,Station-0,0.06,0,4448149,CKB -LINE_12,Station-0,2022-03-07 07:10:00,2022-03-07 07:10:00,Station-27,0.06,0,4733894,CKB -LINE_12,Station-27,2022-03-07 07:10:00,2022-03-07 07:18:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 07:28:00,2022-03-07 07:40:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 07:40:00,2022-03-07 07:48:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 07:58:00,2022-03-07 08:10:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 08:10:00,2022-03-07 08:18:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 08:28:00,2022-03-07 08:40:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 08:40:00,2022-03-07 08:48:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 08:58:00,2022-03-07 09:10:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 09:10:00,2022-03-07 09:18:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 09:28:00,2022-03-07 09:40:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 09:40:00,2022-03-07 09:48:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 09:58:00,2022-03-07 10:10:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 10:10:00,2022-03-07 10:18:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 10:28:00,2022-03-07 10:40:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 10:40:00,2022-03-07 10:48:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 10:58:00,2022-03-07 11:10:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 11:10:00,2022-03-07 11:18:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 11:28:00,2022-03-07 11:40:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 11:40:00,2022-03-07 11:48:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 11:58:00,2022-03-07 12:10:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 12:10:00,2022-03-07 12:18:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 12:28:00,2022-03-07 12:40:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 12:40:00,2022-03-07 12:48:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 12:58:00,2022-03-07 13:10:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 13:10:00,2022-03-07 13:18:00,Station-28,2169,10,4733894,CKB -LINE_12,Station-28,2022-03-07 13:28:00,2022-03-07 13:40:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 13:40:00,2022-03-07 13:48:00,Station-28,2169,8,4733894,CKB -LINE_12,Station-28,2022-03-07 13:56:00,2022-03-07 14:10:00,Station-27,2952,0,4733894,CKB -LINE_12,Station-27,2022-03-07 14:10:00,2022-03-07 14:19:00,Station-28,2169,14,4733894,CKB -LINE_12,Station-28,2022-03-07 14:33:00,2022-03-07 14:47:00,Station-27,2952,3,4733894,CKB -LINE_12,Station-27,2022-03-07 14:50:00,2022-03-07 14:59:00,Station-28,2169,14,4733894,CKB -LINE_12,Station-28,2022-03-07 15:13:00,2022-03-07 15:27:00,Station-27,2952,3,4733894,CKB -LINE_12,Station-27,2022-03-07 15:30:00,2022-03-07 15:39:00,Station-28,2169,14,4733894,CKB -LINE_12,Station-28,2022-03-07 15:53:00,2022-03-07 16:07:00,Station-27,2952,3,4733894,CKB -LINE_12,Station-27,2022-03-07 16:10:00,2022-03-07 16:19:00,Station-28,2169,14,4733894,CKB -LINE_12,Station-28,2022-03-07 16:33:00,2022-03-07 16:47:00,Station-27,2952,3,4733894,CKB -LINE_12,Station-27,2022-03-07 16:50:00,2022-03-07 16:59:00,Station-28,2169,14,4733894,CKB -LINE_12,Station-28,2022-03-07 17:13:00,2022-03-07 17:27:00,Station-27,2952,3,4733894,CKB -LINE_12,Station-27,2022-03-07 17:30:00,2022-03-07 17:39:00,Station-28,2169,13,4733894,CKB -LINE_12,Station-28,2022-03-07 17:52:00,2022-03-07 18:05:00,Station-27,2952,5,4733894,CKB -LINE_12,Station-27,2022-03-07 18:10:00,2022-03-07 18:18:00,Station-28,2169,0,4733894,CKB -LINE_12,Station-28,2022-03-07 18:18:00,2022-03-07 18:18:00,Station-0,0.06,0,4733894,CKB -LINE_12,Station-0,2022-03-07 14:13:00,2022-03-07 14:13:00,Station-28,0.06,0,4734199,CKB -LINE_12,Station-28,2022-03-07 14:13:00,2022-03-07 14:27:00,Station-27,2952,3,4734199,CKB -LINE_12,Station-27,2022-03-07 14:30:00,2022-03-07 14:39:00,Station-28,2169,14,4734199,CKB -LINE_12,Station-28,2022-03-07 14:53:00,2022-03-07 15:07:00,Station-27,2952,3,4734199,CKB -LINE_12,Station-27,2022-03-07 15:10:00,2022-03-07 15:19:00,Station-28,2169,14,4734199,CKB -LINE_12,Station-28,2022-03-07 15:33:00,2022-03-07 15:47:00,Station-27,2952,3,4734199,CKB -LINE_12,Station-27,2022-03-07 15:50:00,2022-03-07 15:59:00,Station-28,2169,14,4734199,CKB -LINE_12,Station-28,2022-03-07 16:13:00,2022-03-07 16:27:00,Station-27,2952,3,4734199,CKB -LINE_12,Station-27,2022-03-07 16:30:00,2022-03-07 16:39:00,Station-28,2169,14,4734199,CKB -LINE_12,Station-28,2022-03-07 16:53:00,2022-03-07 17:07:00,Station-27,2952,3,4734199,CKB -LINE_12,Station-27,2022-03-07 17:10:00,2022-03-07 17:19:00,Station-28,2169,14,4734199,CKB -LINE_12,Station-28,2022-03-07 17:33:00,2022-03-07 17:47:00,Station-27,2952,3,4734199,CKB -LINE_12,Station-27,2022-03-07 17:50:00,2022-03-07 17:59:00,Station-28,2169,14,4734199,CKB -LINE_12,Station-28,2022-03-07 18:13:00,2022-03-07 18:25:00,Station-27,2952,0,4734199,CKB -LINE_12,Station-27,2022-03-07 18:25:00,2022-03-07 18:25:00,Station-0,0.06,0,4734199,CKB -LINE_13,Station-0,2022-03-08 00:23:00,2022-03-08 00:23:00,Station-29,0.06,0,4318156,CKB -LINE_13,Station-29,2022-03-08 00:23:00,2022-03-08 00:30:00,Station-30,2577,9,4318156,CKB -LINE_14,Station-30,2022-03-08 00:39:00,2022-03-08 00:54:00,Station-31,5937,9,4318156,CKB -LINE_14,Station-31,2022-03-08 01:03:00,2022-03-08 01:17:00,Station-30,6.19,0,4318156,CKB -LINE_13,Station-30,2022-03-08 01:17:00,2022-03-08 01:23:00,Station-29,2555,0,4318156,CKB -LINE_13,Station-29,2022-03-08 01:23:00,2022-03-08 01:30:00,Station-30,2577,9,4318156,CKB -LINE_14,Station-30,2022-03-08 01:39:00,2022-03-08 01:54:00,Station-31,5937,9,4318156,CKB -LINE_14,Station-31,2022-03-08 02:03:00,2022-03-08 02:17:00,Station-30,6.19,0,4318156,CKB -LINE_13,Station-30,2022-03-08 02:17:00,2022-03-08 02:23:00,Station-29,2555,0,4318156,CKB -LINE_13,Station-29,2022-03-08 02:23:00,2022-03-08 02:30:00,Station-30,2577,9,4318156,CKB -LINE_14,Station-30,2022-03-08 02:39:00,2022-03-08 02:54:00,Station-31,5937,9,4318156,CKB -LINE_14,Station-31,2022-03-08 03:03:00,2022-03-08 03:17:00,Station-30,6.19,0,4318156,CKB -LINE_13,Station-30,2022-03-08 03:17:00,2022-03-08 03:23:00,Station-29,2555,0,4318156,CKB -LINE_13,Station-29,2022-03-08 03:23:00,2022-03-08 03:30:00,Station-30,2577,9,4318156,CKB -LINE_14,Station-30,2022-03-08 03:39:00,2022-03-08 03:54:00,Station-31,5937,9,4318156,CKB -LINE_14,Station-31,2022-03-08 04:03:00,2022-03-08 04:17:00,Station-30,6.19,0,4318156,CKB -LINE_13,Station-30,2022-03-08 04:17:00,2022-03-08 04:23:00,Station-29,2555,0,4318156,CKB -LINE_13,Station-29,2022-03-08 04:23:00,2022-03-08 04:23:00,Station-0,0.06,0,4318156,CKB -LINE_14,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-31,0.06,0,4318176,CKB -LINE_14,Station-31,2022-03-08 00:33:00,2022-03-08 00:47:00,Station-30,6.19,0,4318176,CKB -LINE_13,Station-30,2022-03-08 00:47:00,2022-03-08 00:53:00,Station-29,2555,0,4318176,CKB -LINE_13,Station-29,2022-03-08 00:53:00,2022-03-08 01:00:00,Station-30,2577,9,4318176,CKB -LINE_14,Station-30,2022-03-08 01:09:00,2022-03-08 01:24:00,Station-31,5937,9,4318176,CKB -LINE_14,Station-31,2022-03-08 01:33:00,2022-03-08 01:47:00,Station-30,6.19,0,4318176,CKB -LINE_13,Station-30,2022-03-08 01:47:00,2022-03-08 01:53:00,Station-29,2555,0,4318176,CKB -LINE_13,Station-29,2022-03-08 01:53:00,2022-03-08 02:00:00,Station-30,2577,9,4318176,CKB -LINE_14,Station-30,2022-03-08 02:09:00,2022-03-08 02:24:00,Station-31,5937,9,4318176,CKB -LINE_14,Station-31,2022-03-08 02:33:00,2022-03-08 02:47:00,Station-30,6.19,0,4318176,CKB -LINE_13,Station-30,2022-03-08 02:47:00,2022-03-08 02:53:00,Station-29,2555,0,4318176,CKB -LINE_13,Station-29,2022-03-08 02:53:00,2022-03-08 03:00:00,Station-30,2577,9,4318176,CKB -LINE_14,Station-30,2022-03-08 03:09:00,2022-03-08 03:24:00,Station-31,5937,9,4318176,CKB -LINE_14,Station-31,2022-03-08 03:33:00,2022-03-08 03:47:00,Station-30,6.19,0,4318176,CKB -LINE_13,Station-30,2022-03-08 03:47:00,2022-03-08 03:53:00,Station-29,2555,0,4318176,CKB -LINE_13,Station-29,2022-03-08 03:53:00,2022-03-08 04:00:00,Station-30,2577,9,4318176,CKB -LINE_14,Station-30,2022-03-08 04:09:00,2022-03-08 04:24:00,Station-31,5937,0,4318176,CKB -LINE_14,Station-31,2022-03-08 04:24:00,2022-03-08 04:24:00,Station-0,0.06,0,4318176,CKB -LINE_15,Station-0,2022-03-08 00:57:00,2022-03-08 00:57:00,Station-32,0.06,0,4319351,CKB -LINE_15,Station-32,2022-03-08 00:57:00,2022-03-08 01:06:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 01:06:00,2022-03-08 01:11:00,Station-32,2936,16,4319351,CKB -LINE_15,Station-32,2022-03-08 01:27:00,2022-03-08 01:36:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 01:36:00,2022-03-08 01:41:00,Station-32,2936,16,4319351,CKB -LINE_15,Station-32,2022-03-08 01:57:00,2022-03-08 02:06:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 02:06:00,2022-03-08 02:11:00,Station-32,2936,16,4319351,CKB -LINE_15,Station-32,2022-03-08 02:27:00,2022-03-08 02:36:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 02:36:00,2022-03-08 02:41:00,Station-32,2936,16,4319351,CKB -LINE_15,Station-32,2022-03-08 02:57:00,2022-03-08 03:06:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 03:06:00,2022-03-08 03:11:00,Station-32,2936,16,4319351,CKB -LINE_15,Station-32,2022-03-08 03:27:00,2022-03-08 03:36:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 03:36:00,2022-03-08 03:41:00,Station-32,2936,16,4319351,CKB -LINE_15,Station-32,2022-03-08 03:57:00,2022-03-08 04:06:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 04:06:00,2022-03-08 04:11:00,Station-32,2936,16,4319351,CKB -LINE_15,Station-32,2022-03-08 04:27:00,2022-03-08 04:36:00,Station-33,4343,0,4319351,CKB -LINE_15,Station-33,2022-03-08 04:36:00,2022-03-08 04:36:00,Station-0,0.06,0,4319351,CKB -LINE_16,Station-0,2022-03-08 00:29:00,2022-03-08 00:29:00,Station-34,0.06,0,4751086,CKB -LINE_16,Station-34,2022-03-08 00:29:00,2022-03-08 00:41:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 00:47:00,2022-03-08 00:57:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 00:59:00,2022-03-08 01:11:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 01:17:00,2022-03-08 01:27:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 01:29:00,2022-03-08 01:41:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 01:47:00,2022-03-08 01:57:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 01:59:00,2022-03-08 02:11:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 02:17:00,2022-03-08 02:27:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 02:29:00,2022-03-08 02:41:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 02:47:00,2022-03-08 02:57:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 02:59:00,2022-03-08 03:11:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 03:17:00,2022-03-08 03:27:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 03:29:00,2022-03-08 03:41:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 03:47:00,2022-03-08 03:57:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 03:59:00,2022-03-08 04:11:00,Station-35,4481,6,4751086,CKB -LINE_16,Station-35,2022-03-08 04:17:00,2022-03-08 04:27:00,Station-34,4031,2,4751086,CKB -LINE_16,Station-34,2022-03-08 04:29:00,2022-03-08 04:41:00,Station-35,4481,0,4751086,CKB -LINE_16,Station-35,2022-03-08 04:41:00,2022-03-08 04:41:00,Station-0,0.06,0,4751086,CKB -LINE_17,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-34,0.06,0,4453544,CKB -LINE_17,Station-34,2022-03-08 00:30:00,2022-03-08 00:44:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 00:44:00,2022-03-08 00:57:00,Station-34,5302,3,4453544,CKB -LINE_17,Station-34,2022-03-08 01:00:00,2022-03-08 01:14:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 01:14:00,2022-03-08 01:27:00,Station-34,5302,3,4453544,CKB -LINE_17,Station-34,2022-03-08 01:30:00,2022-03-08 01:44:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 01:44:00,2022-03-08 01:57:00,Station-34,5302,3,4453544,CKB -LINE_17,Station-34,2022-03-08 02:00:00,2022-03-08 02:14:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 02:14:00,2022-03-08 02:27:00,Station-34,5302,3,4453544,CKB -LINE_17,Station-34,2022-03-08 02:30:00,2022-03-08 02:44:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 02:44:00,2022-03-08 02:57:00,Station-34,5302,3,4453544,CKB -LINE_17,Station-34,2022-03-08 03:00:00,2022-03-08 03:14:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 03:14:00,2022-03-08 03:27:00,Station-34,5302,3,4453544,CKB -LINE_17,Station-34,2022-03-08 03:30:00,2022-03-08 03:44:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 03:44:00,2022-03-08 03:57:00,Station-34,5302,3,4453544,CKB -LINE_17,Station-34,2022-03-08 04:00:00,2022-03-08 04:14:00,Station-36,4801,0,4453544,CKB -LINE_17,Station-36,2022-03-08 04:14:00,2022-03-08 04:27:00,Station-34,5302,0,4453544,CKB -LINE_17,Station-34,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,4453544,CKB -LINE_18,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-37,0.06,0,4374466,CKB -LINE_18,Station-37,2022-03-08 00:43:00,2022-03-08 01:33:00,Station-37,20434,10,4374466,CKB -LINE_18,Station-37,2022-03-08 01:43:00,2022-03-08 02:33:00,Station-37,20434,10,4374466,CKB -LINE_18,Station-37,2022-03-08 02:43:00,2022-03-08 03:33:00,Station-37,20434,10,4374466,CKB -LINE_18,Station-37,2022-03-08 03:43:00,2022-03-08 04:33:00,Station-37,20434,0,4374466,CKB -LINE_18,Station-37,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,4374466,CKB -LINE_18,Station-0,2022-03-08 00:13:00,2022-03-08 00:13:00,Station-37,0.06,0,4374471,CKB -LINE_18,Station-37,2022-03-08 00:13:00,2022-03-08 01:03:00,Station-37,20434,10,4374471,CKB -LINE_18,Station-37,2022-03-08 01:13:00,2022-03-08 02:03:00,Station-37,20434,10,4374471,CKB -LINE_18,Station-37,2022-03-08 02:13:00,2022-03-08 03:03:00,Station-37,20434,10,4374471,CKB -LINE_18,Station-37,2022-03-08 03:13:00,2022-03-08 04:03:00,Station-37,20434,0,4374471,CKB -LINE_18,Station-37,2022-03-08 04:03:00,2022-03-08 04:03:00,Station-0,0.06,0,4374471,CKB -LINE_19,Station-0,2022-03-08 00:24:00,2022-03-08 00:24:00,Station-38,0.06,0,4456447,CKB -LINE_19,Station-38,2022-03-08 00:24:00,2022-03-08 00:48:00,Station-39,11.86,4,4456447,CKB -LINE_19,Station-39,2022-03-08 00:52:00,2022-03-08 01:14:00,Station-38,11139,10,4456447,CKB -LINE_19,Station-38,2022-03-08 01:24:00,2022-03-08 01:48:00,Station-39,11.86,4,4456447,CKB -LINE_19,Station-39,2022-03-08 01:52:00,2022-03-08 02:14:00,Station-38,11139,10,4456447,CKB -LINE_19,Station-38,2022-03-08 02:24:00,2022-03-08 02:48:00,Station-39,11.86,4,4456447,CKB -LINE_19,Station-39,2022-03-08 02:52:00,2022-03-08 03:14:00,Station-38,11139,10,4456447,CKB -LINE_19,Station-38,2022-03-08 03:24:00,2022-03-08 03:48:00,Station-39,11.86,4,4456447,CKB -LINE_19,Station-39,2022-03-08 03:52:00,2022-03-08 04:14:00,Station-38,11139,0,4456447,CKB -LINE_19,Station-38,2022-03-08 04:14:00,2022-03-08 04:14:00,Station-0,0.06,0,4456447,CKB -LINE_19,Station-0,2022-03-08 00:22:00,2022-03-08 00:22:00,Station-39,0.06,0,4456455,CKB -LINE_19,Station-39,2022-03-08 00:22:00,2022-03-08 00:44:00,Station-38,11139,10,4456455,CKB -LINE_19,Station-38,2022-03-08 00:54:00,2022-03-08 01:18:00,Station-39,11.86,4,4456455,CKB -LINE_19,Station-39,2022-03-08 01:22:00,2022-03-08 01:44:00,Station-38,11139,10,4456455,CKB -LINE_19,Station-38,2022-03-08 01:54:00,2022-03-08 02:18:00,Station-39,11.86,4,4456455,CKB -LINE_19,Station-39,2022-03-08 02:22:00,2022-03-08 02:44:00,Station-38,11139,10,4456455,CKB -LINE_19,Station-38,2022-03-08 02:54:00,2022-03-08 03:18:00,Station-39,11.86,4,4456455,CKB -LINE_19,Station-39,2022-03-08 03:22:00,2022-03-08 03:44:00,Station-38,11139,10,4456455,CKB -LINE_19,Station-38,2022-03-08 03:54:00,2022-03-08 04:18:00,Station-39,11.86,4,4456455,CKB -LINE_19,Station-39,2022-03-08 04:22:00,2022-03-08 04:44:00,Station-38,11139,0,4456455,CKB -LINE_19,Station-38,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,4456455,CKB -LINE_20,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,4747649,CKB -LINE_20,Station-13,2022-03-08 00:32:00,2022-03-08 00:44:00,Station-40,4212,3,4747649,CKB -LINE_20,Station-40,2022-03-08 00:47:00,2022-03-08 01:16:00,Station-41,13048,0,4747649,CKB -LINE_20,Station-41,2022-03-08 01:16:00,2022-03-08 01:42:00,Station-40,12869,5,4747649,CKB -LINE_20,Station-40,2022-03-08 01:47:00,2022-03-08 02:16:00,Station-41,13048,0,4747649,CKB -LINE_20,Station-41,2022-03-08 02:16:00,2022-03-08 02:42:00,Station-40,12869,5,4747649,CKB -LINE_20,Station-40,2022-03-08 02:47:00,2022-03-08 03:16:00,Station-41,13048,0,4747649,CKB -LINE_20,Station-41,2022-03-08 03:16:00,2022-03-08 03:42:00,Station-40,12869,5,4747649,CKB -LINE_20,Station-40,2022-03-08 03:47:00,2022-03-08 04:16:00,Station-41,13048,0,4747649,CKB -LINE_20,Station-41,2022-03-08 04:16:00,2022-03-08 04:34:00,Station-42,9538,0,4747649,CKB -LINE_20,Station-42,2022-03-08 04:34:00,2022-03-08 04:34:00,Station-0,0.06,0,4747649,CKB -LINE_20,Station-0,2022-03-08 00:17:00,2022-03-08 00:17:00,Station-40,0.06,0,4747659,CKB -LINE_20,Station-40,2022-03-08 00:17:00,2022-03-08 00:46:00,Station-41,13048,0,4747659,CKB -LINE_20,Station-41,2022-03-08 00:46:00,2022-03-08 01:12:00,Station-40,12869,5,4747659,CKB -LINE_20,Station-40,2022-03-08 01:17:00,2022-03-08 01:46:00,Station-41,13048,0,4747659,CKB -LINE_20,Station-41,2022-03-08 01:46:00,2022-03-08 02:12:00,Station-40,12869,5,4747659,CKB -LINE_20,Station-40,2022-03-08 02:17:00,2022-03-08 02:46:00,Station-41,13048,0,4747659,CKB -LINE_20,Station-41,2022-03-08 02:46:00,2022-03-08 03:12:00,Station-40,12869,5,4747659,CKB -LINE_20,Station-40,2022-03-08 03:17:00,2022-03-08 03:46:00,Station-41,13048,0,4747659,CKB -LINE_20,Station-41,2022-03-08 03:46:00,2022-03-08 04:12:00,Station-40,12869,5,4747659,CKB -LINE_20,Station-40,2022-03-08 04:17:00,2022-03-08 04:28:00,Station-13,4316,0,4747659,CKB -LINE_20,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,4747659,CKB -LINE_21,Station-0,2022-03-08 00:49:00,2022-03-08 00:49:00,Station-3,0.06,0,4434340,CKB -LINE_21,Station-3,2022-03-08 00:49:00,2022-03-08 01:04:00,Station-16,10229,0,4434340,CKB -LINE_21,Station-16,2022-03-08 01:04:00,2022-03-08 01:19:00,Station-3,11801,0,4434340,CKB -LINE_21,Station-3,2022-03-08 01:19:00,2022-03-08 01:34:00,Station-16,10229,0,4434340,CKB -LINE_21,Station-16,2022-03-08 01:34:00,2022-03-08 01:49:00,Station-3,11801,0,4434340,CKB -LINE_21,Station-3,2022-03-08 01:49:00,2022-03-08 02:04:00,Station-16,10229,0,4434340,CKB -LINE_21,Station-16,2022-03-08 02:04:00,2022-03-08 02:19:00,Station-3,11801,0,4434340,CKB -LINE_21,Station-3,2022-03-08 02:19:00,2022-03-08 02:34:00,Station-16,10229,0,4434340,CKB -LINE_21,Station-16,2022-03-08 02:34:00,2022-03-08 02:49:00,Station-3,11801,0,4434340,CKB -LINE_21,Station-3,2022-03-08 02:49:00,2022-03-08 03:04:00,Station-16,10229,0,4434340,CKB -LINE_21,Station-16,2022-03-08 03:04:00,2022-03-08 03:19:00,Station-3,11801,0,4434340,CKB -LINE_21,Station-3,2022-03-08 03:19:00,2022-03-08 03:34:00,Station-16,10229,0,4434340,CKB -LINE_21,Station-16,2022-03-08 03:34:00,2022-03-08 03:49:00,Station-3,11801,0,4434340,CKB -LINE_21,Station-3,2022-03-08 03:49:00,2022-03-08 04:04:00,Station-16,10229,0,4434340,CKB -LINE_21,Station-16,2022-03-08 04:04:00,2022-03-08 04:19:00,Station-3,11801,23,4434340,CKB -LINE_22,Station-3,2022-03-08 04:42:00,2022-03-08 05:04:00,Station-43,6.81,0,4434340,CKB -LINE_22,Station-43,2022-03-08 05:04:00,2022-03-08 05:04:00,Station-0,0.06,0,4434340,CKB -LINE_8,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,4434896,CKB -LINE_8,Station-13,2022-03-08 00:32:00,2022-03-08 00:57:00,Station-21,11545,6,4434896,CKB -LINE_8,Station-21,2022-03-08 01:03:00,2022-03-08 01:46:00,Station-20,20579,1,4434896,CKB -LINE_8,Station-20,2022-03-08 01:47:00,2022-03-08 02:25:00,Station-21,20641,8,4434896,CKB -LINE_8,Station-21,2022-03-08 02:33:00,2022-03-08 03:16:00,Station-20,20579,1,4434896,CKB -LINE_8,Station-20,2022-03-08 03:17:00,2022-03-08 03:55:00,Station-21,20641,8,4434896,CKB -LINE_8,Station-21,2022-03-08 04:03:00,2022-03-08 04:28:00,Station-13,11499,0,4434896,CKB -LINE_8,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,4434896,CKB -LINE_8,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-21,0.06,0,4434901,CKB -LINE_8,Station-21,2022-03-08 00:33:00,2022-03-08 01:16:00,Station-20,20579,1,4434901,CKB -LINE_8,Station-20,2022-03-08 01:17:00,2022-03-08 01:55:00,Station-21,20641,8,4434901,CKB -LINE_8,Station-21,2022-03-08 02:03:00,2022-03-08 02:46:00,Station-20,20579,1,4434901,CKB -LINE_8,Station-20,2022-03-08 02:47:00,2022-03-08 03:25:00,Station-21,20641,8,4434901,CKB -LINE_8,Station-21,2022-03-08 03:33:00,2022-03-08 04:16:00,Station-20,20579,1,4434901,CKB -LINE_8,Station-20,2022-03-08 04:17:00,2022-03-08 04:51:00,Station-44,18752,0,4434901,CKB -LINE_8,Station-44,2022-03-08 04:51:00,2022-03-08 04:51:00,Station-0,0.06,0,4434901,CKB -LINE_23,Station-0,2022-03-08 00:34:00,2022-03-08 00:34:00,Station-45,0.06,0,4619765,CKB -LINE_23,Station-45,2022-03-08 00:34:00,2022-03-08 01:00:00,Station-46,9016,0,4619765,CKB -LINE_23,Station-46,2022-03-08 01:00:00,2022-03-08 01:27:00,Station-45,10083,7,4619765,CKB -LINE_23,Station-45,2022-03-08 01:34:00,2022-03-08 02:00:00,Station-46,9016,0,4619765,CKB -LINE_23,Station-46,2022-03-08 02:00:00,2022-03-08 02:27:00,Station-45,10083,7,4619765,CKB -LINE_23,Station-45,2022-03-08 02:34:00,2022-03-08 03:00:00,Station-46,9016,0,4619765,CKB -LINE_23,Station-46,2022-03-08 03:00:00,2022-03-08 03:27:00,Station-45,10083,7,4619765,CKB -LINE_23,Station-45,2022-03-08 03:34:00,2022-03-08 04:00:00,Station-46,9016,0,4619765,CKB -LINE_23,Station-46,2022-03-08 04:00:00,2022-03-08 04:27:00,Station-45,10083,0,4619765,CKB -LINE_23,Station-45,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,4619765,CKB -LINE_23,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-46,0.06,0,4619990,CKB -LINE_23,Station-46,2022-03-08 00:30:00,2022-03-08 00:57:00,Station-45,10083,7,4619990,CKB -LINE_23,Station-45,2022-03-08 01:04:00,2022-03-08 01:30:00,Station-46,9016,0,4619990,CKB -LINE_23,Station-46,2022-03-08 01:30:00,2022-03-08 01:57:00,Station-45,10083,7,4619990,CKB -LINE_23,Station-45,2022-03-08 02:04:00,2022-03-08 02:30:00,Station-46,9016,0,4619990,CKB -LINE_23,Station-46,2022-03-08 02:30:00,2022-03-08 02:57:00,Station-45,10083,7,4619990,CKB -LINE_23,Station-45,2022-03-08 03:04:00,2022-03-08 03:30:00,Station-46,9016,0,4619990,CKB -LINE_23,Station-46,2022-03-08 03:30:00,2022-03-08 03:57:00,Station-45,10083,7,4619990,CKB -LINE_23,Station-45,2022-03-08 04:04:00,2022-03-08 04:30:00,Station-46,9016,0,4619990,CKB -LINE_23,Station-46,2022-03-08 04:30:00,2022-03-08 04:57:00,Station-45,10083,0,4619990,CKB -LINE_23,Station-45,2022-03-08 04:57:00,2022-03-08 04:57:00,Station-0,0.06,0,4619990,CKB -LINE_24,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,4374743,CKB -LINE_24,Station-21,2022-03-08 00:31:00,2022-03-08 00:44:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 00:44:00,2022-03-08 00:56:00,Station-21,5362,5,4374743,CKB -LINE_24,Station-21,2022-03-08 01:01:00,2022-03-08 01:14:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 01:14:00,2022-03-08 01:26:00,Station-21,5362,5,4374743,CKB -LINE_24,Station-21,2022-03-08 01:31:00,2022-03-08 01:44:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 01:44:00,2022-03-08 01:56:00,Station-21,5362,5,4374743,CKB -LINE_24,Station-21,2022-03-08 02:01:00,2022-03-08 02:14:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 02:14:00,2022-03-08 02:26:00,Station-21,5362,5,4374743,CKB -LINE_24,Station-21,2022-03-08 02:31:00,2022-03-08 02:44:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 02:44:00,2022-03-08 02:56:00,Station-21,5362,5,4374743,CKB -LINE_24,Station-21,2022-03-08 03:01:00,2022-03-08 03:14:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 03:14:00,2022-03-08 03:26:00,Station-21,5362,5,4374743,CKB -LINE_24,Station-21,2022-03-08 03:31:00,2022-03-08 03:44:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 03:44:00,2022-03-08 03:56:00,Station-21,5362,5,4374743,CKB -LINE_24,Station-21,2022-03-08 04:01:00,2022-03-08 04:14:00,Station-47,4872,0,4374743,CKB -LINE_24,Station-47,2022-03-08 04:14:00,2022-03-08 04:26:00,Station-21,5362,0,4374743,CKB -LINE_24,Station-21,2022-03-08 04:26:00,2022-03-08 04:26:00,Station-0,0.06,0,4374743,CKB -LINE_25,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,4374865,CKB -LINE_25,Station-21,2022-03-08 00:31:00,2022-03-08 00:45:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 00:47:00,2022-03-08 01:01:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 01:01:00,2022-03-08 01:15:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 01:17:00,2022-03-08 01:31:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 01:31:00,2022-03-08 01:45:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 01:47:00,2022-03-08 02:01:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 02:01:00,2022-03-08 02:15:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 02:17:00,2022-03-08 02:31:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 02:31:00,2022-03-08 02:45:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 02:47:00,2022-03-08 03:01:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 03:01:00,2022-03-08 03:15:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 03:17:00,2022-03-08 03:31:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 03:31:00,2022-03-08 03:45:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 03:47:00,2022-03-08 04:01:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 04:01:00,2022-03-08 04:15:00,Station-48,5225,2,4374865,CKB -LINE_25,Station-48,2022-03-08 04:17:00,2022-03-08 04:31:00,Station-21,7617,0,4374865,CKB -LINE_25,Station-21,2022-03-08 04:31:00,2022-03-08 04:31:00,Station-0,0.06,0,4374865,CKB -LINE_26,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-49,0.06,0,4375012,CKB -LINE_26,Station-49,2022-03-08 00:43:00,2022-03-08 00:53:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 00:53:00,2022-03-08 01:03:00,Station-49,4408,10,4375012,CKB -LINE_26,Station-49,2022-03-08 01:13:00,2022-03-08 01:23:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 01:23:00,2022-03-08 01:33:00,Station-49,4408,10,4375012,CKB -LINE_26,Station-49,2022-03-08 01:43:00,2022-03-08 01:53:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 01:53:00,2022-03-08 02:03:00,Station-49,4408,10,4375012,CKB -LINE_26,Station-49,2022-03-08 02:13:00,2022-03-08 02:23:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 02:23:00,2022-03-08 02:33:00,Station-49,4408,10,4375012,CKB -LINE_26,Station-49,2022-03-08 02:43:00,2022-03-08 02:53:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 02:53:00,2022-03-08 03:03:00,Station-49,4408,10,4375012,CKB -LINE_26,Station-49,2022-03-08 03:13:00,2022-03-08 03:23:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 03:23:00,2022-03-08 03:33:00,Station-49,4408,10,4375012,CKB -LINE_26,Station-49,2022-03-08 03:43:00,2022-03-08 03:53:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 03:53:00,2022-03-08 04:03:00,Station-49,4408,10,4375012,CKB -LINE_26,Station-49,2022-03-08 04:13:00,2022-03-08 04:23:00,Station-50,4507,0,4375012,CKB -LINE_26,Station-50,2022-03-08 04:23:00,2022-03-08 04:33:00,Station-49,4408,0,4375012,CKB -LINE_26,Station-49,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,4375012,CKB -LINE_21,Station-0,2022-03-07 00:49:00,2022-03-07 00:49:00,Station-3,0.06,0,4434215,CKB -LINE_21,Station-3,2022-03-07 00:49:00,2022-03-07 01:04:00,Station-16,10229,0,4434215,CKB -LINE_21,Station-16,2022-03-07 01:04:00,2022-03-07 01:19:00,Station-3,11801,0,4434215,CKB -LINE_21,Station-3,2022-03-07 01:19:00,2022-03-07 01:34:00,Station-16,10229,0,4434215,CKB -LINE_21,Station-16,2022-03-07 01:34:00,2022-03-07 01:49:00,Station-3,11801,0,4434215,CKB -LINE_21,Station-3,2022-03-07 01:49:00,2022-03-07 02:04:00,Station-16,10229,0,4434215,CKB -LINE_21,Station-16,2022-03-07 02:04:00,2022-03-07 02:19:00,Station-3,11801,0,4434215,CKB -LINE_21,Station-3,2022-03-07 02:19:00,2022-03-07 02:34:00,Station-16,10229,0,4434215,CKB -LINE_21,Station-16,2022-03-07 02:34:00,2022-03-07 02:49:00,Station-3,11801,0,4434215,CKB -LINE_21,Station-3,2022-03-07 02:49:00,2022-03-07 03:04:00,Station-16,10229,0,4434215,CKB -LINE_21,Station-16,2022-03-07 03:04:00,2022-03-07 03:19:00,Station-3,11801,0,4434215,CKB -LINE_21,Station-3,2022-03-07 03:19:00,2022-03-07 03:34:00,Station-16,10229,0,4434215,CKB -LINE_21,Station-16,2022-03-07 03:34:00,2022-03-07 03:49:00,Station-3,11801,0,4434215,CKB -LINE_21,Station-3,2022-03-07 03:49:00,2022-03-07 04:04:00,Station-16,10229,0,4434215,CKB -LINE_21,Station-16,2022-03-07 04:04:00,2022-03-07 04:19:00,Station-3,11801,23,4434215,CKB -LINE_22,Station-3,2022-03-07 04:42:00,2022-03-07 05:04:00,Station-43,6.81,0,4434215,CKB -LINE_22,Station-43,2022-03-07 05:04:00,2022-03-07 05:04:00,Station-0,0.06,0,4434215,CKB -LINE_13,Station-0,2022-03-07 00:23:00,2022-03-07 00:23:00,Station-29,0.06,0,4318071,CKB -LINE_13,Station-29,2022-03-07 00:23:00,2022-03-07 00:30:00,Station-30,2577,9,4318071,CKB -LINE_14,Station-30,2022-03-07 00:39:00,2022-03-07 00:54:00,Station-31,5937,9,4318071,CKB -LINE_14,Station-31,2022-03-07 01:03:00,2022-03-07 01:17:00,Station-30,6.19,0,4318071,CKB -LINE_13,Station-30,2022-03-07 01:17:00,2022-03-07 01:23:00,Station-29,2555,0,4318071,CKB -LINE_13,Station-29,2022-03-07 01:23:00,2022-03-07 01:30:00,Station-30,2577,9,4318071,CKB -LINE_14,Station-30,2022-03-07 01:39:00,2022-03-07 01:54:00,Station-31,5937,9,4318071,CKB -LINE_14,Station-31,2022-03-07 02:03:00,2022-03-07 02:17:00,Station-30,6.19,0,4318071,CKB -LINE_13,Station-30,2022-03-07 02:17:00,2022-03-07 02:23:00,Station-29,2555,0,4318071,CKB -LINE_13,Station-29,2022-03-07 02:23:00,2022-03-07 02:30:00,Station-30,2577,9,4318071,CKB -LINE_14,Station-30,2022-03-07 02:39:00,2022-03-07 02:54:00,Station-31,5937,9,4318071,CKB -LINE_14,Station-31,2022-03-07 03:03:00,2022-03-07 03:17:00,Station-30,6.19,0,4318071,CKB -LINE_13,Station-30,2022-03-07 03:17:00,2022-03-07 03:23:00,Station-29,2555,0,4318071,CKB -LINE_13,Station-29,2022-03-07 03:23:00,2022-03-07 03:30:00,Station-30,2577,9,4318071,CKB -LINE_14,Station-30,2022-03-07 03:39:00,2022-03-07 03:54:00,Station-31,5937,9,4318071,CKB -LINE_14,Station-31,2022-03-07 04:03:00,2022-03-07 04:17:00,Station-30,6.19,0,4318071,CKB -LINE_13,Station-30,2022-03-07 04:17:00,2022-03-07 04:23:00,Station-29,2555,0,4318071,CKB -LINE_13,Station-29,2022-03-07 04:23:00,2022-03-07 04:23:00,Station-0,0.06,0,4318071,CKB -LINE_14,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-31,0.06,0,4318083,CKB -LINE_14,Station-31,2022-03-07 00:33:00,2022-03-07 00:47:00,Station-30,6.19,0,4318083,CKB -LINE_13,Station-30,2022-03-07 00:47:00,2022-03-07 00:53:00,Station-29,2555,0,4318083,CKB -LINE_13,Station-29,2022-03-07 00:53:00,2022-03-07 01:00:00,Station-30,2577,9,4318083,CKB -LINE_14,Station-30,2022-03-07 01:09:00,2022-03-07 01:24:00,Station-31,5937,9,4318083,CKB -LINE_14,Station-31,2022-03-07 01:33:00,2022-03-07 01:47:00,Station-30,6.19,0,4318083,CKB -LINE_13,Station-30,2022-03-07 01:47:00,2022-03-07 01:53:00,Station-29,2555,0,4318083,CKB -LINE_13,Station-29,2022-03-07 01:53:00,2022-03-07 02:00:00,Station-30,2577,9,4318083,CKB -LINE_14,Station-30,2022-03-07 02:09:00,2022-03-07 02:24:00,Station-31,5937,9,4318083,CKB -LINE_14,Station-31,2022-03-07 02:33:00,2022-03-07 02:47:00,Station-30,6.19,0,4318083,CKB -LINE_13,Station-30,2022-03-07 02:47:00,2022-03-07 02:53:00,Station-29,2555,0,4318083,CKB -LINE_13,Station-29,2022-03-07 02:53:00,2022-03-07 03:00:00,Station-30,2577,9,4318083,CKB -LINE_14,Station-30,2022-03-07 03:09:00,2022-03-07 03:24:00,Station-31,5937,9,4318083,CKB -LINE_14,Station-31,2022-03-07 03:33:00,2022-03-07 03:47:00,Station-30,6.19,0,4318083,CKB -LINE_13,Station-30,2022-03-07 03:47:00,2022-03-07 03:53:00,Station-29,2555,0,4318083,CKB -LINE_13,Station-29,2022-03-07 03:53:00,2022-03-07 04:00:00,Station-30,2577,9,4318083,CKB -LINE_14,Station-30,2022-03-07 04:09:00,2022-03-07 04:24:00,Station-31,5937,0,4318083,CKB -LINE_14,Station-31,2022-03-07 04:24:00,2022-03-07 04:24:00,Station-0,0.06,0,4318083,CKB -LINE_15,Station-0,2022-03-07 00:57:00,2022-03-07 00:57:00,Station-32,0.06,0,4319428,CKB -LINE_15,Station-32,2022-03-07 00:57:00,2022-03-07 01:06:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 01:06:00,2022-03-07 01:11:00,Station-32,2936,16,4319428,CKB -LINE_15,Station-32,2022-03-07 01:27:00,2022-03-07 01:36:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 01:36:00,2022-03-07 01:41:00,Station-32,2936,16,4319428,CKB -LINE_15,Station-32,2022-03-07 01:57:00,2022-03-07 02:06:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 02:06:00,2022-03-07 02:11:00,Station-32,2936,16,4319428,CKB -LINE_15,Station-32,2022-03-07 02:27:00,2022-03-07 02:36:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 02:36:00,2022-03-07 02:41:00,Station-32,2936,16,4319428,CKB -LINE_15,Station-32,2022-03-07 02:57:00,2022-03-07 03:06:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 03:06:00,2022-03-07 03:11:00,Station-32,2936,16,4319428,CKB -LINE_15,Station-32,2022-03-07 03:27:00,2022-03-07 03:36:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 03:36:00,2022-03-07 03:41:00,Station-32,2936,16,4319428,CKB -LINE_15,Station-32,2022-03-07 03:57:00,2022-03-07 04:06:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 04:06:00,2022-03-07 04:11:00,Station-32,2936,16,4319428,CKB -LINE_15,Station-32,2022-03-07 04:27:00,2022-03-07 04:36:00,Station-33,4343,0,4319428,CKB -LINE_15,Station-33,2022-03-07 04:36:00,2022-03-07 04:36:00,Station-0,0.06,0,4319428,CKB -LINE_16,Station-0,2022-03-07 00:29:00,2022-03-07 00:29:00,Station-34,0.06,0,4751093,CKB -LINE_16,Station-34,2022-03-07 00:29:00,2022-03-07 00:41:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 00:47:00,2022-03-07 00:57:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 00:59:00,2022-03-07 01:11:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 01:17:00,2022-03-07 01:27:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 01:29:00,2022-03-07 01:41:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 01:47:00,2022-03-07 01:57:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 01:59:00,2022-03-07 02:11:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 02:17:00,2022-03-07 02:27:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 02:29:00,2022-03-07 02:41:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 02:47:00,2022-03-07 02:57:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 02:59:00,2022-03-07 03:11:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 03:17:00,2022-03-07 03:27:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 03:29:00,2022-03-07 03:41:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 03:47:00,2022-03-07 03:57:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 03:59:00,2022-03-07 04:11:00,Station-35,4481,6,4751093,CKB -LINE_16,Station-35,2022-03-07 04:17:00,2022-03-07 04:27:00,Station-34,4031,2,4751093,CKB -LINE_16,Station-34,2022-03-07 04:29:00,2022-03-07 04:41:00,Station-35,4481,0,4751093,CKB -LINE_16,Station-35,2022-03-07 04:41:00,2022-03-07 04:41:00,Station-0,0.06,0,4751093,CKB -LINE_17,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-34,0.06,0,4454017,CKB -LINE_17,Station-34,2022-03-07 00:30:00,2022-03-07 00:44:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 00:44:00,2022-03-07 00:57:00,Station-34,5302,3,4454017,CKB -LINE_17,Station-34,2022-03-07 01:00:00,2022-03-07 01:14:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 01:14:00,2022-03-07 01:27:00,Station-34,5302,3,4454017,CKB -LINE_17,Station-34,2022-03-07 01:30:00,2022-03-07 01:44:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 01:44:00,2022-03-07 01:57:00,Station-34,5302,3,4454017,CKB -LINE_17,Station-34,2022-03-07 02:00:00,2022-03-07 02:14:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 02:14:00,2022-03-07 02:27:00,Station-34,5302,3,4454017,CKB -LINE_17,Station-34,2022-03-07 02:30:00,2022-03-07 02:44:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 02:44:00,2022-03-07 02:57:00,Station-34,5302,3,4454017,CKB -LINE_17,Station-34,2022-03-07 03:00:00,2022-03-07 03:14:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 03:14:00,2022-03-07 03:27:00,Station-34,5302,3,4454017,CKB -LINE_17,Station-34,2022-03-07 03:30:00,2022-03-07 03:44:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 03:44:00,2022-03-07 03:57:00,Station-34,5302,3,4454017,CKB -LINE_17,Station-34,2022-03-07 04:00:00,2022-03-07 04:14:00,Station-36,4801,0,4454017,CKB -LINE_17,Station-36,2022-03-07 04:14:00,2022-03-07 04:27:00,Station-34,5302,0,4454017,CKB -LINE_17,Station-34,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,4454017,CKB -LINE_18,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-37,0.06,0,4374470,CKB -LINE_18,Station-37,2022-03-07 00:43:00,2022-03-07 01:33:00,Station-37,20434,10,4374470,CKB -LINE_18,Station-37,2022-03-07 01:43:00,2022-03-07 02:33:00,Station-37,20434,10,4374470,CKB -LINE_18,Station-37,2022-03-07 02:43:00,2022-03-07 03:33:00,Station-37,20434,10,4374470,CKB -LINE_18,Station-37,2022-03-07 03:43:00,2022-03-07 04:33:00,Station-37,20434,0,4374470,CKB -LINE_18,Station-37,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,4374470,CKB -LINE_18,Station-0,2022-03-07 00:13:00,2022-03-07 00:13:00,Station-37,0.06,0,4374475,CKB -LINE_18,Station-37,2022-03-07 00:13:00,2022-03-07 01:03:00,Station-37,20434,10,4374475,CKB -LINE_18,Station-37,2022-03-07 01:13:00,2022-03-07 02:03:00,Station-37,20434,10,4374475,CKB -LINE_18,Station-37,2022-03-07 02:13:00,2022-03-07 03:03:00,Station-37,20434,10,4374475,CKB -LINE_18,Station-37,2022-03-07 03:13:00,2022-03-07 04:03:00,Station-37,20434,0,4374475,CKB -LINE_18,Station-37,2022-03-07 04:03:00,2022-03-07 04:03:00,Station-0,0.06,0,4374475,CKB -LINE_19,Station-0,2022-03-07 00:24:00,2022-03-07 00:24:00,Station-38,0.06,0,4456537,CKB -LINE_19,Station-38,2022-03-07 00:24:00,2022-03-07 00:48:00,Station-39,11.86,4,4456537,CKB -LINE_19,Station-39,2022-03-07 00:52:00,2022-03-07 01:14:00,Station-38,11139,10,4456537,CKB -LINE_19,Station-38,2022-03-07 01:24:00,2022-03-07 01:48:00,Station-39,11.86,4,4456537,CKB -LINE_19,Station-39,2022-03-07 01:52:00,2022-03-07 02:14:00,Station-38,11139,10,4456537,CKB -LINE_19,Station-38,2022-03-07 02:24:00,2022-03-07 02:48:00,Station-39,11.86,4,4456537,CKB -LINE_19,Station-39,2022-03-07 02:52:00,2022-03-07 03:14:00,Station-38,11139,10,4456537,CKB -LINE_19,Station-38,2022-03-07 03:24:00,2022-03-07 03:48:00,Station-39,11.86,4,4456537,CKB -LINE_19,Station-39,2022-03-07 03:52:00,2022-03-07 04:14:00,Station-38,11139,0,4456537,CKB -LINE_19,Station-38,2022-03-07 04:14:00,2022-03-07 04:14:00,Station-0,0.06,0,4456537,CKB -LINE_19,Station-0,2022-03-07 00:22:00,2022-03-07 00:22:00,Station-39,0.06,0,4456538,CKB -LINE_19,Station-39,2022-03-07 00:22:00,2022-03-07 00:44:00,Station-38,11139,10,4456538,CKB -LINE_19,Station-38,2022-03-07 00:54:00,2022-03-07 01:18:00,Station-39,11.86,4,4456538,CKB -LINE_19,Station-39,2022-03-07 01:22:00,2022-03-07 01:44:00,Station-38,11139,10,4456538,CKB -LINE_19,Station-38,2022-03-07 01:54:00,2022-03-07 02:18:00,Station-39,11.86,4,4456538,CKB -LINE_19,Station-39,2022-03-07 02:22:00,2022-03-07 02:44:00,Station-38,11139,10,4456538,CKB -LINE_19,Station-38,2022-03-07 02:54:00,2022-03-07 03:18:00,Station-39,11.86,4,4456538,CKB -LINE_19,Station-39,2022-03-07 03:22:00,2022-03-07 03:44:00,Station-38,11139,10,4456538,CKB -LINE_19,Station-38,2022-03-07 03:54:00,2022-03-07 04:18:00,Station-39,11.86,4,4456538,CKB -LINE_19,Station-39,2022-03-07 04:22:00,2022-03-07 04:44:00,Station-38,11139,0,4456538,CKB -LINE_19,Station-38,2022-03-07 04:44:00,2022-03-07 04:44:00,Station-0,0.06,0,4456538,CKB -LINE_0,Station-0,2022-03-13 20:51:00,2022-03-13 20:51:00,Station-1,0.06,0,4454973,CKB -LINE_0,Station-1,2022-03-13 20:51:00,2022-03-13 21:24:00,Station-2,14519,4,4454973,CKB -LINE_0,Station-2,2022-03-13 21:28:00,2022-03-13 22:03:00,Station-1,13541,8,4454973,CKB -LINE_0,Station-1,2022-03-13 22:11:00,2022-03-13 22:44:00,Station-2,14519,4,4454973,CKB -LINE_0,Station-2,2022-03-13 22:48:00,2022-03-13 23:23:00,Station-1,13541,8,4454973,CKB -LINE_0,Station-1,2022-03-13 23:31:00,2022-03-14 00:04:00,Station-2,14519,4,4454973,CKB -LINE_0,Station-2,2022-03-14 00:08:00,2022-03-14 00:39:00,Station-5,12213,0,4454973,CKB -LINE_1,Station-5,2022-03-14 00:39:00,2022-03-14 00:47:00,Station-3,4.0,2,4454973,CKB -LINE_1,Station-3,2022-03-14 00:49:00,2022-03-14 01:12:00,Station-4,8.36,6,4454973,CKB -LINE_1,Station-4,2022-03-14 01:18:00,2022-03-14 01:36:00,Station-3,9067,13,4454973,CKB -LINE_1,Station-3,2022-03-14 01:49:00,2022-03-14 02:12:00,Station-4,8.36,6,4454973,CKB -LINE_1,Station-4,2022-03-14 02:18:00,2022-03-14 02:36:00,Station-3,9067,13,4454973,CKB -LINE_1,Station-3,2022-03-14 02:49:00,2022-03-14 03:12:00,Station-4,8.36,6,4454973,CKB -LINE_1,Station-4,2022-03-14 03:18:00,2022-03-14 03:36:00,Station-3,9067,13,4454973,CKB -LINE_1,Station-3,2022-03-14 03:49:00,2022-03-14 04:12:00,Station-4,8.36,0,4454973,CKB -LINE_1,Station-4,2022-03-14 04:12:00,2022-03-14 04:12:00,Station-0,0.06,0,4454973,CKB -LINE_0,Station-0,2022-03-13 21:31:00,2022-03-13 21:31:00,Station-1,0.06,0,4454974,CKB -LINE_0,Station-1,2022-03-13 21:31:00,2022-03-13 22:04:00,Station-2,14519,4,4454974,CKB -LINE_0,Station-2,2022-03-13 22:08:00,2022-03-13 22:43:00,Station-1,13541,8,4454974,CKB -LINE_0,Station-1,2022-03-13 22:51:00,2022-03-13 23:24:00,Station-2,14519,4,4454974,CKB -LINE_0,Station-2,2022-03-13 23:28:00,2022-03-14 00:03:00,Station-1,13541,8,4454974,CKB -LINE_0,Station-1,2022-03-14 00:11:00,2022-03-14 00:44:00,Station-2,14519,0,4454974,CKB -LINE_1,Station-2,2022-03-14 00:44:00,2022-03-14 00:54:00,Station-3,4.1,25,4454974,CKB -LINE_1,Station-3,2022-03-14 01:19:00,2022-03-14 01:42:00,Station-4,8.36,6,4454974,CKB -LINE_1,Station-4,2022-03-14 01:48:00,2022-03-14 02:06:00,Station-3,9067,13,4454974,CKB -LINE_1,Station-3,2022-03-14 02:19:00,2022-03-14 02:42:00,Station-4,8.36,6,4454974,CKB -LINE_1,Station-4,2022-03-14 02:48:00,2022-03-14 03:06:00,Station-3,9067,13,4454974,CKB -LINE_1,Station-3,2022-03-14 03:19:00,2022-03-14 03:42:00,Station-4,8.36,6,4454974,CKB -LINE_1,Station-4,2022-03-14 03:48:00,2022-03-14 04:06:00,Station-3,9067,0,4454974,CKB -LINE_1,Station-3,2022-03-14 04:06:00,2022-03-14 04:06:00,Station-0,0.06,0,4454974,CKB -LINE_2,Station-0,2022-03-13 21:06:00,2022-03-13 21:06:00,Station-6,0.06,0,4664782,CKB -LINE_2,Station-6,2022-03-13 21:06:00,2022-03-13 21:34:00,Station-7,13018,19,4664782,CKB -LINE_2,Station-7,2022-03-13 21:53:00,2022-03-13 22:13:00,Station-8,10332,17,4664782,CKB -LINE_2,Station-8,2022-03-13 22:30:00,2022-03-13 22:54:00,Station-7,10.48,19,4664782,CKB -LINE_2,Station-7,2022-03-13 23:13:00,2022-03-13 23:33:00,Station-8,10332,17,4664782,CKB -LINE_2,Station-8,2022-03-13 23:50:00,2022-03-14 00:14:00,Station-7,10.48,2,4664782,CKB -LINE_2,Station-7,2022-03-14 00:16:00,2022-03-14 00:23:00,Station-9,3709,5,4664782,CKB -LINE_3,Station-9,2022-03-14 00:28:00,2022-03-14 00:44:00,Station-10,6404,3,4664782,CKB -LINE_3,Station-10,2022-03-14 00:47:00,2022-03-14 01:10:00,Station-11,10579,7,4664782,CKB -LINE_3,Station-11,2022-03-14 01:17:00,2022-03-14 01:44:00,Station-10,12007,3,4664782,CKB -LINE_3,Station-10,2022-03-14 01:47:00,2022-03-14 02:10:00,Station-11,10579,7,4664782,CKB -LINE_3,Station-11,2022-03-14 02:17:00,2022-03-14 02:44:00,Station-10,12007,3,4664782,CKB -LINE_3,Station-10,2022-03-14 02:47:00,2022-03-14 03:10:00,Station-11,10579,7,4664782,CKB -LINE_3,Station-11,2022-03-14 03:17:00,2022-03-14 03:44:00,Station-10,12007,3,4664782,CKB -LINE_3,Station-10,2022-03-14 03:47:00,2022-03-14 04:10:00,Station-11,10579,7,4664782,CKB -LINE_3,Station-11,2022-03-14 04:17:00,2022-03-14 04:44:00,Station-10,12007,0,4664782,CKB -LINE_3,Station-10,2022-03-14 04:44:00,2022-03-14 04:44:00,Station-0,0.06,0,4664782,CKB -LINE_2,Station-0,2022-03-13 20:26:00,2022-03-13 20:26:00,Station-6,0.06,0,4762788,CKB -LINE_2,Station-6,2022-03-13 20:26:00,2022-03-13 20:56:00,Station-12,14097,14,4762788,CKB -LINE_2,Station-12,2022-03-13 21:10:00,2022-03-13 21:38:00,Station-6,13.19,8,4762788,CKB -LINE_2,Station-6,2022-03-13 21:46:00,2022-03-13 22:14:00,Station-7,13018,19,4762788,CKB -LINE_2,Station-7,2022-03-13 22:33:00,2022-03-13 22:53:00,Station-8,10332,17,4762788,CKB -LINE_2,Station-8,2022-03-13 23:10:00,2022-03-13 23:34:00,Station-7,10.48,19,4762788,CKB -LINE_2,Station-7,2022-03-13 23:53:00,2022-03-14 00:13:00,Station-8,10332,2,4762788,CKB -LINE_2,Station-8,2022-03-14 00:15:00,2022-03-14 00:16:00,Station-10,506,1,4762788,CKB -LINE_3,Station-10,2022-03-14 00:17:00,2022-03-14 00:40:00,Station-11,10579,7,4762788,CKB -LINE_3,Station-11,2022-03-14 00:47:00,2022-03-14 01:14:00,Station-10,12007,3,4762788,CKB -LINE_3,Station-10,2022-03-14 01:17:00,2022-03-14 01:40:00,Station-11,10579,7,4762788,CKB -LINE_3,Station-11,2022-03-14 01:47:00,2022-03-14 02:14:00,Station-10,12007,3,4762788,CKB -LINE_3,Station-10,2022-03-14 02:17:00,2022-03-14 02:40:00,Station-11,10579,7,4762788,CKB -LINE_3,Station-11,2022-03-14 02:47:00,2022-03-14 03:14:00,Station-10,12007,3,4762788,CKB -LINE_3,Station-10,2022-03-14 03:17:00,2022-03-14 03:40:00,Station-11,10579,7,4762788,CKB -LINE_3,Station-11,2022-03-14 03:47:00,2022-03-14 04:14:00,Station-10,12007,3,4762788,CKB -LINE_3,Station-10,2022-03-14 04:17:00,2022-03-14 04:40:00,Station-11,10579,3,4762788,CKB -LINE_4,Station-11,2022-03-14 04:43:00,2022-03-14 04:58:00,Station-13,6161,0,4762788,CKB -LINE_4,Station-13,2022-03-14 04:58:00,2022-03-14 04:58:00,Station-0,0.06,0,4762788,CKB -LINE_20,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,4747688,CKB -LINE_20,Station-13,2022-03-07 00:32:00,2022-03-07 00:44:00,Station-40,4212,3,4747688,CKB -LINE_20,Station-40,2022-03-07 00:47:00,2022-03-07 01:16:00,Station-41,13048,0,4747688,CKB -LINE_20,Station-41,2022-03-07 01:16:00,2022-03-07 01:42:00,Station-40,12869,5,4747688,CKB -LINE_20,Station-40,2022-03-07 01:47:00,2022-03-07 02:16:00,Station-41,13048,0,4747688,CKB -LINE_20,Station-41,2022-03-07 02:16:00,2022-03-07 02:42:00,Station-40,12869,5,4747688,CKB -LINE_20,Station-40,2022-03-07 02:47:00,2022-03-07 03:16:00,Station-41,13048,0,4747688,CKB -LINE_20,Station-41,2022-03-07 03:16:00,2022-03-07 03:42:00,Station-40,12869,5,4747688,CKB -LINE_20,Station-40,2022-03-07 03:47:00,2022-03-07 04:16:00,Station-41,13048,0,4747688,CKB -LINE_20,Station-41,2022-03-07 04:16:00,2022-03-07 04:34:00,Station-42,9538,0,4747688,CKB -LINE_20,Station-42,2022-03-07 04:34:00,2022-03-07 04:34:00,Station-0,0.06,0,4747688,CKB -LINE_20,Station-0,2022-03-07 00:17:00,2022-03-07 00:17:00,Station-40,0.06,0,4747699,CKB -LINE_20,Station-40,2022-03-07 00:17:00,2022-03-07 00:46:00,Station-41,13048,0,4747699,CKB -LINE_20,Station-41,2022-03-07 00:46:00,2022-03-07 01:12:00,Station-40,12869,5,4747699,CKB -LINE_20,Station-40,2022-03-07 01:17:00,2022-03-07 01:46:00,Station-41,13048,0,4747699,CKB -LINE_20,Station-41,2022-03-07 01:46:00,2022-03-07 02:12:00,Station-40,12869,5,4747699,CKB -LINE_20,Station-40,2022-03-07 02:17:00,2022-03-07 02:46:00,Station-41,13048,0,4747699,CKB -LINE_20,Station-41,2022-03-07 02:46:00,2022-03-07 03:12:00,Station-40,12869,5,4747699,CKB -LINE_20,Station-40,2022-03-07 03:17:00,2022-03-07 03:46:00,Station-41,13048,0,4747699,CKB -LINE_20,Station-41,2022-03-07 03:46:00,2022-03-07 04:12:00,Station-40,12869,5,4747699,CKB -LINE_20,Station-40,2022-03-07 04:17:00,2022-03-07 04:28:00,Station-13,4316,0,4747699,CKB -LINE_20,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,4747699,CKB -LINE_8,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,4627068,CKB -LINE_8,Station-13,2022-03-07 00:32:00,2022-03-07 00:57:00,Station-21,11545,6,4627068,CKB -LINE_8,Station-21,2022-03-07 01:03:00,2022-03-07 01:46:00,Station-20,20579,1,4627068,CKB -LINE_8,Station-20,2022-03-07 01:47:00,2022-03-07 02:25:00,Station-21,20641,8,4627068,CKB -LINE_8,Station-21,2022-03-07 02:33:00,2022-03-07 03:16:00,Station-20,20579,1,4627068,CKB -LINE_8,Station-20,2022-03-07 03:17:00,2022-03-07 03:55:00,Station-21,20641,8,4627068,CKB -LINE_8,Station-21,2022-03-07 04:03:00,2022-03-07 04:28:00,Station-13,11499,0,4627068,CKB -LINE_8,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,4627068,CKB -LINE_8,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-21,0.06,0,4627069,CKB -LINE_8,Station-21,2022-03-07 00:33:00,2022-03-07 01:16:00,Station-20,20579,1,4627069,CKB -LINE_8,Station-20,2022-03-07 01:17:00,2022-03-07 01:55:00,Station-21,20641,8,4627069,CKB -LINE_8,Station-21,2022-03-07 02:03:00,2022-03-07 02:46:00,Station-20,20579,1,4627069,CKB -LINE_8,Station-20,2022-03-07 02:47:00,2022-03-07 03:25:00,Station-21,20641,8,4627069,CKB -LINE_8,Station-21,2022-03-07 03:33:00,2022-03-07 04:16:00,Station-20,20579,1,4627069,CKB -LINE_8,Station-20,2022-03-07 04:17:00,2022-03-07 04:51:00,Station-44,18752,0,4627069,CKB -LINE_8,Station-44,2022-03-07 04:51:00,2022-03-07 04:51:00,Station-0,0.06,0,4627069,CKB -LINE_7,Station-0,2022-03-07 00:08:00,2022-03-07 00:08:00,Station-18,0.06,0,4710317,CKB -LINE_7,Station-18,2022-03-07 00:08:00,2022-03-07 00:27:00,Station-19,7827,0,4710317,CKB -LINE_8,Station-19,2022-03-07 00:27:00,2022-03-07 00:48:00,Station-20,11079,0,4710317,CKB -LINE_8,Station-20,2022-03-07 00:48:00,2022-03-07 01:25:00,Station-21,20641,8,4710317,CKB -LINE_8,Station-21,2022-03-07 01:33:00,2022-03-07 02:16:00,Station-20,20579,1,4710317,CKB -LINE_8,Station-20,2022-03-07 02:17:00,2022-03-07 02:55:00,Station-21,20641,8,4710317,CKB -LINE_8,Station-21,2022-03-07 03:03:00,2022-03-07 03:46:00,Station-20,20579,1,4710317,CKB -LINE_8,Station-20,2022-03-07 03:47:00,2022-03-07 04:25:00,Station-21,20641,0,4710317,CKB -LINE_8,Station-21,2022-03-07 04:25:00,2022-03-07 04:25:00,Station-0,0.06,0,4710317,CKB -LINE_23,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-46,0.06,0,4619816,CKB -LINE_23,Station-46,2022-03-07 00:30:00,2022-03-07 00:57:00,Station-45,10083,7,4619816,CKB -LINE_23,Station-45,2022-03-07 01:04:00,2022-03-07 01:30:00,Station-46,9016,0,4619816,CKB -LINE_23,Station-46,2022-03-07 01:30:00,2022-03-07 01:57:00,Station-45,10083,7,4619816,CKB -LINE_23,Station-45,2022-03-07 02:04:00,2022-03-07 02:30:00,Station-46,9016,0,4619816,CKB -LINE_23,Station-46,2022-03-07 02:30:00,2022-03-07 02:57:00,Station-45,10083,7,4619816,CKB -LINE_23,Station-45,2022-03-07 03:04:00,2022-03-07 03:30:00,Station-46,9016,0,4619816,CKB -LINE_23,Station-46,2022-03-07 03:30:00,2022-03-07 03:57:00,Station-45,10083,7,4619816,CKB -LINE_23,Station-45,2022-03-07 04:04:00,2022-03-07 04:30:00,Station-46,9016,0,4619816,CKB -LINE_23,Station-46,2022-03-07 04:30:00,2022-03-07 04:57:00,Station-45,10083,0,4619816,CKB -LINE_23,Station-45,2022-03-07 04:57:00,2022-03-07 04:57:00,Station-0,0.06,0,4619816,CKB -LINE_23,Station-0,2022-03-07 00:34:00,2022-03-07 00:34:00,Station-45,0.06,0,4619817,CKB -LINE_23,Station-45,2022-03-07 00:34:00,2022-03-07 01:00:00,Station-46,9016,0,4619817,CKB -LINE_23,Station-46,2022-03-07 01:00:00,2022-03-07 01:27:00,Station-45,10083,7,4619817,CKB -LINE_23,Station-45,2022-03-07 01:34:00,2022-03-07 02:00:00,Station-46,9016,0,4619817,CKB -LINE_23,Station-46,2022-03-07 02:00:00,2022-03-07 02:27:00,Station-45,10083,7,4619817,CKB -LINE_23,Station-45,2022-03-07 02:34:00,2022-03-07 03:00:00,Station-46,9016,0,4619817,CKB -LINE_23,Station-46,2022-03-07 03:00:00,2022-03-07 03:27:00,Station-45,10083,7,4619817,CKB -LINE_23,Station-45,2022-03-07 03:34:00,2022-03-07 04:00:00,Station-46,9016,0,4619817,CKB -LINE_23,Station-46,2022-03-07 04:00:00,2022-03-07 04:27:00,Station-45,10083,0,4619817,CKB -LINE_23,Station-45,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,4619817,CKB -LINE_24,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,4374749,CKB -LINE_24,Station-21,2022-03-07 00:31:00,2022-03-07 00:44:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 00:44:00,2022-03-07 00:56:00,Station-21,5362,5,4374749,CKB -LINE_24,Station-21,2022-03-07 01:01:00,2022-03-07 01:14:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 01:14:00,2022-03-07 01:26:00,Station-21,5362,5,4374749,CKB -LINE_24,Station-21,2022-03-07 01:31:00,2022-03-07 01:44:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 01:44:00,2022-03-07 01:56:00,Station-21,5362,5,4374749,CKB -LINE_24,Station-21,2022-03-07 02:01:00,2022-03-07 02:14:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 02:14:00,2022-03-07 02:26:00,Station-21,5362,5,4374749,CKB -LINE_24,Station-21,2022-03-07 02:31:00,2022-03-07 02:44:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 02:44:00,2022-03-07 02:56:00,Station-21,5362,5,4374749,CKB -LINE_24,Station-21,2022-03-07 03:01:00,2022-03-07 03:14:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 03:14:00,2022-03-07 03:26:00,Station-21,5362,5,4374749,CKB -LINE_24,Station-21,2022-03-07 03:31:00,2022-03-07 03:44:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 03:44:00,2022-03-07 03:56:00,Station-21,5362,5,4374749,CKB -LINE_24,Station-21,2022-03-07 04:01:00,2022-03-07 04:14:00,Station-47,4872,0,4374749,CKB -LINE_24,Station-47,2022-03-07 04:14:00,2022-03-07 04:26:00,Station-21,5362,0,4374749,CKB -LINE_24,Station-21,2022-03-07 04:26:00,2022-03-07 04:26:00,Station-0,0.06,0,4374749,CKB -LINE_25,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,4374873,CKB -LINE_25,Station-21,2022-03-07 00:31:00,2022-03-07 00:45:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 00:47:00,2022-03-07 01:01:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 01:01:00,2022-03-07 01:15:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 01:17:00,2022-03-07 01:31:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 01:31:00,2022-03-07 01:45:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 01:47:00,2022-03-07 02:01:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 02:01:00,2022-03-07 02:15:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 02:17:00,2022-03-07 02:31:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 02:31:00,2022-03-07 02:45:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 02:47:00,2022-03-07 03:01:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 03:01:00,2022-03-07 03:15:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 03:17:00,2022-03-07 03:31:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 03:31:00,2022-03-07 03:45:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 03:47:00,2022-03-07 04:01:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 04:01:00,2022-03-07 04:15:00,Station-48,5225,2,4374873,CKB -LINE_25,Station-48,2022-03-07 04:17:00,2022-03-07 04:31:00,Station-21,7617,0,4374873,CKB -LINE_25,Station-21,2022-03-07 04:31:00,2022-03-07 04:31:00,Station-0,0.06,0,4374873,CKB -LINE_26,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-49,0.06,0,4375018,CKB -LINE_26,Station-49,2022-03-07 00:43:00,2022-03-07 00:53:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 00:53:00,2022-03-07 01:03:00,Station-49,4408,10,4375018,CKB -LINE_26,Station-49,2022-03-07 01:13:00,2022-03-07 01:23:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 01:23:00,2022-03-07 01:33:00,Station-49,4408,10,4375018,CKB -LINE_26,Station-49,2022-03-07 01:43:00,2022-03-07 01:53:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 01:53:00,2022-03-07 02:03:00,Station-49,4408,10,4375018,CKB -LINE_26,Station-49,2022-03-07 02:13:00,2022-03-07 02:23:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 02:23:00,2022-03-07 02:33:00,Station-49,4408,10,4375018,CKB -LINE_26,Station-49,2022-03-07 02:43:00,2022-03-07 02:53:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 02:53:00,2022-03-07 03:03:00,Station-49,4408,10,4375018,CKB -LINE_26,Station-49,2022-03-07 03:13:00,2022-03-07 03:23:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 03:23:00,2022-03-07 03:33:00,Station-49,4408,10,4375018,CKB -LINE_26,Station-49,2022-03-07 03:43:00,2022-03-07 03:53:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 03:53:00,2022-03-07 04:03:00,Station-49,4408,10,4375018,CKB -LINE_26,Station-49,2022-03-07 04:13:00,2022-03-07 04:23:00,Station-50,4507,0,4375018,CKB -LINE_26,Station-50,2022-03-07 04:23:00,2022-03-07 04:33:00,Station-49,4408,0,4375018,CKB -LINE_26,Station-49,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,4375018,CKB -LINE_27,Station-0,2022-03-13 15:46:00,2022-03-13 15:46:00,Station-14,0.06,0,4458713,CKB -LINE_27,Station-14,2022-03-13 15:46:00,2022-03-13 15:53:00,Station-51,3147,12,4458713,CKB -LINE_27,Station-51,2022-03-13 16:05:00,2022-03-13 16:15:00,Station-14,3469,0,4458713,CKB -LINE_27,Station-14,2022-03-13 16:15:00,2022-03-13 16:23:00,Station-51,3351,12,4458713,CKB -LINE_27,Station-51,2022-03-13 16:35:00,2022-03-13 16:45:00,Station-14,3469,0,4458713,CKB -LINE_27,Station-14,2022-03-13 16:45:00,2022-03-13 16:53:00,Station-51,3351,12,4458713,CKB -LINE_27,Station-51,2022-03-13 17:05:00,2022-03-13 17:15:00,Station-14,3469,0,4458713,CKB -LINE_27,Station-14,2022-03-13 17:15:00,2022-03-13 17:23:00,Station-51,3351,12,4458713,CKB -LINE_27,Station-51,2022-03-13 17:35:00,2022-03-13 17:45:00,Station-14,3469,0,4458713,CKB -LINE_27,Station-14,2022-03-13 17:45:00,2022-03-13 17:53:00,Station-51,3351,12,4458713,CKB -LINE_27,Station-51,2022-03-13 18:05:00,2022-03-13 18:15:00,Station-14,3469,0,4458713,CKB -LINE_27,Station-14,2022-03-13 18:15:00,2022-03-13 18:23:00,Station-51,3351,0,4458713,CKB -LINE_28,Station-51,2022-03-13 18:23:00,2022-03-13 18:29:00,Station-14,3.1,22,4458713,CKB -LINE_28,Station-14,2022-03-13 18:51:00,2022-03-13 19:02:00,Station-52,4338,0,4458713,CKB -LINE_28,Station-52,2022-03-13 19:02:00,2022-03-13 19:13:00,Station-14,4427,12,4458713,CKB -LINE_5,Station-14,2022-03-13 19:25:00,2022-03-13 19:38:00,Station-15,6086,3,4458713,CKB -LINE_5,Station-15,2022-03-13 19:41:00,2022-03-13 19:55:00,Station-14,6232,0,4458713,CKB -LINE_5,Station-14,2022-03-13 19:55:00,2022-03-13 20:08:00,Station-15,6086,3,4458713,CKB -LINE_5,Station-15,2022-03-13 20:11:00,2022-03-13 20:25:00,Station-14,6232,6,4458713,CKB -LINE_28,Station-14,2022-03-13 20:31:00,2022-03-13 20:42:00,Station-52,4338,0,4458713,CKB -LINE_28,Station-52,2022-03-13 20:42:00,2022-03-13 20:53:00,Station-14,4427,18,4458713,CKB -LINE_28,Station-14,2022-03-13 21:11:00,2022-03-13 21:22:00,Station-52,4338,0,4458713,CKB -LINE_28,Station-52,2022-03-13 21:22:00,2022-03-13 21:33:00,Station-14,4427,18,4458713,CKB -LINE_28,Station-14,2022-03-13 21:51:00,2022-03-13 22:02:00,Station-52,4338,0,4458713,CKB -LINE_28,Station-52,2022-03-13 22:02:00,2022-03-13 22:13:00,Station-14,4427,18,4458713,CKB -LINE_28,Station-14,2022-03-13 22:31:00,2022-03-13 22:42:00,Station-52,4338,0,4458713,CKB -LINE_28,Station-52,2022-03-13 22:42:00,2022-03-13 22:53:00,Station-14,4427,2,4458713,CKB -LINE_5,Station-14,2022-03-13 22:55:00,2022-03-13 23:08:00,Station-15,6086,3,4458713,CKB -LINE_5,Station-15,2022-03-13 23:11:00,2022-03-13 23:25:00,Station-14,6232,0,4458713,CKB -LINE_5,Station-14,2022-03-13 23:25:00,2022-03-13 23:38:00,Station-15,6086,3,4458713,CKB -LINE_5,Station-15,2022-03-13 23:41:00,2022-03-13 23:55:00,Station-14,6232,0,4458713,CKB -LINE_5,Station-14,2022-03-13 23:55:00,2022-03-14 00:08:00,Station-15,6086,0,4458713,CKB -LINE_5,Station-15,2022-03-14 00:08:00,2022-03-14 00:08:00,Station-0,0.06,0,4458713,CKB -LINE_6,Station-0,2022-03-13 07:05:00,2022-03-13 07:05:00,Station-16,0.06,0,4426903,CKB -LINE_6,Station-16,2022-03-13 07:05:00,2022-03-13 07:14:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 07:14:00,2022-03-13 07:23:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 07:25:00,2022-03-13 07:34:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 07:34:00,2022-03-13 07:43:00,Station-16,5139,22,4426903,CKB -LINE_6,Station-16,2022-03-13 08:05:00,2022-03-13 08:14:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 08:14:00,2022-03-13 08:23:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 08:25:00,2022-03-13 08:34:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 08:34:00,2022-03-13 08:43:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 08:45:00,2022-03-13 08:54:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 08:54:00,2022-03-13 09:03:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 09:05:00,2022-03-13 09:14:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 09:14:00,2022-03-13 09:23:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 09:25:00,2022-03-13 09:34:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-16,5139,23,4426903,CKB -LINE_6,Station-16,2022-03-13 10:06:00,2022-03-13 10:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 10:15:00,2022-03-13 10:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 10:26:00,2022-03-13 10:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 10:35:00,2022-03-13 10:44:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 10:46:00,2022-03-13 10:55:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 10:55:00,2022-03-13 11:04:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 11:06:00,2022-03-13 11:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 11:15:00,2022-03-13 11:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 11:26:00,2022-03-13 11:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 11:35:00,2022-03-13 11:44:00,Station-16,5139,22,4426903,CKB -LINE_6,Station-16,2022-03-13 12:06:00,2022-03-13 12:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 12:15:00,2022-03-13 12:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 12:26:00,2022-03-13 12:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 12:35:00,2022-03-13 12:44:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 12:46:00,2022-03-13 12:55:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 12:55:00,2022-03-13 13:04:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 13:06:00,2022-03-13 13:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 13:15:00,2022-03-13 13:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 13:26:00,2022-03-13 13:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 13:35:00,2022-03-13 13:44:00,Station-16,5139,22,4426903,CKB -LINE_6,Station-16,2022-03-13 14:06:00,2022-03-13 14:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 14:15:00,2022-03-13 14:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 14:26:00,2022-03-13 14:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 14:35:00,2022-03-13 14:44:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 14:46:00,2022-03-13 14:55:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 14:55:00,2022-03-13 15:04:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 15:06:00,2022-03-13 15:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 15:15:00,2022-03-13 15:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 15:26:00,2022-03-13 15:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 15:35:00,2022-03-13 15:44:00,Station-16,5139,22,4426903,CKB -LINE_6,Station-16,2022-03-13 16:06:00,2022-03-13 16:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 16:15:00,2022-03-13 16:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 16:26:00,2022-03-13 16:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 16:35:00,2022-03-13 16:44:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 16:46:00,2022-03-13 16:55:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 16:55:00,2022-03-13 17:04:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 17:06:00,2022-03-13 17:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 17:15:00,2022-03-13 17:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 17:26:00,2022-03-13 17:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 17:35:00,2022-03-13 17:44:00,Station-16,5139,22,4426903,CKB -LINE_6,Station-16,2022-03-13 18:06:00,2022-03-13 18:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 18:15:00,2022-03-13 18:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 18:26:00,2022-03-13 18:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 18:35:00,2022-03-13 18:44:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 18:46:00,2022-03-13 18:55:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 18:55:00,2022-03-13 19:04:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 19:06:00,2022-03-13 19:15:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 19:15:00,2022-03-13 19:24:00,Station-16,5139,2,4426903,CKB -LINE_6,Station-16,2022-03-13 19:26:00,2022-03-13 19:35:00,Station-17,4781,0,4426903,CKB -LINE_6,Station-17,2022-03-13 19:35:00,2022-03-13 19:44:00,Station-16,5139,21,4426903,CKB -LINE_6,Station-16,2022-03-13 20:05:00,2022-03-13 20:14:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 20:15:00,2022-03-13 20:24:00,Station-16,5139,1,4426903,CKB -LINE_6,Station-16,2022-03-13 20:25:00,2022-03-13 20:34:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 20:35:00,2022-03-13 20:44:00,Station-16,5139,1,4426903,CKB -LINE_6,Station-16,2022-03-13 20:45:00,2022-03-13 20:54:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 20:55:00,2022-03-13 21:04:00,Station-16,5139,1,4426903,CKB -LINE_6,Station-16,2022-03-13 21:05:00,2022-03-13 21:14:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 21:15:00,2022-03-13 21:24:00,Station-16,5139,1,4426903,CKB -LINE_6,Station-16,2022-03-13 21:25:00,2022-03-13 21:34:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 21:35:00,2022-03-13 21:44:00,Station-16,5139,21,4426903,CKB -LINE_6,Station-16,2022-03-13 22:05:00,2022-03-13 22:14:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 22:15:00,2022-03-13 22:24:00,Station-16,5139,1,4426903,CKB -LINE_6,Station-16,2022-03-13 22:25:00,2022-03-13 22:34:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 22:35:00,2022-03-13 22:44:00,Station-16,5139,1,4426903,CKB -LINE_6,Station-16,2022-03-13 22:45:00,2022-03-13 22:54:00,Station-17,4781,1,4426903,CKB -LINE_6,Station-17,2022-03-13 22:55:00,2022-03-13 23:04:00,Station-16,5139,0,4426903,CKB -LINE_6,Station-16,2022-03-13 23:04:00,2022-03-13 23:04:00,Station-0,0.06,0,4426903,CKB -LINE_29,Station-0,2022-03-13 07:30:00,2022-03-13 07:30:00,Station-53,0.06,0,4369706,CKB -LINE_29,Station-53,2022-03-13 07:30:00,2022-03-13 07:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 07:39:00,2022-03-13 07:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 07:50:00,2022-03-13 07:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 07:59:00,2022-03-13 08:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 08:10:00,2022-03-13 08:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 08:19:00,2022-03-13 08:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 08:30:00,2022-03-13 08:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 08:39:00,2022-03-13 08:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 08:50:00,2022-03-13 08:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 08:59:00,2022-03-13 09:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 09:10:00,2022-03-13 09:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 09:19:00,2022-03-13 09:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 09:30:00,2022-03-13 09:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 09:39:00,2022-03-13 09:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 09:50:00,2022-03-13 09:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 09:59:00,2022-03-13 10:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 10:10:00,2022-03-13 10:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 10:30:00,2022-03-13 10:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 10:39:00,2022-03-13 10:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 10:50:00,2022-03-13 10:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 10:59:00,2022-03-13 11:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 11:10:00,2022-03-13 11:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 11:19:00,2022-03-13 11:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 11:30:00,2022-03-13 11:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 11:39:00,2022-03-13 11:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 11:50:00,2022-03-13 11:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 11:59:00,2022-03-13 12:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 12:10:00,2022-03-13 12:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 12:19:00,2022-03-13 12:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 12:30:00,2022-03-13 12:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 12:39:00,2022-03-13 12:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 12:50:00,2022-03-13 12:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 12:59:00,2022-03-13 13:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 13:10:00,2022-03-13 13:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 13:19:00,2022-03-13 13:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 13:30:00,2022-03-13 13:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 13:39:00,2022-03-13 13:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 13:50:00,2022-03-13 13:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 13:59:00,2022-03-13 14:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 14:10:00,2022-03-13 14:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 14:19:00,2022-03-13 14:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 14:30:00,2022-03-13 14:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 14:39:00,2022-03-13 14:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 14:50:00,2022-03-13 14:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 14:59:00,2022-03-13 15:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 15:10:00,2022-03-13 15:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 15:19:00,2022-03-13 15:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 15:30:00,2022-03-13 15:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 15:39:00,2022-03-13 15:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 15:50:00,2022-03-13 15:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 15:59:00,2022-03-13 16:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 16:10:00,2022-03-13 16:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 16:19:00,2022-03-13 16:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 16:30:00,2022-03-13 16:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 16:39:00,2022-03-13 16:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 16:50:00,2022-03-13 16:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 16:59:00,2022-03-13 17:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 17:10:00,2022-03-13 17:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 17:19:00,2022-03-13 17:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 17:30:00,2022-03-13 17:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 17:39:00,2022-03-13 17:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 17:50:00,2022-03-13 17:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 17:59:00,2022-03-13 18:10:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 18:10:00,2022-03-13 18:15:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 18:19:00,2022-03-13 18:30:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 18:30:00,2022-03-13 18:35:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 18:39:00,2022-03-13 18:50:00,Station-53,4341,0,4369706,CKB -LINE_29,Station-53,2022-03-13 18:50:00,2022-03-13 18:55:00,Station-54,2217,4,4369706,CKB -LINE_29,Station-54,2022-03-13 18:59:00,2022-03-13 19:10:00,Station-53,4288,0,4369706,CKB -LINE_29,Station-53,2022-03-13 19:10:00,2022-03-13 19:10:00,Station-0,0.06,0,4369706,CKB -LINE_10,Station-0,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.06,0,4419537,CKB -LINE_10,Station-24,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.0,792,4419537,CKB -LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-24,0.0,0,4419537,CKB -LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-0,0.06,0,4419537,CKB -LINE_30,Station-0,2022-03-13 07:18:00,2022-03-13 07:18:00,Station-55,0.06,0,4688586,CKB -LINE_30,Station-55,2022-03-13 07:18:00,2022-03-13 07:26:00,Station-56,5562,10,4688586,CKB -LINE_30,Station-56,2022-03-13 07:36:00,2022-03-13 07:45:00,Station-57,5941,32,4688586,CKB -LINE_30,Station-57,2022-03-13 08:17:00,2022-03-13 08:26:00,Station-56,5994,10,4688586,CKB -LINE_30,Station-56,2022-03-13 08:36:00,2022-03-13 08:45:00,Station-57,5941,32,4688586,CKB -LINE_30,Station-57,2022-03-13 09:17:00,2022-03-13 09:26:00,Station-56,5994,8,4688586,CKB -LINE_30,Station-56,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-57,5941,36,4688586,CKB -LINE_30,Station-57,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-56,5994,2,4688586,CKB -LINE_30,Station-56,2022-03-13 10:32:00,2022-03-13 10:41:00,Station-55,5566,0,4688586,CKB -LINE_30,Station-55,2022-03-13 10:41:00,2022-03-13 10:41:00,Station-0,0.06,0,4688586,CKB -LINE_0,Station-0,2022-03-08 21:31:00,2022-03-08 21:31:00,Station-1,0.06,0,4454944,CKB -LINE_0,Station-1,2022-03-08 21:31:00,2022-03-08 22:04:00,Station-2,14519,4,4454944,CKB -LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-1,13541,8,4454944,CKB -LINE_0,Station-1,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-2,14519,4,4454944,CKB -LINE_0,Station-2,2022-03-08 23:28:00,2022-03-09 00:03:00,Station-1,13541,8,4454944,CKB -LINE_0,Station-1,2022-03-09 00:11:00,2022-03-09 00:44:00,Station-2,14519,0,4454944,CKB -LINE_1,Station-2,2022-03-09 00:44:00,2022-03-09 00:54:00,Station-3,4.1,25,4454944,CKB -LINE_1,Station-3,2022-03-09 01:19:00,2022-03-09 01:42:00,Station-4,8.36,6,4454944,CKB -LINE_1,Station-4,2022-03-09 01:48:00,2022-03-09 02:06:00,Station-3,9067,13,4454944,CKB -LINE_1,Station-3,2022-03-09 02:19:00,2022-03-09 02:42:00,Station-4,8.36,6,4454944,CKB -LINE_1,Station-4,2022-03-09 02:48:00,2022-03-09 03:06:00,Station-3,9067,13,4454944,CKB -LINE_1,Station-3,2022-03-09 03:19:00,2022-03-09 03:42:00,Station-4,8.36,6,4454944,CKB -LINE_1,Station-4,2022-03-09 03:48:00,2022-03-09 04:06:00,Station-3,9067,0,4454944,CKB -LINE_1,Station-3,2022-03-09 04:06:00,2022-03-09 04:06:00,Station-0,0.06,0,4454944,CKB -LINE_0,Station-0,2022-03-08 22:11:00,2022-03-08 22:11:00,Station-1,0.06,0,4454949,CKB -LINE_0,Station-1,2022-03-08 22:11:00,2022-03-08 22:44:00,Station-2,14519,4,4454949,CKB -LINE_0,Station-2,2022-03-08 22:48:00,2022-03-08 23:23:00,Station-1,13541,8,4454949,CKB -LINE_0,Station-1,2022-03-08 23:31:00,2022-03-09 00:04:00,Station-2,14519,4,4454949,CKB -LINE_0,Station-2,2022-03-09 00:08:00,2022-03-09 00:39:00,Station-5,12213,0,4454949,CKB -LINE_1,Station-5,2022-03-09 00:39:00,2022-03-09 00:47:00,Station-3,4.0,2,4454949,CKB -LINE_1,Station-3,2022-03-09 00:49:00,2022-03-09 01:12:00,Station-4,8.36,6,4454949,CKB -LINE_1,Station-4,2022-03-09 01:18:00,2022-03-09 01:36:00,Station-3,9067,13,4454949,CKB -LINE_1,Station-3,2022-03-09 01:49:00,2022-03-09 02:12:00,Station-4,8.36,6,4454949,CKB -LINE_1,Station-4,2022-03-09 02:18:00,2022-03-09 02:36:00,Station-3,9067,13,4454949,CKB -LINE_1,Station-3,2022-03-09 02:49:00,2022-03-09 03:12:00,Station-4,8.36,6,4454949,CKB -LINE_1,Station-4,2022-03-09 03:18:00,2022-03-09 03:36:00,Station-3,9067,13,4454949,CKB -LINE_1,Station-3,2022-03-09 03:49:00,2022-03-09 04:12:00,Station-4,8.36,0,4454949,CKB -LINE_1,Station-4,2022-03-09 04:12:00,2022-03-09 04:12:00,Station-0,0.06,0,4454949,CKB -LINE_2,Station-0,2022-03-08 21:06:00,2022-03-08 21:06:00,Station-6,0.06,0,4664623,CKB -LINE_2,Station-6,2022-03-08 21:06:00,2022-03-08 21:34:00,Station-7,13018,19,4664623,CKB -LINE_2,Station-7,2022-03-08 21:53:00,2022-03-08 22:13:00,Station-8,10332,17,4664623,CKB -LINE_2,Station-8,2022-03-08 22:30:00,2022-03-08 22:54:00,Station-7,10.48,19,4664623,CKB -LINE_2,Station-7,2022-03-08 23:13:00,2022-03-08 23:33:00,Station-8,10332,17,4664623,CKB -LINE_2,Station-8,2022-03-08 23:50:00,2022-03-09 00:14:00,Station-7,10.48,2,4664623,CKB -LINE_2,Station-7,2022-03-09 00:16:00,2022-03-09 00:23:00,Station-9,3709,5,4664623,CKB -LINE_3,Station-9,2022-03-09 00:28:00,2022-03-09 00:44:00,Station-10,6404,3,4664623,CKB -LINE_3,Station-10,2022-03-09 00:47:00,2022-03-09 01:10:00,Station-11,10579,7,4664623,CKB -LINE_3,Station-11,2022-03-09 01:17:00,2022-03-09 01:44:00,Station-10,12007,3,4664623,CKB -LINE_3,Station-10,2022-03-09 01:47:00,2022-03-09 02:10:00,Station-11,10579,7,4664623,CKB -LINE_3,Station-11,2022-03-09 02:17:00,2022-03-09 02:44:00,Station-10,12007,3,4664623,CKB -LINE_3,Station-10,2022-03-09 02:47:00,2022-03-09 03:10:00,Station-11,10579,7,4664623,CKB -LINE_3,Station-11,2022-03-09 03:17:00,2022-03-09 03:44:00,Station-10,12007,3,4664623,CKB -LINE_3,Station-10,2022-03-09 03:47:00,2022-03-09 04:10:00,Station-11,10579,7,4664623,CKB -LINE_3,Station-11,2022-03-09 04:17:00,2022-03-09 04:44:00,Station-10,12007,0,4664623,CKB -LINE_3,Station-10,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,4664623,CKB -LINE_2,Station-0,2022-03-08 20:26:00,2022-03-08 20:26:00,Station-6,0.06,0,4762733,CKB -LINE_2,Station-6,2022-03-08 20:26:00,2022-03-08 20:56:00,Station-12,14097,14,4762733,CKB -LINE_2,Station-12,2022-03-08 21:10:00,2022-03-08 21:38:00,Station-6,13.19,8,4762733,CKB -LINE_2,Station-6,2022-03-08 21:46:00,2022-03-08 22:14:00,Station-7,13018,19,4762733,CKB -LINE_2,Station-7,2022-03-08 22:33:00,2022-03-08 22:53:00,Station-8,10332,17,4762733,CKB -LINE_2,Station-8,2022-03-08 23:10:00,2022-03-08 23:34:00,Station-7,10.48,19,4762733,CKB -LINE_2,Station-7,2022-03-08 23:53:00,2022-03-09 00:13:00,Station-8,10332,2,4762733,CKB -LINE_2,Station-8,2022-03-09 00:15:00,2022-03-09 00:16:00,Station-10,506,1,4762733,CKB -LINE_3,Station-10,2022-03-09 00:17:00,2022-03-09 00:40:00,Station-11,10579,7,4762733,CKB -LINE_3,Station-11,2022-03-09 00:47:00,2022-03-09 01:14:00,Station-10,12007,3,4762733,CKB -LINE_3,Station-10,2022-03-09 01:17:00,2022-03-09 01:40:00,Station-11,10579,7,4762733,CKB -LINE_3,Station-11,2022-03-09 01:47:00,2022-03-09 02:14:00,Station-10,12007,3,4762733,CKB -LINE_3,Station-10,2022-03-09 02:17:00,2022-03-09 02:40:00,Station-11,10579,7,4762733,CKB -LINE_3,Station-11,2022-03-09 02:47:00,2022-03-09 03:14:00,Station-10,12007,3,4762733,CKB -LINE_3,Station-10,2022-03-09 03:17:00,2022-03-09 03:40:00,Station-11,10579,7,4762733,CKB -LINE_3,Station-11,2022-03-09 03:47:00,2022-03-09 04:14:00,Station-10,12007,3,4762733,CKB -LINE_3,Station-10,2022-03-09 04:17:00,2022-03-09 04:40:00,Station-11,10579,3,4762733,CKB -LINE_4,Station-11,2022-03-09 04:43:00,2022-03-09 04:58:00,Station-13,6161,0,4762733,CKB -LINE_4,Station-13,2022-03-09 04:58:00,2022-03-09 04:58:00,Station-0,0.06,0,4762733,CKB -LINE_5,Station-0,2022-03-08 22:56:00,2022-03-08 22:56:00,Station-14,0.06,0,4617408,CKB -LINE_5,Station-14,2022-03-08 22:56:00,2022-03-08 23:08:00,Station-15,5882,3,4617408,CKB -LINE_5,Station-15,2022-03-08 23:11:00,2022-03-08 23:25:00,Station-14,6232,0,4617408,CKB -LINE_5,Station-14,2022-03-08 23:25:00,2022-03-08 23:38:00,Station-15,6086,3,4617408,CKB -LINE_5,Station-15,2022-03-08 23:41:00,2022-03-08 23:55:00,Station-14,6232,0,4617408,CKB -LINE_5,Station-14,2022-03-08 23:55:00,2022-03-09 00:08:00,Station-15,6086,0,4617408,CKB -LINE_5,Station-15,2022-03-09 00:08:00,2022-03-09 00:08:00,Station-0,0.06,0,4617408,CKB -LINE_6,Station-0,2022-03-08 05:05:00,2022-03-08 05:05:00,Station-16,0.06,0,4426845,CKB -LINE_6,Station-16,2022-03-08 05:05:00,2022-03-08 05:14:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 05:14:00,2022-03-08 05:23:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 05:25:00,2022-03-08 05:34:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 05:34:00,2022-03-08 05:43:00,Station-16,5139,23,4426845,CKB -LINE_6,Station-16,2022-03-08 06:06:00,2022-03-08 06:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 06:15:00,2022-03-08 06:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 06:26:00,2022-03-08 06:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 06:35:00,2022-03-08 06:44:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 06:46:00,2022-03-08 06:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 06:55:00,2022-03-08 07:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 07:06:00,2022-03-08 07:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 07:15:00,2022-03-08 07:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 07:26:00,2022-03-08 07:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 07:35:00,2022-03-08 07:44:00,Station-16,5139,22,4426845,CKB -LINE_6,Station-16,2022-03-08 08:06:00,2022-03-08 08:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 08:15:00,2022-03-08 08:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 08:26:00,2022-03-08 08:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 08:35:00,2022-03-08 08:44:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 08:46:00,2022-03-08 08:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 08:55:00,2022-03-08 09:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 09:06:00,2022-03-08 09:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 09:15:00,2022-03-08 09:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 09:26:00,2022-03-08 09:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 09:35:00,2022-03-08 09:44:00,Station-16,5139,22,4426845,CKB -LINE_6,Station-16,2022-03-08 10:06:00,2022-03-08 10:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 10:15:00,2022-03-08 10:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 10:26:00,2022-03-08 10:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 10:35:00,2022-03-08 10:44:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 10:46:00,2022-03-08 10:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 10:55:00,2022-03-08 11:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 11:06:00,2022-03-08 11:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 11:15:00,2022-03-08 11:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 11:26:00,2022-03-08 11:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 11:35:00,2022-03-08 11:44:00,Station-16,5139,22,4426845,CKB -LINE_6,Station-16,2022-03-08 12:06:00,2022-03-08 12:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 12:15:00,2022-03-08 12:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 12:26:00,2022-03-08 12:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 12:35:00,2022-03-08 12:44:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 12:46:00,2022-03-08 12:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 12:55:00,2022-03-08 13:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 13:06:00,2022-03-08 13:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 13:15:00,2022-03-08 13:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 13:26:00,2022-03-08 13:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 13:35:00,2022-03-08 13:44:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 13:46:00,2022-03-08 13:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 13:55:00,2022-03-08 14:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 14:06:00,2022-03-08 14:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 14:15:00,2022-03-08 14:24:00,Station-16,5139,22,4426845,CKB -LINE_6,Station-16,2022-03-08 14:46:00,2022-03-08 14:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 14:55:00,2022-03-08 15:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 15:06:00,2022-03-08 15:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 15:15:00,2022-03-08 15:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 15:26:00,2022-03-08 15:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 15:35:00,2022-03-08 15:44:00,Station-16,5139,22,4426845,CKB -LINE_6,Station-16,2022-03-08 16:06:00,2022-03-08 16:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 16:15:00,2022-03-08 16:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 16:26:00,2022-03-08 16:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 16:35:00,2022-03-08 16:44:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 16:46:00,2022-03-08 16:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 16:55:00,2022-03-08 17:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 17:06:00,2022-03-08 17:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 17:15:00,2022-03-08 17:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 17:26:00,2022-03-08 17:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 17:35:00,2022-03-08 17:44:00,Station-16,5139,22,4426845,CKB -LINE_6,Station-16,2022-03-08 18:06:00,2022-03-08 18:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 18:15:00,2022-03-08 18:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 18:26:00,2022-03-08 18:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 18:35:00,2022-03-08 18:44:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 18:46:00,2022-03-08 18:55:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 18:55:00,2022-03-08 19:04:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 19:06:00,2022-03-08 19:15:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 19:15:00,2022-03-08 19:24:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 19:26:00,2022-03-08 19:35:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 19:35:00,2022-03-08 19:44:00,Station-16,5139,21,4426845,CKB -LINE_6,Station-16,2022-03-08 20:05:00,2022-03-08 20:14:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 20:14:00,2022-03-08 20:23:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 20:25:00,2022-03-08 20:34:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 20:34:00,2022-03-08 20:43:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 20:45:00,2022-03-08 20:54:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 20:54:00,2022-03-08 21:03:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 21:05:00,2022-03-08 21:14:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 21:14:00,2022-03-08 21:23:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 21:25:00,2022-03-08 21:34:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 21:34:00,2022-03-08 21:43:00,Station-16,5139,22,4426845,CKB -LINE_6,Station-16,2022-03-08 22:05:00,2022-03-08 22:14:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 22:14:00,2022-03-08 22:23:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 22:25:00,2022-03-08 22:34:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 22:34:00,2022-03-08 22:43:00,Station-16,5139,2,4426845,CKB -LINE_6,Station-16,2022-03-08 22:45:00,2022-03-08 22:54:00,Station-17,4781,0,4426845,CKB -LINE_6,Station-17,2022-03-08 22:54:00,2022-03-08 23:03:00,Station-16,5139,0,4426845,CKB -LINE_6,Station-16,2022-03-08 23:03:00,2022-03-08 23:03:00,Station-0,0.06,0,4426845,CKB -LINE_7,Station-0,2022-03-09 00:06:00,2022-03-09 00:06:00,Station-18,0.06,0,4708595,CKB -LINE_7,Station-18,2022-03-09 00:06:00,2022-03-09 00:27:00,Station-19,7827,0,4708595,CKB -LINE_8,Station-19,2022-03-09 00:27:00,2022-03-09 00:48:00,Station-20,11079,0,4708595,CKB -LINE_8,Station-20,2022-03-09 00:48:00,2022-03-09 01:25:00,Station-21,20641,8,4708595,CKB -LINE_8,Station-21,2022-03-09 01:33:00,2022-03-09 02:16:00,Station-20,20579,1,4708595,CKB -LINE_8,Station-20,2022-03-09 02:17:00,2022-03-09 02:55:00,Station-21,20641,8,4708595,CKB -LINE_8,Station-21,2022-03-09 03:03:00,2022-03-09 03:46:00,Station-20,20579,1,4708595,CKB -LINE_8,Station-20,2022-03-09 03:47:00,2022-03-09 04:25:00,Station-21,20641,0,4708595,CKB -LINE_8,Station-21,2022-03-09 04:25:00,2022-03-09 04:25:00,Station-0,0.06,0,4708595,CKB -LINE_9,Station-22,2022-03-08 05:15:00,2022-03-08 06:01:00,Station-23,17.9,0,4317625,VDL -LINE_9,Station-23,2022-03-08 06:01:00,2022-03-08 06:15:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 06:23:00,2022-03-08 06:37:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 06:41:00,2022-03-08 06:55:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 07:03:00,2022-03-08 07:17:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 07:21:00,2022-03-08 07:35:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 07:43:00,2022-03-08 07:57:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 08:01:00,2022-03-08 08:15:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 08:23:00,2022-03-08 08:37:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 08:41:00,2022-03-08 08:55:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 09:03:00,2022-03-08 09:17:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 09:21:00,2022-03-08 09:35:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 09:43:00,2022-03-08 09:57:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 10:01:00,2022-03-08 10:15:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 10:23:00,2022-03-08 10:37:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 10:41:00,2022-03-08 10:55:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 11:03:00,2022-03-08 11:17:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 11:21:00,2022-03-08 11:35:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 11:43:00,2022-03-08 11:57:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 12:01:00,2022-03-08 12:15:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 12:23:00,2022-03-08 12:37:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 12:41:00,2022-03-08 12:55:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 13:03:00,2022-03-08 13:17:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 13:21:00,2022-03-08 13:35:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 13:43:00,2022-03-08 13:57:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 14:01:00,2022-03-08 14:15:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 14:23:00,2022-03-08 14:37:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 14:41:00,2022-03-08 14:55:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 15:03:00,2022-03-08 15:17:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 15:21:00,2022-03-08 15:35:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 15:43:00,2022-03-08 15:57:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 16:01:00,2022-03-08 16:15:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 16:23:00,2022-03-08 16:37:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 16:41:00,2022-03-08 16:55:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 17:03:00,2022-03-08 17:17:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 17:21:00,2022-03-08 17:35:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 17:43:00,2022-03-08 17:57:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 18:01:00,2022-03-08 18:15:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 18:23:00,2022-03-08 18:37:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 18:41:00,2022-03-08 18:55:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 19:03:00,2022-03-08 19:17:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 19:21:00,2022-03-08 19:35:00,Station-23,4637,8,4317625,VDL -LINE_9,Station-23,2022-03-08 19:43:00,2022-03-08 19:57:00,Station-23,4637,4,4317625,VDL -LINE_9,Station-23,2022-03-08 20:01:00,2022-03-08 20:14:00,Station-23,4637,9,4317625,VDL -LINE_9,Station-23,2022-03-08 20:23:00,2022-03-08 20:36:00,Station-23,4637,0,4317625,VDL -LINE_9,Station-23,2022-03-08 20:36:00,2022-03-08 21:15:00,Station-22,19.8,0,4317625,VDL -LINE_10,Station-0,2022-03-08 04:56:00,2022-03-08 04:56:00,Station-24,0.06,18,4425668,CKB -LINE_10,Station-24,2022-03-08 05:14:00,2022-03-08 05:20:00,Station-25,3.29,0,4425668,CKB -LINE_10,Station-25,2022-03-08 05:20:00,2022-03-08 05:24:00,Station-24,2954,20,4425668,CKB -LINE_10,Station-24,2022-03-08 05:44:00,2022-03-08 05:50:00,Station-25,3.29,0,4425668,CKB -LINE_10,Station-25,2022-03-08 05:50:00,2022-03-08 05:54:00,Station-24,2954,5,4425668,CKB -LINE_10,Station-24,2022-03-08 05:59:00,2022-03-08 06:06:00,Station-25,3.29,2,4425668,CKB -LINE_10,Station-25,2022-03-08 06:08:00,2022-03-08 06:13:00,Station-24,2954,19,4425668,CKB -LINE_10,Station-24,2022-03-08 06:32:00,2022-03-08 06:39:00,Station-25,3.29,1,4425668,CKB -LINE_10,Station-25,2022-03-08 06:40:00,2022-03-08 06:45:00,Station-24,2954,7,4425668,CKB -LINE_10,Station-24,2022-03-08 06:52:00,2022-03-08 06:59:00,Station-25,3.29,1,4425668,CKB -LINE_10,Station-25,2022-03-08 07:00:00,2022-03-08 07:05:00,Station-24,2954,7,4425668,CKB -LINE_10,Station-24,2022-03-08 07:12:00,2022-03-08 07:19:00,Station-25,3.29,1,4425668,CKB -LINE_10,Station-25,2022-03-08 07:20:00,2022-03-08 07:25:00,Station-24,2954,7,4425668,CKB -LINE_10,Station-24,2022-03-08 07:32:00,2022-03-08 07:39:00,Station-25,3.29,1,4425668,CKB -LINE_10,Station-25,2022-03-08 07:40:00,2022-03-08 07:45:00,Station-24,2954,295,4425668,CKB -LINE_10,Station-24,2022-03-08 12:40:00,2022-03-08 12:47:00,Station-25,3.29,2,4425668,CKB -LINE_10,Station-25,2022-03-08 12:49:00,2022-03-08 12:54:00,Station-24,2954,46,4425668,CKB -LINE_10,Station-24,2022-03-08 13:40:00,2022-03-08 13:47:00,Station-25,3.29,2,4425668,CKB -LINE_10,Station-25,2022-03-08 13:49:00,2022-03-08 13:54:00,Station-24,2954,434,4425668,CKB -LINE_10,Station-24,2022-03-08 21:08:00,2022-03-08 21:08:00,Station-0,0.06,0,4425668,CKB -LINE_11,Station-0,2022-03-08 07:20:00,2022-03-08 07:20:00,Station-26,0.06,0,4448150,CKB -LINE_11,Station-26,2022-03-08 07:20:00,2022-03-08 07:50:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 08:00:00,2022-03-08 08:30:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 08:40:00,2022-03-08 09:10:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 09:20:00,2022-03-08 09:50:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 10:00:00,2022-03-08 10:30:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 10:40:00,2022-03-08 11:10:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 11:20:00,2022-03-08 11:50:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 12:00:00,2022-03-08 12:30:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 12:40:00,2022-03-08 13:10:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 13:20:00,2022-03-08 13:50:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 14:00:00,2022-03-08 14:30:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 14:40:00,2022-03-08 15:10:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 15:20:00,2022-03-08 15:50:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 16:00:00,2022-03-08 16:30:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 16:40:00,2022-03-08 17:10:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 17:20:00,2022-03-08 17:50:00,Station-26,9266,10,4448150,CKB -LINE_11,Station-26,2022-03-08 18:00:00,2022-03-08 18:30:00,Station-26,9266,0,4448150,CKB -LINE_11,Station-26,2022-03-08 18:30:00,2022-03-08 18:30:00,Station-0,0.06,0,4448150,CKB -LINE_12,Station-0,2022-03-08 07:10:00,2022-03-08 07:10:00,Station-27,0.06,0,4733895,CKB -LINE_12,Station-27,2022-03-08 07:10:00,2022-03-08 07:18:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 07:28:00,2022-03-08 07:40:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 07:40:00,2022-03-08 07:48:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 07:58:00,2022-03-08 08:10:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 08:10:00,2022-03-08 08:18:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 08:28:00,2022-03-08 08:40:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 08:40:00,2022-03-08 08:48:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 08:58:00,2022-03-08 09:10:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 09:10:00,2022-03-08 09:18:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 09:28:00,2022-03-08 09:40:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 09:40:00,2022-03-08 09:48:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 09:58:00,2022-03-08 10:10:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 10:10:00,2022-03-08 10:18:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 10:28:00,2022-03-08 10:40:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 10:40:00,2022-03-08 10:48:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 10:58:00,2022-03-08 11:10:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 11:10:00,2022-03-08 11:18:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 11:28:00,2022-03-08 11:40:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 11:40:00,2022-03-08 11:48:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 11:58:00,2022-03-08 12:10:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 12:10:00,2022-03-08 12:18:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 12:28:00,2022-03-08 12:40:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 12:40:00,2022-03-08 12:48:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 12:58:00,2022-03-08 13:10:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 13:10:00,2022-03-08 13:18:00,Station-28,2169,10,4733895,CKB -LINE_12,Station-28,2022-03-08 13:28:00,2022-03-08 13:40:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 13:40:00,2022-03-08 13:48:00,Station-28,2169,8,4733895,CKB -LINE_12,Station-28,2022-03-08 13:56:00,2022-03-08 14:10:00,Station-27,2952,0,4733895,CKB -LINE_12,Station-27,2022-03-08 14:10:00,2022-03-08 14:19:00,Station-28,2169,14,4733895,CKB -LINE_12,Station-28,2022-03-08 14:33:00,2022-03-08 14:47:00,Station-27,2952,3,4733895,CKB -LINE_12,Station-27,2022-03-08 14:50:00,2022-03-08 14:59:00,Station-28,2169,14,4733895,CKB -LINE_12,Station-28,2022-03-08 15:13:00,2022-03-08 15:27:00,Station-27,2952,3,4733895,CKB -LINE_12,Station-27,2022-03-08 15:30:00,2022-03-08 15:39:00,Station-28,2169,14,4733895,CKB -LINE_12,Station-28,2022-03-08 15:53:00,2022-03-08 16:07:00,Station-27,2952,3,4733895,CKB -LINE_12,Station-27,2022-03-08 16:10:00,2022-03-08 16:19:00,Station-28,2169,14,4733895,CKB -LINE_12,Station-28,2022-03-08 16:33:00,2022-03-08 16:47:00,Station-27,2952,3,4733895,CKB -LINE_12,Station-27,2022-03-08 16:50:00,2022-03-08 16:59:00,Station-28,2169,14,4733895,CKB -LINE_12,Station-28,2022-03-08 17:13:00,2022-03-08 17:27:00,Station-27,2952,3,4733895,CKB -LINE_12,Station-27,2022-03-08 17:30:00,2022-03-08 17:39:00,Station-28,2169,13,4733895,CKB -LINE_12,Station-28,2022-03-08 17:52:00,2022-03-08 18:05:00,Station-27,2952,5,4733895,CKB -LINE_12,Station-27,2022-03-08 18:10:00,2022-03-08 18:18:00,Station-28,2169,0,4733895,CKB -LINE_12,Station-28,2022-03-08 18:18:00,2022-03-08 18:18:00,Station-0,0.06,0,4733895,CKB -LINE_12,Station-0,2022-03-08 14:13:00,2022-03-08 14:13:00,Station-28,0.06,0,4734200,CKB -LINE_12,Station-28,2022-03-08 14:13:00,2022-03-08 14:27:00,Station-27,2952,3,4734200,CKB -LINE_12,Station-27,2022-03-08 14:30:00,2022-03-08 14:39:00,Station-28,2169,14,4734200,CKB -LINE_12,Station-28,2022-03-08 14:53:00,2022-03-08 15:07:00,Station-27,2952,3,4734200,CKB -LINE_12,Station-27,2022-03-08 15:10:00,2022-03-08 15:19:00,Station-28,2169,14,4734200,CKB -LINE_12,Station-28,2022-03-08 15:33:00,2022-03-08 15:47:00,Station-27,2952,3,4734200,CKB -LINE_12,Station-27,2022-03-08 15:50:00,2022-03-08 15:59:00,Station-28,2169,14,4734200,CKB -LINE_12,Station-28,2022-03-08 16:13:00,2022-03-08 16:27:00,Station-27,2952,3,4734200,CKB -LINE_12,Station-27,2022-03-08 16:30:00,2022-03-08 16:39:00,Station-28,2169,14,4734200,CKB -LINE_12,Station-28,2022-03-08 16:53:00,2022-03-08 17:07:00,Station-27,2952,3,4734200,CKB -LINE_12,Station-27,2022-03-08 17:10:00,2022-03-08 17:19:00,Station-28,2169,14,4734200,CKB -LINE_12,Station-28,2022-03-08 17:33:00,2022-03-08 17:47:00,Station-27,2952,3,4734200,CKB -LINE_12,Station-27,2022-03-08 17:50:00,2022-03-08 17:59:00,Station-28,2169,14,4734200,CKB -LINE_12,Station-28,2022-03-08 18:13:00,2022-03-08 18:25:00,Station-27,2952,0,4734200,CKB -LINE_12,Station-27,2022-03-08 18:25:00,2022-03-08 18:25:00,Station-0,0.06,0,4734200,CKB -LINE_13,Station-0,2022-03-09 00:23:00,2022-03-09 00:23:00,Station-29,0.06,0,4318157,CKB -LINE_13,Station-29,2022-03-09 00:23:00,2022-03-09 00:30:00,Station-30,2577,9,4318157,CKB -LINE_14,Station-30,2022-03-09 00:39:00,2022-03-09 00:54:00,Station-31,5937,9,4318157,CKB -LINE_14,Station-31,2022-03-09 01:03:00,2022-03-09 01:17:00,Station-30,6.19,0,4318157,CKB -LINE_13,Station-30,2022-03-09 01:17:00,2022-03-09 01:23:00,Station-29,2555,0,4318157,CKB -LINE_13,Station-29,2022-03-09 01:23:00,2022-03-09 01:30:00,Station-30,2577,9,4318157,CKB -LINE_14,Station-30,2022-03-09 01:39:00,2022-03-09 01:54:00,Station-31,5937,9,4318157,CKB -LINE_14,Station-31,2022-03-09 02:03:00,2022-03-09 02:17:00,Station-30,6.19,0,4318157,CKB -LINE_13,Station-30,2022-03-09 02:17:00,2022-03-09 02:23:00,Station-29,2555,0,4318157,CKB -LINE_13,Station-29,2022-03-09 02:23:00,2022-03-09 02:30:00,Station-30,2577,9,4318157,CKB -LINE_14,Station-30,2022-03-09 02:39:00,2022-03-09 02:54:00,Station-31,5937,9,4318157,CKB -LINE_14,Station-31,2022-03-09 03:03:00,2022-03-09 03:17:00,Station-30,6.19,0,4318157,CKB -LINE_13,Station-30,2022-03-09 03:17:00,2022-03-09 03:23:00,Station-29,2555,0,4318157,CKB -LINE_13,Station-29,2022-03-09 03:23:00,2022-03-09 03:30:00,Station-30,2577,9,4318157,CKB -LINE_14,Station-30,2022-03-09 03:39:00,2022-03-09 03:54:00,Station-31,5937,9,4318157,CKB -LINE_14,Station-31,2022-03-09 04:03:00,2022-03-09 04:17:00,Station-30,6.19,0,4318157,CKB -LINE_13,Station-30,2022-03-09 04:17:00,2022-03-09 04:23:00,Station-29,2555,0,4318157,CKB -LINE_13,Station-29,2022-03-09 04:23:00,2022-03-09 04:23:00,Station-0,0.06,0,4318157,CKB -LINE_14,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-31,0.06,0,4318177,CKB -LINE_14,Station-31,2022-03-09 00:33:00,2022-03-09 00:47:00,Station-30,6.19,0,4318177,CKB -LINE_13,Station-30,2022-03-09 00:47:00,2022-03-09 00:53:00,Station-29,2555,0,4318177,CKB -LINE_13,Station-29,2022-03-09 00:53:00,2022-03-09 01:00:00,Station-30,2577,9,4318177,CKB -LINE_14,Station-30,2022-03-09 01:09:00,2022-03-09 01:24:00,Station-31,5937,9,4318177,CKB -LINE_14,Station-31,2022-03-09 01:33:00,2022-03-09 01:47:00,Station-30,6.19,0,4318177,CKB -LINE_13,Station-30,2022-03-09 01:47:00,2022-03-09 01:53:00,Station-29,2555,0,4318177,CKB -LINE_13,Station-29,2022-03-09 01:53:00,2022-03-09 02:00:00,Station-30,2577,9,4318177,CKB -LINE_14,Station-30,2022-03-09 02:09:00,2022-03-09 02:24:00,Station-31,5937,9,4318177,CKB -LINE_14,Station-31,2022-03-09 02:33:00,2022-03-09 02:47:00,Station-30,6.19,0,4318177,CKB -LINE_13,Station-30,2022-03-09 02:47:00,2022-03-09 02:53:00,Station-29,2555,0,4318177,CKB -LINE_13,Station-29,2022-03-09 02:53:00,2022-03-09 03:00:00,Station-30,2577,9,4318177,CKB -LINE_14,Station-30,2022-03-09 03:09:00,2022-03-09 03:24:00,Station-31,5937,9,4318177,CKB -LINE_14,Station-31,2022-03-09 03:33:00,2022-03-09 03:47:00,Station-30,6.19,0,4318177,CKB -LINE_13,Station-30,2022-03-09 03:47:00,2022-03-09 03:53:00,Station-29,2555,0,4318177,CKB -LINE_13,Station-29,2022-03-09 03:53:00,2022-03-09 04:00:00,Station-30,2577,9,4318177,CKB -LINE_14,Station-30,2022-03-09 04:09:00,2022-03-09 04:24:00,Station-31,5937,0,4318177,CKB -LINE_14,Station-31,2022-03-09 04:24:00,2022-03-09 04:24:00,Station-0,0.06,0,4318177,CKB -LINE_15,Station-0,2022-03-09 00:57:00,2022-03-09 00:57:00,Station-32,0.06,0,4319352,CKB -LINE_15,Station-32,2022-03-09 00:57:00,2022-03-09 01:06:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 01:06:00,2022-03-09 01:11:00,Station-32,2936,16,4319352,CKB -LINE_15,Station-32,2022-03-09 01:27:00,2022-03-09 01:36:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 01:36:00,2022-03-09 01:41:00,Station-32,2936,16,4319352,CKB -LINE_15,Station-32,2022-03-09 01:57:00,2022-03-09 02:06:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 02:06:00,2022-03-09 02:11:00,Station-32,2936,16,4319352,CKB -LINE_15,Station-32,2022-03-09 02:27:00,2022-03-09 02:36:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 02:36:00,2022-03-09 02:41:00,Station-32,2936,16,4319352,CKB -LINE_15,Station-32,2022-03-09 02:57:00,2022-03-09 03:06:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 03:06:00,2022-03-09 03:11:00,Station-32,2936,16,4319352,CKB -LINE_15,Station-32,2022-03-09 03:27:00,2022-03-09 03:36:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 03:36:00,2022-03-09 03:41:00,Station-32,2936,16,4319352,CKB -LINE_15,Station-32,2022-03-09 03:57:00,2022-03-09 04:06:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 04:06:00,2022-03-09 04:11:00,Station-32,2936,16,4319352,CKB -LINE_15,Station-32,2022-03-09 04:27:00,2022-03-09 04:36:00,Station-33,4343,0,4319352,CKB -LINE_15,Station-33,2022-03-09 04:36:00,2022-03-09 04:36:00,Station-0,0.06,0,4319352,CKB -LINE_16,Station-0,2022-03-09 00:29:00,2022-03-09 00:29:00,Station-34,0.06,0,4751087,CKB -LINE_16,Station-34,2022-03-09 00:29:00,2022-03-09 00:41:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 00:47:00,2022-03-09 00:57:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 00:59:00,2022-03-09 01:11:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 01:17:00,2022-03-09 01:27:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 01:29:00,2022-03-09 01:41:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 01:47:00,2022-03-09 01:57:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 01:59:00,2022-03-09 02:11:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 02:17:00,2022-03-09 02:27:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 02:29:00,2022-03-09 02:41:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 02:47:00,2022-03-09 02:57:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 02:59:00,2022-03-09 03:11:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 03:17:00,2022-03-09 03:27:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 03:29:00,2022-03-09 03:41:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 03:47:00,2022-03-09 03:57:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 03:59:00,2022-03-09 04:11:00,Station-35,4481,6,4751087,CKB -LINE_16,Station-35,2022-03-09 04:17:00,2022-03-09 04:27:00,Station-34,4031,2,4751087,CKB -LINE_16,Station-34,2022-03-09 04:29:00,2022-03-09 04:41:00,Station-35,4481,0,4751087,CKB -LINE_16,Station-35,2022-03-09 04:41:00,2022-03-09 04:41:00,Station-0,0.06,0,4751087,CKB -LINE_17,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-34,0.06,0,4453545,CKB -LINE_17,Station-34,2022-03-09 00:30:00,2022-03-09 00:44:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 00:44:00,2022-03-09 00:57:00,Station-34,5302,3,4453545,CKB -LINE_17,Station-34,2022-03-09 01:00:00,2022-03-09 01:14:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 01:14:00,2022-03-09 01:27:00,Station-34,5302,3,4453545,CKB -LINE_17,Station-34,2022-03-09 01:30:00,2022-03-09 01:44:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 01:44:00,2022-03-09 01:57:00,Station-34,5302,3,4453545,CKB -LINE_17,Station-34,2022-03-09 02:00:00,2022-03-09 02:14:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 02:14:00,2022-03-09 02:27:00,Station-34,5302,3,4453545,CKB -LINE_17,Station-34,2022-03-09 02:30:00,2022-03-09 02:44:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 02:44:00,2022-03-09 02:57:00,Station-34,5302,3,4453545,CKB -LINE_17,Station-34,2022-03-09 03:00:00,2022-03-09 03:14:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 03:14:00,2022-03-09 03:27:00,Station-34,5302,3,4453545,CKB -LINE_17,Station-34,2022-03-09 03:30:00,2022-03-09 03:44:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 03:44:00,2022-03-09 03:57:00,Station-34,5302,3,4453545,CKB -LINE_17,Station-34,2022-03-09 04:00:00,2022-03-09 04:14:00,Station-36,4801,0,4453545,CKB -LINE_17,Station-36,2022-03-09 04:14:00,2022-03-09 04:27:00,Station-34,5302,0,4453545,CKB -LINE_17,Station-34,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,4453545,CKB -LINE_18,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-37,0.06,0,4374467,CKB -LINE_18,Station-37,2022-03-09 00:43:00,2022-03-09 01:33:00,Station-37,20434,10,4374467,CKB -LINE_18,Station-37,2022-03-09 01:43:00,2022-03-09 02:33:00,Station-37,20434,10,4374467,CKB -LINE_18,Station-37,2022-03-09 02:43:00,2022-03-09 03:33:00,Station-37,20434,10,4374467,CKB -LINE_18,Station-37,2022-03-09 03:43:00,2022-03-09 04:33:00,Station-37,20434,0,4374467,CKB -LINE_18,Station-37,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,4374467,CKB -LINE_18,Station-0,2022-03-09 00:13:00,2022-03-09 00:13:00,Station-37,0.06,0,4374472,CKB -LINE_18,Station-37,2022-03-09 00:13:00,2022-03-09 01:03:00,Station-37,20434,10,4374472,CKB -LINE_18,Station-37,2022-03-09 01:13:00,2022-03-09 02:03:00,Station-37,20434,10,4374472,CKB -LINE_18,Station-37,2022-03-09 02:13:00,2022-03-09 03:03:00,Station-37,20434,10,4374472,CKB -LINE_18,Station-37,2022-03-09 03:13:00,2022-03-09 04:03:00,Station-37,20434,0,4374472,CKB -LINE_18,Station-37,2022-03-09 04:03:00,2022-03-09 04:03:00,Station-0,0.06,0,4374472,CKB -LINE_19,Station-0,2022-03-09 00:24:00,2022-03-09 00:24:00,Station-38,0.06,0,4456448,CKB -LINE_19,Station-38,2022-03-09 00:24:00,2022-03-09 00:48:00,Station-39,11.86,4,4456448,CKB -LINE_19,Station-39,2022-03-09 00:52:00,2022-03-09 01:14:00,Station-38,11139,10,4456448,CKB -LINE_19,Station-38,2022-03-09 01:24:00,2022-03-09 01:48:00,Station-39,11.86,4,4456448,CKB -LINE_19,Station-39,2022-03-09 01:52:00,2022-03-09 02:14:00,Station-38,11139,10,4456448,CKB -LINE_19,Station-38,2022-03-09 02:24:00,2022-03-09 02:48:00,Station-39,11.86,4,4456448,CKB -LINE_19,Station-39,2022-03-09 02:52:00,2022-03-09 03:14:00,Station-38,11139,10,4456448,CKB -LINE_19,Station-38,2022-03-09 03:24:00,2022-03-09 03:48:00,Station-39,11.86,4,4456448,CKB -LINE_19,Station-39,2022-03-09 03:52:00,2022-03-09 04:14:00,Station-38,11139,0,4456448,CKB -LINE_19,Station-38,2022-03-09 04:14:00,2022-03-09 04:14:00,Station-0,0.06,0,4456448,CKB -LINE_19,Station-0,2022-03-09 00:22:00,2022-03-09 00:22:00,Station-39,0.06,0,4456456,CKB -LINE_19,Station-39,2022-03-09 00:22:00,2022-03-09 00:44:00,Station-38,11139,10,4456456,CKB -LINE_19,Station-38,2022-03-09 00:54:00,2022-03-09 01:18:00,Station-39,11.86,4,4456456,CKB -LINE_19,Station-39,2022-03-09 01:22:00,2022-03-09 01:44:00,Station-38,11139,10,4456456,CKB -LINE_19,Station-38,2022-03-09 01:54:00,2022-03-09 02:18:00,Station-39,11.86,4,4456456,CKB -LINE_19,Station-39,2022-03-09 02:22:00,2022-03-09 02:44:00,Station-38,11139,10,4456456,CKB -LINE_19,Station-38,2022-03-09 02:54:00,2022-03-09 03:18:00,Station-39,11.86,4,4456456,CKB -LINE_19,Station-39,2022-03-09 03:22:00,2022-03-09 03:44:00,Station-38,11139,10,4456456,CKB -LINE_19,Station-38,2022-03-09 03:54:00,2022-03-09 04:18:00,Station-39,11.86,4,4456456,CKB -LINE_19,Station-39,2022-03-09 04:22:00,2022-03-09 04:44:00,Station-38,11139,0,4456456,CKB -LINE_19,Station-38,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,4456456,CKB -LINE_20,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,4747650,CKB -LINE_20,Station-13,2022-03-09 00:32:00,2022-03-09 00:44:00,Station-40,4212,3,4747650,CKB -LINE_20,Station-40,2022-03-09 00:47:00,2022-03-09 01:16:00,Station-41,13048,0,4747650,CKB -LINE_20,Station-41,2022-03-09 01:16:00,2022-03-09 01:42:00,Station-40,12869,5,4747650,CKB -LINE_20,Station-40,2022-03-09 01:47:00,2022-03-09 02:16:00,Station-41,13048,0,4747650,CKB -LINE_20,Station-41,2022-03-09 02:16:00,2022-03-09 02:42:00,Station-40,12869,5,4747650,CKB -LINE_20,Station-40,2022-03-09 02:47:00,2022-03-09 03:16:00,Station-41,13048,0,4747650,CKB -LINE_20,Station-41,2022-03-09 03:16:00,2022-03-09 03:42:00,Station-40,12869,5,4747650,CKB -LINE_20,Station-40,2022-03-09 03:47:00,2022-03-09 04:16:00,Station-41,13048,0,4747650,CKB -LINE_20,Station-41,2022-03-09 04:16:00,2022-03-09 04:34:00,Station-42,9538,0,4747650,CKB -LINE_20,Station-42,2022-03-09 04:34:00,2022-03-09 04:34:00,Station-0,0.06,0,4747650,CKB -LINE_20,Station-0,2022-03-09 00:17:00,2022-03-09 00:17:00,Station-40,0.06,0,4747660,CKB -LINE_20,Station-40,2022-03-09 00:17:00,2022-03-09 00:46:00,Station-41,13048,0,4747660,CKB -LINE_20,Station-41,2022-03-09 00:46:00,2022-03-09 01:12:00,Station-40,12869,5,4747660,CKB -LINE_20,Station-40,2022-03-09 01:17:00,2022-03-09 01:46:00,Station-41,13048,0,4747660,CKB -LINE_20,Station-41,2022-03-09 01:46:00,2022-03-09 02:12:00,Station-40,12869,5,4747660,CKB -LINE_20,Station-40,2022-03-09 02:17:00,2022-03-09 02:46:00,Station-41,13048,0,4747660,CKB -LINE_20,Station-41,2022-03-09 02:46:00,2022-03-09 03:12:00,Station-40,12869,5,4747660,CKB -LINE_20,Station-40,2022-03-09 03:17:00,2022-03-09 03:46:00,Station-41,13048,0,4747660,CKB -LINE_20,Station-41,2022-03-09 03:46:00,2022-03-09 04:12:00,Station-40,12869,5,4747660,CKB -LINE_20,Station-40,2022-03-09 04:17:00,2022-03-09 04:28:00,Station-13,4316,0,4747660,CKB -LINE_20,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,4747660,CKB -LINE_21,Station-0,2022-03-09 00:49:00,2022-03-09 00:49:00,Station-3,0.06,0,4434341,CKB -LINE_21,Station-3,2022-03-09 00:49:00,2022-03-09 01:04:00,Station-16,10229,0,4434341,CKB -LINE_21,Station-16,2022-03-09 01:04:00,2022-03-09 01:19:00,Station-3,11801,0,4434341,CKB -LINE_21,Station-3,2022-03-09 01:19:00,2022-03-09 01:34:00,Station-16,10229,0,4434341,CKB -LINE_21,Station-16,2022-03-09 01:34:00,2022-03-09 01:49:00,Station-3,11801,0,4434341,CKB -LINE_21,Station-3,2022-03-09 01:49:00,2022-03-09 02:04:00,Station-16,10229,0,4434341,CKB -LINE_21,Station-16,2022-03-09 02:04:00,2022-03-09 02:19:00,Station-3,11801,0,4434341,CKB -LINE_21,Station-3,2022-03-09 02:19:00,2022-03-09 02:34:00,Station-16,10229,0,4434341,CKB -LINE_21,Station-16,2022-03-09 02:34:00,2022-03-09 02:49:00,Station-3,11801,0,4434341,CKB -LINE_21,Station-3,2022-03-09 02:49:00,2022-03-09 03:04:00,Station-16,10229,0,4434341,CKB -LINE_21,Station-16,2022-03-09 03:04:00,2022-03-09 03:19:00,Station-3,11801,0,4434341,CKB -LINE_21,Station-3,2022-03-09 03:19:00,2022-03-09 03:34:00,Station-16,10229,0,4434341,CKB -LINE_21,Station-16,2022-03-09 03:34:00,2022-03-09 03:49:00,Station-3,11801,0,4434341,CKB -LINE_21,Station-3,2022-03-09 03:49:00,2022-03-09 04:04:00,Station-16,10229,0,4434341,CKB -LINE_21,Station-16,2022-03-09 04:04:00,2022-03-09 04:19:00,Station-3,11801,23,4434341,CKB -LINE_22,Station-3,2022-03-09 04:42:00,2022-03-09 05:04:00,Station-43,6.81,0,4434341,CKB -LINE_22,Station-43,2022-03-09 05:04:00,2022-03-09 05:04:00,Station-0,0.06,0,4434341,CKB -LINE_8,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,4434897,CKB -LINE_8,Station-13,2022-03-09 00:32:00,2022-03-09 00:57:00,Station-21,11545,6,4434897,CKB -LINE_8,Station-21,2022-03-09 01:03:00,2022-03-09 01:46:00,Station-20,20579,1,4434897,CKB -LINE_8,Station-20,2022-03-09 01:47:00,2022-03-09 02:25:00,Station-21,20641,8,4434897,CKB -LINE_8,Station-21,2022-03-09 02:33:00,2022-03-09 03:16:00,Station-20,20579,1,4434897,CKB -LINE_8,Station-20,2022-03-09 03:17:00,2022-03-09 03:55:00,Station-21,20641,8,4434897,CKB -LINE_8,Station-21,2022-03-09 04:03:00,2022-03-09 04:28:00,Station-13,11499,0,4434897,CKB -LINE_8,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,4434897,CKB -LINE_8,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-21,0.06,0,4434902,CKB -LINE_8,Station-21,2022-03-09 00:33:00,2022-03-09 01:16:00,Station-20,20579,1,4434902,CKB -LINE_8,Station-20,2022-03-09 01:17:00,2022-03-09 01:55:00,Station-21,20641,8,4434902,CKB -LINE_8,Station-21,2022-03-09 02:03:00,2022-03-09 02:46:00,Station-20,20579,1,4434902,CKB -LINE_8,Station-20,2022-03-09 02:47:00,2022-03-09 03:25:00,Station-21,20641,8,4434902,CKB -LINE_8,Station-21,2022-03-09 03:33:00,2022-03-09 04:16:00,Station-20,20579,1,4434902,CKB -LINE_8,Station-20,2022-03-09 04:17:00,2022-03-09 04:51:00,Station-44,18752,0,4434902,CKB -LINE_8,Station-44,2022-03-09 04:51:00,2022-03-09 04:51:00,Station-0,0.06,0,4434902,CKB -LINE_23,Station-0,2022-03-09 00:34:00,2022-03-09 00:34:00,Station-45,0.06,0,4619766,CKB -LINE_23,Station-45,2022-03-09 00:34:00,2022-03-09 01:00:00,Station-46,9016,0,4619766,CKB -LINE_23,Station-46,2022-03-09 01:00:00,2022-03-09 01:27:00,Station-45,10083,7,4619766,CKB -LINE_23,Station-45,2022-03-09 01:34:00,2022-03-09 02:00:00,Station-46,9016,0,4619766,CKB -LINE_23,Station-46,2022-03-09 02:00:00,2022-03-09 02:27:00,Station-45,10083,7,4619766,CKB -LINE_23,Station-45,2022-03-09 02:34:00,2022-03-09 03:00:00,Station-46,9016,0,4619766,CKB -LINE_23,Station-46,2022-03-09 03:00:00,2022-03-09 03:27:00,Station-45,10083,7,4619766,CKB -LINE_23,Station-45,2022-03-09 03:34:00,2022-03-09 04:00:00,Station-46,9016,0,4619766,CKB -LINE_23,Station-46,2022-03-09 04:00:00,2022-03-09 04:27:00,Station-45,10083,0,4619766,CKB -LINE_23,Station-45,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,4619766,CKB -LINE_23,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-46,0.06,0,4619991,CKB -LINE_23,Station-46,2022-03-09 00:30:00,2022-03-09 00:57:00,Station-45,10083,7,4619991,CKB -LINE_23,Station-45,2022-03-09 01:04:00,2022-03-09 01:30:00,Station-46,9016,0,4619991,CKB -LINE_23,Station-46,2022-03-09 01:30:00,2022-03-09 01:57:00,Station-45,10083,7,4619991,CKB -LINE_23,Station-45,2022-03-09 02:04:00,2022-03-09 02:30:00,Station-46,9016,0,4619991,CKB -LINE_23,Station-46,2022-03-09 02:30:00,2022-03-09 02:57:00,Station-45,10083,7,4619991,CKB -LINE_23,Station-45,2022-03-09 03:04:00,2022-03-09 03:30:00,Station-46,9016,0,4619991,CKB -LINE_23,Station-46,2022-03-09 03:30:00,2022-03-09 03:57:00,Station-45,10083,7,4619991,CKB -LINE_23,Station-45,2022-03-09 04:04:00,2022-03-09 04:30:00,Station-46,9016,0,4619991,CKB -LINE_23,Station-46,2022-03-09 04:30:00,2022-03-09 04:57:00,Station-45,10083,0,4619991,CKB -LINE_23,Station-45,2022-03-09 04:57:00,2022-03-09 04:57:00,Station-0,0.06,0,4619991,CKB -LINE_24,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,4374744,CKB -LINE_24,Station-21,2022-03-09 00:31:00,2022-03-09 00:44:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 00:44:00,2022-03-09 00:56:00,Station-21,5362,5,4374744,CKB -LINE_24,Station-21,2022-03-09 01:01:00,2022-03-09 01:14:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 01:14:00,2022-03-09 01:26:00,Station-21,5362,5,4374744,CKB -LINE_24,Station-21,2022-03-09 01:31:00,2022-03-09 01:44:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 01:44:00,2022-03-09 01:56:00,Station-21,5362,5,4374744,CKB -LINE_24,Station-21,2022-03-09 02:01:00,2022-03-09 02:14:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 02:14:00,2022-03-09 02:26:00,Station-21,5362,5,4374744,CKB -LINE_24,Station-21,2022-03-09 02:31:00,2022-03-09 02:44:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 02:44:00,2022-03-09 02:56:00,Station-21,5362,5,4374744,CKB -LINE_24,Station-21,2022-03-09 03:01:00,2022-03-09 03:14:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 03:14:00,2022-03-09 03:26:00,Station-21,5362,5,4374744,CKB -LINE_24,Station-21,2022-03-09 03:31:00,2022-03-09 03:44:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 03:44:00,2022-03-09 03:56:00,Station-21,5362,5,4374744,CKB -LINE_24,Station-21,2022-03-09 04:01:00,2022-03-09 04:14:00,Station-47,4872,0,4374744,CKB -LINE_24,Station-47,2022-03-09 04:14:00,2022-03-09 04:26:00,Station-21,5362,0,4374744,CKB -LINE_24,Station-21,2022-03-09 04:26:00,2022-03-09 04:26:00,Station-0,0.06,0,4374744,CKB -LINE_25,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,4374866,CKB -LINE_25,Station-21,2022-03-09 00:31:00,2022-03-09 00:45:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 00:47:00,2022-03-09 01:01:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 01:01:00,2022-03-09 01:15:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 01:17:00,2022-03-09 01:31:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 01:31:00,2022-03-09 01:45:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 01:47:00,2022-03-09 02:01:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 02:01:00,2022-03-09 02:15:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 02:17:00,2022-03-09 02:31:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 02:31:00,2022-03-09 02:45:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 02:47:00,2022-03-09 03:01:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 03:01:00,2022-03-09 03:15:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 03:17:00,2022-03-09 03:31:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 03:31:00,2022-03-09 03:45:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 03:47:00,2022-03-09 04:01:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 04:01:00,2022-03-09 04:15:00,Station-48,5225,2,4374866,CKB -LINE_25,Station-48,2022-03-09 04:17:00,2022-03-09 04:31:00,Station-21,7617,0,4374866,CKB -LINE_25,Station-21,2022-03-09 04:31:00,2022-03-09 04:31:00,Station-0,0.06,0,4374866,CKB -LINE_26,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-49,0.06,0,4375013,CKB -LINE_26,Station-49,2022-03-09 00:43:00,2022-03-09 00:53:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 00:53:00,2022-03-09 01:03:00,Station-49,4408,10,4375013,CKB -LINE_26,Station-49,2022-03-09 01:13:00,2022-03-09 01:23:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 01:23:00,2022-03-09 01:33:00,Station-49,4408,10,4375013,CKB -LINE_26,Station-49,2022-03-09 01:43:00,2022-03-09 01:53:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 01:53:00,2022-03-09 02:03:00,Station-49,4408,10,4375013,CKB -LINE_26,Station-49,2022-03-09 02:13:00,2022-03-09 02:23:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 02:23:00,2022-03-09 02:33:00,Station-49,4408,10,4375013,CKB -LINE_26,Station-49,2022-03-09 02:43:00,2022-03-09 02:53:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 02:53:00,2022-03-09 03:03:00,Station-49,4408,10,4375013,CKB -LINE_26,Station-49,2022-03-09 03:13:00,2022-03-09 03:23:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 03:23:00,2022-03-09 03:33:00,Station-49,4408,10,4375013,CKB -LINE_26,Station-49,2022-03-09 03:43:00,2022-03-09 03:53:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 03:53:00,2022-03-09 04:03:00,Station-49,4408,10,4375013,CKB -LINE_26,Station-49,2022-03-09 04:13:00,2022-03-09 04:23:00,Station-50,4507,0,4375013,CKB -LINE_26,Station-50,2022-03-09 04:23:00,2022-03-09 04:33:00,Station-49,4408,0,4375013,CKB -LINE_26,Station-49,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,4375013,CKB -LINE_0,Station-0,2022-03-09 21:31:00,2022-03-09 21:31:00,Station-1,0.06,0,4454945,CKB -LINE_0,Station-1,2022-03-09 21:31:00,2022-03-09 22:04:00,Station-2,14519,4,4454945,CKB -LINE_0,Station-2,2022-03-09 22:08:00,2022-03-09 22:43:00,Station-1,13541,8,4454945,CKB -LINE_0,Station-1,2022-03-09 22:51:00,2022-03-09 23:24:00,Station-2,14519,4,4454945,CKB -LINE_0,Station-2,2022-03-09 23:28:00,2022-03-10 00:03:00,Station-1,13541,8,4454945,CKB -LINE_0,Station-1,2022-03-10 00:11:00,2022-03-10 00:44:00,Station-2,14519,0,4454945,CKB -LINE_1,Station-2,2022-03-10 00:44:00,2022-03-10 00:54:00,Station-3,4.1,25,4454945,CKB -LINE_1,Station-3,2022-03-10 01:19:00,2022-03-10 01:42:00,Station-4,8.36,6,4454945,CKB -LINE_1,Station-4,2022-03-10 01:48:00,2022-03-10 02:06:00,Station-3,9067,13,4454945,CKB -LINE_1,Station-3,2022-03-10 02:19:00,2022-03-10 02:42:00,Station-4,8.36,6,4454945,CKB -LINE_1,Station-4,2022-03-10 02:48:00,2022-03-10 03:06:00,Station-3,9067,13,4454945,CKB -LINE_1,Station-3,2022-03-10 03:19:00,2022-03-10 03:42:00,Station-4,8.36,6,4454945,CKB -LINE_1,Station-4,2022-03-10 03:48:00,2022-03-10 04:06:00,Station-3,9067,0,4454945,CKB -LINE_1,Station-3,2022-03-10 04:06:00,2022-03-10 04:06:00,Station-0,0.06,0,4454945,CKB -LINE_0,Station-0,2022-03-09 22:11:00,2022-03-09 22:11:00,Station-1,0.06,0,4454950,CKB -LINE_0,Station-1,2022-03-09 22:11:00,2022-03-09 22:44:00,Station-2,14519,4,4454950,CKB -LINE_0,Station-2,2022-03-09 22:48:00,2022-03-09 23:23:00,Station-1,13541,8,4454950,CKB -LINE_0,Station-1,2022-03-09 23:31:00,2022-03-10 00:04:00,Station-2,14519,4,4454950,CKB -LINE_0,Station-2,2022-03-10 00:08:00,2022-03-10 00:39:00,Station-5,12213,0,4454950,CKB -LINE_1,Station-5,2022-03-10 00:39:00,2022-03-10 00:47:00,Station-3,4.0,2,4454950,CKB -LINE_1,Station-3,2022-03-10 00:49:00,2022-03-10 01:12:00,Station-4,8.36,6,4454950,CKB -LINE_1,Station-4,2022-03-10 01:18:00,2022-03-10 01:36:00,Station-3,9067,13,4454950,CKB -LINE_1,Station-3,2022-03-10 01:49:00,2022-03-10 02:12:00,Station-4,8.36,6,4454950,CKB -LINE_1,Station-4,2022-03-10 02:18:00,2022-03-10 02:36:00,Station-3,9067,13,4454950,CKB -LINE_1,Station-3,2022-03-10 02:49:00,2022-03-10 03:12:00,Station-4,8.36,6,4454950,CKB -LINE_1,Station-4,2022-03-10 03:18:00,2022-03-10 03:36:00,Station-3,9067,13,4454950,CKB -LINE_1,Station-3,2022-03-10 03:49:00,2022-03-10 04:12:00,Station-4,8.36,0,4454950,CKB -LINE_1,Station-4,2022-03-10 04:12:00,2022-03-10 04:12:00,Station-0,0.06,0,4454950,CKB -LINE_2,Station-0,2022-03-09 21:06:00,2022-03-09 21:06:00,Station-6,0.06,0,4664624,CKB -LINE_2,Station-6,2022-03-09 21:06:00,2022-03-09 21:34:00,Station-7,13018,19,4664624,CKB -LINE_2,Station-7,2022-03-09 21:53:00,2022-03-09 22:13:00,Station-8,10332,17,4664624,CKB -LINE_2,Station-8,2022-03-09 22:30:00,2022-03-09 22:54:00,Station-7,10.48,19,4664624,CKB -LINE_2,Station-7,2022-03-09 23:13:00,2022-03-09 23:33:00,Station-8,10332,17,4664624,CKB -LINE_2,Station-8,2022-03-09 23:50:00,2022-03-10 00:14:00,Station-7,10.48,2,4664624,CKB -LINE_2,Station-7,2022-03-10 00:16:00,2022-03-10 00:23:00,Station-9,3709,5,4664624,CKB -LINE_3,Station-9,2022-03-10 00:28:00,2022-03-10 00:44:00,Station-10,6404,3,4664624,CKB -LINE_3,Station-10,2022-03-10 00:47:00,2022-03-10 01:10:00,Station-11,10579,7,4664624,CKB -LINE_3,Station-11,2022-03-10 01:17:00,2022-03-10 01:44:00,Station-10,12007,3,4664624,CKB -LINE_3,Station-10,2022-03-10 01:47:00,2022-03-10 02:10:00,Station-11,10579,7,4664624,CKB -LINE_3,Station-11,2022-03-10 02:17:00,2022-03-10 02:44:00,Station-10,12007,3,4664624,CKB -LINE_3,Station-10,2022-03-10 02:47:00,2022-03-10 03:10:00,Station-11,10579,7,4664624,CKB -LINE_3,Station-11,2022-03-10 03:17:00,2022-03-10 03:44:00,Station-10,12007,3,4664624,CKB -LINE_3,Station-10,2022-03-10 03:47:00,2022-03-10 04:10:00,Station-11,10579,7,4664624,CKB -LINE_3,Station-11,2022-03-10 04:17:00,2022-03-10 04:44:00,Station-10,12007,0,4664624,CKB -LINE_3,Station-10,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,4664624,CKB -LINE_2,Station-0,2022-03-09 20:26:00,2022-03-09 20:26:00,Station-6,0.06,0,4762734,CKB -LINE_2,Station-6,2022-03-09 20:26:00,2022-03-09 20:56:00,Station-12,14097,14,4762734,CKB -LINE_2,Station-12,2022-03-09 21:10:00,2022-03-09 21:38:00,Station-6,13.19,8,4762734,CKB -LINE_2,Station-6,2022-03-09 21:46:00,2022-03-09 22:14:00,Station-7,13018,19,4762734,CKB -LINE_2,Station-7,2022-03-09 22:33:00,2022-03-09 22:53:00,Station-8,10332,17,4762734,CKB -LINE_2,Station-8,2022-03-09 23:10:00,2022-03-09 23:34:00,Station-7,10.48,19,4762734,CKB -LINE_2,Station-7,2022-03-09 23:53:00,2022-03-10 00:13:00,Station-8,10332,2,4762734,CKB -LINE_2,Station-8,2022-03-10 00:15:00,2022-03-10 00:16:00,Station-10,506,1,4762734,CKB -LINE_3,Station-10,2022-03-10 00:17:00,2022-03-10 00:40:00,Station-11,10579,7,4762734,CKB -LINE_3,Station-11,2022-03-10 00:47:00,2022-03-10 01:14:00,Station-10,12007,3,4762734,CKB -LINE_3,Station-10,2022-03-10 01:17:00,2022-03-10 01:40:00,Station-11,10579,7,4762734,CKB -LINE_3,Station-11,2022-03-10 01:47:00,2022-03-10 02:14:00,Station-10,12007,3,4762734,CKB -LINE_3,Station-10,2022-03-10 02:17:00,2022-03-10 02:40:00,Station-11,10579,7,4762734,CKB -LINE_3,Station-11,2022-03-10 02:47:00,2022-03-10 03:14:00,Station-10,12007,3,4762734,CKB -LINE_3,Station-10,2022-03-10 03:17:00,2022-03-10 03:40:00,Station-11,10579,7,4762734,CKB -LINE_3,Station-11,2022-03-10 03:47:00,2022-03-10 04:14:00,Station-10,12007,3,4762734,CKB -LINE_3,Station-10,2022-03-10 04:17:00,2022-03-10 04:40:00,Station-11,10579,3,4762734,CKB -LINE_4,Station-11,2022-03-10 04:43:00,2022-03-10 04:58:00,Station-13,6161,0,4762734,CKB -LINE_4,Station-13,2022-03-10 04:58:00,2022-03-10 04:58:00,Station-0,0.06,0,4762734,CKB -LINE_5,Station-0,2022-03-09 22:56:00,2022-03-09 22:56:00,Station-14,0.06,0,4617415,CKB -LINE_5,Station-14,2022-03-09 22:56:00,2022-03-09 23:08:00,Station-15,5882,3,4617415,CKB -LINE_5,Station-15,2022-03-09 23:11:00,2022-03-09 23:25:00,Station-14,6232,0,4617415,CKB -LINE_5,Station-14,2022-03-09 23:25:00,2022-03-09 23:38:00,Station-15,6086,3,4617415,CKB -LINE_5,Station-15,2022-03-09 23:41:00,2022-03-09 23:55:00,Station-14,6232,0,4617415,CKB -LINE_5,Station-14,2022-03-09 23:55:00,2022-03-10 00:08:00,Station-15,6086,0,4617415,CKB -LINE_5,Station-15,2022-03-10 00:08:00,2022-03-10 00:08:00,Station-0,0.06,0,4617415,CKB -LINE_6,Station-0,2022-03-09 05:05:00,2022-03-09 05:05:00,Station-16,0.06,0,4426846,CKB -LINE_6,Station-16,2022-03-09 05:05:00,2022-03-09 05:14:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 05:14:00,2022-03-09 05:23:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 05:25:00,2022-03-09 05:34:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 05:34:00,2022-03-09 05:43:00,Station-16,5139,23,4426846,CKB -LINE_6,Station-16,2022-03-09 06:06:00,2022-03-09 06:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 06:15:00,2022-03-09 06:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 06:26:00,2022-03-09 06:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 06:35:00,2022-03-09 06:44:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 06:46:00,2022-03-09 06:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 06:55:00,2022-03-09 07:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 07:06:00,2022-03-09 07:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 07:15:00,2022-03-09 07:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 07:26:00,2022-03-09 07:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 07:35:00,2022-03-09 07:44:00,Station-16,5139,22,4426846,CKB -LINE_6,Station-16,2022-03-09 08:06:00,2022-03-09 08:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 08:15:00,2022-03-09 08:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 08:26:00,2022-03-09 08:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 08:35:00,2022-03-09 08:44:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 08:46:00,2022-03-09 08:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 08:55:00,2022-03-09 09:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 09:06:00,2022-03-09 09:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 09:15:00,2022-03-09 09:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 09:26:00,2022-03-09 09:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 09:35:00,2022-03-09 09:44:00,Station-16,5139,22,4426846,CKB -LINE_6,Station-16,2022-03-09 10:06:00,2022-03-09 10:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 10:15:00,2022-03-09 10:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 10:26:00,2022-03-09 10:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 10:35:00,2022-03-09 10:44:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 10:46:00,2022-03-09 10:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 10:55:00,2022-03-09 11:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 11:06:00,2022-03-09 11:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 11:15:00,2022-03-09 11:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 11:26:00,2022-03-09 11:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 11:35:00,2022-03-09 11:44:00,Station-16,5139,22,4426846,CKB -LINE_6,Station-16,2022-03-09 12:06:00,2022-03-09 12:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 12:15:00,2022-03-09 12:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 12:26:00,2022-03-09 12:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 12:35:00,2022-03-09 12:44:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 12:46:00,2022-03-09 12:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 12:55:00,2022-03-09 13:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 13:06:00,2022-03-09 13:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 13:15:00,2022-03-09 13:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 13:26:00,2022-03-09 13:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 13:35:00,2022-03-09 13:44:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 13:46:00,2022-03-09 13:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 13:55:00,2022-03-09 14:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 14:06:00,2022-03-09 14:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 14:15:00,2022-03-09 14:24:00,Station-16,5139,22,4426846,CKB -LINE_6,Station-16,2022-03-09 14:46:00,2022-03-09 14:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 14:55:00,2022-03-09 15:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 15:06:00,2022-03-09 15:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 15:15:00,2022-03-09 15:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 15:26:00,2022-03-09 15:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 15:35:00,2022-03-09 15:44:00,Station-16,5139,22,4426846,CKB -LINE_6,Station-16,2022-03-09 16:06:00,2022-03-09 16:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 16:15:00,2022-03-09 16:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 16:26:00,2022-03-09 16:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 16:35:00,2022-03-09 16:44:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 16:46:00,2022-03-09 16:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 16:55:00,2022-03-09 17:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 17:06:00,2022-03-09 17:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 17:15:00,2022-03-09 17:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 17:26:00,2022-03-09 17:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 17:35:00,2022-03-09 17:44:00,Station-16,5139,22,4426846,CKB -LINE_6,Station-16,2022-03-09 18:06:00,2022-03-09 18:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 18:15:00,2022-03-09 18:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 18:26:00,2022-03-09 18:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 18:35:00,2022-03-09 18:44:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 18:46:00,2022-03-09 18:55:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 18:55:00,2022-03-09 19:04:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 19:06:00,2022-03-09 19:15:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 19:15:00,2022-03-09 19:24:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 19:26:00,2022-03-09 19:35:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 19:35:00,2022-03-09 19:44:00,Station-16,5139,21,4426846,CKB -LINE_6,Station-16,2022-03-09 20:05:00,2022-03-09 20:14:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 20:14:00,2022-03-09 20:23:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 20:25:00,2022-03-09 20:34:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 20:34:00,2022-03-09 20:43:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 20:45:00,2022-03-09 20:54:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 20:54:00,2022-03-09 21:03:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 21:05:00,2022-03-09 21:14:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 21:14:00,2022-03-09 21:23:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 21:25:00,2022-03-09 21:34:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 21:34:00,2022-03-09 21:43:00,Station-16,5139,22,4426846,CKB -LINE_6,Station-16,2022-03-09 22:05:00,2022-03-09 22:14:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 22:14:00,2022-03-09 22:23:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 22:25:00,2022-03-09 22:34:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 22:34:00,2022-03-09 22:43:00,Station-16,5139,2,4426846,CKB -LINE_6,Station-16,2022-03-09 22:45:00,2022-03-09 22:54:00,Station-17,4781,0,4426846,CKB -LINE_6,Station-17,2022-03-09 22:54:00,2022-03-09 23:03:00,Station-16,5139,0,4426846,CKB -LINE_6,Station-16,2022-03-09 23:03:00,2022-03-09 23:03:00,Station-0,0.06,0,4426846,CKB -LINE_7,Station-0,2022-03-10 00:06:00,2022-03-10 00:06:00,Station-18,0.06,0,4708596,CKB -LINE_7,Station-18,2022-03-10 00:06:00,2022-03-10 00:27:00,Station-19,7827,0,4708596,CKB -LINE_8,Station-19,2022-03-10 00:27:00,2022-03-10 00:48:00,Station-20,11079,0,4708596,CKB -LINE_8,Station-20,2022-03-10 00:48:00,2022-03-10 01:25:00,Station-21,20641,8,4708596,CKB -LINE_8,Station-21,2022-03-10 01:33:00,2022-03-10 02:16:00,Station-20,20579,1,4708596,CKB -LINE_8,Station-20,2022-03-10 02:17:00,2022-03-10 02:55:00,Station-21,20641,8,4708596,CKB -LINE_8,Station-21,2022-03-10 03:03:00,2022-03-10 03:46:00,Station-20,20579,1,4708596,CKB -LINE_8,Station-20,2022-03-10 03:47:00,2022-03-10 04:25:00,Station-21,20641,0,4708596,CKB -LINE_8,Station-21,2022-03-10 04:25:00,2022-03-10 04:25:00,Station-0,0.06,0,4708596,CKB -LINE_9,Station-22,2022-03-09 05:15:00,2022-03-09 06:01:00,Station-23,17.9,0,4317626,VDL -LINE_9,Station-23,2022-03-09 06:01:00,2022-03-09 06:15:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 06:23:00,2022-03-09 06:37:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 06:41:00,2022-03-09 06:55:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 07:03:00,2022-03-09 07:17:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 07:21:00,2022-03-09 07:35:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 07:43:00,2022-03-09 07:57:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 08:01:00,2022-03-09 08:15:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 08:23:00,2022-03-09 08:37:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 08:41:00,2022-03-09 08:55:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 09:03:00,2022-03-09 09:17:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 09:21:00,2022-03-09 09:35:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 09:43:00,2022-03-09 09:57:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 10:01:00,2022-03-09 10:15:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 10:23:00,2022-03-09 10:37:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 10:41:00,2022-03-09 10:55:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 11:03:00,2022-03-09 11:17:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 11:21:00,2022-03-09 11:35:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 11:43:00,2022-03-09 11:57:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 12:01:00,2022-03-09 12:15:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 12:23:00,2022-03-09 12:37:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 12:41:00,2022-03-09 12:55:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 13:03:00,2022-03-09 13:17:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 13:21:00,2022-03-09 13:35:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 13:43:00,2022-03-09 13:57:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 14:01:00,2022-03-09 14:15:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 14:23:00,2022-03-09 14:37:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 14:41:00,2022-03-09 14:55:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 15:03:00,2022-03-09 15:17:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 15:21:00,2022-03-09 15:35:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 15:43:00,2022-03-09 15:57:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 16:01:00,2022-03-09 16:15:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 16:23:00,2022-03-09 16:37:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 16:41:00,2022-03-09 16:55:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 17:03:00,2022-03-09 17:17:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 17:21:00,2022-03-09 17:35:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 17:43:00,2022-03-09 17:57:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 18:01:00,2022-03-09 18:15:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 18:23:00,2022-03-09 18:37:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 18:41:00,2022-03-09 18:55:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 19:03:00,2022-03-09 19:17:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 19:21:00,2022-03-09 19:35:00,Station-23,4637,8,4317626,VDL -LINE_9,Station-23,2022-03-09 19:43:00,2022-03-09 19:57:00,Station-23,4637,4,4317626,VDL -LINE_9,Station-23,2022-03-09 20:01:00,2022-03-09 20:14:00,Station-23,4637,9,4317626,VDL -LINE_9,Station-23,2022-03-09 20:23:00,2022-03-09 20:36:00,Station-23,4637,0,4317626,VDL -LINE_9,Station-23,2022-03-09 20:36:00,2022-03-09 21:15:00,Station-22,19.8,0,4317626,VDL -LINE_10,Station-0,2022-03-09 04:56:00,2022-03-09 04:56:00,Station-24,0.06,18,4425669,CKB -LINE_10,Station-24,2022-03-09 05:14:00,2022-03-09 05:20:00,Station-25,3.29,0,4425669,CKB -LINE_10,Station-25,2022-03-09 05:20:00,2022-03-09 05:24:00,Station-24,2954,20,4425669,CKB -LINE_10,Station-24,2022-03-09 05:44:00,2022-03-09 05:50:00,Station-25,3.29,0,4425669,CKB -LINE_10,Station-25,2022-03-09 05:50:00,2022-03-09 05:54:00,Station-24,2954,5,4425669,CKB -LINE_10,Station-24,2022-03-09 05:59:00,2022-03-09 06:06:00,Station-25,3.29,2,4425669,CKB -LINE_10,Station-25,2022-03-09 06:08:00,2022-03-09 06:13:00,Station-24,2954,19,4425669,CKB -LINE_10,Station-24,2022-03-09 06:32:00,2022-03-09 06:39:00,Station-25,3.29,1,4425669,CKB -LINE_10,Station-25,2022-03-09 06:40:00,2022-03-09 06:45:00,Station-24,2954,7,4425669,CKB -LINE_10,Station-24,2022-03-09 06:52:00,2022-03-09 06:59:00,Station-25,3.29,1,4425669,CKB -LINE_10,Station-25,2022-03-09 07:00:00,2022-03-09 07:05:00,Station-24,2954,7,4425669,CKB -LINE_10,Station-24,2022-03-09 07:12:00,2022-03-09 07:19:00,Station-25,3.29,1,4425669,CKB -LINE_10,Station-25,2022-03-09 07:20:00,2022-03-09 07:25:00,Station-24,2954,7,4425669,CKB -LINE_10,Station-24,2022-03-09 07:32:00,2022-03-09 07:39:00,Station-25,3.29,1,4425669,CKB -LINE_10,Station-25,2022-03-09 07:40:00,2022-03-09 07:45:00,Station-24,2954,295,4425669,CKB -LINE_10,Station-24,2022-03-09 12:40:00,2022-03-09 12:47:00,Station-25,3.29,2,4425669,CKB -LINE_10,Station-25,2022-03-09 12:49:00,2022-03-09 12:54:00,Station-24,2954,46,4425669,CKB -LINE_10,Station-24,2022-03-09 13:40:00,2022-03-09 13:47:00,Station-25,3.29,2,4425669,CKB -LINE_10,Station-25,2022-03-09 13:49:00,2022-03-09 13:54:00,Station-24,2954,434,4425669,CKB -LINE_10,Station-24,2022-03-09 21:08:00,2022-03-09 21:08:00,Station-0,0.06,0,4425669,CKB -LINE_11,Station-0,2022-03-09 07:20:00,2022-03-09 07:20:00,Station-26,0.06,0,4448151,CKB -LINE_11,Station-26,2022-03-09 07:20:00,2022-03-09 07:50:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 08:00:00,2022-03-09 08:30:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 08:40:00,2022-03-09 09:10:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 09:20:00,2022-03-09 09:50:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 10:00:00,2022-03-09 10:30:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 10:40:00,2022-03-09 11:10:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 11:20:00,2022-03-09 11:50:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 12:00:00,2022-03-09 12:30:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 12:40:00,2022-03-09 13:10:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 13:20:00,2022-03-09 13:50:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 14:00:00,2022-03-09 14:30:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 14:40:00,2022-03-09 15:10:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 15:20:00,2022-03-09 15:50:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 16:00:00,2022-03-09 16:30:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 16:40:00,2022-03-09 17:10:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 17:20:00,2022-03-09 17:50:00,Station-26,9266,10,4448151,CKB -LINE_11,Station-26,2022-03-09 18:00:00,2022-03-09 18:30:00,Station-26,9266,0,4448151,CKB -LINE_11,Station-26,2022-03-09 18:30:00,2022-03-09 18:30:00,Station-0,0.06,0,4448151,CKB -LINE_12,Station-0,2022-03-09 07:10:00,2022-03-09 07:10:00,Station-27,0.06,0,4733896,CKB -LINE_12,Station-27,2022-03-09 07:10:00,2022-03-09 07:18:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 07:28:00,2022-03-09 07:40:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 07:40:00,2022-03-09 07:48:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 07:58:00,2022-03-09 08:10:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 08:10:00,2022-03-09 08:18:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 08:28:00,2022-03-09 08:40:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 08:40:00,2022-03-09 08:48:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 08:58:00,2022-03-09 09:10:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 09:10:00,2022-03-09 09:18:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 09:28:00,2022-03-09 09:40:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 09:40:00,2022-03-09 09:48:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 09:58:00,2022-03-09 10:10:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 10:10:00,2022-03-09 10:18:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 10:28:00,2022-03-09 10:40:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 10:40:00,2022-03-09 10:48:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 10:58:00,2022-03-09 11:10:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 11:10:00,2022-03-09 11:18:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 11:28:00,2022-03-09 11:40:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 11:40:00,2022-03-09 11:48:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 11:58:00,2022-03-09 12:10:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 12:10:00,2022-03-09 12:18:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 12:28:00,2022-03-09 12:40:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 12:40:00,2022-03-09 12:48:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 12:58:00,2022-03-09 13:10:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 13:10:00,2022-03-09 13:18:00,Station-28,2169,10,4733896,CKB -LINE_12,Station-28,2022-03-09 13:28:00,2022-03-09 13:40:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 13:40:00,2022-03-09 13:48:00,Station-28,2169,8,4733896,CKB -LINE_12,Station-28,2022-03-09 13:56:00,2022-03-09 14:10:00,Station-27,2952,0,4733896,CKB -LINE_12,Station-27,2022-03-09 14:10:00,2022-03-09 14:19:00,Station-28,2169,14,4733896,CKB -LINE_12,Station-28,2022-03-09 14:33:00,2022-03-09 14:47:00,Station-27,2952,3,4733896,CKB -LINE_12,Station-27,2022-03-09 14:50:00,2022-03-09 14:59:00,Station-28,2169,14,4733896,CKB -LINE_12,Station-28,2022-03-09 15:13:00,2022-03-09 15:27:00,Station-27,2952,3,4733896,CKB -LINE_12,Station-27,2022-03-09 15:30:00,2022-03-09 15:39:00,Station-28,2169,14,4733896,CKB -LINE_12,Station-28,2022-03-09 15:53:00,2022-03-09 16:07:00,Station-27,2952,3,4733896,CKB -LINE_12,Station-27,2022-03-09 16:10:00,2022-03-09 16:19:00,Station-28,2169,14,4733896,CKB -LINE_12,Station-28,2022-03-09 16:33:00,2022-03-09 16:47:00,Station-27,2952,3,4733896,CKB -LINE_12,Station-27,2022-03-09 16:50:00,2022-03-09 16:59:00,Station-28,2169,14,4733896,CKB -LINE_12,Station-28,2022-03-09 17:13:00,2022-03-09 17:27:00,Station-27,2952,3,4733896,CKB -LINE_12,Station-27,2022-03-09 17:30:00,2022-03-09 17:39:00,Station-28,2169,13,4733896,CKB -LINE_12,Station-28,2022-03-09 17:52:00,2022-03-09 18:05:00,Station-27,2952,5,4733896,CKB -LINE_12,Station-27,2022-03-09 18:10:00,2022-03-09 18:18:00,Station-28,2169,0,4733896,CKB -LINE_12,Station-28,2022-03-09 18:18:00,2022-03-09 18:18:00,Station-0,0.06,0,4733896,CKB -LINE_12,Station-0,2022-03-09 14:13:00,2022-03-09 14:13:00,Station-28,0.06,0,4734201,CKB -LINE_12,Station-28,2022-03-09 14:13:00,2022-03-09 14:27:00,Station-27,2952,3,4734201,CKB -LINE_12,Station-27,2022-03-09 14:30:00,2022-03-09 14:39:00,Station-28,2169,14,4734201,CKB -LINE_12,Station-28,2022-03-09 14:53:00,2022-03-09 15:07:00,Station-27,2952,3,4734201,CKB -LINE_12,Station-27,2022-03-09 15:10:00,2022-03-09 15:19:00,Station-28,2169,14,4734201,CKB -LINE_12,Station-28,2022-03-09 15:33:00,2022-03-09 15:47:00,Station-27,2952,3,4734201,CKB -LINE_12,Station-27,2022-03-09 15:50:00,2022-03-09 15:59:00,Station-28,2169,14,4734201,CKB -LINE_12,Station-28,2022-03-09 16:13:00,2022-03-09 16:27:00,Station-27,2952,3,4734201,CKB -LINE_12,Station-27,2022-03-09 16:30:00,2022-03-09 16:39:00,Station-28,2169,14,4734201,CKB -LINE_12,Station-28,2022-03-09 16:53:00,2022-03-09 17:07:00,Station-27,2952,3,4734201,CKB -LINE_12,Station-27,2022-03-09 17:10:00,2022-03-09 17:19:00,Station-28,2169,14,4734201,CKB -LINE_12,Station-28,2022-03-09 17:33:00,2022-03-09 17:47:00,Station-27,2952,3,4734201,CKB -LINE_12,Station-27,2022-03-09 17:50:00,2022-03-09 17:59:00,Station-28,2169,14,4734201,CKB -LINE_12,Station-28,2022-03-09 18:13:00,2022-03-09 18:25:00,Station-27,2952,0,4734201,CKB -LINE_12,Station-27,2022-03-09 18:25:00,2022-03-09 18:25:00,Station-0,0.06,0,4734201,CKB -LINE_13,Station-0,2022-03-10 00:23:00,2022-03-10 00:23:00,Station-29,0.06,0,4318158,CKB -LINE_13,Station-29,2022-03-10 00:23:00,2022-03-10 00:30:00,Station-30,2577,9,4318158,CKB -LINE_14,Station-30,2022-03-10 00:39:00,2022-03-10 00:54:00,Station-31,5937,9,4318158,CKB -LINE_14,Station-31,2022-03-10 01:03:00,2022-03-10 01:17:00,Station-30,6.19,0,4318158,CKB -LINE_13,Station-30,2022-03-10 01:17:00,2022-03-10 01:23:00,Station-29,2555,0,4318158,CKB -LINE_13,Station-29,2022-03-10 01:23:00,2022-03-10 01:30:00,Station-30,2577,9,4318158,CKB -LINE_14,Station-30,2022-03-10 01:39:00,2022-03-10 01:54:00,Station-31,5937,9,4318158,CKB -LINE_14,Station-31,2022-03-10 02:03:00,2022-03-10 02:17:00,Station-30,6.19,0,4318158,CKB -LINE_13,Station-30,2022-03-10 02:17:00,2022-03-10 02:23:00,Station-29,2555,0,4318158,CKB -LINE_13,Station-29,2022-03-10 02:23:00,2022-03-10 02:30:00,Station-30,2577,9,4318158,CKB -LINE_14,Station-30,2022-03-10 02:39:00,2022-03-10 02:54:00,Station-31,5937,9,4318158,CKB -LINE_14,Station-31,2022-03-10 03:03:00,2022-03-10 03:17:00,Station-30,6.19,0,4318158,CKB -LINE_13,Station-30,2022-03-10 03:17:00,2022-03-10 03:23:00,Station-29,2555,0,4318158,CKB -LINE_13,Station-29,2022-03-10 03:23:00,2022-03-10 03:30:00,Station-30,2577,9,4318158,CKB -LINE_14,Station-30,2022-03-10 03:39:00,2022-03-10 03:54:00,Station-31,5937,9,4318158,CKB -LINE_14,Station-31,2022-03-10 04:03:00,2022-03-10 04:17:00,Station-30,6.19,0,4318158,CKB -LINE_13,Station-30,2022-03-10 04:17:00,2022-03-10 04:23:00,Station-29,2555,0,4318158,CKB -LINE_13,Station-29,2022-03-10 04:23:00,2022-03-10 04:23:00,Station-0,0.06,0,4318158,CKB -LINE_14,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-31,0.06,0,4318178,CKB -LINE_14,Station-31,2022-03-10 00:33:00,2022-03-10 00:47:00,Station-30,6.19,0,4318178,CKB -LINE_13,Station-30,2022-03-10 00:47:00,2022-03-10 00:53:00,Station-29,2555,0,4318178,CKB -LINE_13,Station-29,2022-03-10 00:53:00,2022-03-10 01:00:00,Station-30,2577,9,4318178,CKB -LINE_14,Station-30,2022-03-10 01:09:00,2022-03-10 01:24:00,Station-31,5937,9,4318178,CKB -LINE_14,Station-31,2022-03-10 01:33:00,2022-03-10 01:47:00,Station-30,6.19,0,4318178,CKB -LINE_13,Station-30,2022-03-10 01:47:00,2022-03-10 01:53:00,Station-29,2555,0,4318178,CKB -LINE_13,Station-29,2022-03-10 01:53:00,2022-03-10 02:00:00,Station-30,2577,9,4318178,CKB -LINE_14,Station-30,2022-03-10 02:09:00,2022-03-10 02:24:00,Station-31,5937,9,4318178,CKB -LINE_14,Station-31,2022-03-10 02:33:00,2022-03-10 02:47:00,Station-30,6.19,0,4318178,CKB -LINE_13,Station-30,2022-03-10 02:47:00,2022-03-10 02:53:00,Station-29,2555,0,4318178,CKB -LINE_13,Station-29,2022-03-10 02:53:00,2022-03-10 03:00:00,Station-30,2577,9,4318178,CKB -LINE_14,Station-30,2022-03-10 03:09:00,2022-03-10 03:24:00,Station-31,5937,9,4318178,CKB -LINE_14,Station-31,2022-03-10 03:33:00,2022-03-10 03:47:00,Station-30,6.19,0,4318178,CKB -LINE_13,Station-30,2022-03-10 03:47:00,2022-03-10 03:53:00,Station-29,2555,0,4318178,CKB -LINE_13,Station-29,2022-03-10 03:53:00,2022-03-10 04:00:00,Station-30,2577,9,4318178,CKB -LINE_14,Station-30,2022-03-10 04:09:00,2022-03-10 04:24:00,Station-31,5937,0,4318178,CKB -LINE_14,Station-31,2022-03-10 04:24:00,2022-03-10 04:24:00,Station-0,0.06,0,4318178,CKB -LINE_15,Station-0,2022-03-10 00:57:00,2022-03-10 00:57:00,Station-32,0.06,0,4319353,CKB -LINE_15,Station-32,2022-03-10 00:57:00,2022-03-10 01:06:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 01:06:00,2022-03-10 01:11:00,Station-32,2936,16,4319353,CKB -LINE_15,Station-32,2022-03-10 01:27:00,2022-03-10 01:36:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 01:36:00,2022-03-10 01:41:00,Station-32,2936,16,4319353,CKB -LINE_15,Station-32,2022-03-10 01:57:00,2022-03-10 02:06:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 02:06:00,2022-03-10 02:11:00,Station-32,2936,16,4319353,CKB -LINE_15,Station-32,2022-03-10 02:27:00,2022-03-10 02:36:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 02:36:00,2022-03-10 02:41:00,Station-32,2936,16,4319353,CKB -LINE_15,Station-32,2022-03-10 02:57:00,2022-03-10 03:06:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 03:06:00,2022-03-10 03:11:00,Station-32,2936,16,4319353,CKB -LINE_15,Station-32,2022-03-10 03:27:00,2022-03-10 03:36:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 03:36:00,2022-03-10 03:41:00,Station-32,2936,16,4319353,CKB -LINE_15,Station-32,2022-03-10 03:57:00,2022-03-10 04:06:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 04:06:00,2022-03-10 04:11:00,Station-32,2936,16,4319353,CKB -LINE_15,Station-32,2022-03-10 04:27:00,2022-03-10 04:36:00,Station-33,4343,0,4319353,CKB -LINE_15,Station-33,2022-03-10 04:36:00,2022-03-10 04:36:00,Station-0,0.06,0,4319353,CKB -LINE_16,Station-0,2022-03-10 00:29:00,2022-03-10 00:29:00,Station-34,0.06,0,4751088,CKB -LINE_16,Station-34,2022-03-10 00:29:00,2022-03-10 00:41:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 00:47:00,2022-03-10 00:57:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 00:59:00,2022-03-10 01:11:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 01:17:00,2022-03-10 01:27:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 01:29:00,2022-03-10 01:41:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 01:47:00,2022-03-10 01:57:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 01:59:00,2022-03-10 02:11:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 02:17:00,2022-03-10 02:27:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 02:29:00,2022-03-10 02:41:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 02:47:00,2022-03-10 02:57:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 02:59:00,2022-03-10 03:11:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 03:17:00,2022-03-10 03:27:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 03:29:00,2022-03-10 03:41:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 03:47:00,2022-03-10 03:57:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 03:59:00,2022-03-10 04:11:00,Station-35,4481,6,4751088,CKB -LINE_16,Station-35,2022-03-10 04:17:00,2022-03-10 04:27:00,Station-34,4031,2,4751088,CKB -LINE_16,Station-34,2022-03-10 04:29:00,2022-03-10 04:41:00,Station-35,4481,0,4751088,CKB -LINE_16,Station-35,2022-03-10 04:41:00,2022-03-10 04:41:00,Station-0,0.06,0,4751088,CKB -LINE_17,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-34,0.06,0,4453546,CKB -LINE_17,Station-34,2022-03-10 00:30:00,2022-03-10 00:44:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 00:44:00,2022-03-10 00:57:00,Station-34,5302,3,4453546,CKB -LINE_17,Station-34,2022-03-10 01:00:00,2022-03-10 01:14:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 01:14:00,2022-03-10 01:27:00,Station-34,5302,3,4453546,CKB -LINE_17,Station-34,2022-03-10 01:30:00,2022-03-10 01:44:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 01:44:00,2022-03-10 01:57:00,Station-34,5302,3,4453546,CKB -LINE_17,Station-34,2022-03-10 02:00:00,2022-03-10 02:14:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 02:14:00,2022-03-10 02:27:00,Station-34,5302,3,4453546,CKB -LINE_17,Station-34,2022-03-10 02:30:00,2022-03-10 02:44:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 02:44:00,2022-03-10 02:57:00,Station-34,5302,3,4453546,CKB -LINE_17,Station-34,2022-03-10 03:00:00,2022-03-10 03:14:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 03:14:00,2022-03-10 03:27:00,Station-34,5302,3,4453546,CKB -LINE_17,Station-34,2022-03-10 03:30:00,2022-03-10 03:44:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 03:44:00,2022-03-10 03:57:00,Station-34,5302,3,4453546,CKB -LINE_17,Station-34,2022-03-10 04:00:00,2022-03-10 04:14:00,Station-36,4801,0,4453546,CKB -LINE_17,Station-36,2022-03-10 04:14:00,2022-03-10 04:27:00,Station-34,5302,0,4453546,CKB -LINE_17,Station-34,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,4453546,CKB -LINE_18,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-37,0.06,0,4374468,CKB -LINE_18,Station-37,2022-03-10 00:43:00,2022-03-10 01:33:00,Station-37,20434,10,4374468,CKB -LINE_18,Station-37,2022-03-10 01:43:00,2022-03-10 02:33:00,Station-37,20434,10,4374468,CKB -LINE_18,Station-37,2022-03-10 02:43:00,2022-03-10 03:33:00,Station-37,20434,10,4374468,CKB -LINE_18,Station-37,2022-03-10 03:43:00,2022-03-10 04:33:00,Station-37,20434,0,4374468,CKB -LINE_18,Station-37,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,4374468,CKB -LINE_18,Station-0,2022-03-10 00:13:00,2022-03-10 00:13:00,Station-37,0.06,0,4374473,CKB -LINE_18,Station-37,2022-03-10 00:13:00,2022-03-10 01:03:00,Station-37,20434,10,4374473,CKB -LINE_18,Station-37,2022-03-10 01:13:00,2022-03-10 02:03:00,Station-37,20434,10,4374473,CKB -LINE_18,Station-37,2022-03-10 02:13:00,2022-03-10 03:03:00,Station-37,20434,10,4374473,CKB -LINE_18,Station-37,2022-03-10 03:13:00,2022-03-10 04:03:00,Station-37,20434,0,4374473,CKB -LINE_18,Station-37,2022-03-10 04:03:00,2022-03-10 04:03:00,Station-0,0.06,0,4374473,CKB -LINE_19,Station-0,2022-03-10 00:24:00,2022-03-10 00:24:00,Station-38,0.06,0,4456449,CKB -LINE_19,Station-38,2022-03-10 00:24:00,2022-03-10 00:48:00,Station-39,11.86,4,4456449,CKB -LINE_19,Station-39,2022-03-10 00:52:00,2022-03-10 01:14:00,Station-38,11139,10,4456449,CKB -LINE_19,Station-38,2022-03-10 01:24:00,2022-03-10 01:48:00,Station-39,11.86,4,4456449,CKB -LINE_19,Station-39,2022-03-10 01:52:00,2022-03-10 02:14:00,Station-38,11139,10,4456449,CKB -LINE_19,Station-38,2022-03-10 02:24:00,2022-03-10 02:48:00,Station-39,11.86,4,4456449,CKB -LINE_19,Station-39,2022-03-10 02:52:00,2022-03-10 03:14:00,Station-38,11139,10,4456449,CKB -LINE_19,Station-38,2022-03-10 03:24:00,2022-03-10 03:48:00,Station-39,11.86,4,4456449,CKB -LINE_19,Station-39,2022-03-10 03:52:00,2022-03-10 04:14:00,Station-38,11139,0,4456449,CKB -LINE_19,Station-38,2022-03-10 04:14:00,2022-03-10 04:14:00,Station-0,0.06,0,4456449,CKB -LINE_19,Station-0,2022-03-10 00:22:00,2022-03-10 00:22:00,Station-39,0.06,0,4456457,CKB -LINE_19,Station-39,2022-03-10 00:22:00,2022-03-10 00:44:00,Station-38,11139,10,4456457,CKB -LINE_19,Station-38,2022-03-10 00:54:00,2022-03-10 01:18:00,Station-39,11.86,4,4456457,CKB -LINE_19,Station-39,2022-03-10 01:22:00,2022-03-10 01:44:00,Station-38,11139,10,4456457,CKB -LINE_19,Station-38,2022-03-10 01:54:00,2022-03-10 02:18:00,Station-39,11.86,4,4456457,CKB -LINE_19,Station-39,2022-03-10 02:22:00,2022-03-10 02:44:00,Station-38,11139,10,4456457,CKB -LINE_19,Station-38,2022-03-10 02:54:00,2022-03-10 03:18:00,Station-39,11.86,4,4456457,CKB -LINE_19,Station-39,2022-03-10 03:22:00,2022-03-10 03:44:00,Station-38,11139,10,4456457,CKB -LINE_19,Station-38,2022-03-10 03:54:00,2022-03-10 04:18:00,Station-39,11.86,4,4456457,CKB -LINE_19,Station-39,2022-03-10 04:22:00,2022-03-10 04:44:00,Station-38,11139,0,4456457,CKB -LINE_19,Station-38,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,4456457,CKB -LINE_20,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,4747651,CKB -LINE_20,Station-13,2022-03-10 00:32:00,2022-03-10 00:44:00,Station-40,4212,3,4747651,CKB -LINE_20,Station-40,2022-03-10 00:47:00,2022-03-10 01:16:00,Station-41,13048,0,4747651,CKB -LINE_20,Station-41,2022-03-10 01:16:00,2022-03-10 01:42:00,Station-40,12869,5,4747651,CKB -LINE_20,Station-40,2022-03-10 01:47:00,2022-03-10 02:16:00,Station-41,13048,0,4747651,CKB -LINE_20,Station-41,2022-03-10 02:16:00,2022-03-10 02:42:00,Station-40,12869,5,4747651,CKB -LINE_20,Station-40,2022-03-10 02:47:00,2022-03-10 03:16:00,Station-41,13048,0,4747651,CKB -LINE_20,Station-41,2022-03-10 03:16:00,2022-03-10 03:42:00,Station-40,12869,5,4747651,CKB -LINE_20,Station-40,2022-03-10 03:47:00,2022-03-10 04:16:00,Station-41,13048,0,4747651,CKB -LINE_20,Station-41,2022-03-10 04:16:00,2022-03-10 04:34:00,Station-42,9538,0,4747651,CKB -LINE_20,Station-42,2022-03-10 04:34:00,2022-03-10 04:34:00,Station-0,0.06,0,4747651,CKB -LINE_20,Station-0,2022-03-10 00:17:00,2022-03-10 00:17:00,Station-40,0.06,0,4747661,CKB -LINE_20,Station-40,2022-03-10 00:17:00,2022-03-10 00:46:00,Station-41,13048,0,4747661,CKB -LINE_20,Station-41,2022-03-10 00:46:00,2022-03-10 01:12:00,Station-40,12869,5,4747661,CKB -LINE_20,Station-40,2022-03-10 01:17:00,2022-03-10 01:46:00,Station-41,13048,0,4747661,CKB -LINE_20,Station-41,2022-03-10 01:46:00,2022-03-10 02:12:00,Station-40,12869,5,4747661,CKB -LINE_20,Station-40,2022-03-10 02:17:00,2022-03-10 02:46:00,Station-41,13048,0,4747661,CKB -LINE_20,Station-41,2022-03-10 02:46:00,2022-03-10 03:12:00,Station-40,12869,5,4747661,CKB -LINE_20,Station-40,2022-03-10 03:17:00,2022-03-10 03:46:00,Station-41,13048,0,4747661,CKB -LINE_20,Station-41,2022-03-10 03:46:00,2022-03-10 04:12:00,Station-40,12869,5,4747661,CKB -LINE_20,Station-40,2022-03-10 04:17:00,2022-03-10 04:28:00,Station-13,4316,0,4747661,CKB -LINE_20,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,4747661,CKB -LINE_21,Station-0,2022-03-10 00:49:00,2022-03-10 00:49:00,Station-3,0.06,0,4434342,CKB -LINE_21,Station-3,2022-03-10 00:49:00,2022-03-10 01:04:00,Station-16,10229,0,4434342,CKB -LINE_21,Station-16,2022-03-10 01:04:00,2022-03-10 01:19:00,Station-3,11801,0,4434342,CKB -LINE_21,Station-3,2022-03-10 01:19:00,2022-03-10 01:34:00,Station-16,10229,0,4434342,CKB -LINE_21,Station-16,2022-03-10 01:34:00,2022-03-10 01:49:00,Station-3,11801,0,4434342,CKB -LINE_21,Station-3,2022-03-10 01:49:00,2022-03-10 02:04:00,Station-16,10229,0,4434342,CKB -LINE_21,Station-16,2022-03-10 02:04:00,2022-03-10 02:19:00,Station-3,11801,0,4434342,CKB -LINE_21,Station-3,2022-03-10 02:19:00,2022-03-10 02:34:00,Station-16,10229,0,4434342,CKB -LINE_21,Station-16,2022-03-10 02:34:00,2022-03-10 02:49:00,Station-3,11801,0,4434342,CKB -LINE_21,Station-3,2022-03-10 02:49:00,2022-03-10 03:04:00,Station-16,10229,0,4434342,CKB -LINE_21,Station-16,2022-03-10 03:04:00,2022-03-10 03:19:00,Station-3,11801,0,4434342,CKB -LINE_21,Station-3,2022-03-10 03:19:00,2022-03-10 03:34:00,Station-16,10229,0,4434342,CKB -LINE_21,Station-16,2022-03-10 03:34:00,2022-03-10 03:49:00,Station-3,11801,0,4434342,CKB -LINE_21,Station-3,2022-03-10 03:49:00,2022-03-10 04:04:00,Station-16,10229,0,4434342,CKB -LINE_21,Station-16,2022-03-10 04:04:00,2022-03-10 04:19:00,Station-3,11801,23,4434342,CKB -LINE_22,Station-3,2022-03-10 04:42:00,2022-03-10 05:04:00,Station-43,6.81,0,4434342,CKB -LINE_22,Station-43,2022-03-10 05:04:00,2022-03-10 05:04:00,Station-0,0.06,0,4434342,CKB -LINE_8,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,4434898,CKB -LINE_8,Station-13,2022-03-10 00:32:00,2022-03-10 00:57:00,Station-21,11545,6,4434898,CKB -LINE_8,Station-21,2022-03-10 01:03:00,2022-03-10 01:46:00,Station-20,20579,1,4434898,CKB -LINE_8,Station-20,2022-03-10 01:47:00,2022-03-10 02:25:00,Station-21,20641,8,4434898,CKB -LINE_8,Station-21,2022-03-10 02:33:00,2022-03-10 03:16:00,Station-20,20579,1,4434898,CKB -LINE_8,Station-20,2022-03-10 03:17:00,2022-03-10 03:55:00,Station-21,20641,8,4434898,CKB -LINE_8,Station-21,2022-03-10 04:03:00,2022-03-10 04:28:00,Station-13,11499,0,4434898,CKB -LINE_8,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,4434898,CKB -LINE_8,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-21,0.06,0,4434903,CKB -LINE_8,Station-21,2022-03-10 00:33:00,2022-03-10 01:16:00,Station-20,20579,1,4434903,CKB -LINE_8,Station-20,2022-03-10 01:17:00,2022-03-10 01:55:00,Station-21,20641,8,4434903,CKB -LINE_8,Station-21,2022-03-10 02:03:00,2022-03-10 02:46:00,Station-20,20579,1,4434903,CKB -LINE_8,Station-20,2022-03-10 02:47:00,2022-03-10 03:25:00,Station-21,20641,8,4434903,CKB -LINE_8,Station-21,2022-03-10 03:33:00,2022-03-10 04:16:00,Station-20,20579,1,4434903,CKB -LINE_8,Station-20,2022-03-10 04:17:00,2022-03-10 04:51:00,Station-44,18752,0,4434903,CKB -LINE_8,Station-44,2022-03-10 04:51:00,2022-03-10 04:51:00,Station-0,0.06,0,4434903,CKB -LINE_23,Station-0,2022-03-10 00:34:00,2022-03-10 00:34:00,Station-45,0.06,0,4619767,CKB -LINE_23,Station-45,2022-03-10 00:34:00,2022-03-10 01:00:00,Station-46,9016,0,4619767,CKB -LINE_23,Station-46,2022-03-10 01:00:00,2022-03-10 01:27:00,Station-45,10083,7,4619767,CKB -LINE_23,Station-45,2022-03-10 01:34:00,2022-03-10 02:00:00,Station-46,9016,0,4619767,CKB -LINE_23,Station-46,2022-03-10 02:00:00,2022-03-10 02:27:00,Station-45,10083,7,4619767,CKB -LINE_23,Station-45,2022-03-10 02:34:00,2022-03-10 03:00:00,Station-46,9016,0,4619767,CKB -LINE_23,Station-46,2022-03-10 03:00:00,2022-03-10 03:27:00,Station-45,10083,7,4619767,CKB -LINE_23,Station-45,2022-03-10 03:34:00,2022-03-10 04:00:00,Station-46,9016,0,4619767,CKB -LINE_23,Station-46,2022-03-10 04:00:00,2022-03-10 04:27:00,Station-45,10083,0,4619767,CKB -LINE_23,Station-45,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,4619767,CKB -LINE_23,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-46,0.06,0,4619992,CKB -LINE_23,Station-46,2022-03-10 00:30:00,2022-03-10 00:57:00,Station-45,10083,7,4619992,CKB -LINE_23,Station-45,2022-03-10 01:04:00,2022-03-10 01:30:00,Station-46,9016,0,4619992,CKB -LINE_23,Station-46,2022-03-10 01:30:00,2022-03-10 01:57:00,Station-45,10083,7,4619992,CKB -LINE_23,Station-45,2022-03-10 02:04:00,2022-03-10 02:30:00,Station-46,9016,0,4619992,CKB -LINE_23,Station-46,2022-03-10 02:30:00,2022-03-10 02:57:00,Station-45,10083,7,4619992,CKB -LINE_23,Station-45,2022-03-10 03:04:00,2022-03-10 03:30:00,Station-46,9016,0,4619992,CKB -LINE_23,Station-46,2022-03-10 03:30:00,2022-03-10 03:57:00,Station-45,10083,7,4619992,CKB -LINE_23,Station-45,2022-03-10 04:04:00,2022-03-10 04:30:00,Station-46,9016,0,4619992,CKB -LINE_23,Station-46,2022-03-10 04:30:00,2022-03-10 04:57:00,Station-45,10083,0,4619992,CKB -LINE_23,Station-45,2022-03-10 04:57:00,2022-03-10 04:57:00,Station-0,0.06,0,4619992,CKB -LINE_24,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,4374745,CKB -LINE_24,Station-21,2022-03-10 00:31:00,2022-03-10 00:44:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 00:44:00,2022-03-10 00:56:00,Station-21,5362,5,4374745,CKB -LINE_24,Station-21,2022-03-10 01:01:00,2022-03-10 01:14:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 01:14:00,2022-03-10 01:26:00,Station-21,5362,5,4374745,CKB -LINE_24,Station-21,2022-03-10 01:31:00,2022-03-10 01:44:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 01:44:00,2022-03-10 01:56:00,Station-21,5362,5,4374745,CKB -LINE_24,Station-21,2022-03-10 02:01:00,2022-03-10 02:14:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 02:14:00,2022-03-10 02:26:00,Station-21,5362,5,4374745,CKB -LINE_24,Station-21,2022-03-10 02:31:00,2022-03-10 02:44:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 02:44:00,2022-03-10 02:56:00,Station-21,5362,5,4374745,CKB -LINE_24,Station-21,2022-03-10 03:01:00,2022-03-10 03:14:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 03:14:00,2022-03-10 03:26:00,Station-21,5362,5,4374745,CKB -LINE_24,Station-21,2022-03-10 03:31:00,2022-03-10 03:44:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 03:44:00,2022-03-10 03:56:00,Station-21,5362,5,4374745,CKB -LINE_24,Station-21,2022-03-10 04:01:00,2022-03-10 04:14:00,Station-47,4872,0,4374745,CKB -LINE_24,Station-47,2022-03-10 04:14:00,2022-03-10 04:26:00,Station-21,5362,0,4374745,CKB -LINE_24,Station-21,2022-03-10 04:26:00,2022-03-10 04:26:00,Station-0,0.06,0,4374745,CKB -LINE_25,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,4374868,CKB -LINE_25,Station-21,2022-03-10 00:31:00,2022-03-10 00:45:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 00:47:00,2022-03-10 01:01:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 01:01:00,2022-03-10 01:15:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 01:17:00,2022-03-10 01:31:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 01:31:00,2022-03-10 01:45:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 01:47:00,2022-03-10 02:01:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 02:01:00,2022-03-10 02:15:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 02:17:00,2022-03-10 02:31:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 02:31:00,2022-03-10 02:45:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 02:47:00,2022-03-10 03:01:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 03:01:00,2022-03-10 03:15:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 03:17:00,2022-03-10 03:31:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 03:31:00,2022-03-10 03:45:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 03:47:00,2022-03-10 04:01:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 04:01:00,2022-03-10 04:15:00,Station-48,5225,2,4374868,CKB -LINE_25,Station-48,2022-03-10 04:17:00,2022-03-10 04:31:00,Station-21,7617,0,4374868,CKB -LINE_25,Station-21,2022-03-10 04:31:00,2022-03-10 04:31:00,Station-0,0.06,0,4374868,CKB -LINE_26,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-49,0.06,0,4375014,CKB -LINE_26,Station-49,2022-03-10 00:43:00,2022-03-10 00:53:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 00:53:00,2022-03-10 01:03:00,Station-49,4408,10,4375014,CKB -LINE_26,Station-49,2022-03-10 01:13:00,2022-03-10 01:23:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 01:23:00,2022-03-10 01:33:00,Station-49,4408,10,4375014,CKB -LINE_26,Station-49,2022-03-10 01:43:00,2022-03-10 01:53:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 01:53:00,2022-03-10 02:03:00,Station-49,4408,10,4375014,CKB -LINE_26,Station-49,2022-03-10 02:13:00,2022-03-10 02:23:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 02:23:00,2022-03-10 02:33:00,Station-49,4408,10,4375014,CKB -LINE_26,Station-49,2022-03-10 02:43:00,2022-03-10 02:53:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 02:53:00,2022-03-10 03:03:00,Station-49,4408,10,4375014,CKB -LINE_26,Station-49,2022-03-10 03:13:00,2022-03-10 03:23:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 03:23:00,2022-03-10 03:33:00,Station-49,4408,10,4375014,CKB -LINE_26,Station-49,2022-03-10 03:43:00,2022-03-10 03:53:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 03:53:00,2022-03-10 04:03:00,Station-49,4408,10,4375014,CKB -LINE_26,Station-49,2022-03-10 04:13:00,2022-03-10 04:23:00,Station-50,4507,0,4375014,CKB -LINE_26,Station-50,2022-03-10 04:23:00,2022-03-10 04:33:00,Station-49,4408,0,4375014,CKB -LINE_26,Station-49,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,4375014,CKB -LINE_0,Station-0,2022-03-10 21:31:00,2022-03-10 21:31:00,Station-1,0.06,0,4454946,CKB -LINE_0,Station-1,2022-03-10 21:31:00,2022-03-10 22:04:00,Station-2,14519,4,4454946,CKB -LINE_0,Station-2,2022-03-10 22:08:00,2022-03-10 22:43:00,Station-1,13541,8,4454946,CKB -LINE_0,Station-1,2022-03-10 22:51:00,2022-03-10 23:24:00,Station-2,14519,4,4454946,CKB -LINE_0,Station-2,2022-03-10 23:28:00,2022-03-11 00:03:00,Station-1,13541,8,4454946,CKB -LINE_0,Station-1,2022-03-11 00:11:00,2022-03-11 00:44:00,Station-2,14519,0,4454946,CKB -LINE_1,Station-2,2022-03-11 00:44:00,2022-03-11 00:54:00,Station-3,4.1,25,4454946,CKB -LINE_1,Station-3,2022-03-11 01:19:00,2022-03-11 01:42:00,Station-4,8.36,6,4454946,CKB -LINE_1,Station-4,2022-03-11 01:48:00,2022-03-11 02:06:00,Station-3,9067,13,4454946,CKB -LINE_1,Station-3,2022-03-11 02:19:00,2022-03-11 02:42:00,Station-4,8.36,6,4454946,CKB -LINE_1,Station-4,2022-03-11 02:48:00,2022-03-11 03:06:00,Station-3,9067,13,4454946,CKB -LINE_1,Station-3,2022-03-11 03:19:00,2022-03-11 03:42:00,Station-4,8.36,6,4454946,CKB -LINE_1,Station-4,2022-03-11 03:48:00,2022-03-11 04:06:00,Station-3,9067,0,4454946,CKB -LINE_1,Station-3,2022-03-11 04:06:00,2022-03-11 04:06:00,Station-0,0.06,0,4454946,CKB -LINE_0,Station-0,2022-03-10 22:11:00,2022-03-10 22:11:00,Station-1,0.06,0,4454951,CKB -LINE_0,Station-1,2022-03-10 22:11:00,2022-03-10 22:44:00,Station-2,14519,4,4454951,CKB -LINE_0,Station-2,2022-03-10 22:48:00,2022-03-10 23:23:00,Station-1,13541,8,4454951,CKB -LINE_0,Station-1,2022-03-10 23:31:00,2022-03-11 00:04:00,Station-2,14519,4,4454951,CKB -LINE_0,Station-2,2022-03-11 00:08:00,2022-03-11 00:39:00,Station-5,12213,0,4454951,CKB -LINE_1,Station-5,2022-03-11 00:39:00,2022-03-11 00:47:00,Station-3,4.0,2,4454951,CKB -LINE_1,Station-3,2022-03-11 00:49:00,2022-03-11 01:12:00,Station-4,8.36,6,4454951,CKB -LINE_1,Station-4,2022-03-11 01:18:00,2022-03-11 01:36:00,Station-3,9067,13,4454951,CKB -LINE_1,Station-3,2022-03-11 01:49:00,2022-03-11 02:12:00,Station-4,8.36,6,4454951,CKB -LINE_1,Station-4,2022-03-11 02:18:00,2022-03-11 02:36:00,Station-3,9067,13,4454951,CKB -LINE_1,Station-3,2022-03-11 02:49:00,2022-03-11 03:12:00,Station-4,8.36,6,4454951,CKB -LINE_1,Station-4,2022-03-11 03:18:00,2022-03-11 03:36:00,Station-3,9067,13,4454951,CKB -LINE_1,Station-3,2022-03-11 03:49:00,2022-03-11 04:12:00,Station-4,8.36,0,4454951,CKB -LINE_1,Station-4,2022-03-11 04:12:00,2022-03-11 04:12:00,Station-0,0.06,0,4454951,CKB -LINE_2,Station-0,2022-03-10 21:06:00,2022-03-10 21:06:00,Station-6,0.06,0,4664625,CKB -LINE_2,Station-6,2022-03-10 21:06:00,2022-03-10 21:34:00,Station-7,13018,19,4664625,CKB -LINE_2,Station-7,2022-03-10 21:53:00,2022-03-10 22:13:00,Station-8,10332,17,4664625,CKB -LINE_2,Station-8,2022-03-10 22:30:00,2022-03-10 22:54:00,Station-7,10.48,19,4664625,CKB -LINE_2,Station-7,2022-03-10 23:13:00,2022-03-10 23:33:00,Station-8,10332,17,4664625,CKB -LINE_2,Station-8,2022-03-10 23:50:00,2022-03-11 00:14:00,Station-7,10.48,2,4664625,CKB -LINE_2,Station-7,2022-03-11 00:16:00,2022-03-11 00:23:00,Station-9,3709,5,4664625,CKB -LINE_3,Station-9,2022-03-11 00:28:00,2022-03-11 00:44:00,Station-10,6404,3,4664625,CKB -LINE_3,Station-10,2022-03-11 00:47:00,2022-03-11 01:10:00,Station-11,10579,7,4664625,CKB -LINE_3,Station-11,2022-03-11 01:17:00,2022-03-11 01:44:00,Station-10,12007,3,4664625,CKB -LINE_3,Station-10,2022-03-11 01:47:00,2022-03-11 02:10:00,Station-11,10579,7,4664625,CKB -LINE_3,Station-11,2022-03-11 02:17:00,2022-03-11 02:44:00,Station-10,12007,3,4664625,CKB -LINE_3,Station-10,2022-03-11 02:47:00,2022-03-11 03:10:00,Station-11,10579,7,4664625,CKB -LINE_3,Station-11,2022-03-11 03:17:00,2022-03-11 03:44:00,Station-10,12007,3,4664625,CKB -LINE_3,Station-10,2022-03-11 03:47:00,2022-03-11 04:10:00,Station-11,10579,7,4664625,CKB -LINE_3,Station-11,2022-03-11 04:17:00,2022-03-11 04:44:00,Station-10,12007,0,4664625,CKB -LINE_3,Station-10,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,4664625,CKB -LINE_2,Station-0,2022-03-10 20:26:00,2022-03-10 20:26:00,Station-6,0.06,0,4762777,CKB -LINE_2,Station-6,2022-03-10 20:26:00,2022-03-10 20:56:00,Station-12,14097,14,4762777,CKB -LINE_2,Station-12,2022-03-10 21:10:00,2022-03-10 21:38:00,Station-6,13.19,8,4762777,CKB -LINE_2,Station-6,2022-03-10 21:46:00,2022-03-10 22:14:00,Station-7,13018,19,4762777,CKB -LINE_2,Station-7,2022-03-10 22:33:00,2022-03-10 22:53:00,Station-8,10332,17,4762777,CKB -LINE_2,Station-8,2022-03-10 23:10:00,2022-03-10 23:34:00,Station-7,10.48,19,4762777,CKB -LINE_2,Station-7,2022-03-10 23:53:00,2022-03-11 00:13:00,Station-8,10332,2,4762777,CKB -LINE_2,Station-8,2022-03-11 00:15:00,2022-03-11 00:16:00,Station-10,506,1,4762777,CKB -LINE_3,Station-10,2022-03-11 00:17:00,2022-03-11 00:40:00,Station-11,10579,7,4762777,CKB -LINE_3,Station-11,2022-03-11 00:47:00,2022-03-11 01:14:00,Station-10,12007,3,4762777,CKB -LINE_3,Station-10,2022-03-11 01:17:00,2022-03-11 01:40:00,Station-11,10579,7,4762777,CKB -LINE_3,Station-11,2022-03-11 01:47:00,2022-03-11 02:14:00,Station-10,12007,3,4762777,CKB -LINE_3,Station-10,2022-03-11 02:17:00,2022-03-11 02:40:00,Station-11,10579,7,4762777,CKB -LINE_3,Station-11,2022-03-11 02:47:00,2022-03-11 03:14:00,Station-10,12007,3,4762777,CKB -LINE_3,Station-10,2022-03-11 03:17:00,2022-03-11 03:40:00,Station-11,10579,7,4762777,CKB -LINE_3,Station-11,2022-03-11 03:47:00,2022-03-11 04:14:00,Station-10,12007,3,4762777,CKB -LINE_3,Station-10,2022-03-11 04:17:00,2022-03-11 04:40:00,Station-11,10579,3,4762777,CKB -LINE_4,Station-11,2022-03-11 04:43:00,2022-03-11 04:58:00,Station-13,6161,0,4762777,CKB -LINE_4,Station-13,2022-03-11 04:58:00,2022-03-11 04:58:00,Station-0,0.06,0,4762777,CKB -LINE_5,Station-0,2022-03-10 22:56:00,2022-03-10 22:56:00,Station-14,0.06,0,4617422,CKB -LINE_5,Station-14,2022-03-10 22:56:00,2022-03-10 23:08:00,Station-15,5882,3,4617422,CKB -LINE_5,Station-15,2022-03-10 23:11:00,2022-03-10 23:25:00,Station-14,6232,0,4617422,CKB -LINE_5,Station-14,2022-03-10 23:25:00,2022-03-10 23:38:00,Station-15,6086,3,4617422,CKB -LINE_5,Station-15,2022-03-10 23:41:00,2022-03-10 23:55:00,Station-14,6232,0,4617422,CKB -LINE_5,Station-14,2022-03-10 23:55:00,2022-03-11 00:08:00,Station-15,6086,0,4617422,CKB -LINE_5,Station-15,2022-03-11 00:08:00,2022-03-11 00:08:00,Station-0,0.06,0,4617422,CKB -LINE_6,Station-0,2022-03-10 05:05:00,2022-03-10 05:05:00,Station-16,0.06,0,4426847,CKB -LINE_6,Station-16,2022-03-10 05:05:00,2022-03-10 05:14:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 05:14:00,2022-03-10 05:23:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 05:25:00,2022-03-10 05:34:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 05:34:00,2022-03-10 05:43:00,Station-16,5139,23,4426847,CKB -LINE_6,Station-16,2022-03-10 06:06:00,2022-03-10 06:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 06:15:00,2022-03-10 06:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 06:26:00,2022-03-10 06:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 06:35:00,2022-03-10 06:44:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 06:46:00,2022-03-10 06:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 06:55:00,2022-03-10 07:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 07:06:00,2022-03-10 07:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 07:15:00,2022-03-10 07:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 07:26:00,2022-03-10 07:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 07:35:00,2022-03-10 07:44:00,Station-16,5139,22,4426847,CKB -LINE_6,Station-16,2022-03-10 08:06:00,2022-03-10 08:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 08:15:00,2022-03-10 08:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 08:26:00,2022-03-10 08:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 08:35:00,2022-03-10 08:44:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 08:46:00,2022-03-10 08:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 08:55:00,2022-03-10 09:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 09:06:00,2022-03-10 09:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 09:15:00,2022-03-10 09:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 09:26:00,2022-03-10 09:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 09:35:00,2022-03-10 09:44:00,Station-16,5139,22,4426847,CKB -LINE_6,Station-16,2022-03-10 10:06:00,2022-03-10 10:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 10:15:00,2022-03-10 10:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 10:26:00,2022-03-10 10:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 10:35:00,2022-03-10 10:44:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 10:46:00,2022-03-10 10:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 10:55:00,2022-03-10 11:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 11:06:00,2022-03-10 11:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 11:15:00,2022-03-10 11:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 11:26:00,2022-03-10 11:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 11:35:00,2022-03-10 11:44:00,Station-16,5139,22,4426847,CKB -LINE_6,Station-16,2022-03-10 12:06:00,2022-03-10 12:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 12:15:00,2022-03-10 12:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 12:26:00,2022-03-10 12:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 12:35:00,2022-03-10 12:44:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 12:46:00,2022-03-10 12:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 12:55:00,2022-03-10 13:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 13:06:00,2022-03-10 13:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 13:15:00,2022-03-10 13:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 13:26:00,2022-03-10 13:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 13:35:00,2022-03-10 13:44:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 13:46:00,2022-03-10 13:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 13:55:00,2022-03-10 14:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 14:06:00,2022-03-10 14:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 14:15:00,2022-03-10 14:24:00,Station-16,5139,22,4426847,CKB -LINE_6,Station-16,2022-03-10 14:46:00,2022-03-10 14:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 14:55:00,2022-03-10 15:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 15:06:00,2022-03-10 15:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 15:15:00,2022-03-10 15:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 15:26:00,2022-03-10 15:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 15:35:00,2022-03-10 15:44:00,Station-16,5139,22,4426847,CKB -LINE_6,Station-16,2022-03-10 16:06:00,2022-03-10 16:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 16:15:00,2022-03-10 16:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 16:26:00,2022-03-10 16:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 16:35:00,2022-03-10 16:44:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 16:46:00,2022-03-10 16:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 16:55:00,2022-03-10 17:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 17:06:00,2022-03-10 17:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 17:15:00,2022-03-10 17:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 17:26:00,2022-03-10 17:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 17:35:00,2022-03-10 17:44:00,Station-16,5139,22,4426847,CKB -LINE_6,Station-16,2022-03-10 18:06:00,2022-03-10 18:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 18:15:00,2022-03-10 18:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 18:26:00,2022-03-10 18:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 18:35:00,2022-03-10 18:44:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 18:46:00,2022-03-10 18:55:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 18:55:00,2022-03-10 19:04:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 19:06:00,2022-03-10 19:15:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 19:15:00,2022-03-10 19:24:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 19:26:00,2022-03-10 19:35:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 19:35:00,2022-03-10 19:44:00,Station-16,5139,21,4426847,CKB -LINE_6,Station-16,2022-03-10 20:05:00,2022-03-10 20:14:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 20:14:00,2022-03-10 20:23:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 20:25:00,2022-03-10 20:34:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 20:34:00,2022-03-10 20:43:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 20:45:00,2022-03-10 20:54:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 20:54:00,2022-03-10 21:03:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 21:05:00,2022-03-10 21:14:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 21:14:00,2022-03-10 21:23:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 21:25:00,2022-03-10 21:34:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 21:34:00,2022-03-10 21:43:00,Station-16,5139,22,4426847,CKB -LINE_6,Station-16,2022-03-10 22:05:00,2022-03-10 22:14:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 22:14:00,2022-03-10 22:23:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 22:25:00,2022-03-10 22:34:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 22:34:00,2022-03-10 22:43:00,Station-16,5139,2,4426847,CKB -LINE_6,Station-16,2022-03-10 22:45:00,2022-03-10 22:54:00,Station-17,4781,0,4426847,CKB -LINE_6,Station-17,2022-03-10 22:54:00,2022-03-10 23:03:00,Station-16,5139,0,4426847,CKB -LINE_6,Station-16,2022-03-10 23:03:00,2022-03-10 23:03:00,Station-0,0.06,0,4426847,CKB -LINE_7,Station-0,2022-03-11 00:06:00,2022-03-11 00:06:00,Station-18,0.06,0,4708597,CKB -LINE_7,Station-18,2022-03-11 00:06:00,2022-03-11 00:27:00,Station-19,7827,0,4708597,CKB -LINE_8,Station-19,2022-03-11 00:27:00,2022-03-11 00:48:00,Station-20,11079,0,4708597,CKB -LINE_8,Station-20,2022-03-11 00:48:00,2022-03-11 01:25:00,Station-21,20641,8,4708597,CKB -LINE_8,Station-21,2022-03-11 01:33:00,2022-03-11 02:16:00,Station-20,20579,1,4708597,CKB -LINE_8,Station-20,2022-03-11 02:17:00,2022-03-11 02:55:00,Station-21,20641,8,4708597,CKB -LINE_8,Station-21,2022-03-11 03:03:00,2022-03-11 03:46:00,Station-20,20579,1,4708597,CKB -LINE_8,Station-20,2022-03-11 03:47:00,2022-03-11 04:25:00,Station-21,20641,0,4708597,CKB -LINE_8,Station-21,2022-03-11 04:25:00,2022-03-11 04:25:00,Station-0,0.06,0,4708597,CKB -LINE_9,Station-22,2022-03-10 05:15:00,2022-03-10 06:01:00,Station-23,17.9,0,4317627,VDL -LINE_9,Station-23,2022-03-10 06:01:00,2022-03-10 06:15:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 06:23:00,2022-03-10 06:37:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 06:41:00,2022-03-10 06:55:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 07:03:00,2022-03-10 07:17:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 07:21:00,2022-03-10 07:35:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 07:43:00,2022-03-10 07:57:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 08:01:00,2022-03-10 08:15:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 08:23:00,2022-03-10 08:37:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 08:41:00,2022-03-10 08:55:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 09:03:00,2022-03-10 09:17:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 09:21:00,2022-03-10 09:35:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 09:43:00,2022-03-10 09:57:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 10:01:00,2022-03-10 10:15:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 10:23:00,2022-03-10 10:37:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 10:41:00,2022-03-10 10:55:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 11:03:00,2022-03-10 11:17:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 11:21:00,2022-03-10 11:35:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 11:43:00,2022-03-10 11:57:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 12:01:00,2022-03-10 12:15:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 12:23:00,2022-03-10 12:37:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 12:41:00,2022-03-10 12:55:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 13:03:00,2022-03-10 13:17:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 13:21:00,2022-03-10 13:35:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 13:43:00,2022-03-10 13:57:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 14:01:00,2022-03-10 14:15:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 14:23:00,2022-03-10 14:37:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 14:41:00,2022-03-10 14:55:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 15:03:00,2022-03-10 15:17:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 15:21:00,2022-03-10 15:35:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 15:43:00,2022-03-10 15:57:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 16:01:00,2022-03-10 16:15:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 16:23:00,2022-03-10 16:37:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 16:41:00,2022-03-10 16:55:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 17:03:00,2022-03-10 17:17:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 17:21:00,2022-03-10 17:35:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 17:43:00,2022-03-10 17:57:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 18:01:00,2022-03-10 18:15:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 18:23:00,2022-03-10 18:37:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 18:41:00,2022-03-10 18:55:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 19:03:00,2022-03-10 19:17:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 19:21:00,2022-03-10 19:35:00,Station-23,4637,8,4317627,VDL -LINE_9,Station-23,2022-03-10 19:43:00,2022-03-10 19:57:00,Station-23,4637,4,4317627,VDL -LINE_9,Station-23,2022-03-10 20:01:00,2022-03-10 20:14:00,Station-23,4637,9,4317627,VDL -LINE_9,Station-23,2022-03-10 20:23:00,2022-03-10 20:36:00,Station-23,4637,0,4317627,VDL -LINE_9,Station-23,2022-03-10 20:36:00,2022-03-10 21:15:00,Station-22,19.8,0,4317627,VDL -LINE_10,Station-0,2022-03-10 04:56:00,2022-03-10 04:56:00,Station-24,0.06,18,4425670,CKB -LINE_10,Station-24,2022-03-10 05:14:00,2022-03-10 05:20:00,Station-25,3.29,0,4425670,CKB -LINE_10,Station-25,2022-03-10 05:20:00,2022-03-10 05:24:00,Station-24,2954,20,4425670,CKB -LINE_10,Station-24,2022-03-10 05:44:00,2022-03-10 05:50:00,Station-25,3.29,0,4425670,CKB -LINE_10,Station-25,2022-03-10 05:50:00,2022-03-10 05:54:00,Station-24,2954,5,4425670,CKB -LINE_10,Station-24,2022-03-10 05:59:00,2022-03-10 06:06:00,Station-25,3.29,2,4425670,CKB -LINE_10,Station-25,2022-03-10 06:08:00,2022-03-10 06:13:00,Station-24,2954,19,4425670,CKB -LINE_10,Station-24,2022-03-10 06:32:00,2022-03-10 06:39:00,Station-25,3.29,1,4425670,CKB -LINE_10,Station-25,2022-03-10 06:40:00,2022-03-10 06:45:00,Station-24,2954,7,4425670,CKB -LINE_10,Station-24,2022-03-10 06:52:00,2022-03-10 06:59:00,Station-25,3.29,1,4425670,CKB -LINE_10,Station-25,2022-03-10 07:00:00,2022-03-10 07:05:00,Station-24,2954,7,4425670,CKB -LINE_10,Station-24,2022-03-10 07:12:00,2022-03-10 07:19:00,Station-25,3.29,1,4425670,CKB -LINE_10,Station-25,2022-03-10 07:20:00,2022-03-10 07:25:00,Station-24,2954,7,4425670,CKB -LINE_10,Station-24,2022-03-10 07:32:00,2022-03-10 07:39:00,Station-25,3.29,1,4425670,CKB -LINE_10,Station-25,2022-03-10 07:40:00,2022-03-10 07:45:00,Station-24,2954,295,4425670,CKB -LINE_10,Station-24,2022-03-10 12:40:00,2022-03-10 12:47:00,Station-25,3.29,2,4425670,CKB -LINE_10,Station-25,2022-03-10 12:49:00,2022-03-10 12:54:00,Station-24,2954,46,4425670,CKB -LINE_10,Station-24,2022-03-10 13:40:00,2022-03-10 13:47:00,Station-25,3.29,2,4425670,CKB -LINE_10,Station-25,2022-03-10 13:49:00,2022-03-10 13:54:00,Station-24,2954,434,4425670,CKB -LINE_10,Station-24,2022-03-10 21:08:00,2022-03-10 21:08:00,Station-0,0.06,0,4425670,CKB -LINE_11,Station-0,2022-03-10 07:20:00,2022-03-10 07:20:00,Station-26,0.06,0,4448152,CKB -LINE_11,Station-26,2022-03-10 07:20:00,2022-03-10 07:50:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 08:00:00,2022-03-10 08:30:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 08:40:00,2022-03-10 09:10:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 09:20:00,2022-03-10 09:50:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 10:00:00,2022-03-10 10:30:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 10:40:00,2022-03-10 11:10:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 11:20:00,2022-03-10 11:50:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 12:00:00,2022-03-10 12:30:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 12:40:00,2022-03-10 13:10:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 13:20:00,2022-03-10 13:50:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 14:00:00,2022-03-10 14:30:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 14:40:00,2022-03-10 15:10:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 15:20:00,2022-03-10 15:50:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 16:00:00,2022-03-10 16:30:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 16:40:00,2022-03-10 17:10:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 17:20:00,2022-03-10 17:50:00,Station-26,9266,10,4448152,CKB -LINE_11,Station-26,2022-03-10 18:00:00,2022-03-10 18:30:00,Station-26,9266,0,4448152,CKB -LINE_11,Station-26,2022-03-10 18:30:00,2022-03-10 18:30:00,Station-0,0.06,0,4448152,CKB -LINE_12,Station-0,2022-03-10 07:10:00,2022-03-10 07:10:00,Station-27,0.06,0,4733897,CKB -LINE_12,Station-27,2022-03-10 07:10:00,2022-03-10 07:18:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 07:28:00,2022-03-10 07:40:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 07:40:00,2022-03-10 07:48:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 07:58:00,2022-03-10 08:10:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 08:10:00,2022-03-10 08:18:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 08:28:00,2022-03-10 08:40:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 08:40:00,2022-03-10 08:48:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 08:58:00,2022-03-10 09:10:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 09:10:00,2022-03-10 09:18:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 09:28:00,2022-03-10 09:40:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 09:40:00,2022-03-10 09:48:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 09:58:00,2022-03-10 10:10:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 10:10:00,2022-03-10 10:18:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 10:28:00,2022-03-10 10:40:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 10:40:00,2022-03-10 10:48:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 10:58:00,2022-03-10 11:10:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 11:10:00,2022-03-10 11:18:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 11:28:00,2022-03-10 11:40:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 11:40:00,2022-03-10 11:48:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 11:58:00,2022-03-10 12:10:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 12:10:00,2022-03-10 12:18:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 12:28:00,2022-03-10 12:40:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 12:40:00,2022-03-10 12:48:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 12:58:00,2022-03-10 13:10:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 13:10:00,2022-03-10 13:18:00,Station-28,2169,10,4733897,CKB -LINE_12,Station-28,2022-03-10 13:28:00,2022-03-10 13:40:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 13:40:00,2022-03-10 13:48:00,Station-28,2169,8,4733897,CKB -LINE_12,Station-28,2022-03-10 13:56:00,2022-03-10 14:10:00,Station-27,2952,0,4733897,CKB -LINE_12,Station-27,2022-03-10 14:10:00,2022-03-10 14:19:00,Station-28,2169,14,4733897,CKB -LINE_12,Station-28,2022-03-10 14:33:00,2022-03-10 14:47:00,Station-27,2952,3,4733897,CKB -LINE_12,Station-27,2022-03-10 14:50:00,2022-03-10 14:59:00,Station-28,2169,14,4733897,CKB -LINE_12,Station-28,2022-03-10 15:13:00,2022-03-10 15:27:00,Station-27,2952,3,4733897,CKB -LINE_12,Station-27,2022-03-10 15:30:00,2022-03-10 15:39:00,Station-28,2169,14,4733897,CKB -LINE_12,Station-28,2022-03-10 15:53:00,2022-03-10 16:07:00,Station-27,2952,3,4733897,CKB -LINE_12,Station-27,2022-03-10 16:10:00,2022-03-10 16:19:00,Station-28,2169,14,4733897,CKB -LINE_12,Station-28,2022-03-10 16:33:00,2022-03-10 16:47:00,Station-27,2952,3,4733897,CKB -LINE_12,Station-27,2022-03-10 16:50:00,2022-03-10 16:59:00,Station-28,2169,14,4733897,CKB -LINE_12,Station-28,2022-03-10 17:13:00,2022-03-10 17:27:00,Station-27,2952,3,4733897,CKB -LINE_12,Station-27,2022-03-10 17:30:00,2022-03-10 17:39:00,Station-28,2169,13,4733897,CKB -LINE_12,Station-28,2022-03-10 17:52:00,2022-03-10 18:05:00,Station-27,2952,5,4733897,CKB -LINE_12,Station-27,2022-03-10 18:10:00,2022-03-10 18:18:00,Station-28,2169,0,4733897,CKB -LINE_12,Station-28,2022-03-10 18:18:00,2022-03-10 18:18:00,Station-0,0.06,0,4733897,CKB -LINE_12,Station-0,2022-03-10 14:13:00,2022-03-10 14:13:00,Station-28,0.06,0,4734202,CKB -LINE_12,Station-28,2022-03-10 14:13:00,2022-03-10 14:27:00,Station-27,2952,3,4734202,CKB -LINE_12,Station-27,2022-03-10 14:30:00,2022-03-10 14:39:00,Station-28,2169,14,4734202,CKB -LINE_12,Station-28,2022-03-10 14:53:00,2022-03-10 15:07:00,Station-27,2952,3,4734202,CKB -LINE_12,Station-27,2022-03-10 15:10:00,2022-03-10 15:19:00,Station-28,2169,14,4734202,CKB -LINE_12,Station-28,2022-03-10 15:33:00,2022-03-10 15:47:00,Station-27,2952,3,4734202,CKB -LINE_12,Station-27,2022-03-10 15:50:00,2022-03-10 15:59:00,Station-28,2169,14,4734202,CKB -LINE_12,Station-28,2022-03-10 16:13:00,2022-03-10 16:27:00,Station-27,2952,3,4734202,CKB -LINE_12,Station-27,2022-03-10 16:30:00,2022-03-10 16:39:00,Station-28,2169,14,4734202,CKB -LINE_12,Station-28,2022-03-10 16:53:00,2022-03-10 17:07:00,Station-27,2952,3,4734202,CKB -LINE_12,Station-27,2022-03-10 17:10:00,2022-03-10 17:19:00,Station-28,2169,14,4734202,CKB -LINE_12,Station-28,2022-03-10 17:33:00,2022-03-10 17:47:00,Station-27,2952,3,4734202,CKB -LINE_12,Station-27,2022-03-10 17:50:00,2022-03-10 17:59:00,Station-28,2169,14,4734202,CKB -LINE_12,Station-28,2022-03-10 18:13:00,2022-03-10 18:25:00,Station-27,2952,0,4734202,CKB -LINE_12,Station-27,2022-03-10 18:25:00,2022-03-10 18:25:00,Station-0,0.06,0,4734202,CKB -LINE_13,Station-0,2022-03-11 00:23:00,2022-03-11 00:23:00,Station-29,0.06,0,4318159,CKB -LINE_13,Station-29,2022-03-11 00:23:00,2022-03-11 00:30:00,Station-30,2577,9,4318159,CKB -LINE_14,Station-30,2022-03-11 00:39:00,2022-03-11 00:54:00,Station-31,5937,9,4318159,CKB -LINE_14,Station-31,2022-03-11 01:03:00,2022-03-11 01:17:00,Station-30,6.19,0,4318159,CKB -LINE_13,Station-30,2022-03-11 01:17:00,2022-03-11 01:23:00,Station-29,2555,0,4318159,CKB -LINE_13,Station-29,2022-03-11 01:23:00,2022-03-11 01:30:00,Station-30,2577,9,4318159,CKB -LINE_14,Station-30,2022-03-11 01:39:00,2022-03-11 01:54:00,Station-31,5937,9,4318159,CKB -LINE_14,Station-31,2022-03-11 02:03:00,2022-03-11 02:17:00,Station-30,6.19,0,4318159,CKB -LINE_13,Station-30,2022-03-11 02:17:00,2022-03-11 02:23:00,Station-29,2555,0,4318159,CKB -LINE_13,Station-29,2022-03-11 02:23:00,2022-03-11 02:30:00,Station-30,2577,9,4318159,CKB -LINE_14,Station-30,2022-03-11 02:39:00,2022-03-11 02:54:00,Station-31,5937,9,4318159,CKB -LINE_14,Station-31,2022-03-11 03:03:00,2022-03-11 03:17:00,Station-30,6.19,0,4318159,CKB -LINE_13,Station-30,2022-03-11 03:17:00,2022-03-11 03:23:00,Station-29,2555,0,4318159,CKB -LINE_13,Station-29,2022-03-11 03:23:00,2022-03-11 03:30:00,Station-30,2577,9,4318159,CKB -LINE_14,Station-30,2022-03-11 03:39:00,2022-03-11 03:54:00,Station-31,5937,9,4318159,CKB -LINE_14,Station-31,2022-03-11 04:03:00,2022-03-11 04:17:00,Station-30,6.19,0,4318159,CKB -LINE_13,Station-30,2022-03-11 04:17:00,2022-03-11 04:23:00,Station-29,2555,0,4318159,CKB -LINE_13,Station-29,2022-03-11 04:23:00,2022-03-11 04:23:00,Station-0,0.06,0,4318159,CKB -LINE_14,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-31,0.06,0,4318179,CKB -LINE_14,Station-31,2022-03-11 00:33:00,2022-03-11 00:47:00,Station-30,6.19,0,4318179,CKB -LINE_13,Station-30,2022-03-11 00:47:00,2022-03-11 00:53:00,Station-29,2555,0,4318179,CKB -LINE_13,Station-29,2022-03-11 00:53:00,2022-03-11 01:00:00,Station-30,2577,9,4318179,CKB -LINE_14,Station-30,2022-03-11 01:09:00,2022-03-11 01:24:00,Station-31,5937,9,4318179,CKB -LINE_14,Station-31,2022-03-11 01:33:00,2022-03-11 01:47:00,Station-30,6.19,0,4318179,CKB -LINE_13,Station-30,2022-03-11 01:47:00,2022-03-11 01:53:00,Station-29,2555,0,4318179,CKB -LINE_13,Station-29,2022-03-11 01:53:00,2022-03-11 02:00:00,Station-30,2577,9,4318179,CKB -LINE_14,Station-30,2022-03-11 02:09:00,2022-03-11 02:24:00,Station-31,5937,9,4318179,CKB -LINE_14,Station-31,2022-03-11 02:33:00,2022-03-11 02:47:00,Station-30,6.19,0,4318179,CKB -LINE_13,Station-30,2022-03-11 02:47:00,2022-03-11 02:53:00,Station-29,2555,0,4318179,CKB -LINE_13,Station-29,2022-03-11 02:53:00,2022-03-11 03:00:00,Station-30,2577,9,4318179,CKB -LINE_14,Station-30,2022-03-11 03:09:00,2022-03-11 03:24:00,Station-31,5937,9,4318179,CKB -LINE_14,Station-31,2022-03-11 03:33:00,2022-03-11 03:47:00,Station-30,6.19,0,4318179,CKB -LINE_13,Station-30,2022-03-11 03:47:00,2022-03-11 03:53:00,Station-29,2555,0,4318179,CKB -LINE_13,Station-29,2022-03-11 03:53:00,2022-03-11 04:00:00,Station-30,2577,9,4318179,CKB -LINE_14,Station-30,2022-03-11 04:09:00,2022-03-11 04:24:00,Station-31,5937,0,4318179,CKB -LINE_14,Station-31,2022-03-11 04:24:00,2022-03-11 04:24:00,Station-0,0.06,0,4318179,CKB -LINE_15,Station-0,2022-03-11 00:57:00,2022-03-11 00:57:00,Station-32,0.06,0,4319354,CKB -LINE_15,Station-32,2022-03-11 00:57:00,2022-03-11 01:06:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 01:06:00,2022-03-11 01:11:00,Station-32,2936,16,4319354,CKB -LINE_15,Station-32,2022-03-11 01:27:00,2022-03-11 01:36:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 01:36:00,2022-03-11 01:41:00,Station-32,2936,16,4319354,CKB -LINE_15,Station-32,2022-03-11 01:57:00,2022-03-11 02:06:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 02:06:00,2022-03-11 02:11:00,Station-32,2936,16,4319354,CKB -LINE_15,Station-32,2022-03-11 02:27:00,2022-03-11 02:36:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 02:36:00,2022-03-11 02:41:00,Station-32,2936,16,4319354,CKB -LINE_15,Station-32,2022-03-11 02:57:00,2022-03-11 03:06:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 03:06:00,2022-03-11 03:11:00,Station-32,2936,16,4319354,CKB -LINE_15,Station-32,2022-03-11 03:27:00,2022-03-11 03:36:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 03:36:00,2022-03-11 03:41:00,Station-32,2936,16,4319354,CKB -LINE_15,Station-32,2022-03-11 03:57:00,2022-03-11 04:06:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 04:06:00,2022-03-11 04:11:00,Station-32,2936,16,4319354,CKB -LINE_15,Station-32,2022-03-11 04:27:00,2022-03-11 04:36:00,Station-33,4343,0,4319354,CKB -LINE_15,Station-33,2022-03-11 04:36:00,2022-03-11 04:36:00,Station-0,0.06,0,4319354,CKB -LINE_16,Station-0,2022-03-11 00:29:00,2022-03-11 00:29:00,Station-34,0.06,0,4751089,CKB -LINE_16,Station-34,2022-03-11 00:29:00,2022-03-11 00:41:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 00:47:00,2022-03-11 00:57:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 00:59:00,2022-03-11 01:11:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 01:17:00,2022-03-11 01:27:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 01:29:00,2022-03-11 01:41:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 01:47:00,2022-03-11 01:57:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 01:59:00,2022-03-11 02:11:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 02:17:00,2022-03-11 02:27:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 02:29:00,2022-03-11 02:41:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 02:47:00,2022-03-11 02:57:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 02:59:00,2022-03-11 03:11:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 03:17:00,2022-03-11 03:27:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 03:29:00,2022-03-11 03:41:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 03:47:00,2022-03-11 03:57:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 03:59:00,2022-03-11 04:11:00,Station-35,4481,6,4751089,CKB -LINE_16,Station-35,2022-03-11 04:17:00,2022-03-11 04:27:00,Station-34,4031,2,4751089,CKB -LINE_16,Station-34,2022-03-11 04:29:00,2022-03-11 04:41:00,Station-35,4481,0,4751089,CKB -LINE_16,Station-35,2022-03-11 04:41:00,2022-03-11 04:41:00,Station-0,0.06,0,4751089,CKB -LINE_17,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-34,0.06,0,4453547,CKB -LINE_17,Station-34,2022-03-11 00:30:00,2022-03-11 00:44:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 00:44:00,2022-03-11 00:57:00,Station-34,5302,3,4453547,CKB -LINE_17,Station-34,2022-03-11 01:00:00,2022-03-11 01:14:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 01:14:00,2022-03-11 01:27:00,Station-34,5302,3,4453547,CKB -LINE_17,Station-34,2022-03-11 01:30:00,2022-03-11 01:44:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 01:44:00,2022-03-11 01:57:00,Station-34,5302,3,4453547,CKB -LINE_17,Station-34,2022-03-11 02:00:00,2022-03-11 02:14:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 02:14:00,2022-03-11 02:27:00,Station-34,5302,3,4453547,CKB -LINE_17,Station-34,2022-03-11 02:30:00,2022-03-11 02:44:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 02:44:00,2022-03-11 02:57:00,Station-34,5302,3,4453547,CKB -LINE_17,Station-34,2022-03-11 03:00:00,2022-03-11 03:14:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 03:14:00,2022-03-11 03:27:00,Station-34,5302,3,4453547,CKB -LINE_17,Station-34,2022-03-11 03:30:00,2022-03-11 03:44:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 03:44:00,2022-03-11 03:57:00,Station-34,5302,3,4453547,CKB -LINE_17,Station-34,2022-03-11 04:00:00,2022-03-11 04:14:00,Station-36,4801,0,4453547,CKB -LINE_17,Station-36,2022-03-11 04:14:00,2022-03-11 04:27:00,Station-34,5302,0,4453547,CKB -LINE_17,Station-34,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,4453547,CKB -LINE_18,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-37,0.06,0,4374469,CKB -LINE_18,Station-37,2022-03-11 00:43:00,2022-03-11 01:33:00,Station-37,20434,10,4374469,CKB -LINE_18,Station-37,2022-03-11 01:43:00,2022-03-11 02:33:00,Station-37,20434,10,4374469,CKB -LINE_18,Station-37,2022-03-11 02:43:00,2022-03-11 03:33:00,Station-37,20434,10,4374469,CKB -LINE_18,Station-37,2022-03-11 03:43:00,2022-03-11 04:33:00,Station-37,20434,0,4374469,CKB -LINE_18,Station-37,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,4374469,CKB -LINE_18,Station-0,2022-03-11 00:13:00,2022-03-11 00:13:00,Station-37,0.06,0,4374474,CKB -LINE_18,Station-37,2022-03-11 00:13:00,2022-03-11 01:03:00,Station-37,20434,10,4374474,CKB -LINE_18,Station-37,2022-03-11 01:13:00,2022-03-11 02:03:00,Station-37,20434,10,4374474,CKB -LINE_18,Station-37,2022-03-11 02:13:00,2022-03-11 03:03:00,Station-37,20434,10,4374474,CKB -LINE_18,Station-37,2022-03-11 03:13:00,2022-03-11 04:03:00,Station-37,20434,0,4374474,CKB -LINE_18,Station-37,2022-03-11 04:03:00,2022-03-11 04:03:00,Station-0,0.06,0,4374474,CKB -LINE_19,Station-0,2022-03-11 00:24:00,2022-03-11 00:24:00,Station-38,0.06,0,4456450,CKB -LINE_19,Station-38,2022-03-11 00:24:00,2022-03-11 00:48:00,Station-39,11.86,4,4456450,CKB -LINE_19,Station-39,2022-03-11 00:52:00,2022-03-11 01:14:00,Station-38,11139,10,4456450,CKB -LINE_19,Station-38,2022-03-11 01:24:00,2022-03-11 01:48:00,Station-39,11.86,4,4456450,CKB -LINE_19,Station-39,2022-03-11 01:52:00,2022-03-11 02:14:00,Station-38,11139,10,4456450,CKB -LINE_19,Station-38,2022-03-11 02:24:00,2022-03-11 02:48:00,Station-39,11.86,4,4456450,CKB -LINE_19,Station-39,2022-03-11 02:52:00,2022-03-11 03:14:00,Station-38,11139,10,4456450,CKB -LINE_19,Station-38,2022-03-11 03:24:00,2022-03-11 03:48:00,Station-39,11.86,4,4456450,CKB -LINE_19,Station-39,2022-03-11 03:52:00,2022-03-11 04:14:00,Station-38,11139,0,4456450,CKB -LINE_19,Station-38,2022-03-11 04:14:00,2022-03-11 04:14:00,Station-0,0.06,0,4456450,CKB -LINE_19,Station-0,2022-03-11 00:22:00,2022-03-11 00:22:00,Station-39,0.06,0,4456458,CKB -LINE_19,Station-39,2022-03-11 00:22:00,2022-03-11 00:44:00,Station-38,11139,10,4456458,CKB -LINE_19,Station-38,2022-03-11 00:54:00,2022-03-11 01:18:00,Station-39,11.86,4,4456458,CKB -LINE_19,Station-39,2022-03-11 01:22:00,2022-03-11 01:44:00,Station-38,11139,10,4456458,CKB -LINE_19,Station-38,2022-03-11 01:54:00,2022-03-11 02:18:00,Station-39,11.86,4,4456458,CKB -LINE_19,Station-39,2022-03-11 02:22:00,2022-03-11 02:44:00,Station-38,11139,10,4456458,CKB -LINE_19,Station-38,2022-03-11 02:54:00,2022-03-11 03:18:00,Station-39,11.86,4,4456458,CKB -LINE_19,Station-39,2022-03-11 03:22:00,2022-03-11 03:44:00,Station-38,11139,10,4456458,CKB -LINE_19,Station-38,2022-03-11 03:54:00,2022-03-11 04:18:00,Station-39,11.86,4,4456458,CKB -LINE_19,Station-39,2022-03-11 04:22:00,2022-03-11 04:44:00,Station-38,11139,0,4456458,CKB -LINE_19,Station-38,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,4456458,CKB -LINE_20,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,4747652,CKB -LINE_20,Station-13,2022-03-11 00:32:00,2022-03-11 00:44:00,Station-40,4212,3,4747652,CKB -LINE_20,Station-40,2022-03-11 00:47:00,2022-03-11 01:16:00,Station-41,13048,0,4747652,CKB -LINE_20,Station-41,2022-03-11 01:16:00,2022-03-11 01:42:00,Station-40,12869,5,4747652,CKB -LINE_20,Station-40,2022-03-11 01:47:00,2022-03-11 02:16:00,Station-41,13048,0,4747652,CKB -LINE_20,Station-41,2022-03-11 02:16:00,2022-03-11 02:42:00,Station-40,12869,5,4747652,CKB -LINE_20,Station-40,2022-03-11 02:47:00,2022-03-11 03:16:00,Station-41,13048,0,4747652,CKB -LINE_20,Station-41,2022-03-11 03:16:00,2022-03-11 03:42:00,Station-40,12869,5,4747652,CKB -LINE_20,Station-40,2022-03-11 03:47:00,2022-03-11 04:16:00,Station-41,13048,0,4747652,CKB -LINE_20,Station-41,2022-03-11 04:16:00,2022-03-11 04:34:00,Station-42,9538,0,4747652,CKB -LINE_20,Station-42,2022-03-11 04:34:00,2022-03-11 04:34:00,Station-0,0.06,0,4747652,CKB -LINE_20,Station-0,2022-03-11 00:17:00,2022-03-11 00:17:00,Station-40,0.06,0,4747662,CKB -LINE_20,Station-40,2022-03-11 00:17:00,2022-03-11 00:46:00,Station-41,13048,0,4747662,CKB -LINE_20,Station-41,2022-03-11 00:46:00,2022-03-11 01:12:00,Station-40,12869,5,4747662,CKB -LINE_20,Station-40,2022-03-11 01:17:00,2022-03-11 01:46:00,Station-41,13048,0,4747662,CKB -LINE_20,Station-41,2022-03-11 01:46:00,2022-03-11 02:12:00,Station-40,12869,5,4747662,CKB -LINE_20,Station-40,2022-03-11 02:17:00,2022-03-11 02:46:00,Station-41,13048,0,4747662,CKB -LINE_20,Station-41,2022-03-11 02:46:00,2022-03-11 03:12:00,Station-40,12869,5,4747662,CKB -LINE_20,Station-40,2022-03-11 03:17:00,2022-03-11 03:46:00,Station-41,13048,0,4747662,CKB -LINE_20,Station-41,2022-03-11 03:46:00,2022-03-11 04:12:00,Station-40,12869,5,4747662,CKB -LINE_20,Station-40,2022-03-11 04:17:00,2022-03-11 04:28:00,Station-13,4316,0,4747662,CKB -LINE_20,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,4747662,CKB -LINE_21,Station-0,2022-03-11 00:49:00,2022-03-11 00:49:00,Station-3,0.06,0,4434343,CKB -LINE_21,Station-3,2022-03-11 00:49:00,2022-03-11 01:04:00,Station-16,10229,0,4434343,CKB -LINE_21,Station-16,2022-03-11 01:04:00,2022-03-11 01:19:00,Station-3,11801,0,4434343,CKB -LINE_21,Station-3,2022-03-11 01:19:00,2022-03-11 01:34:00,Station-16,10229,0,4434343,CKB -LINE_21,Station-16,2022-03-11 01:34:00,2022-03-11 01:49:00,Station-3,11801,0,4434343,CKB -LINE_21,Station-3,2022-03-11 01:49:00,2022-03-11 02:04:00,Station-16,10229,0,4434343,CKB -LINE_21,Station-16,2022-03-11 02:04:00,2022-03-11 02:19:00,Station-3,11801,0,4434343,CKB -LINE_21,Station-3,2022-03-11 02:19:00,2022-03-11 02:34:00,Station-16,10229,0,4434343,CKB -LINE_21,Station-16,2022-03-11 02:34:00,2022-03-11 02:49:00,Station-3,11801,0,4434343,CKB -LINE_21,Station-3,2022-03-11 02:49:00,2022-03-11 03:04:00,Station-16,10229,0,4434343,CKB -LINE_21,Station-16,2022-03-11 03:04:00,2022-03-11 03:19:00,Station-3,11801,0,4434343,CKB -LINE_21,Station-3,2022-03-11 03:19:00,2022-03-11 03:34:00,Station-16,10229,0,4434343,CKB -LINE_21,Station-16,2022-03-11 03:34:00,2022-03-11 03:49:00,Station-3,11801,0,4434343,CKB -LINE_21,Station-3,2022-03-11 03:49:00,2022-03-11 04:04:00,Station-16,10229,0,4434343,CKB -LINE_21,Station-16,2022-03-11 04:04:00,2022-03-11 04:19:00,Station-3,11801,23,4434343,CKB -LINE_22,Station-3,2022-03-11 04:42:00,2022-03-11 05:04:00,Station-43,6.81,0,4434343,CKB -LINE_22,Station-43,2022-03-11 05:04:00,2022-03-11 05:04:00,Station-0,0.06,0,4434343,CKB -LINE_8,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,4434899,CKB -LINE_8,Station-13,2022-03-11 00:32:00,2022-03-11 00:57:00,Station-21,11545,6,4434899,CKB -LINE_8,Station-21,2022-03-11 01:03:00,2022-03-11 01:46:00,Station-20,20579,1,4434899,CKB -LINE_8,Station-20,2022-03-11 01:47:00,2022-03-11 02:25:00,Station-21,20641,8,4434899,CKB -LINE_8,Station-21,2022-03-11 02:33:00,2022-03-11 03:16:00,Station-20,20579,1,4434899,CKB -LINE_8,Station-20,2022-03-11 03:17:00,2022-03-11 03:55:00,Station-21,20641,8,4434899,CKB -LINE_8,Station-21,2022-03-11 04:03:00,2022-03-11 04:28:00,Station-13,11499,0,4434899,CKB -LINE_8,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,4434899,CKB -LINE_8,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-21,0.06,0,4434904,CKB -LINE_8,Station-21,2022-03-11 00:33:00,2022-03-11 01:16:00,Station-20,20579,1,4434904,CKB -LINE_8,Station-20,2022-03-11 01:17:00,2022-03-11 01:55:00,Station-21,20641,8,4434904,CKB -LINE_8,Station-21,2022-03-11 02:03:00,2022-03-11 02:46:00,Station-20,20579,1,4434904,CKB -LINE_8,Station-20,2022-03-11 02:47:00,2022-03-11 03:25:00,Station-21,20641,8,4434904,CKB -LINE_8,Station-21,2022-03-11 03:33:00,2022-03-11 04:16:00,Station-20,20579,1,4434904,CKB -LINE_8,Station-20,2022-03-11 04:17:00,2022-03-11 04:51:00,Station-44,18752,0,4434904,CKB -LINE_8,Station-44,2022-03-11 04:51:00,2022-03-11 04:51:00,Station-0,0.06,0,4434904,CKB -LINE_23,Station-0,2022-03-11 00:34:00,2022-03-11 00:34:00,Station-45,0.06,0,4619768,CKB -LINE_23,Station-45,2022-03-11 00:34:00,2022-03-11 01:00:00,Station-46,9016,0,4619768,CKB -LINE_23,Station-46,2022-03-11 01:00:00,2022-03-11 01:27:00,Station-45,10083,7,4619768,CKB -LINE_23,Station-45,2022-03-11 01:34:00,2022-03-11 02:00:00,Station-46,9016,0,4619768,CKB -LINE_23,Station-46,2022-03-11 02:00:00,2022-03-11 02:27:00,Station-45,10083,7,4619768,CKB -LINE_23,Station-45,2022-03-11 02:34:00,2022-03-11 03:00:00,Station-46,9016,0,4619768,CKB -LINE_23,Station-46,2022-03-11 03:00:00,2022-03-11 03:27:00,Station-45,10083,7,4619768,CKB -LINE_23,Station-45,2022-03-11 03:34:00,2022-03-11 04:00:00,Station-46,9016,0,4619768,CKB -LINE_23,Station-46,2022-03-11 04:00:00,2022-03-11 04:27:00,Station-45,10083,0,4619768,CKB -LINE_23,Station-45,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,4619768,CKB -LINE_23,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-46,0.06,0,4619993,CKB -LINE_23,Station-46,2022-03-11 00:30:00,2022-03-11 00:57:00,Station-45,10083,7,4619993,CKB -LINE_23,Station-45,2022-03-11 01:04:00,2022-03-11 01:30:00,Station-46,9016,0,4619993,CKB -LINE_23,Station-46,2022-03-11 01:30:00,2022-03-11 01:57:00,Station-45,10083,7,4619993,CKB -LINE_23,Station-45,2022-03-11 02:04:00,2022-03-11 02:30:00,Station-46,9016,0,4619993,CKB -LINE_23,Station-46,2022-03-11 02:30:00,2022-03-11 02:57:00,Station-45,10083,7,4619993,CKB -LINE_23,Station-45,2022-03-11 03:04:00,2022-03-11 03:30:00,Station-46,9016,0,4619993,CKB -LINE_23,Station-46,2022-03-11 03:30:00,2022-03-11 03:57:00,Station-45,10083,7,4619993,CKB -LINE_23,Station-45,2022-03-11 04:04:00,2022-03-11 04:30:00,Station-46,9016,0,4619993,CKB -LINE_23,Station-46,2022-03-11 04:30:00,2022-03-11 04:57:00,Station-45,10083,0,4619993,CKB -LINE_23,Station-45,2022-03-11 04:57:00,2022-03-11 04:57:00,Station-0,0.06,0,4619993,CKB -LINE_24,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,4374746,CKB -LINE_24,Station-21,2022-03-11 00:31:00,2022-03-11 00:44:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 00:44:00,2022-03-11 00:56:00,Station-21,5362,5,4374746,CKB -LINE_24,Station-21,2022-03-11 01:01:00,2022-03-11 01:14:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 01:14:00,2022-03-11 01:26:00,Station-21,5362,5,4374746,CKB -LINE_24,Station-21,2022-03-11 01:31:00,2022-03-11 01:44:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 01:44:00,2022-03-11 01:56:00,Station-21,5362,5,4374746,CKB -LINE_24,Station-21,2022-03-11 02:01:00,2022-03-11 02:14:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 02:14:00,2022-03-11 02:26:00,Station-21,5362,5,4374746,CKB -LINE_24,Station-21,2022-03-11 02:31:00,2022-03-11 02:44:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 02:44:00,2022-03-11 02:56:00,Station-21,5362,5,4374746,CKB -LINE_24,Station-21,2022-03-11 03:01:00,2022-03-11 03:14:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 03:14:00,2022-03-11 03:26:00,Station-21,5362,5,4374746,CKB -LINE_24,Station-21,2022-03-11 03:31:00,2022-03-11 03:44:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 03:44:00,2022-03-11 03:56:00,Station-21,5362,5,4374746,CKB -LINE_24,Station-21,2022-03-11 04:01:00,2022-03-11 04:14:00,Station-47,4872,0,4374746,CKB -LINE_24,Station-47,2022-03-11 04:14:00,2022-03-11 04:26:00,Station-21,5362,0,4374746,CKB -LINE_24,Station-21,2022-03-11 04:26:00,2022-03-11 04:26:00,Station-0,0.06,0,4374746,CKB -LINE_25,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,4374869,CKB -LINE_25,Station-21,2022-03-11 00:31:00,2022-03-11 00:45:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 00:47:00,2022-03-11 01:01:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 01:01:00,2022-03-11 01:15:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 01:17:00,2022-03-11 01:31:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 01:31:00,2022-03-11 01:45:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 01:47:00,2022-03-11 02:01:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 02:01:00,2022-03-11 02:15:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 02:17:00,2022-03-11 02:31:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 02:31:00,2022-03-11 02:45:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 02:47:00,2022-03-11 03:01:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 03:01:00,2022-03-11 03:15:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 03:17:00,2022-03-11 03:31:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 03:31:00,2022-03-11 03:45:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 03:47:00,2022-03-11 04:01:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 04:01:00,2022-03-11 04:15:00,Station-48,5225,2,4374869,CKB -LINE_25,Station-48,2022-03-11 04:17:00,2022-03-11 04:31:00,Station-21,7617,0,4374869,CKB -LINE_25,Station-21,2022-03-11 04:31:00,2022-03-11 04:31:00,Station-0,0.06,0,4374869,CKB -LINE_26,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-49,0.06,0,4375015,CKB -LINE_26,Station-49,2022-03-11 00:43:00,2022-03-11 00:53:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 00:53:00,2022-03-11 01:03:00,Station-49,4408,10,4375015,CKB -LINE_26,Station-49,2022-03-11 01:13:00,2022-03-11 01:23:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 01:23:00,2022-03-11 01:33:00,Station-49,4408,10,4375015,CKB -LINE_26,Station-49,2022-03-11 01:43:00,2022-03-11 01:53:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 01:53:00,2022-03-11 02:03:00,Station-49,4408,10,4375015,CKB -LINE_26,Station-49,2022-03-11 02:13:00,2022-03-11 02:23:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 02:23:00,2022-03-11 02:33:00,Station-49,4408,10,4375015,CKB -LINE_26,Station-49,2022-03-11 02:43:00,2022-03-11 02:53:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 02:53:00,2022-03-11 03:03:00,Station-49,4408,10,4375015,CKB -LINE_26,Station-49,2022-03-11 03:13:00,2022-03-11 03:23:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 03:23:00,2022-03-11 03:33:00,Station-49,4408,10,4375015,CKB -LINE_26,Station-49,2022-03-11 03:43:00,2022-03-11 03:53:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 03:53:00,2022-03-11 04:03:00,Station-49,4408,10,4375015,CKB -LINE_26,Station-49,2022-03-11 04:13:00,2022-03-11 04:23:00,Station-50,4507,0,4375015,CKB -LINE_26,Station-50,2022-03-11 04:23:00,2022-03-11 04:33:00,Station-49,4408,0,4375015,CKB -LINE_26,Station-49,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,4375015,CKB -LINE_0,Station-0,2022-03-11 21:31:00,2022-03-11 21:31:00,Station-1,0.06,0,4454947,CKB -LINE_0,Station-1,2022-03-11 21:31:00,2022-03-11 22:04:00,Station-2,14519,4,4454947,CKB -LINE_0,Station-2,2022-03-11 22:08:00,2022-03-11 22:43:00,Station-1,13541,8,4454947,CKB -LINE_0,Station-1,2022-03-11 22:51:00,2022-03-11 23:24:00,Station-2,14519,4,4454947,CKB -LINE_0,Station-2,2022-03-11 23:28:00,2022-03-12 00:03:00,Station-1,13541,8,4454947,CKB -LINE_0,Station-1,2022-03-12 00:11:00,2022-03-12 00:44:00,Station-2,14519,0,4454947,CKB -LINE_1,Station-2,2022-03-12 00:44:00,2022-03-12 00:54:00,Station-3,4.1,25,4454947,CKB -LINE_1,Station-3,2022-03-12 01:19:00,2022-03-12 01:42:00,Station-4,8.36,6,4454947,CKB -LINE_1,Station-4,2022-03-12 01:48:00,2022-03-12 02:06:00,Station-3,9067,13,4454947,CKB -LINE_1,Station-3,2022-03-12 02:19:00,2022-03-12 02:42:00,Station-4,8.36,6,4454947,CKB -LINE_1,Station-4,2022-03-12 02:48:00,2022-03-12 03:06:00,Station-3,9067,13,4454947,CKB -LINE_1,Station-3,2022-03-12 03:19:00,2022-03-12 03:42:00,Station-4,8.36,6,4454947,CKB -LINE_1,Station-4,2022-03-12 03:48:00,2022-03-12 04:06:00,Station-3,9067,13,4454947,CKB -LINE_1,Station-3,2022-03-12 04:19:00,2022-03-12 04:42:00,Station-4,8.36,6,4454947,CKB -LINE_1,Station-4,2022-03-12 04:48:00,2022-03-12 05:06:00,Station-3,9067,13,4454947,CKB -LINE_1,Station-3,2022-03-12 05:19:00,2022-03-12 05:42:00,Station-4,8.36,16,4454947,CKB -LINE_22,Station-4,2022-03-12 05:58:00,2022-03-12 06:34:00,Station-43,12968,0,4454947,CKB -LINE_22,Station-43,2022-03-12 06:34:00,2022-03-12 06:34:00,Station-0,0.06,0,4454947,CKB -LINE_0,Station-0,2022-03-11 22:11:00,2022-03-11 22:11:00,Station-1,0.06,0,4454952,CKB -LINE_0,Station-1,2022-03-11 22:11:00,2022-03-11 22:44:00,Station-2,14519,4,4454952,CKB -LINE_0,Station-2,2022-03-11 22:48:00,2022-03-11 23:23:00,Station-1,13541,8,4454952,CKB -LINE_0,Station-1,2022-03-11 23:31:00,2022-03-12 00:04:00,Station-2,14519,4,4454952,CKB -LINE_0,Station-2,2022-03-12 00:08:00,2022-03-12 00:39:00,Station-5,12213,0,4454952,CKB -LINE_1,Station-5,2022-03-12 00:39:00,2022-03-12 00:47:00,Station-3,4.0,2,4454952,CKB -LINE_1,Station-3,2022-03-12 00:49:00,2022-03-12 01:12:00,Station-4,8.36,6,4454952,CKB -LINE_1,Station-4,2022-03-12 01:18:00,2022-03-12 01:36:00,Station-3,9067,13,4454952,CKB -LINE_1,Station-3,2022-03-12 01:49:00,2022-03-12 02:12:00,Station-4,8.36,6,4454952,CKB -LINE_1,Station-4,2022-03-12 02:18:00,2022-03-12 02:36:00,Station-3,9067,13,4454952,CKB -LINE_1,Station-3,2022-03-12 02:49:00,2022-03-12 03:12:00,Station-4,8.36,6,4454952,CKB -LINE_1,Station-4,2022-03-12 03:18:00,2022-03-12 03:36:00,Station-3,9067,13,4454952,CKB -LINE_1,Station-3,2022-03-12 03:49:00,2022-03-12 04:12:00,Station-4,8.36,6,4454952,CKB -LINE_1,Station-4,2022-03-12 04:18:00,2022-03-12 04:36:00,Station-3,9067,13,4454952,CKB -LINE_1,Station-3,2022-03-12 04:49:00,2022-03-12 05:12:00,Station-4,8.36,6,4454952,CKB -LINE_1,Station-4,2022-03-12 05:18:00,2022-03-12 05:36:00,Station-3,9067,0,4454952,CKB -LINE_1,Station-3,2022-03-12 05:36:00,2022-03-12 05:36:00,Station-0,0.06,0,4454952,CKB -LINE_2,Station-0,2022-03-11 21:06:00,2022-03-11 21:06:00,Station-6,0.06,0,4664738,CKB -LINE_2,Station-6,2022-03-11 21:06:00,2022-03-11 21:34:00,Station-7,13018,19,4664738,CKB -LINE_2,Station-7,2022-03-11 21:53:00,2022-03-11 22:13:00,Station-8,10332,17,4664738,CKB -LINE_2,Station-8,2022-03-11 22:30:00,2022-03-11 22:54:00,Station-7,10.48,19,4664738,CKB -LINE_2,Station-7,2022-03-11 23:13:00,2022-03-11 23:33:00,Station-8,10332,17,4664738,CKB -LINE_2,Station-8,2022-03-11 23:50:00,2022-03-12 00:14:00,Station-7,10.48,8,4664738,CKB -LINE_2,Station-7,2022-03-12 00:22:00,2022-03-12 00:27:00,Station-58,2533,2,4664738,CKB -LINE_3,Station-58,2022-03-12 00:29:00,2022-03-12 00:47:00,Station-10,7.58,0,4664738,CKB -LINE_3,Station-10,2022-03-12 00:47:00,2022-03-12 01:14:00,Station-11,12841,3,4664738,CKB -LINE_3,Station-11,2022-03-12 01:17:00,2022-03-12 01:47:00,Station-10,14281,0,4664738,CKB -LINE_3,Station-10,2022-03-12 01:47:00,2022-03-12 02:14:00,Station-11,12841,3,4664738,CKB -LINE_3,Station-11,2022-03-12 02:17:00,2022-03-12 02:47:00,Station-10,14281,0,4664738,CKB -LINE_3,Station-10,2022-03-12 02:47:00,2022-03-12 03:14:00,Station-11,12841,3,4664738,CKB -LINE_3,Station-11,2022-03-12 03:17:00,2022-03-12 03:47:00,Station-10,14281,0,4664738,CKB -LINE_3,Station-10,2022-03-12 03:47:00,2022-03-12 04:14:00,Station-11,12841,3,4664738,CKB -LINE_3,Station-11,2022-03-12 04:17:00,2022-03-12 04:47:00,Station-10,14281,0,4664738,CKB -LINE_3,Station-10,2022-03-12 04:47:00,2022-03-12 05:14:00,Station-11,12841,3,4664738,CKB -LINE_3,Station-11,2022-03-12 05:17:00,2022-03-12 05:47:00,Station-10,14281,0,4664738,CKB -LINE_3,Station-10,2022-03-12 05:47:00,2022-03-12 05:47:00,Station-0,0.06,0,4664738,CKB -LINE_2,Station-0,2022-03-11 20:26:00,2022-03-11 20:26:00,Station-6,0.06,0,4762763,CKB -LINE_2,Station-6,2022-03-11 20:26:00,2022-03-11 20:56:00,Station-12,14097,14,4762763,CKB -LINE_2,Station-12,2022-03-11 21:10:00,2022-03-11 21:38:00,Station-6,13.19,8,4762763,CKB -LINE_2,Station-6,2022-03-11 21:46:00,2022-03-11 22:14:00,Station-7,13018,19,4762763,CKB -LINE_2,Station-7,2022-03-11 22:33:00,2022-03-11 22:53:00,Station-8,10332,17,4762763,CKB -LINE_2,Station-8,2022-03-11 23:10:00,2022-03-11 23:34:00,Station-7,10.48,19,4762763,CKB -LINE_2,Station-7,2022-03-11 23:53:00,2022-03-12 00:13:00,Station-8,10332,2,4762763,CKB -LINE_2,Station-8,2022-03-12 00:15:00,2022-03-12 00:16:00,Station-10,506,1,4762763,CKB -LINE_3,Station-10,2022-03-12 00:17:00,2022-03-12 00:44:00,Station-11,12841,3,4762763,CKB -LINE_3,Station-11,2022-03-12 00:47:00,2022-03-12 01:17:00,Station-10,14281,0,4762763,CKB -LINE_3,Station-10,2022-03-12 01:17:00,2022-03-12 01:44:00,Station-11,12841,3,4762763,CKB -LINE_3,Station-11,2022-03-12 01:47:00,2022-03-12 02:17:00,Station-10,14281,0,4762763,CKB -LINE_3,Station-10,2022-03-12 02:17:00,2022-03-12 02:44:00,Station-11,12841,3,4762763,CKB -LINE_3,Station-11,2022-03-12 02:47:00,2022-03-12 03:17:00,Station-10,14281,0,4762763,CKB -LINE_3,Station-10,2022-03-12 03:17:00,2022-03-12 03:44:00,Station-11,12841,3,4762763,CKB -LINE_3,Station-11,2022-03-12 03:47:00,2022-03-12 04:17:00,Station-10,14281,0,4762763,CKB -LINE_3,Station-10,2022-03-12 04:17:00,2022-03-12 04:44:00,Station-11,12841,3,4762763,CKB -LINE_3,Station-11,2022-03-12 04:47:00,2022-03-12 05:17:00,Station-10,14281,0,4762763,CKB -LINE_3,Station-10,2022-03-12 05:17:00,2022-03-12 05:29:00,Station-58,5474,0,4762763,CKB -LINE_3,Station-58,2022-03-12 05:29:00,2022-03-12 05:29:00,Station-0,0.06,0,4762763,CKB -LINE_5,Station-0,2022-03-11 22:56:00,2022-03-11 22:56:00,Station-14,0.06,0,4617429,CKB -LINE_5,Station-14,2022-03-11 22:56:00,2022-03-11 23:08:00,Station-15,5882,3,4617429,CKB -LINE_5,Station-15,2022-03-11 23:11:00,2022-03-11 23:25:00,Station-14,6232,0,4617429,CKB -LINE_5,Station-14,2022-03-11 23:25:00,2022-03-11 23:38:00,Station-15,6086,3,4617429,CKB -LINE_5,Station-15,2022-03-11 23:41:00,2022-03-11 23:55:00,Station-14,6232,0,4617429,CKB -LINE_5,Station-14,2022-03-11 23:55:00,2022-03-12 00:08:00,Station-15,6086,0,4617429,CKB -LINE_5,Station-15,2022-03-12 00:08:00,2022-03-12 00:08:00,Station-0,0.06,0,4617429,CKB -LINE_6,Station-0,2022-03-11 05:05:00,2022-03-11 05:05:00,Station-16,0.06,0,4426848,CKB -LINE_6,Station-16,2022-03-11 05:05:00,2022-03-11 05:14:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 05:14:00,2022-03-11 05:23:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 05:25:00,2022-03-11 05:34:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 05:34:00,2022-03-11 05:43:00,Station-16,5139,23,4426848,CKB -LINE_6,Station-16,2022-03-11 06:06:00,2022-03-11 06:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 06:15:00,2022-03-11 06:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 06:26:00,2022-03-11 06:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 06:35:00,2022-03-11 06:44:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 06:46:00,2022-03-11 06:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 06:55:00,2022-03-11 07:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 07:06:00,2022-03-11 07:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 07:15:00,2022-03-11 07:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 07:26:00,2022-03-11 07:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 07:35:00,2022-03-11 07:44:00,Station-16,5139,22,4426848,CKB -LINE_6,Station-16,2022-03-11 08:06:00,2022-03-11 08:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 08:15:00,2022-03-11 08:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 08:26:00,2022-03-11 08:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 08:35:00,2022-03-11 08:44:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 08:46:00,2022-03-11 08:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 08:55:00,2022-03-11 09:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 09:06:00,2022-03-11 09:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 09:15:00,2022-03-11 09:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 09:26:00,2022-03-11 09:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 09:35:00,2022-03-11 09:44:00,Station-16,5139,22,4426848,CKB -LINE_6,Station-16,2022-03-11 10:06:00,2022-03-11 10:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 10:15:00,2022-03-11 10:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 10:26:00,2022-03-11 10:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 10:35:00,2022-03-11 10:44:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 10:46:00,2022-03-11 10:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 10:55:00,2022-03-11 11:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 11:06:00,2022-03-11 11:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 11:15:00,2022-03-11 11:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 11:26:00,2022-03-11 11:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 11:35:00,2022-03-11 11:44:00,Station-16,5139,22,4426848,CKB -LINE_6,Station-16,2022-03-11 12:06:00,2022-03-11 12:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 12:15:00,2022-03-11 12:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 12:26:00,2022-03-11 12:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 12:35:00,2022-03-11 12:44:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 12:46:00,2022-03-11 12:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 12:55:00,2022-03-11 13:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 13:06:00,2022-03-11 13:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 13:15:00,2022-03-11 13:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 13:26:00,2022-03-11 13:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 13:35:00,2022-03-11 13:44:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 13:46:00,2022-03-11 13:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 13:55:00,2022-03-11 14:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 14:06:00,2022-03-11 14:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 14:15:00,2022-03-11 14:24:00,Station-16,5139,22,4426848,CKB -LINE_6,Station-16,2022-03-11 14:46:00,2022-03-11 14:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 14:55:00,2022-03-11 15:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 15:06:00,2022-03-11 15:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 15:15:00,2022-03-11 15:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 15:26:00,2022-03-11 15:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 15:35:00,2022-03-11 15:44:00,Station-16,5139,22,4426848,CKB -LINE_6,Station-16,2022-03-11 16:06:00,2022-03-11 16:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 16:15:00,2022-03-11 16:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 16:26:00,2022-03-11 16:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 16:35:00,2022-03-11 16:44:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 16:46:00,2022-03-11 16:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 16:55:00,2022-03-11 17:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 17:06:00,2022-03-11 17:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 17:15:00,2022-03-11 17:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 17:26:00,2022-03-11 17:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 17:35:00,2022-03-11 17:44:00,Station-16,5139,22,4426848,CKB -LINE_6,Station-16,2022-03-11 18:06:00,2022-03-11 18:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 18:15:00,2022-03-11 18:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 18:26:00,2022-03-11 18:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 18:35:00,2022-03-11 18:44:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 18:46:00,2022-03-11 18:55:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 18:55:00,2022-03-11 19:04:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 19:06:00,2022-03-11 19:15:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 19:15:00,2022-03-11 19:24:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 19:26:00,2022-03-11 19:35:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 19:35:00,2022-03-11 19:44:00,Station-16,5139,21,4426848,CKB -LINE_6,Station-16,2022-03-11 20:05:00,2022-03-11 20:14:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 20:14:00,2022-03-11 20:23:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 20:25:00,2022-03-11 20:34:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 20:34:00,2022-03-11 20:43:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 20:45:00,2022-03-11 20:54:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 20:54:00,2022-03-11 21:03:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 21:05:00,2022-03-11 21:14:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 21:14:00,2022-03-11 21:23:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 21:25:00,2022-03-11 21:34:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 21:34:00,2022-03-11 21:43:00,Station-16,5139,22,4426848,CKB -LINE_6,Station-16,2022-03-11 22:05:00,2022-03-11 22:14:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 22:14:00,2022-03-11 22:23:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 22:25:00,2022-03-11 22:34:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 22:34:00,2022-03-11 22:43:00,Station-16,5139,2,4426848,CKB -LINE_6,Station-16,2022-03-11 22:45:00,2022-03-11 22:54:00,Station-17,4781,0,4426848,CKB -LINE_6,Station-17,2022-03-11 22:54:00,2022-03-11 23:03:00,Station-16,5139,0,4426848,CKB -LINE_6,Station-16,2022-03-11 23:03:00,2022-03-11 23:03:00,Station-0,0.06,0,4426848,CKB -LINE_9,Station-22,2022-03-11 05:15:00,2022-03-11 06:01:00,Station-23,17.9,0,4317628,VDL -LINE_9,Station-23,2022-03-11 06:01:00,2022-03-11 06:15:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 06:23:00,2022-03-11 06:37:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 06:41:00,2022-03-11 06:55:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 07:03:00,2022-03-11 07:17:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 07:21:00,2022-03-11 07:35:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 07:43:00,2022-03-11 07:57:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 08:01:00,2022-03-11 08:15:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 08:23:00,2022-03-11 08:37:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 08:41:00,2022-03-11 08:55:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 09:03:00,2022-03-11 09:17:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 09:21:00,2022-03-11 09:35:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 09:43:00,2022-03-11 09:57:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 10:01:00,2022-03-11 10:15:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 10:23:00,2022-03-11 10:37:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 10:41:00,2022-03-11 10:55:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 11:03:00,2022-03-11 11:17:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 11:21:00,2022-03-11 11:35:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 11:43:00,2022-03-11 11:57:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 12:01:00,2022-03-11 12:15:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 12:23:00,2022-03-11 12:37:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 12:41:00,2022-03-11 12:55:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 13:03:00,2022-03-11 13:17:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 13:21:00,2022-03-11 13:35:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 13:43:00,2022-03-11 13:57:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 14:01:00,2022-03-11 14:15:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 14:23:00,2022-03-11 14:37:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 14:41:00,2022-03-11 14:55:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 15:03:00,2022-03-11 15:17:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 15:21:00,2022-03-11 15:35:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 15:43:00,2022-03-11 15:57:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 16:01:00,2022-03-11 16:15:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 16:23:00,2022-03-11 16:37:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 16:41:00,2022-03-11 16:55:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 17:03:00,2022-03-11 17:17:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 17:21:00,2022-03-11 17:35:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 17:43:00,2022-03-11 17:57:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 18:01:00,2022-03-11 18:15:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 18:23:00,2022-03-11 18:37:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 18:41:00,2022-03-11 18:55:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 19:03:00,2022-03-11 19:17:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 19:21:00,2022-03-11 19:35:00,Station-23,4637,8,4317628,VDL -LINE_9,Station-23,2022-03-11 19:43:00,2022-03-11 19:57:00,Station-23,4637,4,4317628,VDL -LINE_9,Station-23,2022-03-11 20:01:00,2022-03-11 20:14:00,Station-23,4637,9,4317628,VDL -LINE_9,Station-23,2022-03-11 20:23:00,2022-03-11 20:36:00,Station-23,4637,0,4317628,VDL -LINE_9,Station-23,2022-03-11 20:36:00,2022-03-11 21:15:00,Station-22,19.8,0,4317628,VDL -LINE_10,Station-0,2022-03-11 04:56:00,2022-03-11 04:56:00,Station-24,0.06,18,4425671,CKB -LINE_10,Station-24,2022-03-11 05:14:00,2022-03-11 05:20:00,Station-25,3.29,0,4425671,CKB -LINE_10,Station-25,2022-03-11 05:20:00,2022-03-11 05:24:00,Station-24,2954,20,4425671,CKB -LINE_10,Station-24,2022-03-11 05:44:00,2022-03-11 05:50:00,Station-25,3.29,0,4425671,CKB -LINE_10,Station-25,2022-03-11 05:50:00,2022-03-11 05:54:00,Station-24,2954,5,4425671,CKB -LINE_10,Station-24,2022-03-11 05:59:00,2022-03-11 06:06:00,Station-25,3.29,2,4425671,CKB -LINE_10,Station-25,2022-03-11 06:08:00,2022-03-11 06:13:00,Station-24,2954,19,4425671,CKB -LINE_10,Station-24,2022-03-11 06:32:00,2022-03-11 06:39:00,Station-25,3.29,1,4425671,CKB -LINE_10,Station-25,2022-03-11 06:40:00,2022-03-11 06:45:00,Station-24,2954,7,4425671,CKB -LINE_10,Station-24,2022-03-11 06:52:00,2022-03-11 06:59:00,Station-25,3.29,1,4425671,CKB -LINE_10,Station-25,2022-03-11 07:00:00,2022-03-11 07:05:00,Station-24,2954,7,4425671,CKB -LINE_10,Station-24,2022-03-11 07:12:00,2022-03-11 07:19:00,Station-25,3.29,1,4425671,CKB -LINE_10,Station-25,2022-03-11 07:20:00,2022-03-11 07:25:00,Station-24,2954,7,4425671,CKB -LINE_10,Station-24,2022-03-11 07:32:00,2022-03-11 07:39:00,Station-25,3.29,1,4425671,CKB -LINE_10,Station-25,2022-03-11 07:40:00,2022-03-11 07:45:00,Station-24,2954,295,4425671,CKB -LINE_10,Station-24,2022-03-11 12:40:00,2022-03-11 12:47:00,Station-25,3.29,2,4425671,CKB -LINE_10,Station-25,2022-03-11 12:49:00,2022-03-11 12:54:00,Station-24,2954,46,4425671,CKB -LINE_10,Station-24,2022-03-11 13:40:00,2022-03-11 13:47:00,Station-25,3.29,2,4425671,CKB -LINE_10,Station-25,2022-03-11 13:49:00,2022-03-11 13:54:00,Station-24,2954,434,4425671,CKB -LINE_10,Station-24,2022-03-11 21:08:00,2022-03-11 21:08:00,Station-0,0.06,0,4425671,CKB -LINE_11,Station-0,2022-03-11 07:20:00,2022-03-11 07:20:00,Station-26,0.06,0,4448153,CKB -LINE_11,Station-26,2022-03-11 07:20:00,2022-03-11 07:50:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 08:00:00,2022-03-11 08:30:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 08:40:00,2022-03-11 09:10:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 09:20:00,2022-03-11 09:50:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 10:00:00,2022-03-11 10:30:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 10:40:00,2022-03-11 11:10:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 11:20:00,2022-03-11 11:50:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 12:00:00,2022-03-11 12:30:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 12:40:00,2022-03-11 13:10:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 13:20:00,2022-03-11 13:50:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 14:00:00,2022-03-11 14:30:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 14:40:00,2022-03-11 15:10:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 15:20:00,2022-03-11 15:50:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 16:00:00,2022-03-11 16:30:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 16:40:00,2022-03-11 17:10:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 17:20:00,2022-03-11 17:50:00,Station-26,9266,10,4448153,CKB -LINE_11,Station-26,2022-03-11 18:00:00,2022-03-11 18:30:00,Station-26,9266,0,4448153,CKB -LINE_11,Station-26,2022-03-11 18:30:00,2022-03-11 18:30:00,Station-0,0.06,0,4448153,CKB -LINE_12,Station-0,2022-03-11 07:10:00,2022-03-11 07:10:00,Station-27,0.06,0,4733898,CKB -LINE_12,Station-27,2022-03-11 07:10:00,2022-03-11 07:18:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 07:28:00,2022-03-11 07:40:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 07:40:00,2022-03-11 07:48:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 07:58:00,2022-03-11 08:10:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 08:10:00,2022-03-11 08:18:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 08:28:00,2022-03-11 08:40:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 08:40:00,2022-03-11 08:48:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 08:58:00,2022-03-11 09:10:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 09:10:00,2022-03-11 09:18:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 09:28:00,2022-03-11 09:40:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 09:40:00,2022-03-11 09:48:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 09:58:00,2022-03-11 10:10:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 10:10:00,2022-03-11 10:18:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 10:28:00,2022-03-11 10:40:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 10:40:00,2022-03-11 10:48:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 10:58:00,2022-03-11 11:10:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 11:10:00,2022-03-11 11:18:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 11:28:00,2022-03-11 11:40:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 11:40:00,2022-03-11 11:48:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 11:58:00,2022-03-11 12:10:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 12:10:00,2022-03-11 12:18:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 12:28:00,2022-03-11 12:40:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 12:40:00,2022-03-11 12:48:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 12:58:00,2022-03-11 13:10:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 13:10:00,2022-03-11 13:18:00,Station-28,2169,10,4733898,CKB -LINE_12,Station-28,2022-03-11 13:28:00,2022-03-11 13:40:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 13:40:00,2022-03-11 13:48:00,Station-28,2169,8,4733898,CKB -LINE_12,Station-28,2022-03-11 13:56:00,2022-03-11 14:10:00,Station-27,2952,0,4733898,CKB -LINE_12,Station-27,2022-03-11 14:10:00,2022-03-11 14:19:00,Station-28,2169,14,4733898,CKB -LINE_12,Station-28,2022-03-11 14:33:00,2022-03-11 14:47:00,Station-27,2952,3,4733898,CKB -LINE_12,Station-27,2022-03-11 14:50:00,2022-03-11 14:59:00,Station-28,2169,14,4733898,CKB -LINE_12,Station-28,2022-03-11 15:13:00,2022-03-11 15:27:00,Station-27,2952,3,4733898,CKB -LINE_12,Station-27,2022-03-11 15:30:00,2022-03-11 15:39:00,Station-28,2169,14,4733898,CKB -LINE_12,Station-28,2022-03-11 15:53:00,2022-03-11 16:07:00,Station-27,2952,3,4733898,CKB -LINE_12,Station-27,2022-03-11 16:10:00,2022-03-11 16:19:00,Station-28,2169,14,4733898,CKB -LINE_12,Station-28,2022-03-11 16:33:00,2022-03-11 16:47:00,Station-27,2952,3,4733898,CKB -LINE_12,Station-27,2022-03-11 16:50:00,2022-03-11 16:59:00,Station-28,2169,14,4733898,CKB -LINE_12,Station-28,2022-03-11 17:13:00,2022-03-11 17:27:00,Station-27,2952,3,4733898,CKB -LINE_12,Station-27,2022-03-11 17:30:00,2022-03-11 17:39:00,Station-28,2169,13,4733898,CKB -LINE_12,Station-28,2022-03-11 17:52:00,2022-03-11 18:05:00,Station-27,2952,5,4733898,CKB -LINE_12,Station-27,2022-03-11 18:10:00,2022-03-11 18:18:00,Station-28,2169,0,4733898,CKB -LINE_12,Station-28,2022-03-11 18:18:00,2022-03-11 18:18:00,Station-0,0.06,0,4733898,CKB -LINE_12,Station-0,2022-03-11 14:13:00,2022-03-11 14:13:00,Station-28,0.06,0,4734203,CKB -LINE_12,Station-28,2022-03-11 14:13:00,2022-03-11 14:27:00,Station-27,2952,3,4734203,CKB -LINE_12,Station-27,2022-03-11 14:30:00,2022-03-11 14:39:00,Station-28,2169,14,4734203,CKB -LINE_12,Station-28,2022-03-11 14:53:00,2022-03-11 15:07:00,Station-27,2952,3,4734203,CKB -LINE_12,Station-27,2022-03-11 15:10:00,2022-03-11 15:19:00,Station-28,2169,14,4734203,CKB -LINE_12,Station-28,2022-03-11 15:33:00,2022-03-11 15:47:00,Station-27,2952,3,4734203,CKB -LINE_12,Station-27,2022-03-11 15:50:00,2022-03-11 15:59:00,Station-28,2169,14,4734203,CKB -LINE_12,Station-28,2022-03-11 16:13:00,2022-03-11 16:27:00,Station-27,2952,3,4734203,CKB -LINE_12,Station-27,2022-03-11 16:30:00,2022-03-11 16:39:00,Station-28,2169,14,4734203,CKB -LINE_12,Station-28,2022-03-11 16:53:00,2022-03-11 17:07:00,Station-27,2952,3,4734203,CKB -LINE_12,Station-27,2022-03-11 17:10:00,2022-03-11 17:19:00,Station-28,2169,14,4734203,CKB -LINE_12,Station-28,2022-03-11 17:33:00,2022-03-11 17:47:00,Station-27,2952,3,4734203,CKB -LINE_12,Station-27,2022-03-11 17:50:00,2022-03-11 17:59:00,Station-28,2169,14,4734203,CKB -LINE_12,Station-28,2022-03-11 18:13:00,2022-03-11 18:25:00,Station-27,2952,0,4734203,CKB -LINE_12,Station-27,2022-03-11 18:25:00,2022-03-11 18:25:00,Station-0,0.06,0,4734203,CKB -LINE_13,Station-0,2022-03-12 00:23:00,2022-03-12 00:23:00,Station-29,0.06,0,4318160,CKB -LINE_13,Station-29,2022-03-12 00:23:00,2022-03-12 00:30:00,Station-30,2577,9,4318160,CKB -LINE_14,Station-30,2022-03-12 00:39:00,2022-03-12 00:54:00,Station-31,5937,9,4318160,CKB -LINE_14,Station-31,2022-03-12 01:03:00,2022-03-12 01:17:00,Station-30,6.19,0,4318160,CKB -LINE_13,Station-30,2022-03-12 01:17:00,2022-03-12 01:23:00,Station-29,2555,0,4318160,CKB -LINE_13,Station-29,2022-03-12 01:23:00,2022-03-12 01:30:00,Station-30,2577,9,4318160,CKB -LINE_14,Station-30,2022-03-12 01:39:00,2022-03-12 01:54:00,Station-31,5937,9,4318160,CKB -LINE_14,Station-31,2022-03-12 02:03:00,2022-03-12 02:17:00,Station-30,6.19,0,4318160,CKB -LINE_13,Station-30,2022-03-12 02:17:00,2022-03-12 02:23:00,Station-29,2555,0,4318160,CKB -LINE_13,Station-29,2022-03-12 02:23:00,2022-03-12 02:30:00,Station-30,2577,9,4318160,CKB -LINE_14,Station-30,2022-03-12 02:39:00,2022-03-12 02:54:00,Station-31,5937,9,4318160,CKB -LINE_14,Station-31,2022-03-12 03:03:00,2022-03-12 03:17:00,Station-30,6.19,0,4318160,CKB -LINE_13,Station-30,2022-03-12 03:17:00,2022-03-12 03:23:00,Station-29,2555,0,4318160,CKB -LINE_13,Station-29,2022-03-12 03:23:00,2022-03-12 03:30:00,Station-30,2577,9,4318160,CKB -LINE_14,Station-30,2022-03-12 03:39:00,2022-03-12 03:54:00,Station-31,5937,9,4318160,CKB -LINE_14,Station-31,2022-03-12 04:03:00,2022-03-12 04:17:00,Station-30,6.19,0,4318160,CKB -LINE_13,Station-30,2022-03-12 04:17:00,2022-03-12 04:23:00,Station-29,2555,0,4318160,CKB -LINE_13,Station-29,2022-03-12 04:23:00,2022-03-12 04:30:00,Station-30,2577,9,4318160,CKB -LINE_14,Station-30,2022-03-12 04:39:00,2022-03-12 04:54:00,Station-31,5937,9,4318160,CKB -LINE_14,Station-31,2022-03-12 05:03:00,2022-03-12 05:17:00,Station-30,6.19,0,4318160,CKB -LINE_15,Station-30,2022-03-12 05:17:00,2022-03-12 05:38:00,Station-33,12.0,28,4318160,CKB -LINE_15,Station-33,2022-03-12 06:06:00,2022-03-12 06:11:00,Station-32,2936,16,4318160,CKB -LINE_15,Station-32,2022-03-12 06:27:00,2022-03-12 06:36:00,Station-33,4343,10,4318160,CKB -LINE_15,Station-33,2022-03-12 06:46:00,2022-03-12 06:51:00,Station-32,2936,0,4318160,CKB -LINE_10,Station-32,2022-03-12 06:51:00,2022-03-12 07:00:00,Station-24,4.6,12,4318160,CKB -LINE_10,Station-24,2022-03-12 07:12:00,2022-03-12 07:12:00,Station-24,0.0,836,4318160,CKB -LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-24,0.0,0,4318160,CKB -LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-0,0.06,0,4318160,CKB -LINE_14,Station-0,2022-03-12 00:33:00,2022-03-12 00:33:00,Station-31,0.06,0,4318180,CKB -LINE_14,Station-31,2022-03-12 00:33:00,2022-03-12 00:47:00,Station-30,6.19,0,4318180,CKB -LINE_13,Station-30,2022-03-12 00:47:00,2022-03-12 00:53:00,Station-29,2555,0,4318180,CKB -LINE_13,Station-29,2022-03-12 00:53:00,2022-03-12 01:00:00,Station-30,2577,9,4318180,CKB -LINE_14,Station-30,2022-03-12 01:09:00,2022-03-12 01:24:00,Station-31,5937,9,4318180,CKB -LINE_14,Station-31,2022-03-12 01:33:00,2022-03-12 01:47:00,Station-30,6.19,0,4318180,CKB -LINE_13,Station-30,2022-03-12 01:47:00,2022-03-12 01:53:00,Station-29,2555,0,4318180,CKB -LINE_13,Station-29,2022-03-12 01:53:00,2022-03-12 02:00:00,Station-30,2577,9,4318180,CKB -LINE_14,Station-30,2022-03-12 02:09:00,2022-03-12 02:24:00,Station-31,5937,9,4318180,CKB -LINE_14,Station-31,2022-03-12 02:33:00,2022-03-12 02:47:00,Station-30,6.19,0,4318180,CKB -LINE_13,Station-30,2022-03-12 02:47:00,2022-03-12 02:53:00,Station-29,2555,0,4318180,CKB -LINE_13,Station-29,2022-03-12 02:53:00,2022-03-12 03:00:00,Station-30,2577,9,4318180,CKB -LINE_14,Station-30,2022-03-12 03:09:00,2022-03-12 03:24:00,Station-31,5937,9,4318180,CKB -LINE_14,Station-31,2022-03-12 03:33:00,2022-03-12 03:47:00,Station-30,6.19,0,4318180,CKB -LINE_13,Station-30,2022-03-12 03:47:00,2022-03-12 03:53:00,Station-29,2555,0,4318180,CKB -LINE_13,Station-29,2022-03-12 03:53:00,2022-03-12 04:00:00,Station-30,2577,9,4318180,CKB -LINE_14,Station-30,2022-03-12 04:09:00,2022-03-12 04:24:00,Station-31,5937,9,4318180,CKB -LINE_14,Station-31,2022-03-12 04:33:00,2022-03-12 04:47:00,Station-30,6.19,0,4318180,CKB -LINE_13,Station-30,2022-03-12 04:47:00,2022-03-12 04:53:00,Station-29,2555,0,4318180,CKB -LINE_13,Station-29,2022-03-12 04:53:00,2022-03-12 05:00:00,Station-30,2577,9,4318180,CKB -LINE_14,Station-30,2022-03-12 05:09:00,2022-03-12 05:24:00,Station-31,5937,0,4318180,CKB -LINE_14,Station-31,2022-03-12 05:24:00,2022-03-12 05:24:00,Station-0,0.06,0,4318180,CKB -LINE_15,Station-0,2022-03-12 00:57:00,2022-03-12 00:57:00,Station-32,0.06,0,4319355,CKB -LINE_15,Station-32,2022-03-12 00:57:00,2022-03-12 01:06:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 01:06:00,2022-03-12 01:11:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 01:27:00,2022-03-12 01:36:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 01:36:00,2022-03-12 01:41:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 01:57:00,2022-03-12 02:06:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 02:06:00,2022-03-12 02:11:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 02:27:00,2022-03-12 02:36:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 02:36:00,2022-03-12 02:41:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 02:57:00,2022-03-12 03:06:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 03:06:00,2022-03-12 03:11:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 03:27:00,2022-03-12 03:36:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 03:36:00,2022-03-12 03:41:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 03:57:00,2022-03-12 04:06:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 04:06:00,2022-03-12 04:11:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 04:27:00,2022-03-12 04:36:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 04:36:00,2022-03-12 04:41:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 04:57:00,2022-03-12 05:06:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 05:06:00,2022-03-12 05:11:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 05:27:00,2022-03-12 05:36:00,Station-33,4343,0,4319355,CKB -LINE_15,Station-33,2022-03-12 05:36:00,2022-03-12 05:41:00,Station-32,2936,16,4319355,CKB -LINE_15,Station-32,2022-03-12 05:57:00,2022-03-12 06:06:00,Station-33,4343,20,4319355,CKB -LINE_15,Station-33,2022-03-12 06:26:00,2022-03-12 06:31:00,Station-32,2936,0,4319355,CKB -LINE_15,Station-32,2022-03-12 06:31:00,2022-03-12 06:31:00,Station-0,0.06,0,4319355,CKB -LINE_17,Station-0,2022-03-12 00:30:00,2022-03-12 00:30:00,Station-34,0.06,0,4453548,CKB -LINE_17,Station-34,2022-03-12 00:30:00,2022-03-12 00:44:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 00:44:00,2022-03-12 00:57:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 01:00:00,2022-03-12 01:14:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 01:14:00,2022-03-12 01:27:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 01:30:00,2022-03-12 01:44:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 01:44:00,2022-03-12 01:57:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 02:00:00,2022-03-12 02:14:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 02:14:00,2022-03-12 02:27:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 02:30:00,2022-03-12 02:44:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 02:44:00,2022-03-12 02:57:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 03:00:00,2022-03-12 03:14:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 03:14:00,2022-03-12 03:27:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 03:30:00,2022-03-12 03:44:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 03:44:00,2022-03-12 03:57:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 04:00:00,2022-03-12 04:14:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 04:14:00,2022-03-12 04:27:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 04:30:00,2022-03-12 04:44:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 04:44:00,2022-03-12 04:57:00,Station-34,5302,3,4453548,CKB -LINE_17,Station-34,2022-03-12 05:00:00,2022-03-12 05:14:00,Station-36,4801,0,4453548,CKB -LINE_17,Station-36,2022-03-12 05:14:00,2022-03-12 05:27:00,Station-34,5302,0,4453548,CKB -LINE_17,Station-34,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,4453548,CKB -LINE_20,Station-0,2022-03-12 00:32:00,2022-03-12 00:32:00,Station-13,0.06,0,4747653,CKB -LINE_20,Station-13,2022-03-12 00:32:00,2022-03-12 00:44:00,Station-40,4212,3,4747653,CKB -LINE_20,Station-40,2022-03-12 00:47:00,2022-03-12 01:16:00,Station-41,13048,0,4747653,CKB -LINE_20,Station-41,2022-03-12 01:16:00,2022-03-12 01:42:00,Station-40,12869,5,4747653,CKB -LINE_20,Station-40,2022-03-12 01:47:00,2022-03-12 02:16:00,Station-41,13048,0,4747653,CKB -LINE_20,Station-41,2022-03-12 02:16:00,2022-03-12 02:42:00,Station-40,12869,5,4747653,CKB -LINE_20,Station-40,2022-03-12 02:47:00,2022-03-12 03:16:00,Station-41,13048,0,4747653,CKB -LINE_20,Station-41,2022-03-12 03:16:00,2022-03-12 03:42:00,Station-40,12869,5,4747653,CKB -LINE_20,Station-40,2022-03-12 03:47:00,2022-03-12 04:16:00,Station-41,13048,0,4747653,CKB -LINE_20,Station-41,2022-03-12 04:16:00,2022-03-12 04:42:00,Station-40,12869,5,4747653,CKB -LINE_20,Station-40,2022-03-12 04:47:00,2022-03-12 05:16:00,Station-41,13048,0,4747653,CKB -LINE_20,Station-41,2022-03-12 05:16:00,2022-03-12 05:34:00,Station-42,9538,0,4747653,CKB -LINE_20,Station-42,2022-03-12 05:34:00,2022-03-12 05:34:00,Station-0,0.06,0,4747653,CKB -LINE_20,Station-0,2022-03-12 00:17:00,2022-03-12 00:17:00,Station-40,0.06,0,4747663,CKB -LINE_20,Station-40,2022-03-12 00:17:00,2022-03-12 00:46:00,Station-41,13048,0,4747663,CKB -LINE_20,Station-41,2022-03-12 00:46:00,2022-03-12 01:12:00,Station-40,12869,5,4747663,CKB -LINE_20,Station-40,2022-03-12 01:17:00,2022-03-12 01:46:00,Station-41,13048,0,4747663,CKB -LINE_20,Station-41,2022-03-12 01:46:00,2022-03-12 02:12:00,Station-40,12869,5,4747663,CKB -LINE_20,Station-40,2022-03-12 02:17:00,2022-03-12 02:46:00,Station-41,13048,0,4747663,CKB -LINE_20,Station-41,2022-03-12 02:46:00,2022-03-12 03:12:00,Station-40,12869,5,4747663,CKB -LINE_20,Station-40,2022-03-12 03:17:00,2022-03-12 03:46:00,Station-41,13048,0,4747663,CKB -LINE_20,Station-41,2022-03-12 03:46:00,2022-03-12 04:12:00,Station-40,12869,5,4747663,CKB -LINE_20,Station-40,2022-03-12 04:17:00,2022-03-12 04:46:00,Station-41,13048,0,4747663,CKB -LINE_20,Station-41,2022-03-12 04:46:00,2022-03-12 05:12:00,Station-40,12869,0,4747663,CKB -LINE_20,Station-40,2022-03-12 05:12:00,2022-03-12 05:12:00,Station-0,0.06,0,4747663,CKB -LINE_21,Station-0,2022-03-12 00:49:00,2022-03-12 00:49:00,Station-3,0.06,0,4434344,CKB -LINE_21,Station-3,2022-03-12 00:49:00,2022-03-12 01:04:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 01:04:00,2022-03-12 01:19:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 01:19:00,2022-03-12 01:34:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 01:34:00,2022-03-12 01:49:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 01:49:00,2022-03-12 02:04:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 02:04:00,2022-03-12 02:19:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 02:19:00,2022-03-12 02:34:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 02:34:00,2022-03-12 02:49:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 02:49:00,2022-03-12 03:04:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 03:04:00,2022-03-12 03:19:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 03:19:00,2022-03-12 03:34:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 03:34:00,2022-03-12 03:49:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 03:49:00,2022-03-12 04:04:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 04:04:00,2022-03-12 04:19:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 04:19:00,2022-03-12 04:34:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 04:34:00,2022-03-12 04:49:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 04:49:00,2022-03-12 05:04:00,Station-16,10229,0,4434344,CKB -LINE_21,Station-16,2022-03-12 05:04:00,2022-03-12 05:19:00,Station-3,11801,0,4434344,CKB -LINE_21,Station-3,2022-03-12 05:19:00,2022-03-12 05:19:00,Station-0,0.06,0,4434344,CKB -LINE_23,Station-0,2022-03-12 02:34:00,2022-03-12 02:34:00,Station-45,0.06,0,4514364,CKB -LINE_23,Station-45,2022-03-12 02:34:00,2022-03-12 03:00:00,Station-46,9016,0,4514364,CKB -LINE_23,Station-46,2022-03-12 03:00:00,2022-03-12 03:27:00,Station-45,10083,7,4514364,CKB -LINE_23,Station-45,2022-03-12 03:34:00,2022-03-12 04:00:00,Station-46,9016,0,4514364,CKB -LINE_23,Station-46,2022-03-12 04:00:00,2022-03-12 04:27:00,Station-45,10083,7,4514364,CKB -LINE_23,Station-45,2022-03-12 04:34:00,2022-03-12 05:00:00,Station-46,9016,0,4514364,CKB -LINE_23,Station-46,2022-03-12 05:00:00,2022-03-12 05:27:00,Station-45,10083,0,4514364,CKB -LINE_23,Station-45,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,4514364,CKB -LINE_23,Station-0,2022-03-12 02:04:00,2022-03-12 02:04:00,Station-45,0.06,0,4619999,CKB -LINE_23,Station-45,2022-03-12 02:04:00,2022-03-12 02:30:00,Station-46,9016,0,4619999,CKB -LINE_23,Station-46,2022-03-12 02:30:00,2022-03-12 02:57:00,Station-45,10083,7,4619999,CKB -LINE_23,Station-45,2022-03-12 03:04:00,2022-03-12 03:30:00,Station-46,9016,0,4619999,CKB -LINE_23,Station-46,2022-03-12 03:30:00,2022-03-12 03:57:00,Station-45,10083,7,4619999,CKB -LINE_23,Station-45,2022-03-12 04:04:00,2022-03-12 04:30:00,Station-46,9016,0,4619999,CKB -LINE_23,Station-46,2022-03-12 04:30:00,2022-03-12 04:57:00,Station-45,10083,7,4619999,CKB -LINE_23,Station-45,2022-03-12 05:04:00,2022-03-12 05:30:00,Station-46,9016,0,4619999,CKB -LINE_23,Station-46,2022-03-12 05:30:00,2022-03-12 05:30:00,Station-0,0.06,0,4619999,CKB -LINE_24,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,4374747,CKB -LINE_24,Station-21,2022-03-12 00:31:00,2022-03-12 00:44:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 00:44:00,2022-03-12 00:56:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 01:01:00,2022-03-12 01:14:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 01:14:00,2022-03-12 01:26:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 01:31:00,2022-03-12 01:44:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 01:44:00,2022-03-12 01:56:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 02:01:00,2022-03-12 02:14:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 02:14:00,2022-03-12 02:26:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 02:31:00,2022-03-12 02:44:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 02:44:00,2022-03-12 02:56:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 03:01:00,2022-03-12 03:14:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 03:14:00,2022-03-12 03:26:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 03:31:00,2022-03-12 03:44:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 03:44:00,2022-03-12 03:56:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 04:01:00,2022-03-12 04:14:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 04:14:00,2022-03-12 04:26:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 04:31:00,2022-03-12 04:44:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 04:44:00,2022-03-12 04:56:00,Station-21,5362,5,4374747,CKB -LINE_24,Station-21,2022-03-12 05:01:00,2022-03-12 05:14:00,Station-47,4872,0,4374747,CKB -LINE_24,Station-47,2022-03-12 05:14:00,2022-03-12 05:26:00,Station-21,5362,0,4374747,CKB -LINE_24,Station-21,2022-03-12 05:26:00,2022-03-12 05:26:00,Station-0,0.06,0,4374747,CKB -LINE_25,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,4374870,CKB -LINE_25,Station-21,2022-03-12 00:31:00,2022-03-12 00:45:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 00:47:00,2022-03-12 01:01:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 01:01:00,2022-03-12 01:15:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 01:17:00,2022-03-12 01:31:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 01:31:00,2022-03-12 01:45:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 01:47:00,2022-03-12 02:01:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 02:01:00,2022-03-12 02:15:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 02:17:00,2022-03-12 02:31:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 02:31:00,2022-03-12 02:45:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 02:47:00,2022-03-12 03:01:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 03:01:00,2022-03-12 03:15:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 03:17:00,2022-03-12 03:31:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 03:31:00,2022-03-12 03:45:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 03:47:00,2022-03-12 04:01:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 04:01:00,2022-03-12 04:15:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 04:17:00,2022-03-12 04:31:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 04:31:00,2022-03-12 04:45:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 04:47:00,2022-03-12 05:01:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 05:01:00,2022-03-12 05:15:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 05:17:00,2022-03-12 05:31:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 05:31:00,2022-03-12 05:45:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 05:47:00,2022-03-12 06:01:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 06:01:00,2022-03-12 06:15:00,Station-48,5225,2,4374870,CKB -LINE_25,Station-48,2022-03-12 06:17:00,2022-03-12 06:31:00,Station-21,7617,0,4374870,CKB -LINE_25,Station-21,2022-03-12 06:31:00,2022-03-12 06:45:00,Station-48,5096,0,4374870,CKB -LINE_25,Station-48,2022-03-12 06:45:00,2022-03-12 06:45:00,Station-0,0.06,0,4374870,CKB -LINE_26,Station-0,2022-03-12 00:43:00,2022-03-12 00:43:00,Station-49,0.06,0,4375016,CKB -LINE_26,Station-49,2022-03-12 00:43:00,2022-03-12 00:53:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 00:53:00,2022-03-12 01:03:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 01:13:00,2022-03-12 01:23:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 01:23:00,2022-03-12 01:33:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 01:43:00,2022-03-12 01:53:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 01:53:00,2022-03-12 02:03:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 02:13:00,2022-03-12 02:23:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 02:23:00,2022-03-12 02:33:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 02:43:00,2022-03-12 02:53:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 02:53:00,2022-03-12 03:03:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 03:13:00,2022-03-12 03:23:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 03:23:00,2022-03-12 03:33:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 03:43:00,2022-03-12 03:53:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 03:53:00,2022-03-12 04:03:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 04:13:00,2022-03-12 04:23:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 04:23:00,2022-03-12 04:33:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 04:43:00,2022-03-12 04:53:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 04:53:00,2022-03-12 05:03:00,Station-49,4408,10,4375016,CKB -LINE_26,Station-49,2022-03-12 05:13:00,2022-03-12 05:23:00,Station-50,4507,0,4375016,CKB -LINE_26,Station-50,2022-03-12 05:23:00,2022-03-12 05:23:00,Station-0,0.06,0,4375016,CKB -LINE_0,Station-0,2022-03-12 20:51:00,2022-03-12 20:51:00,Station-1,0.06,0,4454966,CKB -LINE_0,Station-1,2022-03-12 20:51:00,2022-03-12 21:24:00,Station-2,14519,4,4454966,CKB -LINE_0,Station-2,2022-03-12 21:28:00,2022-03-12 22:03:00,Station-1,13541,8,4454966,CKB -LINE_0,Station-1,2022-03-12 22:11:00,2022-03-12 22:44:00,Station-2,14519,4,4454966,CKB -LINE_0,Station-2,2022-03-12 22:48:00,2022-03-12 23:23:00,Station-1,13541,8,4454966,CKB -LINE_0,Station-1,2022-03-12 23:31:00,2022-03-13 00:04:00,Station-2,14519,4,4454966,CKB -LINE_0,Station-2,2022-03-13 00:08:00,2022-03-13 00:39:00,Station-5,12213,0,4454966,CKB -LINE_1,Station-5,2022-03-13 00:39:00,2022-03-13 00:47:00,Station-3,4.0,2,4454966,CKB -LINE_1,Station-3,2022-03-13 00:49:00,2022-03-13 01:12:00,Station-4,8.36,6,4454966,CKB -LINE_1,Station-4,2022-03-13 01:18:00,2022-03-13 01:36:00,Station-3,9067,13,4454966,CKB -LINE_1,Station-3,2022-03-13 01:49:00,2022-03-13 02:12:00,Station-4,8.36,6,4454966,CKB -LINE_1,Station-4,2022-03-13 02:18:00,2022-03-13 02:36:00,Station-3,9067,13,4454966,CKB -LINE_1,Station-3,2022-03-13 02:49:00,2022-03-13 03:12:00,Station-4,8.36,6,4454966,CKB -LINE_1,Station-4,2022-03-13 03:18:00,2022-03-13 03:36:00,Station-3,9067,13,4454966,CKB -LINE_1,Station-3,2022-03-13 03:49:00,2022-03-13 04:12:00,Station-4,8.36,6,4454966,CKB -LINE_1,Station-4,2022-03-13 04:18:00,2022-03-13 04:36:00,Station-3,9067,13,4454966,CKB -LINE_1,Station-3,2022-03-13 04:49:00,2022-03-13 05:12:00,Station-4,8.36,6,4454966,CKB -LINE_1,Station-4,2022-03-13 05:18:00,2022-03-13 05:36:00,Station-3,9067,13,4454966,CKB -LINE_1,Station-3,2022-03-13 05:49:00,2022-03-13 06:08:00,Station-4,8762,10,4454966,CKB -LINE_1,Station-4,2022-03-13 06:18:00,2022-03-13 06:36:00,Station-3,9067,13,4454966,CKB -LINE_1,Station-3,2022-03-13 06:49:00,2022-03-13 07:08:00,Station-4,8762,0,4454966,CKB -LINE_1,Station-4,2022-03-13 07:08:00,2022-03-13 07:08:00,Station-0,0.06,0,4454966,CKB -LINE_0,Station-0,2022-03-12 21:31:00,2022-03-12 21:31:00,Station-1,0.06,0,4454967,CKB -LINE_0,Station-1,2022-03-12 21:31:00,2022-03-12 22:04:00,Station-2,14519,4,4454967,CKB -LINE_0,Station-2,2022-03-12 22:08:00,2022-03-12 22:43:00,Station-1,13541,8,4454967,CKB -LINE_0,Station-1,2022-03-12 22:51:00,2022-03-12 23:24:00,Station-2,14519,4,4454967,CKB -LINE_0,Station-2,2022-03-12 23:28:00,2022-03-13 00:03:00,Station-1,13541,8,4454967,CKB -LINE_0,Station-1,2022-03-13 00:11:00,2022-03-13 00:44:00,Station-2,14519,0,4454967,CKB -LINE_1,Station-2,2022-03-13 00:44:00,2022-03-13 00:54:00,Station-3,4.1,25,4454967,CKB -LINE_1,Station-3,2022-03-13 01:19:00,2022-03-13 01:42:00,Station-4,8.36,6,4454967,CKB -LINE_1,Station-4,2022-03-13 01:48:00,2022-03-13 02:06:00,Station-3,9067,13,4454967,CKB -LINE_1,Station-3,2022-03-13 02:19:00,2022-03-13 02:42:00,Station-4,8.36,6,4454967,CKB -LINE_1,Station-4,2022-03-13 02:48:00,2022-03-13 03:06:00,Station-3,9067,13,4454967,CKB -LINE_1,Station-3,2022-03-13 03:19:00,2022-03-13 03:42:00,Station-4,8.36,6,4454967,CKB -LINE_1,Station-4,2022-03-13 03:48:00,2022-03-13 04:06:00,Station-3,9067,13,4454967,CKB -LINE_1,Station-3,2022-03-13 04:19:00,2022-03-13 04:42:00,Station-4,8.36,6,4454967,CKB -LINE_1,Station-4,2022-03-13 04:48:00,2022-03-13 05:06:00,Station-3,9067,13,4454967,CKB -LINE_1,Station-3,2022-03-13 05:19:00,2022-03-13 05:42:00,Station-4,8.36,6,4454967,CKB -LINE_1,Station-4,2022-03-13 05:48:00,2022-03-13 06:06:00,Station-3,9067,0,4454967,CKB -LINE_1,Station-3,2022-03-13 06:06:00,2022-03-13 06:06:00,Station-0,0.06,0,4454967,CKB -LINE_2,Station-0,2022-03-12 21:06:00,2022-03-12 21:06:00,Station-6,0.06,0,4664765,CKB -LINE_2,Station-6,2022-03-12 21:06:00,2022-03-12 21:34:00,Station-7,13018,19,4664765,CKB -LINE_2,Station-7,2022-03-12 21:53:00,2022-03-12 22:13:00,Station-8,10332,17,4664765,CKB -LINE_2,Station-8,2022-03-12 22:30:00,2022-03-12 22:54:00,Station-7,10.48,19,4664765,CKB -LINE_2,Station-7,2022-03-12 23:13:00,2022-03-12 23:33:00,Station-8,10332,17,4664765,CKB -LINE_2,Station-8,2022-03-12 23:50:00,2022-03-13 00:14:00,Station-7,10.48,8,4664765,CKB -LINE_2,Station-7,2022-03-13 00:22:00,2022-03-13 00:27:00,Station-58,2533,2,4664765,CKB -LINE_3,Station-58,2022-03-13 00:29:00,2022-03-13 00:47:00,Station-10,7.58,0,4664765,CKB -LINE_3,Station-10,2022-03-13 00:47:00,2022-03-13 01:14:00,Station-11,12841,3,4664765,CKB -LINE_3,Station-11,2022-03-13 01:17:00,2022-03-13 01:47:00,Station-10,14281,0,4664765,CKB -LINE_3,Station-10,2022-03-13 01:47:00,2022-03-13 02:14:00,Station-11,12841,3,4664765,CKB -LINE_3,Station-11,2022-03-13 02:17:00,2022-03-13 02:47:00,Station-10,14281,0,4664765,CKB -LINE_3,Station-10,2022-03-13 02:47:00,2022-03-13 03:14:00,Station-11,12841,3,4664765,CKB -LINE_3,Station-11,2022-03-13 03:17:00,2022-03-13 03:47:00,Station-10,14281,0,4664765,CKB -LINE_3,Station-10,2022-03-13 03:47:00,2022-03-13 04:14:00,Station-11,12841,3,4664765,CKB -LINE_3,Station-11,2022-03-13 04:17:00,2022-03-13 04:47:00,Station-10,14281,0,4664765,CKB -LINE_3,Station-10,2022-03-13 04:47:00,2022-03-13 05:14:00,Station-11,12841,3,4664765,CKB -LINE_3,Station-11,2022-03-13 05:17:00,2022-03-13 05:47:00,Station-10,14281,0,4664765,CKB -LINE_3,Station-10,2022-03-13 05:47:00,2022-03-13 06:14:00,Station-11,12841,3,4664765,CKB -LINE_3,Station-11,2022-03-13 06:17:00,2022-03-13 06:47:00,Station-10,14281,0,4664765,CKB -LINE_3,Station-10,2022-03-13 06:47:00,2022-03-13 06:59:00,Station-58,5474,0,4664765,CKB -LINE_3,Station-58,2022-03-13 06:59:00,2022-03-13 06:59:00,Station-0,0.06,0,4664765,CKB -LINE_2,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-6,0.06,0,4762771,CKB -LINE_2,Station-6,2022-03-12 20:26:00,2022-03-12 20:56:00,Station-12,14097,14,4762771,CKB -LINE_2,Station-12,2022-03-12 21:10:00,2022-03-12 21:38:00,Station-6,13.19,8,4762771,CKB -LINE_2,Station-6,2022-03-12 21:46:00,2022-03-12 22:14:00,Station-7,13018,19,4762771,CKB -LINE_2,Station-7,2022-03-12 22:33:00,2022-03-12 22:53:00,Station-8,10332,17,4762771,CKB -LINE_2,Station-8,2022-03-12 23:10:00,2022-03-12 23:34:00,Station-7,10.48,19,4762771,CKB -LINE_2,Station-7,2022-03-12 23:53:00,2022-03-13 00:13:00,Station-8,10332,2,4762771,CKB -LINE_2,Station-8,2022-03-13 00:15:00,2022-03-13 00:16:00,Station-10,506,1,4762771,CKB -LINE_3,Station-10,2022-03-13 00:17:00,2022-03-13 00:44:00,Station-11,12841,3,4762771,CKB -LINE_3,Station-11,2022-03-13 00:47:00,2022-03-13 01:17:00,Station-10,14281,0,4762771,CKB -LINE_3,Station-10,2022-03-13 01:17:00,2022-03-13 01:44:00,Station-11,12841,3,4762771,CKB -LINE_3,Station-11,2022-03-13 01:47:00,2022-03-13 02:17:00,Station-10,14281,0,4762771,CKB -LINE_3,Station-10,2022-03-13 02:17:00,2022-03-13 02:44:00,Station-11,12841,3,4762771,CKB -LINE_3,Station-11,2022-03-13 02:47:00,2022-03-13 03:17:00,Station-10,14281,0,4762771,CKB -LINE_3,Station-10,2022-03-13 03:17:00,2022-03-13 03:44:00,Station-11,12841,3,4762771,CKB -LINE_3,Station-11,2022-03-13 03:47:00,2022-03-13 04:17:00,Station-10,14281,0,4762771,CKB -LINE_3,Station-10,2022-03-13 04:17:00,2022-03-13 04:44:00,Station-11,12841,3,4762771,CKB -LINE_3,Station-11,2022-03-13 04:47:00,2022-03-13 05:17:00,Station-10,14281,0,4762771,CKB -LINE_3,Station-10,2022-03-13 05:17:00,2022-03-13 05:44:00,Station-11,12841,3,4762771,CKB -LINE_3,Station-11,2022-03-13 05:47:00,2022-03-13 06:17:00,Station-10,14281,0,4762771,CKB -LINE_3,Station-10,2022-03-13 06:17:00,2022-03-13 06:44:00,Station-11,12841,3,4762771,CKB -LINE_3,Station-11,2022-03-13 06:47:00,2022-03-13 07:17:00,Station-10,14281,0,4762771,CKB -LINE_3,Station-10,2022-03-13 07:17:00,2022-03-13 07:17:00,Station-0,0.06,0,4762771,CKB -LINE_5,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-14,0.06,0,4617438,CKB -LINE_5,Station-14,2022-03-12 20:26:00,2022-03-12 20:38:00,Station-15,5882,3,4617438,CKB -LINE_5,Station-15,2022-03-12 20:41:00,2022-03-12 20:55:00,Station-14,6232,0,4617438,CKB -LINE_5,Station-14,2022-03-12 20:55:00,2022-03-12 21:08:00,Station-15,6086,3,4617438,CKB -LINE_5,Station-15,2022-03-12 21:11:00,2022-03-12 21:25:00,Station-14,6232,0,4617438,CKB -LINE_5,Station-14,2022-03-12 21:25:00,2022-03-12 21:38:00,Station-15,6086,3,4617438,CKB -LINE_5,Station-15,2022-03-12 21:41:00,2022-03-12 21:55:00,Station-14,6232,0,4617438,CKB -LINE_5,Station-14,2022-03-12 21:55:00,2022-03-12 22:08:00,Station-15,6086,3,4617438,CKB -LINE_5,Station-15,2022-03-12 22:11:00,2022-03-12 22:25:00,Station-14,6232,0,4617438,CKB -LINE_5,Station-14,2022-03-12 22:25:00,2022-03-12 22:38:00,Station-15,6086,3,4617438,CKB -LINE_5,Station-15,2022-03-12 22:41:00,2022-03-12 22:55:00,Station-14,6232,0,4617438,CKB -LINE_5,Station-14,2022-03-12 22:55:00,2022-03-12 23:08:00,Station-15,6086,3,4617438,CKB -LINE_5,Station-15,2022-03-12 23:11:00,2022-03-12 23:25:00,Station-14,6232,0,4617438,CKB -LINE_5,Station-14,2022-03-12 23:25:00,2022-03-12 23:38:00,Station-15,6086,3,4617438,CKB -LINE_5,Station-15,2022-03-12 23:41:00,2022-03-12 23:55:00,Station-14,6232,0,4617438,CKB -LINE_5,Station-14,2022-03-12 23:55:00,2022-03-13 00:08:00,Station-15,6086,0,4617438,CKB -LINE_5,Station-15,2022-03-13 00:08:00,2022-03-13 00:08:00,Station-0,0.06,0,4617438,CKB -LINE_6,Station-0,2022-03-12 05:25:00,2022-03-12 05:25:00,Station-16,0.06,0,4426894,CKB -LINE_6,Station-16,2022-03-12 05:25:00,2022-03-12 05:34:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 05:34:00,2022-03-12 05:43:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 06:05:00,2022-03-12 06:14:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 06:14:00,2022-03-12 06:23:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 06:25:00,2022-03-12 06:34:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 06:34:00,2022-03-12 06:43:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 06:45:00,2022-03-12 06:54:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 06:54:00,2022-03-12 07:03:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 07:05:00,2022-03-12 07:14:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 07:14:00,2022-03-12 07:23:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 07:25:00,2022-03-12 07:34:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 07:34:00,2022-03-12 07:43:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 08:05:00,2022-03-12 08:14:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 08:14:00,2022-03-12 08:23:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 08:25:00,2022-03-12 08:34:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 08:34:00,2022-03-12 08:43:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 08:45:00,2022-03-12 08:54:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 08:54:00,2022-03-12 09:03:00,Station-16,5139,3,4426894,CKB -LINE_6,Station-16,2022-03-12 09:06:00,2022-03-12 09:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 09:15:00,2022-03-12 09:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 09:26:00,2022-03-12 09:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 09:35:00,2022-03-12 09:44:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 10:06:00,2022-03-12 10:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 10:15:00,2022-03-12 10:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 10:26:00,2022-03-12 10:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 10:35:00,2022-03-12 10:44:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 10:46:00,2022-03-12 10:55:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 10:55:00,2022-03-12 11:04:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 11:06:00,2022-03-12 11:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 11:15:00,2022-03-12 11:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 11:26:00,2022-03-12 11:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 11:35:00,2022-03-12 11:44:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 12:06:00,2022-03-12 12:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 12:15:00,2022-03-12 12:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 12:26:00,2022-03-12 12:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 12:35:00,2022-03-12 12:44:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 12:46:00,2022-03-12 12:55:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 12:55:00,2022-03-12 13:04:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 13:06:00,2022-03-12 13:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 13:15:00,2022-03-12 13:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 13:26:00,2022-03-12 13:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 13:35:00,2022-03-12 13:44:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 14:06:00,2022-03-12 14:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 14:15:00,2022-03-12 14:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 14:26:00,2022-03-12 14:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 14:35:00,2022-03-12 14:44:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 14:46:00,2022-03-12 14:55:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 14:55:00,2022-03-12 15:04:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 15:06:00,2022-03-12 15:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 15:15:00,2022-03-12 15:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 15:26:00,2022-03-12 15:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 15:35:00,2022-03-12 15:44:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 16:06:00,2022-03-12 16:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 16:15:00,2022-03-12 16:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 16:26:00,2022-03-12 16:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 16:35:00,2022-03-12 16:44:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 16:46:00,2022-03-12 16:55:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 16:55:00,2022-03-12 17:04:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 17:06:00,2022-03-12 17:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 17:15:00,2022-03-12 17:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 17:26:00,2022-03-12 17:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 17:35:00,2022-03-12 17:44:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 18:06:00,2022-03-12 18:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 18:15:00,2022-03-12 18:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 18:26:00,2022-03-12 18:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 18:35:00,2022-03-12 18:44:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 18:46:00,2022-03-12 18:55:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 18:55:00,2022-03-12 19:04:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 19:06:00,2022-03-12 19:15:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 19:15:00,2022-03-12 19:24:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 19:26:00,2022-03-12 19:35:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 19:35:00,2022-03-12 19:44:00,Station-16,5139,21,4426894,CKB -LINE_6,Station-16,2022-03-12 20:05:00,2022-03-12 20:14:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 20:14:00,2022-03-12 20:23:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 20:25:00,2022-03-12 20:34:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 20:34:00,2022-03-12 20:43:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 20:45:00,2022-03-12 20:54:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 20:54:00,2022-03-12 21:03:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 21:05:00,2022-03-12 21:14:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 21:14:00,2022-03-12 21:23:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 21:25:00,2022-03-12 21:34:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 21:34:00,2022-03-12 21:43:00,Station-16,5139,22,4426894,CKB -LINE_6,Station-16,2022-03-12 22:05:00,2022-03-12 22:14:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 22:14:00,2022-03-12 22:23:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 22:25:00,2022-03-12 22:34:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 22:34:00,2022-03-12 22:43:00,Station-16,5139,2,4426894,CKB -LINE_6,Station-16,2022-03-12 22:45:00,2022-03-12 22:54:00,Station-17,4781,0,4426894,CKB -LINE_6,Station-17,2022-03-12 22:54:00,2022-03-12 23:03:00,Station-16,5139,0,4426894,CKB -LINE_6,Station-16,2022-03-12 23:03:00,2022-03-12 23:03:00,Station-0,0.06,0,4426894,CKB -LINE_29,Station-0,2022-03-12 07:30:00,2022-03-12 07:30:00,Station-53,0.06,0,4369705,CKB -LINE_29,Station-53,2022-03-12 07:30:00,2022-03-12 07:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 07:39:00,2022-03-12 07:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 07:50:00,2022-03-12 07:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 07:59:00,2022-03-12 08:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 08:10:00,2022-03-12 08:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 08:19:00,2022-03-12 08:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 08:30:00,2022-03-12 08:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 08:39:00,2022-03-12 08:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 08:50:00,2022-03-12 08:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 08:59:00,2022-03-12 09:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 09:10:00,2022-03-12 09:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 09:19:00,2022-03-12 09:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 09:30:00,2022-03-12 09:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 09:39:00,2022-03-12 09:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 09:50:00,2022-03-12 09:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 09:59:00,2022-03-12 10:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 10:10:00,2022-03-12 10:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 10:19:00,2022-03-12 10:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 10:30:00,2022-03-12 10:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 10:39:00,2022-03-12 10:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 10:50:00,2022-03-12 10:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 10:59:00,2022-03-12 11:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 11:10:00,2022-03-12 11:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 11:19:00,2022-03-12 11:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 11:30:00,2022-03-12 11:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 11:39:00,2022-03-12 11:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 11:50:00,2022-03-12 11:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 11:59:00,2022-03-12 12:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 12:10:00,2022-03-12 12:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 12:19:00,2022-03-12 12:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 12:30:00,2022-03-12 12:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 12:39:00,2022-03-12 12:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 12:50:00,2022-03-12 12:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 12:59:00,2022-03-12 13:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 13:10:00,2022-03-12 13:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 13:19:00,2022-03-12 13:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 13:30:00,2022-03-12 13:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 13:39:00,2022-03-12 13:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 13:50:00,2022-03-12 13:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 13:59:00,2022-03-12 14:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 14:10:00,2022-03-12 14:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 14:19:00,2022-03-12 14:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 14:30:00,2022-03-12 14:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 14:39:00,2022-03-12 14:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 14:50:00,2022-03-12 14:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 14:59:00,2022-03-12 15:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 15:10:00,2022-03-12 15:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 15:19:00,2022-03-12 15:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 15:30:00,2022-03-12 15:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 15:39:00,2022-03-12 15:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 15:50:00,2022-03-12 15:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 15:59:00,2022-03-12 16:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 16:10:00,2022-03-12 16:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 16:19:00,2022-03-12 16:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 16:30:00,2022-03-12 16:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 16:39:00,2022-03-12 16:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 16:50:00,2022-03-12 16:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 16:59:00,2022-03-12 17:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 17:10:00,2022-03-12 17:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 17:19:00,2022-03-12 17:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 17:30:00,2022-03-12 17:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 17:39:00,2022-03-12 17:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 17:50:00,2022-03-12 17:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 17:59:00,2022-03-12 18:10:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 18:10:00,2022-03-12 18:15:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 18:19:00,2022-03-12 18:30:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 18:30:00,2022-03-12 18:35:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 18:39:00,2022-03-12 18:50:00,Station-53,4341,0,4369705,CKB -LINE_29,Station-53,2022-03-12 18:50:00,2022-03-12 18:55:00,Station-54,2217,4,4369705,CKB -LINE_29,Station-54,2022-03-12 18:59:00,2022-03-12 19:10:00,Station-53,4288,0,4369705,CKB -LINE_29,Station-53,2022-03-12 19:10:00,2022-03-12 19:10:00,Station-0,0.06,0,4369705,CKB -LINE_9,Station-22,2022-03-12 08:08:00,2022-03-12 08:41:00,Station-23,17.9,0,4317640,VDL -LINE_9,Station-23,2022-03-12 08:41:00,2022-03-12 08:54:00,Station-23,4637,9,4317640,VDL -LINE_9,Station-23,2022-03-12 09:03:00,2022-03-12 09:17:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 09:21:00,2022-03-12 09:35:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 09:43:00,2022-03-12 09:57:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 10:01:00,2022-03-12 10:15:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 10:23:00,2022-03-12 10:37:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 10:41:00,2022-03-12 10:55:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 11:03:00,2022-03-12 11:17:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 11:21:00,2022-03-12 11:35:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 11:43:00,2022-03-12 11:57:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 12:01:00,2022-03-12 12:15:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 12:23:00,2022-03-12 12:37:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 12:41:00,2022-03-12 12:55:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 13:03:00,2022-03-12 13:17:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 13:21:00,2022-03-12 13:35:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 13:43:00,2022-03-12 13:57:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 14:01:00,2022-03-12 14:15:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 14:23:00,2022-03-12 14:37:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 14:41:00,2022-03-12 14:55:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 15:03:00,2022-03-12 15:17:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 15:21:00,2022-03-12 15:35:00,Station-23,4637,8,4317640,VDL -LINE_9,Station-23,2022-03-12 15:43:00,2022-03-12 15:57:00,Station-23,4637,4,4317640,VDL -LINE_9,Station-23,2022-03-12 16:01:00,2022-03-12 16:14:00,Station-23,4637,0,4317640,VDL -LINE_9,Station-23,2022-03-12 16:14:00,2022-03-12 16:57:00,Station-22,19.8,0,4317640,VDL -LINE_30,Station-0,2022-03-12 07:18:00,2022-03-12 07:18:00,Station-55,0.06,0,4706426,CKB -LINE_30,Station-55,2022-03-12 07:18:00,2022-03-12 07:26:00,Station-56,5562,10,4706426,CKB -LINE_30,Station-56,2022-03-12 07:36:00,2022-03-12 07:45:00,Station-57,5941,32,4706426,CKB -LINE_30,Station-57,2022-03-12 08:17:00,2022-03-12 08:26:00,Station-56,5994,8,4706426,CKB -LINE_30,Station-56,2022-03-12 08:34:00,2022-03-12 08:42:00,Station-55,5566,0,4706426,CKB -LINE_30,Station-55,2022-03-12 08:42:00,2022-03-12 08:42:00,Station-0,0.06,0,4706426,CKB -LINE_12,Station-0,2022-03-12 08:10:00,2022-03-12 08:10:00,Station-27,0.06,0,4731254,CKB -LINE_12,Station-27,2022-03-12 08:10:00,2022-03-12 08:16:00,Station-28,2169,12,4731254,CKB -LINE_12,Station-28,2022-03-12 08:28:00,2022-03-12 08:38:00,Station-27,2952,2,4731254,CKB -LINE_12,Station-27,2022-03-12 08:40:00,2022-03-12 08:46:00,Station-28,2169,12,4731254,CKB -LINE_12,Station-28,2022-03-12 08:58:00,2022-03-12 09:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 09:10:00,2022-03-12 09:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 09:28:00,2022-03-12 09:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 09:40:00,2022-03-12 09:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 09:58:00,2022-03-12 10:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 10:10:00,2022-03-12 10:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 10:28:00,2022-03-12 10:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 10:40:00,2022-03-12 10:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 10:58:00,2022-03-12 11:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 11:10:00,2022-03-12 11:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 11:28:00,2022-03-12 11:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 11:40:00,2022-03-12 11:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 11:58:00,2022-03-12 12:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 12:10:00,2022-03-12 12:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 12:28:00,2022-03-12 12:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 12:40:00,2022-03-12 12:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 12:58:00,2022-03-12 13:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 13:10:00,2022-03-12 13:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 13:28:00,2022-03-12 13:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 13:40:00,2022-03-12 13:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 13:58:00,2022-03-12 14:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 14:10:00,2022-03-12 14:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 14:28:00,2022-03-12 14:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 14:40:00,2022-03-12 14:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 14:58:00,2022-03-12 15:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 15:10:00,2022-03-12 15:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 15:28:00,2022-03-12 15:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 15:40:00,2022-03-12 15:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 15:58:00,2022-03-12 16:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 16:10:00,2022-03-12 16:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 16:28:00,2022-03-12 16:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 16:40:00,2022-03-12 16:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 16:58:00,2022-03-12 17:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 17:10:00,2022-03-12 17:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 17:28:00,2022-03-12 17:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 17:40:00,2022-03-12 17:48:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 17:58:00,2022-03-12 18:10:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 18:10:00,2022-03-12 18:18:00,Station-28,2169,10,4731254,CKB -LINE_12,Station-28,2022-03-12 18:28:00,2022-03-12 18:40:00,Station-27,2952,0,4731254,CKB -LINE_12,Station-27,2022-03-12 18:40:00,2022-03-12 18:48:00,Station-28,2169,0,4731254,CKB -LINE_12,Station-28,2022-03-12 18:48:00,2022-03-12 18:48:00,Station-0,0.06,0,4731254,CKB -LINE_13,Station-0,2022-03-13 00:23:00,2022-03-13 00:23:00,Station-29,0.06,0,4317771,CKB -LINE_13,Station-29,2022-03-13 00:23:00,2022-03-13 00:30:00,Station-30,2577,9,4317771,CKB -LINE_14,Station-30,2022-03-13 00:39:00,2022-03-13 00:54:00,Station-31,5937,9,4317771,CKB -LINE_14,Station-31,2022-03-13 01:03:00,2022-03-13 01:17:00,Station-30,6.19,0,4317771,CKB -LINE_13,Station-30,2022-03-13 01:17:00,2022-03-13 01:23:00,Station-29,2555,0,4317771,CKB -LINE_13,Station-29,2022-03-13 01:23:00,2022-03-13 01:30:00,Station-30,2577,9,4317771,CKB -LINE_14,Station-30,2022-03-13 01:39:00,2022-03-13 01:54:00,Station-31,5937,9,4317771,CKB -LINE_14,Station-31,2022-03-13 02:03:00,2022-03-13 02:17:00,Station-30,6.19,0,4317771,CKB -LINE_13,Station-30,2022-03-13 02:17:00,2022-03-13 02:23:00,Station-29,2555,0,4317771,CKB -LINE_13,Station-29,2022-03-13 02:23:00,2022-03-13 02:30:00,Station-30,2577,9,4317771,CKB -LINE_14,Station-30,2022-03-13 02:39:00,2022-03-13 02:54:00,Station-31,5937,9,4317771,CKB -LINE_14,Station-31,2022-03-13 03:03:00,2022-03-13 03:17:00,Station-30,6.19,0,4317771,CKB -LINE_13,Station-30,2022-03-13 03:17:00,2022-03-13 03:23:00,Station-29,2555,0,4317771,CKB -LINE_13,Station-29,2022-03-13 03:23:00,2022-03-13 03:30:00,Station-30,2577,9,4317771,CKB -LINE_14,Station-30,2022-03-13 03:39:00,2022-03-13 03:54:00,Station-31,5937,9,4317771,CKB -LINE_14,Station-31,2022-03-13 04:03:00,2022-03-13 04:17:00,Station-30,6.19,0,4317771,CKB -LINE_13,Station-30,2022-03-13 04:17:00,2022-03-13 04:23:00,Station-29,2555,0,4317771,CKB -LINE_13,Station-29,2022-03-13 04:23:00,2022-03-13 04:30:00,Station-30,2577,9,4317771,CKB -LINE_14,Station-30,2022-03-13 04:39:00,2022-03-13 04:54:00,Station-31,5937,9,4317771,CKB -LINE_14,Station-31,2022-03-13 05:03:00,2022-03-13 05:17:00,Station-30,6.19,0,4317771,CKB -LINE_13,Station-30,2022-03-13 05:17:00,2022-03-13 05:23:00,Station-29,2555,0,4317771,CKB -LINE_13,Station-29,2022-03-13 05:23:00,2022-03-13 05:30:00,Station-30,2577,9,4317771,CKB -LINE_14,Station-30,2022-03-13 05:39:00,2022-03-13 05:54:00,Station-31,5937,9,4317771,CKB -LINE_14,Station-31,2022-03-13 06:03:00,2022-03-13 06:17:00,Station-30,6.19,0,4317771,CKB -LINE_13,Station-30,2022-03-13 06:17:00,2022-03-13 06:23:00,Station-29,2555,0,4317771,CKB -LINE_13,Station-29,2022-03-13 06:23:00,2022-03-13 06:30:00,Station-30,2577,9,4317771,CKB -LINE_14,Station-30,2022-03-13 06:39:00,2022-03-13 06:54:00,Station-31,5937,0,4317771,CKB -LINE_14,Station-31,2022-03-13 06:54:00,2022-03-13 06:54:00,Station-0,0.06,0,4317771,CKB -LINE_14,Station-0,2022-03-13 00:33:00,2022-03-13 00:33:00,Station-31,0.06,0,4317937,CKB -LINE_14,Station-31,2022-03-13 00:33:00,2022-03-13 00:47:00,Station-30,6.19,0,4317937,CKB -LINE_13,Station-30,2022-03-13 00:47:00,2022-03-13 00:53:00,Station-29,2555,0,4317937,CKB -LINE_13,Station-29,2022-03-13 00:53:00,2022-03-13 01:00:00,Station-30,2577,9,4317937,CKB -LINE_14,Station-30,2022-03-13 01:09:00,2022-03-13 01:24:00,Station-31,5937,9,4317937,CKB -LINE_14,Station-31,2022-03-13 01:33:00,2022-03-13 01:47:00,Station-30,6.19,0,4317937,CKB -LINE_13,Station-30,2022-03-13 01:47:00,2022-03-13 01:53:00,Station-29,2555,0,4317937,CKB -LINE_13,Station-29,2022-03-13 01:53:00,2022-03-13 02:00:00,Station-30,2577,9,4317937,CKB -LINE_14,Station-30,2022-03-13 02:09:00,2022-03-13 02:24:00,Station-31,5937,9,4317937,CKB -LINE_14,Station-31,2022-03-13 02:33:00,2022-03-13 02:47:00,Station-30,6.19,0,4317937,CKB -LINE_13,Station-30,2022-03-13 02:47:00,2022-03-13 02:53:00,Station-29,2555,0,4317937,CKB -LINE_13,Station-29,2022-03-13 02:53:00,2022-03-13 03:00:00,Station-30,2577,9,4317937,CKB -LINE_14,Station-30,2022-03-13 03:09:00,2022-03-13 03:24:00,Station-31,5937,9,4317937,CKB -LINE_14,Station-31,2022-03-13 03:33:00,2022-03-13 03:47:00,Station-30,6.19,0,4317937,CKB -LINE_13,Station-30,2022-03-13 03:47:00,2022-03-13 03:53:00,Station-29,2555,0,4317937,CKB -LINE_13,Station-29,2022-03-13 03:53:00,2022-03-13 04:00:00,Station-30,2577,9,4317937,CKB -LINE_14,Station-30,2022-03-13 04:09:00,2022-03-13 04:24:00,Station-31,5937,9,4317937,CKB -LINE_14,Station-31,2022-03-13 04:33:00,2022-03-13 04:47:00,Station-30,6.19,0,4317937,CKB -LINE_13,Station-30,2022-03-13 04:47:00,2022-03-13 04:53:00,Station-29,2555,0,4317937,CKB -LINE_13,Station-29,2022-03-13 04:53:00,2022-03-13 05:00:00,Station-30,2577,9,4317937,CKB -LINE_14,Station-30,2022-03-13 05:09:00,2022-03-13 05:24:00,Station-31,5937,9,4317937,CKB -LINE_14,Station-31,2022-03-13 05:33:00,2022-03-13 05:47:00,Station-30,6.19,0,4317937,CKB -LINE_13,Station-30,2022-03-13 05:47:00,2022-03-13 05:53:00,Station-29,2555,0,4317937,CKB -LINE_13,Station-29,2022-03-13 05:53:00,2022-03-13 06:00:00,Station-30,2577,9,4317937,CKB -LINE_14,Station-30,2022-03-13 06:09:00,2022-03-13 06:24:00,Station-31,5937,9,4317937,CKB -LINE_14,Station-31,2022-03-13 06:33:00,2022-03-13 06:47:00,Station-30,6.19,0,4317937,CKB -LINE_14,Station-30,2022-03-13 06:47:00,2022-03-13 06:47:00,Station-0,0.06,0,4317937,CKB -LINE_15,Station-0,2022-03-13 00:57:00,2022-03-13 00:57:00,Station-32,0.06,0,4319402,CKB -LINE_15,Station-32,2022-03-13 00:57:00,2022-03-13 01:06:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 01:06:00,2022-03-13 01:11:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 01:27:00,2022-03-13 01:36:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 01:36:00,2022-03-13 01:41:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 01:57:00,2022-03-13 02:06:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 02:06:00,2022-03-13 02:11:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 02:27:00,2022-03-13 02:36:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 02:36:00,2022-03-13 02:41:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 02:57:00,2022-03-13 03:06:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 03:06:00,2022-03-13 03:11:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 03:27:00,2022-03-13 03:36:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 03:36:00,2022-03-13 03:41:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 03:57:00,2022-03-13 04:06:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 04:06:00,2022-03-13 04:11:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 04:27:00,2022-03-13 04:36:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 04:36:00,2022-03-13 04:41:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 04:57:00,2022-03-13 05:06:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 05:06:00,2022-03-13 05:11:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 05:27:00,2022-03-13 05:36:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 05:36:00,2022-03-13 05:41:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 05:57:00,2022-03-13 06:06:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 06:06:00,2022-03-13 06:11:00,Station-32,2936,16,4319402,CKB -LINE_15,Station-32,2022-03-13 06:27:00,2022-03-13 06:36:00,Station-33,4343,0,4319402,CKB -LINE_15,Station-33,2022-03-13 06:36:00,2022-03-13 06:41:00,Station-32,2936,0,4319402,CKB -LINE_15,Station-32,2022-03-13 06:41:00,2022-03-13 06:41:00,Station-0,0.06,0,4319402,CKB -LINE_17,Station-0,2022-03-13 00:30:00,2022-03-13 00:30:00,Station-34,0.06,0,4453948,CKB -LINE_17,Station-34,2022-03-13 00:30:00,2022-03-13 00:44:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 00:44:00,2022-03-13 00:57:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 01:00:00,2022-03-13 01:14:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 01:14:00,2022-03-13 01:27:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 01:30:00,2022-03-13 01:44:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 01:44:00,2022-03-13 01:57:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 02:00:00,2022-03-13 02:14:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 02:14:00,2022-03-13 02:27:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 02:30:00,2022-03-13 02:44:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 02:44:00,2022-03-13 02:57:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 03:00:00,2022-03-13 03:14:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 03:14:00,2022-03-13 03:27:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 03:30:00,2022-03-13 03:44:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 03:44:00,2022-03-13 03:57:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 04:00:00,2022-03-13 04:14:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 04:14:00,2022-03-13 04:27:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 04:30:00,2022-03-13 04:44:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 04:44:00,2022-03-13 04:57:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 05:00:00,2022-03-13 05:14:00,Station-36,4801,0,4453948,CKB -LINE_17,Station-36,2022-03-13 05:14:00,2022-03-13 05:27:00,Station-34,5302,3,4453948,CKB -LINE_17,Station-34,2022-03-13 05:30:00,2022-03-13 05:44:00,Station-36,4.8,0,4453948,CKB -LINE_17,Station-36,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-34,5301,4,4453948,CKB -LINE_17,Station-34,2022-03-13 06:00:00,2022-03-13 06:14:00,Station-36,4.8,0,4453948,CKB -LINE_17,Station-36,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-34,5301,4,4453948,CKB -LINE_17,Station-34,2022-03-13 06:30:00,2022-03-13 06:44:00,Station-36,4.8,0,4453948,CKB -LINE_17,Station-36,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-34,5301,0,4453948,CKB -LINE_17,Station-34,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,4453948,CKB -LINE_20,Station-0,2022-03-13 00:32:00,2022-03-13 00:32:00,Station-13,0.06,0,4747669,CKB -LINE_20,Station-13,2022-03-13 00:32:00,2022-03-13 00:44:00,Station-40,4212,3,4747669,CKB -LINE_20,Station-40,2022-03-13 00:47:00,2022-03-13 01:16:00,Station-41,13048,0,4747669,CKB -LINE_20,Station-41,2022-03-13 01:16:00,2022-03-13 01:42:00,Station-40,12869,5,4747669,CKB -LINE_20,Station-40,2022-03-13 01:47:00,2022-03-13 02:16:00,Station-41,13048,0,4747669,CKB -LINE_20,Station-41,2022-03-13 02:16:00,2022-03-13 02:42:00,Station-40,12869,5,4747669,CKB -LINE_20,Station-40,2022-03-13 02:47:00,2022-03-13 03:16:00,Station-41,13048,0,4747669,CKB -LINE_20,Station-41,2022-03-13 03:16:00,2022-03-13 03:42:00,Station-40,12869,5,4747669,CKB -LINE_20,Station-40,2022-03-13 03:47:00,2022-03-13 04:16:00,Station-41,13048,0,4747669,CKB -LINE_20,Station-41,2022-03-13 04:16:00,2022-03-13 04:42:00,Station-40,12869,5,4747669,CKB -LINE_20,Station-40,2022-03-13 04:47:00,2022-03-13 05:16:00,Station-41,13048,0,4747669,CKB -LINE_20,Station-41,2022-03-13 05:16:00,2022-03-13 05:42:00,Station-40,12869,5,4747669,CKB -LINE_20,Station-40,2022-03-13 05:47:00,2022-03-13 06:16:00,Station-41,13048,0,4747669,CKB -LINE_20,Station-41,2022-03-13 06:16:00,2022-03-13 06:42:00,Station-40,12869,0,4747669,CKB -LINE_20,Station-40,2022-03-13 06:42:00,2022-03-13 06:42:00,Station-0,0.06,0,4747669,CKB -LINE_20,Station-0,2022-03-13 00:17:00,2022-03-13 00:17:00,Station-40,0.06,0,4747671,CKB -LINE_20,Station-40,2022-03-13 00:17:00,2022-03-13 00:46:00,Station-41,13048,0,4747671,CKB -LINE_20,Station-41,2022-03-13 00:46:00,2022-03-13 01:12:00,Station-40,12869,5,4747671,CKB -LINE_20,Station-40,2022-03-13 01:17:00,2022-03-13 01:46:00,Station-41,13048,0,4747671,CKB -LINE_20,Station-41,2022-03-13 01:46:00,2022-03-13 02:12:00,Station-40,12869,5,4747671,CKB -LINE_20,Station-40,2022-03-13 02:17:00,2022-03-13 02:46:00,Station-41,13048,0,4747671,CKB -LINE_20,Station-41,2022-03-13 02:46:00,2022-03-13 03:12:00,Station-40,12869,5,4747671,CKB -LINE_20,Station-40,2022-03-13 03:17:00,2022-03-13 03:46:00,Station-41,13048,0,4747671,CKB -LINE_20,Station-41,2022-03-13 03:46:00,2022-03-13 04:12:00,Station-40,12869,5,4747671,CKB -LINE_20,Station-40,2022-03-13 04:17:00,2022-03-13 04:46:00,Station-41,13048,0,4747671,CKB -LINE_20,Station-41,2022-03-13 04:46:00,2022-03-13 05:12:00,Station-40,12869,5,4747671,CKB -LINE_20,Station-40,2022-03-13 05:17:00,2022-03-13 05:46:00,Station-41,13048,0,4747671,CKB -LINE_20,Station-41,2022-03-13 05:46:00,2022-03-13 06:12:00,Station-40,12869,5,4747671,CKB -LINE_20,Station-40,2022-03-13 06:17:00,2022-03-13 06:46:00,Station-41,13048,0,4747671,CKB -LINE_20,Station-41,2022-03-13 06:46:00,2022-03-13 07:12:00,Station-40,12869,0,4747671,CKB -LINE_20,Station-40,2022-03-13 07:12:00,2022-03-13 07:12:00,Station-0,0.06,0,4747671,CKB -LINE_21,Station-0,2022-03-13 00:49:00,2022-03-13 00:49:00,Station-3,0.06,0,4434314,CKB -LINE_21,Station-3,2022-03-13 00:49:00,2022-03-13 01:04:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 01:04:00,2022-03-13 01:19:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 01:19:00,2022-03-13 01:34:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 01:34:00,2022-03-13 01:49:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 01:49:00,2022-03-13 02:04:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 02:04:00,2022-03-13 02:19:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 02:19:00,2022-03-13 02:34:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 02:34:00,2022-03-13 02:49:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 02:49:00,2022-03-13 03:04:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 03:04:00,2022-03-13 03:19:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 03:19:00,2022-03-13 03:34:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 03:34:00,2022-03-13 03:49:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 03:49:00,2022-03-13 04:04:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 04:04:00,2022-03-13 04:19:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 04:19:00,2022-03-13 04:34:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 04:34:00,2022-03-13 04:49:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 04:49:00,2022-03-13 05:04:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 05:04:00,2022-03-13 05:19:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 05:19:00,2022-03-13 05:34:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 05:34:00,2022-03-13 05:49:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 05:49:00,2022-03-13 06:04:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 06:04:00,2022-03-13 06:19:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 06:19:00,2022-03-13 06:34:00,Station-16,10229,0,4434314,CKB -LINE_21,Station-16,2022-03-13 06:34:00,2022-03-13 06:49:00,Station-3,11801,0,4434314,CKB -LINE_21,Station-3,2022-03-13 06:49:00,2022-03-13 06:49:00,Station-0,0.06,0,4434314,CKB -LINE_23,Station-0,2022-03-13 02:34:00,2022-03-13 02:34:00,Station-45,0.06,0,4524178,CKB -LINE_23,Station-45,2022-03-13 02:34:00,2022-03-13 03:00:00,Station-46,9016,0,4524178,CKB -LINE_23,Station-46,2022-03-13 03:00:00,2022-03-13 03:27:00,Station-45,10083,7,4524178,CKB -LINE_23,Station-45,2022-03-13 03:34:00,2022-03-13 04:00:00,Station-46,9016,0,4524178,CKB -LINE_23,Station-46,2022-03-13 04:00:00,2022-03-13 04:27:00,Station-45,10083,7,4524178,CKB -LINE_23,Station-45,2022-03-13 04:34:00,2022-03-13 05:00:00,Station-46,9016,0,4524178,CKB -LINE_23,Station-46,2022-03-13 05:00:00,2022-03-13 05:27:00,Station-45,10083,7,4524178,CKB -LINE_23,Station-45,2022-03-13 05:34:00,2022-03-13 06:00:00,Station-46,9016,0,4524178,CKB -LINE_23,Station-46,2022-03-13 06:00:00,2022-03-13 06:27:00,Station-45,10083,7,4524178,CKB -LINE_23,Station-45,2022-03-13 06:34:00,2022-03-13 07:00:00,Station-46,9016,0,4524178,CKB -LINE_23,Station-46,2022-03-13 07:00:00,2022-03-13 07:00:00,Station-0,0.06,0,4524178,CKB -LINE_23,Station-0,2022-03-13 02:04:00,2022-03-13 02:04:00,Station-45,0.06,0,4619808,CKB -LINE_23,Station-45,2022-03-13 02:04:00,2022-03-13 02:30:00,Station-46,9016,0,4619808,CKB -LINE_23,Station-46,2022-03-13 02:30:00,2022-03-13 02:57:00,Station-45,10083,7,4619808,CKB -LINE_23,Station-45,2022-03-13 03:04:00,2022-03-13 03:30:00,Station-46,9016,0,4619808,CKB -LINE_23,Station-46,2022-03-13 03:30:00,2022-03-13 03:57:00,Station-45,10083,7,4619808,CKB -LINE_23,Station-45,2022-03-13 04:04:00,2022-03-13 04:30:00,Station-46,9016,0,4619808,CKB -LINE_23,Station-46,2022-03-13 04:30:00,2022-03-13 04:57:00,Station-45,10083,7,4619808,CKB -LINE_23,Station-45,2022-03-13 05:04:00,2022-03-13 05:30:00,Station-46,9016,0,4619808,CKB -LINE_23,Station-46,2022-03-13 05:30:00,2022-03-13 05:57:00,Station-45,10083,7,4619808,CKB -LINE_23,Station-45,2022-03-13 06:04:00,2022-03-13 06:30:00,Station-46,9016,0,4619808,CKB -LINE_23,Station-46,2022-03-13 06:30:00,2022-03-13 06:57:00,Station-45,10083,0,4619808,CKB -LINE_23,Station-45,2022-03-13 06:57:00,2022-03-13 06:57:00,Station-0,0.06,0,4619808,CKB -LINE_24,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,4374748,CKB -LINE_24,Station-21,2022-03-13 00:31:00,2022-03-13 00:44:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 00:44:00,2022-03-13 00:56:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 01:01:00,2022-03-13 01:14:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 01:14:00,2022-03-13 01:26:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 01:31:00,2022-03-13 01:44:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 01:44:00,2022-03-13 01:56:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 02:01:00,2022-03-13 02:14:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 02:14:00,2022-03-13 02:26:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 02:31:00,2022-03-13 02:44:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 02:44:00,2022-03-13 02:56:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 03:01:00,2022-03-13 03:14:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 03:14:00,2022-03-13 03:26:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 03:31:00,2022-03-13 03:44:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 03:44:00,2022-03-13 03:56:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 04:01:00,2022-03-13 04:14:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 04:14:00,2022-03-13 04:26:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 04:31:00,2022-03-13 04:44:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 04:44:00,2022-03-13 04:56:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 05:01:00,2022-03-13 05:14:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 05:14:00,2022-03-13 05:26:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 05:31:00,2022-03-13 05:44:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 06:01:00,2022-03-13 06:14:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-21,5362,5,4374748,CKB -LINE_24,Station-21,2022-03-13 06:31:00,2022-03-13 06:44:00,Station-47,4872,0,4374748,CKB -LINE_24,Station-47,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-21,5362,0,4374748,CKB -LINE_24,Station-21,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,4374748,CKB -LINE_25,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,4374871,CKB -LINE_25,Station-21,2022-03-13 00:31:00,2022-03-13 00:45:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 00:47:00,2022-03-13 01:01:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 01:01:00,2022-03-13 01:15:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 01:17:00,2022-03-13 01:31:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 01:31:00,2022-03-13 01:45:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 01:47:00,2022-03-13 02:01:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 02:01:00,2022-03-13 02:15:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 02:17:00,2022-03-13 02:31:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 02:31:00,2022-03-13 02:45:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 02:47:00,2022-03-13 03:01:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 03:01:00,2022-03-13 03:15:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 03:17:00,2022-03-13 03:31:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 03:31:00,2022-03-13 03:45:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 03:47:00,2022-03-13 04:01:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 04:01:00,2022-03-13 04:15:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 04:17:00,2022-03-13 04:31:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 04:31:00,2022-03-13 04:45:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 04:47:00,2022-03-13 05:01:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 05:01:00,2022-03-13 05:15:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 05:17:00,2022-03-13 05:31:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 05:31:00,2022-03-13 05:45:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 05:47:00,2022-03-13 06:01:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 06:01:00,2022-03-13 06:15:00,Station-48,5225,2,4374871,CKB -LINE_25,Station-48,2022-03-13 06:17:00,2022-03-13 06:31:00,Station-21,7617,0,4374871,CKB -LINE_25,Station-21,2022-03-13 06:31:00,2022-03-13 06:45:00,Station-48,5096,0,4374871,CKB -LINE_25,Station-48,2022-03-13 06:45:00,2022-03-13 06:45:00,Station-0,0.06,0,4374871,CKB -LINE_26,Station-0,2022-03-13 00:43:00,2022-03-13 00:43:00,Station-49,0.06,0,4375017,CKB -LINE_26,Station-49,2022-03-13 00:43:00,2022-03-13 00:53:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 00:53:00,2022-03-13 01:03:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 01:13:00,2022-03-13 01:23:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 01:23:00,2022-03-13 01:33:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 01:43:00,2022-03-13 01:53:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 01:53:00,2022-03-13 02:03:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 02:13:00,2022-03-13 02:23:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 02:23:00,2022-03-13 02:33:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 02:43:00,2022-03-13 02:53:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 02:53:00,2022-03-13 03:03:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 03:13:00,2022-03-13 03:23:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 03:23:00,2022-03-13 03:33:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 03:43:00,2022-03-13 03:53:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 03:53:00,2022-03-13 04:03:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 04:13:00,2022-03-13 04:23:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 04:23:00,2022-03-13 04:33:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 04:43:00,2022-03-13 04:53:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 04:53:00,2022-03-13 05:03:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 05:13:00,2022-03-13 05:23:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 05:23:00,2022-03-13 05:33:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 05:43:00,2022-03-13 05:53:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 05:53:00,2022-03-13 06:03:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 06:13:00,2022-03-13 06:23:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 06:23:00,2022-03-13 06:33:00,Station-49,4408,10,4375017,CKB -LINE_26,Station-49,2022-03-13 06:43:00,2022-03-13 06:53:00,Station-50,4507,0,4375017,CKB -LINE_26,Station-50,2022-03-13 06:53:00,2022-03-13 07:03:00,Station-49,4408,0,4375017,CKB -LINE_26,Station-49,2022-03-13 07:03:00,2022-03-13 07:03:00,Station-0,0.06,0,4375017,CKB +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB +LINE_5,Station-0,2022-03-07 22:56:00,2022-03-07 22:56:00,Station-14,0.06,0,5,CKB +LINE_5,Station-14,2022-03-07 22:56:00,2022-03-07 23:08:00,Station-15,5882,3,5,CKB +LINE_5,Station-15,2022-03-07 23:11:00,2022-03-07 23:25:00,Station-14,6232,0,5,CKB +LINE_5,Station-14,2022-03-07 23:25:00,2022-03-07 23:38:00,Station-15,6086,3,5,CKB +LINE_5,Station-15,2022-03-07 23:41:00,2022-03-07 23:55:00,Station-14,6232,0,5,CKB +LINE_5,Station-14,2022-03-07 23:55:00,2022-03-08 00:08:00,Station-15,6086,0,5,CKB +LINE_5,Station-15,2022-03-08 00:08:00,2022-03-08 00:08:00,Station-0,0.06,0,5,CKB +LINE_6,Station-0,2022-03-07 05:05:00,2022-03-07 05:05:00,Station-16,0.06,0,6,CKB +LINE_6,Station-16,2022-03-07 05:05:00,2022-03-07 05:14:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 05:14:00,2022-03-07 05:23:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 05:25:00,2022-03-07 05:34:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 05:34:00,2022-03-07 05:43:00,Station-16,5139,23,6,CKB +LINE_6,Station-16,2022-03-07 06:06:00,2022-03-07 06:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 06:15:00,2022-03-07 06:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 06:26:00,2022-03-07 06:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 06:35:00,2022-03-07 06:44:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 06:46:00,2022-03-07 06:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 06:55:00,2022-03-07 07:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 07:06:00,2022-03-07 07:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 07:15:00,2022-03-07 07:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 07:26:00,2022-03-07 07:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 07:35:00,2022-03-07 07:44:00,Station-16,5139,22,6,CKB +LINE_6,Station-16,2022-03-07 08:06:00,2022-03-07 08:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 08:15:00,2022-03-07 08:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 08:26:00,2022-03-07 08:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 08:35:00,2022-03-07 08:44:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 08:46:00,2022-03-07 08:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 08:55:00,2022-03-07 09:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 09:06:00,2022-03-07 09:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 09:15:00,2022-03-07 09:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 09:26:00,2022-03-07 09:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 09:35:00,2022-03-07 09:44:00,Station-16,5139,22,6,CKB +LINE_6,Station-16,2022-03-07 10:06:00,2022-03-07 10:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 10:15:00,2022-03-07 10:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 10:26:00,2022-03-07 10:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 10:35:00,2022-03-07 10:44:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 10:46:00,2022-03-07 10:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 10:55:00,2022-03-07 11:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 11:06:00,2022-03-07 11:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 11:15:00,2022-03-07 11:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 11:26:00,2022-03-07 11:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 11:35:00,2022-03-07 11:44:00,Station-16,5139,22,6,CKB +LINE_6,Station-16,2022-03-07 12:06:00,2022-03-07 12:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 12:15:00,2022-03-07 12:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 12:26:00,2022-03-07 12:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 12:35:00,2022-03-07 12:44:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 12:46:00,2022-03-07 12:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 12:55:00,2022-03-07 13:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 13:06:00,2022-03-07 13:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 13:15:00,2022-03-07 13:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 13:26:00,2022-03-07 13:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 13:35:00,2022-03-07 13:44:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 13:46:00,2022-03-07 13:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 13:55:00,2022-03-07 14:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 14:06:00,2022-03-07 14:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 14:15:00,2022-03-07 14:24:00,Station-16,5139,22,6,CKB +LINE_6,Station-16,2022-03-07 14:46:00,2022-03-07 14:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 14:55:00,2022-03-07 15:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 15:06:00,2022-03-07 15:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 15:15:00,2022-03-07 15:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 15:26:00,2022-03-07 15:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 15:35:00,2022-03-07 15:44:00,Station-16,5139,22,6,CKB +LINE_6,Station-16,2022-03-07 16:06:00,2022-03-07 16:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 16:15:00,2022-03-07 16:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 16:26:00,2022-03-07 16:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 16:35:00,2022-03-07 16:44:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 16:46:00,2022-03-07 16:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 16:55:00,2022-03-07 17:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 17:06:00,2022-03-07 17:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 17:15:00,2022-03-07 17:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 17:26:00,2022-03-07 17:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 17:35:00,2022-03-07 17:44:00,Station-16,5139,22,6,CKB +LINE_6,Station-16,2022-03-07 18:06:00,2022-03-07 18:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 18:15:00,2022-03-07 18:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 18:26:00,2022-03-07 18:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 18:35:00,2022-03-07 18:44:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 18:46:00,2022-03-07 18:55:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 18:55:00,2022-03-07 19:04:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 19:06:00,2022-03-07 19:15:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 19:15:00,2022-03-07 19:24:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 19:26:00,2022-03-07 19:35:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 19:35:00,2022-03-07 19:44:00,Station-16,5139,21,6,CKB +LINE_6,Station-16,2022-03-07 20:05:00,2022-03-07 20:14:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 20:14:00,2022-03-07 20:23:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 20:25:00,2022-03-07 20:34:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 20:34:00,2022-03-07 20:43:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 20:45:00,2022-03-07 20:54:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 20:54:00,2022-03-07 21:03:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 21:05:00,2022-03-07 21:14:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 21:14:00,2022-03-07 21:23:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 21:25:00,2022-03-07 21:34:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 21:34:00,2022-03-07 21:43:00,Station-16,5139,22,6,CKB +LINE_6,Station-16,2022-03-07 22:05:00,2022-03-07 22:14:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 22:14:00,2022-03-07 22:23:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 22:25:00,2022-03-07 22:34:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 22:34:00,2022-03-07 22:43:00,Station-16,5139,2,6,CKB +LINE_6,Station-16,2022-03-07 22:45:00,2022-03-07 22:54:00,Station-17,4781,0,6,CKB +LINE_6,Station-17,2022-03-07 22:54:00,2022-03-07 23:03:00,Station-16,5139,0,6,CKB +LINE_6,Station-16,2022-03-07 23:03:00,2022-03-07 23:03:00,Station-0,0.06,0,6,CKB +LINE_7,Station-0,2022-03-08 00:06:00,2022-03-08 00:06:00,Station-18,0.06,0,7,CKB +LINE_7,Station-18,2022-03-08 00:06:00,2022-03-08 00:27:00,Station-19,7827,0,7,CKB +LINE_8,Station-19,2022-03-08 00:27:00,2022-03-08 00:48:00,Station-20,11079,0,7,CKB +LINE_8,Station-20,2022-03-08 00:48:00,2022-03-08 01:25:00,Station-21,20641,8,7,CKB +LINE_8,Station-21,2022-03-08 01:33:00,2022-03-08 02:16:00,Station-20,20579,1,7,CKB +LINE_8,Station-20,2022-03-08 02:17:00,2022-03-08 02:55:00,Station-21,20641,8,7,CKB +LINE_8,Station-21,2022-03-08 03:03:00,2022-03-08 03:46:00,Station-20,20579,1,7,CKB +LINE_8,Station-20,2022-03-08 03:47:00,2022-03-08 04:25:00,Station-21,20641,0,7,CKB +LINE_8,Station-21,2022-03-08 04:25:00,2022-03-08 04:25:00,Station-0,0.06,0,7,CKB +LINE_9,Station-22,2022-03-07 05:15:00,2022-03-07 06:01:00,Station-23,17.9,0,8,VDL +LINE_9,Station-23,2022-03-07 06:01:00,2022-03-07 06:15:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 06:23:00,2022-03-07 06:37:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 06:41:00,2022-03-07 06:55:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 07:03:00,2022-03-07 07:17:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 07:21:00,2022-03-07 07:35:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 07:43:00,2022-03-07 07:57:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 08:01:00,2022-03-07 08:15:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 08:23:00,2022-03-07 08:37:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 08:41:00,2022-03-07 08:55:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 09:03:00,2022-03-07 09:17:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 09:21:00,2022-03-07 09:35:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 09:43:00,2022-03-07 09:57:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 10:01:00,2022-03-07 10:15:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 10:23:00,2022-03-07 10:37:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 10:41:00,2022-03-07 10:55:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 11:03:00,2022-03-07 11:17:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 11:21:00,2022-03-07 11:35:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 11:43:00,2022-03-07 11:57:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 12:01:00,2022-03-07 12:15:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 12:23:00,2022-03-07 12:37:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 12:41:00,2022-03-07 12:55:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 13:03:00,2022-03-07 13:17:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 13:21:00,2022-03-07 13:35:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 13:43:00,2022-03-07 13:57:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 14:01:00,2022-03-07 14:15:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 14:23:00,2022-03-07 14:37:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 14:41:00,2022-03-07 14:55:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 15:03:00,2022-03-07 15:17:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 15:21:00,2022-03-07 15:35:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 15:43:00,2022-03-07 15:57:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 16:01:00,2022-03-07 16:15:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 16:23:00,2022-03-07 16:37:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 16:41:00,2022-03-07 16:55:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 17:03:00,2022-03-07 17:17:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 17:21:00,2022-03-07 17:35:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 17:43:00,2022-03-07 17:57:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 18:01:00,2022-03-07 18:15:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 18:23:00,2022-03-07 18:37:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 18:41:00,2022-03-07 18:55:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 19:03:00,2022-03-07 19:17:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 19:21:00,2022-03-07 19:35:00,Station-23,4637,8,8,VDL +LINE_9,Station-23,2022-03-07 19:43:00,2022-03-07 19:57:00,Station-23,4637,4,8,VDL +LINE_9,Station-23,2022-03-07 20:01:00,2022-03-07 20:14:00,Station-23,4637,9,8,VDL +LINE_9,Station-23,2022-03-07 20:23:00,2022-03-07 20:36:00,Station-23,4637,0,8,VDL +LINE_9,Station-23,2022-03-07 20:36:00,2022-03-07 21:15:00,Station-22,19.8,0,8,VDL +LINE_10,Station-0,2022-03-07 04:56:00,2022-03-07 04:56:00,Station-24,0.06,18,9,CKB +LINE_10,Station-24,2022-03-07 05:14:00,2022-03-07 05:20:00,Station-25,3.29,0,9,CKB +LINE_10,Station-25,2022-03-07 05:20:00,2022-03-07 05:24:00,Station-24,2954,20,9,CKB +LINE_10,Station-24,2022-03-07 05:44:00,2022-03-07 05:50:00,Station-25,3.29,0,9,CKB +LINE_10,Station-25,2022-03-07 05:50:00,2022-03-07 05:54:00,Station-24,2954,5,9,CKB +LINE_10,Station-24,2022-03-07 05:59:00,2022-03-07 06:06:00,Station-25,3.29,2,9,CKB +LINE_10,Station-25,2022-03-07 06:08:00,2022-03-07 06:13:00,Station-24,2954,19,9,CKB +LINE_10,Station-24,2022-03-07 06:32:00,2022-03-07 06:39:00,Station-25,3.29,1,9,CKB +LINE_10,Station-25,2022-03-07 06:40:00,2022-03-07 06:45:00,Station-24,2954,7,9,CKB +LINE_10,Station-24,2022-03-07 06:52:00,2022-03-07 06:59:00,Station-25,3.29,1,9,CKB +LINE_10,Station-25,2022-03-07 07:00:00,2022-03-07 07:05:00,Station-24,2954,7,9,CKB +LINE_10,Station-24,2022-03-07 07:12:00,2022-03-07 07:19:00,Station-25,3.29,1,9,CKB +LINE_10,Station-25,2022-03-07 07:20:00,2022-03-07 07:25:00,Station-24,2954,7,9,CKB +LINE_10,Station-24,2022-03-07 07:32:00,2022-03-07 07:39:00,Station-25,3.29,1,9,CKB +LINE_10,Station-25,2022-03-07 07:40:00,2022-03-07 07:45:00,Station-24,2954,295,9,CKB +LINE_10,Station-24,2022-03-07 12:40:00,2022-03-07 12:47:00,Station-25,3.29,2,9,CKB +LINE_10,Station-25,2022-03-07 12:49:00,2022-03-07 12:54:00,Station-24,2954,46,9,CKB +LINE_10,Station-24,2022-03-07 13:40:00,2022-03-07 13:47:00,Station-25,3.29,2,9,CKB +LINE_10,Station-25,2022-03-07 13:49:00,2022-03-07 13:54:00,Station-24,2954,434,9,CKB +LINE_10,Station-24,2022-03-07 21:08:00,2022-03-07 21:08:00,Station-0,0.06,0,9,CKB +LINE_11,Station-0,2022-03-07 07:20:00,2022-03-07 07:20:00,Station-26,0.06,0,10,CKB +LINE_11,Station-26,2022-03-07 07:20:00,2022-03-07 07:50:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 08:00:00,2022-03-07 08:30:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 08:40:00,2022-03-07 09:10:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 09:20:00,2022-03-07 09:50:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 10:00:00,2022-03-07 10:30:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 10:40:00,2022-03-07 11:10:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 11:20:00,2022-03-07 11:50:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 12:00:00,2022-03-07 12:30:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 12:40:00,2022-03-07 13:10:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 13:20:00,2022-03-07 13:50:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 14:00:00,2022-03-07 14:30:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 14:40:00,2022-03-07 15:10:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 15:20:00,2022-03-07 15:50:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 16:00:00,2022-03-07 16:30:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 16:40:00,2022-03-07 17:10:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 17:20:00,2022-03-07 17:50:00,Station-26,9266,10,10,CKB +LINE_11,Station-26,2022-03-07 18:00:00,2022-03-07 18:30:00,Station-26,9266,0,10,CKB +LINE_11,Station-26,2022-03-07 18:30:00,2022-03-07 18:30:00,Station-0,0.06,0,10,CKB +LINE_12,Station-0,2022-03-07 07:10:00,2022-03-07 07:10:00,Station-27,0.06,0,11,CKB +LINE_12,Station-27,2022-03-07 07:10:00,2022-03-07 07:18:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 07:28:00,2022-03-07 07:40:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 07:40:00,2022-03-07 07:48:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 07:58:00,2022-03-07 08:10:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 08:10:00,2022-03-07 08:18:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 08:28:00,2022-03-07 08:40:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 08:40:00,2022-03-07 08:48:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 08:58:00,2022-03-07 09:10:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 09:10:00,2022-03-07 09:18:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 09:28:00,2022-03-07 09:40:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 09:40:00,2022-03-07 09:48:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 09:58:00,2022-03-07 10:10:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 10:10:00,2022-03-07 10:18:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 10:28:00,2022-03-07 10:40:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 10:40:00,2022-03-07 10:48:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 10:58:00,2022-03-07 11:10:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 11:10:00,2022-03-07 11:18:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 11:28:00,2022-03-07 11:40:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 11:40:00,2022-03-07 11:48:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 11:58:00,2022-03-07 12:10:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 12:10:00,2022-03-07 12:18:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 12:28:00,2022-03-07 12:40:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 12:40:00,2022-03-07 12:48:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 12:58:00,2022-03-07 13:10:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 13:10:00,2022-03-07 13:18:00,Station-28,2169,10,11,CKB +LINE_12,Station-28,2022-03-07 13:28:00,2022-03-07 13:40:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 13:40:00,2022-03-07 13:48:00,Station-28,2169,8,11,CKB +LINE_12,Station-28,2022-03-07 13:56:00,2022-03-07 14:10:00,Station-27,2952,0,11,CKB +LINE_12,Station-27,2022-03-07 14:10:00,2022-03-07 14:19:00,Station-28,2169,14,11,CKB +LINE_12,Station-28,2022-03-07 14:33:00,2022-03-07 14:47:00,Station-27,2952,3,11,CKB +LINE_12,Station-27,2022-03-07 14:50:00,2022-03-07 14:59:00,Station-28,2169,14,11,CKB +LINE_12,Station-28,2022-03-07 15:13:00,2022-03-07 15:27:00,Station-27,2952,3,11,CKB +LINE_12,Station-27,2022-03-07 15:30:00,2022-03-07 15:39:00,Station-28,2169,14,11,CKB +LINE_12,Station-28,2022-03-07 15:53:00,2022-03-07 16:07:00,Station-27,2952,3,11,CKB +LINE_12,Station-27,2022-03-07 16:10:00,2022-03-07 16:19:00,Station-28,2169,14,11,CKB +LINE_12,Station-28,2022-03-07 16:33:00,2022-03-07 16:47:00,Station-27,2952,3,11,CKB +LINE_12,Station-27,2022-03-07 16:50:00,2022-03-07 16:59:00,Station-28,2169,14,11,CKB +LINE_12,Station-28,2022-03-07 17:13:00,2022-03-07 17:27:00,Station-27,2952,3,11,CKB +LINE_12,Station-27,2022-03-07 17:30:00,2022-03-07 17:39:00,Station-28,2169,13,11,CKB +LINE_12,Station-28,2022-03-07 17:52:00,2022-03-07 18:05:00,Station-27,2952,5,11,CKB +LINE_12,Station-27,2022-03-07 18:10:00,2022-03-07 18:18:00,Station-28,2169,0,11,CKB +LINE_12,Station-28,2022-03-07 18:18:00,2022-03-07 18:18:00,Station-0,0.06,0,11,CKB +LINE_12,Station-0,2022-03-07 14:13:00,2022-03-07 14:13:00,Station-28,0.06,0,12,CKB +LINE_12,Station-28,2022-03-07 14:13:00,2022-03-07 14:27:00,Station-27,2952,3,12,CKB +LINE_12,Station-27,2022-03-07 14:30:00,2022-03-07 14:39:00,Station-28,2169,14,12,CKB +LINE_12,Station-28,2022-03-07 14:53:00,2022-03-07 15:07:00,Station-27,2952,3,12,CKB +LINE_12,Station-27,2022-03-07 15:10:00,2022-03-07 15:19:00,Station-28,2169,14,12,CKB +LINE_12,Station-28,2022-03-07 15:33:00,2022-03-07 15:47:00,Station-27,2952,3,12,CKB +LINE_12,Station-27,2022-03-07 15:50:00,2022-03-07 15:59:00,Station-28,2169,14,12,CKB +LINE_12,Station-28,2022-03-07 16:13:00,2022-03-07 16:27:00,Station-27,2952,3,12,CKB +LINE_12,Station-27,2022-03-07 16:30:00,2022-03-07 16:39:00,Station-28,2169,14,12,CKB +LINE_12,Station-28,2022-03-07 16:53:00,2022-03-07 17:07:00,Station-27,2952,3,12,CKB +LINE_12,Station-27,2022-03-07 17:10:00,2022-03-07 17:19:00,Station-28,2169,14,12,CKB +LINE_12,Station-28,2022-03-07 17:33:00,2022-03-07 17:47:00,Station-27,2952,3,12,CKB +LINE_12,Station-27,2022-03-07 17:50:00,2022-03-07 17:59:00,Station-28,2169,14,12,CKB +LINE_12,Station-28,2022-03-07 18:13:00,2022-03-07 18:25:00,Station-27,2952,0,12,CKB +LINE_12,Station-27,2022-03-07 18:25:00,2022-03-07 18:25:00,Station-0,0.06,0,12,CKB +LINE_13,Station-0,2022-03-08 00:23:00,2022-03-08 00:23:00,Station-29,0.06,0,13,CKB +LINE_13,Station-29,2022-03-08 00:23:00,2022-03-08 00:30:00,Station-30,2577,9,13,CKB +LINE_14,Station-30,2022-03-08 00:39:00,2022-03-08 00:54:00,Station-31,5937,9,13,CKB +LINE_14,Station-31,2022-03-08 01:03:00,2022-03-08 01:17:00,Station-30,6.19,0,13,CKB +LINE_13,Station-30,2022-03-08 01:17:00,2022-03-08 01:23:00,Station-29,2555,0,13,CKB +LINE_13,Station-29,2022-03-08 01:23:00,2022-03-08 01:30:00,Station-30,2577,9,13,CKB +LINE_14,Station-30,2022-03-08 01:39:00,2022-03-08 01:54:00,Station-31,5937,9,13,CKB +LINE_14,Station-31,2022-03-08 02:03:00,2022-03-08 02:17:00,Station-30,6.19,0,13,CKB +LINE_13,Station-30,2022-03-08 02:17:00,2022-03-08 02:23:00,Station-29,2555,0,13,CKB +LINE_13,Station-29,2022-03-08 02:23:00,2022-03-08 02:30:00,Station-30,2577,9,13,CKB +LINE_14,Station-30,2022-03-08 02:39:00,2022-03-08 02:54:00,Station-31,5937,9,13,CKB +LINE_14,Station-31,2022-03-08 03:03:00,2022-03-08 03:17:00,Station-30,6.19,0,13,CKB +LINE_13,Station-30,2022-03-08 03:17:00,2022-03-08 03:23:00,Station-29,2555,0,13,CKB +LINE_13,Station-29,2022-03-08 03:23:00,2022-03-08 03:30:00,Station-30,2577,9,13,CKB +LINE_14,Station-30,2022-03-08 03:39:00,2022-03-08 03:54:00,Station-31,5937,9,13,CKB +LINE_14,Station-31,2022-03-08 04:03:00,2022-03-08 04:17:00,Station-30,6.19,0,13,CKB +LINE_13,Station-30,2022-03-08 04:17:00,2022-03-08 04:23:00,Station-29,2555,0,13,CKB +LINE_13,Station-29,2022-03-08 04:23:00,2022-03-08 04:23:00,Station-0,0.06,0,13,CKB +LINE_14,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-31,0.06,0,14,CKB +LINE_14,Station-31,2022-03-08 00:33:00,2022-03-08 00:47:00,Station-30,6.19,0,14,CKB +LINE_13,Station-30,2022-03-08 00:47:00,2022-03-08 00:53:00,Station-29,2555,0,14,CKB +LINE_13,Station-29,2022-03-08 00:53:00,2022-03-08 01:00:00,Station-30,2577,9,14,CKB +LINE_14,Station-30,2022-03-08 01:09:00,2022-03-08 01:24:00,Station-31,5937,9,14,CKB +LINE_14,Station-31,2022-03-08 01:33:00,2022-03-08 01:47:00,Station-30,6.19,0,14,CKB +LINE_13,Station-30,2022-03-08 01:47:00,2022-03-08 01:53:00,Station-29,2555,0,14,CKB +LINE_13,Station-29,2022-03-08 01:53:00,2022-03-08 02:00:00,Station-30,2577,9,14,CKB +LINE_14,Station-30,2022-03-08 02:09:00,2022-03-08 02:24:00,Station-31,5937,9,14,CKB +LINE_14,Station-31,2022-03-08 02:33:00,2022-03-08 02:47:00,Station-30,6.19,0,14,CKB +LINE_13,Station-30,2022-03-08 02:47:00,2022-03-08 02:53:00,Station-29,2555,0,14,CKB +LINE_13,Station-29,2022-03-08 02:53:00,2022-03-08 03:00:00,Station-30,2577,9,14,CKB +LINE_14,Station-30,2022-03-08 03:09:00,2022-03-08 03:24:00,Station-31,5937,9,14,CKB +LINE_14,Station-31,2022-03-08 03:33:00,2022-03-08 03:47:00,Station-30,6.19,0,14,CKB +LINE_13,Station-30,2022-03-08 03:47:00,2022-03-08 03:53:00,Station-29,2555,0,14,CKB +LINE_13,Station-29,2022-03-08 03:53:00,2022-03-08 04:00:00,Station-30,2577,9,14,CKB +LINE_14,Station-30,2022-03-08 04:09:00,2022-03-08 04:24:00,Station-31,5937,0,14,CKB +LINE_14,Station-31,2022-03-08 04:24:00,2022-03-08 04:24:00,Station-0,0.06,0,14,CKB +LINE_15,Station-0,2022-03-08 00:57:00,2022-03-08 00:57:00,Station-32,0.06,0,15,CKB +LINE_15,Station-32,2022-03-08 00:57:00,2022-03-08 01:06:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 01:06:00,2022-03-08 01:11:00,Station-32,2936,16,15,CKB +LINE_15,Station-32,2022-03-08 01:27:00,2022-03-08 01:36:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 01:36:00,2022-03-08 01:41:00,Station-32,2936,16,15,CKB +LINE_15,Station-32,2022-03-08 01:57:00,2022-03-08 02:06:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 02:06:00,2022-03-08 02:11:00,Station-32,2936,16,15,CKB +LINE_15,Station-32,2022-03-08 02:27:00,2022-03-08 02:36:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 02:36:00,2022-03-08 02:41:00,Station-32,2936,16,15,CKB +LINE_15,Station-32,2022-03-08 02:57:00,2022-03-08 03:06:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 03:06:00,2022-03-08 03:11:00,Station-32,2936,16,15,CKB +LINE_15,Station-32,2022-03-08 03:27:00,2022-03-08 03:36:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 03:36:00,2022-03-08 03:41:00,Station-32,2936,16,15,CKB +LINE_15,Station-32,2022-03-08 03:57:00,2022-03-08 04:06:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 04:06:00,2022-03-08 04:11:00,Station-32,2936,16,15,CKB +LINE_15,Station-32,2022-03-08 04:27:00,2022-03-08 04:36:00,Station-33,4343,0,15,CKB +LINE_15,Station-33,2022-03-08 04:36:00,2022-03-08 04:36:00,Station-0,0.06,0,15,CKB +LINE_16,Station-0,2022-03-08 00:29:00,2022-03-08 00:29:00,Station-34,0.06,0,16,CKB +LINE_16,Station-34,2022-03-08 00:29:00,2022-03-08 00:41:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 00:47:00,2022-03-08 00:57:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 00:59:00,2022-03-08 01:11:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 01:17:00,2022-03-08 01:27:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 01:29:00,2022-03-08 01:41:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 01:47:00,2022-03-08 01:57:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 01:59:00,2022-03-08 02:11:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 02:17:00,2022-03-08 02:27:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 02:29:00,2022-03-08 02:41:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 02:47:00,2022-03-08 02:57:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 02:59:00,2022-03-08 03:11:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 03:17:00,2022-03-08 03:27:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 03:29:00,2022-03-08 03:41:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 03:47:00,2022-03-08 03:57:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 03:59:00,2022-03-08 04:11:00,Station-35,4481,6,16,CKB +LINE_16,Station-35,2022-03-08 04:17:00,2022-03-08 04:27:00,Station-34,4031,2,16,CKB +LINE_16,Station-34,2022-03-08 04:29:00,2022-03-08 04:41:00,Station-35,4481,0,16,CKB +LINE_16,Station-35,2022-03-08 04:41:00,2022-03-08 04:41:00,Station-0,0.06,0,16,CKB +LINE_17,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-34,0.06,0,17,CKB +LINE_17,Station-34,2022-03-08 00:30:00,2022-03-08 00:44:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 00:44:00,2022-03-08 00:57:00,Station-34,5302,3,17,CKB +LINE_17,Station-34,2022-03-08 01:00:00,2022-03-08 01:14:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 01:14:00,2022-03-08 01:27:00,Station-34,5302,3,17,CKB +LINE_17,Station-34,2022-03-08 01:30:00,2022-03-08 01:44:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 01:44:00,2022-03-08 01:57:00,Station-34,5302,3,17,CKB +LINE_17,Station-34,2022-03-08 02:00:00,2022-03-08 02:14:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 02:14:00,2022-03-08 02:27:00,Station-34,5302,3,17,CKB +LINE_17,Station-34,2022-03-08 02:30:00,2022-03-08 02:44:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 02:44:00,2022-03-08 02:57:00,Station-34,5302,3,17,CKB +LINE_17,Station-34,2022-03-08 03:00:00,2022-03-08 03:14:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 03:14:00,2022-03-08 03:27:00,Station-34,5302,3,17,CKB +LINE_17,Station-34,2022-03-08 03:30:00,2022-03-08 03:44:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 03:44:00,2022-03-08 03:57:00,Station-34,5302,3,17,CKB +LINE_17,Station-34,2022-03-08 04:00:00,2022-03-08 04:14:00,Station-36,4801,0,17,CKB +LINE_17,Station-36,2022-03-08 04:14:00,2022-03-08 04:27:00,Station-34,5302,0,17,CKB +LINE_17,Station-34,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,17,CKB +LINE_18,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-37,0.06,0,18,CKB +LINE_18,Station-37,2022-03-08 00:43:00,2022-03-08 01:33:00,Station-37,20434,10,18,CKB +LINE_18,Station-37,2022-03-08 01:43:00,2022-03-08 02:33:00,Station-37,20434,10,18,CKB +LINE_18,Station-37,2022-03-08 02:43:00,2022-03-08 03:33:00,Station-37,20434,10,18,CKB +LINE_18,Station-37,2022-03-08 03:43:00,2022-03-08 04:33:00,Station-37,20434,0,18,CKB +LINE_18,Station-37,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,18,CKB +LINE_18,Station-0,2022-03-08 00:13:00,2022-03-08 00:13:00,Station-37,0.06,0,19,CKB +LINE_18,Station-37,2022-03-08 00:13:00,2022-03-08 01:03:00,Station-37,20434,10,19,CKB +LINE_18,Station-37,2022-03-08 01:13:00,2022-03-08 02:03:00,Station-37,20434,10,19,CKB +LINE_18,Station-37,2022-03-08 02:13:00,2022-03-08 03:03:00,Station-37,20434,10,19,CKB +LINE_18,Station-37,2022-03-08 03:13:00,2022-03-08 04:03:00,Station-37,20434,0,19,CKB +LINE_18,Station-37,2022-03-08 04:03:00,2022-03-08 04:03:00,Station-0,0.06,0,19,CKB +LINE_19,Station-0,2022-03-08 00:24:00,2022-03-08 00:24:00,Station-38,0.06,0,20,CKB +LINE_19,Station-38,2022-03-08 00:24:00,2022-03-08 00:48:00,Station-39,11.86,4,20,CKB +LINE_19,Station-39,2022-03-08 00:52:00,2022-03-08 01:14:00,Station-38,11139,10,20,CKB +LINE_19,Station-38,2022-03-08 01:24:00,2022-03-08 01:48:00,Station-39,11.86,4,20,CKB +LINE_19,Station-39,2022-03-08 01:52:00,2022-03-08 02:14:00,Station-38,11139,10,20,CKB +LINE_19,Station-38,2022-03-08 02:24:00,2022-03-08 02:48:00,Station-39,11.86,4,20,CKB +LINE_19,Station-39,2022-03-08 02:52:00,2022-03-08 03:14:00,Station-38,11139,10,20,CKB +LINE_19,Station-38,2022-03-08 03:24:00,2022-03-08 03:48:00,Station-39,11.86,4,20,CKB +LINE_19,Station-39,2022-03-08 03:52:00,2022-03-08 04:14:00,Station-38,11139,0,20,CKB +LINE_19,Station-38,2022-03-08 04:14:00,2022-03-08 04:14:00,Station-0,0.06,0,20,CKB +LINE_19,Station-0,2022-03-08 00:22:00,2022-03-08 00:22:00,Station-39,0.06,0,21,CKB +LINE_19,Station-39,2022-03-08 00:22:00,2022-03-08 00:44:00,Station-38,11139,10,21,CKB +LINE_19,Station-38,2022-03-08 00:54:00,2022-03-08 01:18:00,Station-39,11.86,4,21,CKB +LINE_19,Station-39,2022-03-08 01:22:00,2022-03-08 01:44:00,Station-38,11139,10,21,CKB +LINE_19,Station-38,2022-03-08 01:54:00,2022-03-08 02:18:00,Station-39,11.86,4,21,CKB +LINE_19,Station-39,2022-03-08 02:22:00,2022-03-08 02:44:00,Station-38,11139,10,21,CKB +LINE_19,Station-38,2022-03-08 02:54:00,2022-03-08 03:18:00,Station-39,11.86,4,21,CKB +LINE_19,Station-39,2022-03-08 03:22:00,2022-03-08 03:44:00,Station-38,11139,10,21,CKB +LINE_19,Station-38,2022-03-08 03:54:00,2022-03-08 04:18:00,Station-39,11.86,4,21,CKB +LINE_19,Station-39,2022-03-08 04:22:00,2022-03-08 04:44:00,Station-38,11139,0,21,CKB +LINE_19,Station-38,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,21,CKB +LINE_20,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,22,CKB +LINE_20,Station-13,2022-03-08 00:32:00,2022-03-08 00:44:00,Station-40,4212,3,22,CKB +LINE_20,Station-40,2022-03-08 00:47:00,2022-03-08 01:16:00,Station-41,13048,0,22,CKB +LINE_20,Station-41,2022-03-08 01:16:00,2022-03-08 01:42:00,Station-40,12869,5,22,CKB +LINE_20,Station-40,2022-03-08 01:47:00,2022-03-08 02:16:00,Station-41,13048,0,22,CKB +LINE_20,Station-41,2022-03-08 02:16:00,2022-03-08 02:42:00,Station-40,12869,5,22,CKB +LINE_20,Station-40,2022-03-08 02:47:00,2022-03-08 03:16:00,Station-41,13048,0,22,CKB +LINE_20,Station-41,2022-03-08 03:16:00,2022-03-08 03:42:00,Station-40,12869,5,22,CKB +LINE_20,Station-40,2022-03-08 03:47:00,2022-03-08 04:16:00,Station-41,13048,0,22,CKB +LINE_20,Station-41,2022-03-08 04:16:00,2022-03-08 04:34:00,Station-42,9538,0,22,CKB +LINE_20,Station-42,2022-03-08 04:34:00,2022-03-08 04:34:00,Station-0,0.06,0,22,CKB +LINE_20,Station-0,2022-03-08 00:17:00,2022-03-08 00:17:00,Station-40,0.06,0,23,CKB +LINE_20,Station-40,2022-03-08 00:17:00,2022-03-08 00:46:00,Station-41,13048,0,23,CKB +LINE_20,Station-41,2022-03-08 00:46:00,2022-03-08 01:12:00,Station-40,12869,5,23,CKB +LINE_20,Station-40,2022-03-08 01:17:00,2022-03-08 01:46:00,Station-41,13048,0,23,CKB +LINE_20,Station-41,2022-03-08 01:46:00,2022-03-08 02:12:00,Station-40,12869,5,23,CKB +LINE_20,Station-40,2022-03-08 02:17:00,2022-03-08 02:46:00,Station-41,13048,0,23,CKB +LINE_20,Station-41,2022-03-08 02:46:00,2022-03-08 03:12:00,Station-40,12869,5,23,CKB +LINE_20,Station-40,2022-03-08 03:17:00,2022-03-08 03:46:00,Station-41,13048,0,23,CKB +LINE_20,Station-41,2022-03-08 03:46:00,2022-03-08 04:12:00,Station-40,12869,5,23,CKB +LINE_20,Station-40,2022-03-08 04:17:00,2022-03-08 04:28:00,Station-13,4316,0,23,CKB +LINE_20,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,23,CKB +LINE_21,Station-0,2022-03-08 00:49:00,2022-03-08 00:49:00,Station-3,0.06,0,24,CKB +LINE_21,Station-3,2022-03-08 00:49:00,2022-03-08 01:04:00,Station-16,10229,0,24,CKB +LINE_21,Station-16,2022-03-08 01:04:00,2022-03-08 01:19:00,Station-3,11801,0,24,CKB +LINE_21,Station-3,2022-03-08 01:19:00,2022-03-08 01:34:00,Station-16,10229,0,24,CKB +LINE_21,Station-16,2022-03-08 01:34:00,2022-03-08 01:49:00,Station-3,11801,0,24,CKB +LINE_21,Station-3,2022-03-08 01:49:00,2022-03-08 02:04:00,Station-16,10229,0,24,CKB +LINE_21,Station-16,2022-03-08 02:04:00,2022-03-08 02:19:00,Station-3,11801,0,24,CKB +LINE_21,Station-3,2022-03-08 02:19:00,2022-03-08 02:34:00,Station-16,10229,0,24,CKB +LINE_21,Station-16,2022-03-08 02:34:00,2022-03-08 02:49:00,Station-3,11801,0,24,CKB +LINE_21,Station-3,2022-03-08 02:49:00,2022-03-08 03:04:00,Station-16,10229,0,24,CKB +LINE_21,Station-16,2022-03-08 03:04:00,2022-03-08 03:19:00,Station-3,11801,0,24,CKB +LINE_21,Station-3,2022-03-08 03:19:00,2022-03-08 03:34:00,Station-16,10229,0,24,CKB +LINE_21,Station-16,2022-03-08 03:34:00,2022-03-08 03:49:00,Station-3,11801,0,24,CKB +LINE_21,Station-3,2022-03-08 03:49:00,2022-03-08 04:04:00,Station-16,10229,0,24,CKB +LINE_21,Station-16,2022-03-08 04:04:00,2022-03-08 04:19:00,Station-3,11801,23,24,CKB +LINE_22,Station-3,2022-03-08 04:42:00,2022-03-08 05:04:00,Station-43,6.81,0,24,CKB +LINE_22,Station-43,2022-03-08 05:04:00,2022-03-08 05:04:00,Station-0,0.06,0,24,CKB +LINE_8,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,25,CKB +LINE_8,Station-13,2022-03-08 00:32:00,2022-03-08 00:57:00,Station-21,11545,6,25,CKB +LINE_8,Station-21,2022-03-08 01:03:00,2022-03-08 01:46:00,Station-20,20579,1,25,CKB +LINE_8,Station-20,2022-03-08 01:47:00,2022-03-08 02:25:00,Station-21,20641,8,25,CKB +LINE_8,Station-21,2022-03-08 02:33:00,2022-03-08 03:16:00,Station-20,20579,1,25,CKB +LINE_8,Station-20,2022-03-08 03:17:00,2022-03-08 03:55:00,Station-21,20641,8,25,CKB +LINE_8,Station-21,2022-03-08 04:03:00,2022-03-08 04:28:00,Station-13,11499,0,25,CKB +LINE_8,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,25,CKB +LINE_8,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-21,0.06,0,26,CKB +LINE_8,Station-21,2022-03-08 00:33:00,2022-03-08 01:16:00,Station-20,20579,1,26,CKB +LINE_8,Station-20,2022-03-08 01:17:00,2022-03-08 01:55:00,Station-21,20641,8,26,CKB +LINE_8,Station-21,2022-03-08 02:03:00,2022-03-08 02:46:00,Station-20,20579,1,26,CKB +LINE_8,Station-20,2022-03-08 02:47:00,2022-03-08 03:25:00,Station-21,20641,8,26,CKB +LINE_8,Station-21,2022-03-08 03:33:00,2022-03-08 04:16:00,Station-20,20579,1,26,CKB +LINE_8,Station-20,2022-03-08 04:17:00,2022-03-08 04:51:00,Station-44,18752,0,26,CKB +LINE_8,Station-44,2022-03-08 04:51:00,2022-03-08 04:51:00,Station-0,0.06,0,26,CKB +LINE_23,Station-0,2022-03-08 00:34:00,2022-03-08 00:34:00,Station-45,0.06,0,27,CKB +LINE_23,Station-45,2022-03-08 00:34:00,2022-03-08 01:00:00,Station-46,9016,0,27,CKB +LINE_23,Station-46,2022-03-08 01:00:00,2022-03-08 01:27:00,Station-45,10083,7,27,CKB +LINE_23,Station-45,2022-03-08 01:34:00,2022-03-08 02:00:00,Station-46,9016,0,27,CKB +LINE_23,Station-46,2022-03-08 02:00:00,2022-03-08 02:27:00,Station-45,10083,7,27,CKB +LINE_23,Station-45,2022-03-08 02:34:00,2022-03-08 03:00:00,Station-46,9016,0,27,CKB +LINE_23,Station-46,2022-03-08 03:00:00,2022-03-08 03:27:00,Station-45,10083,7,27,CKB +LINE_23,Station-45,2022-03-08 03:34:00,2022-03-08 04:00:00,Station-46,9016,0,27,CKB +LINE_23,Station-46,2022-03-08 04:00:00,2022-03-08 04:27:00,Station-45,10083,0,27,CKB +LINE_23,Station-45,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,27,CKB +LINE_23,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-46,0.06,0,28,CKB +LINE_23,Station-46,2022-03-08 00:30:00,2022-03-08 00:57:00,Station-45,10083,7,28,CKB +LINE_23,Station-45,2022-03-08 01:04:00,2022-03-08 01:30:00,Station-46,9016,0,28,CKB +LINE_23,Station-46,2022-03-08 01:30:00,2022-03-08 01:57:00,Station-45,10083,7,28,CKB +LINE_23,Station-45,2022-03-08 02:04:00,2022-03-08 02:30:00,Station-46,9016,0,28,CKB +LINE_23,Station-46,2022-03-08 02:30:00,2022-03-08 02:57:00,Station-45,10083,7,28,CKB +LINE_23,Station-45,2022-03-08 03:04:00,2022-03-08 03:30:00,Station-46,9016,0,28,CKB +LINE_23,Station-46,2022-03-08 03:30:00,2022-03-08 03:57:00,Station-45,10083,7,28,CKB +LINE_23,Station-45,2022-03-08 04:04:00,2022-03-08 04:30:00,Station-46,9016,0,28,CKB +LINE_23,Station-46,2022-03-08 04:30:00,2022-03-08 04:57:00,Station-45,10083,0,28,CKB +LINE_23,Station-45,2022-03-08 04:57:00,2022-03-08 04:57:00,Station-0,0.06,0,28,CKB +LINE_24,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,29,CKB +LINE_24,Station-21,2022-03-08 00:31:00,2022-03-08 00:44:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 00:44:00,2022-03-08 00:56:00,Station-21,5362,5,29,CKB +LINE_24,Station-21,2022-03-08 01:01:00,2022-03-08 01:14:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 01:14:00,2022-03-08 01:26:00,Station-21,5362,5,29,CKB +LINE_24,Station-21,2022-03-08 01:31:00,2022-03-08 01:44:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 01:44:00,2022-03-08 01:56:00,Station-21,5362,5,29,CKB +LINE_24,Station-21,2022-03-08 02:01:00,2022-03-08 02:14:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 02:14:00,2022-03-08 02:26:00,Station-21,5362,5,29,CKB +LINE_24,Station-21,2022-03-08 02:31:00,2022-03-08 02:44:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 02:44:00,2022-03-08 02:56:00,Station-21,5362,5,29,CKB +LINE_24,Station-21,2022-03-08 03:01:00,2022-03-08 03:14:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 03:14:00,2022-03-08 03:26:00,Station-21,5362,5,29,CKB +LINE_24,Station-21,2022-03-08 03:31:00,2022-03-08 03:44:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 03:44:00,2022-03-08 03:56:00,Station-21,5362,5,29,CKB +LINE_24,Station-21,2022-03-08 04:01:00,2022-03-08 04:14:00,Station-47,4872,0,29,CKB +LINE_24,Station-47,2022-03-08 04:14:00,2022-03-08 04:26:00,Station-21,5362,0,29,CKB +LINE_24,Station-21,2022-03-08 04:26:00,2022-03-08 04:26:00,Station-0,0.06,0,29,CKB +LINE_25,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,30,CKB +LINE_25,Station-21,2022-03-08 00:31:00,2022-03-08 00:45:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 00:47:00,2022-03-08 01:01:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 01:01:00,2022-03-08 01:15:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 01:17:00,2022-03-08 01:31:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 01:31:00,2022-03-08 01:45:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 01:47:00,2022-03-08 02:01:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 02:01:00,2022-03-08 02:15:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 02:17:00,2022-03-08 02:31:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 02:31:00,2022-03-08 02:45:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 02:47:00,2022-03-08 03:01:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 03:01:00,2022-03-08 03:15:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 03:17:00,2022-03-08 03:31:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 03:31:00,2022-03-08 03:45:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 03:47:00,2022-03-08 04:01:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 04:01:00,2022-03-08 04:15:00,Station-48,5225,2,30,CKB +LINE_25,Station-48,2022-03-08 04:17:00,2022-03-08 04:31:00,Station-21,7617,0,30,CKB +LINE_25,Station-21,2022-03-08 04:31:00,2022-03-08 04:31:00,Station-0,0.06,0,30,CKB +LINE_26,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-49,0.06,0,31,CKB +LINE_26,Station-49,2022-03-08 00:43:00,2022-03-08 00:53:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 00:53:00,2022-03-08 01:03:00,Station-49,4408,10,31,CKB +LINE_26,Station-49,2022-03-08 01:13:00,2022-03-08 01:23:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 01:23:00,2022-03-08 01:33:00,Station-49,4408,10,31,CKB +LINE_26,Station-49,2022-03-08 01:43:00,2022-03-08 01:53:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 01:53:00,2022-03-08 02:03:00,Station-49,4408,10,31,CKB +LINE_26,Station-49,2022-03-08 02:13:00,2022-03-08 02:23:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 02:23:00,2022-03-08 02:33:00,Station-49,4408,10,31,CKB +LINE_26,Station-49,2022-03-08 02:43:00,2022-03-08 02:53:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 02:53:00,2022-03-08 03:03:00,Station-49,4408,10,31,CKB +LINE_26,Station-49,2022-03-08 03:13:00,2022-03-08 03:23:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 03:23:00,2022-03-08 03:33:00,Station-49,4408,10,31,CKB +LINE_26,Station-49,2022-03-08 03:43:00,2022-03-08 03:53:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 03:53:00,2022-03-08 04:03:00,Station-49,4408,10,31,CKB +LINE_26,Station-49,2022-03-08 04:13:00,2022-03-08 04:23:00,Station-50,4507,0,31,CKB +LINE_26,Station-50,2022-03-08 04:23:00,2022-03-08 04:33:00,Station-49,4408,0,31,CKB +LINE_26,Station-49,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,31,CKB +LINE_21,Station-0,2022-03-07 00:49:00,2022-03-07 00:49:00,Station-3,0.06,0,32,CKB +LINE_21,Station-3,2022-03-07 00:49:00,2022-03-07 01:04:00,Station-16,10229,0,32,CKB +LINE_21,Station-16,2022-03-07 01:04:00,2022-03-07 01:19:00,Station-3,11801,0,32,CKB +LINE_21,Station-3,2022-03-07 01:19:00,2022-03-07 01:34:00,Station-16,10229,0,32,CKB +LINE_21,Station-16,2022-03-07 01:34:00,2022-03-07 01:49:00,Station-3,11801,0,32,CKB +LINE_21,Station-3,2022-03-07 01:49:00,2022-03-07 02:04:00,Station-16,10229,0,32,CKB +LINE_21,Station-16,2022-03-07 02:04:00,2022-03-07 02:19:00,Station-3,11801,0,32,CKB +LINE_21,Station-3,2022-03-07 02:19:00,2022-03-07 02:34:00,Station-16,10229,0,32,CKB +LINE_21,Station-16,2022-03-07 02:34:00,2022-03-07 02:49:00,Station-3,11801,0,32,CKB +LINE_21,Station-3,2022-03-07 02:49:00,2022-03-07 03:04:00,Station-16,10229,0,32,CKB +LINE_21,Station-16,2022-03-07 03:04:00,2022-03-07 03:19:00,Station-3,11801,0,32,CKB +LINE_21,Station-3,2022-03-07 03:19:00,2022-03-07 03:34:00,Station-16,10229,0,32,CKB +LINE_21,Station-16,2022-03-07 03:34:00,2022-03-07 03:49:00,Station-3,11801,0,32,CKB +LINE_21,Station-3,2022-03-07 03:49:00,2022-03-07 04:04:00,Station-16,10229,0,32,CKB +LINE_21,Station-16,2022-03-07 04:04:00,2022-03-07 04:19:00,Station-3,11801,23,32,CKB +LINE_22,Station-3,2022-03-07 04:42:00,2022-03-07 05:04:00,Station-43,6.81,0,32,CKB +LINE_22,Station-43,2022-03-07 05:04:00,2022-03-07 05:04:00,Station-0,0.06,0,32,CKB +LINE_13,Station-0,2022-03-07 00:23:00,2022-03-07 00:23:00,Station-29,0.06,0,33,CKB +LINE_13,Station-29,2022-03-07 00:23:00,2022-03-07 00:30:00,Station-30,2577,9,33,CKB +LINE_14,Station-30,2022-03-07 00:39:00,2022-03-07 00:54:00,Station-31,5937,9,33,CKB +LINE_14,Station-31,2022-03-07 01:03:00,2022-03-07 01:17:00,Station-30,6.19,0,33,CKB +LINE_13,Station-30,2022-03-07 01:17:00,2022-03-07 01:23:00,Station-29,2555,0,33,CKB +LINE_13,Station-29,2022-03-07 01:23:00,2022-03-07 01:30:00,Station-30,2577,9,33,CKB +LINE_14,Station-30,2022-03-07 01:39:00,2022-03-07 01:54:00,Station-31,5937,9,33,CKB +LINE_14,Station-31,2022-03-07 02:03:00,2022-03-07 02:17:00,Station-30,6.19,0,33,CKB +LINE_13,Station-30,2022-03-07 02:17:00,2022-03-07 02:23:00,Station-29,2555,0,33,CKB +LINE_13,Station-29,2022-03-07 02:23:00,2022-03-07 02:30:00,Station-30,2577,9,33,CKB +LINE_14,Station-30,2022-03-07 02:39:00,2022-03-07 02:54:00,Station-31,5937,9,33,CKB +LINE_14,Station-31,2022-03-07 03:03:00,2022-03-07 03:17:00,Station-30,6.19,0,33,CKB +LINE_13,Station-30,2022-03-07 03:17:00,2022-03-07 03:23:00,Station-29,2555,0,33,CKB +LINE_13,Station-29,2022-03-07 03:23:00,2022-03-07 03:30:00,Station-30,2577,9,33,CKB +LINE_14,Station-30,2022-03-07 03:39:00,2022-03-07 03:54:00,Station-31,5937,9,33,CKB +LINE_14,Station-31,2022-03-07 04:03:00,2022-03-07 04:17:00,Station-30,6.19,0,33,CKB +LINE_13,Station-30,2022-03-07 04:17:00,2022-03-07 04:23:00,Station-29,2555,0,33,CKB +LINE_13,Station-29,2022-03-07 04:23:00,2022-03-07 04:23:00,Station-0,0.06,0,33,CKB +LINE_14,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-31,0.06,0,34,CKB +LINE_14,Station-31,2022-03-07 00:33:00,2022-03-07 00:47:00,Station-30,6.19,0,34,CKB +LINE_13,Station-30,2022-03-07 00:47:00,2022-03-07 00:53:00,Station-29,2555,0,34,CKB +LINE_13,Station-29,2022-03-07 00:53:00,2022-03-07 01:00:00,Station-30,2577,9,34,CKB +LINE_14,Station-30,2022-03-07 01:09:00,2022-03-07 01:24:00,Station-31,5937,9,34,CKB +LINE_14,Station-31,2022-03-07 01:33:00,2022-03-07 01:47:00,Station-30,6.19,0,34,CKB +LINE_13,Station-30,2022-03-07 01:47:00,2022-03-07 01:53:00,Station-29,2555,0,34,CKB +LINE_13,Station-29,2022-03-07 01:53:00,2022-03-07 02:00:00,Station-30,2577,9,34,CKB +LINE_14,Station-30,2022-03-07 02:09:00,2022-03-07 02:24:00,Station-31,5937,9,34,CKB +LINE_14,Station-31,2022-03-07 02:33:00,2022-03-07 02:47:00,Station-30,6.19,0,34,CKB +LINE_13,Station-30,2022-03-07 02:47:00,2022-03-07 02:53:00,Station-29,2555,0,34,CKB +LINE_13,Station-29,2022-03-07 02:53:00,2022-03-07 03:00:00,Station-30,2577,9,34,CKB +LINE_14,Station-30,2022-03-07 03:09:00,2022-03-07 03:24:00,Station-31,5937,9,34,CKB +LINE_14,Station-31,2022-03-07 03:33:00,2022-03-07 03:47:00,Station-30,6.19,0,34,CKB +LINE_13,Station-30,2022-03-07 03:47:00,2022-03-07 03:53:00,Station-29,2555,0,34,CKB +LINE_13,Station-29,2022-03-07 03:53:00,2022-03-07 04:00:00,Station-30,2577,9,34,CKB +LINE_14,Station-30,2022-03-07 04:09:00,2022-03-07 04:24:00,Station-31,5937,0,34,CKB +LINE_14,Station-31,2022-03-07 04:24:00,2022-03-07 04:24:00,Station-0,0.06,0,34,CKB +LINE_15,Station-0,2022-03-07 00:57:00,2022-03-07 00:57:00,Station-32,0.06,0,35,CKB +LINE_15,Station-32,2022-03-07 00:57:00,2022-03-07 01:06:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 01:06:00,2022-03-07 01:11:00,Station-32,2936,16,35,CKB +LINE_15,Station-32,2022-03-07 01:27:00,2022-03-07 01:36:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 01:36:00,2022-03-07 01:41:00,Station-32,2936,16,35,CKB +LINE_15,Station-32,2022-03-07 01:57:00,2022-03-07 02:06:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 02:06:00,2022-03-07 02:11:00,Station-32,2936,16,35,CKB +LINE_15,Station-32,2022-03-07 02:27:00,2022-03-07 02:36:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 02:36:00,2022-03-07 02:41:00,Station-32,2936,16,35,CKB +LINE_15,Station-32,2022-03-07 02:57:00,2022-03-07 03:06:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 03:06:00,2022-03-07 03:11:00,Station-32,2936,16,35,CKB +LINE_15,Station-32,2022-03-07 03:27:00,2022-03-07 03:36:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 03:36:00,2022-03-07 03:41:00,Station-32,2936,16,35,CKB +LINE_15,Station-32,2022-03-07 03:57:00,2022-03-07 04:06:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 04:06:00,2022-03-07 04:11:00,Station-32,2936,16,35,CKB +LINE_15,Station-32,2022-03-07 04:27:00,2022-03-07 04:36:00,Station-33,4343,0,35,CKB +LINE_15,Station-33,2022-03-07 04:36:00,2022-03-07 04:36:00,Station-0,0.06,0,35,CKB +LINE_16,Station-0,2022-03-07 00:29:00,2022-03-07 00:29:00,Station-34,0.06,0,36,CKB +LINE_16,Station-34,2022-03-07 00:29:00,2022-03-07 00:41:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 00:47:00,2022-03-07 00:57:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 00:59:00,2022-03-07 01:11:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 01:17:00,2022-03-07 01:27:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 01:29:00,2022-03-07 01:41:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 01:47:00,2022-03-07 01:57:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 01:59:00,2022-03-07 02:11:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 02:17:00,2022-03-07 02:27:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 02:29:00,2022-03-07 02:41:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 02:47:00,2022-03-07 02:57:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 02:59:00,2022-03-07 03:11:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 03:17:00,2022-03-07 03:27:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 03:29:00,2022-03-07 03:41:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 03:47:00,2022-03-07 03:57:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 03:59:00,2022-03-07 04:11:00,Station-35,4481,6,36,CKB +LINE_16,Station-35,2022-03-07 04:17:00,2022-03-07 04:27:00,Station-34,4031,2,36,CKB +LINE_16,Station-34,2022-03-07 04:29:00,2022-03-07 04:41:00,Station-35,4481,0,36,CKB +LINE_16,Station-35,2022-03-07 04:41:00,2022-03-07 04:41:00,Station-0,0.06,0,36,CKB +LINE_17,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-34,0.06,0,37,CKB +LINE_17,Station-34,2022-03-07 00:30:00,2022-03-07 00:44:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 00:44:00,2022-03-07 00:57:00,Station-34,5302,3,37,CKB +LINE_17,Station-34,2022-03-07 01:00:00,2022-03-07 01:14:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 01:14:00,2022-03-07 01:27:00,Station-34,5302,3,37,CKB +LINE_17,Station-34,2022-03-07 01:30:00,2022-03-07 01:44:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 01:44:00,2022-03-07 01:57:00,Station-34,5302,3,37,CKB +LINE_17,Station-34,2022-03-07 02:00:00,2022-03-07 02:14:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 02:14:00,2022-03-07 02:27:00,Station-34,5302,3,37,CKB +LINE_17,Station-34,2022-03-07 02:30:00,2022-03-07 02:44:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 02:44:00,2022-03-07 02:57:00,Station-34,5302,3,37,CKB +LINE_17,Station-34,2022-03-07 03:00:00,2022-03-07 03:14:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 03:14:00,2022-03-07 03:27:00,Station-34,5302,3,37,CKB +LINE_17,Station-34,2022-03-07 03:30:00,2022-03-07 03:44:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 03:44:00,2022-03-07 03:57:00,Station-34,5302,3,37,CKB +LINE_17,Station-34,2022-03-07 04:00:00,2022-03-07 04:14:00,Station-36,4801,0,37,CKB +LINE_17,Station-36,2022-03-07 04:14:00,2022-03-07 04:27:00,Station-34,5302,0,37,CKB +LINE_17,Station-34,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,37,CKB +LINE_18,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-37,0.06,0,38,CKB +LINE_18,Station-37,2022-03-07 00:43:00,2022-03-07 01:33:00,Station-37,20434,10,38,CKB +LINE_18,Station-37,2022-03-07 01:43:00,2022-03-07 02:33:00,Station-37,20434,10,38,CKB +LINE_18,Station-37,2022-03-07 02:43:00,2022-03-07 03:33:00,Station-37,20434,10,38,CKB +LINE_18,Station-37,2022-03-07 03:43:00,2022-03-07 04:33:00,Station-37,20434,0,38,CKB +LINE_18,Station-37,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,38,CKB +LINE_18,Station-0,2022-03-07 00:13:00,2022-03-07 00:13:00,Station-37,0.06,0,39,CKB +LINE_18,Station-37,2022-03-07 00:13:00,2022-03-07 01:03:00,Station-37,20434,10,39,CKB +LINE_18,Station-37,2022-03-07 01:13:00,2022-03-07 02:03:00,Station-37,20434,10,39,CKB +LINE_18,Station-37,2022-03-07 02:13:00,2022-03-07 03:03:00,Station-37,20434,10,39,CKB +LINE_18,Station-37,2022-03-07 03:13:00,2022-03-07 04:03:00,Station-37,20434,0,39,CKB +LINE_18,Station-37,2022-03-07 04:03:00,2022-03-07 04:03:00,Station-0,0.06,0,39,CKB +LINE_19,Station-0,2022-03-07 00:24:00,2022-03-07 00:24:00,Station-38,0.06,0,40,CKB +LINE_19,Station-38,2022-03-07 00:24:00,2022-03-07 00:48:00,Station-39,11.86,4,40,CKB +LINE_19,Station-39,2022-03-07 00:52:00,2022-03-07 01:14:00,Station-38,11139,10,40,CKB +LINE_19,Station-38,2022-03-07 01:24:00,2022-03-07 01:48:00,Station-39,11.86,4,40,CKB +LINE_19,Station-39,2022-03-07 01:52:00,2022-03-07 02:14:00,Station-38,11139,10,40,CKB +LINE_19,Station-38,2022-03-07 02:24:00,2022-03-07 02:48:00,Station-39,11.86,4,40,CKB +LINE_19,Station-39,2022-03-07 02:52:00,2022-03-07 03:14:00,Station-38,11139,10,40,CKB +LINE_19,Station-38,2022-03-07 03:24:00,2022-03-07 03:48:00,Station-39,11.86,4,40,CKB +LINE_19,Station-39,2022-03-07 03:52:00,2022-03-07 04:14:00,Station-38,11139,0,40,CKB +LINE_19,Station-38,2022-03-07 04:14:00,2022-03-07 04:14:00,Station-0,0.06,0,40,CKB +LINE_19,Station-0,2022-03-07 00:22:00,2022-03-07 00:22:00,Station-39,0.06,0,41,CKB +LINE_19,Station-39,2022-03-07 00:22:00,2022-03-07 00:44:00,Station-38,11139,10,41,CKB +LINE_19,Station-38,2022-03-07 00:54:00,2022-03-07 01:18:00,Station-39,11.86,4,41,CKB +LINE_19,Station-39,2022-03-07 01:22:00,2022-03-07 01:44:00,Station-38,11139,10,41,CKB +LINE_19,Station-38,2022-03-07 01:54:00,2022-03-07 02:18:00,Station-39,11.86,4,41,CKB +LINE_19,Station-39,2022-03-07 02:22:00,2022-03-07 02:44:00,Station-38,11139,10,41,CKB +LINE_19,Station-38,2022-03-07 02:54:00,2022-03-07 03:18:00,Station-39,11.86,4,41,CKB +LINE_19,Station-39,2022-03-07 03:22:00,2022-03-07 03:44:00,Station-38,11139,10,41,CKB +LINE_19,Station-38,2022-03-07 03:54:00,2022-03-07 04:18:00,Station-39,11.86,4,41,CKB +LINE_19,Station-39,2022-03-07 04:22:00,2022-03-07 04:44:00,Station-38,11139,0,41,CKB +LINE_19,Station-38,2022-03-07 04:44:00,2022-03-07 04:44:00,Station-0,0.06,0,41,CKB +LINE_0,Station-0,2022-03-13 20:51:00,2022-03-13 20:51:00,Station-1,0.06,0,42,CKB +LINE_0,Station-1,2022-03-13 20:51:00,2022-03-13 21:24:00,Station-2,14519,4,42,CKB +LINE_0,Station-2,2022-03-13 21:28:00,2022-03-13 22:03:00,Station-1,13541,8,42,CKB +LINE_0,Station-1,2022-03-13 22:11:00,2022-03-13 22:44:00,Station-2,14519,4,42,CKB +LINE_0,Station-2,2022-03-13 22:48:00,2022-03-13 23:23:00,Station-1,13541,8,42,CKB +LINE_0,Station-1,2022-03-13 23:31:00,2022-03-14 00:04:00,Station-2,14519,4,42,CKB +LINE_0,Station-2,2022-03-14 00:08:00,2022-03-14 00:39:00,Station-5,12213,0,42,CKB +LINE_1,Station-5,2022-03-14 00:39:00,2022-03-14 00:47:00,Station-3,4.0,2,42,CKB +LINE_1,Station-3,2022-03-14 00:49:00,2022-03-14 01:12:00,Station-4,8.36,6,42,CKB +LINE_1,Station-4,2022-03-14 01:18:00,2022-03-14 01:36:00,Station-3,9067,13,42,CKB +LINE_1,Station-3,2022-03-14 01:49:00,2022-03-14 02:12:00,Station-4,8.36,6,42,CKB +LINE_1,Station-4,2022-03-14 02:18:00,2022-03-14 02:36:00,Station-3,9067,13,42,CKB +LINE_1,Station-3,2022-03-14 02:49:00,2022-03-14 03:12:00,Station-4,8.36,6,42,CKB +LINE_1,Station-4,2022-03-14 03:18:00,2022-03-14 03:36:00,Station-3,9067,13,42,CKB +LINE_1,Station-3,2022-03-14 03:49:00,2022-03-14 04:12:00,Station-4,8.36,0,42,CKB +LINE_1,Station-4,2022-03-14 04:12:00,2022-03-14 04:12:00,Station-0,0.06,0,42,CKB +LINE_0,Station-0,2022-03-13 21:31:00,2022-03-13 21:31:00,Station-1,0.06,0,43,CKB +LINE_0,Station-1,2022-03-13 21:31:00,2022-03-13 22:04:00,Station-2,14519,4,43,CKB +LINE_0,Station-2,2022-03-13 22:08:00,2022-03-13 22:43:00,Station-1,13541,8,43,CKB +LINE_0,Station-1,2022-03-13 22:51:00,2022-03-13 23:24:00,Station-2,14519,4,43,CKB +LINE_0,Station-2,2022-03-13 23:28:00,2022-03-14 00:03:00,Station-1,13541,8,43,CKB +LINE_0,Station-1,2022-03-14 00:11:00,2022-03-14 00:44:00,Station-2,14519,0,43,CKB +LINE_1,Station-2,2022-03-14 00:44:00,2022-03-14 00:54:00,Station-3,4.1,25,43,CKB +LINE_1,Station-3,2022-03-14 01:19:00,2022-03-14 01:42:00,Station-4,8.36,6,43,CKB +LINE_1,Station-4,2022-03-14 01:48:00,2022-03-14 02:06:00,Station-3,9067,13,43,CKB +LINE_1,Station-3,2022-03-14 02:19:00,2022-03-14 02:42:00,Station-4,8.36,6,43,CKB +LINE_1,Station-4,2022-03-14 02:48:00,2022-03-14 03:06:00,Station-3,9067,13,43,CKB +LINE_1,Station-3,2022-03-14 03:19:00,2022-03-14 03:42:00,Station-4,8.36,6,43,CKB +LINE_1,Station-4,2022-03-14 03:48:00,2022-03-14 04:06:00,Station-3,9067,0,43,CKB +LINE_1,Station-3,2022-03-14 04:06:00,2022-03-14 04:06:00,Station-0,0.06,0,43,CKB +LINE_2,Station-0,2022-03-13 21:06:00,2022-03-13 21:06:00,Station-6,0.06,0,44,CKB +LINE_2,Station-6,2022-03-13 21:06:00,2022-03-13 21:34:00,Station-7,13018,19,44,CKB +LINE_2,Station-7,2022-03-13 21:53:00,2022-03-13 22:13:00,Station-8,10332,17,44,CKB +LINE_2,Station-8,2022-03-13 22:30:00,2022-03-13 22:54:00,Station-7,10.48,19,44,CKB +LINE_2,Station-7,2022-03-13 23:13:00,2022-03-13 23:33:00,Station-8,10332,17,44,CKB +LINE_2,Station-8,2022-03-13 23:50:00,2022-03-14 00:14:00,Station-7,10.48,2,44,CKB +LINE_2,Station-7,2022-03-14 00:16:00,2022-03-14 00:23:00,Station-9,3709,5,44,CKB +LINE_3,Station-9,2022-03-14 00:28:00,2022-03-14 00:44:00,Station-10,6404,3,44,CKB +LINE_3,Station-10,2022-03-14 00:47:00,2022-03-14 01:10:00,Station-11,10579,7,44,CKB +LINE_3,Station-11,2022-03-14 01:17:00,2022-03-14 01:44:00,Station-10,12007,3,44,CKB +LINE_3,Station-10,2022-03-14 01:47:00,2022-03-14 02:10:00,Station-11,10579,7,44,CKB +LINE_3,Station-11,2022-03-14 02:17:00,2022-03-14 02:44:00,Station-10,12007,3,44,CKB +LINE_3,Station-10,2022-03-14 02:47:00,2022-03-14 03:10:00,Station-11,10579,7,44,CKB +LINE_3,Station-11,2022-03-14 03:17:00,2022-03-14 03:44:00,Station-10,12007,3,44,CKB +LINE_3,Station-10,2022-03-14 03:47:00,2022-03-14 04:10:00,Station-11,10579,7,44,CKB +LINE_3,Station-11,2022-03-14 04:17:00,2022-03-14 04:44:00,Station-10,12007,0,44,CKB +LINE_3,Station-10,2022-03-14 04:44:00,2022-03-14 04:44:00,Station-0,0.06,0,44,CKB +LINE_2,Station-0,2022-03-13 20:26:00,2022-03-13 20:26:00,Station-6,0.06,0,45,CKB +LINE_2,Station-6,2022-03-13 20:26:00,2022-03-13 20:56:00,Station-12,14097,14,45,CKB +LINE_2,Station-12,2022-03-13 21:10:00,2022-03-13 21:38:00,Station-6,13.19,8,45,CKB +LINE_2,Station-6,2022-03-13 21:46:00,2022-03-13 22:14:00,Station-7,13018,19,45,CKB +LINE_2,Station-7,2022-03-13 22:33:00,2022-03-13 22:53:00,Station-8,10332,17,45,CKB +LINE_2,Station-8,2022-03-13 23:10:00,2022-03-13 23:34:00,Station-7,10.48,19,45,CKB +LINE_2,Station-7,2022-03-13 23:53:00,2022-03-14 00:13:00,Station-8,10332,2,45,CKB +LINE_2,Station-8,2022-03-14 00:15:00,2022-03-14 00:16:00,Station-10,506,1,45,CKB +LINE_3,Station-10,2022-03-14 00:17:00,2022-03-14 00:40:00,Station-11,10579,7,45,CKB +LINE_3,Station-11,2022-03-14 00:47:00,2022-03-14 01:14:00,Station-10,12007,3,45,CKB +LINE_3,Station-10,2022-03-14 01:17:00,2022-03-14 01:40:00,Station-11,10579,7,45,CKB +LINE_3,Station-11,2022-03-14 01:47:00,2022-03-14 02:14:00,Station-10,12007,3,45,CKB +LINE_3,Station-10,2022-03-14 02:17:00,2022-03-14 02:40:00,Station-11,10579,7,45,CKB +LINE_3,Station-11,2022-03-14 02:47:00,2022-03-14 03:14:00,Station-10,12007,3,45,CKB +LINE_3,Station-10,2022-03-14 03:17:00,2022-03-14 03:40:00,Station-11,10579,7,45,CKB +LINE_3,Station-11,2022-03-14 03:47:00,2022-03-14 04:14:00,Station-10,12007,3,45,CKB +LINE_3,Station-10,2022-03-14 04:17:00,2022-03-14 04:40:00,Station-11,10579,3,45,CKB +LINE_4,Station-11,2022-03-14 04:43:00,2022-03-14 04:58:00,Station-13,6161,0,45,CKB +LINE_4,Station-13,2022-03-14 04:58:00,2022-03-14 04:58:00,Station-0,0.06,0,45,CKB +LINE_20,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,46,CKB +LINE_20,Station-13,2022-03-07 00:32:00,2022-03-07 00:44:00,Station-40,4212,3,46,CKB +LINE_20,Station-40,2022-03-07 00:47:00,2022-03-07 01:16:00,Station-41,13048,0,46,CKB +LINE_20,Station-41,2022-03-07 01:16:00,2022-03-07 01:42:00,Station-40,12869,5,46,CKB +LINE_20,Station-40,2022-03-07 01:47:00,2022-03-07 02:16:00,Station-41,13048,0,46,CKB +LINE_20,Station-41,2022-03-07 02:16:00,2022-03-07 02:42:00,Station-40,12869,5,46,CKB +LINE_20,Station-40,2022-03-07 02:47:00,2022-03-07 03:16:00,Station-41,13048,0,46,CKB +LINE_20,Station-41,2022-03-07 03:16:00,2022-03-07 03:42:00,Station-40,12869,5,46,CKB +LINE_20,Station-40,2022-03-07 03:47:00,2022-03-07 04:16:00,Station-41,13048,0,46,CKB +LINE_20,Station-41,2022-03-07 04:16:00,2022-03-07 04:34:00,Station-42,9538,0,46,CKB +LINE_20,Station-42,2022-03-07 04:34:00,2022-03-07 04:34:00,Station-0,0.06,0,46,CKB +LINE_20,Station-0,2022-03-07 00:17:00,2022-03-07 00:17:00,Station-40,0.06,0,47,CKB +LINE_20,Station-40,2022-03-07 00:17:00,2022-03-07 00:46:00,Station-41,13048,0,47,CKB +LINE_20,Station-41,2022-03-07 00:46:00,2022-03-07 01:12:00,Station-40,12869,5,47,CKB +LINE_20,Station-40,2022-03-07 01:17:00,2022-03-07 01:46:00,Station-41,13048,0,47,CKB +LINE_20,Station-41,2022-03-07 01:46:00,2022-03-07 02:12:00,Station-40,12869,5,47,CKB +LINE_20,Station-40,2022-03-07 02:17:00,2022-03-07 02:46:00,Station-41,13048,0,47,CKB +LINE_20,Station-41,2022-03-07 02:46:00,2022-03-07 03:12:00,Station-40,12869,5,47,CKB +LINE_20,Station-40,2022-03-07 03:17:00,2022-03-07 03:46:00,Station-41,13048,0,47,CKB +LINE_20,Station-41,2022-03-07 03:46:00,2022-03-07 04:12:00,Station-40,12869,5,47,CKB +LINE_20,Station-40,2022-03-07 04:17:00,2022-03-07 04:28:00,Station-13,4316,0,47,CKB +LINE_20,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,47,CKB +LINE_8,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,48,CKB +LINE_8,Station-13,2022-03-07 00:32:00,2022-03-07 00:57:00,Station-21,11545,6,48,CKB +LINE_8,Station-21,2022-03-07 01:03:00,2022-03-07 01:46:00,Station-20,20579,1,48,CKB +LINE_8,Station-20,2022-03-07 01:47:00,2022-03-07 02:25:00,Station-21,20641,8,48,CKB +LINE_8,Station-21,2022-03-07 02:33:00,2022-03-07 03:16:00,Station-20,20579,1,48,CKB +LINE_8,Station-20,2022-03-07 03:17:00,2022-03-07 03:55:00,Station-21,20641,8,48,CKB +LINE_8,Station-21,2022-03-07 04:03:00,2022-03-07 04:28:00,Station-13,11499,0,48,CKB +LINE_8,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,48,CKB +LINE_8,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-21,0.06,0,49,CKB +LINE_8,Station-21,2022-03-07 00:33:00,2022-03-07 01:16:00,Station-20,20579,1,49,CKB +LINE_8,Station-20,2022-03-07 01:17:00,2022-03-07 01:55:00,Station-21,20641,8,49,CKB +LINE_8,Station-21,2022-03-07 02:03:00,2022-03-07 02:46:00,Station-20,20579,1,49,CKB +LINE_8,Station-20,2022-03-07 02:47:00,2022-03-07 03:25:00,Station-21,20641,8,49,CKB +LINE_8,Station-21,2022-03-07 03:33:00,2022-03-07 04:16:00,Station-20,20579,1,49,CKB +LINE_8,Station-20,2022-03-07 04:17:00,2022-03-07 04:51:00,Station-44,18752,0,49,CKB +LINE_8,Station-44,2022-03-07 04:51:00,2022-03-07 04:51:00,Station-0,0.06,0,49,CKB +LINE_7,Station-0,2022-03-07 00:08:00,2022-03-07 00:08:00,Station-18,0.06,0,50,CKB +LINE_7,Station-18,2022-03-07 00:08:00,2022-03-07 00:27:00,Station-19,7827,0,50,CKB +LINE_8,Station-19,2022-03-07 00:27:00,2022-03-07 00:48:00,Station-20,11079,0,50,CKB +LINE_8,Station-20,2022-03-07 00:48:00,2022-03-07 01:25:00,Station-21,20641,8,50,CKB +LINE_8,Station-21,2022-03-07 01:33:00,2022-03-07 02:16:00,Station-20,20579,1,50,CKB +LINE_8,Station-20,2022-03-07 02:17:00,2022-03-07 02:55:00,Station-21,20641,8,50,CKB +LINE_8,Station-21,2022-03-07 03:03:00,2022-03-07 03:46:00,Station-20,20579,1,50,CKB +LINE_8,Station-20,2022-03-07 03:47:00,2022-03-07 04:25:00,Station-21,20641,0,50,CKB +LINE_8,Station-21,2022-03-07 04:25:00,2022-03-07 04:25:00,Station-0,0.06,0,50,CKB +LINE_23,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-46,0.06,0,51,CKB +LINE_23,Station-46,2022-03-07 00:30:00,2022-03-07 00:57:00,Station-45,10083,7,51,CKB +LINE_23,Station-45,2022-03-07 01:04:00,2022-03-07 01:30:00,Station-46,9016,0,51,CKB +LINE_23,Station-46,2022-03-07 01:30:00,2022-03-07 01:57:00,Station-45,10083,7,51,CKB +LINE_23,Station-45,2022-03-07 02:04:00,2022-03-07 02:30:00,Station-46,9016,0,51,CKB +LINE_23,Station-46,2022-03-07 02:30:00,2022-03-07 02:57:00,Station-45,10083,7,51,CKB +LINE_23,Station-45,2022-03-07 03:04:00,2022-03-07 03:30:00,Station-46,9016,0,51,CKB +LINE_23,Station-46,2022-03-07 03:30:00,2022-03-07 03:57:00,Station-45,10083,7,51,CKB +LINE_23,Station-45,2022-03-07 04:04:00,2022-03-07 04:30:00,Station-46,9016,0,51,CKB +LINE_23,Station-46,2022-03-07 04:30:00,2022-03-07 04:57:00,Station-45,10083,0,51,CKB +LINE_23,Station-45,2022-03-07 04:57:00,2022-03-07 04:57:00,Station-0,0.06,0,51,CKB +LINE_23,Station-0,2022-03-07 00:34:00,2022-03-07 00:34:00,Station-45,0.06,0,52,CKB +LINE_23,Station-45,2022-03-07 00:34:00,2022-03-07 01:00:00,Station-46,9016,0,52,CKB +LINE_23,Station-46,2022-03-07 01:00:00,2022-03-07 01:27:00,Station-45,10083,7,52,CKB +LINE_23,Station-45,2022-03-07 01:34:00,2022-03-07 02:00:00,Station-46,9016,0,52,CKB +LINE_23,Station-46,2022-03-07 02:00:00,2022-03-07 02:27:00,Station-45,10083,7,52,CKB +LINE_23,Station-45,2022-03-07 02:34:00,2022-03-07 03:00:00,Station-46,9016,0,52,CKB +LINE_23,Station-46,2022-03-07 03:00:00,2022-03-07 03:27:00,Station-45,10083,7,52,CKB +LINE_23,Station-45,2022-03-07 03:34:00,2022-03-07 04:00:00,Station-46,9016,0,52,CKB +LINE_23,Station-46,2022-03-07 04:00:00,2022-03-07 04:27:00,Station-45,10083,0,52,CKB +LINE_23,Station-45,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,52,CKB +LINE_24,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,53,CKB +LINE_24,Station-21,2022-03-07 00:31:00,2022-03-07 00:44:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 00:44:00,2022-03-07 00:56:00,Station-21,5362,5,53,CKB +LINE_24,Station-21,2022-03-07 01:01:00,2022-03-07 01:14:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 01:14:00,2022-03-07 01:26:00,Station-21,5362,5,53,CKB +LINE_24,Station-21,2022-03-07 01:31:00,2022-03-07 01:44:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 01:44:00,2022-03-07 01:56:00,Station-21,5362,5,53,CKB +LINE_24,Station-21,2022-03-07 02:01:00,2022-03-07 02:14:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 02:14:00,2022-03-07 02:26:00,Station-21,5362,5,53,CKB +LINE_24,Station-21,2022-03-07 02:31:00,2022-03-07 02:44:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 02:44:00,2022-03-07 02:56:00,Station-21,5362,5,53,CKB +LINE_24,Station-21,2022-03-07 03:01:00,2022-03-07 03:14:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 03:14:00,2022-03-07 03:26:00,Station-21,5362,5,53,CKB +LINE_24,Station-21,2022-03-07 03:31:00,2022-03-07 03:44:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 03:44:00,2022-03-07 03:56:00,Station-21,5362,5,53,CKB +LINE_24,Station-21,2022-03-07 04:01:00,2022-03-07 04:14:00,Station-47,4872,0,53,CKB +LINE_24,Station-47,2022-03-07 04:14:00,2022-03-07 04:26:00,Station-21,5362,0,53,CKB +LINE_24,Station-21,2022-03-07 04:26:00,2022-03-07 04:26:00,Station-0,0.06,0,53,CKB +LINE_25,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,54,CKB +LINE_25,Station-21,2022-03-07 00:31:00,2022-03-07 00:45:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 00:47:00,2022-03-07 01:01:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 01:01:00,2022-03-07 01:15:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 01:17:00,2022-03-07 01:31:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 01:31:00,2022-03-07 01:45:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 01:47:00,2022-03-07 02:01:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 02:01:00,2022-03-07 02:15:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 02:17:00,2022-03-07 02:31:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 02:31:00,2022-03-07 02:45:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 02:47:00,2022-03-07 03:01:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 03:01:00,2022-03-07 03:15:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 03:17:00,2022-03-07 03:31:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 03:31:00,2022-03-07 03:45:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 03:47:00,2022-03-07 04:01:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 04:01:00,2022-03-07 04:15:00,Station-48,5225,2,54,CKB +LINE_25,Station-48,2022-03-07 04:17:00,2022-03-07 04:31:00,Station-21,7617,0,54,CKB +LINE_25,Station-21,2022-03-07 04:31:00,2022-03-07 04:31:00,Station-0,0.06,0,54,CKB +LINE_26,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-49,0.06,0,55,CKB +LINE_26,Station-49,2022-03-07 00:43:00,2022-03-07 00:53:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 00:53:00,2022-03-07 01:03:00,Station-49,4408,10,55,CKB +LINE_26,Station-49,2022-03-07 01:13:00,2022-03-07 01:23:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 01:23:00,2022-03-07 01:33:00,Station-49,4408,10,55,CKB +LINE_26,Station-49,2022-03-07 01:43:00,2022-03-07 01:53:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 01:53:00,2022-03-07 02:03:00,Station-49,4408,10,55,CKB +LINE_26,Station-49,2022-03-07 02:13:00,2022-03-07 02:23:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 02:23:00,2022-03-07 02:33:00,Station-49,4408,10,55,CKB +LINE_26,Station-49,2022-03-07 02:43:00,2022-03-07 02:53:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 02:53:00,2022-03-07 03:03:00,Station-49,4408,10,55,CKB +LINE_26,Station-49,2022-03-07 03:13:00,2022-03-07 03:23:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 03:23:00,2022-03-07 03:33:00,Station-49,4408,10,55,CKB +LINE_26,Station-49,2022-03-07 03:43:00,2022-03-07 03:53:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 03:53:00,2022-03-07 04:03:00,Station-49,4408,10,55,CKB +LINE_26,Station-49,2022-03-07 04:13:00,2022-03-07 04:23:00,Station-50,4507,0,55,CKB +LINE_26,Station-50,2022-03-07 04:23:00,2022-03-07 04:33:00,Station-49,4408,0,55,CKB +LINE_26,Station-49,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,55,CKB +LINE_27,Station-0,2022-03-13 15:46:00,2022-03-13 15:46:00,Station-14,0.06,0,56,CKB +LINE_27,Station-14,2022-03-13 15:46:00,2022-03-13 15:53:00,Station-51,3147,12,56,CKB +LINE_27,Station-51,2022-03-13 16:05:00,2022-03-13 16:15:00,Station-14,3469,0,56,CKB +LINE_27,Station-14,2022-03-13 16:15:00,2022-03-13 16:23:00,Station-51,3351,12,56,CKB +LINE_27,Station-51,2022-03-13 16:35:00,2022-03-13 16:45:00,Station-14,3469,0,56,CKB +LINE_27,Station-14,2022-03-13 16:45:00,2022-03-13 16:53:00,Station-51,3351,12,56,CKB +LINE_27,Station-51,2022-03-13 17:05:00,2022-03-13 17:15:00,Station-14,3469,0,56,CKB +LINE_27,Station-14,2022-03-13 17:15:00,2022-03-13 17:23:00,Station-51,3351,12,56,CKB +LINE_27,Station-51,2022-03-13 17:35:00,2022-03-13 17:45:00,Station-14,3469,0,56,CKB +LINE_27,Station-14,2022-03-13 17:45:00,2022-03-13 17:53:00,Station-51,3351,12,56,CKB +LINE_27,Station-51,2022-03-13 18:05:00,2022-03-13 18:15:00,Station-14,3469,0,56,CKB +LINE_27,Station-14,2022-03-13 18:15:00,2022-03-13 18:23:00,Station-51,3351,0,56,CKB +LINE_28,Station-51,2022-03-13 18:23:00,2022-03-13 18:29:00,Station-14,3.1,22,56,CKB +LINE_28,Station-14,2022-03-13 18:51:00,2022-03-13 19:02:00,Station-52,4338,0,56,CKB +LINE_28,Station-52,2022-03-13 19:02:00,2022-03-13 19:13:00,Station-14,4427,12,56,CKB +LINE_5,Station-14,2022-03-13 19:25:00,2022-03-13 19:38:00,Station-15,6086,3,56,CKB +LINE_5,Station-15,2022-03-13 19:41:00,2022-03-13 19:55:00,Station-14,6232,0,56,CKB +LINE_5,Station-14,2022-03-13 19:55:00,2022-03-13 20:08:00,Station-15,6086,3,56,CKB +LINE_5,Station-15,2022-03-13 20:11:00,2022-03-13 20:25:00,Station-14,6232,6,56,CKB +LINE_28,Station-14,2022-03-13 20:31:00,2022-03-13 20:42:00,Station-52,4338,0,56,CKB +LINE_28,Station-52,2022-03-13 20:42:00,2022-03-13 20:53:00,Station-14,4427,18,56,CKB +LINE_28,Station-14,2022-03-13 21:11:00,2022-03-13 21:22:00,Station-52,4338,0,56,CKB +LINE_28,Station-52,2022-03-13 21:22:00,2022-03-13 21:33:00,Station-14,4427,18,56,CKB +LINE_28,Station-14,2022-03-13 21:51:00,2022-03-13 22:02:00,Station-52,4338,0,56,CKB +LINE_28,Station-52,2022-03-13 22:02:00,2022-03-13 22:13:00,Station-14,4427,18,56,CKB +LINE_28,Station-14,2022-03-13 22:31:00,2022-03-13 22:42:00,Station-52,4338,0,56,CKB +LINE_28,Station-52,2022-03-13 22:42:00,2022-03-13 22:53:00,Station-14,4427,2,56,CKB +LINE_5,Station-14,2022-03-13 22:55:00,2022-03-13 23:08:00,Station-15,6086,3,56,CKB +LINE_5,Station-15,2022-03-13 23:11:00,2022-03-13 23:25:00,Station-14,6232,0,56,CKB +LINE_5,Station-14,2022-03-13 23:25:00,2022-03-13 23:38:00,Station-15,6086,3,56,CKB +LINE_5,Station-15,2022-03-13 23:41:00,2022-03-13 23:55:00,Station-14,6232,0,56,CKB +LINE_5,Station-14,2022-03-13 23:55:00,2022-03-14 00:08:00,Station-15,6086,0,56,CKB +LINE_5,Station-15,2022-03-14 00:08:00,2022-03-14 00:08:00,Station-0,0.06,0,56,CKB +LINE_6,Station-0,2022-03-13 07:05:00,2022-03-13 07:05:00,Station-16,0.06,0,57,CKB +LINE_6,Station-16,2022-03-13 07:05:00,2022-03-13 07:14:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 07:14:00,2022-03-13 07:23:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 07:25:00,2022-03-13 07:34:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 07:34:00,2022-03-13 07:43:00,Station-16,5139,22,57,CKB +LINE_6,Station-16,2022-03-13 08:05:00,2022-03-13 08:14:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 08:14:00,2022-03-13 08:23:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 08:25:00,2022-03-13 08:34:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 08:34:00,2022-03-13 08:43:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 08:45:00,2022-03-13 08:54:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 08:54:00,2022-03-13 09:03:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 09:05:00,2022-03-13 09:14:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 09:14:00,2022-03-13 09:23:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 09:25:00,2022-03-13 09:34:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-16,5139,23,57,CKB +LINE_6,Station-16,2022-03-13 10:06:00,2022-03-13 10:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 10:15:00,2022-03-13 10:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 10:26:00,2022-03-13 10:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 10:35:00,2022-03-13 10:44:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 10:46:00,2022-03-13 10:55:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 10:55:00,2022-03-13 11:04:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 11:06:00,2022-03-13 11:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 11:15:00,2022-03-13 11:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 11:26:00,2022-03-13 11:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 11:35:00,2022-03-13 11:44:00,Station-16,5139,22,57,CKB +LINE_6,Station-16,2022-03-13 12:06:00,2022-03-13 12:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 12:15:00,2022-03-13 12:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 12:26:00,2022-03-13 12:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 12:35:00,2022-03-13 12:44:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 12:46:00,2022-03-13 12:55:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 12:55:00,2022-03-13 13:04:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 13:06:00,2022-03-13 13:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 13:15:00,2022-03-13 13:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 13:26:00,2022-03-13 13:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 13:35:00,2022-03-13 13:44:00,Station-16,5139,22,57,CKB +LINE_6,Station-16,2022-03-13 14:06:00,2022-03-13 14:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 14:15:00,2022-03-13 14:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 14:26:00,2022-03-13 14:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 14:35:00,2022-03-13 14:44:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 14:46:00,2022-03-13 14:55:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 14:55:00,2022-03-13 15:04:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 15:06:00,2022-03-13 15:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 15:15:00,2022-03-13 15:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 15:26:00,2022-03-13 15:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 15:35:00,2022-03-13 15:44:00,Station-16,5139,22,57,CKB +LINE_6,Station-16,2022-03-13 16:06:00,2022-03-13 16:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 16:15:00,2022-03-13 16:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 16:26:00,2022-03-13 16:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 16:35:00,2022-03-13 16:44:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 16:46:00,2022-03-13 16:55:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 16:55:00,2022-03-13 17:04:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 17:06:00,2022-03-13 17:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 17:15:00,2022-03-13 17:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 17:26:00,2022-03-13 17:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 17:35:00,2022-03-13 17:44:00,Station-16,5139,22,57,CKB +LINE_6,Station-16,2022-03-13 18:06:00,2022-03-13 18:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 18:15:00,2022-03-13 18:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 18:26:00,2022-03-13 18:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 18:35:00,2022-03-13 18:44:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 18:46:00,2022-03-13 18:55:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 18:55:00,2022-03-13 19:04:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 19:06:00,2022-03-13 19:15:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 19:15:00,2022-03-13 19:24:00,Station-16,5139,2,57,CKB +LINE_6,Station-16,2022-03-13 19:26:00,2022-03-13 19:35:00,Station-17,4781,0,57,CKB +LINE_6,Station-17,2022-03-13 19:35:00,2022-03-13 19:44:00,Station-16,5139,21,57,CKB +LINE_6,Station-16,2022-03-13 20:05:00,2022-03-13 20:14:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 20:15:00,2022-03-13 20:24:00,Station-16,5139,1,57,CKB +LINE_6,Station-16,2022-03-13 20:25:00,2022-03-13 20:34:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 20:35:00,2022-03-13 20:44:00,Station-16,5139,1,57,CKB +LINE_6,Station-16,2022-03-13 20:45:00,2022-03-13 20:54:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 20:55:00,2022-03-13 21:04:00,Station-16,5139,1,57,CKB +LINE_6,Station-16,2022-03-13 21:05:00,2022-03-13 21:14:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 21:15:00,2022-03-13 21:24:00,Station-16,5139,1,57,CKB +LINE_6,Station-16,2022-03-13 21:25:00,2022-03-13 21:34:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 21:35:00,2022-03-13 21:44:00,Station-16,5139,21,57,CKB +LINE_6,Station-16,2022-03-13 22:05:00,2022-03-13 22:14:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 22:15:00,2022-03-13 22:24:00,Station-16,5139,1,57,CKB +LINE_6,Station-16,2022-03-13 22:25:00,2022-03-13 22:34:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 22:35:00,2022-03-13 22:44:00,Station-16,5139,1,57,CKB +LINE_6,Station-16,2022-03-13 22:45:00,2022-03-13 22:54:00,Station-17,4781,1,57,CKB +LINE_6,Station-17,2022-03-13 22:55:00,2022-03-13 23:04:00,Station-16,5139,0,57,CKB +LINE_6,Station-16,2022-03-13 23:04:00,2022-03-13 23:04:00,Station-0,0.06,0,57,CKB +LINE_29,Station-0,2022-03-13 07:30:00,2022-03-13 07:30:00,Station-53,0.06,0,58,CKB +LINE_29,Station-53,2022-03-13 07:30:00,2022-03-13 07:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 07:39:00,2022-03-13 07:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 07:50:00,2022-03-13 07:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 07:59:00,2022-03-13 08:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 08:10:00,2022-03-13 08:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 08:19:00,2022-03-13 08:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 08:30:00,2022-03-13 08:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 08:39:00,2022-03-13 08:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 08:50:00,2022-03-13 08:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 08:59:00,2022-03-13 09:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 09:10:00,2022-03-13 09:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 09:19:00,2022-03-13 09:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 09:30:00,2022-03-13 09:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 09:39:00,2022-03-13 09:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 09:50:00,2022-03-13 09:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 09:59:00,2022-03-13 10:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 10:10:00,2022-03-13 10:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 10:30:00,2022-03-13 10:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 10:39:00,2022-03-13 10:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 10:50:00,2022-03-13 10:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 10:59:00,2022-03-13 11:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 11:10:00,2022-03-13 11:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 11:19:00,2022-03-13 11:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 11:30:00,2022-03-13 11:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 11:39:00,2022-03-13 11:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 11:50:00,2022-03-13 11:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 11:59:00,2022-03-13 12:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 12:10:00,2022-03-13 12:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 12:19:00,2022-03-13 12:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 12:30:00,2022-03-13 12:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 12:39:00,2022-03-13 12:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 12:50:00,2022-03-13 12:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 12:59:00,2022-03-13 13:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 13:10:00,2022-03-13 13:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 13:19:00,2022-03-13 13:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 13:30:00,2022-03-13 13:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 13:39:00,2022-03-13 13:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 13:50:00,2022-03-13 13:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 13:59:00,2022-03-13 14:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 14:10:00,2022-03-13 14:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 14:19:00,2022-03-13 14:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 14:30:00,2022-03-13 14:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 14:39:00,2022-03-13 14:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 14:50:00,2022-03-13 14:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 14:59:00,2022-03-13 15:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 15:10:00,2022-03-13 15:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 15:19:00,2022-03-13 15:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 15:30:00,2022-03-13 15:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 15:39:00,2022-03-13 15:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 15:50:00,2022-03-13 15:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 15:59:00,2022-03-13 16:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 16:10:00,2022-03-13 16:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 16:19:00,2022-03-13 16:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 16:30:00,2022-03-13 16:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 16:39:00,2022-03-13 16:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 16:50:00,2022-03-13 16:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 16:59:00,2022-03-13 17:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 17:10:00,2022-03-13 17:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 17:19:00,2022-03-13 17:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 17:30:00,2022-03-13 17:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 17:39:00,2022-03-13 17:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 17:50:00,2022-03-13 17:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 17:59:00,2022-03-13 18:10:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 18:10:00,2022-03-13 18:15:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 18:19:00,2022-03-13 18:30:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 18:30:00,2022-03-13 18:35:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 18:39:00,2022-03-13 18:50:00,Station-53,4341,0,58,CKB +LINE_29,Station-53,2022-03-13 18:50:00,2022-03-13 18:55:00,Station-54,2217,4,58,CKB +LINE_29,Station-54,2022-03-13 18:59:00,2022-03-13 19:10:00,Station-53,4288,0,58,CKB +LINE_29,Station-53,2022-03-13 19:10:00,2022-03-13 19:10:00,Station-0,0.06,0,58,CKB +LINE_10,Station-0,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.06,0,59,CKB +LINE_10,Station-24,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.0,792,59,CKB +LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-24,0.0,0,59,CKB +LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-0,0.06,0,59,CKB +LINE_30,Station-0,2022-03-13 07:18:00,2022-03-13 07:18:00,Station-55,0.06,0,60,CKB +LINE_30,Station-55,2022-03-13 07:18:00,2022-03-13 07:26:00,Station-56,5562,10,60,CKB +LINE_30,Station-56,2022-03-13 07:36:00,2022-03-13 07:45:00,Station-57,5941,32,60,CKB +LINE_30,Station-57,2022-03-13 08:17:00,2022-03-13 08:26:00,Station-56,5994,10,60,CKB +LINE_30,Station-56,2022-03-13 08:36:00,2022-03-13 08:45:00,Station-57,5941,32,60,CKB +LINE_30,Station-57,2022-03-13 09:17:00,2022-03-13 09:26:00,Station-56,5994,8,60,CKB +LINE_30,Station-56,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-57,5941,36,60,CKB +LINE_30,Station-57,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-56,5994,2,60,CKB +LINE_30,Station-56,2022-03-13 10:32:00,2022-03-13 10:41:00,Station-55,5566,0,60,CKB +LINE_30,Station-55,2022-03-13 10:41:00,2022-03-13 10:41:00,Station-0,0.06,0,60,CKB +LINE_0,Station-0,2022-03-08 21:31:00,2022-03-08 21:31:00,Station-1,0.06,0,61,CKB +LINE_0,Station-1,2022-03-08 21:31:00,2022-03-08 22:04:00,Station-2,14519,4,61,CKB +LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-1,13541,8,61,CKB +LINE_0,Station-1,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-2,14519,4,61,CKB +LINE_0,Station-2,2022-03-08 23:28:00,2022-03-09 00:03:00,Station-1,13541,8,61,CKB +LINE_0,Station-1,2022-03-09 00:11:00,2022-03-09 00:44:00,Station-2,14519,0,61,CKB +LINE_1,Station-2,2022-03-09 00:44:00,2022-03-09 00:54:00,Station-3,4.1,25,61,CKB +LINE_1,Station-3,2022-03-09 01:19:00,2022-03-09 01:42:00,Station-4,8.36,6,61,CKB +LINE_1,Station-4,2022-03-09 01:48:00,2022-03-09 02:06:00,Station-3,9067,13,61,CKB +LINE_1,Station-3,2022-03-09 02:19:00,2022-03-09 02:42:00,Station-4,8.36,6,61,CKB +LINE_1,Station-4,2022-03-09 02:48:00,2022-03-09 03:06:00,Station-3,9067,13,61,CKB +LINE_1,Station-3,2022-03-09 03:19:00,2022-03-09 03:42:00,Station-4,8.36,6,61,CKB +LINE_1,Station-4,2022-03-09 03:48:00,2022-03-09 04:06:00,Station-3,9067,0,61,CKB +LINE_1,Station-3,2022-03-09 04:06:00,2022-03-09 04:06:00,Station-0,0.06,0,61,CKB +LINE_0,Station-0,2022-03-08 22:11:00,2022-03-08 22:11:00,Station-1,0.06,0,62,CKB +LINE_0,Station-1,2022-03-08 22:11:00,2022-03-08 22:44:00,Station-2,14519,4,62,CKB +LINE_0,Station-2,2022-03-08 22:48:00,2022-03-08 23:23:00,Station-1,13541,8,62,CKB +LINE_0,Station-1,2022-03-08 23:31:00,2022-03-09 00:04:00,Station-2,14519,4,62,CKB +LINE_0,Station-2,2022-03-09 00:08:00,2022-03-09 00:39:00,Station-5,12213,0,62,CKB +LINE_1,Station-5,2022-03-09 00:39:00,2022-03-09 00:47:00,Station-3,4.0,2,62,CKB +LINE_1,Station-3,2022-03-09 00:49:00,2022-03-09 01:12:00,Station-4,8.36,6,62,CKB +LINE_1,Station-4,2022-03-09 01:18:00,2022-03-09 01:36:00,Station-3,9067,13,62,CKB +LINE_1,Station-3,2022-03-09 01:49:00,2022-03-09 02:12:00,Station-4,8.36,6,62,CKB +LINE_1,Station-4,2022-03-09 02:18:00,2022-03-09 02:36:00,Station-3,9067,13,62,CKB +LINE_1,Station-3,2022-03-09 02:49:00,2022-03-09 03:12:00,Station-4,8.36,6,62,CKB +LINE_1,Station-4,2022-03-09 03:18:00,2022-03-09 03:36:00,Station-3,9067,13,62,CKB +LINE_1,Station-3,2022-03-09 03:49:00,2022-03-09 04:12:00,Station-4,8.36,0,62,CKB +LINE_1,Station-4,2022-03-09 04:12:00,2022-03-09 04:12:00,Station-0,0.06,0,62,CKB +LINE_2,Station-0,2022-03-08 21:06:00,2022-03-08 21:06:00,Station-6,0.06,0,63,CKB +LINE_2,Station-6,2022-03-08 21:06:00,2022-03-08 21:34:00,Station-7,13018,19,63,CKB +LINE_2,Station-7,2022-03-08 21:53:00,2022-03-08 22:13:00,Station-8,10332,17,63,CKB +LINE_2,Station-8,2022-03-08 22:30:00,2022-03-08 22:54:00,Station-7,10.48,19,63,CKB +LINE_2,Station-7,2022-03-08 23:13:00,2022-03-08 23:33:00,Station-8,10332,17,63,CKB +LINE_2,Station-8,2022-03-08 23:50:00,2022-03-09 00:14:00,Station-7,10.48,2,63,CKB +LINE_2,Station-7,2022-03-09 00:16:00,2022-03-09 00:23:00,Station-9,3709,5,63,CKB +LINE_3,Station-9,2022-03-09 00:28:00,2022-03-09 00:44:00,Station-10,6404,3,63,CKB +LINE_3,Station-10,2022-03-09 00:47:00,2022-03-09 01:10:00,Station-11,10579,7,63,CKB +LINE_3,Station-11,2022-03-09 01:17:00,2022-03-09 01:44:00,Station-10,12007,3,63,CKB +LINE_3,Station-10,2022-03-09 01:47:00,2022-03-09 02:10:00,Station-11,10579,7,63,CKB +LINE_3,Station-11,2022-03-09 02:17:00,2022-03-09 02:44:00,Station-10,12007,3,63,CKB +LINE_3,Station-10,2022-03-09 02:47:00,2022-03-09 03:10:00,Station-11,10579,7,63,CKB +LINE_3,Station-11,2022-03-09 03:17:00,2022-03-09 03:44:00,Station-10,12007,3,63,CKB +LINE_3,Station-10,2022-03-09 03:47:00,2022-03-09 04:10:00,Station-11,10579,7,63,CKB +LINE_3,Station-11,2022-03-09 04:17:00,2022-03-09 04:44:00,Station-10,12007,0,63,CKB +LINE_3,Station-10,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,63,CKB +LINE_2,Station-0,2022-03-08 20:26:00,2022-03-08 20:26:00,Station-6,0.06,0,64,CKB +LINE_2,Station-6,2022-03-08 20:26:00,2022-03-08 20:56:00,Station-12,14097,14,64,CKB +LINE_2,Station-12,2022-03-08 21:10:00,2022-03-08 21:38:00,Station-6,13.19,8,64,CKB +LINE_2,Station-6,2022-03-08 21:46:00,2022-03-08 22:14:00,Station-7,13018,19,64,CKB +LINE_2,Station-7,2022-03-08 22:33:00,2022-03-08 22:53:00,Station-8,10332,17,64,CKB +LINE_2,Station-8,2022-03-08 23:10:00,2022-03-08 23:34:00,Station-7,10.48,19,64,CKB +LINE_2,Station-7,2022-03-08 23:53:00,2022-03-09 00:13:00,Station-8,10332,2,64,CKB +LINE_2,Station-8,2022-03-09 00:15:00,2022-03-09 00:16:00,Station-10,506,1,64,CKB +LINE_3,Station-10,2022-03-09 00:17:00,2022-03-09 00:40:00,Station-11,10579,7,64,CKB +LINE_3,Station-11,2022-03-09 00:47:00,2022-03-09 01:14:00,Station-10,12007,3,64,CKB +LINE_3,Station-10,2022-03-09 01:17:00,2022-03-09 01:40:00,Station-11,10579,7,64,CKB +LINE_3,Station-11,2022-03-09 01:47:00,2022-03-09 02:14:00,Station-10,12007,3,64,CKB +LINE_3,Station-10,2022-03-09 02:17:00,2022-03-09 02:40:00,Station-11,10579,7,64,CKB +LINE_3,Station-11,2022-03-09 02:47:00,2022-03-09 03:14:00,Station-10,12007,3,64,CKB +LINE_3,Station-10,2022-03-09 03:17:00,2022-03-09 03:40:00,Station-11,10579,7,64,CKB +LINE_3,Station-11,2022-03-09 03:47:00,2022-03-09 04:14:00,Station-10,12007,3,64,CKB +LINE_3,Station-10,2022-03-09 04:17:00,2022-03-09 04:40:00,Station-11,10579,3,64,CKB +LINE_4,Station-11,2022-03-09 04:43:00,2022-03-09 04:58:00,Station-13,6161,0,64,CKB +LINE_4,Station-13,2022-03-09 04:58:00,2022-03-09 04:58:00,Station-0,0.06,0,64,CKB +LINE_5,Station-0,2022-03-08 22:56:00,2022-03-08 22:56:00,Station-14,0.06,0,65,CKB +LINE_5,Station-14,2022-03-08 22:56:00,2022-03-08 23:08:00,Station-15,5882,3,65,CKB +LINE_5,Station-15,2022-03-08 23:11:00,2022-03-08 23:25:00,Station-14,6232,0,65,CKB +LINE_5,Station-14,2022-03-08 23:25:00,2022-03-08 23:38:00,Station-15,6086,3,65,CKB +LINE_5,Station-15,2022-03-08 23:41:00,2022-03-08 23:55:00,Station-14,6232,0,65,CKB +LINE_5,Station-14,2022-03-08 23:55:00,2022-03-09 00:08:00,Station-15,6086,0,65,CKB +LINE_5,Station-15,2022-03-09 00:08:00,2022-03-09 00:08:00,Station-0,0.06,0,65,CKB +LINE_6,Station-0,2022-03-08 05:05:00,2022-03-08 05:05:00,Station-16,0.06,0,66,CKB +LINE_6,Station-16,2022-03-08 05:05:00,2022-03-08 05:14:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 05:14:00,2022-03-08 05:23:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 05:25:00,2022-03-08 05:34:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 05:34:00,2022-03-08 05:43:00,Station-16,5139,23,66,CKB +LINE_6,Station-16,2022-03-08 06:06:00,2022-03-08 06:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 06:15:00,2022-03-08 06:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 06:26:00,2022-03-08 06:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 06:35:00,2022-03-08 06:44:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 06:46:00,2022-03-08 06:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 06:55:00,2022-03-08 07:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 07:06:00,2022-03-08 07:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 07:15:00,2022-03-08 07:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 07:26:00,2022-03-08 07:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 07:35:00,2022-03-08 07:44:00,Station-16,5139,22,66,CKB +LINE_6,Station-16,2022-03-08 08:06:00,2022-03-08 08:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 08:15:00,2022-03-08 08:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 08:26:00,2022-03-08 08:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 08:35:00,2022-03-08 08:44:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 08:46:00,2022-03-08 08:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 08:55:00,2022-03-08 09:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 09:06:00,2022-03-08 09:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 09:15:00,2022-03-08 09:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 09:26:00,2022-03-08 09:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 09:35:00,2022-03-08 09:44:00,Station-16,5139,22,66,CKB +LINE_6,Station-16,2022-03-08 10:06:00,2022-03-08 10:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 10:15:00,2022-03-08 10:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 10:26:00,2022-03-08 10:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 10:35:00,2022-03-08 10:44:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 10:46:00,2022-03-08 10:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 10:55:00,2022-03-08 11:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 11:06:00,2022-03-08 11:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 11:15:00,2022-03-08 11:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 11:26:00,2022-03-08 11:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 11:35:00,2022-03-08 11:44:00,Station-16,5139,22,66,CKB +LINE_6,Station-16,2022-03-08 12:06:00,2022-03-08 12:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 12:15:00,2022-03-08 12:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 12:26:00,2022-03-08 12:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 12:35:00,2022-03-08 12:44:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 12:46:00,2022-03-08 12:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 12:55:00,2022-03-08 13:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 13:06:00,2022-03-08 13:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 13:15:00,2022-03-08 13:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 13:26:00,2022-03-08 13:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 13:35:00,2022-03-08 13:44:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 13:46:00,2022-03-08 13:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 13:55:00,2022-03-08 14:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 14:06:00,2022-03-08 14:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 14:15:00,2022-03-08 14:24:00,Station-16,5139,22,66,CKB +LINE_6,Station-16,2022-03-08 14:46:00,2022-03-08 14:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 14:55:00,2022-03-08 15:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 15:06:00,2022-03-08 15:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 15:15:00,2022-03-08 15:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 15:26:00,2022-03-08 15:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 15:35:00,2022-03-08 15:44:00,Station-16,5139,22,66,CKB +LINE_6,Station-16,2022-03-08 16:06:00,2022-03-08 16:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 16:15:00,2022-03-08 16:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 16:26:00,2022-03-08 16:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 16:35:00,2022-03-08 16:44:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 16:46:00,2022-03-08 16:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 16:55:00,2022-03-08 17:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 17:06:00,2022-03-08 17:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 17:15:00,2022-03-08 17:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 17:26:00,2022-03-08 17:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 17:35:00,2022-03-08 17:44:00,Station-16,5139,22,66,CKB +LINE_6,Station-16,2022-03-08 18:06:00,2022-03-08 18:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 18:15:00,2022-03-08 18:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 18:26:00,2022-03-08 18:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 18:35:00,2022-03-08 18:44:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 18:46:00,2022-03-08 18:55:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 18:55:00,2022-03-08 19:04:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 19:06:00,2022-03-08 19:15:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 19:15:00,2022-03-08 19:24:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 19:26:00,2022-03-08 19:35:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 19:35:00,2022-03-08 19:44:00,Station-16,5139,21,66,CKB +LINE_6,Station-16,2022-03-08 20:05:00,2022-03-08 20:14:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 20:14:00,2022-03-08 20:23:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 20:25:00,2022-03-08 20:34:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 20:34:00,2022-03-08 20:43:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 20:45:00,2022-03-08 20:54:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 20:54:00,2022-03-08 21:03:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 21:05:00,2022-03-08 21:14:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 21:14:00,2022-03-08 21:23:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 21:25:00,2022-03-08 21:34:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 21:34:00,2022-03-08 21:43:00,Station-16,5139,22,66,CKB +LINE_6,Station-16,2022-03-08 22:05:00,2022-03-08 22:14:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 22:14:00,2022-03-08 22:23:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 22:25:00,2022-03-08 22:34:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 22:34:00,2022-03-08 22:43:00,Station-16,5139,2,66,CKB +LINE_6,Station-16,2022-03-08 22:45:00,2022-03-08 22:54:00,Station-17,4781,0,66,CKB +LINE_6,Station-17,2022-03-08 22:54:00,2022-03-08 23:03:00,Station-16,5139,0,66,CKB +LINE_6,Station-16,2022-03-08 23:03:00,2022-03-08 23:03:00,Station-0,0.06,0,66,CKB +LINE_7,Station-0,2022-03-09 00:06:00,2022-03-09 00:06:00,Station-18,0.06,0,67,CKB +LINE_7,Station-18,2022-03-09 00:06:00,2022-03-09 00:27:00,Station-19,7827,0,67,CKB +LINE_8,Station-19,2022-03-09 00:27:00,2022-03-09 00:48:00,Station-20,11079,0,67,CKB +LINE_8,Station-20,2022-03-09 00:48:00,2022-03-09 01:25:00,Station-21,20641,8,67,CKB +LINE_8,Station-21,2022-03-09 01:33:00,2022-03-09 02:16:00,Station-20,20579,1,67,CKB +LINE_8,Station-20,2022-03-09 02:17:00,2022-03-09 02:55:00,Station-21,20641,8,67,CKB +LINE_8,Station-21,2022-03-09 03:03:00,2022-03-09 03:46:00,Station-20,20579,1,67,CKB +LINE_8,Station-20,2022-03-09 03:47:00,2022-03-09 04:25:00,Station-21,20641,0,67,CKB +LINE_8,Station-21,2022-03-09 04:25:00,2022-03-09 04:25:00,Station-0,0.06,0,67,CKB +LINE_9,Station-22,2022-03-08 05:15:00,2022-03-08 06:01:00,Station-23,17.9,0,68,VDL +LINE_9,Station-23,2022-03-08 06:01:00,2022-03-08 06:15:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 06:23:00,2022-03-08 06:37:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 06:41:00,2022-03-08 06:55:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 07:03:00,2022-03-08 07:17:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 07:21:00,2022-03-08 07:35:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 07:43:00,2022-03-08 07:57:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 08:01:00,2022-03-08 08:15:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 08:23:00,2022-03-08 08:37:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 08:41:00,2022-03-08 08:55:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 09:03:00,2022-03-08 09:17:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 09:21:00,2022-03-08 09:35:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 09:43:00,2022-03-08 09:57:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 10:01:00,2022-03-08 10:15:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 10:23:00,2022-03-08 10:37:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 10:41:00,2022-03-08 10:55:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 11:03:00,2022-03-08 11:17:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 11:21:00,2022-03-08 11:35:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 11:43:00,2022-03-08 11:57:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 12:01:00,2022-03-08 12:15:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 12:23:00,2022-03-08 12:37:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 12:41:00,2022-03-08 12:55:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 13:03:00,2022-03-08 13:17:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 13:21:00,2022-03-08 13:35:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 13:43:00,2022-03-08 13:57:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 14:01:00,2022-03-08 14:15:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 14:23:00,2022-03-08 14:37:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 14:41:00,2022-03-08 14:55:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 15:03:00,2022-03-08 15:17:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 15:21:00,2022-03-08 15:35:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 15:43:00,2022-03-08 15:57:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 16:01:00,2022-03-08 16:15:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 16:23:00,2022-03-08 16:37:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 16:41:00,2022-03-08 16:55:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 17:03:00,2022-03-08 17:17:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 17:21:00,2022-03-08 17:35:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 17:43:00,2022-03-08 17:57:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 18:01:00,2022-03-08 18:15:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 18:23:00,2022-03-08 18:37:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 18:41:00,2022-03-08 18:55:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 19:03:00,2022-03-08 19:17:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 19:21:00,2022-03-08 19:35:00,Station-23,4637,8,68,VDL +LINE_9,Station-23,2022-03-08 19:43:00,2022-03-08 19:57:00,Station-23,4637,4,68,VDL +LINE_9,Station-23,2022-03-08 20:01:00,2022-03-08 20:14:00,Station-23,4637,9,68,VDL +LINE_9,Station-23,2022-03-08 20:23:00,2022-03-08 20:36:00,Station-23,4637,0,68,VDL +LINE_9,Station-23,2022-03-08 20:36:00,2022-03-08 21:15:00,Station-22,19.8,0,68,VDL +LINE_10,Station-0,2022-03-08 04:56:00,2022-03-08 04:56:00,Station-24,0.06,18,69,CKB +LINE_10,Station-24,2022-03-08 05:14:00,2022-03-08 05:20:00,Station-25,3.29,0,69,CKB +LINE_10,Station-25,2022-03-08 05:20:00,2022-03-08 05:24:00,Station-24,2954,20,69,CKB +LINE_10,Station-24,2022-03-08 05:44:00,2022-03-08 05:50:00,Station-25,3.29,0,69,CKB +LINE_10,Station-25,2022-03-08 05:50:00,2022-03-08 05:54:00,Station-24,2954,5,69,CKB +LINE_10,Station-24,2022-03-08 05:59:00,2022-03-08 06:06:00,Station-25,3.29,2,69,CKB +LINE_10,Station-25,2022-03-08 06:08:00,2022-03-08 06:13:00,Station-24,2954,19,69,CKB +LINE_10,Station-24,2022-03-08 06:32:00,2022-03-08 06:39:00,Station-25,3.29,1,69,CKB +LINE_10,Station-25,2022-03-08 06:40:00,2022-03-08 06:45:00,Station-24,2954,7,69,CKB +LINE_10,Station-24,2022-03-08 06:52:00,2022-03-08 06:59:00,Station-25,3.29,1,69,CKB +LINE_10,Station-25,2022-03-08 07:00:00,2022-03-08 07:05:00,Station-24,2954,7,69,CKB +LINE_10,Station-24,2022-03-08 07:12:00,2022-03-08 07:19:00,Station-25,3.29,1,69,CKB +LINE_10,Station-25,2022-03-08 07:20:00,2022-03-08 07:25:00,Station-24,2954,7,69,CKB +LINE_10,Station-24,2022-03-08 07:32:00,2022-03-08 07:39:00,Station-25,3.29,1,69,CKB +LINE_10,Station-25,2022-03-08 07:40:00,2022-03-08 07:45:00,Station-24,2954,295,69,CKB +LINE_10,Station-24,2022-03-08 12:40:00,2022-03-08 12:47:00,Station-25,3.29,2,69,CKB +LINE_10,Station-25,2022-03-08 12:49:00,2022-03-08 12:54:00,Station-24,2954,46,69,CKB +LINE_10,Station-24,2022-03-08 13:40:00,2022-03-08 13:47:00,Station-25,3.29,2,69,CKB +LINE_10,Station-25,2022-03-08 13:49:00,2022-03-08 13:54:00,Station-24,2954,434,69,CKB +LINE_10,Station-24,2022-03-08 21:08:00,2022-03-08 21:08:00,Station-0,0.06,0,69,CKB +LINE_11,Station-0,2022-03-08 07:20:00,2022-03-08 07:20:00,Station-26,0.06,0,70,CKB +LINE_11,Station-26,2022-03-08 07:20:00,2022-03-08 07:50:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 08:00:00,2022-03-08 08:30:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 08:40:00,2022-03-08 09:10:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 09:20:00,2022-03-08 09:50:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 10:00:00,2022-03-08 10:30:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 10:40:00,2022-03-08 11:10:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 11:20:00,2022-03-08 11:50:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 12:00:00,2022-03-08 12:30:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 12:40:00,2022-03-08 13:10:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 13:20:00,2022-03-08 13:50:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 14:00:00,2022-03-08 14:30:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 14:40:00,2022-03-08 15:10:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 15:20:00,2022-03-08 15:50:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 16:00:00,2022-03-08 16:30:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 16:40:00,2022-03-08 17:10:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 17:20:00,2022-03-08 17:50:00,Station-26,9266,10,70,CKB +LINE_11,Station-26,2022-03-08 18:00:00,2022-03-08 18:30:00,Station-26,9266,0,70,CKB +LINE_11,Station-26,2022-03-08 18:30:00,2022-03-08 18:30:00,Station-0,0.06,0,70,CKB +LINE_12,Station-0,2022-03-08 07:10:00,2022-03-08 07:10:00,Station-27,0.06,0,71,CKB +LINE_12,Station-27,2022-03-08 07:10:00,2022-03-08 07:18:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 07:28:00,2022-03-08 07:40:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 07:40:00,2022-03-08 07:48:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 07:58:00,2022-03-08 08:10:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 08:10:00,2022-03-08 08:18:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 08:28:00,2022-03-08 08:40:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 08:40:00,2022-03-08 08:48:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 08:58:00,2022-03-08 09:10:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 09:10:00,2022-03-08 09:18:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 09:28:00,2022-03-08 09:40:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 09:40:00,2022-03-08 09:48:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 09:58:00,2022-03-08 10:10:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 10:10:00,2022-03-08 10:18:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 10:28:00,2022-03-08 10:40:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 10:40:00,2022-03-08 10:48:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 10:58:00,2022-03-08 11:10:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 11:10:00,2022-03-08 11:18:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 11:28:00,2022-03-08 11:40:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 11:40:00,2022-03-08 11:48:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 11:58:00,2022-03-08 12:10:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 12:10:00,2022-03-08 12:18:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 12:28:00,2022-03-08 12:40:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 12:40:00,2022-03-08 12:48:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 12:58:00,2022-03-08 13:10:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 13:10:00,2022-03-08 13:18:00,Station-28,2169,10,71,CKB +LINE_12,Station-28,2022-03-08 13:28:00,2022-03-08 13:40:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 13:40:00,2022-03-08 13:48:00,Station-28,2169,8,71,CKB +LINE_12,Station-28,2022-03-08 13:56:00,2022-03-08 14:10:00,Station-27,2952,0,71,CKB +LINE_12,Station-27,2022-03-08 14:10:00,2022-03-08 14:19:00,Station-28,2169,14,71,CKB +LINE_12,Station-28,2022-03-08 14:33:00,2022-03-08 14:47:00,Station-27,2952,3,71,CKB +LINE_12,Station-27,2022-03-08 14:50:00,2022-03-08 14:59:00,Station-28,2169,14,71,CKB +LINE_12,Station-28,2022-03-08 15:13:00,2022-03-08 15:27:00,Station-27,2952,3,71,CKB +LINE_12,Station-27,2022-03-08 15:30:00,2022-03-08 15:39:00,Station-28,2169,14,71,CKB +LINE_12,Station-28,2022-03-08 15:53:00,2022-03-08 16:07:00,Station-27,2952,3,71,CKB +LINE_12,Station-27,2022-03-08 16:10:00,2022-03-08 16:19:00,Station-28,2169,14,71,CKB +LINE_12,Station-28,2022-03-08 16:33:00,2022-03-08 16:47:00,Station-27,2952,3,71,CKB +LINE_12,Station-27,2022-03-08 16:50:00,2022-03-08 16:59:00,Station-28,2169,14,71,CKB +LINE_12,Station-28,2022-03-08 17:13:00,2022-03-08 17:27:00,Station-27,2952,3,71,CKB +LINE_12,Station-27,2022-03-08 17:30:00,2022-03-08 17:39:00,Station-28,2169,13,71,CKB +LINE_12,Station-28,2022-03-08 17:52:00,2022-03-08 18:05:00,Station-27,2952,5,71,CKB +LINE_12,Station-27,2022-03-08 18:10:00,2022-03-08 18:18:00,Station-28,2169,0,71,CKB +LINE_12,Station-28,2022-03-08 18:18:00,2022-03-08 18:18:00,Station-0,0.06,0,71,CKB +LINE_12,Station-0,2022-03-08 14:13:00,2022-03-08 14:13:00,Station-28,0.06,0,72,CKB +LINE_12,Station-28,2022-03-08 14:13:00,2022-03-08 14:27:00,Station-27,2952,3,72,CKB +LINE_12,Station-27,2022-03-08 14:30:00,2022-03-08 14:39:00,Station-28,2169,14,72,CKB +LINE_12,Station-28,2022-03-08 14:53:00,2022-03-08 15:07:00,Station-27,2952,3,72,CKB +LINE_12,Station-27,2022-03-08 15:10:00,2022-03-08 15:19:00,Station-28,2169,14,72,CKB +LINE_12,Station-28,2022-03-08 15:33:00,2022-03-08 15:47:00,Station-27,2952,3,72,CKB +LINE_12,Station-27,2022-03-08 15:50:00,2022-03-08 15:59:00,Station-28,2169,14,72,CKB +LINE_12,Station-28,2022-03-08 16:13:00,2022-03-08 16:27:00,Station-27,2952,3,72,CKB +LINE_12,Station-27,2022-03-08 16:30:00,2022-03-08 16:39:00,Station-28,2169,14,72,CKB +LINE_12,Station-28,2022-03-08 16:53:00,2022-03-08 17:07:00,Station-27,2952,3,72,CKB +LINE_12,Station-27,2022-03-08 17:10:00,2022-03-08 17:19:00,Station-28,2169,14,72,CKB +LINE_12,Station-28,2022-03-08 17:33:00,2022-03-08 17:47:00,Station-27,2952,3,72,CKB +LINE_12,Station-27,2022-03-08 17:50:00,2022-03-08 17:59:00,Station-28,2169,14,72,CKB +LINE_12,Station-28,2022-03-08 18:13:00,2022-03-08 18:25:00,Station-27,2952,0,72,CKB +LINE_12,Station-27,2022-03-08 18:25:00,2022-03-08 18:25:00,Station-0,0.06,0,72,CKB +LINE_13,Station-0,2022-03-09 00:23:00,2022-03-09 00:23:00,Station-29,0.06,0,73,CKB +LINE_13,Station-29,2022-03-09 00:23:00,2022-03-09 00:30:00,Station-30,2577,9,73,CKB +LINE_14,Station-30,2022-03-09 00:39:00,2022-03-09 00:54:00,Station-31,5937,9,73,CKB +LINE_14,Station-31,2022-03-09 01:03:00,2022-03-09 01:17:00,Station-30,6.19,0,73,CKB +LINE_13,Station-30,2022-03-09 01:17:00,2022-03-09 01:23:00,Station-29,2555,0,73,CKB +LINE_13,Station-29,2022-03-09 01:23:00,2022-03-09 01:30:00,Station-30,2577,9,73,CKB +LINE_14,Station-30,2022-03-09 01:39:00,2022-03-09 01:54:00,Station-31,5937,9,73,CKB +LINE_14,Station-31,2022-03-09 02:03:00,2022-03-09 02:17:00,Station-30,6.19,0,73,CKB +LINE_13,Station-30,2022-03-09 02:17:00,2022-03-09 02:23:00,Station-29,2555,0,73,CKB +LINE_13,Station-29,2022-03-09 02:23:00,2022-03-09 02:30:00,Station-30,2577,9,73,CKB +LINE_14,Station-30,2022-03-09 02:39:00,2022-03-09 02:54:00,Station-31,5937,9,73,CKB +LINE_14,Station-31,2022-03-09 03:03:00,2022-03-09 03:17:00,Station-30,6.19,0,73,CKB +LINE_13,Station-30,2022-03-09 03:17:00,2022-03-09 03:23:00,Station-29,2555,0,73,CKB +LINE_13,Station-29,2022-03-09 03:23:00,2022-03-09 03:30:00,Station-30,2577,9,73,CKB +LINE_14,Station-30,2022-03-09 03:39:00,2022-03-09 03:54:00,Station-31,5937,9,73,CKB +LINE_14,Station-31,2022-03-09 04:03:00,2022-03-09 04:17:00,Station-30,6.19,0,73,CKB +LINE_13,Station-30,2022-03-09 04:17:00,2022-03-09 04:23:00,Station-29,2555,0,73,CKB +LINE_13,Station-29,2022-03-09 04:23:00,2022-03-09 04:23:00,Station-0,0.06,0,73,CKB +LINE_14,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-31,0.06,0,74,CKB +LINE_14,Station-31,2022-03-09 00:33:00,2022-03-09 00:47:00,Station-30,6.19,0,74,CKB +LINE_13,Station-30,2022-03-09 00:47:00,2022-03-09 00:53:00,Station-29,2555,0,74,CKB +LINE_13,Station-29,2022-03-09 00:53:00,2022-03-09 01:00:00,Station-30,2577,9,74,CKB +LINE_14,Station-30,2022-03-09 01:09:00,2022-03-09 01:24:00,Station-31,5937,9,74,CKB +LINE_14,Station-31,2022-03-09 01:33:00,2022-03-09 01:47:00,Station-30,6.19,0,74,CKB +LINE_13,Station-30,2022-03-09 01:47:00,2022-03-09 01:53:00,Station-29,2555,0,74,CKB +LINE_13,Station-29,2022-03-09 01:53:00,2022-03-09 02:00:00,Station-30,2577,9,74,CKB +LINE_14,Station-30,2022-03-09 02:09:00,2022-03-09 02:24:00,Station-31,5937,9,74,CKB +LINE_14,Station-31,2022-03-09 02:33:00,2022-03-09 02:47:00,Station-30,6.19,0,74,CKB +LINE_13,Station-30,2022-03-09 02:47:00,2022-03-09 02:53:00,Station-29,2555,0,74,CKB +LINE_13,Station-29,2022-03-09 02:53:00,2022-03-09 03:00:00,Station-30,2577,9,74,CKB +LINE_14,Station-30,2022-03-09 03:09:00,2022-03-09 03:24:00,Station-31,5937,9,74,CKB +LINE_14,Station-31,2022-03-09 03:33:00,2022-03-09 03:47:00,Station-30,6.19,0,74,CKB +LINE_13,Station-30,2022-03-09 03:47:00,2022-03-09 03:53:00,Station-29,2555,0,74,CKB +LINE_13,Station-29,2022-03-09 03:53:00,2022-03-09 04:00:00,Station-30,2577,9,74,CKB +LINE_14,Station-30,2022-03-09 04:09:00,2022-03-09 04:24:00,Station-31,5937,0,74,CKB +LINE_14,Station-31,2022-03-09 04:24:00,2022-03-09 04:24:00,Station-0,0.06,0,74,CKB +LINE_15,Station-0,2022-03-09 00:57:00,2022-03-09 00:57:00,Station-32,0.06,0,75,CKB +LINE_15,Station-32,2022-03-09 00:57:00,2022-03-09 01:06:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 01:06:00,2022-03-09 01:11:00,Station-32,2936,16,75,CKB +LINE_15,Station-32,2022-03-09 01:27:00,2022-03-09 01:36:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 01:36:00,2022-03-09 01:41:00,Station-32,2936,16,75,CKB +LINE_15,Station-32,2022-03-09 01:57:00,2022-03-09 02:06:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 02:06:00,2022-03-09 02:11:00,Station-32,2936,16,75,CKB +LINE_15,Station-32,2022-03-09 02:27:00,2022-03-09 02:36:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 02:36:00,2022-03-09 02:41:00,Station-32,2936,16,75,CKB +LINE_15,Station-32,2022-03-09 02:57:00,2022-03-09 03:06:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 03:06:00,2022-03-09 03:11:00,Station-32,2936,16,75,CKB +LINE_15,Station-32,2022-03-09 03:27:00,2022-03-09 03:36:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 03:36:00,2022-03-09 03:41:00,Station-32,2936,16,75,CKB +LINE_15,Station-32,2022-03-09 03:57:00,2022-03-09 04:06:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 04:06:00,2022-03-09 04:11:00,Station-32,2936,16,75,CKB +LINE_15,Station-32,2022-03-09 04:27:00,2022-03-09 04:36:00,Station-33,4343,0,75,CKB +LINE_15,Station-33,2022-03-09 04:36:00,2022-03-09 04:36:00,Station-0,0.06,0,75,CKB +LINE_16,Station-0,2022-03-09 00:29:00,2022-03-09 00:29:00,Station-34,0.06,0,76,CKB +LINE_16,Station-34,2022-03-09 00:29:00,2022-03-09 00:41:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 00:47:00,2022-03-09 00:57:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 00:59:00,2022-03-09 01:11:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 01:17:00,2022-03-09 01:27:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 01:29:00,2022-03-09 01:41:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 01:47:00,2022-03-09 01:57:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 01:59:00,2022-03-09 02:11:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 02:17:00,2022-03-09 02:27:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 02:29:00,2022-03-09 02:41:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 02:47:00,2022-03-09 02:57:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 02:59:00,2022-03-09 03:11:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 03:17:00,2022-03-09 03:27:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 03:29:00,2022-03-09 03:41:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 03:47:00,2022-03-09 03:57:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 03:59:00,2022-03-09 04:11:00,Station-35,4481,6,76,CKB +LINE_16,Station-35,2022-03-09 04:17:00,2022-03-09 04:27:00,Station-34,4031,2,76,CKB +LINE_16,Station-34,2022-03-09 04:29:00,2022-03-09 04:41:00,Station-35,4481,0,76,CKB +LINE_16,Station-35,2022-03-09 04:41:00,2022-03-09 04:41:00,Station-0,0.06,0,76,CKB +LINE_17,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-34,0.06,0,77,CKB +LINE_17,Station-34,2022-03-09 00:30:00,2022-03-09 00:44:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 00:44:00,2022-03-09 00:57:00,Station-34,5302,3,77,CKB +LINE_17,Station-34,2022-03-09 01:00:00,2022-03-09 01:14:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 01:14:00,2022-03-09 01:27:00,Station-34,5302,3,77,CKB +LINE_17,Station-34,2022-03-09 01:30:00,2022-03-09 01:44:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 01:44:00,2022-03-09 01:57:00,Station-34,5302,3,77,CKB +LINE_17,Station-34,2022-03-09 02:00:00,2022-03-09 02:14:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 02:14:00,2022-03-09 02:27:00,Station-34,5302,3,77,CKB +LINE_17,Station-34,2022-03-09 02:30:00,2022-03-09 02:44:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 02:44:00,2022-03-09 02:57:00,Station-34,5302,3,77,CKB +LINE_17,Station-34,2022-03-09 03:00:00,2022-03-09 03:14:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 03:14:00,2022-03-09 03:27:00,Station-34,5302,3,77,CKB +LINE_17,Station-34,2022-03-09 03:30:00,2022-03-09 03:44:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 03:44:00,2022-03-09 03:57:00,Station-34,5302,3,77,CKB +LINE_17,Station-34,2022-03-09 04:00:00,2022-03-09 04:14:00,Station-36,4801,0,77,CKB +LINE_17,Station-36,2022-03-09 04:14:00,2022-03-09 04:27:00,Station-34,5302,0,77,CKB +LINE_17,Station-34,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,77,CKB +LINE_18,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-37,0.06,0,78,CKB +LINE_18,Station-37,2022-03-09 00:43:00,2022-03-09 01:33:00,Station-37,20434,10,78,CKB +LINE_18,Station-37,2022-03-09 01:43:00,2022-03-09 02:33:00,Station-37,20434,10,78,CKB +LINE_18,Station-37,2022-03-09 02:43:00,2022-03-09 03:33:00,Station-37,20434,10,78,CKB +LINE_18,Station-37,2022-03-09 03:43:00,2022-03-09 04:33:00,Station-37,20434,0,78,CKB +LINE_18,Station-37,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,78,CKB +LINE_18,Station-0,2022-03-09 00:13:00,2022-03-09 00:13:00,Station-37,0.06,0,79,CKB +LINE_18,Station-37,2022-03-09 00:13:00,2022-03-09 01:03:00,Station-37,20434,10,79,CKB +LINE_18,Station-37,2022-03-09 01:13:00,2022-03-09 02:03:00,Station-37,20434,10,79,CKB +LINE_18,Station-37,2022-03-09 02:13:00,2022-03-09 03:03:00,Station-37,20434,10,79,CKB +LINE_18,Station-37,2022-03-09 03:13:00,2022-03-09 04:03:00,Station-37,20434,0,79,CKB +LINE_18,Station-37,2022-03-09 04:03:00,2022-03-09 04:03:00,Station-0,0.06,0,79,CKB +LINE_19,Station-0,2022-03-09 00:24:00,2022-03-09 00:24:00,Station-38,0.06,0,80,CKB +LINE_19,Station-38,2022-03-09 00:24:00,2022-03-09 00:48:00,Station-39,11.86,4,80,CKB +LINE_19,Station-39,2022-03-09 00:52:00,2022-03-09 01:14:00,Station-38,11139,10,80,CKB +LINE_19,Station-38,2022-03-09 01:24:00,2022-03-09 01:48:00,Station-39,11.86,4,80,CKB +LINE_19,Station-39,2022-03-09 01:52:00,2022-03-09 02:14:00,Station-38,11139,10,80,CKB +LINE_19,Station-38,2022-03-09 02:24:00,2022-03-09 02:48:00,Station-39,11.86,4,80,CKB +LINE_19,Station-39,2022-03-09 02:52:00,2022-03-09 03:14:00,Station-38,11139,10,80,CKB +LINE_19,Station-38,2022-03-09 03:24:00,2022-03-09 03:48:00,Station-39,11.86,4,80,CKB +LINE_19,Station-39,2022-03-09 03:52:00,2022-03-09 04:14:00,Station-38,11139,0,80,CKB +LINE_19,Station-38,2022-03-09 04:14:00,2022-03-09 04:14:00,Station-0,0.06,0,80,CKB +LINE_19,Station-0,2022-03-09 00:22:00,2022-03-09 00:22:00,Station-39,0.06,0,81,CKB +LINE_19,Station-39,2022-03-09 00:22:00,2022-03-09 00:44:00,Station-38,11139,10,81,CKB +LINE_19,Station-38,2022-03-09 00:54:00,2022-03-09 01:18:00,Station-39,11.86,4,81,CKB +LINE_19,Station-39,2022-03-09 01:22:00,2022-03-09 01:44:00,Station-38,11139,10,81,CKB +LINE_19,Station-38,2022-03-09 01:54:00,2022-03-09 02:18:00,Station-39,11.86,4,81,CKB +LINE_19,Station-39,2022-03-09 02:22:00,2022-03-09 02:44:00,Station-38,11139,10,81,CKB +LINE_19,Station-38,2022-03-09 02:54:00,2022-03-09 03:18:00,Station-39,11.86,4,81,CKB +LINE_19,Station-39,2022-03-09 03:22:00,2022-03-09 03:44:00,Station-38,11139,10,81,CKB +LINE_19,Station-38,2022-03-09 03:54:00,2022-03-09 04:18:00,Station-39,11.86,4,81,CKB +LINE_19,Station-39,2022-03-09 04:22:00,2022-03-09 04:44:00,Station-38,11139,0,81,CKB +LINE_19,Station-38,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,81,CKB +LINE_20,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,82,CKB +LINE_20,Station-13,2022-03-09 00:32:00,2022-03-09 00:44:00,Station-40,4212,3,82,CKB +LINE_20,Station-40,2022-03-09 00:47:00,2022-03-09 01:16:00,Station-41,13048,0,82,CKB +LINE_20,Station-41,2022-03-09 01:16:00,2022-03-09 01:42:00,Station-40,12869,5,82,CKB +LINE_20,Station-40,2022-03-09 01:47:00,2022-03-09 02:16:00,Station-41,13048,0,82,CKB +LINE_20,Station-41,2022-03-09 02:16:00,2022-03-09 02:42:00,Station-40,12869,5,82,CKB +LINE_20,Station-40,2022-03-09 02:47:00,2022-03-09 03:16:00,Station-41,13048,0,82,CKB +LINE_20,Station-41,2022-03-09 03:16:00,2022-03-09 03:42:00,Station-40,12869,5,82,CKB +LINE_20,Station-40,2022-03-09 03:47:00,2022-03-09 04:16:00,Station-41,13048,0,82,CKB +LINE_20,Station-41,2022-03-09 04:16:00,2022-03-09 04:34:00,Station-42,9538,0,82,CKB +LINE_20,Station-42,2022-03-09 04:34:00,2022-03-09 04:34:00,Station-0,0.06,0,82,CKB +LINE_20,Station-0,2022-03-09 00:17:00,2022-03-09 00:17:00,Station-40,0.06,0,83,CKB +LINE_20,Station-40,2022-03-09 00:17:00,2022-03-09 00:46:00,Station-41,13048,0,83,CKB +LINE_20,Station-41,2022-03-09 00:46:00,2022-03-09 01:12:00,Station-40,12869,5,83,CKB +LINE_20,Station-40,2022-03-09 01:17:00,2022-03-09 01:46:00,Station-41,13048,0,83,CKB +LINE_20,Station-41,2022-03-09 01:46:00,2022-03-09 02:12:00,Station-40,12869,5,83,CKB +LINE_20,Station-40,2022-03-09 02:17:00,2022-03-09 02:46:00,Station-41,13048,0,83,CKB +LINE_20,Station-41,2022-03-09 02:46:00,2022-03-09 03:12:00,Station-40,12869,5,83,CKB +LINE_20,Station-40,2022-03-09 03:17:00,2022-03-09 03:46:00,Station-41,13048,0,83,CKB +LINE_20,Station-41,2022-03-09 03:46:00,2022-03-09 04:12:00,Station-40,12869,5,83,CKB +LINE_20,Station-40,2022-03-09 04:17:00,2022-03-09 04:28:00,Station-13,4316,0,83,CKB +LINE_20,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,83,CKB +LINE_21,Station-0,2022-03-09 00:49:00,2022-03-09 00:49:00,Station-3,0.06,0,84,CKB +LINE_21,Station-3,2022-03-09 00:49:00,2022-03-09 01:04:00,Station-16,10229,0,84,CKB +LINE_21,Station-16,2022-03-09 01:04:00,2022-03-09 01:19:00,Station-3,11801,0,84,CKB +LINE_21,Station-3,2022-03-09 01:19:00,2022-03-09 01:34:00,Station-16,10229,0,84,CKB +LINE_21,Station-16,2022-03-09 01:34:00,2022-03-09 01:49:00,Station-3,11801,0,84,CKB +LINE_21,Station-3,2022-03-09 01:49:00,2022-03-09 02:04:00,Station-16,10229,0,84,CKB +LINE_21,Station-16,2022-03-09 02:04:00,2022-03-09 02:19:00,Station-3,11801,0,84,CKB +LINE_21,Station-3,2022-03-09 02:19:00,2022-03-09 02:34:00,Station-16,10229,0,84,CKB +LINE_21,Station-16,2022-03-09 02:34:00,2022-03-09 02:49:00,Station-3,11801,0,84,CKB +LINE_21,Station-3,2022-03-09 02:49:00,2022-03-09 03:04:00,Station-16,10229,0,84,CKB +LINE_21,Station-16,2022-03-09 03:04:00,2022-03-09 03:19:00,Station-3,11801,0,84,CKB +LINE_21,Station-3,2022-03-09 03:19:00,2022-03-09 03:34:00,Station-16,10229,0,84,CKB +LINE_21,Station-16,2022-03-09 03:34:00,2022-03-09 03:49:00,Station-3,11801,0,84,CKB +LINE_21,Station-3,2022-03-09 03:49:00,2022-03-09 04:04:00,Station-16,10229,0,84,CKB +LINE_21,Station-16,2022-03-09 04:04:00,2022-03-09 04:19:00,Station-3,11801,23,84,CKB +LINE_22,Station-3,2022-03-09 04:42:00,2022-03-09 05:04:00,Station-43,6.81,0,84,CKB +LINE_22,Station-43,2022-03-09 05:04:00,2022-03-09 05:04:00,Station-0,0.06,0,84,CKB +LINE_8,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,85,CKB +LINE_8,Station-13,2022-03-09 00:32:00,2022-03-09 00:57:00,Station-21,11545,6,85,CKB +LINE_8,Station-21,2022-03-09 01:03:00,2022-03-09 01:46:00,Station-20,20579,1,85,CKB +LINE_8,Station-20,2022-03-09 01:47:00,2022-03-09 02:25:00,Station-21,20641,8,85,CKB +LINE_8,Station-21,2022-03-09 02:33:00,2022-03-09 03:16:00,Station-20,20579,1,85,CKB +LINE_8,Station-20,2022-03-09 03:17:00,2022-03-09 03:55:00,Station-21,20641,8,85,CKB +LINE_8,Station-21,2022-03-09 04:03:00,2022-03-09 04:28:00,Station-13,11499,0,85,CKB +LINE_8,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,85,CKB +LINE_8,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-21,0.06,0,86,CKB +LINE_8,Station-21,2022-03-09 00:33:00,2022-03-09 01:16:00,Station-20,20579,1,86,CKB +LINE_8,Station-20,2022-03-09 01:17:00,2022-03-09 01:55:00,Station-21,20641,8,86,CKB +LINE_8,Station-21,2022-03-09 02:03:00,2022-03-09 02:46:00,Station-20,20579,1,86,CKB +LINE_8,Station-20,2022-03-09 02:47:00,2022-03-09 03:25:00,Station-21,20641,8,86,CKB +LINE_8,Station-21,2022-03-09 03:33:00,2022-03-09 04:16:00,Station-20,20579,1,86,CKB +LINE_8,Station-20,2022-03-09 04:17:00,2022-03-09 04:51:00,Station-44,18752,0,86,CKB +LINE_8,Station-44,2022-03-09 04:51:00,2022-03-09 04:51:00,Station-0,0.06,0,86,CKB +LINE_23,Station-0,2022-03-09 00:34:00,2022-03-09 00:34:00,Station-45,0.06,0,87,CKB +LINE_23,Station-45,2022-03-09 00:34:00,2022-03-09 01:00:00,Station-46,9016,0,87,CKB +LINE_23,Station-46,2022-03-09 01:00:00,2022-03-09 01:27:00,Station-45,10083,7,87,CKB +LINE_23,Station-45,2022-03-09 01:34:00,2022-03-09 02:00:00,Station-46,9016,0,87,CKB +LINE_23,Station-46,2022-03-09 02:00:00,2022-03-09 02:27:00,Station-45,10083,7,87,CKB +LINE_23,Station-45,2022-03-09 02:34:00,2022-03-09 03:00:00,Station-46,9016,0,87,CKB +LINE_23,Station-46,2022-03-09 03:00:00,2022-03-09 03:27:00,Station-45,10083,7,87,CKB +LINE_23,Station-45,2022-03-09 03:34:00,2022-03-09 04:00:00,Station-46,9016,0,87,CKB +LINE_23,Station-46,2022-03-09 04:00:00,2022-03-09 04:27:00,Station-45,10083,0,87,CKB +LINE_23,Station-45,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,87,CKB +LINE_23,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-46,0.06,0,88,CKB +LINE_23,Station-46,2022-03-09 00:30:00,2022-03-09 00:57:00,Station-45,10083,7,88,CKB +LINE_23,Station-45,2022-03-09 01:04:00,2022-03-09 01:30:00,Station-46,9016,0,88,CKB +LINE_23,Station-46,2022-03-09 01:30:00,2022-03-09 01:57:00,Station-45,10083,7,88,CKB +LINE_23,Station-45,2022-03-09 02:04:00,2022-03-09 02:30:00,Station-46,9016,0,88,CKB +LINE_23,Station-46,2022-03-09 02:30:00,2022-03-09 02:57:00,Station-45,10083,7,88,CKB +LINE_23,Station-45,2022-03-09 03:04:00,2022-03-09 03:30:00,Station-46,9016,0,88,CKB +LINE_23,Station-46,2022-03-09 03:30:00,2022-03-09 03:57:00,Station-45,10083,7,88,CKB +LINE_23,Station-45,2022-03-09 04:04:00,2022-03-09 04:30:00,Station-46,9016,0,88,CKB +LINE_23,Station-46,2022-03-09 04:30:00,2022-03-09 04:57:00,Station-45,10083,0,88,CKB +LINE_23,Station-45,2022-03-09 04:57:00,2022-03-09 04:57:00,Station-0,0.06,0,88,CKB +LINE_24,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,89,CKB +LINE_24,Station-21,2022-03-09 00:31:00,2022-03-09 00:44:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 00:44:00,2022-03-09 00:56:00,Station-21,5362,5,89,CKB +LINE_24,Station-21,2022-03-09 01:01:00,2022-03-09 01:14:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 01:14:00,2022-03-09 01:26:00,Station-21,5362,5,89,CKB +LINE_24,Station-21,2022-03-09 01:31:00,2022-03-09 01:44:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 01:44:00,2022-03-09 01:56:00,Station-21,5362,5,89,CKB +LINE_24,Station-21,2022-03-09 02:01:00,2022-03-09 02:14:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 02:14:00,2022-03-09 02:26:00,Station-21,5362,5,89,CKB +LINE_24,Station-21,2022-03-09 02:31:00,2022-03-09 02:44:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 02:44:00,2022-03-09 02:56:00,Station-21,5362,5,89,CKB +LINE_24,Station-21,2022-03-09 03:01:00,2022-03-09 03:14:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 03:14:00,2022-03-09 03:26:00,Station-21,5362,5,89,CKB +LINE_24,Station-21,2022-03-09 03:31:00,2022-03-09 03:44:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 03:44:00,2022-03-09 03:56:00,Station-21,5362,5,89,CKB +LINE_24,Station-21,2022-03-09 04:01:00,2022-03-09 04:14:00,Station-47,4872,0,89,CKB +LINE_24,Station-47,2022-03-09 04:14:00,2022-03-09 04:26:00,Station-21,5362,0,89,CKB +LINE_24,Station-21,2022-03-09 04:26:00,2022-03-09 04:26:00,Station-0,0.06,0,89,CKB +LINE_25,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,90,CKB +LINE_25,Station-21,2022-03-09 00:31:00,2022-03-09 00:45:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 00:47:00,2022-03-09 01:01:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 01:01:00,2022-03-09 01:15:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 01:17:00,2022-03-09 01:31:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 01:31:00,2022-03-09 01:45:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 01:47:00,2022-03-09 02:01:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 02:01:00,2022-03-09 02:15:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 02:17:00,2022-03-09 02:31:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 02:31:00,2022-03-09 02:45:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 02:47:00,2022-03-09 03:01:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 03:01:00,2022-03-09 03:15:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 03:17:00,2022-03-09 03:31:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 03:31:00,2022-03-09 03:45:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 03:47:00,2022-03-09 04:01:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 04:01:00,2022-03-09 04:15:00,Station-48,5225,2,90,CKB +LINE_25,Station-48,2022-03-09 04:17:00,2022-03-09 04:31:00,Station-21,7617,0,90,CKB +LINE_25,Station-21,2022-03-09 04:31:00,2022-03-09 04:31:00,Station-0,0.06,0,90,CKB +LINE_26,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-49,0.06,0,91,CKB +LINE_26,Station-49,2022-03-09 00:43:00,2022-03-09 00:53:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 00:53:00,2022-03-09 01:03:00,Station-49,4408,10,91,CKB +LINE_26,Station-49,2022-03-09 01:13:00,2022-03-09 01:23:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 01:23:00,2022-03-09 01:33:00,Station-49,4408,10,91,CKB +LINE_26,Station-49,2022-03-09 01:43:00,2022-03-09 01:53:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 01:53:00,2022-03-09 02:03:00,Station-49,4408,10,91,CKB +LINE_26,Station-49,2022-03-09 02:13:00,2022-03-09 02:23:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 02:23:00,2022-03-09 02:33:00,Station-49,4408,10,91,CKB +LINE_26,Station-49,2022-03-09 02:43:00,2022-03-09 02:53:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 02:53:00,2022-03-09 03:03:00,Station-49,4408,10,91,CKB +LINE_26,Station-49,2022-03-09 03:13:00,2022-03-09 03:23:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 03:23:00,2022-03-09 03:33:00,Station-49,4408,10,91,CKB +LINE_26,Station-49,2022-03-09 03:43:00,2022-03-09 03:53:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 03:53:00,2022-03-09 04:03:00,Station-49,4408,10,91,CKB +LINE_26,Station-49,2022-03-09 04:13:00,2022-03-09 04:23:00,Station-50,4507,0,91,CKB +LINE_26,Station-50,2022-03-09 04:23:00,2022-03-09 04:33:00,Station-49,4408,0,91,CKB +LINE_26,Station-49,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,91,CKB +LINE_0,Station-0,2022-03-09 21:31:00,2022-03-09 21:31:00,Station-1,0.06,0,92,CKB +LINE_0,Station-1,2022-03-09 21:31:00,2022-03-09 22:04:00,Station-2,14519,4,92,CKB +LINE_0,Station-2,2022-03-09 22:08:00,2022-03-09 22:43:00,Station-1,13541,8,92,CKB +LINE_0,Station-1,2022-03-09 22:51:00,2022-03-09 23:24:00,Station-2,14519,4,92,CKB +LINE_0,Station-2,2022-03-09 23:28:00,2022-03-10 00:03:00,Station-1,13541,8,92,CKB +LINE_0,Station-1,2022-03-10 00:11:00,2022-03-10 00:44:00,Station-2,14519,0,92,CKB +LINE_1,Station-2,2022-03-10 00:44:00,2022-03-10 00:54:00,Station-3,4.1,25,92,CKB +LINE_1,Station-3,2022-03-10 01:19:00,2022-03-10 01:42:00,Station-4,8.36,6,92,CKB +LINE_1,Station-4,2022-03-10 01:48:00,2022-03-10 02:06:00,Station-3,9067,13,92,CKB +LINE_1,Station-3,2022-03-10 02:19:00,2022-03-10 02:42:00,Station-4,8.36,6,92,CKB +LINE_1,Station-4,2022-03-10 02:48:00,2022-03-10 03:06:00,Station-3,9067,13,92,CKB +LINE_1,Station-3,2022-03-10 03:19:00,2022-03-10 03:42:00,Station-4,8.36,6,92,CKB +LINE_1,Station-4,2022-03-10 03:48:00,2022-03-10 04:06:00,Station-3,9067,0,92,CKB +LINE_1,Station-3,2022-03-10 04:06:00,2022-03-10 04:06:00,Station-0,0.06,0,92,CKB +LINE_0,Station-0,2022-03-09 22:11:00,2022-03-09 22:11:00,Station-1,0.06,0,93,CKB +LINE_0,Station-1,2022-03-09 22:11:00,2022-03-09 22:44:00,Station-2,14519,4,93,CKB +LINE_0,Station-2,2022-03-09 22:48:00,2022-03-09 23:23:00,Station-1,13541,8,93,CKB +LINE_0,Station-1,2022-03-09 23:31:00,2022-03-10 00:04:00,Station-2,14519,4,93,CKB +LINE_0,Station-2,2022-03-10 00:08:00,2022-03-10 00:39:00,Station-5,12213,0,93,CKB +LINE_1,Station-5,2022-03-10 00:39:00,2022-03-10 00:47:00,Station-3,4.0,2,93,CKB +LINE_1,Station-3,2022-03-10 00:49:00,2022-03-10 01:12:00,Station-4,8.36,6,93,CKB +LINE_1,Station-4,2022-03-10 01:18:00,2022-03-10 01:36:00,Station-3,9067,13,93,CKB +LINE_1,Station-3,2022-03-10 01:49:00,2022-03-10 02:12:00,Station-4,8.36,6,93,CKB +LINE_1,Station-4,2022-03-10 02:18:00,2022-03-10 02:36:00,Station-3,9067,13,93,CKB +LINE_1,Station-3,2022-03-10 02:49:00,2022-03-10 03:12:00,Station-4,8.36,6,93,CKB +LINE_1,Station-4,2022-03-10 03:18:00,2022-03-10 03:36:00,Station-3,9067,13,93,CKB +LINE_1,Station-3,2022-03-10 03:49:00,2022-03-10 04:12:00,Station-4,8.36,0,93,CKB +LINE_1,Station-4,2022-03-10 04:12:00,2022-03-10 04:12:00,Station-0,0.06,0,93,CKB +LINE_2,Station-0,2022-03-09 21:06:00,2022-03-09 21:06:00,Station-6,0.06,0,94,CKB +LINE_2,Station-6,2022-03-09 21:06:00,2022-03-09 21:34:00,Station-7,13018,19,94,CKB +LINE_2,Station-7,2022-03-09 21:53:00,2022-03-09 22:13:00,Station-8,10332,17,94,CKB +LINE_2,Station-8,2022-03-09 22:30:00,2022-03-09 22:54:00,Station-7,10.48,19,94,CKB +LINE_2,Station-7,2022-03-09 23:13:00,2022-03-09 23:33:00,Station-8,10332,17,94,CKB +LINE_2,Station-8,2022-03-09 23:50:00,2022-03-10 00:14:00,Station-7,10.48,2,94,CKB +LINE_2,Station-7,2022-03-10 00:16:00,2022-03-10 00:23:00,Station-9,3709,5,94,CKB +LINE_3,Station-9,2022-03-10 00:28:00,2022-03-10 00:44:00,Station-10,6404,3,94,CKB +LINE_3,Station-10,2022-03-10 00:47:00,2022-03-10 01:10:00,Station-11,10579,7,94,CKB +LINE_3,Station-11,2022-03-10 01:17:00,2022-03-10 01:44:00,Station-10,12007,3,94,CKB +LINE_3,Station-10,2022-03-10 01:47:00,2022-03-10 02:10:00,Station-11,10579,7,94,CKB +LINE_3,Station-11,2022-03-10 02:17:00,2022-03-10 02:44:00,Station-10,12007,3,94,CKB +LINE_3,Station-10,2022-03-10 02:47:00,2022-03-10 03:10:00,Station-11,10579,7,94,CKB +LINE_3,Station-11,2022-03-10 03:17:00,2022-03-10 03:44:00,Station-10,12007,3,94,CKB +LINE_3,Station-10,2022-03-10 03:47:00,2022-03-10 04:10:00,Station-11,10579,7,94,CKB +LINE_3,Station-11,2022-03-10 04:17:00,2022-03-10 04:44:00,Station-10,12007,0,94,CKB +LINE_3,Station-10,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,94,CKB +LINE_2,Station-0,2022-03-09 20:26:00,2022-03-09 20:26:00,Station-6,0.06,0,95,CKB +LINE_2,Station-6,2022-03-09 20:26:00,2022-03-09 20:56:00,Station-12,14097,14,95,CKB +LINE_2,Station-12,2022-03-09 21:10:00,2022-03-09 21:38:00,Station-6,13.19,8,95,CKB +LINE_2,Station-6,2022-03-09 21:46:00,2022-03-09 22:14:00,Station-7,13018,19,95,CKB +LINE_2,Station-7,2022-03-09 22:33:00,2022-03-09 22:53:00,Station-8,10332,17,95,CKB +LINE_2,Station-8,2022-03-09 23:10:00,2022-03-09 23:34:00,Station-7,10.48,19,95,CKB +LINE_2,Station-7,2022-03-09 23:53:00,2022-03-10 00:13:00,Station-8,10332,2,95,CKB +LINE_2,Station-8,2022-03-10 00:15:00,2022-03-10 00:16:00,Station-10,506,1,95,CKB +LINE_3,Station-10,2022-03-10 00:17:00,2022-03-10 00:40:00,Station-11,10579,7,95,CKB +LINE_3,Station-11,2022-03-10 00:47:00,2022-03-10 01:14:00,Station-10,12007,3,95,CKB +LINE_3,Station-10,2022-03-10 01:17:00,2022-03-10 01:40:00,Station-11,10579,7,95,CKB +LINE_3,Station-11,2022-03-10 01:47:00,2022-03-10 02:14:00,Station-10,12007,3,95,CKB +LINE_3,Station-10,2022-03-10 02:17:00,2022-03-10 02:40:00,Station-11,10579,7,95,CKB +LINE_3,Station-11,2022-03-10 02:47:00,2022-03-10 03:14:00,Station-10,12007,3,95,CKB +LINE_3,Station-10,2022-03-10 03:17:00,2022-03-10 03:40:00,Station-11,10579,7,95,CKB +LINE_3,Station-11,2022-03-10 03:47:00,2022-03-10 04:14:00,Station-10,12007,3,95,CKB +LINE_3,Station-10,2022-03-10 04:17:00,2022-03-10 04:40:00,Station-11,10579,3,95,CKB +LINE_4,Station-11,2022-03-10 04:43:00,2022-03-10 04:58:00,Station-13,6161,0,95,CKB +LINE_4,Station-13,2022-03-10 04:58:00,2022-03-10 04:58:00,Station-0,0.06,0,95,CKB +LINE_5,Station-0,2022-03-09 22:56:00,2022-03-09 22:56:00,Station-14,0.06,0,96,CKB +LINE_5,Station-14,2022-03-09 22:56:00,2022-03-09 23:08:00,Station-15,5882,3,96,CKB +LINE_5,Station-15,2022-03-09 23:11:00,2022-03-09 23:25:00,Station-14,6232,0,96,CKB +LINE_5,Station-14,2022-03-09 23:25:00,2022-03-09 23:38:00,Station-15,6086,3,96,CKB +LINE_5,Station-15,2022-03-09 23:41:00,2022-03-09 23:55:00,Station-14,6232,0,96,CKB +LINE_5,Station-14,2022-03-09 23:55:00,2022-03-10 00:08:00,Station-15,6086,0,96,CKB +LINE_5,Station-15,2022-03-10 00:08:00,2022-03-10 00:08:00,Station-0,0.06,0,96,CKB +LINE_6,Station-0,2022-03-09 05:05:00,2022-03-09 05:05:00,Station-16,0.06,0,97,CKB +LINE_6,Station-16,2022-03-09 05:05:00,2022-03-09 05:14:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 05:14:00,2022-03-09 05:23:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 05:25:00,2022-03-09 05:34:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 05:34:00,2022-03-09 05:43:00,Station-16,5139,23,97,CKB +LINE_6,Station-16,2022-03-09 06:06:00,2022-03-09 06:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 06:15:00,2022-03-09 06:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 06:26:00,2022-03-09 06:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 06:35:00,2022-03-09 06:44:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 06:46:00,2022-03-09 06:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 06:55:00,2022-03-09 07:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 07:06:00,2022-03-09 07:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 07:15:00,2022-03-09 07:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 07:26:00,2022-03-09 07:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 07:35:00,2022-03-09 07:44:00,Station-16,5139,22,97,CKB +LINE_6,Station-16,2022-03-09 08:06:00,2022-03-09 08:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 08:15:00,2022-03-09 08:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 08:26:00,2022-03-09 08:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 08:35:00,2022-03-09 08:44:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 08:46:00,2022-03-09 08:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 08:55:00,2022-03-09 09:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 09:06:00,2022-03-09 09:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 09:15:00,2022-03-09 09:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 09:26:00,2022-03-09 09:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 09:35:00,2022-03-09 09:44:00,Station-16,5139,22,97,CKB +LINE_6,Station-16,2022-03-09 10:06:00,2022-03-09 10:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 10:15:00,2022-03-09 10:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 10:26:00,2022-03-09 10:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 10:35:00,2022-03-09 10:44:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 10:46:00,2022-03-09 10:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 10:55:00,2022-03-09 11:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 11:06:00,2022-03-09 11:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 11:15:00,2022-03-09 11:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 11:26:00,2022-03-09 11:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 11:35:00,2022-03-09 11:44:00,Station-16,5139,22,97,CKB +LINE_6,Station-16,2022-03-09 12:06:00,2022-03-09 12:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 12:15:00,2022-03-09 12:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 12:26:00,2022-03-09 12:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 12:35:00,2022-03-09 12:44:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 12:46:00,2022-03-09 12:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 12:55:00,2022-03-09 13:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 13:06:00,2022-03-09 13:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 13:15:00,2022-03-09 13:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 13:26:00,2022-03-09 13:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 13:35:00,2022-03-09 13:44:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 13:46:00,2022-03-09 13:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 13:55:00,2022-03-09 14:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 14:06:00,2022-03-09 14:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 14:15:00,2022-03-09 14:24:00,Station-16,5139,22,97,CKB +LINE_6,Station-16,2022-03-09 14:46:00,2022-03-09 14:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 14:55:00,2022-03-09 15:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 15:06:00,2022-03-09 15:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 15:15:00,2022-03-09 15:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 15:26:00,2022-03-09 15:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 15:35:00,2022-03-09 15:44:00,Station-16,5139,22,97,CKB +LINE_6,Station-16,2022-03-09 16:06:00,2022-03-09 16:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 16:15:00,2022-03-09 16:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 16:26:00,2022-03-09 16:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 16:35:00,2022-03-09 16:44:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 16:46:00,2022-03-09 16:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 16:55:00,2022-03-09 17:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 17:06:00,2022-03-09 17:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 17:15:00,2022-03-09 17:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 17:26:00,2022-03-09 17:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 17:35:00,2022-03-09 17:44:00,Station-16,5139,22,97,CKB +LINE_6,Station-16,2022-03-09 18:06:00,2022-03-09 18:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 18:15:00,2022-03-09 18:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 18:26:00,2022-03-09 18:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 18:35:00,2022-03-09 18:44:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 18:46:00,2022-03-09 18:55:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 18:55:00,2022-03-09 19:04:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 19:06:00,2022-03-09 19:15:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 19:15:00,2022-03-09 19:24:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 19:26:00,2022-03-09 19:35:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 19:35:00,2022-03-09 19:44:00,Station-16,5139,21,97,CKB +LINE_6,Station-16,2022-03-09 20:05:00,2022-03-09 20:14:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 20:14:00,2022-03-09 20:23:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 20:25:00,2022-03-09 20:34:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 20:34:00,2022-03-09 20:43:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 20:45:00,2022-03-09 20:54:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 20:54:00,2022-03-09 21:03:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 21:05:00,2022-03-09 21:14:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 21:14:00,2022-03-09 21:23:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 21:25:00,2022-03-09 21:34:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 21:34:00,2022-03-09 21:43:00,Station-16,5139,22,97,CKB +LINE_6,Station-16,2022-03-09 22:05:00,2022-03-09 22:14:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 22:14:00,2022-03-09 22:23:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 22:25:00,2022-03-09 22:34:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 22:34:00,2022-03-09 22:43:00,Station-16,5139,2,97,CKB +LINE_6,Station-16,2022-03-09 22:45:00,2022-03-09 22:54:00,Station-17,4781,0,97,CKB +LINE_6,Station-17,2022-03-09 22:54:00,2022-03-09 23:03:00,Station-16,5139,0,97,CKB +LINE_6,Station-16,2022-03-09 23:03:00,2022-03-09 23:03:00,Station-0,0.06,0,97,CKB +LINE_7,Station-0,2022-03-10 00:06:00,2022-03-10 00:06:00,Station-18,0.06,0,98,CKB +LINE_7,Station-18,2022-03-10 00:06:00,2022-03-10 00:27:00,Station-19,7827,0,98,CKB +LINE_8,Station-19,2022-03-10 00:27:00,2022-03-10 00:48:00,Station-20,11079,0,98,CKB +LINE_8,Station-20,2022-03-10 00:48:00,2022-03-10 01:25:00,Station-21,20641,8,98,CKB +LINE_8,Station-21,2022-03-10 01:33:00,2022-03-10 02:16:00,Station-20,20579,1,98,CKB +LINE_8,Station-20,2022-03-10 02:17:00,2022-03-10 02:55:00,Station-21,20641,8,98,CKB +LINE_8,Station-21,2022-03-10 03:03:00,2022-03-10 03:46:00,Station-20,20579,1,98,CKB +LINE_8,Station-20,2022-03-10 03:47:00,2022-03-10 04:25:00,Station-21,20641,0,98,CKB +LINE_8,Station-21,2022-03-10 04:25:00,2022-03-10 04:25:00,Station-0,0.06,0,98,CKB +LINE_9,Station-22,2022-03-09 05:15:00,2022-03-09 06:01:00,Station-23,17.9,0,99,VDL +LINE_9,Station-23,2022-03-09 06:01:00,2022-03-09 06:15:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 06:23:00,2022-03-09 06:37:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 06:41:00,2022-03-09 06:55:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 07:03:00,2022-03-09 07:17:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 07:21:00,2022-03-09 07:35:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 07:43:00,2022-03-09 07:57:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 08:01:00,2022-03-09 08:15:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 08:23:00,2022-03-09 08:37:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 08:41:00,2022-03-09 08:55:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 09:03:00,2022-03-09 09:17:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 09:21:00,2022-03-09 09:35:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 09:43:00,2022-03-09 09:57:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 10:01:00,2022-03-09 10:15:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 10:23:00,2022-03-09 10:37:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 10:41:00,2022-03-09 10:55:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 11:03:00,2022-03-09 11:17:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 11:21:00,2022-03-09 11:35:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 11:43:00,2022-03-09 11:57:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 12:01:00,2022-03-09 12:15:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 12:23:00,2022-03-09 12:37:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 12:41:00,2022-03-09 12:55:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 13:03:00,2022-03-09 13:17:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 13:21:00,2022-03-09 13:35:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 13:43:00,2022-03-09 13:57:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 14:01:00,2022-03-09 14:15:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 14:23:00,2022-03-09 14:37:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 14:41:00,2022-03-09 14:55:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 15:03:00,2022-03-09 15:17:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 15:21:00,2022-03-09 15:35:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 15:43:00,2022-03-09 15:57:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 16:01:00,2022-03-09 16:15:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 16:23:00,2022-03-09 16:37:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 16:41:00,2022-03-09 16:55:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 17:03:00,2022-03-09 17:17:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 17:21:00,2022-03-09 17:35:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 17:43:00,2022-03-09 17:57:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 18:01:00,2022-03-09 18:15:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 18:23:00,2022-03-09 18:37:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 18:41:00,2022-03-09 18:55:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 19:03:00,2022-03-09 19:17:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 19:21:00,2022-03-09 19:35:00,Station-23,4637,8,99,VDL +LINE_9,Station-23,2022-03-09 19:43:00,2022-03-09 19:57:00,Station-23,4637,4,99,VDL +LINE_9,Station-23,2022-03-09 20:01:00,2022-03-09 20:14:00,Station-23,4637,9,99,VDL +LINE_9,Station-23,2022-03-09 20:23:00,2022-03-09 20:36:00,Station-23,4637,0,99,VDL +LINE_9,Station-23,2022-03-09 20:36:00,2022-03-09 21:15:00,Station-22,19.8,0,99,VDL +LINE_10,Station-0,2022-03-09 04:56:00,2022-03-09 04:56:00,Station-24,0.06,18,100,CKB +LINE_10,Station-24,2022-03-09 05:14:00,2022-03-09 05:20:00,Station-25,3.29,0,100,CKB +LINE_10,Station-25,2022-03-09 05:20:00,2022-03-09 05:24:00,Station-24,2954,20,100,CKB +LINE_10,Station-24,2022-03-09 05:44:00,2022-03-09 05:50:00,Station-25,3.29,0,100,CKB +LINE_10,Station-25,2022-03-09 05:50:00,2022-03-09 05:54:00,Station-24,2954,5,100,CKB +LINE_10,Station-24,2022-03-09 05:59:00,2022-03-09 06:06:00,Station-25,3.29,2,100,CKB +LINE_10,Station-25,2022-03-09 06:08:00,2022-03-09 06:13:00,Station-24,2954,19,100,CKB +LINE_10,Station-24,2022-03-09 06:32:00,2022-03-09 06:39:00,Station-25,3.29,1,100,CKB +LINE_10,Station-25,2022-03-09 06:40:00,2022-03-09 06:45:00,Station-24,2954,7,100,CKB +LINE_10,Station-24,2022-03-09 06:52:00,2022-03-09 06:59:00,Station-25,3.29,1,100,CKB +LINE_10,Station-25,2022-03-09 07:00:00,2022-03-09 07:05:00,Station-24,2954,7,100,CKB +LINE_10,Station-24,2022-03-09 07:12:00,2022-03-09 07:19:00,Station-25,3.29,1,100,CKB +LINE_10,Station-25,2022-03-09 07:20:00,2022-03-09 07:25:00,Station-24,2954,7,100,CKB +LINE_10,Station-24,2022-03-09 07:32:00,2022-03-09 07:39:00,Station-25,3.29,1,100,CKB +LINE_10,Station-25,2022-03-09 07:40:00,2022-03-09 07:45:00,Station-24,2954,295,100,CKB +LINE_10,Station-24,2022-03-09 12:40:00,2022-03-09 12:47:00,Station-25,3.29,2,100,CKB +LINE_10,Station-25,2022-03-09 12:49:00,2022-03-09 12:54:00,Station-24,2954,46,100,CKB +LINE_10,Station-24,2022-03-09 13:40:00,2022-03-09 13:47:00,Station-25,3.29,2,100,CKB +LINE_10,Station-25,2022-03-09 13:49:00,2022-03-09 13:54:00,Station-24,2954,434,100,CKB +LINE_10,Station-24,2022-03-09 21:08:00,2022-03-09 21:08:00,Station-0,0.06,0,100,CKB +LINE_11,Station-0,2022-03-09 07:20:00,2022-03-09 07:20:00,Station-26,0.06,0,101,CKB +LINE_11,Station-26,2022-03-09 07:20:00,2022-03-09 07:50:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 08:00:00,2022-03-09 08:30:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 08:40:00,2022-03-09 09:10:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 09:20:00,2022-03-09 09:50:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 10:00:00,2022-03-09 10:30:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 10:40:00,2022-03-09 11:10:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 11:20:00,2022-03-09 11:50:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 12:00:00,2022-03-09 12:30:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 12:40:00,2022-03-09 13:10:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 13:20:00,2022-03-09 13:50:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 14:00:00,2022-03-09 14:30:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 14:40:00,2022-03-09 15:10:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 15:20:00,2022-03-09 15:50:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 16:00:00,2022-03-09 16:30:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 16:40:00,2022-03-09 17:10:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 17:20:00,2022-03-09 17:50:00,Station-26,9266,10,101,CKB +LINE_11,Station-26,2022-03-09 18:00:00,2022-03-09 18:30:00,Station-26,9266,0,101,CKB +LINE_11,Station-26,2022-03-09 18:30:00,2022-03-09 18:30:00,Station-0,0.06,0,101,CKB +LINE_12,Station-0,2022-03-09 07:10:00,2022-03-09 07:10:00,Station-27,0.06,0,102,CKB +LINE_12,Station-27,2022-03-09 07:10:00,2022-03-09 07:18:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 07:28:00,2022-03-09 07:40:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 07:40:00,2022-03-09 07:48:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 07:58:00,2022-03-09 08:10:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 08:10:00,2022-03-09 08:18:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 08:28:00,2022-03-09 08:40:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 08:40:00,2022-03-09 08:48:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 08:58:00,2022-03-09 09:10:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 09:10:00,2022-03-09 09:18:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 09:28:00,2022-03-09 09:40:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 09:40:00,2022-03-09 09:48:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 09:58:00,2022-03-09 10:10:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 10:10:00,2022-03-09 10:18:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 10:28:00,2022-03-09 10:40:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 10:40:00,2022-03-09 10:48:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 10:58:00,2022-03-09 11:10:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 11:10:00,2022-03-09 11:18:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 11:28:00,2022-03-09 11:40:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 11:40:00,2022-03-09 11:48:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 11:58:00,2022-03-09 12:10:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 12:10:00,2022-03-09 12:18:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 12:28:00,2022-03-09 12:40:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 12:40:00,2022-03-09 12:48:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 12:58:00,2022-03-09 13:10:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 13:10:00,2022-03-09 13:18:00,Station-28,2169,10,102,CKB +LINE_12,Station-28,2022-03-09 13:28:00,2022-03-09 13:40:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 13:40:00,2022-03-09 13:48:00,Station-28,2169,8,102,CKB +LINE_12,Station-28,2022-03-09 13:56:00,2022-03-09 14:10:00,Station-27,2952,0,102,CKB +LINE_12,Station-27,2022-03-09 14:10:00,2022-03-09 14:19:00,Station-28,2169,14,102,CKB +LINE_12,Station-28,2022-03-09 14:33:00,2022-03-09 14:47:00,Station-27,2952,3,102,CKB +LINE_12,Station-27,2022-03-09 14:50:00,2022-03-09 14:59:00,Station-28,2169,14,102,CKB +LINE_12,Station-28,2022-03-09 15:13:00,2022-03-09 15:27:00,Station-27,2952,3,102,CKB +LINE_12,Station-27,2022-03-09 15:30:00,2022-03-09 15:39:00,Station-28,2169,14,102,CKB +LINE_12,Station-28,2022-03-09 15:53:00,2022-03-09 16:07:00,Station-27,2952,3,102,CKB +LINE_12,Station-27,2022-03-09 16:10:00,2022-03-09 16:19:00,Station-28,2169,14,102,CKB +LINE_12,Station-28,2022-03-09 16:33:00,2022-03-09 16:47:00,Station-27,2952,3,102,CKB +LINE_12,Station-27,2022-03-09 16:50:00,2022-03-09 16:59:00,Station-28,2169,14,102,CKB +LINE_12,Station-28,2022-03-09 17:13:00,2022-03-09 17:27:00,Station-27,2952,3,102,CKB +LINE_12,Station-27,2022-03-09 17:30:00,2022-03-09 17:39:00,Station-28,2169,13,102,CKB +LINE_12,Station-28,2022-03-09 17:52:00,2022-03-09 18:05:00,Station-27,2952,5,102,CKB +LINE_12,Station-27,2022-03-09 18:10:00,2022-03-09 18:18:00,Station-28,2169,0,102,CKB +LINE_12,Station-28,2022-03-09 18:18:00,2022-03-09 18:18:00,Station-0,0.06,0,102,CKB +LINE_12,Station-0,2022-03-09 14:13:00,2022-03-09 14:13:00,Station-28,0.06,0,103,CKB +LINE_12,Station-28,2022-03-09 14:13:00,2022-03-09 14:27:00,Station-27,2952,3,103,CKB +LINE_12,Station-27,2022-03-09 14:30:00,2022-03-09 14:39:00,Station-28,2169,14,103,CKB +LINE_12,Station-28,2022-03-09 14:53:00,2022-03-09 15:07:00,Station-27,2952,3,103,CKB +LINE_12,Station-27,2022-03-09 15:10:00,2022-03-09 15:19:00,Station-28,2169,14,103,CKB +LINE_12,Station-28,2022-03-09 15:33:00,2022-03-09 15:47:00,Station-27,2952,3,103,CKB +LINE_12,Station-27,2022-03-09 15:50:00,2022-03-09 15:59:00,Station-28,2169,14,103,CKB +LINE_12,Station-28,2022-03-09 16:13:00,2022-03-09 16:27:00,Station-27,2952,3,103,CKB +LINE_12,Station-27,2022-03-09 16:30:00,2022-03-09 16:39:00,Station-28,2169,14,103,CKB +LINE_12,Station-28,2022-03-09 16:53:00,2022-03-09 17:07:00,Station-27,2952,3,103,CKB +LINE_12,Station-27,2022-03-09 17:10:00,2022-03-09 17:19:00,Station-28,2169,14,103,CKB +LINE_12,Station-28,2022-03-09 17:33:00,2022-03-09 17:47:00,Station-27,2952,3,103,CKB +LINE_12,Station-27,2022-03-09 17:50:00,2022-03-09 17:59:00,Station-28,2169,14,103,CKB +LINE_12,Station-28,2022-03-09 18:13:00,2022-03-09 18:25:00,Station-27,2952,0,103,CKB +LINE_12,Station-27,2022-03-09 18:25:00,2022-03-09 18:25:00,Station-0,0.06,0,103,CKB +LINE_13,Station-0,2022-03-10 00:23:00,2022-03-10 00:23:00,Station-29,0.06,0,104,CKB +LINE_13,Station-29,2022-03-10 00:23:00,2022-03-10 00:30:00,Station-30,2577,9,104,CKB +LINE_14,Station-30,2022-03-10 00:39:00,2022-03-10 00:54:00,Station-31,5937,9,104,CKB +LINE_14,Station-31,2022-03-10 01:03:00,2022-03-10 01:17:00,Station-30,6.19,0,104,CKB +LINE_13,Station-30,2022-03-10 01:17:00,2022-03-10 01:23:00,Station-29,2555,0,104,CKB +LINE_13,Station-29,2022-03-10 01:23:00,2022-03-10 01:30:00,Station-30,2577,9,104,CKB +LINE_14,Station-30,2022-03-10 01:39:00,2022-03-10 01:54:00,Station-31,5937,9,104,CKB +LINE_14,Station-31,2022-03-10 02:03:00,2022-03-10 02:17:00,Station-30,6.19,0,104,CKB +LINE_13,Station-30,2022-03-10 02:17:00,2022-03-10 02:23:00,Station-29,2555,0,104,CKB +LINE_13,Station-29,2022-03-10 02:23:00,2022-03-10 02:30:00,Station-30,2577,9,104,CKB +LINE_14,Station-30,2022-03-10 02:39:00,2022-03-10 02:54:00,Station-31,5937,9,104,CKB +LINE_14,Station-31,2022-03-10 03:03:00,2022-03-10 03:17:00,Station-30,6.19,0,104,CKB +LINE_13,Station-30,2022-03-10 03:17:00,2022-03-10 03:23:00,Station-29,2555,0,104,CKB +LINE_13,Station-29,2022-03-10 03:23:00,2022-03-10 03:30:00,Station-30,2577,9,104,CKB +LINE_14,Station-30,2022-03-10 03:39:00,2022-03-10 03:54:00,Station-31,5937,9,104,CKB +LINE_14,Station-31,2022-03-10 04:03:00,2022-03-10 04:17:00,Station-30,6.19,0,104,CKB +LINE_13,Station-30,2022-03-10 04:17:00,2022-03-10 04:23:00,Station-29,2555,0,104,CKB +LINE_13,Station-29,2022-03-10 04:23:00,2022-03-10 04:23:00,Station-0,0.06,0,104,CKB +LINE_14,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-31,0.06,0,105,CKB +LINE_14,Station-31,2022-03-10 00:33:00,2022-03-10 00:47:00,Station-30,6.19,0,105,CKB +LINE_13,Station-30,2022-03-10 00:47:00,2022-03-10 00:53:00,Station-29,2555,0,105,CKB +LINE_13,Station-29,2022-03-10 00:53:00,2022-03-10 01:00:00,Station-30,2577,9,105,CKB +LINE_14,Station-30,2022-03-10 01:09:00,2022-03-10 01:24:00,Station-31,5937,9,105,CKB +LINE_14,Station-31,2022-03-10 01:33:00,2022-03-10 01:47:00,Station-30,6.19,0,105,CKB +LINE_13,Station-30,2022-03-10 01:47:00,2022-03-10 01:53:00,Station-29,2555,0,105,CKB +LINE_13,Station-29,2022-03-10 01:53:00,2022-03-10 02:00:00,Station-30,2577,9,105,CKB +LINE_14,Station-30,2022-03-10 02:09:00,2022-03-10 02:24:00,Station-31,5937,9,105,CKB +LINE_14,Station-31,2022-03-10 02:33:00,2022-03-10 02:47:00,Station-30,6.19,0,105,CKB +LINE_13,Station-30,2022-03-10 02:47:00,2022-03-10 02:53:00,Station-29,2555,0,105,CKB +LINE_13,Station-29,2022-03-10 02:53:00,2022-03-10 03:00:00,Station-30,2577,9,105,CKB +LINE_14,Station-30,2022-03-10 03:09:00,2022-03-10 03:24:00,Station-31,5937,9,105,CKB +LINE_14,Station-31,2022-03-10 03:33:00,2022-03-10 03:47:00,Station-30,6.19,0,105,CKB +LINE_13,Station-30,2022-03-10 03:47:00,2022-03-10 03:53:00,Station-29,2555,0,105,CKB +LINE_13,Station-29,2022-03-10 03:53:00,2022-03-10 04:00:00,Station-30,2577,9,105,CKB +LINE_14,Station-30,2022-03-10 04:09:00,2022-03-10 04:24:00,Station-31,5937,0,105,CKB +LINE_14,Station-31,2022-03-10 04:24:00,2022-03-10 04:24:00,Station-0,0.06,0,105,CKB +LINE_15,Station-0,2022-03-10 00:57:00,2022-03-10 00:57:00,Station-32,0.06,0,106,CKB +LINE_15,Station-32,2022-03-10 00:57:00,2022-03-10 01:06:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 01:06:00,2022-03-10 01:11:00,Station-32,2936,16,106,CKB +LINE_15,Station-32,2022-03-10 01:27:00,2022-03-10 01:36:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 01:36:00,2022-03-10 01:41:00,Station-32,2936,16,106,CKB +LINE_15,Station-32,2022-03-10 01:57:00,2022-03-10 02:06:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 02:06:00,2022-03-10 02:11:00,Station-32,2936,16,106,CKB +LINE_15,Station-32,2022-03-10 02:27:00,2022-03-10 02:36:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 02:36:00,2022-03-10 02:41:00,Station-32,2936,16,106,CKB +LINE_15,Station-32,2022-03-10 02:57:00,2022-03-10 03:06:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 03:06:00,2022-03-10 03:11:00,Station-32,2936,16,106,CKB +LINE_15,Station-32,2022-03-10 03:27:00,2022-03-10 03:36:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 03:36:00,2022-03-10 03:41:00,Station-32,2936,16,106,CKB +LINE_15,Station-32,2022-03-10 03:57:00,2022-03-10 04:06:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 04:06:00,2022-03-10 04:11:00,Station-32,2936,16,106,CKB +LINE_15,Station-32,2022-03-10 04:27:00,2022-03-10 04:36:00,Station-33,4343,0,106,CKB +LINE_15,Station-33,2022-03-10 04:36:00,2022-03-10 04:36:00,Station-0,0.06,0,106,CKB +LINE_16,Station-0,2022-03-10 00:29:00,2022-03-10 00:29:00,Station-34,0.06,0,107,CKB +LINE_16,Station-34,2022-03-10 00:29:00,2022-03-10 00:41:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 00:47:00,2022-03-10 00:57:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 00:59:00,2022-03-10 01:11:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 01:17:00,2022-03-10 01:27:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 01:29:00,2022-03-10 01:41:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 01:47:00,2022-03-10 01:57:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 01:59:00,2022-03-10 02:11:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 02:17:00,2022-03-10 02:27:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 02:29:00,2022-03-10 02:41:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 02:47:00,2022-03-10 02:57:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 02:59:00,2022-03-10 03:11:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 03:17:00,2022-03-10 03:27:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 03:29:00,2022-03-10 03:41:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 03:47:00,2022-03-10 03:57:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 03:59:00,2022-03-10 04:11:00,Station-35,4481,6,107,CKB +LINE_16,Station-35,2022-03-10 04:17:00,2022-03-10 04:27:00,Station-34,4031,2,107,CKB +LINE_16,Station-34,2022-03-10 04:29:00,2022-03-10 04:41:00,Station-35,4481,0,107,CKB +LINE_16,Station-35,2022-03-10 04:41:00,2022-03-10 04:41:00,Station-0,0.06,0,107,CKB +LINE_17,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-34,0.06,0,108,CKB +LINE_17,Station-34,2022-03-10 00:30:00,2022-03-10 00:44:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 00:44:00,2022-03-10 00:57:00,Station-34,5302,3,108,CKB +LINE_17,Station-34,2022-03-10 01:00:00,2022-03-10 01:14:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 01:14:00,2022-03-10 01:27:00,Station-34,5302,3,108,CKB +LINE_17,Station-34,2022-03-10 01:30:00,2022-03-10 01:44:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 01:44:00,2022-03-10 01:57:00,Station-34,5302,3,108,CKB +LINE_17,Station-34,2022-03-10 02:00:00,2022-03-10 02:14:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 02:14:00,2022-03-10 02:27:00,Station-34,5302,3,108,CKB +LINE_17,Station-34,2022-03-10 02:30:00,2022-03-10 02:44:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 02:44:00,2022-03-10 02:57:00,Station-34,5302,3,108,CKB +LINE_17,Station-34,2022-03-10 03:00:00,2022-03-10 03:14:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 03:14:00,2022-03-10 03:27:00,Station-34,5302,3,108,CKB +LINE_17,Station-34,2022-03-10 03:30:00,2022-03-10 03:44:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 03:44:00,2022-03-10 03:57:00,Station-34,5302,3,108,CKB +LINE_17,Station-34,2022-03-10 04:00:00,2022-03-10 04:14:00,Station-36,4801,0,108,CKB +LINE_17,Station-36,2022-03-10 04:14:00,2022-03-10 04:27:00,Station-34,5302,0,108,CKB +LINE_17,Station-34,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,108,CKB +LINE_18,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-37,0.06,0,109,CKB +LINE_18,Station-37,2022-03-10 00:43:00,2022-03-10 01:33:00,Station-37,20434,10,109,CKB +LINE_18,Station-37,2022-03-10 01:43:00,2022-03-10 02:33:00,Station-37,20434,10,109,CKB +LINE_18,Station-37,2022-03-10 02:43:00,2022-03-10 03:33:00,Station-37,20434,10,109,CKB +LINE_18,Station-37,2022-03-10 03:43:00,2022-03-10 04:33:00,Station-37,20434,0,109,CKB +LINE_18,Station-37,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,109,CKB +LINE_18,Station-0,2022-03-10 00:13:00,2022-03-10 00:13:00,Station-37,0.06,0,110,CKB +LINE_18,Station-37,2022-03-10 00:13:00,2022-03-10 01:03:00,Station-37,20434,10,110,CKB +LINE_18,Station-37,2022-03-10 01:13:00,2022-03-10 02:03:00,Station-37,20434,10,110,CKB +LINE_18,Station-37,2022-03-10 02:13:00,2022-03-10 03:03:00,Station-37,20434,10,110,CKB +LINE_18,Station-37,2022-03-10 03:13:00,2022-03-10 04:03:00,Station-37,20434,0,110,CKB +LINE_18,Station-37,2022-03-10 04:03:00,2022-03-10 04:03:00,Station-0,0.06,0,110,CKB +LINE_19,Station-0,2022-03-10 00:24:00,2022-03-10 00:24:00,Station-38,0.06,0,111,CKB +LINE_19,Station-38,2022-03-10 00:24:00,2022-03-10 00:48:00,Station-39,11.86,4,111,CKB +LINE_19,Station-39,2022-03-10 00:52:00,2022-03-10 01:14:00,Station-38,11139,10,111,CKB +LINE_19,Station-38,2022-03-10 01:24:00,2022-03-10 01:48:00,Station-39,11.86,4,111,CKB +LINE_19,Station-39,2022-03-10 01:52:00,2022-03-10 02:14:00,Station-38,11139,10,111,CKB +LINE_19,Station-38,2022-03-10 02:24:00,2022-03-10 02:48:00,Station-39,11.86,4,111,CKB +LINE_19,Station-39,2022-03-10 02:52:00,2022-03-10 03:14:00,Station-38,11139,10,111,CKB +LINE_19,Station-38,2022-03-10 03:24:00,2022-03-10 03:48:00,Station-39,11.86,4,111,CKB +LINE_19,Station-39,2022-03-10 03:52:00,2022-03-10 04:14:00,Station-38,11139,0,111,CKB +LINE_19,Station-38,2022-03-10 04:14:00,2022-03-10 04:14:00,Station-0,0.06,0,111,CKB +LINE_19,Station-0,2022-03-10 00:22:00,2022-03-10 00:22:00,Station-39,0.06,0,112,CKB +LINE_19,Station-39,2022-03-10 00:22:00,2022-03-10 00:44:00,Station-38,11139,10,112,CKB +LINE_19,Station-38,2022-03-10 00:54:00,2022-03-10 01:18:00,Station-39,11.86,4,112,CKB +LINE_19,Station-39,2022-03-10 01:22:00,2022-03-10 01:44:00,Station-38,11139,10,112,CKB +LINE_19,Station-38,2022-03-10 01:54:00,2022-03-10 02:18:00,Station-39,11.86,4,112,CKB +LINE_19,Station-39,2022-03-10 02:22:00,2022-03-10 02:44:00,Station-38,11139,10,112,CKB +LINE_19,Station-38,2022-03-10 02:54:00,2022-03-10 03:18:00,Station-39,11.86,4,112,CKB +LINE_19,Station-39,2022-03-10 03:22:00,2022-03-10 03:44:00,Station-38,11139,10,112,CKB +LINE_19,Station-38,2022-03-10 03:54:00,2022-03-10 04:18:00,Station-39,11.86,4,112,CKB +LINE_19,Station-39,2022-03-10 04:22:00,2022-03-10 04:44:00,Station-38,11139,0,112,CKB +LINE_19,Station-38,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,112,CKB +LINE_20,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,113,CKB +LINE_20,Station-13,2022-03-10 00:32:00,2022-03-10 00:44:00,Station-40,4212,3,113,CKB +LINE_20,Station-40,2022-03-10 00:47:00,2022-03-10 01:16:00,Station-41,13048,0,113,CKB +LINE_20,Station-41,2022-03-10 01:16:00,2022-03-10 01:42:00,Station-40,12869,5,113,CKB +LINE_20,Station-40,2022-03-10 01:47:00,2022-03-10 02:16:00,Station-41,13048,0,113,CKB +LINE_20,Station-41,2022-03-10 02:16:00,2022-03-10 02:42:00,Station-40,12869,5,113,CKB +LINE_20,Station-40,2022-03-10 02:47:00,2022-03-10 03:16:00,Station-41,13048,0,113,CKB +LINE_20,Station-41,2022-03-10 03:16:00,2022-03-10 03:42:00,Station-40,12869,5,113,CKB +LINE_20,Station-40,2022-03-10 03:47:00,2022-03-10 04:16:00,Station-41,13048,0,113,CKB +LINE_20,Station-41,2022-03-10 04:16:00,2022-03-10 04:34:00,Station-42,9538,0,113,CKB +LINE_20,Station-42,2022-03-10 04:34:00,2022-03-10 04:34:00,Station-0,0.06,0,113,CKB +LINE_20,Station-0,2022-03-10 00:17:00,2022-03-10 00:17:00,Station-40,0.06,0,114,CKB +LINE_20,Station-40,2022-03-10 00:17:00,2022-03-10 00:46:00,Station-41,13048,0,114,CKB +LINE_20,Station-41,2022-03-10 00:46:00,2022-03-10 01:12:00,Station-40,12869,5,114,CKB +LINE_20,Station-40,2022-03-10 01:17:00,2022-03-10 01:46:00,Station-41,13048,0,114,CKB +LINE_20,Station-41,2022-03-10 01:46:00,2022-03-10 02:12:00,Station-40,12869,5,114,CKB +LINE_20,Station-40,2022-03-10 02:17:00,2022-03-10 02:46:00,Station-41,13048,0,114,CKB +LINE_20,Station-41,2022-03-10 02:46:00,2022-03-10 03:12:00,Station-40,12869,5,114,CKB +LINE_20,Station-40,2022-03-10 03:17:00,2022-03-10 03:46:00,Station-41,13048,0,114,CKB +LINE_20,Station-41,2022-03-10 03:46:00,2022-03-10 04:12:00,Station-40,12869,5,114,CKB +LINE_20,Station-40,2022-03-10 04:17:00,2022-03-10 04:28:00,Station-13,4316,0,114,CKB +LINE_20,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,114,CKB +LINE_21,Station-0,2022-03-10 00:49:00,2022-03-10 00:49:00,Station-3,0.06,0,115,CKB +LINE_21,Station-3,2022-03-10 00:49:00,2022-03-10 01:04:00,Station-16,10229,0,115,CKB +LINE_21,Station-16,2022-03-10 01:04:00,2022-03-10 01:19:00,Station-3,11801,0,115,CKB +LINE_21,Station-3,2022-03-10 01:19:00,2022-03-10 01:34:00,Station-16,10229,0,115,CKB +LINE_21,Station-16,2022-03-10 01:34:00,2022-03-10 01:49:00,Station-3,11801,0,115,CKB +LINE_21,Station-3,2022-03-10 01:49:00,2022-03-10 02:04:00,Station-16,10229,0,115,CKB +LINE_21,Station-16,2022-03-10 02:04:00,2022-03-10 02:19:00,Station-3,11801,0,115,CKB +LINE_21,Station-3,2022-03-10 02:19:00,2022-03-10 02:34:00,Station-16,10229,0,115,CKB +LINE_21,Station-16,2022-03-10 02:34:00,2022-03-10 02:49:00,Station-3,11801,0,115,CKB +LINE_21,Station-3,2022-03-10 02:49:00,2022-03-10 03:04:00,Station-16,10229,0,115,CKB +LINE_21,Station-16,2022-03-10 03:04:00,2022-03-10 03:19:00,Station-3,11801,0,115,CKB +LINE_21,Station-3,2022-03-10 03:19:00,2022-03-10 03:34:00,Station-16,10229,0,115,CKB +LINE_21,Station-16,2022-03-10 03:34:00,2022-03-10 03:49:00,Station-3,11801,0,115,CKB +LINE_21,Station-3,2022-03-10 03:49:00,2022-03-10 04:04:00,Station-16,10229,0,115,CKB +LINE_21,Station-16,2022-03-10 04:04:00,2022-03-10 04:19:00,Station-3,11801,23,115,CKB +LINE_22,Station-3,2022-03-10 04:42:00,2022-03-10 05:04:00,Station-43,6.81,0,115,CKB +LINE_22,Station-43,2022-03-10 05:04:00,2022-03-10 05:04:00,Station-0,0.06,0,115,CKB +LINE_8,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,116,CKB +LINE_8,Station-13,2022-03-10 00:32:00,2022-03-10 00:57:00,Station-21,11545,6,116,CKB +LINE_8,Station-21,2022-03-10 01:03:00,2022-03-10 01:46:00,Station-20,20579,1,116,CKB +LINE_8,Station-20,2022-03-10 01:47:00,2022-03-10 02:25:00,Station-21,20641,8,116,CKB +LINE_8,Station-21,2022-03-10 02:33:00,2022-03-10 03:16:00,Station-20,20579,1,116,CKB +LINE_8,Station-20,2022-03-10 03:17:00,2022-03-10 03:55:00,Station-21,20641,8,116,CKB +LINE_8,Station-21,2022-03-10 04:03:00,2022-03-10 04:28:00,Station-13,11499,0,116,CKB +LINE_8,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,116,CKB +LINE_8,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-21,0.06,0,117,CKB +LINE_8,Station-21,2022-03-10 00:33:00,2022-03-10 01:16:00,Station-20,20579,1,117,CKB +LINE_8,Station-20,2022-03-10 01:17:00,2022-03-10 01:55:00,Station-21,20641,8,117,CKB +LINE_8,Station-21,2022-03-10 02:03:00,2022-03-10 02:46:00,Station-20,20579,1,117,CKB +LINE_8,Station-20,2022-03-10 02:47:00,2022-03-10 03:25:00,Station-21,20641,8,117,CKB +LINE_8,Station-21,2022-03-10 03:33:00,2022-03-10 04:16:00,Station-20,20579,1,117,CKB +LINE_8,Station-20,2022-03-10 04:17:00,2022-03-10 04:51:00,Station-44,18752,0,117,CKB +LINE_8,Station-44,2022-03-10 04:51:00,2022-03-10 04:51:00,Station-0,0.06,0,117,CKB +LINE_23,Station-0,2022-03-10 00:34:00,2022-03-10 00:34:00,Station-45,0.06,0,118,CKB +LINE_23,Station-45,2022-03-10 00:34:00,2022-03-10 01:00:00,Station-46,9016,0,118,CKB +LINE_23,Station-46,2022-03-10 01:00:00,2022-03-10 01:27:00,Station-45,10083,7,118,CKB +LINE_23,Station-45,2022-03-10 01:34:00,2022-03-10 02:00:00,Station-46,9016,0,118,CKB +LINE_23,Station-46,2022-03-10 02:00:00,2022-03-10 02:27:00,Station-45,10083,7,118,CKB +LINE_23,Station-45,2022-03-10 02:34:00,2022-03-10 03:00:00,Station-46,9016,0,118,CKB +LINE_23,Station-46,2022-03-10 03:00:00,2022-03-10 03:27:00,Station-45,10083,7,118,CKB +LINE_23,Station-45,2022-03-10 03:34:00,2022-03-10 04:00:00,Station-46,9016,0,118,CKB +LINE_23,Station-46,2022-03-10 04:00:00,2022-03-10 04:27:00,Station-45,10083,0,118,CKB +LINE_23,Station-45,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,118,CKB +LINE_23,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-46,0.06,0,119,CKB +LINE_23,Station-46,2022-03-10 00:30:00,2022-03-10 00:57:00,Station-45,10083,7,119,CKB +LINE_23,Station-45,2022-03-10 01:04:00,2022-03-10 01:30:00,Station-46,9016,0,119,CKB +LINE_23,Station-46,2022-03-10 01:30:00,2022-03-10 01:57:00,Station-45,10083,7,119,CKB +LINE_23,Station-45,2022-03-10 02:04:00,2022-03-10 02:30:00,Station-46,9016,0,119,CKB +LINE_23,Station-46,2022-03-10 02:30:00,2022-03-10 02:57:00,Station-45,10083,7,119,CKB +LINE_23,Station-45,2022-03-10 03:04:00,2022-03-10 03:30:00,Station-46,9016,0,119,CKB +LINE_23,Station-46,2022-03-10 03:30:00,2022-03-10 03:57:00,Station-45,10083,7,119,CKB +LINE_23,Station-45,2022-03-10 04:04:00,2022-03-10 04:30:00,Station-46,9016,0,119,CKB +LINE_23,Station-46,2022-03-10 04:30:00,2022-03-10 04:57:00,Station-45,10083,0,119,CKB +LINE_23,Station-45,2022-03-10 04:57:00,2022-03-10 04:57:00,Station-0,0.06,0,119,CKB +LINE_24,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,120,CKB +LINE_24,Station-21,2022-03-10 00:31:00,2022-03-10 00:44:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 00:44:00,2022-03-10 00:56:00,Station-21,5362,5,120,CKB +LINE_24,Station-21,2022-03-10 01:01:00,2022-03-10 01:14:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 01:14:00,2022-03-10 01:26:00,Station-21,5362,5,120,CKB +LINE_24,Station-21,2022-03-10 01:31:00,2022-03-10 01:44:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 01:44:00,2022-03-10 01:56:00,Station-21,5362,5,120,CKB +LINE_24,Station-21,2022-03-10 02:01:00,2022-03-10 02:14:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 02:14:00,2022-03-10 02:26:00,Station-21,5362,5,120,CKB +LINE_24,Station-21,2022-03-10 02:31:00,2022-03-10 02:44:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 02:44:00,2022-03-10 02:56:00,Station-21,5362,5,120,CKB +LINE_24,Station-21,2022-03-10 03:01:00,2022-03-10 03:14:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 03:14:00,2022-03-10 03:26:00,Station-21,5362,5,120,CKB +LINE_24,Station-21,2022-03-10 03:31:00,2022-03-10 03:44:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 03:44:00,2022-03-10 03:56:00,Station-21,5362,5,120,CKB +LINE_24,Station-21,2022-03-10 04:01:00,2022-03-10 04:14:00,Station-47,4872,0,120,CKB +LINE_24,Station-47,2022-03-10 04:14:00,2022-03-10 04:26:00,Station-21,5362,0,120,CKB +LINE_24,Station-21,2022-03-10 04:26:00,2022-03-10 04:26:00,Station-0,0.06,0,120,CKB +LINE_25,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,121,CKB +LINE_25,Station-21,2022-03-10 00:31:00,2022-03-10 00:45:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 00:47:00,2022-03-10 01:01:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 01:01:00,2022-03-10 01:15:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 01:17:00,2022-03-10 01:31:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 01:31:00,2022-03-10 01:45:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 01:47:00,2022-03-10 02:01:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 02:01:00,2022-03-10 02:15:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 02:17:00,2022-03-10 02:31:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 02:31:00,2022-03-10 02:45:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 02:47:00,2022-03-10 03:01:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 03:01:00,2022-03-10 03:15:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 03:17:00,2022-03-10 03:31:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 03:31:00,2022-03-10 03:45:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 03:47:00,2022-03-10 04:01:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 04:01:00,2022-03-10 04:15:00,Station-48,5225,2,121,CKB +LINE_25,Station-48,2022-03-10 04:17:00,2022-03-10 04:31:00,Station-21,7617,0,121,CKB +LINE_25,Station-21,2022-03-10 04:31:00,2022-03-10 04:31:00,Station-0,0.06,0,121,CKB +LINE_26,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-49,0.06,0,122,CKB +LINE_26,Station-49,2022-03-10 00:43:00,2022-03-10 00:53:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 00:53:00,2022-03-10 01:03:00,Station-49,4408,10,122,CKB +LINE_26,Station-49,2022-03-10 01:13:00,2022-03-10 01:23:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 01:23:00,2022-03-10 01:33:00,Station-49,4408,10,122,CKB +LINE_26,Station-49,2022-03-10 01:43:00,2022-03-10 01:53:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 01:53:00,2022-03-10 02:03:00,Station-49,4408,10,122,CKB +LINE_26,Station-49,2022-03-10 02:13:00,2022-03-10 02:23:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 02:23:00,2022-03-10 02:33:00,Station-49,4408,10,122,CKB +LINE_26,Station-49,2022-03-10 02:43:00,2022-03-10 02:53:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 02:53:00,2022-03-10 03:03:00,Station-49,4408,10,122,CKB +LINE_26,Station-49,2022-03-10 03:13:00,2022-03-10 03:23:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 03:23:00,2022-03-10 03:33:00,Station-49,4408,10,122,CKB +LINE_26,Station-49,2022-03-10 03:43:00,2022-03-10 03:53:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 03:53:00,2022-03-10 04:03:00,Station-49,4408,10,122,CKB +LINE_26,Station-49,2022-03-10 04:13:00,2022-03-10 04:23:00,Station-50,4507,0,122,CKB +LINE_26,Station-50,2022-03-10 04:23:00,2022-03-10 04:33:00,Station-49,4408,0,122,CKB +LINE_26,Station-49,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,122,CKB +LINE_0,Station-0,2022-03-10 21:31:00,2022-03-10 21:31:00,Station-1,0.06,0,123,CKB +LINE_0,Station-1,2022-03-10 21:31:00,2022-03-10 22:04:00,Station-2,14519,4,123,CKB +LINE_0,Station-2,2022-03-10 22:08:00,2022-03-10 22:43:00,Station-1,13541,8,123,CKB +LINE_0,Station-1,2022-03-10 22:51:00,2022-03-10 23:24:00,Station-2,14519,4,123,CKB +LINE_0,Station-2,2022-03-10 23:28:00,2022-03-11 00:03:00,Station-1,13541,8,123,CKB +LINE_0,Station-1,2022-03-11 00:11:00,2022-03-11 00:44:00,Station-2,14519,0,123,CKB +LINE_1,Station-2,2022-03-11 00:44:00,2022-03-11 00:54:00,Station-3,4.1,25,123,CKB +LINE_1,Station-3,2022-03-11 01:19:00,2022-03-11 01:42:00,Station-4,8.36,6,123,CKB +LINE_1,Station-4,2022-03-11 01:48:00,2022-03-11 02:06:00,Station-3,9067,13,123,CKB +LINE_1,Station-3,2022-03-11 02:19:00,2022-03-11 02:42:00,Station-4,8.36,6,123,CKB +LINE_1,Station-4,2022-03-11 02:48:00,2022-03-11 03:06:00,Station-3,9067,13,123,CKB +LINE_1,Station-3,2022-03-11 03:19:00,2022-03-11 03:42:00,Station-4,8.36,6,123,CKB +LINE_1,Station-4,2022-03-11 03:48:00,2022-03-11 04:06:00,Station-3,9067,0,123,CKB +LINE_1,Station-3,2022-03-11 04:06:00,2022-03-11 04:06:00,Station-0,0.06,0,123,CKB +LINE_0,Station-0,2022-03-10 22:11:00,2022-03-10 22:11:00,Station-1,0.06,0,124,CKB +LINE_0,Station-1,2022-03-10 22:11:00,2022-03-10 22:44:00,Station-2,14519,4,124,CKB +LINE_0,Station-2,2022-03-10 22:48:00,2022-03-10 23:23:00,Station-1,13541,8,124,CKB +LINE_0,Station-1,2022-03-10 23:31:00,2022-03-11 00:04:00,Station-2,14519,4,124,CKB +LINE_0,Station-2,2022-03-11 00:08:00,2022-03-11 00:39:00,Station-5,12213,0,124,CKB +LINE_1,Station-5,2022-03-11 00:39:00,2022-03-11 00:47:00,Station-3,4.0,2,124,CKB +LINE_1,Station-3,2022-03-11 00:49:00,2022-03-11 01:12:00,Station-4,8.36,6,124,CKB +LINE_1,Station-4,2022-03-11 01:18:00,2022-03-11 01:36:00,Station-3,9067,13,124,CKB +LINE_1,Station-3,2022-03-11 01:49:00,2022-03-11 02:12:00,Station-4,8.36,6,124,CKB +LINE_1,Station-4,2022-03-11 02:18:00,2022-03-11 02:36:00,Station-3,9067,13,124,CKB +LINE_1,Station-3,2022-03-11 02:49:00,2022-03-11 03:12:00,Station-4,8.36,6,124,CKB +LINE_1,Station-4,2022-03-11 03:18:00,2022-03-11 03:36:00,Station-3,9067,13,124,CKB +LINE_1,Station-3,2022-03-11 03:49:00,2022-03-11 04:12:00,Station-4,8.36,0,124,CKB +LINE_1,Station-4,2022-03-11 04:12:00,2022-03-11 04:12:00,Station-0,0.06,0,124,CKB +LINE_2,Station-0,2022-03-10 21:06:00,2022-03-10 21:06:00,Station-6,0.06,0,125,CKB +LINE_2,Station-6,2022-03-10 21:06:00,2022-03-10 21:34:00,Station-7,13018,19,125,CKB +LINE_2,Station-7,2022-03-10 21:53:00,2022-03-10 22:13:00,Station-8,10332,17,125,CKB +LINE_2,Station-8,2022-03-10 22:30:00,2022-03-10 22:54:00,Station-7,10.48,19,125,CKB +LINE_2,Station-7,2022-03-10 23:13:00,2022-03-10 23:33:00,Station-8,10332,17,125,CKB +LINE_2,Station-8,2022-03-10 23:50:00,2022-03-11 00:14:00,Station-7,10.48,2,125,CKB +LINE_2,Station-7,2022-03-11 00:16:00,2022-03-11 00:23:00,Station-9,3709,5,125,CKB +LINE_3,Station-9,2022-03-11 00:28:00,2022-03-11 00:44:00,Station-10,6404,3,125,CKB +LINE_3,Station-10,2022-03-11 00:47:00,2022-03-11 01:10:00,Station-11,10579,7,125,CKB +LINE_3,Station-11,2022-03-11 01:17:00,2022-03-11 01:44:00,Station-10,12007,3,125,CKB +LINE_3,Station-10,2022-03-11 01:47:00,2022-03-11 02:10:00,Station-11,10579,7,125,CKB +LINE_3,Station-11,2022-03-11 02:17:00,2022-03-11 02:44:00,Station-10,12007,3,125,CKB +LINE_3,Station-10,2022-03-11 02:47:00,2022-03-11 03:10:00,Station-11,10579,7,125,CKB +LINE_3,Station-11,2022-03-11 03:17:00,2022-03-11 03:44:00,Station-10,12007,3,125,CKB +LINE_3,Station-10,2022-03-11 03:47:00,2022-03-11 04:10:00,Station-11,10579,7,125,CKB +LINE_3,Station-11,2022-03-11 04:17:00,2022-03-11 04:44:00,Station-10,12007,0,125,CKB +LINE_3,Station-10,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,125,CKB +LINE_2,Station-0,2022-03-10 20:26:00,2022-03-10 20:26:00,Station-6,0.06,0,126,CKB +LINE_2,Station-6,2022-03-10 20:26:00,2022-03-10 20:56:00,Station-12,14097,14,126,CKB +LINE_2,Station-12,2022-03-10 21:10:00,2022-03-10 21:38:00,Station-6,13.19,8,126,CKB +LINE_2,Station-6,2022-03-10 21:46:00,2022-03-10 22:14:00,Station-7,13018,19,126,CKB +LINE_2,Station-7,2022-03-10 22:33:00,2022-03-10 22:53:00,Station-8,10332,17,126,CKB +LINE_2,Station-8,2022-03-10 23:10:00,2022-03-10 23:34:00,Station-7,10.48,19,126,CKB +LINE_2,Station-7,2022-03-10 23:53:00,2022-03-11 00:13:00,Station-8,10332,2,126,CKB +LINE_2,Station-8,2022-03-11 00:15:00,2022-03-11 00:16:00,Station-10,506,1,126,CKB +LINE_3,Station-10,2022-03-11 00:17:00,2022-03-11 00:40:00,Station-11,10579,7,126,CKB +LINE_3,Station-11,2022-03-11 00:47:00,2022-03-11 01:14:00,Station-10,12007,3,126,CKB +LINE_3,Station-10,2022-03-11 01:17:00,2022-03-11 01:40:00,Station-11,10579,7,126,CKB +LINE_3,Station-11,2022-03-11 01:47:00,2022-03-11 02:14:00,Station-10,12007,3,126,CKB +LINE_3,Station-10,2022-03-11 02:17:00,2022-03-11 02:40:00,Station-11,10579,7,126,CKB +LINE_3,Station-11,2022-03-11 02:47:00,2022-03-11 03:14:00,Station-10,12007,3,126,CKB +LINE_3,Station-10,2022-03-11 03:17:00,2022-03-11 03:40:00,Station-11,10579,7,126,CKB +LINE_3,Station-11,2022-03-11 03:47:00,2022-03-11 04:14:00,Station-10,12007,3,126,CKB +LINE_3,Station-10,2022-03-11 04:17:00,2022-03-11 04:40:00,Station-11,10579,3,126,CKB +LINE_4,Station-11,2022-03-11 04:43:00,2022-03-11 04:58:00,Station-13,6161,0,126,CKB +LINE_4,Station-13,2022-03-11 04:58:00,2022-03-11 04:58:00,Station-0,0.06,0,126,CKB +LINE_5,Station-0,2022-03-10 22:56:00,2022-03-10 22:56:00,Station-14,0.06,0,127,CKB +LINE_5,Station-14,2022-03-10 22:56:00,2022-03-10 23:08:00,Station-15,5882,3,127,CKB +LINE_5,Station-15,2022-03-10 23:11:00,2022-03-10 23:25:00,Station-14,6232,0,127,CKB +LINE_5,Station-14,2022-03-10 23:25:00,2022-03-10 23:38:00,Station-15,6086,3,127,CKB +LINE_5,Station-15,2022-03-10 23:41:00,2022-03-10 23:55:00,Station-14,6232,0,127,CKB +LINE_5,Station-14,2022-03-10 23:55:00,2022-03-11 00:08:00,Station-15,6086,0,127,CKB +LINE_5,Station-15,2022-03-11 00:08:00,2022-03-11 00:08:00,Station-0,0.06,0,127,CKB +LINE_6,Station-0,2022-03-10 05:05:00,2022-03-10 05:05:00,Station-16,0.06,0,128,CKB +LINE_6,Station-16,2022-03-10 05:05:00,2022-03-10 05:14:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 05:14:00,2022-03-10 05:23:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 05:25:00,2022-03-10 05:34:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 05:34:00,2022-03-10 05:43:00,Station-16,5139,23,128,CKB +LINE_6,Station-16,2022-03-10 06:06:00,2022-03-10 06:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 06:15:00,2022-03-10 06:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 06:26:00,2022-03-10 06:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 06:35:00,2022-03-10 06:44:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 06:46:00,2022-03-10 06:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 06:55:00,2022-03-10 07:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 07:06:00,2022-03-10 07:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 07:15:00,2022-03-10 07:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 07:26:00,2022-03-10 07:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 07:35:00,2022-03-10 07:44:00,Station-16,5139,22,128,CKB +LINE_6,Station-16,2022-03-10 08:06:00,2022-03-10 08:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 08:15:00,2022-03-10 08:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 08:26:00,2022-03-10 08:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 08:35:00,2022-03-10 08:44:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 08:46:00,2022-03-10 08:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 08:55:00,2022-03-10 09:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 09:06:00,2022-03-10 09:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 09:15:00,2022-03-10 09:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 09:26:00,2022-03-10 09:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 09:35:00,2022-03-10 09:44:00,Station-16,5139,22,128,CKB +LINE_6,Station-16,2022-03-10 10:06:00,2022-03-10 10:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 10:15:00,2022-03-10 10:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 10:26:00,2022-03-10 10:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 10:35:00,2022-03-10 10:44:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 10:46:00,2022-03-10 10:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 10:55:00,2022-03-10 11:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 11:06:00,2022-03-10 11:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 11:15:00,2022-03-10 11:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 11:26:00,2022-03-10 11:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 11:35:00,2022-03-10 11:44:00,Station-16,5139,22,128,CKB +LINE_6,Station-16,2022-03-10 12:06:00,2022-03-10 12:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 12:15:00,2022-03-10 12:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 12:26:00,2022-03-10 12:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 12:35:00,2022-03-10 12:44:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 12:46:00,2022-03-10 12:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 12:55:00,2022-03-10 13:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 13:06:00,2022-03-10 13:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 13:15:00,2022-03-10 13:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 13:26:00,2022-03-10 13:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 13:35:00,2022-03-10 13:44:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 13:46:00,2022-03-10 13:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 13:55:00,2022-03-10 14:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 14:06:00,2022-03-10 14:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 14:15:00,2022-03-10 14:24:00,Station-16,5139,22,128,CKB +LINE_6,Station-16,2022-03-10 14:46:00,2022-03-10 14:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 14:55:00,2022-03-10 15:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 15:06:00,2022-03-10 15:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 15:15:00,2022-03-10 15:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 15:26:00,2022-03-10 15:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 15:35:00,2022-03-10 15:44:00,Station-16,5139,22,128,CKB +LINE_6,Station-16,2022-03-10 16:06:00,2022-03-10 16:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 16:15:00,2022-03-10 16:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 16:26:00,2022-03-10 16:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 16:35:00,2022-03-10 16:44:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 16:46:00,2022-03-10 16:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 16:55:00,2022-03-10 17:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 17:06:00,2022-03-10 17:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 17:15:00,2022-03-10 17:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 17:26:00,2022-03-10 17:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 17:35:00,2022-03-10 17:44:00,Station-16,5139,22,128,CKB +LINE_6,Station-16,2022-03-10 18:06:00,2022-03-10 18:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 18:15:00,2022-03-10 18:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 18:26:00,2022-03-10 18:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 18:35:00,2022-03-10 18:44:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 18:46:00,2022-03-10 18:55:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 18:55:00,2022-03-10 19:04:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 19:06:00,2022-03-10 19:15:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 19:15:00,2022-03-10 19:24:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 19:26:00,2022-03-10 19:35:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 19:35:00,2022-03-10 19:44:00,Station-16,5139,21,128,CKB +LINE_6,Station-16,2022-03-10 20:05:00,2022-03-10 20:14:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 20:14:00,2022-03-10 20:23:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 20:25:00,2022-03-10 20:34:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 20:34:00,2022-03-10 20:43:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 20:45:00,2022-03-10 20:54:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 20:54:00,2022-03-10 21:03:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 21:05:00,2022-03-10 21:14:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 21:14:00,2022-03-10 21:23:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 21:25:00,2022-03-10 21:34:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 21:34:00,2022-03-10 21:43:00,Station-16,5139,22,128,CKB +LINE_6,Station-16,2022-03-10 22:05:00,2022-03-10 22:14:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 22:14:00,2022-03-10 22:23:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 22:25:00,2022-03-10 22:34:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 22:34:00,2022-03-10 22:43:00,Station-16,5139,2,128,CKB +LINE_6,Station-16,2022-03-10 22:45:00,2022-03-10 22:54:00,Station-17,4781,0,128,CKB +LINE_6,Station-17,2022-03-10 22:54:00,2022-03-10 23:03:00,Station-16,5139,0,128,CKB +LINE_6,Station-16,2022-03-10 23:03:00,2022-03-10 23:03:00,Station-0,0.06,0,128,CKB +LINE_7,Station-0,2022-03-11 00:06:00,2022-03-11 00:06:00,Station-18,0.06,0,129,CKB +LINE_7,Station-18,2022-03-11 00:06:00,2022-03-11 00:27:00,Station-19,7827,0,129,CKB +LINE_8,Station-19,2022-03-11 00:27:00,2022-03-11 00:48:00,Station-20,11079,0,129,CKB +LINE_8,Station-20,2022-03-11 00:48:00,2022-03-11 01:25:00,Station-21,20641,8,129,CKB +LINE_8,Station-21,2022-03-11 01:33:00,2022-03-11 02:16:00,Station-20,20579,1,129,CKB +LINE_8,Station-20,2022-03-11 02:17:00,2022-03-11 02:55:00,Station-21,20641,8,129,CKB +LINE_8,Station-21,2022-03-11 03:03:00,2022-03-11 03:46:00,Station-20,20579,1,129,CKB +LINE_8,Station-20,2022-03-11 03:47:00,2022-03-11 04:25:00,Station-21,20641,0,129,CKB +LINE_8,Station-21,2022-03-11 04:25:00,2022-03-11 04:25:00,Station-0,0.06,0,129,CKB +LINE_9,Station-22,2022-03-10 05:15:00,2022-03-10 06:01:00,Station-23,17.9,0,130,VDL +LINE_9,Station-23,2022-03-10 06:01:00,2022-03-10 06:15:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 06:23:00,2022-03-10 06:37:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 06:41:00,2022-03-10 06:55:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 07:03:00,2022-03-10 07:17:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 07:21:00,2022-03-10 07:35:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 07:43:00,2022-03-10 07:57:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 08:01:00,2022-03-10 08:15:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 08:23:00,2022-03-10 08:37:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 08:41:00,2022-03-10 08:55:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 09:03:00,2022-03-10 09:17:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 09:21:00,2022-03-10 09:35:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 09:43:00,2022-03-10 09:57:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 10:01:00,2022-03-10 10:15:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 10:23:00,2022-03-10 10:37:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 10:41:00,2022-03-10 10:55:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 11:03:00,2022-03-10 11:17:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 11:21:00,2022-03-10 11:35:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 11:43:00,2022-03-10 11:57:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 12:01:00,2022-03-10 12:15:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 12:23:00,2022-03-10 12:37:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 12:41:00,2022-03-10 12:55:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 13:03:00,2022-03-10 13:17:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 13:21:00,2022-03-10 13:35:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 13:43:00,2022-03-10 13:57:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 14:01:00,2022-03-10 14:15:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 14:23:00,2022-03-10 14:37:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 14:41:00,2022-03-10 14:55:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 15:03:00,2022-03-10 15:17:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 15:21:00,2022-03-10 15:35:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 15:43:00,2022-03-10 15:57:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 16:01:00,2022-03-10 16:15:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 16:23:00,2022-03-10 16:37:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 16:41:00,2022-03-10 16:55:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 17:03:00,2022-03-10 17:17:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 17:21:00,2022-03-10 17:35:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 17:43:00,2022-03-10 17:57:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 18:01:00,2022-03-10 18:15:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 18:23:00,2022-03-10 18:37:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 18:41:00,2022-03-10 18:55:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 19:03:00,2022-03-10 19:17:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 19:21:00,2022-03-10 19:35:00,Station-23,4637,8,130,VDL +LINE_9,Station-23,2022-03-10 19:43:00,2022-03-10 19:57:00,Station-23,4637,4,130,VDL +LINE_9,Station-23,2022-03-10 20:01:00,2022-03-10 20:14:00,Station-23,4637,9,130,VDL +LINE_9,Station-23,2022-03-10 20:23:00,2022-03-10 20:36:00,Station-23,4637,0,130,VDL +LINE_9,Station-23,2022-03-10 20:36:00,2022-03-10 21:15:00,Station-22,19.8,0,130,VDL +LINE_10,Station-0,2022-03-10 04:56:00,2022-03-10 04:56:00,Station-24,0.06,18,131,CKB +LINE_10,Station-24,2022-03-10 05:14:00,2022-03-10 05:20:00,Station-25,3.29,0,131,CKB +LINE_10,Station-25,2022-03-10 05:20:00,2022-03-10 05:24:00,Station-24,2954,20,131,CKB +LINE_10,Station-24,2022-03-10 05:44:00,2022-03-10 05:50:00,Station-25,3.29,0,131,CKB +LINE_10,Station-25,2022-03-10 05:50:00,2022-03-10 05:54:00,Station-24,2954,5,131,CKB +LINE_10,Station-24,2022-03-10 05:59:00,2022-03-10 06:06:00,Station-25,3.29,2,131,CKB +LINE_10,Station-25,2022-03-10 06:08:00,2022-03-10 06:13:00,Station-24,2954,19,131,CKB +LINE_10,Station-24,2022-03-10 06:32:00,2022-03-10 06:39:00,Station-25,3.29,1,131,CKB +LINE_10,Station-25,2022-03-10 06:40:00,2022-03-10 06:45:00,Station-24,2954,7,131,CKB +LINE_10,Station-24,2022-03-10 06:52:00,2022-03-10 06:59:00,Station-25,3.29,1,131,CKB +LINE_10,Station-25,2022-03-10 07:00:00,2022-03-10 07:05:00,Station-24,2954,7,131,CKB +LINE_10,Station-24,2022-03-10 07:12:00,2022-03-10 07:19:00,Station-25,3.29,1,131,CKB +LINE_10,Station-25,2022-03-10 07:20:00,2022-03-10 07:25:00,Station-24,2954,7,131,CKB +LINE_10,Station-24,2022-03-10 07:32:00,2022-03-10 07:39:00,Station-25,3.29,1,131,CKB +LINE_10,Station-25,2022-03-10 07:40:00,2022-03-10 07:45:00,Station-24,2954,295,131,CKB +LINE_10,Station-24,2022-03-10 12:40:00,2022-03-10 12:47:00,Station-25,3.29,2,131,CKB +LINE_10,Station-25,2022-03-10 12:49:00,2022-03-10 12:54:00,Station-24,2954,46,131,CKB +LINE_10,Station-24,2022-03-10 13:40:00,2022-03-10 13:47:00,Station-25,3.29,2,131,CKB +LINE_10,Station-25,2022-03-10 13:49:00,2022-03-10 13:54:00,Station-24,2954,434,131,CKB +LINE_10,Station-24,2022-03-10 21:08:00,2022-03-10 21:08:00,Station-0,0.06,0,131,CKB +LINE_11,Station-0,2022-03-10 07:20:00,2022-03-10 07:20:00,Station-26,0.06,0,132,CKB +LINE_11,Station-26,2022-03-10 07:20:00,2022-03-10 07:50:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 08:00:00,2022-03-10 08:30:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 08:40:00,2022-03-10 09:10:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 09:20:00,2022-03-10 09:50:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 10:00:00,2022-03-10 10:30:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 10:40:00,2022-03-10 11:10:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 11:20:00,2022-03-10 11:50:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 12:00:00,2022-03-10 12:30:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 12:40:00,2022-03-10 13:10:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 13:20:00,2022-03-10 13:50:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 14:00:00,2022-03-10 14:30:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 14:40:00,2022-03-10 15:10:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 15:20:00,2022-03-10 15:50:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 16:00:00,2022-03-10 16:30:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 16:40:00,2022-03-10 17:10:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 17:20:00,2022-03-10 17:50:00,Station-26,9266,10,132,CKB +LINE_11,Station-26,2022-03-10 18:00:00,2022-03-10 18:30:00,Station-26,9266,0,132,CKB +LINE_11,Station-26,2022-03-10 18:30:00,2022-03-10 18:30:00,Station-0,0.06,0,132,CKB +LINE_12,Station-0,2022-03-10 07:10:00,2022-03-10 07:10:00,Station-27,0.06,0,133,CKB +LINE_12,Station-27,2022-03-10 07:10:00,2022-03-10 07:18:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 07:28:00,2022-03-10 07:40:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 07:40:00,2022-03-10 07:48:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 07:58:00,2022-03-10 08:10:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 08:10:00,2022-03-10 08:18:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 08:28:00,2022-03-10 08:40:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 08:40:00,2022-03-10 08:48:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 08:58:00,2022-03-10 09:10:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 09:10:00,2022-03-10 09:18:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 09:28:00,2022-03-10 09:40:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 09:40:00,2022-03-10 09:48:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 09:58:00,2022-03-10 10:10:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 10:10:00,2022-03-10 10:18:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 10:28:00,2022-03-10 10:40:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 10:40:00,2022-03-10 10:48:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 10:58:00,2022-03-10 11:10:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 11:10:00,2022-03-10 11:18:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 11:28:00,2022-03-10 11:40:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 11:40:00,2022-03-10 11:48:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 11:58:00,2022-03-10 12:10:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 12:10:00,2022-03-10 12:18:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 12:28:00,2022-03-10 12:40:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 12:40:00,2022-03-10 12:48:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 12:58:00,2022-03-10 13:10:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 13:10:00,2022-03-10 13:18:00,Station-28,2169,10,133,CKB +LINE_12,Station-28,2022-03-10 13:28:00,2022-03-10 13:40:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 13:40:00,2022-03-10 13:48:00,Station-28,2169,8,133,CKB +LINE_12,Station-28,2022-03-10 13:56:00,2022-03-10 14:10:00,Station-27,2952,0,133,CKB +LINE_12,Station-27,2022-03-10 14:10:00,2022-03-10 14:19:00,Station-28,2169,14,133,CKB +LINE_12,Station-28,2022-03-10 14:33:00,2022-03-10 14:47:00,Station-27,2952,3,133,CKB +LINE_12,Station-27,2022-03-10 14:50:00,2022-03-10 14:59:00,Station-28,2169,14,133,CKB +LINE_12,Station-28,2022-03-10 15:13:00,2022-03-10 15:27:00,Station-27,2952,3,133,CKB +LINE_12,Station-27,2022-03-10 15:30:00,2022-03-10 15:39:00,Station-28,2169,14,133,CKB +LINE_12,Station-28,2022-03-10 15:53:00,2022-03-10 16:07:00,Station-27,2952,3,133,CKB +LINE_12,Station-27,2022-03-10 16:10:00,2022-03-10 16:19:00,Station-28,2169,14,133,CKB +LINE_12,Station-28,2022-03-10 16:33:00,2022-03-10 16:47:00,Station-27,2952,3,133,CKB +LINE_12,Station-27,2022-03-10 16:50:00,2022-03-10 16:59:00,Station-28,2169,14,133,CKB +LINE_12,Station-28,2022-03-10 17:13:00,2022-03-10 17:27:00,Station-27,2952,3,133,CKB +LINE_12,Station-27,2022-03-10 17:30:00,2022-03-10 17:39:00,Station-28,2169,13,133,CKB +LINE_12,Station-28,2022-03-10 17:52:00,2022-03-10 18:05:00,Station-27,2952,5,133,CKB +LINE_12,Station-27,2022-03-10 18:10:00,2022-03-10 18:18:00,Station-28,2169,0,133,CKB +LINE_12,Station-28,2022-03-10 18:18:00,2022-03-10 18:18:00,Station-0,0.06,0,133,CKB +LINE_12,Station-0,2022-03-10 14:13:00,2022-03-10 14:13:00,Station-28,0.06,0,134,CKB +LINE_12,Station-28,2022-03-10 14:13:00,2022-03-10 14:27:00,Station-27,2952,3,134,CKB +LINE_12,Station-27,2022-03-10 14:30:00,2022-03-10 14:39:00,Station-28,2169,14,134,CKB +LINE_12,Station-28,2022-03-10 14:53:00,2022-03-10 15:07:00,Station-27,2952,3,134,CKB +LINE_12,Station-27,2022-03-10 15:10:00,2022-03-10 15:19:00,Station-28,2169,14,134,CKB +LINE_12,Station-28,2022-03-10 15:33:00,2022-03-10 15:47:00,Station-27,2952,3,134,CKB +LINE_12,Station-27,2022-03-10 15:50:00,2022-03-10 15:59:00,Station-28,2169,14,134,CKB +LINE_12,Station-28,2022-03-10 16:13:00,2022-03-10 16:27:00,Station-27,2952,3,134,CKB +LINE_12,Station-27,2022-03-10 16:30:00,2022-03-10 16:39:00,Station-28,2169,14,134,CKB +LINE_12,Station-28,2022-03-10 16:53:00,2022-03-10 17:07:00,Station-27,2952,3,134,CKB +LINE_12,Station-27,2022-03-10 17:10:00,2022-03-10 17:19:00,Station-28,2169,14,134,CKB +LINE_12,Station-28,2022-03-10 17:33:00,2022-03-10 17:47:00,Station-27,2952,3,134,CKB +LINE_12,Station-27,2022-03-10 17:50:00,2022-03-10 17:59:00,Station-28,2169,14,134,CKB +LINE_12,Station-28,2022-03-10 18:13:00,2022-03-10 18:25:00,Station-27,2952,0,134,CKB +LINE_12,Station-27,2022-03-10 18:25:00,2022-03-10 18:25:00,Station-0,0.06,0,134,CKB +LINE_13,Station-0,2022-03-11 00:23:00,2022-03-11 00:23:00,Station-29,0.06,0,135,CKB +LINE_13,Station-29,2022-03-11 00:23:00,2022-03-11 00:30:00,Station-30,2577,9,135,CKB +LINE_14,Station-30,2022-03-11 00:39:00,2022-03-11 00:54:00,Station-31,5937,9,135,CKB +LINE_14,Station-31,2022-03-11 01:03:00,2022-03-11 01:17:00,Station-30,6.19,0,135,CKB +LINE_13,Station-30,2022-03-11 01:17:00,2022-03-11 01:23:00,Station-29,2555,0,135,CKB +LINE_13,Station-29,2022-03-11 01:23:00,2022-03-11 01:30:00,Station-30,2577,9,135,CKB +LINE_14,Station-30,2022-03-11 01:39:00,2022-03-11 01:54:00,Station-31,5937,9,135,CKB +LINE_14,Station-31,2022-03-11 02:03:00,2022-03-11 02:17:00,Station-30,6.19,0,135,CKB +LINE_13,Station-30,2022-03-11 02:17:00,2022-03-11 02:23:00,Station-29,2555,0,135,CKB +LINE_13,Station-29,2022-03-11 02:23:00,2022-03-11 02:30:00,Station-30,2577,9,135,CKB +LINE_14,Station-30,2022-03-11 02:39:00,2022-03-11 02:54:00,Station-31,5937,9,135,CKB +LINE_14,Station-31,2022-03-11 03:03:00,2022-03-11 03:17:00,Station-30,6.19,0,135,CKB +LINE_13,Station-30,2022-03-11 03:17:00,2022-03-11 03:23:00,Station-29,2555,0,135,CKB +LINE_13,Station-29,2022-03-11 03:23:00,2022-03-11 03:30:00,Station-30,2577,9,135,CKB +LINE_14,Station-30,2022-03-11 03:39:00,2022-03-11 03:54:00,Station-31,5937,9,135,CKB +LINE_14,Station-31,2022-03-11 04:03:00,2022-03-11 04:17:00,Station-30,6.19,0,135,CKB +LINE_13,Station-30,2022-03-11 04:17:00,2022-03-11 04:23:00,Station-29,2555,0,135,CKB +LINE_13,Station-29,2022-03-11 04:23:00,2022-03-11 04:23:00,Station-0,0.06,0,135,CKB +LINE_14,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-31,0.06,0,136,CKB +LINE_14,Station-31,2022-03-11 00:33:00,2022-03-11 00:47:00,Station-30,6.19,0,136,CKB +LINE_13,Station-30,2022-03-11 00:47:00,2022-03-11 00:53:00,Station-29,2555,0,136,CKB +LINE_13,Station-29,2022-03-11 00:53:00,2022-03-11 01:00:00,Station-30,2577,9,136,CKB +LINE_14,Station-30,2022-03-11 01:09:00,2022-03-11 01:24:00,Station-31,5937,9,136,CKB +LINE_14,Station-31,2022-03-11 01:33:00,2022-03-11 01:47:00,Station-30,6.19,0,136,CKB +LINE_13,Station-30,2022-03-11 01:47:00,2022-03-11 01:53:00,Station-29,2555,0,136,CKB +LINE_13,Station-29,2022-03-11 01:53:00,2022-03-11 02:00:00,Station-30,2577,9,136,CKB +LINE_14,Station-30,2022-03-11 02:09:00,2022-03-11 02:24:00,Station-31,5937,9,136,CKB +LINE_14,Station-31,2022-03-11 02:33:00,2022-03-11 02:47:00,Station-30,6.19,0,136,CKB +LINE_13,Station-30,2022-03-11 02:47:00,2022-03-11 02:53:00,Station-29,2555,0,136,CKB +LINE_13,Station-29,2022-03-11 02:53:00,2022-03-11 03:00:00,Station-30,2577,9,136,CKB +LINE_14,Station-30,2022-03-11 03:09:00,2022-03-11 03:24:00,Station-31,5937,9,136,CKB +LINE_14,Station-31,2022-03-11 03:33:00,2022-03-11 03:47:00,Station-30,6.19,0,136,CKB +LINE_13,Station-30,2022-03-11 03:47:00,2022-03-11 03:53:00,Station-29,2555,0,136,CKB +LINE_13,Station-29,2022-03-11 03:53:00,2022-03-11 04:00:00,Station-30,2577,9,136,CKB +LINE_14,Station-30,2022-03-11 04:09:00,2022-03-11 04:24:00,Station-31,5937,0,136,CKB +LINE_14,Station-31,2022-03-11 04:24:00,2022-03-11 04:24:00,Station-0,0.06,0,136,CKB +LINE_15,Station-0,2022-03-11 00:57:00,2022-03-11 00:57:00,Station-32,0.06,0,137,CKB +LINE_15,Station-32,2022-03-11 00:57:00,2022-03-11 01:06:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 01:06:00,2022-03-11 01:11:00,Station-32,2936,16,137,CKB +LINE_15,Station-32,2022-03-11 01:27:00,2022-03-11 01:36:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 01:36:00,2022-03-11 01:41:00,Station-32,2936,16,137,CKB +LINE_15,Station-32,2022-03-11 01:57:00,2022-03-11 02:06:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 02:06:00,2022-03-11 02:11:00,Station-32,2936,16,137,CKB +LINE_15,Station-32,2022-03-11 02:27:00,2022-03-11 02:36:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 02:36:00,2022-03-11 02:41:00,Station-32,2936,16,137,CKB +LINE_15,Station-32,2022-03-11 02:57:00,2022-03-11 03:06:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 03:06:00,2022-03-11 03:11:00,Station-32,2936,16,137,CKB +LINE_15,Station-32,2022-03-11 03:27:00,2022-03-11 03:36:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 03:36:00,2022-03-11 03:41:00,Station-32,2936,16,137,CKB +LINE_15,Station-32,2022-03-11 03:57:00,2022-03-11 04:06:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 04:06:00,2022-03-11 04:11:00,Station-32,2936,16,137,CKB +LINE_15,Station-32,2022-03-11 04:27:00,2022-03-11 04:36:00,Station-33,4343,0,137,CKB +LINE_15,Station-33,2022-03-11 04:36:00,2022-03-11 04:36:00,Station-0,0.06,0,137,CKB +LINE_16,Station-0,2022-03-11 00:29:00,2022-03-11 00:29:00,Station-34,0.06,0,138,CKB +LINE_16,Station-34,2022-03-11 00:29:00,2022-03-11 00:41:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 00:47:00,2022-03-11 00:57:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 00:59:00,2022-03-11 01:11:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 01:17:00,2022-03-11 01:27:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 01:29:00,2022-03-11 01:41:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 01:47:00,2022-03-11 01:57:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 01:59:00,2022-03-11 02:11:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 02:17:00,2022-03-11 02:27:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 02:29:00,2022-03-11 02:41:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 02:47:00,2022-03-11 02:57:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 02:59:00,2022-03-11 03:11:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 03:17:00,2022-03-11 03:27:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 03:29:00,2022-03-11 03:41:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 03:47:00,2022-03-11 03:57:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 03:59:00,2022-03-11 04:11:00,Station-35,4481,6,138,CKB +LINE_16,Station-35,2022-03-11 04:17:00,2022-03-11 04:27:00,Station-34,4031,2,138,CKB +LINE_16,Station-34,2022-03-11 04:29:00,2022-03-11 04:41:00,Station-35,4481,0,138,CKB +LINE_16,Station-35,2022-03-11 04:41:00,2022-03-11 04:41:00,Station-0,0.06,0,138,CKB +LINE_17,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-34,0.06,0,139,CKB +LINE_17,Station-34,2022-03-11 00:30:00,2022-03-11 00:44:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 00:44:00,2022-03-11 00:57:00,Station-34,5302,3,139,CKB +LINE_17,Station-34,2022-03-11 01:00:00,2022-03-11 01:14:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 01:14:00,2022-03-11 01:27:00,Station-34,5302,3,139,CKB +LINE_17,Station-34,2022-03-11 01:30:00,2022-03-11 01:44:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 01:44:00,2022-03-11 01:57:00,Station-34,5302,3,139,CKB +LINE_17,Station-34,2022-03-11 02:00:00,2022-03-11 02:14:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 02:14:00,2022-03-11 02:27:00,Station-34,5302,3,139,CKB +LINE_17,Station-34,2022-03-11 02:30:00,2022-03-11 02:44:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 02:44:00,2022-03-11 02:57:00,Station-34,5302,3,139,CKB +LINE_17,Station-34,2022-03-11 03:00:00,2022-03-11 03:14:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 03:14:00,2022-03-11 03:27:00,Station-34,5302,3,139,CKB +LINE_17,Station-34,2022-03-11 03:30:00,2022-03-11 03:44:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 03:44:00,2022-03-11 03:57:00,Station-34,5302,3,139,CKB +LINE_17,Station-34,2022-03-11 04:00:00,2022-03-11 04:14:00,Station-36,4801,0,139,CKB +LINE_17,Station-36,2022-03-11 04:14:00,2022-03-11 04:27:00,Station-34,5302,0,139,CKB +LINE_17,Station-34,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,139,CKB +LINE_18,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-37,0.06,0,140,CKB +LINE_18,Station-37,2022-03-11 00:43:00,2022-03-11 01:33:00,Station-37,20434,10,140,CKB +LINE_18,Station-37,2022-03-11 01:43:00,2022-03-11 02:33:00,Station-37,20434,10,140,CKB +LINE_18,Station-37,2022-03-11 02:43:00,2022-03-11 03:33:00,Station-37,20434,10,140,CKB +LINE_18,Station-37,2022-03-11 03:43:00,2022-03-11 04:33:00,Station-37,20434,0,140,CKB +LINE_18,Station-37,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,140,CKB +LINE_18,Station-0,2022-03-11 00:13:00,2022-03-11 00:13:00,Station-37,0.06,0,141,CKB +LINE_18,Station-37,2022-03-11 00:13:00,2022-03-11 01:03:00,Station-37,20434,10,141,CKB +LINE_18,Station-37,2022-03-11 01:13:00,2022-03-11 02:03:00,Station-37,20434,10,141,CKB +LINE_18,Station-37,2022-03-11 02:13:00,2022-03-11 03:03:00,Station-37,20434,10,141,CKB +LINE_18,Station-37,2022-03-11 03:13:00,2022-03-11 04:03:00,Station-37,20434,0,141,CKB +LINE_18,Station-37,2022-03-11 04:03:00,2022-03-11 04:03:00,Station-0,0.06,0,141,CKB +LINE_19,Station-0,2022-03-11 00:24:00,2022-03-11 00:24:00,Station-38,0.06,0,142,CKB +LINE_19,Station-38,2022-03-11 00:24:00,2022-03-11 00:48:00,Station-39,11.86,4,142,CKB +LINE_19,Station-39,2022-03-11 00:52:00,2022-03-11 01:14:00,Station-38,11139,10,142,CKB +LINE_19,Station-38,2022-03-11 01:24:00,2022-03-11 01:48:00,Station-39,11.86,4,142,CKB +LINE_19,Station-39,2022-03-11 01:52:00,2022-03-11 02:14:00,Station-38,11139,10,142,CKB +LINE_19,Station-38,2022-03-11 02:24:00,2022-03-11 02:48:00,Station-39,11.86,4,142,CKB +LINE_19,Station-39,2022-03-11 02:52:00,2022-03-11 03:14:00,Station-38,11139,10,142,CKB +LINE_19,Station-38,2022-03-11 03:24:00,2022-03-11 03:48:00,Station-39,11.86,4,142,CKB +LINE_19,Station-39,2022-03-11 03:52:00,2022-03-11 04:14:00,Station-38,11139,0,142,CKB +LINE_19,Station-38,2022-03-11 04:14:00,2022-03-11 04:14:00,Station-0,0.06,0,142,CKB +LINE_19,Station-0,2022-03-11 00:22:00,2022-03-11 00:22:00,Station-39,0.06,0,143,CKB +LINE_19,Station-39,2022-03-11 00:22:00,2022-03-11 00:44:00,Station-38,11139,10,143,CKB +LINE_19,Station-38,2022-03-11 00:54:00,2022-03-11 01:18:00,Station-39,11.86,4,143,CKB +LINE_19,Station-39,2022-03-11 01:22:00,2022-03-11 01:44:00,Station-38,11139,10,143,CKB +LINE_19,Station-38,2022-03-11 01:54:00,2022-03-11 02:18:00,Station-39,11.86,4,143,CKB +LINE_19,Station-39,2022-03-11 02:22:00,2022-03-11 02:44:00,Station-38,11139,10,143,CKB +LINE_19,Station-38,2022-03-11 02:54:00,2022-03-11 03:18:00,Station-39,11.86,4,143,CKB +LINE_19,Station-39,2022-03-11 03:22:00,2022-03-11 03:44:00,Station-38,11139,10,143,CKB +LINE_19,Station-38,2022-03-11 03:54:00,2022-03-11 04:18:00,Station-39,11.86,4,143,CKB +LINE_19,Station-39,2022-03-11 04:22:00,2022-03-11 04:44:00,Station-38,11139,0,143,CKB +LINE_19,Station-38,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,143,CKB +LINE_20,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,144,CKB +LINE_20,Station-13,2022-03-11 00:32:00,2022-03-11 00:44:00,Station-40,4212,3,144,CKB +LINE_20,Station-40,2022-03-11 00:47:00,2022-03-11 01:16:00,Station-41,13048,0,144,CKB +LINE_20,Station-41,2022-03-11 01:16:00,2022-03-11 01:42:00,Station-40,12869,5,144,CKB +LINE_20,Station-40,2022-03-11 01:47:00,2022-03-11 02:16:00,Station-41,13048,0,144,CKB +LINE_20,Station-41,2022-03-11 02:16:00,2022-03-11 02:42:00,Station-40,12869,5,144,CKB +LINE_20,Station-40,2022-03-11 02:47:00,2022-03-11 03:16:00,Station-41,13048,0,144,CKB +LINE_20,Station-41,2022-03-11 03:16:00,2022-03-11 03:42:00,Station-40,12869,5,144,CKB +LINE_20,Station-40,2022-03-11 03:47:00,2022-03-11 04:16:00,Station-41,13048,0,144,CKB +LINE_20,Station-41,2022-03-11 04:16:00,2022-03-11 04:34:00,Station-42,9538,0,144,CKB +LINE_20,Station-42,2022-03-11 04:34:00,2022-03-11 04:34:00,Station-0,0.06,0,144,CKB +LINE_20,Station-0,2022-03-11 00:17:00,2022-03-11 00:17:00,Station-40,0.06,0,145,CKB +LINE_20,Station-40,2022-03-11 00:17:00,2022-03-11 00:46:00,Station-41,13048,0,145,CKB +LINE_20,Station-41,2022-03-11 00:46:00,2022-03-11 01:12:00,Station-40,12869,5,145,CKB +LINE_20,Station-40,2022-03-11 01:17:00,2022-03-11 01:46:00,Station-41,13048,0,145,CKB +LINE_20,Station-41,2022-03-11 01:46:00,2022-03-11 02:12:00,Station-40,12869,5,145,CKB +LINE_20,Station-40,2022-03-11 02:17:00,2022-03-11 02:46:00,Station-41,13048,0,145,CKB +LINE_20,Station-41,2022-03-11 02:46:00,2022-03-11 03:12:00,Station-40,12869,5,145,CKB +LINE_20,Station-40,2022-03-11 03:17:00,2022-03-11 03:46:00,Station-41,13048,0,145,CKB +LINE_20,Station-41,2022-03-11 03:46:00,2022-03-11 04:12:00,Station-40,12869,5,145,CKB +LINE_20,Station-40,2022-03-11 04:17:00,2022-03-11 04:28:00,Station-13,4316,0,145,CKB +LINE_20,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,145,CKB +LINE_21,Station-0,2022-03-11 00:49:00,2022-03-11 00:49:00,Station-3,0.06,0,146,CKB +LINE_21,Station-3,2022-03-11 00:49:00,2022-03-11 01:04:00,Station-16,10229,0,146,CKB +LINE_21,Station-16,2022-03-11 01:04:00,2022-03-11 01:19:00,Station-3,11801,0,146,CKB +LINE_21,Station-3,2022-03-11 01:19:00,2022-03-11 01:34:00,Station-16,10229,0,146,CKB +LINE_21,Station-16,2022-03-11 01:34:00,2022-03-11 01:49:00,Station-3,11801,0,146,CKB +LINE_21,Station-3,2022-03-11 01:49:00,2022-03-11 02:04:00,Station-16,10229,0,146,CKB +LINE_21,Station-16,2022-03-11 02:04:00,2022-03-11 02:19:00,Station-3,11801,0,146,CKB +LINE_21,Station-3,2022-03-11 02:19:00,2022-03-11 02:34:00,Station-16,10229,0,146,CKB +LINE_21,Station-16,2022-03-11 02:34:00,2022-03-11 02:49:00,Station-3,11801,0,146,CKB +LINE_21,Station-3,2022-03-11 02:49:00,2022-03-11 03:04:00,Station-16,10229,0,146,CKB +LINE_21,Station-16,2022-03-11 03:04:00,2022-03-11 03:19:00,Station-3,11801,0,146,CKB +LINE_21,Station-3,2022-03-11 03:19:00,2022-03-11 03:34:00,Station-16,10229,0,146,CKB +LINE_21,Station-16,2022-03-11 03:34:00,2022-03-11 03:49:00,Station-3,11801,0,146,CKB +LINE_21,Station-3,2022-03-11 03:49:00,2022-03-11 04:04:00,Station-16,10229,0,146,CKB +LINE_21,Station-16,2022-03-11 04:04:00,2022-03-11 04:19:00,Station-3,11801,23,146,CKB +LINE_22,Station-3,2022-03-11 04:42:00,2022-03-11 05:04:00,Station-43,6.81,0,146,CKB +LINE_22,Station-43,2022-03-11 05:04:00,2022-03-11 05:04:00,Station-0,0.06,0,146,CKB +LINE_8,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,147,CKB +LINE_8,Station-13,2022-03-11 00:32:00,2022-03-11 00:57:00,Station-21,11545,6,147,CKB +LINE_8,Station-21,2022-03-11 01:03:00,2022-03-11 01:46:00,Station-20,20579,1,147,CKB +LINE_8,Station-20,2022-03-11 01:47:00,2022-03-11 02:25:00,Station-21,20641,8,147,CKB +LINE_8,Station-21,2022-03-11 02:33:00,2022-03-11 03:16:00,Station-20,20579,1,147,CKB +LINE_8,Station-20,2022-03-11 03:17:00,2022-03-11 03:55:00,Station-21,20641,8,147,CKB +LINE_8,Station-21,2022-03-11 04:03:00,2022-03-11 04:28:00,Station-13,11499,0,147,CKB +LINE_8,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,147,CKB +LINE_8,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-21,0.06,0,148,CKB +LINE_8,Station-21,2022-03-11 00:33:00,2022-03-11 01:16:00,Station-20,20579,1,148,CKB +LINE_8,Station-20,2022-03-11 01:17:00,2022-03-11 01:55:00,Station-21,20641,8,148,CKB +LINE_8,Station-21,2022-03-11 02:03:00,2022-03-11 02:46:00,Station-20,20579,1,148,CKB +LINE_8,Station-20,2022-03-11 02:47:00,2022-03-11 03:25:00,Station-21,20641,8,148,CKB +LINE_8,Station-21,2022-03-11 03:33:00,2022-03-11 04:16:00,Station-20,20579,1,148,CKB +LINE_8,Station-20,2022-03-11 04:17:00,2022-03-11 04:51:00,Station-44,18752,0,148,CKB +LINE_8,Station-44,2022-03-11 04:51:00,2022-03-11 04:51:00,Station-0,0.06,0,148,CKB +LINE_23,Station-0,2022-03-11 00:34:00,2022-03-11 00:34:00,Station-45,0.06,0,149,CKB +LINE_23,Station-45,2022-03-11 00:34:00,2022-03-11 01:00:00,Station-46,9016,0,149,CKB +LINE_23,Station-46,2022-03-11 01:00:00,2022-03-11 01:27:00,Station-45,10083,7,149,CKB +LINE_23,Station-45,2022-03-11 01:34:00,2022-03-11 02:00:00,Station-46,9016,0,149,CKB +LINE_23,Station-46,2022-03-11 02:00:00,2022-03-11 02:27:00,Station-45,10083,7,149,CKB +LINE_23,Station-45,2022-03-11 02:34:00,2022-03-11 03:00:00,Station-46,9016,0,149,CKB +LINE_23,Station-46,2022-03-11 03:00:00,2022-03-11 03:27:00,Station-45,10083,7,149,CKB +LINE_23,Station-45,2022-03-11 03:34:00,2022-03-11 04:00:00,Station-46,9016,0,149,CKB +LINE_23,Station-46,2022-03-11 04:00:00,2022-03-11 04:27:00,Station-45,10083,0,149,CKB +LINE_23,Station-45,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,149,CKB +LINE_23,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-46,0.06,0,150,CKB +LINE_23,Station-46,2022-03-11 00:30:00,2022-03-11 00:57:00,Station-45,10083,7,150,CKB +LINE_23,Station-45,2022-03-11 01:04:00,2022-03-11 01:30:00,Station-46,9016,0,150,CKB +LINE_23,Station-46,2022-03-11 01:30:00,2022-03-11 01:57:00,Station-45,10083,7,150,CKB +LINE_23,Station-45,2022-03-11 02:04:00,2022-03-11 02:30:00,Station-46,9016,0,150,CKB +LINE_23,Station-46,2022-03-11 02:30:00,2022-03-11 02:57:00,Station-45,10083,7,150,CKB +LINE_23,Station-45,2022-03-11 03:04:00,2022-03-11 03:30:00,Station-46,9016,0,150,CKB +LINE_23,Station-46,2022-03-11 03:30:00,2022-03-11 03:57:00,Station-45,10083,7,150,CKB +LINE_23,Station-45,2022-03-11 04:04:00,2022-03-11 04:30:00,Station-46,9016,0,150,CKB +LINE_23,Station-46,2022-03-11 04:30:00,2022-03-11 04:57:00,Station-45,10083,0,150,CKB +LINE_23,Station-45,2022-03-11 04:57:00,2022-03-11 04:57:00,Station-0,0.06,0,150,CKB +LINE_24,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,151,CKB +LINE_24,Station-21,2022-03-11 00:31:00,2022-03-11 00:44:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 00:44:00,2022-03-11 00:56:00,Station-21,5362,5,151,CKB +LINE_24,Station-21,2022-03-11 01:01:00,2022-03-11 01:14:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 01:14:00,2022-03-11 01:26:00,Station-21,5362,5,151,CKB +LINE_24,Station-21,2022-03-11 01:31:00,2022-03-11 01:44:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 01:44:00,2022-03-11 01:56:00,Station-21,5362,5,151,CKB +LINE_24,Station-21,2022-03-11 02:01:00,2022-03-11 02:14:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 02:14:00,2022-03-11 02:26:00,Station-21,5362,5,151,CKB +LINE_24,Station-21,2022-03-11 02:31:00,2022-03-11 02:44:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 02:44:00,2022-03-11 02:56:00,Station-21,5362,5,151,CKB +LINE_24,Station-21,2022-03-11 03:01:00,2022-03-11 03:14:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 03:14:00,2022-03-11 03:26:00,Station-21,5362,5,151,CKB +LINE_24,Station-21,2022-03-11 03:31:00,2022-03-11 03:44:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 03:44:00,2022-03-11 03:56:00,Station-21,5362,5,151,CKB +LINE_24,Station-21,2022-03-11 04:01:00,2022-03-11 04:14:00,Station-47,4872,0,151,CKB +LINE_24,Station-47,2022-03-11 04:14:00,2022-03-11 04:26:00,Station-21,5362,0,151,CKB +LINE_24,Station-21,2022-03-11 04:26:00,2022-03-11 04:26:00,Station-0,0.06,0,151,CKB +LINE_25,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,152,CKB +LINE_25,Station-21,2022-03-11 00:31:00,2022-03-11 00:45:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 00:47:00,2022-03-11 01:01:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 01:01:00,2022-03-11 01:15:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 01:17:00,2022-03-11 01:31:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 01:31:00,2022-03-11 01:45:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 01:47:00,2022-03-11 02:01:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 02:01:00,2022-03-11 02:15:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 02:17:00,2022-03-11 02:31:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 02:31:00,2022-03-11 02:45:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 02:47:00,2022-03-11 03:01:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 03:01:00,2022-03-11 03:15:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 03:17:00,2022-03-11 03:31:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 03:31:00,2022-03-11 03:45:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 03:47:00,2022-03-11 04:01:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 04:01:00,2022-03-11 04:15:00,Station-48,5225,2,152,CKB +LINE_25,Station-48,2022-03-11 04:17:00,2022-03-11 04:31:00,Station-21,7617,0,152,CKB +LINE_25,Station-21,2022-03-11 04:31:00,2022-03-11 04:31:00,Station-0,0.06,0,152,CKB +LINE_26,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-49,0.06,0,153,CKB +LINE_26,Station-49,2022-03-11 00:43:00,2022-03-11 00:53:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 00:53:00,2022-03-11 01:03:00,Station-49,4408,10,153,CKB +LINE_26,Station-49,2022-03-11 01:13:00,2022-03-11 01:23:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 01:23:00,2022-03-11 01:33:00,Station-49,4408,10,153,CKB +LINE_26,Station-49,2022-03-11 01:43:00,2022-03-11 01:53:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 01:53:00,2022-03-11 02:03:00,Station-49,4408,10,153,CKB +LINE_26,Station-49,2022-03-11 02:13:00,2022-03-11 02:23:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 02:23:00,2022-03-11 02:33:00,Station-49,4408,10,153,CKB +LINE_26,Station-49,2022-03-11 02:43:00,2022-03-11 02:53:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 02:53:00,2022-03-11 03:03:00,Station-49,4408,10,153,CKB +LINE_26,Station-49,2022-03-11 03:13:00,2022-03-11 03:23:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 03:23:00,2022-03-11 03:33:00,Station-49,4408,10,153,CKB +LINE_26,Station-49,2022-03-11 03:43:00,2022-03-11 03:53:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 03:53:00,2022-03-11 04:03:00,Station-49,4408,10,153,CKB +LINE_26,Station-49,2022-03-11 04:13:00,2022-03-11 04:23:00,Station-50,4507,0,153,CKB +LINE_26,Station-50,2022-03-11 04:23:00,2022-03-11 04:33:00,Station-49,4408,0,153,CKB +LINE_26,Station-49,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,153,CKB +LINE_0,Station-0,2022-03-11 21:31:00,2022-03-11 21:31:00,Station-1,0.06,0,154,CKB +LINE_0,Station-1,2022-03-11 21:31:00,2022-03-11 22:04:00,Station-2,14519,4,154,CKB +LINE_0,Station-2,2022-03-11 22:08:00,2022-03-11 22:43:00,Station-1,13541,8,154,CKB +LINE_0,Station-1,2022-03-11 22:51:00,2022-03-11 23:24:00,Station-2,14519,4,154,CKB +LINE_0,Station-2,2022-03-11 23:28:00,2022-03-12 00:03:00,Station-1,13541,8,154,CKB +LINE_0,Station-1,2022-03-12 00:11:00,2022-03-12 00:44:00,Station-2,14519,0,154,CKB +LINE_1,Station-2,2022-03-12 00:44:00,2022-03-12 00:54:00,Station-3,4.1,25,154,CKB +LINE_1,Station-3,2022-03-12 01:19:00,2022-03-12 01:42:00,Station-4,8.36,6,154,CKB +LINE_1,Station-4,2022-03-12 01:48:00,2022-03-12 02:06:00,Station-3,9067,13,154,CKB +LINE_1,Station-3,2022-03-12 02:19:00,2022-03-12 02:42:00,Station-4,8.36,6,154,CKB +LINE_1,Station-4,2022-03-12 02:48:00,2022-03-12 03:06:00,Station-3,9067,13,154,CKB +LINE_1,Station-3,2022-03-12 03:19:00,2022-03-12 03:42:00,Station-4,8.36,6,154,CKB +LINE_1,Station-4,2022-03-12 03:48:00,2022-03-12 04:06:00,Station-3,9067,13,154,CKB +LINE_1,Station-3,2022-03-12 04:19:00,2022-03-12 04:42:00,Station-4,8.36,6,154,CKB +LINE_1,Station-4,2022-03-12 04:48:00,2022-03-12 05:06:00,Station-3,9067,13,154,CKB +LINE_1,Station-3,2022-03-12 05:19:00,2022-03-12 05:42:00,Station-4,8.36,16,154,CKB +LINE_22,Station-4,2022-03-12 05:58:00,2022-03-12 06:34:00,Station-43,12968,0,154,CKB +LINE_22,Station-43,2022-03-12 06:34:00,2022-03-12 06:34:00,Station-0,0.06,0,154,CKB +LINE_0,Station-0,2022-03-11 22:11:00,2022-03-11 22:11:00,Station-1,0.06,0,155,CKB +LINE_0,Station-1,2022-03-11 22:11:00,2022-03-11 22:44:00,Station-2,14519,4,155,CKB +LINE_0,Station-2,2022-03-11 22:48:00,2022-03-11 23:23:00,Station-1,13541,8,155,CKB +LINE_0,Station-1,2022-03-11 23:31:00,2022-03-12 00:04:00,Station-2,14519,4,155,CKB +LINE_0,Station-2,2022-03-12 00:08:00,2022-03-12 00:39:00,Station-5,12213,0,155,CKB +LINE_1,Station-5,2022-03-12 00:39:00,2022-03-12 00:47:00,Station-3,4.0,2,155,CKB +LINE_1,Station-3,2022-03-12 00:49:00,2022-03-12 01:12:00,Station-4,8.36,6,155,CKB +LINE_1,Station-4,2022-03-12 01:18:00,2022-03-12 01:36:00,Station-3,9067,13,155,CKB +LINE_1,Station-3,2022-03-12 01:49:00,2022-03-12 02:12:00,Station-4,8.36,6,155,CKB +LINE_1,Station-4,2022-03-12 02:18:00,2022-03-12 02:36:00,Station-3,9067,13,155,CKB +LINE_1,Station-3,2022-03-12 02:49:00,2022-03-12 03:12:00,Station-4,8.36,6,155,CKB +LINE_1,Station-4,2022-03-12 03:18:00,2022-03-12 03:36:00,Station-3,9067,13,155,CKB +LINE_1,Station-3,2022-03-12 03:49:00,2022-03-12 04:12:00,Station-4,8.36,6,155,CKB +LINE_1,Station-4,2022-03-12 04:18:00,2022-03-12 04:36:00,Station-3,9067,13,155,CKB +LINE_1,Station-3,2022-03-12 04:49:00,2022-03-12 05:12:00,Station-4,8.36,6,155,CKB +LINE_1,Station-4,2022-03-12 05:18:00,2022-03-12 05:36:00,Station-3,9067,0,155,CKB +LINE_1,Station-3,2022-03-12 05:36:00,2022-03-12 05:36:00,Station-0,0.06,0,155,CKB +LINE_2,Station-0,2022-03-11 21:06:00,2022-03-11 21:06:00,Station-6,0.06,0,156,CKB +LINE_2,Station-6,2022-03-11 21:06:00,2022-03-11 21:34:00,Station-7,13018,19,156,CKB +LINE_2,Station-7,2022-03-11 21:53:00,2022-03-11 22:13:00,Station-8,10332,17,156,CKB +LINE_2,Station-8,2022-03-11 22:30:00,2022-03-11 22:54:00,Station-7,10.48,19,156,CKB +LINE_2,Station-7,2022-03-11 23:13:00,2022-03-11 23:33:00,Station-8,10332,17,156,CKB +LINE_2,Station-8,2022-03-11 23:50:00,2022-03-12 00:14:00,Station-7,10.48,8,156,CKB +LINE_2,Station-7,2022-03-12 00:22:00,2022-03-12 00:27:00,Station-58,2533,2,156,CKB +LINE_3,Station-58,2022-03-12 00:29:00,2022-03-12 00:47:00,Station-10,7.58,0,156,CKB +LINE_3,Station-10,2022-03-12 00:47:00,2022-03-12 01:14:00,Station-11,12841,3,156,CKB +LINE_3,Station-11,2022-03-12 01:17:00,2022-03-12 01:47:00,Station-10,14281,0,156,CKB +LINE_3,Station-10,2022-03-12 01:47:00,2022-03-12 02:14:00,Station-11,12841,3,156,CKB +LINE_3,Station-11,2022-03-12 02:17:00,2022-03-12 02:47:00,Station-10,14281,0,156,CKB +LINE_3,Station-10,2022-03-12 02:47:00,2022-03-12 03:14:00,Station-11,12841,3,156,CKB +LINE_3,Station-11,2022-03-12 03:17:00,2022-03-12 03:47:00,Station-10,14281,0,156,CKB +LINE_3,Station-10,2022-03-12 03:47:00,2022-03-12 04:14:00,Station-11,12841,3,156,CKB +LINE_3,Station-11,2022-03-12 04:17:00,2022-03-12 04:47:00,Station-10,14281,0,156,CKB +LINE_3,Station-10,2022-03-12 04:47:00,2022-03-12 05:14:00,Station-11,12841,3,156,CKB +LINE_3,Station-11,2022-03-12 05:17:00,2022-03-12 05:47:00,Station-10,14281,0,156,CKB +LINE_3,Station-10,2022-03-12 05:47:00,2022-03-12 05:47:00,Station-0,0.06,0,156,CKB +LINE_2,Station-0,2022-03-11 20:26:00,2022-03-11 20:26:00,Station-6,0.06,0,157,CKB +LINE_2,Station-6,2022-03-11 20:26:00,2022-03-11 20:56:00,Station-12,14097,14,157,CKB +LINE_2,Station-12,2022-03-11 21:10:00,2022-03-11 21:38:00,Station-6,13.19,8,157,CKB +LINE_2,Station-6,2022-03-11 21:46:00,2022-03-11 22:14:00,Station-7,13018,19,157,CKB +LINE_2,Station-7,2022-03-11 22:33:00,2022-03-11 22:53:00,Station-8,10332,17,157,CKB +LINE_2,Station-8,2022-03-11 23:10:00,2022-03-11 23:34:00,Station-7,10.48,19,157,CKB +LINE_2,Station-7,2022-03-11 23:53:00,2022-03-12 00:13:00,Station-8,10332,2,157,CKB +LINE_2,Station-8,2022-03-12 00:15:00,2022-03-12 00:16:00,Station-10,506,1,157,CKB +LINE_3,Station-10,2022-03-12 00:17:00,2022-03-12 00:44:00,Station-11,12841,3,157,CKB +LINE_3,Station-11,2022-03-12 00:47:00,2022-03-12 01:17:00,Station-10,14281,0,157,CKB +LINE_3,Station-10,2022-03-12 01:17:00,2022-03-12 01:44:00,Station-11,12841,3,157,CKB +LINE_3,Station-11,2022-03-12 01:47:00,2022-03-12 02:17:00,Station-10,14281,0,157,CKB +LINE_3,Station-10,2022-03-12 02:17:00,2022-03-12 02:44:00,Station-11,12841,3,157,CKB +LINE_3,Station-11,2022-03-12 02:47:00,2022-03-12 03:17:00,Station-10,14281,0,157,CKB +LINE_3,Station-10,2022-03-12 03:17:00,2022-03-12 03:44:00,Station-11,12841,3,157,CKB +LINE_3,Station-11,2022-03-12 03:47:00,2022-03-12 04:17:00,Station-10,14281,0,157,CKB +LINE_3,Station-10,2022-03-12 04:17:00,2022-03-12 04:44:00,Station-11,12841,3,157,CKB +LINE_3,Station-11,2022-03-12 04:47:00,2022-03-12 05:17:00,Station-10,14281,0,157,CKB +LINE_3,Station-10,2022-03-12 05:17:00,2022-03-12 05:29:00,Station-58,5474,0,157,CKB +LINE_3,Station-58,2022-03-12 05:29:00,2022-03-12 05:29:00,Station-0,0.06,0,157,CKB +LINE_5,Station-0,2022-03-11 22:56:00,2022-03-11 22:56:00,Station-14,0.06,0,158,CKB +LINE_5,Station-14,2022-03-11 22:56:00,2022-03-11 23:08:00,Station-15,5882,3,158,CKB +LINE_5,Station-15,2022-03-11 23:11:00,2022-03-11 23:25:00,Station-14,6232,0,158,CKB +LINE_5,Station-14,2022-03-11 23:25:00,2022-03-11 23:38:00,Station-15,6086,3,158,CKB +LINE_5,Station-15,2022-03-11 23:41:00,2022-03-11 23:55:00,Station-14,6232,0,158,CKB +LINE_5,Station-14,2022-03-11 23:55:00,2022-03-12 00:08:00,Station-15,6086,0,158,CKB +LINE_5,Station-15,2022-03-12 00:08:00,2022-03-12 00:08:00,Station-0,0.06,0,158,CKB +LINE_6,Station-0,2022-03-11 05:05:00,2022-03-11 05:05:00,Station-16,0.06,0,159,CKB +LINE_6,Station-16,2022-03-11 05:05:00,2022-03-11 05:14:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 05:14:00,2022-03-11 05:23:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 05:25:00,2022-03-11 05:34:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 05:34:00,2022-03-11 05:43:00,Station-16,5139,23,159,CKB +LINE_6,Station-16,2022-03-11 06:06:00,2022-03-11 06:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 06:15:00,2022-03-11 06:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 06:26:00,2022-03-11 06:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 06:35:00,2022-03-11 06:44:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 06:46:00,2022-03-11 06:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 06:55:00,2022-03-11 07:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 07:06:00,2022-03-11 07:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 07:15:00,2022-03-11 07:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 07:26:00,2022-03-11 07:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 07:35:00,2022-03-11 07:44:00,Station-16,5139,22,159,CKB +LINE_6,Station-16,2022-03-11 08:06:00,2022-03-11 08:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 08:15:00,2022-03-11 08:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 08:26:00,2022-03-11 08:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 08:35:00,2022-03-11 08:44:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 08:46:00,2022-03-11 08:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 08:55:00,2022-03-11 09:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 09:06:00,2022-03-11 09:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 09:15:00,2022-03-11 09:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 09:26:00,2022-03-11 09:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 09:35:00,2022-03-11 09:44:00,Station-16,5139,22,159,CKB +LINE_6,Station-16,2022-03-11 10:06:00,2022-03-11 10:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 10:15:00,2022-03-11 10:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 10:26:00,2022-03-11 10:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 10:35:00,2022-03-11 10:44:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 10:46:00,2022-03-11 10:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 10:55:00,2022-03-11 11:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 11:06:00,2022-03-11 11:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 11:15:00,2022-03-11 11:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 11:26:00,2022-03-11 11:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 11:35:00,2022-03-11 11:44:00,Station-16,5139,22,159,CKB +LINE_6,Station-16,2022-03-11 12:06:00,2022-03-11 12:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 12:15:00,2022-03-11 12:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 12:26:00,2022-03-11 12:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 12:35:00,2022-03-11 12:44:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 12:46:00,2022-03-11 12:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 12:55:00,2022-03-11 13:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 13:06:00,2022-03-11 13:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 13:15:00,2022-03-11 13:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 13:26:00,2022-03-11 13:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 13:35:00,2022-03-11 13:44:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 13:46:00,2022-03-11 13:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 13:55:00,2022-03-11 14:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 14:06:00,2022-03-11 14:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 14:15:00,2022-03-11 14:24:00,Station-16,5139,22,159,CKB +LINE_6,Station-16,2022-03-11 14:46:00,2022-03-11 14:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 14:55:00,2022-03-11 15:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 15:06:00,2022-03-11 15:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 15:15:00,2022-03-11 15:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 15:26:00,2022-03-11 15:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 15:35:00,2022-03-11 15:44:00,Station-16,5139,22,159,CKB +LINE_6,Station-16,2022-03-11 16:06:00,2022-03-11 16:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 16:15:00,2022-03-11 16:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 16:26:00,2022-03-11 16:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 16:35:00,2022-03-11 16:44:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 16:46:00,2022-03-11 16:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 16:55:00,2022-03-11 17:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 17:06:00,2022-03-11 17:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 17:15:00,2022-03-11 17:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 17:26:00,2022-03-11 17:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 17:35:00,2022-03-11 17:44:00,Station-16,5139,22,159,CKB +LINE_6,Station-16,2022-03-11 18:06:00,2022-03-11 18:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 18:15:00,2022-03-11 18:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 18:26:00,2022-03-11 18:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 18:35:00,2022-03-11 18:44:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 18:46:00,2022-03-11 18:55:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 18:55:00,2022-03-11 19:04:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 19:06:00,2022-03-11 19:15:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 19:15:00,2022-03-11 19:24:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 19:26:00,2022-03-11 19:35:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 19:35:00,2022-03-11 19:44:00,Station-16,5139,21,159,CKB +LINE_6,Station-16,2022-03-11 20:05:00,2022-03-11 20:14:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 20:14:00,2022-03-11 20:23:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 20:25:00,2022-03-11 20:34:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 20:34:00,2022-03-11 20:43:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 20:45:00,2022-03-11 20:54:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 20:54:00,2022-03-11 21:03:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 21:05:00,2022-03-11 21:14:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 21:14:00,2022-03-11 21:23:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 21:25:00,2022-03-11 21:34:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 21:34:00,2022-03-11 21:43:00,Station-16,5139,22,159,CKB +LINE_6,Station-16,2022-03-11 22:05:00,2022-03-11 22:14:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 22:14:00,2022-03-11 22:23:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 22:25:00,2022-03-11 22:34:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 22:34:00,2022-03-11 22:43:00,Station-16,5139,2,159,CKB +LINE_6,Station-16,2022-03-11 22:45:00,2022-03-11 22:54:00,Station-17,4781,0,159,CKB +LINE_6,Station-17,2022-03-11 22:54:00,2022-03-11 23:03:00,Station-16,5139,0,159,CKB +LINE_6,Station-16,2022-03-11 23:03:00,2022-03-11 23:03:00,Station-0,0.06,0,159,CKB +LINE_9,Station-22,2022-03-11 05:15:00,2022-03-11 06:01:00,Station-23,17.9,0,160,VDL +LINE_9,Station-23,2022-03-11 06:01:00,2022-03-11 06:15:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 06:23:00,2022-03-11 06:37:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 06:41:00,2022-03-11 06:55:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 07:03:00,2022-03-11 07:17:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 07:21:00,2022-03-11 07:35:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 07:43:00,2022-03-11 07:57:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 08:01:00,2022-03-11 08:15:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 08:23:00,2022-03-11 08:37:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 08:41:00,2022-03-11 08:55:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 09:03:00,2022-03-11 09:17:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 09:21:00,2022-03-11 09:35:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 09:43:00,2022-03-11 09:57:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 10:01:00,2022-03-11 10:15:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 10:23:00,2022-03-11 10:37:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 10:41:00,2022-03-11 10:55:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 11:03:00,2022-03-11 11:17:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 11:21:00,2022-03-11 11:35:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 11:43:00,2022-03-11 11:57:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 12:01:00,2022-03-11 12:15:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 12:23:00,2022-03-11 12:37:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 12:41:00,2022-03-11 12:55:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 13:03:00,2022-03-11 13:17:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 13:21:00,2022-03-11 13:35:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 13:43:00,2022-03-11 13:57:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 14:01:00,2022-03-11 14:15:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 14:23:00,2022-03-11 14:37:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 14:41:00,2022-03-11 14:55:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 15:03:00,2022-03-11 15:17:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 15:21:00,2022-03-11 15:35:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 15:43:00,2022-03-11 15:57:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 16:01:00,2022-03-11 16:15:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 16:23:00,2022-03-11 16:37:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 16:41:00,2022-03-11 16:55:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 17:03:00,2022-03-11 17:17:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 17:21:00,2022-03-11 17:35:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 17:43:00,2022-03-11 17:57:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 18:01:00,2022-03-11 18:15:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 18:23:00,2022-03-11 18:37:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 18:41:00,2022-03-11 18:55:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 19:03:00,2022-03-11 19:17:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 19:21:00,2022-03-11 19:35:00,Station-23,4637,8,160,VDL +LINE_9,Station-23,2022-03-11 19:43:00,2022-03-11 19:57:00,Station-23,4637,4,160,VDL +LINE_9,Station-23,2022-03-11 20:01:00,2022-03-11 20:14:00,Station-23,4637,9,160,VDL +LINE_9,Station-23,2022-03-11 20:23:00,2022-03-11 20:36:00,Station-23,4637,0,160,VDL +LINE_9,Station-23,2022-03-11 20:36:00,2022-03-11 21:15:00,Station-22,19.8,0,160,VDL +LINE_10,Station-0,2022-03-11 04:56:00,2022-03-11 04:56:00,Station-24,0.06,18,161,CKB +LINE_10,Station-24,2022-03-11 05:14:00,2022-03-11 05:20:00,Station-25,3.29,0,161,CKB +LINE_10,Station-25,2022-03-11 05:20:00,2022-03-11 05:24:00,Station-24,2954,20,161,CKB +LINE_10,Station-24,2022-03-11 05:44:00,2022-03-11 05:50:00,Station-25,3.29,0,161,CKB +LINE_10,Station-25,2022-03-11 05:50:00,2022-03-11 05:54:00,Station-24,2954,5,161,CKB +LINE_10,Station-24,2022-03-11 05:59:00,2022-03-11 06:06:00,Station-25,3.29,2,161,CKB +LINE_10,Station-25,2022-03-11 06:08:00,2022-03-11 06:13:00,Station-24,2954,19,161,CKB +LINE_10,Station-24,2022-03-11 06:32:00,2022-03-11 06:39:00,Station-25,3.29,1,161,CKB +LINE_10,Station-25,2022-03-11 06:40:00,2022-03-11 06:45:00,Station-24,2954,7,161,CKB +LINE_10,Station-24,2022-03-11 06:52:00,2022-03-11 06:59:00,Station-25,3.29,1,161,CKB +LINE_10,Station-25,2022-03-11 07:00:00,2022-03-11 07:05:00,Station-24,2954,7,161,CKB +LINE_10,Station-24,2022-03-11 07:12:00,2022-03-11 07:19:00,Station-25,3.29,1,161,CKB +LINE_10,Station-25,2022-03-11 07:20:00,2022-03-11 07:25:00,Station-24,2954,7,161,CKB +LINE_10,Station-24,2022-03-11 07:32:00,2022-03-11 07:39:00,Station-25,3.29,1,161,CKB +LINE_10,Station-25,2022-03-11 07:40:00,2022-03-11 07:45:00,Station-24,2954,295,161,CKB +LINE_10,Station-24,2022-03-11 12:40:00,2022-03-11 12:47:00,Station-25,3.29,2,161,CKB +LINE_10,Station-25,2022-03-11 12:49:00,2022-03-11 12:54:00,Station-24,2954,46,161,CKB +LINE_10,Station-24,2022-03-11 13:40:00,2022-03-11 13:47:00,Station-25,3.29,2,161,CKB +LINE_10,Station-25,2022-03-11 13:49:00,2022-03-11 13:54:00,Station-24,2954,434,161,CKB +LINE_10,Station-24,2022-03-11 21:08:00,2022-03-11 21:08:00,Station-0,0.06,0,161,CKB +LINE_11,Station-0,2022-03-11 07:20:00,2022-03-11 07:20:00,Station-26,0.06,0,162,CKB +LINE_11,Station-26,2022-03-11 07:20:00,2022-03-11 07:50:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 08:00:00,2022-03-11 08:30:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 08:40:00,2022-03-11 09:10:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 09:20:00,2022-03-11 09:50:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 10:00:00,2022-03-11 10:30:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 10:40:00,2022-03-11 11:10:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 11:20:00,2022-03-11 11:50:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 12:00:00,2022-03-11 12:30:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 12:40:00,2022-03-11 13:10:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 13:20:00,2022-03-11 13:50:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 14:00:00,2022-03-11 14:30:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 14:40:00,2022-03-11 15:10:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 15:20:00,2022-03-11 15:50:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 16:00:00,2022-03-11 16:30:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 16:40:00,2022-03-11 17:10:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 17:20:00,2022-03-11 17:50:00,Station-26,9266,10,162,CKB +LINE_11,Station-26,2022-03-11 18:00:00,2022-03-11 18:30:00,Station-26,9266,0,162,CKB +LINE_11,Station-26,2022-03-11 18:30:00,2022-03-11 18:30:00,Station-0,0.06,0,162,CKB +LINE_12,Station-0,2022-03-11 07:10:00,2022-03-11 07:10:00,Station-27,0.06,0,163,CKB +LINE_12,Station-27,2022-03-11 07:10:00,2022-03-11 07:18:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 07:28:00,2022-03-11 07:40:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 07:40:00,2022-03-11 07:48:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 07:58:00,2022-03-11 08:10:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 08:10:00,2022-03-11 08:18:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 08:28:00,2022-03-11 08:40:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 08:40:00,2022-03-11 08:48:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 08:58:00,2022-03-11 09:10:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 09:10:00,2022-03-11 09:18:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 09:28:00,2022-03-11 09:40:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 09:40:00,2022-03-11 09:48:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 09:58:00,2022-03-11 10:10:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 10:10:00,2022-03-11 10:18:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 10:28:00,2022-03-11 10:40:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 10:40:00,2022-03-11 10:48:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 10:58:00,2022-03-11 11:10:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 11:10:00,2022-03-11 11:18:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 11:28:00,2022-03-11 11:40:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 11:40:00,2022-03-11 11:48:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 11:58:00,2022-03-11 12:10:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 12:10:00,2022-03-11 12:18:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 12:28:00,2022-03-11 12:40:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 12:40:00,2022-03-11 12:48:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 12:58:00,2022-03-11 13:10:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 13:10:00,2022-03-11 13:18:00,Station-28,2169,10,163,CKB +LINE_12,Station-28,2022-03-11 13:28:00,2022-03-11 13:40:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 13:40:00,2022-03-11 13:48:00,Station-28,2169,8,163,CKB +LINE_12,Station-28,2022-03-11 13:56:00,2022-03-11 14:10:00,Station-27,2952,0,163,CKB +LINE_12,Station-27,2022-03-11 14:10:00,2022-03-11 14:19:00,Station-28,2169,14,163,CKB +LINE_12,Station-28,2022-03-11 14:33:00,2022-03-11 14:47:00,Station-27,2952,3,163,CKB +LINE_12,Station-27,2022-03-11 14:50:00,2022-03-11 14:59:00,Station-28,2169,14,163,CKB +LINE_12,Station-28,2022-03-11 15:13:00,2022-03-11 15:27:00,Station-27,2952,3,163,CKB +LINE_12,Station-27,2022-03-11 15:30:00,2022-03-11 15:39:00,Station-28,2169,14,163,CKB +LINE_12,Station-28,2022-03-11 15:53:00,2022-03-11 16:07:00,Station-27,2952,3,163,CKB +LINE_12,Station-27,2022-03-11 16:10:00,2022-03-11 16:19:00,Station-28,2169,14,163,CKB +LINE_12,Station-28,2022-03-11 16:33:00,2022-03-11 16:47:00,Station-27,2952,3,163,CKB +LINE_12,Station-27,2022-03-11 16:50:00,2022-03-11 16:59:00,Station-28,2169,14,163,CKB +LINE_12,Station-28,2022-03-11 17:13:00,2022-03-11 17:27:00,Station-27,2952,3,163,CKB +LINE_12,Station-27,2022-03-11 17:30:00,2022-03-11 17:39:00,Station-28,2169,13,163,CKB +LINE_12,Station-28,2022-03-11 17:52:00,2022-03-11 18:05:00,Station-27,2952,5,163,CKB +LINE_12,Station-27,2022-03-11 18:10:00,2022-03-11 18:18:00,Station-28,2169,0,163,CKB +LINE_12,Station-28,2022-03-11 18:18:00,2022-03-11 18:18:00,Station-0,0.06,0,163,CKB +LINE_12,Station-0,2022-03-11 14:13:00,2022-03-11 14:13:00,Station-28,0.06,0,164,CKB +LINE_12,Station-28,2022-03-11 14:13:00,2022-03-11 14:27:00,Station-27,2952,3,164,CKB +LINE_12,Station-27,2022-03-11 14:30:00,2022-03-11 14:39:00,Station-28,2169,14,164,CKB +LINE_12,Station-28,2022-03-11 14:53:00,2022-03-11 15:07:00,Station-27,2952,3,164,CKB +LINE_12,Station-27,2022-03-11 15:10:00,2022-03-11 15:19:00,Station-28,2169,14,164,CKB +LINE_12,Station-28,2022-03-11 15:33:00,2022-03-11 15:47:00,Station-27,2952,3,164,CKB +LINE_12,Station-27,2022-03-11 15:50:00,2022-03-11 15:59:00,Station-28,2169,14,164,CKB +LINE_12,Station-28,2022-03-11 16:13:00,2022-03-11 16:27:00,Station-27,2952,3,164,CKB +LINE_12,Station-27,2022-03-11 16:30:00,2022-03-11 16:39:00,Station-28,2169,14,164,CKB +LINE_12,Station-28,2022-03-11 16:53:00,2022-03-11 17:07:00,Station-27,2952,3,164,CKB +LINE_12,Station-27,2022-03-11 17:10:00,2022-03-11 17:19:00,Station-28,2169,14,164,CKB +LINE_12,Station-28,2022-03-11 17:33:00,2022-03-11 17:47:00,Station-27,2952,3,164,CKB +LINE_12,Station-27,2022-03-11 17:50:00,2022-03-11 17:59:00,Station-28,2169,14,164,CKB +LINE_12,Station-28,2022-03-11 18:13:00,2022-03-11 18:25:00,Station-27,2952,0,164,CKB +LINE_12,Station-27,2022-03-11 18:25:00,2022-03-11 18:25:00,Station-0,0.06,0,164,CKB +LINE_13,Station-0,2022-03-12 00:23:00,2022-03-12 00:23:00,Station-29,0.06,0,165,CKB +LINE_13,Station-29,2022-03-12 00:23:00,2022-03-12 00:30:00,Station-30,2577,9,165,CKB +LINE_14,Station-30,2022-03-12 00:39:00,2022-03-12 00:54:00,Station-31,5937,9,165,CKB +LINE_14,Station-31,2022-03-12 01:03:00,2022-03-12 01:17:00,Station-30,6.19,0,165,CKB +LINE_13,Station-30,2022-03-12 01:17:00,2022-03-12 01:23:00,Station-29,2555,0,165,CKB +LINE_13,Station-29,2022-03-12 01:23:00,2022-03-12 01:30:00,Station-30,2577,9,165,CKB +LINE_14,Station-30,2022-03-12 01:39:00,2022-03-12 01:54:00,Station-31,5937,9,165,CKB +LINE_14,Station-31,2022-03-12 02:03:00,2022-03-12 02:17:00,Station-30,6.19,0,165,CKB +LINE_13,Station-30,2022-03-12 02:17:00,2022-03-12 02:23:00,Station-29,2555,0,165,CKB +LINE_13,Station-29,2022-03-12 02:23:00,2022-03-12 02:30:00,Station-30,2577,9,165,CKB +LINE_14,Station-30,2022-03-12 02:39:00,2022-03-12 02:54:00,Station-31,5937,9,165,CKB +LINE_14,Station-31,2022-03-12 03:03:00,2022-03-12 03:17:00,Station-30,6.19,0,165,CKB +LINE_13,Station-30,2022-03-12 03:17:00,2022-03-12 03:23:00,Station-29,2555,0,165,CKB +LINE_13,Station-29,2022-03-12 03:23:00,2022-03-12 03:30:00,Station-30,2577,9,165,CKB +LINE_14,Station-30,2022-03-12 03:39:00,2022-03-12 03:54:00,Station-31,5937,9,165,CKB +LINE_14,Station-31,2022-03-12 04:03:00,2022-03-12 04:17:00,Station-30,6.19,0,165,CKB +LINE_13,Station-30,2022-03-12 04:17:00,2022-03-12 04:23:00,Station-29,2555,0,165,CKB +LINE_13,Station-29,2022-03-12 04:23:00,2022-03-12 04:30:00,Station-30,2577,9,165,CKB +LINE_14,Station-30,2022-03-12 04:39:00,2022-03-12 04:54:00,Station-31,5937,9,165,CKB +LINE_14,Station-31,2022-03-12 05:03:00,2022-03-12 05:17:00,Station-30,6.19,0,165,CKB +LINE_15,Station-30,2022-03-12 05:17:00,2022-03-12 05:38:00,Station-33,12.0,28,165,CKB +LINE_15,Station-33,2022-03-12 06:06:00,2022-03-12 06:11:00,Station-32,2936,16,165,CKB +LINE_15,Station-32,2022-03-12 06:27:00,2022-03-12 06:36:00,Station-33,4343,10,165,CKB +LINE_15,Station-33,2022-03-12 06:46:00,2022-03-12 06:51:00,Station-32,2936,0,165,CKB +LINE_10,Station-32,2022-03-12 06:51:00,2022-03-12 07:00:00,Station-24,4.6,12,165,CKB +LINE_10,Station-24,2022-03-12 07:12:00,2022-03-12 07:12:00,Station-24,0.0,836,165,CKB +LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-24,0.0,0,165,CKB +LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-0,0.06,0,165,CKB +LINE_14,Station-0,2022-03-12 00:33:00,2022-03-12 00:33:00,Station-31,0.06,0,166,CKB +LINE_14,Station-31,2022-03-12 00:33:00,2022-03-12 00:47:00,Station-30,6.19,0,166,CKB +LINE_13,Station-30,2022-03-12 00:47:00,2022-03-12 00:53:00,Station-29,2555,0,166,CKB +LINE_13,Station-29,2022-03-12 00:53:00,2022-03-12 01:00:00,Station-30,2577,9,166,CKB +LINE_14,Station-30,2022-03-12 01:09:00,2022-03-12 01:24:00,Station-31,5937,9,166,CKB +LINE_14,Station-31,2022-03-12 01:33:00,2022-03-12 01:47:00,Station-30,6.19,0,166,CKB +LINE_13,Station-30,2022-03-12 01:47:00,2022-03-12 01:53:00,Station-29,2555,0,166,CKB +LINE_13,Station-29,2022-03-12 01:53:00,2022-03-12 02:00:00,Station-30,2577,9,166,CKB +LINE_14,Station-30,2022-03-12 02:09:00,2022-03-12 02:24:00,Station-31,5937,9,166,CKB +LINE_14,Station-31,2022-03-12 02:33:00,2022-03-12 02:47:00,Station-30,6.19,0,166,CKB +LINE_13,Station-30,2022-03-12 02:47:00,2022-03-12 02:53:00,Station-29,2555,0,166,CKB +LINE_13,Station-29,2022-03-12 02:53:00,2022-03-12 03:00:00,Station-30,2577,9,166,CKB +LINE_14,Station-30,2022-03-12 03:09:00,2022-03-12 03:24:00,Station-31,5937,9,166,CKB +LINE_14,Station-31,2022-03-12 03:33:00,2022-03-12 03:47:00,Station-30,6.19,0,166,CKB +LINE_13,Station-30,2022-03-12 03:47:00,2022-03-12 03:53:00,Station-29,2555,0,166,CKB +LINE_13,Station-29,2022-03-12 03:53:00,2022-03-12 04:00:00,Station-30,2577,9,166,CKB +LINE_14,Station-30,2022-03-12 04:09:00,2022-03-12 04:24:00,Station-31,5937,9,166,CKB +LINE_14,Station-31,2022-03-12 04:33:00,2022-03-12 04:47:00,Station-30,6.19,0,166,CKB +LINE_13,Station-30,2022-03-12 04:47:00,2022-03-12 04:53:00,Station-29,2555,0,166,CKB +LINE_13,Station-29,2022-03-12 04:53:00,2022-03-12 05:00:00,Station-30,2577,9,166,CKB +LINE_14,Station-30,2022-03-12 05:09:00,2022-03-12 05:24:00,Station-31,5937,0,166,CKB +LINE_14,Station-31,2022-03-12 05:24:00,2022-03-12 05:24:00,Station-0,0.06,0,166,CKB +LINE_15,Station-0,2022-03-12 00:57:00,2022-03-12 00:57:00,Station-32,0.06,0,167,CKB +LINE_15,Station-32,2022-03-12 00:57:00,2022-03-12 01:06:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 01:06:00,2022-03-12 01:11:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 01:27:00,2022-03-12 01:36:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 01:36:00,2022-03-12 01:41:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 01:57:00,2022-03-12 02:06:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 02:06:00,2022-03-12 02:11:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 02:27:00,2022-03-12 02:36:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 02:36:00,2022-03-12 02:41:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 02:57:00,2022-03-12 03:06:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 03:06:00,2022-03-12 03:11:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 03:27:00,2022-03-12 03:36:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 03:36:00,2022-03-12 03:41:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 03:57:00,2022-03-12 04:06:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 04:06:00,2022-03-12 04:11:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 04:27:00,2022-03-12 04:36:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 04:36:00,2022-03-12 04:41:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 04:57:00,2022-03-12 05:06:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 05:06:00,2022-03-12 05:11:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 05:27:00,2022-03-12 05:36:00,Station-33,4343,0,167,CKB +LINE_15,Station-33,2022-03-12 05:36:00,2022-03-12 05:41:00,Station-32,2936,16,167,CKB +LINE_15,Station-32,2022-03-12 05:57:00,2022-03-12 06:06:00,Station-33,4343,20,167,CKB +LINE_15,Station-33,2022-03-12 06:26:00,2022-03-12 06:31:00,Station-32,2936,0,167,CKB +LINE_15,Station-32,2022-03-12 06:31:00,2022-03-12 06:31:00,Station-0,0.06,0,167,CKB +LINE_17,Station-0,2022-03-12 00:30:00,2022-03-12 00:30:00,Station-34,0.06,0,168,CKB +LINE_17,Station-34,2022-03-12 00:30:00,2022-03-12 00:44:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 00:44:00,2022-03-12 00:57:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 01:00:00,2022-03-12 01:14:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 01:14:00,2022-03-12 01:27:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 01:30:00,2022-03-12 01:44:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 01:44:00,2022-03-12 01:57:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 02:00:00,2022-03-12 02:14:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 02:14:00,2022-03-12 02:27:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 02:30:00,2022-03-12 02:44:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 02:44:00,2022-03-12 02:57:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 03:00:00,2022-03-12 03:14:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 03:14:00,2022-03-12 03:27:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 03:30:00,2022-03-12 03:44:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 03:44:00,2022-03-12 03:57:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 04:00:00,2022-03-12 04:14:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 04:14:00,2022-03-12 04:27:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 04:30:00,2022-03-12 04:44:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 04:44:00,2022-03-12 04:57:00,Station-34,5302,3,168,CKB +LINE_17,Station-34,2022-03-12 05:00:00,2022-03-12 05:14:00,Station-36,4801,0,168,CKB +LINE_17,Station-36,2022-03-12 05:14:00,2022-03-12 05:27:00,Station-34,5302,0,168,CKB +LINE_17,Station-34,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,168,CKB +LINE_20,Station-0,2022-03-12 00:32:00,2022-03-12 00:32:00,Station-13,0.06,0,169,CKB +LINE_20,Station-13,2022-03-12 00:32:00,2022-03-12 00:44:00,Station-40,4212,3,169,CKB +LINE_20,Station-40,2022-03-12 00:47:00,2022-03-12 01:16:00,Station-41,13048,0,169,CKB +LINE_20,Station-41,2022-03-12 01:16:00,2022-03-12 01:42:00,Station-40,12869,5,169,CKB +LINE_20,Station-40,2022-03-12 01:47:00,2022-03-12 02:16:00,Station-41,13048,0,169,CKB +LINE_20,Station-41,2022-03-12 02:16:00,2022-03-12 02:42:00,Station-40,12869,5,169,CKB +LINE_20,Station-40,2022-03-12 02:47:00,2022-03-12 03:16:00,Station-41,13048,0,169,CKB +LINE_20,Station-41,2022-03-12 03:16:00,2022-03-12 03:42:00,Station-40,12869,5,169,CKB +LINE_20,Station-40,2022-03-12 03:47:00,2022-03-12 04:16:00,Station-41,13048,0,169,CKB +LINE_20,Station-41,2022-03-12 04:16:00,2022-03-12 04:42:00,Station-40,12869,5,169,CKB +LINE_20,Station-40,2022-03-12 04:47:00,2022-03-12 05:16:00,Station-41,13048,0,169,CKB +LINE_20,Station-41,2022-03-12 05:16:00,2022-03-12 05:34:00,Station-42,9538,0,169,CKB +LINE_20,Station-42,2022-03-12 05:34:00,2022-03-12 05:34:00,Station-0,0.06,0,169,CKB +LINE_20,Station-0,2022-03-12 00:17:00,2022-03-12 00:17:00,Station-40,0.06,0,170,CKB +LINE_20,Station-40,2022-03-12 00:17:00,2022-03-12 00:46:00,Station-41,13048,0,170,CKB +LINE_20,Station-41,2022-03-12 00:46:00,2022-03-12 01:12:00,Station-40,12869,5,170,CKB +LINE_20,Station-40,2022-03-12 01:17:00,2022-03-12 01:46:00,Station-41,13048,0,170,CKB +LINE_20,Station-41,2022-03-12 01:46:00,2022-03-12 02:12:00,Station-40,12869,5,170,CKB +LINE_20,Station-40,2022-03-12 02:17:00,2022-03-12 02:46:00,Station-41,13048,0,170,CKB +LINE_20,Station-41,2022-03-12 02:46:00,2022-03-12 03:12:00,Station-40,12869,5,170,CKB +LINE_20,Station-40,2022-03-12 03:17:00,2022-03-12 03:46:00,Station-41,13048,0,170,CKB +LINE_20,Station-41,2022-03-12 03:46:00,2022-03-12 04:12:00,Station-40,12869,5,170,CKB +LINE_20,Station-40,2022-03-12 04:17:00,2022-03-12 04:46:00,Station-41,13048,0,170,CKB +LINE_20,Station-41,2022-03-12 04:46:00,2022-03-12 05:12:00,Station-40,12869,0,170,CKB +LINE_20,Station-40,2022-03-12 05:12:00,2022-03-12 05:12:00,Station-0,0.06,0,170,CKB +LINE_21,Station-0,2022-03-12 00:49:00,2022-03-12 00:49:00,Station-3,0.06,0,171,CKB +LINE_21,Station-3,2022-03-12 00:49:00,2022-03-12 01:04:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 01:04:00,2022-03-12 01:19:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 01:19:00,2022-03-12 01:34:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 01:34:00,2022-03-12 01:49:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 01:49:00,2022-03-12 02:04:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 02:04:00,2022-03-12 02:19:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 02:19:00,2022-03-12 02:34:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 02:34:00,2022-03-12 02:49:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 02:49:00,2022-03-12 03:04:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 03:04:00,2022-03-12 03:19:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 03:19:00,2022-03-12 03:34:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 03:34:00,2022-03-12 03:49:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 03:49:00,2022-03-12 04:04:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 04:04:00,2022-03-12 04:19:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 04:19:00,2022-03-12 04:34:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 04:34:00,2022-03-12 04:49:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 04:49:00,2022-03-12 05:04:00,Station-16,10229,0,171,CKB +LINE_21,Station-16,2022-03-12 05:04:00,2022-03-12 05:19:00,Station-3,11801,0,171,CKB +LINE_21,Station-3,2022-03-12 05:19:00,2022-03-12 05:19:00,Station-0,0.06,0,171,CKB +LINE_23,Station-0,2022-03-12 02:34:00,2022-03-12 02:34:00,Station-45,0.06,0,172,CKB +LINE_23,Station-45,2022-03-12 02:34:00,2022-03-12 03:00:00,Station-46,9016,0,172,CKB +LINE_23,Station-46,2022-03-12 03:00:00,2022-03-12 03:27:00,Station-45,10083,7,172,CKB +LINE_23,Station-45,2022-03-12 03:34:00,2022-03-12 04:00:00,Station-46,9016,0,172,CKB +LINE_23,Station-46,2022-03-12 04:00:00,2022-03-12 04:27:00,Station-45,10083,7,172,CKB +LINE_23,Station-45,2022-03-12 04:34:00,2022-03-12 05:00:00,Station-46,9016,0,172,CKB +LINE_23,Station-46,2022-03-12 05:00:00,2022-03-12 05:27:00,Station-45,10083,0,172,CKB +LINE_23,Station-45,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,172,CKB +LINE_23,Station-0,2022-03-12 02:04:00,2022-03-12 02:04:00,Station-45,0.06,0,173,CKB +LINE_23,Station-45,2022-03-12 02:04:00,2022-03-12 02:30:00,Station-46,9016,0,173,CKB +LINE_23,Station-46,2022-03-12 02:30:00,2022-03-12 02:57:00,Station-45,10083,7,173,CKB +LINE_23,Station-45,2022-03-12 03:04:00,2022-03-12 03:30:00,Station-46,9016,0,173,CKB +LINE_23,Station-46,2022-03-12 03:30:00,2022-03-12 03:57:00,Station-45,10083,7,173,CKB +LINE_23,Station-45,2022-03-12 04:04:00,2022-03-12 04:30:00,Station-46,9016,0,173,CKB +LINE_23,Station-46,2022-03-12 04:30:00,2022-03-12 04:57:00,Station-45,10083,7,173,CKB +LINE_23,Station-45,2022-03-12 05:04:00,2022-03-12 05:30:00,Station-46,9016,0,173,CKB +LINE_23,Station-46,2022-03-12 05:30:00,2022-03-12 05:30:00,Station-0,0.06,0,173,CKB +LINE_24,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,174,CKB +LINE_24,Station-21,2022-03-12 00:31:00,2022-03-12 00:44:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 00:44:00,2022-03-12 00:56:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 01:01:00,2022-03-12 01:14:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 01:14:00,2022-03-12 01:26:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 01:31:00,2022-03-12 01:44:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 01:44:00,2022-03-12 01:56:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 02:01:00,2022-03-12 02:14:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 02:14:00,2022-03-12 02:26:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 02:31:00,2022-03-12 02:44:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 02:44:00,2022-03-12 02:56:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 03:01:00,2022-03-12 03:14:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 03:14:00,2022-03-12 03:26:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 03:31:00,2022-03-12 03:44:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 03:44:00,2022-03-12 03:56:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 04:01:00,2022-03-12 04:14:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 04:14:00,2022-03-12 04:26:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 04:31:00,2022-03-12 04:44:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 04:44:00,2022-03-12 04:56:00,Station-21,5362,5,174,CKB +LINE_24,Station-21,2022-03-12 05:01:00,2022-03-12 05:14:00,Station-47,4872,0,174,CKB +LINE_24,Station-47,2022-03-12 05:14:00,2022-03-12 05:26:00,Station-21,5362,0,174,CKB +LINE_24,Station-21,2022-03-12 05:26:00,2022-03-12 05:26:00,Station-0,0.06,0,174,CKB +LINE_25,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,175,CKB +LINE_25,Station-21,2022-03-12 00:31:00,2022-03-12 00:45:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 00:47:00,2022-03-12 01:01:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 01:01:00,2022-03-12 01:15:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 01:17:00,2022-03-12 01:31:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 01:31:00,2022-03-12 01:45:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 01:47:00,2022-03-12 02:01:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 02:01:00,2022-03-12 02:15:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 02:17:00,2022-03-12 02:31:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 02:31:00,2022-03-12 02:45:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 02:47:00,2022-03-12 03:01:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 03:01:00,2022-03-12 03:15:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 03:17:00,2022-03-12 03:31:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 03:31:00,2022-03-12 03:45:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 03:47:00,2022-03-12 04:01:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 04:01:00,2022-03-12 04:15:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 04:17:00,2022-03-12 04:31:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 04:31:00,2022-03-12 04:45:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 04:47:00,2022-03-12 05:01:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 05:01:00,2022-03-12 05:15:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 05:17:00,2022-03-12 05:31:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 05:31:00,2022-03-12 05:45:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 05:47:00,2022-03-12 06:01:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 06:01:00,2022-03-12 06:15:00,Station-48,5225,2,175,CKB +LINE_25,Station-48,2022-03-12 06:17:00,2022-03-12 06:31:00,Station-21,7617,0,175,CKB +LINE_25,Station-21,2022-03-12 06:31:00,2022-03-12 06:45:00,Station-48,5096,0,175,CKB +LINE_25,Station-48,2022-03-12 06:45:00,2022-03-12 06:45:00,Station-0,0.06,0,175,CKB +LINE_26,Station-0,2022-03-12 00:43:00,2022-03-12 00:43:00,Station-49,0.06,0,176,CKB +LINE_26,Station-49,2022-03-12 00:43:00,2022-03-12 00:53:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 00:53:00,2022-03-12 01:03:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 01:13:00,2022-03-12 01:23:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 01:23:00,2022-03-12 01:33:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 01:43:00,2022-03-12 01:53:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 01:53:00,2022-03-12 02:03:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 02:13:00,2022-03-12 02:23:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 02:23:00,2022-03-12 02:33:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 02:43:00,2022-03-12 02:53:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 02:53:00,2022-03-12 03:03:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 03:13:00,2022-03-12 03:23:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 03:23:00,2022-03-12 03:33:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 03:43:00,2022-03-12 03:53:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 03:53:00,2022-03-12 04:03:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 04:13:00,2022-03-12 04:23:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 04:23:00,2022-03-12 04:33:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 04:43:00,2022-03-12 04:53:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 04:53:00,2022-03-12 05:03:00,Station-49,4408,10,176,CKB +LINE_26,Station-49,2022-03-12 05:13:00,2022-03-12 05:23:00,Station-50,4507,0,176,CKB +LINE_26,Station-50,2022-03-12 05:23:00,2022-03-12 05:23:00,Station-0,0.06,0,176,CKB +LINE_0,Station-0,2022-03-12 20:51:00,2022-03-12 20:51:00,Station-1,0.06,0,177,CKB +LINE_0,Station-1,2022-03-12 20:51:00,2022-03-12 21:24:00,Station-2,14519,4,177,CKB +LINE_0,Station-2,2022-03-12 21:28:00,2022-03-12 22:03:00,Station-1,13541,8,177,CKB +LINE_0,Station-1,2022-03-12 22:11:00,2022-03-12 22:44:00,Station-2,14519,4,177,CKB +LINE_0,Station-2,2022-03-12 22:48:00,2022-03-12 23:23:00,Station-1,13541,8,177,CKB +LINE_0,Station-1,2022-03-12 23:31:00,2022-03-13 00:04:00,Station-2,14519,4,177,CKB +LINE_0,Station-2,2022-03-13 00:08:00,2022-03-13 00:39:00,Station-5,12213,0,177,CKB +LINE_1,Station-5,2022-03-13 00:39:00,2022-03-13 00:47:00,Station-3,4.0,2,177,CKB +LINE_1,Station-3,2022-03-13 00:49:00,2022-03-13 01:12:00,Station-4,8.36,6,177,CKB +LINE_1,Station-4,2022-03-13 01:18:00,2022-03-13 01:36:00,Station-3,9067,13,177,CKB +LINE_1,Station-3,2022-03-13 01:49:00,2022-03-13 02:12:00,Station-4,8.36,6,177,CKB +LINE_1,Station-4,2022-03-13 02:18:00,2022-03-13 02:36:00,Station-3,9067,13,177,CKB +LINE_1,Station-3,2022-03-13 02:49:00,2022-03-13 03:12:00,Station-4,8.36,6,177,CKB +LINE_1,Station-4,2022-03-13 03:18:00,2022-03-13 03:36:00,Station-3,9067,13,177,CKB +LINE_1,Station-3,2022-03-13 03:49:00,2022-03-13 04:12:00,Station-4,8.36,6,177,CKB +LINE_1,Station-4,2022-03-13 04:18:00,2022-03-13 04:36:00,Station-3,9067,13,177,CKB +LINE_1,Station-3,2022-03-13 04:49:00,2022-03-13 05:12:00,Station-4,8.36,6,177,CKB +LINE_1,Station-4,2022-03-13 05:18:00,2022-03-13 05:36:00,Station-3,9067,13,177,CKB +LINE_1,Station-3,2022-03-13 05:49:00,2022-03-13 06:08:00,Station-4,8762,10,177,CKB +LINE_1,Station-4,2022-03-13 06:18:00,2022-03-13 06:36:00,Station-3,9067,13,177,CKB +LINE_1,Station-3,2022-03-13 06:49:00,2022-03-13 07:08:00,Station-4,8762,0,177,CKB +LINE_1,Station-4,2022-03-13 07:08:00,2022-03-13 07:08:00,Station-0,0.06,0,177,CKB +LINE_0,Station-0,2022-03-12 21:31:00,2022-03-12 21:31:00,Station-1,0.06,0,178,CKB +LINE_0,Station-1,2022-03-12 21:31:00,2022-03-12 22:04:00,Station-2,14519,4,178,CKB +LINE_0,Station-2,2022-03-12 22:08:00,2022-03-12 22:43:00,Station-1,13541,8,178,CKB +LINE_0,Station-1,2022-03-12 22:51:00,2022-03-12 23:24:00,Station-2,14519,4,178,CKB +LINE_0,Station-2,2022-03-12 23:28:00,2022-03-13 00:03:00,Station-1,13541,8,178,CKB +LINE_0,Station-1,2022-03-13 00:11:00,2022-03-13 00:44:00,Station-2,14519,0,178,CKB +LINE_1,Station-2,2022-03-13 00:44:00,2022-03-13 00:54:00,Station-3,4.1,25,178,CKB +LINE_1,Station-3,2022-03-13 01:19:00,2022-03-13 01:42:00,Station-4,8.36,6,178,CKB +LINE_1,Station-4,2022-03-13 01:48:00,2022-03-13 02:06:00,Station-3,9067,13,178,CKB +LINE_1,Station-3,2022-03-13 02:19:00,2022-03-13 02:42:00,Station-4,8.36,6,178,CKB +LINE_1,Station-4,2022-03-13 02:48:00,2022-03-13 03:06:00,Station-3,9067,13,178,CKB +LINE_1,Station-3,2022-03-13 03:19:00,2022-03-13 03:42:00,Station-4,8.36,6,178,CKB +LINE_1,Station-4,2022-03-13 03:48:00,2022-03-13 04:06:00,Station-3,9067,13,178,CKB +LINE_1,Station-3,2022-03-13 04:19:00,2022-03-13 04:42:00,Station-4,8.36,6,178,CKB +LINE_1,Station-4,2022-03-13 04:48:00,2022-03-13 05:06:00,Station-3,9067,13,178,CKB +LINE_1,Station-3,2022-03-13 05:19:00,2022-03-13 05:42:00,Station-4,8.36,6,178,CKB +LINE_1,Station-4,2022-03-13 05:48:00,2022-03-13 06:06:00,Station-3,9067,0,178,CKB +LINE_1,Station-3,2022-03-13 06:06:00,2022-03-13 06:06:00,Station-0,0.06,0,178,CKB +LINE_2,Station-0,2022-03-12 21:06:00,2022-03-12 21:06:00,Station-6,0.06,0,179,CKB +LINE_2,Station-6,2022-03-12 21:06:00,2022-03-12 21:34:00,Station-7,13018,19,179,CKB +LINE_2,Station-7,2022-03-12 21:53:00,2022-03-12 22:13:00,Station-8,10332,17,179,CKB +LINE_2,Station-8,2022-03-12 22:30:00,2022-03-12 22:54:00,Station-7,10.48,19,179,CKB +LINE_2,Station-7,2022-03-12 23:13:00,2022-03-12 23:33:00,Station-8,10332,17,179,CKB +LINE_2,Station-8,2022-03-12 23:50:00,2022-03-13 00:14:00,Station-7,10.48,8,179,CKB +LINE_2,Station-7,2022-03-13 00:22:00,2022-03-13 00:27:00,Station-58,2533,2,179,CKB +LINE_3,Station-58,2022-03-13 00:29:00,2022-03-13 00:47:00,Station-10,7.58,0,179,CKB +LINE_3,Station-10,2022-03-13 00:47:00,2022-03-13 01:14:00,Station-11,12841,3,179,CKB +LINE_3,Station-11,2022-03-13 01:17:00,2022-03-13 01:47:00,Station-10,14281,0,179,CKB +LINE_3,Station-10,2022-03-13 01:47:00,2022-03-13 02:14:00,Station-11,12841,3,179,CKB +LINE_3,Station-11,2022-03-13 02:17:00,2022-03-13 02:47:00,Station-10,14281,0,179,CKB +LINE_3,Station-10,2022-03-13 02:47:00,2022-03-13 03:14:00,Station-11,12841,3,179,CKB +LINE_3,Station-11,2022-03-13 03:17:00,2022-03-13 03:47:00,Station-10,14281,0,179,CKB +LINE_3,Station-10,2022-03-13 03:47:00,2022-03-13 04:14:00,Station-11,12841,3,179,CKB +LINE_3,Station-11,2022-03-13 04:17:00,2022-03-13 04:47:00,Station-10,14281,0,179,CKB +LINE_3,Station-10,2022-03-13 04:47:00,2022-03-13 05:14:00,Station-11,12841,3,179,CKB +LINE_3,Station-11,2022-03-13 05:17:00,2022-03-13 05:47:00,Station-10,14281,0,179,CKB +LINE_3,Station-10,2022-03-13 05:47:00,2022-03-13 06:14:00,Station-11,12841,3,179,CKB +LINE_3,Station-11,2022-03-13 06:17:00,2022-03-13 06:47:00,Station-10,14281,0,179,CKB +LINE_3,Station-10,2022-03-13 06:47:00,2022-03-13 06:59:00,Station-58,5474,0,179,CKB +LINE_3,Station-58,2022-03-13 06:59:00,2022-03-13 06:59:00,Station-0,0.06,0,179,CKB +LINE_2,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-6,0.06,0,180,CKB +LINE_2,Station-6,2022-03-12 20:26:00,2022-03-12 20:56:00,Station-12,14097,14,180,CKB +LINE_2,Station-12,2022-03-12 21:10:00,2022-03-12 21:38:00,Station-6,13.19,8,180,CKB +LINE_2,Station-6,2022-03-12 21:46:00,2022-03-12 22:14:00,Station-7,13018,19,180,CKB +LINE_2,Station-7,2022-03-12 22:33:00,2022-03-12 22:53:00,Station-8,10332,17,180,CKB +LINE_2,Station-8,2022-03-12 23:10:00,2022-03-12 23:34:00,Station-7,10.48,19,180,CKB +LINE_2,Station-7,2022-03-12 23:53:00,2022-03-13 00:13:00,Station-8,10332,2,180,CKB +LINE_2,Station-8,2022-03-13 00:15:00,2022-03-13 00:16:00,Station-10,506,1,180,CKB +LINE_3,Station-10,2022-03-13 00:17:00,2022-03-13 00:44:00,Station-11,12841,3,180,CKB +LINE_3,Station-11,2022-03-13 00:47:00,2022-03-13 01:17:00,Station-10,14281,0,180,CKB +LINE_3,Station-10,2022-03-13 01:17:00,2022-03-13 01:44:00,Station-11,12841,3,180,CKB +LINE_3,Station-11,2022-03-13 01:47:00,2022-03-13 02:17:00,Station-10,14281,0,180,CKB +LINE_3,Station-10,2022-03-13 02:17:00,2022-03-13 02:44:00,Station-11,12841,3,180,CKB +LINE_3,Station-11,2022-03-13 02:47:00,2022-03-13 03:17:00,Station-10,14281,0,180,CKB +LINE_3,Station-10,2022-03-13 03:17:00,2022-03-13 03:44:00,Station-11,12841,3,180,CKB +LINE_3,Station-11,2022-03-13 03:47:00,2022-03-13 04:17:00,Station-10,14281,0,180,CKB +LINE_3,Station-10,2022-03-13 04:17:00,2022-03-13 04:44:00,Station-11,12841,3,180,CKB +LINE_3,Station-11,2022-03-13 04:47:00,2022-03-13 05:17:00,Station-10,14281,0,180,CKB +LINE_3,Station-10,2022-03-13 05:17:00,2022-03-13 05:44:00,Station-11,12841,3,180,CKB +LINE_3,Station-11,2022-03-13 05:47:00,2022-03-13 06:17:00,Station-10,14281,0,180,CKB +LINE_3,Station-10,2022-03-13 06:17:00,2022-03-13 06:44:00,Station-11,12841,3,180,CKB +LINE_3,Station-11,2022-03-13 06:47:00,2022-03-13 07:17:00,Station-10,14281,0,180,CKB +LINE_3,Station-10,2022-03-13 07:17:00,2022-03-13 07:17:00,Station-0,0.06,0,180,CKB +LINE_5,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-14,0.06,0,181,CKB +LINE_5,Station-14,2022-03-12 20:26:00,2022-03-12 20:38:00,Station-15,5882,3,181,CKB +LINE_5,Station-15,2022-03-12 20:41:00,2022-03-12 20:55:00,Station-14,6232,0,181,CKB +LINE_5,Station-14,2022-03-12 20:55:00,2022-03-12 21:08:00,Station-15,6086,3,181,CKB +LINE_5,Station-15,2022-03-12 21:11:00,2022-03-12 21:25:00,Station-14,6232,0,181,CKB +LINE_5,Station-14,2022-03-12 21:25:00,2022-03-12 21:38:00,Station-15,6086,3,181,CKB +LINE_5,Station-15,2022-03-12 21:41:00,2022-03-12 21:55:00,Station-14,6232,0,181,CKB +LINE_5,Station-14,2022-03-12 21:55:00,2022-03-12 22:08:00,Station-15,6086,3,181,CKB +LINE_5,Station-15,2022-03-12 22:11:00,2022-03-12 22:25:00,Station-14,6232,0,181,CKB +LINE_5,Station-14,2022-03-12 22:25:00,2022-03-12 22:38:00,Station-15,6086,3,181,CKB +LINE_5,Station-15,2022-03-12 22:41:00,2022-03-12 22:55:00,Station-14,6232,0,181,CKB +LINE_5,Station-14,2022-03-12 22:55:00,2022-03-12 23:08:00,Station-15,6086,3,181,CKB +LINE_5,Station-15,2022-03-12 23:11:00,2022-03-12 23:25:00,Station-14,6232,0,181,CKB +LINE_5,Station-14,2022-03-12 23:25:00,2022-03-12 23:38:00,Station-15,6086,3,181,CKB +LINE_5,Station-15,2022-03-12 23:41:00,2022-03-12 23:55:00,Station-14,6232,0,181,CKB +LINE_5,Station-14,2022-03-12 23:55:00,2022-03-13 00:08:00,Station-15,6086,0,181,CKB +LINE_5,Station-15,2022-03-13 00:08:00,2022-03-13 00:08:00,Station-0,0.06,0,181,CKB +LINE_6,Station-0,2022-03-12 05:25:00,2022-03-12 05:25:00,Station-16,0.06,0,182,CKB +LINE_6,Station-16,2022-03-12 05:25:00,2022-03-12 05:34:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 05:34:00,2022-03-12 05:43:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 06:05:00,2022-03-12 06:14:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 06:14:00,2022-03-12 06:23:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 06:25:00,2022-03-12 06:34:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 06:34:00,2022-03-12 06:43:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 06:45:00,2022-03-12 06:54:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 06:54:00,2022-03-12 07:03:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 07:05:00,2022-03-12 07:14:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 07:14:00,2022-03-12 07:23:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 07:25:00,2022-03-12 07:34:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 07:34:00,2022-03-12 07:43:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 08:05:00,2022-03-12 08:14:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 08:14:00,2022-03-12 08:23:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 08:25:00,2022-03-12 08:34:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 08:34:00,2022-03-12 08:43:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 08:45:00,2022-03-12 08:54:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 08:54:00,2022-03-12 09:03:00,Station-16,5139,3,182,CKB +LINE_6,Station-16,2022-03-12 09:06:00,2022-03-12 09:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 09:15:00,2022-03-12 09:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 09:26:00,2022-03-12 09:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 09:35:00,2022-03-12 09:44:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 10:06:00,2022-03-12 10:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 10:15:00,2022-03-12 10:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 10:26:00,2022-03-12 10:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 10:35:00,2022-03-12 10:44:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 10:46:00,2022-03-12 10:55:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 10:55:00,2022-03-12 11:04:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 11:06:00,2022-03-12 11:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 11:15:00,2022-03-12 11:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 11:26:00,2022-03-12 11:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 11:35:00,2022-03-12 11:44:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 12:06:00,2022-03-12 12:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 12:15:00,2022-03-12 12:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 12:26:00,2022-03-12 12:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 12:35:00,2022-03-12 12:44:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 12:46:00,2022-03-12 12:55:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 12:55:00,2022-03-12 13:04:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 13:06:00,2022-03-12 13:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 13:15:00,2022-03-12 13:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 13:26:00,2022-03-12 13:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 13:35:00,2022-03-12 13:44:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 14:06:00,2022-03-12 14:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 14:15:00,2022-03-12 14:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 14:26:00,2022-03-12 14:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 14:35:00,2022-03-12 14:44:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 14:46:00,2022-03-12 14:55:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 14:55:00,2022-03-12 15:04:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 15:06:00,2022-03-12 15:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 15:15:00,2022-03-12 15:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 15:26:00,2022-03-12 15:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 15:35:00,2022-03-12 15:44:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 16:06:00,2022-03-12 16:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 16:15:00,2022-03-12 16:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 16:26:00,2022-03-12 16:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 16:35:00,2022-03-12 16:44:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 16:46:00,2022-03-12 16:55:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 16:55:00,2022-03-12 17:04:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 17:06:00,2022-03-12 17:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 17:15:00,2022-03-12 17:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 17:26:00,2022-03-12 17:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 17:35:00,2022-03-12 17:44:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 18:06:00,2022-03-12 18:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 18:15:00,2022-03-12 18:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 18:26:00,2022-03-12 18:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 18:35:00,2022-03-12 18:44:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 18:46:00,2022-03-12 18:55:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 18:55:00,2022-03-12 19:04:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 19:06:00,2022-03-12 19:15:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 19:15:00,2022-03-12 19:24:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 19:26:00,2022-03-12 19:35:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 19:35:00,2022-03-12 19:44:00,Station-16,5139,21,182,CKB +LINE_6,Station-16,2022-03-12 20:05:00,2022-03-12 20:14:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 20:14:00,2022-03-12 20:23:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 20:25:00,2022-03-12 20:34:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 20:34:00,2022-03-12 20:43:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 20:45:00,2022-03-12 20:54:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 20:54:00,2022-03-12 21:03:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 21:05:00,2022-03-12 21:14:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 21:14:00,2022-03-12 21:23:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 21:25:00,2022-03-12 21:34:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 21:34:00,2022-03-12 21:43:00,Station-16,5139,22,182,CKB +LINE_6,Station-16,2022-03-12 22:05:00,2022-03-12 22:14:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 22:14:00,2022-03-12 22:23:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 22:25:00,2022-03-12 22:34:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 22:34:00,2022-03-12 22:43:00,Station-16,5139,2,182,CKB +LINE_6,Station-16,2022-03-12 22:45:00,2022-03-12 22:54:00,Station-17,4781,0,182,CKB +LINE_6,Station-17,2022-03-12 22:54:00,2022-03-12 23:03:00,Station-16,5139,0,182,CKB +LINE_6,Station-16,2022-03-12 23:03:00,2022-03-12 23:03:00,Station-0,0.06,0,182,CKB +LINE_29,Station-0,2022-03-12 07:30:00,2022-03-12 07:30:00,Station-53,0.06,0,183,CKB +LINE_29,Station-53,2022-03-12 07:30:00,2022-03-12 07:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 07:39:00,2022-03-12 07:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 07:50:00,2022-03-12 07:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 07:59:00,2022-03-12 08:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 08:10:00,2022-03-12 08:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 08:19:00,2022-03-12 08:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 08:30:00,2022-03-12 08:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 08:39:00,2022-03-12 08:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 08:50:00,2022-03-12 08:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 08:59:00,2022-03-12 09:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 09:10:00,2022-03-12 09:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 09:19:00,2022-03-12 09:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 09:30:00,2022-03-12 09:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 09:39:00,2022-03-12 09:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 09:50:00,2022-03-12 09:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 09:59:00,2022-03-12 10:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 10:10:00,2022-03-12 10:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 10:19:00,2022-03-12 10:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 10:30:00,2022-03-12 10:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 10:39:00,2022-03-12 10:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 10:50:00,2022-03-12 10:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 10:59:00,2022-03-12 11:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 11:10:00,2022-03-12 11:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 11:19:00,2022-03-12 11:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 11:30:00,2022-03-12 11:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 11:39:00,2022-03-12 11:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 11:50:00,2022-03-12 11:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 11:59:00,2022-03-12 12:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 12:10:00,2022-03-12 12:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 12:19:00,2022-03-12 12:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 12:30:00,2022-03-12 12:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 12:39:00,2022-03-12 12:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 12:50:00,2022-03-12 12:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 12:59:00,2022-03-12 13:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 13:10:00,2022-03-12 13:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 13:19:00,2022-03-12 13:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 13:30:00,2022-03-12 13:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 13:39:00,2022-03-12 13:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 13:50:00,2022-03-12 13:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 13:59:00,2022-03-12 14:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 14:10:00,2022-03-12 14:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 14:19:00,2022-03-12 14:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 14:30:00,2022-03-12 14:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 14:39:00,2022-03-12 14:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 14:50:00,2022-03-12 14:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 14:59:00,2022-03-12 15:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 15:10:00,2022-03-12 15:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 15:19:00,2022-03-12 15:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 15:30:00,2022-03-12 15:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 15:39:00,2022-03-12 15:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 15:50:00,2022-03-12 15:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 15:59:00,2022-03-12 16:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 16:10:00,2022-03-12 16:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 16:19:00,2022-03-12 16:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 16:30:00,2022-03-12 16:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 16:39:00,2022-03-12 16:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 16:50:00,2022-03-12 16:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 16:59:00,2022-03-12 17:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 17:10:00,2022-03-12 17:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 17:19:00,2022-03-12 17:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 17:30:00,2022-03-12 17:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 17:39:00,2022-03-12 17:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 17:50:00,2022-03-12 17:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 17:59:00,2022-03-12 18:10:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 18:10:00,2022-03-12 18:15:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 18:19:00,2022-03-12 18:30:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 18:30:00,2022-03-12 18:35:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 18:39:00,2022-03-12 18:50:00,Station-53,4341,0,183,CKB +LINE_29,Station-53,2022-03-12 18:50:00,2022-03-12 18:55:00,Station-54,2217,4,183,CKB +LINE_29,Station-54,2022-03-12 18:59:00,2022-03-12 19:10:00,Station-53,4288,0,183,CKB +LINE_29,Station-53,2022-03-12 19:10:00,2022-03-12 19:10:00,Station-0,0.06,0,183,CKB +LINE_9,Station-22,2022-03-12 08:08:00,2022-03-12 08:41:00,Station-23,17.9,0,184,VDL +LINE_9,Station-23,2022-03-12 08:41:00,2022-03-12 08:54:00,Station-23,4637,9,184,VDL +LINE_9,Station-23,2022-03-12 09:03:00,2022-03-12 09:17:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 09:21:00,2022-03-12 09:35:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 09:43:00,2022-03-12 09:57:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 10:01:00,2022-03-12 10:15:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 10:23:00,2022-03-12 10:37:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 10:41:00,2022-03-12 10:55:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 11:03:00,2022-03-12 11:17:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 11:21:00,2022-03-12 11:35:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 11:43:00,2022-03-12 11:57:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 12:01:00,2022-03-12 12:15:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 12:23:00,2022-03-12 12:37:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 12:41:00,2022-03-12 12:55:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 13:03:00,2022-03-12 13:17:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 13:21:00,2022-03-12 13:35:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 13:43:00,2022-03-12 13:57:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 14:01:00,2022-03-12 14:15:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 14:23:00,2022-03-12 14:37:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 14:41:00,2022-03-12 14:55:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 15:03:00,2022-03-12 15:17:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 15:21:00,2022-03-12 15:35:00,Station-23,4637,8,184,VDL +LINE_9,Station-23,2022-03-12 15:43:00,2022-03-12 15:57:00,Station-23,4637,4,184,VDL +LINE_9,Station-23,2022-03-12 16:01:00,2022-03-12 16:14:00,Station-23,4637,0,184,VDL +LINE_9,Station-23,2022-03-12 16:14:00,2022-03-12 16:57:00,Station-22,19.8,0,184,VDL +LINE_30,Station-0,2022-03-12 07:18:00,2022-03-12 07:18:00,Station-55,0.06,0,185,CKB +LINE_30,Station-55,2022-03-12 07:18:00,2022-03-12 07:26:00,Station-56,5562,10,185,CKB +LINE_30,Station-56,2022-03-12 07:36:00,2022-03-12 07:45:00,Station-57,5941,32,185,CKB +LINE_30,Station-57,2022-03-12 08:17:00,2022-03-12 08:26:00,Station-56,5994,8,185,CKB +LINE_30,Station-56,2022-03-12 08:34:00,2022-03-12 08:42:00,Station-55,5566,0,185,CKB +LINE_30,Station-55,2022-03-12 08:42:00,2022-03-12 08:42:00,Station-0,0.06,0,185,CKB +LINE_12,Station-0,2022-03-12 08:10:00,2022-03-12 08:10:00,Station-27,0.06,0,186,CKB +LINE_12,Station-27,2022-03-12 08:10:00,2022-03-12 08:16:00,Station-28,2169,12,186,CKB +LINE_12,Station-28,2022-03-12 08:28:00,2022-03-12 08:38:00,Station-27,2952,2,186,CKB +LINE_12,Station-27,2022-03-12 08:40:00,2022-03-12 08:46:00,Station-28,2169,12,186,CKB +LINE_12,Station-28,2022-03-12 08:58:00,2022-03-12 09:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 09:10:00,2022-03-12 09:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 09:28:00,2022-03-12 09:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 09:40:00,2022-03-12 09:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 09:58:00,2022-03-12 10:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 10:10:00,2022-03-12 10:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 10:28:00,2022-03-12 10:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 10:40:00,2022-03-12 10:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 10:58:00,2022-03-12 11:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 11:10:00,2022-03-12 11:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 11:28:00,2022-03-12 11:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 11:40:00,2022-03-12 11:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 11:58:00,2022-03-12 12:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 12:10:00,2022-03-12 12:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 12:28:00,2022-03-12 12:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 12:40:00,2022-03-12 12:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 12:58:00,2022-03-12 13:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 13:10:00,2022-03-12 13:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 13:28:00,2022-03-12 13:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 13:40:00,2022-03-12 13:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 13:58:00,2022-03-12 14:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 14:10:00,2022-03-12 14:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 14:28:00,2022-03-12 14:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 14:40:00,2022-03-12 14:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 14:58:00,2022-03-12 15:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 15:10:00,2022-03-12 15:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 15:28:00,2022-03-12 15:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 15:40:00,2022-03-12 15:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 15:58:00,2022-03-12 16:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 16:10:00,2022-03-12 16:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 16:28:00,2022-03-12 16:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 16:40:00,2022-03-12 16:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 16:58:00,2022-03-12 17:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 17:10:00,2022-03-12 17:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 17:28:00,2022-03-12 17:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 17:40:00,2022-03-12 17:48:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 17:58:00,2022-03-12 18:10:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 18:10:00,2022-03-12 18:18:00,Station-28,2169,10,186,CKB +LINE_12,Station-28,2022-03-12 18:28:00,2022-03-12 18:40:00,Station-27,2952,0,186,CKB +LINE_12,Station-27,2022-03-12 18:40:00,2022-03-12 18:48:00,Station-28,2169,0,186,CKB +LINE_12,Station-28,2022-03-12 18:48:00,2022-03-12 18:48:00,Station-0,0.06,0,186,CKB +LINE_13,Station-0,2022-03-13 00:23:00,2022-03-13 00:23:00,Station-29,0.06,0,187,CKB +LINE_13,Station-29,2022-03-13 00:23:00,2022-03-13 00:30:00,Station-30,2577,9,187,CKB +LINE_14,Station-30,2022-03-13 00:39:00,2022-03-13 00:54:00,Station-31,5937,9,187,CKB +LINE_14,Station-31,2022-03-13 01:03:00,2022-03-13 01:17:00,Station-30,6.19,0,187,CKB +LINE_13,Station-30,2022-03-13 01:17:00,2022-03-13 01:23:00,Station-29,2555,0,187,CKB +LINE_13,Station-29,2022-03-13 01:23:00,2022-03-13 01:30:00,Station-30,2577,9,187,CKB +LINE_14,Station-30,2022-03-13 01:39:00,2022-03-13 01:54:00,Station-31,5937,9,187,CKB +LINE_14,Station-31,2022-03-13 02:03:00,2022-03-13 02:17:00,Station-30,6.19,0,187,CKB +LINE_13,Station-30,2022-03-13 02:17:00,2022-03-13 02:23:00,Station-29,2555,0,187,CKB +LINE_13,Station-29,2022-03-13 02:23:00,2022-03-13 02:30:00,Station-30,2577,9,187,CKB +LINE_14,Station-30,2022-03-13 02:39:00,2022-03-13 02:54:00,Station-31,5937,9,187,CKB +LINE_14,Station-31,2022-03-13 03:03:00,2022-03-13 03:17:00,Station-30,6.19,0,187,CKB +LINE_13,Station-30,2022-03-13 03:17:00,2022-03-13 03:23:00,Station-29,2555,0,187,CKB +LINE_13,Station-29,2022-03-13 03:23:00,2022-03-13 03:30:00,Station-30,2577,9,187,CKB +LINE_14,Station-30,2022-03-13 03:39:00,2022-03-13 03:54:00,Station-31,5937,9,187,CKB +LINE_14,Station-31,2022-03-13 04:03:00,2022-03-13 04:17:00,Station-30,6.19,0,187,CKB +LINE_13,Station-30,2022-03-13 04:17:00,2022-03-13 04:23:00,Station-29,2555,0,187,CKB +LINE_13,Station-29,2022-03-13 04:23:00,2022-03-13 04:30:00,Station-30,2577,9,187,CKB +LINE_14,Station-30,2022-03-13 04:39:00,2022-03-13 04:54:00,Station-31,5937,9,187,CKB +LINE_14,Station-31,2022-03-13 05:03:00,2022-03-13 05:17:00,Station-30,6.19,0,187,CKB +LINE_13,Station-30,2022-03-13 05:17:00,2022-03-13 05:23:00,Station-29,2555,0,187,CKB +LINE_13,Station-29,2022-03-13 05:23:00,2022-03-13 05:30:00,Station-30,2577,9,187,CKB +LINE_14,Station-30,2022-03-13 05:39:00,2022-03-13 05:54:00,Station-31,5937,9,187,CKB +LINE_14,Station-31,2022-03-13 06:03:00,2022-03-13 06:17:00,Station-30,6.19,0,187,CKB +LINE_13,Station-30,2022-03-13 06:17:00,2022-03-13 06:23:00,Station-29,2555,0,187,CKB +LINE_13,Station-29,2022-03-13 06:23:00,2022-03-13 06:30:00,Station-30,2577,9,187,CKB +LINE_14,Station-30,2022-03-13 06:39:00,2022-03-13 06:54:00,Station-31,5937,0,187,CKB +LINE_14,Station-31,2022-03-13 06:54:00,2022-03-13 06:54:00,Station-0,0.06,0,187,CKB +LINE_14,Station-0,2022-03-13 00:33:00,2022-03-13 00:33:00,Station-31,0.06,0,188,CKB +LINE_14,Station-31,2022-03-13 00:33:00,2022-03-13 00:47:00,Station-30,6.19,0,188,CKB +LINE_13,Station-30,2022-03-13 00:47:00,2022-03-13 00:53:00,Station-29,2555,0,188,CKB +LINE_13,Station-29,2022-03-13 00:53:00,2022-03-13 01:00:00,Station-30,2577,9,188,CKB +LINE_14,Station-30,2022-03-13 01:09:00,2022-03-13 01:24:00,Station-31,5937,9,188,CKB +LINE_14,Station-31,2022-03-13 01:33:00,2022-03-13 01:47:00,Station-30,6.19,0,188,CKB +LINE_13,Station-30,2022-03-13 01:47:00,2022-03-13 01:53:00,Station-29,2555,0,188,CKB +LINE_13,Station-29,2022-03-13 01:53:00,2022-03-13 02:00:00,Station-30,2577,9,188,CKB +LINE_14,Station-30,2022-03-13 02:09:00,2022-03-13 02:24:00,Station-31,5937,9,188,CKB +LINE_14,Station-31,2022-03-13 02:33:00,2022-03-13 02:47:00,Station-30,6.19,0,188,CKB +LINE_13,Station-30,2022-03-13 02:47:00,2022-03-13 02:53:00,Station-29,2555,0,188,CKB +LINE_13,Station-29,2022-03-13 02:53:00,2022-03-13 03:00:00,Station-30,2577,9,188,CKB +LINE_14,Station-30,2022-03-13 03:09:00,2022-03-13 03:24:00,Station-31,5937,9,188,CKB +LINE_14,Station-31,2022-03-13 03:33:00,2022-03-13 03:47:00,Station-30,6.19,0,188,CKB +LINE_13,Station-30,2022-03-13 03:47:00,2022-03-13 03:53:00,Station-29,2555,0,188,CKB +LINE_13,Station-29,2022-03-13 03:53:00,2022-03-13 04:00:00,Station-30,2577,9,188,CKB +LINE_14,Station-30,2022-03-13 04:09:00,2022-03-13 04:24:00,Station-31,5937,9,188,CKB +LINE_14,Station-31,2022-03-13 04:33:00,2022-03-13 04:47:00,Station-30,6.19,0,188,CKB +LINE_13,Station-30,2022-03-13 04:47:00,2022-03-13 04:53:00,Station-29,2555,0,188,CKB +LINE_13,Station-29,2022-03-13 04:53:00,2022-03-13 05:00:00,Station-30,2577,9,188,CKB +LINE_14,Station-30,2022-03-13 05:09:00,2022-03-13 05:24:00,Station-31,5937,9,188,CKB +LINE_14,Station-31,2022-03-13 05:33:00,2022-03-13 05:47:00,Station-30,6.19,0,188,CKB +LINE_13,Station-30,2022-03-13 05:47:00,2022-03-13 05:53:00,Station-29,2555,0,188,CKB +LINE_13,Station-29,2022-03-13 05:53:00,2022-03-13 06:00:00,Station-30,2577,9,188,CKB +LINE_14,Station-30,2022-03-13 06:09:00,2022-03-13 06:24:00,Station-31,5937,9,188,CKB +LINE_14,Station-31,2022-03-13 06:33:00,2022-03-13 06:47:00,Station-30,6.19,0,188,CKB +LINE_14,Station-30,2022-03-13 06:47:00,2022-03-13 06:47:00,Station-0,0.06,0,188,CKB +LINE_15,Station-0,2022-03-13 00:57:00,2022-03-13 00:57:00,Station-32,0.06,0,189,CKB +LINE_15,Station-32,2022-03-13 00:57:00,2022-03-13 01:06:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 01:06:00,2022-03-13 01:11:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 01:27:00,2022-03-13 01:36:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 01:36:00,2022-03-13 01:41:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 01:57:00,2022-03-13 02:06:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 02:06:00,2022-03-13 02:11:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 02:27:00,2022-03-13 02:36:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 02:36:00,2022-03-13 02:41:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 02:57:00,2022-03-13 03:06:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 03:06:00,2022-03-13 03:11:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 03:27:00,2022-03-13 03:36:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 03:36:00,2022-03-13 03:41:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 03:57:00,2022-03-13 04:06:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 04:06:00,2022-03-13 04:11:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 04:27:00,2022-03-13 04:36:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 04:36:00,2022-03-13 04:41:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 04:57:00,2022-03-13 05:06:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 05:06:00,2022-03-13 05:11:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 05:27:00,2022-03-13 05:36:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 05:36:00,2022-03-13 05:41:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 05:57:00,2022-03-13 06:06:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 06:06:00,2022-03-13 06:11:00,Station-32,2936,16,189,CKB +LINE_15,Station-32,2022-03-13 06:27:00,2022-03-13 06:36:00,Station-33,4343,0,189,CKB +LINE_15,Station-33,2022-03-13 06:36:00,2022-03-13 06:41:00,Station-32,2936,0,189,CKB +LINE_15,Station-32,2022-03-13 06:41:00,2022-03-13 06:41:00,Station-0,0.06,0,189,CKB +LINE_17,Station-0,2022-03-13 00:30:00,2022-03-13 00:30:00,Station-34,0.06,0,190,CKB +LINE_17,Station-34,2022-03-13 00:30:00,2022-03-13 00:44:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 00:44:00,2022-03-13 00:57:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 01:00:00,2022-03-13 01:14:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 01:14:00,2022-03-13 01:27:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 01:30:00,2022-03-13 01:44:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 01:44:00,2022-03-13 01:57:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 02:00:00,2022-03-13 02:14:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 02:14:00,2022-03-13 02:27:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 02:30:00,2022-03-13 02:44:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 02:44:00,2022-03-13 02:57:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 03:00:00,2022-03-13 03:14:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 03:14:00,2022-03-13 03:27:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 03:30:00,2022-03-13 03:44:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 03:44:00,2022-03-13 03:57:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 04:00:00,2022-03-13 04:14:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 04:14:00,2022-03-13 04:27:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 04:30:00,2022-03-13 04:44:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 04:44:00,2022-03-13 04:57:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 05:00:00,2022-03-13 05:14:00,Station-36,4801,0,190,CKB +LINE_17,Station-36,2022-03-13 05:14:00,2022-03-13 05:27:00,Station-34,5302,3,190,CKB +LINE_17,Station-34,2022-03-13 05:30:00,2022-03-13 05:44:00,Station-36,4.8,0,190,CKB +LINE_17,Station-36,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-34,5301,4,190,CKB +LINE_17,Station-34,2022-03-13 06:00:00,2022-03-13 06:14:00,Station-36,4.8,0,190,CKB +LINE_17,Station-36,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-34,5301,4,190,CKB +LINE_17,Station-34,2022-03-13 06:30:00,2022-03-13 06:44:00,Station-36,4.8,0,190,CKB +LINE_17,Station-36,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-34,5301,0,190,CKB +LINE_17,Station-34,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,190,CKB +LINE_20,Station-0,2022-03-13 00:32:00,2022-03-13 00:32:00,Station-13,0.06,0,191,CKB +LINE_20,Station-13,2022-03-13 00:32:00,2022-03-13 00:44:00,Station-40,4212,3,191,CKB +LINE_20,Station-40,2022-03-13 00:47:00,2022-03-13 01:16:00,Station-41,13048,0,191,CKB +LINE_20,Station-41,2022-03-13 01:16:00,2022-03-13 01:42:00,Station-40,12869,5,191,CKB +LINE_20,Station-40,2022-03-13 01:47:00,2022-03-13 02:16:00,Station-41,13048,0,191,CKB +LINE_20,Station-41,2022-03-13 02:16:00,2022-03-13 02:42:00,Station-40,12869,5,191,CKB +LINE_20,Station-40,2022-03-13 02:47:00,2022-03-13 03:16:00,Station-41,13048,0,191,CKB +LINE_20,Station-41,2022-03-13 03:16:00,2022-03-13 03:42:00,Station-40,12869,5,191,CKB +LINE_20,Station-40,2022-03-13 03:47:00,2022-03-13 04:16:00,Station-41,13048,0,191,CKB +LINE_20,Station-41,2022-03-13 04:16:00,2022-03-13 04:42:00,Station-40,12869,5,191,CKB +LINE_20,Station-40,2022-03-13 04:47:00,2022-03-13 05:16:00,Station-41,13048,0,191,CKB +LINE_20,Station-41,2022-03-13 05:16:00,2022-03-13 05:42:00,Station-40,12869,5,191,CKB +LINE_20,Station-40,2022-03-13 05:47:00,2022-03-13 06:16:00,Station-41,13048,0,191,CKB +LINE_20,Station-41,2022-03-13 06:16:00,2022-03-13 06:42:00,Station-40,12869,0,191,CKB +LINE_20,Station-40,2022-03-13 06:42:00,2022-03-13 06:42:00,Station-0,0.06,0,191,CKB +LINE_20,Station-0,2022-03-13 00:17:00,2022-03-13 00:17:00,Station-40,0.06,0,192,CKB +LINE_20,Station-40,2022-03-13 00:17:00,2022-03-13 00:46:00,Station-41,13048,0,192,CKB +LINE_20,Station-41,2022-03-13 00:46:00,2022-03-13 01:12:00,Station-40,12869,5,192,CKB +LINE_20,Station-40,2022-03-13 01:17:00,2022-03-13 01:46:00,Station-41,13048,0,192,CKB +LINE_20,Station-41,2022-03-13 01:46:00,2022-03-13 02:12:00,Station-40,12869,5,192,CKB +LINE_20,Station-40,2022-03-13 02:17:00,2022-03-13 02:46:00,Station-41,13048,0,192,CKB +LINE_20,Station-41,2022-03-13 02:46:00,2022-03-13 03:12:00,Station-40,12869,5,192,CKB +LINE_20,Station-40,2022-03-13 03:17:00,2022-03-13 03:46:00,Station-41,13048,0,192,CKB +LINE_20,Station-41,2022-03-13 03:46:00,2022-03-13 04:12:00,Station-40,12869,5,192,CKB +LINE_20,Station-40,2022-03-13 04:17:00,2022-03-13 04:46:00,Station-41,13048,0,192,CKB +LINE_20,Station-41,2022-03-13 04:46:00,2022-03-13 05:12:00,Station-40,12869,5,192,CKB +LINE_20,Station-40,2022-03-13 05:17:00,2022-03-13 05:46:00,Station-41,13048,0,192,CKB +LINE_20,Station-41,2022-03-13 05:46:00,2022-03-13 06:12:00,Station-40,12869,5,192,CKB +LINE_20,Station-40,2022-03-13 06:17:00,2022-03-13 06:46:00,Station-41,13048,0,192,CKB +LINE_20,Station-41,2022-03-13 06:46:00,2022-03-13 07:12:00,Station-40,12869,0,192,CKB +LINE_20,Station-40,2022-03-13 07:12:00,2022-03-13 07:12:00,Station-0,0.06,0,192,CKB +LINE_21,Station-0,2022-03-13 00:49:00,2022-03-13 00:49:00,Station-3,0.06,0,193,CKB +LINE_21,Station-3,2022-03-13 00:49:00,2022-03-13 01:04:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 01:04:00,2022-03-13 01:19:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 01:19:00,2022-03-13 01:34:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 01:34:00,2022-03-13 01:49:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 01:49:00,2022-03-13 02:04:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 02:04:00,2022-03-13 02:19:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 02:19:00,2022-03-13 02:34:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 02:34:00,2022-03-13 02:49:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 02:49:00,2022-03-13 03:04:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 03:04:00,2022-03-13 03:19:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 03:19:00,2022-03-13 03:34:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 03:34:00,2022-03-13 03:49:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 03:49:00,2022-03-13 04:04:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 04:04:00,2022-03-13 04:19:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 04:19:00,2022-03-13 04:34:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 04:34:00,2022-03-13 04:49:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 04:49:00,2022-03-13 05:04:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 05:04:00,2022-03-13 05:19:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 05:19:00,2022-03-13 05:34:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 05:34:00,2022-03-13 05:49:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 05:49:00,2022-03-13 06:04:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 06:04:00,2022-03-13 06:19:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 06:19:00,2022-03-13 06:34:00,Station-16,10229,0,193,CKB +LINE_21,Station-16,2022-03-13 06:34:00,2022-03-13 06:49:00,Station-3,11801,0,193,CKB +LINE_21,Station-3,2022-03-13 06:49:00,2022-03-13 06:49:00,Station-0,0.06,0,193,CKB +LINE_23,Station-0,2022-03-13 02:34:00,2022-03-13 02:34:00,Station-45,0.06,0,194,CKB +LINE_23,Station-45,2022-03-13 02:34:00,2022-03-13 03:00:00,Station-46,9016,0,194,CKB +LINE_23,Station-46,2022-03-13 03:00:00,2022-03-13 03:27:00,Station-45,10083,7,194,CKB +LINE_23,Station-45,2022-03-13 03:34:00,2022-03-13 04:00:00,Station-46,9016,0,194,CKB +LINE_23,Station-46,2022-03-13 04:00:00,2022-03-13 04:27:00,Station-45,10083,7,194,CKB +LINE_23,Station-45,2022-03-13 04:34:00,2022-03-13 05:00:00,Station-46,9016,0,194,CKB +LINE_23,Station-46,2022-03-13 05:00:00,2022-03-13 05:27:00,Station-45,10083,7,194,CKB +LINE_23,Station-45,2022-03-13 05:34:00,2022-03-13 06:00:00,Station-46,9016,0,194,CKB +LINE_23,Station-46,2022-03-13 06:00:00,2022-03-13 06:27:00,Station-45,10083,7,194,CKB +LINE_23,Station-45,2022-03-13 06:34:00,2022-03-13 07:00:00,Station-46,9016,0,194,CKB +LINE_23,Station-46,2022-03-13 07:00:00,2022-03-13 07:00:00,Station-0,0.06,0,194,CKB +LINE_23,Station-0,2022-03-13 02:04:00,2022-03-13 02:04:00,Station-45,0.06,0,195,CKB +LINE_23,Station-45,2022-03-13 02:04:00,2022-03-13 02:30:00,Station-46,9016,0,195,CKB +LINE_23,Station-46,2022-03-13 02:30:00,2022-03-13 02:57:00,Station-45,10083,7,195,CKB +LINE_23,Station-45,2022-03-13 03:04:00,2022-03-13 03:30:00,Station-46,9016,0,195,CKB +LINE_23,Station-46,2022-03-13 03:30:00,2022-03-13 03:57:00,Station-45,10083,7,195,CKB +LINE_23,Station-45,2022-03-13 04:04:00,2022-03-13 04:30:00,Station-46,9016,0,195,CKB +LINE_23,Station-46,2022-03-13 04:30:00,2022-03-13 04:57:00,Station-45,10083,7,195,CKB +LINE_23,Station-45,2022-03-13 05:04:00,2022-03-13 05:30:00,Station-46,9016,0,195,CKB +LINE_23,Station-46,2022-03-13 05:30:00,2022-03-13 05:57:00,Station-45,10083,7,195,CKB +LINE_23,Station-45,2022-03-13 06:04:00,2022-03-13 06:30:00,Station-46,9016,0,195,CKB +LINE_23,Station-46,2022-03-13 06:30:00,2022-03-13 06:57:00,Station-45,10083,0,195,CKB +LINE_23,Station-45,2022-03-13 06:57:00,2022-03-13 06:57:00,Station-0,0.06,0,195,CKB +LINE_24,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,196,CKB +LINE_24,Station-21,2022-03-13 00:31:00,2022-03-13 00:44:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 00:44:00,2022-03-13 00:56:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 01:01:00,2022-03-13 01:14:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 01:14:00,2022-03-13 01:26:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 01:31:00,2022-03-13 01:44:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 01:44:00,2022-03-13 01:56:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 02:01:00,2022-03-13 02:14:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 02:14:00,2022-03-13 02:26:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 02:31:00,2022-03-13 02:44:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 02:44:00,2022-03-13 02:56:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 03:01:00,2022-03-13 03:14:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 03:14:00,2022-03-13 03:26:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 03:31:00,2022-03-13 03:44:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 03:44:00,2022-03-13 03:56:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 04:01:00,2022-03-13 04:14:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 04:14:00,2022-03-13 04:26:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 04:31:00,2022-03-13 04:44:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 04:44:00,2022-03-13 04:56:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 05:01:00,2022-03-13 05:14:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 05:14:00,2022-03-13 05:26:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 05:31:00,2022-03-13 05:44:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 06:01:00,2022-03-13 06:14:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-21,5362,5,196,CKB +LINE_24,Station-21,2022-03-13 06:31:00,2022-03-13 06:44:00,Station-47,4872,0,196,CKB +LINE_24,Station-47,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-21,5362,0,196,CKB +LINE_24,Station-21,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,196,CKB +LINE_25,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,197,CKB +LINE_25,Station-21,2022-03-13 00:31:00,2022-03-13 00:45:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 00:47:00,2022-03-13 01:01:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 01:01:00,2022-03-13 01:15:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 01:17:00,2022-03-13 01:31:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 01:31:00,2022-03-13 01:45:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 01:47:00,2022-03-13 02:01:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 02:01:00,2022-03-13 02:15:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 02:17:00,2022-03-13 02:31:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 02:31:00,2022-03-13 02:45:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 02:47:00,2022-03-13 03:01:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 03:01:00,2022-03-13 03:15:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 03:17:00,2022-03-13 03:31:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 03:31:00,2022-03-13 03:45:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 03:47:00,2022-03-13 04:01:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 04:01:00,2022-03-13 04:15:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 04:17:00,2022-03-13 04:31:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 04:31:00,2022-03-13 04:45:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 04:47:00,2022-03-13 05:01:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 05:01:00,2022-03-13 05:15:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 05:17:00,2022-03-13 05:31:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 05:31:00,2022-03-13 05:45:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 05:47:00,2022-03-13 06:01:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 06:01:00,2022-03-13 06:15:00,Station-48,5225,2,197,CKB +LINE_25,Station-48,2022-03-13 06:17:00,2022-03-13 06:31:00,Station-21,7617,0,197,CKB +LINE_25,Station-21,2022-03-13 06:31:00,2022-03-13 06:45:00,Station-48,5096,0,197,CKB +LINE_25,Station-48,2022-03-13 06:45:00,2022-03-13 06:45:00,Station-0,0.06,0,197,CKB +LINE_26,Station-0,2022-03-13 00:43:00,2022-03-13 00:43:00,Station-49,0.06,0,198,CKB +LINE_26,Station-49,2022-03-13 00:43:00,2022-03-13 00:53:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 00:53:00,2022-03-13 01:03:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 01:13:00,2022-03-13 01:23:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 01:23:00,2022-03-13 01:33:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 01:43:00,2022-03-13 01:53:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 01:53:00,2022-03-13 02:03:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 02:13:00,2022-03-13 02:23:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 02:23:00,2022-03-13 02:33:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 02:43:00,2022-03-13 02:53:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 02:53:00,2022-03-13 03:03:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 03:13:00,2022-03-13 03:23:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 03:23:00,2022-03-13 03:33:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 03:43:00,2022-03-13 03:53:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 03:53:00,2022-03-13 04:03:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 04:13:00,2022-03-13 04:23:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 04:23:00,2022-03-13 04:33:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 04:43:00,2022-03-13 04:53:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 04:53:00,2022-03-13 05:03:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 05:13:00,2022-03-13 05:23:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 05:23:00,2022-03-13 05:33:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 05:43:00,2022-03-13 05:53:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 05:53:00,2022-03-13 06:03:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 06:13:00,2022-03-13 06:23:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 06:23:00,2022-03-13 06:33:00,Station-49,4408,10,198,CKB +LINE_26,Station-49,2022-03-13 06:43:00,2022-03-13 06:53:00,Station-50,4507,0,198,CKB +LINE_26,Station-50,2022-03-13 06:53:00,2022-03-13 07:03:00,Station-49,4408,0,198,CKB +LINE_26,Station-49,2022-03-13 07:03:00,2022-03-13 07:03:00,Station-0,0.06,0,198,CKB From 7b3b4def0ad30140e03619cef4f8b6eef134fa51 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Apr 2022 19:01:56 +0200 Subject: [PATCH 132/802] change structure of electrified_stations.json --- data/examples/electrified_stations.json | 57 +++++++++++++++++++------ ebus_toolbox/schedule.py | 15 +++---- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 0849c795..9dd877c5 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -1,17 +1,46 @@ { - "opp_stations": { - "Station-3": 3, - "Station-10": 1, - "Station-21": 2, - "Station-26": 5, - "Station-28": 4, - "Station-30": 4, - "Station-32": 3, - "Station-39": 5 - }, - "depot_stations": { - "Station-0": "None", - "Station-22": "None", - "Station-42": "None" + "Station-0": { + "type": "deps", + "n_charging_stations": "None" + }, + "Station-3": { + "type": "opps", + "n_charging_stations": 3 + }, + "Station-10": { + "type": "opps", + "n_charging_stations": 1 + }, + "Station-21": { + "type": "opps", + "n_charging_stations": 2 + }, + "Station-22": { + "type": "deps", + "n_charging_stations": "None" + }, + "Station-26": { + "type": "opps", + "n_charging_stations": 5 + }, + "Station-28": { + "type": "opps", + "n_charging_stations": 4 + }, + "Station-30": { + "type": "opps", + "n_charging_stations": 4 + }, + "Station-32": { + "type": "opps", + "n_charging_stations": 3 + }, + "Station-39": { + "type": "opps", + "n_charging_stations": 5 + }, + "Station-42": { + "type": "deps", + "n_charging_stations": "None" } } \ No newline at end of file diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c680472b..2eccc097 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -317,14 +317,12 @@ def generate_scenario_json(self, args): # connect cs and add gc if station is electrified connected_charging_station = None - if gc_name in stations_dict["depot_stations"]: - station_type = "deps" - desired_soc = args.desired_soc - elif gc_name in stations_dict["opp_stations"] and ct == "oppb": - station_type = "opps" - desired_soc = 1 + + if gc_name in stations_dict.keys(): + # electrified station + station_type = stations_dict[gc_name]["type"] + desired_soc = 1 if station_type == "opps" else args.desired_soc else: - # either station has no charger or current bus cannot charge at this station station_type = None desired_soc = 0 @@ -339,13 +337,12 @@ def generate_scenario_json(self, args): connected_charging_station = cs_name_and_type if cs_name not in charging_stations or gc_name not in grid_connectors: + number_cs = stations_dict[gc_name]["n_charging_stations"] if station_type == "deps": - number_cs = stations_dict["depot_stations"][gc_name] cs_power = args.cs_power_deps_oppb if ct == 'oppb' \ else args.cs_power_deps_depb gc_power = args.gc_power_deps elif station_type == "opps": - number_cs = stations_dict["opp_stations"][gc_name] cs_power = args.cs_power_opps gc_power = args.gc_power_opps From bda3a516179300fcbd1a9f2efd186b17e0cd50d0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 2 May 2022 13:02:51 +0200 Subject: [PATCH 133/802] write rotations overview to file --- ebus_toolbox/report.py | 4 ++-- ebus_toolbox/rotation.py | 6 ++++++ ebus_toolbox/schedule.py | 32 ++++++++++++++++++++++++++++++++ ebus_toolbox/simulate.py | 5 +++-- ebus_toolbox/trip.py | 1 + 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 4f93e7e0..1bdf9c43 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -2,5 +2,5 @@ """ -def generate(): - pass +def generate(schedule, args): + schedule.generate_rotations_overview(args) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 29eb20b2..4e7de899 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -12,6 +12,8 @@ def __init__(self, id, vehicle_type) -> None: self.charging_type = 'depb' self.consumption = 0 + self.distance = 0 + self.lines = set() self.departure_time = None self.departure_name = None @@ -26,6 +28,10 @@ def add_trip(self, trip): """ new_trip = Trip(self, **trip) + self.distance += new_trip.distance + if new_trip.line: + self.lines.add(new_trip.line) + if self.departure_time is None and self.arrival_time is None: # first trip added self.departure_time = new_trip.departure_time diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 2eccc097..10fd9db5 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -152,6 +152,7 @@ def assign_vehicles(self): def calculate_consumption(self): """ Computes consumption for all trips of all rotations. + Depends on vehicle type only, not on charging type. :return: Total consumption for entire schedule [kWh] :rtype: float @@ -163,6 +164,11 @@ def calculate_consumption(self): return self.consumption def delta_soc_all_trips(self): + """ Computes delta SOC for all trips of all rotations. + Depends on vehicle type and on charging type, since + busses of the same vehicle type may have different + battery sizes for different charging types.""" + for rot in self.rotations.values(): rot.delta_soc_all_trips() @@ -535,3 +541,29 @@ def generate_scenario_json(self, args): makedirs(args.output_directory, exist_ok=True) with open(args.input, 'w+') as f: json.dump(j, f, indent=2) + + def generate_rotations_overview(self, args): + rotation_infos = [] + negative_rotations = self.get_negative_rotations(args) + for id, rotation in self.rotations.items(): + rotation_info = { + "rotation_id": id, + "start_time": rotation.departure_time, + "end_time": rotation.arrival_time, + "vehicle_type": rotation.vehicle_type, + "depot_name": rotation.departure_time, + "lines": ':'.join(rotation.lines), + "total_consumption_[kWh]": rotation.consumption, + "distance": rotation.distance, + "charging_type": rotation.charging_type, + # TODO: Read SOC values from spice_ev outputs + "SOC_at_arrival": 0, + "Minumum_SOC": 0, + "Negative_SOC": 1 if id in negative_rotations else 0 + } + rotation_infos.append(rotation_info) + + with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: + csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) + csv_writer.writeheader() + csv_writer.writerows(rotation_infos) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1d007dc6..7ff35548 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -36,10 +36,11 @@ def simulate(args): # if optimizer None, quit after single iteration schedule.delta_soc_all_trips() schedule.assign_vehicles() + + # RUN SPICE EV # write trips to csv in spiceEV format schedule.generate_scenario_json(args) - # RUN SPICE EV print("Running Spice EV...") with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) @@ -53,4 +54,4 @@ def simulate(args): print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") # create report - report.generate() + report.generate(schedule, args) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 9ba91f39..9ad4f498 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -10,6 +10,7 @@ def __init__(self, rotation, departure_time, departure_name, self.arrival_time = datetime.fromisoformat(arrival_time) self.arrival_name = arrival_name self.distance = float(distance) + self.line = kwargs.get('line', None) # Attention: Circular reference! # While a rotation carries a references to this trip, this trip From 6ed1f1d7df8d23b701cc213de0dcac1e5f5c9837 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 2 May 2022 18:42:40 +0200 Subject: [PATCH 134/802] adapt config to example CSV --- data/configs/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 93e8c6ab..477ce08b 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -69,7 +69,7 @@ cs_power_deps_oppb = 150 #battery = [[50, 1]] # 2 batteries with capacity = 50 kWh, C-Rate = 1, grid_connector = "Betriebshof A") -#battery = [[50, 1, "DEPS_1"]] +#battery = [[50, 1, "Station-0"]] # unlimited battery capacity with constant (dis)charge of 50 kWh #battery = [[-1, 50]] From e73e8ddfa5ed9ca021979105d2a993629d55185f Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 2 May 2022 18:45:50 +0200 Subject: [PATCH 135/802] bug fix --- ebus_toolbox/schedule.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 10fd9db5..87bf1f0e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -105,9 +105,9 @@ def set_charging_type(self, preferred_ct, args, rotation_ids=None): def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. - For every rotation it is checked whether vehicles with matching type are idle, in which - case the one with longest standing time since last rotation is used. - If no vehicle is available a new vehicle ID is generated. + For every rotation it is checked whether vehicles with matching type are idle, in which + case the one with longest standing time since last rotation is used. + If no vehicle is available a new vehicle ID is generated. """ rotations_in_progress = [] idle_vehicles = [] @@ -551,7 +551,8 @@ def generate_rotations_overview(self, args): "start_time": rotation.departure_time, "end_time": rotation.arrival_time, "vehicle_type": rotation.vehicle_type, - "depot_name": rotation.departure_time, + "vehicle_id": rotation.vehicle_id, + "depot_name": rotation.departure_name, "lines": ':'.join(rotation.lines), "total_consumption_[kWh]": rotation.consumption, "distance": rotation.distance, From a14a4a06fcb37f17ef4fe6a67ba3f1de9321e41b Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 2 May 2022 18:57:24 +0200 Subject: [PATCH 136/802] change rotations.csv delimiter to semicolon --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 87bf1f0e..3dda99a1 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -565,6 +565,6 @@ def generate_rotations_overview(self, args): rotation_infos.append(rotation_info) with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: - csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) + csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys()), delimiter=';') csv_writer.writeheader() csv_writer.writerows(rotation_infos) From d0e2c9c567cdbe0cec33bb6261615e269a5d4ded Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 4 May 2022 12:37:05 +0200 Subject: [PATCH 137/802] only oppb can charge at opps --- ebus_toolbox/schedule.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 3dda99a1..d0fcf218 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -323,14 +323,19 @@ def generate_scenario_json(self, args): # connect cs and add gc if station is electrified connected_charging_station = None - + desired_soc = 0 if gc_name in stations_dict.keys(): # electrified station station_type = stations_dict[gc_name]["type"] - desired_soc = 1 if station_type == "opps" else args.desired_soc + if station_type == 'opps' and vehicle_rotations[v].charging_type == 'depb': + # a depot bus cannot charge at an opp station + station_type = None + else: + # at opp station, always try to charge as much as you can + desired_soc = 1 if station_type == "opps" else args.desired_soc else: + # non-electrified station station_type = None - desired_soc = 0 # 1. if departure - arrival shorter than min_charging_time, # do not connect charging station From 058b5fcb6551cabab7f369f9f4318402b8067dc2 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 4 May 2022 12:39:12 +0200 Subject: [PATCH 138/802] save SOC info in rotations.csv output file --- ebus_toolbox/schedule.py | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index d0fcf218..a40ba02a 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,9 +1,10 @@ import csv -import datetime -from datetime import timedelta import json -from os import path, makedirs import random +import datetime +import itertools +from os import path, makedirs +from datetime import timedelta from ebus_toolbox.rotation import Rotation @@ -550,11 +551,32 @@ def generate_scenario_json(self, args): def generate_rotations_overview(self, args): rotation_infos = [] negative_rotations = self.get_negative_rotations(args) + sim_start_time = \ + self.get_departure_of_first_trip() - timedelta(minutes=args.signal_time_dif) + for id, rotation in self.rotations.items(): + # get SOC timeseries for this rotation + socs = [] + vehicle_id = rotation.vehicle_id + with open(path.join(args.output_directory, 'simulation_soc_spiceEV.csv')) as f: + reader = csv.DictReader(f) + + interval = timedelta(minutes=args.interval) + read_start_time = rotation.departure_time + duration = rotation.arrival_time-rotation.departure_time + + start_reading = (read_start_time - sim_start_time) // interval + end_reading = start_reading + (duration // interval) + + reader = itertools.islice(reader, start_reading, end_reading) + + for line in reader: + socs.append(line[vehicle_id]) + rotation_info = { "rotation_id": id, - "start_time": rotation.departure_time, - "end_time": rotation.arrival_time, + "start_time": rotation.departure_time.isoformat(), + "end_time": rotation.arrival_time.isoformat(), "vehicle_type": rotation.vehicle_type, "vehicle_id": rotation.vehicle_id, "depot_name": rotation.departure_name, @@ -562,9 +584,8 @@ def generate_rotations_overview(self, args): "total_consumption_[kWh]": rotation.consumption, "distance": rotation.distance, "charging_type": rotation.charging_type, - # TODO: Read SOC values from spice_ev outputs - "SOC_at_arrival": 0, - "Minumum_SOC": 0, + "SOC_at_arrival": socs[-1], + "Minumum_SOC": min(socs), "Negative_SOC": 1 if id in negative_rotations else 0 } rotation_infos.append(rotation_info) From 730b7c3ebb39456c1d37b699d017b0f81f42bfcc Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 9 May 2022 12:18:26 +0200 Subject: [PATCH 139/802] add default buffer time option to ebus tool --- data/configs/ebus_toolbox.cfg | 7 +++++++ ebus_toolbox/__main__.py | 2 ++ 2 files changed, 9 insertions(+) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 477ce08b..1d784987 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -43,6 +43,13 @@ preferred_charging_type = "depb" # min charging time at opp station [minutes] (default: 2) min_charging_time_opps = 2 +# buffer time at opp station if no specific buffer time is provided +# via the electrified_stations.json [minutes] (default: 1) +# Upon arrival at an opp station the buffer time passes until +# the vehicle can start charging. This simulates the process of +# preparing the bus for the charging procedure. +default_buffer_time_opps = 1 + ##### PHYSICAL SETUP OF ENVIRONMENT ##### diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 33a1258a..587b1c32 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -66,6 +66,8 @@ default='examples/vehicle_types.json') parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', default=2) + parser.add_argument('--default_buffer_time_opps', help='time to subtract off of standing time ' + 'at opp station to simulate docking procedure.', default=1) parser.add_argument('--signal_time_dif', help='time difference between signal time and actual ' 'start time of a vehicle event im min.', default=10) From dddf1eb8e553a1f4aa395c5873f1eb7e5ee5e581 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 9 May 2022 14:02:23 +0200 Subject: [PATCH 140/802] add station specific buffer time --- ebus_toolbox/schedule.py | 43 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a40ba02a..86136cfd 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -322,6 +322,41 @@ def generate_scenario_json(self, args): departure = arrival + datetime.timedelta(hours=8) # no more rotations + # calculate total minutes spend at station + standing_time = (departure - arrival).seconds / 60 + # get buffer time from user configuration, buffer time resembles + # amount of time spent at station that cannot be used for charging + # use buffer time from electrified stations JSON or in case none is + # provided use global default from config file + try: + buffer_time = stations_dict[trip.arrival_name]['buffer_time'] + except KeyError: + buffer_time = args.default_buffer_time_opps + + # distinct buffer times depending on time of day can be provided + # in that case buffer time is of type dict instead of int + if isinstance(buffer_time, dict): + # sort dict to make sure 'else' key is last key + buffer_time = {key: buffer_time[key] for key in sorted(buffer_time)} + current_hour = arrival.hour + for time_range, buffer in buffer_time.items(): + if time_range == 'else': + buffer_time = buffer + break + else: + start_hour, end_hour = [int(t) for t in time_range.split('-')] + if end_hour < start_hour: + if current_hour >= start_hour or current_hour < end_hour: + buffer_time = buffer + break + else: + if start_hour <= current_hour < end_hour: + buffer_time = buffer + break + else: + # buffer time not specified for hour of current stop + buffer_time = args.default_buffer_time_opps + # connect cs and add gc if station is electrified connected_charging_station = None desired_soc = 0 @@ -338,12 +373,12 @@ def generate_scenario_json(self, args): # non-electrified station station_type = None - # 1. if departure - arrival shorter than min_charging_time, + # 1. if standing time - buffer time shorter than min_charging_time, # do not connect charging station # 2. if current station has no charger or a depot bus arrives at opp charger, # do not connect charging station either - if (((departure - arrival).seconds / 60 >= args.min_charging_time_opps) and - station_type is not None): + if (station_type is not None and + (standing_time - buffer_time >= args.min_charging_time_opps)): cs_name_and_type = cs_name + "_" + station_type connected_charging_station = cs_name_and_type @@ -355,6 +390,8 @@ def generate_scenario_json(self, args): else args.cs_power_deps_depb gc_power = args.gc_power_deps elif station_type == "opps": + # delay the arrival time to account for docking procedure + arrival = arrival + datetime.timedelta(minutes=buffer_time) cs_power = args.cs_power_opps gc_power = args.gc_power_opps From 76b374b6e19efbbc6ef32dc29913e7b6105dd687 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 9 May 2022 15:12:09 +0200 Subject: [PATCH 141/802] fix bug - bus fleet charges at one gc only --- ebus_toolbox/schedule.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 86136cfd..9bf50b36 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -225,13 +225,22 @@ def get_negative_rotations(self, args): """ # load any json output file of sice_ev - gcID = list(self.scenario["constants"]["grid_connectors"].keys())[0] + gcIDs = list(self.scenario["constants"]["grid_connectors"].keys()) try: - ext = path.splitext(args.save_results) + filename, ext = path.splitext(args.save_results) except TypeError: raise TypeError("In order to get negative totations from spice_ev results, please " "specify 'save_results' in your input arguments.") - filename = f"{ext[0]}_{gcID}{ext[-1]}" + # in spiceEV there is one results file for each grid connector and the filename indicates + # which results file corresponds to which grid connector + # in case there is only one grid connector the filename does not mention the grid connector + if len(gcIDs) > 1: + # every gc results file contains the same info with regard to negative socs + # so just pick the first one + filename = f"{filename}_{gcIDs[0]}{ext}" + else: + filename = args.save_results + with open(filename) as f: results = json.load(f) From e7e5da867b4c8e3f53657063bbc086dd30a0329f Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 9 May 2022 18:44:36 +0200 Subject: [PATCH 142/802] generate spiceEV scenario inside the ebusToolbox --- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/schedule.py | 17 +++++++++-------- ebus_toolbox/simulate.py | 6 ++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 587b1c32..0e4f5d5f 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -103,6 +103,6 @@ args.save_timeseries = path.join(args.output_directory, "simulation_spiceEV.csv") args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") - args.eta = False + args.ALLOW_NEGATIVE_SOC = True simulate.simulate(args) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 9bf50b36..4ca9b31b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -3,10 +3,11 @@ import random import datetime import itertools -from os import path, makedirs +from os import path from datetime import timedelta from ebus_toolbox.rotation import Rotation +from src.scenario import Scenario class Schedule: @@ -258,11 +259,14 @@ def get_negative_rotations(self, args): time <= v.arrival_time][0]) return negative_rotations - def generate_scenario_json(self, args): + def generate_scenario(self, args): """ Generate scenario.json for spiceEV :param args: Command line arguments and/or arguments from config file. :type args: argparse.Namespace + :return: A spiceEV Scenario instance that can be run and also collects all + simulation outputs. + :rtype: spice_ev.src.Scenario """ # load stations file if args.electrified_stations is None: @@ -573,7 +577,7 @@ def generate_scenario_json(self, args): "charging_curve": [[0, max_power], [1, max_power]] } # create final dict - j = { + self.scenario = { "scenario": { "start_time": start.isoformat(), "interval": interval.days * 24 * 60 + interval.seconds // 60, @@ -588,11 +592,8 @@ def generate_scenario_json(self, args): }, "events": events } - # Write JSON - self.scenario = j - makedirs(args.output_directory, exist_ok=True) - with open(args.input, 'w+') as f: - json.dump(j, f, indent=2) + + return Scenario(self.scenario, args.output_directory) def generate_rotations_overview(self, args): rotation_infos = [] diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 7ff35548..1eefa545 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -5,8 +5,6 @@ from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip from ebus_toolbox import report # , optimizer -# SPICE EV SIMULATE -import simulate as spice_ev def simulate(args): @@ -39,12 +37,12 @@ def simulate(args): # RUN SPICE EV # write trips to csv in spiceEV format - schedule.generate_scenario_json(args) + scenario = schedule.generate_scenario(args) print("Running Spice EV...") with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) - spice_ev.simulate(args) + scenario.run('distributed', vars(args).copy()) print(f"Spice EV simulation complete. (Iteration {i})") if i < args.iterations - 1: From 27713dcf93dca800f5cb13041a343d561451ccc1 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 10 May 2022 15:45:08 +0200 Subject: [PATCH 143/802] change buffer time description --- data/configs/ebus_toolbox.cfg | 9 +++++---- ebus_toolbox/schedule.py | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 1d784987..40f228ad 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -45,10 +45,11 @@ min_charging_time_opps = 2 # buffer time at opp station if no specific buffer time is provided # via the electrified_stations.json [minutes] (default: 1) -# Upon arrival at an opp station the buffer time passes until -# the vehicle can start charging. This simulates the process of -# preparing the bus for the charging procedure. -default_buffer_time_opps = 1 +# Time specific buffer times can be set via a dict like: +# {"10-22": 5, "else": 2} NOTE: else clause is a MUST! +# The buffer time is deducted off of the planned standing time. +# It may resemble things like delays and/or docking procedures +# default_buffer_time_opps = 1 ##### PHYSICAL SETUP OF ENVIRONMENT ##### diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 9bf50b36..69140ce1 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -333,8 +333,9 @@ def generate_scenario_json(self, args): # calculate total minutes spend at station standing_time = (departure - arrival).seconds / 60 - # get buffer time from user configuration, buffer time resembles - # amount of time spent at station that cannot be used for charging + # get buffer time from user configuration + # buffer time resembles amount of time deducted off of the planned standing + # time. It may resemble things like delays and/or docking procedures # use buffer time from electrified stations JSON or in case none is # provided use global default from config file try: From 985ae03adcf36f46d4afa9bdb02dc09a69794564 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 11 May 2022 09:16:27 +0200 Subject: [PATCH 144/802] trips example with semicolon as separator --- data/examples/trips_example.csv | 7916 +++++++++++++++---------------- ebus_toolbox/schedule.py | 2 +- 2 files changed, 3959 insertions(+), 3959 deletions(-) diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 844fbe3b..cd7615ca 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,3958 +1,3958 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB -LINE_5,Station-0,2022-03-07 22:56:00,2022-03-07 22:56:00,Station-14,0.06,0,5,CKB -LINE_5,Station-14,2022-03-07 22:56:00,2022-03-07 23:08:00,Station-15,5882,3,5,CKB -LINE_5,Station-15,2022-03-07 23:11:00,2022-03-07 23:25:00,Station-14,6232,0,5,CKB -LINE_5,Station-14,2022-03-07 23:25:00,2022-03-07 23:38:00,Station-15,6086,3,5,CKB -LINE_5,Station-15,2022-03-07 23:41:00,2022-03-07 23:55:00,Station-14,6232,0,5,CKB -LINE_5,Station-14,2022-03-07 23:55:00,2022-03-08 00:08:00,Station-15,6086,0,5,CKB -LINE_5,Station-15,2022-03-08 00:08:00,2022-03-08 00:08:00,Station-0,0.06,0,5,CKB -LINE_6,Station-0,2022-03-07 05:05:00,2022-03-07 05:05:00,Station-16,0.06,0,6,CKB -LINE_6,Station-16,2022-03-07 05:05:00,2022-03-07 05:14:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 05:14:00,2022-03-07 05:23:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 05:25:00,2022-03-07 05:34:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 05:34:00,2022-03-07 05:43:00,Station-16,5139,23,6,CKB -LINE_6,Station-16,2022-03-07 06:06:00,2022-03-07 06:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 06:15:00,2022-03-07 06:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 06:26:00,2022-03-07 06:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 06:35:00,2022-03-07 06:44:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 06:46:00,2022-03-07 06:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 06:55:00,2022-03-07 07:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 07:06:00,2022-03-07 07:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 07:15:00,2022-03-07 07:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 07:26:00,2022-03-07 07:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 07:35:00,2022-03-07 07:44:00,Station-16,5139,22,6,CKB -LINE_6,Station-16,2022-03-07 08:06:00,2022-03-07 08:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 08:15:00,2022-03-07 08:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 08:26:00,2022-03-07 08:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 08:35:00,2022-03-07 08:44:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 08:46:00,2022-03-07 08:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 08:55:00,2022-03-07 09:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 09:06:00,2022-03-07 09:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 09:15:00,2022-03-07 09:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 09:26:00,2022-03-07 09:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 09:35:00,2022-03-07 09:44:00,Station-16,5139,22,6,CKB -LINE_6,Station-16,2022-03-07 10:06:00,2022-03-07 10:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 10:15:00,2022-03-07 10:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 10:26:00,2022-03-07 10:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 10:35:00,2022-03-07 10:44:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 10:46:00,2022-03-07 10:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 10:55:00,2022-03-07 11:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 11:06:00,2022-03-07 11:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 11:15:00,2022-03-07 11:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 11:26:00,2022-03-07 11:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 11:35:00,2022-03-07 11:44:00,Station-16,5139,22,6,CKB -LINE_6,Station-16,2022-03-07 12:06:00,2022-03-07 12:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 12:15:00,2022-03-07 12:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 12:26:00,2022-03-07 12:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 12:35:00,2022-03-07 12:44:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 12:46:00,2022-03-07 12:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 12:55:00,2022-03-07 13:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 13:06:00,2022-03-07 13:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 13:15:00,2022-03-07 13:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 13:26:00,2022-03-07 13:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 13:35:00,2022-03-07 13:44:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 13:46:00,2022-03-07 13:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 13:55:00,2022-03-07 14:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 14:06:00,2022-03-07 14:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 14:15:00,2022-03-07 14:24:00,Station-16,5139,22,6,CKB -LINE_6,Station-16,2022-03-07 14:46:00,2022-03-07 14:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 14:55:00,2022-03-07 15:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 15:06:00,2022-03-07 15:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 15:15:00,2022-03-07 15:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 15:26:00,2022-03-07 15:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 15:35:00,2022-03-07 15:44:00,Station-16,5139,22,6,CKB -LINE_6,Station-16,2022-03-07 16:06:00,2022-03-07 16:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 16:15:00,2022-03-07 16:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 16:26:00,2022-03-07 16:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 16:35:00,2022-03-07 16:44:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 16:46:00,2022-03-07 16:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 16:55:00,2022-03-07 17:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 17:06:00,2022-03-07 17:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 17:15:00,2022-03-07 17:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 17:26:00,2022-03-07 17:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 17:35:00,2022-03-07 17:44:00,Station-16,5139,22,6,CKB -LINE_6,Station-16,2022-03-07 18:06:00,2022-03-07 18:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 18:15:00,2022-03-07 18:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 18:26:00,2022-03-07 18:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 18:35:00,2022-03-07 18:44:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 18:46:00,2022-03-07 18:55:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 18:55:00,2022-03-07 19:04:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 19:06:00,2022-03-07 19:15:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 19:15:00,2022-03-07 19:24:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 19:26:00,2022-03-07 19:35:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 19:35:00,2022-03-07 19:44:00,Station-16,5139,21,6,CKB -LINE_6,Station-16,2022-03-07 20:05:00,2022-03-07 20:14:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 20:14:00,2022-03-07 20:23:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 20:25:00,2022-03-07 20:34:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 20:34:00,2022-03-07 20:43:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 20:45:00,2022-03-07 20:54:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 20:54:00,2022-03-07 21:03:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 21:05:00,2022-03-07 21:14:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 21:14:00,2022-03-07 21:23:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 21:25:00,2022-03-07 21:34:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 21:34:00,2022-03-07 21:43:00,Station-16,5139,22,6,CKB -LINE_6,Station-16,2022-03-07 22:05:00,2022-03-07 22:14:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 22:14:00,2022-03-07 22:23:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 22:25:00,2022-03-07 22:34:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 22:34:00,2022-03-07 22:43:00,Station-16,5139,2,6,CKB -LINE_6,Station-16,2022-03-07 22:45:00,2022-03-07 22:54:00,Station-17,4781,0,6,CKB -LINE_6,Station-17,2022-03-07 22:54:00,2022-03-07 23:03:00,Station-16,5139,0,6,CKB -LINE_6,Station-16,2022-03-07 23:03:00,2022-03-07 23:03:00,Station-0,0.06,0,6,CKB -LINE_7,Station-0,2022-03-08 00:06:00,2022-03-08 00:06:00,Station-18,0.06,0,7,CKB -LINE_7,Station-18,2022-03-08 00:06:00,2022-03-08 00:27:00,Station-19,7827,0,7,CKB -LINE_8,Station-19,2022-03-08 00:27:00,2022-03-08 00:48:00,Station-20,11079,0,7,CKB -LINE_8,Station-20,2022-03-08 00:48:00,2022-03-08 01:25:00,Station-21,20641,8,7,CKB -LINE_8,Station-21,2022-03-08 01:33:00,2022-03-08 02:16:00,Station-20,20579,1,7,CKB -LINE_8,Station-20,2022-03-08 02:17:00,2022-03-08 02:55:00,Station-21,20641,8,7,CKB -LINE_8,Station-21,2022-03-08 03:03:00,2022-03-08 03:46:00,Station-20,20579,1,7,CKB -LINE_8,Station-20,2022-03-08 03:47:00,2022-03-08 04:25:00,Station-21,20641,0,7,CKB -LINE_8,Station-21,2022-03-08 04:25:00,2022-03-08 04:25:00,Station-0,0.06,0,7,CKB -LINE_9,Station-22,2022-03-07 05:15:00,2022-03-07 06:01:00,Station-23,17.9,0,8,VDL -LINE_9,Station-23,2022-03-07 06:01:00,2022-03-07 06:15:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 06:23:00,2022-03-07 06:37:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 06:41:00,2022-03-07 06:55:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 07:03:00,2022-03-07 07:17:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 07:21:00,2022-03-07 07:35:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 07:43:00,2022-03-07 07:57:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 08:01:00,2022-03-07 08:15:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 08:23:00,2022-03-07 08:37:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 08:41:00,2022-03-07 08:55:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 09:03:00,2022-03-07 09:17:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 09:21:00,2022-03-07 09:35:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 09:43:00,2022-03-07 09:57:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 10:01:00,2022-03-07 10:15:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 10:23:00,2022-03-07 10:37:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 10:41:00,2022-03-07 10:55:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 11:03:00,2022-03-07 11:17:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 11:21:00,2022-03-07 11:35:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 11:43:00,2022-03-07 11:57:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 12:01:00,2022-03-07 12:15:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 12:23:00,2022-03-07 12:37:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 12:41:00,2022-03-07 12:55:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 13:03:00,2022-03-07 13:17:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 13:21:00,2022-03-07 13:35:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 13:43:00,2022-03-07 13:57:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 14:01:00,2022-03-07 14:15:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 14:23:00,2022-03-07 14:37:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 14:41:00,2022-03-07 14:55:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 15:03:00,2022-03-07 15:17:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 15:21:00,2022-03-07 15:35:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 15:43:00,2022-03-07 15:57:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 16:01:00,2022-03-07 16:15:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 16:23:00,2022-03-07 16:37:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 16:41:00,2022-03-07 16:55:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 17:03:00,2022-03-07 17:17:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 17:21:00,2022-03-07 17:35:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 17:43:00,2022-03-07 17:57:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 18:01:00,2022-03-07 18:15:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 18:23:00,2022-03-07 18:37:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 18:41:00,2022-03-07 18:55:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 19:03:00,2022-03-07 19:17:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 19:21:00,2022-03-07 19:35:00,Station-23,4637,8,8,VDL -LINE_9,Station-23,2022-03-07 19:43:00,2022-03-07 19:57:00,Station-23,4637,4,8,VDL -LINE_9,Station-23,2022-03-07 20:01:00,2022-03-07 20:14:00,Station-23,4637,9,8,VDL -LINE_9,Station-23,2022-03-07 20:23:00,2022-03-07 20:36:00,Station-23,4637,0,8,VDL -LINE_9,Station-23,2022-03-07 20:36:00,2022-03-07 21:15:00,Station-22,19.8,0,8,VDL -LINE_10,Station-0,2022-03-07 04:56:00,2022-03-07 04:56:00,Station-24,0.06,18,9,CKB -LINE_10,Station-24,2022-03-07 05:14:00,2022-03-07 05:20:00,Station-25,3.29,0,9,CKB -LINE_10,Station-25,2022-03-07 05:20:00,2022-03-07 05:24:00,Station-24,2954,20,9,CKB -LINE_10,Station-24,2022-03-07 05:44:00,2022-03-07 05:50:00,Station-25,3.29,0,9,CKB -LINE_10,Station-25,2022-03-07 05:50:00,2022-03-07 05:54:00,Station-24,2954,5,9,CKB -LINE_10,Station-24,2022-03-07 05:59:00,2022-03-07 06:06:00,Station-25,3.29,2,9,CKB -LINE_10,Station-25,2022-03-07 06:08:00,2022-03-07 06:13:00,Station-24,2954,19,9,CKB -LINE_10,Station-24,2022-03-07 06:32:00,2022-03-07 06:39:00,Station-25,3.29,1,9,CKB -LINE_10,Station-25,2022-03-07 06:40:00,2022-03-07 06:45:00,Station-24,2954,7,9,CKB -LINE_10,Station-24,2022-03-07 06:52:00,2022-03-07 06:59:00,Station-25,3.29,1,9,CKB -LINE_10,Station-25,2022-03-07 07:00:00,2022-03-07 07:05:00,Station-24,2954,7,9,CKB -LINE_10,Station-24,2022-03-07 07:12:00,2022-03-07 07:19:00,Station-25,3.29,1,9,CKB -LINE_10,Station-25,2022-03-07 07:20:00,2022-03-07 07:25:00,Station-24,2954,7,9,CKB -LINE_10,Station-24,2022-03-07 07:32:00,2022-03-07 07:39:00,Station-25,3.29,1,9,CKB -LINE_10,Station-25,2022-03-07 07:40:00,2022-03-07 07:45:00,Station-24,2954,295,9,CKB -LINE_10,Station-24,2022-03-07 12:40:00,2022-03-07 12:47:00,Station-25,3.29,2,9,CKB -LINE_10,Station-25,2022-03-07 12:49:00,2022-03-07 12:54:00,Station-24,2954,46,9,CKB -LINE_10,Station-24,2022-03-07 13:40:00,2022-03-07 13:47:00,Station-25,3.29,2,9,CKB -LINE_10,Station-25,2022-03-07 13:49:00,2022-03-07 13:54:00,Station-24,2954,434,9,CKB -LINE_10,Station-24,2022-03-07 21:08:00,2022-03-07 21:08:00,Station-0,0.06,0,9,CKB -LINE_11,Station-0,2022-03-07 07:20:00,2022-03-07 07:20:00,Station-26,0.06,0,10,CKB -LINE_11,Station-26,2022-03-07 07:20:00,2022-03-07 07:50:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 08:00:00,2022-03-07 08:30:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 08:40:00,2022-03-07 09:10:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 09:20:00,2022-03-07 09:50:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 10:00:00,2022-03-07 10:30:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 10:40:00,2022-03-07 11:10:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 11:20:00,2022-03-07 11:50:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 12:00:00,2022-03-07 12:30:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 12:40:00,2022-03-07 13:10:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 13:20:00,2022-03-07 13:50:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 14:00:00,2022-03-07 14:30:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 14:40:00,2022-03-07 15:10:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 15:20:00,2022-03-07 15:50:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 16:00:00,2022-03-07 16:30:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 16:40:00,2022-03-07 17:10:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 17:20:00,2022-03-07 17:50:00,Station-26,9266,10,10,CKB -LINE_11,Station-26,2022-03-07 18:00:00,2022-03-07 18:30:00,Station-26,9266,0,10,CKB -LINE_11,Station-26,2022-03-07 18:30:00,2022-03-07 18:30:00,Station-0,0.06,0,10,CKB -LINE_12,Station-0,2022-03-07 07:10:00,2022-03-07 07:10:00,Station-27,0.06,0,11,CKB -LINE_12,Station-27,2022-03-07 07:10:00,2022-03-07 07:18:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 07:28:00,2022-03-07 07:40:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 07:40:00,2022-03-07 07:48:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 07:58:00,2022-03-07 08:10:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 08:10:00,2022-03-07 08:18:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 08:28:00,2022-03-07 08:40:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 08:40:00,2022-03-07 08:48:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 08:58:00,2022-03-07 09:10:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 09:10:00,2022-03-07 09:18:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 09:28:00,2022-03-07 09:40:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 09:40:00,2022-03-07 09:48:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 09:58:00,2022-03-07 10:10:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 10:10:00,2022-03-07 10:18:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 10:28:00,2022-03-07 10:40:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 10:40:00,2022-03-07 10:48:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 10:58:00,2022-03-07 11:10:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 11:10:00,2022-03-07 11:18:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 11:28:00,2022-03-07 11:40:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 11:40:00,2022-03-07 11:48:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 11:58:00,2022-03-07 12:10:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 12:10:00,2022-03-07 12:18:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 12:28:00,2022-03-07 12:40:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 12:40:00,2022-03-07 12:48:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 12:58:00,2022-03-07 13:10:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 13:10:00,2022-03-07 13:18:00,Station-28,2169,10,11,CKB -LINE_12,Station-28,2022-03-07 13:28:00,2022-03-07 13:40:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 13:40:00,2022-03-07 13:48:00,Station-28,2169,8,11,CKB -LINE_12,Station-28,2022-03-07 13:56:00,2022-03-07 14:10:00,Station-27,2952,0,11,CKB -LINE_12,Station-27,2022-03-07 14:10:00,2022-03-07 14:19:00,Station-28,2169,14,11,CKB -LINE_12,Station-28,2022-03-07 14:33:00,2022-03-07 14:47:00,Station-27,2952,3,11,CKB -LINE_12,Station-27,2022-03-07 14:50:00,2022-03-07 14:59:00,Station-28,2169,14,11,CKB -LINE_12,Station-28,2022-03-07 15:13:00,2022-03-07 15:27:00,Station-27,2952,3,11,CKB -LINE_12,Station-27,2022-03-07 15:30:00,2022-03-07 15:39:00,Station-28,2169,14,11,CKB -LINE_12,Station-28,2022-03-07 15:53:00,2022-03-07 16:07:00,Station-27,2952,3,11,CKB -LINE_12,Station-27,2022-03-07 16:10:00,2022-03-07 16:19:00,Station-28,2169,14,11,CKB -LINE_12,Station-28,2022-03-07 16:33:00,2022-03-07 16:47:00,Station-27,2952,3,11,CKB -LINE_12,Station-27,2022-03-07 16:50:00,2022-03-07 16:59:00,Station-28,2169,14,11,CKB -LINE_12,Station-28,2022-03-07 17:13:00,2022-03-07 17:27:00,Station-27,2952,3,11,CKB -LINE_12,Station-27,2022-03-07 17:30:00,2022-03-07 17:39:00,Station-28,2169,13,11,CKB -LINE_12,Station-28,2022-03-07 17:52:00,2022-03-07 18:05:00,Station-27,2952,5,11,CKB -LINE_12,Station-27,2022-03-07 18:10:00,2022-03-07 18:18:00,Station-28,2169,0,11,CKB -LINE_12,Station-28,2022-03-07 18:18:00,2022-03-07 18:18:00,Station-0,0.06,0,11,CKB -LINE_12,Station-0,2022-03-07 14:13:00,2022-03-07 14:13:00,Station-28,0.06,0,12,CKB -LINE_12,Station-28,2022-03-07 14:13:00,2022-03-07 14:27:00,Station-27,2952,3,12,CKB -LINE_12,Station-27,2022-03-07 14:30:00,2022-03-07 14:39:00,Station-28,2169,14,12,CKB -LINE_12,Station-28,2022-03-07 14:53:00,2022-03-07 15:07:00,Station-27,2952,3,12,CKB -LINE_12,Station-27,2022-03-07 15:10:00,2022-03-07 15:19:00,Station-28,2169,14,12,CKB -LINE_12,Station-28,2022-03-07 15:33:00,2022-03-07 15:47:00,Station-27,2952,3,12,CKB -LINE_12,Station-27,2022-03-07 15:50:00,2022-03-07 15:59:00,Station-28,2169,14,12,CKB -LINE_12,Station-28,2022-03-07 16:13:00,2022-03-07 16:27:00,Station-27,2952,3,12,CKB -LINE_12,Station-27,2022-03-07 16:30:00,2022-03-07 16:39:00,Station-28,2169,14,12,CKB -LINE_12,Station-28,2022-03-07 16:53:00,2022-03-07 17:07:00,Station-27,2952,3,12,CKB -LINE_12,Station-27,2022-03-07 17:10:00,2022-03-07 17:19:00,Station-28,2169,14,12,CKB -LINE_12,Station-28,2022-03-07 17:33:00,2022-03-07 17:47:00,Station-27,2952,3,12,CKB -LINE_12,Station-27,2022-03-07 17:50:00,2022-03-07 17:59:00,Station-28,2169,14,12,CKB -LINE_12,Station-28,2022-03-07 18:13:00,2022-03-07 18:25:00,Station-27,2952,0,12,CKB -LINE_12,Station-27,2022-03-07 18:25:00,2022-03-07 18:25:00,Station-0,0.06,0,12,CKB -LINE_13,Station-0,2022-03-08 00:23:00,2022-03-08 00:23:00,Station-29,0.06,0,13,CKB -LINE_13,Station-29,2022-03-08 00:23:00,2022-03-08 00:30:00,Station-30,2577,9,13,CKB -LINE_14,Station-30,2022-03-08 00:39:00,2022-03-08 00:54:00,Station-31,5937,9,13,CKB -LINE_14,Station-31,2022-03-08 01:03:00,2022-03-08 01:17:00,Station-30,6.19,0,13,CKB -LINE_13,Station-30,2022-03-08 01:17:00,2022-03-08 01:23:00,Station-29,2555,0,13,CKB -LINE_13,Station-29,2022-03-08 01:23:00,2022-03-08 01:30:00,Station-30,2577,9,13,CKB -LINE_14,Station-30,2022-03-08 01:39:00,2022-03-08 01:54:00,Station-31,5937,9,13,CKB -LINE_14,Station-31,2022-03-08 02:03:00,2022-03-08 02:17:00,Station-30,6.19,0,13,CKB -LINE_13,Station-30,2022-03-08 02:17:00,2022-03-08 02:23:00,Station-29,2555,0,13,CKB -LINE_13,Station-29,2022-03-08 02:23:00,2022-03-08 02:30:00,Station-30,2577,9,13,CKB -LINE_14,Station-30,2022-03-08 02:39:00,2022-03-08 02:54:00,Station-31,5937,9,13,CKB -LINE_14,Station-31,2022-03-08 03:03:00,2022-03-08 03:17:00,Station-30,6.19,0,13,CKB -LINE_13,Station-30,2022-03-08 03:17:00,2022-03-08 03:23:00,Station-29,2555,0,13,CKB -LINE_13,Station-29,2022-03-08 03:23:00,2022-03-08 03:30:00,Station-30,2577,9,13,CKB -LINE_14,Station-30,2022-03-08 03:39:00,2022-03-08 03:54:00,Station-31,5937,9,13,CKB -LINE_14,Station-31,2022-03-08 04:03:00,2022-03-08 04:17:00,Station-30,6.19,0,13,CKB -LINE_13,Station-30,2022-03-08 04:17:00,2022-03-08 04:23:00,Station-29,2555,0,13,CKB -LINE_13,Station-29,2022-03-08 04:23:00,2022-03-08 04:23:00,Station-0,0.06,0,13,CKB -LINE_14,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-31,0.06,0,14,CKB -LINE_14,Station-31,2022-03-08 00:33:00,2022-03-08 00:47:00,Station-30,6.19,0,14,CKB -LINE_13,Station-30,2022-03-08 00:47:00,2022-03-08 00:53:00,Station-29,2555,0,14,CKB -LINE_13,Station-29,2022-03-08 00:53:00,2022-03-08 01:00:00,Station-30,2577,9,14,CKB -LINE_14,Station-30,2022-03-08 01:09:00,2022-03-08 01:24:00,Station-31,5937,9,14,CKB -LINE_14,Station-31,2022-03-08 01:33:00,2022-03-08 01:47:00,Station-30,6.19,0,14,CKB -LINE_13,Station-30,2022-03-08 01:47:00,2022-03-08 01:53:00,Station-29,2555,0,14,CKB -LINE_13,Station-29,2022-03-08 01:53:00,2022-03-08 02:00:00,Station-30,2577,9,14,CKB -LINE_14,Station-30,2022-03-08 02:09:00,2022-03-08 02:24:00,Station-31,5937,9,14,CKB -LINE_14,Station-31,2022-03-08 02:33:00,2022-03-08 02:47:00,Station-30,6.19,0,14,CKB -LINE_13,Station-30,2022-03-08 02:47:00,2022-03-08 02:53:00,Station-29,2555,0,14,CKB -LINE_13,Station-29,2022-03-08 02:53:00,2022-03-08 03:00:00,Station-30,2577,9,14,CKB -LINE_14,Station-30,2022-03-08 03:09:00,2022-03-08 03:24:00,Station-31,5937,9,14,CKB -LINE_14,Station-31,2022-03-08 03:33:00,2022-03-08 03:47:00,Station-30,6.19,0,14,CKB -LINE_13,Station-30,2022-03-08 03:47:00,2022-03-08 03:53:00,Station-29,2555,0,14,CKB -LINE_13,Station-29,2022-03-08 03:53:00,2022-03-08 04:00:00,Station-30,2577,9,14,CKB -LINE_14,Station-30,2022-03-08 04:09:00,2022-03-08 04:24:00,Station-31,5937,0,14,CKB -LINE_14,Station-31,2022-03-08 04:24:00,2022-03-08 04:24:00,Station-0,0.06,0,14,CKB -LINE_15,Station-0,2022-03-08 00:57:00,2022-03-08 00:57:00,Station-32,0.06,0,15,CKB -LINE_15,Station-32,2022-03-08 00:57:00,2022-03-08 01:06:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 01:06:00,2022-03-08 01:11:00,Station-32,2936,16,15,CKB -LINE_15,Station-32,2022-03-08 01:27:00,2022-03-08 01:36:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 01:36:00,2022-03-08 01:41:00,Station-32,2936,16,15,CKB -LINE_15,Station-32,2022-03-08 01:57:00,2022-03-08 02:06:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 02:06:00,2022-03-08 02:11:00,Station-32,2936,16,15,CKB -LINE_15,Station-32,2022-03-08 02:27:00,2022-03-08 02:36:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 02:36:00,2022-03-08 02:41:00,Station-32,2936,16,15,CKB -LINE_15,Station-32,2022-03-08 02:57:00,2022-03-08 03:06:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 03:06:00,2022-03-08 03:11:00,Station-32,2936,16,15,CKB -LINE_15,Station-32,2022-03-08 03:27:00,2022-03-08 03:36:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 03:36:00,2022-03-08 03:41:00,Station-32,2936,16,15,CKB -LINE_15,Station-32,2022-03-08 03:57:00,2022-03-08 04:06:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 04:06:00,2022-03-08 04:11:00,Station-32,2936,16,15,CKB -LINE_15,Station-32,2022-03-08 04:27:00,2022-03-08 04:36:00,Station-33,4343,0,15,CKB -LINE_15,Station-33,2022-03-08 04:36:00,2022-03-08 04:36:00,Station-0,0.06,0,15,CKB -LINE_16,Station-0,2022-03-08 00:29:00,2022-03-08 00:29:00,Station-34,0.06,0,16,CKB -LINE_16,Station-34,2022-03-08 00:29:00,2022-03-08 00:41:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 00:47:00,2022-03-08 00:57:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 00:59:00,2022-03-08 01:11:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 01:17:00,2022-03-08 01:27:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 01:29:00,2022-03-08 01:41:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 01:47:00,2022-03-08 01:57:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 01:59:00,2022-03-08 02:11:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 02:17:00,2022-03-08 02:27:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 02:29:00,2022-03-08 02:41:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 02:47:00,2022-03-08 02:57:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 02:59:00,2022-03-08 03:11:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 03:17:00,2022-03-08 03:27:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 03:29:00,2022-03-08 03:41:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 03:47:00,2022-03-08 03:57:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 03:59:00,2022-03-08 04:11:00,Station-35,4481,6,16,CKB -LINE_16,Station-35,2022-03-08 04:17:00,2022-03-08 04:27:00,Station-34,4031,2,16,CKB -LINE_16,Station-34,2022-03-08 04:29:00,2022-03-08 04:41:00,Station-35,4481,0,16,CKB -LINE_16,Station-35,2022-03-08 04:41:00,2022-03-08 04:41:00,Station-0,0.06,0,16,CKB -LINE_17,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-34,0.06,0,17,CKB -LINE_17,Station-34,2022-03-08 00:30:00,2022-03-08 00:44:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 00:44:00,2022-03-08 00:57:00,Station-34,5302,3,17,CKB -LINE_17,Station-34,2022-03-08 01:00:00,2022-03-08 01:14:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 01:14:00,2022-03-08 01:27:00,Station-34,5302,3,17,CKB -LINE_17,Station-34,2022-03-08 01:30:00,2022-03-08 01:44:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 01:44:00,2022-03-08 01:57:00,Station-34,5302,3,17,CKB -LINE_17,Station-34,2022-03-08 02:00:00,2022-03-08 02:14:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 02:14:00,2022-03-08 02:27:00,Station-34,5302,3,17,CKB -LINE_17,Station-34,2022-03-08 02:30:00,2022-03-08 02:44:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 02:44:00,2022-03-08 02:57:00,Station-34,5302,3,17,CKB -LINE_17,Station-34,2022-03-08 03:00:00,2022-03-08 03:14:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 03:14:00,2022-03-08 03:27:00,Station-34,5302,3,17,CKB -LINE_17,Station-34,2022-03-08 03:30:00,2022-03-08 03:44:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 03:44:00,2022-03-08 03:57:00,Station-34,5302,3,17,CKB -LINE_17,Station-34,2022-03-08 04:00:00,2022-03-08 04:14:00,Station-36,4801,0,17,CKB -LINE_17,Station-36,2022-03-08 04:14:00,2022-03-08 04:27:00,Station-34,5302,0,17,CKB -LINE_17,Station-34,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,17,CKB -LINE_18,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-37,0.06,0,18,CKB -LINE_18,Station-37,2022-03-08 00:43:00,2022-03-08 01:33:00,Station-37,20434,10,18,CKB -LINE_18,Station-37,2022-03-08 01:43:00,2022-03-08 02:33:00,Station-37,20434,10,18,CKB -LINE_18,Station-37,2022-03-08 02:43:00,2022-03-08 03:33:00,Station-37,20434,10,18,CKB -LINE_18,Station-37,2022-03-08 03:43:00,2022-03-08 04:33:00,Station-37,20434,0,18,CKB -LINE_18,Station-37,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,18,CKB -LINE_18,Station-0,2022-03-08 00:13:00,2022-03-08 00:13:00,Station-37,0.06,0,19,CKB -LINE_18,Station-37,2022-03-08 00:13:00,2022-03-08 01:03:00,Station-37,20434,10,19,CKB -LINE_18,Station-37,2022-03-08 01:13:00,2022-03-08 02:03:00,Station-37,20434,10,19,CKB -LINE_18,Station-37,2022-03-08 02:13:00,2022-03-08 03:03:00,Station-37,20434,10,19,CKB -LINE_18,Station-37,2022-03-08 03:13:00,2022-03-08 04:03:00,Station-37,20434,0,19,CKB -LINE_18,Station-37,2022-03-08 04:03:00,2022-03-08 04:03:00,Station-0,0.06,0,19,CKB -LINE_19,Station-0,2022-03-08 00:24:00,2022-03-08 00:24:00,Station-38,0.06,0,20,CKB -LINE_19,Station-38,2022-03-08 00:24:00,2022-03-08 00:48:00,Station-39,11.86,4,20,CKB -LINE_19,Station-39,2022-03-08 00:52:00,2022-03-08 01:14:00,Station-38,11139,10,20,CKB -LINE_19,Station-38,2022-03-08 01:24:00,2022-03-08 01:48:00,Station-39,11.86,4,20,CKB -LINE_19,Station-39,2022-03-08 01:52:00,2022-03-08 02:14:00,Station-38,11139,10,20,CKB -LINE_19,Station-38,2022-03-08 02:24:00,2022-03-08 02:48:00,Station-39,11.86,4,20,CKB -LINE_19,Station-39,2022-03-08 02:52:00,2022-03-08 03:14:00,Station-38,11139,10,20,CKB -LINE_19,Station-38,2022-03-08 03:24:00,2022-03-08 03:48:00,Station-39,11.86,4,20,CKB -LINE_19,Station-39,2022-03-08 03:52:00,2022-03-08 04:14:00,Station-38,11139,0,20,CKB -LINE_19,Station-38,2022-03-08 04:14:00,2022-03-08 04:14:00,Station-0,0.06,0,20,CKB -LINE_19,Station-0,2022-03-08 00:22:00,2022-03-08 00:22:00,Station-39,0.06,0,21,CKB -LINE_19,Station-39,2022-03-08 00:22:00,2022-03-08 00:44:00,Station-38,11139,10,21,CKB -LINE_19,Station-38,2022-03-08 00:54:00,2022-03-08 01:18:00,Station-39,11.86,4,21,CKB -LINE_19,Station-39,2022-03-08 01:22:00,2022-03-08 01:44:00,Station-38,11139,10,21,CKB -LINE_19,Station-38,2022-03-08 01:54:00,2022-03-08 02:18:00,Station-39,11.86,4,21,CKB -LINE_19,Station-39,2022-03-08 02:22:00,2022-03-08 02:44:00,Station-38,11139,10,21,CKB -LINE_19,Station-38,2022-03-08 02:54:00,2022-03-08 03:18:00,Station-39,11.86,4,21,CKB -LINE_19,Station-39,2022-03-08 03:22:00,2022-03-08 03:44:00,Station-38,11139,10,21,CKB -LINE_19,Station-38,2022-03-08 03:54:00,2022-03-08 04:18:00,Station-39,11.86,4,21,CKB -LINE_19,Station-39,2022-03-08 04:22:00,2022-03-08 04:44:00,Station-38,11139,0,21,CKB -LINE_19,Station-38,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,21,CKB -LINE_20,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,22,CKB -LINE_20,Station-13,2022-03-08 00:32:00,2022-03-08 00:44:00,Station-40,4212,3,22,CKB -LINE_20,Station-40,2022-03-08 00:47:00,2022-03-08 01:16:00,Station-41,13048,0,22,CKB -LINE_20,Station-41,2022-03-08 01:16:00,2022-03-08 01:42:00,Station-40,12869,5,22,CKB -LINE_20,Station-40,2022-03-08 01:47:00,2022-03-08 02:16:00,Station-41,13048,0,22,CKB -LINE_20,Station-41,2022-03-08 02:16:00,2022-03-08 02:42:00,Station-40,12869,5,22,CKB -LINE_20,Station-40,2022-03-08 02:47:00,2022-03-08 03:16:00,Station-41,13048,0,22,CKB -LINE_20,Station-41,2022-03-08 03:16:00,2022-03-08 03:42:00,Station-40,12869,5,22,CKB -LINE_20,Station-40,2022-03-08 03:47:00,2022-03-08 04:16:00,Station-41,13048,0,22,CKB -LINE_20,Station-41,2022-03-08 04:16:00,2022-03-08 04:34:00,Station-42,9538,0,22,CKB -LINE_20,Station-42,2022-03-08 04:34:00,2022-03-08 04:34:00,Station-0,0.06,0,22,CKB -LINE_20,Station-0,2022-03-08 00:17:00,2022-03-08 00:17:00,Station-40,0.06,0,23,CKB -LINE_20,Station-40,2022-03-08 00:17:00,2022-03-08 00:46:00,Station-41,13048,0,23,CKB -LINE_20,Station-41,2022-03-08 00:46:00,2022-03-08 01:12:00,Station-40,12869,5,23,CKB -LINE_20,Station-40,2022-03-08 01:17:00,2022-03-08 01:46:00,Station-41,13048,0,23,CKB -LINE_20,Station-41,2022-03-08 01:46:00,2022-03-08 02:12:00,Station-40,12869,5,23,CKB -LINE_20,Station-40,2022-03-08 02:17:00,2022-03-08 02:46:00,Station-41,13048,0,23,CKB -LINE_20,Station-41,2022-03-08 02:46:00,2022-03-08 03:12:00,Station-40,12869,5,23,CKB -LINE_20,Station-40,2022-03-08 03:17:00,2022-03-08 03:46:00,Station-41,13048,0,23,CKB -LINE_20,Station-41,2022-03-08 03:46:00,2022-03-08 04:12:00,Station-40,12869,5,23,CKB -LINE_20,Station-40,2022-03-08 04:17:00,2022-03-08 04:28:00,Station-13,4316,0,23,CKB -LINE_20,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,23,CKB -LINE_21,Station-0,2022-03-08 00:49:00,2022-03-08 00:49:00,Station-3,0.06,0,24,CKB -LINE_21,Station-3,2022-03-08 00:49:00,2022-03-08 01:04:00,Station-16,10229,0,24,CKB -LINE_21,Station-16,2022-03-08 01:04:00,2022-03-08 01:19:00,Station-3,11801,0,24,CKB -LINE_21,Station-3,2022-03-08 01:19:00,2022-03-08 01:34:00,Station-16,10229,0,24,CKB -LINE_21,Station-16,2022-03-08 01:34:00,2022-03-08 01:49:00,Station-3,11801,0,24,CKB -LINE_21,Station-3,2022-03-08 01:49:00,2022-03-08 02:04:00,Station-16,10229,0,24,CKB -LINE_21,Station-16,2022-03-08 02:04:00,2022-03-08 02:19:00,Station-3,11801,0,24,CKB -LINE_21,Station-3,2022-03-08 02:19:00,2022-03-08 02:34:00,Station-16,10229,0,24,CKB -LINE_21,Station-16,2022-03-08 02:34:00,2022-03-08 02:49:00,Station-3,11801,0,24,CKB -LINE_21,Station-3,2022-03-08 02:49:00,2022-03-08 03:04:00,Station-16,10229,0,24,CKB -LINE_21,Station-16,2022-03-08 03:04:00,2022-03-08 03:19:00,Station-3,11801,0,24,CKB -LINE_21,Station-3,2022-03-08 03:19:00,2022-03-08 03:34:00,Station-16,10229,0,24,CKB -LINE_21,Station-16,2022-03-08 03:34:00,2022-03-08 03:49:00,Station-3,11801,0,24,CKB -LINE_21,Station-3,2022-03-08 03:49:00,2022-03-08 04:04:00,Station-16,10229,0,24,CKB -LINE_21,Station-16,2022-03-08 04:04:00,2022-03-08 04:19:00,Station-3,11801,23,24,CKB -LINE_22,Station-3,2022-03-08 04:42:00,2022-03-08 05:04:00,Station-43,6.81,0,24,CKB -LINE_22,Station-43,2022-03-08 05:04:00,2022-03-08 05:04:00,Station-0,0.06,0,24,CKB -LINE_8,Station-0,2022-03-08 00:32:00,2022-03-08 00:32:00,Station-13,0.06,0,25,CKB -LINE_8,Station-13,2022-03-08 00:32:00,2022-03-08 00:57:00,Station-21,11545,6,25,CKB -LINE_8,Station-21,2022-03-08 01:03:00,2022-03-08 01:46:00,Station-20,20579,1,25,CKB -LINE_8,Station-20,2022-03-08 01:47:00,2022-03-08 02:25:00,Station-21,20641,8,25,CKB -LINE_8,Station-21,2022-03-08 02:33:00,2022-03-08 03:16:00,Station-20,20579,1,25,CKB -LINE_8,Station-20,2022-03-08 03:17:00,2022-03-08 03:55:00,Station-21,20641,8,25,CKB -LINE_8,Station-21,2022-03-08 04:03:00,2022-03-08 04:28:00,Station-13,11499,0,25,CKB -LINE_8,Station-13,2022-03-08 04:28:00,2022-03-08 04:28:00,Station-0,0.06,0,25,CKB -LINE_8,Station-0,2022-03-08 00:33:00,2022-03-08 00:33:00,Station-21,0.06,0,26,CKB -LINE_8,Station-21,2022-03-08 00:33:00,2022-03-08 01:16:00,Station-20,20579,1,26,CKB -LINE_8,Station-20,2022-03-08 01:17:00,2022-03-08 01:55:00,Station-21,20641,8,26,CKB -LINE_8,Station-21,2022-03-08 02:03:00,2022-03-08 02:46:00,Station-20,20579,1,26,CKB -LINE_8,Station-20,2022-03-08 02:47:00,2022-03-08 03:25:00,Station-21,20641,8,26,CKB -LINE_8,Station-21,2022-03-08 03:33:00,2022-03-08 04:16:00,Station-20,20579,1,26,CKB -LINE_8,Station-20,2022-03-08 04:17:00,2022-03-08 04:51:00,Station-44,18752,0,26,CKB -LINE_8,Station-44,2022-03-08 04:51:00,2022-03-08 04:51:00,Station-0,0.06,0,26,CKB -LINE_23,Station-0,2022-03-08 00:34:00,2022-03-08 00:34:00,Station-45,0.06,0,27,CKB -LINE_23,Station-45,2022-03-08 00:34:00,2022-03-08 01:00:00,Station-46,9016,0,27,CKB -LINE_23,Station-46,2022-03-08 01:00:00,2022-03-08 01:27:00,Station-45,10083,7,27,CKB -LINE_23,Station-45,2022-03-08 01:34:00,2022-03-08 02:00:00,Station-46,9016,0,27,CKB -LINE_23,Station-46,2022-03-08 02:00:00,2022-03-08 02:27:00,Station-45,10083,7,27,CKB -LINE_23,Station-45,2022-03-08 02:34:00,2022-03-08 03:00:00,Station-46,9016,0,27,CKB -LINE_23,Station-46,2022-03-08 03:00:00,2022-03-08 03:27:00,Station-45,10083,7,27,CKB -LINE_23,Station-45,2022-03-08 03:34:00,2022-03-08 04:00:00,Station-46,9016,0,27,CKB -LINE_23,Station-46,2022-03-08 04:00:00,2022-03-08 04:27:00,Station-45,10083,0,27,CKB -LINE_23,Station-45,2022-03-08 04:27:00,2022-03-08 04:27:00,Station-0,0.06,0,27,CKB -LINE_23,Station-0,2022-03-08 00:30:00,2022-03-08 00:30:00,Station-46,0.06,0,28,CKB -LINE_23,Station-46,2022-03-08 00:30:00,2022-03-08 00:57:00,Station-45,10083,7,28,CKB -LINE_23,Station-45,2022-03-08 01:04:00,2022-03-08 01:30:00,Station-46,9016,0,28,CKB -LINE_23,Station-46,2022-03-08 01:30:00,2022-03-08 01:57:00,Station-45,10083,7,28,CKB -LINE_23,Station-45,2022-03-08 02:04:00,2022-03-08 02:30:00,Station-46,9016,0,28,CKB -LINE_23,Station-46,2022-03-08 02:30:00,2022-03-08 02:57:00,Station-45,10083,7,28,CKB -LINE_23,Station-45,2022-03-08 03:04:00,2022-03-08 03:30:00,Station-46,9016,0,28,CKB -LINE_23,Station-46,2022-03-08 03:30:00,2022-03-08 03:57:00,Station-45,10083,7,28,CKB -LINE_23,Station-45,2022-03-08 04:04:00,2022-03-08 04:30:00,Station-46,9016,0,28,CKB -LINE_23,Station-46,2022-03-08 04:30:00,2022-03-08 04:57:00,Station-45,10083,0,28,CKB -LINE_23,Station-45,2022-03-08 04:57:00,2022-03-08 04:57:00,Station-0,0.06,0,28,CKB -LINE_24,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,29,CKB -LINE_24,Station-21,2022-03-08 00:31:00,2022-03-08 00:44:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 00:44:00,2022-03-08 00:56:00,Station-21,5362,5,29,CKB -LINE_24,Station-21,2022-03-08 01:01:00,2022-03-08 01:14:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 01:14:00,2022-03-08 01:26:00,Station-21,5362,5,29,CKB -LINE_24,Station-21,2022-03-08 01:31:00,2022-03-08 01:44:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 01:44:00,2022-03-08 01:56:00,Station-21,5362,5,29,CKB -LINE_24,Station-21,2022-03-08 02:01:00,2022-03-08 02:14:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 02:14:00,2022-03-08 02:26:00,Station-21,5362,5,29,CKB -LINE_24,Station-21,2022-03-08 02:31:00,2022-03-08 02:44:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 02:44:00,2022-03-08 02:56:00,Station-21,5362,5,29,CKB -LINE_24,Station-21,2022-03-08 03:01:00,2022-03-08 03:14:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 03:14:00,2022-03-08 03:26:00,Station-21,5362,5,29,CKB -LINE_24,Station-21,2022-03-08 03:31:00,2022-03-08 03:44:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 03:44:00,2022-03-08 03:56:00,Station-21,5362,5,29,CKB -LINE_24,Station-21,2022-03-08 04:01:00,2022-03-08 04:14:00,Station-47,4872,0,29,CKB -LINE_24,Station-47,2022-03-08 04:14:00,2022-03-08 04:26:00,Station-21,5362,0,29,CKB -LINE_24,Station-21,2022-03-08 04:26:00,2022-03-08 04:26:00,Station-0,0.06,0,29,CKB -LINE_25,Station-0,2022-03-08 00:31:00,2022-03-08 00:31:00,Station-21,0.06,0,30,CKB -LINE_25,Station-21,2022-03-08 00:31:00,2022-03-08 00:45:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 00:47:00,2022-03-08 01:01:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 01:01:00,2022-03-08 01:15:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 01:17:00,2022-03-08 01:31:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 01:31:00,2022-03-08 01:45:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 01:47:00,2022-03-08 02:01:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 02:01:00,2022-03-08 02:15:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 02:17:00,2022-03-08 02:31:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 02:31:00,2022-03-08 02:45:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 02:47:00,2022-03-08 03:01:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 03:01:00,2022-03-08 03:15:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 03:17:00,2022-03-08 03:31:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 03:31:00,2022-03-08 03:45:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 03:47:00,2022-03-08 04:01:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 04:01:00,2022-03-08 04:15:00,Station-48,5225,2,30,CKB -LINE_25,Station-48,2022-03-08 04:17:00,2022-03-08 04:31:00,Station-21,7617,0,30,CKB -LINE_25,Station-21,2022-03-08 04:31:00,2022-03-08 04:31:00,Station-0,0.06,0,30,CKB -LINE_26,Station-0,2022-03-08 00:43:00,2022-03-08 00:43:00,Station-49,0.06,0,31,CKB -LINE_26,Station-49,2022-03-08 00:43:00,2022-03-08 00:53:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 00:53:00,2022-03-08 01:03:00,Station-49,4408,10,31,CKB -LINE_26,Station-49,2022-03-08 01:13:00,2022-03-08 01:23:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 01:23:00,2022-03-08 01:33:00,Station-49,4408,10,31,CKB -LINE_26,Station-49,2022-03-08 01:43:00,2022-03-08 01:53:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 01:53:00,2022-03-08 02:03:00,Station-49,4408,10,31,CKB -LINE_26,Station-49,2022-03-08 02:13:00,2022-03-08 02:23:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 02:23:00,2022-03-08 02:33:00,Station-49,4408,10,31,CKB -LINE_26,Station-49,2022-03-08 02:43:00,2022-03-08 02:53:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 02:53:00,2022-03-08 03:03:00,Station-49,4408,10,31,CKB -LINE_26,Station-49,2022-03-08 03:13:00,2022-03-08 03:23:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 03:23:00,2022-03-08 03:33:00,Station-49,4408,10,31,CKB -LINE_26,Station-49,2022-03-08 03:43:00,2022-03-08 03:53:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 03:53:00,2022-03-08 04:03:00,Station-49,4408,10,31,CKB -LINE_26,Station-49,2022-03-08 04:13:00,2022-03-08 04:23:00,Station-50,4507,0,31,CKB -LINE_26,Station-50,2022-03-08 04:23:00,2022-03-08 04:33:00,Station-49,4408,0,31,CKB -LINE_26,Station-49,2022-03-08 04:33:00,2022-03-08 04:33:00,Station-0,0.06,0,31,CKB -LINE_21,Station-0,2022-03-07 00:49:00,2022-03-07 00:49:00,Station-3,0.06,0,32,CKB -LINE_21,Station-3,2022-03-07 00:49:00,2022-03-07 01:04:00,Station-16,10229,0,32,CKB -LINE_21,Station-16,2022-03-07 01:04:00,2022-03-07 01:19:00,Station-3,11801,0,32,CKB -LINE_21,Station-3,2022-03-07 01:19:00,2022-03-07 01:34:00,Station-16,10229,0,32,CKB -LINE_21,Station-16,2022-03-07 01:34:00,2022-03-07 01:49:00,Station-3,11801,0,32,CKB -LINE_21,Station-3,2022-03-07 01:49:00,2022-03-07 02:04:00,Station-16,10229,0,32,CKB -LINE_21,Station-16,2022-03-07 02:04:00,2022-03-07 02:19:00,Station-3,11801,0,32,CKB -LINE_21,Station-3,2022-03-07 02:19:00,2022-03-07 02:34:00,Station-16,10229,0,32,CKB -LINE_21,Station-16,2022-03-07 02:34:00,2022-03-07 02:49:00,Station-3,11801,0,32,CKB -LINE_21,Station-3,2022-03-07 02:49:00,2022-03-07 03:04:00,Station-16,10229,0,32,CKB -LINE_21,Station-16,2022-03-07 03:04:00,2022-03-07 03:19:00,Station-3,11801,0,32,CKB -LINE_21,Station-3,2022-03-07 03:19:00,2022-03-07 03:34:00,Station-16,10229,0,32,CKB -LINE_21,Station-16,2022-03-07 03:34:00,2022-03-07 03:49:00,Station-3,11801,0,32,CKB -LINE_21,Station-3,2022-03-07 03:49:00,2022-03-07 04:04:00,Station-16,10229,0,32,CKB -LINE_21,Station-16,2022-03-07 04:04:00,2022-03-07 04:19:00,Station-3,11801,23,32,CKB -LINE_22,Station-3,2022-03-07 04:42:00,2022-03-07 05:04:00,Station-43,6.81,0,32,CKB -LINE_22,Station-43,2022-03-07 05:04:00,2022-03-07 05:04:00,Station-0,0.06,0,32,CKB -LINE_13,Station-0,2022-03-07 00:23:00,2022-03-07 00:23:00,Station-29,0.06,0,33,CKB -LINE_13,Station-29,2022-03-07 00:23:00,2022-03-07 00:30:00,Station-30,2577,9,33,CKB -LINE_14,Station-30,2022-03-07 00:39:00,2022-03-07 00:54:00,Station-31,5937,9,33,CKB -LINE_14,Station-31,2022-03-07 01:03:00,2022-03-07 01:17:00,Station-30,6.19,0,33,CKB -LINE_13,Station-30,2022-03-07 01:17:00,2022-03-07 01:23:00,Station-29,2555,0,33,CKB -LINE_13,Station-29,2022-03-07 01:23:00,2022-03-07 01:30:00,Station-30,2577,9,33,CKB -LINE_14,Station-30,2022-03-07 01:39:00,2022-03-07 01:54:00,Station-31,5937,9,33,CKB -LINE_14,Station-31,2022-03-07 02:03:00,2022-03-07 02:17:00,Station-30,6.19,0,33,CKB -LINE_13,Station-30,2022-03-07 02:17:00,2022-03-07 02:23:00,Station-29,2555,0,33,CKB -LINE_13,Station-29,2022-03-07 02:23:00,2022-03-07 02:30:00,Station-30,2577,9,33,CKB -LINE_14,Station-30,2022-03-07 02:39:00,2022-03-07 02:54:00,Station-31,5937,9,33,CKB -LINE_14,Station-31,2022-03-07 03:03:00,2022-03-07 03:17:00,Station-30,6.19,0,33,CKB -LINE_13,Station-30,2022-03-07 03:17:00,2022-03-07 03:23:00,Station-29,2555,0,33,CKB -LINE_13,Station-29,2022-03-07 03:23:00,2022-03-07 03:30:00,Station-30,2577,9,33,CKB -LINE_14,Station-30,2022-03-07 03:39:00,2022-03-07 03:54:00,Station-31,5937,9,33,CKB -LINE_14,Station-31,2022-03-07 04:03:00,2022-03-07 04:17:00,Station-30,6.19,0,33,CKB -LINE_13,Station-30,2022-03-07 04:17:00,2022-03-07 04:23:00,Station-29,2555,0,33,CKB -LINE_13,Station-29,2022-03-07 04:23:00,2022-03-07 04:23:00,Station-0,0.06,0,33,CKB -LINE_14,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-31,0.06,0,34,CKB -LINE_14,Station-31,2022-03-07 00:33:00,2022-03-07 00:47:00,Station-30,6.19,0,34,CKB -LINE_13,Station-30,2022-03-07 00:47:00,2022-03-07 00:53:00,Station-29,2555,0,34,CKB -LINE_13,Station-29,2022-03-07 00:53:00,2022-03-07 01:00:00,Station-30,2577,9,34,CKB -LINE_14,Station-30,2022-03-07 01:09:00,2022-03-07 01:24:00,Station-31,5937,9,34,CKB -LINE_14,Station-31,2022-03-07 01:33:00,2022-03-07 01:47:00,Station-30,6.19,0,34,CKB -LINE_13,Station-30,2022-03-07 01:47:00,2022-03-07 01:53:00,Station-29,2555,0,34,CKB -LINE_13,Station-29,2022-03-07 01:53:00,2022-03-07 02:00:00,Station-30,2577,9,34,CKB -LINE_14,Station-30,2022-03-07 02:09:00,2022-03-07 02:24:00,Station-31,5937,9,34,CKB -LINE_14,Station-31,2022-03-07 02:33:00,2022-03-07 02:47:00,Station-30,6.19,0,34,CKB -LINE_13,Station-30,2022-03-07 02:47:00,2022-03-07 02:53:00,Station-29,2555,0,34,CKB -LINE_13,Station-29,2022-03-07 02:53:00,2022-03-07 03:00:00,Station-30,2577,9,34,CKB -LINE_14,Station-30,2022-03-07 03:09:00,2022-03-07 03:24:00,Station-31,5937,9,34,CKB -LINE_14,Station-31,2022-03-07 03:33:00,2022-03-07 03:47:00,Station-30,6.19,0,34,CKB -LINE_13,Station-30,2022-03-07 03:47:00,2022-03-07 03:53:00,Station-29,2555,0,34,CKB -LINE_13,Station-29,2022-03-07 03:53:00,2022-03-07 04:00:00,Station-30,2577,9,34,CKB -LINE_14,Station-30,2022-03-07 04:09:00,2022-03-07 04:24:00,Station-31,5937,0,34,CKB -LINE_14,Station-31,2022-03-07 04:24:00,2022-03-07 04:24:00,Station-0,0.06,0,34,CKB -LINE_15,Station-0,2022-03-07 00:57:00,2022-03-07 00:57:00,Station-32,0.06,0,35,CKB -LINE_15,Station-32,2022-03-07 00:57:00,2022-03-07 01:06:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 01:06:00,2022-03-07 01:11:00,Station-32,2936,16,35,CKB -LINE_15,Station-32,2022-03-07 01:27:00,2022-03-07 01:36:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 01:36:00,2022-03-07 01:41:00,Station-32,2936,16,35,CKB -LINE_15,Station-32,2022-03-07 01:57:00,2022-03-07 02:06:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 02:06:00,2022-03-07 02:11:00,Station-32,2936,16,35,CKB -LINE_15,Station-32,2022-03-07 02:27:00,2022-03-07 02:36:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 02:36:00,2022-03-07 02:41:00,Station-32,2936,16,35,CKB -LINE_15,Station-32,2022-03-07 02:57:00,2022-03-07 03:06:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 03:06:00,2022-03-07 03:11:00,Station-32,2936,16,35,CKB -LINE_15,Station-32,2022-03-07 03:27:00,2022-03-07 03:36:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 03:36:00,2022-03-07 03:41:00,Station-32,2936,16,35,CKB -LINE_15,Station-32,2022-03-07 03:57:00,2022-03-07 04:06:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 04:06:00,2022-03-07 04:11:00,Station-32,2936,16,35,CKB -LINE_15,Station-32,2022-03-07 04:27:00,2022-03-07 04:36:00,Station-33,4343,0,35,CKB -LINE_15,Station-33,2022-03-07 04:36:00,2022-03-07 04:36:00,Station-0,0.06,0,35,CKB -LINE_16,Station-0,2022-03-07 00:29:00,2022-03-07 00:29:00,Station-34,0.06,0,36,CKB -LINE_16,Station-34,2022-03-07 00:29:00,2022-03-07 00:41:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 00:47:00,2022-03-07 00:57:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 00:59:00,2022-03-07 01:11:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 01:17:00,2022-03-07 01:27:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 01:29:00,2022-03-07 01:41:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 01:47:00,2022-03-07 01:57:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 01:59:00,2022-03-07 02:11:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 02:17:00,2022-03-07 02:27:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 02:29:00,2022-03-07 02:41:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 02:47:00,2022-03-07 02:57:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 02:59:00,2022-03-07 03:11:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 03:17:00,2022-03-07 03:27:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 03:29:00,2022-03-07 03:41:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 03:47:00,2022-03-07 03:57:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 03:59:00,2022-03-07 04:11:00,Station-35,4481,6,36,CKB -LINE_16,Station-35,2022-03-07 04:17:00,2022-03-07 04:27:00,Station-34,4031,2,36,CKB -LINE_16,Station-34,2022-03-07 04:29:00,2022-03-07 04:41:00,Station-35,4481,0,36,CKB -LINE_16,Station-35,2022-03-07 04:41:00,2022-03-07 04:41:00,Station-0,0.06,0,36,CKB -LINE_17,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-34,0.06,0,37,CKB -LINE_17,Station-34,2022-03-07 00:30:00,2022-03-07 00:44:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 00:44:00,2022-03-07 00:57:00,Station-34,5302,3,37,CKB -LINE_17,Station-34,2022-03-07 01:00:00,2022-03-07 01:14:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 01:14:00,2022-03-07 01:27:00,Station-34,5302,3,37,CKB -LINE_17,Station-34,2022-03-07 01:30:00,2022-03-07 01:44:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 01:44:00,2022-03-07 01:57:00,Station-34,5302,3,37,CKB -LINE_17,Station-34,2022-03-07 02:00:00,2022-03-07 02:14:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 02:14:00,2022-03-07 02:27:00,Station-34,5302,3,37,CKB -LINE_17,Station-34,2022-03-07 02:30:00,2022-03-07 02:44:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 02:44:00,2022-03-07 02:57:00,Station-34,5302,3,37,CKB -LINE_17,Station-34,2022-03-07 03:00:00,2022-03-07 03:14:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 03:14:00,2022-03-07 03:27:00,Station-34,5302,3,37,CKB -LINE_17,Station-34,2022-03-07 03:30:00,2022-03-07 03:44:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 03:44:00,2022-03-07 03:57:00,Station-34,5302,3,37,CKB -LINE_17,Station-34,2022-03-07 04:00:00,2022-03-07 04:14:00,Station-36,4801,0,37,CKB -LINE_17,Station-36,2022-03-07 04:14:00,2022-03-07 04:27:00,Station-34,5302,0,37,CKB -LINE_17,Station-34,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,37,CKB -LINE_18,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-37,0.06,0,38,CKB -LINE_18,Station-37,2022-03-07 00:43:00,2022-03-07 01:33:00,Station-37,20434,10,38,CKB -LINE_18,Station-37,2022-03-07 01:43:00,2022-03-07 02:33:00,Station-37,20434,10,38,CKB -LINE_18,Station-37,2022-03-07 02:43:00,2022-03-07 03:33:00,Station-37,20434,10,38,CKB -LINE_18,Station-37,2022-03-07 03:43:00,2022-03-07 04:33:00,Station-37,20434,0,38,CKB -LINE_18,Station-37,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,38,CKB -LINE_18,Station-0,2022-03-07 00:13:00,2022-03-07 00:13:00,Station-37,0.06,0,39,CKB -LINE_18,Station-37,2022-03-07 00:13:00,2022-03-07 01:03:00,Station-37,20434,10,39,CKB -LINE_18,Station-37,2022-03-07 01:13:00,2022-03-07 02:03:00,Station-37,20434,10,39,CKB -LINE_18,Station-37,2022-03-07 02:13:00,2022-03-07 03:03:00,Station-37,20434,10,39,CKB -LINE_18,Station-37,2022-03-07 03:13:00,2022-03-07 04:03:00,Station-37,20434,0,39,CKB -LINE_18,Station-37,2022-03-07 04:03:00,2022-03-07 04:03:00,Station-0,0.06,0,39,CKB -LINE_19,Station-0,2022-03-07 00:24:00,2022-03-07 00:24:00,Station-38,0.06,0,40,CKB -LINE_19,Station-38,2022-03-07 00:24:00,2022-03-07 00:48:00,Station-39,11.86,4,40,CKB -LINE_19,Station-39,2022-03-07 00:52:00,2022-03-07 01:14:00,Station-38,11139,10,40,CKB -LINE_19,Station-38,2022-03-07 01:24:00,2022-03-07 01:48:00,Station-39,11.86,4,40,CKB -LINE_19,Station-39,2022-03-07 01:52:00,2022-03-07 02:14:00,Station-38,11139,10,40,CKB -LINE_19,Station-38,2022-03-07 02:24:00,2022-03-07 02:48:00,Station-39,11.86,4,40,CKB -LINE_19,Station-39,2022-03-07 02:52:00,2022-03-07 03:14:00,Station-38,11139,10,40,CKB -LINE_19,Station-38,2022-03-07 03:24:00,2022-03-07 03:48:00,Station-39,11.86,4,40,CKB -LINE_19,Station-39,2022-03-07 03:52:00,2022-03-07 04:14:00,Station-38,11139,0,40,CKB -LINE_19,Station-38,2022-03-07 04:14:00,2022-03-07 04:14:00,Station-0,0.06,0,40,CKB -LINE_19,Station-0,2022-03-07 00:22:00,2022-03-07 00:22:00,Station-39,0.06,0,41,CKB -LINE_19,Station-39,2022-03-07 00:22:00,2022-03-07 00:44:00,Station-38,11139,10,41,CKB -LINE_19,Station-38,2022-03-07 00:54:00,2022-03-07 01:18:00,Station-39,11.86,4,41,CKB -LINE_19,Station-39,2022-03-07 01:22:00,2022-03-07 01:44:00,Station-38,11139,10,41,CKB -LINE_19,Station-38,2022-03-07 01:54:00,2022-03-07 02:18:00,Station-39,11.86,4,41,CKB -LINE_19,Station-39,2022-03-07 02:22:00,2022-03-07 02:44:00,Station-38,11139,10,41,CKB -LINE_19,Station-38,2022-03-07 02:54:00,2022-03-07 03:18:00,Station-39,11.86,4,41,CKB -LINE_19,Station-39,2022-03-07 03:22:00,2022-03-07 03:44:00,Station-38,11139,10,41,CKB -LINE_19,Station-38,2022-03-07 03:54:00,2022-03-07 04:18:00,Station-39,11.86,4,41,CKB -LINE_19,Station-39,2022-03-07 04:22:00,2022-03-07 04:44:00,Station-38,11139,0,41,CKB -LINE_19,Station-38,2022-03-07 04:44:00,2022-03-07 04:44:00,Station-0,0.06,0,41,CKB -LINE_0,Station-0,2022-03-13 20:51:00,2022-03-13 20:51:00,Station-1,0.06,0,42,CKB -LINE_0,Station-1,2022-03-13 20:51:00,2022-03-13 21:24:00,Station-2,14519,4,42,CKB -LINE_0,Station-2,2022-03-13 21:28:00,2022-03-13 22:03:00,Station-1,13541,8,42,CKB -LINE_0,Station-1,2022-03-13 22:11:00,2022-03-13 22:44:00,Station-2,14519,4,42,CKB -LINE_0,Station-2,2022-03-13 22:48:00,2022-03-13 23:23:00,Station-1,13541,8,42,CKB -LINE_0,Station-1,2022-03-13 23:31:00,2022-03-14 00:04:00,Station-2,14519,4,42,CKB -LINE_0,Station-2,2022-03-14 00:08:00,2022-03-14 00:39:00,Station-5,12213,0,42,CKB -LINE_1,Station-5,2022-03-14 00:39:00,2022-03-14 00:47:00,Station-3,4.0,2,42,CKB -LINE_1,Station-3,2022-03-14 00:49:00,2022-03-14 01:12:00,Station-4,8.36,6,42,CKB -LINE_1,Station-4,2022-03-14 01:18:00,2022-03-14 01:36:00,Station-3,9067,13,42,CKB -LINE_1,Station-3,2022-03-14 01:49:00,2022-03-14 02:12:00,Station-4,8.36,6,42,CKB -LINE_1,Station-4,2022-03-14 02:18:00,2022-03-14 02:36:00,Station-3,9067,13,42,CKB -LINE_1,Station-3,2022-03-14 02:49:00,2022-03-14 03:12:00,Station-4,8.36,6,42,CKB -LINE_1,Station-4,2022-03-14 03:18:00,2022-03-14 03:36:00,Station-3,9067,13,42,CKB -LINE_1,Station-3,2022-03-14 03:49:00,2022-03-14 04:12:00,Station-4,8.36,0,42,CKB -LINE_1,Station-4,2022-03-14 04:12:00,2022-03-14 04:12:00,Station-0,0.06,0,42,CKB -LINE_0,Station-0,2022-03-13 21:31:00,2022-03-13 21:31:00,Station-1,0.06,0,43,CKB -LINE_0,Station-1,2022-03-13 21:31:00,2022-03-13 22:04:00,Station-2,14519,4,43,CKB -LINE_0,Station-2,2022-03-13 22:08:00,2022-03-13 22:43:00,Station-1,13541,8,43,CKB -LINE_0,Station-1,2022-03-13 22:51:00,2022-03-13 23:24:00,Station-2,14519,4,43,CKB -LINE_0,Station-2,2022-03-13 23:28:00,2022-03-14 00:03:00,Station-1,13541,8,43,CKB -LINE_0,Station-1,2022-03-14 00:11:00,2022-03-14 00:44:00,Station-2,14519,0,43,CKB -LINE_1,Station-2,2022-03-14 00:44:00,2022-03-14 00:54:00,Station-3,4.1,25,43,CKB -LINE_1,Station-3,2022-03-14 01:19:00,2022-03-14 01:42:00,Station-4,8.36,6,43,CKB -LINE_1,Station-4,2022-03-14 01:48:00,2022-03-14 02:06:00,Station-3,9067,13,43,CKB -LINE_1,Station-3,2022-03-14 02:19:00,2022-03-14 02:42:00,Station-4,8.36,6,43,CKB -LINE_1,Station-4,2022-03-14 02:48:00,2022-03-14 03:06:00,Station-3,9067,13,43,CKB -LINE_1,Station-3,2022-03-14 03:19:00,2022-03-14 03:42:00,Station-4,8.36,6,43,CKB -LINE_1,Station-4,2022-03-14 03:48:00,2022-03-14 04:06:00,Station-3,9067,0,43,CKB -LINE_1,Station-3,2022-03-14 04:06:00,2022-03-14 04:06:00,Station-0,0.06,0,43,CKB -LINE_2,Station-0,2022-03-13 21:06:00,2022-03-13 21:06:00,Station-6,0.06,0,44,CKB -LINE_2,Station-6,2022-03-13 21:06:00,2022-03-13 21:34:00,Station-7,13018,19,44,CKB -LINE_2,Station-7,2022-03-13 21:53:00,2022-03-13 22:13:00,Station-8,10332,17,44,CKB -LINE_2,Station-8,2022-03-13 22:30:00,2022-03-13 22:54:00,Station-7,10.48,19,44,CKB -LINE_2,Station-7,2022-03-13 23:13:00,2022-03-13 23:33:00,Station-8,10332,17,44,CKB -LINE_2,Station-8,2022-03-13 23:50:00,2022-03-14 00:14:00,Station-7,10.48,2,44,CKB -LINE_2,Station-7,2022-03-14 00:16:00,2022-03-14 00:23:00,Station-9,3709,5,44,CKB -LINE_3,Station-9,2022-03-14 00:28:00,2022-03-14 00:44:00,Station-10,6404,3,44,CKB -LINE_3,Station-10,2022-03-14 00:47:00,2022-03-14 01:10:00,Station-11,10579,7,44,CKB -LINE_3,Station-11,2022-03-14 01:17:00,2022-03-14 01:44:00,Station-10,12007,3,44,CKB -LINE_3,Station-10,2022-03-14 01:47:00,2022-03-14 02:10:00,Station-11,10579,7,44,CKB -LINE_3,Station-11,2022-03-14 02:17:00,2022-03-14 02:44:00,Station-10,12007,3,44,CKB -LINE_3,Station-10,2022-03-14 02:47:00,2022-03-14 03:10:00,Station-11,10579,7,44,CKB -LINE_3,Station-11,2022-03-14 03:17:00,2022-03-14 03:44:00,Station-10,12007,3,44,CKB -LINE_3,Station-10,2022-03-14 03:47:00,2022-03-14 04:10:00,Station-11,10579,7,44,CKB -LINE_3,Station-11,2022-03-14 04:17:00,2022-03-14 04:44:00,Station-10,12007,0,44,CKB -LINE_3,Station-10,2022-03-14 04:44:00,2022-03-14 04:44:00,Station-0,0.06,0,44,CKB -LINE_2,Station-0,2022-03-13 20:26:00,2022-03-13 20:26:00,Station-6,0.06,0,45,CKB -LINE_2,Station-6,2022-03-13 20:26:00,2022-03-13 20:56:00,Station-12,14097,14,45,CKB -LINE_2,Station-12,2022-03-13 21:10:00,2022-03-13 21:38:00,Station-6,13.19,8,45,CKB -LINE_2,Station-6,2022-03-13 21:46:00,2022-03-13 22:14:00,Station-7,13018,19,45,CKB -LINE_2,Station-7,2022-03-13 22:33:00,2022-03-13 22:53:00,Station-8,10332,17,45,CKB -LINE_2,Station-8,2022-03-13 23:10:00,2022-03-13 23:34:00,Station-7,10.48,19,45,CKB -LINE_2,Station-7,2022-03-13 23:53:00,2022-03-14 00:13:00,Station-8,10332,2,45,CKB -LINE_2,Station-8,2022-03-14 00:15:00,2022-03-14 00:16:00,Station-10,506,1,45,CKB -LINE_3,Station-10,2022-03-14 00:17:00,2022-03-14 00:40:00,Station-11,10579,7,45,CKB -LINE_3,Station-11,2022-03-14 00:47:00,2022-03-14 01:14:00,Station-10,12007,3,45,CKB -LINE_3,Station-10,2022-03-14 01:17:00,2022-03-14 01:40:00,Station-11,10579,7,45,CKB -LINE_3,Station-11,2022-03-14 01:47:00,2022-03-14 02:14:00,Station-10,12007,3,45,CKB -LINE_3,Station-10,2022-03-14 02:17:00,2022-03-14 02:40:00,Station-11,10579,7,45,CKB -LINE_3,Station-11,2022-03-14 02:47:00,2022-03-14 03:14:00,Station-10,12007,3,45,CKB -LINE_3,Station-10,2022-03-14 03:17:00,2022-03-14 03:40:00,Station-11,10579,7,45,CKB -LINE_3,Station-11,2022-03-14 03:47:00,2022-03-14 04:14:00,Station-10,12007,3,45,CKB -LINE_3,Station-10,2022-03-14 04:17:00,2022-03-14 04:40:00,Station-11,10579,3,45,CKB -LINE_4,Station-11,2022-03-14 04:43:00,2022-03-14 04:58:00,Station-13,6161,0,45,CKB -LINE_4,Station-13,2022-03-14 04:58:00,2022-03-14 04:58:00,Station-0,0.06,0,45,CKB -LINE_20,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,46,CKB -LINE_20,Station-13,2022-03-07 00:32:00,2022-03-07 00:44:00,Station-40,4212,3,46,CKB -LINE_20,Station-40,2022-03-07 00:47:00,2022-03-07 01:16:00,Station-41,13048,0,46,CKB -LINE_20,Station-41,2022-03-07 01:16:00,2022-03-07 01:42:00,Station-40,12869,5,46,CKB -LINE_20,Station-40,2022-03-07 01:47:00,2022-03-07 02:16:00,Station-41,13048,0,46,CKB -LINE_20,Station-41,2022-03-07 02:16:00,2022-03-07 02:42:00,Station-40,12869,5,46,CKB -LINE_20,Station-40,2022-03-07 02:47:00,2022-03-07 03:16:00,Station-41,13048,0,46,CKB -LINE_20,Station-41,2022-03-07 03:16:00,2022-03-07 03:42:00,Station-40,12869,5,46,CKB -LINE_20,Station-40,2022-03-07 03:47:00,2022-03-07 04:16:00,Station-41,13048,0,46,CKB -LINE_20,Station-41,2022-03-07 04:16:00,2022-03-07 04:34:00,Station-42,9538,0,46,CKB -LINE_20,Station-42,2022-03-07 04:34:00,2022-03-07 04:34:00,Station-0,0.06,0,46,CKB -LINE_20,Station-0,2022-03-07 00:17:00,2022-03-07 00:17:00,Station-40,0.06,0,47,CKB -LINE_20,Station-40,2022-03-07 00:17:00,2022-03-07 00:46:00,Station-41,13048,0,47,CKB -LINE_20,Station-41,2022-03-07 00:46:00,2022-03-07 01:12:00,Station-40,12869,5,47,CKB -LINE_20,Station-40,2022-03-07 01:17:00,2022-03-07 01:46:00,Station-41,13048,0,47,CKB -LINE_20,Station-41,2022-03-07 01:46:00,2022-03-07 02:12:00,Station-40,12869,5,47,CKB -LINE_20,Station-40,2022-03-07 02:17:00,2022-03-07 02:46:00,Station-41,13048,0,47,CKB -LINE_20,Station-41,2022-03-07 02:46:00,2022-03-07 03:12:00,Station-40,12869,5,47,CKB -LINE_20,Station-40,2022-03-07 03:17:00,2022-03-07 03:46:00,Station-41,13048,0,47,CKB -LINE_20,Station-41,2022-03-07 03:46:00,2022-03-07 04:12:00,Station-40,12869,5,47,CKB -LINE_20,Station-40,2022-03-07 04:17:00,2022-03-07 04:28:00,Station-13,4316,0,47,CKB -LINE_20,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,47,CKB -LINE_8,Station-0,2022-03-07 00:32:00,2022-03-07 00:32:00,Station-13,0.06,0,48,CKB -LINE_8,Station-13,2022-03-07 00:32:00,2022-03-07 00:57:00,Station-21,11545,6,48,CKB -LINE_8,Station-21,2022-03-07 01:03:00,2022-03-07 01:46:00,Station-20,20579,1,48,CKB -LINE_8,Station-20,2022-03-07 01:47:00,2022-03-07 02:25:00,Station-21,20641,8,48,CKB -LINE_8,Station-21,2022-03-07 02:33:00,2022-03-07 03:16:00,Station-20,20579,1,48,CKB -LINE_8,Station-20,2022-03-07 03:17:00,2022-03-07 03:55:00,Station-21,20641,8,48,CKB -LINE_8,Station-21,2022-03-07 04:03:00,2022-03-07 04:28:00,Station-13,11499,0,48,CKB -LINE_8,Station-13,2022-03-07 04:28:00,2022-03-07 04:28:00,Station-0,0.06,0,48,CKB -LINE_8,Station-0,2022-03-07 00:33:00,2022-03-07 00:33:00,Station-21,0.06,0,49,CKB -LINE_8,Station-21,2022-03-07 00:33:00,2022-03-07 01:16:00,Station-20,20579,1,49,CKB -LINE_8,Station-20,2022-03-07 01:17:00,2022-03-07 01:55:00,Station-21,20641,8,49,CKB -LINE_8,Station-21,2022-03-07 02:03:00,2022-03-07 02:46:00,Station-20,20579,1,49,CKB -LINE_8,Station-20,2022-03-07 02:47:00,2022-03-07 03:25:00,Station-21,20641,8,49,CKB -LINE_8,Station-21,2022-03-07 03:33:00,2022-03-07 04:16:00,Station-20,20579,1,49,CKB -LINE_8,Station-20,2022-03-07 04:17:00,2022-03-07 04:51:00,Station-44,18752,0,49,CKB -LINE_8,Station-44,2022-03-07 04:51:00,2022-03-07 04:51:00,Station-0,0.06,0,49,CKB -LINE_7,Station-0,2022-03-07 00:08:00,2022-03-07 00:08:00,Station-18,0.06,0,50,CKB -LINE_7,Station-18,2022-03-07 00:08:00,2022-03-07 00:27:00,Station-19,7827,0,50,CKB -LINE_8,Station-19,2022-03-07 00:27:00,2022-03-07 00:48:00,Station-20,11079,0,50,CKB -LINE_8,Station-20,2022-03-07 00:48:00,2022-03-07 01:25:00,Station-21,20641,8,50,CKB -LINE_8,Station-21,2022-03-07 01:33:00,2022-03-07 02:16:00,Station-20,20579,1,50,CKB -LINE_8,Station-20,2022-03-07 02:17:00,2022-03-07 02:55:00,Station-21,20641,8,50,CKB -LINE_8,Station-21,2022-03-07 03:03:00,2022-03-07 03:46:00,Station-20,20579,1,50,CKB -LINE_8,Station-20,2022-03-07 03:47:00,2022-03-07 04:25:00,Station-21,20641,0,50,CKB -LINE_8,Station-21,2022-03-07 04:25:00,2022-03-07 04:25:00,Station-0,0.06,0,50,CKB -LINE_23,Station-0,2022-03-07 00:30:00,2022-03-07 00:30:00,Station-46,0.06,0,51,CKB -LINE_23,Station-46,2022-03-07 00:30:00,2022-03-07 00:57:00,Station-45,10083,7,51,CKB -LINE_23,Station-45,2022-03-07 01:04:00,2022-03-07 01:30:00,Station-46,9016,0,51,CKB -LINE_23,Station-46,2022-03-07 01:30:00,2022-03-07 01:57:00,Station-45,10083,7,51,CKB -LINE_23,Station-45,2022-03-07 02:04:00,2022-03-07 02:30:00,Station-46,9016,0,51,CKB -LINE_23,Station-46,2022-03-07 02:30:00,2022-03-07 02:57:00,Station-45,10083,7,51,CKB -LINE_23,Station-45,2022-03-07 03:04:00,2022-03-07 03:30:00,Station-46,9016,0,51,CKB -LINE_23,Station-46,2022-03-07 03:30:00,2022-03-07 03:57:00,Station-45,10083,7,51,CKB -LINE_23,Station-45,2022-03-07 04:04:00,2022-03-07 04:30:00,Station-46,9016,0,51,CKB -LINE_23,Station-46,2022-03-07 04:30:00,2022-03-07 04:57:00,Station-45,10083,0,51,CKB -LINE_23,Station-45,2022-03-07 04:57:00,2022-03-07 04:57:00,Station-0,0.06,0,51,CKB -LINE_23,Station-0,2022-03-07 00:34:00,2022-03-07 00:34:00,Station-45,0.06,0,52,CKB -LINE_23,Station-45,2022-03-07 00:34:00,2022-03-07 01:00:00,Station-46,9016,0,52,CKB -LINE_23,Station-46,2022-03-07 01:00:00,2022-03-07 01:27:00,Station-45,10083,7,52,CKB -LINE_23,Station-45,2022-03-07 01:34:00,2022-03-07 02:00:00,Station-46,9016,0,52,CKB -LINE_23,Station-46,2022-03-07 02:00:00,2022-03-07 02:27:00,Station-45,10083,7,52,CKB -LINE_23,Station-45,2022-03-07 02:34:00,2022-03-07 03:00:00,Station-46,9016,0,52,CKB -LINE_23,Station-46,2022-03-07 03:00:00,2022-03-07 03:27:00,Station-45,10083,7,52,CKB -LINE_23,Station-45,2022-03-07 03:34:00,2022-03-07 04:00:00,Station-46,9016,0,52,CKB -LINE_23,Station-46,2022-03-07 04:00:00,2022-03-07 04:27:00,Station-45,10083,0,52,CKB -LINE_23,Station-45,2022-03-07 04:27:00,2022-03-07 04:27:00,Station-0,0.06,0,52,CKB -LINE_24,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,53,CKB -LINE_24,Station-21,2022-03-07 00:31:00,2022-03-07 00:44:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 00:44:00,2022-03-07 00:56:00,Station-21,5362,5,53,CKB -LINE_24,Station-21,2022-03-07 01:01:00,2022-03-07 01:14:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 01:14:00,2022-03-07 01:26:00,Station-21,5362,5,53,CKB -LINE_24,Station-21,2022-03-07 01:31:00,2022-03-07 01:44:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 01:44:00,2022-03-07 01:56:00,Station-21,5362,5,53,CKB -LINE_24,Station-21,2022-03-07 02:01:00,2022-03-07 02:14:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 02:14:00,2022-03-07 02:26:00,Station-21,5362,5,53,CKB -LINE_24,Station-21,2022-03-07 02:31:00,2022-03-07 02:44:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 02:44:00,2022-03-07 02:56:00,Station-21,5362,5,53,CKB -LINE_24,Station-21,2022-03-07 03:01:00,2022-03-07 03:14:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 03:14:00,2022-03-07 03:26:00,Station-21,5362,5,53,CKB -LINE_24,Station-21,2022-03-07 03:31:00,2022-03-07 03:44:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 03:44:00,2022-03-07 03:56:00,Station-21,5362,5,53,CKB -LINE_24,Station-21,2022-03-07 04:01:00,2022-03-07 04:14:00,Station-47,4872,0,53,CKB -LINE_24,Station-47,2022-03-07 04:14:00,2022-03-07 04:26:00,Station-21,5362,0,53,CKB -LINE_24,Station-21,2022-03-07 04:26:00,2022-03-07 04:26:00,Station-0,0.06,0,53,CKB -LINE_25,Station-0,2022-03-07 00:31:00,2022-03-07 00:31:00,Station-21,0.06,0,54,CKB -LINE_25,Station-21,2022-03-07 00:31:00,2022-03-07 00:45:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 00:47:00,2022-03-07 01:01:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 01:01:00,2022-03-07 01:15:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 01:17:00,2022-03-07 01:31:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 01:31:00,2022-03-07 01:45:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 01:47:00,2022-03-07 02:01:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 02:01:00,2022-03-07 02:15:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 02:17:00,2022-03-07 02:31:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 02:31:00,2022-03-07 02:45:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 02:47:00,2022-03-07 03:01:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 03:01:00,2022-03-07 03:15:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 03:17:00,2022-03-07 03:31:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 03:31:00,2022-03-07 03:45:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 03:47:00,2022-03-07 04:01:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 04:01:00,2022-03-07 04:15:00,Station-48,5225,2,54,CKB -LINE_25,Station-48,2022-03-07 04:17:00,2022-03-07 04:31:00,Station-21,7617,0,54,CKB -LINE_25,Station-21,2022-03-07 04:31:00,2022-03-07 04:31:00,Station-0,0.06,0,54,CKB -LINE_26,Station-0,2022-03-07 00:43:00,2022-03-07 00:43:00,Station-49,0.06,0,55,CKB -LINE_26,Station-49,2022-03-07 00:43:00,2022-03-07 00:53:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 00:53:00,2022-03-07 01:03:00,Station-49,4408,10,55,CKB -LINE_26,Station-49,2022-03-07 01:13:00,2022-03-07 01:23:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 01:23:00,2022-03-07 01:33:00,Station-49,4408,10,55,CKB -LINE_26,Station-49,2022-03-07 01:43:00,2022-03-07 01:53:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 01:53:00,2022-03-07 02:03:00,Station-49,4408,10,55,CKB -LINE_26,Station-49,2022-03-07 02:13:00,2022-03-07 02:23:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 02:23:00,2022-03-07 02:33:00,Station-49,4408,10,55,CKB -LINE_26,Station-49,2022-03-07 02:43:00,2022-03-07 02:53:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 02:53:00,2022-03-07 03:03:00,Station-49,4408,10,55,CKB -LINE_26,Station-49,2022-03-07 03:13:00,2022-03-07 03:23:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 03:23:00,2022-03-07 03:33:00,Station-49,4408,10,55,CKB -LINE_26,Station-49,2022-03-07 03:43:00,2022-03-07 03:53:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 03:53:00,2022-03-07 04:03:00,Station-49,4408,10,55,CKB -LINE_26,Station-49,2022-03-07 04:13:00,2022-03-07 04:23:00,Station-50,4507,0,55,CKB -LINE_26,Station-50,2022-03-07 04:23:00,2022-03-07 04:33:00,Station-49,4408,0,55,CKB -LINE_26,Station-49,2022-03-07 04:33:00,2022-03-07 04:33:00,Station-0,0.06,0,55,CKB -LINE_27,Station-0,2022-03-13 15:46:00,2022-03-13 15:46:00,Station-14,0.06,0,56,CKB -LINE_27,Station-14,2022-03-13 15:46:00,2022-03-13 15:53:00,Station-51,3147,12,56,CKB -LINE_27,Station-51,2022-03-13 16:05:00,2022-03-13 16:15:00,Station-14,3469,0,56,CKB -LINE_27,Station-14,2022-03-13 16:15:00,2022-03-13 16:23:00,Station-51,3351,12,56,CKB -LINE_27,Station-51,2022-03-13 16:35:00,2022-03-13 16:45:00,Station-14,3469,0,56,CKB -LINE_27,Station-14,2022-03-13 16:45:00,2022-03-13 16:53:00,Station-51,3351,12,56,CKB -LINE_27,Station-51,2022-03-13 17:05:00,2022-03-13 17:15:00,Station-14,3469,0,56,CKB -LINE_27,Station-14,2022-03-13 17:15:00,2022-03-13 17:23:00,Station-51,3351,12,56,CKB -LINE_27,Station-51,2022-03-13 17:35:00,2022-03-13 17:45:00,Station-14,3469,0,56,CKB -LINE_27,Station-14,2022-03-13 17:45:00,2022-03-13 17:53:00,Station-51,3351,12,56,CKB -LINE_27,Station-51,2022-03-13 18:05:00,2022-03-13 18:15:00,Station-14,3469,0,56,CKB -LINE_27,Station-14,2022-03-13 18:15:00,2022-03-13 18:23:00,Station-51,3351,0,56,CKB -LINE_28,Station-51,2022-03-13 18:23:00,2022-03-13 18:29:00,Station-14,3.1,22,56,CKB -LINE_28,Station-14,2022-03-13 18:51:00,2022-03-13 19:02:00,Station-52,4338,0,56,CKB -LINE_28,Station-52,2022-03-13 19:02:00,2022-03-13 19:13:00,Station-14,4427,12,56,CKB -LINE_5,Station-14,2022-03-13 19:25:00,2022-03-13 19:38:00,Station-15,6086,3,56,CKB -LINE_5,Station-15,2022-03-13 19:41:00,2022-03-13 19:55:00,Station-14,6232,0,56,CKB -LINE_5,Station-14,2022-03-13 19:55:00,2022-03-13 20:08:00,Station-15,6086,3,56,CKB -LINE_5,Station-15,2022-03-13 20:11:00,2022-03-13 20:25:00,Station-14,6232,6,56,CKB -LINE_28,Station-14,2022-03-13 20:31:00,2022-03-13 20:42:00,Station-52,4338,0,56,CKB -LINE_28,Station-52,2022-03-13 20:42:00,2022-03-13 20:53:00,Station-14,4427,18,56,CKB -LINE_28,Station-14,2022-03-13 21:11:00,2022-03-13 21:22:00,Station-52,4338,0,56,CKB -LINE_28,Station-52,2022-03-13 21:22:00,2022-03-13 21:33:00,Station-14,4427,18,56,CKB -LINE_28,Station-14,2022-03-13 21:51:00,2022-03-13 22:02:00,Station-52,4338,0,56,CKB -LINE_28,Station-52,2022-03-13 22:02:00,2022-03-13 22:13:00,Station-14,4427,18,56,CKB -LINE_28,Station-14,2022-03-13 22:31:00,2022-03-13 22:42:00,Station-52,4338,0,56,CKB -LINE_28,Station-52,2022-03-13 22:42:00,2022-03-13 22:53:00,Station-14,4427,2,56,CKB -LINE_5,Station-14,2022-03-13 22:55:00,2022-03-13 23:08:00,Station-15,6086,3,56,CKB -LINE_5,Station-15,2022-03-13 23:11:00,2022-03-13 23:25:00,Station-14,6232,0,56,CKB -LINE_5,Station-14,2022-03-13 23:25:00,2022-03-13 23:38:00,Station-15,6086,3,56,CKB -LINE_5,Station-15,2022-03-13 23:41:00,2022-03-13 23:55:00,Station-14,6232,0,56,CKB -LINE_5,Station-14,2022-03-13 23:55:00,2022-03-14 00:08:00,Station-15,6086,0,56,CKB -LINE_5,Station-15,2022-03-14 00:08:00,2022-03-14 00:08:00,Station-0,0.06,0,56,CKB -LINE_6,Station-0,2022-03-13 07:05:00,2022-03-13 07:05:00,Station-16,0.06,0,57,CKB -LINE_6,Station-16,2022-03-13 07:05:00,2022-03-13 07:14:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 07:14:00,2022-03-13 07:23:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 07:25:00,2022-03-13 07:34:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 07:34:00,2022-03-13 07:43:00,Station-16,5139,22,57,CKB -LINE_6,Station-16,2022-03-13 08:05:00,2022-03-13 08:14:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 08:14:00,2022-03-13 08:23:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 08:25:00,2022-03-13 08:34:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 08:34:00,2022-03-13 08:43:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 08:45:00,2022-03-13 08:54:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 08:54:00,2022-03-13 09:03:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 09:05:00,2022-03-13 09:14:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 09:14:00,2022-03-13 09:23:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 09:25:00,2022-03-13 09:34:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-16,5139,23,57,CKB -LINE_6,Station-16,2022-03-13 10:06:00,2022-03-13 10:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 10:15:00,2022-03-13 10:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 10:26:00,2022-03-13 10:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 10:35:00,2022-03-13 10:44:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 10:46:00,2022-03-13 10:55:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 10:55:00,2022-03-13 11:04:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 11:06:00,2022-03-13 11:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 11:15:00,2022-03-13 11:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 11:26:00,2022-03-13 11:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 11:35:00,2022-03-13 11:44:00,Station-16,5139,22,57,CKB -LINE_6,Station-16,2022-03-13 12:06:00,2022-03-13 12:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 12:15:00,2022-03-13 12:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 12:26:00,2022-03-13 12:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 12:35:00,2022-03-13 12:44:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 12:46:00,2022-03-13 12:55:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 12:55:00,2022-03-13 13:04:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 13:06:00,2022-03-13 13:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 13:15:00,2022-03-13 13:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 13:26:00,2022-03-13 13:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 13:35:00,2022-03-13 13:44:00,Station-16,5139,22,57,CKB -LINE_6,Station-16,2022-03-13 14:06:00,2022-03-13 14:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 14:15:00,2022-03-13 14:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 14:26:00,2022-03-13 14:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 14:35:00,2022-03-13 14:44:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 14:46:00,2022-03-13 14:55:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 14:55:00,2022-03-13 15:04:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 15:06:00,2022-03-13 15:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 15:15:00,2022-03-13 15:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 15:26:00,2022-03-13 15:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 15:35:00,2022-03-13 15:44:00,Station-16,5139,22,57,CKB -LINE_6,Station-16,2022-03-13 16:06:00,2022-03-13 16:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 16:15:00,2022-03-13 16:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 16:26:00,2022-03-13 16:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 16:35:00,2022-03-13 16:44:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 16:46:00,2022-03-13 16:55:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 16:55:00,2022-03-13 17:04:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 17:06:00,2022-03-13 17:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 17:15:00,2022-03-13 17:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 17:26:00,2022-03-13 17:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 17:35:00,2022-03-13 17:44:00,Station-16,5139,22,57,CKB -LINE_6,Station-16,2022-03-13 18:06:00,2022-03-13 18:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 18:15:00,2022-03-13 18:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 18:26:00,2022-03-13 18:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 18:35:00,2022-03-13 18:44:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 18:46:00,2022-03-13 18:55:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 18:55:00,2022-03-13 19:04:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 19:06:00,2022-03-13 19:15:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 19:15:00,2022-03-13 19:24:00,Station-16,5139,2,57,CKB -LINE_6,Station-16,2022-03-13 19:26:00,2022-03-13 19:35:00,Station-17,4781,0,57,CKB -LINE_6,Station-17,2022-03-13 19:35:00,2022-03-13 19:44:00,Station-16,5139,21,57,CKB -LINE_6,Station-16,2022-03-13 20:05:00,2022-03-13 20:14:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 20:15:00,2022-03-13 20:24:00,Station-16,5139,1,57,CKB -LINE_6,Station-16,2022-03-13 20:25:00,2022-03-13 20:34:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 20:35:00,2022-03-13 20:44:00,Station-16,5139,1,57,CKB -LINE_6,Station-16,2022-03-13 20:45:00,2022-03-13 20:54:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 20:55:00,2022-03-13 21:04:00,Station-16,5139,1,57,CKB -LINE_6,Station-16,2022-03-13 21:05:00,2022-03-13 21:14:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 21:15:00,2022-03-13 21:24:00,Station-16,5139,1,57,CKB -LINE_6,Station-16,2022-03-13 21:25:00,2022-03-13 21:34:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 21:35:00,2022-03-13 21:44:00,Station-16,5139,21,57,CKB -LINE_6,Station-16,2022-03-13 22:05:00,2022-03-13 22:14:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 22:15:00,2022-03-13 22:24:00,Station-16,5139,1,57,CKB -LINE_6,Station-16,2022-03-13 22:25:00,2022-03-13 22:34:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 22:35:00,2022-03-13 22:44:00,Station-16,5139,1,57,CKB -LINE_6,Station-16,2022-03-13 22:45:00,2022-03-13 22:54:00,Station-17,4781,1,57,CKB -LINE_6,Station-17,2022-03-13 22:55:00,2022-03-13 23:04:00,Station-16,5139,0,57,CKB -LINE_6,Station-16,2022-03-13 23:04:00,2022-03-13 23:04:00,Station-0,0.06,0,57,CKB -LINE_29,Station-0,2022-03-13 07:30:00,2022-03-13 07:30:00,Station-53,0.06,0,58,CKB -LINE_29,Station-53,2022-03-13 07:30:00,2022-03-13 07:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 07:39:00,2022-03-13 07:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 07:50:00,2022-03-13 07:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 07:59:00,2022-03-13 08:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 08:10:00,2022-03-13 08:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 08:19:00,2022-03-13 08:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 08:30:00,2022-03-13 08:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 08:39:00,2022-03-13 08:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 08:50:00,2022-03-13 08:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 08:59:00,2022-03-13 09:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 09:10:00,2022-03-13 09:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 09:19:00,2022-03-13 09:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 09:30:00,2022-03-13 09:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 09:39:00,2022-03-13 09:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 09:50:00,2022-03-13 09:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 09:59:00,2022-03-13 10:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 10:10:00,2022-03-13 10:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 10:30:00,2022-03-13 10:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 10:39:00,2022-03-13 10:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 10:50:00,2022-03-13 10:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 10:59:00,2022-03-13 11:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 11:10:00,2022-03-13 11:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 11:19:00,2022-03-13 11:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 11:30:00,2022-03-13 11:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 11:39:00,2022-03-13 11:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 11:50:00,2022-03-13 11:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 11:59:00,2022-03-13 12:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 12:10:00,2022-03-13 12:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 12:19:00,2022-03-13 12:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 12:30:00,2022-03-13 12:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 12:39:00,2022-03-13 12:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 12:50:00,2022-03-13 12:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 12:59:00,2022-03-13 13:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 13:10:00,2022-03-13 13:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 13:19:00,2022-03-13 13:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 13:30:00,2022-03-13 13:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 13:39:00,2022-03-13 13:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 13:50:00,2022-03-13 13:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 13:59:00,2022-03-13 14:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 14:10:00,2022-03-13 14:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 14:19:00,2022-03-13 14:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 14:30:00,2022-03-13 14:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 14:39:00,2022-03-13 14:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 14:50:00,2022-03-13 14:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 14:59:00,2022-03-13 15:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 15:10:00,2022-03-13 15:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 15:19:00,2022-03-13 15:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 15:30:00,2022-03-13 15:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 15:39:00,2022-03-13 15:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 15:50:00,2022-03-13 15:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 15:59:00,2022-03-13 16:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 16:10:00,2022-03-13 16:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 16:19:00,2022-03-13 16:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 16:30:00,2022-03-13 16:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 16:39:00,2022-03-13 16:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 16:50:00,2022-03-13 16:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 16:59:00,2022-03-13 17:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 17:10:00,2022-03-13 17:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 17:19:00,2022-03-13 17:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 17:30:00,2022-03-13 17:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 17:39:00,2022-03-13 17:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 17:50:00,2022-03-13 17:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 17:59:00,2022-03-13 18:10:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 18:10:00,2022-03-13 18:15:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 18:19:00,2022-03-13 18:30:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 18:30:00,2022-03-13 18:35:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 18:39:00,2022-03-13 18:50:00,Station-53,4341,0,58,CKB -LINE_29,Station-53,2022-03-13 18:50:00,2022-03-13 18:55:00,Station-54,2217,4,58,CKB -LINE_29,Station-54,2022-03-13 18:59:00,2022-03-13 19:10:00,Station-53,4288,0,58,CKB -LINE_29,Station-53,2022-03-13 19:10:00,2022-03-13 19:10:00,Station-0,0.06,0,58,CKB -LINE_10,Station-0,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.06,0,59,CKB -LINE_10,Station-24,2022-03-13 07:56:00,2022-03-13 07:56:00,Station-24,0.0,792,59,CKB -LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-24,0.0,0,59,CKB -LINE_10,Station-24,2022-03-13 21:08:00,2022-03-13 21:08:00,Station-0,0.06,0,59,CKB -LINE_30,Station-0,2022-03-13 07:18:00,2022-03-13 07:18:00,Station-55,0.06,0,60,CKB -LINE_30,Station-55,2022-03-13 07:18:00,2022-03-13 07:26:00,Station-56,5562,10,60,CKB -LINE_30,Station-56,2022-03-13 07:36:00,2022-03-13 07:45:00,Station-57,5941,32,60,CKB -LINE_30,Station-57,2022-03-13 08:17:00,2022-03-13 08:26:00,Station-56,5994,10,60,CKB -LINE_30,Station-56,2022-03-13 08:36:00,2022-03-13 08:45:00,Station-57,5941,32,60,CKB -LINE_30,Station-57,2022-03-13 09:17:00,2022-03-13 09:26:00,Station-56,5994,8,60,CKB -LINE_30,Station-56,2022-03-13 09:34:00,2022-03-13 09:43:00,Station-57,5941,36,60,CKB -LINE_30,Station-57,2022-03-13 10:19:00,2022-03-13 10:30:00,Station-56,5994,2,60,CKB -LINE_30,Station-56,2022-03-13 10:32:00,2022-03-13 10:41:00,Station-55,5566,0,60,CKB -LINE_30,Station-55,2022-03-13 10:41:00,2022-03-13 10:41:00,Station-0,0.06,0,60,CKB -LINE_0,Station-0,2022-03-08 21:31:00,2022-03-08 21:31:00,Station-1,0.06,0,61,CKB -LINE_0,Station-1,2022-03-08 21:31:00,2022-03-08 22:04:00,Station-2,14519,4,61,CKB -LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-1,13541,8,61,CKB -LINE_0,Station-1,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-2,14519,4,61,CKB -LINE_0,Station-2,2022-03-08 23:28:00,2022-03-09 00:03:00,Station-1,13541,8,61,CKB -LINE_0,Station-1,2022-03-09 00:11:00,2022-03-09 00:44:00,Station-2,14519,0,61,CKB -LINE_1,Station-2,2022-03-09 00:44:00,2022-03-09 00:54:00,Station-3,4.1,25,61,CKB -LINE_1,Station-3,2022-03-09 01:19:00,2022-03-09 01:42:00,Station-4,8.36,6,61,CKB -LINE_1,Station-4,2022-03-09 01:48:00,2022-03-09 02:06:00,Station-3,9067,13,61,CKB -LINE_1,Station-3,2022-03-09 02:19:00,2022-03-09 02:42:00,Station-4,8.36,6,61,CKB -LINE_1,Station-4,2022-03-09 02:48:00,2022-03-09 03:06:00,Station-3,9067,13,61,CKB -LINE_1,Station-3,2022-03-09 03:19:00,2022-03-09 03:42:00,Station-4,8.36,6,61,CKB -LINE_1,Station-4,2022-03-09 03:48:00,2022-03-09 04:06:00,Station-3,9067,0,61,CKB -LINE_1,Station-3,2022-03-09 04:06:00,2022-03-09 04:06:00,Station-0,0.06,0,61,CKB -LINE_0,Station-0,2022-03-08 22:11:00,2022-03-08 22:11:00,Station-1,0.06,0,62,CKB -LINE_0,Station-1,2022-03-08 22:11:00,2022-03-08 22:44:00,Station-2,14519,4,62,CKB -LINE_0,Station-2,2022-03-08 22:48:00,2022-03-08 23:23:00,Station-1,13541,8,62,CKB -LINE_0,Station-1,2022-03-08 23:31:00,2022-03-09 00:04:00,Station-2,14519,4,62,CKB -LINE_0,Station-2,2022-03-09 00:08:00,2022-03-09 00:39:00,Station-5,12213,0,62,CKB -LINE_1,Station-5,2022-03-09 00:39:00,2022-03-09 00:47:00,Station-3,4.0,2,62,CKB -LINE_1,Station-3,2022-03-09 00:49:00,2022-03-09 01:12:00,Station-4,8.36,6,62,CKB -LINE_1,Station-4,2022-03-09 01:18:00,2022-03-09 01:36:00,Station-3,9067,13,62,CKB -LINE_1,Station-3,2022-03-09 01:49:00,2022-03-09 02:12:00,Station-4,8.36,6,62,CKB -LINE_1,Station-4,2022-03-09 02:18:00,2022-03-09 02:36:00,Station-3,9067,13,62,CKB -LINE_1,Station-3,2022-03-09 02:49:00,2022-03-09 03:12:00,Station-4,8.36,6,62,CKB -LINE_1,Station-4,2022-03-09 03:18:00,2022-03-09 03:36:00,Station-3,9067,13,62,CKB -LINE_1,Station-3,2022-03-09 03:49:00,2022-03-09 04:12:00,Station-4,8.36,0,62,CKB -LINE_1,Station-4,2022-03-09 04:12:00,2022-03-09 04:12:00,Station-0,0.06,0,62,CKB -LINE_2,Station-0,2022-03-08 21:06:00,2022-03-08 21:06:00,Station-6,0.06,0,63,CKB -LINE_2,Station-6,2022-03-08 21:06:00,2022-03-08 21:34:00,Station-7,13018,19,63,CKB -LINE_2,Station-7,2022-03-08 21:53:00,2022-03-08 22:13:00,Station-8,10332,17,63,CKB -LINE_2,Station-8,2022-03-08 22:30:00,2022-03-08 22:54:00,Station-7,10.48,19,63,CKB -LINE_2,Station-7,2022-03-08 23:13:00,2022-03-08 23:33:00,Station-8,10332,17,63,CKB -LINE_2,Station-8,2022-03-08 23:50:00,2022-03-09 00:14:00,Station-7,10.48,2,63,CKB -LINE_2,Station-7,2022-03-09 00:16:00,2022-03-09 00:23:00,Station-9,3709,5,63,CKB -LINE_3,Station-9,2022-03-09 00:28:00,2022-03-09 00:44:00,Station-10,6404,3,63,CKB -LINE_3,Station-10,2022-03-09 00:47:00,2022-03-09 01:10:00,Station-11,10579,7,63,CKB -LINE_3,Station-11,2022-03-09 01:17:00,2022-03-09 01:44:00,Station-10,12007,3,63,CKB -LINE_3,Station-10,2022-03-09 01:47:00,2022-03-09 02:10:00,Station-11,10579,7,63,CKB -LINE_3,Station-11,2022-03-09 02:17:00,2022-03-09 02:44:00,Station-10,12007,3,63,CKB -LINE_3,Station-10,2022-03-09 02:47:00,2022-03-09 03:10:00,Station-11,10579,7,63,CKB -LINE_3,Station-11,2022-03-09 03:17:00,2022-03-09 03:44:00,Station-10,12007,3,63,CKB -LINE_3,Station-10,2022-03-09 03:47:00,2022-03-09 04:10:00,Station-11,10579,7,63,CKB -LINE_3,Station-11,2022-03-09 04:17:00,2022-03-09 04:44:00,Station-10,12007,0,63,CKB -LINE_3,Station-10,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,63,CKB -LINE_2,Station-0,2022-03-08 20:26:00,2022-03-08 20:26:00,Station-6,0.06,0,64,CKB -LINE_2,Station-6,2022-03-08 20:26:00,2022-03-08 20:56:00,Station-12,14097,14,64,CKB -LINE_2,Station-12,2022-03-08 21:10:00,2022-03-08 21:38:00,Station-6,13.19,8,64,CKB -LINE_2,Station-6,2022-03-08 21:46:00,2022-03-08 22:14:00,Station-7,13018,19,64,CKB -LINE_2,Station-7,2022-03-08 22:33:00,2022-03-08 22:53:00,Station-8,10332,17,64,CKB -LINE_2,Station-8,2022-03-08 23:10:00,2022-03-08 23:34:00,Station-7,10.48,19,64,CKB -LINE_2,Station-7,2022-03-08 23:53:00,2022-03-09 00:13:00,Station-8,10332,2,64,CKB -LINE_2,Station-8,2022-03-09 00:15:00,2022-03-09 00:16:00,Station-10,506,1,64,CKB -LINE_3,Station-10,2022-03-09 00:17:00,2022-03-09 00:40:00,Station-11,10579,7,64,CKB -LINE_3,Station-11,2022-03-09 00:47:00,2022-03-09 01:14:00,Station-10,12007,3,64,CKB -LINE_3,Station-10,2022-03-09 01:17:00,2022-03-09 01:40:00,Station-11,10579,7,64,CKB -LINE_3,Station-11,2022-03-09 01:47:00,2022-03-09 02:14:00,Station-10,12007,3,64,CKB -LINE_3,Station-10,2022-03-09 02:17:00,2022-03-09 02:40:00,Station-11,10579,7,64,CKB -LINE_3,Station-11,2022-03-09 02:47:00,2022-03-09 03:14:00,Station-10,12007,3,64,CKB -LINE_3,Station-10,2022-03-09 03:17:00,2022-03-09 03:40:00,Station-11,10579,7,64,CKB -LINE_3,Station-11,2022-03-09 03:47:00,2022-03-09 04:14:00,Station-10,12007,3,64,CKB -LINE_3,Station-10,2022-03-09 04:17:00,2022-03-09 04:40:00,Station-11,10579,3,64,CKB -LINE_4,Station-11,2022-03-09 04:43:00,2022-03-09 04:58:00,Station-13,6161,0,64,CKB -LINE_4,Station-13,2022-03-09 04:58:00,2022-03-09 04:58:00,Station-0,0.06,0,64,CKB -LINE_5,Station-0,2022-03-08 22:56:00,2022-03-08 22:56:00,Station-14,0.06,0,65,CKB -LINE_5,Station-14,2022-03-08 22:56:00,2022-03-08 23:08:00,Station-15,5882,3,65,CKB -LINE_5,Station-15,2022-03-08 23:11:00,2022-03-08 23:25:00,Station-14,6232,0,65,CKB -LINE_5,Station-14,2022-03-08 23:25:00,2022-03-08 23:38:00,Station-15,6086,3,65,CKB -LINE_5,Station-15,2022-03-08 23:41:00,2022-03-08 23:55:00,Station-14,6232,0,65,CKB -LINE_5,Station-14,2022-03-08 23:55:00,2022-03-09 00:08:00,Station-15,6086,0,65,CKB -LINE_5,Station-15,2022-03-09 00:08:00,2022-03-09 00:08:00,Station-0,0.06,0,65,CKB -LINE_6,Station-0,2022-03-08 05:05:00,2022-03-08 05:05:00,Station-16,0.06,0,66,CKB -LINE_6,Station-16,2022-03-08 05:05:00,2022-03-08 05:14:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 05:14:00,2022-03-08 05:23:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 05:25:00,2022-03-08 05:34:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 05:34:00,2022-03-08 05:43:00,Station-16,5139,23,66,CKB -LINE_6,Station-16,2022-03-08 06:06:00,2022-03-08 06:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 06:15:00,2022-03-08 06:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 06:26:00,2022-03-08 06:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 06:35:00,2022-03-08 06:44:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 06:46:00,2022-03-08 06:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 06:55:00,2022-03-08 07:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 07:06:00,2022-03-08 07:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 07:15:00,2022-03-08 07:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 07:26:00,2022-03-08 07:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 07:35:00,2022-03-08 07:44:00,Station-16,5139,22,66,CKB -LINE_6,Station-16,2022-03-08 08:06:00,2022-03-08 08:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 08:15:00,2022-03-08 08:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 08:26:00,2022-03-08 08:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 08:35:00,2022-03-08 08:44:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 08:46:00,2022-03-08 08:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 08:55:00,2022-03-08 09:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 09:06:00,2022-03-08 09:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 09:15:00,2022-03-08 09:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 09:26:00,2022-03-08 09:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 09:35:00,2022-03-08 09:44:00,Station-16,5139,22,66,CKB -LINE_6,Station-16,2022-03-08 10:06:00,2022-03-08 10:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 10:15:00,2022-03-08 10:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 10:26:00,2022-03-08 10:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 10:35:00,2022-03-08 10:44:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 10:46:00,2022-03-08 10:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 10:55:00,2022-03-08 11:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 11:06:00,2022-03-08 11:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 11:15:00,2022-03-08 11:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 11:26:00,2022-03-08 11:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 11:35:00,2022-03-08 11:44:00,Station-16,5139,22,66,CKB -LINE_6,Station-16,2022-03-08 12:06:00,2022-03-08 12:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 12:15:00,2022-03-08 12:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 12:26:00,2022-03-08 12:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 12:35:00,2022-03-08 12:44:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 12:46:00,2022-03-08 12:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 12:55:00,2022-03-08 13:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 13:06:00,2022-03-08 13:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 13:15:00,2022-03-08 13:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 13:26:00,2022-03-08 13:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 13:35:00,2022-03-08 13:44:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 13:46:00,2022-03-08 13:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 13:55:00,2022-03-08 14:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 14:06:00,2022-03-08 14:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 14:15:00,2022-03-08 14:24:00,Station-16,5139,22,66,CKB -LINE_6,Station-16,2022-03-08 14:46:00,2022-03-08 14:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 14:55:00,2022-03-08 15:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 15:06:00,2022-03-08 15:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 15:15:00,2022-03-08 15:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 15:26:00,2022-03-08 15:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 15:35:00,2022-03-08 15:44:00,Station-16,5139,22,66,CKB -LINE_6,Station-16,2022-03-08 16:06:00,2022-03-08 16:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 16:15:00,2022-03-08 16:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 16:26:00,2022-03-08 16:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 16:35:00,2022-03-08 16:44:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 16:46:00,2022-03-08 16:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 16:55:00,2022-03-08 17:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 17:06:00,2022-03-08 17:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 17:15:00,2022-03-08 17:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 17:26:00,2022-03-08 17:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 17:35:00,2022-03-08 17:44:00,Station-16,5139,22,66,CKB -LINE_6,Station-16,2022-03-08 18:06:00,2022-03-08 18:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 18:15:00,2022-03-08 18:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 18:26:00,2022-03-08 18:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 18:35:00,2022-03-08 18:44:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 18:46:00,2022-03-08 18:55:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 18:55:00,2022-03-08 19:04:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 19:06:00,2022-03-08 19:15:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 19:15:00,2022-03-08 19:24:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 19:26:00,2022-03-08 19:35:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 19:35:00,2022-03-08 19:44:00,Station-16,5139,21,66,CKB -LINE_6,Station-16,2022-03-08 20:05:00,2022-03-08 20:14:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 20:14:00,2022-03-08 20:23:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 20:25:00,2022-03-08 20:34:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 20:34:00,2022-03-08 20:43:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 20:45:00,2022-03-08 20:54:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 20:54:00,2022-03-08 21:03:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 21:05:00,2022-03-08 21:14:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 21:14:00,2022-03-08 21:23:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 21:25:00,2022-03-08 21:34:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 21:34:00,2022-03-08 21:43:00,Station-16,5139,22,66,CKB -LINE_6,Station-16,2022-03-08 22:05:00,2022-03-08 22:14:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 22:14:00,2022-03-08 22:23:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 22:25:00,2022-03-08 22:34:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 22:34:00,2022-03-08 22:43:00,Station-16,5139,2,66,CKB -LINE_6,Station-16,2022-03-08 22:45:00,2022-03-08 22:54:00,Station-17,4781,0,66,CKB -LINE_6,Station-17,2022-03-08 22:54:00,2022-03-08 23:03:00,Station-16,5139,0,66,CKB -LINE_6,Station-16,2022-03-08 23:03:00,2022-03-08 23:03:00,Station-0,0.06,0,66,CKB -LINE_7,Station-0,2022-03-09 00:06:00,2022-03-09 00:06:00,Station-18,0.06,0,67,CKB -LINE_7,Station-18,2022-03-09 00:06:00,2022-03-09 00:27:00,Station-19,7827,0,67,CKB -LINE_8,Station-19,2022-03-09 00:27:00,2022-03-09 00:48:00,Station-20,11079,0,67,CKB -LINE_8,Station-20,2022-03-09 00:48:00,2022-03-09 01:25:00,Station-21,20641,8,67,CKB -LINE_8,Station-21,2022-03-09 01:33:00,2022-03-09 02:16:00,Station-20,20579,1,67,CKB -LINE_8,Station-20,2022-03-09 02:17:00,2022-03-09 02:55:00,Station-21,20641,8,67,CKB -LINE_8,Station-21,2022-03-09 03:03:00,2022-03-09 03:46:00,Station-20,20579,1,67,CKB -LINE_8,Station-20,2022-03-09 03:47:00,2022-03-09 04:25:00,Station-21,20641,0,67,CKB -LINE_8,Station-21,2022-03-09 04:25:00,2022-03-09 04:25:00,Station-0,0.06,0,67,CKB -LINE_9,Station-22,2022-03-08 05:15:00,2022-03-08 06:01:00,Station-23,17.9,0,68,VDL -LINE_9,Station-23,2022-03-08 06:01:00,2022-03-08 06:15:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 06:23:00,2022-03-08 06:37:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 06:41:00,2022-03-08 06:55:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 07:03:00,2022-03-08 07:17:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 07:21:00,2022-03-08 07:35:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 07:43:00,2022-03-08 07:57:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 08:01:00,2022-03-08 08:15:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 08:23:00,2022-03-08 08:37:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 08:41:00,2022-03-08 08:55:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 09:03:00,2022-03-08 09:17:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 09:21:00,2022-03-08 09:35:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 09:43:00,2022-03-08 09:57:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 10:01:00,2022-03-08 10:15:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 10:23:00,2022-03-08 10:37:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 10:41:00,2022-03-08 10:55:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 11:03:00,2022-03-08 11:17:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 11:21:00,2022-03-08 11:35:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 11:43:00,2022-03-08 11:57:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 12:01:00,2022-03-08 12:15:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 12:23:00,2022-03-08 12:37:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 12:41:00,2022-03-08 12:55:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 13:03:00,2022-03-08 13:17:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 13:21:00,2022-03-08 13:35:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 13:43:00,2022-03-08 13:57:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 14:01:00,2022-03-08 14:15:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 14:23:00,2022-03-08 14:37:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 14:41:00,2022-03-08 14:55:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 15:03:00,2022-03-08 15:17:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 15:21:00,2022-03-08 15:35:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 15:43:00,2022-03-08 15:57:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 16:01:00,2022-03-08 16:15:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 16:23:00,2022-03-08 16:37:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 16:41:00,2022-03-08 16:55:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 17:03:00,2022-03-08 17:17:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 17:21:00,2022-03-08 17:35:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 17:43:00,2022-03-08 17:57:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 18:01:00,2022-03-08 18:15:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 18:23:00,2022-03-08 18:37:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 18:41:00,2022-03-08 18:55:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 19:03:00,2022-03-08 19:17:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 19:21:00,2022-03-08 19:35:00,Station-23,4637,8,68,VDL -LINE_9,Station-23,2022-03-08 19:43:00,2022-03-08 19:57:00,Station-23,4637,4,68,VDL -LINE_9,Station-23,2022-03-08 20:01:00,2022-03-08 20:14:00,Station-23,4637,9,68,VDL -LINE_9,Station-23,2022-03-08 20:23:00,2022-03-08 20:36:00,Station-23,4637,0,68,VDL -LINE_9,Station-23,2022-03-08 20:36:00,2022-03-08 21:15:00,Station-22,19.8,0,68,VDL -LINE_10,Station-0,2022-03-08 04:56:00,2022-03-08 04:56:00,Station-24,0.06,18,69,CKB -LINE_10,Station-24,2022-03-08 05:14:00,2022-03-08 05:20:00,Station-25,3.29,0,69,CKB -LINE_10,Station-25,2022-03-08 05:20:00,2022-03-08 05:24:00,Station-24,2954,20,69,CKB -LINE_10,Station-24,2022-03-08 05:44:00,2022-03-08 05:50:00,Station-25,3.29,0,69,CKB -LINE_10,Station-25,2022-03-08 05:50:00,2022-03-08 05:54:00,Station-24,2954,5,69,CKB -LINE_10,Station-24,2022-03-08 05:59:00,2022-03-08 06:06:00,Station-25,3.29,2,69,CKB -LINE_10,Station-25,2022-03-08 06:08:00,2022-03-08 06:13:00,Station-24,2954,19,69,CKB -LINE_10,Station-24,2022-03-08 06:32:00,2022-03-08 06:39:00,Station-25,3.29,1,69,CKB -LINE_10,Station-25,2022-03-08 06:40:00,2022-03-08 06:45:00,Station-24,2954,7,69,CKB -LINE_10,Station-24,2022-03-08 06:52:00,2022-03-08 06:59:00,Station-25,3.29,1,69,CKB -LINE_10,Station-25,2022-03-08 07:00:00,2022-03-08 07:05:00,Station-24,2954,7,69,CKB -LINE_10,Station-24,2022-03-08 07:12:00,2022-03-08 07:19:00,Station-25,3.29,1,69,CKB -LINE_10,Station-25,2022-03-08 07:20:00,2022-03-08 07:25:00,Station-24,2954,7,69,CKB -LINE_10,Station-24,2022-03-08 07:32:00,2022-03-08 07:39:00,Station-25,3.29,1,69,CKB -LINE_10,Station-25,2022-03-08 07:40:00,2022-03-08 07:45:00,Station-24,2954,295,69,CKB -LINE_10,Station-24,2022-03-08 12:40:00,2022-03-08 12:47:00,Station-25,3.29,2,69,CKB -LINE_10,Station-25,2022-03-08 12:49:00,2022-03-08 12:54:00,Station-24,2954,46,69,CKB -LINE_10,Station-24,2022-03-08 13:40:00,2022-03-08 13:47:00,Station-25,3.29,2,69,CKB -LINE_10,Station-25,2022-03-08 13:49:00,2022-03-08 13:54:00,Station-24,2954,434,69,CKB -LINE_10,Station-24,2022-03-08 21:08:00,2022-03-08 21:08:00,Station-0,0.06,0,69,CKB -LINE_11,Station-0,2022-03-08 07:20:00,2022-03-08 07:20:00,Station-26,0.06,0,70,CKB -LINE_11,Station-26,2022-03-08 07:20:00,2022-03-08 07:50:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 08:00:00,2022-03-08 08:30:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 08:40:00,2022-03-08 09:10:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 09:20:00,2022-03-08 09:50:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 10:00:00,2022-03-08 10:30:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 10:40:00,2022-03-08 11:10:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 11:20:00,2022-03-08 11:50:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 12:00:00,2022-03-08 12:30:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 12:40:00,2022-03-08 13:10:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 13:20:00,2022-03-08 13:50:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 14:00:00,2022-03-08 14:30:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 14:40:00,2022-03-08 15:10:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 15:20:00,2022-03-08 15:50:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 16:00:00,2022-03-08 16:30:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 16:40:00,2022-03-08 17:10:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 17:20:00,2022-03-08 17:50:00,Station-26,9266,10,70,CKB -LINE_11,Station-26,2022-03-08 18:00:00,2022-03-08 18:30:00,Station-26,9266,0,70,CKB -LINE_11,Station-26,2022-03-08 18:30:00,2022-03-08 18:30:00,Station-0,0.06,0,70,CKB -LINE_12,Station-0,2022-03-08 07:10:00,2022-03-08 07:10:00,Station-27,0.06,0,71,CKB -LINE_12,Station-27,2022-03-08 07:10:00,2022-03-08 07:18:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 07:28:00,2022-03-08 07:40:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 07:40:00,2022-03-08 07:48:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 07:58:00,2022-03-08 08:10:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 08:10:00,2022-03-08 08:18:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 08:28:00,2022-03-08 08:40:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 08:40:00,2022-03-08 08:48:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 08:58:00,2022-03-08 09:10:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 09:10:00,2022-03-08 09:18:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 09:28:00,2022-03-08 09:40:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 09:40:00,2022-03-08 09:48:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 09:58:00,2022-03-08 10:10:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 10:10:00,2022-03-08 10:18:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 10:28:00,2022-03-08 10:40:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 10:40:00,2022-03-08 10:48:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 10:58:00,2022-03-08 11:10:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 11:10:00,2022-03-08 11:18:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 11:28:00,2022-03-08 11:40:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 11:40:00,2022-03-08 11:48:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 11:58:00,2022-03-08 12:10:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 12:10:00,2022-03-08 12:18:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 12:28:00,2022-03-08 12:40:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 12:40:00,2022-03-08 12:48:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 12:58:00,2022-03-08 13:10:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 13:10:00,2022-03-08 13:18:00,Station-28,2169,10,71,CKB -LINE_12,Station-28,2022-03-08 13:28:00,2022-03-08 13:40:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 13:40:00,2022-03-08 13:48:00,Station-28,2169,8,71,CKB -LINE_12,Station-28,2022-03-08 13:56:00,2022-03-08 14:10:00,Station-27,2952,0,71,CKB -LINE_12,Station-27,2022-03-08 14:10:00,2022-03-08 14:19:00,Station-28,2169,14,71,CKB -LINE_12,Station-28,2022-03-08 14:33:00,2022-03-08 14:47:00,Station-27,2952,3,71,CKB -LINE_12,Station-27,2022-03-08 14:50:00,2022-03-08 14:59:00,Station-28,2169,14,71,CKB -LINE_12,Station-28,2022-03-08 15:13:00,2022-03-08 15:27:00,Station-27,2952,3,71,CKB -LINE_12,Station-27,2022-03-08 15:30:00,2022-03-08 15:39:00,Station-28,2169,14,71,CKB -LINE_12,Station-28,2022-03-08 15:53:00,2022-03-08 16:07:00,Station-27,2952,3,71,CKB -LINE_12,Station-27,2022-03-08 16:10:00,2022-03-08 16:19:00,Station-28,2169,14,71,CKB -LINE_12,Station-28,2022-03-08 16:33:00,2022-03-08 16:47:00,Station-27,2952,3,71,CKB -LINE_12,Station-27,2022-03-08 16:50:00,2022-03-08 16:59:00,Station-28,2169,14,71,CKB -LINE_12,Station-28,2022-03-08 17:13:00,2022-03-08 17:27:00,Station-27,2952,3,71,CKB -LINE_12,Station-27,2022-03-08 17:30:00,2022-03-08 17:39:00,Station-28,2169,13,71,CKB -LINE_12,Station-28,2022-03-08 17:52:00,2022-03-08 18:05:00,Station-27,2952,5,71,CKB -LINE_12,Station-27,2022-03-08 18:10:00,2022-03-08 18:18:00,Station-28,2169,0,71,CKB -LINE_12,Station-28,2022-03-08 18:18:00,2022-03-08 18:18:00,Station-0,0.06,0,71,CKB -LINE_12,Station-0,2022-03-08 14:13:00,2022-03-08 14:13:00,Station-28,0.06,0,72,CKB -LINE_12,Station-28,2022-03-08 14:13:00,2022-03-08 14:27:00,Station-27,2952,3,72,CKB -LINE_12,Station-27,2022-03-08 14:30:00,2022-03-08 14:39:00,Station-28,2169,14,72,CKB -LINE_12,Station-28,2022-03-08 14:53:00,2022-03-08 15:07:00,Station-27,2952,3,72,CKB -LINE_12,Station-27,2022-03-08 15:10:00,2022-03-08 15:19:00,Station-28,2169,14,72,CKB -LINE_12,Station-28,2022-03-08 15:33:00,2022-03-08 15:47:00,Station-27,2952,3,72,CKB -LINE_12,Station-27,2022-03-08 15:50:00,2022-03-08 15:59:00,Station-28,2169,14,72,CKB -LINE_12,Station-28,2022-03-08 16:13:00,2022-03-08 16:27:00,Station-27,2952,3,72,CKB -LINE_12,Station-27,2022-03-08 16:30:00,2022-03-08 16:39:00,Station-28,2169,14,72,CKB -LINE_12,Station-28,2022-03-08 16:53:00,2022-03-08 17:07:00,Station-27,2952,3,72,CKB -LINE_12,Station-27,2022-03-08 17:10:00,2022-03-08 17:19:00,Station-28,2169,14,72,CKB -LINE_12,Station-28,2022-03-08 17:33:00,2022-03-08 17:47:00,Station-27,2952,3,72,CKB -LINE_12,Station-27,2022-03-08 17:50:00,2022-03-08 17:59:00,Station-28,2169,14,72,CKB -LINE_12,Station-28,2022-03-08 18:13:00,2022-03-08 18:25:00,Station-27,2952,0,72,CKB -LINE_12,Station-27,2022-03-08 18:25:00,2022-03-08 18:25:00,Station-0,0.06,0,72,CKB -LINE_13,Station-0,2022-03-09 00:23:00,2022-03-09 00:23:00,Station-29,0.06,0,73,CKB -LINE_13,Station-29,2022-03-09 00:23:00,2022-03-09 00:30:00,Station-30,2577,9,73,CKB -LINE_14,Station-30,2022-03-09 00:39:00,2022-03-09 00:54:00,Station-31,5937,9,73,CKB -LINE_14,Station-31,2022-03-09 01:03:00,2022-03-09 01:17:00,Station-30,6.19,0,73,CKB -LINE_13,Station-30,2022-03-09 01:17:00,2022-03-09 01:23:00,Station-29,2555,0,73,CKB -LINE_13,Station-29,2022-03-09 01:23:00,2022-03-09 01:30:00,Station-30,2577,9,73,CKB -LINE_14,Station-30,2022-03-09 01:39:00,2022-03-09 01:54:00,Station-31,5937,9,73,CKB -LINE_14,Station-31,2022-03-09 02:03:00,2022-03-09 02:17:00,Station-30,6.19,0,73,CKB -LINE_13,Station-30,2022-03-09 02:17:00,2022-03-09 02:23:00,Station-29,2555,0,73,CKB -LINE_13,Station-29,2022-03-09 02:23:00,2022-03-09 02:30:00,Station-30,2577,9,73,CKB -LINE_14,Station-30,2022-03-09 02:39:00,2022-03-09 02:54:00,Station-31,5937,9,73,CKB -LINE_14,Station-31,2022-03-09 03:03:00,2022-03-09 03:17:00,Station-30,6.19,0,73,CKB -LINE_13,Station-30,2022-03-09 03:17:00,2022-03-09 03:23:00,Station-29,2555,0,73,CKB -LINE_13,Station-29,2022-03-09 03:23:00,2022-03-09 03:30:00,Station-30,2577,9,73,CKB -LINE_14,Station-30,2022-03-09 03:39:00,2022-03-09 03:54:00,Station-31,5937,9,73,CKB -LINE_14,Station-31,2022-03-09 04:03:00,2022-03-09 04:17:00,Station-30,6.19,0,73,CKB -LINE_13,Station-30,2022-03-09 04:17:00,2022-03-09 04:23:00,Station-29,2555,0,73,CKB -LINE_13,Station-29,2022-03-09 04:23:00,2022-03-09 04:23:00,Station-0,0.06,0,73,CKB -LINE_14,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-31,0.06,0,74,CKB -LINE_14,Station-31,2022-03-09 00:33:00,2022-03-09 00:47:00,Station-30,6.19,0,74,CKB -LINE_13,Station-30,2022-03-09 00:47:00,2022-03-09 00:53:00,Station-29,2555,0,74,CKB -LINE_13,Station-29,2022-03-09 00:53:00,2022-03-09 01:00:00,Station-30,2577,9,74,CKB -LINE_14,Station-30,2022-03-09 01:09:00,2022-03-09 01:24:00,Station-31,5937,9,74,CKB -LINE_14,Station-31,2022-03-09 01:33:00,2022-03-09 01:47:00,Station-30,6.19,0,74,CKB -LINE_13,Station-30,2022-03-09 01:47:00,2022-03-09 01:53:00,Station-29,2555,0,74,CKB -LINE_13,Station-29,2022-03-09 01:53:00,2022-03-09 02:00:00,Station-30,2577,9,74,CKB -LINE_14,Station-30,2022-03-09 02:09:00,2022-03-09 02:24:00,Station-31,5937,9,74,CKB -LINE_14,Station-31,2022-03-09 02:33:00,2022-03-09 02:47:00,Station-30,6.19,0,74,CKB -LINE_13,Station-30,2022-03-09 02:47:00,2022-03-09 02:53:00,Station-29,2555,0,74,CKB -LINE_13,Station-29,2022-03-09 02:53:00,2022-03-09 03:00:00,Station-30,2577,9,74,CKB -LINE_14,Station-30,2022-03-09 03:09:00,2022-03-09 03:24:00,Station-31,5937,9,74,CKB -LINE_14,Station-31,2022-03-09 03:33:00,2022-03-09 03:47:00,Station-30,6.19,0,74,CKB -LINE_13,Station-30,2022-03-09 03:47:00,2022-03-09 03:53:00,Station-29,2555,0,74,CKB -LINE_13,Station-29,2022-03-09 03:53:00,2022-03-09 04:00:00,Station-30,2577,9,74,CKB -LINE_14,Station-30,2022-03-09 04:09:00,2022-03-09 04:24:00,Station-31,5937,0,74,CKB -LINE_14,Station-31,2022-03-09 04:24:00,2022-03-09 04:24:00,Station-0,0.06,0,74,CKB -LINE_15,Station-0,2022-03-09 00:57:00,2022-03-09 00:57:00,Station-32,0.06,0,75,CKB -LINE_15,Station-32,2022-03-09 00:57:00,2022-03-09 01:06:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 01:06:00,2022-03-09 01:11:00,Station-32,2936,16,75,CKB -LINE_15,Station-32,2022-03-09 01:27:00,2022-03-09 01:36:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 01:36:00,2022-03-09 01:41:00,Station-32,2936,16,75,CKB -LINE_15,Station-32,2022-03-09 01:57:00,2022-03-09 02:06:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 02:06:00,2022-03-09 02:11:00,Station-32,2936,16,75,CKB -LINE_15,Station-32,2022-03-09 02:27:00,2022-03-09 02:36:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 02:36:00,2022-03-09 02:41:00,Station-32,2936,16,75,CKB -LINE_15,Station-32,2022-03-09 02:57:00,2022-03-09 03:06:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 03:06:00,2022-03-09 03:11:00,Station-32,2936,16,75,CKB -LINE_15,Station-32,2022-03-09 03:27:00,2022-03-09 03:36:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 03:36:00,2022-03-09 03:41:00,Station-32,2936,16,75,CKB -LINE_15,Station-32,2022-03-09 03:57:00,2022-03-09 04:06:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 04:06:00,2022-03-09 04:11:00,Station-32,2936,16,75,CKB -LINE_15,Station-32,2022-03-09 04:27:00,2022-03-09 04:36:00,Station-33,4343,0,75,CKB -LINE_15,Station-33,2022-03-09 04:36:00,2022-03-09 04:36:00,Station-0,0.06,0,75,CKB -LINE_16,Station-0,2022-03-09 00:29:00,2022-03-09 00:29:00,Station-34,0.06,0,76,CKB -LINE_16,Station-34,2022-03-09 00:29:00,2022-03-09 00:41:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 00:47:00,2022-03-09 00:57:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 00:59:00,2022-03-09 01:11:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 01:17:00,2022-03-09 01:27:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 01:29:00,2022-03-09 01:41:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 01:47:00,2022-03-09 01:57:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 01:59:00,2022-03-09 02:11:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 02:17:00,2022-03-09 02:27:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 02:29:00,2022-03-09 02:41:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 02:47:00,2022-03-09 02:57:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 02:59:00,2022-03-09 03:11:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 03:17:00,2022-03-09 03:27:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 03:29:00,2022-03-09 03:41:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 03:47:00,2022-03-09 03:57:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 03:59:00,2022-03-09 04:11:00,Station-35,4481,6,76,CKB -LINE_16,Station-35,2022-03-09 04:17:00,2022-03-09 04:27:00,Station-34,4031,2,76,CKB -LINE_16,Station-34,2022-03-09 04:29:00,2022-03-09 04:41:00,Station-35,4481,0,76,CKB -LINE_16,Station-35,2022-03-09 04:41:00,2022-03-09 04:41:00,Station-0,0.06,0,76,CKB -LINE_17,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-34,0.06,0,77,CKB -LINE_17,Station-34,2022-03-09 00:30:00,2022-03-09 00:44:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 00:44:00,2022-03-09 00:57:00,Station-34,5302,3,77,CKB -LINE_17,Station-34,2022-03-09 01:00:00,2022-03-09 01:14:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 01:14:00,2022-03-09 01:27:00,Station-34,5302,3,77,CKB -LINE_17,Station-34,2022-03-09 01:30:00,2022-03-09 01:44:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 01:44:00,2022-03-09 01:57:00,Station-34,5302,3,77,CKB -LINE_17,Station-34,2022-03-09 02:00:00,2022-03-09 02:14:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 02:14:00,2022-03-09 02:27:00,Station-34,5302,3,77,CKB -LINE_17,Station-34,2022-03-09 02:30:00,2022-03-09 02:44:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 02:44:00,2022-03-09 02:57:00,Station-34,5302,3,77,CKB -LINE_17,Station-34,2022-03-09 03:00:00,2022-03-09 03:14:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 03:14:00,2022-03-09 03:27:00,Station-34,5302,3,77,CKB -LINE_17,Station-34,2022-03-09 03:30:00,2022-03-09 03:44:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 03:44:00,2022-03-09 03:57:00,Station-34,5302,3,77,CKB -LINE_17,Station-34,2022-03-09 04:00:00,2022-03-09 04:14:00,Station-36,4801,0,77,CKB -LINE_17,Station-36,2022-03-09 04:14:00,2022-03-09 04:27:00,Station-34,5302,0,77,CKB -LINE_17,Station-34,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,77,CKB -LINE_18,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-37,0.06,0,78,CKB -LINE_18,Station-37,2022-03-09 00:43:00,2022-03-09 01:33:00,Station-37,20434,10,78,CKB -LINE_18,Station-37,2022-03-09 01:43:00,2022-03-09 02:33:00,Station-37,20434,10,78,CKB -LINE_18,Station-37,2022-03-09 02:43:00,2022-03-09 03:33:00,Station-37,20434,10,78,CKB -LINE_18,Station-37,2022-03-09 03:43:00,2022-03-09 04:33:00,Station-37,20434,0,78,CKB -LINE_18,Station-37,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,78,CKB -LINE_18,Station-0,2022-03-09 00:13:00,2022-03-09 00:13:00,Station-37,0.06,0,79,CKB -LINE_18,Station-37,2022-03-09 00:13:00,2022-03-09 01:03:00,Station-37,20434,10,79,CKB -LINE_18,Station-37,2022-03-09 01:13:00,2022-03-09 02:03:00,Station-37,20434,10,79,CKB -LINE_18,Station-37,2022-03-09 02:13:00,2022-03-09 03:03:00,Station-37,20434,10,79,CKB -LINE_18,Station-37,2022-03-09 03:13:00,2022-03-09 04:03:00,Station-37,20434,0,79,CKB -LINE_18,Station-37,2022-03-09 04:03:00,2022-03-09 04:03:00,Station-0,0.06,0,79,CKB -LINE_19,Station-0,2022-03-09 00:24:00,2022-03-09 00:24:00,Station-38,0.06,0,80,CKB -LINE_19,Station-38,2022-03-09 00:24:00,2022-03-09 00:48:00,Station-39,11.86,4,80,CKB -LINE_19,Station-39,2022-03-09 00:52:00,2022-03-09 01:14:00,Station-38,11139,10,80,CKB -LINE_19,Station-38,2022-03-09 01:24:00,2022-03-09 01:48:00,Station-39,11.86,4,80,CKB -LINE_19,Station-39,2022-03-09 01:52:00,2022-03-09 02:14:00,Station-38,11139,10,80,CKB -LINE_19,Station-38,2022-03-09 02:24:00,2022-03-09 02:48:00,Station-39,11.86,4,80,CKB -LINE_19,Station-39,2022-03-09 02:52:00,2022-03-09 03:14:00,Station-38,11139,10,80,CKB -LINE_19,Station-38,2022-03-09 03:24:00,2022-03-09 03:48:00,Station-39,11.86,4,80,CKB -LINE_19,Station-39,2022-03-09 03:52:00,2022-03-09 04:14:00,Station-38,11139,0,80,CKB -LINE_19,Station-38,2022-03-09 04:14:00,2022-03-09 04:14:00,Station-0,0.06,0,80,CKB -LINE_19,Station-0,2022-03-09 00:22:00,2022-03-09 00:22:00,Station-39,0.06,0,81,CKB -LINE_19,Station-39,2022-03-09 00:22:00,2022-03-09 00:44:00,Station-38,11139,10,81,CKB -LINE_19,Station-38,2022-03-09 00:54:00,2022-03-09 01:18:00,Station-39,11.86,4,81,CKB -LINE_19,Station-39,2022-03-09 01:22:00,2022-03-09 01:44:00,Station-38,11139,10,81,CKB -LINE_19,Station-38,2022-03-09 01:54:00,2022-03-09 02:18:00,Station-39,11.86,4,81,CKB -LINE_19,Station-39,2022-03-09 02:22:00,2022-03-09 02:44:00,Station-38,11139,10,81,CKB -LINE_19,Station-38,2022-03-09 02:54:00,2022-03-09 03:18:00,Station-39,11.86,4,81,CKB -LINE_19,Station-39,2022-03-09 03:22:00,2022-03-09 03:44:00,Station-38,11139,10,81,CKB -LINE_19,Station-38,2022-03-09 03:54:00,2022-03-09 04:18:00,Station-39,11.86,4,81,CKB -LINE_19,Station-39,2022-03-09 04:22:00,2022-03-09 04:44:00,Station-38,11139,0,81,CKB -LINE_19,Station-38,2022-03-09 04:44:00,2022-03-09 04:44:00,Station-0,0.06,0,81,CKB -LINE_20,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,82,CKB -LINE_20,Station-13,2022-03-09 00:32:00,2022-03-09 00:44:00,Station-40,4212,3,82,CKB -LINE_20,Station-40,2022-03-09 00:47:00,2022-03-09 01:16:00,Station-41,13048,0,82,CKB -LINE_20,Station-41,2022-03-09 01:16:00,2022-03-09 01:42:00,Station-40,12869,5,82,CKB -LINE_20,Station-40,2022-03-09 01:47:00,2022-03-09 02:16:00,Station-41,13048,0,82,CKB -LINE_20,Station-41,2022-03-09 02:16:00,2022-03-09 02:42:00,Station-40,12869,5,82,CKB -LINE_20,Station-40,2022-03-09 02:47:00,2022-03-09 03:16:00,Station-41,13048,0,82,CKB -LINE_20,Station-41,2022-03-09 03:16:00,2022-03-09 03:42:00,Station-40,12869,5,82,CKB -LINE_20,Station-40,2022-03-09 03:47:00,2022-03-09 04:16:00,Station-41,13048,0,82,CKB -LINE_20,Station-41,2022-03-09 04:16:00,2022-03-09 04:34:00,Station-42,9538,0,82,CKB -LINE_20,Station-42,2022-03-09 04:34:00,2022-03-09 04:34:00,Station-0,0.06,0,82,CKB -LINE_20,Station-0,2022-03-09 00:17:00,2022-03-09 00:17:00,Station-40,0.06,0,83,CKB -LINE_20,Station-40,2022-03-09 00:17:00,2022-03-09 00:46:00,Station-41,13048,0,83,CKB -LINE_20,Station-41,2022-03-09 00:46:00,2022-03-09 01:12:00,Station-40,12869,5,83,CKB -LINE_20,Station-40,2022-03-09 01:17:00,2022-03-09 01:46:00,Station-41,13048,0,83,CKB -LINE_20,Station-41,2022-03-09 01:46:00,2022-03-09 02:12:00,Station-40,12869,5,83,CKB -LINE_20,Station-40,2022-03-09 02:17:00,2022-03-09 02:46:00,Station-41,13048,0,83,CKB -LINE_20,Station-41,2022-03-09 02:46:00,2022-03-09 03:12:00,Station-40,12869,5,83,CKB -LINE_20,Station-40,2022-03-09 03:17:00,2022-03-09 03:46:00,Station-41,13048,0,83,CKB -LINE_20,Station-41,2022-03-09 03:46:00,2022-03-09 04:12:00,Station-40,12869,5,83,CKB -LINE_20,Station-40,2022-03-09 04:17:00,2022-03-09 04:28:00,Station-13,4316,0,83,CKB -LINE_20,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,83,CKB -LINE_21,Station-0,2022-03-09 00:49:00,2022-03-09 00:49:00,Station-3,0.06,0,84,CKB -LINE_21,Station-3,2022-03-09 00:49:00,2022-03-09 01:04:00,Station-16,10229,0,84,CKB -LINE_21,Station-16,2022-03-09 01:04:00,2022-03-09 01:19:00,Station-3,11801,0,84,CKB -LINE_21,Station-3,2022-03-09 01:19:00,2022-03-09 01:34:00,Station-16,10229,0,84,CKB -LINE_21,Station-16,2022-03-09 01:34:00,2022-03-09 01:49:00,Station-3,11801,0,84,CKB -LINE_21,Station-3,2022-03-09 01:49:00,2022-03-09 02:04:00,Station-16,10229,0,84,CKB -LINE_21,Station-16,2022-03-09 02:04:00,2022-03-09 02:19:00,Station-3,11801,0,84,CKB -LINE_21,Station-3,2022-03-09 02:19:00,2022-03-09 02:34:00,Station-16,10229,0,84,CKB -LINE_21,Station-16,2022-03-09 02:34:00,2022-03-09 02:49:00,Station-3,11801,0,84,CKB -LINE_21,Station-3,2022-03-09 02:49:00,2022-03-09 03:04:00,Station-16,10229,0,84,CKB -LINE_21,Station-16,2022-03-09 03:04:00,2022-03-09 03:19:00,Station-3,11801,0,84,CKB -LINE_21,Station-3,2022-03-09 03:19:00,2022-03-09 03:34:00,Station-16,10229,0,84,CKB -LINE_21,Station-16,2022-03-09 03:34:00,2022-03-09 03:49:00,Station-3,11801,0,84,CKB -LINE_21,Station-3,2022-03-09 03:49:00,2022-03-09 04:04:00,Station-16,10229,0,84,CKB -LINE_21,Station-16,2022-03-09 04:04:00,2022-03-09 04:19:00,Station-3,11801,23,84,CKB -LINE_22,Station-3,2022-03-09 04:42:00,2022-03-09 05:04:00,Station-43,6.81,0,84,CKB -LINE_22,Station-43,2022-03-09 05:04:00,2022-03-09 05:04:00,Station-0,0.06,0,84,CKB -LINE_8,Station-0,2022-03-09 00:32:00,2022-03-09 00:32:00,Station-13,0.06,0,85,CKB -LINE_8,Station-13,2022-03-09 00:32:00,2022-03-09 00:57:00,Station-21,11545,6,85,CKB -LINE_8,Station-21,2022-03-09 01:03:00,2022-03-09 01:46:00,Station-20,20579,1,85,CKB -LINE_8,Station-20,2022-03-09 01:47:00,2022-03-09 02:25:00,Station-21,20641,8,85,CKB -LINE_8,Station-21,2022-03-09 02:33:00,2022-03-09 03:16:00,Station-20,20579,1,85,CKB -LINE_8,Station-20,2022-03-09 03:17:00,2022-03-09 03:55:00,Station-21,20641,8,85,CKB -LINE_8,Station-21,2022-03-09 04:03:00,2022-03-09 04:28:00,Station-13,11499,0,85,CKB -LINE_8,Station-13,2022-03-09 04:28:00,2022-03-09 04:28:00,Station-0,0.06,0,85,CKB -LINE_8,Station-0,2022-03-09 00:33:00,2022-03-09 00:33:00,Station-21,0.06,0,86,CKB -LINE_8,Station-21,2022-03-09 00:33:00,2022-03-09 01:16:00,Station-20,20579,1,86,CKB -LINE_8,Station-20,2022-03-09 01:17:00,2022-03-09 01:55:00,Station-21,20641,8,86,CKB -LINE_8,Station-21,2022-03-09 02:03:00,2022-03-09 02:46:00,Station-20,20579,1,86,CKB -LINE_8,Station-20,2022-03-09 02:47:00,2022-03-09 03:25:00,Station-21,20641,8,86,CKB -LINE_8,Station-21,2022-03-09 03:33:00,2022-03-09 04:16:00,Station-20,20579,1,86,CKB -LINE_8,Station-20,2022-03-09 04:17:00,2022-03-09 04:51:00,Station-44,18752,0,86,CKB -LINE_8,Station-44,2022-03-09 04:51:00,2022-03-09 04:51:00,Station-0,0.06,0,86,CKB -LINE_23,Station-0,2022-03-09 00:34:00,2022-03-09 00:34:00,Station-45,0.06,0,87,CKB -LINE_23,Station-45,2022-03-09 00:34:00,2022-03-09 01:00:00,Station-46,9016,0,87,CKB -LINE_23,Station-46,2022-03-09 01:00:00,2022-03-09 01:27:00,Station-45,10083,7,87,CKB -LINE_23,Station-45,2022-03-09 01:34:00,2022-03-09 02:00:00,Station-46,9016,0,87,CKB -LINE_23,Station-46,2022-03-09 02:00:00,2022-03-09 02:27:00,Station-45,10083,7,87,CKB -LINE_23,Station-45,2022-03-09 02:34:00,2022-03-09 03:00:00,Station-46,9016,0,87,CKB -LINE_23,Station-46,2022-03-09 03:00:00,2022-03-09 03:27:00,Station-45,10083,7,87,CKB -LINE_23,Station-45,2022-03-09 03:34:00,2022-03-09 04:00:00,Station-46,9016,0,87,CKB -LINE_23,Station-46,2022-03-09 04:00:00,2022-03-09 04:27:00,Station-45,10083,0,87,CKB -LINE_23,Station-45,2022-03-09 04:27:00,2022-03-09 04:27:00,Station-0,0.06,0,87,CKB -LINE_23,Station-0,2022-03-09 00:30:00,2022-03-09 00:30:00,Station-46,0.06,0,88,CKB -LINE_23,Station-46,2022-03-09 00:30:00,2022-03-09 00:57:00,Station-45,10083,7,88,CKB -LINE_23,Station-45,2022-03-09 01:04:00,2022-03-09 01:30:00,Station-46,9016,0,88,CKB -LINE_23,Station-46,2022-03-09 01:30:00,2022-03-09 01:57:00,Station-45,10083,7,88,CKB -LINE_23,Station-45,2022-03-09 02:04:00,2022-03-09 02:30:00,Station-46,9016,0,88,CKB -LINE_23,Station-46,2022-03-09 02:30:00,2022-03-09 02:57:00,Station-45,10083,7,88,CKB -LINE_23,Station-45,2022-03-09 03:04:00,2022-03-09 03:30:00,Station-46,9016,0,88,CKB -LINE_23,Station-46,2022-03-09 03:30:00,2022-03-09 03:57:00,Station-45,10083,7,88,CKB -LINE_23,Station-45,2022-03-09 04:04:00,2022-03-09 04:30:00,Station-46,9016,0,88,CKB -LINE_23,Station-46,2022-03-09 04:30:00,2022-03-09 04:57:00,Station-45,10083,0,88,CKB -LINE_23,Station-45,2022-03-09 04:57:00,2022-03-09 04:57:00,Station-0,0.06,0,88,CKB -LINE_24,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,89,CKB -LINE_24,Station-21,2022-03-09 00:31:00,2022-03-09 00:44:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 00:44:00,2022-03-09 00:56:00,Station-21,5362,5,89,CKB -LINE_24,Station-21,2022-03-09 01:01:00,2022-03-09 01:14:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 01:14:00,2022-03-09 01:26:00,Station-21,5362,5,89,CKB -LINE_24,Station-21,2022-03-09 01:31:00,2022-03-09 01:44:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 01:44:00,2022-03-09 01:56:00,Station-21,5362,5,89,CKB -LINE_24,Station-21,2022-03-09 02:01:00,2022-03-09 02:14:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 02:14:00,2022-03-09 02:26:00,Station-21,5362,5,89,CKB -LINE_24,Station-21,2022-03-09 02:31:00,2022-03-09 02:44:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 02:44:00,2022-03-09 02:56:00,Station-21,5362,5,89,CKB -LINE_24,Station-21,2022-03-09 03:01:00,2022-03-09 03:14:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 03:14:00,2022-03-09 03:26:00,Station-21,5362,5,89,CKB -LINE_24,Station-21,2022-03-09 03:31:00,2022-03-09 03:44:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 03:44:00,2022-03-09 03:56:00,Station-21,5362,5,89,CKB -LINE_24,Station-21,2022-03-09 04:01:00,2022-03-09 04:14:00,Station-47,4872,0,89,CKB -LINE_24,Station-47,2022-03-09 04:14:00,2022-03-09 04:26:00,Station-21,5362,0,89,CKB -LINE_24,Station-21,2022-03-09 04:26:00,2022-03-09 04:26:00,Station-0,0.06,0,89,CKB -LINE_25,Station-0,2022-03-09 00:31:00,2022-03-09 00:31:00,Station-21,0.06,0,90,CKB -LINE_25,Station-21,2022-03-09 00:31:00,2022-03-09 00:45:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 00:47:00,2022-03-09 01:01:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 01:01:00,2022-03-09 01:15:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 01:17:00,2022-03-09 01:31:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 01:31:00,2022-03-09 01:45:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 01:47:00,2022-03-09 02:01:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 02:01:00,2022-03-09 02:15:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 02:17:00,2022-03-09 02:31:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 02:31:00,2022-03-09 02:45:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 02:47:00,2022-03-09 03:01:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 03:01:00,2022-03-09 03:15:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 03:17:00,2022-03-09 03:31:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 03:31:00,2022-03-09 03:45:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 03:47:00,2022-03-09 04:01:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 04:01:00,2022-03-09 04:15:00,Station-48,5225,2,90,CKB -LINE_25,Station-48,2022-03-09 04:17:00,2022-03-09 04:31:00,Station-21,7617,0,90,CKB -LINE_25,Station-21,2022-03-09 04:31:00,2022-03-09 04:31:00,Station-0,0.06,0,90,CKB -LINE_26,Station-0,2022-03-09 00:43:00,2022-03-09 00:43:00,Station-49,0.06,0,91,CKB -LINE_26,Station-49,2022-03-09 00:43:00,2022-03-09 00:53:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 00:53:00,2022-03-09 01:03:00,Station-49,4408,10,91,CKB -LINE_26,Station-49,2022-03-09 01:13:00,2022-03-09 01:23:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 01:23:00,2022-03-09 01:33:00,Station-49,4408,10,91,CKB -LINE_26,Station-49,2022-03-09 01:43:00,2022-03-09 01:53:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 01:53:00,2022-03-09 02:03:00,Station-49,4408,10,91,CKB -LINE_26,Station-49,2022-03-09 02:13:00,2022-03-09 02:23:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 02:23:00,2022-03-09 02:33:00,Station-49,4408,10,91,CKB -LINE_26,Station-49,2022-03-09 02:43:00,2022-03-09 02:53:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 02:53:00,2022-03-09 03:03:00,Station-49,4408,10,91,CKB -LINE_26,Station-49,2022-03-09 03:13:00,2022-03-09 03:23:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 03:23:00,2022-03-09 03:33:00,Station-49,4408,10,91,CKB -LINE_26,Station-49,2022-03-09 03:43:00,2022-03-09 03:53:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 03:53:00,2022-03-09 04:03:00,Station-49,4408,10,91,CKB -LINE_26,Station-49,2022-03-09 04:13:00,2022-03-09 04:23:00,Station-50,4507,0,91,CKB -LINE_26,Station-50,2022-03-09 04:23:00,2022-03-09 04:33:00,Station-49,4408,0,91,CKB -LINE_26,Station-49,2022-03-09 04:33:00,2022-03-09 04:33:00,Station-0,0.06,0,91,CKB -LINE_0,Station-0,2022-03-09 21:31:00,2022-03-09 21:31:00,Station-1,0.06,0,92,CKB -LINE_0,Station-1,2022-03-09 21:31:00,2022-03-09 22:04:00,Station-2,14519,4,92,CKB -LINE_0,Station-2,2022-03-09 22:08:00,2022-03-09 22:43:00,Station-1,13541,8,92,CKB -LINE_0,Station-1,2022-03-09 22:51:00,2022-03-09 23:24:00,Station-2,14519,4,92,CKB -LINE_0,Station-2,2022-03-09 23:28:00,2022-03-10 00:03:00,Station-1,13541,8,92,CKB -LINE_0,Station-1,2022-03-10 00:11:00,2022-03-10 00:44:00,Station-2,14519,0,92,CKB -LINE_1,Station-2,2022-03-10 00:44:00,2022-03-10 00:54:00,Station-3,4.1,25,92,CKB -LINE_1,Station-3,2022-03-10 01:19:00,2022-03-10 01:42:00,Station-4,8.36,6,92,CKB -LINE_1,Station-4,2022-03-10 01:48:00,2022-03-10 02:06:00,Station-3,9067,13,92,CKB -LINE_1,Station-3,2022-03-10 02:19:00,2022-03-10 02:42:00,Station-4,8.36,6,92,CKB -LINE_1,Station-4,2022-03-10 02:48:00,2022-03-10 03:06:00,Station-3,9067,13,92,CKB -LINE_1,Station-3,2022-03-10 03:19:00,2022-03-10 03:42:00,Station-4,8.36,6,92,CKB -LINE_1,Station-4,2022-03-10 03:48:00,2022-03-10 04:06:00,Station-3,9067,0,92,CKB -LINE_1,Station-3,2022-03-10 04:06:00,2022-03-10 04:06:00,Station-0,0.06,0,92,CKB -LINE_0,Station-0,2022-03-09 22:11:00,2022-03-09 22:11:00,Station-1,0.06,0,93,CKB -LINE_0,Station-1,2022-03-09 22:11:00,2022-03-09 22:44:00,Station-2,14519,4,93,CKB -LINE_0,Station-2,2022-03-09 22:48:00,2022-03-09 23:23:00,Station-1,13541,8,93,CKB -LINE_0,Station-1,2022-03-09 23:31:00,2022-03-10 00:04:00,Station-2,14519,4,93,CKB -LINE_0,Station-2,2022-03-10 00:08:00,2022-03-10 00:39:00,Station-5,12213,0,93,CKB -LINE_1,Station-5,2022-03-10 00:39:00,2022-03-10 00:47:00,Station-3,4.0,2,93,CKB -LINE_1,Station-3,2022-03-10 00:49:00,2022-03-10 01:12:00,Station-4,8.36,6,93,CKB -LINE_1,Station-4,2022-03-10 01:18:00,2022-03-10 01:36:00,Station-3,9067,13,93,CKB -LINE_1,Station-3,2022-03-10 01:49:00,2022-03-10 02:12:00,Station-4,8.36,6,93,CKB -LINE_1,Station-4,2022-03-10 02:18:00,2022-03-10 02:36:00,Station-3,9067,13,93,CKB -LINE_1,Station-3,2022-03-10 02:49:00,2022-03-10 03:12:00,Station-4,8.36,6,93,CKB -LINE_1,Station-4,2022-03-10 03:18:00,2022-03-10 03:36:00,Station-3,9067,13,93,CKB -LINE_1,Station-3,2022-03-10 03:49:00,2022-03-10 04:12:00,Station-4,8.36,0,93,CKB -LINE_1,Station-4,2022-03-10 04:12:00,2022-03-10 04:12:00,Station-0,0.06,0,93,CKB -LINE_2,Station-0,2022-03-09 21:06:00,2022-03-09 21:06:00,Station-6,0.06,0,94,CKB -LINE_2,Station-6,2022-03-09 21:06:00,2022-03-09 21:34:00,Station-7,13018,19,94,CKB -LINE_2,Station-7,2022-03-09 21:53:00,2022-03-09 22:13:00,Station-8,10332,17,94,CKB -LINE_2,Station-8,2022-03-09 22:30:00,2022-03-09 22:54:00,Station-7,10.48,19,94,CKB -LINE_2,Station-7,2022-03-09 23:13:00,2022-03-09 23:33:00,Station-8,10332,17,94,CKB -LINE_2,Station-8,2022-03-09 23:50:00,2022-03-10 00:14:00,Station-7,10.48,2,94,CKB -LINE_2,Station-7,2022-03-10 00:16:00,2022-03-10 00:23:00,Station-9,3709,5,94,CKB -LINE_3,Station-9,2022-03-10 00:28:00,2022-03-10 00:44:00,Station-10,6404,3,94,CKB -LINE_3,Station-10,2022-03-10 00:47:00,2022-03-10 01:10:00,Station-11,10579,7,94,CKB -LINE_3,Station-11,2022-03-10 01:17:00,2022-03-10 01:44:00,Station-10,12007,3,94,CKB -LINE_3,Station-10,2022-03-10 01:47:00,2022-03-10 02:10:00,Station-11,10579,7,94,CKB -LINE_3,Station-11,2022-03-10 02:17:00,2022-03-10 02:44:00,Station-10,12007,3,94,CKB -LINE_3,Station-10,2022-03-10 02:47:00,2022-03-10 03:10:00,Station-11,10579,7,94,CKB -LINE_3,Station-11,2022-03-10 03:17:00,2022-03-10 03:44:00,Station-10,12007,3,94,CKB -LINE_3,Station-10,2022-03-10 03:47:00,2022-03-10 04:10:00,Station-11,10579,7,94,CKB -LINE_3,Station-11,2022-03-10 04:17:00,2022-03-10 04:44:00,Station-10,12007,0,94,CKB -LINE_3,Station-10,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,94,CKB -LINE_2,Station-0,2022-03-09 20:26:00,2022-03-09 20:26:00,Station-6,0.06,0,95,CKB -LINE_2,Station-6,2022-03-09 20:26:00,2022-03-09 20:56:00,Station-12,14097,14,95,CKB -LINE_2,Station-12,2022-03-09 21:10:00,2022-03-09 21:38:00,Station-6,13.19,8,95,CKB -LINE_2,Station-6,2022-03-09 21:46:00,2022-03-09 22:14:00,Station-7,13018,19,95,CKB -LINE_2,Station-7,2022-03-09 22:33:00,2022-03-09 22:53:00,Station-8,10332,17,95,CKB -LINE_2,Station-8,2022-03-09 23:10:00,2022-03-09 23:34:00,Station-7,10.48,19,95,CKB -LINE_2,Station-7,2022-03-09 23:53:00,2022-03-10 00:13:00,Station-8,10332,2,95,CKB -LINE_2,Station-8,2022-03-10 00:15:00,2022-03-10 00:16:00,Station-10,506,1,95,CKB -LINE_3,Station-10,2022-03-10 00:17:00,2022-03-10 00:40:00,Station-11,10579,7,95,CKB -LINE_3,Station-11,2022-03-10 00:47:00,2022-03-10 01:14:00,Station-10,12007,3,95,CKB -LINE_3,Station-10,2022-03-10 01:17:00,2022-03-10 01:40:00,Station-11,10579,7,95,CKB -LINE_3,Station-11,2022-03-10 01:47:00,2022-03-10 02:14:00,Station-10,12007,3,95,CKB -LINE_3,Station-10,2022-03-10 02:17:00,2022-03-10 02:40:00,Station-11,10579,7,95,CKB -LINE_3,Station-11,2022-03-10 02:47:00,2022-03-10 03:14:00,Station-10,12007,3,95,CKB -LINE_3,Station-10,2022-03-10 03:17:00,2022-03-10 03:40:00,Station-11,10579,7,95,CKB -LINE_3,Station-11,2022-03-10 03:47:00,2022-03-10 04:14:00,Station-10,12007,3,95,CKB -LINE_3,Station-10,2022-03-10 04:17:00,2022-03-10 04:40:00,Station-11,10579,3,95,CKB -LINE_4,Station-11,2022-03-10 04:43:00,2022-03-10 04:58:00,Station-13,6161,0,95,CKB -LINE_4,Station-13,2022-03-10 04:58:00,2022-03-10 04:58:00,Station-0,0.06,0,95,CKB -LINE_5,Station-0,2022-03-09 22:56:00,2022-03-09 22:56:00,Station-14,0.06,0,96,CKB -LINE_5,Station-14,2022-03-09 22:56:00,2022-03-09 23:08:00,Station-15,5882,3,96,CKB -LINE_5,Station-15,2022-03-09 23:11:00,2022-03-09 23:25:00,Station-14,6232,0,96,CKB -LINE_5,Station-14,2022-03-09 23:25:00,2022-03-09 23:38:00,Station-15,6086,3,96,CKB -LINE_5,Station-15,2022-03-09 23:41:00,2022-03-09 23:55:00,Station-14,6232,0,96,CKB -LINE_5,Station-14,2022-03-09 23:55:00,2022-03-10 00:08:00,Station-15,6086,0,96,CKB -LINE_5,Station-15,2022-03-10 00:08:00,2022-03-10 00:08:00,Station-0,0.06,0,96,CKB -LINE_6,Station-0,2022-03-09 05:05:00,2022-03-09 05:05:00,Station-16,0.06,0,97,CKB -LINE_6,Station-16,2022-03-09 05:05:00,2022-03-09 05:14:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 05:14:00,2022-03-09 05:23:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 05:25:00,2022-03-09 05:34:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 05:34:00,2022-03-09 05:43:00,Station-16,5139,23,97,CKB -LINE_6,Station-16,2022-03-09 06:06:00,2022-03-09 06:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 06:15:00,2022-03-09 06:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 06:26:00,2022-03-09 06:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 06:35:00,2022-03-09 06:44:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 06:46:00,2022-03-09 06:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 06:55:00,2022-03-09 07:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 07:06:00,2022-03-09 07:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 07:15:00,2022-03-09 07:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 07:26:00,2022-03-09 07:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 07:35:00,2022-03-09 07:44:00,Station-16,5139,22,97,CKB -LINE_6,Station-16,2022-03-09 08:06:00,2022-03-09 08:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 08:15:00,2022-03-09 08:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 08:26:00,2022-03-09 08:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 08:35:00,2022-03-09 08:44:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 08:46:00,2022-03-09 08:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 08:55:00,2022-03-09 09:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 09:06:00,2022-03-09 09:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 09:15:00,2022-03-09 09:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 09:26:00,2022-03-09 09:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 09:35:00,2022-03-09 09:44:00,Station-16,5139,22,97,CKB -LINE_6,Station-16,2022-03-09 10:06:00,2022-03-09 10:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 10:15:00,2022-03-09 10:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 10:26:00,2022-03-09 10:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 10:35:00,2022-03-09 10:44:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 10:46:00,2022-03-09 10:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 10:55:00,2022-03-09 11:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 11:06:00,2022-03-09 11:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 11:15:00,2022-03-09 11:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 11:26:00,2022-03-09 11:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 11:35:00,2022-03-09 11:44:00,Station-16,5139,22,97,CKB -LINE_6,Station-16,2022-03-09 12:06:00,2022-03-09 12:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 12:15:00,2022-03-09 12:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 12:26:00,2022-03-09 12:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 12:35:00,2022-03-09 12:44:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 12:46:00,2022-03-09 12:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 12:55:00,2022-03-09 13:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 13:06:00,2022-03-09 13:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 13:15:00,2022-03-09 13:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 13:26:00,2022-03-09 13:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 13:35:00,2022-03-09 13:44:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 13:46:00,2022-03-09 13:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 13:55:00,2022-03-09 14:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 14:06:00,2022-03-09 14:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 14:15:00,2022-03-09 14:24:00,Station-16,5139,22,97,CKB -LINE_6,Station-16,2022-03-09 14:46:00,2022-03-09 14:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 14:55:00,2022-03-09 15:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 15:06:00,2022-03-09 15:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 15:15:00,2022-03-09 15:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 15:26:00,2022-03-09 15:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 15:35:00,2022-03-09 15:44:00,Station-16,5139,22,97,CKB -LINE_6,Station-16,2022-03-09 16:06:00,2022-03-09 16:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 16:15:00,2022-03-09 16:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 16:26:00,2022-03-09 16:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 16:35:00,2022-03-09 16:44:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 16:46:00,2022-03-09 16:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 16:55:00,2022-03-09 17:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 17:06:00,2022-03-09 17:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 17:15:00,2022-03-09 17:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 17:26:00,2022-03-09 17:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 17:35:00,2022-03-09 17:44:00,Station-16,5139,22,97,CKB -LINE_6,Station-16,2022-03-09 18:06:00,2022-03-09 18:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 18:15:00,2022-03-09 18:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 18:26:00,2022-03-09 18:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 18:35:00,2022-03-09 18:44:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 18:46:00,2022-03-09 18:55:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 18:55:00,2022-03-09 19:04:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 19:06:00,2022-03-09 19:15:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 19:15:00,2022-03-09 19:24:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 19:26:00,2022-03-09 19:35:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 19:35:00,2022-03-09 19:44:00,Station-16,5139,21,97,CKB -LINE_6,Station-16,2022-03-09 20:05:00,2022-03-09 20:14:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 20:14:00,2022-03-09 20:23:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 20:25:00,2022-03-09 20:34:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 20:34:00,2022-03-09 20:43:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 20:45:00,2022-03-09 20:54:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 20:54:00,2022-03-09 21:03:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 21:05:00,2022-03-09 21:14:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 21:14:00,2022-03-09 21:23:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 21:25:00,2022-03-09 21:34:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 21:34:00,2022-03-09 21:43:00,Station-16,5139,22,97,CKB -LINE_6,Station-16,2022-03-09 22:05:00,2022-03-09 22:14:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 22:14:00,2022-03-09 22:23:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 22:25:00,2022-03-09 22:34:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 22:34:00,2022-03-09 22:43:00,Station-16,5139,2,97,CKB -LINE_6,Station-16,2022-03-09 22:45:00,2022-03-09 22:54:00,Station-17,4781,0,97,CKB -LINE_6,Station-17,2022-03-09 22:54:00,2022-03-09 23:03:00,Station-16,5139,0,97,CKB -LINE_6,Station-16,2022-03-09 23:03:00,2022-03-09 23:03:00,Station-0,0.06,0,97,CKB -LINE_7,Station-0,2022-03-10 00:06:00,2022-03-10 00:06:00,Station-18,0.06,0,98,CKB -LINE_7,Station-18,2022-03-10 00:06:00,2022-03-10 00:27:00,Station-19,7827,0,98,CKB -LINE_8,Station-19,2022-03-10 00:27:00,2022-03-10 00:48:00,Station-20,11079,0,98,CKB -LINE_8,Station-20,2022-03-10 00:48:00,2022-03-10 01:25:00,Station-21,20641,8,98,CKB -LINE_8,Station-21,2022-03-10 01:33:00,2022-03-10 02:16:00,Station-20,20579,1,98,CKB -LINE_8,Station-20,2022-03-10 02:17:00,2022-03-10 02:55:00,Station-21,20641,8,98,CKB -LINE_8,Station-21,2022-03-10 03:03:00,2022-03-10 03:46:00,Station-20,20579,1,98,CKB -LINE_8,Station-20,2022-03-10 03:47:00,2022-03-10 04:25:00,Station-21,20641,0,98,CKB -LINE_8,Station-21,2022-03-10 04:25:00,2022-03-10 04:25:00,Station-0,0.06,0,98,CKB -LINE_9,Station-22,2022-03-09 05:15:00,2022-03-09 06:01:00,Station-23,17.9,0,99,VDL -LINE_9,Station-23,2022-03-09 06:01:00,2022-03-09 06:15:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 06:23:00,2022-03-09 06:37:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 06:41:00,2022-03-09 06:55:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 07:03:00,2022-03-09 07:17:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 07:21:00,2022-03-09 07:35:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 07:43:00,2022-03-09 07:57:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 08:01:00,2022-03-09 08:15:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 08:23:00,2022-03-09 08:37:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 08:41:00,2022-03-09 08:55:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 09:03:00,2022-03-09 09:17:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 09:21:00,2022-03-09 09:35:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 09:43:00,2022-03-09 09:57:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 10:01:00,2022-03-09 10:15:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 10:23:00,2022-03-09 10:37:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 10:41:00,2022-03-09 10:55:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 11:03:00,2022-03-09 11:17:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 11:21:00,2022-03-09 11:35:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 11:43:00,2022-03-09 11:57:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 12:01:00,2022-03-09 12:15:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 12:23:00,2022-03-09 12:37:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 12:41:00,2022-03-09 12:55:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 13:03:00,2022-03-09 13:17:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 13:21:00,2022-03-09 13:35:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 13:43:00,2022-03-09 13:57:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 14:01:00,2022-03-09 14:15:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 14:23:00,2022-03-09 14:37:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 14:41:00,2022-03-09 14:55:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 15:03:00,2022-03-09 15:17:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 15:21:00,2022-03-09 15:35:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 15:43:00,2022-03-09 15:57:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 16:01:00,2022-03-09 16:15:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 16:23:00,2022-03-09 16:37:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 16:41:00,2022-03-09 16:55:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 17:03:00,2022-03-09 17:17:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 17:21:00,2022-03-09 17:35:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 17:43:00,2022-03-09 17:57:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 18:01:00,2022-03-09 18:15:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 18:23:00,2022-03-09 18:37:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 18:41:00,2022-03-09 18:55:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 19:03:00,2022-03-09 19:17:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 19:21:00,2022-03-09 19:35:00,Station-23,4637,8,99,VDL -LINE_9,Station-23,2022-03-09 19:43:00,2022-03-09 19:57:00,Station-23,4637,4,99,VDL -LINE_9,Station-23,2022-03-09 20:01:00,2022-03-09 20:14:00,Station-23,4637,9,99,VDL -LINE_9,Station-23,2022-03-09 20:23:00,2022-03-09 20:36:00,Station-23,4637,0,99,VDL -LINE_9,Station-23,2022-03-09 20:36:00,2022-03-09 21:15:00,Station-22,19.8,0,99,VDL -LINE_10,Station-0,2022-03-09 04:56:00,2022-03-09 04:56:00,Station-24,0.06,18,100,CKB -LINE_10,Station-24,2022-03-09 05:14:00,2022-03-09 05:20:00,Station-25,3.29,0,100,CKB -LINE_10,Station-25,2022-03-09 05:20:00,2022-03-09 05:24:00,Station-24,2954,20,100,CKB -LINE_10,Station-24,2022-03-09 05:44:00,2022-03-09 05:50:00,Station-25,3.29,0,100,CKB -LINE_10,Station-25,2022-03-09 05:50:00,2022-03-09 05:54:00,Station-24,2954,5,100,CKB -LINE_10,Station-24,2022-03-09 05:59:00,2022-03-09 06:06:00,Station-25,3.29,2,100,CKB -LINE_10,Station-25,2022-03-09 06:08:00,2022-03-09 06:13:00,Station-24,2954,19,100,CKB -LINE_10,Station-24,2022-03-09 06:32:00,2022-03-09 06:39:00,Station-25,3.29,1,100,CKB -LINE_10,Station-25,2022-03-09 06:40:00,2022-03-09 06:45:00,Station-24,2954,7,100,CKB -LINE_10,Station-24,2022-03-09 06:52:00,2022-03-09 06:59:00,Station-25,3.29,1,100,CKB -LINE_10,Station-25,2022-03-09 07:00:00,2022-03-09 07:05:00,Station-24,2954,7,100,CKB -LINE_10,Station-24,2022-03-09 07:12:00,2022-03-09 07:19:00,Station-25,3.29,1,100,CKB -LINE_10,Station-25,2022-03-09 07:20:00,2022-03-09 07:25:00,Station-24,2954,7,100,CKB -LINE_10,Station-24,2022-03-09 07:32:00,2022-03-09 07:39:00,Station-25,3.29,1,100,CKB -LINE_10,Station-25,2022-03-09 07:40:00,2022-03-09 07:45:00,Station-24,2954,295,100,CKB -LINE_10,Station-24,2022-03-09 12:40:00,2022-03-09 12:47:00,Station-25,3.29,2,100,CKB -LINE_10,Station-25,2022-03-09 12:49:00,2022-03-09 12:54:00,Station-24,2954,46,100,CKB -LINE_10,Station-24,2022-03-09 13:40:00,2022-03-09 13:47:00,Station-25,3.29,2,100,CKB -LINE_10,Station-25,2022-03-09 13:49:00,2022-03-09 13:54:00,Station-24,2954,434,100,CKB -LINE_10,Station-24,2022-03-09 21:08:00,2022-03-09 21:08:00,Station-0,0.06,0,100,CKB -LINE_11,Station-0,2022-03-09 07:20:00,2022-03-09 07:20:00,Station-26,0.06,0,101,CKB -LINE_11,Station-26,2022-03-09 07:20:00,2022-03-09 07:50:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 08:00:00,2022-03-09 08:30:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 08:40:00,2022-03-09 09:10:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 09:20:00,2022-03-09 09:50:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 10:00:00,2022-03-09 10:30:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 10:40:00,2022-03-09 11:10:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 11:20:00,2022-03-09 11:50:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 12:00:00,2022-03-09 12:30:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 12:40:00,2022-03-09 13:10:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 13:20:00,2022-03-09 13:50:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 14:00:00,2022-03-09 14:30:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 14:40:00,2022-03-09 15:10:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 15:20:00,2022-03-09 15:50:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 16:00:00,2022-03-09 16:30:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 16:40:00,2022-03-09 17:10:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 17:20:00,2022-03-09 17:50:00,Station-26,9266,10,101,CKB -LINE_11,Station-26,2022-03-09 18:00:00,2022-03-09 18:30:00,Station-26,9266,0,101,CKB -LINE_11,Station-26,2022-03-09 18:30:00,2022-03-09 18:30:00,Station-0,0.06,0,101,CKB -LINE_12,Station-0,2022-03-09 07:10:00,2022-03-09 07:10:00,Station-27,0.06,0,102,CKB -LINE_12,Station-27,2022-03-09 07:10:00,2022-03-09 07:18:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 07:28:00,2022-03-09 07:40:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 07:40:00,2022-03-09 07:48:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 07:58:00,2022-03-09 08:10:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 08:10:00,2022-03-09 08:18:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 08:28:00,2022-03-09 08:40:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 08:40:00,2022-03-09 08:48:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 08:58:00,2022-03-09 09:10:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 09:10:00,2022-03-09 09:18:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 09:28:00,2022-03-09 09:40:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 09:40:00,2022-03-09 09:48:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 09:58:00,2022-03-09 10:10:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 10:10:00,2022-03-09 10:18:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 10:28:00,2022-03-09 10:40:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 10:40:00,2022-03-09 10:48:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 10:58:00,2022-03-09 11:10:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 11:10:00,2022-03-09 11:18:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 11:28:00,2022-03-09 11:40:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 11:40:00,2022-03-09 11:48:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 11:58:00,2022-03-09 12:10:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 12:10:00,2022-03-09 12:18:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 12:28:00,2022-03-09 12:40:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 12:40:00,2022-03-09 12:48:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 12:58:00,2022-03-09 13:10:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 13:10:00,2022-03-09 13:18:00,Station-28,2169,10,102,CKB -LINE_12,Station-28,2022-03-09 13:28:00,2022-03-09 13:40:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 13:40:00,2022-03-09 13:48:00,Station-28,2169,8,102,CKB -LINE_12,Station-28,2022-03-09 13:56:00,2022-03-09 14:10:00,Station-27,2952,0,102,CKB -LINE_12,Station-27,2022-03-09 14:10:00,2022-03-09 14:19:00,Station-28,2169,14,102,CKB -LINE_12,Station-28,2022-03-09 14:33:00,2022-03-09 14:47:00,Station-27,2952,3,102,CKB -LINE_12,Station-27,2022-03-09 14:50:00,2022-03-09 14:59:00,Station-28,2169,14,102,CKB -LINE_12,Station-28,2022-03-09 15:13:00,2022-03-09 15:27:00,Station-27,2952,3,102,CKB -LINE_12,Station-27,2022-03-09 15:30:00,2022-03-09 15:39:00,Station-28,2169,14,102,CKB -LINE_12,Station-28,2022-03-09 15:53:00,2022-03-09 16:07:00,Station-27,2952,3,102,CKB -LINE_12,Station-27,2022-03-09 16:10:00,2022-03-09 16:19:00,Station-28,2169,14,102,CKB -LINE_12,Station-28,2022-03-09 16:33:00,2022-03-09 16:47:00,Station-27,2952,3,102,CKB -LINE_12,Station-27,2022-03-09 16:50:00,2022-03-09 16:59:00,Station-28,2169,14,102,CKB -LINE_12,Station-28,2022-03-09 17:13:00,2022-03-09 17:27:00,Station-27,2952,3,102,CKB -LINE_12,Station-27,2022-03-09 17:30:00,2022-03-09 17:39:00,Station-28,2169,13,102,CKB -LINE_12,Station-28,2022-03-09 17:52:00,2022-03-09 18:05:00,Station-27,2952,5,102,CKB -LINE_12,Station-27,2022-03-09 18:10:00,2022-03-09 18:18:00,Station-28,2169,0,102,CKB -LINE_12,Station-28,2022-03-09 18:18:00,2022-03-09 18:18:00,Station-0,0.06,0,102,CKB -LINE_12,Station-0,2022-03-09 14:13:00,2022-03-09 14:13:00,Station-28,0.06,0,103,CKB -LINE_12,Station-28,2022-03-09 14:13:00,2022-03-09 14:27:00,Station-27,2952,3,103,CKB -LINE_12,Station-27,2022-03-09 14:30:00,2022-03-09 14:39:00,Station-28,2169,14,103,CKB -LINE_12,Station-28,2022-03-09 14:53:00,2022-03-09 15:07:00,Station-27,2952,3,103,CKB -LINE_12,Station-27,2022-03-09 15:10:00,2022-03-09 15:19:00,Station-28,2169,14,103,CKB -LINE_12,Station-28,2022-03-09 15:33:00,2022-03-09 15:47:00,Station-27,2952,3,103,CKB -LINE_12,Station-27,2022-03-09 15:50:00,2022-03-09 15:59:00,Station-28,2169,14,103,CKB -LINE_12,Station-28,2022-03-09 16:13:00,2022-03-09 16:27:00,Station-27,2952,3,103,CKB -LINE_12,Station-27,2022-03-09 16:30:00,2022-03-09 16:39:00,Station-28,2169,14,103,CKB -LINE_12,Station-28,2022-03-09 16:53:00,2022-03-09 17:07:00,Station-27,2952,3,103,CKB -LINE_12,Station-27,2022-03-09 17:10:00,2022-03-09 17:19:00,Station-28,2169,14,103,CKB -LINE_12,Station-28,2022-03-09 17:33:00,2022-03-09 17:47:00,Station-27,2952,3,103,CKB -LINE_12,Station-27,2022-03-09 17:50:00,2022-03-09 17:59:00,Station-28,2169,14,103,CKB -LINE_12,Station-28,2022-03-09 18:13:00,2022-03-09 18:25:00,Station-27,2952,0,103,CKB -LINE_12,Station-27,2022-03-09 18:25:00,2022-03-09 18:25:00,Station-0,0.06,0,103,CKB -LINE_13,Station-0,2022-03-10 00:23:00,2022-03-10 00:23:00,Station-29,0.06,0,104,CKB -LINE_13,Station-29,2022-03-10 00:23:00,2022-03-10 00:30:00,Station-30,2577,9,104,CKB -LINE_14,Station-30,2022-03-10 00:39:00,2022-03-10 00:54:00,Station-31,5937,9,104,CKB -LINE_14,Station-31,2022-03-10 01:03:00,2022-03-10 01:17:00,Station-30,6.19,0,104,CKB -LINE_13,Station-30,2022-03-10 01:17:00,2022-03-10 01:23:00,Station-29,2555,0,104,CKB -LINE_13,Station-29,2022-03-10 01:23:00,2022-03-10 01:30:00,Station-30,2577,9,104,CKB -LINE_14,Station-30,2022-03-10 01:39:00,2022-03-10 01:54:00,Station-31,5937,9,104,CKB -LINE_14,Station-31,2022-03-10 02:03:00,2022-03-10 02:17:00,Station-30,6.19,0,104,CKB -LINE_13,Station-30,2022-03-10 02:17:00,2022-03-10 02:23:00,Station-29,2555,0,104,CKB -LINE_13,Station-29,2022-03-10 02:23:00,2022-03-10 02:30:00,Station-30,2577,9,104,CKB -LINE_14,Station-30,2022-03-10 02:39:00,2022-03-10 02:54:00,Station-31,5937,9,104,CKB -LINE_14,Station-31,2022-03-10 03:03:00,2022-03-10 03:17:00,Station-30,6.19,0,104,CKB -LINE_13,Station-30,2022-03-10 03:17:00,2022-03-10 03:23:00,Station-29,2555,0,104,CKB -LINE_13,Station-29,2022-03-10 03:23:00,2022-03-10 03:30:00,Station-30,2577,9,104,CKB -LINE_14,Station-30,2022-03-10 03:39:00,2022-03-10 03:54:00,Station-31,5937,9,104,CKB -LINE_14,Station-31,2022-03-10 04:03:00,2022-03-10 04:17:00,Station-30,6.19,0,104,CKB -LINE_13,Station-30,2022-03-10 04:17:00,2022-03-10 04:23:00,Station-29,2555,0,104,CKB -LINE_13,Station-29,2022-03-10 04:23:00,2022-03-10 04:23:00,Station-0,0.06,0,104,CKB -LINE_14,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-31,0.06,0,105,CKB -LINE_14,Station-31,2022-03-10 00:33:00,2022-03-10 00:47:00,Station-30,6.19,0,105,CKB -LINE_13,Station-30,2022-03-10 00:47:00,2022-03-10 00:53:00,Station-29,2555,0,105,CKB -LINE_13,Station-29,2022-03-10 00:53:00,2022-03-10 01:00:00,Station-30,2577,9,105,CKB -LINE_14,Station-30,2022-03-10 01:09:00,2022-03-10 01:24:00,Station-31,5937,9,105,CKB -LINE_14,Station-31,2022-03-10 01:33:00,2022-03-10 01:47:00,Station-30,6.19,0,105,CKB -LINE_13,Station-30,2022-03-10 01:47:00,2022-03-10 01:53:00,Station-29,2555,0,105,CKB -LINE_13,Station-29,2022-03-10 01:53:00,2022-03-10 02:00:00,Station-30,2577,9,105,CKB -LINE_14,Station-30,2022-03-10 02:09:00,2022-03-10 02:24:00,Station-31,5937,9,105,CKB -LINE_14,Station-31,2022-03-10 02:33:00,2022-03-10 02:47:00,Station-30,6.19,0,105,CKB -LINE_13,Station-30,2022-03-10 02:47:00,2022-03-10 02:53:00,Station-29,2555,0,105,CKB -LINE_13,Station-29,2022-03-10 02:53:00,2022-03-10 03:00:00,Station-30,2577,9,105,CKB -LINE_14,Station-30,2022-03-10 03:09:00,2022-03-10 03:24:00,Station-31,5937,9,105,CKB -LINE_14,Station-31,2022-03-10 03:33:00,2022-03-10 03:47:00,Station-30,6.19,0,105,CKB -LINE_13,Station-30,2022-03-10 03:47:00,2022-03-10 03:53:00,Station-29,2555,0,105,CKB -LINE_13,Station-29,2022-03-10 03:53:00,2022-03-10 04:00:00,Station-30,2577,9,105,CKB -LINE_14,Station-30,2022-03-10 04:09:00,2022-03-10 04:24:00,Station-31,5937,0,105,CKB -LINE_14,Station-31,2022-03-10 04:24:00,2022-03-10 04:24:00,Station-0,0.06,0,105,CKB -LINE_15,Station-0,2022-03-10 00:57:00,2022-03-10 00:57:00,Station-32,0.06,0,106,CKB -LINE_15,Station-32,2022-03-10 00:57:00,2022-03-10 01:06:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 01:06:00,2022-03-10 01:11:00,Station-32,2936,16,106,CKB -LINE_15,Station-32,2022-03-10 01:27:00,2022-03-10 01:36:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 01:36:00,2022-03-10 01:41:00,Station-32,2936,16,106,CKB -LINE_15,Station-32,2022-03-10 01:57:00,2022-03-10 02:06:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 02:06:00,2022-03-10 02:11:00,Station-32,2936,16,106,CKB -LINE_15,Station-32,2022-03-10 02:27:00,2022-03-10 02:36:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 02:36:00,2022-03-10 02:41:00,Station-32,2936,16,106,CKB -LINE_15,Station-32,2022-03-10 02:57:00,2022-03-10 03:06:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 03:06:00,2022-03-10 03:11:00,Station-32,2936,16,106,CKB -LINE_15,Station-32,2022-03-10 03:27:00,2022-03-10 03:36:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 03:36:00,2022-03-10 03:41:00,Station-32,2936,16,106,CKB -LINE_15,Station-32,2022-03-10 03:57:00,2022-03-10 04:06:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 04:06:00,2022-03-10 04:11:00,Station-32,2936,16,106,CKB -LINE_15,Station-32,2022-03-10 04:27:00,2022-03-10 04:36:00,Station-33,4343,0,106,CKB -LINE_15,Station-33,2022-03-10 04:36:00,2022-03-10 04:36:00,Station-0,0.06,0,106,CKB -LINE_16,Station-0,2022-03-10 00:29:00,2022-03-10 00:29:00,Station-34,0.06,0,107,CKB -LINE_16,Station-34,2022-03-10 00:29:00,2022-03-10 00:41:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 00:47:00,2022-03-10 00:57:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 00:59:00,2022-03-10 01:11:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 01:17:00,2022-03-10 01:27:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 01:29:00,2022-03-10 01:41:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 01:47:00,2022-03-10 01:57:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 01:59:00,2022-03-10 02:11:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 02:17:00,2022-03-10 02:27:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 02:29:00,2022-03-10 02:41:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 02:47:00,2022-03-10 02:57:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 02:59:00,2022-03-10 03:11:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 03:17:00,2022-03-10 03:27:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 03:29:00,2022-03-10 03:41:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 03:47:00,2022-03-10 03:57:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 03:59:00,2022-03-10 04:11:00,Station-35,4481,6,107,CKB -LINE_16,Station-35,2022-03-10 04:17:00,2022-03-10 04:27:00,Station-34,4031,2,107,CKB -LINE_16,Station-34,2022-03-10 04:29:00,2022-03-10 04:41:00,Station-35,4481,0,107,CKB -LINE_16,Station-35,2022-03-10 04:41:00,2022-03-10 04:41:00,Station-0,0.06,0,107,CKB -LINE_17,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-34,0.06,0,108,CKB -LINE_17,Station-34,2022-03-10 00:30:00,2022-03-10 00:44:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 00:44:00,2022-03-10 00:57:00,Station-34,5302,3,108,CKB -LINE_17,Station-34,2022-03-10 01:00:00,2022-03-10 01:14:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 01:14:00,2022-03-10 01:27:00,Station-34,5302,3,108,CKB -LINE_17,Station-34,2022-03-10 01:30:00,2022-03-10 01:44:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 01:44:00,2022-03-10 01:57:00,Station-34,5302,3,108,CKB -LINE_17,Station-34,2022-03-10 02:00:00,2022-03-10 02:14:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 02:14:00,2022-03-10 02:27:00,Station-34,5302,3,108,CKB -LINE_17,Station-34,2022-03-10 02:30:00,2022-03-10 02:44:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 02:44:00,2022-03-10 02:57:00,Station-34,5302,3,108,CKB -LINE_17,Station-34,2022-03-10 03:00:00,2022-03-10 03:14:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 03:14:00,2022-03-10 03:27:00,Station-34,5302,3,108,CKB -LINE_17,Station-34,2022-03-10 03:30:00,2022-03-10 03:44:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 03:44:00,2022-03-10 03:57:00,Station-34,5302,3,108,CKB -LINE_17,Station-34,2022-03-10 04:00:00,2022-03-10 04:14:00,Station-36,4801,0,108,CKB -LINE_17,Station-36,2022-03-10 04:14:00,2022-03-10 04:27:00,Station-34,5302,0,108,CKB -LINE_17,Station-34,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,108,CKB -LINE_18,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-37,0.06,0,109,CKB -LINE_18,Station-37,2022-03-10 00:43:00,2022-03-10 01:33:00,Station-37,20434,10,109,CKB -LINE_18,Station-37,2022-03-10 01:43:00,2022-03-10 02:33:00,Station-37,20434,10,109,CKB -LINE_18,Station-37,2022-03-10 02:43:00,2022-03-10 03:33:00,Station-37,20434,10,109,CKB -LINE_18,Station-37,2022-03-10 03:43:00,2022-03-10 04:33:00,Station-37,20434,0,109,CKB -LINE_18,Station-37,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,109,CKB -LINE_18,Station-0,2022-03-10 00:13:00,2022-03-10 00:13:00,Station-37,0.06,0,110,CKB -LINE_18,Station-37,2022-03-10 00:13:00,2022-03-10 01:03:00,Station-37,20434,10,110,CKB -LINE_18,Station-37,2022-03-10 01:13:00,2022-03-10 02:03:00,Station-37,20434,10,110,CKB -LINE_18,Station-37,2022-03-10 02:13:00,2022-03-10 03:03:00,Station-37,20434,10,110,CKB -LINE_18,Station-37,2022-03-10 03:13:00,2022-03-10 04:03:00,Station-37,20434,0,110,CKB -LINE_18,Station-37,2022-03-10 04:03:00,2022-03-10 04:03:00,Station-0,0.06,0,110,CKB -LINE_19,Station-0,2022-03-10 00:24:00,2022-03-10 00:24:00,Station-38,0.06,0,111,CKB -LINE_19,Station-38,2022-03-10 00:24:00,2022-03-10 00:48:00,Station-39,11.86,4,111,CKB -LINE_19,Station-39,2022-03-10 00:52:00,2022-03-10 01:14:00,Station-38,11139,10,111,CKB -LINE_19,Station-38,2022-03-10 01:24:00,2022-03-10 01:48:00,Station-39,11.86,4,111,CKB -LINE_19,Station-39,2022-03-10 01:52:00,2022-03-10 02:14:00,Station-38,11139,10,111,CKB -LINE_19,Station-38,2022-03-10 02:24:00,2022-03-10 02:48:00,Station-39,11.86,4,111,CKB -LINE_19,Station-39,2022-03-10 02:52:00,2022-03-10 03:14:00,Station-38,11139,10,111,CKB -LINE_19,Station-38,2022-03-10 03:24:00,2022-03-10 03:48:00,Station-39,11.86,4,111,CKB -LINE_19,Station-39,2022-03-10 03:52:00,2022-03-10 04:14:00,Station-38,11139,0,111,CKB -LINE_19,Station-38,2022-03-10 04:14:00,2022-03-10 04:14:00,Station-0,0.06,0,111,CKB -LINE_19,Station-0,2022-03-10 00:22:00,2022-03-10 00:22:00,Station-39,0.06,0,112,CKB -LINE_19,Station-39,2022-03-10 00:22:00,2022-03-10 00:44:00,Station-38,11139,10,112,CKB -LINE_19,Station-38,2022-03-10 00:54:00,2022-03-10 01:18:00,Station-39,11.86,4,112,CKB -LINE_19,Station-39,2022-03-10 01:22:00,2022-03-10 01:44:00,Station-38,11139,10,112,CKB -LINE_19,Station-38,2022-03-10 01:54:00,2022-03-10 02:18:00,Station-39,11.86,4,112,CKB -LINE_19,Station-39,2022-03-10 02:22:00,2022-03-10 02:44:00,Station-38,11139,10,112,CKB -LINE_19,Station-38,2022-03-10 02:54:00,2022-03-10 03:18:00,Station-39,11.86,4,112,CKB -LINE_19,Station-39,2022-03-10 03:22:00,2022-03-10 03:44:00,Station-38,11139,10,112,CKB -LINE_19,Station-38,2022-03-10 03:54:00,2022-03-10 04:18:00,Station-39,11.86,4,112,CKB -LINE_19,Station-39,2022-03-10 04:22:00,2022-03-10 04:44:00,Station-38,11139,0,112,CKB -LINE_19,Station-38,2022-03-10 04:44:00,2022-03-10 04:44:00,Station-0,0.06,0,112,CKB -LINE_20,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,113,CKB -LINE_20,Station-13,2022-03-10 00:32:00,2022-03-10 00:44:00,Station-40,4212,3,113,CKB -LINE_20,Station-40,2022-03-10 00:47:00,2022-03-10 01:16:00,Station-41,13048,0,113,CKB -LINE_20,Station-41,2022-03-10 01:16:00,2022-03-10 01:42:00,Station-40,12869,5,113,CKB -LINE_20,Station-40,2022-03-10 01:47:00,2022-03-10 02:16:00,Station-41,13048,0,113,CKB -LINE_20,Station-41,2022-03-10 02:16:00,2022-03-10 02:42:00,Station-40,12869,5,113,CKB -LINE_20,Station-40,2022-03-10 02:47:00,2022-03-10 03:16:00,Station-41,13048,0,113,CKB -LINE_20,Station-41,2022-03-10 03:16:00,2022-03-10 03:42:00,Station-40,12869,5,113,CKB -LINE_20,Station-40,2022-03-10 03:47:00,2022-03-10 04:16:00,Station-41,13048,0,113,CKB -LINE_20,Station-41,2022-03-10 04:16:00,2022-03-10 04:34:00,Station-42,9538,0,113,CKB -LINE_20,Station-42,2022-03-10 04:34:00,2022-03-10 04:34:00,Station-0,0.06,0,113,CKB -LINE_20,Station-0,2022-03-10 00:17:00,2022-03-10 00:17:00,Station-40,0.06,0,114,CKB -LINE_20,Station-40,2022-03-10 00:17:00,2022-03-10 00:46:00,Station-41,13048,0,114,CKB -LINE_20,Station-41,2022-03-10 00:46:00,2022-03-10 01:12:00,Station-40,12869,5,114,CKB -LINE_20,Station-40,2022-03-10 01:17:00,2022-03-10 01:46:00,Station-41,13048,0,114,CKB -LINE_20,Station-41,2022-03-10 01:46:00,2022-03-10 02:12:00,Station-40,12869,5,114,CKB -LINE_20,Station-40,2022-03-10 02:17:00,2022-03-10 02:46:00,Station-41,13048,0,114,CKB -LINE_20,Station-41,2022-03-10 02:46:00,2022-03-10 03:12:00,Station-40,12869,5,114,CKB -LINE_20,Station-40,2022-03-10 03:17:00,2022-03-10 03:46:00,Station-41,13048,0,114,CKB -LINE_20,Station-41,2022-03-10 03:46:00,2022-03-10 04:12:00,Station-40,12869,5,114,CKB -LINE_20,Station-40,2022-03-10 04:17:00,2022-03-10 04:28:00,Station-13,4316,0,114,CKB -LINE_20,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,114,CKB -LINE_21,Station-0,2022-03-10 00:49:00,2022-03-10 00:49:00,Station-3,0.06,0,115,CKB -LINE_21,Station-3,2022-03-10 00:49:00,2022-03-10 01:04:00,Station-16,10229,0,115,CKB -LINE_21,Station-16,2022-03-10 01:04:00,2022-03-10 01:19:00,Station-3,11801,0,115,CKB -LINE_21,Station-3,2022-03-10 01:19:00,2022-03-10 01:34:00,Station-16,10229,0,115,CKB -LINE_21,Station-16,2022-03-10 01:34:00,2022-03-10 01:49:00,Station-3,11801,0,115,CKB -LINE_21,Station-3,2022-03-10 01:49:00,2022-03-10 02:04:00,Station-16,10229,0,115,CKB -LINE_21,Station-16,2022-03-10 02:04:00,2022-03-10 02:19:00,Station-3,11801,0,115,CKB -LINE_21,Station-3,2022-03-10 02:19:00,2022-03-10 02:34:00,Station-16,10229,0,115,CKB -LINE_21,Station-16,2022-03-10 02:34:00,2022-03-10 02:49:00,Station-3,11801,0,115,CKB -LINE_21,Station-3,2022-03-10 02:49:00,2022-03-10 03:04:00,Station-16,10229,0,115,CKB -LINE_21,Station-16,2022-03-10 03:04:00,2022-03-10 03:19:00,Station-3,11801,0,115,CKB -LINE_21,Station-3,2022-03-10 03:19:00,2022-03-10 03:34:00,Station-16,10229,0,115,CKB -LINE_21,Station-16,2022-03-10 03:34:00,2022-03-10 03:49:00,Station-3,11801,0,115,CKB -LINE_21,Station-3,2022-03-10 03:49:00,2022-03-10 04:04:00,Station-16,10229,0,115,CKB -LINE_21,Station-16,2022-03-10 04:04:00,2022-03-10 04:19:00,Station-3,11801,23,115,CKB -LINE_22,Station-3,2022-03-10 04:42:00,2022-03-10 05:04:00,Station-43,6.81,0,115,CKB -LINE_22,Station-43,2022-03-10 05:04:00,2022-03-10 05:04:00,Station-0,0.06,0,115,CKB -LINE_8,Station-0,2022-03-10 00:32:00,2022-03-10 00:32:00,Station-13,0.06,0,116,CKB -LINE_8,Station-13,2022-03-10 00:32:00,2022-03-10 00:57:00,Station-21,11545,6,116,CKB -LINE_8,Station-21,2022-03-10 01:03:00,2022-03-10 01:46:00,Station-20,20579,1,116,CKB -LINE_8,Station-20,2022-03-10 01:47:00,2022-03-10 02:25:00,Station-21,20641,8,116,CKB -LINE_8,Station-21,2022-03-10 02:33:00,2022-03-10 03:16:00,Station-20,20579,1,116,CKB -LINE_8,Station-20,2022-03-10 03:17:00,2022-03-10 03:55:00,Station-21,20641,8,116,CKB -LINE_8,Station-21,2022-03-10 04:03:00,2022-03-10 04:28:00,Station-13,11499,0,116,CKB -LINE_8,Station-13,2022-03-10 04:28:00,2022-03-10 04:28:00,Station-0,0.06,0,116,CKB -LINE_8,Station-0,2022-03-10 00:33:00,2022-03-10 00:33:00,Station-21,0.06,0,117,CKB -LINE_8,Station-21,2022-03-10 00:33:00,2022-03-10 01:16:00,Station-20,20579,1,117,CKB -LINE_8,Station-20,2022-03-10 01:17:00,2022-03-10 01:55:00,Station-21,20641,8,117,CKB -LINE_8,Station-21,2022-03-10 02:03:00,2022-03-10 02:46:00,Station-20,20579,1,117,CKB -LINE_8,Station-20,2022-03-10 02:47:00,2022-03-10 03:25:00,Station-21,20641,8,117,CKB -LINE_8,Station-21,2022-03-10 03:33:00,2022-03-10 04:16:00,Station-20,20579,1,117,CKB -LINE_8,Station-20,2022-03-10 04:17:00,2022-03-10 04:51:00,Station-44,18752,0,117,CKB -LINE_8,Station-44,2022-03-10 04:51:00,2022-03-10 04:51:00,Station-0,0.06,0,117,CKB -LINE_23,Station-0,2022-03-10 00:34:00,2022-03-10 00:34:00,Station-45,0.06,0,118,CKB -LINE_23,Station-45,2022-03-10 00:34:00,2022-03-10 01:00:00,Station-46,9016,0,118,CKB -LINE_23,Station-46,2022-03-10 01:00:00,2022-03-10 01:27:00,Station-45,10083,7,118,CKB -LINE_23,Station-45,2022-03-10 01:34:00,2022-03-10 02:00:00,Station-46,9016,0,118,CKB -LINE_23,Station-46,2022-03-10 02:00:00,2022-03-10 02:27:00,Station-45,10083,7,118,CKB -LINE_23,Station-45,2022-03-10 02:34:00,2022-03-10 03:00:00,Station-46,9016,0,118,CKB -LINE_23,Station-46,2022-03-10 03:00:00,2022-03-10 03:27:00,Station-45,10083,7,118,CKB -LINE_23,Station-45,2022-03-10 03:34:00,2022-03-10 04:00:00,Station-46,9016,0,118,CKB -LINE_23,Station-46,2022-03-10 04:00:00,2022-03-10 04:27:00,Station-45,10083,0,118,CKB -LINE_23,Station-45,2022-03-10 04:27:00,2022-03-10 04:27:00,Station-0,0.06,0,118,CKB -LINE_23,Station-0,2022-03-10 00:30:00,2022-03-10 00:30:00,Station-46,0.06,0,119,CKB -LINE_23,Station-46,2022-03-10 00:30:00,2022-03-10 00:57:00,Station-45,10083,7,119,CKB -LINE_23,Station-45,2022-03-10 01:04:00,2022-03-10 01:30:00,Station-46,9016,0,119,CKB -LINE_23,Station-46,2022-03-10 01:30:00,2022-03-10 01:57:00,Station-45,10083,7,119,CKB -LINE_23,Station-45,2022-03-10 02:04:00,2022-03-10 02:30:00,Station-46,9016,0,119,CKB -LINE_23,Station-46,2022-03-10 02:30:00,2022-03-10 02:57:00,Station-45,10083,7,119,CKB -LINE_23,Station-45,2022-03-10 03:04:00,2022-03-10 03:30:00,Station-46,9016,0,119,CKB -LINE_23,Station-46,2022-03-10 03:30:00,2022-03-10 03:57:00,Station-45,10083,7,119,CKB -LINE_23,Station-45,2022-03-10 04:04:00,2022-03-10 04:30:00,Station-46,9016,0,119,CKB -LINE_23,Station-46,2022-03-10 04:30:00,2022-03-10 04:57:00,Station-45,10083,0,119,CKB -LINE_23,Station-45,2022-03-10 04:57:00,2022-03-10 04:57:00,Station-0,0.06,0,119,CKB -LINE_24,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,120,CKB -LINE_24,Station-21,2022-03-10 00:31:00,2022-03-10 00:44:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 00:44:00,2022-03-10 00:56:00,Station-21,5362,5,120,CKB -LINE_24,Station-21,2022-03-10 01:01:00,2022-03-10 01:14:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 01:14:00,2022-03-10 01:26:00,Station-21,5362,5,120,CKB -LINE_24,Station-21,2022-03-10 01:31:00,2022-03-10 01:44:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 01:44:00,2022-03-10 01:56:00,Station-21,5362,5,120,CKB -LINE_24,Station-21,2022-03-10 02:01:00,2022-03-10 02:14:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 02:14:00,2022-03-10 02:26:00,Station-21,5362,5,120,CKB -LINE_24,Station-21,2022-03-10 02:31:00,2022-03-10 02:44:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 02:44:00,2022-03-10 02:56:00,Station-21,5362,5,120,CKB -LINE_24,Station-21,2022-03-10 03:01:00,2022-03-10 03:14:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 03:14:00,2022-03-10 03:26:00,Station-21,5362,5,120,CKB -LINE_24,Station-21,2022-03-10 03:31:00,2022-03-10 03:44:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 03:44:00,2022-03-10 03:56:00,Station-21,5362,5,120,CKB -LINE_24,Station-21,2022-03-10 04:01:00,2022-03-10 04:14:00,Station-47,4872,0,120,CKB -LINE_24,Station-47,2022-03-10 04:14:00,2022-03-10 04:26:00,Station-21,5362,0,120,CKB -LINE_24,Station-21,2022-03-10 04:26:00,2022-03-10 04:26:00,Station-0,0.06,0,120,CKB -LINE_25,Station-0,2022-03-10 00:31:00,2022-03-10 00:31:00,Station-21,0.06,0,121,CKB -LINE_25,Station-21,2022-03-10 00:31:00,2022-03-10 00:45:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 00:47:00,2022-03-10 01:01:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 01:01:00,2022-03-10 01:15:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 01:17:00,2022-03-10 01:31:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 01:31:00,2022-03-10 01:45:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 01:47:00,2022-03-10 02:01:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 02:01:00,2022-03-10 02:15:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 02:17:00,2022-03-10 02:31:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 02:31:00,2022-03-10 02:45:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 02:47:00,2022-03-10 03:01:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 03:01:00,2022-03-10 03:15:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 03:17:00,2022-03-10 03:31:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 03:31:00,2022-03-10 03:45:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 03:47:00,2022-03-10 04:01:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 04:01:00,2022-03-10 04:15:00,Station-48,5225,2,121,CKB -LINE_25,Station-48,2022-03-10 04:17:00,2022-03-10 04:31:00,Station-21,7617,0,121,CKB -LINE_25,Station-21,2022-03-10 04:31:00,2022-03-10 04:31:00,Station-0,0.06,0,121,CKB -LINE_26,Station-0,2022-03-10 00:43:00,2022-03-10 00:43:00,Station-49,0.06,0,122,CKB -LINE_26,Station-49,2022-03-10 00:43:00,2022-03-10 00:53:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 00:53:00,2022-03-10 01:03:00,Station-49,4408,10,122,CKB -LINE_26,Station-49,2022-03-10 01:13:00,2022-03-10 01:23:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 01:23:00,2022-03-10 01:33:00,Station-49,4408,10,122,CKB -LINE_26,Station-49,2022-03-10 01:43:00,2022-03-10 01:53:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 01:53:00,2022-03-10 02:03:00,Station-49,4408,10,122,CKB -LINE_26,Station-49,2022-03-10 02:13:00,2022-03-10 02:23:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 02:23:00,2022-03-10 02:33:00,Station-49,4408,10,122,CKB -LINE_26,Station-49,2022-03-10 02:43:00,2022-03-10 02:53:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 02:53:00,2022-03-10 03:03:00,Station-49,4408,10,122,CKB -LINE_26,Station-49,2022-03-10 03:13:00,2022-03-10 03:23:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 03:23:00,2022-03-10 03:33:00,Station-49,4408,10,122,CKB -LINE_26,Station-49,2022-03-10 03:43:00,2022-03-10 03:53:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 03:53:00,2022-03-10 04:03:00,Station-49,4408,10,122,CKB -LINE_26,Station-49,2022-03-10 04:13:00,2022-03-10 04:23:00,Station-50,4507,0,122,CKB -LINE_26,Station-50,2022-03-10 04:23:00,2022-03-10 04:33:00,Station-49,4408,0,122,CKB -LINE_26,Station-49,2022-03-10 04:33:00,2022-03-10 04:33:00,Station-0,0.06,0,122,CKB -LINE_0,Station-0,2022-03-10 21:31:00,2022-03-10 21:31:00,Station-1,0.06,0,123,CKB -LINE_0,Station-1,2022-03-10 21:31:00,2022-03-10 22:04:00,Station-2,14519,4,123,CKB -LINE_0,Station-2,2022-03-10 22:08:00,2022-03-10 22:43:00,Station-1,13541,8,123,CKB -LINE_0,Station-1,2022-03-10 22:51:00,2022-03-10 23:24:00,Station-2,14519,4,123,CKB -LINE_0,Station-2,2022-03-10 23:28:00,2022-03-11 00:03:00,Station-1,13541,8,123,CKB -LINE_0,Station-1,2022-03-11 00:11:00,2022-03-11 00:44:00,Station-2,14519,0,123,CKB -LINE_1,Station-2,2022-03-11 00:44:00,2022-03-11 00:54:00,Station-3,4.1,25,123,CKB -LINE_1,Station-3,2022-03-11 01:19:00,2022-03-11 01:42:00,Station-4,8.36,6,123,CKB -LINE_1,Station-4,2022-03-11 01:48:00,2022-03-11 02:06:00,Station-3,9067,13,123,CKB -LINE_1,Station-3,2022-03-11 02:19:00,2022-03-11 02:42:00,Station-4,8.36,6,123,CKB -LINE_1,Station-4,2022-03-11 02:48:00,2022-03-11 03:06:00,Station-3,9067,13,123,CKB -LINE_1,Station-3,2022-03-11 03:19:00,2022-03-11 03:42:00,Station-4,8.36,6,123,CKB -LINE_1,Station-4,2022-03-11 03:48:00,2022-03-11 04:06:00,Station-3,9067,0,123,CKB -LINE_1,Station-3,2022-03-11 04:06:00,2022-03-11 04:06:00,Station-0,0.06,0,123,CKB -LINE_0,Station-0,2022-03-10 22:11:00,2022-03-10 22:11:00,Station-1,0.06,0,124,CKB -LINE_0,Station-1,2022-03-10 22:11:00,2022-03-10 22:44:00,Station-2,14519,4,124,CKB -LINE_0,Station-2,2022-03-10 22:48:00,2022-03-10 23:23:00,Station-1,13541,8,124,CKB -LINE_0,Station-1,2022-03-10 23:31:00,2022-03-11 00:04:00,Station-2,14519,4,124,CKB -LINE_0,Station-2,2022-03-11 00:08:00,2022-03-11 00:39:00,Station-5,12213,0,124,CKB -LINE_1,Station-5,2022-03-11 00:39:00,2022-03-11 00:47:00,Station-3,4.0,2,124,CKB -LINE_1,Station-3,2022-03-11 00:49:00,2022-03-11 01:12:00,Station-4,8.36,6,124,CKB -LINE_1,Station-4,2022-03-11 01:18:00,2022-03-11 01:36:00,Station-3,9067,13,124,CKB -LINE_1,Station-3,2022-03-11 01:49:00,2022-03-11 02:12:00,Station-4,8.36,6,124,CKB -LINE_1,Station-4,2022-03-11 02:18:00,2022-03-11 02:36:00,Station-3,9067,13,124,CKB -LINE_1,Station-3,2022-03-11 02:49:00,2022-03-11 03:12:00,Station-4,8.36,6,124,CKB -LINE_1,Station-4,2022-03-11 03:18:00,2022-03-11 03:36:00,Station-3,9067,13,124,CKB -LINE_1,Station-3,2022-03-11 03:49:00,2022-03-11 04:12:00,Station-4,8.36,0,124,CKB -LINE_1,Station-4,2022-03-11 04:12:00,2022-03-11 04:12:00,Station-0,0.06,0,124,CKB -LINE_2,Station-0,2022-03-10 21:06:00,2022-03-10 21:06:00,Station-6,0.06,0,125,CKB -LINE_2,Station-6,2022-03-10 21:06:00,2022-03-10 21:34:00,Station-7,13018,19,125,CKB -LINE_2,Station-7,2022-03-10 21:53:00,2022-03-10 22:13:00,Station-8,10332,17,125,CKB -LINE_2,Station-8,2022-03-10 22:30:00,2022-03-10 22:54:00,Station-7,10.48,19,125,CKB -LINE_2,Station-7,2022-03-10 23:13:00,2022-03-10 23:33:00,Station-8,10332,17,125,CKB -LINE_2,Station-8,2022-03-10 23:50:00,2022-03-11 00:14:00,Station-7,10.48,2,125,CKB -LINE_2,Station-7,2022-03-11 00:16:00,2022-03-11 00:23:00,Station-9,3709,5,125,CKB -LINE_3,Station-9,2022-03-11 00:28:00,2022-03-11 00:44:00,Station-10,6404,3,125,CKB -LINE_3,Station-10,2022-03-11 00:47:00,2022-03-11 01:10:00,Station-11,10579,7,125,CKB -LINE_3,Station-11,2022-03-11 01:17:00,2022-03-11 01:44:00,Station-10,12007,3,125,CKB -LINE_3,Station-10,2022-03-11 01:47:00,2022-03-11 02:10:00,Station-11,10579,7,125,CKB -LINE_3,Station-11,2022-03-11 02:17:00,2022-03-11 02:44:00,Station-10,12007,3,125,CKB -LINE_3,Station-10,2022-03-11 02:47:00,2022-03-11 03:10:00,Station-11,10579,7,125,CKB -LINE_3,Station-11,2022-03-11 03:17:00,2022-03-11 03:44:00,Station-10,12007,3,125,CKB -LINE_3,Station-10,2022-03-11 03:47:00,2022-03-11 04:10:00,Station-11,10579,7,125,CKB -LINE_3,Station-11,2022-03-11 04:17:00,2022-03-11 04:44:00,Station-10,12007,0,125,CKB -LINE_3,Station-10,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,125,CKB -LINE_2,Station-0,2022-03-10 20:26:00,2022-03-10 20:26:00,Station-6,0.06,0,126,CKB -LINE_2,Station-6,2022-03-10 20:26:00,2022-03-10 20:56:00,Station-12,14097,14,126,CKB -LINE_2,Station-12,2022-03-10 21:10:00,2022-03-10 21:38:00,Station-6,13.19,8,126,CKB -LINE_2,Station-6,2022-03-10 21:46:00,2022-03-10 22:14:00,Station-7,13018,19,126,CKB -LINE_2,Station-7,2022-03-10 22:33:00,2022-03-10 22:53:00,Station-8,10332,17,126,CKB -LINE_2,Station-8,2022-03-10 23:10:00,2022-03-10 23:34:00,Station-7,10.48,19,126,CKB -LINE_2,Station-7,2022-03-10 23:53:00,2022-03-11 00:13:00,Station-8,10332,2,126,CKB -LINE_2,Station-8,2022-03-11 00:15:00,2022-03-11 00:16:00,Station-10,506,1,126,CKB -LINE_3,Station-10,2022-03-11 00:17:00,2022-03-11 00:40:00,Station-11,10579,7,126,CKB -LINE_3,Station-11,2022-03-11 00:47:00,2022-03-11 01:14:00,Station-10,12007,3,126,CKB -LINE_3,Station-10,2022-03-11 01:17:00,2022-03-11 01:40:00,Station-11,10579,7,126,CKB -LINE_3,Station-11,2022-03-11 01:47:00,2022-03-11 02:14:00,Station-10,12007,3,126,CKB -LINE_3,Station-10,2022-03-11 02:17:00,2022-03-11 02:40:00,Station-11,10579,7,126,CKB -LINE_3,Station-11,2022-03-11 02:47:00,2022-03-11 03:14:00,Station-10,12007,3,126,CKB -LINE_3,Station-10,2022-03-11 03:17:00,2022-03-11 03:40:00,Station-11,10579,7,126,CKB -LINE_3,Station-11,2022-03-11 03:47:00,2022-03-11 04:14:00,Station-10,12007,3,126,CKB -LINE_3,Station-10,2022-03-11 04:17:00,2022-03-11 04:40:00,Station-11,10579,3,126,CKB -LINE_4,Station-11,2022-03-11 04:43:00,2022-03-11 04:58:00,Station-13,6161,0,126,CKB -LINE_4,Station-13,2022-03-11 04:58:00,2022-03-11 04:58:00,Station-0,0.06,0,126,CKB -LINE_5,Station-0,2022-03-10 22:56:00,2022-03-10 22:56:00,Station-14,0.06,0,127,CKB -LINE_5,Station-14,2022-03-10 22:56:00,2022-03-10 23:08:00,Station-15,5882,3,127,CKB -LINE_5,Station-15,2022-03-10 23:11:00,2022-03-10 23:25:00,Station-14,6232,0,127,CKB -LINE_5,Station-14,2022-03-10 23:25:00,2022-03-10 23:38:00,Station-15,6086,3,127,CKB -LINE_5,Station-15,2022-03-10 23:41:00,2022-03-10 23:55:00,Station-14,6232,0,127,CKB -LINE_5,Station-14,2022-03-10 23:55:00,2022-03-11 00:08:00,Station-15,6086,0,127,CKB -LINE_5,Station-15,2022-03-11 00:08:00,2022-03-11 00:08:00,Station-0,0.06,0,127,CKB -LINE_6,Station-0,2022-03-10 05:05:00,2022-03-10 05:05:00,Station-16,0.06,0,128,CKB -LINE_6,Station-16,2022-03-10 05:05:00,2022-03-10 05:14:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 05:14:00,2022-03-10 05:23:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 05:25:00,2022-03-10 05:34:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 05:34:00,2022-03-10 05:43:00,Station-16,5139,23,128,CKB -LINE_6,Station-16,2022-03-10 06:06:00,2022-03-10 06:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 06:15:00,2022-03-10 06:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 06:26:00,2022-03-10 06:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 06:35:00,2022-03-10 06:44:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 06:46:00,2022-03-10 06:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 06:55:00,2022-03-10 07:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 07:06:00,2022-03-10 07:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 07:15:00,2022-03-10 07:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 07:26:00,2022-03-10 07:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 07:35:00,2022-03-10 07:44:00,Station-16,5139,22,128,CKB -LINE_6,Station-16,2022-03-10 08:06:00,2022-03-10 08:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 08:15:00,2022-03-10 08:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 08:26:00,2022-03-10 08:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 08:35:00,2022-03-10 08:44:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 08:46:00,2022-03-10 08:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 08:55:00,2022-03-10 09:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 09:06:00,2022-03-10 09:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 09:15:00,2022-03-10 09:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 09:26:00,2022-03-10 09:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 09:35:00,2022-03-10 09:44:00,Station-16,5139,22,128,CKB -LINE_6,Station-16,2022-03-10 10:06:00,2022-03-10 10:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 10:15:00,2022-03-10 10:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 10:26:00,2022-03-10 10:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 10:35:00,2022-03-10 10:44:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 10:46:00,2022-03-10 10:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 10:55:00,2022-03-10 11:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 11:06:00,2022-03-10 11:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 11:15:00,2022-03-10 11:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 11:26:00,2022-03-10 11:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 11:35:00,2022-03-10 11:44:00,Station-16,5139,22,128,CKB -LINE_6,Station-16,2022-03-10 12:06:00,2022-03-10 12:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 12:15:00,2022-03-10 12:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 12:26:00,2022-03-10 12:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 12:35:00,2022-03-10 12:44:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 12:46:00,2022-03-10 12:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 12:55:00,2022-03-10 13:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 13:06:00,2022-03-10 13:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 13:15:00,2022-03-10 13:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 13:26:00,2022-03-10 13:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 13:35:00,2022-03-10 13:44:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 13:46:00,2022-03-10 13:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 13:55:00,2022-03-10 14:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 14:06:00,2022-03-10 14:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 14:15:00,2022-03-10 14:24:00,Station-16,5139,22,128,CKB -LINE_6,Station-16,2022-03-10 14:46:00,2022-03-10 14:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 14:55:00,2022-03-10 15:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 15:06:00,2022-03-10 15:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 15:15:00,2022-03-10 15:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 15:26:00,2022-03-10 15:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 15:35:00,2022-03-10 15:44:00,Station-16,5139,22,128,CKB -LINE_6,Station-16,2022-03-10 16:06:00,2022-03-10 16:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 16:15:00,2022-03-10 16:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 16:26:00,2022-03-10 16:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 16:35:00,2022-03-10 16:44:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 16:46:00,2022-03-10 16:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 16:55:00,2022-03-10 17:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 17:06:00,2022-03-10 17:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 17:15:00,2022-03-10 17:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 17:26:00,2022-03-10 17:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 17:35:00,2022-03-10 17:44:00,Station-16,5139,22,128,CKB -LINE_6,Station-16,2022-03-10 18:06:00,2022-03-10 18:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 18:15:00,2022-03-10 18:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 18:26:00,2022-03-10 18:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 18:35:00,2022-03-10 18:44:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 18:46:00,2022-03-10 18:55:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 18:55:00,2022-03-10 19:04:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 19:06:00,2022-03-10 19:15:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 19:15:00,2022-03-10 19:24:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 19:26:00,2022-03-10 19:35:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 19:35:00,2022-03-10 19:44:00,Station-16,5139,21,128,CKB -LINE_6,Station-16,2022-03-10 20:05:00,2022-03-10 20:14:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 20:14:00,2022-03-10 20:23:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 20:25:00,2022-03-10 20:34:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 20:34:00,2022-03-10 20:43:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 20:45:00,2022-03-10 20:54:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 20:54:00,2022-03-10 21:03:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 21:05:00,2022-03-10 21:14:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 21:14:00,2022-03-10 21:23:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 21:25:00,2022-03-10 21:34:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 21:34:00,2022-03-10 21:43:00,Station-16,5139,22,128,CKB -LINE_6,Station-16,2022-03-10 22:05:00,2022-03-10 22:14:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 22:14:00,2022-03-10 22:23:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 22:25:00,2022-03-10 22:34:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 22:34:00,2022-03-10 22:43:00,Station-16,5139,2,128,CKB -LINE_6,Station-16,2022-03-10 22:45:00,2022-03-10 22:54:00,Station-17,4781,0,128,CKB -LINE_6,Station-17,2022-03-10 22:54:00,2022-03-10 23:03:00,Station-16,5139,0,128,CKB -LINE_6,Station-16,2022-03-10 23:03:00,2022-03-10 23:03:00,Station-0,0.06,0,128,CKB -LINE_7,Station-0,2022-03-11 00:06:00,2022-03-11 00:06:00,Station-18,0.06,0,129,CKB -LINE_7,Station-18,2022-03-11 00:06:00,2022-03-11 00:27:00,Station-19,7827,0,129,CKB -LINE_8,Station-19,2022-03-11 00:27:00,2022-03-11 00:48:00,Station-20,11079,0,129,CKB -LINE_8,Station-20,2022-03-11 00:48:00,2022-03-11 01:25:00,Station-21,20641,8,129,CKB -LINE_8,Station-21,2022-03-11 01:33:00,2022-03-11 02:16:00,Station-20,20579,1,129,CKB -LINE_8,Station-20,2022-03-11 02:17:00,2022-03-11 02:55:00,Station-21,20641,8,129,CKB -LINE_8,Station-21,2022-03-11 03:03:00,2022-03-11 03:46:00,Station-20,20579,1,129,CKB -LINE_8,Station-20,2022-03-11 03:47:00,2022-03-11 04:25:00,Station-21,20641,0,129,CKB -LINE_8,Station-21,2022-03-11 04:25:00,2022-03-11 04:25:00,Station-0,0.06,0,129,CKB -LINE_9,Station-22,2022-03-10 05:15:00,2022-03-10 06:01:00,Station-23,17.9,0,130,VDL -LINE_9,Station-23,2022-03-10 06:01:00,2022-03-10 06:15:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 06:23:00,2022-03-10 06:37:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 06:41:00,2022-03-10 06:55:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 07:03:00,2022-03-10 07:17:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 07:21:00,2022-03-10 07:35:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 07:43:00,2022-03-10 07:57:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 08:01:00,2022-03-10 08:15:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 08:23:00,2022-03-10 08:37:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 08:41:00,2022-03-10 08:55:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 09:03:00,2022-03-10 09:17:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 09:21:00,2022-03-10 09:35:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 09:43:00,2022-03-10 09:57:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 10:01:00,2022-03-10 10:15:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 10:23:00,2022-03-10 10:37:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 10:41:00,2022-03-10 10:55:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 11:03:00,2022-03-10 11:17:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 11:21:00,2022-03-10 11:35:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 11:43:00,2022-03-10 11:57:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 12:01:00,2022-03-10 12:15:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 12:23:00,2022-03-10 12:37:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 12:41:00,2022-03-10 12:55:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 13:03:00,2022-03-10 13:17:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 13:21:00,2022-03-10 13:35:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 13:43:00,2022-03-10 13:57:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 14:01:00,2022-03-10 14:15:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 14:23:00,2022-03-10 14:37:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 14:41:00,2022-03-10 14:55:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 15:03:00,2022-03-10 15:17:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 15:21:00,2022-03-10 15:35:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 15:43:00,2022-03-10 15:57:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 16:01:00,2022-03-10 16:15:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 16:23:00,2022-03-10 16:37:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 16:41:00,2022-03-10 16:55:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 17:03:00,2022-03-10 17:17:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 17:21:00,2022-03-10 17:35:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 17:43:00,2022-03-10 17:57:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 18:01:00,2022-03-10 18:15:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 18:23:00,2022-03-10 18:37:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 18:41:00,2022-03-10 18:55:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 19:03:00,2022-03-10 19:17:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 19:21:00,2022-03-10 19:35:00,Station-23,4637,8,130,VDL -LINE_9,Station-23,2022-03-10 19:43:00,2022-03-10 19:57:00,Station-23,4637,4,130,VDL -LINE_9,Station-23,2022-03-10 20:01:00,2022-03-10 20:14:00,Station-23,4637,9,130,VDL -LINE_9,Station-23,2022-03-10 20:23:00,2022-03-10 20:36:00,Station-23,4637,0,130,VDL -LINE_9,Station-23,2022-03-10 20:36:00,2022-03-10 21:15:00,Station-22,19.8,0,130,VDL -LINE_10,Station-0,2022-03-10 04:56:00,2022-03-10 04:56:00,Station-24,0.06,18,131,CKB -LINE_10,Station-24,2022-03-10 05:14:00,2022-03-10 05:20:00,Station-25,3.29,0,131,CKB -LINE_10,Station-25,2022-03-10 05:20:00,2022-03-10 05:24:00,Station-24,2954,20,131,CKB -LINE_10,Station-24,2022-03-10 05:44:00,2022-03-10 05:50:00,Station-25,3.29,0,131,CKB -LINE_10,Station-25,2022-03-10 05:50:00,2022-03-10 05:54:00,Station-24,2954,5,131,CKB -LINE_10,Station-24,2022-03-10 05:59:00,2022-03-10 06:06:00,Station-25,3.29,2,131,CKB -LINE_10,Station-25,2022-03-10 06:08:00,2022-03-10 06:13:00,Station-24,2954,19,131,CKB -LINE_10,Station-24,2022-03-10 06:32:00,2022-03-10 06:39:00,Station-25,3.29,1,131,CKB -LINE_10,Station-25,2022-03-10 06:40:00,2022-03-10 06:45:00,Station-24,2954,7,131,CKB -LINE_10,Station-24,2022-03-10 06:52:00,2022-03-10 06:59:00,Station-25,3.29,1,131,CKB -LINE_10,Station-25,2022-03-10 07:00:00,2022-03-10 07:05:00,Station-24,2954,7,131,CKB -LINE_10,Station-24,2022-03-10 07:12:00,2022-03-10 07:19:00,Station-25,3.29,1,131,CKB -LINE_10,Station-25,2022-03-10 07:20:00,2022-03-10 07:25:00,Station-24,2954,7,131,CKB -LINE_10,Station-24,2022-03-10 07:32:00,2022-03-10 07:39:00,Station-25,3.29,1,131,CKB -LINE_10,Station-25,2022-03-10 07:40:00,2022-03-10 07:45:00,Station-24,2954,295,131,CKB -LINE_10,Station-24,2022-03-10 12:40:00,2022-03-10 12:47:00,Station-25,3.29,2,131,CKB -LINE_10,Station-25,2022-03-10 12:49:00,2022-03-10 12:54:00,Station-24,2954,46,131,CKB -LINE_10,Station-24,2022-03-10 13:40:00,2022-03-10 13:47:00,Station-25,3.29,2,131,CKB -LINE_10,Station-25,2022-03-10 13:49:00,2022-03-10 13:54:00,Station-24,2954,434,131,CKB -LINE_10,Station-24,2022-03-10 21:08:00,2022-03-10 21:08:00,Station-0,0.06,0,131,CKB -LINE_11,Station-0,2022-03-10 07:20:00,2022-03-10 07:20:00,Station-26,0.06,0,132,CKB -LINE_11,Station-26,2022-03-10 07:20:00,2022-03-10 07:50:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 08:00:00,2022-03-10 08:30:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 08:40:00,2022-03-10 09:10:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 09:20:00,2022-03-10 09:50:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 10:00:00,2022-03-10 10:30:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 10:40:00,2022-03-10 11:10:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 11:20:00,2022-03-10 11:50:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 12:00:00,2022-03-10 12:30:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 12:40:00,2022-03-10 13:10:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 13:20:00,2022-03-10 13:50:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 14:00:00,2022-03-10 14:30:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 14:40:00,2022-03-10 15:10:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 15:20:00,2022-03-10 15:50:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 16:00:00,2022-03-10 16:30:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 16:40:00,2022-03-10 17:10:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 17:20:00,2022-03-10 17:50:00,Station-26,9266,10,132,CKB -LINE_11,Station-26,2022-03-10 18:00:00,2022-03-10 18:30:00,Station-26,9266,0,132,CKB -LINE_11,Station-26,2022-03-10 18:30:00,2022-03-10 18:30:00,Station-0,0.06,0,132,CKB -LINE_12,Station-0,2022-03-10 07:10:00,2022-03-10 07:10:00,Station-27,0.06,0,133,CKB -LINE_12,Station-27,2022-03-10 07:10:00,2022-03-10 07:18:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 07:28:00,2022-03-10 07:40:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 07:40:00,2022-03-10 07:48:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 07:58:00,2022-03-10 08:10:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 08:10:00,2022-03-10 08:18:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 08:28:00,2022-03-10 08:40:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 08:40:00,2022-03-10 08:48:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 08:58:00,2022-03-10 09:10:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 09:10:00,2022-03-10 09:18:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 09:28:00,2022-03-10 09:40:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 09:40:00,2022-03-10 09:48:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 09:58:00,2022-03-10 10:10:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 10:10:00,2022-03-10 10:18:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 10:28:00,2022-03-10 10:40:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 10:40:00,2022-03-10 10:48:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 10:58:00,2022-03-10 11:10:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 11:10:00,2022-03-10 11:18:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 11:28:00,2022-03-10 11:40:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 11:40:00,2022-03-10 11:48:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 11:58:00,2022-03-10 12:10:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 12:10:00,2022-03-10 12:18:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 12:28:00,2022-03-10 12:40:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 12:40:00,2022-03-10 12:48:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 12:58:00,2022-03-10 13:10:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 13:10:00,2022-03-10 13:18:00,Station-28,2169,10,133,CKB -LINE_12,Station-28,2022-03-10 13:28:00,2022-03-10 13:40:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 13:40:00,2022-03-10 13:48:00,Station-28,2169,8,133,CKB -LINE_12,Station-28,2022-03-10 13:56:00,2022-03-10 14:10:00,Station-27,2952,0,133,CKB -LINE_12,Station-27,2022-03-10 14:10:00,2022-03-10 14:19:00,Station-28,2169,14,133,CKB -LINE_12,Station-28,2022-03-10 14:33:00,2022-03-10 14:47:00,Station-27,2952,3,133,CKB -LINE_12,Station-27,2022-03-10 14:50:00,2022-03-10 14:59:00,Station-28,2169,14,133,CKB -LINE_12,Station-28,2022-03-10 15:13:00,2022-03-10 15:27:00,Station-27,2952,3,133,CKB -LINE_12,Station-27,2022-03-10 15:30:00,2022-03-10 15:39:00,Station-28,2169,14,133,CKB -LINE_12,Station-28,2022-03-10 15:53:00,2022-03-10 16:07:00,Station-27,2952,3,133,CKB -LINE_12,Station-27,2022-03-10 16:10:00,2022-03-10 16:19:00,Station-28,2169,14,133,CKB -LINE_12,Station-28,2022-03-10 16:33:00,2022-03-10 16:47:00,Station-27,2952,3,133,CKB -LINE_12,Station-27,2022-03-10 16:50:00,2022-03-10 16:59:00,Station-28,2169,14,133,CKB -LINE_12,Station-28,2022-03-10 17:13:00,2022-03-10 17:27:00,Station-27,2952,3,133,CKB -LINE_12,Station-27,2022-03-10 17:30:00,2022-03-10 17:39:00,Station-28,2169,13,133,CKB -LINE_12,Station-28,2022-03-10 17:52:00,2022-03-10 18:05:00,Station-27,2952,5,133,CKB -LINE_12,Station-27,2022-03-10 18:10:00,2022-03-10 18:18:00,Station-28,2169,0,133,CKB -LINE_12,Station-28,2022-03-10 18:18:00,2022-03-10 18:18:00,Station-0,0.06,0,133,CKB -LINE_12,Station-0,2022-03-10 14:13:00,2022-03-10 14:13:00,Station-28,0.06,0,134,CKB -LINE_12,Station-28,2022-03-10 14:13:00,2022-03-10 14:27:00,Station-27,2952,3,134,CKB -LINE_12,Station-27,2022-03-10 14:30:00,2022-03-10 14:39:00,Station-28,2169,14,134,CKB -LINE_12,Station-28,2022-03-10 14:53:00,2022-03-10 15:07:00,Station-27,2952,3,134,CKB -LINE_12,Station-27,2022-03-10 15:10:00,2022-03-10 15:19:00,Station-28,2169,14,134,CKB -LINE_12,Station-28,2022-03-10 15:33:00,2022-03-10 15:47:00,Station-27,2952,3,134,CKB -LINE_12,Station-27,2022-03-10 15:50:00,2022-03-10 15:59:00,Station-28,2169,14,134,CKB -LINE_12,Station-28,2022-03-10 16:13:00,2022-03-10 16:27:00,Station-27,2952,3,134,CKB -LINE_12,Station-27,2022-03-10 16:30:00,2022-03-10 16:39:00,Station-28,2169,14,134,CKB -LINE_12,Station-28,2022-03-10 16:53:00,2022-03-10 17:07:00,Station-27,2952,3,134,CKB -LINE_12,Station-27,2022-03-10 17:10:00,2022-03-10 17:19:00,Station-28,2169,14,134,CKB -LINE_12,Station-28,2022-03-10 17:33:00,2022-03-10 17:47:00,Station-27,2952,3,134,CKB -LINE_12,Station-27,2022-03-10 17:50:00,2022-03-10 17:59:00,Station-28,2169,14,134,CKB -LINE_12,Station-28,2022-03-10 18:13:00,2022-03-10 18:25:00,Station-27,2952,0,134,CKB -LINE_12,Station-27,2022-03-10 18:25:00,2022-03-10 18:25:00,Station-0,0.06,0,134,CKB -LINE_13,Station-0,2022-03-11 00:23:00,2022-03-11 00:23:00,Station-29,0.06,0,135,CKB -LINE_13,Station-29,2022-03-11 00:23:00,2022-03-11 00:30:00,Station-30,2577,9,135,CKB -LINE_14,Station-30,2022-03-11 00:39:00,2022-03-11 00:54:00,Station-31,5937,9,135,CKB -LINE_14,Station-31,2022-03-11 01:03:00,2022-03-11 01:17:00,Station-30,6.19,0,135,CKB -LINE_13,Station-30,2022-03-11 01:17:00,2022-03-11 01:23:00,Station-29,2555,0,135,CKB -LINE_13,Station-29,2022-03-11 01:23:00,2022-03-11 01:30:00,Station-30,2577,9,135,CKB -LINE_14,Station-30,2022-03-11 01:39:00,2022-03-11 01:54:00,Station-31,5937,9,135,CKB -LINE_14,Station-31,2022-03-11 02:03:00,2022-03-11 02:17:00,Station-30,6.19,0,135,CKB -LINE_13,Station-30,2022-03-11 02:17:00,2022-03-11 02:23:00,Station-29,2555,0,135,CKB -LINE_13,Station-29,2022-03-11 02:23:00,2022-03-11 02:30:00,Station-30,2577,9,135,CKB -LINE_14,Station-30,2022-03-11 02:39:00,2022-03-11 02:54:00,Station-31,5937,9,135,CKB -LINE_14,Station-31,2022-03-11 03:03:00,2022-03-11 03:17:00,Station-30,6.19,0,135,CKB -LINE_13,Station-30,2022-03-11 03:17:00,2022-03-11 03:23:00,Station-29,2555,0,135,CKB -LINE_13,Station-29,2022-03-11 03:23:00,2022-03-11 03:30:00,Station-30,2577,9,135,CKB -LINE_14,Station-30,2022-03-11 03:39:00,2022-03-11 03:54:00,Station-31,5937,9,135,CKB -LINE_14,Station-31,2022-03-11 04:03:00,2022-03-11 04:17:00,Station-30,6.19,0,135,CKB -LINE_13,Station-30,2022-03-11 04:17:00,2022-03-11 04:23:00,Station-29,2555,0,135,CKB -LINE_13,Station-29,2022-03-11 04:23:00,2022-03-11 04:23:00,Station-0,0.06,0,135,CKB -LINE_14,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-31,0.06,0,136,CKB -LINE_14,Station-31,2022-03-11 00:33:00,2022-03-11 00:47:00,Station-30,6.19,0,136,CKB -LINE_13,Station-30,2022-03-11 00:47:00,2022-03-11 00:53:00,Station-29,2555,0,136,CKB -LINE_13,Station-29,2022-03-11 00:53:00,2022-03-11 01:00:00,Station-30,2577,9,136,CKB -LINE_14,Station-30,2022-03-11 01:09:00,2022-03-11 01:24:00,Station-31,5937,9,136,CKB -LINE_14,Station-31,2022-03-11 01:33:00,2022-03-11 01:47:00,Station-30,6.19,0,136,CKB -LINE_13,Station-30,2022-03-11 01:47:00,2022-03-11 01:53:00,Station-29,2555,0,136,CKB -LINE_13,Station-29,2022-03-11 01:53:00,2022-03-11 02:00:00,Station-30,2577,9,136,CKB -LINE_14,Station-30,2022-03-11 02:09:00,2022-03-11 02:24:00,Station-31,5937,9,136,CKB -LINE_14,Station-31,2022-03-11 02:33:00,2022-03-11 02:47:00,Station-30,6.19,0,136,CKB -LINE_13,Station-30,2022-03-11 02:47:00,2022-03-11 02:53:00,Station-29,2555,0,136,CKB -LINE_13,Station-29,2022-03-11 02:53:00,2022-03-11 03:00:00,Station-30,2577,9,136,CKB -LINE_14,Station-30,2022-03-11 03:09:00,2022-03-11 03:24:00,Station-31,5937,9,136,CKB -LINE_14,Station-31,2022-03-11 03:33:00,2022-03-11 03:47:00,Station-30,6.19,0,136,CKB -LINE_13,Station-30,2022-03-11 03:47:00,2022-03-11 03:53:00,Station-29,2555,0,136,CKB -LINE_13,Station-29,2022-03-11 03:53:00,2022-03-11 04:00:00,Station-30,2577,9,136,CKB -LINE_14,Station-30,2022-03-11 04:09:00,2022-03-11 04:24:00,Station-31,5937,0,136,CKB -LINE_14,Station-31,2022-03-11 04:24:00,2022-03-11 04:24:00,Station-0,0.06,0,136,CKB -LINE_15,Station-0,2022-03-11 00:57:00,2022-03-11 00:57:00,Station-32,0.06,0,137,CKB -LINE_15,Station-32,2022-03-11 00:57:00,2022-03-11 01:06:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 01:06:00,2022-03-11 01:11:00,Station-32,2936,16,137,CKB -LINE_15,Station-32,2022-03-11 01:27:00,2022-03-11 01:36:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 01:36:00,2022-03-11 01:41:00,Station-32,2936,16,137,CKB -LINE_15,Station-32,2022-03-11 01:57:00,2022-03-11 02:06:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 02:06:00,2022-03-11 02:11:00,Station-32,2936,16,137,CKB -LINE_15,Station-32,2022-03-11 02:27:00,2022-03-11 02:36:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 02:36:00,2022-03-11 02:41:00,Station-32,2936,16,137,CKB -LINE_15,Station-32,2022-03-11 02:57:00,2022-03-11 03:06:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 03:06:00,2022-03-11 03:11:00,Station-32,2936,16,137,CKB -LINE_15,Station-32,2022-03-11 03:27:00,2022-03-11 03:36:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 03:36:00,2022-03-11 03:41:00,Station-32,2936,16,137,CKB -LINE_15,Station-32,2022-03-11 03:57:00,2022-03-11 04:06:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 04:06:00,2022-03-11 04:11:00,Station-32,2936,16,137,CKB -LINE_15,Station-32,2022-03-11 04:27:00,2022-03-11 04:36:00,Station-33,4343,0,137,CKB -LINE_15,Station-33,2022-03-11 04:36:00,2022-03-11 04:36:00,Station-0,0.06,0,137,CKB -LINE_16,Station-0,2022-03-11 00:29:00,2022-03-11 00:29:00,Station-34,0.06,0,138,CKB -LINE_16,Station-34,2022-03-11 00:29:00,2022-03-11 00:41:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 00:47:00,2022-03-11 00:57:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 00:59:00,2022-03-11 01:11:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 01:17:00,2022-03-11 01:27:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 01:29:00,2022-03-11 01:41:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 01:47:00,2022-03-11 01:57:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 01:59:00,2022-03-11 02:11:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 02:17:00,2022-03-11 02:27:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 02:29:00,2022-03-11 02:41:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 02:47:00,2022-03-11 02:57:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 02:59:00,2022-03-11 03:11:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 03:17:00,2022-03-11 03:27:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 03:29:00,2022-03-11 03:41:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 03:47:00,2022-03-11 03:57:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 03:59:00,2022-03-11 04:11:00,Station-35,4481,6,138,CKB -LINE_16,Station-35,2022-03-11 04:17:00,2022-03-11 04:27:00,Station-34,4031,2,138,CKB -LINE_16,Station-34,2022-03-11 04:29:00,2022-03-11 04:41:00,Station-35,4481,0,138,CKB -LINE_16,Station-35,2022-03-11 04:41:00,2022-03-11 04:41:00,Station-0,0.06,0,138,CKB -LINE_17,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-34,0.06,0,139,CKB -LINE_17,Station-34,2022-03-11 00:30:00,2022-03-11 00:44:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 00:44:00,2022-03-11 00:57:00,Station-34,5302,3,139,CKB -LINE_17,Station-34,2022-03-11 01:00:00,2022-03-11 01:14:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 01:14:00,2022-03-11 01:27:00,Station-34,5302,3,139,CKB -LINE_17,Station-34,2022-03-11 01:30:00,2022-03-11 01:44:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 01:44:00,2022-03-11 01:57:00,Station-34,5302,3,139,CKB -LINE_17,Station-34,2022-03-11 02:00:00,2022-03-11 02:14:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 02:14:00,2022-03-11 02:27:00,Station-34,5302,3,139,CKB -LINE_17,Station-34,2022-03-11 02:30:00,2022-03-11 02:44:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 02:44:00,2022-03-11 02:57:00,Station-34,5302,3,139,CKB -LINE_17,Station-34,2022-03-11 03:00:00,2022-03-11 03:14:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 03:14:00,2022-03-11 03:27:00,Station-34,5302,3,139,CKB -LINE_17,Station-34,2022-03-11 03:30:00,2022-03-11 03:44:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 03:44:00,2022-03-11 03:57:00,Station-34,5302,3,139,CKB -LINE_17,Station-34,2022-03-11 04:00:00,2022-03-11 04:14:00,Station-36,4801,0,139,CKB -LINE_17,Station-36,2022-03-11 04:14:00,2022-03-11 04:27:00,Station-34,5302,0,139,CKB -LINE_17,Station-34,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,139,CKB -LINE_18,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-37,0.06,0,140,CKB -LINE_18,Station-37,2022-03-11 00:43:00,2022-03-11 01:33:00,Station-37,20434,10,140,CKB -LINE_18,Station-37,2022-03-11 01:43:00,2022-03-11 02:33:00,Station-37,20434,10,140,CKB -LINE_18,Station-37,2022-03-11 02:43:00,2022-03-11 03:33:00,Station-37,20434,10,140,CKB -LINE_18,Station-37,2022-03-11 03:43:00,2022-03-11 04:33:00,Station-37,20434,0,140,CKB -LINE_18,Station-37,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,140,CKB -LINE_18,Station-0,2022-03-11 00:13:00,2022-03-11 00:13:00,Station-37,0.06,0,141,CKB -LINE_18,Station-37,2022-03-11 00:13:00,2022-03-11 01:03:00,Station-37,20434,10,141,CKB -LINE_18,Station-37,2022-03-11 01:13:00,2022-03-11 02:03:00,Station-37,20434,10,141,CKB -LINE_18,Station-37,2022-03-11 02:13:00,2022-03-11 03:03:00,Station-37,20434,10,141,CKB -LINE_18,Station-37,2022-03-11 03:13:00,2022-03-11 04:03:00,Station-37,20434,0,141,CKB -LINE_18,Station-37,2022-03-11 04:03:00,2022-03-11 04:03:00,Station-0,0.06,0,141,CKB -LINE_19,Station-0,2022-03-11 00:24:00,2022-03-11 00:24:00,Station-38,0.06,0,142,CKB -LINE_19,Station-38,2022-03-11 00:24:00,2022-03-11 00:48:00,Station-39,11.86,4,142,CKB -LINE_19,Station-39,2022-03-11 00:52:00,2022-03-11 01:14:00,Station-38,11139,10,142,CKB -LINE_19,Station-38,2022-03-11 01:24:00,2022-03-11 01:48:00,Station-39,11.86,4,142,CKB -LINE_19,Station-39,2022-03-11 01:52:00,2022-03-11 02:14:00,Station-38,11139,10,142,CKB -LINE_19,Station-38,2022-03-11 02:24:00,2022-03-11 02:48:00,Station-39,11.86,4,142,CKB -LINE_19,Station-39,2022-03-11 02:52:00,2022-03-11 03:14:00,Station-38,11139,10,142,CKB -LINE_19,Station-38,2022-03-11 03:24:00,2022-03-11 03:48:00,Station-39,11.86,4,142,CKB -LINE_19,Station-39,2022-03-11 03:52:00,2022-03-11 04:14:00,Station-38,11139,0,142,CKB -LINE_19,Station-38,2022-03-11 04:14:00,2022-03-11 04:14:00,Station-0,0.06,0,142,CKB -LINE_19,Station-0,2022-03-11 00:22:00,2022-03-11 00:22:00,Station-39,0.06,0,143,CKB -LINE_19,Station-39,2022-03-11 00:22:00,2022-03-11 00:44:00,Station-38,11139,10,143,CKB -LINE_19,Station-38,2022-03-11 00:54:00,2022-03-11 01:18:00,Station-39,11.86,4,143,CKB -LINE_19,Station-39,2022-03-11 01:22:00,2022-03-11 01:44:00,Station-38,11139,10,143,CKB -LINE_19,Station-38,2022-03-11 01:54:00,2022-03-11 02:18:00,Station-39,11.86,4,143,CKB -LINE_19,Station-39,2022-03-11 02:22:00,2022-03-11 02:44:00,Station-38,11139,10,143,CKB -LINE_19,Station-38,2022-03-11 02:54:00,2022-03-11 03:18:00,Station-39,11.86,4,143,CKB -LINE_19,Station-39,2022-03-11 03:22:00,2022-03-11 03:44:00,Station-38,11139,10,143,CKB -LINE_19,Station-38,2022-03-11 03:54:00,2022-03-11 04:18:00,Station-39,11.86,4,143,CKB -LINE_19,Station-39,2022-03-11 04:22:00,2022-03-11 04:44:00,Station-38,11139,0,143,CKB -LINE_19,Station-38,2022-03-11 04:44:00,2022-03-11 04:44:00,Station-0,0.06,0,143,CKB -LINE_20,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,144,CKB -LINE_20,Station-13,2022-03-11 00:32:00,2022-03-11 00:44:00,Station-40,4212,3,144,CKB -LINE_20,Station-40,2022-03-11 00:47:00,2022-03-11 01:16:00,Station-41,13048,0,144,CKB -LINE_20,Station-41,2022-03-11 01:16:00,2022-03-11 01:42:00,Station-40,12869,5,144,CKB -LINE_20,Station-40,2022-03-11 01:47:00,2022-03-11 02:16:00,Station-41,13048,0,144,CKB -LINE_20,Station-41,2022-03-11 02:16:00,2022-03-11 02:42:00,Station-40,12869,5,144,CKB -LINE_20,Station-40,2022-03-11 02:47:00,2022-03-11 03:16:00,Station-41,13048,0,144,CKB -LINE_20,Station-41,2022-03-11 03:16:00,2022-03-11 03:42:00,Station-40,12869,5,144,CKB -LINE_20,Station-40,2022-03-11 03:47:00,2022-03-11 04:16:00,Station-41,13048,0,144,CKB -LINE_20,Station-41,2022-03-11 04:16:00,2022-03-11 04:34:00,Station-42,9538,0,144,CKB -LINE_20,Station-42,2022-03-11 04:34:00,2022-03-11 04:34:00,Station-0,0.06,0,144,CKB -LINE_20,Station-0,2022-03-11 00:17:00,2022-03-11 00:17:00,Station-40,0.06,0,145,CKB -LINE_20,Station-40,2022-03-11 00:17:00,2022-03-11 00:46:00,Station-41,13048,0,145,CKB -LINE_20,Station-41,2022-03-11 00:46:00,2022-03-11 01:12:00,Station-40,12869,5,145,CKB -LINE_20,Station-40,2022-03-11 01:17:00,2022-03-11 01:46:00,Station-41,13048,0,145,CKB -LINE_20,Station-41,2022-03-11 01:46:00,2022-03-11 02:12:00,Station-40,12869,5,145,CKB -LINE_20,Station-40,2022-03-11 02:17:00,2022-03-11 02:46:00,Station-41,13048,0,145,CKB -LINE_20,Station-41,2022-03-11 02:46:00,2022-03-11 03:12:00,Station-40,12869,5,145,CKB -LINE_20,Station-40,2022-03-11 03:17:00,2022-03-11 03:46:00,Station-41,13048,0,145,CKB -LINE_20,Station-41,2022-03-11 03:46:00,2022-03-11 04:12:00,Station-40,12869,5,145,CKB -LINE_20,Station-40,2022-03-11 04:17:00,2022-03-11 04:28:00,Station-13,4316,0,145,CKB -LINE_20,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,145,CKB -LINE_21,Station-0,2022-03-11 00:49:00,2022-03-11 00:49:00,Station-3,0.06,0,146,CKB -LINE_21,Station-3,2022-03-11 00:49:00,2022-03-11 01:04:00,Station-16,10229,0,146,CKB -LINE_21,Station-16,2022-03-11 01:04:00,2022-03-11 01:19:00,Station-3,11801,0,146,CKB -LINE_21,Station-3,2022-03-11 01:19:00,2022-03-11 01:34:00,Station-16,10229,0,146,CKB -LINE_21,Station-16,2022-03-11 01:34:00,2022-03-11 01:49:00,Station-3,11801,0,146,CKB -LINE_21,Station-3,2022-03-11 01:49:00,2022-03-11 02:04:00,Station-16,10229,0,146,CKB -LINE_21,Station-16,2022-03-11 02:04:00,2022-03-11 02:19:00,Station-3,11801,0,146,CKB -LINE_21,Station-3,2022-03-11 02:19:00,2022-03-11 02:34:00,Station-16,10229,0,146,CKB -LINE_21,Station-16,2022-03-11 02:34:00,2022-03-11 02:49:00,Station-3,11801,0,146,CKB -LINE_21,Station-3,2022-03-11 02:49:00,2022-03-11 03:04:00,Station-16,10229,0,146,CKB -LINE_21,Station-16,2022-03-11 03:04:00,2022-03-11 03:19:00,Station-3,11801,0,146,CKB -LINE_21,Station-3,2022-03-11 03:19:00,2022-03-11 03:34:00,Station-16,10229,0,146,CKB -LINE_21,Station-16,2022-03-11 03:34:00,2022-03-11 03:49:00,Station-3,11801,0,146,CKB -LINE_21,Station-3,2022-03-11 03:49:00,2022-03-11 04:04:00,Station-16,10229,0,146,CKB -LINE_21,Station-16,2022-03-11 04:04:00,2022-03-11 04:19:00,Station-3,11801,23,146,CKB -LINE_22,Station-3,2022-03-11 04:42:00,2022-03-11 05:04:00,Station-43,6.81,0,146,CKB -LINE_22,Station-43,2022-03-11 05:04:00,2022-03-11 05:04:00,Station-0,0.06,0,146,CKB -LINE_8,Station-0,2022-03-11 00:32:00,2022-03-11 00:32:00,Station-13,0.06,0,147,CKB -LINE_8,Station-13,2022-03-11 00:32:00,2022-03-11 00:57:00,Station-21,11545,6,147,CKB -LINE_8,Station-21,2022-03-11 01:03:00,2022-03-11 01:46:00,Station-20,20579,1,147,CKB -LINE_8,Station-20,2022-03-11 01:47:00,2022-03-11 02:25:00,Station-21,20641,8,147,CKB -LINE_8,Station-21,2022-03-11 02:33:00,2022-03-11 03:16:00,Station-20,20579,1,147,CKB -LINE_8,Station-20,2022-03-11 03:17:00,2022-03-11 03:55:00,Station-21,20641,8,147,CKB -LINE_8,Station-21,2022-03-11 04:03:00,2022-03-11 04:28:00,Station-13,11499,0,147,CKB -LINE_8,Station-13,2022-03-11 04:28:00,2022-03-11 04:28:00,Station-0,0.06,0,147,CKB -LINE_8,Station-0,2022-03-11 00:33:00,2022-03-11 00:33:00,Station-21,0.06,0,148,CKB -LINE_8,Station-21,2022-03-11 00:33:00,2022-03-11 01:16:00,Station-20,20579,1,148,CKB -LINE_8,Station-20,2022-03-11 01:17:00,2022-03-11 01:55:00,Station-21,20641,8,148,CKB -LINE_8,Station-21,2022-03-11 02:03:00,2022-03-11 02:46:00,Station-20,20579,1,148,CKB -LINE_8,Station-20,2022-03-11 02:47:00,2022-03-11 03:25:00,Station-21,20641,8,148,CKB -LINE_8,Station-21,2022-03-11 03:33:00,2022-03-11 04:16:00,Station-20,20579,1,148,CKB -LINE_8,Station-20,2022-03-11 04:17:00,2022-03-11 04:51:00,Station-44,18752,0,148,CKB -LINE_8,Station-44,2022-03-11 04:51:00,2022-03-11 04:51:00,Station-0,0.06,0,148,CKB -LINE_23,Station-0,2022-03-11 00:34:00,2022-03-11 00:34:00,Station-45,0.06,0,149,CKB -LINE_23,Station-45,2022-03-11 00:34:00,2022-03-11 01:00:00,Station-46,9016,0,149,CKB -LINE_23,Station-46,2022-03-11 01:00:00,2022-03-11 01:27:00,Station-45,10083,7,149,CKB -LINE_23,Station-45,2022-03-11 01:34:00,2022-03-11 02:00:00,Station-46,9016,0,149,CKB -LINE_23,Station-46,2022-03-11 02:00:00,2022-03-11 02:27:00,Station-45,10083,7,149,CKB -LINE_23,Station-45,2022-03-11 02:34:00,2022-03-11 03:00:00,Station-46,9016,0,149,CKB -LINE_23,Station-46,2022-03-11 03:00:00,2022-03-11 03:27:00,Station-45,10083,7,149,CKB -LINE_23,Station-45,2022-03-11 03:34:00,2022-03-11 04:00:00,Station-46,9016,0,149,CKB -LINE_23,Station-46,2022-03-11 04:00:00,2022-03-11 04:27:00,Station-45,10083,0,149,CKB -LINE_23,Station-45,2022-03-11 04:27:00,2022-03-11 04:27:00,Station-0,0.06,0,149,CKB -LINE_23,Station-0,2022-03-11 00:30:00,2022-03-11 00:30:00,Station-46,0.06,0,150,CKB -LINE_23,Station-46,2022-03-11 00:30:00,2022-03-11 00:57:00,Station-45,10083,7,150,CKB -LINE_23,Station-45,2022-03-11 01:04:00,2022-03-11 01:30:00,Station-46,9016,0,150,CKB -LINE_23,Station-46,2022-03-11 01:30:00,2022-03-11 01:57:00,Station-45,10083,7,150,CKB -LINE_23,Station-45,2022-03-11 02:04:00,2022-03-11 02:30:00,Station-46,9016,0,150,CKB -LINE_23,Station-46,2022-03-11 02:30:00,2022-03-11 02:57:00,Station-45,10083,7,150,CKB -LINE_23,Station-45,2022-03-11 03:04:00,2022-03-11 03:30:00,Station-46,9016,0,150,CKB -LINE_23,Station-46,2022-03-11 03:30:00,2022-03-11 03:57:00,Station-45,10083,7,150,CKB -LINE_23,Station-45,2022-03-11 04:04:00,2022-03-11 04:30:00,Station-46,9016,0,150,CKB -LINE_23,Station-46,2022-03-11 04:30:00,2022-03-11 04:57:00,Station-45,10083,0,150,CKB -LINE_23,Station-45,2022-03-11 04:57:00,2022-03-11 04:57:00,Station-0,0.06,0,150,CKB -LINE_24,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,151,CKB -LINE_24,Station-21,2022-03-11 00:31:00,2022-03-11 00:44:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 00:44:00,2022-03-11 00:56:00,Station-21,5362,5,151,CKB -LINE_24,Station-21,2022-03-11 01:01:00,2022-03-11 01:14:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 01:14:00,2022-03-11 01:26:00,Station-21,5362,5,151,CKB -LINE_24,Station-21,2022-03-11 01:31:00,2022-03-11 01:44:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 01:44:00,2022-03-11 01:56:00,Station-21,5362,5,151,CKB -LINE_24,Station-21,2022-03-11 02:01:00,2022-03-11 02:14:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 02:14:00,2022-03-11 02:26:00,Station-21,5362,5,151,CKB -LINE_24,Station-21,2022-03-11 02:31:00,2022-03-11 02:44:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 02:44:00,2022-03-11 02:56:00,Station-21,5362,5,151,CKB -LINE_24,Station-21,2022-03-11 03:01:00,2022-03-11 03:14:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 03:14:00,2022-03-11 03:26:00,Station-21,5362,5,151,CKB -LINE_24,Station-21,2022-03-11 03:31:00,2022-03-11 03:44:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 03:44:00,2022-03-11 03:56:00,Station-21,5362,5,151,CKB -LINE_24,Station-21,2022-03-11 04:01:00,2022-03-11 04:14:00,Station-47,4872,0,151,CKB -LINE_24,Station-47,2022-03-11 04:14:00,2022-03-11 04:26:00,Station-21,5362,0,151,CKB -LINE_24,Station-21,2022-03-11 04:26:00,2022-03-11 04:26:00,Station-0,0.06,0,151,CKB -LINE_25,Station-0,2022-03-11 00:31:00,2022-03-11 00:31:00,Station-21,0.06,0,152,CKB -LINE_25,Station-21,2022-03-11 00:31:00,2022-03-11 00:45:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 00:47:00,2022-03-11 01:01:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 01:01:00,2022-03-11 01:15:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 01:17:00,2022-03-11 01:31:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 01:31:00,2022-03-11 01:45:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 01:47:00,2022-03-11 02:01:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 02:01:00,2022-03-11 02:15:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 02:17:00,2022-03-11 02:31:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 02:31:00,2022-03-11 02:45:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 02:47:00,2022-03-11 03:01:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 03:01:00,2022-03-11 03:15:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 03:17:00,2022-03-11 03:31:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 03:31:00,2022-03-11 03:45:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 03:47:00,2022-03-11 04:01:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 04:01:00,2022-03-11 04:15:00,Station-48,5225,2,152,CKB -LINE_25,Station-48,2022-03-11 04:17:00,2022-03-11 04:31:00,Station-21,7617,0,152,CKB -LINE_25,Station-21,2022-03-11 04:31:00,2022-03-11 04:31:00,Station-0,0.06,0,152,CKB -LINE_26,Station-0,2022-03-11 00:43:00,2022-03-11 00:43:00,Station-49,0.06,0,153,CKB -LINE_26,Station-49,2022-03-11 00:43:00,2022-03-11 00:53:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 00:53:00,2022-03-11 01:03:00,Station-49,4408,10,153,CKB -LINE_26,Station-49,2022-03-11 01:13:00,2022-03-11 01:23:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 01:23:00,2022-03-11 01:33:00,Station-49,4408,10,153,CKB -LINE_26,Station-49,2022-03-11 01:43:00,2022-03-11 01:53:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 01:53:00,2022-03-11 02:03:00,Station-49,4408,10,153,CKB -LINE_26,Station-49,2022-03-11 02:13:00,2022-03-11 02:23:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 02:23:00,2022-03-11 02:33:00,Station-49,4408,10,153,CKB -LINE_26,Station-49,2022-03-11 02:43:00,2022-03-11 02:53:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 02:53:00,2022-03-11 03:03:00,Station-49,4408,10,153,CKB -LINE_26,Station-49,2022-03-11 03:13:00,2022-03-11 03:23:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 03:23:00,2022-03-11 03:33:00,Station-49,4408,10,153,CKB -LINE_26,Station-49,2022-03-11 03:43:00,2022-03-11 03:53:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 03:53:00,2022-03-11 04:03:00,Station-49,4408,10,153,CKB -LINE_26,Station-49,2022-03-11 04:13:00,2022-03-11 04:23:00,Station-50,4507,0,153,CKB -LINE_26,Station-50,2022-03-11 04:23:00,2022-03-11 04:33:00,Station-49,4408,0,153,CKB -LINE_26,Station-49,2022-03-11 04:33:00,2022-03-11 04:33:00,Station-0,0.06,0,153,CKB -LINE_0,Station-0,2022-03-11 21:31:00,2022-03-11 21:31:00,Station-1,0.06,0,154,CKB -LINE_0,Station-1,2022-03-11 21:31:00,2022-03-11 22:04:00,Station-2,14519,4,154,CKB -LINE_0,Station-2,2022-03-11 22:08:00,2022-03-11 22:43:00,Station-1,13541,8,154,CKB -LINE_0,Station-1,2022-03-11 22:51:00,2022-03-11 23:24:00,Station-2,14519,4,154,CKB -LINE_0,Station-2,2022-03-11 23:28:00,2022-03-12 00:03:00,Station-1,13541,8,154,CKB -LINE_0,Station-1,2022-03-12 00:11:00,2022-03-12 00:44:00,Station-2,14519,0,154,CKB -LINE_1,Station-2,2022-03-12 00:44:00,2022-03-12 00:54:00,Station-3,4.1,25,154,CKB -LINE_1,Station-3,2022-03-12 01:19:00,2022-03-12 01:42:00,Station-4,8.36,6,154,CKB -LINE_1,Station-4,2022-03-12 01:48:00,2022-03-12 02:06:00,Station-3,9067,13,154,CKB -LINE_1,Station-3,2022-03-12 02:19:00,2022-03-12 02:42:00,Station-4,8.36,6,154,CKB -LINE_1,Station-4,2022-03-12 02:48:00,2022-03-12 03:06:00,Station-3,9067,13,154,CKB -LINE_1,Station-3,2022-03-12 03:19:00,2022-03-12 03:42:00,Station-4,8.36,6,154,CKB -LINE_1,Station-4,2022-03-12 03:48:00,2022-03-12 04:06:00,Station-3,9067,13,154,CKB -LINE_1,Station-3,2022-03-12 04:19:00,2022-03-12 04:42:00,Station-4,8.36,6,154,CKB -LINE_1,Station-4,2022-03-12 04:48:00,2022-03-12 05:06:00,Station-3,9067,13,154,CKB -LINE_1,Station-3,2022-03-12 05:19:00,2022-03-12 05:42:00,Station-4,8.36,16,154,CKB -LINE_22,Station-4,2022-03-12 05:58:00,2022-03-12 06:34:00,Station-43,12968,0,154,CKB -LINE_22,Station-43,2022-03-12 06:34:00,2022-03-12 06:34:00,Station-0,0.06,0,154,CKB -LINE_0,Station-0,2022-03-11 22:11:00,2022-03-11 22:11:00,Station-1,0.06,0,155,CKB -LINE_0,Station-1,2022-03-11 22:11:00,2022-03-11 22:44:00,Station-2,14519,4,155,CKB -LINE_0,Station-2,2022-03-11 22:48:00,2022-03-11 23:23:00,Station-1,13541,8,155,CKB -LINE_0,Station-1,2022-03-11 23:31:00,2022-03-12 00:04:00,Station-2,14519,4,155,CKB -LINE_0,Station-2,2022-03-12 00:08:00,2022-03-12 00:39:00,Station-5,12213,0,155,CKB -LINE_1,Station-5,2022-03-12 00:39:00,2022-03-12 00:47:00,Station-3,4.0,2,155,CKB -LINE_1,Station-3,2022-03-12 00:49:00,2022-03-12 01:12:00,Station-4,8.36,6,155,CKB -LINE_1,Station-4,2022-03-12 01:18:00,2022-03-12 01:36:00,Station-3,9067,13,155,CKB -LINE_1,Station-3,2022-03-12 01:49:00,2022-03-12 02:12:00,Station-4,8.36,6,155,CKB -LINE_1,Station-4,2022-03-12 02:18:00,2022-03-12 02:36:00,Station-3,9067,13,155,CKB -LINE_1,Station-3,2022-03-12 02:49:00,2022-03-12 03:12:00,Station-4,8.36,6,155,CKB -LINE_1,Station-4,2022-03-12 03:18:00,2022-03-12 03:36:00,Station-3,9067,13,155,CKB -LINE_1,Station-3,2022-03-12 03:49:00,2022-03-12 04:12:00,Station-4,8.36,6,155,CKB -LINE_1,Station-4,2022-03-12 04:18:00,2022-03-12 04:36:00,Station-3,9067,13,155,CKB -LINE_1,Station-3,2022-03-12 04:49:00,2022-03-12 05:12:00,Station-4,8.36,6,155,CKB -LINE_1,Station-4,2022-03-12 05:18:00,2022-03-12 05:36:00,Station-3,9067,0,155,CKB -LINE_1,Station-3,2022-03-12 05:36:00,2022-03-12 05:36:00,Station-0,0.06,0,155,CKB -LINE_2,Station-0,2022-03-11 21:06:00,2022-03-11 21:06:00,Station-6,0.06,0,156,CKB -LINE_2,Station-6,2022-03-11 21:06:00,2022-03-11 21:34:00,Station-7,13018,19,156,CKB -LINE_2,Station-7,2022-03-11 21:53:00,2022-03-11 22:13:00,Station-8,10332,17,156,CKB -LINE_2,Station-8,2022-03-11 22:30:00,2022-03-11 22:54:00,Station-7,10.48,19,156,CKB -LINE_2,Station-7,2022-03-11 23:13:00,2022-03-11 23:33:00,Station-8,10332,17,156,CKB -LINE_2,Station-8,2022-03-11 23:50:00,2022-03-12 00:14:00,Station-7,10.48,8,156,CKB -LINE_2,Station-7,2022-03-12 00:22:00,2022-03-12 00:27:00,Station-58,2533,2,156,CKB -LINE_3,Station-58,2022-03-12 00:29:00,2022-03-12 00:47:00,Station-10,7.58,0,156,CKB -LINE_3,Station-10,2022-03-12 00:47:00,2022-03-12 01:14:00,Station-11,12841,3,156,CKB -LINE_3,Station-11,2022-03-12 01:17:00,2022-03-12 01:47:00,Station-10,14281,0,156,CKB -LINE_3,Station-10,2022-03-12 01:47:00,2022-03-12 02:14:00,Station-11,12841,3,156,CKB -LINE_3,Station-11,2022-03-12 02:17:00,2022-03-12 02:47:00,Station-10,14281,0,156,CKB -LINE_3,Station-10,2022-03-12 02:47:00,2022-03-12 03:14:00,Station-11,12841,3,156,CKB -LINE_3,Station-11,2022-03-12 03:17:00,2022-03-12 03:47:00,Station-10,14281,0,156,CKB -LINE_3,Station-10,2022-03-12 03:47:00,2022-03-12 04:14:00,Station-11,12841,3,156,CKB -LINE_3,Station-11,2022-03-12 04:17:00,2022-03-12 04:47:00,Station-10,14281,0,156,CKB -LINE_3,Station-10,2022-03-12 04:47:00,2022-03-12 05:14:00,Station-11,12841,3,156,CKB -LINE_3,Station-11,2022-03-12 05:17:00,2022-03-12 05:47:00,Station-10,14281,0,156,CKB -LINE_3,Station-10,2022-03-12 05:47:00,2022-03-12 05:47:00,Station-0,0.06,0,156,CKB -LINE_2,Station-0,2022-03-11 20:26:00,2022-03-11 20:26:00,Station-6,0.06,0,157,CKB -LINE_2,Station-6,2022-03-11 20:26:00,2022-03-11 20:56:00,Station-12,14097,14,157,CKB -LINE_2,Station-12,2022-03-11 21:10:00,2022-03-11 21:38:00,Station-6,13.19,8,157,CKB -LINE_2,Station-6,2022-03-11 21:46:00,2022-03-11 22:14:00,Station-7,13018,19,157,CKB -LINE_2,Station-7,2022-03-11 22:33:00,2022-03-11 22:53:00,Station-8,10332,17,157,CKB -LINE_2,Station-8,2022-03-11 23:10:00,2022-03-11 23:34:00,Station-7,10.48,19,157,CKB -LINE_2,Station-7,2022-03-11 23:53:00,2022-03-12 00:13:00,Station-8,10332,2,157,CKB -LINE_2,Station-8,2022-03-12 00:15:00,2022-03-12 00:16:00,Station-10,506,1,157,CKB -LINE_3,Station-10,2022-03-12 00:17:00,2022-03-12 00:44:00,Station-11,12841,3,157,CKB -LINE_3,Station-11,2022-03-12 00:47:00,2022-03-12 01:17:00,Station-10,14281,0,157,CKB -LINE_3,Station-10,2022-03-12 01:17:00,2022-03-12 01:44:00,Station-11,12841,3,157,CKB -LINE_3,Station-11,2022-03-12 01:47:00,2022-03-12 02:17:00,Station-10,14281,0,157,CKB -LINE_3,Station-10,2022-03-12 02:17:00,2022-03-12 02:44:00,Station-11,12841,3,157,CKB -LINE_3,Station-11,2022-03-12 02:47:00,2022-03-12 03:17:00,Station-10,14281,0,157,CKB -LINE_3,Station-10,2022-03-12 03:17:00,2022-03-12 03:44:00,Station-11,12841,3,157,CKB -LINE_3,Station-11,2022-03-12 03:47:00,2022-03-12 04:17:00,Station-10,14281,0,157,CKB -LINE_3,Station-10,2022-03-12 04:17:00,2022-03-12 04:44:00,Station-11,12841,3,157,CKB -LINE_3,Station-11,2022-03-12 04:47:00,2022-03-12 05:17:00,Station-10,14281,0,157,CKB -LINE_3,Station-10,2022-03-12 05:17:00,2022-03-12 05:29:00,Station-58,5474,0,157,CKB -LINE_3,Station-58,2022-03-12 05:29:00,2022-03-12 05:29:00,Station-0,0.06,0,157,CKB -LINE_5,Station-0,2022-03-11 22:56:00,2022-03-11 22:56:00,Station-14,0.06,0,158,CKB -LINE_5,Station-14,2022-03-11 22:56:00,2022-03-11 23:08:00,Station-15,5882,3,158,CKB -LINE_5,Station-15,2022-03-11 23:11:00,2022-03-11 23:25:00,Station-14,6232,0,158,CKB -LINE_5,Station-14,2022-03-11 23:25:00,2022-03-11 23:38:00,Station-15,6086,3,158,CKB -LINE_5,Station-15,2022-03-11 23:41:00,2022-03-11 23:55:00,Station-14,6232,0,158,CKB -LINE_5,Station-14,2022-03-11 23:55:00,2022-03-12 00:08:00,Station-15,6086,0,158,CKB -LINE_5,Station-15,2022-03-12 00:08:00,2022-03-12 00:08:00,Station-0,0.06,0,158,CKB -LINE_6,Station-0,2022-03-11 05:05:00,2022-03-11 05:05:00,Station-16,0.06,0,159,CKB -LINE_6,Station-16,2022-03-11 05:05:00,2022-03-11 05:14:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 05:14:00,2022-03-11 05:23:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 05:25:00,2022-03-11 05:34:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 05:34:00,2022-03-11 05:43:00,Station-16,5139,23,159,CKB -LINE_6,Station-16,2022-03-11 06:06:00,2022-03-11 06:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 06:15:00,2022-03-11 06:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 06:26:00,2022-03-11 06:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 06:35:00,2022-03-11 06:44:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 06:46:00,2022-03-11 06:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 06:55:00,2022-03-11 07:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 07:06:00,2022-03-11 07:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 07:15:00,2022-03-11 07:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 07:26:00,2022-03-11 07:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 07:35:00,2022-03-11 07:44:00,Station-16,5139,22,159,CKB -LINE_6,Station-16,2022-03-11 08:06:00,2022-03-11 08:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 08:15:00,2022-03-11 08:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 08:26:00,2022-03-11 08:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 08:35:00,2022-03-11 08:44:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 08:46:00,2022-03-11 08:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 08:55:00,2022-03-11 09:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 09:06:00,2022-03-11 09:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 09:15:00,2022-03-11 09:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 09:26:00,2022-03-11 09:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 09:35:00,2022-03-11 09:44:00,Station-16,5139,22,159,CKB -LINE_6,Station-16,2022-03-11 10:06:00,2022-03-11 10:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 10:15:00,2022-03-11 10:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 10:26:00,2022-03-11 10:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 10:35:00,2022-03-11 10:44:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 10:46:00,2022-03-11 10:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 10:55:00,2022-03-11 11:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 11:06:00,2022-03-11 11:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 11:15:00,2022-03-11 11:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 11:26:00,2022-03-11 11:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 11:35:00,2022-03-11 11:44:00,Station-16,5139,22,159,CKB -LINE_6,Station-16,2022-03-11 12:06:00,2022-03-11 12:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 12:15:00,2022-03-11 12:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 12:26:00,2022-03-11 12:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 12:35:00,2022-03-11 12:44:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 12:46:00,2022-03-11 12:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 12:55:00,2022-03-11 13:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 13:06:00,2022-03-11 13:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 13:15:00,2022-03-11 13:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 13:26:00,2022-03-11 13:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 13:35:00,2022-03-11 13:44:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 13:46:00,2022-03-11 13:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 13:55:00,2022-03-11 14:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 14:06:00,2022-03-11 14:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 14:15:00,2022-03-11 14:24:00,Station-16,5139,22,159,CKB -LINE_6,Station-16,2022-03-11 14:46:00,2022-03-11 14:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 14:55:00,2022-03-11 15:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 15:06:00,2022-03-11 15:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 15:15:00,2022-03-11 15:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 15:26:00,2022-03-11 15:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 15:35:00,2022-03-11 15:44:00,Station-16,5139,22,159,CKB -LINE_6,Station-16,2022-03-11 16:06:00,2022-03-11 16:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 16:15:00,2022-03-11 16:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 16:26:00,2022-03-11 16:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 16:35:00,2022-03-11 16:44:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 16:46:00,2022-03-11 16:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 16:55:00,2022-03-11 17:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 17:06:00,2022-03-11 17:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 17:15:00,2022-03-11 17:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 17:26:00,2022-03-11 17:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 17:35:00,2022-03-11 17:44:00,Station-16,5139,22,159,CKB -LINE_6,Station-16,2022-03-11 18:06:00,2022-03-11 18:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 18:15:00,2022-03-11 18:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 18:26:00,2022-03-11 18:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 18:35:00,2022-03-11 18:44:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 18:46:00,2022-03-11 18:55:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 18:55:00,2022-03-11 19:04:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 19:06:00,2022-03-11 19:15:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 19:15:00,2022-03-11 19:24:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 19:26:00,2022-03-11 19:35:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 19:35:00,2022-03-11 19:44:00,Station-16,5139,21,159,CKB -LINE_6,Station-16,2022-03-11 20:05:00,2022-03-11 20:14:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 20:14:00,2022-03-11 20:23:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 20:25:00,2022-03-11 20:34:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 20:34:00,2022-03-11 20:43:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 20:45:00,2022-03-11 20:54:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 20:54:00,2022-03-11 21:03:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 21:05:00,2022-03-11 21:14:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 21:14:00,2022-03-11 21:23:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 21:25:00,2022-03-11 21:34:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 21:34:00,2022-03-11 21:43:00,Station-16,5139,22,159,CKB -LINE_6,Station-16,2022-03-11 22:05:00,2022-03-11 22:14:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 22:14:00,2022-03-11 22:23:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 22:25:00,2022-03-11 22:34:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 22:34:00,2022-03-11 22:43:00,Station-16,5139,2,159,CKB -LINE_6,Station-16,2022-03-11 22:45:00,2022-03-11 22:54:00,Station-17,4781,0,159,CKB -LINE_6,Station-17,2022-03-11 22:54:00,2022-03-11 23:03:00,Station-16,5139,0,159,CKB -LINE_6,Station-16,2022-03-11 23:03:00,2022-03-11 23:03:00,Station-0,0.06,0,159,CKB -LINE_9,Station-22,2022-03-11 05:15:00,2022-03-11 06:01:00,Station-23,17.9,0,160,VDL -LINE_9,Station-23,2022-03-11 06:01:00,2022-03-11 06:15:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 06:23:00,2022-03-11 06:37:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 06:41:00,2022-03-11 06:55:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 07:03:00,2022-03-11 07:17:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 07:21:00,2022-03-11 07:35:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 07:43:00,2022-03-11 07:57:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 08:01:00,2022-03-11 08:15:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 08:23:00,2022-03-11 08:37:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 08:41:00,2022-03-11 08:55:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 09:03:00,2022-03-11 09:17:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 09:21:00,2022-03-11 09:35:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 09:43:00,2022-03-11 09:57:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 10:01:00,2022-03-11 10:15:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 10:23:00,2022-03-11 10:37:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 10:41:00,2022-03-11 10:55:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 11:03:00,2022-03-11 11:17:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 11:21:00,2022-03-11 11:35:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 11:43:00,2022-03-11 11:57:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 12:01:00,2022-03-11 12:15:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 12:23:00,2022-03-11 12:37:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 12:41:00,2022-03-11 12:55:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 13:03:00,2022-03-11 13:17:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 13:21:00,2022-03-11 13:35:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 13:43:00,2022-03-11 13:57:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 14:01:00,2022-03-11 14:15:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 14:23:00,2022-03-11 14:37:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 14:41:00,2022-03-11 14:55:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 15:03:00,2022-03-11 15:17:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 15:21:00,2022-03-11 15:35:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 15:43:00,2022-03-11 15:57:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 16:01:00,2022-03-11 16:15:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 16:23:00,2022-03-11 16:37:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 16:41:00,2022-03-11 16:55:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 17:03:00,2022-03-11 17:17:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 17:21:00,2022-03-11 17:35:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 17:43:00,2022-03-11 17:57:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 18:01:00,2022-03-11 18:15:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 18:23:00,2022-03-11 18:37:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 18:41:00,2022-03-11 18:55:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 19:03:00,2022-03-11 19:17:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 19:21:00,2022-03-11 19:35:00,Station-23,4637,8,160,VDL -LINE_9,Station-23,2022-03-11 19:43:00,2022-03-11 19:57:00,Station-23,4637,4,160,VDL -LINE_9,Station-23,2022-03-11 20:01:00,2022-03-11 20:14:00,Station-23,4637,9,160,VDL -LINE_9,Station-23,2022-03-11 20:23:00,2022-03-11 20:36:00,Station-23,4637,0,160,VDL -LINE_9,Station-23,2022-03-11 20:36:00,2022-03-11 21:15:00,Station-22,19.8,0,160,VDL -LINE_10,Station-0,2022-03-11 04:56:00,2022-03-11 04:56:00,Station-24,0.06,18,161,CKB -LINE_10,Station-24,2022-03-11 05:14:00,2022-03-11 05:20:00,Station-25,3.29,0,161,CKB -LINE_10,Station-25,2022-03-11 05:20:00,2022-03-11 05:24:00,Station-24,2954,20,161,CKB -LINE_10,Station-24,2022-03-11 05:44:00,2022-03-11 05:50:00,Station-25,3.29,0,161,CKB -LINE_10,Station-25,2022-03-11 05:50:00,2022-03-11 05:54:00,Station-24,2954,5,161,CKB -LINE_10,Station-24,2022-03-11 05:59:00,2022-03-11 06:06:00,Station-25,3.29,2,161,CKB -LINE_10,Station-25,2022-03-11 06:08:00,2022-03-11 06:13:00,Station-24,2954,19,161,CKB -LINE_10,Station-24,2022-03-11 06:32:00,2022-03-11 06:39:00,Station-25,3.29,1,161,CKB -LINE_10,Station-25,2022-03-11 06:40:00,2022-03-11 06:45:00,Station-24,2954,7,161,CKB -LINE_10,Station-24,2022-03-11 06:52:00,2022-03-11 06:59:00,Station-25,3.29,1,161,CKB -LINE_10,Station-25,2022-03-11 07:00:00,2022-03-11 07:05:00,Station-24,2954,7,161,CKB -LINE_10,Station-24,2022-03-11 07:12:00,2022-03-11 07:19:00,Station-25,3.29,1,161,CKB -LINE_10,Station-25,2022-03-11 07:20:00,2022-03-11 07:25:00,Station-24,2954,7,161,CKB -LINE_10,Station-24,2022-03-11 07:32:00,2022-03-11 07:39:00,Station-25,3.29,1,161,CKB -LINE_10,Station-25,2022-03-11 07:40:00,2022-03-11 07:45:00,Station-24,2954,295,161,CKB -LINE_10,Station-24,2022-03-11 12:40:00,2022-03-11 12:47:00,Station-25,3.29,2,161,CKB -LINE_10,Station-25,2022-03-11 12:49:00,2022-03-11 12:54:00,Station-24,2954,46,161,CKB -LINE_10,Station-24,2022-03-11 13:40:00,2022-03-11 13:47:00,Station-25,3.29,2,161,CKB -LINE_10,Station-25,2022-03-11 13:49:00,2022-03-11 13:54:00,Station-24,2954,434,161,CKB -LINE_10,Station-24,2022-03-11 21:08:00,2022-03-11 21:08:00,Station-0,0.06,0,161,CKB -LINE_11,Station-0,2022-03-11 07:20:00,2022-03-11 07:20:00,Station-26,0.06,0,162,CKB -LINE_11,Station-26,2022-03-11 07:20:00,2022-03-11 07:50:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 08:00:00,2022-03-11 08:30:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 08:40:00,2022-03-11 09:10:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 09:20:00,2022-03-11 09:50:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 10:00:00,2022-03-11 10:30:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 10:40:00,2022-03-11 11:10:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 11:20:00,2022-03-11 11:50:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 12:00:00,2022-03-11 12:30:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 12:40:00,2022-03-11 13:10:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 13:20:00,2022-03-11 13:50:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 14:00:00,2022-03-11 14:30:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 14:40:00,2022-03-11 15:10:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 15:20:00,2022-03-11 15:50:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 16:00:00,2022-03-11 16:30:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 16:40:00,2022-03-11 17:10:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 17:20:00,2022-03-11 17:50:00,Station-26,9266,10,162,CKB -LINE_11,Station-26,2022-03-11 18:00:00,2022-03-11 18:30:00,Station-26,9266,0,162,CKB -LINE_11,Station-26,2022-03-11 18:30:00,2022-03-11 18:30:00,Station-0,0.06,0,162,CKB -LINE_12,Station-0,2022-03-11 07:10:00,2022-03-11 07:10:00,Station-27,0.06,0,163,CKB -LINE_12,Station-27,2022-03-11 07:10:00,2022-03-11 07:18:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 07:28:00,2022-03-11 07:40:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 07:40:00,2022-03-11 07:48:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 07:58:00,2022-03-11 08:10:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 08:10:00,2022-03-11 08:18:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 08:28:00,2022-03-11 08:40:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 08:40:00,2022-03-11 08:48:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 08:58:00,2022-03-11 09:10:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 09:10:00,2022-03-11 09:18:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 09:28:00,2022-03-11 09:40:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 09:40:00,2022-03-11 09:48:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 09:58:00,2022-03-11 10:10:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 10:10:00,2022-03-11 10:18:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 10:28:00,2022-03-11 10:40:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 10:40:00,2022-03-11 10:48:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 10:58:00,2022-03-11 11:10:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 11:10:00,2022-03-11 11:18:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 11:28:00,2022-03-11 11:40:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 11:40:00,2022-03-11 11:48:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 11:58:00,2022-03-11 12:10:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 12:10:00,2022-03-11 12:18:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 12:28:00,2022-03-11 12:40:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 12:40:00,2022-03-11 12:48:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 12:58:00,2022-03-11 13:10:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 13:10:00,2022-03-11 13:18:00,Station-28,2169,10,163,CKB -LINE_12,Station-28,2022-03-11 13:28:00,2022-03-11 13:40:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 13:40:00,2022-03-11 13:48:00,Station-28,2169,8,163,CKB -LINE_12,Station-28,2022-03-11 13:56:00,2022-03-11 14:10:00,Station-27,2952,0,163,CKB -LINE_12,Station-27,2022-03-11 14:10:00,2022-03-11 14:19:00,Station-28,2169,14,163,CKB -LINE_12,Station-28,2022-03-11 14:33:00,2022-03-11 14:47:00,Station-27,2952,3,163,CKB -LINE_12,Station-27,2022-03-11 14:50:00,2022-03-11 14:59:00,Station-28,2169,14,163,CKB -LINE_12,Station-28,2022-03-11 15:13:00,2022-03-11 15:27:00,Station-27,2952,3,163,CKB -LINE_12,Station-27,2022-03-11 15:30:00,2022-03-11 15:39:00,Station-28,2169,14,163,CKB -LINE_12,Station-28,2022-03-11 15:53:00,2022-03-11 16:07:00,Station-27,2952,3,163,CKB -LINE_12,Station-27,2022-03-11 16:10:00,2022-03-11 16:19:00,Station-28,2169,14,163,CKB -LINE_12,Station-28,2022-03-11 16:33:00,2022-03-11 16:47:00,Station-27,2952,3,163,CKB -LINE_12,Station-27,2022-03-11 16:50:00,2022-03-11 16:59:00,Station-28,2169,14,163,CKB -LINE_12,Station-28,2022-03-11 17:13:00,2022-03-11 17:27:00,Station-27,2952,3,163,CKB -LINE_12,Station-27,2022-03-11 17:30:00,2022-03-11 17:39:00,Station-28,2169,13,163,CKB -LINE_12,Station-28,2022-03-11 17:52:00,2022-03-11 18:05:00,Station-27,2952,5,163,CKB -LINE_12,Station-27,2022-03-11 18:10:00,2022-03-11 18:18:00,Station-28,2169,0,163,CKB -LINE_12,Station-28,2022-03-11 18:18:00,2022-03-11 18:18:00,Station-0,0.06,0,163,CKB -LINE_12,Station-0,2022-03-11 14:13:00,2022-03-11 14:13:00,Station-28,0.06,0,164,CKB -LINE_12,Station-28,2022-03-11 14:13:00,2022-03-11 14:27:00,Station-27,2952,3,164,CKB -LINE_12,Station-27,2022-03-11 14:30:00,2022-03-11 14:39:00,Station-28,2169,14,164,CKB -LINE_12,Station-28,2022-03-11 14:53:00,2022-03-11 15:07:00,Station-27,2952,3,164,CKB -LINE_12,Station-27,2022-03-11 15:10:00,2022-03-11 15:19:00,Station-28,2169,14,164,CKB -LINE_12,Station-28,2022-03-11 15:33:00,2022-03-11 15:47:00,Station-27,2952,3,164,CKB -LINE_12,Station-27,2022-03-11 15:50:00,2022-03-11 15:59:00,Station-28,2169,14,164,CKB -LINE_12,Station-28,2022-03-11 16:13:00,2022-03-11 16:27:00,Station-27,2952,3,164,CKB -LINE_12,Station-27,2022-03-11 16:30:00,2022-03-11 16:39:00,Station-28,2169,14,164,CKB -LINE_12,Station-28,2022-03-11 16:53:00,2022-03-11 17:07:00,Station-27,2952,3,164,CKB -LINE_12,Station-27,2022-03-11 17:10:00,2022-03-11 17:19:00,Station-28,2169,14,164,CKB -LINE_12,Station-28,2022-03-11 17:33:00,2022-03-11 17:47:00,Station-27,2952,3,164,CKB -LINE_12,Station-27,2022-03-11 17:50:00,2022-03-11 17:59:00,Station-28,2169,14,164,CKB -LINE_12,Station-28,2022-03-11 18:13:00,2022-03-11 18:25:00,Station-27,2952,0,164,CKB -LINE_12,Station-27,2022-03-11 18:25:00,2022-03-11 18:25:00,Station-0,0.06,0,164,CKB -LINE_13,Station-0,2022-03-12 00:23:00,2022-03-12 00:23:00,Station-29,0.06,0,165,CKB -LINE_13,Station-29,2022-03-12 00:23:00,2022-03-12 00:30:00,Station-30,2577,9,165,CKB -LINE_14,Station-30,2022-03-12 00:39:00,2022-03-12 00:54:00,Station-31,5937,9,165,CKB -LINE_14,Station-31,2022-03-12 01:03:00,2022-03-12 01:17:00,Station-30,6.19,0,165,CKB -LINE_13,Station-30,2022-03-12 01:17:00,2022-03-12 01:23:00,Station-29,2555,0,165,CKB -LINE_13,Station-29,2022-03-12 01:23:00,2022-03-12 01:30:00,Station-30,2577,9,165,CKB -LINE_14,Station-30,2022-03-12 01:39:00,2022-03-12 01:54:00,Station-31,5937,9,165,CKB -LINE_14,Station-31,2022-03-12 02:03:00,2022-03-12 02:17:00,Station-30,6.19,0,165,CKB -LINE_13,Station-30,2022-03-12 02:17:00,2022-03-12 02:23:00,Station-29,2555,0,165,CKB -LINE_13,Station-29,2022-03-12 02:23:00,2022-03-12 02:30:00,Station-30,2577,9,165,CKB -LINE_14,Station-30,2022-03-12 02:39:00,2022-03-12 02:54:00,Station-31,5937,9,165,CKB -LINE_14,Station-31,2022-03-12 03:03:00,2022-03-12 03:17:00,Station-30,6.19,0,165,CKB -LINE_13,Station-30,2022-03-12 03:17:00,2022-03-12 03:23:00,Station-29,2555,0,165,CKB -LINE_13,Station-29,2022-03-12 03:23:00,2022-03-12 03:30:00,Station-30,2577,9,165,CKB -LINE_14,Station-30,2022-03-12 03:39:00,2022-03-12 03:54:00,Station-31,5937,9,165,CKB -LINE_14,Station-31,2022-03-12 04:03:00,2022-03-12 04:17:00,Station-30,6.19,0,165,CKB -LINE_13,Station-30,2022-03-12 04:17:00,2022-03-12 04:23:00,Station-29,2555,0,165,CKB -LINE_13,Station-29,2022-03-12 04:23:00,2022-03-12 04:30:00,Station-30,2577,9,165,CKB -LINE_14,Station-30,2022-03-12 04:39:00,2022-03-12 04:54:00,Station-31,5937,9,165,CKB -LINE_14,Station-31,2022-03-12 05:03:00,2022-03-12 05:17:00,Station-30,6.19,0,165,CKB -LINE_15,Station-30,2022-03-12 05:17:00,2022-03-12 05:38:00,Station-33,12.0,28,165,CKB -LINE_15,Station-33,2022-03-12 06:06:00,2022-03-12 06:11:00,Station-32,2936,16,165,CKB -LINE_15,Station-32,2022-03-12 06:27:00,2022-03-12 06:36:00,Station-33,4343,10,165,CKB -LINE_15,Station-33,2022-03-12 06:46:00,2022-03-12 06:51:00,Station-32,2936,0,165,CKB -LINE_10,Station-32,2022-03-12 06:51:00,2022-03-12 07:00:00,Station-24,4.6,12,165,CKB -LINE_10,Station-24,2022-03-12 07:12:00,2022-03-12 07:12:00,Station-24,0.0,836,165,CKB -LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-24,0.0,0,165,CKB -LINE_10,Station-24,2022-03-12 21:08:00,2022-03-12 21:08:00,Station-0,0.06,0,165,CKB -LINE_14,Station-0,2022-03-12 00:33:00,2022-03-12 00:33:00,Station-31,0.06,0,166,CKB -LINE_14,Station-31,2022-03-12 00:33:00,2022-03-12 00:47:00,Station-30,6.19,0,166,CKB -LINE_13,Station-30,2022-03-12 00:47:00,2022-03-12 00:53:00,Station-29,2555,0,166,CKB -LINE_13,Station-29,2022-03-12 00:53:00,2022-03-12 01:00:00,Station-30,2577,9,166,CKB -LINE_14,Station-30,2022-03-12 01:09:00,2022-03-12 01:24:00,Station-31,5937,9,166,CKB -LINE_14,Station-31,2022-03-12 01:33:00,2022-03-12 01:47:00,Station-30,6.19,0,166,CKB -LINE_13,Station-30,2022-03-12 01:47:00,2022-03-12 01:53:00,Station-29,2555,0,166,CKB -LINE_13,Station-29,2022-03-12 01:53:00,2022-03-12 02:00:00,Station-30,2577,9,166,CKB -LINE_14,Station-30,2022-03-12 02:09:00,2022-03-12 02:24:00,Station-31,5937,9,166,CKB -LINE_14,Station-31,2022-03-12 02:33:00,2022-03-12 02:47:00,Station-30,6.19,0,166,CKB -LINE_13,Station-30,2022-03-12 02:47:00,2022-03-12 02:53:00,Station-29,2555,0,166,CKB -LINE_13,Station-29,2022-03-12 02:53:00,2022-03-12 03:00:00,Station-30,2577,9,166,CKB -LINE_14,Station-30,2022-03-12 03:09:00,2022-03-12 03:24:00,Station-31,5937,9,166,CKB -LINE_14,Station-31,2022-03-12 03:33:00,2022-03-12 03:47:00,Station-30,6.19,0,166,CKB -LINE_13,Station-30,2022-03-12 03:47:00,2022-03-12 03:53:00,Station-29,2555,0,166,CKB -LINE_13,Station-29,2022-03-12 03:53:00,2022-03-12 04:00:00,Station-30,2577,9,166,CKB -LINE_14,Station-30,2022-03-12 04:09:00,2022-03-12 04:24:00,Station-31,5937,9,166,CKB -LINE_14,Station-31,2022-03-12 04:33:00,2022-03-12 04:47:00,Station-30,6.19,0,166,CKB -LINE_13,Station-30,2022-03-12 04:47:00,2022-03-12 04:53:00,Station-29,2555,0,166,CKB -LINE_13,Station-29,2022-03-12 04:53:00,2022-03-12 05:00:00,Station-30,2577,9,166,CKB -LINE_14,Station-30,2022-03-12 05:09:00,2022-03-12 05:24:00,Station-31,5937,0,166,CKB -LINE_14,Station-31,2022-03-12 05:24:00,2022-03-12 05:24:00,Station-0,0.06,0,166,CKB -LINE_15,Station-0,2022-03-12 00:57:00,2022-03-12 00:57:00,Station-32,0.06,0,167,CKB -LINE_15,Station-32,2022-03-12 00:57:00,2022-03-12 01:06:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 01:06:00,2022-03-12 01:11:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 01:27:00,2022-03-12 01:36:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 01:36:00,2022-03-12 01:41:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 01:57:00,2022-03-12 02:06:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 02:06:00,2022-03-12 02:11:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 02:27:00,2022-03-12 02:36:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 02:36:00,2022-03-12 02:41:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 02:57:00,2022-03-12 03:06:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 03:06:00,2022-03-12 03:11:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 03:27:00,2022-03-12 03:36:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 03:36:00,2022-03-12 03:41:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 03:57:00,2022-03-12 04:06:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 04:06:00,2022-03-12 04:11:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 04:27:00,2022-03-12 04:36:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 04:36:00,2022-03-12 04:41:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 04:57:00,2022-03-12 05:06:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 05:06:00,2022-03-12 05:11:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 05:27:00,2022-03-12 05:36:00,Station-33,4343,0,167,CKB -LINE_15,Station-33,2022-03-12 05:36:00,2022-03-12 05:41:00,Station-32,2936,16,167,CKB -LINE_15,Station-32,2022-03-12 05:57:00,2022-03-12 06:06:00,Station-33,4343,20,167,CKB -LINE_15,Station-33,2022-03-12 06:26:00,2022-03-12 06:31:00,Station-32,2936,0,167,CKB -LINE_15,Station-32,2022-03-12 06:31:00,2022-03-12 06:31:00,Station-0,0.06,0,167,CKB -LINE_17,Station-0,2022-03-12 00:30:00,2022-03-12 00:30:00,Station-34,0.06,0,168,CKB -LINE_17,Station-34,2022-03-12 00:30:00,2022-03-12 00:44:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 00:44:00,2022-03-12 00:57:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 01:00:00,2022-03-12 01:14:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 01:14:00,2022-03-12 01:27:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 01:30:00,2022-03-12 01:44:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 01:44:00,2022-03-12 01:57:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 02:00:00,2022-03-12 02:14:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 02:14:00,2022-03-12 02:27:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 02:30:00,2022-03-12 02:44:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 02:44:00,2022-03-12 02:57:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 03:00:00,2022-03-12 03:14:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 03:14:00,2022-03-12 03:27:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 03:30:00,2022-03-12 03:44:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 03:44:00,2022-03-12 03:57:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 04:00:00,2022-03-12 04:14:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 04:14:00,2022-03-12 04:27:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 04:30:00,2022-03-12 04:44:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 04:44:00,2022-03-12 04:57:00,Station-34,5302,3,168,CKB -LINE_17,Station-34,2022-03-12 05:00:00,2022-03-12 05:14:00,Station-36,4801,0,168,CKB -LINE_17,Station-36,2022-03-12 05:14:00,2022-03-12 05:27:00,Station-34,5302,0,168,CKB -LINE_17,Station-34,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,168,CKB -LINE_20,Station-0,2022-03-12 00:32:00,2022-03-12 00:32:00,Station-13,0.06,0,169,CKB -LINE_20,Station-13,2022-03-12 00:32:00,2022-03-12 00:44:00,Station-40,4212,3,169,CKB -LINE_20,Station-40,2022-03-12 00:47:00,2022-03-12 01:16:00,Station-41,13048,0,169,CKB -LINE_20,Station-41,2022-03-12 01:16:00,2022-03-12 01:42:00,Station-40,12869,5,169,CKB -LINE_20,Station-40,2022-03-12 01:47:00,2022-03-12 02:16:00,Station-41,13048,0,169,CKB -LINE_20,Station-41,2022-03-12 02:16:00,2022-03-12 02:42:00,Station-40,12869,5,169,CKB -LINE_20,Station-40,2022-03-12 02:47:00,2022-03-12 03:16:00,Station-41,13048,0,169,CKB -LINE_20,Station-41,2022-03-12 03:16:00,2022-03-12 03:42:00,Station-40,12869,5,169,CKB -LINE_20,Station-40,2022-03-12 03:47:00,2022-03-12 04:16:00,Station-41,13048,0,169,CKB -LINE_20,Station-41,2022-03-12 04:16:00,2022-03-12 04:42:00,Station-40,12869,5,169,CKB -LINE_20,Station-40,2022-03-12 04:47:00,2022-03-12 05:16:00,Station-41,13048,0,169,CKB -LINE_20,Station-41,2022-03-12 05:16:00,2022-03-12 05:34:00,Station-42,9538,0,169,CKB -LINE_20,Station-42,2022-03-12 05:34:00,2022-03-12 05:34:00,Station-0,0.06,0,169,CKB -LINE_20,Station-0,2022-03-12 00:17:00,2022-03-12 00:17:00,Station-40,0.06,0,170,CKB -LINE_20,Station-40,2022-03-12 00:17:00,2022-03-12 00:46:00,Station-41,13048,0,170,CKB -LINE_20,Station-41,2022-03-12 00:46:00,2022-03-12 01:12:00,Station-40,12869,5,170,CKB -LINE_20,Station-40,2022-03-12 01:17:00,2022-03-12 01:46:00,Station-41,13048,0,170,CKB -LINE_20,Station-41,2022-03-12 01:46:00,2022-03-12 02:12:00,Station-40,12869,5,170,CKB -LINE_20,Station-40,2022-03-12 02:17:00,2022-03-12 02:46:00,Station-41,13048,0,170,CKB -LINE_20,Station-41,2022-03-12 02:46:00,2022-03-12 03:12:00,Station-40,12869,5,170,CKB -LINE_20,Station-40,2022-03-12 03:17:00,2022-03-12 03:46:00,Station-41,13048,0,170,CKB -LINE_20,Station-41,2022-03-12 03:46:00,2022-03-12 04:12:00,Station-40,12869,5,170,CKB -LINE_20,Station-40,2022-03-12 04:17:00,2022-03-12 04:46:00,Station-41,13048,0,170,CKB -LINE_20,Station-41,2022-03-12 04:46:00,2022-03-12 05:12:00,Station-40,12869,0,170,CKB -LINE_20,Station-40,2022-03-12 05:12:00,2022-03-12 05:12:00,Station-0,0.06,0,170,CKB -LINE_21,Station-0,2022-03-12 00:49:00,2022-03-12 00:49:00,Station-3,0.06,0,171,CKB -LINE_21,Station-3,2022-03-12 00:49:00,2022-03-12 01:04:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 01:04:00,2022-03-12 01:19:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 01:19:00,2022-03-12 01:34:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 01:34:00,2022-03-12 01:49:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 01:49:00,2022-03-12 02:04:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 02:04:00,2022-03-12 02:19:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 02:19:00,2022-03-12 02:34:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 02:34:00,2022-03-12 02:49:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 02:49:00,2022-03-12 03:04:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 03:04:00,2022-03-12 03:19:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 03:19:00,2022-03-12 03:34:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 03:34:00,2022-03-12 03:49:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 03:49:00,2022-03-12 04:04:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 04:04:00,2022-03-12 04:19:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 04:19:00,2022-03-12 04:34:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 04:34:00,2022-03-12 04:49:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 04:49:00,2022-03-12 05:04:00,Station-16,10229,0,171,CKB -LINE_21,Station-16,2022-03-12 05:04:00,2022-03-12 05:19:00,Station-3,11801,0,171,CKB -LINE_21,Station-3,2022-03-12 05:19:00,2022-03-12 05:19:00,Station-0,0.06,0,171,CKB -LINE_23,Station-0,2022-03-12 02:34:00,2022-03-12 02:34:00,Station-45,0.06,0,172,CKB -LINE_23,Station-45,2022-03-12 02:34:00,2022-03-12 03:00:00,Station-46,9016,0,172,CKB -LINE_23,Station-46,2022-03-12 03:00:00,2022-03-12 03:27:00,Station-45,10083,7,172,CKB -LINE_23,Station-45,2022-03-12 03:34:00,2022-03-12 04:00:00,Station-46,9016,0,172,CKB -LINE_23,Station-46,2022-03-12 04:00:00,2022-03-12 04:27:00,Station-45,10083,7,172,CKB -LINE_23,Station-45,2022-03-12 04:34:00,2022-03-12 05:00:00,Station-46,9016,0,172,CKB -LINE_23,Station-46,2022-03-12 05:00:00,2022-03-12 05:27:00,Station-45,10083,0,172,CKB -LINE_23,Station-45,2022-03-12 05:27:00,2022-03-12 05:27:00,Station-0,0.06,0,172,CKB -LINE_23,Station-0,2022-03-12 02:04:00,2022-03-12 02:04:00,Station-45,0.06,0,173,CKB -LINE_23,Station-45,2022-03-12 02:04:00,2022-03-12 02:30:00,Station-46,9016,0,173,CKB -LINE_23,Station-46,2022-03-12 02:30:00,2022-03-12 02:57:00,Station-45,10083,7,173,CKB -LINE_23,Station-45,2022-03-12 03:04:00,2022-03-12 03:30:00,Station-46,9016,0,173,CKB -LINE_23,Station-46,2022-03-12 03:30:00,2022-03-12 03:57:00,Station-45,10083,7,173,CKB -LINE_23,Station-45,2022-03-12 04:04:00,2022-03-12 04:30:00,Station-46,9016,0,173,CKB -LINE_23,Station-46,2022-03-12 04:30:00,2022-03-12 04:57:00,Station-45,10083,7,173,CKB -LINE_23,Station-45,2022-03-12 05:04:00,2022-03-12 05:30:00,Station-46,9016,0,173,CKB -LINE_23,Station-46,2022-03-12 05:30:00,2022-03-12 05:30:00,Station-0,0.06,0,173,CKB -LINE_24,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,174,CKB -LINE_24,Station-21,2022-03-12 00:31:00,2022-03-12 00:44:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 00:44:00,2022-03-12 00:56:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 01:01:00,2022-03-12 01:14:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 01:14:00,2022-03-12 01:26:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 01:31:00,2022-03-12 01:44:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 01:44:00,2022-03-12 01:56:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 02:01:00,2022-03-12 02:14:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 02:14:00,2022-03-12 02:26:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 02:31:00,2022-03-12 02:44:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 02:44:00,2022-03-12 02:56:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 03:01:00,2022-03-12 03:14:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 03:14:00,2022-03-12 03:26:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 03:31:00,2022-03-12 03:44:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 03:44:00,2022-03-12 03:56:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 04:01:00,2022-03-12 04:14:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 04:14:00,2022-03-12 04:26:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 04:31:00,2022-03-12 04:44:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 04:44:00,2022-03-12 04:56:00,Station-21,5362,5,174,CKB -LINE_24,Station-21,2022-03-12 05:01:00,2022-03-12 05:14:00,Station-47,4872,0,174,CKB -LINE_24,Station-47,2022-03-12 05:14:00,2022-03-12 05:26:00,Station-21,5362,0,174,CKB -LINE_24,Station-21,2022-03-12 05:26:00,2022-03-12 05:26:00,Station-0,0.06,0,174,CKB -LINE_25,Station-0,2022-03-12 00:31:00,2022-03-12 00:31:00,Station-21,0.06,0,175,CKB -LINE_25,Station-21,2022-03-12 00:31:00,2022-03-12 00:45:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 00:47:00,2022-03-12 01:01:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 01:01:00,2022-03-12 01:15:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 01:17:00,2022-03-12 01:31:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 01:31:00,2022-03-12 01:45:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 01:47:00,2022-03-12 02:01:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 02:01:00,2022-03-12 02:15:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 02:17:00,2022-03-12 02:31:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 02:31:00,2022-03-12 02:45:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 02:47:00,2022-03-12 03:01:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 03:01:00,2022-03-12 03:15:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 03:17:00,2022-03-12 03:31:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 03:31:00,2022-03-12 03:45:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 03:47:00,2022-03-12 04:01:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 04:01:00,2022-03-12 04:15:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 04:17:00,2022-03-12 04:31:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 04:31:00,2022-03-12 04:45:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 04:47:00,2022-03-12 05:01:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 05:01:00,2022-03-12 05:15:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 05:17:00,2022-03-12 05:31:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 05:31:00,2022-03-12 05:45:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 05:47:00,2022-03-12 06:01:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 06:01:00,2022-03-12 06:15:00,Station-48,5225,2,175,CKB -LINE_25,Station-48,2022-03-12 06:17:00,2022-03-12 06:31:00,Station-21,7617,0,175,CKB -LINE_25,Station-21,2022-03-12 06:31:00,2022-03-12 06:45:00,Station-48,5096,0,175,CKB -LINE_25,Station-48,2022-03-12 06:45:00,2022-03-12 06:45:00,Station-0,0.06,0,175,CKB -LINE_26,Station-0,2022-03-12 00:43:00,2022-03-12 00:43:00,Station-49,0.06,0,176,CKB -LINE_26,Station-49,2022-03-12 00:43:00,2022-03-12 00:53:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 00:53:00,2022-03-12 01:03:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 01:13:00,2022-03-12 01:23:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 01:23:00,2022-03-12 01:33:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 01:43:00,2022-03-12 01:53:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 01:53:00,2022-03-12 02:03:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 02:13:00,2022-03-12 02:23:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 02:23:00,2022-03-12 02:33:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 02:43:00,2022-03-12 02:53:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 02:53:00,2022-03-12 03:03:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 03:13:00,2022-03-12 03:23:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 03:23:00,2022-03-12 03:33:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 03:43:00,2022-03-12 03:53:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 03:53:00,2022-03-12 04:03:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 04:13:00,2022-03-12 04:23:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 04:23:00,2022-03-12 04:33:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 04:43:00,2022-03-12 04:53:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 04:53:00,2022-03-12 05:03:00,Station-49,4408,10,176,CKB -LINE_26,Station-49,2022-03-12 05:13:00,2022-03-12 05:23:00,Station-50,4507,0,176,CKB -LINE_26,Station-50,2022-03-12 05:23:00,2022-03-12 05:23:00,Station-0,0.06,0,176,CKB -LINE_0,Station-0,2022-03-12 20:51:00,2022-03-12 20:51:00,Station-1,0.06,0,177,CKB -LINE_0,Station-1,2022-03-12 20:51:00,2022-03-12 21:24:00,Station-2,14519,4,177,CKB -LINE_0,Station-2,2022-03-12 21:28:00,2022-03-12 22:03:00,Station-1,13541,8,177,CKB -LINE_0,Station-1,2022-03-12 22:11:00,2022-03-12 22:44:00,Station-2,14519,4,177,CKB -LINE_0,Station-2,2022-03-12 22:48:00,2022-03-12 23:23:00,Station-1,13541,8,177,CKB -LINE_0,Station-1,2022-03-12 23:31:00,2022-03-13 00:04:00,Station-2,14519,4,177,CKB -LINE_0,Station-2,2022-03-13 00:08:00,2022-03-13 00:39:00,Station-5,12213,0,177,CKB -LINE_1,Station-5,2022-03-13 00:39:00,2022-03-13 00:47:00,Station-3,4.0,2,177,CKB -LINE_1,Station-3,2022-03-13 00:49:00,2022-03-13 01:12:00,Station-4,8.36,6,177,CKB -LINE_1,Station-4,2022-03-13 01:18:00,2022-03-13 01:36:00,Station-3,9067,13,177,CKB -LINE_1,Station-3,2022-03-13 01:49:00,2022-03-13 02:12:00,Station-4,8.36,6,177,CKB -LINE_1,Station-4,2022-03-13 02:18:00,2022-03-13 02:36:00,Station-3,9067,13,177,CKB -LINE_1,Station-3,2022-03-13 02:49:00,2022-03-13 03:12:00,Station-4,8.36,6,177,CKB -LINE_1,Station-4,2022-03-13 03:18:00,2022-03-13 03:36:00,Station-3,9067,13,177,CKB -LINE_1,Station-3,2022-03-13 03:49:00,2022-03-13 04:12:00,Station-4,8.36,6,177,CKB -LINE_1,Station-4,2022-03-13 04:18:00,2022-03-13 04:36:00,Station-3,9067,13,177,CKB -LINE_1,Station-3,2022-03-13 04:49:00,2022-03-13 05:12:00,Station-4,8.36,6,177,CKB -LINE_1,Station-4,2022-03-13 05:18:00,2022-03-13 05:36:00,Station-3,9067,13,177,CKB -LINE_1,Station-3,2022-03-13 05:49:00,2022-03-13 06:08:00,Station-4,8762,10,177,CKB -LINE_1,Station-4,2022-03-13 06:18:00,2022-03-13 06:36:00,Station-3,9067,13,177,CKB -LINE_1,Station-3,2022-03-13 06:49:00,2022-03-13 07:08:00,Station-4,8762,0,177,CKB -LINE_1,Station-4,2022-03-13 07:08:00,2022-03-13 07:08:00,Station-0,0.06,0,177,CKB -LINE_0,Station-0,2022-03-12 21:31:00,2022-03-12 21:31:00,Station-1,0.06,0,178,CKB -LINE_0,Station-1,2022-03-12 21:31:00,2022-03-12 22:04:00,Station-2,14519,4,178,CKB -LINE_0,Station-2,2022-03-12 22:08:00,2022-03-12 22:43:00,Station-1,13541,8,178,CKB -LINE_0,Station-1,2022-03-12 22:51:00,2022-03-12 23:24:00,Station-2,14519,4,178,CKB -LINE_0,Station-2,2022-03-12 23:28:00,2022-03-13 00:03:00,Station-1,13541,8,178,CKB -LINE_0,Station-1,2022-03-13 00:11:00,2022-03-13 00:44:00,Station-2,14519,0,178,CKB -LINE_1,Station-2,2022-03-13 00:44:00,2022-03-13 00:54:00,Station-3,4.1,25,178,CKB -LINE_1,Station-3,2022-03-13 01:19:00,2022-03-13 01:42:00,Station-4,8.36,6,178,CKB -LINE_1,Station-4,2022-03-13 01:48:00,2022-03-13 02:06:00,Station-3,9067,13,178,CKB -LINE_1,Station-3,2022-03-13 02:19:00,2022-03-13 02:42:00,Station-4,8.36,6,178,CKB -LINE_1,Station-4,2022-03-13 02:48:00,2022-03-13 03:06:00,Station-3,9067,13,178,CKB -LINE_1,Station-3,2022-03-13 03:19:00,2022-03-13 03:42:00,Station-4,8.36,6,178,CKB -LINE_1,Station-4,2022-03-13 03:48:00,2022-03-13 04:06:00,Station-3,9067,13,178,CKB -LINE_1,Station-3,2022-03-13 04:19:00,2022-03-13 04:42:00,Station-4,8.36,6,178,CKB -LINE_1,Station-4,2022-03-13 04:48:00,2022-03-13 05:06:00,Station-3,9067,13,178,CKB -LINE_1,Station-3,2022-03-13 05:19:00,2022-03-13 05:42:00,Station-4,8.36,6,178,CKB -LINE_1,Station-4,2022-03-13 05:48:00,2022-03-13 06:06:00,Station-3,9067,0,178,CKB -LINE_1,Station-3,2022-03-13 06:06:00,2022-03-13 06:06:00,Station-0,0.06,0,178,CKB -LINE_2,Station-0,2022-03-12 21:06:00,2022-03-12 21:06:00,Station-6,0.06,0,179,CKB -LINE_2,Station-6,2022-03-12 21:06:00,2022-03-12 21:34:00,Station-7,13018,19,179,CKB -LINE_2,Station-7,2022-03-12 21:53:00,2022-03-12 22:13:00,Station-8,10332,17,179,CKB -LINE_2,Station-8,2022-03-12 22:30:00,2022-03-12 22:54:00,Station-7,10.48,19,179,CKB -LINE_2,Station-7,2022-03-12 23:13:00,2022-03-12 23:33:00,Station-8,10332,17,179,CKB -LINE_2,Station-8,2022-03-12 23:50:00,2022-03-13 00:14:00,Station-7,10.48,8,179,CKB -LINE_2,Station-7,2022-03-13 00:22:00,2022-03-13 00:27:00,Station-58,2533,2,179,CKB -LINE_3,Station-58,2022-03-13 00:29:00,2022-03-13 00:47:00,Station-10,7.58,0,179,CKB -LINE_3,Station-10,2022-03-13 00:47:00,2022-03-13 01:14:00,Station-11,12841,3,179,CKB -LINE_3,Station-11,2022-03-13 01:17:00,2022-03-13 01:47:00,Station-10,14281,0,179,CKB -LINE_3,Station-10,2022-03-13 01:47:00,2022-03-13 02:14:00,Station-11,12841,3,179,CKB -LINE_3,Station-11,2022-03-13 02:17:00,2022-03-13 02:47:00,Station-10,14281,0,179,CKB -LINE_3,Station-10,2022-03-13 02:47:00,2022-03-13 03:14:00,Station-11,12841,3,179,CKB -LINE_3,Station-11,2022-03-13 03:17:00,2022-03-13 03:47:00,Station-10,14281,0,179,CKB -LINE_3,Station-10,2022-03-13 03:47:00,2022-03-13 04:14:00,Station-11,12841,3,179,CKB -LINE_3,Station-11,2022-03-13 04:17:00,2022-03-13 04:47:00,Station-10,14281,0,179,CKB -LINE_3,Station-10,2022-03-13 04:47:00,2022-03-13 05:14:00,Station-11,12841,3,179,CKB -LINE_3,Station-11,2022-03-13 05:17:00,2022-03-13 05:47:00,Station-10,14281,0,179,CKB -LINE_3,Station-10,2022-03-13 05:47:00,2022-03-13 06:14:00,Station-11,12841,3,179,CKB -LINE_3,Station-11,2022-03-13 06:17:00,2022-03-13 06:47:00,Station-10,14281,0,179,CKB -LINE_3,Station-10,2022-03-13 06:47:00,2022-03-13 06:59:00,Station-58,5474,0,179,CKB -LINE_3,Station-58,2022-03-13 06:59:00,2022-03-13 06:59:00,Station-0,0.06,0,179,CKB -LINE_2,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-6,0.06,0,180,CKB -LINE_2,Station-6,2022-03-12 20:26:00,2022-03-12 20:56:00,Station-12,14097,14,180,CKB -LINE_2,Station-12,2022-03-12 21:10:00,2022-03-12 21:38:00,Station-6,13.19,8,180,CKB -LINE_2,Station-6,2022-03-12 21:46:00,2022-03-12 22:14:00,Station-7,13018,19,180,CKB -LINE_2,Station-7,2022-03-12 22:33:00,2022-03-12 22:53:00,Station-8,10332,17,180,CKB -LINE_2,Station-8,2022-03-12 23:10:00,2022-03-12 23:34:00,Station-7,10.48,19,180,CKB -LINE_2,Station-7,2022-03-12 23:53:00,2022-03-13 00:13:00,Station-8,10332,2,180,CKB -LINE_2,Station-8,2022-03-13 00:15:00,2022-03-13 00:16:00,Station-10,506,1,180,CKB -LINE_3,Station-10,2022-03-13 00:17:00,2022-03-13 00:44:00,Station-11,12841,3,180,CKB -LINE_3,Station-11,2022-03-13 00:47:00,2022-03-13 01:17:00,Station-10,14281,0,180,CKB -LINE_3,Station-10,2022-03-13 01:17:00,2022-03-13 01:44:00,Station-11,12841,3,180,CKB -LINE_3,Station-11,2022-03-13 01:47:00,2022-03-13 02:17:00,Station-10,14281,0,180,CKB -LINE_3,Station-10,2022-03-13 02:17:00,2022-03-13 02:44:00,Station-11,12841,3,180,CKB -LINE_3,Station-11,2022-03-13 02:47:00,2022-03-13 03:17:00,Station-10,14281,0,180,CKB -LINE_3,Station-10,2022-03-13 03:17:00,2022-03-13 03:44:00,Station-11,12841,3,180,CKB -LINE_3,Station-11,2022-03-13 03:47:00,2022-03-13 04:17:00,Station-10,14281,0,180,CKB -LINE_3,Station-10,2022-03-13 04:17:00,2022-03-13 04:44:00,Station-11,12841,3,180,CKB -LINE_3,Station-11,2022-03-13 04:47:00,2022-03-13 05:17:00,Station-10,14281,0,180,CKB -LINE_3,Station-10,2022-03-13 05:17:00,2022-03-13 05:44:00,Station-11,12841,3,180,CKB -LINE_3,Station-11,2022-03-13 05:47:00,2022-03-13 06:17:00,Station-10,14281,0,180,CKB -LINE_3,Station-10,2022-03-13 06:17:00,2022-03-13 06:44:00,Station-11,12841,3,180,CKB -LINE_3,Station-11,2022-03-13 06:47:00,2022-03-13 07:17:00,Station-10,14281,0,180,CKB -LINE_3,Station-10,2022-03-13 07:17:00,2022-03-13 07:17:00,Station-0,0.06,0,180,CKB -LINE_5,Station-0,2022-03-12 20:26:00,2022-03-12 20:26:00,Station-14,0.06,0,181,CKB -LINE_5,Station-14,2022-03-12 20:26:00,2022-03-12 20:38:00,Station-15,5882,3,181,CKB -LINE_5,Station-15,2022-03-12 20:41:00,2022-03-12 20:55:00,Station-14,6232,0,181,CKB -LINE_5,Station-14,2022-03-12 20:55:00,2022-03-12 21:08:00,Station-15,6086,3,181,CKB -LINE_5,Station-15,2022-03-12 21:11:00,2022-03-12 21:25:00,Station-14,6232,0,181,CKB -LINE_5,Station-14,2022-03-12 21:25:00,2022-03-12 21:38:00,Station-15,6086,3,181,CKB -LINE_5,Station-15,2022-03-12 21:41:00,2022-03-12 21:55:00,Station-14,6232,0,181,CKB -LINE_5,Station-14,2022-03-12 21:55:00,2022-03-12 22:08:00,Station-15,6086,3,181,CKB -LINE_5,Station-15,2022-03-12 22:11:00,2022-03-12 22:25:00,Station-14,6232,0,181,CKB -LINE_5,Station-14,2022-03-12 22:25:00,2022-03-12 22:38:00,Station-15,6086,3,181,CKB -LINE_5,Station-15,2022-03-12 22:41:00,2022-03-12 22:55:00,Station-14,6232,0,181,CKB -LINE_5,Station-14,2022-03-12 22:55:00,2022-03-12 23:08:00,Station-15,6086,3,181,CKB -LINE_5,Station-15,2022-03-12 23:11:00,2022-03-12 23:25:00,Station-14,6232,0,181,CKB -LINE_5,Station-14,2022-03-12 23:25:00,2022-03-12 23:38:00,Station-15,6086,3,181,CKB -LINE_5,Station-15,2022-03-12 23:41:00,2022-03-12 23:55:00,Station-14,6232,0,181,CKB -LINE_5,Station-14,2022-03-12 23:55:00,2022-03-13 00:08:00,Station-15,6086,0,181,CKB -LINE_5,Station-15,2022-03-13 00:08:00,2022-03-13 00:08:00,Station-0,0.06,0,181,CKB -LINE_6,Station-0,2022-03-12 05:25:00,2022-03-12 05:25:00,Station-16,0.06,0,182,CKB -LINE_6,Station-16,2022-03-12 05:25:00,2022-03-12 05:34:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 05:34:00,2022-03-12 05:43:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 06:05:00,2022-03-12 06:14:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 06:14:00,2022-03-12 06:23:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 06:25:00,2022-03-12 06:34:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 06:34:00,2022-03-12 06:43:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 06:45:00,2022-03-12 06:54:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 06:54:00,2022-03-12 07:03:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 07:05:00,2022-03-12 07:14:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 07:14:00,2022-03-12 07:23:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 07:25:00,2022-03-12 07:34:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 07:34:00,2022-03-12 07:43:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 08:05:00,2022-03-12 08:14:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 08:14:00,2022-03-12 08:23:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 08:25:00,2022-03-12 08:34:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 08:34:00,2022-03-12 08:43:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 08:45:00,2022-03-12 08:54:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 08:54:00,2022-03-12 09:03:00,Station-16,5139,3,182,CKB -LINE_6,Station-16,2022-03-12 09:06:00,2022-03-12 09:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 09:15:00,2022-03-12 09:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 09:26:00,2022-03-12 09:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 09:35:00,2022-03-12 09:44:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 10:06:00,2022-03-12 10:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 10:15:00,2022-03-12 10:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 10:26:00,2022-03-12 10:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 10:35:00,2022-03-12 10:44:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 10:46:00,2022-03-12 10:55:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 10:55:00,2022-03-12 11:04:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 11:06:00,2022-03-12 11:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 11:15:00,2022-03-12 11:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 11:26:00,2022-03-12 11:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 11:35:00,2022-03-12 11:44:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 12:06:00,2022-03-12 12:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 12:15:00,2022-03-12 12:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 12:26:00,2022-03-12 12:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 12:35:00,2022-03-12 12:44:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 12:46:00,2022-03-12 12:55:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 12:55:00,2022-03-12 13:04:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 13:06:00,2022-03-12 13:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 13:15:00,2022-03-12 13:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 13:26:00,2022-03-12 13:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 13:35:00,2022-03-12 13:44:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 14:06:00,2022-03-12 14:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 14:15:00,2022-03-12 14:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 14:26:00,2022-03-12 14:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 14:35:00,2022-03-12 14:44:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 14:46:00,2022-03-12 14:55:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 14:55:00,2022-03-12 15:04:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 15:06:00,2022-03-12 15:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 15:15:00,2022-03-12 15:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 15:26:00,2022-03-12 15:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 15:35:00,2022-03-12 15:44:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 16:06:00,2022-03-12 16:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 16:15:00,2022-03-12 16:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 16:26:00,2022-03-12 16:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 16:35:00,2022-03-12 16:44:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 16:46:00,2022-03-12 16:55:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 16:55:00,2022-03-12 17:04:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 17:06:00,2022-03-12 17:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 17:15:00,2022-03-12 17:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 17:26:00,2022-03-12 17:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 17:35:00,2022-03-12 17:44:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 18:06:00,2022-03-12 18:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 18:15:00,2022-03-12 18:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 18:26:00,2022-03-12 18:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 18:35:00,2022-03-12 18:44:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 18:46:00,2022-03-12 18:55:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 18:55:00,2022-03-12 19:04:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 19:06:00,2022-03-12 19:15:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 19:15:00,2022-03-12 19:24:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 19:26:00,2022-03-12 19:35:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 19:35:00,2022-03-12 19:44:00,Station-16,5139,21,182,CKB -LINE_6,Station-16,2022-03-12 20:05:00,2022-03-12 20:14:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 20:14:00,2022-03-12 20:23:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 20:25:00,2022-03-12 20:34:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 20:34:00,2022-03-12 20:43:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 20:45:00,2022-03-12 20:54:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 20:54:00,2022-03-12 21:03:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 21:05:00,2022-03-12 21:14:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 21:14:00,2022-03-12 21:23:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 21:25:00,2022-03-12 21:34:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 21:34:00,2022-03-12 21:43:00,Station-16,5139,22,182,CKB -LINE_6,Station-16,2022-03-12 22:05:00,2022-03-12 22:14:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 22:14:00,2022-03-12 22:23:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 22:25:00,2022-03-12 22:34:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 22:34:00,2022-03-12 22:43:00,Station-16,5139,2,182,CKB -LINE_6,Station-16,2022-03-12 22:45:00,2022-03-12 22:54:00,Station-17,4781,0,182,CKB -LINE_6,Station-17,2022-03-12 22:54:00,2022-03-12 23:03:00,Station-16,5139,0,182,CKB -LINE_6,Station-16,2022-03-12 23:03:00,2022-03-12 23:03:00,Station-0,0.06,0,182,CKB -LINE_29,Station-0,2022-03-12 07:30:00,2022-03-12 07:30:00,Station-53,0.06,0,183,CKB -LINE_29,Station-53,2022-03-12 07:30:00,2022-03-12 07:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 07:39:00,2022-03-12 07:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 07:50:00,2022-03-12 07:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 07:59:00,2022-03-12 08:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 08:10:00,2022-03-12 08:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 08:19:00,2022-03-12 08:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 08:30:00,2022-03-12 08:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 08:39:00,2022-03-12 08:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 08:50:00,2022-03-12 08:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 08:59:00,2022-03-12 09:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 09:10:00,2022-03-12 09:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 09:19:00,2022-03-12 09:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 09:30:00,2022-03-12 09:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 09:39:00,2022-03-12 09:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 09:50:00,2022-03-12 09:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 09:59:00,2022-03-12 10:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 10:10:00,2022-03-12 10:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 10:19:00,2022-03-12 10:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 10:30:00,2022-03-12 10:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 10:39:00,2022-03-12 10:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 10:50:00,2022-03-12 10:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 10:59:00,2022-03-12 11:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 11:10:00,2022-03-12 11:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 11:19:00,2022-03-12 11:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 11:30:00,2022-03-12 11:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 11:39:00,2022-03-12 11:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 11:50:00,2022-03-12 11:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 11:59:00,2022-03-12 12:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 12:10:00,2022-03-12 12:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 12:19:00,2022-03-12 12:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 12:30:00,2022-03-12 12:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 12:39:00,2022-03-12 12:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 12:50:00,2022-03-12 12:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 12:59:00,2022-03-12 13:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 13:10:00,2022-03-12 13:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 13:19:00,2022-03-12 13:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 13:30:00,2022-03-12 13:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 13:39:00,2022-03-12 13:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 13:50:00,2022-03-12 13:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 13:59:00,2022-03-12 14:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 14:10:00,2022-03-12 14:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 14:19:00,2022-03-12 14:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 14:30:00,2022-03-12 14:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 14:39:00,2022-03-12 14:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 14:50:00,2022-03-12 14:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 14:59:00,2022-03-12 15:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 15:10:00,2022-03-12 15:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 15:19:00,2022-03-12 15:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 15:30:00,2022-03-12 15:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 15:39:00,2022-03-12 15:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 15:50:00,2022-03-12 15:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 15:59:00,2022-03-12 16:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 16:10:00,2022-03-12 16:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 16:19:00,2022-03-12 16:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 16:30:00,2022-03-12 16:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 16:39:00,2022-03-12 16:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 16:50:00,2022-03-12 16:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 16:59:00,2022-03-12 17:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 17:10:00,2022-03-12 17:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 17:19:00,2022-03-12 17:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 17:30:00,2022-03-12 17:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 17:39:00,2022-03-12 17:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 17:50:00,2022-03-12 17:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 17:59:00,2022-03-12 18:10:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 18:10:00,2022-03-12 18:15:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 18:19:00,2022-03-12 18:30:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 18:30:00,2022-03-12 18:35:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 18:39:00,2022-03-12 18:50:00,Station-53,4341,0,183,CKB -LINE_29,Station-53,2022-03-12 18:50:00,2022-03-12 18:55:00,Station-54,2217,4,183,CKB -LINE_29,Station-54,2022-03-12 18:59:00,2022-03-12 19:10:00,Station-53,4288,0,183,CKB -LINE_29,Station-53,2022-03-12 19:10:00,2022-03-12 19:10:00,Station-0,0.06,0,183,CKB -LINE_9,Station-22,2022-03-12 08:08:00,2022-03-12 08:41:00,Station-23,17.9,0,184,VDL -LINE_9,Station-23,2022-03-12 08:41:00,2022-03-12 08:54:00,Station-23,4637,9,184,VDL -LINE_9,Station-23,2022-03-12 09:03:00,2022-03-12 09:17:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 09:21:00,2022-03-12 09:35:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 09:43:00,2022-03-12 09:57:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 10:01:00,2022-03-12 10:15:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 10:23:00,2022-03-12 10:37:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 10:41:00,2022-03-12 10:55:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 11:03:00,2022-03-12 11:17:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 11:21:00,2022-03-12 11:35:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 11:43:00,2022-03-12 11:57:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 12:01:00,2022-03-12 12:15:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 12:23:00,2022-03-12 12:37:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 12:41:00,2022-03-12 12:55:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 13:03:00,2022-03-12 13:17:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 13:21:00,2022-03-12 13:35:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 13:43:00,2022-03-12 13:57:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 14:01:00,2022-03-12 14:15:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 14:23:00,2022-03-12 14:37:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 14:41:00,2022-03-12 14:55:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 15:03:00,2022-03-12 15:17:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 15:21:00,2022-03-12 15:35:00,Station-23,4637,8,184,VDL -LINE_9,Station-23,2022-03-12 15:43:00,2022-03-12 15:57:00,Station-23,4637,4,184,VDL -LINE_9,Station-23,2022-03-12 16:01:00,2022-03-12 16:14:00,Station-23,4637,0,184,VDL -LINE_9,Station-23,2022-03-12 16:14:00,2022-03-12 16:57:00,Station-22,19.8,0,184,VDL -LINE_30,Station-0,2022-03-12 07:18:00,2022-03-12 07:18:00,Station-55,0.06,0,185,CKB -LINE_30,Station-55,2022-03-12 07:18:00,2022-03-12 07:26:00,Station-56,5562,10,185,CKB -LINE_30,Station-56,2022-03-12 07:36:00,2022-03-12 07:45:00,Station-57,5941,32,185,CKB -LINE_30,Station-57,2022-03-12 08:17:00,2022-03-12 08:26:00,Station-56,5994,8,185,CKB -LINE_30,Station-56,2022-03-12 08:34:00,2022-03-12 08:42:00,Station-55,5566,0,185,CKB -LINE_30,Station-55,2022-03-12 08:42:00,2022-03-12 08:42:00,Station-0,0.06,0,185,CKB -LINE_12,Station-0,2022-03-12 08:10:00,2022-03-12 08:10:00,Station-27,0.06,0,186,CKB -LINE_12,Station-27,2022-03-12 08:10:00,2022-03-12 08:16:00,Station-28,2169,12,186,CKB -LINE_12,Station-28,2022-03-12 08:28:00,2022-03-12 08:38:00,Station-27,2952,2,186,CKB -LINE_12,Station-27,2022-03-12 08:40:00,2022-03-12 08:46:00,Station-28,2169,12,186,CKB -LINE_12,Station-28,2022-03-12 08:58:00,2022-03-12 09:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 09:10:00,2022-03-12 09:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 09:28:00,2022-03-12 09:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 09:40:00,2022-03-12 09:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 09:58:00,2022-03-12 10:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 10:10:00,2022-03-12 10:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 10:28:00,2022-03-12 10:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 10:40:00,2022-03-12 10:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 10:58:00,2022-03-12 11:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 11:10:00,2022-03-12 11:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 11:28:00,2022-03-12 11:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 11:40:00,2022-03-12 11:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 11:58:00,2022-03-12 12:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 12:10:00,2022-03-12 12:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 12:28:00,2022-03-12 12:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 12:40:00,2022-03-12 12:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 12:58:00,2022-03-12 13:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 13:10:00,2022-03-12 13:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 13:28:00,2022-03-12 13:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 13:40:00,2022-03-12 13:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 13:58:00,2022-03-12 14:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 14:10:00,2022-03-12 14:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 14:28:00,2022-03-12 14:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 14:40:00,2022-03-12 14:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 14:58:00,2022-03-12 15:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 15:10:00,2022-03-12 15:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 15:28:00,2022-03-12 15:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 15:40:00,2022-03-12 15:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 15:58:00,2022-03-12 16:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 16:10:00,2022-03-12 16:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 16:28:00,2022-03-12 16:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 16:40:00,2022-03-12 16:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 16:58:00,2022-03-12 17:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 17:10:00,2022-03-12 17:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 17:28:00,2022-03-12 17:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 17:40:00,2022-03-12 17:48:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 17:58:00,2022-03-12 18:10:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 18:10:00,2022-03-12 18:18:00,Station-28,2169,10,186,CKB -LINE_12,Station-28,2022-03-12 18:28:00,2022-03-12 18:40:00,Station-27,2952,0,186,CKB -LINE_12,Station-27,2022-03-12 18:40:00,2022-03-12 18:48:00,Station-28,2169,0,186,CKB -LINE_12,Station-28,2022-03-12 18:48:00,2022-03-12 18:48:00,Station-0,0.06,0,186,CKB -LINE_13,Station-0,2022-03-13 00:23:00,2022-03-13 00:23:00,Station-29,0.06,0,187,CKB -LINE_13,Station-29,2022-03-13 00:23:00,2022-03-13 00:30:00,Station-30,2577,9,187,CKB -LINE_14,Station-30,2022-03-13 00:39:00,2022-03-13 00:54:00,Station-31,5937,9,187,CKB -LINE_14,Station-31,2022-03-13 01:03:00,2022-03-13 01:17:00,Station-30,6.19,0,187,CKB -LINE_13,Station-30,2022-03-13 01:17:00,2022-03-13 01:23:00,Station-29,2555,0,187,CKB -LINE_13,Station-29,2022-03-13 01:23:00,2022-03-13 01:30:00,Station-30,2577,9,187,CKB -LINE_14,Station-30,2022-03-13 01:39:00,2022-03-13 01:54:00,Station-31,5937,9,187,CKB -LINE_14,Station-31,2022-03-13 02:03:00,2022-03-13 02:17:00,Station-30,6.19,0,187,CKB -LINE_13,Station-30,2022-03-13 02:17:00,2022-03-13 02:23:00,Station-29,2555,0,187,CKB -LINE_13,Station-29,2022-03-13 02:23:00,2022-03-13 02:30:00,Station-30,2577,9,187,CKB -LINE_14,Station-30,2022-03-13 02:39:00,2022-03-13 02:54:00,Station-31,5937,9,187,CKB -LINE_14,Station-31,2022-03-13 03:03:00,2022-03-13 03:17:00,Station-30,6.19,0,187,CKB -LINE_13,Station-30,2022-03-13 03:17:00,2022-03-13 03:23:00,Station-29,2555,0,187,CKB -LINE_13,Station-29,2022-03-13 03:23:00,2022-03-13 03:30:00,Station-30,2577,9,187,CKB -LINE_14,Station-30,2022-03-13 03:39:00,2022-03-13 03:54:00,Station-31,5937,9,187,CKB -LINE_14,Station-31,2022-03-13 04:03:00,2022-03-13 04:17:00,Station-30,6.19,0,187,CKB -LINE_13,Station-30,2022-03-13 04:17:00,2022-03-13 04:23:00,Station-29,2555,0,187,CKB -LINE_13,Station-29,2022-03-13 04:23:00,2022-03-13 04:30:00,Station-30,2577,9,187,CKB -LINE_14,Station-30,2022-03-13 04:39:00,2022-03-13 04:54:00,Station-31,5937,9,187,CKB -LINE_14,Station-31,2022-03-13 05:03:00,2022-03-13 05:17:00,Station-30,6.19,0,187,CKB -LINE_13,Station-30,2022-03-13 05:17:00,2022-03-13 05:23:00,Station-29,2555,0,187,CKB -LINE_13,Station-29,2022-03-13 05:23:00,2022-03-13 05:30:00,Station-30,2577,9,187,CKB -LINE_14,Station-30,2022-03-13 05:39:00,2022-03-13 05:54:00,Station-31,5937,9,187,CKB -LINE_14,Station-31,2022-03-13 06:03:00,2022-03-13 06:17:00,Station-30,6.19,0,187,CKB -LINE_13,Station-30,2022-03-13 06:17:00,2022-03-13 06:23:00,Station-29,2555,0,187,CKB -LINE_13,Station-29,2022-03-13 06:23:00,2022-03-13 06:30:00,Station-30,2577,9,187,CKB -LINE_14,Station-30,2022-03-13 06:39:00,2022-03-13 06:54:00,Station-31,5937,0,187,CKB -LINE_14,Station-31,2022-03-13 06:54:00,2022-03-13 06:54:00,Station-0,0.06,0,187,CKB -LINE_14,Station-0,2022-03-13 00:33:00,2022-03-13 00:33:00,Station-31,0.06,0,188,CKB -LINE_14,Station-31,2022-03-13 00:33:00,2022-03-13 00:47:00,Station-30,6.19,0,188,CKB -LINE_13,Station-30,2022-03-13 00:47:00,2022-03-13 00:53:00,Station-29,2555,0,188,CKB -LINE_13,Station-29,2022-03-13 00:53:00,2022-03-13 01:00:00,Station-30,2577,9,188,CKB -LINE_14,Station-30,2022-03-13 01:09:00,2022-03-13 01:24:00,Station-31,5937,9,188,CKB -LINE_14,Station-31,2022-03-13 01:33:00,2022-03-13 01:47:00,Station-30,6.19,0,188,CKB -LINE_13,Station-30,2022-03-13 01:47:00,2022-03-13 01:53:00,Station-29,2555,0,188,CKB -LINE_13,Station-29,2022-03-13 01:53:00,2022-03-13 02:00:00,Station-30,2577,9,188,CKB -LINE_14,Station-30,2022-03-13 02:09:00,2022-03-13 02:24:00,Station-31,5937,9,188,CKB -LINE_14,Station-31,2022-03-13 02:33:00,2022-03-13 02:47:00,Station-30,6.19,0,188,CKB -LINE_13,Station-30,2022-03-13 02:47:00,2022-03-13 02:53:00,Station-29,2555,0,188,CKB -LINE_13,Station-29,2022-03-13 02:53:00,2022-03-13 03:00:00,Station-30,2577,9,188,CKB -LINE_14,Station-30,2022-03-13 03:09:00,2022-03-13 03:24:00,Station-31,5937,9,188,CKB -LINE_14,Station-31,2022-03-13 03:33:00,2022-03-13 03:47:00,Station-30,6.19,0,188,CKB -LINE_13,Station-30,2022-03-13 03:47:00,2022-03-13 03:53:00,Station-29,2555,0,188,CKB -LINE_13,Station-29,2022-03-13 03:53:00,2022-03-13 04:00:00,Station-30,2577,9,188,CKB -LINE_14,Station-30,2022-03-13 04:09:00,2022-03-13 04:24:00,Station-31,5937,9,188,CKB -LINE_14,Station-31,2022-03-13 04:33:00,2022-03-13 04:47:00,Station-30,6.19,0,188,CKB -LINE_13,Station-30,2022-03-13 04:47:00,2022-03-13 04:53:00,Station-29,2555,0,188,CKB -LINE_13,Station-29,2022-03-13 04:53:00,2022-03-13 05:00:00,Station-30,2577,9,188,CKB -LINE_14,Station-30,2022-03-13 05:09:00,2022-03-13 05:24:00,Station-31,5937,9,188,CKB -LINE_14,Station-31,2022-03-13 05:33:00,2022-03-13 05:47:00,Station-30,6.19,0,188,CKB -LINE_13,Station-30,2022-03-13 05:47:00,2022-03-13 05:53:00,Station-29,2555,0,188,CKB -LINE_13,Station-29,2022-03-13 05:53:00,2022-03-13 06:00:00,Station-30,2577,9,188,CKB -LINE_14,Station-30,2022-03-13 06:09:00,2022-03-13 06:24:00,Station-31,5937,9,188,CKB -LINE_14,Station-31,2022-03-13 06:33:00,2022-03-13 06:47:00,Station-30,6.19,0,188,CKB -LINE_14,Station-30,2022-03-13 06:47:00,2022-03-13 06:47:00,Station-0,0.06,0,188,CKB -LINE_15,Station-0,2022-03-13 00:57:00,2022-03-13 00:57:00,Station-32,0.06,0,189,CKB -LINE_15,Station-32,2022-03-13 00:57:00,2022-03-13 01:06:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 01:06:00,2022-03-13 01:11:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 01:27:00,2022-03-13 01:36:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 01:36:00,2022-03-13 01:41:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 01:57:00,2022-03-13 02:06:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 02:06:00,2022-03-13 02:11:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 02:27:00,2022-03-13 02:36:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 02:36:00,2022-03-13 02:41:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 02:57:00,2022-03-13 03:06:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 03:06:00,2022-03-13 03:11:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 03:27:00,2022-03-13 03:36:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 03:36:00,2022-03-13 03:41:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 03:57:00,2022-03-13 04:06:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 04:06:00,2022-03-13 04:11:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 04:27:00,2022-03-13 04:36:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 04:36:00,2022-03-13 04:41:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 04:57:00,2022-03-13 05:06:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 05:06:00,2022-03-13 05:11:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 05:27:00,2022-03-13 05:36:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 05:36:00,2022-03-13 05:41:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 05:57:00,2022-03-13 06:06:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 06:06:00,2022-03-13 06:11:00,Station-32,2936,16,189,CKB -LINE_15,Station-32,2022-03-13 06:27:00,2022-03-13 06:36:00,Station-33,4343,0,189,CKB -LINE_15,Station-33,2022-03-13 06:36:00,2022-03-13 06:41:00,Station-32,2936,0,189,CKB -LINE_15,Station-32,2022-03-13 06:41:00,2022-03-13 06:41:00,Station-0,0.06,0,189,CKB -LINE_17,Station-0,2022-03-13 00:30:00,2022-03-13 00:30:00,Station-34,0.06,0,190,CKB -LINE_17,Station-34,2022-03-13 00:30:00,2022-03-13 00:44:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 00:44:00,2022-03-13 00:57:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 01:00:00,2022-03-13 01:14:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 01:14:00,2022-03-13 01:27:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 01:30:00,2022-03-13 01:44:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 01:44:00,2022-03-13 01:57:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 02:00:00,2022-03-13 02:14:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 02:14:00,2022-03-13 02:27:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 02:30:00,2022-03-13 02:44:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 02:44:00,2022-03-13 02:57:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 03:00:00,2022-03-13 03:14:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 03:14:00,2022-03-13 03:27:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 03:30:00,2022-03-13 03:44:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 03:44:00,2022-03-13 03:57:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 04:00:00,2022-03-13 04:14:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 04:14:00,2022-03-13 04:27:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 04:30:00,2022-03-13 04:44:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 04:44:00,2022-03-13 04:57:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 05:00:00,2022-03-13 05:14:00,Station-36,4801,0,190,CKB -LINE_17,Station-36,2022-03-13 05:14:00,2022-03-13 05:27:00,Station-34,5302,3,190,CKB -LINE_17,Station-34,2022-03-13 05:30:00,2022-03-13 05:44:00,Station-36,4.8,0,190,CKB -LINE_17,Station-36,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-34,5301,4,190,CKB -LINE_17,Station-34,2022-03-13 06:00:00,2022-03-13 06:14:00,Station-36,4.8,0,190,CKB -LINE_17,Station-36,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-34,5301,4,190,CKB -LINE_17,Station-34,2022-03-13 06:30:00,2022-03-13 06:44:00,Station-36,4.8,0,190,CKB -LINE_17,Station-36,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-34,5301,0,190,CKB -LINE_17,Station-34,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,190,CKB -LINE_20,Station-0,2022-03-13 00:32:00,2022-03-13 00:32:00,Station-13,0.06,0,191,CKB -LINE_20,Station-13,2022-03-13 00:32:00,2022-03-13 00:44:00,Station-40,4212,3,191,CKB -LINE_20,Station-40,2022-03-13 00:47:00,2022-03-13 01:16:00,Station-41,13048,0,191,CKB -LINE_20,Station-41,2022-03-13 01:16:00,2022-03-13 01:42:00,Station-40,12869,5,191,CKB -LINE_20,Station-40,2022-03-13 01:47:00,2022-03-13 02:16:00,Station-41,13048,0,191,CKB -LINE_20,Station-41,2022-03-13 02:16:00,2022-03-13 02:42:00,Station-40,12869,5,191,CKB -LINE_20,Station-40,2022-03-13 02:47:00,2022-03-13 03:16:00,Station-41,13048,0,191,CKB -LINE_20,Station-41,2022-03-13 03:16:00,2022-03-13 03:42:00,Station-40,12869,5,191,CKB -LINE_20,Station-40,2022-03-13 03:47:00,2022-03-13 04:16:00,Station-41,13048,0,191,CKB -LINE_20,Station-41,2022-03-13 04:16:00,2022-03-13 04:42:00,Station-40,12869,5,191,CKB -LINE_20,Station-40,2022-03-13 04:47:00,2022-03-13 05:16:00,Station-41,13048,0,191,CKB -LINE_20,Station-41,2022-03-13 05:16:00,2022-03-13 05:42:00,Station-40,12869,5,191,CKB -LINE_20,Station-40,2022-03-13 05:47:00,2022-03-13 06:16:00,Station-41,13048,0,191,CKB -LINE_20,Station-41,2022-03-13 06:16:00,2022-03-13 06:42:00,Station-40,12869,0,191,CKB -LINE_20,Station-40,2022-03-13 06:42:00,2022-03-13 06:42:00,Station-0,0.06,0,191,CKB -LINE_20,Station-0,2022-03-13 00:17:00,2022-03-13 00:17:00,Station-40,0.06,0,192,CKB -LINE_20,Station-40,2022-03-13 00:17:00,2022-03-13 00:46:00,Station-41,13048,0,192,CKB -LINE_20,Station-41,2022-03-13 00:46:00,2022-03-13 01:12:00,Station-40,12869,5,192,CKB -LINE_20,Station-40,2022-03-13 01:17:00,2022-03-13 01:46:00,Station-41,13048,0,192,CKB -LINE_20,Station-41,2022-03-13 01:46:00,2022-03-13 02:12:00,Station-40,12869,5,192,CKB -LINE_20,Station-40,2022-03-13 02:17:00,2022-03-13 02:46:00,Station-41,13048,0,192,CKB -LINE_20,Station-41,2022-03-13 02:46:00,2022-03-13 03:12:00,Station-40,12869,5,192,CKB -LINE_20,Station-40,2022-03-13 03:17:00,2022-03-13 03:46:00,Station-41,13048,0,192,CKB -LINE_20,Station-41,2022-03-13 03:46:00,2022-03-13 04:12:00,Station-40,12869,5,192,CKB -LINE_20,Station-40,2022-03-13 04:17:00,2022-03-13 04:46:00,Station-41,13048,0,192,CKB -LINE_20,Station-41,2022-03-13 04:46:00,2022-03-13 05:12:00,Station-40,12869,5,192,CKB -LINE_20,Station-40,2022-03-13 05:17:00,2022-03-13 05:46:00,Station-41,13048,0,192,CKB -LINE_20,Station-41,2022-03-13 05:46:00,2022-03-13 06:12:00,Station-40,12869,5,192,CKB -LINE_20,Station-40,2022-03-13 06:17:00,2022-03-13 06:46:00,Station-41,13048,0,192,CKB -LINE_20,Station-41,2022-03-13 06:46:00,2022-03-13 07:12:00,Station-40,12869,0,192,CKB -LINE_20,Station-40,2022-03-13 07:12:00,2022-03-13 07:12:00,Station-0,0.06,0,192,CKB -LINE_21,Station-0,2022-03-13 00:49:00,2022-03-13 00:49:00,Station-3,0.06,0,193,CKB -LINE_21,Station-3,2022-03-13 00:49:00,2022-03-13 01:04:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 01:04:00,2022-03-13 01:19:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 01:19:00,2022-03-13 01:34:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 01:34:00,2022-03-13 01:49:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 01:49:00,2022-03-13 02:04:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 02:04:00,2022-03-13 02:19:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 02:19:00,2022-03-13 02:34:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 02:34:00,2022-03-13 02:49:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 02:49:00,2022-03-13 03:04:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 03:04:00,2022-03-13 03:19:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 03:19:00,2022-03-13 03:34:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 03:34:00,2022-03-13 03:49:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 03:49:00,2022-03-13 04:04:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 04:04:00,2022-03-13 04:19:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 04:19:00,2022-03-13 04:34:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 04:34:00,2022-03-13 04:49:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 04:49:00,2022-03-13 05:04:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 05:04:00,2022-03-13 05:19:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 05:19:00,2022-03-13 05:34:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 05:34:00,2022-03-13 05:49:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 05:49:00,2022-03-13 06:04:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 06:04:00,2022-03-13 06:19:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 06:19:00,2022-03-13 06:34:00,Station-16,10229,0,193,CKB -LINE_21,Station-16,2022-03-13 06:34:00,2022-03-13 06:49:00,Station-3,11801,0,193,CKB -LINE_21,Station-3,2022-03-13 06:49:00,2022-03-13 06:49:00,Station-0,0.06,0,193,CKB -LINE_23,Station-0,2022-03-13 02:34:00,2022-03-13 02:34:00,Station-45,0.06,0,194,CKB -LINE_23,Station-45,2022-03-13 02:34:00,2022-03-13 03:00:00,Station-46,9016,0,194,CKB -LINE_23,Station-46,2022-03-13 03:00:00,2022-03-13 03:27:00,Station-45,10083,7,194,CKB -LINE_23,Station-45,2022-03-13 03:34:00,2022-03-13 04:00:00,Station-46,9016,0,194,CKB -LINE_23,Station-46,2022-03-13 04:00:00,2022-03-13 04:27:00,Station-45,10083,7,194,CKB -LINE_23,Station-45,2022-03-13 04:34:00,2022-03-13 05:00:00,Station-46,9016,0,194,CKB -LINE_23,Station-46,2022-03-13 05:00:00,2022-03-13 05:27:00,Station-45,10083,7,194,CKB -LINE_23,Station-45,2022-03-13 05:34:00,2022-03-13 06:00:00,Station-46,9016,0,194,CKB -LINE_23,Station-46,2022-03-13 06:00:00,2022-03-13 06:27:00,Station-45,10083,7,194,CKB -LINE_23,Station-45,2022-03-13 06:34:00,2022-03-13 07:00:00,Station-46,9016,0,194,CKB -LINE_23,Station-46,2022-03-13 07:00:00,2022-03-13 07:00:00,Station-0,0.06,0,194,CKB -LINE_23,Station-0,2022-03-13 02:04:00,2022-03-13 02:04:00,Station-45,0.06,0,195,CKB -LINE_23,Station-45,2022-03-13 02:04:00,2022-03-13 02:30:00,Station-46,9016,0,195,CKB -LINE_23,Station-46,2022-03-13 02:30:00,2022-03-13 02:57:00,Station-45,10083,7,195,CKB -LINE_23,Station-45,2022-03-13 03:04:00,2022-03-13 03:30:00,Station-46,9016,0,195,CKB -LINE_23,Station-46,2022-03-13 03:30:00,2022-03-13 03:57:00,Station-45,10083,7,195,CKB -LINE_23,Station-45,2022-03-13 04:04:00,2022-03-13 04:30:00,Station-46,9016,0,195,CKB -LINE_23,Station-46,2022-03-13 04:30:00,2022-03-13 04:57:00,Station-45,10083,7,195,CKB -LINE_23,Station-45,2022-03-13 05:04:00,2022-03-13 05:30:00,Station-46,9016,0,195,CKB -LINE_23,Station-46,2022-03-13 05:30:00,2022-03-13 05:57:00,Station-45,10083,7,195,CKB -LINE_23,Station-45,2022-03-13 06:04:00,2022-03-13 06:30:00,Station-46,9016,0,195,CKB -LINE_23,Station-46,2022-03-13 06:30:00,2022-03-13 06:57:00,Station-45,10083,0,195,CKB -LINE_23,Station-45,2022-03-13 06:57:00,2022-03-13 06:57:00,Station-0,0.06,0,195,CKB -LINE_24,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,196,CKB -LINE_24,Station-21,2022-03-13 00:31:00,2022-03-13 00:44:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 00:44:00,2022-03-13 00:56:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 01:01:00,2022-03-13 01:14:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 01:14:00,2022-03-13 01:26:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 01:31:00,2022-03-13 01:44:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 01:44:00,2022-03-13 01:56:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 02:01:00,2022-03-13 02:14:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 02:14:00,2022-03-13 02:26:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 02:31:00,2022-03-13 02:44:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 02:44:00,2022-03-13 02:56:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 03:01:00,2022-03-13 03:14:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 03:14:00,2022-03-13 03:26:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 03:31:00,2022-03-13 03:44:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 03:44:00,2022-03-13 03:56:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 04:01:00,2022-03-13 04:14:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 04:14:00,2022-03-13 04:26:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 04:31:00,2022-03-13 04:44:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 04:44:00,2022-03-13 04:56:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 05:01:00,2022-03-13 05:14:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 05:14:00,2022-03-13 05:26:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 05:31:00,2022-03-13 05:44:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 05:44:00,2022-03-13 05:56:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 06:01:00,2022-03-13 06:14:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 06:14:00,2022-03-13 06:26:00,Station-21,5362,5,196,CKB -LINE_24,Station-21,2022-03-13 06:31:00,2022-03-13 06:44:00,Station-47,4872,0,196,CKB -LINE_24,Station-47,2022-03-13 06:44:00,2022-03-13 06:56:00,Station-21,5362,0,196,CKB -LINE_24,Station-21,2022-03-13 06:56:00,2022-03-13 06:56:00,Station-0,0.06,0,196,CKB -LINE_25,Station-0,2022-03-13 00:31:00,2022-03-13 00:31:00,Station-21,0.06,0,197,CKB -LINE_25,Station-21,2022-03-13 00:31:00,2022-03-13 00:45:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 00:47:00,2022-03-13 01:01:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 01:01:00,2022-03-13 01:15:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 01:17:00,2022-03-13 01:31:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 01:31:00,2022-03-13 01:45:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 01:47:00,2022-03-13 02:01:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 02:01:00,2022-03-13 02:15:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 02:17:00,2022-03-13 02:31:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 02:31:00,2022-03-13 02:45:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 02:47:00,2022-03-13 03:01:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 03:01:00,2022-03-13 03:15:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 03:17:00,2022-03-13 03:31:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 03:31:00,2022-03-13 03:45:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 03:47:00,2022-03-13 04:01:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 04:01:00,2022-03-13 04:15:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 04:17:00,2022-03-13 04:31:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 04:31:00,2022-03-13 04:45:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 04:47:00,2022-03-13 05:01:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 05:01:00,2022-03-13 05:15:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 05:17:00,2022-03-13 05:31:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 05:31:00,2022-03-13 05:45:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 05:47:00,2022-03-13 06:01:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 06:01:00,2022-03-13 06:15:00,Station-48,5225,2,197,CKB -LINE_25,Station-48,2022-03-13 06:17:00,2022-03-13 06:31:00,Station-21,7617,0,197,CKB -LINE_25,Station-21,2022-03-13 06:31:00,2022-03-13 06:45:00,Station-48,5096,0,197,CKB -LINE_25,Station-48,2022-03-13 06:45:00,2022-03-13 06:45:00,Station-0,0.06,0,197,CKB -LINE_26,Station-0,2022-03-13 00:43:00,2022-03-13 00:43:00,Station-49,0.06,0,198,CKB -LINE_26,Station-49,2022-03-13 00:43:00,2022-03-13 00:53:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 00:53:00,2022-03-13 01:03:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 01:13:00,2022-03-13 01:23:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 01:23:00,2022-03-13 01:33:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 01:43:00,2022-03-13 01:53:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 01:53:00,2022-03-13 02:03:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 02:13:00,2022-03-13 02:23:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 02:23:00,2022-03-13 02:33:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 02:43:00,2022-03-13 02:53:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 02:53:00,2022-03-13 03:03:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 03:13:00,2022-03-13 03:23:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 03:23:00,2022-03-13 03:33:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 03:43:00,2022-03-13 03:53:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 03:53:00,2022-03-13 04:03:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 04:13:00,2022-03-13 04:23:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 04:23:00,2022-03-13 04:33:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 04:43:00,2022-03-13 04:53:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 04:53:00,2022-03-13 05:03:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 05:13:00,2022-03-13 05:23:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 05:23:00,2022-03-13 05:33:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 05:43:00,2022-03-13 05:53:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 05:53:00,2022-03-13 06:03:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 06:13:00,2022-03-13 06:23:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 06:23:00,2022-03-13 06:33:00,Station-49,4408,10,198,CKB -LINE_26,Station-49,2022-03-13 06:43:00,2022-03-13 06:53:00,Station-50,4507,0,198,CKB -LINE_26,Station-50,2022-03-13 06:53:00,2022-03-13 07:03:00,Station-49,4408,0,198,CKB -LINE_26,Station-49,2022-03-13 07:03:00,2022-03-13 07:03:00,Station-0,0.06,0,198,CKB +line;departure_name;departure_time;arrival_time;arrival_name;distance;pause;rotation_id;vehicle_type +LINE_0;Station-0;2022-03-07 21:31:00;2022-03-07 21:31:00;Station-1;0.06;0;1;CKB +LINE_0;Station-1;2022-03-07 21:31:00;2022-03-07 22:04:00;Station-2;14519;4;1;CKB +LINE_0;Station-2;2022-03-07 22:08:00;2022-03-07 22:43:00;Station-1;13541;8;1;CKB +LINE_0;Station-1;2022-03-07 22:51:00;2022-03-07 23:24:00;Station-2;14519;4;1;CKB +LINE_0;Station-2;2022-03-07 23:28:00;2022-03-08 00:03:00;Station-1;13541;8;1;CKB +LINE_0;Station-1;2022-03-08 00:11:00;2022-03-08 00:44:00;Station-2;14519;0;1;CKB +LINE_1;Station-2;2022-03-08 00:44:00;2022-03-08 00:54:00;Station-3;4.1;25;1;CKB +LINE_1;Station-3;2022-03-08 01:19:00;2022-03-08 01:42:00;Station-4;8.36;6;1;CKB +LINE_1;Station-4;2022-03-08 01:48:00;2022-03-08 02:06:00;Station-3;9067;13;1;CKB +LINE_1;Station-3;2022-03-08 02:19:00;2022-03-08 02:42:00;Station-4;8.36;6;1;CKB +LINE_1;Station-4;2022-03-08 02:48:00;2022-03-08 03:06:00;Station-3;9067;13;1;CKB +LINE_1;Station-3;2022-03-08 03:19:00;2022-03-08 03:42:00;Station-4;8.36;6;1;CKB +LINE_1;Station-4;2022-03-08 03:48:00;2022-03-08 04:06:00;Station-3;9067;0;1;CKB +LINE_1;Station-3;2022-03-08 04:06:00;2022-03-08 04:06:00;Station-0;0.06;0;1;CKB +LINE_0;Station-0;2022-03-07 22:11:00;2022-03-07 22:11:00;Station-1;0.06;0;2;CKB +LINE_0;Station-1;2022-03-07 22:11:00;2022-03-07 22:44:00;Station-2;14519;4;2;CKB +LINE_0;Station-2;2022-03-07 22:48:00;2022-03-07 23:23:00;Station-1;13541;8;2;CKB +LINE_0;Station-1;2022-03-07 23:31:00;2022-03-08 00:04:00;Station-2;14519;4;2;CKB +LINE_0;Station-2;2022-03-08 00:08:00;2022-03-08 00:39:00;Station-5;12213;0;2;CKB +LINE_1;Station-5;2022-03-08 00:39:00;2022-03-08 00:47:00;Station-3;4.0;2;2;CKB +LINE_1;Station-3;2022-03-08 00:49:00;2022-03-08 01:12:00;Station-4;8.36;6;2;CKB +LINE_1;Station-4;2022-03-08 01:18:00;2022-03-08 01:36:00;Station-3;9067;13;2;CKB +LINE_1;Station-3;2022-03-08 01:49:00;2022-03-08 02:12:00;Station-4;8.36;6;2;CKB +LINE_1;Station-4;2022-03-08 02:18:00;2022-03-08 02:36:00;Station-3;9067;13;2;CKB +LINE_1;Station-3;2022-03-08 02:49:00;2022-03-08 03:12:00;Station-4;8.36;6;2;CKB +LINE_1;Station-4;2022-03-08 03:18:00;2022-03-08 03:36:00;Station-3;9067;13;2;CKB +LINE_1;Station-3;2022-03-08 03:49:00;2022-03-08 04:12:00;Station-4;8.36;0;2;CKB +LINE_1;Station-4;2022-03-08 04:12:00;2022-03-08 04:12:00;Station-0;0.06;0;2;CKB +LINE_2;Station-0;2022-03-07 21:06:00;2022-03-07 21:06:00;Station-6;0.06;0;3;CKB +LINE_2;Station-6;2022-03-07 21:06:00;2022-03-07 21:34:00;Station-7;13018;19;3;CKB +LINE_2;Station-7;2022-03-07 21:53:00;2022-03-07 22:13:00;Station-8;10332;17;3;CKB +LINE_2;Station-8;2022-03-07 22:30:00;2022-03-07 22:54:00;Station-7;10.48;19;3;CKB +LINE_2;Station-7;2022-03-07 23:13:00;2022-03-07 23:33:00;Station-8;10332;17;3;CKB +LINE_2;Station-8;2022-03-07 23:50:00;2022-03-08 00:14:00;Station-7;10.48;2;3;CKB +LINE_2;Station-7;2022-03-08 00:16:00;2022-03-08 00:23:00;Station-9;3709;5;3;CKB +LINE_3;Station-9;2022-03-08 00:28:00;2022-03-08 00:44:00;Station-10;6404;3;3;CKB +LINE_3;Station-10;2022-03-08 00:47:00;2022-03-08 01:10:00;Station-11;10579;7;3;CKB +LINE_3;Station-11;2022-03-08 01:17:00;2022-03-08 01:44:00;Station-10;12007;3;3;CKB +LINE_3;Station-10;2022-03-08 01:47:00;2022-03-08 02:10:00;Station-11;10579;7;3;CKB +LINE_3;Station-11;2022-03-08 02:17:00;2022-03-08 02:44:00;Station-10;12007;3;3;CKB +LINE_3;Station-10;2022-03-08 02:47:00;2022-03-08 03:10:00;Station-11;10579;7;3;CKB +LINE_3;Station-11;2022-03-08 03:17:00;2022-03-08 03:44:00;Station-10;12007;3;3;CKB +LINE_3;Station-10;2022-03-08 03:47:00;2022-03-08 04:10:00;Station-11;10579;7;3;CKB +LINE_3;Station-11;2022-03-08 04:17:00;2022-03-08 04:44:00;Station-10;12007;0;3;CKB +LINE_3;Station-10;2022-03-08 04:44:00;2022-03-08 04:44:00;Station-0;0.06;0;3;CKB +LINE_2;Station-0;2022-03-07 20:26:00;2022-03-07 20:26:00;Station-6;0.06;0;4;CKB +LINE_2;Station-6;2022-03-07 20:26:00;2022-03-07 20:56:00;Station-12;14097;14;4;CKB +LINE_2;Station-12;2022-03-07 21:10:00;2022-03-07 21:38:00;Station-6;13.19;8;4;CKB +LINE_2;Station-6;2022-03-07 21:46:00;2022-03-07 22:14:00;Station-7;13018;19;4;CKB +LINE_2;Station-7;2022-03-07 22:33:00;2022-03-07 22:53:00;Station-8;10332;17;4;CKB +LINE_2;Station-8;2022-03-07 23:10:00;2022-03-07 23:34:00;Station-7;10.48;19;4;CKB +LINE_2;Station-7;2022-03-07 23:53:00;2022-03-08 00:13:00;Station-8;10332;2;4;CKB +LINE_2;Station-8;2022-03-08 00:15:00;2022-03-08 00:16:00;Station-10;506;1;4;CKB +LINE_3;Station-10;2022-03-08 00:17:00;2022-03-08 00:40:00;Station-11;10579;7;4;CKB +LINE_3;Station-11;2022-03-08 00:47:00;2022-03-08 01:14:00;Station-10;12007;3;4;CKB +LINE_3;Station-10;2022-03-08 01:17:00;2022-03-08 01:40:00;Station-11;10579;7;4;CKB +LINE_3;Station-11;2022-03-08 01:47:00;2022-03-08 02:14:00;Station-10;12007;3;4;CKB +LINE_3;Station-10;2022-03-08 02:17:00;2022-03-08 02:40:00;Station-11;10579;7;4;CKB +LINE_3;Station-11;2022-03-08 02:47:00;2022-03-08 03:14:00;Station-10;12007;3;4;CKB +LINE_3;Station-10;2022-03-08 03:17:00;2022-03-08 03:40:00;Station-11;10579;7;4;CKB +LINE_3;Station-11;2022-03-08 03:47:00;2022-03-08 04:14:00;Station-10;12007;3;4;CKB +LINE_3;Station-10;2022-03-08 04:17:00;2022-03-08 04:40:00;Station-11;10579;3;4;CKB +LINE_4;Station-11;2022-03-08 04:43:00;2022-03-08 04:58:00;Station-13;6161;0;4;CKB +LINE_4;Station-13;2022-03-08 04:58:00;2022-03-08 04:58:00;Station-0;0.06;0;4;CKB +LINE_5;Station-0;2022-03-07 22:56:00;2022-03-07 22:56:00;Station-14;0.06;0;5;CKB +LINE_5;Station-14;2022-03-07 22:56:00;2022-03-07 23:08:00;Station-15;5882;3;5;CKB +LINE_5;Station-15;2022-03-07 23:11:00;2022-03-07 23:25:00;Station-14;6232;0;5;CKB +LINE_5;Station-14;2022-03-07 23:25:00;2022-03-07 23:38:00;Station-15;6086;3;5;CKB +LINE_5;Station-15;2022-03-07 23:41:00;2022-03-07 23:55:00;Station-14;6232;0;5;CKB +LINE_5;Station-14;2022-03-07 23:55:00;2022-03-08 00:08:00;Station-15;6086;0;5;CKB +LINE_5;Station-15;2022-03-08 00:08:00;2022-03-08 00:08:00;Station-0;0.06;0;5;CKB +LINE_6;Station-0;2022-03-07 05:05:00;2022-03-07 05:05:00;Station-16;0.06;0;6;CKB +LINE_6;Station-16;2022-03-07 05:05:00;2022-03-07 05:14:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 05:14:00;2022-03-07 05:23:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 05:25:00;2022-03-07 05:34:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 05:34:00;2022-03-07 05:43:00;Station-16;5139;23;6;CKB +LINE_6;Station-16;2022-03-07 06:06:00;2022-03-07 06:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 06:15:00;2022-03-07 06:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 06:26:00;2022-03-07 06:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 06:35:00;2022-03-07 06:44:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 06:46:00;2022-03-07 06:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 06:55:00;2022-03-07 07:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 07:06:00;2022-03-07 07:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 07:15:00;2022-03-07 07:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 07:26:00;2022-03-07 07:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 07:35:00;2022-03-07 07:44:00;Station-16;5139;22;6;CKB +LINE_6;Station-16;2022-03-07 08:06:00;2022-03-07 08:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 08:15:00;2022-03-07 08:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 08:26:00;2022-03-07 08:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 08:35:00;2022-03-07 08:44:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 08:46:00;2022-03-07 08:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 08:55:00;2022-03-07 09:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 09:06:00;2022-03-07 09:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 09:15:00;2022-03-07 09:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 09:26:00;2022-03-07 09:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 09:35:00;2022-03-07 09:44:00;Station-16;5139;22;6;CKB +LINE_6;Station-16;2022-03-07 10:06:00;2022-03-07 10:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 10:15:00;2022-03-07 10:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 10:26:00;2022-03-07 10:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 10:35:00;2022-03-07 10:44:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 10:46:00;2022-03-07 10:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 10:55:00;2022-03-07 11:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 11:06:00;2022-03-07 11:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 11:15:00;2022-03-07 11:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 11:26:00;2022-03-07 11:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 11:35:00;2022-03-07 11:44:00;Station-16;5139;22;6;CKB +LINE_6;Station-16;2022-03-07 12:06:00;2022-03-07 12:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 12:15:00;2022-03-07 12:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 12:26:00;2022-03-07 12:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 12:35:00;2022-03-07 12:44:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 12:46:00;2022-03-07 12:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 12:55:00;2022-03-07 13:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 13:06:00;2022-03-07 13:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 13:15:00;2022-03-07 13:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 13:26:00;2022-03-07 13:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 13:35:00;2022-03-07 13:44:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 13:46:00;2022-03-07 13:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 13:55:00;2022-03-07 14:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 14:06:00;2022-03-07 14:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 14:15:00;2022-03-07 14:24:00;Station-16;5139;22;6;CKB +LINE_6;Station-16;2022-03-07 14:46:00;2022-03-07 14:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 14:55:00;2022-03-07 15:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 15:06:00;2022-03-07 15:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 15:15:00;2022-03-07 15:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 15:26:00;2022-03-07 15:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 15:35:00;2022-03-07 15:44:00;Station-16;5139;22;6;CKB +LINE_6;Station-16;2022-03-07 16:06:00;2022-03-07 16:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 16:15:00;2022-03-07 16:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 16:26:00;2022-03-07 16:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 16:35:00;2022-03-07 16:44:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 16:46:00;2022-03-07 16:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 16:55:00;2022-03-07 17:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 17:06:00;2022-03-07 17:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 17:15:00;2022-03-07 17:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 17:26:00;2022-03-07 17:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 17:35:00;2022-03-07 17:44:00;Station-16;5139;22;6;CKB +LINE_6;Station-16;2022-03-07 18:06:00;2022-03-07 18:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 18:15:00;2022-03-07 18:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 18:26:00;2022-03-07 18:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 18:35:00;2022-03-07 18:44:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 18:46:00;2022-03-07 18:55:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 18:55:00;2022-03-07 19:04:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 19:06:00;2022-03-07 19:15:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 19:15:00;2022-03-07 19:24:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 19:26:00;2022-03-07 19:35:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 19:35:00;2022-03-07 19:44:00;Station-16;5139;21;6;CKB +LINE_6;Station-16;2022-03-07 20:05:00;2022-03-07 20:14:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 20:14:00;2022-03-07 20:23:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 20:25:00;2022-03-07 20:34:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 20:34:00;2022-03-07 20:43:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 20:45:00;2022-03-07 20:54:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 20:54:00;2022-03-07 21:03:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 21:05:00;2022-03-07 21:14:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 21:14:00;2022-03-07 21:23:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 21:25:00;2022-03-07 21:34:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 21:34:00;2022-03-07 21:43:00;Station-16;5139;22;6;CKB +LINE_6;Station-16;2022-03-07 22:05:00;2022-03-07 22:14:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 22:14:00;2022-03-07 22:23:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 22:25:00;2022-03-07 22:34:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 22:34:00;2022-03-07 22:43:00;Station-16;5139;2;6;CKB +LINE_6;Station-16;2022-03-07 22:45:00;2022-03-07 22:54:00;Station-17;4781;0;6;CKB +LINE_6;Station-17;2022-03-07 22:54:00;2022-03-07 23:03:00;Station-16;5139;0;6;CKB +LINE_6;Station-16;2022-03-07 23:03:00;2022-03-07 23:03:00;Station-0;0.06;0;6;CKB +LINE_7;Station-0;2022-03-08 00:06:00;2022-03-08 00:06:00;Station-18;0.06;0;7;CKB +LINE_7;Station-18;2022-03-08 00:06:00;2022-03-08 00:27:00;Station-19;7827;0;7;CKB +LINE_8;Station-19;2022-03-08 00:27:00;2022-03-08 00:48:00;Station-20;11079;0;7;CKB +LINE_8;Station-20;2022-03-08 00:48:00;2022-03-08 01:25:00;Station-21;20641;8;7;CKB +LINE_8;Station-21;2022-03-08 01:33:00;2022-03-08 02:16:00;Station-20;20579;1;7;CKB +LINE_8;Station-20;2022-03-08 02:17:00;2022-03-08 02:55:00;Station-21;20641;8;7;CKB +LINE_8;Station-21;2022-03-08 03:03:00;2022-03-08 03:46:00;Station-20;20579;1;7;CKB +LINE_8;Station-20;2022-03-08 03:47:00;2022-03-08 04:25:00;Station-21;20641;0;7;CKB +LINE_8;Station-21;2022-03-08 04:25:00;2022-03-08 04:25:00;Station-0;0.06;0;7;CKB +LINE_9;Station-22;2022-03-07 05:15:00;2022-03-07 06:01:00;Station-23;17.9;0;8;VDL +LINE_9;Station-23;2022-03-07 06:01:00;2022-03-07 06:15:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 06:23:00;2022-03-07 06:37:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 06:41:00;2022-03-07 06:55:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 07:03:00;2022-03-07 07:17:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 07:21:00;2022-03-07 07:35:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 07:43:00;2022-03-07 07:57:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 08:01:00;2022-03-07 08:15:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 08:23:00;2022-03-07 08:37:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 08:41:00;2022-03-07 08:55:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 09:03:00;2022-03-07 09:17:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 09:21:00;2022-03-07 09:35:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 09:43:00;2022-03-07 09:57:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 10:01:00;2022-03-07 10:15:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 10:23:00;2022-03-07 10:37:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 10:41:00;2022-03-07 10:55:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 11:03:00;2022-03-07 11:17:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 11:21:00;2022-03-07 11:35:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 11:43:00;2022-03-07 11:57:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 12:01:00;2022-03-07 12:15:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 12:23:00;2022-03-07 12:37:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 12:41:00;2022-03-07 12:55:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 13:03:00;2022-03-07 13:17:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 13:21:00;2022-03-07 13:35:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 13:43:00;2022-03-07 13:57:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 14:01:00;2022-03-07 14:15:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 14:23:00;2022-03-07 14:37:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 14:41:00;2022-03-07 14:55:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 15:03:00;2022-03-07 15:17:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 15:21:00;2022-03-07 15:35:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 15:43:00;2022-03-07 15:57:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 16:01:00;2022-03-07 16:15:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 16:23:00;2022-03-07 16:37:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 16:41:00;2022-03-07 16:55:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 17:03:00;2022-03-07 17:17:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 17:21:00;2022-03-07 17:35:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 17:43:00;2022-03-07 17:57:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 18:01:00;2022-03-07 18:15:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 18:23:00;2022-03-07 18:37:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 18:41:00;2022-03-07 18:55:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 19:03:00;2022-03-07 19:17:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 19:21:00;2022-03-07 19:35:00;Station-23;4637;8;8;VDL +LINE_9;Station-23;2022-03-07 19:43:00;2022-03-07 19:57:00;Station-23;4637;4;8;VDL +LINE_9;Station-23;2022-03-07 20:01:00;2022-03-07 20:14:00;Station-23;4637;9;8;VDL +LINE_9;Station-23;2022-03-07 20:23:00;2022-03-07 20:36:00;Station-23;4637;0;8;VDL +LINE_9;Station-23;2022-03-07 20:36:00;2022-03-07 21:15:00;Station-22;19.8;0;8;VDL +LINE_10;Station-0;2022-03-07 04:56:00;2022-03-07 04:56:00;Station-24;0.06;18;9;CKB +LINE_10;Station-24;2022-03-07 05:14:00;2022-03-07 05:20:00;Station-25;3.29;0;9;CKB +LINE_10;Station-25;2022-03-07 05:20:00;2022-03-07 05:24:00;Station-24;2954;20;9;CKB +LINE_10;Station-24;2022-03-07 05:44:00;2022-03-07 05:50:00;Station-25;3.29;0;9;CKB +LINE_10;Station-25;2022-03-07 05:50:00;2022-03-07 05:54:00;Station-24;2954;5;9;CKB +LINE_10;Station-24;2022-03-07 05:59:00;2022-03-07 06:06:00;Station-25;3.29;2;9;CKB +LINE_10;Station-25;2022-03-07 06:08:00;2022-03-07 06:13:00;Station-24;2954;19;9;CKB +LINE_10;Station-24;2022-03-07 06:32:00;2022-03-07 06:39:00;Station-25;3.29;1;9;CKB +LINE_10;Station-25;2022-03-07 06:40:00;2022-03-07 06:45:00;Station-24;2954;7;9;CKB +LINE_10;Station-24;2022-03-07 06:52:00;2022-03-07 06:59:00;Station-25;3.29;1;9;CKB +LINE_10;Station-25;2022-03-07 07:00:00;2022-03-07 07:05:00;Station-24;2954;7;9;CKB +LINE_10;Station-24;2022-03-07 07:12:00;2022-03-07 07:19:00;Station-25;3.29;1;9;CKB +LINE_10;Station-25;2022-03-07 07:20:00;2022-03-07 07:25:00;Station-24;2954;7;9;CKB +LINE_10;Station-24;2022-03-07 07:32:00;2022-03-07 07:39:00;Station-25;3.29;1;9;CKB +LINE_10;Station-25;2022-03-07 07:40:00;2022-03-07 07:45:00;Station-24;2954;295;9;CKB +LINE_10;Station-24;2022-03-07 12:40:00;2022-03-07 12:47:00;Station-25;3.29;2;9;CKB +LINE_10;Station-25;2022-03-07 12:49:00;2022-03-07 12:54:00;Station-24;2954;46;9;CKB +LINE_10;Station-24;2022-03-07 13:40:00;2022-03-07 13:47:00;Station-25;3.29;2;9;CKB +LINE_10;Station-25;2022-03-07 13:49:00;2022-03-07 13:54:00;Station-24;2954;434;9;CKB +LINE_10;Station-24;2022-03-07 21:08:00;2022-03-07 21:08:00;Station-0;0.06;0;9;CKB +LINE_11;Station-0;2022-03-07 07:20:00;2022-03-07 07:20:00;Station-26;0.06;0;10;CKB +LINE_11;Station-26;2022-03-07 07:20:00;2022-03-07 07:50:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 08:00:00;2022-03-07 08:30:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 08:40:00;2022-03-07 09:10:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 09:20:00;2022-03-07 09:50:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 10:00:00;2022-03-07 10:30:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 10:40:00;2022-03-07 11:10:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 11:20:00;2022-03-07 11:50:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 12:00:00;2022-03-07 12:30:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 12:40:00;2022-03-07 13:10:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 13:20:00;2022-03-07 13:50:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 14:00:00;2022-03-07 14:30:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 14:40:00;2022-03-07 15:10:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 15:20:00;2022-03-07 15:50:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 16:00:00;2022-03-07 16:30:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 16:40:00;2022-03-07 17:10:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 17:20:00;2022-03-07 17:50:00;Station-26;9266;10;10;CKB +LINE_11;Station-26;2022-03-07 18:00:00;2022-03-07 18:30:00;Station-26;9266;0;10;CKB +LINE_11;Station-26;2022-03-07 18:30:00;2022-03-07 18:30:00;Station-0;0.06;0;10;CKB +LINE_12;Station-0;2022-03-07 07:10:00;2022-03-07 07:10:00;Station-27;0.06;0;11;CKB +LINE_12;Station-27;2022-03-07 07:10:00;2022-03-07 07:18:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 07:28:00;2022-03-07 07:40:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 07:40:00;2022-03-07 07:48:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 07:58:00;2022-03-07 08:10:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 08:10:00;2022-03-07 08:18:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 08:28:00;2022-03-07 08:40:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 08:40:00;2022-03-07 08:48:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 08:58:00;2022-03-07 09:10:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 09:10:00;2022-03-07 09:18:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 09:28:00;2022-03-07 09:40:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 09:40:00;2022-03-07 09:48:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 09:58:00;2022-03-07 10:10:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 10:10:00;2022-03-07 10:18:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 10:28:00;2022-03-07 10:40:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 10:40:00;2022-03-07 10:48:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 10:58:00;2022-03-07 11:10:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 11:10:00;2022-03-07 11:18:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 11:28:00;2022-03-07 11:40:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 11:40:00;2022-03-07 11:48:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 11:58:00;2022-03-07 12:10:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 12:10:00;2022-03-07 12:18:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 12:28:00;2022-03-07 12:40:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 12:40:00;2022-03-07 12:48:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 12:58:00;2022-03-07 13:10:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 13:10:00;2022-03-07 13:18:00;Station-28;2169;10;11;CKB +LINE_12;Station-28;2022-03-07 13:28:00;2022-03-07 13:40:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 13:40:00;2022-03-07 13:48:00;Station-28;2169;8;11;CKB +LINE_12;Station-28;2022-03-07 13:56:00;2022-03-07 14:10:00;Station-27;2952;0;11;CKB +LINE_12;Station-27;2022-03-07 14:10:00;2022-03-07 14:19:00;Station-28;2169;14;11;CKB +LINE_12;Station-28;2022-03-07 14:33:00;2022-03-07 14:47:00;Station-27;2952;3;11;CKB +LINE_12;Station-27;2022-03-07 14:50:00;2022-03-07 14:59:00;Station-28;2169;14;11;CKB +LINE_12;Station-28;2022-03-07 15:13:00;2022-03-07 15:27:00;Station-27;2952;3;11;CKB +LINE_12;Station-27;2022-03-07 15:30:00;2022-03-07 15:39:00;Station-28;2169;14;11;CKB +LINE_12;Station-28;2022-03-07 15:53:00;2022-03-07 16:07:00;Station-27;2952;3;11;CKB +LINE_12;Station-27;2022-03-07 16:10:00;2022-03-07 16:19:00;Station-28;2169;14;11;CKB +LINE_12;Station-28;2022-03-07 16:33:00;2022-03-07 16:47:00;Station-27;2952;3;11;CKB +LINE_12;Station-27;2022-03-07 16:50:00;2022-03-07 16:59:00;Station-28;2169;14;11;CKB +LINE_12;Station-28;2022-03-07 17:13:00;2022-03-07 17:27:00;Station-27;2952;3;11;CKB +LINE_12;Station-27;2022-03-07 17:30:00;2022-03-07 17:39:00;Station-28;2169;13;11;CKB +LINE_12;Station-28;2022-03-07 17:52:00;2022-03-07 18:05:00;Station-27;2952;5;11;CKB +LINE_12;Station-27;2022-03-07 18:10:00;2022-03-07 18:18:00;Station-28;2169;0;11;CKB +LINE_12;Station-28;2022-03-07 18:18:00;2022-03-07 18:18:00;Station-0;0.06;0;11;CKB +LINE_12;Station-0;2022-03-07 14:13:00;2022-03-07 14:13:00;Station-28;0.06;0;12;CKB +LINE_12;Station-28;2022-03-07 14:13:00;2022-03-07 14:27:00;Station-27;2952;3;12;CKB +LINE_12;Station-27;2022-03-07 14:30:00;2022-03-07 14:39:00;Station-28;2169;14;12;CKB +LINE_12;Station-28;2022-03-07 14:53:00;2022-03-07 15:07:00;Station-27;2952;3;12;CKB +LINE_12;Station-27;2022-03-07 15:10:00;2022-03-07 15:19:00;Station-28;2169;14;12;CKB +LINE_12;Station-28;2022-03-07 15:33:00;2022-03-07 15:47:00;Station-27;2952;3;12;CKB +LINE_12;Station-27;2022-03-07 15:50:00;2022-03-07 15:59:00;Station-28;2169;14;12;CKB +LINE_12;Station-28;2022-03-07 16:13:00;2022-03-07 16:27:00;Station-27;2952;3;12;CKB +LINE_12;Station-27;2022-03-07 16:30:00;2022-03-07 16:39:00;Station-28;2169;14;12;CKB +LINE_12;Station-28;2022-03-07 16:53:00;2022-03-07 17:07:00;Station-27;2952;3;12;CKB +LINE_12;Station-27;2022-03-07 17:10:00;2022-03-07 17:19:00;Station-28;2169;14;12;CKB +LINE_12;Station-28;2022-03-07 17:33:00;2022-03-07 17:47:00;Station-27;2952;3;12;CKB +LINE_12;Station-27;2022-03-07 17:50:00;2022-03-07 17:59:00;Station-28;2169;14;12;CKB +LINE_12;Station-28;2022-03-07 18:13:00;2022-03-07 18:25:00;Station-27;2952;0;12;CKB +LINE_12;Station-27;2022-03-07 18:25:00;2022-03-07 18:25:00;Station-0;0.06;0;12;CKB +LINE_13;Station-0;2022-03-08 00:23:00;2022-03-08 00:23:00;Station-29;0.06;0;13;CKB +LINE_13;Station-29;2022-03-08 00:23:00;2022-03-08 00:30:00;Station-30;2577;9;13;CKB +LINE_14;Station-30;2022-03-08 00:39:00;2022-03-08 00:54:00;Station-31;5937;9;13;CKB +LINE_14;Station-31;2022-03-08 01:03:00;2022-03-08 01:17:00;Station-30;6.19;0;13;CKB +LINE_13;Station-30;2022-03-08 01:17:00;2022-03-08 01:23:00;Station-29;2555;0;13;CKB +LINE_13;Station-29;2022-03-08 01:23:00;2022-03-08 01:30:00;Station-30;2577;9;13;CKB +LINE_14;Station-30;2022-03-08 01:39:00;2022-03-08 01:54:00;Station-31;5937;9;13;CKB +LINE_14;Station-31;2022-03-08 02:03:00;2022-03-08 02:17:00;Station-30;6.19;0;13;CKB +LINE_13;Station-30;2022-03-08 02:17:00;2022-03-08 02:23:00;Station-29;2555;0;13;CKB +LINE_13;Station-29;2022-03-08 02:23:00;2022-03-08 02:30:00;Station-30;2577;9;13;CKB +LINE_14;Station-30;2022-03-08 02:39:00;2022-03-08 02:54:00;Station-31;5937;9;13;CKB +LINE_14;Station-31;2022-03-08 03:03:00;2022-03-08 03:17:00;Station-30;6.19;0;13;CKB +LINE_13;Station-30;2022-03-08 03:17:00;2022-03-08 03:23:00;Station-29;2555;0;13;CKB +LINE_13;Station-29;2022-03-08 03:23:00;2022-03-08 03:30:00;Station-30;2577;9;13;CKB +LINE_14;Station-30;2022-03-08 03:39:00;2022-03-08 03:54:00;Station-31;5937;9;13;CKB +LINE_14;Station-31;2022-03-08 04:03:00;2022-03-08 04:17:00;Station-30;6.19;0;13;CKB +LINE_13;Station-30;2022-03-08 04:17:00;2022-03-08 04:23:00;Station-29;2555;0;13;CKB +LINE_13;Station-29;2022-03-08 04:23:00;2022-03-08 04:23:00;Station-0;0.06;0;13;CKB +LINE_14;Station-0;2022-03-08 00:33:00;2022-03-08 00:33:00;Station-31;0.06;0;14;CKB +LINE_14;Station-31;2022-03-08 00:33:00;2022-03-08 00:47:00;Station-30;6.19;0;14;CKB +LINE_13;Station-30;2022-03-08 00:47:00;2022-03-08 00:53:00;Station-29;2555;0;14;CKB +LINE_13;Station-29;2022-03-08 00:53:00;2022-03-08 01:00:00;Station-30;2577;9;14;CKB +LINE_14;Station-30;2022-03-08 01:09:00;2022-03-08 01:24:00;Station-31;5937;9;14;CKB +LINE_14;Station-31;2022-03-08 01:33:00;2022-03-08 01:47:00;Station-30;6.19;0;14;CKB +LINE_13;Station-30;2022-03-08 01:47:00;2022-03-08 01:53:00;Station-29;2555;0;14;CKB +LINE_13;Station-29;2022-03-08 01:53:00;2022-03-08 02:00:00;Station-30;2577;9;14;CKB +LINE_14;Station-30;2022-03-08 02:09:00;2022-03-08 02:24:00;Station-31;5937;9;14;CKB +LINE_14;Station-31;2022-03-08 02:33:00;2022-03-08 02:47:00;Station-30;6.19;0;14;CKB +LINE_13;Station-30;2022-03-08 02:47:00;2022-03-08 02:53:00;Station-29;2555;0;14;CKB +LINE_13;Station-29;2022-03-08 02:53:00;2022-03-08 03:00:00;Station-30;2577;9;14;CKB +LINE_14;Station-30;2022-03-08 03:09:00;2022-03-08 03:24:00;Station-31;5937;9;14;CKB +LINE_14;Station-31;2022-03-08 03:33:00;2022-03-08 03:47:00;Station-30;6.19;0;14;CKB +LINE_13;Station-30;2022-03-08 03:47:00;2022-03-08 03:53:00;Station-29;2555;0;14;CKB +LINE_13;Station-29;2022-03-08 03:53:00;2022-03-08 04:00:00;Station-30;2577;9;14;CKB +LINE_14;Station-30;2022-03-08 04:09:00;2022-03-08 04:24:00;Station-31;5937;0;14;CKB +LINE_14;Station-31;2022-03-08 04:24:00;2022-03-08 04:24:00;Station-0;0.06;0;14;CKB +LINE_15;Station-0;2022-03-08 00:57:00;2022-03-08 00:57:00;Station-32;0.06;0;15;CKB +LINE_15;Station-32;2022-03-08 00:57:00;2022-03-08 01:06:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 01:06:00;2022-03-08 01:11:00;Station-32;2936;16;15;CKB +LINE_15;Station-32;2022-03-08 01:27:00;2022-03-08 01:36:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 01:36:00;2022-03-08 01:41:00;Station-32;2936;16;15;CKB +LINE_15;Station-32;2022-03-08 01:57:00;2022-03-08 02:06:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 02:06:00;2022-03-08 02:11:00;Station-32;2936;16;15;CKB +LINE_15;Station-32;2022-03-08 02:27:00;2022-03-08 02:36:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 02:36:00;2022-03-08 02:41:00;Station-32;2936;16;15;CKB +LINE_15;Station-32;2022-03-08 02:57:00;2022-03-08 03:06:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 03:06:00;2022-03-08 03:11:00;Station-32;2936;16;15;CKB +LINE_15;Station-32;2022-03-08 03:27:00;2022-03-08 03:36:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 03:36:00;2022-03-08 03:41:00;Station-32;2936;16;15;CKB +LINE_15;Station-32;2022-03-08 03:57:00;2022-03-08 04:06:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 04:06:00;2022-03-08 04:11:00;Station-32;2936;16;15;CKB +LINE_15;Station-32;2022-03-08 04:27:00;2022-03-08 04:36:00;Station-33;4343;0;15;CKB +LINE_15;Station-33;2022-03-08 04:36:00;2022-03-08 04:36:00;Station-0;0.06;0;15;CKB +LINE_16;Station-0;2022-03-08 00:29:00;2022-03-08 00:29:00;Station-34;0.06;0;16;CKB +LINE_16;Station-34;2022-03-08 00:29:00;2022-03-08 00:41:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 00:47:00;2022-03-08 00:57:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 00:59:00;2022-03-08 01:11:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 01:17:00;2022-03-08 01:27:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 01:29:00;2022-03-08 01:41:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 01:47:00;2022-03-08 01:57:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 01:59:00;2022-03-08 02:11:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 02:17:00;2022-03-08 02:27:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 02:29:00;2022-03-08 02:41:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 02:47:00;2022-03-08 02:57:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 02:59:00;2022-03-08 03:11:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 03:17:00;2022-03-08 03:27:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 03:29:00;2022-03-08 03:41:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 03:47:00;2022-03-08 03:57:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 03:59:00;2022-03-08 04:11:00;Station-35;4481;6;16;CKB +LINE_16;Station-35;2022-03-08 04:17:00;2022-03-08 04:27:00;Station-34;4031;2;16;CKB +LINE_16;Station-34;2022-03-08 04:29:00;2022-03-08 04:41:00;Station-35;4481;0;16;CKB +LINE_16;Station-35;2022-03-08 04:41:00;2022-03-08 04:41:00;Station-0;0.06;0;16;CKB +LINE_17;Station-0;2022-03-08 00:30:00;2022-03-08 00:30:00;Station-34;0.06;0;17;CKB +LINE_17;Station-34;2022-03-08 00:30:00;2022-03-08 00:44:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 00:44:00;2022-03-08 00:57:00;Station-34;5302;3;17;CKB +LINE_17;Station-34;2022-03-08 01:00:00;2022-03-08 01:14:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 01:14:00;2022-03-08 01:27:00;Station-34;5302;3;17;CKB +LINE_17;Station-34;2022-03-08 01:30:00;2022-03-08 01:44:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 01:44:00;2022-03-08 01:57:00;Station-34;5302;3;17;CKB +LINE_17;Station-34;2022-03-08 02:00:00;2022-03-08 02:14:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 02:14:00;2022-03-08 02:27:00;Station-34;5302;3;17;CKB +LINE_17;Station-34;2022-03-08 02:30:00;2022-03-08 02:44:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 02:44:00;2022-03-08 02:57:00;Station-34;5302;3;17;CKB +LINE_17;Station-34;2022-03-08 03:00:00;2022-03-08 03:14:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 03:14:00;2022-03-08 03:27:00;Station-34;5302;3;17;CKB +LINE_17;Station-34;2022-03-08 03:30:00;2022-03-08 03:44:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 03:44:00;2022-03-08 03:57:00;Station-34;5302;3;17;CKB +LINE_17;Station-34;2022-03-08 04:00:00;2022-03-08 04:14:00;Station-36;4801;0;17;CKB +LINE_17;Station-36;2022-03-08 04:14:00;2022-03-08 04:27:00;Station-34;5302;0;17;CKB +LINE_17;Station-34;2022-03-08 04:27:00;2022-03-08 04:27:00;Station-0;0.06;0;17;CKB +LINE_18;Station-0;2022-03-08 00:43:00;2022-03-08 00:43:00;Station-37;0.06;0;18;CKB +LINE_18;Station-37;2022-03-08 00:43:00;2022-03-08 01:33:00;Station-37;20434;10;18;CKB +LINE_18;Station-37;2022-03-08 01:43:00;2022-03-08 02:33:00;Station-37;20434;10;18;CKB +LINE_18;Station-37;2022-03-08 02:43:00;2022-03-08 03:33:00;Station-37;20434;10;18;CKB +LINE_18;Station-37;2022-03-08 03:43:00;2022-03-08 04:33:00;Station-37;20434;0;18;CKB +LINE_18;Station-37;2022-03-08 04:33:00;2022-03-08 04:33:00;Station-0;0.06;0;18;CKB +LINE_18;Station-0;2022-03-08 00:13:00;2022-03-08 00:13:00;Station-37;0.06;0;19;CKB +LINE_18;Station-37;2022-03-08 00:13:00;2022-03-08 01:03:00;Station-37;20434;10;19;CKB +LINE_18;Station-37;2022-03-08 01:13:00;2022-03-08 02:03:00;Station-37;20434;10;19;CKB +LINE_18;Station-37;2022-03-08 02:13:00;2022-03-08 03:03:00;Station-37;20434;10;19;CKB +LINE_18;Station-37;2022-03-08 03:13:00;2022-03-08 04:03:00;Station-37;20434;0;19;CKB +LINE_18;Station-37;2022-03-08 04:03:00;2022-03-08 04:03:00;Station-0;0.06;0;19;CKB +LINE_19;Station-0;2022-03-08 00:24:00;2022-03-08 00:24:00;Station-38;0.06;0;20;CKB +LINE_19;Station-38;2022-03-08 00:24:00;2022-03-08 00:48:00;Station-39;11.86;4;20;CKB +LINE_19;Station-39;2022-03-08 00:52:00;2022-03-08 01:14:00;Station-38;11139;10;20;CKB +LINE_19;Station-38;2022-03-08 01:24:00;2022-03-08 01:48:00;Station-39;11.86;4;20;CKB +LINE_19;Station-39;2022-03-08 01:52:00;2022-03-08 02:14:00;Station-38;11139;10;20;CKB +LINE_19;Station-38;2022-03-08 02:24:00;2022-03-08 02:48:00;Station-39;11.86;4;20;CKB +LINE_19;Station-39;2022-03-08 02:52:00;2022-03-08 03:14:00;Station-38;11139;10;20;CKB +LINE_19;Station-38;2022-03-08 03:24:00;2022-03-08 03:48:00;Station-39;11.86;4;20;CKB +LINE_19;Station-39;2022-03-08 03:52:00;2022-03-08 04:14:00;Station-38;11139;0;20;CKB +LINE_19;Station-38;2022-03-08 04:14:00;2022-03-08 04:14:00;Station-0;0.06;0;20;CKB +LINE_19;Station-0;2022-03-08 00:22:00;2022-03-08 00:22:00;Station-39;0.06;0;21;CKB +LINE_19;Station-39;2022-03-08 00:22:00;2022-03-08 00:44:00;Station-38;11139;10;21;CKB +LINE_19;Station-38;2022-03-08 00:54:00;2022-03-08 01:18:00;Station-39;11.86;4;21;CKB +LINE_19;Station-39;2022-03-08 01:22:00;2022-03-08 01:44:00;Station-38;11139;10;21;CKB +LINE_19;Station-38;2022-03-08 01:54:00;2022-03-08 02:18:00;Station-39;11.86;4;21;CKB +LINE_19;Station-39;2022-03-08 02:22:00;2022-03-08 02:44:00;Station-38;11139;10;21;CKB +LINE_19;Station-38;2022-03-08 02:54:00;2022-03-08 03:18:00;Station-39;11.86;4;21;CKB +LINE_19;Station-39;2022-03-08 03:22:00;2022-03-08 03:44:00;Station-38;11139;10;21;CKB +LINE_19;Station-38;2022-03-08 03:54:00;2022-03-08 04:18:00;Station-39;11.86;4;21;CKB +LINE_19;Station-39;2022-03-08 04:22:00;2022-03-08 04:44:00;Station-38;11139;0;21;CKB +LINE_19;Station-38;2022-03-08 04:44:00;2022-03-08 04:44:00;Station-0;0.06;0;21;CKB +LINE_20;Station-0;2022-03-08 00:32:00;2022-03-08 00:32:00;Station-13;0.06;0;22;CKB +LINE_20;Station-13;2022-03-08 00:32:00;2022-03-08 00:44:00;Station-40;4212;3;22;CKB +LINE_20;Station-40;2022-03-08 00:47:00;2022-03-08 01:16:00;Station-41;13048;0;22;CKB +LINE_20;Station-41;2022-03-08 01:16:00;2022-03-08 01:42:00;Station-40;12869;5;22;CKB +LINE_20;Station-40;2022-03-08 01:47:00;2022-03-08 02:16:00;Station-41;13048;0;22;CKB +LINE_20;Station-41;2022-03-08 02:16:00;2022-03-08 02:42:00;Station-40;12869;5;22;CKB +LINE_20;Station-40;2022-03-08 02:47:00;2022-03-08 03:16:00;Station-41;13048;0;22;CKB +LINE_20;Station-41;2022-03-08 03:16:00;2022-03-08 03:42:00;Station-40;12869;5;22;CKB +LINE_20;Station-40;2022-03-08 03:47:00;2022-03-08 04:16:00;Station-41;13048;0;22;CKB +LINE_20;Station-41;2022-03-08 04:16:00;2022-03-08 04:34:00;Station-42;9538;0;22;CKB +LINE_20;Station-42;2022-03-08 04:34:00;2022-03-08 04:34:00;Station-0;0.06;0;22;CKB +LINE_20;Station-0;2022-03-08 00:17:00;2022-03-08 00:17:00;Station-40;0.06;0;23;CKB +LINE_20;Station-40;2022-03-08 00:17:00;2022-03-08 00:46:00;Station-41;13048;0;23;CKB +LINE_20;Station-41;2022-03-08 00:46:00;2022-03-08 01:12:00;Station-40;12869;5;23;CKB +LINE_20;Station-40;2022-03-08 01:17:00;2022-03-08 01:46:00;Station-41;13048;0;23;CKB +LINE_20;Station-41;2022-03-08 01:46:00;2022-03-08 02:12:00;Station-40;12869;5;23;CKB +LINE_20;Station-40;2022-03-08 02:17:00;2022-03-08 02:46:00;Station-41;13048;0;23;CKB +LINE_20;Station-41;2022-03-08 02:46:00;2022-03-08 03:12:00;Station-40;12869;5;23;CKB +LINE_20;Station-40;2022-03-08 03:17:00;2022-03-08 03:46:00;Station-41;13048;0;23;CKB +LINE_20;Station-41;2022-03-08 03:46:00;2022-03-08 04:12:00;Station-40;12869;5;23;CKB +LINE_20;Station-40;2022-03-08 04:17:00;2022-03-08 04:28:00;Station-13;4316;0;23;CKB +LINE_20;Station-13;2022-03-08 04:28:00;2022-03-08 04:28:00;Station-0;0.06;0;23;CKB +LINE_21;Station-0;2022-03-08 00:49:00;2022-03-08 00:49:00;Station-3;0.06;0;24;CKB +LINE_21;Station-3;2022-03-08 00:49:00;2022-03-08 01:04:00;Station-16;10229;0;24;CKB +LINE_21;Station-16;2022-03-08 01:04:00;2022-03-08 01:19:00;Station-3;11801;0;24;CKB +LINE_21;Station-3;2022-03-08 01:19:00;2022-03-08 01:34:00;Station-16;10229;0;24;CKB +LINE_21;Station-16;2022-03-08 01:34:00;2022-03-08 01:49:00;Station-3;11801;0;24;CKB +LINE_21;Station-3;2022-03-08 01:49:00;2022-03-08 02:04:00;Station-16;10229;0;24;CKB +LINE_21;Station-16;2022-03-08 02:04:00;2022-03-08 02:19:00;Station-3;11801;0;24;CKB +LINE_21;Station-3;2022-03-08 02:19:00;2022-03-08 02:34:00;Station-16;10229;0;24;CKB +LINE_21;Station-16;2022-03-08 02:34:00;2022-03-08 02:49:00;Station-3;11801;0;24;CKB +LINE_21;Station-3;2022-03-08 02:49:00;2022-03-08 03:04:00;Station-16;10229;0;24;CKB +LINE_21;Station-16;2022-03-08 03:04:00;2022-03-08 03:19:00;Station-3;11801;0;24;CKB +LINE_21;Station-3;2022-03-08 03:19:00;2022-03-08 03:34:00;Station-16;10229;0;24;CKB +LINE_21;Station-16;2022-03-08 03:34:00;2022-03-08 03:49:00;Station-3;11801;0;24;CKB +LINE_21;Station-3;2022-03-08 03:49:00;2022-03-08 04:04:00;Station-16;10229;0;24;CKB +LINE_21;Station-16;2022-03-08 04:04:00;2022-03-08 04:19:00;Station-3;11801;23;24;CKB +LINE_22;Station-3;2022-03-08 04:42:00;2022-03-08 05:04:00;Station-43;6.81;0;24;CKB +LINE_22;Station-43;2022-03-08 05:04:00;2022-03-08 05:04:00;Station-0;0.06;0;24;CKB +LINE_8;Station-0;2022-03-08 00:32:00;2022-03-08 00:32:00;Station-13;0.06;0;25;CKB +LINE_8;Station-13;2022-03-08 00:32:00;2022-03-08 00:57:00;Station-21;11545;6;25;CKB +LINE_8;Station-21;2022-03-08 01:03:00;2022-03-08 01:46:00;Station-20;20579;1;25;CKB +LINE_8;Station-20;2022-03-08 01:47:00;2022-03-08 02:25:00;Station-21;20641;8;25;CKB +LINE_8;Station-21;2022-03-08 02:33:00;2022-03-08 03:16:00;Station-20;20579;1;25;CKB +LINE_8;Station-20;2022-03-08 03:17:00;2022-03-08 03:55:00;Station-21;20641;8;25;CKB +LINE_8;Station-21;2022-03-08 04:03:00;2022-03-08 04:28:00;Station-13;11499;0;25;CKB +LINE_8;Station-13;2022-03-08 04:28:00;2022-03-08 04:28:00;Station-0;0.06;0;25;CKB +LINE_8;Station-0;2022-03-08 00:33:00;2022-03-08 00:33:00;Station-21;0.06;0;26;CKB +LINE_8;Station-21;2022-03-08 00:33:00;2022-03-08 01:16:00;Station-20;20579;1;26;CKB +LINE_8;Station-20;2022-03-08 01:17:00;2022-03-08 01:55:00;Station-21;20641;8;26;CKB +LINE_8;Station-21;2022-03-08 02:03:00;2022-03-08 02:46:00;Station-20;20579;1;26;CKB +LINE_8;Station-20;2022-03-08 02:47:00;2022-03-08 03:25:00;Station-21;20641;8;26;CKB +LINE_8;Station-21;2022-03-08 03:33:00;2022-03-08 04:16:00;Station-20;20579;1;26;CKB +LINE_8;Station-20;2022-03-08 04:17:00;2022-03-08 04:51:00;Station-44;18752;0;26;CKB +LINE_8;Station-44;2022-03-08 04:51:00;2022-03-08 04:51:00;Station-0;0.06;0;26;CKB +LINE_23;Station-0;2022-03-08 00:34:00;2022-03-08 00:34:00;Station-45;0.06;0;27;CKB +LINE_23;Station-45;2022-03-08 00:34:00;2022-03-08 01:00:00;Station-46;9016;0;27;CKB +LINE_23;Station-46;2022-03-08 01:00:00;2022-03-08 01:27:00;Station-45;10083;7;27;CKB +LINE_23;Station-45;2022-03-08 01:34:00;2022-03-08 02:00:00;Station-46;9016;0;27;CKB +LINE_23;Station-46;2022-03-08 02:00:00;2022-03-08 02:27:00;Station-45;10083;7;27;CKB +LINE_23;Station-45;2022-03-08 02:34:00;2022-03-08 03:00:00;Station-46;9016;0;27;CKB +LINE_23;Station-46;2022-03-08 03:00:00;2022-03-08 03:27:00;Station-45;10083;7;27;CKB +LINE_23;Station-45;2022-03-08 03:34:00;2022-03-08 04:00:00;Station-46;9016;0;27;CKB +LINE_23;Station-46;2022-03-08 04:00:00;2022-03-08 04:27:00;Station-45;10083;0;27;CKB +LINE_23;Station-45;2022-03-08 04:27:00;2022-03-08 04:27:00;Station-0;0.06;0;27;CKB +LINE_23;Station-0;2022-03-08 00:30:00;2022-03-08 00:30:00;Station-46;0.06;0;28;CKB +LINE_23;Station-46;2022-03-08 00:30:00;2022-03-08 00:57:00;Station-45;10083;7;28;CKB +LINE_23;Station-45;2022-03-08 01:04:00;2022-03-08 01:30:00;Station-46;9016;0;28;CKB +LINE_23;Station-46;2022-03-08 01:30:00;2022-03-08 01:57:00;Station-45;10083;7;28;CKB +LINE_23;Station-45;2022-03-08 02:04:00;2022-03-08 02:30:00;Station-46;9016;0;28;CKB +LINE_23;Station-46;2022-03-08 02:30:00;2022-03-08 02:57:00;Station-45;10083;7;28;CKB +LINE_23;Station-45;2022-03-08 03:04:00;2022-03-08 03:30:00;Station-46;9016;0;28;CKB +LINE_23;Station-46;2022-03-08 03:30:00;2022-03-08 03:57:00;Station-45;10083;7;28;CKB +LINE_23;Station-45;2022-03-08 04:04:00;2022-03-08 04:30:00;Station-46;9016;0;28;CKB +LINE_23;Station-46;2022-03-08 04:30:00;2022-03-08 04:57:00;Station-45;10083;0;28;CKB +LINE_23;Station-45;2022-03-08 04:57:00;2022-03-08 04:57:00;Station-0;0.06;0;28;CKB +LINE_24;Station-0;2022-03-08 00:31:00;2022-03-08 00:31:00;Station-21;0.06;0;29;CKB +LINE_24;Station-21;2022-03-08 00:31:00;2022-03-08 00:44:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 00:44:00;2022-03-08 00:56:00;Station-21;5362;5;29;CKB +LINE_24;Station-21;2022-03-08 01:01:00;2022-03-08 01:14:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 01:14:00;2022-03-08 01:26:00;Station-21;5362;5;29;CKB +LINE_24;Station-21;2022-03-08 01:31:00;2022-03-08 01:44:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 01:44:00;2022-03-08 01:56:00;Station-21;5362;5;29;CKB +LINE_24;Station-21;2022-03-08 02:01:00;2022-03-08 02:14:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 02:14:00;2022-03-08 02:26:00;Station-21;5362;5;29;CKB +LINE_24;Station-21;2022-03-08 02:31:00;2022-03-08 02:44:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 02:44:00;2022-03-08 02:56:00;Station-21;5362;5;29;CKB +LINE_24;Station-21;2022-03-08 03:01:00;2022-03-08 03:14:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 03:14:00;2022-03-08 03:26:00;Station-21;5362;5;29;CKB +LINE_24;Station-21;2022-03-08 03:31:00;2022-03-08 03:44:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 03:44:00;2022-03-08 03:56:00;Station-21;5362;5;29;CKB +LINE_24;Station-21;2022-03-08 04:01:00;2022-03-08 04:14:00;Station-47;4872;0;29;CKB +LINE_24;Station-47;2022-03-08 04:14:00;2022-03-08 04:26:00;Station-21;5362;0;29;CKB +LINE_24;Station-21;2022-03-08 04:26:00;2022-03-08 04:26:00;Station-0;0.06;0;29;CKB +LINE_25;Station-0;2022-03-08 00:31:00;2022-03-08 00:31:00;Station-21;0.06;0;30;CKB +LINE_25;Station-21;2022-03-08 00:31:00;2022-03-08 00:45:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 00:47:00;2022-03-08 01:01:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 01:01:00;2022-03-08 01:15:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 01:17:00;2022-03-08 01:31:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 01:31:00;2022-03-08 01:45:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 01:47:00;2022-03-08 02:01:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 02:01:00;2022-03-08 02:15:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 02:17:00;2022-03-08 02:31:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 02:31:00;2022-03-08 02:45:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 02:47:00;2022-03-08 03:01:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 03:01:00;2022-03-08 03:15:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 03:17:00;2022-03-08 03:31:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 03:31:00;2022-03-08 03:45:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 03:47:00;2022-03-08 04:01:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 04:01:00;2022-03-08 04:15:00;Station-48;5225;2;30;CKB +LINE_25;Station-48;2022-03-08 04:17:00;2022-03-08 04:31:00;Station-21;7617;0;30;CKB +LINE_25;Station-21;2022-03-08 04:31:00;2022-03-08 04:31:00;Station-0;0.06;0;30;CKB +LINE_26;Station-0;2022-03-08 00:43:00;2022-03-08 00:43:00;Station-49;0.06;0;31;CKB +LINE_26;Station-49;2022-03-08 00:43:00;2022-03-08 00:53:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 00:53:00;2022-03-08 01:03:00;Station-49;4408;10;31;CKB +LINE_26;Station-49;2022-03-08 01:13:00;2022-03-08 01:23:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 01:23:00;2022-03-08 01:33:00;Station-49;4408;10;31;CKB +LINE_26;Station-49;2022-03-08 01:43:00;2022-03-08 01:53:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 01:53:00;2022-03-08 02:03:00;Station-49;4408;10;31;CKB +LINE_26;Station-49;2022-03-08 02:13:00;2022-03-08 02:23:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 02:23:00;2022-03-08 02:33:00;Station-49;4408;10;31;CKB +LINE_26;Station-49;2022-03-08 02:43:00;2022-03-08 02:53:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 02:53:00;2022-03-08 03:03:00;Station-49;4408;10;31;CKB +LINE_26;Station-49;2022-03-08 03:13:00;2022-03-08 03:23:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 03:23:00;2022-03-08 03:33:00;Station-49;4408;10;31;CKB +LINE_26;Station-49;2022-03-08 03:43:00;2022-03-08 03:53:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 03:53:00;2022-03-08 04:03:00;Station-49;4408;10;31;CKB +LINE_26;Station-49;2022-03-08 04:13:00;2022-03-08 04:23:00;Station-50;4507;0;31;CKB +LINE_26;Station-50;2022-03-08 04:23:00;2022-03-08 04:33:00;Station-49;4408;0;31;CKB +LINE_26;Station-49;2022-03-08 04:33:00;2022-03-08 04:33:00;Station-0;0.06;0;31;CKB +LINE_21;Station-0;2022-03-07 00:49:00;2022-03-07 00:49:00;Station-3;0.06;0;32;CKB +LINE_21;Station-3;2022-03-07 00:49:00;2022-03-07 01:04:00;Station-16;10229;0;32;CKB +LINE_21;Station-16;2022-03-07 01:04:00;2022-03-07 01:19:00;Station-3;11801;0;32;CKB +LINE_21;Station-3;2022-03-07 01:19:00;2022-03-07 01:34:00;Station-16;10229;0;32;CKB +LINE_21;Station-16;2022-03-07 01:34:00;2022-03-07 01:49:00;Station-3;11801;0;32;CKB +LINE_21;Station-3;2022-03-07 01:49:00;2022-03-07 02:04:00;Station-16;10229;0;32;CKB +LINE_21;Station-16;2022-03-07 02:04:00;2022-03-07 02:19:00;Station-3;11801;0;32;CKB +LINE_21;Station-3;2022-03-07 02:19:00;2022-03-07 02:34:00;Station-16;10229;0;32;CKB +LINE_21;Station-16;2022-03-07 02:34:00;2022-03-07 02:49:00;Station-3;11801;0;32;CKB +LINE_21;Station-3;2022-03-07 02:49:00;2022-03-07 03:04:00;Station-16;10229;0;32;CKB +LINE_21;Station-16;2022-03-07 03:04:00;2022-03-07 03:19:00;Station-3;11801;0;32;CKB +LINE_21;Station-3;2022-03-07 03:19:00;2022-03-07 03:34:00;Station-16;10229;0;32;CKB +LINE_21;Station-16;2022-03-07 03:34:00;2022-03-07 03:49:00;Station-3;11801;0;32;CKB +LINE_21;Station-3;2022-03-07 03:49:00;2022-03-07 04:04:00;Station-16;10229;0;32;CKB +LINE_21;Station-16;2022-03-07 04:04:00;2022-03-07 04:19:00;Station-3;11801;23;32;CKB +LINE_22;Station-3;2022-03-07 04:42:00;2022-03-07 05:04:00;Station-43;6.81;0;32;CKB +LINE_22;Station-43;2022-03-07 05:04:00;2022-03-07 05:04:00;Station-0;0.06;0;32;CKB +LINE_13;Station-0;2022-03-07 00:23:00;2022-03-07 00:23:00;Station-29;0.06;0;33;CKB +LINE_13;Station-29;2022-03-07 00:23:00;2022-03-07 00:30:00;Station-30;2577;9;33;CKB +LINE_14;Station-30;2022-03-07 00:39:00;2022-03-07 00:54:00;Station-31;5937;9;33;CKB +LINE_14;Station-31;2022-03-07 01:03:00;2022-03-07 01:17:00;Station-30;6.19;0;33;CKB +LINE_13;Station-30;2022-03-07 01:17:00;2022-03-07 01:23:00;Station-29;2555;0;33;CKB +LINE_13;Station-29;2022-03-07 01:23:00;2022-03-07 01:30:00;Station-30;2577;9;33;CKB +LINE_14;Station-30;2022-03-07 01:39:00;2022-03-07 01:54:00;Station-31;5937;9;33;CKB +LINE_14;Station-31;2022-03-07 02:03:00;2022-03-07 02:17:00;Station-30;6.19;0;33;CKB +LINE_13;Station-30;2022-03-07 02:17:00;2022-03-07 02:23:00;Station-29;2555;0;33;CKB +LINE_13;Station-29;2022-03-07 02:23:00;2022-03-07 02:30:00;Station-30;2577;9;33;CKB +LINE_14;Station-30;2022-03-07 02:39:00;2022-03-07 02:54:00;Station-31;5937;9;33;CKB +LINE_14;Station-31;2022-03-07 03:03:00;2022-03-07 03:17:00;Station-30;6.19;0;33;CKB +LINE_13;Station-30;2022-03-07 03:17:00;2022-03-07 03:23:00;Station-29;2555;0;33;CKB +LINE_13;Station-29;2022-03-07 03:23:00;2022-03-07 03:30:00;Station-30;2577;9;33;CKB +LINE_14;Station-30;2022-03-07 03:39:00;2022-03-07 03:54:00;Station-31;5937;9;33;CKB +LINE_14;Station-31;2022-03-07 04:03:00;2022-03-07 04:17:00;Station-30;6.19;0;33;CKB +LINE_13;Station-30;2022-03-07 04:17:00;2022-03-07 04:23:00;Station-29;2555;0;33;CKB +LINE_13;Station-29;2022-03-07 04:23:00;2022-03-07 04:23:00;Station-0;0.06;0;33;CKB +LINE_14;Station-0;2022-03-07 00:33:00;2022-03-07 00:33:00;Station-31;0.06;0;34;CKB +LINE_14;Station-31;2022-03-07 00:33:00;2022-03-07 00:47:00;Station-30;6.19;0;34;CKB +LINE_13;Station-30;2022-03-07 00:47:00;2022-03-07 00:53:00;Station-29;2555;0;34;CKB +LINE_13;Station-29;2022-03-07 00:53:00;2022-03-07 01:00:00;Station-30;2577;9;34;CKB +LINE_14;Station-30;2022-03-07 01:09:00;2022-03-07 01:24:00;Station-31;5937;9;34;CKB +LINE_14;Station-31;2022-03-07 01:33:00;2022-03-07 01:47:00;Station-30;6.19;0;34;CKB +LINE_13;Station-30;2022-03-07 01:47:00;2022-03-07 01:53:00;Station-29;2555;0;34;CKB +LINE_13;Station-29;2022-03-07 01:53:00;2022-03-07 02:00:00;Station-30;2577;9;34;CKB +LINE_14;Station-30;2022-03-07 02:09:00;2022-03-07 02:24:00;Station-31;5937;9;34;CKB +LINE_14;Station-31;2022-03-07 02:33:00;2022-03-07 02:47:00;Station-30;6.19;0;34;CKB +LINE_13;Station-30;2022-03-07 02:47:00;2022-03-07 02:53:00;Station-29;2555;0;34;CKB +LINE_13;Station-29;2022-03-07 02:53:00;2022-03-07 03:00:00;Station-30;2577;9;34;CKB +LINE_14;Station-30;2022-03-07 03:09:00;2022-03-07 03:24:00;Station-31;5937;9;34;CKB +LINE_14;Station-31;2022-03-07 03:33:00;2022-03-07 03:47:00;Station-30;6.19;0;34;CKB +LINE_13;Station-30;2022-03-07 03:47:00;2022-03-07 03:53:00;Station-29;2555;0;34;CKB +LINE_13;Station-29;2022-03-07 03:53:00;2022-03-07 04:00:00;Station-30;2577;9;34;CKB +LINE_14;Station-30;2022-03-07 04:09:00;2022-03-07 04:24:00;Station-31;5937;0;34;CKB +LINE_14;Station-31;2022-03-07 04:24:00;2022-03-07 04:24:00;Station-0;0.06;0;34;CKB +LINE_15;Station-0;2022-03-07 00:57:00;2022-03-07 00:57:00;Station-32;0.06;0;35;CKB +LINE_15;Station-32;2022-03-07 00:57:00;2022-03-07 01:06:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 01:06:00;2022-03-07 01:11:00;Station-32;2936;16;35;CKB +LINE_15;Station-32;2022-03-07 01:27:00;2022-03-07 01:36:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 01:36:00;2022-03-07 01:41:00;Station-32;2936;16;35;CKB +LINE_15;Station-32;2022-03-07 01:57:00;2022-03-07 02:06:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 02:06:00;2022-03-07 02:11:00;Station-32;2936;16;35;CKB +LINE_15;Station-32;2022-03-07 02:27:00;2022-03-07 02:36:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 02:36:00;2022-03-07 02:41:00;Station-32;2936;16;35;CKB +LINE_15;Station-32;2022-03-07 02:57:00;2022-03-07 03:06:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 03:06:00;2022-03-07 03:11:00;Station-32;2936;16;35;CKB +LINE_15;Station-32;2022-03-07 03:27:00;2022-03-07 03:36:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 03:36:00;2022-03-07 03:41:00;Station-32;2936;16;35;CKB +LINE_15;Station-32;2022-03-07 03:57:00;2022-03-07 04:06:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 04:06:00;2022-03-07 04:11:00;Station-32;2936;16;35;CKB +LINE_15;Station-32;2022-03-07 04:27:00;2022-03-07 04:36:00;Station-33;4343;0;35;CKB +LINE_15;Station-33;2022-03-07 04:36:00;2022-03-07 04:36:00;Station-0;0.06;0;35;CKB +LINE_16;Station-0;2022-03-07 00:29:00;2022-03-07 00:29:00;Station-34;0.06;0;36;CKB +LINE_16;Station-34;2022-03-07 00:29:00;2022-03-07 00:41:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 00:47:00;2022-03-07 00:57:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 00:59:00;2022-03-07 01:11:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 01:17:00;2022-03-07 01:27:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 01:29:00;2022-03-07 01:41:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 01:47:00;2022-03-07 01:57:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 01:59:00;2022-03-07 02:11:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 02:17:00;2022-03-07 02:27:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 02:29:00;2022-03-07 02:41:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 02:47:00;2022-03-07 02:57:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 02:59:00;2022-03-07 03:11:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 03:17:00;2022-03-07 03:27:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 03:29:00;2022-03-07 03:41:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 03:47:00;2022-03-07 03:57:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 03:59:00;2022-03-07 04:11:00;Station-35;4481;6;36;CKB +LINE_16;Station-35;2022-03-07 04:17:00;2022-03-07 04:27:00;Station-34;4031;2;36;CKB +LINE_16;Station-34;2022-03-07 04:29:00;2022-03-07 04:41:00;Station-35;4481;0;36;CKB +LINE_16;Station-35;2022-03-07 04:41:00;2022-03-07 04:41:00;Station-0;0.06;0;36;CKB +LINE_17;Station-0;2022-03-07 00:30:00;2022-03-07 00:30:00;Station-34;0.06;0;37;CKB +LINE_17;Station-34;2022-03-07 00:30:00;2022-03-07 00:44:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 00:44:00;2022-03-07 00:57:00;Station-34;5302;3;37;CKB +LINE_17;Station-34;2022-03-07 01:00:00;2022-03-07 01:14:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 01:14:00;2022-03-07 01:27:00;Station-34;5302;3;37;CKB +LINE_17;Station-34;2022-03-07 01:30:00;2022-03-07 01:44:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 01:44:00;2022-03-07 01:57:00;Station-34;5302;3;37;CKB +LINE_17;Station-34;2022-03-07 02:00:00;2022-03-07 02:14:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 02:14:00;2022-03-07 02:27:00;Station-34;5302;3;37;CKB +LINE_17;Station-34;2022-03-07 02:30:00;2022-03-07 02:44:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 02:44:00;2022-03-07 02:57:00;Station-34;5302;3;37;CKB +LINE_17;Station-34;2022-03-07 03:00:00;2022-03-07 03:14:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 03:14:00;2022-03-07 03:27:00;Station-34;5302;3;37;CKB +LINE_17;Station-34;2022-03-07 03:30:00;2022-03-07 03:44:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 03:44:00;2022-03-07 03:57:00;Station-34;5302;3;37;CKB +LINE_17;Station-34;2022-03-07 04:00:00;2022-03-07 04:14:00;Station-36;4801;0;37;CKB +LINE_17;Station-36;2022-03-07 04:14:00;2022-03-07 04:27:00;Station-34;5302;0;37;CKB +LINE_17;Station-34;2022-03-07 04:27:00;2022-03-07 04:27:00;Station-0;0.06;0;37;CKB +LINE_18;Station-0;2022-03-07 00:43:00;2022-03-07 00:43:00;Station-37;0.06;0;38;CKB +LINE_18;Station-37;2022-03-07 00:43:00;2022-03-07 01:33:00;Station-37;20434;10;38;CKB +LINE_18;Station-37;2022-03-07 01:43:00;2022-03-07 02:33:00;Station-37;20434;10;38;CKB +LINE_18;Station-37;2022-03-07 02:43:00;2022-03-07 03:33:00;Station-37;20434;10;38;CKB +LINE_18;Station-37;2022-03-07 03:43:00;2022-03-07 04:33:00;Station-37;20434;0;38;CKB +LINE_18;Station-37;2022-03-07 04:33:00;2022-03-07 04:33:00;Station-0;0.06;0;38;CKB +LINE_18;Station-0;2022-03-07 00:13:00;2022-03-07 00:13:00;Station-37;0.06;0;39;CKB +LINE_18;Station-37;2022-03-07 00:13:00;2022-03-07 01:03:00;Station-37;20434;10;39;CKB +LINE_18;Station-37;2022-03-07 01:13:00;2022-03-07 02:03:00;Station-37;20434;10;39;CKB +LINE_18;Station-37;2022-03-07 02:13:00;2022-03-07 03:03:00;Station-37;20434;10;39;CKB +LINE_18;Station-37;2022-03-07 03:13:00;2022-03-07 04:03:00;Station-37;20434;0;39;CKB +LINE_18;Station-37;2022-03-07 04:03:00;2022-03-07 04:03:00;Station-0;0.06;0;39;CKB +LINE_19;Station-0;2022-03-07 00:24:00;2022-03-07 00:24:00;Station-38;0.06;0;40;CKB +LINE_19;Station-38;2022-03-07 00:24:00;2022-03-07 00:48:00;Station-39;11.86;4;40;CKB +LINE_19;Station-39;2022-03-07 00:52:00;2022-03-07 01:14:00;Station-38;11139;10;40;CKB +LINE_19;Station-38;2022-03-07 01:24:00;2022-03-07 01:48:00;Station-39;11.86;4;40;CKB +LINE_19;Station-39;2022-03-07 01:52:00;2022-03-07 02:14:00;Station-38;11139;10;40;CKB +LINE_19;Station-38;2022-03-07 02:24:00;2022-03-07 02:48:00;Station-39;11.86;4;40;CKB +LINE_19;Station-39;2022-03-07 02:52:00;2022-03-07 03:14:00;Station-38;11139;10;40;CKB +LINE_19;Station-38;2022-03-07 03:24:00;2022-03-07 03:48:00;Station-39;11.86;4;40;CKB +LINE_19;Station-39;2022-03-07 03:52:00;2022-03-07 04:14:00;Station-38;11139;0;40;CKB +LINE_19;Station-38;2022-03-07 04:14:00;2022-03-07 04:14:00;Station-0;0.06;0;40;CKB +LINE_19;Station-0;2022-03-07 00:22:00;2022-03-07 00:22:00;Station-39;0.06;0;41;CKB +LINE_19;Station-39;2022-03-07 00:22:00;2022-03-07 00:44:00;Station-38;11139;10;41;CKB +LINE_19;Station-38;2022-03-07 00:54:00;2022-03-07 01:18:00;Station-39;11.86;4;41;CKB +LINE_19;Station-39;2022-03-07 01:22:00;2022-03-07 01:44:00;Station-38;11139;10;41;CKB +LINE_19;Station-38;2022-03-07 01:54:00;2022-03-07 02:18:00;Station-39;11.86;4;41;CKB +LINE_19;Station-39;2022-03-07 02:22:00;2022-03-07 02:44:00;Station-38;11139;10;41;CKB +LINE_19;Station-38;2022-03-07 02:54:00;2022-03-07 03:18:00;Station-39;11.86;4;41;CKB +LINE_19;Station-39;2022-03-07 03:22:00;2022-03-07 03:44:00;Station-38;11139;10;41;CKB +LINE_19;Station-38;2022-03-07 03:54:00;2022-03-07 04:18:00;Station-39;11.86;4;41;CKB +LINE_19;Station-39;2022-03-07 04:22:00;2022-03-07 04:44:00;Station-38;11139;0;41;CKB +LINE_19;Station-38;2022-03-07 04:44:00;2022-03-07 04:44:00;Station-0;0.06;0;41;CKB +LINE_0;Station-0;2022-03-13 20:51:00;2022-03-13 20:51:00;Station-1;0.06;0;42;CKB +LINE_0;Station-1;2022-03-13 20:51:00;2022-03-13 21:24:00;Station-2;14519;4;42;CKB +LINE_0;Station-2;2022-03-13 21:28:00;2022-03-13 22:03:00;Station-1;13541;8;42;CKB +LINE_0;Station-1;2022-03-13 22:11:00;2022-03-13 22:44:00;Station-2;14519;4;42;CKB +LINE_0;Station-2;2022-03-13 22:48:00;2022-03-13 23:23:00;Station-1;13541;8;42;CKB +LINE_0;Station-1;2022-03-13 23:31:00;2022-03-14 00:04:00;Station-2;14519;4;42;CKB +LINE_0;Station-2;2022-03-14 00:08:00;2022-03-14 00:39:00;Station-5;12213;0;42;CKB +LINE_1;Station-5;2022-03-14 00:39:00;2022-03-14 00:47:00;Station-3;4.0;2;42;CKB +LINE_1;Station-3;2022-03-14 00:49:00;2022-03-14 01:12:00;Station-4;8.36;6;42;CKB +LINE_1;Station-4;2022-03-14 01:18:00;2022-03-14 01:36:00;Station-3;9067;13;42;CKB +LINE_1;Station-3;2022-03-14 01:49:00;2022-03-14 02:12:00;Station-4;8.36;6;42;CKB +LINE_1;Station-4;2022-03-14 02:18:00;2022-03-14 02:36:00;Station-3;9067;13;42;CKB +LINE_1;Station-3;2022-03-14 02:49:00;2022-03-14 03:12:00;Station-4;8.36;6;42;CKB +LINE_1;Station-4;2022-03-14 03:18:00;2022-03-14 03:36:00;Station-3;9067;13;42;CKB +LINE_1;Station-3;2022-03-14 03:49:00;2022-03-14 04:12:00;Station-4;8.36;0;42;CKB +LINE_1;Station-4;2022-03-14 04:12:00;2022-03-14 04:12:00;Station-0;0.06;0;42;CKB +LINE_0;Station-0;2022-03-13 21:31:00;2022-03-13 21:31:00;Station-1;0.06;0;43;CKB +LINE_0;Station-1;2022-03-13 21:31:00;2022-03-13 22:04:00;Station-2;14519;4;43;CKB +LINE_0;Station-2;2022-03-13 22:08:00;2022-03-13 22:43:00;Station-1;13541;8;43;CKB +LINE_0;Station-1;2022-03-13 22:51:00;2022-03-13 23:24:00;Station-2;14519;4;43;CKB +LINE_0;Station-2;2022-03-13 23:28:00;2022-03-14 00:03:00;Station-1;13541;8;43;CKB +LINE_0;Station-1;2022-03-14 00:11:00;2022-03-14 00:44:00;Station-2;14519;0;43;CKB +LINE_1;Station-2;2022-03-14 00:44:00;2022-03-14 00:54:00;Station-3;4.1;25;43;CKB +LINE_1;Station-3;2022-03-14 01:19:00;2022-03-14 01:42:00;Station-4;8.36;6;43;CKB +LINE_1;Station-4;2022-03-14 01:48:00;2022-03-14 02:06:00;Station-3;9067;13;43;CKB +LINE_1;Station-3;2022-03-14 02:19:00;2022-03-14 02:42:00;Station-4;8.36;6;43;CKB +LINE_1;Station-4;2022-03-14 02:48:00;2022-03-14 03:06:00;Station-3;9067;13;43;CKB +LINE_1;Station-3;2022-03-14 03:19:00;2022-03-14 03:42:00;Station-4;8.36;6;43;CKB +LINE_1;Station-4;2022-03-14 03:48:00;2022-03-14 04:06:00;Station-3;9067;0;43;CKB +LINE_1;Station-3;2022-03-14 04:06:00;2022-03-14 04:06:00;Station-0;0.06;0;43;CKB +LINE_2;Station-0;2022-03-13 21:06:00;2022-03-13 21:06:00;Station-6;0.06;0;44;CKB +LINE_2;Station-6;2022-03-13 21:06:00;2022-03-13 21:34:00;Station-7;13018;19;44;CKB +LINE_2;Station-7;2022-03-13 21:53:00;2022-03-13 22:13:00;Station-8;10332;17;44;CKB +LINE_2;Station-8;2022-03-13 22:30:00;2022-03-13 22:54:00;Station-7;10.48;19;44;CKB +LINE_2;Station-7;2022-03-13 23:13:00;2022-03-13 23:33:00;Station-8;10332;17;44;CKB +LINE_2;Station-8;2022-03-13 23:50:00;2022-03-14 00:14:00;Station-7;10.48;2;44;CKB +LINE_2;Station-7;2022-03-14 00:16:00;2022-03-14 00:23:00;Station-9;3709;5;44;CKB +LINE_3;Station-9;2022-03-14 00:28:00;2022-03-14 00:44:00;Station-10;6404;3;44;CKB +LINE_3;Station-10;2022-03-14 00:47:00;2022-03-14 01:10:00;Station-11;10579;7;44;CKB +LINE_3;Station-11;2022-03-14 01:17:00;2022-03-14 01:44:00;Station-10;12007;3;44;CKB +LINE_3;Station-10;2022-03-14 01:47:00;2022-03-14 02:10:00;Station-11;10579;7;44;CKB +LINE_3;Station-11;2022-03-14 02:17:00;2022-03-14 02:44:00;Station-10;12007;3;44;CKB +LINE_3;Station-10;2022-03-14 02:47:00;2022-03-14 03:10:00;Station-11;10579;7;44;CKB +LINE_3;Station-11;2022-03-14 03:17:00;2022-03-14 03:44:00;Station-10;12007;3;44;CKB +LINE_3;Station-10;2022-03-14 03:47:00;2022-03-14 04:10:00;Station-11;10579;7;44;CKB +LINE_3;Station-11;2022-03-14 04:17:00;2022-03-14 04:44:00;Station-10;12007;0;44;CKB +LINE_3;Station-10;2022-03-14 04:44:00;2022-03-14 04:44:00;Station-0;0.06;0;44;CKB +LINE_2;Station-0;2022-03-13 20:26:00;2022-03-13 20:26:00;Station-6;0.06;0;45;CKB +LINE_2;Station-6;2022-03-13 20:26:00;2022-03-13 20:56:00;Station-12;14097;14;45;CKB +LINE_2;Station-12;2022-03-13 21:10:00;2022-03-13 21:38:00;Station-6;13.19;8;45;CKB +LINE_2;Station-6;2022-03-13 21:46:00;2022-03-13 22:14:00;Station-7;13018;19;45;CKB +LINE_2;Station-7;2022-03-13 22:33:00;2022-03-13 22:53:00;Station-8;10332;17;45;CKB +LINE_2;Station-8;2022-03-13 23:10:00;2022-03-13 23:34:00;Station-7;10.48;19;45;CKB +LINE_2;Station-7;2022-03-13 23:53:00;2022-03-14 00:13:00;Station-8;10332;2;45;CKB +LINE_2;Station-8;2022-03-14 00:15:00;2022-03-14 00:16:00;Station-10;506;1;45;CKB +LINE_3;Station-10;2022-03-14 00:17:00;2022-03-14 00:40:00;Station-11;10579;7;45;CKB +LINE_3;Station-11;2022-03-14 00:47:00;2022-03-14 01:14:00;Station-10;12007;3;45;CKB +LINE_3;Station-10;2022-03-14 01:17:00;2022-03-14 01:40:00;Station-11;10579;7;45;CKB +LINE_3;Station-11;2022-03-14 01:47:00;2022-03-14 02:14:00;Station-10;12007;3;45;CKB +LINE_3;Station-10;2022-03-14 02:17:00;2022-03-14 02:40:00;Station-11;10579;7;45;CKB +LINE_3;Station-11;2022-03-14 02:47:00;2022-03-14 03:14:00;Station-10;12007;3;45;CKB +LINE_3;Station-10;2022-03-14 03:17:00;2022-03-14 03:40:00;Station-11;10579;7;45;CKB +LINE_3;Station-11;2022-03-14 03:47:00;2022-03-14 04:14:00;Station-10;12007;3;45;CKB +LINE_3;Station-10;2022-03-14 04:17:00;2022-03-14 04:40:00;Station-11;10579;3;45;CKB +LINE_4;Station-11;2022-03-14 04:43:00;2022-03-14 04:58:00;Station-13;6161;0;45;CKB +LINE_4;Station-13;2022-03-14 04:58:00;2022-03-14 04:58:00;Station-0;0.06;0;45;CKB +LINE_20;Station-0;2022-03-07 00:32:00;2022-03-07 00:32:00;Station-13;0.06;0;46;CKB +LINE_20;Station-13;2022-03-07 00:32:00;2022-03-07 00:44:00;Station-40;4212;3;46;CKB +LINE_20;Station-40;2022-03-07 00:47:00;2022-03-07 01:16:00;Station-41;13048;0;46;CKB +LINE_20;Station-41;2022-03-07 01:16:00;2022-03-07 01:42:00;Station-40;12869;5;46;CKB +LINE_20;Station-40;2022-03-07 01:47:00;2022-03-07 02:16:00;Station-41;13048;0;46;CKB +LINE_20;Station-41;2022-03-07 02:16:00;2022-03-07 02:42:00;Station-40;12869;5;46;CKB +LINE_20;Station-40;2022-03-07 02:47:00;2022-03-07 03:16:00;Station-41;13048;0;46;CKB +LINE_20;Station-41;2022-03-07 03:16:00;2022-03-07 03:42:00;Station-40;12869;5;46;CKB +LINE_20;Station-40;2022-03-07 03:47:00;2022-03-07 04:16:00;Station-41;13048;0;46;CKB +LINE_20;Station-41;2022-03-07 04:16:00;2022-03-07 04:34:00;Station-42;9538;0;46;CKB +LINE_20;Station-42;2022-03-07 04:34:00;2022-03-07 04:34:00;Station-0;0.06;0;46;CKB +LINE_20;Station-0;2022-03-07 00:17:00;2022-03-07 00:17:00;Station-40;0.06;0;47;CKB +LINE_20;Station-40;2022-03-07 00:17:00;2022-03-07 00:46:00;Station-41;13048;0;47;CKB +LINE_20;Station-41;2022-03-07 00:46:00;2022-03-07 01:12:00;Station-40;12869;5;47;CKB +LINE_20;Station-40;2022-03-07 01:17:00;2022-03-07 01:46:00;Station-41;13048;0;47;CKB +LINE_20;Station-41;2022-03-07 01:46:00;2022-03-07 02:12:00;Station-40;12869;5;47;CKB +LINE_20;Station-40;2022-03-07 02:17:00;2022-03-07 02:46:00;Station-41;13048;0;47;CKB +LINE_20;Station-41;2022-03-07 02:46:00;2022-03-07 03:12:00;Station-40;12869;5;47;CKB +LINE_20;Station-40;2022-03-07 03:17:00;2022-03-07 03:46:00;Station-41;13048;0;47;CKB +LINE_20;Station-41;2022-03-07 03:46:00;2022-03-07 04:12:00;Station-40;12869;5;47;CKB +LINE_20;Station-40;2022-03-07 04:17:00;2022-03-07 04:28:00;Station-13;4316;0;47;CKB +LINE_20;Station-13;2022-03-07 04:28:00;2022-03-07 04:28:00;Station-0;0.06;0;47;CKB +LINE_8;Station-0;2022-03-07 00:32:00;2022-03-07 00:32:00;Station-13;0.06;0;48;CKB +LINE_8;Station-13;2022-03-07 00:32:00;2022-03-07 00:57:00;Station-21;11545;6;48;CKB +LINE_8;Station-21;2022-03-07 01:03:00;2022-03-07 01:46:00;Station-20;20579;1;48;CKB +LINE_8;Station-20;2022-03-07 01:47:00;2022-03-07 02:25:00;Station-21;20641;8;48;CKB +LINE_8;Station-21;2022-03-07 02:33:00;2022-03-07 03:16:00;Station-20;20579;1;48;CKB +LINE_8;Station-20;2022-03-07 03:17:00;2022-03-07 03:55:00;Station-21;20641;8;48;CKB +LINE_8;Station-21;2022-03-07 04:03:00;2022-03-07 04:28:00;Station-13;11499;0;48;CKB +LINE_8;Station-13;2022-03-07 04:28:00;2022-03-07 04:28:00;Station-0;0.06;0;48;CKB +LINE_8;Station-0;2022-03-07 00:33:00;2022-03-07 00:33:00;Station-21;0.06;0;49;CKB +LINE_8;Station-21;2022-03-07 00:33:00;2022-03-07 01:16:00;Station-20;20579;1;49;CKB +LINE_8;Station-20;2022-03-07 01:17:00;2022-03-07 01:55:00;Station-21;20641;8;49;CKB +LINE_8;Station-21;2022-03-07 02:03:00;2022-03-07 02:46:00;Station-20;20579;1;49;CKB +LINE_8;Station-20;2022-03-07 02:47:00;2022-03-07 03:25:00;Station-21;20641;8;49;CKB +LINE_8;Station-21;2022-03-07 03:33:00;2022-03-07 04:16:00;Station-20;20579;1;49;CKB +LINE_8;Station-20;2022-03-07 04:17:00;2022-03-07 04:51:00;Station-44;18752;0;49;CKB +LINE_8;Station-44;2022-03-07 04:51:00;2022-03-07 04:51:00;Station-0;0.06;0;49;CKB +LINE_7;Station-0;2022-03-07 00:08:00;2022-03-07 00:08:00;Station-18;0.06;0;50;CKB +LINE_7;Station-18;2022-03-07 00:08:00;2022-03-07 00:27:00;Station-19;7827;0;50;CKB +LINE_8;Station-19;2022-03-07 00:27:00;2022-03-07 00:48:00;Station-20;11079;0;50;CKB +LINE_8;Station-20;2022-03-07 00:48:00;2022-03-07 01:25:00;Station-21;20641;8;50;CKB +LINE_8;Station-21;2022-03-07 01:33:00;2022-03-07 02:16:00;Station-20;20579;1;50;CKB +LINE_8;Station-20;2022-03-07 02:17:00;2022-03-07 02:55:00;Station-21;20641;8;50;CKB +LINE_8;Station-21;2022-03-07 03:03:00;2022-03-07 03:46:00;Station-20;20579;1;50;CKB +LINE_8;Station-20;2022-03-07 03:47:00;2022-03-07 04:25:00;Station-21;20641;0;50;CKB +LINE_8;Station-21;2022-03-07 04:25:00;2022-03-07 04:25:00;Station-0;0.06;0;50;CKB +LINE_23;Station-0;2022-03-07 00:30:00;2022-03-07 00:30:00;Station-46;0.06;0;51;CKB +LINE_23;Station-46;2022-03-07 00:30:00;2022-03-07 00:57:00;Station-45;10083;7;51;CKB +LINE_23;Station-45;2022-03-07 01:04:00;2022-03-07 01:30:00;Station-46;9016;0;51;CKB +LINE_23;Station-46;2022-03-07 01:30:00;2022-03-07 01:57:00;Station-45;10083;7;51;CKB +LINE_23;Station-45;2022-03-07 02:04:00;2022-03-07 02:30:00;Station-46;9016;0;51;CKB +LINE_23;Station-46;2022-03-07 02:30:00;2022-03-07 02:57:00;Station-45;10083;7;51;CKB +LINE_23;Station-45;2022-03-07 03:04:00;2022-03-07 03:30:00;Station-46;9016;0;51;CKB +LINE_23;Station-46;2022-03-07 03:30:00;2022-03-07 03:57:00;Station-45;10083;7;51;CKB +LINE_23;Station-45;2022-03-07 04:04:00;2022-03-07 04:30:00;Station-46;9016;0;51;CKB +LINE_23;Station-46;2022-03-07 04:30:00;2022-03-07 04:57:00;Station-45;10083;0;51;CKB +LINE_23;Station-45;2022-03-07 04:57:00;2022-03-07 04:57:00;Station-0;0.06;0;51;CKB +LINE_23;Station-0;2022-03-07 00:34:00;2022-03-07 00:34:00;Station-45;0.06;0;52;CKB +LINE_23;Station-45;2022-03-07 00:34:00;2022-03-07 01:00:00;Station-46;9016;0;52;CKB +LINE_23;Station-46;2022-03-07 01:00:00;2022-03-07 01:27:00;Station-45;10083;7;52;CKB +LINE_23;Station-45;2022-03-07 01:34:00;2022-03-07 02:00:00;Station-46;9016;0;52;CKB +LINE_23;Station-46;2022-03-07 02:00:00;2022-03-07 02:27:00;Station-45;10083;7;52;CKB +LINE_23;Station-45;2022-03-07 02:34:00;2022-03-07 03:00:00;Station-46;9016;0;52;CKB +LINE_23;Station-46;2022-03-07 03:00:00;2022-03-07 03:27:00;Station-45;10083;7;52;CKB +LINE_23;Station-45;2022-03-07 03:34:00;2022-03-07 04:00:00;Station-46;9016;0;52;CKB +LINE_23;Station-46;2022-03-07 04:00:00;2022-03-07 04:27:00;Station-45;10083;0;52;CKB +LINE_23;Station-45;2022-03-07 04:27:00;2022-03-07 04:27:00;Station-0;0.06;0;52;CKB +LINE_24;Station-0;2022-03-07 00:31:00;2022-03-07 00:31:00;Station-21;0.06;0;53;CKB +LINE_24;Station-21;2022-03-07 00:31:00;2022-03-07 00:44:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 00:44:00;2022-03-07 00:56:00;Station-21;5362;5;53;CKB +LINE_24;Station-21;2022-03-07 01:01:00;2022-03-07 01:14:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 01:14:00;2022-03-07 01:26:00;Station-21;5362;5;53;CKB +LINE_24;Station-21;2022-03-07 01:31:00;2022-03-07 01:44:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 01:44:00;2022-03-07 01:56:00;Station-21;5362;5;53;CKB +LINE_24;Station-21;2022-03-07 02:01:00;2022-03-07 02:14:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 02:14:00;2022-03-07 02:26:00;Station-21;5362;5;53;CKB +LINE_24;Station-21;2022-03-07 02:31:00;2022-03-07 02:44:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 02:44:00;2022-03-07 02:56:00;Station-21;5362;5;53;CKB +LINE_24;Station-21;2022-03-07 03:01:00;2022-03-07 03:14:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 03:14:00;2022-03-07 03:26:00;Station-21;5362;5;53;CKB +LINE_24;Station-21;2022-03-07 03:31:00;2022-03-07 03:44:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 03:44:00;2022-03-07 03:56:00;Station-21;5362;5;53;CKB +LINE_24;Station-21;2022-03-07 04:01:00;2022-03-07 04:14:00;Station-47;4872;0;53;CKB +LINE_24;Station-47;2022-03-07 04:14:00;2022-03-07 04:26:00;Station-21;5362;0;53;CKB +LINE_24;Station-21;2022-03-07 04:26:00;2022-03-07 04:26:00;Station-0;0.06;0;53;CKB +LINE_25;Station-0;2022-03-07 00:31:00;2022-03-07 00:31:00;Station-21;0.06;0;54;CKB +LINE_25;Station-21;2022-03-07 00:31:00;2022-03-07 00:45:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 00:47:00;2022-03-07 01:01:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 01:01:00;2022-03-07 01:15:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 01:17:00;2022-03-07 01:31:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 01:31:00;2022-03-07 01:45:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 01:47:00;2022-03-07 02:01:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 02:01:00;2022-03-07 02:15:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 02:17:00;2022-03-07 02:31:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 02:31:00;2022-03-07 02:45:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 02:47:00;2022-03-07 03:01:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 03:01:00;2022-03-07 03:15:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 03:17:00;2022-03-07 03:31:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 03:31:00;2022-03-07 03:45:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 03:47:00;2022-03-07 04:01:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 04:01:00;2022-03-07 04:15:00;Station-48;5225;2;54;CKB +LINE_25;Station-48;2022-03-07 04:17:00;2022-03-07 04:31:00;Station-21;7617;0;54;CKB +LINE_25;Station-21;2022-03-07 04:31:00;2022-03-07 04:31:00;Station-0;0.06;0;54;CKB +LINE_26;Station-0;2022-03-07 00:43:00;2022-03-07 00:43:00;Station-49;0.06;0;55;CKB +LINE_26;Station-49;2022-03-07 00:43:00;2022-03-07 00:53:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 00:53:00;2022-03-07 01:03:00;Station-49;4408;10;55;CKB +LINE_26;Station-49;2022-03-07 01:13:00;2022-03-07 01:23:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 01:23:00;2022-03-07 01:33:00;Station-49;4408;10;55;CKB +LINE_26;Station-49;2022-03-07 01:43:00;2022-03-07 01:53:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 01:53:00;2022-03-07 02:03:00;Station-49;4408;10;55;CKB +LINE_26;Station-49;2022-03-07 02:13:00;2022-03-07 02:23:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 02:23:00;2022-03-07 02:33:00;Station-49;4408;10;55;CKB +LINE_26;Station-49;2022-03-07 02:43:00;2022-03-07 02:53:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 02:53:00;2022-03-07 03:03:00;Station-49;4408;10;55;CKB +LINE_26;Station-49;2022-03-07 03:13:00;2022-03-07 03:23:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 03:23:00;2022-03-07 03:33:00;Station-49;4408;10;55;CKB +LINE_26;Station-49;2022-03-07 03:43:00;2022-03-07 03:53:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 03:53:00;2022-03-07 04:03:00;Station-49;4408;10;55;CKB +LINE_26;Station-49;2022-03-07 04:13:00;2022-03-07 04:23:00;Station-50;4507;0;55;CKB +LINE_26;Station-50;2022-03-07 04:23:00;2022-03-07 04:33:00;Station-49;4408;0;55;CKB +LINE_26;Station-49;2022-03-07 04:33:00;2022-03-07 04:33:00;Station-0;0.06;0;55;CKB +LINE_27;Station-0;2022-03-13 15:46:00;2022-03-13 15:46:00;Station-14;0.06;0;56;CKB +LINE_27;Station-14;2022-03-13 15:46:00;2022-03-13 15:53:00;Station-51;3147;12;56;CKB +LINE_27;Station-51;2022-03-13 16:05:00;2022-03-13 16:15:00;Station-14;3469;0;56;CKB +LINE_27;Station-14;2022-03-13 16:15:00;2022-03-13 16:23:00;Station-51;3351;12;56;CKB +LINE_27;Station-51;2022-03-13 16:35:00;2022-03-13 16:45:00;Station-14;3469;0;56;CKB +LINE_27;Station-14;2022-03-13 16:45:00;2022-03-13 16:53:00;Station-51;3351;12;56;CKB +LINE_27;Station-51;2022-03-13 17:05:00;2022-03-13 17:15:00;Station-14;3469;0;56;CKB +LINE_27;Station-14;2022-03-13 17:15:00;2022-03-13 17:23:00;Station-51;3351;12;56;CKB +LINE_27;Station-51;2022-03-13 17:35:00;2022-03-13 17:45:00;Station-14;3469;0;56;CKB +LINE_27;Station-14;2022-03-13 17:45:00;2022-03-13 17:53:00;Station-51;3351;12;56;CKB +LINE_27;Station-51;2022-03-13 18:05:00;2022-03-13 18:15:00;Station-14;3469;0;56;CKB +LINE_27;Station-14;2022-03-13 18:15:00;2022-03-13 18:23:00;Station-51;3351;0;56;CKB +LINE_28;Station-51;2022-03-13 18:23:00;2022-03-13 18:29:00;Station-14;3.1;22;56;CKB +LINE_28;Station-14;2022-03-13 18:51:00;2022-03-13 19:02:00;Station-52;4338;0;56;CKB +LINE_28;Station-52;2022-03-13 19:02:00;2022-03-13 19:13:00;Station-14;4427;12;56;CKB +LINE_5;Station-14;2022-03-13 19:25:00;2022-03-13 19:38:00;Station-15;6086;3;56;CKB +LINE_5;Station-15;2022-03-13 19:41:00;2022-03-13 19:55:00;Station-14;6232;0;56;CKB +LINE_5;Station-14;2022-03-13 19:55:00;2022-03-13 20:08:00;Station-15;6086;3;56;CKB +LINE_5;Station-15;2022-03-13 20:11:00;2022-03-13 20:25:00;Station-14;6232;6;56;CKB +LINE_28;Station-14;2022-03-13 20:31:00;2022-03-13 20:42:00;Station-52;4338;0;56;CKB +LINE_28;Station-52;2022-03-13 20:42:00;2022-03-13 20:53:00;Station-14;4427;18;56;CKB +LINE_28;Station-14;2022-03-13 21:11:00;2022-03-13 21:22:00;Station-52;4338;0;56;CKB +LINE_28;Station-52;2022-03-13 21:22:00;2022-03-13 21:33:00;Station-14;4427;18;56;CKB +LINE_28;Station-14;2022-03-13 21:51:00;2022-03-13 22:02:00;Station-52;4338;0;56;CKB +LINE_28;Station-52;2022-03-13 22:02:00;2022-03-13 22:13:00;Station-14;4427;18;56;CKB +LINE_28;Station-14;2022-03-13 22:31:00;2022-03-13 22:42:00;Station-52;4338;0;56;CKB +LINE_28;Station-52;2022-03-13 22:42:00;2022-03-13 22:53:00;Station-14;4427;2;56;CKB +LINE_5;Station-14;2022-03-13 22:55:00;2022-03-13 23:08:00;Station-15;6086;3;56;CKB +LINE_5;Station-15;2022-03-13 23:11:00;2022-03-13 23:25:00;Station-14;6232;0;56;CKB +LINE_5;Station-14;2022-03-13 23:25:00;2022-03-13 23:38:00;Station-15;6086;3;56;CKB +LINE_5;Station-15;2022-03-13 23:41:00;2022-03-13 23:55:00;Station-14;6232;0;56;CKB +LINE_5;Station-14;2022-03-13 23:55:00;2022-03-14 00:08:00;Station-15;6086;0;56;CKB +LINE_5;Station-15;2022-03-14 00:08:00;2022-03-14 00:08:00;Station-0;0.06;0;56;CKB +LINE_6;Station-0;2022-03-13 07:05:00;2022-03-13 07:05:00;Station-16;0.06;0;57;CKB +LINE_6;Station-16;2022-03-13 07:05:00;2022-03-13 07:14:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 07:14:00;2022-03-13 07:23:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 07:25:00;2022-03-13 07:34:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 07:34:00;2022-03-13 07:43:00;Station-16;5139;22;57;CKB +LINE_6;Station-16;2022-03-13 08:05:00;2022-03-13 08:14:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 08:14:00;2022-03-13 08:23:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 08:25:00;2022-03-13 08:34:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 08:34:00;2022-03-13 08:43:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 08:45:00;2022-03-13 08:54:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 08:54:00;2022-03-13 09:03:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 09:05:00;2022-03-13 09:14:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 09:14:00;2022-03-13 09:23:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 09:25:00;2022-03-13 09:34:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 09:34:00;2022-03-13 09:43:00;Station-16;5139;23;57;CKB +LINE_6;Station-16;2022-03-13 10:06:00;2022-03-13 10:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 10:15:00;2022-03-13 10:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 10:26:00;2022-03-13 10:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 10:35:00;2022-03-13 10:44:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 10:46:00;2022-03-13 10:55:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 10:55:00;2022-03-13 11:04:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 11:06:00;2022-03-13 11:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 11:15:00;2022-03-13 11:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 11:26:00;2022-03-13 11:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 11:35:00;2022-03-13 11:44:00;Station-16;5139;22;57;CKB +LINE_6;Station-16;2022-03-13 12:06:00;2022-03-13 12:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 12:15:00;2022-03-13 12:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 12:26:00;2022-03-13 12:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 12:35:00;2022-03-13 12:44:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 12:46:00;2022-03-13 12:55:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 12:55:00;2022-03-13 13:04:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 13:06:00;2022-03-13 13:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 13:15:00;2022-03-13 13:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 13:26:00;2022-03-13 13:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 13:35:00;2022-03-13 13:44:00;Station-16;5139;22;57;CKB +LINE_6;Station-16;2022-03-13 14:06:00;2022-03-13 14:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 14:15:00;2022-03-13 14:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 14:26:00;2022-03-13 14:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 14:35:00;2022-03-13 14:44:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 14:46:00;2022-03-13 14:55:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 14:55:00;2022-03-13 15:04:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 15:06:00;2022-03-13 15:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 15:15:00;2022-03-13 15:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 15:26:00;2022-03-13 15:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 15:35:00;2022-03-13 15:44:00;Station-16;5139;22;57;CKB +LINE_6;Station-16;2022-03-13 16:06:00;2022-03-13 16:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 16:15:00;2022-03-13 16:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 16:26:00;2022-03-13 16:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 16:35:00;2022-03-13 16:44:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 16:46:00;2022-03-13 16:55:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 16:55:00;2022-03-13 17:04:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 17:06:00;2022-03-13 17:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 17:15:00;2022-03-13 17:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 17:26:00;2022-03-13 17:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 17:35:00;2022-03-13 17:44:00;Station-16;5139;22;57;CKB +LINE_6;Station-16;2022-03-13 18:06:00;2022-03-13 18:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 18:15:00;2022-03-13 18:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 18:26:00;2022-03-13 18:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 18:35:00;2022-03-13 18:44:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 18:46:00;2022-03-13 18:55:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 18:55:00;2022-03-13 19:04:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 19:06:00;2022-03-13 19:15:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 19:15:00;2022-03-13 19:24:00;Station-16;5139;2;57;CKB +LINE_6;Station-16;2022-03-13 19:26:00;2022-03-13 19:35:00;Station-17;4781;0;57;CKB +LINE_6;Station-17;2022-03-13 19:35:00;2022-03-13 19:44:00;Station-16;5139;21;57;CKB +LINE_6;Station-16;2022-03-13 20:05:00;2022-03-13 20:14:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 20:15:00;2022-03-13 20:24:00;Station-16;5139;1;57;CKB +LINE_6;Station-16;2022-03-13 20:25:00;2022-03-13 20:34:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 20:35:00;2022-03-13 20:44:00;Station-16;5139;1;57;CKB +LINE_6;Station-16;2022-03-13 20:45:00;2022-03-13 20:54:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 20:55:00;2022-03-13 21:04:00;Station-16;5139;1;57;CKB +LINE_6;Station-16;2022-03-13 21:05:00;2022-03-13 21:14:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 21:15:00;2022-03-13 21:24:00;Station-16;5139;1;57;CKB +LINE_6;Station-16;2022-03-13 21:25:00;2022-03-13 21:34:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 21:35:00;2022-03-13 21:44:00;Station-16;5139;21;57;CKB +LINE_6;Station-16;2022-03-13 22:05:00;2022-03-13 22:14:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 22:15:00;2022-03-13 22:24:00;Station-16;5139;1;57;CKB +LINE_6;Station-16;2022-03-13 22:25:00;2022-03-13 22:34:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 22:35:00;2022-03-13 22:44:00;Station-16;5139;1;57;CKB +LINE_6;Station-16;2022-03-13 22:45:00;2022-03-13 22:54:00;Station-17;4781;1;57;CKB +LINE_6;Station-17;2022-03-13 22:55:00;2022-03-13 23:04:00;Station-16;5139;0;57;CKB +LINE_6;Station-16;2022-03-13 23:04:00;2022-03-13 23:04:00;Station-0;0.06;0;57;CKB +LINE_29;Station-0;2022-03-13 07:30:00;2022-03-13 07:30:00;Station-53;0.06;0;58;CKB +LINE_29;Station-53;2022-03-13 07:30:00;2022-03-13 07:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 07:39:00;2022-03-13 07:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 07:50:00;2022-03-13 07:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 07:59:00;2022-03-13 08:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 08:10:00;2022-03-13 08:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 08:19:00;2022-03-13 08:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 08:30:00;2022-03-13 08:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 08:39:00;2022-03-13 08:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 08:50:00;2022-03-13 08:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 08:59:00;2022-03-13 09:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 09:10:00;2022-03-13 09:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 09:19:00;2022-03-13 09:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 09:30:00;2022-03-13 09:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 09:39:00;2022-03-13 09:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 09:50:00;2022-03-13 09:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 09:59:00;2022-03-13 10:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 10:10:00;2022-03-13 10:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 10:19:00;2022-03-13 10:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 10:30:00;2022-03-13 10:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 10:39:00;2022-03-13 10:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 10:50:00;2022-03-13 10:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 10:59:00;2022-03-13 11:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 11:10:00;2022-03-13 11:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 11:19:00;2022-03-13 11:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 11:30:00;2022-03-13 11:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 11:39:00;2022-03-13 11:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 11:50:00;2022-03-13 11:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 11:59:00;2022-03-13 12:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 12:10:00;2022-03-13 12:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 12:19:00;2022-03-13 12:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 12:30:00;2022-03-13 12:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 12:39:00;2022-03-13 12:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 12:50:00;2022-03-13 12:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 12:59:00;2022-03-13 13:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 13:10:00;2022-03-13 13:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 13:19:00;2022-03-13 13:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 13:30:00;2022-03-13 13:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 13:39:00;2022-03-13 13:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 13:50:00;2022-03-13 13:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 13:59:00;2022-03-13 14:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 14:10:00;2022-03-13 14:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 14:19:00;2022-03-13 14:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 14:30:00;2022-03-13 14:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 14:39:00;2022-03-13 14:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 14:50:00;2022-03-13 14:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 14:59:00;2022-03-13 15:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 15:10:00;2022-03-13 15:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 15:19:00;2022-03-13 15:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 15:30:00;2022-03-13 15:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 15:39:00;2022-03-13 15:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 15:50:00;2022-03-13 15:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 15:59:00;2022-03-13 16:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 16:10:00;2022-03-13 16:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 16:19:00;2022-03-13 16:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 16:30:00;2022-03-13 16:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 16:39:00;2022-03-13 16:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 16:50:00;2022-03-13 16:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 16:59:00;2022-03-13 17:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 17:10:00;2022-03-13 17:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 17:19:00;2022-03-13 17:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 17:30:00;2022-03-13 17:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 17:39:00;2022-03-13 17:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 17:50:00;2022-03-13 17:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 17:59:00;2022-03-13 18:10:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 18:10:00;2022-03-13 18:15:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 18:19:00;2022-03-13 18:30:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 18:30:00;2022-03-13 18:35:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 18:39:00;2022-03-13 18:50:00;Station-53;4341;0;58;CKB +LINE_29;Station-53;2022-03-13 18:50:00;2022-03-13 18:55:00;Station-54;2217;4;58;CKB +LINE_29;Station-54;2022-03-13 18:59:00;2022-03-13 19:10:00;Station-53;4288;0;58;CKB +LINE_29;Station-53;2022-03-13 19:10:00;2022-03-13 19:10:00;Station-0;0.06;0;58;CKB +LINE_10;Station-0;2022-03-13 07:56:00;2022-03-13 07:56:00;Station-24;0.06;0;59;CKB +LINE_10;Station-24;2022-03-13 07:56:00;2022-03-13 07:56:00;Station-24;0.0;792;59;CKB +LINE_10;Station-24;2022-03-13 21:08:00;2022-03-13 21:08:00;Station-24;0.0;0;59;CKB +LINE_10;Station-24;2022-03-13 21:08:00;2022-03-13 21:08:00;Station-0;0.06;0;59;CKB +LINE_30;Station-0;2022-03-13 07:18:00;2022-03-13 07:18:00;Station-55;0.06;0;60;CKB +LINE_30;Station-55;2022-03-13 07:18:00;2022-03-13 07:26:00;Station-56;5562;10;60;CKB +LINE_30;Station-56;2022-03-13 07:36:00;2022-03-13 07:45:00;Station-57;5941;32;60;CKB +LINE_30;Station-57;2022-03-13 08:17:00;2022-03-13 08:26:00;Station-56;5994;10;60;CKB +LINE_30;Station-56;2022-03-13 08:36:00;2022-03-13 08:45:00;Station-57;5941;32;60;CKB +LINE_30;Station-57;2022-03-13 09:17:00;2022-03-13 09:26:00;Station-56;5994;8;60;CKB +LINE_30;Station-56;2022-03-13 09:34:00;2022-03-13 09:43:00;Station-57;5941;36;60;CKB +LINE_30;Station-57;2022-03-13 10:19:00;2022-03-13 10:30:00;Station-56;5994;2;60;CKB +LINE_30;Station-56;2022-03-13 10:32:00;2022-03-13 10:41:00;Station-55;5566;0;60;CKB +LINE_30;Station-55;2022-03-13 10:41:00;2022-03-13 10:41:00;Station-0;0.06;0;60;CKB +LINE_0;Station-0;2022-03-08 21:31:00;2022-03-08 21:31:00;Station-1;0.06;0;61;CKB +LINE_0;Station-1;2022-03-08 21:31:00;2022-03-08 22:04:00;Station-2;14519;4;61;CKB +LINE_0;Station-2;2022-03-08 22:08:00;2022-03-08 22:43:00;Station-1;13541;8;61;CKB +LINE_0;Station-1;2022-03-08 22:51:00;2022-03-08 23:24:00;Station-2;14519;4;61;CKB +LINE_0;Station-2;2022-03-08 23:28:00;2022-03-09 00:03:00;Station-1;13541;8;61;CKB +LINE_0;Station-1;2022-03-09 00:11:00;2022-03-09 00:44:00;Station-2;14519;0;61;CKB +LINE_1;Station-2;2022-03-09 00:44:00;2022-03-09 00:54:00;Station-3;4.1;25;61;CKB +LINE_1;Station-3;2022-03-09 01:19:00;2022-03-09 01:42:00;Station-4;8.36;6;61;CKB +LINE_1;Station-4;2022-03-09 01:48:00;2022-03-09 02:06:00;Station-3;9067;13;61;CKB +LINE_1;Station-3;2022-03-09 02:19:00;2022-03-09 02:42:00;Station-4;8.36;6;61;CKB +LINE_1;Station-4;2022-03-09 02:48:00;2022-03-09 03:06:00;Station-3;9067;13;61;CKB +LINE_1;Station-3;2022-03-09 03:19:00;2022-03-09 03:42:00;Station-4;8.36;6;61;CKB +LINE_1;Station-4;2022-03-09 03:48:00;2022-03-09 04:06:00;Station-3;9067;0;61;CKB +LINE_1;Station-3;2022-03-09 04:06:00;2022-03-09 04:06:00;Station-0;0.06;0;61;CKB +LINE_0;Station-0;2022-03-08 22:11:00;2022-03-08 22:11:00;Station-1;0.06;0;62;CKB +LINE_0;Station-1;2022-03-08 22:11:00;2022-03-08 22:44:00;Station-2;14519;4;62;CKB +LINE_0;Station-2;2022-03-08 22:48:00;2022-03-08 23:23:00;Station-1;13541;8;62;CKB +LINE_0;Station-1;2022-03-08 23:31:00;2022-03-09 00:04:00;Station-2;14519;4;62;CKB +LINE_0;Station-2;2022-03-09 00:08:00;2022-03-09 00:39:00;Station-5;12213;0;62;CKB +LINE_1;Station-5;2022-03-09 00:39:00;2022-03-09 00:47:00;Station-3;4.0;2;62;CKB +LINE_1;Station-3;2022-03-09 00:49:00;2022-03-09 01:12:00;Station-4;8.36;6;62;CKB +LINE_1;Station-4;2022-03-09 01:18:00;2022-03-09 01:36:00;Station-3;9067;13;62;CKB +LINE_1;Station-3;2022-03-09 01:49:00;2022-03-09 02:12:00;Station-4;8.36;6;62;CKB +LINE_1;Station-4;2022-03-09 02:18:00;2022-03-09 02:36:00;Station-3;9067;13;62;CKB +LINE_1;Station-3;2022-03-09 02:49:00;2022-03-09 03:12:00;Station-4;8.36;6;62;CKB +LINE_1;Station-4;2022-03-09 03:18:00;2022-03-09 03:36:00;Station-3;9067;13;62;CKB +LINE_1;Station-3;2022-03-09 03:49:00;2022-03-09 04:12:00;Station-4;8.36;0;62;CKB +LINE_1;Station-4;2022-03-09 04:12:00;2022-03-09 04:12:00;Station-0;0.06;0;62;CKB +LINE_2;Station-0;2022-03-08 21:06:00;2022-03-08 21:06:00;Station-6;0.06;0;63;CKB +LINE_2;Station-6;2022-03-08 21:06:00;2022-03-08 21:34:00;Station-7;13018;19;63;CKB +LINE_2;Station-7;2022-03-08 21:53:00;2022-03-08 22:13:00;Station-8;10332;17;63;CKB +LINE_2;Station-8;2022-03-08 22:30:00;2022-03-08 22:54:00;Station-7;10.48;19;63;CKB +LINE_2;Station-7;2022-03-08 23:13:00;2022-03-08 23:33:00;Station-8;10332;17;63;CKB +LINE_2;Station-8;2022-03-08 23:50:00;2022-03-09 00:14:00;Station-7;10.48;2;63;CKB +LINE_2;Station-7;2022-03-09 00:16:00;2022-03-09 00:23:00;Station-9;3709;5;63;CKB +LINE_3;Station-9;2022-03-09 00:28:00;2022-03-09 00:44:00;Station-10;6404;3;63;CKB +LINE_3;Station-10;2022-03-09 00:47:00;2022-03-09 01:10:00;Station-11;10579;7;63;CKB +LINE_3;Station-11;2022-03-09 01:17:00;2022-03-09 01:44:00;Station-10;12007;3;63;CKB +LINE_3;Station-10;2022-03-09 01:47:00;2022-03-09 02:10:00;Station-11;10579;7;63;CKB +LINE_3;Station-11;2022-03-09 02:17:00;2022-03-09 02:44:00;Station-10;12007;3;63;CKB +LINE_3;Station-10;2022-03-09 02:47:00;2022-03-09 03:10:00;Station-11;10579;7;63;CKB +LINE_3;Station-11;2022-03-09 03:17:00;2022-03-09 03:44:00;Station-10;12007;3;63;CKB +LINE_3;Station-10;2022-03-09 03:47:00;2022-03-09 04:10:00;Station-11;10579;7;63;CKB +LINE_3;Station-11;2022-03-09 04:17:00;2022-03-09 04:44:00;Station-10;12007;0;63;CKB +LINE_3;Station-10;2022-03-09 04:44:00;2022-03-09 04:44:00;Station-0;0.06;0;63;CKB +LINE_2;Station-0;2022-03-08 20:26:00;2022-03-08 20:26:00;Station-6;0.06;0;64;CKB +LINE_2;Station-6;2022-03-08 20:26:00;2022-03-08 20:56:00;Station-12;14097;14;64;CKB +LINE_2;Station-12;2022-03-08 21:10:00;2022-03-08 21:38:00;Station-6;13.19;8;64;CKB +LINE_2;Station-6;2022-03-08 21:46:00;2022-03-08 22:14:00;Station-7;13018;19;64;CKB +LINE_2;Station-7;2022-03-08 22:33:00;2022-03-08 22:53:00;Station-8;10332;17;64;CKB +LINE_2;Station-8;2022-03-08 23:10:00;2022-03-08 23:34:00;Station-7;10.48;19;64;CKB +LINE_2;Station-7;2022-03-08 23:53:00;2022-03-09 00:13:00;Station-8;10332;2;64;CKB +LINE_2;Station-8;2022-03-09 00:15:00;2022-03-09 00:16:00;Station-10;506;1;64;CKB +LINE_3;Station-10;2022-03-09 00:17:00;2022-03-09 00:40:00;Station-11;10579;7;64;CKB +LINE_3;Station-11;2022-03-09 00:47:00;2022-03-09 01:14:00;Station-10;12007;3;64;CKB +LINE_3;Station-10;2022-03-09 01:17:00;2022-03-09 01:40:00;Station-11;10579;7;64;CKB +LINE_3;Station-11;2022-03-09 01:47:00;2022-03-09 02:14:00;Station-10;12007;3;64;CKB +LINE_3;Station-10;2022-03-09 02:17:00;2022-03-09 02:40:00;Station-11;10579;7;64;CKB +LINE_3;Station-11;2022-03-09 02:47:00;2022-03-09 03:14:00;Station-10;12007;3;64;CKB +LINE_3;Station-10;2022-03-09 03:17:00;2022-03-09 03:40:00;Station-11;10579;7;64;CKB +LINE_3;Station-11;2022-03-09 03:47:00;2022-03-09 04:14:00;Station-10;12007;3;64;CKB +LINE_3;Station-10;2022-03-09 04:17:00;2022-03-09 04:40:00;Station-11;10579;3;64;CKB +LINE_4;Station-11;2022-03-09 04:43:00;2022-03-09 04:58:00;Station-13;6161;0;64;CKB +LINE_4;Station-13;2022-03-09 04:58:00;2022-03-09 04:58:00;Station-0;0.06;0;64;CKB +LINE_5;Station-0;2022-03-08 22:56:00;2022-03-08 22:56:00;Station-14;0.06;0;65;CKB +LINE_5;Station-14;2022-03-08 22:56:00;2022-03-08 23:08:00;Station-15;5882;3;65;CKB +LINE_5;Station-15;2022-03-08 23:11:00;2022-03-08 23:25:00;Station-14;6232;0;65;CKB +LINE_5;Station-14;2022-03-08 23:25:00;2022-03-08 23:38:00;Station-15;6086;3;65;CKB +LINE_5;Station-15;2022-03-08 23:41:00;2022-03-08 23:55:00;Station-14;6232;0;65;CKB +LINE_5;Station-14;2022-03-08 23:55:00;2022-03-09 00:08:00;Station-15;6086;0;65;CKB +LINE_5;Station-15;2022-03-09 00:08:00;2022-03-09 00:08:00;Station-0;0.06;0;65;CKB +LINE_6;Station-0;2022-03-08 05:05:00;2022-03-08 05:05:00;Station-16;0.06;0;66;CKB +LINE_6;Station-16;2022-03-08 05:05:00;2022-03-08 05:14:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 05:14:00;2022-03-08 05:23:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 05:25:00;2022-03-08 05:34:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 05:34:00;2022-03-08 05:43:00;Station-16;5139;23;66;CKB +LINE_6;Station-16;2022-03-08 06:06:00;2022-03-08 06:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 06:15:00;2022-03-08 06:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 06:26:00;2022-03-08 06:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 06:35:00;2022-03-08 06:44:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 06:46:00;2022-03-08 06:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 06:55:00;2022-03-08 07:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 07:06:00;2022-03-08 07:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 07:15:00;2022-03-08 07:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 07:26:00;2022-03-08 07:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 07:35:00;2022-03-08 07:44:00;Station-16;5139;22;66;CKB +LINE_6;Station-16;2022-03-08 08:06:00;2022-03-08 08:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 08:15:00;2022-03-08 08:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 08:26:00;2022-03-08 08:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 08:35:00;2022-03-08 08:44:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 08:46:00;2022-03-08 08:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 08:55:00;2022-03-08 09:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 09:06:00;2022-03-08 09:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 09:15:00;2022-03-08 09:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 09:26:00;2022-03-08 09:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 09:35:00;2022-03-08 09:44:00;Station-16;5139;22;66;CKB +LINE_6;Station-16;2022-03-08 10:06:00;2022-03-08 10:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 10:15:00;2022-03-08 10:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 10:26:00;2022-03-08 10:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 10:35:00;2022-03-08 10:44:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 10:46:00;2022-03-08 10:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 10:55:00;2022-03-08 11:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 11:06:00;2022-03-08 11:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 11:15:00;2022-03-08 11:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 11:26:00;2022-03-08 11:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 11:35:00;2022-03-08 11:44:00;Station-16;5139;22;66;CKB +LINE_6;Station-16;2022-03-08 12:06:00;2022-03-08 12:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 12:15:00;2022-03-08 12:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 12:26:00;2022-03-08 12:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 12:35:00;2022-03-08 12:44:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 12:46:00;2022-03-08 12:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 12:55:00;2022-03-08 13:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 13:06:00;2022-03-08 13:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 13:15:00;2022-03-08 13:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 13:26:00;2022-03-08 13:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 13:35:00;2022-03-08 13:44:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 13:46:00;2022-03-08 13:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 13:55:00;2022-03-08 14:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 14:06:00;2022-03-08 14:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 14:15:00;2022-03-08 14:24:00;Station-16;5139;22;66;CKB +LINE_6;Station-16;2022-03-08 14:46:00;2022-03-08 14:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 14:55:00;2022-03-08 15:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 15:06:00;2022-03-08 15:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 15:15:00;2022-03-08 15:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 15:26:00;2022-03-08 15:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 15:35:00;2022-03-08 15:44:00;Station-16;5139;22;66;CKB +LINE_6;Station-16;2022-03-08 16:06:00;2022-03-08 16:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 16:15:00;2022-03-08 16:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 16:26:00;2022-03-08 16:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 16:35:00;2022-03-08 16:44:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 16:46:00;2022-03-08 16:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 16:55:00;2022-03-08 17:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 17:06:00;2022-03-08 17:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 17:15:00;2022-03-08 17:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 17:26:00;2022-03-08 17:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 17:35:00;2022-03-08 17:44:00;Station-16;5139;22;66;CKB +LINE_6;Station-16;2022-03-08 18:06:00;2022-03-08 18:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 18:15:00;2022-03-08 18:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 18:26:00;2022-03-08 18:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 18:35:00;2022-03-08 18:44:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 18:46:00;2022-03-08 18:55:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 18:55:00;2022-03-08 19:04:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 19:06:00;2022-03-08 19:15:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 19:15:00;2022-03-08 19:24:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 19:26:00;2022-03-08 19:35:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 19:35:00;2022-03-08 19:44:00;Station-16;5139;21;66;CKB +LINE_6;Station-16;2022-03-08 20:05:00;2022-03-08 20:14:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 20:14:00;2022-03-08 20:23:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 20:25:00;2022-03-08 20:34:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 20:34:00;2022-03-08 20:43:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 20:45:00;2022-03-08 20:54:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 20:54:00;2022-03-08 21:03:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 21:05:00;2022-03-08 21:14:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 21:14:00;2022-03-08 21:23:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 21:25:00;2022-03-08 21:34:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 21:34:00;2022-03-08 21:43:00;Station-16;5139;22;66;CKB +LINE_6;Station-16;2022-03-08 22:05:00;2022-03-08 22:14:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 22:14:00;2022-03-08 22:23:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 22:25:00;2022-03-08 22:34:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 22:34:00;2022-03-08 22:43:00;Station-16;5139;2;66;CKB +LINE_6;Station-16;2022-03-08 22:45:00;2022-03-08 22:54:00;Station-17;4781;0;66;CKB +LINE_6;Station-17;2022-03-08 22:54:00;2022-03-08 23:03:00;Station-16;5139;0;66;CKB +LINE_6;Station-16;2022-03-08 23:03:00;2022-03-08 23:03:00;Station-0;0.06;0;66;CKB +LINE_7;Station-0;2022-03-09 00:06:00;2022-03-09 00:06:00;Station-18;0.06;0;67;CKB +LINE_7;Station-18;2022-03-09 00:06:00;2022-03-09 00:27:00;Station-19;7827;0;67;CKB +LINE_8;Station-19;2022-03-09 00:27:00;2022-03-09 00:48:00;Station-20;11079;0;67;CKB +LINE_8;Station-20;2022-03-09 00:48:00;2022-03-09 01:25:00;Station-21;20641;8;67;CKB +LINE_8;Station-21;2022-03-09 01:33:00;2022-03-09 02:16:00;Station-20;20579;1;67;CKB +LINE_8;Station-20;2022-03-09 02:17:00;2022-03-09 02:55:00;Station-21;20641;8;67;CKB +LINE_8;Station-21;2022-03-09 03:03:00;2022-03-09 03:46:00;Station-20;20579;1;67;CKB +LINE_8;Station-20;2022-03-09 03:47:00;2022-03-09 04:25:00;Station-21;20641;0;67;CKB +LINE_8;Station-21;2022-03-09 04:25:00;2022-03-09 04:25:00;Station-0;0.06;0;67;CKB +LINE_9;Station-22;2022-03-08 05:15:00;2022-03-08 06:01:00;Station-23;17.9;0;68;VDL +LINE_9;Station-23;2022-03-08 06:01:00;2022-03-08 06:15:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 06:23:00;2022-03-08 06:37:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 06:41:00;2022-03-08 06:55:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 07:03:00;2022-03-08 07:17:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 07:21:00;2022-03-08 07:35:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 07:43:00;2022-03-08 07:57:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 08:01:00;2022-03-08 08:15:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 08:23:00;2022-03-08 08:37:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 08:41:00;2022-03-08 08:55:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 09:03:00;2022-03-08 09:17:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 09:21:00;2022-03-08 09:35:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 09:43:00;2022-03-08 09:57:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 10:01:00;2022-03-08 10:15:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 10:23:00;2022-03-08 10:37:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 10:41:00;2022-03-08 10:55:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 11:03:00;2022-03-08 11:17:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 11:21:00;2022-03-08 11:35:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 11:43:00;2022-03-08 11:57:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 12:01:00;2022-03-08 12:15:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 12:23:00;2022-03-08 12:37:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 12:41:00;2022-03-08 12:55:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 13:03:00;2022-03-08 13:17:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 13:21:00;2022-03-08 13:35:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 13:43:00;2022-03-08 13:57:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 14:01:00;2022-03-08 14:15:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 14:23:00;2022-03-08 14:37:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 14:41:00;2022-03-08 14:55:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 15:03:00;2022-03-08 15:17:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 15:21:00;2022-03-08 15:35:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 15:43:00;2022-03-08 15:57:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 16:01:00;2022-03-08 16:15:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 16:23:00;2022-03-08 16:37:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 16:41:00;2022-03-08 16:55:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 17:03:00;2022-03-08 17:17:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 17:21:00;2022-03-08 17:35:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 17:43:00;2022-03-08 17:57:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 18:01:00;2022-03-08 18:15:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 18:23:00;2022-03-08 18:37:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 18:41:00;2022-03-08 18:55:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 19:03:00;2022-03-08 19:17:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 19:21:00;2022-03-08 19:35:00;Station-23;4637;8;68;VDL +LINE_9;Station-23;2022-03-08 19:43:00;2022-03-08 19:57:00;Station-23;4637;4;68;VDL +LINE_9;Station-23;2022-03-08 20:01:00;2022-03-08 20:14:00;Station-23;4637;9;68;VDL +LINE_9;Station-23;2022-03-08 20:23:00;2022-03-08 20:36:00;Station-23;4637;0;68;VDL +LINE_9;Station-23;2022-03-08 20:36:00;2022-03-08 21:15:00;Station-22;19.8;0;68;VDL +LINE_10;Station-0;2022-03-08 04:56:00;2022-03-08 04:56:00;Station-24;0.06;18;69;CKB +LINE_10;Station-24;2022-03-08 05:14:00;2022-03-08 05:20:00;Station-25;3.29;0;69;CKB +LINE_10;Station-25;2022-03-08 05:20:00;2022-03-08 05:24:00;Station-24;2954;20;69;CKB +LINE_10;Station-24;2022-03-08 05:44:00;2022-03-08 05:50:00;Station-25;3.29;0;69;CKB +LINE_10;Station-25;2022-03-08 05:50:00;2022-03-08 05:54:00;Station-24;2954;5;69;CKB +LINE_10;Station-24;2022-03-08 05:59:00;2022-03-08 06:06:00;Station-25;3.29;2;69;CKB +LINE_10;Station-25;2022-03-08 06:08:00;2022-03-08 06:13:00;Station-24;2954;19;69;CKB +LINE_10;Station-24;2022-03-08 06:32:00;2022-03-08 06:39:00;Station-25;3.29;1;69;CKB +LINE_10;Station-25;2022-03-08 06:40:00;2022-03-08 06:45:00;Station-24;2954;7;69;CKB +LINE_10;Station-24;2022-03-08 06:52:00;2022-03-08 06:59:00;Station-25;3.29;1;69;CKB +LINE_10;Station-25;2022-03-08 07:00:00;2022-03-08 07:05:00;Station-24;2954;7;69;CKB +LINE_10;Station-24;2022-03-08 07:12:00;2022-03-08 07:19:00;Station-25;3.29;1;69;CKB +LINE_10;Station-25;2022-03-08 07:20:00;2022-03-08 07:25:00;Station-24;2954;7;69;CKB +LINE_10;Station-24;2022-03-08 07:32:00;2022-03-08 07:39:00;Station-25;3.29;1;69;CKB +LINE_10;Station-25;2022-03-08 07:40:00;2022-03-08 07:45:00;Station-24;2954;295;69;CKB +LINE_10;Station-24;2022-03-08 12:40:00;2022-03-08 12:47:00;Station-25;3.29;2;69;CKB +LINE_10;Station-25;2022-03-08 12:49:00;2022-03-08 12:54:00;Station-24;2954;46;69;CKB +LINE_10;Station-24;2022-03-08 13:40:00;2022-03-08 13:47:00;Station-25;3.29;2;69;CKB +LINE_10;Station-25;2022-03-08 13:49:00;2022-03-08 13:54:00;Station-24;2954;434;69;CKB +LINE_10;Station-24;2022-03-08 21:08:00;2022-03-08 21:08:00;Station-0;0.06;0;69;CKB +LINE_11;Station-0;2022-03-08 07:20:00;2022-03-08 07:20:00;Station-26;0.06;0;70;CKB +LINE_11;Station-26;2022-03-08 07:20:00;2022-03-08 07:50:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 08:00:00;2022-03-08 08:30:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 08:40:00;2022-03-08 09:10:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 09:20:00;2022-03-08 09:50:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 10:00:00;2022-03-08 10:30:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 10:40:00;2022-03-08 11:10:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 11:20:00;2022-03-08 11:50:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 12:00:00;2022-03-08 12:30:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 12:40:00;2022-03-08 13:10:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 13:20:00;2022-03-08 13:50:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 14:00:00;2022-03-08 14:30:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 14:40:00;2022-03-08 15:10:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 15:20:00;2022-03-08 15:50:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 16:00:00;2022-03-08 16:30:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 16:40:00;2022-03-08 17:10:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 17:20:00;2022-03-08 17:50:00;Station-26;9266;10;70;CKB +LINE_11;Station-26;2022-03-08 18:00:00;2022-03-08 18:30:00;Station-26;9266;0;70;CKB +LINE_11;Station-26;2022-03-08 18:30:00;2022-03-08 18:30:00;Station-0;0.06;0;70;CKB +LINE_12;Station-0;2022-03-08 07:10:00;2022-03-08 07:10:00;Station-27;0.06;0;71;CKB +LINE_12;Station-27;2022-03-08 07:10:00;2022-03-08 07:18:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 07:28:00;2022-03-08 07:40:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 07:40:00;2022-03-08 07:48:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 07:58:00;2022-03-08 08:10:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 08:10:00;2022-03-08 08:18:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 08:28:00;2022-03-08 08:40:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 08:40:00;2022-03-08 08:48:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 08:58:00;2022-03-08 09:10:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 09:10:00;2022-03-08 09:18:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 09:28:00;2022-03-08 09:40:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 09:40:00;2022-03-08 09:48:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 09:58:00;2022-03-08 10:10:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 10:10:00;2022-03-08 10:18:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 10:28:00;2022-03-08 10:40:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 10:40:00;2022-03-08 10:48:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 10:58:00;2022-03-08 11:10:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 11:10:00;2022-03-08 11:18:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 11:28:00;2022-03-08 11:40:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 11:40:00;2022-03-08 11:48:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 11:58:00;2022-03-08 12:10:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 12:10:00;2022-03-08 12:18:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 12:28:00;2022-03-08 12:40:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 12:40:00;2022-03-08 12:48:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 12:58:00;2022-03-08 13:10:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 13:10:00;2022-03-08 13:18:00;Station-28;2169;10;71;CKB +LINE_12;Station-28;2022-03-08 13:28:00;2022-03-08 13:40:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 13:40:00;2022-03-08 13:48:00;Station-28;2169;8;71;CKB +LINE_12;Station-28;2022-03-08 13:56:00;2022-03-08 14:10:00;Station-27;2952;0;71;CKB +LINE_12;Station-27;2022-03-08 14:10:00;2022-03-08 14:19:00;Station-28;2169;14;71;CKB +LINE_12;Station-28;2022-03-08 14:33:00;2022-03-08 14:47:00;Station-27;2952;3;71;CKB +LINE_12;Station-27;2022-03-08 14:50:00;2022-03-08 14:59:00;Station-28;2169;14;71;CKB +LINE_12;Station-28;2022-03-08 15:13:00;2022-03-08 15:27:00;Station-27;2952;3;71;CKB +LINE_12;Station-27;2022-03-08 15:30:00;2022-03-08 15:39:00;Station-28;2169;14;71;CKB +LINE_12;Station-28;2022-03-08 15:53:00;2022-03-08 16:07:00;Station-27;2952;3;71;CKB +LINE_12;Station-27;2022-03-08 16:10:00;2022-03-08 16:19:00;Station-28;2169;14;71;CKB +LINE_12;Station-28;2022-03-08 16:33:00;2022-03-08 16:47:00;Station-27;2952;3;71;CKB +LINE_12;Station-27;2022-03-08 16:50:00;2022-03-08 16:59:00;Station-28;2169;14;71;CKB +LINE_12;Station-28;2022-03-08 17:13:00;2022-03-08 17:27:00;Station-27;2952;3;71;CKB +LINE_12;Station-27;2022-03-08 17:30:00;2022-03-08 17:39:00;Station-28;2169;13;71;CKB +LINE_12;Station-28;2022-03-08 17:52:00;2022-03-08 18:05:00;Station-27;2952;5;71;CKB +LINE_12;Station-27;2022-03-08 18:10:00;2022-03-08 18:18:00;Station-28;2169;0;71;CKB +LINE_12;Station-28;2022-03-08 18:18:00;2022-03-08 18:18:00;Station-0;0.06;0;71;CKB +LINE_12;Station-0;2022-03-08 14:13:00;2022-03-08 14:13:00;Station-28;0.06;0;72;CKB +LINE_12;Station-28;2022-03-08 14:13:00;2022-03-08 14:27:00;Station-27;2952;3;72;CKB +LINE_12;Station-27;2022-03-08 14:30:00;2022-03-08 14:39:00;Station-28;2169;14;72;CKB +LINE_12;Station-28;2022-03-08 14:53:00;2022-03-08 15:07:00;Station-27;2952;3;72;CKB +LINE_12;Station-27;2022-03-08 15:10:00;2022-03-08 15:19:00;Station-28;2169;14;72;CKB +LINE_12;Station-28;2022-03-08 15:33:00;2022-03-08 15:47:00;Station-27;2952;3;72;CKB +LINE_12;Station-27;2022-03-08 15:50:00;2022-03-08 15:59:00;Station-28;2169;14;72;CKB +LINE_12;Station-28;2022-03-08 16:13:00;2022-03-08 16:27:00;Station-27;2952;3;72;CKB +LINE_12;Station-27;2022-03-08 16:30:00;2022-03-08 16:39:00;Station-28;2169;14;72;CKB +LINE_12;Station-28;2022-03-08 16:53:00;2022-03-08 17:07:00;Station-27;2952;3;72;CKB +LINE_12;Station-27;2022-03-08 17:10:00;2022-03-08 17:19:00;Station-28;2169;14;72;CKB +LINE_12;Station-28;2022-03-08 17:33:00;2022-03-08 17:47:00;Station-27;2952;3;72;CKB +LINE_12;Station-27;2022-03-08 17:50:00;2022-03-08 17:59:00;Station-28;2169;14;72;CKB +LINE_12;Station-28;2022-03-08 18:13:00;2022-03-08 18:25:00;Station-27;2952;0;72;CKB +LINE_12;Station-27;2022-03-08 18:25:00;2022-03-08 18:25:00;Station-0;0.06;0;72;CKB +LINE_13;Station-0;2022-03-09 00:23:00;2022-03-09 00:23:00;Station-29;0.06;0;73;CKB +LINE_13;Station-29;2022-03-09 00:23:00;2022-03-09 00:30:00;Station-30;2577;9;73;CKB +LINE_14;Station-30;2022-03-09 00:39:00;2022-03-09 00:54:00;Station-31;5937;9;73;CKB +LINE_14;Station-31;2022-03-09 01:03:00;2022-03-09 01:17:00;Station-30;6.19;0;73;CKB +LINE_13;Station-30;2022-03-09 01:17:00;2022-03-09 01:23:00;Station-29;2555;0;73;CKB +LINE_13;Station-29;2022-03-09 01:23:00;2022-03-09 01:30:00;Station-30;2577;9;73;CKB +LINE_14;Station-30;2022-03-09 01:39:00;2022-03-09 01:54:00;Station-31;5937;9;73;CKB +LINE_14;Station-31;2022-03-09 02:03:00;2022-03-09 02:17:00;Station-30;6.19;0;73;CKB +LINE_13;Station-30;2022-03-09 02:17:00;2022-03-09 02:23:00;Station-29;2555;0;73;CKB +LINE_13;Station-29;2022-03-09 02:23:00;2022-03-09 02:30:00;Station-30;2577;9;73;CKB +LINE_14;Station-30;2022-03-09 02:39:00;2022-03-09 02:54:00;Station-31;5937;9;73;CKB +LINE_14;Station-31;2022-03-09 03:03:00;2022-03-09 03:17:00;Station-30;6.19;0;73;CKB +LINE_13;Station-30;2022-03-09 03:17:00;2022-03-09 03:23:00;Station-29;2555;0;73;CKB +LINE_13;Station-29;2022-03-09 03:23:00;2022-03-09 03:30:00;Station-30;2577;9;73;CKB +LINE_14;Station-30;2022-03-09 03:39:00;2022-03-09 03:54:00;Station-31;5937;9;73;CKB +LINE_14;Station-31;2022-03-09 04:03:00;2022-03-09 04:17:00;Station-30;6.19;0;73;CKB +LINE_13;Station-30;2022-03-09 04:17:00;2022-03-09 04:23:00;Station-29;2555;0;73;CKB +LINE_13;Station-29;2022-03-09 04:23:00;2022-03-09 04:23:00;Station-0;0.06;0;73;CKB +LINE_14;Station-0;2022-03-09 00:33:00;2022-03-09 00:33:00;Station-31;0.06;0;74;CKB +LINE_14;Station-31;2022-03-09 00:33:00;2022-03-09 00:47:00;Station-30;6.19;0;74;CKB +LINE_13;Station-30;2022-03-09 00:47:00;2022-03-09 00:53:00;Station-29;2555;0;74;CKB +LINE_13;Station-29;2022-03-09 00:53:00;2022-03-09 01:00:00;Station-30;2577;9;74;CKB +LINE_14;Station-30;2022-03-09 01:09:00;2022-03-09 01:24:00;Station-31;5937;9;74;CKB +LINE_14;Station-31;2022-03-09 01:33:00;2022-03-09 01:47:00;Station-30;6.19;0;74;CKB +LINE_13;Station-30;2022-03-09 01:47:00;2022-03-09 01:53:00;Station-29;2555;0;74;CKB +LINE_13;Station-29;2022-03-09 01:53:00;2022-03-09 02:00:00;Station-30;2577;9;74;CKB +LINE_14;Station-30;2022-03-09 02:09:00;2022-03-09 02:24:00;Station-31;5937;9;74;CKB +LINE_14;Station-31;2022-03-09 02:33:00;2022-03-09 02:47:00;Station-30;6.19;0;74;CKB +LINE_13;Station-30;2022-03-09 02:47:00;2022-03-09 02:53:00;Station-29;2555;0;74;CKB +LINE_13;Station-29;2022-03-09 02:53:00;2022-03-09 03:00:00;Station-30;2577;9;74;CKB +LINE_14;Station-30;2022-03-09 03:09:00;2022-03-09 03:24:00;Station-31;5937;9;74;CKB +LINE_14;Station-31;2022-03-09 03:33:00;2022-03-09 03:47:00;Station-30;6.19;0;74;CKB +LINE_13;Station-30;2022-03-09 03:47:00;2022-03-09 03:53:00;Station-29;2555;0;74;CKB +LINE_13;Station-29;2022-03-09 03:53:00;2022-03-09 04:00:00;Station-30;2577;9;74;CKB +LINE_14;Station-30;2022-03-09 04:09:00;2022-03-09 04:24:00;Station-31;5937;0;74;CKB +LINE_14;Station-31;2022-03-09 04:24:00;2022-03-09 04:24:00;Station-0;0.06;0;74;CKB +LINE_15;Station-0;2022-03-09 00:57:00;2022-03-09 00:57:00;Station-32;0.06;0;75;CKB +LINE_15;Station-32;2022-03-09 00:57:00;2022-03-09 01:06:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 01:06:00;2022-03-09 01:11:00;Station-32;2936;16;75;CKB +LINE_15;Station-32;2022-03-09 01:27:00;2022-03-09 01:36:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 01:36:00;2022-03-09 01:41:00;Station-32;2936;16;75;CKB +LINE_15;Station-32;2022-03-09 01:57:00;2022-03-09 02:06:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 02:06:00;2022-03-09 02:11:00;Station-32;2936;16;75;CKB +LINE_15;Station-32;2022-03-09 02:27:00;2022-03-09 02:36:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 02:36:00;2022-03-09 02:41:00;Station-32;2936;16;75;CKB +LINE_15;Station-32;2022-03-09 02:57:00;2022-03-09 03:06:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 03:06:00;2022-03-09 03:11:00;Station-32;2936;16;75;CKB +LINE_15;Station-32;2022-03-09 03:27:00;2022-03-09 03:36:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 03:36:00;2022-03-09 03:41:00;Station-32;2936;16;75;CKB +LINE_15;Station-32;2022-03-09 03:57:00;2022-03-09 04:06:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 04:06:00;2022-03-09 04:11:00;Station-32;2936;16;75;CKB +LINE_15;Station-32;2022-03-09 04:27:00;2022-03-09 04:36:00;Station-33;4343;0;75;CKB +LINE_15;Station-33;2022-03-09 04:36:00;2022-03-09 04:36:00;Station-0;0.06;0;75;CKB +LINE_16;Station-0;2022-03-09 00:29:00;2022-03-09 00:29:00;Station-34;0.06;0;76;CKB +LINE_16;Station-34;2022-03-09 00:29:00;2022-03-09 00:41:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 00:47:00;2022-03-09 00:57:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 00:59:00;2022-03-09 01:11:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 01:17:00;2022-03-09 01:27:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 01:29:00;2022-03-09 01:41:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 01:47:00;2022-03-09 01:57:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 01:59:00;2022-03-09 02:11:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 02:17:00;2022-03-09 02:27:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 02:29:00;2022-03-09 02:41:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 02:47:00;2022-03-09 02:57:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 02:59:00;2022-03-09 03:11:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 03:17:00;2022-03-09 03:27:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 03:29:00;2022-03-09 03:41:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 03:47:00;2022-03-09 03:57:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 03:59:00;2022-03-09 04:11:00;Station-35;4481;6;76;CKB +LINE_16;Station-35;2022-03-09 04:17:00;2022-03-09 04:27:00;Station-34;4031;2;76;CKB +LINE_16;Station-34;2022-03-09 04:29:00;2022-03-09 04:41:00;Station-35;4481;0;76;CKB +LINE_16;Station-35;2022-03-09 04:41:00;2022-03-09 04:41:00;Station-0;0.06;0;76;CKB +LINE_17;Station-0;2022-03-09 00:30:00;2022-03-09 00:30:00;Station-34;0.06;0;77;CKB +LINE_17;Station-34;2022-03-09 00:30:00;2022-03-09 00:44:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 00:44:00;2022-03-09 00:57:00;Station-34;5302;3;77;CKB +LINE_17;Station-34;2022-03-09 01:00:00;2022-03-09 01:14:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 01:14:00;2022-03-09 01:27:00;Station-34;5302;3;77;CKB +LINE_17;Station-34;2022-03-09 01:30:00;2022-03-09 01:44:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 01:44:00;2022-03-09 01:57:00;Station-34;5302;3;77;CKB +LINE_17;Station-34;2022-03-09 02:00:00;2022-03-09 02:14:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 02:14:00;2022-03-09 02:27:00;Station-34;5302;3;77;CKB +LINE_17;Station-34;2022-03-09 02:30:00;2022-03-09 02:44:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 02:44:00;2022-03-09 02:57:00;Station-34;5302;3;77;CKB +LINE_17;Station-34;2022-03-09 03:00:00;2022-03-09 03:14:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 03:14:00;2022-03-09 03:27:00;Station-34;5302;3;77;CKB +LINE_17;Station-34;2022-03-09 03:30:00;2022-03-09 03:44:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 03:44:00;2022-03-09 03:57:00;Station-34;5302;3;77;CKB +LINE_17;Station-34;2022-03-09 04:00:00;2022-03-09 04:14:00;Station-36;4801;0;77;CKB +LINE_17;Station-36;2022-03-09 04:14:00;2022-03-09 04:27:00;Station-34;5302;0;77;CKB +LINE_17;Station-34;2022-03-09 04:27:00;2022-03-09 04:27:00;Station-0;0.06;0;77;CKB +LINE_18;Station-0;2022-03-09 00:43:00;2022-03-09 00:43:00;Station-37;0.06;0;78;CKB +LINE_18;Station-37;2022-03-09 00:43:00;2022-03-09 01:33:00;Station-37;20434;10;78;CKB +LINE_18;Station-37;2022-03-09 01:43:00;2022-03-09 02:33:00;Station-37;20434;10;78;CKB +LINE_18;Station-37;2022-03-09 02:43:00;2022-03-09 03:33:00;Station-37;20434;10;78;CKB +LINE_18;Station-37;2022-03-09 03:43:00;2022-03-09 04:33:00;Station-37;20434;0;78;CKB +LINE_18;Station-37;2022-03-09 04:33:00;2022-03-09 04:33:00;Station-0;0.06;0;78;CKB +LINE_18;Station-0;2022-03-09 00:13:00;2022-03-09 00:13:00;Station-37;0.06;0;79;CKB +LINE_18;Station-37;2022-03-09 00:13:00;2022-03-09 01:03:00;Station-37;20434;10;79;CKB +LINE_18;Station-37;2022-03-09 01:13:00;2022-03-09 02:03:00;Station-37;20434;10;79;CKB +LINE_18;Station-37;2022-03-09 02:13:00;2022-03-09 03:03:00;Station-37;20434;10;79;CKB +LINE_18;Station-37;2022-03-09 03:13:00;2022-03-09 04:03:00;Station-37;20434;0;79;CKB +LINE_18;Station-37;2022-03-09 04:03:00;2022-03-09 04:03:00;Station-0;0.06;0;79;CKB +LINE_19;Station-0;2022-03-09 00:24:00;2022-03-09 00:24:00;Station-38;0.06;0;80;CKB +LINE_19;Station-38;2022-03-09 00:24:00;2022-03-09 00:48:00;Station-39;11.86;4;80;CKB +LINE_19;Station-39;2022-03-09 00:52:00;2022-03-09 01:14:00;Station-38;11139;10;80;CKB +LINE_19;Station-38;2022-03-09 01:24:00;2022-03-09 01:48:00;Station-39;11.86;4;80;CKB +LINE_19;Station-39;2022-03-09 01:52:00;2022-03-09 02:14:00;Station-38;11139;10;80;CKB +LINE_19;Station-38;2022-03-09 02:24:00;2022-03-09 02:48:00;Station-39;11.86;4;80;CKB +LINE_19;Station-39;2022-03-09 02:52:00;2022-03-09 03:14:00;Station-38;11139;10;80;CKB +LINE_19;Station-38;2022-03-09 03:24:00;2022-03-09 03:48:00;Station-39;11.86;4;80;CKB +LINE_19;Station-39;2022-03-09 03:52:00;2022-03-09 04:14:00;Station-38;11139;0;80;CKB +LINE_19;Station-38;2022-03-09 04:14:00;2022-03-09 04:14:00;Station-0;0.06;0;80;CKB +LINE_19;Station-0;2022-03-09 00:22:00;2022-03-09 00:22:00;Station-39;0.06;0;81;CKB +LINE_19;Station-39;2022-03-09 00:22:00;2022-03-09 00:44:00;Station-38;11139;10;81;CKB +LINE_19;Station-38;2022-03-09 00:54:00;2022-03-09 01:18:00;Station-39;11.86;4;81;CKB +LINE_19;Station-39;2022-03-09 01:22:00;2022-03-09 01:44:00;Station-38;11139;10;81;CKB +LINE_19;Station-38;2022-03-09 01:54:00;2022-03-09 02:18:00;Station-39;11.86;4;81;CKB +LINE_19;Station-39;2022-03-09 02:22:00;2022-03-09 02:44:00;Station-38;11139;10;81;CKB +LINE_19;Station-38;2022-03-09 02:54:00;2022-03-09 03:18:00;Station-39;11.86;4;81;CKB +LINE_19;Station-39;2022-03-09 03:22:00;2022-03-09 03:44:00;Station-38;11139;10;81;CKB +LINE_19;Station-38;2022-03-09 03:54:00;2022-03-09 04:18:00;Station-39;11.86;4;81;CKB +LINE_19;Station-39;2022-03-09 04:22:00;2022-03-09 04:44:00;Station-38;11139;0;81;CKB +LINE_19;Station-38;2022-03-09 04:44:00;2022-03-09 04:44:00;Station-0;0.06;0;81;CKB +LINE_20;Station-0;2022-03-09 00:32:00;2022-03-09 00:32:00;Station-13;0.06;0;82;CKB +LINE_20;Station-13;2022-03-09 00:32:00;2022-03-09 00:44:00;Station-40;4212;3;82;CKB +LINE_20;Station-40;2022-03-09 00:47:00;2022-03-09 01:16:00;Station-41;13048;0;82;CKB +LINE_20;Station-41;2022-03-09 01:16:00;2022-03-09 01:42:00;Station-40;12869;5;82;CKB +LINE_20;Station-40;2022-03-09 01:47:00;2022-03-09 02:16:00;Station-41;13048;0;82;CKB +LINE_20;Station-41;2022-03-09 02:16:00;2022-03-09 02:42:00;Station-40;12869;5;82;CKB +LINE_20;Station-40;2022-03-09 02:47:00;2022-03-09 03:16:00;Station-41;13048;0;82;CKB +LINE_20;Station-41;2022-03-09 03:16:00;2022-03-09 03:42:00;Station-40;12869;5;82;CKB +LINE_20;Station-40;2022-03-09 03:47:00;2022-03-09 04:16:00;Station-41;13048;0;82;CKB +LINE_20;Station-41;2022-03-09 04:16:00;2022-03-09 04:34:00;Station-42;9538;0;82;CKB +LINE_20;Station-42;2022-03-09 04:34:00;2022-03-09 04:34:00;Station-0;0.06;0;82;CKB +LINE_20;Station-0;2022-03-09 00:17:00;2022-03-09 00:17:00;Station-40;0.06;0;83;CKB +LINE_20;Station-40;2022-03-09 00:17:00;2022-03-09 00:46:00;Station-41;13048;0;83;CKB +LINE_20;Station-41;2022-03-09 00:46:00;2022-03-09 01:12:00;Station-40;12869;5;83;CKB +LINE_20;Station-40;2022-03-09 01:17:00;2022-03-09 01:46:00;Station-41;13048;0;83;CKB +LINE_20;Station-41;2022-03-09 01:46:00;2022-03-09 02:12:00;Station-40;12869;5;83;CKB +LINE_20;Station-40;2022-03-09 02:17:00;2022-03-09 02:46:00;Station-41;13048;0;83;CKB +LINE_20;Station-41;2022-03-09 02:46:00;2022-03-09 03:12:00;Station-40;12869;5;83;CKB +LINE_20;Station-40;2022-03-09 03:17:00;2022-03-09 03:46:00;Station-41;13048;0;83;CKB +LINE_20;Station-41;2022-03-09 03:46:00;2022-03-09 04:12:00;Station-40;12869;5;83;CKB +LINE_20;Station-40;2022-03-09 04:17:00;2022-03-09 04:28:00;Station-13;4316;0;83;CKB +LINE_20;Station-13;2022-03-09 04:28:00;2022-03-09 04:28:00;Station-0;0.06;0;83;CKB +LINE_21;Station-0;2022-03-09 00:49:00;2022-03-09 00:49:00;Station-3;0.06;0;84;CKB +LINE_21;Station-3;2022-03-09 00:49:00;2022-03-09 01:04:00;Station-16;10229;0;84;CKB +LINE_21;Station-16;2022-03-09 01:04:00;2022-03-09 01:19:00;Station-3;11801;0;84;CKB +LINE_21;Station-3;2022-03-09 01:19:00;2022-03-09 01:34:00;Station-16;10229;0;84;CKB +LINE_21;Station-16;2022-03-09 01:34:00;2022-03-09 01:49:00;Station-3;11801;0;84;CKB +LINE_21;Station-3;2022-03-09 01:49:00;2022-03-09 02:04:00;Station-16;10229;0;84;CKB +LINE_21;Station-16;2022-03-09 02:04:00;2022-03-09 02:19:00;Station-3;11801;0;84;CKB +LINE_21;Station-3;2022-03-09 02:19:00;2022-03-09 02:34:00;Station-16;10229;0;84;CKB +LINE_21;Station-16;2022-03-09 02:34:00;2022-03-09 02:49:00;Station-3;11801;0;84;CKB +LINE_21;Station-3;2022-03-09 02:49:00;2022-03-09 03:04:00;Station-16;10229;0;84;CKB +LINE_21;Station-16;2022-03-09 03:04:00;2022-03-09 03:19:00;Station-3;11801;0;84;CKB +LINE_21;Station-3;2022-03-09 03:19:00;2022-03-09 03:34:00;Station-16;10229;0;84;CKB +LINE_21;Station-16;2022-03-09 03:34:00;2022-03-09 03:49:00;Station-3;11801;0;84;CKB +LINE_21;Station-3;2022-03-09 03:49:00;2022-03-09 04:04:00;Station-16;10229;0;84;CKB +LINE_21;Station-16;2022-03-09 04:04:00;2022-03-09 04:19:00;Station-3;11801;23;84;CKB +LINE_22;Station-3;2022-03-09 04:42:00;2022-03-09 05:04:00;Station-43;6.81;0;84;CKB +LINE_22;Station-43;2022-03-09 05:04:00;2022-03-09 05:04:00;Station-0;0.06;0;84;CKB +LINE_8;Station-0;2022-03-09 00:32:00;2022-03-09 00:32:00;Station-13;0.06;0;85;CKB +LINE_8;Station-13;2022-03-09 00:32:00;2022-03-09 00:57:00;Station-21;11545;6;85;CKB +LINE_8;Station-21;2022-03-09 01:03:00;2022-03-09 01:46:00;Station-20;20579;1;85;CKB +LINE_8;Station-20;2022-03-09 01:47:00;2022-03-09 02:25:00;Station-21;20641;8;85;CKB +LINE_8;Station-21;2022-03-09 02:33:00;2022-03-09 03:16:00;Station-20;20579;1;85;CKB +LINE_8;Station-20;2022-03-09 03:17:00;2022-03-09 03:55:00;Station-21;20641;8;85;CKB +LINE_8;Station-21;2022-03-09 04:03:00;2022-03-09 04:28:00;Station-13;11499;0;85;CKB +LINE_8;Station-13;2022-03-09 04:28:00;2022-03-09 04:28:00;Station-0;0.06;0;85;CKB +LINE_8;Station-0;2022-03-09 00:33:00;2022-03-09 00:33:00;Station-21;0.06;0;86;CKB +LINE_8;Station-21;2022-03-09 00:33:00;2022-03-09 01:16:00;Station-20;20579;1;86;CKB +LINE_8;Station-20;2022-03-09 01:17:00;2022-03-09 01:55:00;Station-21;20641;8;86;CKB +LINE_8;Station-21;2022-03-09 02:03:00;2022-03-09 02:46:00;Station-20;20579;1;86;CKB +LINE_8;Station-20;2022-03-09 02:47:00;2022-03-09 03:25:00;Station-21;20641;8;86;CKB +LINE_8;Station-21;2022-03-09 03:33:00;2022-03-09 04:16:00;Station-20;20579;1;86;CKB +LINE_8;Station-20;2022-03-09 04:17:00;2022-03-09 04:51:00;Station-44;18752;0;86;CKB +LINE_8;Station-44;2022-03-09 04:51:00;2022-03-09 04:51:00;Station-0;0.06;0;86;CKB +LINE_23;Station-0;2022-03-09 00:34:00;2022-03-09 00:34:00;Station-45;0.06;0;87;CKB +LINE_23;Station-45;2022-03-09 00:34:00;2022-03-09 01:00:00;Station-46;9016;0;87;CKB +LINE_23;Station-46;2022-03-09 01:00:00;2022-03-09 01:27:00;Station-45;10083;7;87;CKB +LINE_23;Station-45;2022-03-09 01:34:00;2022-03-09 02:00:00;Station-46;9016;0;87;CKB +LINE_23;Station-46;2022-03-09 02:00:00;2022-03-09 02:27:00;Station-45;10083;7;87;CKB +LINE_23;Station-45;2022-03-09 02:34:00;2022-03-09 03:00:00;Station-46;9016;0;87;CKB +LINE_23;Station-46;2022-03-09 03:00:00;2022-03-09 03:27:00;Station-45;10083;7;87;CKB +LINE_23;Station-45;2022-03-09 03:34:00;2022-03-09 04:00:00;Station-46;9016;0;87;CKB +LINE_23;Station-46;2022-03-09 04:00:00;2022-03-09 04:27:00;Station-45;10083;0;87;CKB +LINE_23;Station-45;2022-03-09 04:27:00;2022-03-09 04:27:00;Station-0;0.06;0;87;CKB +LINE_23;Station-0;2022-03-09 00:30:00;2022-03-09 00:30:00;Station-46;0.06;0;88;CKB +LINE_23;Station-46;2022-03-09 00:30:00;2022-03-09 00:57:00;Station-45;10083;7;88;CKB +LINE_23;Station-45;2022-03-09 01:04:00;2022-03-09 01:30:00;Station-46;9016;0;88;CKB +LINE_23;Station-46;2022-03-09 01:30:00;2022-03-09 01:57:00;Station-45;10083;7;88;CKB +LINE_23;Station-45;2022-03-09 02:04:00;2022-03-09 02:30:00;Station-46;9016;0;88;CKB +LINE_23;Station-46;2022-03-09 02:30:00;2022-03-09 02:57:00;Station-45;10083;7;88;CKB +LINE_23;Station-45;2022-03-09 03:04:00;2022-03-09 03:30:00;Station-46;9016;0;88;CKB +LINE_23;Station-46;2022-03-09 03:30:00;2022-03-09 03:57:00;Station-45;10083;7;88;CKB +LINE_23;Station-45;2022-03-09 04:04:00;2022-03-09 04:30:00;Station-46;9016;0;88;CKB +LINE_23;Station-46;2022-03-09 04:30:00;2022-03-09 04:57:00;Station-45;10083;0;88;CKB +LINE_23;Station-45;2022-03-09 04:57:00;2022-03-09 04:57:00;Station-0;0.06;0;88;CKB +LINE_24;Station-0;2022-03-09 00:31:00;2022-03-09 00:31:00;Station-21;0.06;0;89;CKB +LINE_24;Station-21;2022-03-09 00:31:00;2022-03-09 00:44:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 00:44:00;2022-03-09 00:56:00;Station-21;5362;5;89;CKB +LINE_24;Station-21;2022-03-09 01:01:00;2022-03-09 01:14:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 01:14:00;2022-03-09 01:26:00;Station-21;5362;5;89;CKB +LINE_24;Station-21;2022-03-09 01:31:00;2022-03-09 01:44:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 01:44:00;2022-03-09 01:56:00;Station-21;5362;5;89;CKB +LINE_24;Station-21;2022-03-09 02:01:00;2022-03-09 02:14:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 02:14:00;2022-03-09 02:26:00;Station-21;5362;5;89;CKB +LINE_24;Station-21;2022-03-09 02:31:00;2022-03-09 02:44:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 02:44:00;2022-03-09 02:56:00;Station-21;5362;5;89;CKB +LINE_24;Station-21;2022-03-09 03:01:00;2022-03-09 03:14:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 03:14:00;2022-03-09 03:26:00;Station-21;5362;5;89;CKB +LINE_24;Station-21;2022-03-09 03:31:00;2022-03-09 03:44:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 03:44:00;2022-03-09 03:56:00;Station-21;5362;5;89;CKB +LINE_24;Station-21;2022-03-09 04:01:00;2022-03-09 04:14:00;Station-47;4872;0;89;CKB +LINE_24;Station-47;2022-03-09 04:14:00;2022-03-09 04:26:00;Station-21;5362;0;89;CKB +LINE_24;Station-21;2022-03-09 04:26:00;2022-03-09 04:26:00;Station-0;0.06;0;89;CKB +LINE_25;Station-0;2022-03-09 00:31:00;2022-03-09 00:31:00;Station-21;0.06;0;90;CKB +LINE_25;Station-21;2022-03-09 00:31:00;2022-03-09 00:45:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 00:47:00;2022-03-09 01:01:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 01:01:00;2022-03-09 01:15:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 01:17:00;2022-03-09 01:31:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 01:31:00;2022-03-09 01:45:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 01:47:00;2022-03-09 02:01:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 02:01:00;2022-03-09 02:15:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 02:17:00;2022-03-09 02:31:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 02:31:00;2022-03-09 02:45:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 02:47:00;2022-03-09 03:01:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 03:01:00;2022-03-09 03:15:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 03:17:00;2022-03-09 03:31:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 03:31:00;2022-03-09 03:45:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 03:47:00;2022-03-09 04:01:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 04:01:00;2022-03-09 04:15:00;Station-48;5225;2;90;CKB +LINE_25;Station-48;2022-03-09 04:17:00;2022-03-09 04:31:00;Station-21;7617;0;90;CKB +LINE_25;Station-21;2022-03-09 04:31:00;2022-03-09 04:31:00;Station-0;0.06;0;90;CKB +LINE_26;Station-0;2022-03-09 00:43:00;2022-03-09 00:43:00;Station-49;0.06;0;91;CKB +LINE_26;Station-49;2022-03-09 00:43:00;2022-03-09 00:53:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 00:53:00;2022-03-09 01:03:00;Station-49;4408;10;91;CKB +LINE_26;Station-49;2022-03-09 01:13:00;2022-03-09 01:23:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 01:23:00;2022-03-09 01:33:00;Station-49;4408;10;91;CKB +LINE_26;Station-49;2022-03-09 01:43:00;2022-03-09 01:53:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 01:53:00;2022-03-09 02:03:00;Station-49;4408;10;91;CKB +LINE_26;Station-49;2022-03-09 02:13:00;2022-03-09 02:23:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 02:23:00;2022-03-09 02:33:00;Station-49;4408;10;91;CKB +LINE_26;Station-49;2022-03-09 02:43:00;2022-03-09 02:53:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 02:53:00;2022-03-09 03:03:00;Station-49;4408;10;91;CKB +LINE_26;Station-49;2022-03-09 03:13:00;2022-03-09 03:23:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 03:23:00;2022-03-09 03:33:00;Station-49;4408;10;91;CKB +LINE_26;Station-49;2022-03-09 03:43:00;2022-03-09 03:53:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 03:53:00;2022-03-09 04:03:00;Station-49;4408;10;91;CKB +LINE_26;Station-49;2022-03-09 04:13:00;2022-03-09 04:23:00;Station-50;4507;0;91;CKB +LINE_26;Station-50;2022-03-09 04:23:00;2022-03-09 04:33:00;Station-49;4408;0;91;CKB +LINE_26;Station-49;2022-03-09 04:33:00;2022-03-09 04:33:00;Station-0;0.06;0;91;CKB +LINE_0;Station-0;2022-03-09 21:31:00;2022-03-09 21:31:00;Station-1;0.06;0;92;CKB +LINE_0;Station-1;2022-03-09 21:31:00;2022-03-09 22:04:00;Station-2;14519;4;92;CKB +LINE_0;Station-2;2022-03-09 22:08:00;2022-03-09 22:43:00;Station-1;13541;8;92;CKB +LINE_0;Station-1;2022-03-09 22:51:00;2022-03-09 23:24:00;Station-2;14519;4;92;CKB +LINE_0;Station-2;2022-03-09 23:28:00;2022-03-10 00:03:00;Station-1;13541;8;92;CKB +LINE_0;Station-1;2022-03-10 00:11:00;2022-03-10 00:44:00;Station-2;14519;0;92;CKB +LINE_1;Station-2;2022-03-10 00:44:00;2022-03-10 00:54:00;Station-3;4.1;25;92;CKB +LINE_1;Station-3;2022-03-10 01:19:00;2022-03-10 01:42:00;Station-4;8.36;6;92;CKB +LINE_1;Station-4;2022-03-10 01:48:00;2022-03-10 02:06:00;Station-3;9067;13;92;CKB +LINE_1;Station-3;2022-03-10 02:19:00;2022-03-10 02:42:00;Station-4;8.36;6;92;CKB +LINE_1;Station-4;2022-03-10 02:48:00;2022-03-10 03:06:00;Station-3;9067;13;92;CKB +LINE_1;Station-3;2022-03-10 03:19:00;2022-03-10 03:42:00;Station-4;8.36;6;92;CKB +LINE_1;Station-4;2022-03-10 03:48:00;2022-03-10 04:06:00;Station-3;9067;0;92;CKB +LINE_1;Station-3;2022-03-10 04:06:00;2022-03-10 04:06:00;Station-0;0.06;0;92;CKB +LINE_0;Station-0;2022-03-09 22:11:00;2022-03-09 22:11:00;Station-1;0.06;0;93;CKB +LINE_0;Station-1;2022-03-09 22:11:00;2022-03-09 22:44:00;Station-2;14519;4;93;CKB +LINE_0;Station-2;2022-03-09 22:48:00;2022-03-09 23:23:00;Station-1;13541;8;93;CKB +LINE_0;Station-1;2022-03-09 23:31:00;2022-03-10 00:04:00;Station-2;14519;4;93;CKB +LINE_0;Station-2;2022-03-10 00:08:00;2022-03-10 00:39:00;Station-5;12213;0;93;CKB +LINE_1;Station-5;2022-03-10 00:39:00;2022-03-10 00:47:00;Station-3;4.0;2;93;CKB +LINE_1;Station-3;2022-03-10 00:49:00;2022-03-10 01:12:00;Station-4;8.36;6;93;CKB +LINE_1;Station-4;2022-03-10 01:18:00;2022-03-10 01:36:00;Station-3;9067;13;93;CKB +LINE_1;Station-3;2022-03-10 01:49:00;2022-03-10 02:12:00;Station-4;8.36;6;93;CKB +LINE_1;Station-4;2022-03-10 02:18:00;2022-03-10 02:36:00;Station-3;9067;13;93;CKB +LINE_1;Station-3;2022-03-10 02:49:00;2022-03-10 03:12:00;Station-4;8.36;6;93;CKB +LINE_1;Station-4;2022-03-10 03:18:00;2022-03-10 03:36:00;Station-3;9067;13;93;CKB +LINE_1;Station-3;2022-03-10 03:49:00;2022-03-10 04:12:00;Station-4;8.36;0;93;CKB +LINE_1;Station-4;2022-03-10 04:12:00;2022-03-10 04:12:00;Station-0;0.06;0;93;CKB +LINE_2;Station-0;2022-03-09 21:06:00;2022-03-09 21:06:00;Station-6;0.06;0;94;CKB +LINE_2;Station-6;2022-03-09 21:06:00;2022-03-09 21:34:00;Station-7;13018;19;94;CKB +LINE_2;Station-7;2022-03-09 21:53:00;2022-03-09 22:13:00;Station-8;10332;17;94;CKB +LINE_2;Station-8;2022-03-09 22:30:00;2022-03-09 22:54:00;Station-7;10.48;19;94;CKB +LINE_2;Station-7;2022-03-09 23:13:00;2022-03-09 23:33:00;Station-8;10332;17;94;CKB +LINE_2;Station-8;2022-03-09 23:50:00;2022-03-10 00:14:00;Station-7;10.48;2;94;CKB +LINE_2;Station-7;2022-03-10 00:16:00;2022-03-10 00:23:00;Station-9;3709;5;94;CKB +LINE_3;Station-9;2022-03-10 00:28:00;2022-03-10 00:44:00;Station-10;6404;3;94;CKB +LINE_3;Station-10;2022-03-10 00:47:00;2022-03-10 01:10:00;Station-11;10579;7;94;CKB +LINE_3;Station-11;2022-03-10 01:17:00;2022-03-10 01:44:00;Station-10;12007;3;94;CKB +LINE_3;Station-10;2022-03-10 01:47:00;2022-03-10 02:10:00;Station-11;10579;7;94;CKB +LINE_3;Station-11;2022-03-10 02:17:00;2022-03-10 02:44:00;Station-10;12007;3;94;CKB +LINE_3;Station-10;2022-03-10 02:47:00;2022-03-10 03:10:00;Station-11;10579;7;94;CKB +LINE_3;Station-11;2022-03-10 03:17:00;2022-03-10 03:44:00;Station-10;12007;3;94;CKB +LINE_3;Station-10;2022-03-10 03:47:00;2022-03-10 04:10:00;Station-11;10579;7;94;CKB +LINE_3;Station-11;2022-03-10 04:17:00;2022-03-10 04:44:00;Station-10;12007;0;94;CKB +LINE_3;Station-10;2022-03-10 04:44:00;2022-03-10 04:44:00;Station-0;0.06;0;94;CKB +LINE_2;Station-0;2022-03-09 20:26:00;2022-03-09 20:26:00;Station-6;0.06;0;95;CKB +LINE_2;Station-6;2022-03-09 20:26:00;2022-03-09 20:56:00;Station-12;14097;14;95;CKB +LINE_2;Station-12;2022-03-09 21:10:00;2022-03-09 21:38:00;Station-6;13.19;8;95;CKB +LINE_2;Station-6;2022-03-09 21:46:00;2022-03-09 22:14:00;Station-7;13018;19;95;CKB +LINE_2;Station-7;2022-03-09 22:33:00;2022-03-09 22:53:00;Station-8;10332;17;95;CKB +LINE_2;Station-8;2022-03-09 23:10:00;2022-03-09 23:34:00;Station-7;10.48;19;95;CKB +LINE_2;Station-7;2022-03-09 23:53:00;2022-03-10 00:13:00;Station-8;10332;2;95;CKB +LINE_2;Station-8;2022-03-10 00:15:00;2022-03-10 00:16:00;Station-10;506;1;95;CKB +LINE_3;Station-10;2022-03-10 00:17:00;2022-03-10 00:40:00;Station-11;10579;7;95;CKB +LINE_3;Station-11;2022-03-10 00:47:00;2022-03-10 01:14:00;Station-10;12007;3;95;CKB +LINE_3;Station-10;2022-03-10 01:17:00;2022-03-10 01:40:00;Station-11;10579;7;95;CKB +LINE_3;Station-11;2022-03-10 01:47:00;2022-03-10 02:14:00;Station-10;12007;3;95;CKB +LINE_3;Station-10;2022-03-10 02:17:00;2022-03-10 02:40:00;Station-11;10579;7;95;CKB +LINE_3;Station-11;2022-03-10 02:47:00;2022-03-10 03:14:00;Station-10;12007;3;95;CKB +LINE_3;Station-10;2022-03-10 03:17:00;2022-03-10 03:40:00;Station-11;10579;7;95;CKB +LINE_3;Station-11;2022-03-10 03:47:00;2022-03-10 04:14:00;Station-10;12007;3;95;CKB +LINE_3;Station-10;2022-03-10 04:17:00;2022-03-10 04:40:00;Station-11;10579;3;95;CKB +LINE_4;Station-11;2022-03-10 04:43:00;2022-03-10 04:58:00;Station-13;6161;0;95;CKB +LINE_4;Station-13;2022-03-10 04:58:00;2022-03-10 04:58:00;Station-0;0.06;0;95;CKB +LINE_5;Station-0;2022-03-09 22:56:00;2022-03-09 22:56:00;Station-14;0.06;0;96;CKB +LINE_5;Station-14;2022-03-09 22:56:00;2022-03-09 23:08:00;Station-15;5882;3;96;CKB +LINE_5;Station-15;2022-03-09 23:11:00;2022-03-09 23:25:00;Station-14;6232;0;96;CKB +LINE_5;Station-14;2022-03-09 23:25:00;2022-03-09 23:38:00;Station-15;6086;3;96;CKB +LINE_5;Station-15;2022-03-09 23:41:00;2022-03-09 23:55:00;Station-14;6232;0;96;CKB +LINE_5;Station-14;2022-03-09 23:55:00;2022-03-10 00:08:00;Station-15;6086;0;96;CKB +LINE_5;Station-15;2022-03-10 00:08:00;2022-03-10 00:08:00;Station-0;0.06;0;96;CKB +LINE_6;Station-0;2022-03-09 05:05:00;2022-03-09 05:05:00;Station-16;0.06;0;97;CKB +LINE_6;Station-16;2022-03-09 05:05:00;2022-03-09 05:14:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 05:14:00;2022-03-09 05:23:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 05:25:00;2022-03-09 05:34:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 05:34:00;2022-03-09 05:43:00;Station-16;5139;23;97;CKB +LINE_6;Station-16;2022-03-09 06:06:00;2022-03-09 06:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 06:15:00;2022-03-09 06:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 06:26:00;2022-03-09 06:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 06:35:00;2022-03-09 06:44:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 06:46:00;2022-03-09 06:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 06:55:00;2022-03-09 07:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 07:06:00;2022-03-09 07:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 07:15:00;2022-03-09 07:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 07:26:00;2022-03-09 07:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 07:35:00;2022-03-09 07:44:00;Station-16;5139;22;97;CKB +LINE_6;Station-16;2022-03-09 08:06:00;2022-03-09 08:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 08:15:00;2022-03-09 08:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 08:26:00;2022-03-09 08:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 08:35:00;2022-03-09 08:44:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 08:46:00;2022-03-09 08:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 08:55:00;2022-03-09 09:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 09:06:00;2022-03-09 09:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 09:15:00;2022-03-09 09:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 09:26:00;2022-03-09 09:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 09:35:00;2022-03-09 09:44:00;Station-16;5139;22;97;CKB +LINE_6;Station-16;2022-03-09 10:06:00;2022-03-09 10:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 10:15:00;2022-03-09 10:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 10:26:00;2022-03-09 10:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 10:35:00;2022-03-09 10:44:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 10:46:00;2022-03-09 10:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 10:55:00;2022-03-09 11:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 11:06:00;2022-03-09 11:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 11:15:00;2022-03-09 11:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 11:26:00;2022-03-09 11:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 11:35:00;2022-03-09 11:44:00;Station-16;5139;22;97;CKB +LINE_6;Station-16;2022-03-09 12:06:00;2022-03-09 12:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 12:15:00;2022-03-09 12:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 12:26:00;2022-03-09 12:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 12:35:00;2022-03-09 12:44:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 12:46:00;2022-03-09 12:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 12:55:00;2022-03-09 13:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 13:06:00;2022-03-09 13:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 13:15:00;2022-03-09 13:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 13:26:00;2022-03-09 13:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 13:35:00;2022-03-09 13:44:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 13:46:00;2022-03-09 13:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 13:55:00;2022-03-09 14:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 14:06:00;2022-03-09 14:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 14:15:00;2022-03-09 14:24:00;Station-16;5139;22;97;CKB +LINE_6;Station-16;2022-03-09 14:46:00;2022-03-09 14:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 14:55:00;2022-03-09 15:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 15:06:00;2022-03-09 15:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 15:15:00;2022-03-09 15:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 15:26:00;2022-03-09 15:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 15:35:00;2022-03-09 15:44:00;Station-16;5139;22;97;CKB +LINE_6;Station-16;2022-03-09 16:06:00;2022-03-09 16:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 16:15:00;2022-03-09 16:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 16:26:00;2022-03-09 16:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 16:35:00;2022-03-09 16:44:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 16:46:00;2022-03-09 16:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 16:55:00;2022-03-09 17:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 17:06:00;2022-03-09 17:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 17:15:00;2022-03-09 17:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 17:26:00;2022-03-09 17:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 17:35:00;2022-03-09 17:44:00;Station-16;5139;22;97;CKB +LINE_6;Station-16;2022-03-09 18:06:00;2022-03-09 18:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 18:15:00;2022-03-09 18:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 18:26:00;2022-03-09 18:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 18:35:00;2022-03-09 18:44:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 18:46:00;2022-03-09 18:55:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 18:55:00;2022-03-09 19:04:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 19:06:00;2022-03-09 19:15:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 19:15:00;2022-03-09 19:24:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 19:26:00;2022-03-09 19:35:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 19:35:00;2022-03-09 19:44:00;Station-16;5139;21;97;CKB +LINE_6;Station-16;2022-03-09 20:05:00;2022-03-09 20:14:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 20:14:00;2022-03-09 20:23:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 20:25:00;2022-03-09 20:34:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 20:34:00;2022-03-09 20:43:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 20:45:00;2022-03-09 20:54:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 20:54:00;2022-03-09 21:03:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 21:05:00;2022-03-09 21:14:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 21:14:00;2022-03-09 21:23:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 21:25:00;2022-03-09 21:34:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 21:34:00;2022-03-09 21:43:00;Station-16;5139;22;97;CKB +LINE_6;Station-16;2022-03-09 22:05:00;2022-03-09 22:14:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 22:14:00;2022-03-09 22:23:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 22:25:00;2022-03-09 22:34:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 22:34:00;2022-03-09 22:43:00;Station-16;5139;2;97;CKB +LINE_6;Station-16;2022-03-09 22:45:00;2022-03-09 22:54:00;Station-17;4781;0;97;CKB +LINE_6;Station-17;2022-03-09 22:54:00;2022-03-09 23:03:00;Station-16;5139;0;97;CKB +LINE_6;Station-16;2022-03-09 23:03:00;2022-03-09 23:03:00;Station-0;0.06;0;97;CKB +LINE_7;Station-0;2022-03-10 00:06:00;2022-03-10 00:06:00;Station-18;0.06;0;98;CKB +LINE_7;Station-18;2022-03-10 00:06:00;2022-03-10 00:27:00;Station-19;7827;0;98;CKB +LINE_8;Station-19;2022-03-10 00:27:00;2022-03-10 00:48:00;Station-20;11079;0;98;CKB +LINE_8;Station-20;2022-03-10 00:48:00;2022-03-10 01:25:00;Station-21;20641;8;98;CKB +LINE_8;Station-21;2022-03-10 01:33:00;2022-03-10 02:16:00;Station-20;20579;1;98;CKB +LINE_8;Station-20;2022-03-10 02:17:00;2022-03-10 02:55:00;Station-21;20641;8;98;CKB +LINE_8;Station-21;2022-03-10 03:03:00;2022-03-10 03:46:00;Station-20;20579;1;98;CKB +LINE_8;Station-20;2022-03-10 03:47:00;2022-03-10 04:25:00;Station-21;20641;0;98;CKB +LINE_8;Station-21;2022-03-10 04:25:00;2022-03-10 04:25:00;Station-0;0.06;0;98;CKB +LINE_9;Station-22;2022-03-09 05:15:00;2022-03-09 06:01:00;Station-23;17.9;0;99;VDL +LINE_9;Station-23;2022-03-09 06:01:00;2022-03-09 06:15:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 06:23:00;2022-03-09 06:37:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 06:41:00;2022-03-09 06:55:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 07:03:00;2022-03-09 07:17:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 07:21:00;2022-03-09 07:35:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 07:43:00;2022-03-09 07:57:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 08:01:00;2022-03-09 08:15:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 08:23:00;2022-03-09 08:37:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 08:41:00;2022-03-09 08:55:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 09:03:00;2022-03-09 09:17:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 09:21:00;2022-03-09 09:35:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 09:43:00;2022-03-09 09:57:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 10:01:00;2022-03-09 10:15:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 10:23:00;2022-03-09 10:37:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 10:41:00;2022-03-09 10:55:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 11:03:00;2022-03-09 11:17:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 11:21:00;2022-03-09 11:35:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 11:43:00;2022-03-09 11:57:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 12:01:00;2022-03-09 12:15:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 12:23:00;2022-03-09 12:37:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 12:41:00;2022-03-09 12:55:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 13:03:00;2022-03-09 13:17:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 13:21:00;2022-03-09 13:35:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 13:43:00;2022-03-09 13:57:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 14:01:00;2022-03-09 14:15:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 14:23:00;2022-03-09 14:37:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 14:41:00;2022-03-09 14:55:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 15:03:00;2022-03-09 15:17:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 15:21:00;2022-03-09 15:35:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 15:43:00;2022-03-09 15:57:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 16:01:00;2022-03-09 16:15:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 16:23:00;2022-03-09 16:37:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 16:41:00;2022-03-09 16:55:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 17:03:00;2022-03-09 17:17:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 17:21:00;2022-03-09 17:35:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 17:43:00;2022-03-09 17:57:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 18:01:00;2022-03-09 18:15:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 18:23:00;2022-03-09 18:37:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 18:41:00;2022-03-09 18:55:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 19:03:00;2022-03-09 19:17:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 19:21:00;2022-03-09 19:35:00;Station-23;4637;8;99;VDL +LINE_9;Station-23;2022-03-09 19:43:00;2022-03-09 19:57:00;Station-23;4637;4;99;VDL +LINE_9;Station-23;2022-03-09 20:01:00;2022-03-09 20:14:00;Station-23;4637;9;99;VDL +LINE_9;Station-23;2022-03-09 20:23:00;2022-03-09 20:36:00;Station-23;4637;0;99;VDL +LINE_9;Station-23;2022-03-09 20:36:00;2022-03-09 21:15:00;Station-22;19.8;0;99;VDL +LINE_10;Station-0;2022-03-09 04:56:00;2022-03-09 04:56:00;Station-24;0.06;18;100;CKB +LINE_10;Station-24;2022-03-09 05:14:00;2022-03-09 05:20:00;Station-25;3.29;0;100;CKB +LINE_10;Station-25;2022-03-09 05:20:00;2022-03-09 05:24:00;Station-24;2954;20;100;CKB +LINE_10;Station-24;2022-03-09 05:44:00;2022-03-09 05:50:00;Station-25;3.29;0;100;CKB +LINE_10;Station-25;2022-03-09 05:50:00;2022-03-09 05:54:00;Station-24;2954;5;100;CKB +LINE_10;Station-24;2022-03-09 05:59:00;2022-03-09 06:06:00;Station-25;3.29;2;100;CKB +LINE_10;Station-25;2022-03-09 06:08:00;2022-03-09 06:13:00;Station-24;2954;19;100;CKB +LINE_10;Station-24;2022-03-09 06:32:00;2022-03-09 06:39:00;Station-25;3.29;1;100;CKB +LINE_10;Station-25;2022-03-09 06:40:00;2022-03-09 06:45:00;Station-24;2954;7;100;CKB +LINE_10;Station-24;2022-03-09 06:52:00;2022-03-09 06:59:00;Station-25;3.29;1;100;CKB +LINE_10;Station-25;2022-03-09 07:00:00;2022-03-09 07:05:00;Station-24;2954;7;100;CKB +LINE_10;Station-24;2022-03-09 07:12:00;2022-03-09 07:19:00;Station-25;3.29;1;100;CKB +LINE_10;Station-25;2022-03-09 07:20:00;2022-03-09 07:25:00;Station-24;2954;7;100;CKB +LINE_10;Station-24;2022-03-09 07:32:00;2022-03-09 07:39:00;Station-25;3.29;1;100;CKB +LINE_10;Station-25;2022-03-09 07:40:00;2022-03-09 07:45:00;Station-24;2954;295;100;CKB +LINE_10;Station-24;2022-03-09 12:40:00;2022-03-09 12:47:00;Station-25;3.29;2;100;CKB +LINE_10;Station-25;2022-03-09 12:49:00;2022-03-09 12:54:00;Station-24;2954;46;100;CKB +LINE_10;Station-24;2022-03-09 13:40:00;2022-03-09 13:47:00;Station-25;3.29;2;100;CKB +LINE_10;Station-25;2022-03-09 13:49:00;2022-03-09 13:54:00;Station-24;2954;434;100;CKB +LINE_10;Station-24;2022-03-09 21:08:00;2022-03-09 21:08:00;Station-0;0.06;0;100;CKB +LINE_11;Station-0;2022-03-09 07:20:00;2022-03-09 07:20:00;Station-26;0.06;0;101;CKB +LINE_11;Station-26;2022-03-09 07:20:00;2022-03-09 07:50:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 08:00:00;2022-03-09 08:30:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 08:40:00;2022-03-09 09:10:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 09:20:00;2022-03-09 09:50:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 10:00:00;2022-03-09 10:30:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 10:40:00;2022-03-09 11:10:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 11:20:00;2022-03-09 11:50:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 12:00:00;2022-03-09 12:30:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 12:40:00;2022-03-09 13:10:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 13:20:00;2022-03-09 13:50:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 14:00:00;2022-03-09 14:30:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 14:40:00;2022-03-09 15:10:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 15:20:00;2022-03-09 15:50:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 16:00:00;2022-03-09 16:30:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 16:40:00;2022-03-09 17:10:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 17:20:00;2022-03-09 17:50:00;Station-26;9266;10;101;CKB +LINE_11;Station-26;2022-03-09 18:00:00;2022-03-09 18:30:00;Station-26;9266;0;101;CKB +LINE_11;Station-26;2022-03-09 18:30:00;2022-03-09 18:30:00;Station-0;0.06;0;101;CKB +LINE_12;Station-0;2022-03-09 07:10:00;2022-03-09 07:10:00;Station-27;0.06;0;102;CKB +LINE_12;Station-27;2022-03-09 07:10:00;2022-03-09 07:18:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 07:28:00;2022-03-09 07:40:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 07:40:00;2022-03-09 07:48:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 07:58:00;2022-03-09 08:10:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 08:10:00;2022-03-09 08:18:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 08:28:00;2022-03-09 08:40:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 08:40:00;2022-03-09 08:48:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 08:58:00;2022-03-09 09:10:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 09:10:00;2022-03-09 09:18:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 09:28:00;2022-03-09 09:40:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 09:40:00;2022-03-09 09:48:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 09:58:00;2022-03-09 10:10:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 10:10:00;2022-03-09 10:18:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 10:28:00;2022-03-09 10:40:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 10:40:00;2022-03-09 10:48:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 10:58:00;2022-03-09 11:10:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 11:10:00;2022-03-09 11:18:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 11:28:00;2022-03-09 11:40:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 11:40:00;2022-03-09 11:48:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 11:58:00;2022-03-09 12:10:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 12:10:00;2022-03-09 12:18:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 12:28:00;2022-03-09 12:40:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 12:40:00;2022-03-09 12:48:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 12:58:00;2022-03-09 13:10:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 13:10:00;2022-03-09 13:18:00;Station-28;2169;10;102;CKB +LINE_12;Station-28;2022-03-09 13:28:00;2022-03-09 13:40:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 13:40:00;2022-03-09 13:48:00;Station-28;2169;8;102;CKB +LINE_12;Station-28;2022-03-09 13:56:00;2022-03-09 14:10:00;Station-27;2952;0;102;CKB +LINE_12;Station-27;2022-03-09 14:10:00;2022-03-09 14:19:00;Station-28;2169;14;102;CKB +LINE_12;Station-28;2022-03-09 14:33:00;2022-03-09 14:47:00;Station-27;2952;3;102;CKB +LINE_12;Station-27;2022-03-09 14:50:00;2022-03-09 14:59:00;Station-28;2169;14;102;CKB +LINE_12;Station-28;2022-03-09 15:13:00;2022-03-09 15:27:00;Station-27;2952;3;102;CKB +LINE_12;Station-27;2022-03-09 15:30:00;2022-03-09 15:39:00;Station-28;2169;14;102;CKB +LINE_12;Station-28;2022-03-09 15:53:00;2022-03-09 16:07:00;Station-27;2952;3;102;CKB +LINE_12;Station-27;2022-03-09 16:10:00;2022-03-09 16:19:00;Station-28;2169;14;102;CKB +LINE_12;Station-28;2022-03-09 16:33:00;2022-03-09 16:47:00;Station-27;2952;3;102;CKB +LINE_12;Station-27;2022-03-09 16:50:00;2022-03-09 16:59:00;Station-28;2169;14;102;CKB +LINE_12;Station-28;2022-03-09 17:13:00;2022-03-09 17:27:00;Station-27;2952;3;102;CKB +LINE_12;Station-27;2022-03-09 17:30:00;2022-03-09 17:39:00;Station-28;2169;13;102;CKB +LINE_12;Station-28;2022-03-09 17:52:00;2022-03-09 18:05:00;Station-27;2952;5;102;CKB +LINE_12;Station-27;2022-03-09 18:10:00;2022-03-09 18:18:00;Station-28;2169;0;102;CKB +LINE_12;Station-28;2022-03-09 18:18:00;2022-03-09 18:18:00;Station-0;0.06;0;102;CKB +LINE_12;Station-0;2022-03-09 14:13:00;2022-03-09 14:13:00;Station-28;0.06;0;103;CKB +LINE_12;Station-28;2022-03-09 14:13:00;2022-03-09 14:27:00;Station-27;2952;3;103;CKB +LINE_12;Station-27;2022-03-09 14:30:00;2022-03-09 14:39:00;Station-28;2169;14;103;CKB +LINE_12;Station-28;2022-03-09 14:53:00;2022-03-09 15:07:00;Station-27;2952;3;103;CKB +LINE_12;Station-27;2022-03-09 15:10:00;2022-03-09 15:19:00;Station-28;2169;14;103;CKB +LINE_12;Station-28;2022-03-09 15:33:00;2022-03-09 15:47:00;Station-27;2952;3;103;CKB +LINE_12;Station-27;2022-03-09 15:50:00;2022-03-09 15:59:00;Station-28;2169;14;103;CKB +LINE_12;Station-28;2022-03-09 16:13:00;2022-03-09 16:27:00;Station-27;2952;3;103;CKB +LINE_12;Station-27;2022-03-09 16:30:00;2022-03-09 16:39:00;Station-28;2169;14;103;CKB +LINE_12;Station-28;2022-03-09 16:53:00;2022-03-09 17:07:00;Station-27;2952;3;103;CKB +LINE_12;Station-27;2022-03-09 17:10:00;2022-03-09 17:19:00;Station-28;2169;14;103;CKB +LINE_12;Station-28;2022-03-09 17:33:00;2022-03-09 17:47:00;Station-27;2952;3;103;CKB +LINE_12;Station-27;2022-03-09 17:50:00;2022-03-09 17:59:00;Station-28;2169;14;103;CKB +LINE_12;Station-28;2022-03-09 18:13:00;2022-03-09 18:25:00;Station-27;2952;0;103;CKB +LINE_12;Station-27;2022-03-09 18:25:00;2022-03-09 18:25:00;Station-0;0.06;0;103;CKB +LINE_13;Station-0;2022-03-10 00:23:00;2022-03-10 00:23:00;Station-29;0.06;0;104;CKB +LINE_13;Station-29;2022-03-10 00:23:00;2022-03-10 00:30:00;Station-30;2577;9;104;CKB +LINE_14;Station-30;2022-03-10 00:39:00;2022-03-10 00:54:00;Station-31;5937;9;104;CKB +LINE_14;Station-31;2022-03-10 01:03:00;2022-03-10 01:17:00;Station-30;6.19;0;104;CKB +LINE_13;Station-30;2022-03-10 01:17:00;2022-03-10 01:23:00;Station-29;2555;0;104;CKB +LINE_13;Station-29;2022-03-10 01:23:00;2022-03-10 01:30:00;Station-30;2577;9;104;CKB +LINE_14;Station-30;2022-03-10 01:39:00;2022-03-10 01:54:00;Station-31;5937;9;104;CKB +LINE_14;Station-31;2022-03-10 02:03:00;2022-03-10 02:17:00;Station-30;6.19;0;104;CKB +LINE_13;Station-30;2022-03-10 02:17:00;2022-03-10 02:23:00;Station-29;2555;0;104;CKB +LINE_13;Station-29;2022-03-10 02:23:00;2022-03-10 02:30:00;Station-30;2577;9;104;CKB +LINE_14;Station-30;2022-03-10 02:39:00;2022-03-10 02:54:00;Station-31;5937;9;104;CKB +LINE_14;Station-31;2022-03-10 03:03:00;2022-03-10 03:17:00;Station-30;6.19;0;104;CKB +LINE_13;Station-30;2022-03-10 03:17:00;2022-03-10 03:23:00;Station-29;2555;0;104;CKB +LINE_13;Station-29;2022-03-10 03:23:00;2022-03-10 03:30:00;Station-30;2577;9;104;CKB +LINE_14;Station-30;2022-03-10 03:39:00;2022-03-10 03:54:00;Station-31;5937;9;104;CKB +LINE_14;Station-31;2022-03-10 04:03:00;2022-03-10 04:17:00;Station-30;6.19;0;104;CKB +LINE_13;Station-30;2022-03-10 04:17:00;2022-03-10 04:23:00;Station-29;2555;0;104;CKB +LINE_13;Station-29;2022-03-10 04:23:00;2022-03-10 04:23:00;Station-0;0.06;0;104;CKB +LINE_14;Station-0;2022-03-10 00:33:00;2022-03-10 00:33:00;Station-31;0.06;0;105;CKB +LINE_14;Station-31;2022-03-10 00:33:00;2022-03-10 00:47:00;Station-30;6.19;0;105;CKB +LINE_13;Station-30;2022-03-10 00:47:00;2022-03-10 00:53:00;Station-29;2555;0;105;CKB +LINE_13;Station-29;2022-03-10 00:53:00;2022-03-10 01:00:00;Station-30;2577;9;105;CKB +LINE_14;Station-30;2022-03-10 01:09:00;2022-03-10 01:24:00;Station-31;5937;9;105;CKB +LINE_14;Station-31;2022-03-10 01:33:00;2022-03-10 01:47:00;Station-30;6.19;0;105;CKB +LINE_13;Station-30;2022-03-10 01:47:00;2022-03-10 01:53:00;Station-29;2555;0;105;CKB +LINE_13;Station-29;2022-03-10 01:53:00;2022-03-10 02:00:00;Station-30;2577;9;105;CKB +LINE_14;Station-30;2022-03-10 02:09:00;2022-03-10 02:24:00;Station-31;5937;9;105;CKB +LINE_14;Station-31;2022-03-10 02:33:00;2022-03-10 02:47:00;Station-30;6.19;0;105;CKB +LINE_13;Station-30;2022-03-10 02:47:00;2022-03-10 02:53:00;Station-29;2555;0;105;CKB +LINE_13;Station-29;2022-03-10 02:53:00;2022-03-10 03:00:00;Station-30;2577;9;105;CKB +LINE_14;Station-30;2022-03-10 03:09:00;2022-03-10 03:24:00;Station-31;5937;9;105;CKB +LINE_14;Station-31;2022-03-10 03:33:00;2022-03-10 03:47:00;Station-30;6.19;0;105;CKB +LINE_13;Station-30;2022-03-10 03:47:00;2022-03-10 03:53:00;Station-29;2555;0;105;CKB +LINE_13;Station-29;2022-03-10 03:53:00;2022-03-10 04:00:00;Station-30;2577;9;105;CKB +LINE_14;Station-30;2022-03-10 04:09:00;2022-03-10 04:24:00;Station-31;5937;0;105;CKB +LINE_14;Station-31;2022-03-10 04:24:00;2022-03-10 04:24:00;Station-0;0.06;0;105;CKB +LINE_15;Station-0;2022-03-10 00:57:00;2022-03-10 00:57:00;Station-32;0.06;0;106;CKB +LINE_15;Station-32;2022-03-10 00:57:00;2022-03-10 01:06:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 01:06:00;2022-03-10 01:11:00;Station-32;2936;16;106;CKB +LINE_15;Station-32;2022-03-10 01:27:00;2022-03-10 01:36:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 01:36:00;2022-03-10 01:41:00;Station-32;2936;16;106;CKB +LINE_15;Station-32;2022-03-10 01:57:00;2022-03-10 02:06:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 02:06:00;2022-03-10 02:11:00;Station-32;2936;16;106;CKB +LINE_15;Station-32;2022-03-10 02:27:00;2022-03-10 02:36:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 02:36:00;2022-03-10 02:41:00;Station-32;2936;16;106;CKB +LINE_15;Station-32;2022-03-10 02:57:00;2022-03-10 03:06:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 03:06:00;2022-03-10 03:11:00;Station-32;2936;16;106;CKB +LINE_15;Station-32;2022-03-10 03:27:00;2022-03-10 03:36:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 03:36:00;2022-03-10 03:41:00;Station-32;2936;16;106;CKB +LINE_15;Station-32;2022-03-10 03:57:00;2022-03-10 04:06:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 04:06:00;2022-03-10 04:11:00;Station-32;2936;16;106;CKB +LINE_15;Station-32;2022-03-10 04:27:00;2022-03-10 04:36:00;Station-33;4343;0;106;CKB +LINE_15;Station-33;2022-03-10 04:36:00;2022-03-10 04:36:00;Station-0;0.06;0;106;CKB +LINE_16;Station-0;2022-03-10 00:29:00;2022-03-10 00:29:00;Station-34;0.06;0;107;CKB +LINE_16;Station-34;2022-03-10 00:29:00;2022-03-10 00:41:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 00:47:00;2022-03-10 00:57:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 00:59:00;2022-03-10 01:11:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 01:17:00;2022-03-10 01:27:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 01:29:00;2022-03-10 01:41:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 01:47:00;2022-03-10 01:57:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 01:59:00;2022-03-10 02:11:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 02:17:00;2022-03-10 02:27:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 02:29:00;2022-03-10 02:41:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 02:47:00;2022-03-10 02:57:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 02:59:00;2022-03-10 03:11:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 03:17:00;2022-03-10 03:27:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 03:29:00;2022-03-10 03:41:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 03:47:00;2022-03-10 03:57:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 03:59:00;2022-03-10 04:11:00;Station-35;4481;6;107;CKB +LINE_16;Station-35;2022-03-10 04:17:00;2022-03-10 04:27:00;Station-34;4031;2;107;CKB +LINE_16;Station-34;2022-03-10 04:29:00;2022-03-10 04:41:00;Station-35;4481;0;107;CKB +LINE_16;Station-35;2022-03-10 04:41:00;2022-03-10 04:41:00;Station-0;0.06;0;107;CKB +LINE_17;Station-0;2022-03-10 00:30:00;2022-03-10 00:30:00;Station-34;0.06;0;108;CKB +LINE_17;Station-34;2022-03-10 00:30:00;2022-03-10 00:44:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 00:44:00;2022-03-10 00:57:00;Station-34;5302;3;108;CKB +LINE_17;Station-34;2022-03-10 01:00:00;2022-03-10 01:14:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 01:14:00;2022-03-10 01:27:00;Station-34;5302;3;108;CKB +LINE_17;Station-34;2022-03-10 01:30:00;2022-03-10 01:44:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 01:44:00;2022-03-10 01:57:00;Station-34;5302;3;108;CKB +LINE_17;Station-34;2022-03-10 02:00:00;2022-03-10 02:14:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 02:14:00;2022-03-10 02:27:00;Station-34;5302;3;108;CKB +LINE_17;Station-34;2022-03-10 02:30:00;2022-03-10 02:44:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 02:44:00;2022-03-10 02:57:00;Station-34;5302;3;108;CKB +LINE_17;Station-34;2022-03-10 03:00:00;2022-03-10 03:14:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 03:14:00;2022-03-10 03:27:00;Station-34;5302;3;108;CKB +LINE_17;Station-34;2022-03-10 03:30:00;2022-03-10 03:44:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 03:44:00;2022-03-10 03:57:00;Station-34;5302;3;108;CKB +LINE_17;Station-34;2022-03-10 04:00:00;2022-03-10 04:14:00;Station-36;4801;0;108;CKB +LINE_17;Station-36;2022-03-10 04:14:00;2022-03-10 04:27:00;Station-34;5302;0;108;CKB +LINE_17;Station-34;2022-03-10 04:27:00;2022-03-10 04:27:00;Station-0;0.06;0;108;CKB +LINE_18;Station-0;2022-03-10 00:43:00;2022-03-10 00:43:00;Station-37;0.06;0;109;CKB +LINE_18;Station-37;2022-03-10 00:43:00;2022-03-10 01:33:00;Station-37;20434;10;109;CKB +LINE_18;Station-37;2022-03-10 01:43:00;2022-03-10 02:33:00;Station-37;20434;10;109;CKB +LINE_18;Station-37;2022-03-10 02:43:00;2022-03-10 03:33:00;Station-37;20434;10;109;CKB +LINE_18;Station-37;2022-03-10 03:43:00;2022-03-10 04:33:00;Station-37;20434;0;109;CKB +LINE_18;Station-37;2022-03-10 04:33:00;2022-03-10 04:33:00;Station-0;0.06;0;109;CKB +LINE_18;Station-0;2022-03-10 00:13:00;2022-03-10 00:13:00;Station-37;0.06;0;110;CKB +LINE_18;Station-37;2022-03-10 00:13:00;2022-03-10 01:03:00;Station-37;20434;10;110;CKB +LINE_18;Station-37;2022-03-10 01:13:00;2022-03-10 02:03:00;Station-37;20434;10;110;CKB +LINE_18;Station-37;2022-03-10 02:13:00;2022-03-10 03:03:00;Station-37;20434;10;110;CKB +LINE_18;Station-37;2022-03-10 03:13:00;2022-03-10 04:03:00;Station-37;20434;0;110;CKB +LINE_18;Station-37;2022-03-10 04:03:00;2022-03-10 04:03:00;Station-0;0.06;0;110;CKB +LINE_19;Station-0;2022-03-10 00:24:00;2022-03-10 00:24:00;Station-38;0.06;0;111;CKB +LINE_19;Station-38;2022-03-10 00:24:00;2022-03-10 00:48:00;Station-39;11.86;4;111;CKB +LINE_19;Station-39;2022-03-10 00:52:00;2022-03-10 01:14:00;Station-38;11139;10;111;CKB +LINE_19;Station-38;2022-03-10 01:24:00;2022-03-10 01:48:00;Station-39;11.86;4;111;CKB +LINE_19;Station-39;2022-03-10 01:52:00;2022-03-10 02:14:00;Station-38;11139;10;111;CKB +LINE_19;Station-38;2022-03-10 02:24:00;2022-03-10 02:48:00;Station-39;11.86;4;111;CKB +LINE_19;Station-39;2022-03-10 02:52:00;2022-03-10 03:14:00;Station-38;11139;10;111;CKB +LINE_19;Station-38;2022-03-10 03:24:00;2022-03-10 03:48:00;Station-39;11.86;4;111;CKB +LINE_19;Station-39;2022-03-10 03:52:00;2022-03-10 04:14:00;Station-38;11139;0;111;CKB +LINE_19;Station-38;2022-03-10 04:14:00;2022-03-10 04:14:00;Station-0;0.06;0;111;CKB +LINE_19;Station-0;2022-03-10 00:22:00;2022-03-10 00:22:00;Station-39;0.06;0;112;CKB +LINE_19;Station-39;2022-03-10 00:22:00;2022-03-10 00:44:00;Station-38;11139;10;112;CKB +LINE_19;Station-38;2022-03-10 00:54:00;2022-03-10 01:18:00;Station-39;11.86;4;112;CKB +LINE_19;Station-39;2022-03-10 01:22:00;2022-03-10 01:44:00;Station-38;11139;10;112;CKB +LINE_19;Station-38;2022-03-10 01:54:00;2022-03-10 02:18:00;Station-39;11.86;4;112;CKB +LINE_19;Station-39;2022-03-10 02:22:00;2022-03-10 02:44:00;Station-38;11139;10;112;CKB +LINE_19;Station-38;2022-03-10 02:54:00;2022-03-10 03:18:00;Station-39;11.86;4;112;CKB +LINE_19;Station-39;2022-03-10 03:22:00;2022-03-10 03:44:00;Station-38;11139;10;112;CKB +LINE_19;Station-38;2022-03-10 03:54:00;2022-03-10 04:18:00;Station-39;11.86;4;112;CKB +LINE_19;Station-39;2022-03-10 04:22:00;2022-03-10 04:44:00;Station-38;11139;0;112;CKB +LINE_19;Station-38;2022-03-10 04:44:00;2022-03-10 04:44:00;Station-0;0.06;0;112;CKB +LINE_20;Station-0;2022-03-10 00:32:00;2022-03-10 00:32:00;Station-13;0.06;0;113;CKB +LINE_20;Station-13;2022-03-10 00:32:00;2022-03-10 00:44:00;Station-40;4212;3;113;CKB +LINE_20;Station-40;2022-03-10 00:47:00;2022-03-10 01:16:00;Station-41;13048;0;113;CKB +LINE_20;Station-41;2022-03-10 01:16:00;2022-03-10 01:42:00;Station-40;12869;5;113;CKB +LINE_20;Station-40;2022-03-10 01:47:00;2022-03-10 02:16:00;Station-41;13048;0;113;CKB +LINE_20;Station-41;2022-03-10 02:16:00;2022-03-10 02:42:00;Station-40;12869;5;113;CKB +LINE_20;Station-40;2022-03-10 02:47:00;2022-03-10 03:16:00;Station-41;13048;0;113;CKB +LINE_20;Station-41;2022-03-10 03:16:00;2022-03-10 03:42:00;Station-40;12869;5;113;CKB +LINE_20;Station-40;2022-03-10 03:47:00;2022-03-10 04:16:00;Station-41;13048;0;113;CKB +LINE_20;Station-41;2022-03-10 04:16:00;2022-03-10 04:34:00;Station-42;9538;0;113;CKB +LINE_20;Station-42;2022-03-10 04:34:00;2022-03-10 04:34:00;Station-0;0.06;0;113;CKB +LINE_20;Station-0;2022-03-10 00:17:00;2022-03-10 00:17:00;Station-40;0.06;0;114;CKB +LINE_20;Station-40;2022-03-10 00:17:00;2022-03-10 00:46:00;Station-41;13048;0;114;CKB +LINE_20;Station-41;2022-03-10 00:46:00;2022-03-10 01:12:00;Station-40;12869;5;114;CKB +LINE_20;Station-40;2022-03-10 01:17:00;2022-03-10 01:46:00;Station-41;13048;0;114;CKB +LINE_20;Station-41;2022-03-10 01:46:00;2022-03-10 02:12:00;Station-40;12869;5;114;CKB +LINE_20;Station-40;2022-03-10 02:17:00;2022-03-10 02:46:00;Station-41;13048;0;114;CKB +LINE_20;Station-41;2022-03-10 02:46:00;2022-03-10 03:12:00;Station-40;12869;5;114;CKB +LINE_20;Station-40;2022-03-10 03:17:00;2022-03-10 03:46:00;Station-41;13048;0;114;CKB +LINE_20;Station-41;2022-03-10 03:46:00;2022-03-10 04:12:00;Station-40;12869;5;114;CKB +LINE_20;Station-40;2022-03-10 04:17:00;2022-03-10 04:28:00;Station-13;4316;0;114;CKB +LINE_20;Station-13;2022-03-10 04:28:00;2022-03-10 04:28:00;Station-0;0.06;0;114;CKB +LINE_21;Station-0;2022-03-10 00:49:00;2022-03-10 00:49:00;Station-3;0.06;0;115;CKB +LINE_21;Station-3;2022-03-10 00:49:00;2022-03-10 01:04:00;Station-16;10229;0;115;CKB +LINE_21;Station-16;2022-03-10 01:04:00;2022-03-10 01:19:00;Station-3;11801;0;115;CKB +LINE_21;Station-3;2022-03-10 01:19:00;2022-03-10 01:34:00;Station-16;10229;0;115;CKB +LINE_21;Station-16;2022-03-10 01:34:00;2022-03-10 01:49:00;Station-3;11801;0;115;CKB +LINE_21;Station-3;2022-03-10 01:49:00;2022-03-10 02:04:00;Station-16;10229;0;115;CKB +LINE_21;Station-16;2022-03-10 02:04:00;2022-03-10 02:19:00;Station-3;11801;0;115;CKB +LINE_21;Station-3;2022-03-10 02:19:00;2022-03-10 02:34:00;Station-16;10229;0;115;CKB +LINE_21;Station-16;2022-03-10 02:34:00;2022-03-10 02:49:00;Station-3;11801;0;115;CKB +LINE_21;Station-3;2022-03-10 02:49:00;2022-03-10 03:04:00;Station-16;10229;0;115;CKB +LINE_21;Station-16;2022-03-10 03:04:00;2022-03-10 03:19:00;Station-3;11801;0;115;CKB +LINE_21;Station-3;2022-03-10 03:19:00;2022-03-10 03:34:00;Station-16;10229;0;115;CKB +LINE_21;Station-16;2022-03-10 03:34:00;2022-03-10 03:49:00;Station-3;11801;0;115;CKB +LINE_21;Station-3;2022-03-10 03:49:00;2022-03-10 04:04:00;Station-16;10229;0;115;CKB +LINE_21;Station-16;2022-03-10 04:04:00;2022-03-10 04:19:00;Station-3;11801;23;115;CKB +LINE_22;Station-3;2022-03-10 04:42:00;2022-03-10 05:04:00;Station-43;6.81;0;115;CKB +LINE_22;Station-43;2022-03-10 05:04:00;2022-03-10 05:04:00;Station-0;0.06;0;115;CKB +LINE_8;Station-0;2022-03-10 00:32:00;2022-03-10 00:32:00;Station-13;0.06;0;116;CKB +LINE_8;Station-13;2022-03-10 00:32:00;2022-03-10 00:57:00;Station-21;11545;6;116;CKB +LINE_8;Station-21;2022-03-10 01:03:00;2022-03-10 01:46:00;Station-20;20579;1;116;CKB +LINE_8;Station-20;2022-03-10 01:47:00;2022-03-10 02:25:00;Station-21;20641;8;116;CKB +LINE_8;Station-21;2022-03-10 02:33:00;2022-03-10 03:16:00;Station-20;20579;1;116;CKB +LINE_8;Station-20;2022-03-10 03:17:00;2022-03-10 03:55:00;Station-21;20641;8;116;CKB +LINE_8;Station-21;2022-03-10 04:03:00;2022-03-10 04:28:00;Station-13;11499;0;116;CKB +LINE_8;Station-13;2022-03-10 04:28:00;2022-03-10 04:28:00;Station-0;0.06;0;116;CKB +LINE_8;Station-0;2022-03-10 00:33:00;2022-03-10 00:33:00;Station-21;0.06;0;117;CKB +LINE_8;Station-21;2022-03-10 00:33:00;2022-03-10 01:16:00;Station-20;20579;1;117;CKB +LINE_8;Station-20;2022-03-10 01:17:00;2022-03-10 01:55:00;Station-21;20641;8;117;CKB +LINE_8;Station-21;2022-03-10 02:03:00;2022-03-10 02:46:00;Station-20;20579;1;117;CKB +LINE_8;Station-20;2022-03-10 02:47:00;2022-03-10 03:25:00;Station-21;20641;8;117;CKB +LINE_8;Station-21;2022-03-10 03:33:00;2022-03-10 04:16:00;Station-20;20579;1;117;CKB +LINE_8;Station-20;2022-03-10 04:17:00;2022-03-10 04:51:00;Station-44;18752;0;117;CKB +LINE_8;Station-44;2022-03-10 04:51:00;2022-03-10 04:51:00;Station-0;0.06;0;117;CKB +LINE_23;Station-0;2022-03-10 00:34:00;2022-03-10 00:34:00;Station-45;0.06;0;118;CKB +LINE_23;Station-45;2022-03-10 00:34:00;2022-03-10 01:00:00;Station-46;9016;0;118;CKB +LINE_23;Station-46;2022-03-10 01:00:00;2022-03-10 01:27:00;Station-45;10083;7;118;CKB +LINE_23;Station-45;2022-03-10 01:34:00;2022-03-10 02:00:00;Station-46;9016;0;118;CKB +LINE_23;Station-46;2022-03-10 02:00:00;2022-03-10 02:27:00;Station-45;10083;7;118;CKB +LINE_23;Station-45;2022-03-10 02:34:00;2022-03-10 03:00:00;Station-46;9016;0;118;CKB +LINE_23;Station-46;2022-03-10 03:00:00;2022-03-10 03:27:00;Station-45;10083;7;118;CKB +LINE_23;Station-45;2022-03-10 03:34:00;2022-03-10 04:00:00;Station-46;9016;0;118;CKB +LINE_23;Station-46;2022-03-10 04:00:00;2022-03-10 04:27:00;Station-45;10083;0;118;CKB +LINE_23;Station-45;2022-03-10 04:27:00;2022-03-10 04:27:00;Station-0;0.06;0;118;CKB +LINE_23;Station-0;2022-03-10 00:30:00;2022-03-10 00:30:00;Station-46;0.06;0;119;CKB +LINE_23;Station-46;2022-03-10 00:30:00;2022-03-10 00:57:00;Station-45;10083;7;119;CKB +LINE_23;Station-45;2022-03-10 01:04:00;2022-03-10 01:30:00;Station-46;9016;0;119;CKB +LINE_23;Station-46;2022-03-10 01:30:00;2022-03-10 01:57:00;Station-45;10083;7;119;CKB +LINE_23;Station-45;2022-03-10 02:04:00;2022-03-10 02:30:00;Station-46;9016;0;119;CKB +LINE_23;Station-46;2022-03-10 02:30:00;2022-03-10 02:57:00;Station-45;10083;7;119;CKB +LINE_23;Station-45;2022-03-10 03:04:00;2022-03-10 03:30:00;Station-46;9016;0;119;CKB +LINE_23;Station-46;2022-03-10 03:30:00;2022-03-10 03:57:00;Station-45;10083;7;119;CKB +LINE_23;Station-45;2022-03-10 04:04:00;2022-03-10 04:30:00;Station-46;9016;0;119;CKB +LINE_23;Station-46;2022-03-10 04:30:00;2022-03-10 04:57:00;Station-45;10083;0;119;CKB +LINE_23;Station-45;2022-03-10 04:57:00;2022-03-10 04:57:00;Station-0;0.06;0;119;CKB +LINE_24;Station-0;2022-03-10 00:31:00;2022-03-10 00:31:00;Station-21;0.06;0;120;CKB +LINE_24;Station-21;2022-03-10 00:31:00;2022-03-10 00:44:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 00:44:00;2022-03-10 00:56:00;Station-21;5362;5;120;CKB +LINE_24;Station-21;2022-03-10 01:01:00;2022-03-10 01:14:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 01:14:00;2022-03-10 01:26:00;Station-21;5362;5;120;CKB +LINE_24;Station-21;2022-03-10 01:31:00;2022-03-10 01:44:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 01:44:00;2022-03-10 01:56:00;Station-21;5362;5;120;CKB +LINE_24;Station-21;2022-03-10 02:01:00;2022-03-10 02:14:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 02:14:00;2022-03-10 02:26:00;Station-21;5362;5;120;CKB +LINE_24;Station-21;2022-03-10 02:31:00;2022-03-10 02:44:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 02:44:00;2022-03-10 02:56:00;Station-21;5362;5;120;CKB +LINE_24;Station-21;2022-03-10 03:01:00;2022-03-10 03:14:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 03:14:00;2022-03-10 03:26:00;Station-21;5362;5;120;CKB +LINE_24;Station-21;2022-03-10 03:31:00;2022-03-10 03:44:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 03:44:00;2022-03-10 03:56:00;Station-21;5362;5;120;CKB +LINE_24;Station-21;2022-03-10 04:01:00;2022-03-10 04:14:00;Station-47;4872;0;120;CKB +LINE_24;Station-47;2022-03-10 04:14:00;2022-03-10 04:26:00;Station-21;5362;0;120;CKB +LINE_24;Station-21;2022-03-10 04:26:00;2022-03-10 04:26:00;Station-0;0.06;0;120;CKB +LINE_25;Station-0;2022-03-10 00:31:00;2022-03-10 00:31:00;Station-21;0.06;0;121;CKB +LINE_25;Station-21;2022-03-10 00:31:00;2022-03-10 00:45:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 00:47:00;2022-03-10 01:01:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 01:01:00;2022-03-10 01:15:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 01:17:00;2022-03-10 01:31:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 01:31:00;2022-03-10 01:45:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 01:47:00;2022-03-10 02:01:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 02:01:00;2022-03-10 02:15:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 02:17:00;2022-03-10 02:31:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 02:31:00;2022-03-10 02:45:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 02:47:00;2022-03-10 03:01:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 03:01:00;2022-03-10 03:15:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 03:17:00;2022-03-10 03:31:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 03:31:00;2022-03-10 03:45:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 03:47:00;2022-03-10 04:01:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 04:01:00;2022-03-10 04:15:00;Station-48;5225;2;121;CKB +LINE_25;Station-48;2022-03-10 04:17:00;2022-03-10 04:31:00;Station-21;7617;0;121;CKB +LINE_25;Station-21;2022-03-10 04:31:00;2022-03-10 04:31:00;Station-0;0.06;0;121;CKB +LINE_26;Station-0;2022-03-10 00:43:00;2022-03-10 00:43:00;Station-49;0.06;0;122;CKB +LINE_26;Station-49;2022-03-10 00:43:00;2022-03-10 00:53:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 00:53:00;2022-03-10 01:03:00;Station-49;4408;10;122;CKB +LINE_26;Station-49;2022-03-10 01:13:00;2022-03-10 01:23:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 01:23:00;2022-03-10 01:33:00;Station-49;4408;10;122;CKB +LINE_26;Station-49;2022-03-10 01:43:00;2022-03-10 01:53:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 01:53:00;2022-03-10 02:03:00;Station-49;4408;10;122;CKB +LINE_26;Station-49;2022-03-10 02:13:00;2022-03-10 02:23:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 02:23:00;2022-03-10 02:33:00;Station-49;4408;10;122;CKB +LINE_26;Station-49;2022-03-10 02:43:00;2022-03-10 02:53:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 02:53:00;2022-03-10 03:03:00;Station-49;4408;10;122;CKB +LINE_26;Station-49;2022-03-10 03:13:00;2022-03-10 03:23:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 03:23:00;2022-03-10 03:33:00;Station-49;4408;10;122;CKB +LINE_26;Station-49;2022-03-10 03:43:00;2022-03-10 03:53:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 03:53:00;2022-03-10 04:03:00;Station-49;4408;10;122;CKB +LINE_26;Station-49;2022-03-10 04:13:00;2022-03-10 04:23:00;Station-50;4507;0;122;CKB +LINE_26;Station-50;2022-03-10 04:23:00;2022-03-10 04:33:00;Station-49;4408;0;122;CKB +LINE_26;Station-49;2022-03-10 04:33:00;2022-03-10 04:33:00;Station-0;0.06;0;122;CKB +LINE_0;Station-0;2022-03-10 21:31:00;2022-03-10 21:31:00;Station-1;0.06;0;123;CKB +LINE_0;Station-1;2022-03-10 21:31:00;2022-03-10 22:04:00;Station-2;14519;4;123;CKB +LINE_0;Station-2;2022-03-10 22:08:00;2022-03-10 22:43:00;Station-1;13541;8;123;CKB +LINE_0;Station-1;2022-03-10 22:51:00;2022-03-10 23:24:00;Station-2;14519;4;123;CKB +LINE_0;Station-2;2022-03-10 23:28:00;2022-03-11 00:03:00;Station-1;13541;8;123;CKB +LINE_0;Station-1;2022-03-11 00:11:00;2022-03-11 00:44:00;Station-2;14519;0;123;CKB +LINE_1;Station-2;2022-03-11 00:44:00;2022-03-11 00:54:00;Station-3;4.1;25;123;CKB +LINE_1;Station-3;2022-03-11 01:19:00;2022-03-11 01:42:00;Station-4;8.36;6;123;CKB +LINE_1;Station-4;2022-03-11 01:48:00;2022-03-11 02:06:00;Station-3;9067;13;123;CKB +LINE_1;Station-3;2022-03-11 02:19:00;2022-03-11 02:42:00;Station-4;8.36;6;123;CKB +LINE_1;Station-4;2022-03-11 02:48:00;2022-03-11 03:06:00;Station-3;9067;13;123;CKB +LINE_1;Station-3;2022-03-11 03:19:00;2022-03-11 03:42:00;Station-4;8.36;6;123;CKB +LINE_1;Station-4;2022-03-11 03:48:00;2022-03-11 04:06:00;Station-3;9067;0;123;CKB +LINE_1;Station-3;2022-03-11 04:06:00;2022-03-11 04:06:00;Station-0;0.06;0;123;CKB +LINE_0;Station-0;2022-03-10 22:11:00;2022-03-10 22:11:00;Station-1;0.06;0;124;CKB +LINE_0;Station-1;2022-03-10 22:11:00;2022-03-10 22:44:00;Station-2;14519;4;124;CKB +LINE_0;Station-2;2022-03-10 22:48:00;2022-03-10 23:23:00;Station-1;13541;8;124;CKB +LINE_0;Station-1;2022-03-10 23:31:00;2022-03-11 00:04:00;Station-2;14519;4;124;CKB +LINE_0;Station-2;2022-03-11 00:08:00;2022-03-11 00:39:00;Station-5;12213;0;124;CKB +LINE_1;Station-5;2022-03-11 00:39:00;2022-03-11 00:47:00;Station-3;4.0;2;124;CKB +LINE_1;Station-3;2022-03-11 00:49:00;2022-03-11 01:12:00;Station-4;8.36;6;124;CKB +LINE_1;Station-4;2022-03-11 01:18:00;2022-03-11 01:36:00;Station-3;9067;13;124;CKB +LINE_1;Station-3;2022-03-11 01:49:00;2022-03-11 02:12:00;Station-4;8.36;6;124;CKB +LINE_1;Station-4;2022-03-11 02:18:00;2022-03-11 02:36:00;Station-3;9067;13;124;CKB +LINE_1;Station-3;2022-03-11 02:49:00;2022-03-11 03:12:00;Station-4;8.36;6;124;CKB +LINE_1;Station-4;2022-03-11 03:18:00;2022-03-11 03:36:00;Station-3;9067;13;124;CKB +LINE_1;Station-3;2022-03-11 03:49:00;2022-03-11 04:12:00;Station-4;8.36;0;124;CKB +LINE_1;Station-4;2022-03-11 04:12:00;2022-03-11 04:12:00;Station-0;0.06;0;124;CKB +LINE_2;Station-0;2022-03-10 21:06:00;2022-03-10 21:06:00;Station-6;0.06;0;125;CKB +LINE_2;Station-6;2022-03-10 21:06:00;2022-03-10 21:34:00;Station-7;13018;19;125;CKB +LINE_2;Station-7;2022-03-10 21:53:00;2022-03-10 22:13:00;Station-8;10332;17;125;CKB +LINE_2;Station-8;2022-03-10 22:30:00;2022-03-10 22:54:00;Station-7;10.48;19;125;CKB +LINE_2;Station-7;2022-03-10 23:13:00;2022-03-10 23:33:00;Station-8;10332;17;125;CKB +LINE_2;Station-8;2022-03-10 23:50:00;2022-03-11 00:14:00;Station-7;10.48;2;125;CKB +LINE_2;Station-7;2022-03-11 00:16:00;2022-03-11 00:23:00;Station-9;3709;5;125;CKB +LINE_3;Station-9;2022-03-11 00:28:00;2022-03-11 00:44:00;Station-10;6404;3;125;CKB +LINE_3;Station-10;2022-03-11 00:47:00;2022-03-11 01:10:00;Station-11;10579;7;125;CKB +LINE_3;Station-11;2022-03-11 01:17:00;2022-03-11 01:44:00;Station-10;12007;3;125;CKB +LINE_3;Station-10;2022-03-11 01:47:00;2022-03-11 02:10:00;Station-11;10579;7;125;CKB +LINE_3;Station-11;2022-03-11 02:17:00;2022-03-11 02:44:00;Station-10;12007;3;125;CKB +LINE_3;Station-10;2022-03-11 02:47:00;2022-03-11 03:10:00;Station-11;10579;7;125;CKB +LINE_3;Station-11;2022-03-11 03:17:00;2022-03-11 03:44:00;Station-10;12007;3;125;CKB +LINE_3;Station-10;2022-03-11 03:47:00;2022-03-11 04:10:00;Station-11;10579;7;125;CKB +LINE_3;Station-11;2022-03-11 04:17:00;2022-03-11 04:44:00;Station-10;12007;0;125;CKB +LINE_3;Station-10;2022-03-11 04:44:00;2022-03-11 04:44:00;Station-0;0.06;0;125;CKB +LINE_2;Station-0;2022-03-10 20:26:00;2022-03-10 20:26:00;Station-6;0.06;0;126;CKB +LINE_2;Station-6;2022-03-10 20:26:00;2022-03-10 20:56:00;Station-12;14097;14;126;CKB +LINE_2;Station-12;2022-03-10 21:10:00;2022-03-10 21:38:00;Station-6;13.19;8;126;CKB +LINE_2;Station-6;2022-03-10 21:46:00;2022-03-10 22:14:00;Station-7;13018;19;126;CKB +LINE_2;Station-7;2022-03-10 22:33:00;2022-03-10 22:53:00;Station-8;10332;17;126;CKB +LINE_2;Station-8;2022-03-10 23:10:00;2022-03-10 23:34:00;Station-7;10.48;19;126;CKB +LINE_2;Station-7;2022-03-10 23:53:00;2022-03-11 00:13:00;Station-8;10332;2;126;CKB +LINE_2;Station-8;2022-03-11 00:15:00;2022-03-11 00:16:00;Station-10;506;1;126;CKB +LINE_3;Station-10;2022-03-11 00:17:00;2022-03-11 00:40:00;Station-11;10579;7;126;CKB +LINE_3;Station-11;2022-03-11 00:47:00;2022-03-11 01:14:00;Station-10;12007;3;126;CKB +LINE_3;Station-10;2022-03-11 01:17:00;2022-03-11 01:40:00;Station-11;10579;7;126;CKB +LINE_3;Station-11;2022-03-11 01:47:00;2022-03-11 02:14:00;Station-10;12007;3;126;CKB +LINE_3;Station-10;2022-03-11 02:17:00;2022-03-11 02:40:00;Station-11;10579;7;126;CKB +LINE_3;Station-11;2022-03-11 02:47:00;2022-03-11 03:14:00;Station-10;12007;3;126;CKB +LINE_3;Station-10;2022-03-11 03:17:00;2022-03-11 03:40:00;Station-11;10579;7;126;CKB +LINE_3;Station-11;2022-03-11 03:47:00;2022-03-11 04:14:00;Station-10;12007;3;126;CKB +LINE_3;Station-10;2022-03-11 04:17:00;2022-03-11 04:40:00;Station-11;10579;3;126;CKB +LINE_4;Station-11;2022-03-11 04:43:00;2022-03-11 04:58:00;Station-13;6161;0;126;CKB +LINE_4;Station-13;2022-03-11 04:58:00;2022-03-11 04:58:00;Station-0;0.06;0;126;CKB +LINE_5;Station-0;2022-03-10 22:56:00;2022-03-10 22:56:00;Station-14;0.06;0;127;CKB +LINE_5;Station-14;2022-03-10 22:56:00;2022-03-10 23:08:00;Station-15;5882;3;127;CKB +LINE_5;Station-15;2022-03-10 23:11:00;2022-03-10 23:25:00;Station-14;6232;0;127;CKB +LINE_5;Station-14;2022-03-10 23:25:00;2022-03-10 23:38:00;Station-15;6086;3;127;CKB +LINE_5;Station-15;2022-03-10 23:41:00;2022-03-10 23:55:00;Station-14;6232;0;127;CKB +LINE_5;Station-14;2022-03-10 23:55:00;2022-03-11 00:08:00;Station-15;6086;0;127;CKB +LINE_5;Station-15;2022-03-11 00:08:00;2022-03-11 00:08:00;Station-0;0.06;0;127;CKB +LINE_6;Station-0;2022-03-10 05:05:00;2022-03-10 05:05:00;Station-16;0.06;0;128;CKB +LINE_6;Station-16;2022-03-10 05:05:00;2022-03-10 05:14:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 05:14:00;2022-03-10 05:23:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 05:25:00;2022-03-10 05:34:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 05:34:00;2022-03-10 05:43:00;Station-16;5139;23;128;CKB +LINE_6;Station-16;2022-03-10 06:06:00;2022-03-10 06:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 06:15:00;2022-03-10 06:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 06:26:00;2022-03-10 06:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 06:35:00;2022-03-10 06:44:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 06:46:00;2022-03-10 06:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 06:55:00;2022-03-10 07:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 07:06:00;2022-03-10 07:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 07:15:00;2022-03-10 07:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 07:26:00;2022-03-10 07:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 07:35:00;2022-03-10 07:44:00;Station-16;5139;22;128;CKB +LINE_6;Station-16;2022-03-10 08:06:00;2022-03-10 08:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 08:15:00;2022-03-10 08:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 08:26:00;2022-03-10 08:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 08:35:00;2022-03-10 08:44:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 08:46:00;2022-03-10 08:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 08:55:00;2022-03-10 09:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 09:06:00;2022-03-10 09:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 09:15:00;2022-03-10 09:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 09:26:00;2022-03-10 09:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 09:35:00;2022-03-10 09:44:00;Station-16;5139;22;128;CKB +LINE_6;Station-16;2022-03-10 10:06:00;2022-03-10 10:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 10:15:00;2022-03-10 10:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 10:26:00;2022-03-10 10:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 10:35:00;2022-03-10 10:44:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 10:46:00;2022-03-10 10:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 10:55:00;2022-03-10 11:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 11:06:00;2022-03-10 11:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 11:15:00;2022-03-10 11:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 11:26:00;2022-03-10 11:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 11:35:00;2022-03-10 11:44:00;Station-16;5139;22;128;CKB +LINE_6;Station-16;2022-03-10 12:06:00;2022-03-10 12:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 12:15:00;2022-03-10 12:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 12:26:00;2022-03-10 12:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 12:35:00;2022-03-10 12:44:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 12:46:00;2022-03-10 12:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 12:55:00;2022-03-10 13:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 13:06:00;2022-03-10 13:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 13:15:00;2022-03-10 13:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 13:26:00;2022-03-10 13:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 13:35:00;2022-03-10 13:44:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 13:46:00;2022-03-10 13:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 13:55:00;2022-03-10 14:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 14:06:00;2022-03-10 14:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 14:15:00;2022-03-10 14:24:00;Station-16;5139;22;128;CKB +LINE_6;Station-16;2022-03-10 14:46:00;2022-03-10 14:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 14:55:00;2022-03-10 15:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 15:06:00;2022-03-10 15:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 15:15:00;2022-03-10 15:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 15:26:00;2022-03-10 15:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 15:35:00;2022-03-10 15:44:00;Station-16;5139;22;128;CKB +LINE_6;Station-16;2022-03-10 16:06:00;2022-03-10 16:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 16:15:00;2022-03-10 16:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 16:26:00;2022-03-10 16:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 16:35:00;2022-03-10 16:44:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 16:46:00;2022-03-10 16:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 16:55:00;2022-03-10 17:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 17:06:00;2022-03-10 17:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 17:15:00;2022-03-10 17:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 17:26:00;2022-03-10 17:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 17:35:00;2022-03-10 17:44:00;Station-16;5139;22;128;CKB +LINE_6;Station-16;2022-03-10 18:06:00;2022-03-10 18:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 18:15:00;2022-03-10 18:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 18:26:00;2022-03-10 18:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 18:35:00;2022-03-10 18:44:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 18:46:00;2022-03-10 18:55:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 18:55:00;2022-03-10 19:04:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 19:06:00;2022-03-10 19:15:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 19:15:00;2022-03-10 19:24:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 19:26:00;2022-03-10 19:35:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 19:35:00;2022-03-10 19:44:00;Station-16;5139;21;128;CKB +LINE_6;Station-16;2022-03-10 20:05:00;2022-03-10 20:14:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 20:14:00;2022-03-10 20:23:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 20:25:00;2022-03-10 20:34:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 20:34:00;2022-03-10 20:43:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 20:45:00;2022-03-10 20:54:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 20:54:00;2022-03-10 21:03:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 21:05:00;2022-03-10 21:14:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 21:14:00;2022-03-10 21:23:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 21:25:00;2022-03-10 21:34:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 21:34:00;2022-03-10 21:43:00;Station-16;5139;22;128;CKB +LINE_6;Station-16;2022-03-10 22:05:00;2022-03-10 22:14:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 22:14:00;2022-03-10 22:23:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 22:25:00;2022-03-10 22:34:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 22:34:00;2022-03-10 22:43:00;Station-16;5139;2;128;CKB +LINE_6;Station-16;2022-03-10 22:45:00;2022-03-10 22:54:00;Station-17;4781;0;128;CKB +LINE_6;Station-17;2022-03-10 22:54:00;2022-03-10 23:03:00;Station-16;5139;0;128;CKB +LINE_6;Station-16;2022-03-10 23:03:00;2022-03-10 23:03:00;Station-0;0.06;0;128;CKB +LINE_7;Station-0;2022-03-11 00:06:00;2022-03-11 00:06:00;Station-18;0.06;0;129;CKB +LINE_7;Station-18;2022-03-11 00:06:00;2022-03-11 00:27:00;Station-19;7827;0;129;CKB +LINE_8;Station-19;2022-03-11 00:27:00;2022-03-11 00:48:00;Station-20;11079;0;129;CKB +LINE_8;Station-20;2022-03-11 00:48:00;2022-03-11 01:25:00;Station-21;20641;8;129;CKB +LINE_8;Station-21;2022-03-11 01:33:00;2022-03-11 02:16:00;Station-20;20579;1;129;CKB +LINE_8;Station-20;2022-03-11 02:17:00;2022-03-11 02:55:00;Station-21;20641;8;129;CKB +LINE_8;Station-21;2022-03-11 03:03:00;2022-03-11 03:46:00;Station-20;20579;1;129;CKB +LINE_8;Station-20;2022-03-11 03:47:00;2022-03-11 04:25:00;Station-21;20641;0;129;CKB +LINE_8;Station-21;2022-03-11 04:25:00;2022-03-11 04:25:00;Station-0;0.06;0;129;CKB +LINE_9;Station-22;2022-03-10 05:15:00;2022-03-10 06:01:00;Station-23;17.9;0;130;VDL +LINE_9;Station-23;2022-03-10 06:01:00;2022-03-10 06:15:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 06:23:00;2022-03-10 06:37:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 06:41:00;2022-03-10 06:55:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 07:03:00;2022-03-10 07:17:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 07:21:00;2022-03-10 07:35:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 07:43:00;2022-03-10 07:57:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 08:01:00;2022-03-10 08:15:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 08:23:00;2022-03-10 08:37:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 08:41:00;2022-03-10 08:55:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 09:03:00;2022-03-10 09:17:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 09:21:00;2022-03-10 09:35:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 09:43:00;2022-03-10 09:57:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 10:01:00;2022-03-10 10:15:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 10:23:00;2022-03-10 10:37:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 10:41:00;2022-03-10 10:55:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 11:03:00;2022-03-10 11:17:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 11:21:00;2022-03-10 11:35:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 11:43:00;2022-03-10 11:57:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 12:01:00;2022-03-10 12:15:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 12:23:00;2022-03-10 12:37:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 12:41:00;2022-03-10 12:55:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 13:03:00;2022-03-10 13:17:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 13:21:00;2022-03-10 13:35:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 13:43:00;2022-03-10 13:57:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 14:01:00;2022-03-10 14:15:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 14:23:00;2022-03-10 14:37:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 14:41:00;2022-03-10 14:55:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 15:03:00;2022-03-10 15:17:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 15:21:00;2022-03-10 15:35:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 15:43:00;2022-03-10 15:57:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 16:01:00;2022-03-10 16:15:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 16:23:00;2022-03-10 16:37:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 16:41:00;2022-03-10 16:55:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 17:03:00;2022-03-10 17:17:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 17:21:00;2022-03-10 17:35:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 17:43:00;2022-03-10 17:57:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 18:01:00;2022-03-10 18:15:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 18:23:00;2022-03-10 18:37:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 18:41:00;2022-03-10 18:55:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 19:03:00;2022-03-10 19:17:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 19:21:00;2022-03-10 19:35:00;Station-23;4637;8;130;VDL +LINE_9;Station-23;2022-03-10 19:43:00;2022-03-10 19:57:00;Station-23;4637;4;130;VDL +LINE_9;Station-23;2022-03-10 20:01:00;2022-03-10 20:14:00;Station-23;4637;9;130;VDL +LINE_9;Station-23;2022-03-10 20:23:00;2022-03-10 20:36:00;Station-23;4637;0;130;VDL +LINE_9;Station-23;2022-03-10 20:36:00;2022-03-10 21:15:00;Station-22;19.8;0;130;VDL +LINE_10;Station-0;2022-03-10 04:56:00;2022-03-10 04:56:00;Station-24;0.06;18;131;CKB +LINE_10;Station-24;2022-03-10 05:14:00;2022-03-10 05:20:00;Station-25;3.29;0;131;CKB +LINE_10;Station-25;2022-03-10 05:20:00;2022-03-10 05:24:00;Station-24;2954;20;131;CKB +LINE_10;Station-24;2022-03-10 05:44:00;2022-03-10 05:50:00;Station-25;3.29;0;131;CKB +LINE_10;Station-25;2022-03-10 05:50:00;2022-03-10 05:54:00;Station-24;2954;5;131;CKB +LINE_10;Station-24;2022-03-10 05:59:00;2022-03-10 06:06:00;Station-25;3.29;2;131;CKB +LINE_10;Station-25;2022-03-10 06:08:00;2022-03-10 06:13:00;Station-24;2954;19;131;CKB +LINE_10;Station-24;2022-03-10 06:32:00;2022-03-10 06:39:00;Station-25;3.29;1;131;CKB +LINE_10;Station-25;2022-03-10 06:40:00;2022-03-10 06:45:00;Station-24;2954;7;131;CKB +LINE_10;Station-24;2022-03-10 06:52:00;2022-03-10 06:59:00;Station-25;3.29;1;131;CKB +LINE_10;Station-25;2022-03-10 07:00:00;2022-03-10 07:05:00;Station-24;2954;7;131;CKB +LINE_10;Station-24;2022-03-10 07:12:00;2022-03-10 07:19:00;Station-25;3.29;1;131;CKB +LINE_10;Station-25;2022-03-10 07:20:00;2022-03-10 07:25:00;Station-24;2954;7;131;CKB +LINE_10;Station-24;2022-03-10 07:32:00;2022-03-10 07:39:00;Station-25;3.29;1;131;CKB +LINE_10;Station-25;2022-03-10 07:40:00;2022-03-10 07:45:00;Station-24;2954;295;131;CKB +LINE_10;Station-24;2022-03-10 12:40:00;2022-03-10 12:47:00;Station-25;3.29;2;131;CKB +LINE_10;Station-25;2022-03-10 12:49:00;2022-03-10 12:54:00;Station-24;2954;46;131;CKB +LINE_10;Station-24;2022-03-10 13:40:00;2022-03-10 13:47:00;Station-25;3.29;2;131;CKB +LINE_10;Station-25;2022-03-10 13:49:00;2022-03-10 13:54:00;Station-24;2954;434;131;CKB +LINE_10;Station-24;2022-03-10 21:08:00;2022-03-10 21:08:00;Station-0;0.06;0;131;CKB +LINE_11;Station-0;2022-03-10 07:20:00;2022-03-10 07:20:00;Station-26;0.06;0;132;CKB +LINE_11;Station-26;2022-03-10 07:20:00;2022-03-10 07:50:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 08:00:00;2022-03-10 08:30:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 08:40:00;2022-03-10 09:10:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 09:20:00;2022-03-10 09:50:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 10:00:00;2022-03-10 10:30:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 10:40:00;2022-03-10 11:10:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 11:20:00;2022-03-10 11:50:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 12:00:00;2022-03-10 12:30:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 12:40:00;2022-03-10 13:10:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 13:20:00;2022-03-10 13:50:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 14:00:00;2022-03-10 14:30:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 14:40:00;2022-03-10 15:10:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 15:20:00;2022-03-10 15:50:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 16:00:00;2022-03-10 16:30:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 16:40:00;2022-03-10 17:10:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 17:20:00;2022-03-10 17:50:00;Station-26;9266;10;132;CKB +LINE_11;Station-26;2022-03-10 18:00:00;2022-03-10 18:30:00;Station-26;9266;0;132;CKB +LINE_11;Station-26;2022-03-10 18:30:00;2022-03-10 18:30:00;Station-0;0.06;0;132;CKB +LINE_12;Station-0;2022-03-10 07:10:00;2022-03-10 07:10:00;Station-27;0.06;0;133;CKB +LINE_12;Station-27;2022-03-10 07:10:00;2022-03-10 07:18:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 07:28:00;2022-03-10 07:40:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 07:40:00;2022-03-10 07:48:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 07:58:00;2022-03-10 08:10:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 08:10:00;2022-03-10 08:18:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 08:28:00;2022-03-10 08:40:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 08:40:00;2022-03-10 08:48:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 08:58:00;2022-03-10 09:10:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 09:10:00;2022-03-10 09:18:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 09:28:00;2022-03-10 09:40:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 09:40:00;2022-03-10 09:48:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 09:58:00;2022-03-10 10:10:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 10:10:00;2022-03-10 10:18:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 10:28:00;2022-03-10 10:40:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 10:40:00;2022-03-10 10:48:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 10:58:00;2022-03-10 11:10:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 11:10:00;2022-03-10 11:18:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 11:28:00;2022-03-10 11:40:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 11:40:00;2022-03-10 11:48:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 11:58:00;2022-03-10 12:10:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 12:10:00;2022-03-10 12:18:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 12:28:00;2022-03-10 12:40:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 12:40:00;2022-03-10 12:48:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 12:58:00;2022-03-10 13:10:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 13:10:00;2022-03-10 13:18:00;Station-28;2169;10;133;CKB +LINE_12;Station-28;2022-03-10 13:28:00;2022-03-10 13:40:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 13:40:00;2022-03-10 13:48:00;Station-28;2169;8;133;CKB +LINE_12;Station-28;2022-03-10 13:56:00;2022-03-10 14:10:00;Station-27;2952;0;133;CKB +LINE_12;Station-27;2022-03-10 14:10:00;2022-03-10 14:19:00;Station-28;2169;14;133;CKB +LINE_12;Station-28;2022-03-10 14:33:00;2022-03-10 14:47:00;Station-27;2952;3;133;CKB +LINE_12;Station-27;2022-03-10 14:50:00;2022-03-10 14:59:00;Station-28;2169;14;133;CKB +LINE_12;Station-28;2022-03-10 15:13:00;2022-03-10 15:27:00;Station-27;2952;3;133;CKB +LINE_12;Station-27;2022-03-10 15:30:00;2022-03-10 15:39:00;Station-28;2169;14;133;CKB +LINE_12;Station-28;2022-03-10 15:53:00;2022-03-10 16:07:00;Station-27;2952;3;133;CKB +LINE_12;Station-27;2022-03-10 16:10:00;2022-03-10 16:19:00;Station-28;2169;14;133;CKB +LINE_12;Station-28;2022-03-10 16:33:00;2022-03-10 16:47:00;Station-27;2952;3;133;CKB +LINE_12;Station-27;2022-03-10 16:50:00;2022-03-10 16:59:00;Station-28;2169;14;133;CKB +LINE_12;Station-28;2022-03-10 17:13:00;2022-03-10 17:27:00;Station-27;2952;3;133;CKB +LINE_12;Station-27;2022-03-10 17:30:00;2022-03-10 17:39:00;Station-28;2169;13;133;CKB +LINE_12;Station-28;2022-03-10 17:52:00;2022-03-10 18:05:00;Station-27;2952;5;133;CKB +LINE_12;Station-27;2022-03-10 18:10:00;2022-03-10 18:18:00;Station-28;2169;0;133;CKB +LINE_12;Station-28;2022-03-10 18:18:00;2022-03-10 18:18:00;Station-0;0.06;0;133;CKB +LINE_12;Station-0;2022-03-10 14:13:00;2022-03-10 14:13:00;Station-28;0.06;0;134;CKB +LINE_12;Station-28;2022-03-10 14:13:00;2022-03-10 14:27:00;Station-27;2952;3;134;CKB +LINE_12;Station-27;2022-03-10 14:30:00;2022-03-10 14:39:00;Station-28;2169;14;134;CKB +LINE_12;Station-28;2022-03-10 14:53:00;2022-03-10 15:07:00;Station-27;2952;3;134;CKB +LINE_12;Station-27;2022-03-10 15:10:00;2022-03-10 15:19:00;Station-28;2169;14;134;CKB +LINE_12;Station-28;2022-03-10 15:33:00;2022-03-10 15:47:00;Station-27;2952;3;134;CKB +LINE_12;Station-27;2022-03-10 15:50:00;2022-03-10 15:59:00;Station-28;2169;14;134;CKB +LINE_12;Station-28;2022-03-10 16:13:00;2022-03-10 16:27:00;Station-27;2952;3;134;CKB +LINE_12;Station-27;2022-03-10 16:30:00;2022-03-10 16:39:00;Station-28;2169;14;134;CKB +LINE_12;Station-28;2022-03-10 16:53:00;2022-03-10 17:07:00;Station-27;2952;3;134;CKB +LINE_12;Station-27;2022-03-10 17:10:00;2022-03-10 17:19:00;Station-28;2169;14;134;CKB +LINE_12;Station-28;2022-03-10 17:33:00;2022-03-10 17:47:00;Station-27;2952;3;134;CKB +LINE_12;Station-27;2022-03-10 17:50:00;2022-03-10 17:59:00;Station-28;2169;14;134;CKB +LINE_12;Station-28;2022-03-10 18:13:00;2022-03-10 18:25:00;Station-27;2952;0;134;CKB +LINE_12;Station-27;2022-03-10 18:25:00;2022-03-10 18:25:00;Station-0;0.06;0;134;CKB +LINE_13;Station-0;2022-03-11 00:23:00;2022-03-11 00:23:00;Station-29;0.06;0;135;CKB +LINE_13;Station-29;2022-03-11 00:23:00;2022-03-11 00:30:00;Station-30;2577;9;135;CKB +LINE_14;Station-30;2022-03-11 00:39:00;2022-03-11 00:54:00;Station-31;5937;9;135;CKB +LINE_14;Station-31;2022-03-11 01:03:00;2022-03-11 01:17:00;Station-30;6.19;0;135;CKB +LINE_13;Station-30;2022-03-11 01:17:00;2022-03-11 01:23:00;Station-29;2555;0;135;CKB +LINE_13;Station-29;2022-03-11 01:23:00;2022-03-11 01:30:00;Station-30;2577;9;135;CKB +LINE_14;Station-30;2022-03-11 01:39:00;2022-03-11 01:54:00;Station-31;5937;9;135;CKB +LINE_14;Station-31;2022-03-11 02:03:00;2022-03-11 02:17:00;Station-30;6.19;0;135;CKB +LINE_13;Station-30;2022-03-11 02:17:00;2022-03-11 02:23:00;Station-29;2555;0;135;CKB +LINE_13;Station-29;2022-03-11 02:23:00;2022-03-11 02:30:00;Station-30;2577;9;135;CKB +LINE_14;Station-30;2022-03-11 02:39:00;2022-03-11 02:54:00;Station-31;5937;9;135;CKB +LINE_14;Station-31;2022-03-11 03:03:00;2022-03-11 03:17:00;Station-30;6.19;0;135;CKB +LINE_13;Station-30;2022-03-11 03:17:00;2022-03-11 03:23:00;Station-29;2555;0;135;CKB +LINE_13;Station-29;2022-03-11 03:23:00;2022-03-11 03:30:00;Station-30;2577;9;135;CKB +LINE_14;Station-30;2022-03-11 03:39:00;2022-03-11 03:54:00;Station-31;5937;9;135;CKB +LINE_14;Station-31;2022-03-11 04:03:00;2022-03-11 04:17:00;Station-30;6.19;0;135;CKB +LINE_13;Station-30;2022-03-11 04:17:00;2022-03-11 04:23:00;Station-29;2555;0;135;CKB +LINE_13;Station-29;2022-03-11 04:23:00;2022-03-11 04:23:00;Station-0;0.06;0;135;CKB +LINE_14;Station-0;2022-03-11 00:33:00;2022-03-11 00:33:00;Station-31;0.06;0;136;CKB +LINE_14;Station-31;2022-03-11 00:33:00;2022-03-11 00:47:00;Station-30;6.19;0;136;CKB +LINE_13;Station-30;2022-03-11 00:47:00;2022-03-11 00:53:00;Station-29;2555;0;136;CKB +LINE_13;Station-29;2022-03-11 00:53:00;2022-03-11 01:00:00;Station-30;2577;9;136;CKB +LINE_14;Station-30;2022-03-11 01:09:00;2022-03-11 01:24:00;Station-31;5937;9;136;CKB +LINE_14;Station-31;2022-03-11 01:33:00;2022-03-11 01:47:00;Station-30;6.19;0;136;CKB +LINE_13;Station-30;2022-03-11 01:47:00;2022-03-11 01:53:00;Station-29;2555;0;136;CKB +LINE_13;Station-29;2022-03-11 01:53:00;2022-03-11 02:00:00;Station-30;2577;9;136;CKB +LINE_14;Station-30;2022-03-11 02:09:00;2022-03-11 02:24:00;Station-31;5937;9;136;CKB +LINE_14;Station-31;2022-03-11 02:33:00;2022-03-11 02:47:00;Station-30;6.19;0;136;CKB +LINE_13;Station-30;2022-03-11 02:47:00;2022-03-11 02:53:00;Station-29;2555;0;136;CKB +LINE_13;Station-29;2022-03-11 02:53:00;2022-03-11 03:00:00;Station-30;2577;9;136;CKB +LINE_14;Station-30;2022-03-11 03:09:00;2022-03-11 03:24:00;Station-31;5937;9;136;CKB +LINE_14;Station-31;2022-03-11 03:33:00;2022-03-11 03:47:00;Station-30;6.19;0;136;CKB +LINE_13;Station-30;2022-03-11 03:47:00;2022-03-11 03:53:00;Station-29;2555;0;136;CKB +LINE_13;Station-29;2022-03-11 03:53:00;2022-03-11 04:00:00;Station-30;2577;9;136;CKB +LINE_14;Station-30;2022-03-11 04:09:00;2022-03-11 04:24:00;Station-31;5937;0;136;CKB +LINE_14;Station-31;2022-03-11 04:24:00;2022-03-11 04:24:00;Station-0;0.06;0;136;CKB +LINE_15;Station-0;2022-03-11 00:57:00;2022-03-11 00:57:00;Station-32;0.06;0;137;CKB +LINE_15;Station-32;2022-03-11 00:57:00;2022-03-11 01:06:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 01:06:00;2022-03-11 01:11:00;Station-32;2936;16;137;CKB +LINE_15;Station-32;2022-03-11 01:27:00;2022-03-11 01:36:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 01:36:00;2022-03-11 01:41:00;Station-32;2936;16;137;CKB +LINE_15;Station-32;2022-03-11 01:57:00;2022-03-11 02:06:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 02:06:00;2022-03-11 02:11:00;Station-32;2936;16;137;CKB +LINE_15;Station-32;2022-03-11 02:27:00;2022-03-11 02:36:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 02:36:00;2022-03-11 02:41:00;Station-32;2936;16;137;CKB +LINE_15;Station-32;2022-03-11 02:57:00;2022-03-11 03:06:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 03:06:00;2022-03-11 03:11:00;Station-32;2936;16;137;CKB +LINE_15;Station-32;2022-03-11 03:27:00;2022-03-11 03:36:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 03:36:00;2022-03-11 03:41:00;Station-32;2936;16;137;CKB +LINE_15;Station-32;2022-03-11 03:57:00;2022-03-11 04:06:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 04:06:00;2022-03-11 04:11:00;Station-32;2936;16;137;CKB +LINE_15;Station-32;2022-03-11 04:27:00;2022-03-11 04:36:00;Station-33;4343;0;137;CKB +LINE_15;Station-33;2022-03-11 04:36:00;2022-03-11 04:36:00;Station-0;0.06;0;137;CKB +LINE_16;Station-0;2022-03-11 00:29:00;2022-03-11 00:29:00;Station-34;0.06;0;138;CKB +LINE_16;Station-34;2022-03-11 00:29:00;2022-03-11 00:41:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 00:47:00;2022-03-11 00:57:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 00:59:00;2022-03-11 01:11:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 01:17:00;2022-03-11 01:27:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 01:29:00;2022-03-11 01:41:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 01:47:00;2022-03-11 01:57:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 01:59:00;2022-03-11 02:11:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 02:17:00;2022-03-11 02:27:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 02:29:00;2022-03-11 02:41:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 02:47:00;2022-03-11 02:57:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 02:59:00;2022-03-11 03:11:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 03:17:00;2022-03-11 03:27:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 03:29:00;2022-03-11 03:41:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 03:47:00;2022-03-11 03:57:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 03:59:00;2022-03-11 04:11:00;Station-35;4481;6;138;CKB +LINE_16;Station-35;2022-03-11 04:17:00;2022-03-11 04:27:00;Station-34;4031;2;138;CKB +LINE_16;Station-34;2022-03-11 04:29:00;2022-03-11 04:41:00;Station-35;4481;0;138;CKB +LINE_16;Station-35;2022-03-11 04:41:00;2022-03-11 04:41:00;Station-0;0.06;0;138;CKB +LINE_17;Station-0;2022-03-11 00:30:00;2022-03-11 00:30:00;Station-34;0.06;0;139;CKB +LINE_17;Station-34;2022-03-11 00:30:00;2022-03-11 00:44:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 00:44:00;2022-03-11 00:57:00;Station-34;5302;3;139;CKB +LINE_17;Station-34;2022-03-11 01:00:00;2022-03-11 01:14:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 01:14:00;2022-03-11 01:27:00;Station-34;5302;3;139;CKB +LINE_17;Station-34;2022-03-11 01:30:00;2022-03-11 01:44:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 01:44:00;2022-03-11 01:57:00;Station-34;5302;3;139;CKB +LINE_17;Station-34;2022-03-11 02:00:00;2022-03-11 02:14:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 02:14:00;2022-03-11 02:27:00;Station-34;5302;3;139;CKB +LINE_17;Station-34;2022-03-11 02:30:00;2022-03-11 02:44:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 02:44:00;2022-03-11 02:57:00;Station-34;5302;3;139;CKB +LINE_17;Station-34;2022-03-11 03:00:00;2022-03-11 03:14:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 03:14:00;2022-03-11 03:27:00;Station-34;5302;3;139;CKB +LINE_17;Station-34;2022-03-11 03:30:00;2022-03-11 03:44:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 03:44:00;2022-03-11 03:57:00;Station-34;5302;3;139;CKB +LINE_17;Station-34;2022-03-11 04:00:00;2022-03-11 04:14:00;Station-36;4801;0;139;CKB +LINE_17;Station-36;2022-03-11 04:14:00;2022-03-11 04:27:00;Station-34;5302;0;139;CKB +LINE_17;Station-34;2022-03-11 04:27:00;2022-03-11 04:27:00;Station-0;0.06;0;139;CKB +LINE_18;Station-0;2022-03-11 00:43:00;2022-03-11 00:43:00;Station-37;0.06;0;140;CKB +LINE_18;Station-37;2022-03-11 00:43:00;2022-03-11 01:33:00;Station-37;20434;10;140;CKB +LINE_18;Station-37;2022-03-11 01:43:00;2022-03-11 02:33:00;Station-37;20434;10;140;CKB +LINE_18;Station-37;2022-03-11 02:43:00;2022-03-11 03:33:00;Station-37;20434;10;140;CKB +LINE_18;Station-37;2022-03-11 03:43:00;2022-03-11 04:33:00;Station-37;20434;0;140;CKB +LINE_18;Station-37;2022-03-11 04:33:00;2022-03-11 04:33:00;Station-0;0.06;0;140;CKB +LINE_18;Station-0;2022-03-11 00:13:00;2022-03-11 00:13:00;Station-37;0.06;0;141;CKB +LINE_18;Station-37;2022-03-11 00:13:00;2022-03-11 01:03:00;Station-37;20434;10;141;CKB +LINE_18;Station-37;2022-03-11 01:13:00;2022-03-11 02:03:00;Station-37;20434;10;141;CKB +LINE_18;Station-37;2022-03-11 02:13:00;2022-03-11 03:03:00;Station-37;20434;10;141;CKB +LINE_18;Station-37;2022-03-11 03:13:00;2022-03-11 04:03:00;Station-37;20434;0;141;CKB +LINE_18;Station-37;2022-03-11 04:03:00;2022-03-11 04:03:00;Station-0;0.06;0;141;CKB +LINE_19;Station-0;2022-03-11 00:24:00;2022-03-11 00:24:00;Station-38;0.06;0;142;CKB +LINE_19;Station-38;2022-03-11 00:24:00;2022-03-11 00:48:00;Station-39;11.86;4;142;CKB +LINE_19;Station-39;2022-03-11 00:52:00;2022-03-11 01:14:00;Station-38;11139;10;142;CKB +LINE_19;Station-38;2022-03-11 01:24:00;2022-03-11 01:48:00;Station-39;11.86;4;142;CKB +LINE_19;Station-39;2022-03-11 01:52:00;2022-03-11 02:14:00;Station-38;11139;10;142;CKB +LINE_19;Station-38;2022-03-11 02:24:00;2022-03-11 02:48:00;Station-39;11.86;4;142;CKB +LINE_19;Station-39;2022-03-11 02:52:00;2022-03-11 03:14:00;Station-38;11139;10;142;CKB +LINE_19;Station-38;2022-03-11 03:24:00;2022-03-11 03:48:00;Station-39;11.86;4;142;CKB +LINE_19;Station-39;2022-03-11 03:52:00;2022-03-11 04:14:00;Station-38;11139;0;142;CKB +LINE_19;Station-38;2022-03-11 04:14:00;2022-03-11 04:14:00;Station-0;0.06;0;142;CKB +LINE_19;Station-0;2022-03-11 00:22:00;2022-03-11 00:22:00;Station-39;0.06;0;143;CKB +LINE_19;Station-39;2022-03-11 00:22:00;2022-03-11 00:44:00;Station-38;11139;10;143;CKB +LINE_19;Station-38;2022-03-11 00:54:00;2022-03-11 01:18:00;Station-39;11.86;4;143;CKB +LINE_19;Station-39;2022-03-11 01:22:00;2022-03-11 01:44:00;Station-38;11139;10;143;CKB +LINE_19;Station-38;2022-03-11 01:54:00;2022-03-11 02:18:00;Station-39;11.86;4;143;CKB +LINE_19;Station-39;2022-03-11 02:22:00;2022-03-11 02:44:00;Station-38;11139;10;143;CKB +LINE_19;Station-38;2022-03-11 02:54:00;2022-03-11 03:18:00;Station-39;11.86;4;143;CKB +LINE_19;Station-39;2022-03-11 03:22:00;2022-03-11 03:44:00;Station-38;11139;10;143;CKB +LINE_19;Station-38;2022-03-11 03:54:00;2022-03-11 04:18:00;Station-39;11.86;4;143;CKB +LINE_19;Station-39;2022-03-11 04:22:00;2022-03-11 04:44:00;Station-38;11139;0;143;CKB +LINE_19;Station-38;2022-03-11 04:44:00;2022-03-11 04:44:00;Station-0;0.06;0;143;CKB +LINE_20;Station-0;2022-03-11 00:32:00;2022-03-11 00:32:00;Station-13;0.06;0;144;CKB +LINE_20;Station-13;2022-03-11 00:32:00;2022-03-11 00:44:00;Station-40;4212;3;144;CKB +LINE_20;Station-40;2022-03-11 00:47:00;2022-03-11 01:16:00;Station-41;13048;0;144;CKB +LINE_20;Station-41;2022-03-11 01:16:00;2022-03-11 01:42:00;Station-40;12869;5;144;CKB +LINE_20;Station-40;2022-03-11 01:47:00;2022-03-11 02:16:00;Station-41;13048;0;144;CKB +LINE_20;Station-41;2022-03-11 02:16:00;2022-03-11 02:42:00;Station-40;12869;5;144;CKB +LINE_20;Station-40;2022-03-11 02:47:00;2022-03-11 03:16:00;Station-41;13048;0;144;CKB +LINE_20;Station-41;2022-03-11 03:16:00;2022-03-11 03:42:00;Station-40;12869;5;144;CKB +LINE_20;Station-40;2022-03-11 03:47:00;2022-03-11 04:16:00;Station-41;13048;0;144;CKB +LINE_20;Station-41;2022-03-11 04:16:00;2022-03-11 04:34:00;Station-42;9538;0;144;CKB +LINE_20;Station-42;2022-03-11 04:34:00;2022-03-11 04:34:00;Station-0;0.06;0;144;CKB +LINE_20;Station-0;2022-03-11 00:17:00;2022-03-11 00:17:00;Station-40;0.06;0;145;CKB +LINE_20;Station-40;2022-03-11 00:17:00;2022-03-11 00:46:00;Station-41;13048;0;145;CKB +LINE_20;Station-41;2022-03-11 00:46:00;2022-03-11 01:12:00;Station-40;12869;5;145;CKB +LINE_20;Station-40;2022-03-11 01:17:00;2022-03-11 01:46:00;Station-41;13048;0;145;CKB +LINE_20;Station-41;2022-03-11 01:46:00;2022-03-11 02:12:00;Station-40;12869;5;145;CKB +LINE_20;Station-40;2022-03-11 02:17:00;2022-03-11 02:46:00;Station-41;13048;0;145;CKB +LINE_20;Station-41;2022-03-11 02:46:00;2022-03-11 03:12:00;Station-40;12869;5;145;CKB +LINE_20;Station-40;2022-03-11 03:17:00;2022-03-11 03:46:00;Station-41;13048;0;145;CKB +LINE_20;Station-41;2022-03-11 03:46:00;2022-03-11 04:12:00;Station-40;12869;5;145;CKB +LINE_20;Station-40;2022-03-11 04:17:00;2022-03-11 04:28:00;Station-13;4316;0;145;CKB +LINE_20;Station-13;2022-03-11 04:28:00;2022-03-11 04:28:00;Station-0;0.06;0;145;CKB +LINE_21;Station-0;2022-03-11 00:49:00;2022-03-11 00:49:00;Station-3;0.06;0;146;CKB +LINE_21;Station-3;2022-03-11 00:49:00;2022-03-11 01:04:00;Station-16;10229;0;146;CKB +LINE_21;Station-16;2022-03-11 01:04:00;2022-03-11 01:19:00;Station-3;11801;0;146;CKB +LINE_21;Station-3;2022-03-11 01:19:00;2022-03-11 01:34:00;Station-16;10229;0;146;CKB +LINE_21;Station-16;2022-03-11 01:34:00;2022-03-11 01:49:00;Station-3;11801;0;146;CKB +LINE_21;Station-3;2022-03-11 01:49:00;2022-03-11 02:04:00;Station-16;10229;0;146;CKB +LINE_21;Station-16;2022-03-11 02:04:00;2022-03-11 02:19:00;Station-3;11801;0;146;CKB +LINE_21;Station-3;2022-03-11 02:19:00;2022-03-11 02:34:00;Station-16;10229;0;146;CKB +LINE_21;Station-16;2022-03-11 02:34:00;2022-03-11 02:49:00;Station-3;11801;0;146;CKB +LINE_21;Station-3;2022-03-11 02:49:00;2022-03-11 03:04:00;Station-16;10229;0;146;CKB +LINE_21;Station-16;2022-03-11 03:04:00;2022-03-11 03:19:00;Station-3;11801;0;146;CKB +LINE_21;Station-3;2022-03-11 03:19:00;2022-03-11 03:34:00;Station-16;10229;0;146;CKB +LINE_21;Station-16;2022-03-11 03:34:00;2022-03-11 03:49:00;Station-3;11801;0;146;CKB +LINE_21;Station-3;2022-03-11 03:49:00;2022-03-11 04:04:00;Station-16;10229;0;146;CKB +LINE_21;Station-16;2022-03-11 04:04:00;2022-03-11 04:19:00;Station-3;11801;23;146;CKB +LINE_22;Station-3;2022-03-11 04:42:00;2022-03-11 05:04:00;Station-43;6.81;0;146;CKB +LINE_22;Station-43;2022-03-11 05:04:00;2022-03-11 05:04:00;Station-0;0.06;0;146;CKB +LINE_8;Station-0;2022-03-11 00:32:00;2022-03-11 00:32:00;Station-13;0.06;0;147;CKB +LINE_8;Station-13;2022-03-11 00:32:00;2022-03-11 00:57:00;Station-21;11545;6;147;CKB +LINE_8;Station-21;2022-03-11 01:03:00;2022-03-11 01:46:00;Station-20;20579;1;147;CKB +LINE_8;Station-20;2022-03-11 01:47:00;2022-03-11 02:25:00;Station-21;20641;8;147;CKB +LINE_8;Station-21;2022-03-11 02:33:00;2022-03-11 03:16:00;Station-20;20579;1;147;CKB +LINE_8;Station-20;2022-03-11 03:17:00;2022-03-11 03:55:00;Station-21;20641;8;147;CKB +LINE_8;Station-21;2022-03-11 04:03:00;2022-03-11 04:28:00;Station-13;11499;0;147;CKB +LINE_8;Station-13;2022-03-11 04:28:00;2022-03-11 04:28:00;Station-0;0.06;0;147;CKB +LINE_8;Station-0;2022-03-11 00:33:00;2022-03-11 00:33:00;Station-21;0.06;0;148;CKB +LINE_8;Station-21;2022-03-11 00:33:00;2022-03-11 01:16:00;Station-20;20579;1;148;CKB +LINE_8;Station-20;2022-03-11 01:17:00;2022-03-11 01:55:00;Station-21;20641;8;148;CKB +LINE_8;Station-21;2022-03-11 02:03:00;2022-03-11 02:46:00;Station-20;20579;1;148;CKB +LINE_8;Station-20;2022-03-11 02:47:00;2022-03-11 03:25:00;Station-21;20641;8;148;CKB +LINE_8;Station-21;2022-03-11 03:33:00;2022-03-11 04:16:00;Station-20;20579;1;148;CKB +LINE_8;Station-20;2022-03-11 04:17:00;2022-03-11 04:51:00;Station-44;18752;0;148;CKB +LINE_8;Station-44;2022-03-11 04:51:00;2022-03-11 04:51:00;Station-0;0.06;0;148;CKB +LINE_23;Station-0;2022-03-11 00:34:00;2022-03-11 00:34:00;Station-45;0.06;0;149;CKB +LINE_23;Station-45;2022-03-11 00:34:00;2022-03-11 01:00:00;Station-46;9016;0;149;CKB +LINE_23;Station-46;2022-03-11 01:00:00;2022-03-11 01:27:00;Station-45;10083;7;149;CKB +LINE_23;Station-45;2022-03-11 01:34:00;2022-03-11 02:00:00;Station-46;9016;0;149;CKB +LINE_23;Station-46;2022-03-11 02:00:00;2022-03-11 02:27:00;Station-45;10083;7;149;CKB +LINE_23;Station-45;2022-03-11 02:34:00;2022-03-11 03:00:00;Station-46;9016;0;149;CKB +LINE_23;Station-46;2022-03-11 03:00:00;2022-03-11 03:27:00;Station-45;10083;7;149;CKB +LINE_23;Station-45;2022-03-11 03:34:00;2022-03-11 04:00:00;Station-46;9016;0;149;CKB +LINE_23;Station-46;2022-03-11 04:00:00;2022-03-11 04:27:00;Station-45;10083;0;149;CKB +LINE_23;Station-45;2022-03-11 04:27:00;2022-03-11 04:27:00;Station-0;0.06;0;149;CKB +LINE_23;Station-0;2022-03-11 00:30:00;2022-03-11 00:30:00;Station-46;0.06;0;150;CKB +LINE_23;Station-46;2022-03-11 00:30:00;2022-03-11 00:57:00;Station-45;10083;7;150;CKB +LINE_23;Station-45;2022-03-11 01:04:00;2022-03-11 01:30:00;Station-46;9016;0;150;CKB +LINE_23;Station-46;2022-03-11 01:30:00;2022-03-11 01:57:00;Station-45;10083;7;150;CKB +LINE_23;Station-45;2022-03-11 02:04:00;2022-03-11 02:30:00;Station-46;9016;0;150;CKB +LINE_23;Station-46;2022-03-11 02:30:00;2022-03-11 02:57:00;Station-45;10083;7;150;CKB +LINE_23;Station-45;2022-03-11 03:04:00;2022-03-11 03:30:00;Station-46;9016;0;150;CKB +LINE_23;Station-46;2022-03-11 03:30:00;2022-03-11 03:57:00;Station-45;10083;7;150;CKB +LINE_23;Station-45;2022-03-11 04:04:00;2022-03-11 04:30:00;Station-46;9016;0;150;CKB +LINE_23;Station-46;2022-03-11 04:30:00;2022-03-11 04:57:00;Station-45;10083;0;150;CKB +LINE_23;Station-45;2022-03-11 04:57:00;2022-03-11 04:57:00;Station-0;0.06;0;150;CKB +LINE_24;Station-0;2022-03-11 00:31:00;2022-03-11 00:31:00;Station-21;0.06;0;151;CKB +LINE_24;Station-21;2022-03-11 00:31:00;2022-03-11 00:44:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 00:44:00;2022-03-11 00:56:00;Station-21;5362;5;151;CKB +LINE_24;Station-21;2022-03-11 01:01:00;2022-03-11 01:14:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 01:14:00;2022-03-11 01:26:00;Station-21;5362;5;151;CKB +LINE_24;Station-21;2022-03-11 01:31:00;2022-03-11 01:44:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 01:44:00;2022-03-11 01:56:00;Station-21;5362;5;151;CKB +LINE_24;Station-21;2022-03-11 02:01:00;2022-03-11 02:14:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 02:14:00;2022-03-11 02:26:00;Station-21;5362;5;151;CKB +LINE_24;Station-21;2022-03-11 02:31:00;2022-03-11 02:44:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 02:44:00;2022-03-11 02:56:00;Station-21;5362;5;151;CKB +LINE_24;Station-21;2022-03-11 03:01:00;2022-03-11 03:14:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 03:14:00;2022-03-11 03:26:00;Station-21;5362;5;151;CKB +LINE_24;Station-21;2022-03-11 03:31:00;2022-03-11 03:44:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 03:44:00;2022-03-11 03:56:00;Station-21;5362;5;151;CKB +LINE_24;Station-21;2022-03-11 04:01:00;2022-03-11 04:14:00;Station-47;4872;0;151;CKB +LINE_24;Station-47;2022-03-11 04:14:00;2022-03-11 04:26:00;Station-21;5362;0;151;CKB +LINE_24;Station-21;2022-03-11 04:26:00;2022-03-11 04:26:00;Station-0;0.06;0;151;CKB +LINE_25;Station-0;2022-03-11 00:31:00;2022-03-11 00:31:00;Station-21;0.06;0;152;CKB +LINE_25;Station-21;2022-03-11 00:31:00;2022-03-11 00:45:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 00:47:00;2022-03-11 01:01:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 01:01:00;2022-03-11 01:15:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 01:17:00;2022-03-11 01:31:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 01:31:00;2022-03-11 01:45:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 01:47:00;2022-03-11 02:01:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 02:01:00;2022-03-11 02:15:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 02:17:00;2022-03-11 02:31:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 02:31:00;2022-03-11 02:45:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 02:47:00;2022-03-11 03:01:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 03:01:00;2022-03-11 03:15:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 03:17:00;2022-03-11 03:31:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 03:31:00;2022-03-11 03:45:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 03:47:00;2022-03-11 04:01:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 04:01:00;2022-03-11 04:15:00;Station-48;5225;2;152;CKB +LINE_25;Station-48;2022-03-11 04:17:00;2022-03-11 04:31:00;Station-21;7617;0;152;CKB +LINE_25;Station-21;2022-03-11 04:31:00;2022-03-11 04:31:00;Station-0;0.06;0;152;CKB +LINE_26;Station-0;2022-03-11 00:43:00;2022-03-11 00:43:00;Station-49;0.06;0;153;CKB +LINE_26;Station-49;2022-03-11 00:43:00;2022-03-11 00:53:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 00:53:00;2022-03-11 01:03:00;Station-49;4408;10;153;CKB +LINE_26;Station-49;2022-03-11 01:13:00;2022-03-11 01:23:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 01:23:00;2022-03-11 01:33:00;Station-49;4408;10;153;CKB +LINE_26;Station-49;2022-03-11 01:43:00;2022-03-11 01:53:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 01:53:00;2022-03-11 02:03:00;Station-49;4408;10;153;CKB +LINE_26;Station-49;2022-03-11 02:13:00;2022-03-11 02:23:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 02:23:00;2022-03-11 02:33:00;Station-49;4408;10;153;CKB +LINE_26;Station-49;2022-03-11 02:43:00;2022-03-11 02:53:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 02:53:00;2022-03-11 03:03:00;Station-49;4408;10;153;CKB +LINE_26;Station-49;2022-03-11 03:13:00;2022-03-11 03:23:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 03:23:00;2022-03-11 03:33:00;Station-49;4408;10;153;CKB +LINE_26;Station-49;2022-03-11 03:43:00;2022-03-11 03:53:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 03:53:00;2022-03-11 04:03:00;Station-49;4408;10;153;CKB +LINE_26;Station-49;2022-03-11 04:13:00;2022-03-11 04:23:00;Station-50;4507;0;153;CKB +LINE_26;Station-50;2022-03-11 04:23:00;2022-03-11 04:33:00;Station-49;4408;0;153;CKB +LINE_26;Station-49;2022-03-11 04:33:00;2022-03-11 04:33:00;Station-0;0.06;0;153;CKB +LINE_0;Station-0;2022-03-11 21:31:00;2022-03-11 21:31:00;Station-1;0.06;0;154;CKB +LINE_0;Station-1;2022-03-11 21:31:00;2022-03-11 22:04:00;Station-2;14519;4;154;CKB +LINE_0;Station-2;2022-03-11 22:08:00;2022-03-11 22:43:00;Station-1;13541;8;154;CKB +LINE_0;Station-1;2022-03-11 22:51:00;2022-03-11 23:24:00;Station-2;14519;4;154;CKB +LINE_0;Station-2;2022-03-11 23:28:00;2022-03-12 00:03:00;Station-1;13541;8;154;CKB +LINE_0;Station-1;2022-03-12 00:11:00;2022-03-12 00:44:00;Station-2;14519;0;154;CKB +LINE_1;Station-2;2022-03-12 00:44:00;2022-03-12 00:54:00;Station-3;4.1;25;154;CKB +LINE_1;Station-3;2022-03-12 01:19:00;2022-03-12 01:42:00;Station-4;8.36;6;154;CKB +LINE_1;Station-4;2022-03-12 01:48:00;2022-03-12 02:06:00;Station-3;9067;13;154;CKB +LINE_1;Station-3;2022-03-12 02:19:00;2022-03-12 02:42:00;Station-4;8.36;6;154;CKB +LINE_1;Station-4;2022-03-12 02:48:00;2022-03-12 03:06:00;Station-3;9067;13;154;CKB +LINE_1;Station-3;2022-03-12 03:19:00;2022-03-12 03:42:00;Station-4;8.36;6;154;CKB +LINE_1;Station-4;2022-03-12 03:48:00;2022-03-12 04:06:00;Station-3;9067;13;154;CKB +LINE_1;Station-3;2022-03-12 04:19:00;2022-03-12 04:42:00;Station-4;8.36;6;154;CKB +LINE_1;Station-4;2022-03-12 04:48:00;2022-03-12 05:06:00;Station-3;9067;13;154;CKB +LINE_1;Station-3;2022-03-12 05:19:00;2022-03-12 05:42:00;Station-4;8.36;16;154;CKB +LINE_22;Station-4;2022-03-12 05:58:00;2022-03-12 06:34:00;Station-43;12968;0;154;CKB +LINE_22;Station-43;2022-03-12 06:34:00;2022-03-12 06:34:00;Station-0;0.06;0;154;CKB +LINE_0;Station-0;2022-03-11 22:11:00;2022-03-11 22:11:00;Station-1;0.06;0;155;CKB +LINE_0;Station-1;2022-03-11 22:11:00;2022-03-11 22:44:00;Station-2;14519;4;155;CKB +LINE_0;Station-2;2022-03-11 22:48:00;2022-03-11 23:23:00;Station-1;13541;8;155;CKB +LINE_0;Station-1;2022-03-11 23:31:00;2022-03-12 00:04:00;Station-2;14519;4;155;CKB +LINE_0;Station-2;2022-03-12 00:08:00;2022-03-12 00:39:00;Station-5;12213;0;155;CKB +LINE_1;Station-5;2022-03-12 00:39:00;2022-03-12 00:47:00;Station-3;4.0;2;155;CKB +LINE_1;Station-3;2022-03-12 00:49:00;2022-03-12 01:12:00;Station-4;8.36;6;155;CKB +LINE_1;Station-4;2022-03-12 01:18:00;2022-03-12 01:36:00;Station-3;9067;13;155;CKB +LINE_1;Station-3;2022-03-12 01:49:00;2022-03-12 02:12:00;Station-4;8.36;6;155;CKB +LINE_1;Station-4;2022-03-12 02:18:00;2022-03-12 02:36:00;Station-3;9067;13;155;CKB +LINE_1;Station-3;2022-03-12 02:49:00;2022-03-12 03:12:00;Station-4;8.36;6;155;CKB +LINE_1;Station-4;2022-03-12 03:18:00;2022-03-12 03:36:00;Station-3;9067;13;155;CKB +LINE_1;Station-3;2022-03-12 03:49:00;2022-03-12 04:12:00;Station-4;8.36;6;155;CKB +LINE_1;Station-4;2022-03-12 04:18:00;2022-03-12 04:36:00;Station-3;9067;13;155;CKB +LINE_1;Station-3;2022-03-12 04:49:00;2022-03-12 05:12:00;Station-4;8.36;6;155;CKB +LINE_1;Station-4;2022-03-12 05:18:00;2022-03-12 05:36:00;Station-3;9067;0;155;CKB +LINE_1;Station-3;2022-03-12 05:36:00;2022-03-12 05:36:00;Station-0;0.06;0;155;CKB +LINE_2;Station-0;2022-03-11 21:06:00;2022-03-11 21:06:00;Station-6;0.06;0;156;CKB +LINE_2;Station-6;2022-03-11 21:06:00;2022-03-11 21:34:00;Station-7;13018;19;156;CKB +LINE_2;Station-7;2022-03-11 21:53:00;2022-03-11 22:13:00;Station-8;10332;17;156;CKB +LINE_2;Station-8;2022-03-11 22:30:00;2022-03-11 22:54:00;Station-7;10.48;19;156;CKB +LINE_2;Station-7;2022-03-11 23:13:00;2022-03-11 23:33:00;Station-8;10332;17;156;CKB +LINE_2;Station-8;2022-03-11 23:50:00;2022-03-12 00:14:00;Station-7;10.48;8;156;CKB +LINE_2;Station-7;2022-03-12 00:22:00;2022-03-12 00:27:00;Station-58;2533;2;156;CKB +LINE_3;Station-58;2022-03-12 00:29:00;2022-03-12 00:47:00;Station-10;7.58;0;156;CKB +LINE_3;Station-10;2022-03-12 00:47:00;2022-03-12 01:14:00;Station-11;12841;3;156;CKB +LINE_3;Station-11;2022-03-12 01:17:00;2022-03-12 01:47:00;Station-10;14281;0;156;CKB +LINE_3;Station-10;2022-03-12 01:47:00;2022-03-12 02:14:00;Station-11;12841;3;156;CKB +LINE_3;Station-11;2022-03-12 02:17:00;2022-03-12 02:47:00;Station-10;14281;0;156;CKB +LINE_3;Station-10;2022-03-12 02:47:00;2022-03-12 03:14:00;Station-11;12841;3;156;CKB +LINE_3;Station-11;2022-03-12 03:17:00;2022-03-12 03:47:00;Station-10;14281;0;156;CKB +LINE_3;Station-10;2022-03-12 03:47:00;2022-03-12 04:14:00;Station-11;12841;3;156;CKB +LINE_3;Station-11;2022-03-12 04:17:00;2022-03-12 04:47:00;Station-10;14281;0;156;CKB +LINE_3;Station-10;2022-03-12 04:47:00;2022-03-12 05:14:00;Station-11;12841;3;156;CKB +LINE_3;Station-11;2022-03-12 05:17:00;2022-03-12 05:47:00;Station-10;14281;0;156;CKB +LINE_3;Station-10;2022-03-12 05:47:00;2022-03-12 05:47:00;Station-0;0.06;0;156;CKB +LINE_2;Station-0;2022-03-11 20:26:00;2022-03-11 20:26:00;Station-6;0.06;0;157;CKB +LINE_2;Station-6;2022-03-11 20:26:00;2022-03-11 20:56:00;Station-12;14097;14;157;CKB +LINE_2;Station-12;2022-03-11 21:10:00;2022-03-11 21:38:00;Station-6;13.19;8;157;CKB +LINE_2;Station-6;2022-03-11 21:46:00;2022-03-11 22:14:00;Station-7;13018;19;157;CKB +LINE_2;Station-7;2022-03-11 22:33:00;2022-03-11 22:53:00;Station-8;10332;17;157;CKB +LINE_2;Station-8;2022-03-11 23:10:00;2022-03-11 23:34:00;Station-7;10.48;19;157;CKB +LINE_2;Station-7;2022-03-11 23:53:00;2022-03-12 00:13:00;Station-8;10332;2;157;CKB +LINE_2;Station-8;2022-03-12 00:15:00;2022-03-12 00:16:00;Station-10;506;1;157;CKB +LINE_3;Station-10;2022-03-12 00:17:00;2022-03-12 00:44:00;Station-11;12841;3;157;CKB +LINE_3;Station-11;2022-03-12 00:47:00;2022-03-12 01:17:00;Station-10;14281;0;157;CKB +LINE_3;Station-10;2022-03-12 01:17:00;2022-03-12 01:44:00;Station-11;12841;3;157;CKB +LINE_3;Station-11;2022-03-12 01:47:00;2022-03-12 02:17:00;Station-10;14281;0;157;CKB +LINE_3;Station-10;2022-03-12 02:17:00;2022-03-12 02:44:00;Station-11;12841;3;157;CKB +LINE_3;Station-11;2022-03-12 02:47:00;2022-03-12 03:17:00;Station-10;14281;0;157;CKB +LINE_3;Station-10;2022-03-12 03:17:00;2022-03-12 03:44:00;Station-11;12841;3;157;CKB +LINE_3;Station-11;2022-03-12 03:47:00;2022-03-12 04:17:00;Station-10;14281;0;157;CKB +LINE_3;Station-10;2022-03-12 04:17:00;2022-03-12 04:44:00;Station-11;12841;3;157;CKB +LINE_3;Station-11;2022-03-12 04:47:00;2022-03-12 05:17:00;Station-10;14281;0;157;CKB +LINE_3;Station-10;2022-03-12 05:17:00;2022-03-12 05:29:00;Station-58;5474;0;157;CKB +LINE_3;Station-58;2022-03-12 05:29:00;2022-03-12 05:29:00;Station-0;0.06;0;157;CKB +LINE_5;Station-0;2022-03-11 22:56:00;2022-03-11 22:56:00;Station-14;0.06;0;158;CKB +LINE_5;Station-14;2022-03-11 22:56:00;2022-03-11 23:08:00;Station-15;5882;3;158;CKB +LINE_5;Station-15;2022-03-11 23:11:00;2022-03-11 23:25:00;Station-14;6232;0;158;CKB +LINE_5;Station-14;2022-03-11 23:25:00;2022-03-11 23:38:00;Station-15;6086;3;158;CKB +LINE_5;Station-15;2022-03-11 23:41:00;2022-03-11 23:55:00;Station-14;6232;0;158;CKB +LINE_5;Station-14;2022-03-11 23:55:00;2022-03-12 00:08:00;Station-15;6086;0;158;CKB +LINE_5;Station-15;2022-03-12 00:08:00;2022-03-12 00:08:00;Station-0;0.06;0;158;CKB +LINE_6;Station-0;2022-03-11 05:05:00;2022-03-11 05:05:00;Station-16;0.06;0;159;CKB +LINE_6;Station-16;2022-03-11 05:05:00;2022-03-11 05:14:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 05:14:00;2022-03-11 05:23:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 05:25:00;2022-03-11 05:34:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 05:34:00;2022-03-11 05:43:00;Station-16;5139;23;159;CKB +LINE_6;Station-16;2022-03-11 06:06:00;2022-03-11 06:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 06:15:00;2022-03-11 06:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 06:26:00;2022-03-11 06:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 06:35:00;2022-03-11 06:44:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 06:46:00;2022-03-11 06:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 06:55:00;2022-03-11 07:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 07:06:00;2022-03-11 07:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 07:15:00;2022-03-11 07:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 07:26:00;2022-03-11 07:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 07:35:00;2022-03-11 07:44:00;Station-16;5139;22;159;CKB +LINE_6;Station-16;2022-03-11 08:06:00;2022-03-11 08:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 08:15:00;2022-03-11 08:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 08:26:00;2022-03-11 08:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 08:35:00;2022-03-11 08:44:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 08:46:00;2022-03-11 08:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 08:55:00;2022-03-11 09:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 09:06:00;2022-03-11 09:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 09:15:00;2022-03-11 09:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 09:26:00;2022-03-11 09:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 09:35:00;2022-03-11 09:44:00;Station-16;5139;22;159;CKB +LINE_6;Station-16;2022-03-11 10:06:00;2022-03-11 10:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 10:15:00;2022-03-11 10:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 10:26:00;2022-03-11 10:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 10:35:00;2022-03-11 10:44:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 10:46:00;2022-03-11 10:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 10:55:00;2022-03-11 11:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 11:06:00;2022-03-11 11:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 11:15:00;2022-03-11 11:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 11:26:00;2022-03-11 11:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 11:35:00;2022-03-11 11:44:00;Station-16;5139;22;159;CKB +LINE_6;Station-16;2022-03-11 12:06:00;2022-03-11 12:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 12:15:00;2022-03-11 12:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 12:26:00;2022-03-11 12:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 12:35:00;2022-03-11 12:44:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 12:46:00;2022-03-11 12:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 12:55:00;2022-03-11 13:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 13:06:00;2022-03-11 13:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 13:15:00;2022-03-11 13:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 13:26:00;2022-03-11 13:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 13:35:00;2022-03-11 13:44:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 13:46:00;2022-03-11 13:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 13:55:00;2022-03-11 14:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 14:06:00;2022-03-11 14:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 14:15:00;2022-03-11 14:24:00;Station-16;5139;22;159;CKB +LINE_6;Station-16;2022-03-11 14:46:00;2022-03-11 14:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 14:55:00;2022-03-11 15:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 15:06:00;2022-03-11 15:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 15:15:00;2022-03-11 15:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 15:26:00;2022-03-11 15:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 15:35:00;2022-03-11 15:44:00;Station-16;5139;22;159;CKB +LINE_6;Station-16;2022-03-11 16:06:00;2022-03-11 16:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 16:15:00;2022-03-11 16:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 16:26:00;2022-03-11 16:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 16:35:00;2022-03-11 16:44:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 16:46:00;2022-03-11 16:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 16:55:00;2022-03-11 17:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 17:06:00;2022-03-11 17:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 17:15:00;2022-03-11 17:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 17:26:00;2022-03-11 17:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 17:35:00;2022-03-11 17:44:00;Station-16;5139;22;159;CKB +LINE_6;Station-16;2022-03-11 18:06:00;2022-03-11 18:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 18:15:00;2022-03-11 18:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 18:26:00;2022-03-11 18:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 18:35:00;2022-03-11 18:44:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 18:46:00;2022-03-11 18:55:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 18:55:00;2022-03-11 19:04:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 19:06:00;2022-03-11 19:15:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 19:15:00;2022-03-11 19:24:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 19:26:00;2022-03-11 19:35:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 19:35:00;2022-03-11 19:44:00;Station-16;5139;21;159;CKB +LINE_6;Station-16;2022-03-11 20:05:00;2022-03-11 20:14:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 20:14:00;2022-03-11 20:23:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 20:25:00;2022-03-11 20:34:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 20:34:00;2022-03-11 20:43:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 20:45:00;2022-03-11 20:54:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 20:54:00;2022-03-11 21:03:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 21:05:00;2022-03-11 21:14:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 21:14:00;2022-03-11 21:23:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 21:25:00;2022-03-11 21:34:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 21:34:00;2022-03-11 21:43:00;Station-16;5139;22;159;CKB +LINE_6;Station-16;2022-03-11 22:05:00;2022-03-11 22:14:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 22:14:00;2022-03-11 22:23:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 22:25:00;2022-03-11 22:34:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 22:34:00;2022-03-11 22:43:00;Station-16;5139;2;159;CKB +LINE_6;Station-16;2022-03-11 22:45:00;2022-03-11 22:54:00;Station-17;4781;0;159;CKB +LINE_6;Station-17;2022-03-11 22:54:00;2022-03-11 23:03:00;Station-16;5139;0;159;CKB +LINE_6;Station-16;2022-03-11 23:03:00;2022-03-11 23:03:00;Station-0;0.06;0;159;CKB +LINE_9;Station-22;2022-03-11 05:15:00;2022-03-11 06:01:00;Station-23;17.9;0;160;VDL +LINE_9;Station-23;2022-03-11 06:01:00;2022-03-11 06:15:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 06:23:00;2022-03-11 06:37:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 06:41:00;2022-03-11 06:55:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 07:03:00;2022-03-11 07:17:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 07:21:00;2022-03-11 07:35:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 07:43:00;2022-03-11 07:57:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 08:01:00;2022-03-11 08:15:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 08:23:00;2022-03-11 08:37:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 08:41:00;2022-03-11 08:55:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 09:03:00;2022-03-11 09:17:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 09:21:00;2022-03-11 09:35:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 09:43:00;2022-03-11 09:57:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 10:01:00;2022-03-11 10:15:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 10:23:00;2022-03-11 10:37:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 10:41:00;2022-03-11 10:55:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 11:03:00;2022-03-11 11:17:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 11:21:00;2022-03-11 11:35:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 11:43:00;2022-03-11 11:57:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 12:01:00;2022-03-11 12:15:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 12:23:00;2022-03-11 12:37:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 12:41:00;2022-03-11 12:55:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 13:03:00;2022-03-11 13:17:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 13:21:00;2022-03-11 13:35:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 13:43:00;2022-03-11 13:57:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 14:01:00;2022-03-11 14:15:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 14:23:00;2022-03-11 14:37:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 14:41:00;2022-03-11 14:55:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 15:03:00;2022-03-11 15:17:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 15:21:00;2022-03-11 15:35:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 15:43:00;2022-03-11 15:57:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 16:01:00;2022-03-11 16:15:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 16:23:00;2022-03-11 16:37:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 16:41:00;2022-03-11 16:55:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 17:03:00;2022-03-11 17:17:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 17:21:00;2022-03-11 17:35:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 17:43:00;2022-03-11 17:57:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 18:01:00;2022-03-11 18:15:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 18:23:00;2022-03-11 18:37:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 18:41:00;2022-03-11 18:55:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 19:03:00;2022-03-11 19:17:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 19:21:00;2022-03-11 19:35:00;Station-23;4637;8;160;VDL +LINE_9;Station-23;2022-03-11 19:43:00;2022-03-11 19:57:00;Station-23;4637;4;160;VDL +LINE_9;Station-23;2022-03-11 20:01:00;2022-03-11 20:14:00;Station-23;4637;9;160;VDL +LINE_9;Station-23;2022-03-11 20:23:00;2022-03-11 20:36:00;Station-23;4637;0;160;VDL +LINE_9;Station-23;2022-03-11 20:36:00;2022-03-11 21:15:00;Station-22;19.8;0;160;VDL +LINE_10;Station-0;2022-03-11 04:56:00;2022-03-11 04:56:00;Station-24;0.06;18;161;CKB +LINE_10;Station-24;2022-03-11 05:14:00;2022-03-11 05:20:00;Station-25;3.29;0;161;CKB +LINE_10;Station-25;2022-03-11 05:20:00;2022-03-11 05:24:00;Station-24;2954;20;161;CKB +LINE_10;Station-24;2022-03-11 05:44:00;2022-03-11 05:50:00;Station-25;3.29;0;161;CKB +LINE_10;Station-25;2022-03-11 05:50:00;2022-03-11 05:54:00;Station-24;2954;5;161;CKB +LINE_10;Station-24;2022-03-11 05:59:00;2022-03-11 06:06:00;Station-25;3.29;2;161;CKB +LINE_10;Station-25;2022-03-11 06:08:00;2022-03-11 06:13:00;Station-24;2954;19;161;CKB +LINE_10;Station-24;2022-03-11 06:32:00;2022-03-11 06:39:00;Station-25;3.29;1;161;CKB +LINE_10;Station-25;2022-03-11 06:40:00;2022-03-11 06:45:00;Station-24;2954;7;161;CKB +LINE_10;Station-24;2022-03-11 06:52:00;2022-03-11 06:59:00;Station-25;3.29;1;161;CKB +LINE_10;Station-25;2022-03-11 07:00:00;2022-03-11 07:05:00;Station-24;2954;7;161;CKB +LINE_10;Station-24;2022-03-11 07:12:00;2022-03-11 07:19:00;Station-25;3.29;1;161;CKB +LINE_10;Station-25;2022-03-11 07:20:00;2022-03-11 07:25:00;Station-24;2954;7;161;CKB +LINE_10;Station-24;2022-03-11 07:32:00;2022-03-11 07:39:00;Station-25;3.29;1;161;CKB +LINE_10;Station-25;2022-03-11 07:40:00;2022-03-11 07:45:00;Station-24;2954;295;161;CKB +LINE_10;Station-24;2022-03-11 12:40:00;2022-03-11 12:47:00;Station-25;3.29;2;161;CKB +LINE_10;Station-25;2022-03-11 12:49:00;2022-03-11 12:54:00;Station-24;2954;46;161;CKB +LINE_10;Station-24;2022-03-11 13:40:00;2022-03-11 13:47:00;Station-25;3.29;2;161;CKB +LINE_10;Station-25;2022-03-11 13:49:00;2022-03-11 13:54:00;Station-24;2954;434;161;CKB +LINE_10;Station-24;2022-03-11 21:08:00;2022-03-11 21:08:00;Station-0;0.06;0;161;CKB +LINE_11;Station-0;2022-03-11 07:20:00;2022-03-11 07:20:00;Station-26;0.06;0;162;CKB +LINE_11;Station-26;2022-03-11 07:20:00;2022-03-11 07:50:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 08:00:00;2022-03-11 08:30:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 08:40:00;2022-03-11 09:10:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 09:20:00;2022-03-11 09:50:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 10:00:00;2022-03-11 10:30:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 10:40:00;2022-03-11 11:10:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 11:20:00;2022-03-11 11:50:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 12:00:00;2022-03-11 12:30:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 12:40:00;2022-03-11 13:10:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 13:20:00;2022-03-11 13:50:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 14:00:00;2022-03-11 14:30:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 14:40:00;2022-03-11 15:10:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 15:20:00;2022-03-11 15:50:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 16:00:00;2022-03-11 16:30:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 16:40:00;2022-03-11 17:10:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 17:20:00;2022-03-11 17:50:00;Station-26;9266;10;162;CKB +LINE_11;Station-26;2022-03-11 18:00:00;2022-03-11 18:30:00;Station-26;9266;0;162;CKB +LINE_11;Station-26;2022-03-11 18:30:00;2022-03-11 18:30:00;Station-0;0.06;0;162;CKB +LINE_12;Station-0;2022-03-11 07:10:00;2022-03-11 07:10:00;Station-27;0.06;0;163;CKB +LINE_12;Station-27;2022-03-11 07:10:00;2022-03-11 07:18:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 07:28:00;2022-03-11 07:40:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 07:40:00;2022-03-11 07:48:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 07:58:00;2022-03-11 08:10:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 08:10:00;2022-03-11 08:18:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 08:28:00;2022-03-11 08:40:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 08:40:00;2022-03-11 08:48:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 08:58:00;2022-03-11 09:10:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 09:10:00;2022-03-11 09:18:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 09:28:00;2022-03-11 09:40:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 09:40:00;2022-03-11 09:48:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 09:58:00;2022-03-11 10:10:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 10:10:00;2022-03-11 10:18:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 10:28:00;2022-03-11 10:40:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 10:40:00;2022-03-11 10:48:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 10:58:00;2022-03-11 11:10:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 11:10:00;2022-03-11 11:18:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 11:28:00;2022-03-11 11:40:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 11:40:00;2022-03-11 11:48:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 11:58:00;2022-03-11 12:10:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 12:10:00;2022-03-11 12:18:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 12:28:00;2022-03-11 12:40:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 12:40:00;2022-03-11 12:48:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 12:58:00;2022-03-11 13:10:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 13:10:00;2022-03-11 13:18:00;Station-28;2169;10;163;CKB +LINE_12;Station-28;2022-03-11 13:28:00;2022-03-11 13:40:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 13:40:00;2022-03-11 13:48:00;Station-28;2169;8;163;CKB +LINE_12;Station-28;2022-03-11 13:56:00;2022-03-11 14:10:00;Station-27;2952;0;163;CKB +LINE_12;Station-27;2022-03-11 14:10:00;2022-03-11 14:19:00;Station-28;2169;14;163;CKB +LINE_12;Station-28;2022-03-11 14:33:00;2022-03-11 14:47:00;Station-27;2952;3;163;CKB +LINE_12;Station-27;2022-03-11 14:50:00;2022-03-11 14:59:00;Station-28;2169;14;163;CKB +LINE_12;Station-28;2022-03-11 15:13:00;2022-03-11 15:27:00;Station-27;2952;3;163;CKB +LINE_12;Station-27;2022-03-11 15:30:00;2022-03-11 15:39:00;Station-28;2169;14;163;CKB +LINE_12;Station-28;2022-03-11 15:53:00;2022-03-11 16:07:00;Station-27;2952;3;163;CKB +LINE_12;Station-27;2022-03-11 16:10:00;2022-03-11 16:19:00;Station-28;2169;14;163;CKB +LINE_12;Station-28;2022-03-11 16:33:00;2022-03-11 16:47:00;Station-27;2952;3;163;CKB +LINE_12;Station-27;2022-03-11 16:50:00;2022-03-11 16:59:00;Station-28;2169;14;163;CKB +LINE_12;Station-28;2022-03-11 17:13:00;2022-03-11 17:27:00;Station-27;2952;3;163;CKB +LINE_12;Station-27;2022-03-11 17:30:00;2022-03-11 17:39:00;Station-28;2169;13;163;CKB +LINE_12;Station-28;2022-03-11 17:52:00;2022-03-11 18:05:00;Station-27;2952;5;163;CKB +LINE_12;Station-27;2022-03-11 18:10:00;2022-03-11 18:18:00;Station-28;2169;0;163;CKB +LINE_12;Station-28;2022-03-11 18:18:00;2022-03-11 18:18:00;Station-0;0.06;0;163;CKB +LINE_12;Station-0;2022-03-11 14:13:00;2022-03-11 14:13:00;Station-28;0.06;0;164;CKB +LINE_12;Station-28;2022-03-11 14:13:00;2022-03-11 14:27:00;Station-27;2952;3;164;CKB +LINE_12;Station-27;2022-03-11 14:30:00;2022-03-11 14:39:00;Station-28;2169;14;164;CKB +LINE_12;Station-28;2022-03-11 14:53:00;2022-03-11 15:07:00;Station-27;2952;3;164;CKB +LINE_12;Station-27;2022-03-11 15:10:00;2022-03-11 15:19:00;Station-28;2169;14;164;CKB +LINE_12;Station-28;2022-03-11 15:33:00;2022-03-11 15:47:00;Station-27;2952;3;164;CKB +LINE_12;Station-27;2022-03-11 15:50:00;2022-03-11 15:59:00;Station-28;2169;14;164;CKB +LINE_12;Station-28;2022-03-11 16:13:00;2022-03-11 16:27:00;Station-27;2952;3;164;CKB +LINE_12;Station-27;2022-03-11 16:30:00;2022-03-11 16:39:00;Station-28;2169;14;164;CKB +LINE_12;Station-28;2022-03-11 16:53:00;2022-03-11 17:07:00;Station-27;2952;3;164;CKB +LINE_12;Station-27;2022-03-11 17:10:00;2022-03-11 17:19:00;Station-28;2169;14;164;CKB +LINE_12;Station-28;2022-03-11 17:33:00;2022-03-11 17:47:00;Station-27;2952;3;164;CKB +LINE_12;Station-27;2022-03-11 17:50:00;2022-03-11 17:59:00;Station-28;2169;14;164;CKB +LINE_12;Station-28;2022-03-11 18:13:00;2022-03-11 18:25:00;Station-27;2952;0;164;CKB +LINE_12;Station-27;2022-03-11 18:25:00;2022-03-11 18:25:00;Station-0;0.06;0;164;CKB +LINE_13;Station-0;2022-03-12 00:23:00;2022-03-12 00:23:00;Station-29;0.06;0;165;CKB +LINE_13;Station-29;2022-03-12 00:23:00;2022-03-12 00:30:00;Station-30;2577;9;165;CKB +LINE_14;Station-30;2022-03-12 00:39:00;2022-03-12 00:54:00;Station-31;5937;9;165;CKB +LINE_14;Station-31;2022-03-12 01:03:00;2022-03-12 01:17:00;Station-30;6.19;0;165;CKB +LINE_13;Station-30;2022-03-12 01:17:00;2022-03-12 01:23:00;Station-29;2555;0;165;CKB +LINE_13;Station-29;2022-03-12 01:23:00;2022-03-12 01:30:00;Station-30;2577;9;165;CKB +LINE_14;Station-30;2022-03-12 01:39:00;2022-03-12 01:54:00;Station-31;5937;9;165;CKB +LINE_14;Station-31;2022-03-12 02:03:00;2022-03-12 02:17:00;Station-30;6.19;0;165;CKB +LINE_13;Station-30;2022-03-12 02:17:00;2022-03-12 02:23:00;Station-29;2555;0;165;CKB +LINE_13;Station-29;2022-03-12 02:23:00;2022-03-12 02:30:00;Station-30;2577;9;165;CKB +LINE_14;Station-30;2022-03-12 02:39:00;2022-03-12 02:54:00;Station-31;5937;9;165;CKB +LINE_14;Station-31;2022-03-12 03:03:00;2022-03-12 03:17:00;Station-30;6.19;0;165;CKB +LINE_13;Station-30;2022-03-12 03:17:00;2022-03-12 03:23:00;Station-29;2555;0;165;CKB +LINE_13;Station-29;2022-03-12 03:23:00;2022-03-12 03:30:00;Station-30;2577;9;165;CKB +LINE_14;Station-30;2022-03-12 03:39:00;2022-03-12 03:54:00;Station-31;5937;9;165;CKB +LINE_14;Station-31;2022-03-12 04:03:00;2022-03-12 04:17:00;Station-30;6.19;0;165;CKB +LINE_13;Station-30;2022-03-12 04:17:00;2022-03-12 04:23:00;Station-29;2555;0;165;CKB +LINE_13;Station-29;2022-03-12 04:23:00;2022-03-12 04:30:00;Station-30;2577;9;165;CKB +LINE_14;Station-30;2022-03-12 04:39:00;2022-03-12 04:54:00;Station-31;5937;9;165;CKB +LINE_14;Station-31;2022-03-12 05:03:00;2022-03-12 05:17:00;Station-30;6.19;0;165;CKB +LINE_15;Station-30;2022-03-12 05:17:00;2022-03-12 05:38:00;Station-33;12.0;28;165;CKB +LINE_15;Station-33;2022-03-12 06:06:00;2022-03-12 06:11:00;Station-32;2936;16;165;CKB +LINE_15;Station-32;2022-03-12 06:27:00;2022-03-12 06:36:00;Station-33;4343;10;165;CKB +LINE_15;Station-33;2022-03-12 06:46:00;2022-03-12 06:51:00;Station-32;2936;0;165;CKB +LINE_10;Station-32;2022-03-12 06:51:00;2022-03-12 07:00:00;Station-24;4.6;12;165;CKB +LINE_10;Station-24;2022-03-12 07:12:00;2022-03-12 07:12:00;Station-24;0.0;836;165;CKB +LINE_10;Station-24;2022-03-12 21:08:00;2022-03-12 21:08:00;Station-24;0.0;0;165;CKB +LINE_10;Station-24;2022-03-12 21:08:00;2022-03-12 21:08:00;Station-0;0.06;0;165;CKB +LINE_14;Station-0;2022-03-12 00:33:00;2022-03-12 00:33:00;Station-31;0.06;0;166;CKB +LINE_14;Station-31;2022-03-12 00:33:00;2022-03-12 00:47:00;Station-30;6.19;0;166;CKB +LINE_13;Station-30;2022-03-12 00:47:00;2022-03-12 00:53:00;Station-29;2555;0;166;CKB +LINE_13;Station-29;2022-03-12 00:53:00;2022-03-12 01:00:00;Station-30;2577;9;166;CKB +LINE_14;Station-30;2022-03-12 01:09:00;2022-03-12 01:24:00;Station-31;5937;9;166;CKB +LINE_14;Station-31;2022-03-12 01:33:00;2022-03-12 01:47:00;Station-30;6.19;0;166;CKB +LINE_13;Station-30;2022-03-12 01:47:00;2022-03-12 01:53:00;Station-29;2555;0;166;CKB +LINE_13;Station-29;2022-03-12 01:53:00;2022-03-12 02:00:00;Station-30;2577;9;166;CKB +LINE_14;Station-30;2022-03-12 02:09:00;2022-03-12 02:24:00;Station-31;5937;9;166;CKB +LINE_14;Station-31;2022-03-12 02:33:00;2022-03-12 02:47:00;Station-30;6.19;0;166;CKB +LINE_13;Station-30;2022-03-12 02:47:00;2022-03-12 02:53:00;Station-29;2555;0;166;CKB +LINE_13;Station-29;2022-03-12 02:53:00;2022-03-12 03:00:00;Station-30;2577;9;166;CKB +LINE_14;Station-30;2022-03-12 03:09:00;2022-03-12 03:24:00;Station-31;5937;9;166;CKB +LINE_14;Station-31;2022-03-12 03:33:00;2022-03-12 03:47:00;Station-30;6.19;0;166;CKB +LINE_13;Station-30;2022-03-12 03:47:00;2022-03-12 03:53:00;Station-29;2555;0;166;CKB +LINE_13;Station-29;2022-03-12 03:53:00;2022-03-12 04:00:00;Station-30;2577;9;166;CKB +LINE_14;Station-30;2022-03-12 04:09:00;2022-03-12 04:24:00;Station-31;5937;9;166;CKB +LINE_14;Station-31;2022-03-12 04:33:00;2022-03-12 04:47:00;Station-30;6.19;0;166;CKB +LINE_13;Station-30;2022-03-12 04:47:00;2022-03-12 04:53:00;Station-29;2555;0;166;CKB +LINE_13;Station-29;2022-03-12 04:53:00;2022-03-12 05:00:00;Station-30;2577;9;166;CKB +LINE_14;Station-30;2022-03-12 05:09:00;2022-03-12 05:24:00;Station-31;5937;0;166;CKB +LINE_14;Station-31;2022-03-12 05:24:00;2022-03-12 05:24:00;Station-0;0.06;0;166;CKB +LINE_15;Station-0;2022-03-12 00:57:00;2022-03-12 00:57:00;Station-32;0.06;0;167;CKB +LINE_15;Station-32;2022-03-12 00:57:00;2022-03-12 01:06:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 01:06:00;2022-03-12 01:11:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 01:27:00;2022-03-12 01:36:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 01:36:00;2022-03-12 01:41:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 01:57:00;2022-03-12 02:06:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 02:06:00;2022-03-12 02:11:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 02:27:00;2022-03-12 02:36:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 02:36:00;2022-03-12 02:41:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 02:57:00;2022-03-12 03:06:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 03:06:00;2022-03-12 03:11:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 03:27:00;2022-03-12 03:36:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 03:36:00;2022-03-12 03:41:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 03:57:00;2022-03-12 04:06:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 04:06:00;2022-03-12 04:11:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 04:27:00;2022-03-12 04:36:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 04:36:00;2022-03-12 04:41:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 04:57:00;2022-03-12 05:06:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 05:06:00;2022-03-12 05:11:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 05:27:00;2022-03-12 05:36:00;Station-33;4343;0;167;CKB +LINE_15;Station-33;2022-03-12 05:36:00;2022-03-12 05:41:00;Station-32;2936;16;167;CKB +LINE_15;Station-32;2022-03-12 05:57:00;2022-03-12 06:06:00;Station-33;4343;20;167;CKB +LINE_15;Station-33;2022-03-12 06:26:00;2022-03-12 06:31:00;Station-32;2936;0;167;CKB +LINE_15;Station-32;2022-03-12 06:31:00;2022-03-12 06:31:00;Station-0;0.06;0;167;CKB +LINE_17;Station-0;2022-03-12 00:30:00;2022-03-12 00:30:00;Station-34;0.06;0;168;CKB +LINE_17;Station-34;2022-03-12 00:30:00;2022-03-12 00:44:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 00:44:00;2022-03-12 00:57:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 01:00:00;2022-03-12 01:14:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 01:14:00;2022-03-12 01:27:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 01:30:00;2022-03-12 01:44:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 01:44:00;2022-03-12 01:57:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 02:00:00;2022-03-12 02:14:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 02:14:00;2022-03-12 02:27:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 02:30:00;2022-03-12 02:44:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 02:44:00;2022-03-12 02:57:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 03:00:00;2022-03-12 03:14:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 03:14:00;2022-03-12 03:27:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 03:30:00;2022-03-12 03:44:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 03:44:00;2022-03-12 03:57:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 04:00:00;2022-03-12 04:14:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 04:14:00;2022-03-12 04:27:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 04:30:00;2022-03-12 04:44:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 04:44:00;2022-03-12 04:57:00;Station-34;5302;3;168;CKB +LINE_17;Station-34;2022-03-12 05:00:00;2022-03-12 05:14:00;Station-36;4801;0;168;CKB +LINE_17;Station-36;2022-03-12 05:14:00;2022-03-12 05:27:00;Station-34;5302;0;168;CKB +LINE_17;Station-34;2022-03-12 05:27:00;2022-03-12 05:27:00;Station-0;0.06;0;168;CKB +LINE_20;Station-0;2022-03-12 00:32:00;2022-03-12 00:32:00;Station-13;0.06;0;169;CKB +LINE_20;Station-13;2022-03-12 00:32:00;2022-03-12 00:44:00;Station-40;4212;3;169;CKB +LINE_20;Station-40;2022-03-12 00:47:00;2022-03-12 01:16:00;Station-41;13048;0;169;CKB +LINE_20;Station-41;2022-03-12 01:16:00;2022-03-12 01:42:00;Station-40;12869;5;169;CKB +LINE_20;Station-40;2022-03-12 01:47:00;2022-03-12 02:16:00;Station-41;13048;0;169;CKB +LINE_20;Station-41;2022-03-12 02:16:00;2022-03-12 02:42:00;Station-40;12869;5;169;CKB +LINE_20;Station-40;2022-03-12 02:47:00;2022-03-12 03:16:00;Station-41;13048;0;169;CKB +LINE_20;Station-41;2022-03-12 03:16:00;2022-03-12 03:42:00;Station-40;12869;5;169;CKB +LINE_20;Station-40;2022-03-12 03:47:00;2022-03-12 04:16:00;Station-41;13048;0;169;CKB +LINE_20;Station-41;2022-03-12 04:16:00;2022-03-12 04:42:00;Station-40;12869;5;169;CKB +LINE_20;Station-40;2022-03-12 04:47:00;2022-03-12 05:16:00;Station-41;13048;0;169;CKB +LINE_20;Station-41;2022-03-12 05:16:00;2022-03-12 05:34:00;Station-42;9538;0;169;CKB +LINE_20;Station-42;2022-03-12 05:34:00;2022-03-12 05:34:00;Station-0;0.06;0;169;CKB +LINE_20;Station-0;2022-03-12 00:17:00;2022-03-12 00:17:00;Station-40;0.06;0;170;CKB +LINE_20;Station-40;2022-03-12 00:17:00;2022-03-12 00:46:00;Station-41;13048;0;170;CKB +LINE_20;Station-41;2022-03-12 00:46:00;2022-03-12 01:12:00;Station-40;12869;5;170;CKB +LINE_20;Station-40;2022-03-12 01:17:00;2022-03-12 01:46:00;Station-41;13048;0;170;CKB +LINE_20;Station-41;2022-03-12 01:46:00;2022-03-12 02:12:00;Station-40;12869;5;170;CKB +LINE_20;Station-40;2022-03-12 02:17:00;2022-03-12 02:46:00;Station-41;13048;0;170;CKB +LINE_20;Station-41;2022-03-12 02:46:00;2022-03-12 03:12:00;Station-40;12869;5;170;CKB +LINE_20;Station-40;2022-03-12 03:17:00;2022-03-12 03:46:00;Station-41;13048;0;170;CKB +LINE_20;Station-41;2022-03-12 03:46:00;2022-03-12 04:12:00;Station-40;12869;5;170;CKB +LINE_20;Station-40;2022-03-12 04:17:00;2022-03-12 04:46:00;Station-41;13048;0;170;CKB +LINE_20;Station-41;2022-03-12 04:46:00;2022-03-12 05:12:00;Station-40;12869;0;170;CKB +LINE_20;Station-40;2022-03-12 05:12:00;2022-03-12 05:12:00;Station-0;0.06;0;170;CKB +LINE_21;Station-0;2022-03-12 00:49:00;2022-03-12 00:49:00;Station-3;0.06;0;171;CKB +LINE_21;Station-3;2022-03-12 00:49:00;2022-03-12 01:04:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 01:04:00;2022-03-12 01:19:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 01:19:00;2022-03-12 01:34:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 01:34:00;2022-03-12 01:49:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 01:49:00;2022-03-12 02:04:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 02:04:00;2022-03-12 02:19:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 02:19:00;2022-03-12 02:34:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 02:34:00;2022-03-12 02:49:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 02:49:00;2022-03-12 03:04:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 03:04:00;2022-03-12 03:19:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 03:19:00;2022-03-12 03:34:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 03:34:00;2022-03-12 03:49:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 03:49:00;2022-03-12 04:04:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 04:04:00;2022-03-12 04:19:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 04:19:00;2022-03-12 04:34:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 04:34:00;2022-03-12 04:49:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 04:49:00;2022-03-12 05:04:00;Station-16;10229;0;171;CKB +LINE_21;Station-16;2022-03-12 05:04:00;2022-03-12 05:19:00;Station-3;11801;0;171;CKB +LINE_21;Station-3;2022-03-12 05:19:00;2022-03-12 05:19:00;Station-0;0.06;0;171;CKB +LINE_23;Station-0;2022-03-12 02:34:00;2022-03-12 02:34:00;Station-45;0.06;0;172;CKB +LINE_23;Station-45;2022-03-12 02:34:00;2022-03-12 03:00:00;Station-46;9016;0;172;CKB +LINE_23;Station-46;2022-03-12 03:00:00;2022-03-12 03:27:00;Station-45;10083;7;172;CKB +LINE_23;Station-45;2022-03-12 03:34:00;2022-03-12 04:00:00;Station-46;9016;0;172;CKB +LINE_23;Station-46;2022-03-12 04:00:00;2022-03-12 04:27:00;Station-45;10083;7;172;CKB +LINE_23;Station-45;2022-03-12 04:34:00;2022-03-12 05:00:00;Station-46;9016;0;172;CKB +LINE_23;Station-46;2022-03-12 05:00:00;2022-03-12 05:27:00;Station-45;10083;0;172;CKB +LINE_23;Station-45;2022-03-12 05:27:00;2022-03-12 05:27:00;Station-0;0.06;0;172;CKB +LINE_23;Station-0;2022-03-12 02:04:00;2022-03-12 02:04:00;Station-45;0.06;0;173;CKB +LINE_23;Station-45;2022-03-12 02:04:00;2022-03-12 02:30:00;Station-46;9016;0;173;CKB +LINE_23;Station-46;2022-03-12 02:30:00;2022-03-12 02:57:00;Station-45;10083;7;173;CKB +LINE_23;Station-45;2022-03-12 03:04:00;2022-03-12 03:30:00;Station-46;9016;0;173;CKB +LINE_23;Station-46;2022-03-12 03:30:00;2022-03-12 03:57:00;Station-45;10083;7;173;CKB +LINE_23;Station-45;2022-03-12 04:04:00;2022-03-12 04:30:00;Station-46;9016;0;173;CKB +LINE_23;Station-46;2022-03-12 04:30:00;2022-03-12 04:57:00;Station-45;10083;7;173;CKB +LINE_23;Station-45;2022-03-12 05:04:00;2022-03-12 05:30:00;Station-46;9016;0;173;CKB +LINE_23;Station-46;2022-03-12 05:30:00;2022-03-12 05:30:00;Station-0;0.06;0;173;CKB +LINE_24;Station-0;2022-03-12 00:31:00;2022-03-12 00:31:00;Station-21;0.06;0;174;CKB +LINE_24;Station-21;2022-03-12 00:31:00;2022-03-12 00:44:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 00:44:00;2022-03-12 00:56:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 01:01:00;2022-03-12 01:14:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 01:14:00;2022-03-12 01:26:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 01:31:00;2022-03-12 01:44:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 01:44:00;2022-03-12 01:56:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 02:01:00;2022-03-12 02:14:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 02:14:00;2022-03-12 02:26:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 02:31:00;2022-03-12 02:44:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 02:44:00;2022-03-12 02:56:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 03:01:00;2022-03-12 03:14:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 03:14:00;2022-03-12 03:26:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 03:31:00;2022-03-12 03:44:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 03:44:00;2022-03-12 03:56:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 04:01:00;2022-03-12 04:14:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 04:14:00;2022-03-12 04:26:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 04:31:00;2022-03-12 04:44:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 04:44:00;2022-03-12 04:56:00;Station-21;5362;5;174;CKB +LINE_24;Station-21;2022-03-12 05:01:00;2022-03-12 05:14:00;Station-47;4872;0;174;CKB +LINE_24;Station-47;2022-03-12 05:14:00;2022-03-12 05:26:00;Station-21;5362;0;174;CKB +LINE_24;Station-21;2022-03-12 05:26:00;2022-03-12 05:26:00;Station-0;0.06;0;174;CKB +LINE_25;Station-0;2022-03-12 00:31:00;2022-03-12 00:31:00;Station-21;0.06;0;175;CKB +LINE_25;Station-21;2022-03-12 00:31:00;2022-03-12 00:45:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 00:47:00;2022-03-12 01:01:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 01:01:00;2022-03-12 01:15:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 01:17:00;2022-03-12 01:31:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 01:31:00;2022-03-12 01:45:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 01:47:00;2022-03-12 02:01:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 02:01:00;2022-03-12 02:15:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 02:17:00;2022-03-12 02:31:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 02:31:00;2022-03-12 02:45:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 02:47:00;2022-03-12 03:01:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 03:01:00;2022-03-12 03:15:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 03:17:00;2022-03-12 03:31:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 03:31:00;2022-03-12 03:45:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 03:47:00;2022-03-12 04:01:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 04:01:00;2022-03-12 04:15:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 04:17:00;2022-03-12 04:31:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 04:31:00;2022-03-12 04:45:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 04:47:00;2022-03-12 05:01:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 05:01:00;2022-03-12 05:15:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 05:17:00;2022-03-12 05:31:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 05:31:00;2022-03-12 05:45:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 05:47:00;2022-03-12 06:01:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 06:01:00;2022-03-12 06:15:00;Station-48;5225;2;175;CKB +LINE_25;Station-48;2022-03-12 06:17:00;2022-03-12 06:31:00;Station-21;7617;0;175;CKB +LINE_25;Station-21;2022-03-12 06:31:00;2022-03-12 06:45:00;Station-48;5096;0;175;CKB +LINE_25;Station-48;2022-03-12 06:45:00;2022-03-12 06:45:00;Station-0;0.06;0;175;CKB +LINE_26;Station-0;2022-03-12 00:43:00;2022-03-12 00:43:00;Station-49;0.06;0;176;CKB +LINE_26;Station-49;2022-03-12 00:43:00;2022-03-12 00:53:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 00:53:00;2022-03-12 01:03:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 01:13:00;2022-03-12 01:23:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 01:23:00;2022-03-12 01:33:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 01:43:00;2022-03-12 01:53:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 01:53:00;2022-03-12 02:03:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 02:13:00;2022-03-12 02:23:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 02:23:00;2022-03-12 02:33:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 02:43:00;2022-03-12 02:53:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 02:53:00;2022-03-12 03:03:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 03:13:00;2022-03-12 03:23:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 03:23:00;2022-03-12 03:33:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 03:43:00;2022-03-12 03:53:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 03:53:00;2022-03-12 04:03:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 04:13:00;2022-03-12 04:23:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 04:23:00;2022-03-12 04:33:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 04:43:00;2022-03-12 04:53:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 04:53:00;2022-03-12 05:03:00;Station-49;4408;10;176;CKB +LINE_26;Station-49;2022-03-12 05:13:00;2022-03-12 05:23:00;Station-50;4507;0;176;CKB +LINE_26;Station-50;2022-03-12 05:23:00;2022-03-12 05:23:00;Station-0;0.06;0;176;CKB +LINE_0;Station-0;2022-03-12 20:51:00;2022-03-12 20:51:00;Station-1;0.06;0;177;CKB +LINE_0;Station-1;2022-03-12 20:51:00;2022-03-12 21:24:00;Station-2;14519;4;177;CKB +LINE_0;Station-2;2022-03-12 21:28:00;2022-03-12 22:03:00;Station-1;13541;8;177;CKB +LINE_0;Station-1;2022-03-12 22:11:00;2022-03-12 22:44:00;Station-2;14519;4;177;CKB +LINE_0;Station-2;2022-03-12 22:48:00;2022-03-12 23:23:00;Station-1;13541;8;177;CKB +LINE_0;Station-1;2022-03-12 23:31:00;2022-03-13 00:04:00;Station-2;14519;4;177;CKB +LINE_0;Station-2;2022-03-13 00:08:00;2022-03-13 00:39:00;Station-5;12213;0;177;CKB +LINE_1;Station-5;2022-03-13 00:39:00;2022-03-13 00:47:00;Station-3;4.0;2;177;CKB +LINE_1;Station-3;2022-03-13 00:49:00;2022-03-13 01:12:00;Station-4;8.36;6;177;CKB +LINE_1;Station-4;2022-03-13 01:18:00;2022-03-13 01:36:00;Station-3;9067;13;177;CKB +LINE_1;Station-3;2022-03-13 01:49:00;2022-03-13 02:12:00;Station-4;8.36;6;177;CKB +LINE_1;Station-4;2022-03-13 02:18:00;2022-03-13 02:36:00;Station-3;9067;13;177;CKB +LINE_1;Station-3;2022-03-13 02:49:00;2022-03-13 03:12:00;Station-4;8.36;6;177;CKB +LINE_1;Station-4;2022-03-13 03:18:00;2022-03-13 03:36:00;Station-3;9067;13;177;CKB +LINE_1;Station-3;2022-03-13 03:49:00;2022-03-13 04:12:00;Station-4;8.36;6;177;CKB +LINE_1;Station-4;2022-03-13 04:18:00;2022-03-13 04:36:00;Station-3;9067;13;177;CKB +LINE_1;Station-3;2022-03-13 04:49:00;2022-03-13 05:12:00;Station-4;8.36;6;177;CKB +LINE_1;Station-4;2022-03-13 05:18:00;2022-03-13 05:36:00;Station-3;9067;13;177;CKB +LINE_1;Station-3;2022-03-13 05:49:00;2022-03-13 06:08:00;Station-4;8762;10;177;CKB +LINE_1;Station-4;2022-03-13 06:18:00;2022-03-13 06:36:00;Station-3;9067;13;177;CKB +LINE_1;Station-3;2022-03-13 06:49:00;2022-03-13 07:08:00;Station-4;8762;0;177;CKB +LINE_1;Station-4;2022-03-13 07:08:00;2022-03-13 07:08:00;Station-0;0.06;0;177;CKB +LINE_0;Station-0;2022-03-12 21:31:00;2022-03-12 21:31:00;Station-1;0.06;0;178;CKB +LINE_0;Station-1;2022-03-12 21:31:00;2022-03-12 22:04:00;Station-2;14519;4;178;CKB +LINE_0;Station-2;2022-03-12 22:08:00;2022-03-12 22:43:00;Station-1;13541;8;178;CKB +LINE_0;Station-1;2022-03-12 22:51:00;2022-03-12 23:24:00;Station-2;14519;4;178;CKB +LINE_0;Station-2;2022-03-12 23:28:00;2022-03-13 00:03:00;Station-1;13541;8;178;CKB +LINE_0;Station-1;2022-03-13 00:11:00;2022-03-13 00:44:00;Station-2;14519;0;178;CKB +LINE_1;Station-2;2022-03-13 00:44:00;2022-03-13 00:54:00;Station-3;4.1;25;178;CKB +LINE_1;Station-3;2022-03-13 01:19:00;2022-03-13 01:42:00;Station-4;8.36;6;178;CKB +LINE_1;Station-4;2022-03-13 01:48:00;2022-03-13 02:06:00;Station-3;9067;13;178;CKB +LINE_1;Station-3;2022-03-13 02:19:00;2022-03-13 02:42:00;Station-4;8.36;6;178;CKB +LINE_1;Station-4;2022-03-13 02:48:00;2022-03-13 03:06:00;Station-3;9067;13;178;CKB +LINE_1;Station-3;2022-03-13 03:19:00;2022-03-13 03:42:00;Station-4;8.36;6;178;CKB +LINE_1;Station-4;2022-03-13 03:48:00;2022-03-13 04:06:00;Station-3;9067;13;178;CKB +LINE_1;Station-3;2022-03-13 04:19:00;2022-03-13 04:42:00;Station-4;8.36;6;178;CKB +LINE_1;Station-4;2022-03-13 04:48:00;2022-03-13 05:06:00;Station-3;9067;13;178;CKB +LINE_1;Station-3;2022-03-13 05:19:00;2022-03-13 05:42:00;Station-4;8.36;6;178;CKB +LINE_1;Station-4;2022-03-13 05:48:00;2022-03-13 06:06:00;Station-3;9067;0;178;CKB +LINE_1;Station-3;2022-03-13 06:06:00;2022-03-13 06:06:00;Station-0;0.06;0;178;CKB +LINE_2;Station-0;2022-03-12 21:06:00;2022-03-12 21:06:00;Station-6;0.06;0;179;CKB +LINE_2;Station-6;2022-03-12 21:06:00;2022-03-12 21:34:00;Station-7;13018;19;179;CKB +LINE_2;Station-7;2022-03-12 21:53:00;2022-03-12 22:13:00;Station-8;10332;17;179;CKB +LINE_2;Station-8;2022-03-12 22:30:00;2022-03-12 22:54:00;Station-7;10.48;19;179;CKB +LINE_2;Station-7;2022-03-12 23:13:00;2022-03-12 23:33:00;Station-8;10332;17;179;CKB +LINE_2;Station-8;2022-03-12 23:50:00;2022-03-13 00:14:00;Station-7;10.48;8;179;CKB +LINE_2;Station-7;2022-03-13 00:22:00;2022-03-13 00:27:00;Station-58;2533;2;179;CKB +LINE_3;Station-58;2022-03-13 00:29:00;2022-03-13 00:47:00;Station-10;7.58;0;179;CKB +LINE_3;Station-10;2022-03-13 00:47:00;2022-03-13 01:14:00;Station-11;12841;3;179;CKB +LINE_3;Station-11;2022-03-13 01:17:00;2022-03-13 01:47:00;Station-10;14281;0;179;CKB +LINE_3;Station-10;2022-03-13 01:47:00;2022-03-13 02:14:00;Station-11;12841;3;179;CKB +LINE_3;Station-11;2022-03-13 02:17:00;2022-03-13 02:47:00;Station-10;14281;0;179;CKB +LINE_3;Station-10;2022-03-13 02:47:00;2022-03-13 03:14:00;Station-11;12841;3;179;CKB +LINE_3;Station-11;2022-03-13 03:17:00;2022-03-13 03:47:00;Station-10;14281;0;179;CKB +LINE_3;Station-10;2022-03-13 03:47:00;2022-03-13 04:14:00;Station-11;12841;3;179;CKB +LINE_3;Station-11;2022-03-13 04:17:00;2022-03-13 04:47:00;Station-10;14281;0;179;CKB +LINE_3;Station-10;2022-03-13 04:47:00;2022-03-13 05:14:00;Station-11;12841;3;179;CKB +LINE_3;Station-11;2022-03-13 05:17:00;2022-03-13 05:47:00;Station-10;14281;0;179;CKB +LINE_3;Station-10;2022-03-13 05:47:00;2022-03-13 06:14:00;Station-11;12841;3;179;CKB +LINE_3;Station-11;2022-03-13 06:17:00;2022-03-13 06:47:00;Station-10;14281;0;179;CKB +LINE_3;Station-10;2022-03-13 06:47:00;2022-03-13 06:59:00;Station-58;5474;0;179;CKB +LINE_3;Station-58;2022-03-13 06:59:00;2022-03-13 06:59:00;Station-0;0.06;0;179;CKB +LINE_2;Station-0;2022-03-12 20:26:00;2022-03-12 20:26:00;Station-6;0.06;0;180;CKB +LINE_2;Station-6;2022-03-12 20:26:00;2022-03-12 20:56:00;Station-12;14097;14;180;CKB +LINE_2;Station-12;2022-03-12 21:10:00;2022-03-12 21:38:00;Station-6;13.19;8;180;CKB +LINE_2;Station-6;2022-03-12 21:46:00;2022-03-12 22:14:00;Station-7;13018;19;180;CKB +LINE_2;Station-7;2022-03-12 22:33:00;2022-03-12 22:53:00;Station-8;10332;17;180;CKB +LINE_2;Station-8;2022-03-12 23:10:00;2022-03-12 23:34:00;Station-7;10.48;19;180;CKB +LINE_2;Station-7;2022-03-12 23:53:00;2022-03-13 00:13:00;Station-8;10332;2;180;CKB +LINE_2;Station-8;2022-03-13 00:15:00;2022-03-13 00:16:00;Station-10;506;1;180;CKB +LINE_3;Station-10;2022-03-13 00:17:00;2022-03-13 00:44:00;Station-11;12841;3;180;CKB +LINE_3;Station-11;2022-03-13 00:47:00;2022-03-13 01:17:00;Station-10;14281;0;180;CKB +LINE_3;Station-10;2022-03-13 01:17:00;2022-03-13 01:44:00;Station-11;12841;3;180;CKB +LINE_3;Station-11;2022-03-13 01:47:00;2022-03-13 02:17:00;Station-10;14281;0;180;CKB +LINE_3;Station-10;2022-03-13 02:17:00;2022-03-13 02:44:00;Station-11;12841;3;180;CKB +LINE_3;Station-11;2022-03-13 02:47:00;2022-03-13 03:17:00;Station-10;14281;0;180;CKB +LINE_3;Station-10;2022-03-13 03:17:00;2022-03-13 03:44:00;Station-11;12841;3;180;CKB +LINE_3;Station-11;2022-03-13 03:47:00;2022-03-13 04:17:00;Station-10;14281;0;180;CKB +LINE_3;Station-10;2022-03-13 04:17:00;2022-03-13 04:44:00;Station-11;12841;3;180;CKB +LINE_3;Station-11;2022-03-13 04:47:00;2022-03-13 05:17:00;Station-10;14281;0;180;CKB +LINE_3;Station-10;2022-03-13 05:17:00;2022-03-13 05:44:00;Station-11;12841;3;180;CKB +LINE_3;Station-11;2022-03-13 05:47:00;2022-03-13 06:17:00;Station-10;14281;0;180;CKB +LINE_3;Station-10;2022-03-13 06:17:00;2022-03-13 06:44:00;Station-11;12841;3;180;CKB +LINE_3;Station-11;2022-03-13 06:47:00;2022-03-13 07:17:00;Station-10;14281;0;180;CKB +LINE_3;Station-10;2022-03-13 07:17:00;2022-03-13 07:17:00;Station-0;0.06;0;180;CKB +LINE_5;Station-0;2022-03-12 20:26:00;2022-03-12 20:26:00;Station-14;0.06;0;181;CKB +LINE_5;Station-14;2022-03-12 20:26:00;2022-03-12 20:38:00;Station-15;5882;3;181;CKB +LINE_5;Station-15;2022-03-12 20:41:00;2022-03-12 20:55:00;Station-14;6232;0;181;CKB +LINE_5;Station-14;2022-03-12 20:55:00;2022-03-12 21:08:00;Station-15;6086;3;181;CKB +LINE_5;Station-15;2022-03-12 21:11:00;2022-03-12 21:25:00;Station-14;6232;0;181;CKB +LINE_5;Station-14;2022-03-12 21:25:00;2022-03-12 21:38:00;Station-15;6086;3;181;CKB +LINE_5;Station-15;2022-03-12 21:41:00;2022-03-12 21:55:00;Station-14;6232;0;181;CKB +LINE_5;Station-14;2022-03-12 21:55:00;2022-03-12 22:08:00;Station-15;6086;3;181;CKB +LINE_5;Station-15;2022-03-12 22:11:00;2022-03-12 22:25:00;Station-14;6232;0;181;CKB +LINE_5;Station-14;2022-03-12 22:25:00;2022-03-12 22:38:00;Station-15;6086;3;181;CKB +LINE_5;Station-15;2022-03-12 22:41:00;2022-03-12 22:55:00;Station-14;6232;0;181;CKB +LINE_5;Station-14;2022-03-12 22:55:00;2022-03-12 23:08:00;Station-15;6086;3;181;CKB +LINE_5;Station-15;2022-03-12 23:11:00;2022-03-12 23:25:00;Station-14;6232;0;181;CKB +LINE_5;Station-14;2022-03-12 23:25:00;2022-03-12 23:38:00;Station-15;6086;3;181;CKB +LINE_5;Station-15;2022-03-12 23:41:00;2022-03-12 23:55:00;Station-14;6232;0;181;CKB +LINE_5;Station-14;2022-03-12 23:55:00;2022-03-13 00:08:00;Station-15;6086;0;181;CKB +LINE_5;Station-15;2022-03-13 00:08:00;2022-03-13 00:08:00;Station-0;0.06;0;181;CKB +LINE_6;Station-0;2022-03-12 05:25:00;2022-03-12 05:25:00;Station-16;0.06;0;182;CKB +LINE_6;Station-16;2022-03-12 05:25:00;2022-03-12 05:34:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 05:34:00;2022-03-12 05:43:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 06:05:00;2022-03-12 06:14:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 06:14:00;2022-03-12 06:23:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 06:25:00;2022-03-12 06:34:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 06:34:00;2022-03-12 06:43:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 06:45:00;2022-03-12 06:54:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 06:54:00;2022-03-12 07:03:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 07:05:00;2022-03-12 07:14:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 07:14:00;2022-03-12 07:23:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 07:25:00;2022-03-12 07:34:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 07:34:00;2022-03-12 07:43:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 08:05:00;2022-03-12 08:14:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 08:14:00;2022-03-12 08:23:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 08:25:00;2022-03-12 08:34:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 08:34:00;2022-03-12 08:43:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 08:45:00;2022-03-12 08:54:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 08:54:00;2022-03-12 09:03:00;Station-16;5139;3;182;CKB +LINE_6;Station-16;2022-03-12 09:06:00;2022-03-12 09:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 09:15:00;2022-03-12 09:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 09:26:00;2022-03-12 09:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 09:35:00;2022-03-12 09:44:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 10:06:00;2022-03-12 10:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 10:15:00;2022-03-12 10:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 10:26:00;2022-03-12 10:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 10:35:00;2022-03-12 10:44:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 10:46:00;2022-03-12 10:55:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 10:55:00;2022-03-12 11:04:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 11:06:00;2022-03-12 11:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 11:15:00;2022-03-12 11:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 11:26:00;2022-03-12 11:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 11:35:00;2022-03-12 11:44:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 12:06:00;2022-03-12 12:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 12:15:00;2022-03-12 12:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 12:26:00;2022-03-12 12:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 12:35:00;2022-03-12 12:44:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 12:46:00;2022-03-12 12:55:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 12:55:00;2022-03-12 13:04:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 13:06:00;2022-03-12 13:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 13:15:00;2022-03-12 13:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 13:26:00;2022-03-12 13:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 13:35:00;2022-03-12 13:44:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 14:06:00;2022-03-12 14:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 14:15:00;2022-03-12 14:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 14:26:00;2022-03-12 14:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 14:35:00;2022-03-12 14:44:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 14:46:00;2022-03-12 14:55:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 14:55:00;2022-03-12 15:04:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 15:06:00;2022-03-12 15:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 15:15:00;2022-03-12 15:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 15:26:00;2022-03-12 15:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 15:35:00;2022-03-12 15:44:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 16:06:00;2022-03-12 16:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 16:15:00;2022-03-12 16:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 16:26:00;2022-03-12 16:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 16:35:00;2022-03-12 16:44:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 16:46:00;2022-03-12 16:55:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 16:55:00;2022-03-12 17:04:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 17:06:00;2022-03-12 17:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 17:15:00;2022-03-12 17:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 17:26:00;2022-03-12 17:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 17:35:00;2022-03-12 17:44:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 18:06:00;2022-03-12 18:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 18:15:00;2022-03-12 18:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 18:26:00;2022-03-12 18:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 18:35:00;2022-03-12 18:44:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 18:46:00;2022-03-12 18:55:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 18:55:00;2022-03-12 19:04:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 19:06:00;2022-03-12 19:15:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 19:15:00;2022-03-12 19:24:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 19:26:00;2022-03-12 19:35:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 19:35:00;2022-03-12 19:44:00;Station-16;5139;21;182;CKB +LINE_6;Station-16;2022-03-12 20:05:00;2022-03-12 20:14:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 20:14:00;2022-03-12 20:23:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 20:25:00;2022-03-12 20:34:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 20:34:00;2022-03-12 20:43:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 20:45:00;2022-03-12 20:54:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 20:54:00;2022-03-12 21:03:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 21:05:00;2022-03-12 21:14:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 21:14:00;2022-03-12 21:23:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 21:25:00;2022-03-12 21:34:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 21:34:00;2022-03-12 21:43:00;Station-16;5139;22;182;CKB +LINE_6;Station-16;2022-03-12 22:05:00;2022-03-12 22:14:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 22:14:00;2022-03-12 22:23:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 22:25:00;2022-03-12 22:34:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 22:34:00;2022-03-12 22:43:00;Station-16;5139;2;182;CKB +LINE_6;Station-16;2022-03-12 22:45:00;2022-03-12 22:54:00;Station-17;4781;0;182;CKB +LINE_6;Station-17;2022-03-12 22:54:00;2022-03-12 23:03:00;Station-16;5139;0;182;CKB +LINE_6;Station-16;2022-03-12 23:03:00;2022-03-12 23:03:00;Station-0;0.06;0;182;CKB +LINE_29;Station-0;2022-03-12 07:30:00;2022-03-12 07:30:00;Station-53;0.06;0;183;CKB +LINE_29;Station-53;2022-03-12 07:30:00;2022-03-12 07:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 07:39:00;2022-03-12 07:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 07:50:00;2022-03-12 07:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 07:59:00;2022-03-12 08:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 08:10:00;2022-03-12 08:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 08:19:00;2022-03-12 08:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 08:30:00;2022-03-12 08:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 08:39:00;2022-03-12 08:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 08:50:00;2022-03-12 08:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 08:59:00;2022-03-12 09:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 09:10:00;2022-03-12 09:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 09:19:00;2022-03-12 09:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 09:30:00;2022-03-12 09:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 09:39:00;2022-03-12 09:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 09:50:00;2022-03-12 09:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 09:59:00;2022-03-12 10:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 10:10:00;2022-03-12 10:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 10:19:00;2022-03-12 10:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 10:30:00;2022-03-12 10:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 10:39:00;2022-03-12 10:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 10:50:00;2022-03-12 10:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 10:59:00;2022-03-12 11:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 11:10:00;2022-03-12 11:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 11:19:00;2022-03-12 11:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 11:30:00;2022-03-12 11:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 11:39:00;2022-03-12 11:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 11:50:00;2022-03-12 11:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 11:59:00;2022-03-12 12:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 12:10:00;2022-03-12 12:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 12:19:00;2022-03-12 12:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 12:30:00;2022-03-12 12:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 12:39:00;2022-03-12 12:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 12:50:00;2022-03-12 12:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 12:59:00;2022-03-12 13:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 13:10:00;2022-03-12 13:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 13:19:00;2022-03-12 13:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 13:30:00;2022-03-12 13:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 13:39:00;2022-03-12 13:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 13:50:00;2022-03-12 13:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 13:59:00;2022-03-12 14:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 14:10:00;2022-03-12 14:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 14:19:00;2022-03-12 14:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 14:30:00;2022-03-12 14:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 14:39:00;2022-03-12 14:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 14:50:00;2022-03-12 14:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 14:59:00;2022-03-12 15:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 15:10:00;2022-03-12 15:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 15:19:00;2022-03-12 15:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 15:30:00;2022-03-12 15:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 15:39:00;2022-03-12 15:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 15:50:00;2022-03-12 15:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 15:59:00;2022-03-12 16:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 16:10:00;2022-03-12 16:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 16:19:00;2022-03-12 16:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 16:30:00;2022-03-12 16:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 16:39:00;2022-03-12 16:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 16:50:00;2022-03-12 16:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 16:59:00;2022-03-12 17:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 17:10:00;2022-03-12 17:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 17:19:00;2022-03-12 17:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 17:30:00;2022-03-12 17:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 17:39:00;2022-03-12 17:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 17:50:00;2022-03-12 17:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 17:59:00;2022-03-12 18:10:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 18:10:00;2022-03-12 18:15:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 18:19:00;2022-03-12 18:30:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 18:30:00;2022-03-12 18:35:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 18:39:00;2022-03-12 18:50:00;Station-53;4341;0;183;CKB +LINE_29;Station-53;2022-03-12 18:50:00;2022-03-12 18:55:00;Station-54;2217;4;183;CKB +LINE_29;Station-54;2022-03-12 18:59:00;2022-03-12 19:10:00;Station-53;4288;0;183;CKB +LINE_29;Station-53;2022-03-12 19:10:00;2022-03-12 19:10:00;Station-0;0.06;0;183;CKB +LINE_9;Station-22;2022-03-12 08:08:00;2022-03-12 08:41:00;Station-23;17.9;0;184;VDL +LINE_9;Station-23;2022-03-12 08:41:00;2022-03-12 08:54:00;Station-23;4637;9;184;VDL +LINE_9;Station-23;2022-03-12 09:03:00;2022-03-12 09:17:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 09:21:00;2022-03-12 09:35:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 09:43:00;2022-03-12 09:57:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 10:01:00;2022-03-12 10:15:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 10:23:00;2022-03-12 10:37:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 10:41:00;2022-03-12 10:55:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 11:03:00;2022-03-12 11:17:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 11:21:00;2022-03-12 11:35:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 11:43:00;2022-03-12 11:57:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 12:01:00;2022-03-12 12:15:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 12:23:00;2022-03-12 12:37:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 12:41:00;2022-03-12 12:55:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 13:03:00;2022-03-12 13:17:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 13:21:00;2022-03-12 13:35:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 13:43:00;2022-03-12 13:57:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 14:01:00;2022-03-12 14:15:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 14:23:00;2022-03-12 14:37:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 14:41:00;2022-03-12 14:55:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 15:03:00;2022-03-12 15:17:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 15:21:00;2022-03-12 15:35:00;Station-23;4637;8;184;VDL +LINE_9;Station-23;2022-03-12 15:43:00;2022-03-12 15:57:00;Station-23;4637;4;184;VDL +LINE_9;Station-23;2022-03-12 16:01:00;2022-03-12 16:14:00;Station-23;4637;0;184;VDL +LINE_9;Station-23;2022-03-12 16:14:00;2022-03-12 16:57:00;Station-22;19.8;0;184;VDL +LINE_30;Station-0;2022-03-12 07:18:00;2022-03-12 07:18:00;Station-55;0.06;0;185;CKB +LINE_30;Station-55;2022-03-12 07:18:00;2022-03-12 07:26:00;Station-56;5562;10;185;CKB +LINE_30;Station-56;2022-03-12 07:36:00;2022-03-12 07:45:00;Station-57;5941;32;185;CKB +LINE_30;Station-57;2022-03-12 08:17:00;2022-03-12 08:26:00;Station-56;5994;8;185;CKB +LINE_30;Station-56;2022-03-12 08:34:00;2022-03-12 08:42:00;Station-55;5566;0;185;CKB +LINE_30;Station-55;2022-03-12 08:42:00;2022-03-12 08:42:00;Station-0;0.06;0;185;CKB +LINE_12;Station-0;2022-03-12 08:10:00;2022-03-12 08:10:00;Station-27;0.06;0;186;CKB +LINE_12;Station-27;2022-03-12 08:10:00;2022-03-12 08:16:00;Station-28;2169;12;186;CKB +LINE_12;Station-28;2022-03-12 08:28:00;2022-03-12 08:38:00;Station-27;2952;2;186;CKB +LINE_12;Station-27;2022-03-12 08:40:00;2022-03-12 08:46:00;Station-28;2169;12;186;CKB +LINE_12;Station-28;2022-03-12 08:58:00;2022-03-12 09:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 09:10:00;2022-03-12 09:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 09:28:00;2022-03-12 09:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 09:40:00;2022-03-12 09:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 09:58:00;2022-03-12 10:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 10:10:00;2022-03-12 10:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 10:28:00;2022-03-12 10:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 10:40:00;2022-03-12 10:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 10:58:00;2022-03-12 11:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 11:10:00;2022-03-12 11:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 11:28:00;2022-03-12 11:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 11:40:00;2022-03-12 11:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 11:58:00;2022-03-12 12:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 12:10:00;2022-03-12 12:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 12:28:00;2022-03-12 12:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 12:40:00;2022-03-12 12:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 12:58:00;2022-03-12 13:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 13:10:00;2022-03-12 13:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 13:28:00;2022-03-12 13:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 13:40:00;2022-03-12 13:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 13:58:00;2022-03-12 14:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 14:10:00;2022-03-12 14:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 14:28:00;2022-03-12 14:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 14:40:00;2022-03-12 14:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 14:58:00;2022-03-12 15:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 15:10:00;2022-03-12 15:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 15:28:00;2022-03-12 15:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 15:40:00;2022-03-12 15:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 15:58:00;2022-03-12 16:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 16:10:00;2022-03-12 16:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 16:28:00;2022-03-12 16:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 16:40:00;2022-03-12 16:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 16:58:00;2022-03-12 17:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 17:10:00;2022-03-12 17:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 17:28:00;2022-03-12 17:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 17:40:00;2022-03-12 17:48:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 17:58:00;2022-03-12 18:10:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 18:10:00;2022-03-12 18:18:00;Station-28;2169;10;186;CKB +LINE_12;Station-28;2022-03-12 18:28:00;2022-03-12 18:40:00;Station-27;2952;0;186;CKB +LINE_12;Station-27;2022-03-12 18:40:00;2022-03-12 18:48:00;Station-28;2169;0;186;CKB +LINE_12;Station-28;2022-03-12 18:48:00;2022-03-12 18:48:00;Station-0;0.06;0;186;CKB +LINE_13;Station-0;2022-03-13 00:23:00;2022-03-13 00:23:00;Station-29;0.06;0;187;CKB +LINE_13;Station-29;2022-03-13 00:23:00;2022-03-13 00:30:00;Station-30;2577;9;187;CKB +LINE_14;Station-30;2022-03-13 00:39:00;2022-03-13 00:54:00;Station-31;5937;9;187;CKB +LINE_14;Station-31;2022-03-13 01:03:00;2022-03-13 01:17:00;Station-30;6.19;0;187;CKB +LINE_13;Station-30;2022-03-13 01:17:00;2022-03-13 01:23:00;Station-29;2555;0;187;CKB +LINE_13;Station-29;2022-03-13 01:23:00;2022-03-13 01:30:00;Station-30;2577;9;187;CKB +LINE_14;Station-30;2022-03-13 01:39:00;2022-03-13 01:54:00;Station-31;5937;9;187;CKB +LINE_14;Station-31;2022-03-13 02:03:00;2022-03-13 02:17:00;Station-30;6.19;0;187;CKB +LINE_13;Station-30;2022-03-13 02:17:00;2022-03-13 02:23:00;Station-29;2555;0;187;CKB +LINE_13;Station-29;2022-03-13 02:23:00;2022-03-13 02:30:00;Station-30;2577;9;187;CKB +LINE_14;Station-30;2022-03-13 02:39:00;2022-03-13 02:54:00;Station-31;5937;9;187;CKB +LINE_14;Station-31;2022-03-13 03:03:00;2022-03-13 03:17:00;Station-30;6.19;0;187;CKB +LINE_13;Station-30;2022-03-13 03:17:00;2022-03-13 03:23:00;Station-29;2555;0;187;CKB +LINE_13;Station-29;2022-03-13 03:23:00;2022-03-13 03:30:00;Station-30;2577;9;187;CKB +LINE_14;Station-30;2022-03-13 03:39:00;2022-03-13 03:54:00;Station-31;5937;9;187;CKB +LINE_14;Station-31;2022-03-13 04:03:00;2022-03-13 04:17:00;Station-30;6.19;0;187;CKB +LINE_13;Station-30;2022-03-13 04:17:00;2022-03-13 04:23:00;Station-29;2555;0;187;CKB +LINE_13;Station-29;2022-03-13 04:23:00;2022-03-13 04:30:00;Station-30;2577;9;187;CKB +LINE_14;Station-30;2022-03-13 04:39:00;2022-03-13 04:54:00;Station-31;5937;9;187;CKB +LINE_14;Station-31;2022-03-13 05:03:00;2022-03-13 05:17:00;Station-30;6.19;0;187;CKB +LINE_13;Station-30;2022-03-13 05:17:00;2022-03-13 05:23:00;Station-29;2555;0;187;CKB +LINE_13;Station-29;2022-03-13 05:23:00;2022-03-13 05:30:00;Station-30;2577;9;187;CKB +LINE_14;Station-30;2022-03-13 05:39:00;2022-03-13 05:54:00;Station-31;5937;9;187;CKB +LINE_14;Station-31;2022-03-13 06:03:00;2022-03-13 06:17:00;Station-30;6.19;0;187;CKB +LINE_13;Station-30;2022-03-13 06:17:00;2022-03-13 06:23:00;Station-29;2555;0;187;CKB +LINE_13;Station-29;2022-03-13 06:23:00;2022-03-13 06:30:00;Station-30;2577;9;187;CKB +LINE_14;Station-30;2022-03-13 06:39:00;2022-03-13 06:54:00;Station-31;5937;0;187;CKB +LINE_14;Station-31;2022-03-13 06:54:00;2022-03-13 06:54:00;Station-0;0.06;0;187;CKB +LINE_14;Station-0;2022-03-13 00:33:00;2022-03-13 00:33:00;Station-31;0.06;0;188;CKB +LINE_14;Station-31;2022-03-13 00:33:00;2022-03-13 00:47:00;Station-30;6.19;0;188;CKB +LINE_13;Station-30;2022-03-13 00:47:00;2022-03-13 00:53:00;Station-29;2555;0;188;CKB +LINE_13;Station-29;2022-03-13 00:53:00;2022-03-13 01:00:00;Station-30;2577;9;188;CKB +LINE_14;Station-30;2022-03-13 01:09:00;2022-03-13 01:24:00;Station-31;5937;9;188;CKB +LINE_14;Station-31;2022-03-13 01:33:00;2022-03-13 01:47:00;Station-30;6.19;0;188;CKB +LINE_13;Station-30;2022-03-13 01:47:00;2022-03-13 01:53:00;Station-29;2555;0;188;CKB +LINE_13;Station-29;2022-03-13 01:53:00;2022-03-13 02:00:00;Station-30;2577;9;188;CKB +LINE_14;Station-30;2022-03-13 02:09:00;2022-03-13 02:24:00;Station-31;5937;9;188;CKB +LINE_14;Station-31;2022-03-13 02:33:00;2022-03-13 02:47:00;Station-30;6.19;0;188;CKB +LINE_13;Station-30;2022-03-13 02:47:00;2022-03-13 02:53:00;Station-29;2555;0;188;CKB +LINE_13;Station-29;2022-03-13 02:53:00;2022-03-13 03:00:00;Station-30;2577;9;188;CKB +LINE_14;Station-30;2022-03-13 03:09:00;2022-03-13 03:24:00;Station-31;5937;9;188;CKB +LINE_14;Station-31;2022-03-13 03:33:00;2022-03-13 03:47:00;Station-30;6.19;0;188;CKB +LINE_13;Station-30;2022-03-13 03:47:00;2022-03-13 03:53:00;Station-29;2555;0;188;CKB +LINE_13;Station-29;2022-03-13 03:53:00;2022-03-13 04:00:00;Station-30;2577;9;188;CKB +LINE_14;Station-30;2022-03-13 04:09:00;2022-03-13 04:24:00;Station-31;5937;9;188;CKB +LINE_14;Station-31;2022-03-13 04:33:00;2022-03-13 04:47:00;Station-30;6.19;0;188;CKB +LINE_13;Station-30;2022-03-13 04:47:00;2022-03-13 04:53:00;Station-29;2555;0;188;CKB +LINE_13;Station-29;2022-03-13 04:53:00;2022-03-13 05:00:00;Station-30;2577;9;188;CKB +LINE_14;Station-30;2022-03-13 05:09:00;2022-03-13 05:24:00;Station-31;5937;9;188;CKB +LINE_14;Station-31;2022-03-13 05:33:00;2022-03-13 05:47:00;Station-30;6.19;0;188;CKB +LINE_13;Station-30;2022-03-13 05:47:00;2022-03-13 05:53:00;Station-29;2555;0;188;CKB +LINE_13;Station-29;2022-03-13 05:53:00;2022-03-13 06:00:00;Station-30;2577;9;188;CKB +LINE_14;Station-30;2022-03-13 06:09:00;2022-03-13 06:24:00;Station-31;5937;9;188;CKB +LINE_14;Station-31;2022-03-13 06:33:00;2022-03-13 06:47:00;Station-30;6.19;0;188;CKB +LINE_14;Station-30;2022-03-13 06:47:00;2022-03-13 06:47:00;Station-0;0.06;0;188;CKB +LINE_15;Station-0;2022-03-13 00:57:00;2022-03-13 00:57:00;Station-32;0.06;0;189;CKB +LINE_15;Station-32;2022-03-13 00:57:00;2022-03-13 01:06:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 01:06:00;2022-03-13 01:11:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 01:27:00;2022-03-13 01:36:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 01:36:00;2022-03-13 01:41:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 01:57:00;2022-03-13 02:06:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 02:06:00;2022-03-13 02:11:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 02:27:00;2022-03-13 02:36:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 02:36:00;2022-03-13 02:41:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 02:57:00;2022-03-13 03:06:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 03:06:00;2022-03-13 03:11:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 03:27:00;2022-03-13 03:36:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 03:36:00;2022-03-13 03:41:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 03:57:00;2022-03-13 04:06:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 04:06:00;2022-03-13 04:11:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 04:27:00;2022-03-13 04:36:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 04:36:00;2022-03-13 04:41:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 04:57:00;2022-03-13 05:06:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 05:06:00;2022-03-13 05:11:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 05:27:00;2022-03-13 05:36:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 05:36:00;2022-03-13 05:41:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 05:57:00;2022-03-13 06:06:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 06:06:00;2022-03-13 06:11:00;Station-32;2936;16;189;CKB +LINE_15;Station-32;2022-03-13 06:27:00;2022-03-13 06:36:00;Station-33;4343;0;189;CKB +LINE_15;Station-33;2022-03-13 06:36:00;2022-03-13 06:41:00;Station-32;2936;0;189;CKB +LINE_15;Station-32;2022-03-13 06:41:00;2022-03-13 06:41:00;Station-0;0.06;0;189;CKB +LINE_17;Station-0;2022-03-13 00:30:00;2022-03-13 00:30:00;Station-34;0.06;0;190;CKB +LINE_17;Station-34;2022-03-13 00:30:00;2022-03-13 00:44:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 00:44:00;2022-03-13 00:57:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 01:00:00;2022-03-13 01:14:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 01:14:00;2022-03-13 01:27:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 01:30:00;2022-03-13 01:44:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 01:44:00;2022-03-13 01:57:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 02:00:00;2022-03-13 02:14:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 02:14:00;2022-03-13 02:27:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 02:30:00;2022-03-13 02:44:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 02:44:00;2022-03-13 02:57:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 03:00:00;2022-03-13 03:14:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 03:14:00;2022-03-13 03:27:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 03:30:00;2022-03-13 03:44:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 03:44:00;2022-03-13 03:57:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 04:00:00;2022-03-13 04:14:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 04:14:00;2022-03-13 04:27:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 04:30:00;2022-03-13 04:44:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 04:44:00;2022-03-13 04:57:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 05:00:00;2022-03-13 05:14:00;Station-36;4801;0;190;CKB +LINE_17;Station-36;2022-03-13 05:14:00;2022-03-13 05:27:00;Station-34;5302;3;190;CKB +LINE_17;Station-34;2022-03-13 05:30:00;2022-03-13 05:44:00;Station-36;4.8;0;190;CKB +LINE_17;Station-36;2022-03-13 05:44:00;2022-03-13 05:56:00;Station-34;5301;4;190;CKB +LINE_17;Station-34;2022-03-13 06:00:00;2022-03-13 06:14:00;Station-36;4.8;0;190;CKB +LINE_17;Station-36;2022-03-13 06:14:00;2022-03-13 06:26:00;Station-34;5301;4;190;CKB +LINE_17;Station-34;2022-03-13 06:30:00;2022-03-13 06:44:00;Station-36;4.8;0;190;CKB +LINE_17;Station-36;2022-03-13 06:44:00;2022-03-13 06:56:00;Station-34;5301;0;190;CKB +LINE_17;Station-34;2022-03-13 06:56:00;2022-03-13 06:56:00;Station-0;0.06;0;190;CKB +LINE_20;Station-0;2022-03-13 00:32:00;2022-03-13 00:32:00;Station-13;0.06;0;191;CKB +LINE_20;Station-13;2022-03-13 00:32:00;2022-03-13 00:44:00;Station-40;4212;3;191;CKB +LINE_20;Station-40;2022-03-13 00:47:00;2022-03-13 01:16:00;Station-41;13048;0;191;CKB +LINE_20;Station-41;2022-03-13 01:16:00;2022-03-13 01:42:00;Station-40;12869;5;191;CKB +LINE_20;Station-40;2022-03-13 01:47:00;2022-03-13 02:16:00;Station-41;13048;0;191;CKB +LINE_20;Station-41;2022-03-13 02:16:00;2022-03-13 02:42:00;Station-40;12869;5;191;CKB +LINE_20;Station-40;2022-03-13 02:47:00;2022-03-13 03:16:00;Station-41;13048;0;191;CKB +LINE_20;Station-41;2022-03-13 03:16:00;2022-03-13 03:42:00;Station-40;12869;5;191;CKB +LINE_20;Station-40;2022-03-13 03:47:00;2022-03-13 04:16:00;Station-41;13048;0;191;CKB +LINE_20;Station-41;2022-03-13 04:16:00;2022-03-13 04:42:00;Station-40;12869;5;191;CKB +LINE_20;Station-40;2022-03-13 04:47:00;2022-03-13 05:16:00;Station-41;13048;0;191;CKB +LINE_20;Station-41;2022-03-13 05:16:00;2022-03-13 05:42:00;Station-40;12869;5;191;CKB +LINE_20;Station-40;2022-03-13 05:47:00;2022-03-13 06:16:00;Station-41;13048;0;191;CKB +LINE_20;Station-41;2022-03-13 06:16:00;2022-03-13 06:42:00;Station-40;12869;0;191;CKB +LINE_20;Station-40;2022-03-13 06:42:00;2022-03-13 06:42:00;Station-0;0.06;0;191;CKB +LINE_20;Station-0;2022-03-13 00:17:00;2022-03-13 00:17:00;Station-40;0.06;0;192;CKB +LINE_20;Station-40;2022-03-13 00:17:00;2022-03-13 00:46:00;Station-41;13048;0;192;CKB +LINE_20;Station-41;2022-03-13 00:46:00;2022-03-13 01:12:00;Station-40;12869;5;192;CKB +LINE_20;Station-40;2022-03-13 01:17:00;2022-03-13 01:46:00;Station-41;13048;0;192;CKB +LINE_20;Station-41;2022-03-13 01:46:00;2022-03-13 02:12:00;Station-40;12869;5;192;CKB +LINE_20;Station-40;2022-03-13 02:17:00;2022-03-13 02:46:00;Station-41;13048;0;192;CKB +LINE_20;Station-41;2022-03-13 02:46:00;2022-03-13 03:12:00;Station-40;12869;5;192;CKB +LINE_20;Station-40;2022-03-13 03:17:00;2022-03-13 03:46:00;Station-41;13048;0;192;CKB +LINE_20;Station-41;2022-03-13 03:46:00;2022-03-13 04:12:00;Station-40;12869;5;192;CKB +LINE_20;Station-40;2022-03-13 04:17:00;2022-03-13 04:46:00;Station-41;13048;0;192;CKB +LINE_20;Station-41;2022-03-13 04:46:00;2022-03-13 05:12:00;Station-40;12869;5;192;CKB +LINE_20;Station-40;2022-03-13 05:17:00;2022-03-13 05:46:00;Station-41;13048;0;192;CKB +LINE_20;Station-41;2022-03-13 05:46:00;2022-03-13 06:12:00;Station-40;12869;5;192;CKB +LINE_20;Station-40;2022-03-13 06:17:00;2022-03-13 06:46:00;Station-41;13048;0;192;CKB +LINE_20;Station-41;2022-03-13 06:46:00;2022-03-13 07:12:00;Station-40;12869;0;192;CKB +LINE_20;Station-40;2022-03-13 07:12:00;2022-03-13 07:12:00;Station-0;0.06;0;192;CKB +LINE_21;Station-0;2022-03-13 00:49:00;2022-03-13 00:49:00;Station-3;0.06;0;193;CKB +LINE_21;Station-3;2022-03-13 00:49:00;2022-03-13 01:04:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 01:04:00;2022-03-13 01:19:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 01:19:00;2022-03-13 01:34:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 01:34:00;2022-03-13 01:49:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 01:49:00;2022-03-13 02:04:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 02:04:00;2022-03-13 02:19:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 02:19:00;2022-03-13 02:34:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 02:34:00;2022-03-13 02:49:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 02:49:00;2022-03-13 03:04:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 03:04:00;2022-03-13 03:19:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 03:19:00;2022-03-13 03:34:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 03:34:00;2022-03-13 03:49:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 03:49:00;2022-03-13 04:04:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 04:04:00;2022-03-13 04:19:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 04:19:00;2022-03-13 04:34:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 04:34:00;2022-03-13 04:49:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 04:49:00;2022-03-13 05:04:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 05:04:00;2022-03-13 05:19:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 05:19:00;2022-03-13 05:34:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 05:34:00;2022-03-13 05:49:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 05:49:00;2022-03-13 06:04:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 06:04:00;2022-03-13 06:19:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 06:19:00;2022-03-13 06:34:00;Station-16;10229;0;193;CKB +LINE_21;Station-16;2022-03-13 06:34:00;2022-03-13 06:49:00;Station-3;11801;0;193;CKB +LINE_21;Station-3;2022-03-13 06:49:00;2022-03-13 06:49:00;Station-0;0.06;0;193;CKB +LINE_23;Station-0;2022-03-13 02:34:00;2022-03-13 02:34:00;Station-45;0.06;0;194;CKB +LINE_23;Station-45;2022-03-13 02:34:00;2022-03-13 03:00:00;Station-46;9016;0;194;CKB +LINE_23;Station-46;2022-03-13 03:00:00;2022-03-13 03:27:00;Station-45;10083;7;194;CKB +LINE_23;Station-45;2022-03-13 03:34:00;2022-03-13 04:00:00;Station-46;9016;0;194;CKB +LINE_23;Station-46;2022-03-13 04:00:00;2022-03-13 04:27:00;Station-45;10083;7;194;CKB +LINE_23;Station-45;2022-03-13 04:34:00;2022-03-13 05:00:00;Station-46;9016;0;194;CKB +LINE_23;Station-46;2022-03-13 05:00:00;2022-03-13 05:27:00;Station-45;10083;7;194;CKB +LINE_23;Station-45;2022-03-13 05:34:00;2022-03-13 06:00:00;Station-46;9016;0;194;CKB +LINE_23;Station-46;2022-03-13 06:00:00;2022-03-13 06:27:00;Station-45;10083;7;194;CKB +LINE_23;Station-45;2022-03-13 06:34:00;2022-03-13 07:00:00;Station-46;9016;0;194;CKB +LINE_23;Station-46;2022-03-13 07:00:00;2022-03-13 07:00:00;Station-0;0.06;0;194;CKB +LINE_23;Station-0;2022-03-13 02:04:00;2022-03-13 02:04:00;Station-45;0.06;0;195;CKB +LINE_23;Station-45;2022-03-13 02:04:00;2022-03-13 02:30:00;Station-46;9016;0;195;CKB +LINE_23;Station-46;2022-03-13 02:30:00;2022-03-13 02:57:00;Station-45;10083;7;195;CKB +LINE_23;Station-45;2022-03-13 03:04:00;2022-03-13 03:30:00;Station-46;9016;0;195;CKB +LINE_23;Station-46;2022-03-13 03:30:00;2022-03-13 03:57:00;Station-45;10083;7;195;CKB +LINE_23;Station-45;2022-03-13 04:04:00;2022-03-13 04:30:00;Station-46;9016;0;195;CKB +LINE_23;Station-46;2022-03-13 04:30:00;2022-03-13 04:57:00;Station-45;10083;7;195;CKB +LINE_23;Station-45;2022-03-13 05:04:00;2022-03-13 05:30:00;Station-46;9016;0;195;CKB +LINE_23;Station-46;2022-03-13 05:30:00;2022-03-13 05:57:00;Station-45;10083;7;195;CKB +LINE_23;Station-45;2022-03-13 06:04:00;2022-03-13 06:30:00;Station-46;9016;0;195;CKB +LINE_23;Station-46;2022-03-13 06:30:00;2022-03-13 06:57:00;Station-45;10083;0;195;CKB +LINE_23;Station-45;2022-03-13 06:57:00;2022-03-13 06:57:00;Station-0;0.06;0;195;CKB +LINE_24;Station-0;2022-03-13 00:31:00;2022-03-13 00:31:00;Station-21;0.06;0;196;CKB +LINE_24;Station-21;2022-03-13 00:31:00;2022-03-13 00:44:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 00:44:00;2022-03-13 00:56:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 01:01:00;2022-03-13 01:14:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 01:14:00;2022-03-13 01:26:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 01:31:00;2022-03-13 01:44:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 01:44:00;2022-03-13 01:56:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 02:01:00;2022-03-13 02:14:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 02:14:00;2022-03-13 02:26:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 02:31:00;2022-03-13 02:44:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 02:44:00;2022-03-13 02:56:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 03:01:00;2022-03-13 03:14:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 03:14:00;2022-03-13 03:26:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 03:31:00;2022-03-13 03:44:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 03:44:00;2022-03-13 03:56:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 04:01:00;2022-03-13 04:14:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 04:14:00;2022-03-13 04:26:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 04:31:00;2022-03-13 04:44:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 04:44:00;2022-03-13 04:56:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 05:01:00;2022-03-13 05:14:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 05:14:00;2022-03-13 05:26:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 05:31:00;2022-03-13 05:44:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 05:44:00;2022-03-13 05:56:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 06:01:00;2022-03-13 06:14:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 06:14:00;2022-03-13 06:26:00;Station-21;5362;5;196;CKB +LINE_24;Station-21;2022-03-13 06:31:00;2022-03-13 06:44:00;Station-47;4872;0;196;CKB +LINE_24;Station-47;2022-03-13 06:44:00;2022-03-13 06:56:00;Station-21;5362;0;196;CKB +LINE_24;Station-21;2022-03-13 06:56:00;2022-03-13 06:56:00;Station-0;0.06;0;196;CKB +LINE_25;Station-0;2022-03-13 00:31:00;2022-03-13 00:31:00;Station-21;0.06;0;197;CKB +LINE_25;Station-21;2022-03-13 00:31:00;2022-03-13 00:45:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 00:47:00;2022-03-13 01:01:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 01:01:00;2022-03-13 01:15:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 01:17:00;2022-03-13 01:31:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 01:31:00;2022-03-13 01:45:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 01:47:00;2022-03-13 02:01:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 02:01:00;2022-03-13 02:15:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 02:17:00;2022-03-13 02:31:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 02:31:00;2022-03-13 02:45:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 02:47:00;2022-03-13 03:01:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 03:01:00;2022-03-13 03:15:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 03:17:00;2022-03-13 03:31:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 03:31:00;2022-03-13 03:45:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 03:47:00;2022-03-13 04:01:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 04:01:00;2022-03-13 04:15:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 04:17:00;2022-03-13 04:31:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 04:31:00;2022-03-13 04:45:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 04:47:00;2022-03-13 05:01:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 05:01:00;2022-03-13 05:15:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 05:17:00;2022-03-13 05:31:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 05:31:00;2022-03-13 05:45:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 05:47:00;2022-03-13 06:01:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 06:01:00;2022-03-13 06:15:00;Station-48;5225;2;197;CKB +LINE_25;Station-48;2022-03-13 06:17:00;2022-03-13 06:31:00;Station-21;7617;0;197;CKB +LINE_25;Station-21;2022-03-13 06:31:00;2022-03-13 06:45:00;Station-48;5096;0;197;CKB +LINE_25;Station-48;2022-03-13 06:45:00;2022-03-13 06:45:00;Station-0;0.06;0;197;CKB +LINE_26;Station-0;2022-03-13 00:43:00;2022-03-13 00:43:00;Station-49;0.06;0;198;CKB +LINE_26;Station-49;2022-03-13 00:43:00;2022-03-13 00:53:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 00:53:00;2022-03-13 01:03:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 01:13:00;2022-03-13 01:23:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 01:23:00;2022-03-13 01:33:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 01:43:00;2022-03-13 01:53:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 01:53:00;2022-03-13 02:03:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 02:13:00;2022-03-13 02:23:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 02:23:00;2022-03-13 02:33:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 02:43:00;2022-03-13 02:53:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 02:53:00;2022-03-13 03:03:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 03:13:00;2022-03-13 03:23:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 03:23:00;2022-03-13 03:33:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 03:43:00;2022-03-13 03:53:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 03:53:00;2022-03-13 04:03:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 04:13:00;2022-03-13 04:23:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 04:23:00;2022-03-13 04:33:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 04:43:00;2022-03-13 04:53:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 04:53:00;2022-03-13 05:03:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 05:13:00;2022-03-13 05:23:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 05:23:00;2022-03-13 05:33:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 05:43:00;2022-03-13 05:53:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 05:53:00;2022-03-13 06:03:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 06:13:00;2022-03-13 06:23:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 06:23:00;2022-03-13 06:33:00;Station-49;4408;10;198;CKB +LINE_26;Station-49;2022-03-13 06:43:00;2022-03-13 06:53:00;Station-50;4507;0;198;CKB +LINE_26;Station-50;2022-03-13 06:53:00;2022-03-13 07:03:00;Station-49;4408;0;198;CKB +LINE_26;Station-49;2022-03-13 07:03:00;2022-03-13 07:03:00;Station-0;0.06;0;198;CKB diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a40ba02a..49c9f118 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -48,7 +48,7 @@ def from_csv(cls, path_to_csv, vehicle_types): schedule = cls(vehicle_types) with open(path_to_csv, 'r') as trips_file: - trip_reader = csv.DictReader(trips_file) + trip_reader = csv.DictReader(trips_file, delimiter=';') for trip in trip_reader: rotation_id = trip['rotation_id'] if rotation_id not in schedule.rotations.keys(): From 7cb08e60e1667baf8d6b9af6dc2e10b328ca6cc4 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 16 May 2022 18:07:26 +0200 Subject: [PATCH 145/802] set csv delimiter to comma --- data/examples/trips_example.csv | 4023 +------------------------------ ebus_toolbox/schedule.py | 4 +- 2 files changed, 67 insertions(+), 3960 deletions(-) diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index cd7615ca..eb338e34 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,3958 +1,65 @@ -line;departure_name;departure_time;arrival_time;arrival_name;distance;pause;rotation_id;vehicle_type -LINE_0;Station-0;2022-03-07 21:31:00;2022-03-07 21:31:00;Station-1;0.06;0;1;CKB -LINE_0;Station-1;2022-03-07 21:31:00;2022-03-07 22:04:00;Station-2;14519;4;1;CKB -LINE_0;Station-2;2022-03-07 22:08:00;2022-03-07 22:43:00;Station-1;13541;8;1;CKB -LINE_0;Station-1;2022-03-07 22:51:00;2022-03-07 23:24:00;Station-2;14519;4;1;CKB -LINE_0;Station-2;2022-03-07 23:28:00;2022-03-08 00:03:00;Station-1;13541;8;1;CKB -LINE_0;Station-1;2022-03-08 00:11:00;2022-03-08 00:44:00;Station-2;14519;0;1;CKB -LINE_1;Station-2;2022-03-08 00:44:00;2022-03-08 00:54:00;Station-3;4.1;25;1;CKB -LINE_1;Station-3;2022-03-08 01:19:00;2022-03-08 01:42:00;Station-4;8.36;6;1;CKB -LINE_1;Station-4;2022-03-08 01:48:00;2022-03-08 02:06:00;Station-3;9067;13;1;CKB -LINE_1;Station-3;2022-03-08 02:19:00;2022-03-08 02:42:00;Station-4;8.36;6;1;CKB -LINE_1;Station-4;2022-03-08 02:48:00;2022-03-08 03:06:00;Station-3;9067;13;1;CKB -LINE_1;Station-3;2022-03-08 03:19:00;2022-03-08 03:42:00;Station-4;8.36;6;1;CKB -LINE_1;Station-4;2022-03-08 03:48:00;2022-03-08 04:06:00;Station-3;9067;0;1;CKB -LINE_1;Station-3;2022-03-08 04:06:00;2022-03-08 04:06:00;Station-0;0.06;0;1;CKB -LINE_0;Station-0;2022-03-07 22:11:00;2022-03-07 22:11:00;Station-1;0.06;0;2;CKB -LINE_0;Station-1;2022-03-07 22:11:00;2022-03-07 22:44:00;Station-2;14519;4;2;CKB -LINE_0;Station-2;2022-03-07 22:48:00;2022-03-07 23:23:00;Station-1;13541;8;2;CKB -LINE_0;Station-1;2022-03-07 23:31:00;2022-03-08 00:04:00;Station-2;14519;4;2;CKB -LINE_0;Station-2;2022-03-08 00:08:00;2022-03-08 00:39:00;Station-5;12213;0;2;CKB -LINE_1;Station-5;2022-03-08 00:39:00;2022-03-08 00:47:00;Station-3;4.0;2;2;CKB -LINE_1;Station-3;2022-03-08 00:49:00;2022-03-08 01:12:00;Station-4;8.36;6;2;CKB -LINE_1;Station-4;2022-03-08 01:18:00;2022-03-08 01:36:00;Station-3;9067;13;2;CKB -LINE_1;Station-3;2022-03-08 01:49:00;2022-03-08 02:12:00;Station-4;8.36;6;2;CKB -LINE_1;Station-4;2022-03-08 02:18:00;2022-03-08 02:36:00;Station-3;9067;13;2;CKB -LINE_1;Station-3;2022-03-08 02:49:00;2022-03-08 03:12:00;Station-4;8.36;6;2;CKB -LINE_1;Station-4;2022-03-08 03:18:00;2022-03-08 03:36:00;Station-3;9067;13;2;CKB -LINE_1;Station-3;2022-03-08 03:49:00;2022-03-08 04:12:00;Station-4;8.36;0;2;CKB -LINE_1;Station-4;2022-03-08 04:12:00;2022-03-08 04:12:00;Station-0;0.06;0;2;CKB -LINE_2;Station-0;2022-03-07 21:06:00;2022-03-07 21:06:00;Station-6;0.06;0;3;CKB -LINE_2;Station-6;2022-03-07 21:06:00;2022-03-07 21:34:00;Station-7;13018;19;3;CKB -LINE_2;Station-7;2022-03-07 21:53:00;2022-03-07 22:13:00;Station-8;10332;17;3;CKB -LINE_2;Station-8;2022-03-07 22:30:00;2022-03-07 22:54:00;Station-7;10.48;19;3;CKB -LINE_2;Station-7;2022-03-07 23:13:00;2022-03-07 23:33:00;Station-8;10332;17;3;CKB -LINE_2;Station-8;2022-03-07 23:50:00;2022-03-08 00:14:00;Station-7;10.48;2;3;CKB -LINE_2;Station-7;2022-03-08 00:16:00;2022-03-08 00:23:00;Station-9;3709;5;3;CKB -LINE_3;Station-9;2022-03-08 00:28:00;2022-03-08 00:44:00;Station-10;6404;3;3;CKB -LINE_3;Station-10;2022-03-08 00:47:00;2022-03-08 01:10:00;Station-11;10579;7;3;CKB -LINE_3;Station-11;2022-03-08 01:17:00;2022-03-08 01:44:00;Station-10;12007;3;3;CKB -LINE_3;Station-10;2022-03-08 01:47:00;2022-03-08 02:10:00;Station-11;10579;7;3;CKB -LINE_3;Station-11;2022-03-08 02:17:00;2022-03-08 02:44:00;Station-10;12007;3;3;CKB -LINE_3;Station-10;2022-03-08 02:47:00;2022-03-08 03:10:00;Station-11;10579;7;3;CKB -LINE_3;Station-11;2022-03-08 03:17:00;2022-03-08 03:44:00;Station-10;12007;3;3;CKB -LINE_3;Station-10;2022-03-08 03:47:00;2022-03-08 04:10:00;Station-11;10579;7;3;CKB -LINE_3;Station-11;2022-03-08 04:17:00;2022-03-08 04:44:00;Station-10;12007;0;3;CKB -LINE_3;Station-10;2022-03-08 04:44:00;2022-03-08 04:44:00;Station-0;0.06;0;3;CKB -LINE_2;Station-0;2022-03-07 20:26:00;2022-03-07 20:26:00;Station-6;0.06;0;4;CKB -LINE_2;Station-6;2022-03-07 20:26:00;2022-03-07 20:56:00;Station-12;14097;14;4;CKB -LINE_2;Station-12;2022-03-07 21:10:00;2022-03-07 21:38:00;Station-6;13.19;8;4;CKB -LINE_2;Station-6;2022-03-07 21:46:00;2022-03-07 22:14:00;Station-7;13018;19;4;CKB -LINE_2;Station-7;2022-03-07 22:33:00;2022-03-07 22:53:00;Station-8;10332;17;4;CKB -LINE_2;Station-8;2022-03-07 23:10:00;2022-03-07 23:34:00;Station-7;10.48;19;4;CKB -LINE_2;Station-7;2022-03-07 23:53:00;2022-03-08 00:13:00;Station-8;10332;2;4;CKB -LINE_2;Station-8;2022-03-08 00:15:00;2022-03-08 00:16:00;Station-10;506;1;4;CKB -LINE_3;Station-10;2022-03-08 00:17:00;2022-03-08 00:40:00;Station-11;10579;7;4;CKB -LINE_3;Station-11;2022-03-08 00:47:00;2022-03-08 01:14:00;Station-10;12007;3;4;CKB -LINE_3;Station-10;2022-03-08 01:17:00;2022-03-08 01:40:00;Station-11;10579;7;4;CKB -LINE_3;Station-11;2022-03-08 01:47:00;2022-03-08 02:14:00;Station-10;12007;3;4;CKB -LINE_3;Station-10;2022-03-08 02:17:00;2022-03-08 02:40:00;Station-11;10579;7;4;CKB -LINE_3;Station-11;2022-03-08 02:47:00;2022-03-08 03:14:00;Station-10;12007;3;4;CKB -LINE_3;Station-10;2022-03-08 03:17:00;2022-03-08 03:40:00;Station-11;10579;7;4;CKB -LINE_3;Station-11;2022-03-08 03:47:00;2022-03-08 04:14:00;Station-10;12007;3;4;CKB -LINE_3;Station-10;2022-03-08 04:17:00;2022-03-08 04:40:00;Station-11;10579;3;4;CKB -LINE_4;Station-11;2022-03-08 04:43:00;2022-03-08 04:58:00;Station-13;6161;0;4;CKB -LINE_4;Station-13;2022-03-08 04:58:00;2022-03-08 04:58:00;Station-0;0.06;0;4;CKB -LINE_5;Station-0;2022-03-07 22:56:00;2022-03-07 22:56:00;Station-14;0.06;0;5;CKB -LINE_5;Station-14;2022-03-07 22:56:00;2022-03-07 23:08:00;Station-15;5882;3;5;CKB -LINE_5;Station-15;2022-03-07 23:11:00;2022-03-07 23:25:00;Station-14;6232;0;5;CKB -LINE_5;Station-14;2022-03-07 23:25:00;2022-03-07 23:38:00;Station-15;6086;3;5;CKB -LINE_5;Station-15;2022-03-07 23:41:00;2022-03-07 23:55:00;Station-14;6232;0;5;CKB -LINE_5;Station-14;2022-03-07 23:55:00;2022-03-08 00:08:00;Station-15;6086;0;5;CKB -LINE_5;Station-15;2022-03-08 00:08:00;2022-03-08 00:08:00;Station-0;0.06;0;5;CKB -LINE_6;Station-0;2022-03-07 05:05:00;2022-03-07 05:05:00;Station-16;0.06;0;6;CKB -LINE_6;Station-16;2022-03-07 05:05:00;2022-03-07 05:14:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 05:14:00;2022-03-07 05:23:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 05:25:00;2022-03-07 05:34:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 05:34:00;2022-03-07 05:43:00;Station-16;5139;23;6;CKB -LINE_6;Station-16;2022-03-07 06:06:00;2022-03-07 06:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 06:15:00;2022-03-07 06:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 06:26:00;2022-03-07 06:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 06:35:00;2022-03-07 06:44:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 06:46:00;2022-03-07 06:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 06:55:00;2022-03-07 07:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 07:06:00;2022-03-07 07:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 07:15:00;2022-03-07 07:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 07:26:00;2022-03-07 07:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 07:35:00;2022-03-07 07:44:00;Station-16;5139;22;6;CKB -LINE_6;Station-16;2022-03-07 08:06:00;2022-03-07 08:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 08:15:00;2022-03-07 08:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 08:26:00;2022-03-07 08:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 08:35:00;2022-03-07 08:44:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 08:46:00;2022-03-07 08:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 08:55:00;2022-03-07 09:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 09:06:00;2022-03-07 09:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 09:15:00;2022-03-07 09:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 09:26:00;2022-03-07 09:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 09:35:00;2022-03-07 09:44:00;Station-16;5139;22;6;CKB -LINE_6;Station-16;2022-03-07 10:06:00;2022-03-07 10:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 10:15:00;2022-03-07 10:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 10:26:00;2022-03-07 10:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 10:35:00;2022-03-07 10:44:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 10:46:00;2022-03-07 10:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 10:55:00;2022-03-07 11:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 11:06:00;2022-03-07 11:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 11:15:00;2022-03-07 11:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 11:26:00;2022-03-07 11:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 11:35:00;2022-03-07 11:44:00;Station-16;5139;22;6;CKB -LINE_6;Station-16;2022-03-07 12:06:00;2022-03-07 12:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 12:15:00;2022-03-07 12:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 12:26:00;2022-03-07 12:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 12:35:00;2022-03-07 12:44:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 12:46:00;2022-03-07 12:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 12:55:00;2022-03-07 13:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 13:06:00;2022-03-07 13:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 13:15:00;2022-03-07 13:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 13:26:00;2022-03-07 13:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 13:35:00;2022-03-07 13:44:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 13:46:00;2022-03-07 13:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 13:55:00;2022-03-07 14:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 14:06:00;2022-03-07 14:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 14:15:00;2022-03-07 14:24:00;Station-16;5139;22;6;CKB -LINE_6;Station-16;2022-03-07 14:46:00;2022-03-07 14:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 14:55:00;2022-03-07 15:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 15:06:00;2022-03-07 15:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 15:15:00;2022-03-07 15:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 15:26:00;2022-03-07 15:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 15:35:00;2022-03-07 15:44:00;Station-16;5139;22;6;CKB -LINE_6;Station-16;2022-03-07 16:06:00;2022-03-07 16:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 16:15:00;2022-03-07 16:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 16:26:00;2022-03-07 16:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 16:35:00;2022-03-07 16:44:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 16:46:00;2022-03-07 16:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 16:55:00;2022-03-07 17:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 17:06:00;2022-03-07 17:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 17:15:00;2022-03-07 17:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 17:26:00;2022-03-07 17:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 17:35:00;2022-03-07 17:44:00;Station-16;5139;22;6;CKB -LINE_6;Station-16;2022-03-07 18:06:00;2022-03-07 18:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 18:15:00;2022-03-07 18:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 18:26:00;2022-03-07 18:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 18:35:00;2022-03-07 18:44:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 18:46:00;2022-03-07 18:55:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 18:55:00;2022-03-07 19:04:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 19:06:00;2022-03-07 19:15:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 19:15:00;2022-03-07 19:24:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 19:26:00;2022-03-07 19:35:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 19:35:00;2022-03-07 19:44:00;Station-16;5139;21;6;CKB -LINE_6;Station-16;2022-03-07 20:05:00;2022-03-07 20:14:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 20:14:00;2022-03-07 20:23:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 20:25:00;2022-03-07 20:34:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 20:34:00;2022-03-07 20:43:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 20:45:00;2022-03-07 20:54:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 20:54:00;2022-03-07 21:03:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 21:05:00;2022-03-07 21:14:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 21:14:00;2022-03-07 21:23:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 21:25:00;2022-03-07 21:34:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 21:34:00;2022-03-07 21:43:00;Station-16;5139;22;6;CKB -LINE_6;Station-16;2022-03-07 22:05:00;2022-03-07 22:14:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 22:14:00;2022-03-07 22:23:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 22:25:00;2022-03-07 22:34:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 22:34:00;2022-03-07 22:43:00;Station-16;5139;2;6;CKB -LINE_6;Station-16;2022-03-07 22:45:00;2022-03-07 22:54:00;Station-17;4781;0;6;CKB -LINE_6;Station-17;2022-03-07 22:54:00;2022-03-07 23:03:00;Station-16;5139;0;6;CKB -LINE_6;Station-16;2022-03-07 23:03:00;2022-03-07 23:03:00;Station-0;0.06;0;6;CKB -LINE_7;Station-0;2022-03-08 00:06:00;2022-03-08 00:06:00;Station-18;0.06;0;7;CKB -LINE_7;Station-18;2022-03-08 00:06:00;2022-03-08 00:27:00;Station-19;7827;0;7;CKB -LINE_8;Station-19;2022-03-08 00:27:00;2022-03-08 00:48:00;Station-20;11079;0;7;CKB -LINE_8;Station-20;2022-03-08 00:48:00;2022-03-08 01:25:00;Station-21;20641;8;7;CKB -LINE_8;Station-21;2022-03-08 01:33:00;2022-03-08 02:16:00;Station-20;20579;1;7;CKB -LINE_8;Station-20;2022-03-08 02:17:00;2022-03-08 02:55:00;Station-21;20641;8;7;CKB -LINE_8;Station-21;2022-03-08 03:03:00;2022-03-08 03:46:00;Station-20;20579;1;7;CKB -LINE_8;Station-20;2022-03-08 03:47:00;2022-03-08 04:25:00;Station-21;20641;0;7;CKB -LINE_8;Station-21;2022-03-08 04:25:00;2022-03-08 04:25:00;Station-0;0.06;0;7;CKB -LINE_9;Station-22;2022-03-07 05:15:00;2022-03-07 06:01:00;Station-23;17.9;0;8;VDL -LINE_9;Station-23;2022-03-07 06:01:00;2022-03-07 06:15:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 06:23:00;2022-03-07 06:37:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 06:41:00;2022-03-07 06:55:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 07:03:00;2022-03-07 07:17:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 07:21:00;2022-03-07 07:35:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 07:43:00;2022-03-07 07:57:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 08:01:00;2022-03-07 08:15:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 08:23:00;2022-03-07 08:37:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 08:41:00;2022-03-07 08:55:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 09:03:00;2022-03-07 09:17:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 09:21:00;2022-03-07 09:35:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 09:43:00;2022-03-07 09:57:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 10:01:00;2022-03-07 10:15:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 10:23:00;2022-03-07 10:37:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 10:41:00;2022-03-07 10:55:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 11:03:00;2022-03-07 11:17:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 11:21:00;2022-03-07 11:35:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 11:43:00;2022-03-07 11:57:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 12:01:00;2022-03-07 12:15:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 12:23:00;2022-03-07 12:37:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 12:41:00;2022-03-07 12:55:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 13:03:00;2022-03-07 13:17:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 13:21:00;2022-03-07 13:35:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 13:43:00;2022-03-07 13:57:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 14:01:00;2022-03-07 14:15:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 14:23:00;2022-03-07 14:37:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 14:41:00;2022-03-07 14:55:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 15:03:00;2022-03-07 15:17:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 15:21:00;2022-03-07 15:35:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 15:43:00;2022-03-07 15:57:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 16:01:00;2022-03-07 16:15:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 16:23:00;2022-03-07 16:37:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 16:41:00;2022-03-07 16:55:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 17:03:00;2022-03-07 17:17:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 17:21:00;2022-03-07 17:35:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 17:43:00;2022-03-07 17:57:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 18:01:00;2022-03-07 18:15:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 18:23:00;2022-03-07 18:37:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 18:41:00;2022-03-07 18:55:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 19:03:00;2022-03-07 19:17:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 19:21:00;2022-03-07 19:35:00;Station-23;4637;8;8;VDL -LINE_9;Station-23;2022-03-07 19:43:00;2022-03-07 19:57:00;Station-23;4637;4;8;VDL -LINE_9;Station-23;2022-03-07 20:01:00;2022-03-07 20:14:00;Station-23;4637;9;8;VDL -LINE_9;Station-23;2022-03-07 20:23:00;2022-03-07 20:36:00;Station-23;4637;0;8;VDL -LINE_9;Station-23;2022-03-07 20:36:00;2022-03-07 21:15:00;Station-22;19.8;0;8;VDL -LINE_10;Station-0;2022-03-07 04:56:00;2022-03-07 04:56:00;Station-24;0.06;18;9;CKB -LINE_10;Station-24;2022-03-07 05:14:00;2022-03-07 05:20:00;Station-25;3.29;0;9;CKB -LINE_10;Station-25;2022-03-07 05:20:00;2022-03-07 05:24:00;Station-24;2954;20;9;CKB -LINE_10;Station-24;2022-03-07 05:44:00;2022-03-07 05:50:00;Station-25;3.29;0;9;CKB -LINE_10;Station-25;2022-03-07 05:50:00;2022-03-07 05:54:00;Station-24;2954;5;9;CKB -LINE_10;Station-24;2022-03-07 05:59:00;2022-03-07 06:06:00;Station-25;3.29;2;9;CKB -LINE_10;Station-25;2022-03-07 06:08:00;2022-03-07 06:13:00;Station-24;2954;19;9;CKB -LINE_10;Station-24;2022-03-07 06:32:00;2022-03-07 06:39:00;Station-25;3.29;1;9;CKB -LINE_10;Station-25;2022-03-07 06:40:00;2022-03-07 06:45:00;Station-24;2954;7;9;CKB -LINE_10;Station-24;2022-03-07 06:52:00;2022-03-07 06:59:00;Station-25;3.29;1;9;CKB -LINE_10;Station-25;2022-03-07 07:00:00;2022-03-07 07:05:00;Station-24;2954;7;9;CKB -LINE_10;Station-24;2022-03-07 07:12:00;2022-03-07 07:19:00;Station-25;3.29;1;9;CKB -LINE_10;Station-25;2022-03-07 07:20:00;2022-03-07 07:25:00;Station-24;2954;7;9;CKB -LINE_10;Station-24;2022-03-07 07:32:00;2022-03-07 07:39:00;Station-25;3.29;1;9;CKB -LINE_10;Station-25;2022-03-07 07:40:00;2022-03-07 07:45:00;Station-24;2954;295;9;CKB -LINE_10;Station-24;2022-03-07 12:40:00;2022-03-07 12:47:00;Station-25;3.29;2;9;CKB -LINE_10;Station-25;2022-03-07 12:49:00;2022-03-07 12:54:00;Station-24;2954;46;9;CKB -LINE_10;Station-24;2022-03-07 13:40:00;2022-03-07 13:47:00;Station-25;3.29;2;9;CKB -LINE_10;Station-25;2022-03-07 13:49:00;2022-03-07 13:54:00;Station-24;2954;434;9;CKB -LINE_10;Station-24;2022-03-07 21:08:00;2022-03-07 21:08:00;Station-0;0.06;0;9;CKB -LINE_11;Station-0;2022-03-07 07:20:00;2022-03-07 07:20:00;Station-26;0.06;0;10;CKB -LINE_11;Station-26;2022-03-07 07:20:00;2022-03-07 07:50:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 08:00:00;2022-03-07 08:30:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 08:40:00;2022-03-07 09:10:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 09:20:00;2022-03-07 09:50:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 10:00:00;2022-03-07 10:30:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 10:40:00;2022-03-07 11:10:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 11:20:00;2022-03-07 11:50:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 12:00:00;2022-03-07 12:30:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 12:40:00;2022-03-07 13:10:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 13:20:00;2022-03-07 13:50:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 14:00:00;2022-03-07 14:30:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 14:40:00;2022-03-07 15:10:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 15:20:00;2022-03-07 15:50:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 16:00:00;2022-03-07 16:30:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 16:40:00;2022-03-07 17:10:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 17:20:00;2022-03-07 17:50:00;Station-26;9266;10;10;CKB -LINE_11;Station-26;2022-03-07 18:00:00;2022-03-07 18:30:00;Station-26;9266;0;10;CKB -LINE_11;Station-26;2022-03-07 18:30:00;2022-03-07 18:30:00;Station-0;0.06;0;10;CKB -LINE_12;Station-0;2022-03-07 07:10:00;2022-03-07 07:10:00;Station-27;0.06;0;11;CKB -LINE_12;Station-27;2022-03-07 07:10:00;2022-03-07 07:18:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 07:28:00;2022-03-07 07:40:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 07:40:00;2022-03-07 07:48:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 07:58:00;2022-03-07 08:10:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 08:10:00;2022-03-07 08:18:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 08:28:00;2022-03-07 08:40:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 08:40:00;2022-03-07 08:48:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 08:58:00;2022-03-07 09:10:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 09:10:00;2022-03-07 09:18:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 09:28:00;2022-03-07 09:40:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 09:40:00;2022-03-07 09:48:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 09:58:00;2022-03-07 10:10:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 10:10:00;2022-03-07 10:18:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 10:28:00;2022-03-07 10:40:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 10:40:00;2022-03-07 10:48:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 10:58:00;2022-03-07 11:10:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 11:10:00;2022-03-07 11:18:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 11:28:00;2022-03-07 11:40:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 11:40:00;2022-03-07 11:48:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 11:58:00;2022-03-07 12:10:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 12:10:00;2022-03-07 12:18:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 12:28:00;2022-03-07 12:40:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 12:40:00;2022-03-07 12:48:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 12:58:00;2022-03-07 13:10:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 13:10:00;2022-03-07 13:18:00;Station-28;2169;10;11;CKB -LINE_12;Station-28;2022-03-07 13:28:00;2022-03-07 13:40:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 13:40:00;2022-03-07 13:48:00;Station-28;2169;8;11;CKB -LINE_12;Station-28;2022-03-07 13:56:00;2022-03-07 14:10:00;Station-27;2952;0;11;CKB -LINE_12;Station-27;2022-03-07 14:10:00;2022-03-07 14:19:00;Station-28;2169;14;11;CKB -LINE_12;Station-28;2022-03-07 14:33:00;2022-03-07 14:47:00;Station-27;2952;3;11;CKB -LINE_12;Station-27;2022-03-07 14:50:00;2022-03-07 14:59:00;Station-28;2169;14;11;CKB -LINE_12;Station-28;2022-03-07 15:13:00;2022-03-07 15:27:00;Station-27;2952;3;11;CKB -LINE_12;Station-27;2022-03-07 15:30:00;2022-03-07 15:39:00;Station-28;2169;14;11;CKB -LINE_12;Station-28;2022-03-07 15:53:00;2022-03-07 16:07:00;Station-27;2952;3;11;CKB -LINE_12;Station-27;2022-03-07 16:10:00;2022-03-07 16:19:00;Station-28;2169;14;11;CKB -LINE_12;Station-28;2022-03-07 16:33:00;2022-03-07 16:47:00;Station-27;2952;3;11;CKB -LINE_12;Station-27;2022-03-07 16:50:00;2022-03-07 16:59:00;Station-28;2169;14;11;CKB -LINE_12;Station-28;2022-03-07 17:13:00;2022-03-07 17:27:00;Station-27;2952;3;11;CKB -LINE_12;Station-27;2022-03-07 17:30:00;2022-03-07 17:39:00;Station-28;2169;13;11;CKB -LINE_12;Station-28;2022-03-07 17:52:00;2022-03-07 18:05:00;Station-27;2952;5;11;CKB -LINE_12;Station-27;2022-03-07 18:10:00;2022-03-07 18:18:00;Station-28;2169;0;11;CKB -LINE_12;Station-28;2022-03-07 18:18:00;2022-03-07 18:18:00;Station-0;0.06;0;11;CKB -LINE_12;Station-0;2022-03-07 14:13:00;2022-03-07 14:13:00;Station-28;0.06;0;12;CKB -LINE_12;Station-28;2022-03-07 14:13:00;2022-03-07 14:27:00;Station-27;2952;3;12;CKB -LINE_12;Station-27;2022-03-07 14:30:00;2022-03-07 14:39:00;Station-28;2169;14;12;CKB -LINE_12;Station-28;2022-03-07 14:53:00;2022-03-07 15:07:00;Station-27;2952;3;12;CKB -LINE_12;Station-27;2022-03-07 15:10:00;2022-03-07 15:19:00;Station-28;2169;14;12;CKB -LINE_12;Station-28;2022-03-07 15:33:00;2022-03-07 15:47:00;Station-27;2952;3;12;CKB -LINE_12;Station-27;2022-03-07 15:50:00;2022-03-07 15:59:00;Station-28;2169;14;12;CKB -LINE_12;Station-28;2022-03-07 16:13:00;2022-03-07 16:27:00;Station-27;2952;3;12;CKB -LINE_12;Station-27;2022-03-07 16:30:00;2022-03-07 16:39:00;Station-28;2169;14;12;CKB -LINE_12;Station-28;2022-03-07 16:53:00;2022-03-07 17:07:00;Station-27;2952;3;12;CKB -LINE_12;Station-27;2022-03-07 17:10:00;2022-03-07 17:19:00;Station-28;2169;14;12;CKB -LINE_12;Station-28;2022-03-07 17:33:00;2022-03-07 17:47:00;Station-27;2952;3;12;CKB -LINE_12;Station-27;2022-03-07 17:50:00;2022-03-07 17:59:00;Station-28;2169;14;12;CKB -LINE_12;Station-28;2022-03-07 18:13:00;2022-03-07 18:25:00;Station-27;2952;0;12;CKB -LINE_12;Station-27;2022-03-07 18:25:00;2022-03-07 18:25:00;Station-0;0.06;0;12;CKB -LINE_13;Station-0;2022-03-08 00:23:00;2022-03-08 00:23:00;Station-29;0.06;0;13;CKB -LINE_13;Station-29;2022-03-08 00:23:00;2022-03-08 00:30:00;Station-30;2577;9;13;CKB -LINE_14;Station-30;2022-03-08 00:39:00;2022-03-08 00:54:00;Station-31;5937;9;13;CKB -LINE_14;Station-31;2022-03-08 01:03:00;2022-03-08 01:17:00;Station-30;6.19;0;13;CKB -LINE_13;Station-30;2022-03-08 01:17:00;2022-03-08 01:23:00;Station-29;2555;0;13;CKB -LINE_13;Station-29;2022-03-08 01:23:00;2022-03-08 01:30:00;Station-30;2577;9;13;CKB -LINE_14;Station-30;2022-03-08 01:39:00;2022-03-08 01:54:00;Station-31;5937;9;13;CKB -LINE_14;Station-31;2022-03-08 02:03:00;2022-03-08 02:17:00;Station-30;6.19;0;13;CKB -LINE_13;Station-30;2022-03-08 02:17:00;2022-03-08 02:23:00;Station-29;2555;0;13;CKB -LINE_13;Station-29;2022-03-08 02:23:00;2022-03-08 02:30:00;Station-30;2577;9;13;CKB -LINE_14;Station-30;2022-03-08 02:39:00;2022-03-08 02:54:00;Station-31;5937;9;13;CKB -LINE_14;Station-31;2022-03-08 03:03:00;2022-03-08 03:17:00;Station-30;6.19;0;13;CKB -LINE_13;Station-30;2022-03-08 03:17:00;2022-03-08 03:23:00;Station-29;2555;0;13;CKB -LINE_13;Station-29;2022-03-08 03:23:00;2022-03-08 03:30:00;Station-30;2577;9;13;CKB -LINE_14;Station-30;2022-03-08 03:39:00;2022-03-08 03:54:00;Station-31;5937;9;13;CKB -LINE_14;Station-31;2022-03-08 04:03:00;2022-03-08 04:17:00;Station-30;6.19;0;13;CKB -LINE_13;Station-30;2022-03-08 04:17:00;2022-03-08 04:23:00;Station-29;2555;0;13;CKB -LINE_13;Station-29;2022-03-08 04:23:00;2022-03-08 04:23:00;Station-0;0.06;0;13;CKB -LINE_14;Station-0;2022-03-08 00:33:00;2022-03-08 00:33:00;Station-31;0.06;0;14;CKB -LINE_14;Station-31;2022-03-08 00:33:00;2022-03-08 00:47:00;Station-30;6.19;0;14;CKB -LINE_13;Station-30;2022-03-08 00:47:00;2022-03-08 00:53:00;Station-29;2555;0;14;CKB -LINE_13;Station-29;2022-03-08 00:53:00;2022-03-08 01:00:00;Station-30;2577;9;14;CKB -LINE_14;Station-30;2022-03-08 01:09:00;2022-03-08 01:24:00;Station-31;5937;9;14;CKB -LINE_14;Station-31;2022-03-08 01:33:00;2022-03-08 01:47:00;Station-30;6.19;0;14;CKB -LINE_13;Station-30;2022-03-08 01:47:00;2022-03-08 01:53:00;Station-29;2555;0;14;CKB -LINE_13;Station-29;2022-03-08 01:53:00;2022-03-08 02:00:00;Station-30;2577;9;14;CKB -LINE_14;Station-30;2022-03-08 02:09:00;2022-03-08 02:24:00;Station-31;5937;9;14;CKB -LINE_14;Station-31;2022-03-08 02:33:00;2022-03-08 02:47:00;Station-30;6.19;0;14;CKB -LINE_13;Station-30;2022-03-08 02:47:00;2022-03-08 02:53:00;Station-29;2555;0;14;CKB -LINE_13;Station-29;2022-03-08 02:53:00;2022-03-08 03:00:00;Station-30;2577;9;14;CKB -LINE_14;Station-30;2022-03-08 03:09:00;2022-03-08 03:24:00;Station-31;5937;9;14;CKB -LINE_14;Station-31;2022-03-08 03:33:00;2022-03-08 03:47:00;Station-30;6.19;0;14;CKB -LINE_13;Station-30;2022-03-08 03:47:00;2022-03-08 03:53:00;Station-29;2555;0;14;CKB -LINE_13;Station-29;2022-03-08 03:53:00;2022-03-08 04:00:00;Station-30;2577;9;14;CKB -LINE_14;Station-30;2022-03-08 04:09:00;2022-03-08 04:24:00;Station-31;5937;0;14;CKB -LINE_14;Station-31;2022-03-08 04:24:00;2022-03-08 04:24:00;Station-0;0.06;0;14;CKB -LINE_15;Station-0;2022-03-08 00:57:00;2022-03-08 00:57:00;Station-32;0.06;0;15;CKB -LINE_15;Station-32;2022-03-08 00:57:00;2022-03-08 01:06:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 01:06:00;2022-03-08 01:11:00;Station-32;2936;16;15;CKB -LINE_15;Station-32;2022-03-08 01:27:00;2022-03-08 01:36:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 01:36:00;2022-03-08 01:41:00;Station-32;2936;16;15;CKB -LINE_15;Station-32;2022-03-08 01:57:00;2022-03-08 02:06:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 02:06:00;2022-03-08 02:11:00;Station-32;2936;16;15;CKB -LINE_15;Station-32;2022-03-08 02:27:00;2022-03-08 02:36:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 02:36:00;2022-03-08 02:41:00;Station-32;2936;16;15;CKB -LINE_15;Station-32;2022-03-08 02:57:00;2022-03-08 03:06:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 03:06:00;2022-03-08 03:11:00;Station-32;2936;16;15;CKB -LINE_15;Station-32;2022-03-08 03:27:00;2022-03-08 03:36:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 03:36:00;2022-03-08 03:41:00;Station-32;2936;16;15;CKB -LINE_15;Station-32;2022-03-08 03:57:00;2022-03-08 04:06:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 04:06:00;2022-03-08 04:11:00;Station-32;2936;16;15;CKB -LINE_15;Station-32;2022-03-08 04:27:00;2022-03-08 04:36:00;Station-33;4343;0;15;CKB -LINE_15;Station-33;2022-03-08 04:36:00;2022-03-08 04:36:00;Station-0;0.06;0;15;CKB -LINE_16;Station-0;2022-03-08 00:29:00;2022-03-08 00:29:00;Station-34;0.06;0;16;CKB -LINE_16;Station-34;2022-03-08 00:29:00;2022-03-08 00:41:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 00:47:00;2022-03-08 00:57:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 00:59:00;2022-03-08 01:11:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 01:17:00;2022-03-08 01:27:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 01:29:00;2022-03-08 01:41:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 01:47:00;2022-03-08 01:57:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 01:59:00;2022-03-08 02:11:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 02:17:00;2022-03-08 02:27:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 02:29:00;2022-03-08 02:41:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 02:47:00;2022-03-08 02:57:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 02:59:00;2022-03-08 03:11:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 03:17:00;2022-03-08 03:27:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 03:29:00;2022-03-08 03:41:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 03:47:00;2022-03-08 03:57:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 03:59:00;2022-03-08 04:11:00;Station-35;4481;6;16;CKB -LINE_16;Station-35;2022-03-08 04:17:00;2022-03-08 04:27:00;Station-34;4031;2;16;CKB -LINE_16;Station-34;2022-03-08 04:29:00;2022-03-08 04:41:00;Station-35;4481;0;16;CKB -LINE_16;Station-35;2022-03-08 04:41:00;2022-03-08 04:41:00;Station-0;0.06;0;16;CKB -LINE_17;Station-0;2022-03-08 00:30:00;2022-03-08 00:30:00;Station-34;0.06;0;17;CKB -LINE_17;Station-34;2022-03-08 00:30:00;2022-03-08 00:44:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 00:44:00;2022-03-08 00:57:00;Station-34;5302;3;17;CKB -LINE_17;Station-34;2022-03-08 01:00:00;2022-03-08 01:14:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 01:14:00;2022-03-08 01:27:00;Station-34;5302;3;17;CKB -LINE_17;Station-34;2022-03-08 01:30:00;2022-03-08 01:44:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 01:44:00;2022-03-08 01:57:00;Station-34;5302;3;17;CKB -LINE_17;Station-34;2022-03-08 02:00:00;2022-03-08 02:14:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 02:14:00;2022-03-08 02:27:00;Station-34;5302;3;17;CKB -LINE_17;Station-34;2022-03-08 02:30:00;2022-03-08 02:44:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 02:44:00;2022-03-08 02:57:00;Station-34;5302;3;17;CKB -LINE_17;Station-34;2022-03-08 03:00:00;2022-03-08 03:14:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 03:14:00;2022-03-08 03:27:00;Station-34;5302;3;17;CKB -LINE_17;Station-34;2022-03-08 03:30:00;2022-03-08 03:44:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 03:44:00;2022-03-08 03:57:00;Station-34;5302;3;17;CKB -LINE_17;Station-34;2022-03-08 04:00:00;2022-03-08 04:14:00;Station-36;4801;0;17;CKB -LINE_17;Station-36;2022-03-08 04:14:00;2022-03-08 04:27:00;Station-34;5302;0;17;CKB -LINE_17;Station-34;2022-03-08 04:27:00;2022-03-08 04:27:00;Station-0;0.06;0;17;CKB -LINE_18;Station-0;2022-03-08 00:43:00;2022-03-08 00:43:00;Station-37;0.06;0;18;CKB -LINE_18;Station-37;2022-03-08 00:43:00;2022-03-08 01:33:00;Station-37;20434;10;18;CKB -LINE_18;Station-37;2022-03-08 01:43:00;2022-03-08 02:33:00;Station-37;20434;10;18;CKB -LINE_18;Station-37;2022-03-08 02:43:00;2022-03-08 03:33:00;Station-37;20434;10;18;CKB -LINE_18;Station-37;2022-03-08 03:43:00;2022-03-08 04:33:00;Station-37;20434;0;18;CKB -LINE_18;Station-37;2022-03-08 04:33:00;2022-03-08 04:33:00;Station-0;0.06;0;18;CKB -LINE_18;Station-0;2022-03-08 00:13:00;2022-03-08 00:13:00;Station-37;0.06;0;19;CKB -LINE_18;Station-37;2022-03-08 00:13:00;2022-03-08 01:03:00;Station-37;20434;10;19;CKB -LINE_18;Station-37;2022-03-08 01:13:00;2022-03-08 02:03:00;Station-37;20434;10;19;CKB -LINE_18;Station-37;2022-03-08 02:13:00;2022-03-08 03:03:00;Station-37;20434;10;19;CKB -LINE_18;Station-37;2022-03-08 03:13:00;2022-03-08 04:03:00;Station-37;20434;0;19;CKB -LINE_18;Station-37;2022-03-08 04:03:00;2022-03-08 04:03:00;Station-0;0.06;0;19;CKB -LINE_19;Station-0;2022-03-08 00:24:00;2022-03-08 00:24:00;Station-38;0.06;0;20;CKB -LINE_19;Station-38;2022-03-08 00:24:00;2022-03-08 00:48:00;Station-39;11.86;4;20;CKB -LINE_19;Station-39;2022-03-08 00:52:00;2022-03-08 01:14:00;Station-38;11139;10;20;CKB -LINE_19;Station-38;2022-03-08 01:24:00;2022-03-08 01:48:00;Station-39;11.86;4;20;CKB -LINE_19;Station-39;2022-03-08 01:52:00;2022-03-08 02:14:00;Station-38;11139;10;20;CKB -LINE_19;Station-38;2022-03-08 02:24:00;2022-03-08 02:48:00;Station-39;11.86;4;20;CKB -LINE_19;Station-39;2022-03-08 02:52:00;2022-03-08 03:14:00;Station-38;11139;10;20;CKB -LINE_19;Station-38;2022-03-08 03:24:00;2022-03-08 03:48:00;Station-39;11.86;4;20;CKB -LINE_19;Station-39;2022-03-08 03:52:00;2022-03-08 04:14:00;Station-38;11139;0;20;CKB -LINE_19;Station-38;2022-03-08 04:14:00;2022-03-08 04:14:00;Station-0;0.06;0;20;CKB -LINE_19;Station-0;2022-03-08 00:22:00;2022-03-08 00:22:00;Station-39;0.06;0;21;CKB -LINE_19;Station-39;2022-03-08 00:22:00;2022-03-08 00:44:00;Station-38;11139;10;21;CKB -LINE_19;Station-38;2022-03-08 00:54:00;2022-03-08 01:18:00;Station-39;11.86;4;21;CKB -LINE_19;Station-39;2022-03-08 01:22:00;2022-03-08 01:44:00;Station-38;11139;10;21;CKB -LINE_19;Station-38;2022-03-08 01:54:00;2022-03-08 02:18:00;Station-39;11.86;4;21;CKB -LINE_19;Station-39;2022-03-08 02:22:00;2022-03-08 02:44:00;Station-38;11139;10;21;CKB -LINE_19;Station-38;2022-03-08 02:54:00;2022-03-08 03:18:00;Station-39;11.86;4;21;CKB -LINE_19;Station-39;2022-03-08 03:22:00;2022-03-08 03:44:00;Station-38;11139;10;21;CKB -LINE_19;Station-38;2022-03-08 03:54:00;2022-03-08 04:18:00;Station-39;11.86;4;21;CKB -LINE_19;Station-39;2022-03-08 04:22:00;2022-03-08 04:44:00;Station-38;11139;0;21;CKB -LINE_19;Station-38;2022-03-08 04:44:00;2022-03-08 04:44:00;Station-0;0.06;0;21;CKB -LINE_20;Station-0;2022-03-08 00:32:00;2022-03-08 00:32:00;Station-13;0.06;0;22;CKB -LINE_20;Station-13;2022-03-08 00:32:00;2022-03-08 00:44:00;Station-40;4212;3;22;CKB -LINE_20;Station-40;2022-03-08 00:47:00;2022-03-08 01:16:00;Station-41;13048;0;22;CKB -LINE_20;Station-41;2022-03-08 01:16:00;2022-03-08 01:42:00;Station-40;12869;5;22;CKB -LINE_20;Station-40;2022-03-08 01:47:00;2022-03-08 02:16:00;Station-41;13048;0;22;CKB -LINE_20;Station-41;2022-03-08 02:16:00;2022-03-08 02:42:00;Station-40;12869;5;22;CKB -LINE_20;Station-40;2022-03-08 02:47:00;2022-03-08 03:16:00;Station-41;13048;0;22;CKB -LINE_20;Station-41;2022-03-08 03:16:00;2022-03-08 03:42:00;Station-40;12869;5;22;CKB -LINE_20;Station-40;2022-03-08 03:47:00;2022-03-08 04:16:00;Station-41;13048;0;22;CKB -LINE_20;Station-41;2022-03-08 04:16:00;2022-03-08 04:34:00;Station-42;9538;0;22;CKB -LINE_20;Station-42;2022-03-08 04:34:00;2022-03-08 04:34:00;Station-0;0.06;0;22;CKB -LINE_20;Station-0;2022-03-08 00:17:00;2022-03-08 00:17:00;Station-40;0.06;0;23;CKB -LINE_20;Station-40;2022-03-08 00:17:00;2022-03-08 00:46:00;Station-41;13048;0;23;CKB -LINE_20;Station-41;2022-03-08 00:46:00;2022-03-08 01:12:00;Station-40;12869;5;23;CKB -LINE_20;Station-40;2022-03-08 01:17:00;2022-03-08 01:46:00;Station-41;13048;0;23;CKB -LINE_20;Station-41;2022-03-08 01:46:00;2022-03-08 02:12:00;Station-40;12869;5;23;CKB -LINE_20;Station-40;2022-03-08 02:17:00;2022-03-08 02:46:00;Station-41;13048;0;23;CKB -LINE_20;Station-41;2022-03-08 02:46:00;2022-03-08 03:12:00;Station-40;12869;5;23;CKB -LINE_20;Station-40;2022-03-08 03:17:00;2022-03-08 03:46:00;Station-41;13048;0;23;CKB -LINE_20;Station-41;2022-03-08 03:46:00;2022-03-08 04:12:00;Station-40;12869;5;23;CKB -LINE_20;Station-40;2022-03-08 04:17:00;2022-03-08 04:28:00;Station-13;4316;0;23;CKB -LINE_20;Station-13;2022-03-08 04:28:00;2022-03-08 04:28:00;Station-0;0.06;0;23;CKB -LINE_21;Station-0;2022-03-08 00:49:00;2022-03-08 00:49:00;Station-3;0.06;0;24;CKB -LINE_21;Station-3;2022-03-08 00:49:00;2022-03-08 01:04:00;Station-16;10229;0;24;CKB -LINE_21;Station-16;2022-03-08 01:04:00;2022-03-08 01:19:00;Station-3;11801;0;24;CKB -LINE_21;Station-3;2022-03-08 01:19:00;2022-03-08 01:34:00;Station-16;10229;0;24;CKB -LINE_21;Station-16;2022-03-08 01:34:00;2022-03-08 01:49:00;Station-3;11801;0;24;CKB -LINE_21;Station-3;2022-03-08 01:49:00;2022-03-08 02:04:00;Station-16;10229;0;24;CKB -LINE_21;Station-16;2022-03-08 02:04:00;2022-03-08 02:19:00;Station-3;11801;0;24;CKB -LINE_21;Station-3;2022-03-08 02:19:00;2022-03-08 02:34:00;Station-16;10229;0;24;CKB -LINE_21;Station-16;2022-03-08 02:34:00;2022-03-08 02:49:00;Station-3;11801;0;24;CKB -LINE_21;Station-3;2022-03-08 02:49:00;2022-03-08 03:04:00;Station-16;10229;0;24;CKB -LINE_21;Station-16;2022-03-08 03:04:00;2022-03-08 03:19:00;Station-3;11801;0;24;CKB -LINE_21;Station-3;2022-03-08 03:19:00;2022-03-08 03:34:00;Station-16;10229;0;24;CKB -LINE_21;Station-16;2022-03-08 03:34:00;2022-03-08 03:49:00;Station-3;11801;0;24;CKB -LINE_21;Station-3;2022-03-08 03:49:00;2022-03-08 04:04:00;Station-16;10229;0;24;CKB -LINE_21;Station-16;2022-03-08 04:04:00;2022-03-08 04:19:00;Station-3;11801;23;24;CKB -LINE_22;Station-3;2022-03-08 04:42:00;2022-03-08 05:04:00;Station-43;6.81;0;24;CKB -LINE_22;Station-43;2022-03-08 05:04:00;2022-03-08 05:04:00;Station-0;0.06;0;24;CKB -LINE_8;Station-0;2022-03-08 00:32:00;2022-03-08 00:32:00;Station-13;0.06;0;25;CKB -LINE_8;Station-13;2022-03-08 00:32:00;2022-03-08 00:57:00;Station-21;11545;6;25;CKB -LINE_8;Station-21;2022-03-08 01:03:00;2022-03-08 01:46:00;Station-20;20579;1;25;CKB -LINE_8;Station-20;2022-03-08 01:47:00;2022-03-08 02:25:00;Station-21;20641;8;25;CKB -LINE_8;Station-21;2022-03-08 02:33:00;2022-03-08 03:16:00;Station-20;20579;1;25;CKB -LINE_8;Station-20;2022-03-08 03:17:00;2022-03-08 03:55:00;Station-21;20641;8;25;CKB -LINE_8;Station-21;2022-03-08 04:03:00;2022-03-08 04:28:00;Station-13;11499;0;25;CKB -LINE_8;Station-13;2022-03-08 04:28:00;2022-03-08 04:28:00;Station-0;0.06;0;25;CKB -LINE_8;Station-0;2022-03-08 00:33:00;2022-03-08 00:33:00;Station-21;0.06;0;26;CKB -LINE_8;Station-21;2022-03-08 00:33:00;2022-03-08 01:16:00;Station-20;20579;1;26;CKB -LINE_8;Station-20;2022-03-08 01:17:00;2022-03-08 01:55:00;Station-21;20641;8;26;CKB -LINE_8;Station-21;2022-03-08 02:03:00;2022-03-08 02:46:00;Station-20;20579;1;26;CKB -LINE_8;Station-20;2022-03-08 02:47:00;2022-03-08 03:25:00;Station-21;20641;8;26;CKB -LINE_8;Station-21;2022-03-08 03:33:00;2022-03-08 04:16:00;Station-20;20579;1;26;CKB -LINE_8;Station-20;2022-03-08 04:17:00;2022-03-08 04:51:00;Station-44;18752;0;26;CKB -LINE_8;Station-44;2022-03-08 04:51:00;2022-03-08 04:51:00;Station-0;0.06;0;26;CKB -LINE_23;Station-0;2022-03-08 00:34:00;2022-03-08 00:34:00;Station-45;0.06;0;27;CKB -LINE_23;Station-45;2022-03-08 00:34:00;2022-03-08 01:00:00;Station-46;9016;0;27;CKB -LINE_23;Station-46;2022-03-08 01:00:00;2022-03-08 01:27:00;Station-45;10083;7;27;CKB -LINE_23;Station-45;2022-03-08 01:34:00;2022-03-08 02:00:00;Station-46;9016;0;27;CKB -LINE_23;Station-46;2022-03-08 02:00:00;2022-03-08 02:27:00;Station-45;10083;7;27;CKB -LINE_23;Station-45;2022-03-08 02:34:00;2022-03-08 03:00:00;Station-46;9016;0;27;CKB -LINE_23;Station-46;2022-03-08 03:00:00;2022-03-08 03:27:00;Station-45;10083;7;27;CKB -LINE_23;Station-45;2022-03-08 03:34:00;2022-03-08 04:00:00;Station-46;9016;0;27;CKB -LINE_23;Station-46;2022-03-08 04:00:00;2022-03-08 04:27:00;Station-45;10083;0;27;CKB -LINE_23;Station-45;2022-03-08 04:27:00;2022-03-08 04:27:00;Station-0;0.06;0;27;CKB -LINE_23;Station-0;2022-03-08 00:30:00;2022-03-08 00:30:00;Station-46;0.06;0;28;CKB -LINE_23;Station-46;2022-03-08 00:30:00;2022-03-08 00:57:00;Station-45;10083;7;28;CKB -LINE_23;Station-45;2022-03-08 01:04:00;2022-03-08 01:30:00;Station-46;9016;0;28;CKB -LINE_23;Station-46;2022-03-08 01:30:00;2022-03-08 01:57:00;Station-45;10083;7;28;CKB -LINE_23;Station-45;2022-03-08 02:04:00;2022-03-08 02:30:00;Station-46;9016;0;28;CKB -LINE_23;Station-46;2022-03-08 02:30:00;2022-03-08 02:57:00;Station-45;10083;7;28;CKB -LINE_23;Station-45;2022-03-08 03:04:00;2022-03-08 03:30:00;Station-46;9016;0;28;CKB -LINE_23;Station-46;2022-03-08 03:30:00;2022-03-08 03:57:00;Station-45;10083;7;28;CKB -LINE_23;Station-45;2022-03-08 04:04:00;2022-03-08 04:30:00;Station-46;9016;0;28;CKB -LINE_23;Station-46;2022-03-08 04:30:00;2022-03-08 04:57:00;Station-45;10083;0;28;CKB -LINE_23;Station-45;2022-03-08 04:57:00;2022-03-08 04:57:00;Station-0;0.06;0;28;CKB -LINE_24;Station-0;2022-03-08 00:31:00;2022-03-08 00:31:00;Station-21;0.06;0;29;CKB -LINE_24;Station-21;2022-03-08 00:31:00;2022-03-08 00:44:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 00:44:00;2022-03-08 00:56:00;Station-21;5362;5;29;CKB -LINE_24;Station-21;2022-03-08 01:01:00;2022-03-08 01:14:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 01:14:00;2022-03-08 01:26:00;Station-21;5362;5;29;CKB -LINE_24;Station-21;2022-03-08 01:31:00;2022-03-08 01:44:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 01:44:00;2022-03-08 01:56:00;Station-21;5362;5;29;CKB -LINE_24;Station-21;2022-03-08 02:01:00;2022-03-08 02:14:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 02:14:00;2022-03-08 02:26:00;Station-21;5362;5;29;CKB -LINE_24;Station-21;2022-03-08 02:31:00;2022-03-08 02:44:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 02:44:00;2022-03-08 02:56:00;Station-21;5362;5;29;CKB -LINE_24;Station-21;2022-03-08 03:01:00;2022-03-08 03:14:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 03:14:00;2022-03-08 03:26:00;Station-21;5362;5;29;CKB -LINE_24;Station-21;2022-03-08 03:31:00;2022-03-08 03:44:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 03:44:00;2022-03-08 03:56:00;Station-21;5362;5;29;CKB -LINE_24;Station-21;2022-03-08 04:01:00;2022-03-08 04:14:00;Station-47;4872;0;29;CKB -LINE_24;Station-47;2022-03-08 04:14:00;2022-03-08 04:26:00;Station-21;5362;0;29;CKB -LINE_24;Station-21;2022-03-08 04:26:00;2022-03-08 04:26:00;Station-0;0.06;0;29;CKB -LINE_25;Station-0;2022-03-08 00:31:00;2022-03-08 00:31:00;Station-21;0.06;0;30;CKB -LINE_25;Station-21;2022-03-08 00:31:00;2022-03-08 00:45:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 00:47:00;2022-03-08 01:01:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 01:01:00;2022-03-08 01:15:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 01:17:00;2022-03-08 01:31:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 01:31:00;2022-03-08 01:45:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 01:47:00;2022-03-08 02:01:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 02:01:00;2022-03-08 02:15:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 02:17:00;2022-03-08 02:31:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 02:31:00;2022-03-08 02:45:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 02:47:00;2022-03-08 03:01:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 03:01:00;2022-03-08 03:15:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 03:17:00;2022-03-08 03:31:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 03:31:00;2022-03-08 03:45:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 03:47:00;2022-03-08 04:01:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 04:01:00;2022-03-08 04:15:00;Station-48;5225;2;30;CKB -LINE_25;Station-48;2022-03-08 04:17:00;2022-03-08 04:31:00;Station-21;7617;0;30;CKB -LINE_25;Station-21;2022-03-08 04:31:00;2022-03-08 04:31:00;Station-0;0.06;0;30;CKB -LINE_26;Station-0;2022-03-08 00:43:00;2022-03-08 00:43:00;Station-49;0.06;0;31;CKB -LINE_26;Station-49;2022-03-08 00:43:00;2022-03-08 00:53:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 00:53:00;2022-03-08 01:03:00;Station-49;4408;10;31;CKB -LINE_26;Station-49;2022-03-08 01:13:00;2022-03-08 01:23:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 01:23:00;2022-03-08 01:33:00;Station-49;4408;10;31;CKB -LINE_26;Station-49;2022-03-08 01:43:00;2022-03-08 01:53:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 01:53:00;2022-03-08 02:03:00;Station-49;4408;10;31;CKB -LINE_26;Station-49;2022-03-08 02:13:00;2022-03-08 02:23:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 02:23:00;2022-03-08 02:33:00;Station-49;4408;10;31;CKB -LINE_26;Station-49;2022-03-08 02:43:00;2022-03-08 02:53:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 02:53:00;2022-03-08 03:03:00;Station-49;4408;10;31;CKB -LINE_26;Station-49;2022-03-08 03:13:00;2022-03-08 03:23:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 03:23:00;2022-03-08 03:33:00;Station-49;4408;10;31;CKB -LINE_26;Station-49;2022-03-08 03:43:00;2022-03-08 03:53:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 03:53:00;2022-03-08 04:03:00;Station-49;4408;10;31;CKB -LINE_26;Station-49;2022-03-08 04:13:00;2022-03-08 04:23:00;Station-50;4507;0;31;CKB -LINE_26;Station-50;2022-03-08 04:23:00;2022-03-08 04:33:00;Station-49;4408;0;31;CKB -LINE_26;Station-49;2022-03-08 04:33:00;2022-03-08 04:33:00;Station-0;0.06;0;31;CKB -LINE_21;Station-0;2022-03-07 00:49:00;2022-03-07 00:49:00;Station-3;0.06;0;32;CKB -LINE_21;Station-3;2022-03-07 00:49:00;2022-03-07 01:04:00;Station-16;10229;0;32;CKB -LINE_21;Station-16;2022-03-07 01:04:00;2022-03-07 01:19:00;Station-3;11801;0;32;CKB -LINE_21;Station-3;2022-03-07 01:19:00;2022-03-07 01:34:00;Station-16;10229;0;32;CKB -LINE_21;Station-16;2022-03-07 01:34:00;2022-03-07 01:49:00;Station-3;11801;0;32;CKB -LINE_21;Station-3;2022-03-07 01:49:00;2022-03-07 02:04:00;Station-16;10229;0;32;CKB -LINE_21;Station-16;2022-03-07 02:04:00;2022-03-07 02:19:00;Station-3;11801;0;32;CKB -LINE_21;Station-3;2022-03-07 02:19:00;2022-03-07 02:34:00;Station-16;10229;0;32;CKB -LINE_21;Station-16;2022-03-07 02:34:00;2022-03-07 02:49:00;Station-3;11801;0;32;CKB -LINE_21;Station-3;2022-03-07 02:49:00;2022-03-07 03:04:00;Station-16;10229;0;32;CKB -LINE_21;Station-16;2022-03-07 03:04:00;2022-03-07 03:19:00;Station-3;11801;0;32;CKB -LINE_21;Station-3;2022-03-07 03:19:00;2022-03-07 03:34:00;Station-16;10229;0;32;CKB -LINE_21;Station-16;2022-03-07 03:34:00;2022-03-07 03:49:00;Station-3;11801;0;32;CKB -LINE_21;Station-3;2022-03-07 03:49:00;2022-03-07 04:04:00;Station-16;10229;0;32;CKB -LINE_21;Station-16;2022-03-07 04:04:00;2022-03-07 04:19:00;Station-3;11801;23;32;CKB -LINE_22;Station-3;2022-03-07 04:42:00;2022-03-07 05:04:00;Station-43;6.81;0;32;CKB -LINE_22;Station-43;2022-03-07 05:04:00;2022-03-07 05:04:00;Station-0;0.06;0;32;CKB -LINE_13;Station-0;2022-03-07 00:23:00;2022-03-07 00:23:00;Station-29;0.06;0;33;CKB -LINE_13;Station-29;2022-03-07 00:23:00;2022-03-07 00:30:00;Station-30;2577;9;33;CKB -LINE_14;Station-30;2022-03-07 00:39:00;2022-03-07 00:54:00;Station-31;5937;9;33;CKB -LINE_14;Station-31;2022-03-07 01:03:00;2022-03-07 01:17:00;Station-30;6.19;0;33;CKB -LINE_13;Station-30;2022-03-07 01:17:00;2022-03-07 01:23:00;Station-29;2555;0;33;CKB -LINE_13;Station-29;2022-03-07 01:23:00;2022-03-07 01:30:00;Station-30;2577;9;33;CKB -LINE_14;Station-30;2022-03-07 01:39:00;2022-03-07 01:54:00;Station-31;5937;9;33;CKB -LINE_14;Station-31;2022-03-07 02:03:00;2022-03-07 02:17:00;Station-30;6.19;0;33;CKB -LINE_13;Station-30;2022-03-07 02:17:00;2022-03-07 02:23:00;Station-29;2555;0;33;CKB -LINE_13;Station-29;2022-03-07 02:23:00;2022-03-07 02:30:00;Station-30;2577;9;33;CKB -LINE_14;Station-30;2022-03-07 02:39:00;2022-03-07 02:54:00;Station-31;5937;9;33;CKB -LINE_14;Station-31;2022-03-07 03:03:00;2022-03-07 03:17:00;Station-30;6.19;0;33;CKB -LINE_13;Station-30;2022-03-07 03:17:00;2022-03-07 03:23:00;Station-29;2555;0;33;CKB -LINE_13;Station-29;2022-03-07 03:23:00;2022-03-07 03:30:00;Station-30;2577;9;33;CKB -LINE_14;Station-30;2022-03-07 03:39:00;2022-03-07 03:54:00;Station-31;5937;9;33;CKB -LINE_14;Station-31;2022-03-07 04:03:00;2022-03-07 04:17:00;Station-30;6.19;0;33;CKB -LINE_13;Station-30;2022-03-07 04:17:00;2022-03-07 04:23:00;Station-29;2555;0;33;CKB -LINE_13;Station-29;2022-03-07 04:23:00;2022-03-07 04:23:00;Station-0;0.06;0;33;CKB -LINE_14;Station-0;2022-03-07 00:33:00;2022-03-07 00:33:00;Station-31;0.06;0;34;CKB -LINE_14;Station-31;2022-03-07 00:33:00;2022-03-07 00:47:00;Station-30;6.19;0;34;CKB -LINE_13;Station-30;2022-03-07 00:47:00;2022-03-07 00:53:00;Station-29;2555;0;34;CKB -LINE_13;Station-29;2022-03-07 00:53:00;2022-03-07 01:00:00;Station-30;2577;9;34;CKB -LINE_14;Station-30;2022-03-07 01:09:00;2022-03-07 01:24:00;Station-31;5937;9;34;CKB -LINE_14;Station-31;2022-03-07 01:33:00;2022-03-07 01:47:00;Station-30;6.19;0;34;CKB -LINE_13;Station-30;2022-03-07 01:47:00;2022-03-07 01:53:00;Station-29;2555;0;34;CKB -LINE_13;Station-29;2022-03-07 01:53:00;2022-03-07 02:00:00;Station-30;2577;9;34;CKB -LINE_14;Station-30;2022-03-07 02:09:00;2022-03-07 02:24:00;Station-31;5937;9;34;CKB -LINE_14;Station-31;2022-03-07 02:33:00;2022-03-07 02:47:00;Station-30;6.19;0;34;CKB -LINE_13;Station-30;2022-03-07 02:47:00;2022-03-07 02:53:00;Station-29;2555;0;34;CKB -LINE_13;Station-29;2022-03-07 02:53:00;2022-03-07 03:00:00;Station-30;2577;9;34;CKB -LINE_14;Station-30;2022-03-07 03:09:00;2022-03-07 03:24:00;Station-31;5937;9;34;CKB -LINE_14;Station-31;2022-03-07 03:33:00;2022-03-07 03:47:00;Station-30;6.19;0;34;CKB -LINE_13;Station-30;2022-03-07 03:47:00;2022-03-07 03:53:00;Station-29;2555;0;34;CKB -LINE_13;Station-29;2022-03-07 03:53:00;2022-03-07 04:00:00;Station-30;2577;9;34;CKB -LINE_14;Station-30;2022-03-07 04:09:00;2022-03-07 04:24:00;Station-31;5937;0;34;CKB -LINE_14;Station-31;2022-03-07 04:24:00;2022-03-07 04:24:00;Station-0;0.06;0;34;CKB -LINE_15;Station-0;2022-03-07 00:57:00;2022-03-07 00:57:00;Station-32;0.06;0;35;CKB -LINE_15;Station-32;2022-03-07 00:57:00;2022-03-07 01:06:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 01:06:00;2022-03-07 01:11:00;Station-32;2936;16;35;CKB -LINE_15;Station-32;2022-03-07 01:27:00;2022-03-07 01:36:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 01:36:00;2022-03-07 01:41:00;Station-32;2936;16;35;CKB -LINE_15;Station-32;2022-03-07 01:57:00;2022-03-07 02:06:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 02:06:00;2022-03-07 02:11:00;Station-32;2936;16;35;CKB -LINE_15;Station-32;2022-03-07 02:27:00;2022-03-07 02:36:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 02:36:00;2022-03-07 02:41:00;Station-32;2936;16;35;CKB -LINE_15;Station-32;2022-03-07 02:57:00;2022-03-07 03:06:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 03:06:00;2022-03-07 03:11:00;Station-32;2936;16;35;CKB -LINE_15;Station-32;2022-03-07 03:27:00;2022-03-07 03:36:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 03:36:00;2022-03-07 03:41:00;Station-32;2936;16;35;CKB -LINE_15;Station-32;2022-03-07 03:57:00;2022-03-07 04:06:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 04:06:00;2022-03-07 04:11:00;Station-32;2936;16;35;CKB -LINE_15;Station-32;2022-03-07 04:27:00;2022-03-07 04:36:00;Station-33;4343;0;35;CKB -LINE_15;Station-33;2022-03-07 04:36:00;2022-03-07 04:36:00;Station-0;0.06;0;35;CKB -LINE_16;Station-0;2022-03-07 00:29:00;2022-03-07 00:29:00;Station-34;0.06;0;36;CKB -LINE_16;Station-34;2022-03-07 00:29:00;2022-03-07 00:41:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 00:47:00;2022-03-07 00:57:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 00:59:00;2022-03-07 01:11:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 01:17:00;2022-03-07 01:27:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 01:29:00;2022-03-07 01:41:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 01:47:00;2022-03-07 01:57:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 01:59:00;2022-03-07 02:11:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 02:17:00;2022-03-07 02:27:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 02:29:00;2022-03-07 02:41:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 02:47:00;2022-03-07 02:57:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 02:59:00;2022-03-07 03:11:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 03:17:00;2022-03-07 03:27:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 03:29:00;2022-03-07 03:41:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 03:47:00;2022-03-07 03:57:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 03:59:00;2022-03-07 04:11:00;Station-35;4481;6;36;CKB -LINE_16;Station-35;2022-03-07 04:17:00;2022-03-07 04:27:00;Station-34;4031;2;36;CKB -LINE_16;Station-34;2022-03-07 04:29:00;2022-03-07 04:41:00;Station-35;4481;0;36;CKB -LINE_16;Station-35;2022-03-07 04:41:00;2022-03-07 04:41:00;Station-0;0.06;0;36;CKB -LINE_17;Station-0;2022-03-07 00:30:00;2022-03-07 00:30:00;Station-34;0.06;0;37;CKB -LINE_17;Station-34;2022-03-07 00:30:00;2022-03-07 00:44:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 00:44:00;2022-03-07 00:57:00;Station-34;5302;3;37;CKB -LINE_17;Station-34;2022-03-07 01:00:00;2022-03-07 01:14:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 01:14:00;2022-03-07 01:27:00;Station-34;5302;3;37;CKB -LINE_17;Station-34;2022-03-07 01:30:00;2022-03-07 01:44:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 01:44:00;2022-03-07 01:57:00;Station-34;5302;3;37;CKB -LINE_17;Station-34;2022-03-07 02:00:00;2022-03-07 02:14:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 02:14:00;2022-03-07 02:27:00;Station-34;5302;3;37;CKB -LINE_17;Station-34;2022-03-07 02:30:00;2022-03-07 02:44:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 02:44:00;2022-03-07 02:57:00;Station-34;5302;3;37;CKB -LINE_17;Station-34;2022-03-07 03:00:00;2022-03-07 03:14:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 03:14:00;2022-03-07 03:27:00;Station-34;5302;3;37;CKB -LINE_17;Station-34;2022-03-07 03:30:00;2022-03-07 03:44:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 03:44:00;2022-03-07 03:57:00;Station-34;5302;3;37;CKB -LINE_17;Station-34;2022-03-07 04:00:00;2022-03-07 04:14:00;Station-36;4801;0;37;CKB -LINE_17;Station-36;2022-03-07 04:14:00;2022-03-07 04:27:00;Station-34;5302;0;37;CKB -LINE_17;Station-34;2022-03-07 04:27:00;2022-03-07 04:27:00;Station-0;0.06;0;37;CKB -LINE_18;Station-0;2022-03-07 00:43:00;2022-03-07 00:43:00;Station-37;0.06;0;38;CKB -LINE_18;Station-37;2022-03-07 00:43:00;2022-03-07 01:33:00;Station-37;20434;10;38;CKB -LINE_18;Station-37;2022-03-07 01:43:00;2022-03-07 02:33:00;Station-37;20434;10;38;CKB -LINE_18;Station-37;2022-03-07 02:43:00;2022-03-07 03:33:00;Station-37;20434;10;38;CKB -LINE_18;Station-37;2022-03-07 03:43:00;2022-03-07 04:33:00;Station-37;20434;0;38;CKB -LINE_18;Station-37;2022-03-07 04:33:00;2022-03-07 04:33:00;Station-0;0.06;0;38;CKB -LINE_18;Station-0;2022-03-07 00:13:00;2022-03-07 00:13:00;Station-37;0.06;0;39;CKB -LINE_18;Station-37;2022-03-07 00:13:00;2022-03-07 01:03:00;Station-37;20434;10;39;CKB -LINE_18;Station-37;2022-03-07 01:13:00;2022-03-07 02:03:00;Station-37;20434;10;39;CKB -LINE_18;Station-37;2022-03-07 02:13:00;2022-03-07 03:03:00;Station-37;20434;10;39;CKB -LINE_18;Station-37;2022-03-07 03:13:00;2022-03-07 04:03:00;Station-37;20434;0;39;CKB -LINE_18;Station-37;2022-03-07 04:03:00;2022-03-07 04:03:00;Station-0;0.06;0;39;CKB -LINE_19;Station-0;2022-03-07 00:24:00;2022-03-07 00:24:00;Station-38;0.06;0;40;CKB -LINE_19;Station-38;2022-03-07 00:24:00;2022-03-07 00:48:00;Station-39;11.86;4;40;CKB -LINE_19;Station-39;2022-03-07 00:52:00;2022-03-07 01:14:00;Station-38;11139;10;40;CKB -LINE_19;Station-38;2022-03-07 01:24:00;2022-03-07 01:48:00;Station-39;11.86;4;40;CKB -LINE_19;Station-39;2022-03-07 01:52:00;2022-03-07 02:14:00;Station-38;11139;10;40;CKB -LINE_19;Station-38;2022-03-07 02:24:00;2022-03-07 02:48:00;Station-39;11.86;4;40;CKB -LINE_19;Station-39;2022-03-07 02:52:00;2022-03-07 03:14:00;Station-38;11139;10;40;CKB -LINE_19;Station-38;2022-03-07 03:24:00;2022-03-07 03:48:00;Station-39;11.86;4;40;CKB -LINE_19;Station-39;2022-03-07 03:52:00;2022-03-07 04:14:00;Station-38;11139;0;40;CKB -LINE_19;Station-38;2022-03-07 04:14:00;2022-03-07 04:14:00;Station-0;0.06;0;40;CKB -LINE_19;Station-0;2022-03-07 00:22:00;2022-03-07 00:22:00;Station-39;0.06;0;41;CKB -LINE_19;Station-39;2022-03-07 00:22:00;2022-03-07 00:44:00;Station-38;11139;10;41;CKB -LINE_19;Station-38;2022-03-07 00:54:00;2022-03-07 01:18:00;Station-39;11.86;4;41;CKB -LINE_19;Station-39;2022-03-07 01:22:00;2022-03-07 01:44:00;Station-38;11139;10;41;CKB -LINE_19;Station-38;2022-03-07 01:54:00;2022-03-07 02:18:00;Station-39;11.86;4;41;CKB -LINE_19;Station-39;2022-03-07 02:22:00;2022-03-07 02:44:00;Station-38;11139;10;41;CKB -LINE_19;Station-38;2022-03-07 02:54:00;2022-03-07 03:18:00;Station-39;11.86;4;41;CKB -LINE_19;Station-39;2022-03-07 03:22:00;2022-03-07 03:44:00;Station-38;11139;10;41;CKB -LINE_19;Station-38;2022-03-07 03:54:00;2022-03-07 04:18:00;Station-39;11.86;4;41;CKB -LINE_19;Station-39;2022-03-07 04:22:00;2022-03-07 04:44:00;Station-38;11139;0;41;CKB -LINE_19;Station-38;2022-03-07 04:44:00;2022-03-07 04:44:00;Station-0;0.06;0;41;CKB -LINE_0;Station-0;2022-03-13 20:51:00;2022-03-13 20:51:00;Station-1;0.06;0;42;CKB -LINE_0;Station-1;2022-03-13 20:51:00;2022-03-13 21:24:00;Station-2;14519;4;42;CKB -LINE_0;Station-2;2022-03-13 21:28:00;2022-03-13 22:03:00;Station-1;13541;8;42;CKB -LINE_0;Station-1;2022-03-13 22:11:00;2022-03-13 22:44:00;Station-2;14519;4;42;CKB -LINE_0;Station-2;2022-03-13 22:48:00;2022-03-13 23:23:00;Station-1;13541;8;42;CKB -LINE_0;Station-1;2022-03-13 23:31:00;2022-03-14 00:04:00;Station-2;14519;4;42;CKB -LINE_0;Station-2;2022-03-14 00:08:00;2022-03-14 00:39:00;Station-5;12213;0;42;CKB -LINE_1;Station-5;2022-03-14 00:39:00;2022-03-14 00:47:00;Station-3;4.0;2;42;CKB -LINE_1;Station-3;2022-03-14 00:49:00;2022-03-14 01:12:00;Station-4;8.36;6;42;CKB -LINE_1;Station-4;2022-03-14 01:18:00;2022-03-14 01:36:00;Station-3;9067;13;42;CKB -LINE_1;Station-3;2022-03-14 01:49:00;2022-03-14 02:12:00;Station-4;8.36;6;42;CKB -LINE_1;Station-4;2022-03-14 02:18:00;2022-03-14 02:36:00;Station-3;9067;13;42;CKB -LINE_1;Station-3;2022-03-14 02:49:00;2022-03-14 03:12:00;Station-4;8.36;6;42;CKB -LINE_1;Station-4;2022-03-14 03:18:00;2022-03-14 03:36:00;Station-3;9067;13;42;CKB -LINE_1;Station-3;2022-03-14 03:49:00;2022-03-14 04:12:00;Station-4;8.36;0;42;CKB -LINE_1;Station-4;2022-03-14 04:12:00;2022-03-14 04:12:00;Station-0;0.06;0;42;CKB -LINE_0;Station-0;2022-03-13 21:31:00;2022-03-13 21:31:00;Station-1;0.06;0;43;CKB -LINE_0;Station-1;2022-03-13 21:31:00;2022-03-13 22:04:00;Station-2;14519;4;43;CKB -LINE_0;Station-2;2022-03-13 22:08:00;2022-03-13 22:43:00;Station-1;13541;8;43;CKB -LINE_0;Station-1;2022-03-13 22:51:00;2022-03-13 23:24:00;Station-2;14519;4;43;CKB -LINE_0;Station-2;2022-03-13 23:28:00;2022-03-14 00:03:00;Station-1;13541;8;43;CKB -LINE_0;Station-1;2022-03-14 00:11:00;2022-03-14 00:44:00;Station-2;14519;0;43;CKB -LINE_1;Station-2;2022-03-14 00:44:00;2022-03-14 00:54:00;Station-3;4.1;25;43;CKB -LINE_1;Station-3;2022-03-14 01:19:00;2022-03-14 01:42:00;Station-4;8.36;6;43;CKB -LINE_1;Station-4;2022-03-14 01:48:00;2022-03-14 02:06:00;Station-3;9067;13;43;CKB -LINE_1;Station-3;2022-03-14 02:19:00;2022-03-14 02:42:00;Station-4;8.36;6;43;CKB -LINE_1;Station-4;2022-03-14 02:48:00;2022-03-14 03:06:00;Station-3;9067;13;43;CKB -LINE_1;Station-3;2022-03-14 03:19:00;2022-03-14 03:42:00;Station-4;8.36;6;43;CKB -LINE_1;Station-4;2022-03-14 03:48:00;2022-03-14 04:06:00;Station-3;9067;0;43;CKB -LINE_1;Station-3;2022-03-14 04:06:00;2022-03-14 04:06:00;Station-0;0.06;0;43;CKB -LINE_2;Station-0;2022-03-13 21:06:00;2022-03-13 21:06:00;Station-6;0.06;0;44;CKB -LINE_2;Station-6;2022-03-13 21:06:00;2022-03-13 21:34:00;Station-7;13018;19;44;CKB -LINE_2;Station-7;2022-03-13 21:53:00;2022-03-13 22:13:00;Station-8;10332;17;44;CKB -LINE_2;Station-8;2022-03-13 22:30:00;2022-03-13 22:54:00;Station-7;10.48;19;44;CKB -LINE_2;Station-7;2022-03-13 23:13:00;2022-03-13 23:33:00;Station-8;10332;17;44;CKB -LINE_2;Station-8;2022-03-13 23:50:00;2022-03-14 00:14:00;Station-7;10.48;2;44;CKB -LINE_2;Station-7;2022-03-14 00:16:00;2022-03-14 00:23:00;Station-9;3709;5;44;CKB -LINE_3;Station-9;2022-03-14 00:28:00;2022-03-14 00:44:00;Station-10;6404;3;44;CKB -LINE_3;Station-10;2022-03-14 00:47:00;2022-03-14 01:10:00;Station-11;10579;7;44;CKB -LINE_3;Station-11;2022-03-14 01:17:00;2022-03-14 01:44:00;Station-10;12007;3;44;CKB -LINE_3;Station-10;2022-03-14 01:47:00;2022-03-14 02:10:00;Station-11;10579;7;44;CKB -LINE_3;Station-11;2022-03-14 02:17:00;2022-03-14 02:44:00;Station-10;12007;3;44;CKB -LINE_3;Station-10;2022-03-14 02:47:00;2022-03-14 03:10:00;Station-11;10579;7;44;CKB -LINE_3;Station-11;2022-03-14 03:17:00;2022-03-14 03:44:00;Station-10;12007;3;44;CKB -LINE_3;Station-10;2022-03-14 03:47:00;2022-03-14 04:10:00;Station-11;10579;7;44;CKB -LINE_3;Station-11;2022-03-14 04:17:00;2022-03-14 04:44:00;Station-10;12007;0;44;CKB -LINE_3;Station-10;2022-03-14 04:44:00;2022-03-14 04:44:00;Station-0;0.06;0;44;CKB -LINE_2;Station-0;2022-03-13 20:26:00;2022-03-13 20:26:00;Station-6;0.06;0;45;CKB -LINE_2;Station-6;2022-03-13 20:26:00;2022-03-13 20:56:00;Station-12;14097;14;45;CKB -LINE_2;Station-12;2022-03-13 21:10:00;2022-03-13 21:38:00;Station-6;13.19;8;45;CKB -LINE_2;Station-6;2022-03-13 21:46:00;2022-03-13 22:14:00;Station-7;13018;19;45;CKB -LINE_2;Station-7;2022-03-13 22:33:00;2022-03-13 22:53:00;Station-8;10332;17;45;CKB -LINE_2;Station-8;2022-03-13 23:10:00;2022-03-13 23:34:00;Station-7;10.48;19;45;CKB -LINE_2;Station-7;2022-03-13 23:53:00;2022-03-14 00:13:00;Station-8;10332;2;45;CKB -LINE_2;Station-8;2022-03-14 00:15:00;2022-03-14 00:16:00;Station-10;506;1;45;CKB -LINE_3;Station-10;2022-03-14 00:17:00;2022-03-14 00:40:00;Station-11;10579;7;45;CKB -LINE_3;Station-11;2022-03-14 00:47:00;2022-03-14 01:14:00;Station-10;12007;3;45;CKB -LINE_3;Station-10;2022-03-14 01:17:00;2022-03-14 01:40:00;Station-11;10579;7;45;CKB -LINE_3;Station-11;2022-03-14 01:47:00;2022-03-14 02:14:00;Station-10;12007;3;45;CKB -LINE_3;Station-10;2022-03-14 02:17:00;2022-03-14 02:40:00;Station-11;10579;7;45;CKB -LINE_3;Station-11;2022-03-14 02:47:00;2022-03-14 03:14:00;Station-10;12007;3;45;CKB -LINE_3;Station-10;2022-03-14 03:17:00;2022-03-14 03:40:00;Station-11;10579;7;45;CKB -LINE_3;Station-11;2022-03-14 03:47:00;2022-03-14 04:14:00;Station-10;12007;3;45;CKB -LINE_3;Station-10;2022-03-14 04:17:00;2022-03-14 04:40:00;Station-11;10579;3;45;CKB -LINE_4;Station-11;2022-03-14 04:43:00;2022-03-14 04:58:00;Station-13;6161;0;45;CKB -LINE_4;Station-13;2022-03-14 04:58:00;2022-03-14 04:58:00;Station-0;0.06;0;45;CKB -LINE_20;Station-0;2022-03-07 00:32:00;2022-03-07 00:32:00;Station-13;0.06;0;46;CKB -LINE_20;Station-13;2022-03-07 00:32:00;2022-03-07 00:44:00;Station-40;4212;3;46;CKB -LINE_20;Station-40;2022-03-07 00:47:00;2022-03-07 01:16:00;Station-41;13048;0;46;CKB -LINE_20;Station-41;2022-03-07 01:16:00;2022-03-07 01:42:00;Station-40;12869;5;46;CKB -LINE_20;Station-40;2022-03-07 01:47:00;2022-03-07 02:16:00;Station-41;13048;0;46;CKB -LINE_20;Station-41;2022-03-07 02:16:00;2022-03-07 02:42:00;Station-40;12869;5;46;CKB -LINE_20;Station-40;2022-03-07 02:47:00;2022-03-07 03:16:00;Station-41;13048;0;46;CKB -LINE_20;Station-41;2022-03-07 03:16:00;2022-03-07 03:42:00;Station-40;12869;5;46;CKB -LINE_20;Station-40;2022-03-07 03:47:00;2022-03-07 04:16:00;Station-41;13048;0;46;CKB -LINE_20;Station-41;2022-03-07 04:16:00;2022-03-07 04:34:00;Station-42;9538;0;46;CKB -LINE_20;Station-42;2022-03-07 04:34:00;2022-03-07 04:34:00;Station-0;0.06;0;46;CKB -LINE_20;Station-0;2022-03-07 00:17:00;2022-03-07 00:17:00;Station-40;0.06;0;47;CKB -LINE_20;Station-40;2022-03-07 00:17:00;2022-03-07 00:46:00;Station-41;13048;0;47;CKB -LINE_20;Station-41;2022-03-07 00:46:00;2022-03-07 01:12:00;Station-40;12869;5;47;CKB -LINE_20;Station-40;2022-03-07 01:17:00;2022-03-07 01:46:00;Station-41;13048;0;47;CKB -LINE_20;Station-41;2022-03-07 01:46:00;2022-03-07 02:12:00;Station-40;12869;5;47;CKB -LINE_20;Station-40;2022-03-07 02:17:00;2022-03-07 02:46:00;Station-41;13048;0;47;CKB -LINE_20;Station-41;2022-03-07 02:46:00;2022-03-07 03:12:00;Station-40;12869;5;47;CKB -LINE_20;Station-40;2022-03-07 03:17:00;2022-03-07 03:46:00;Station-41;13048;0;47;CKB -LINE_20;Station-41;2022-03-07 03:46:00;2022-03-07 04:12:00;Station-40;12869;5;47;CKB -LINE_20;Station-40;2022-03-07 04:17:00;2022-03-07 04:28:00;Station-13;4316;0;47;CKB -LINE_20;Station-13;2022-03-07 04:28:00;2022-03-07 04:28:00;Station-0;0.06;0;47;CKB -LINE_8;Station-0;2022-03-07 00:32:00;2022-03-07 00:32:00;Station-13;0.06;0;48;CKB -LINE_8;Station-13;2022-03-07 00:32:00;2022-03-07 00:57:00;Station-21;11545;6;48;CKB -LINE_8;Station-21;2022-03-07 01:03:00;2022-03-07 01:46:00;Station-20;20579;1;48;CKB -LINE_8;Station-20;2022-03-07 01:47:00;2022-03-07 02:25:00;Station-21;20641;8;48;CKB -LINE_8;Station-21;2022-03-07 02:33:00;2022-03-07 03:16:00;Station-20;20579;1;48;CKB -LINE_8;Station-20;2022-03-07 03:17:00;2022-03-07 03:55:00;Station-21;20641;8;48;CKB -LINE_8;Station-21;2022-03-07 04:03:00;2022-03-07 04:28:00;Station-13;11499;0;48;CKB -LINE_8;Station-13;2022-03-07 04:28:00;2022-03-07 04:28:00;Station-0;0.06;0;48;CKB -LINE_8;Station-0;2022-03-07 00:33:00;2022-03-07 00:33:00;Station-21;0.06;0;49;CKB -LINE_8;Station-21;2022-03-07 00:33:00;2022-03-07 01:16:00;Station-20;20579;1;49;CKB -LINE_8;Station-20;2022-03-07 01:17:00;2022-03-07 01:55:00;Station-21;20641;8;49;CKB -LINE_8;Station-21;2022-03-07 02:03:00;2022-03-07 02:46:00;Station-20;20579;1;49;CKB -LINE_8;Station-20;2022-03-07 02:47:00;2022-03-07 03:25:00;Station-21;20641;8;49;CKB -LINE_8;Station-21;2022-03-07 03:33:00;2022-03-07 04:16:00;Station-20;20579;1;49;CKB -LINE_8;Station-20;2022-03-07 04:17:00;2022-03-07 04:51:00;Station-44;18752;0;49;CKB -LINE_8;Station-44;2022-03-07 04:51:00;2022-03-07 04:51:00;Station-0;0.06;0;49;CKB -LINE_7;Station-0;2022-03-07 00:08:00;2022-03-07 00:08:00;Station-18;0.06;0;50;CKB -LINE_7;Station-18;2022-03-07 00:08:00;2022-03-07 00:27:00;Station-19;7827;0;50;CKB -LINE_8;Station-19;2022-03-07 00:27:00;2022-03-07 00:48:00;Station-20;11079;0;50;CKB -LINE_8;Station-20;2022-03-07 00:48:00;2022-03-07 01:25:00;Station-21;20641;8;50;CKB -LINE_8;Station-21;2022-03-07 01:33:00;2022-03-07 02:16:00;Station-20;20579;1;50;CKB -LINE_8;Station-20;2022-03-07 02:17:00;2022-03-07 02:55:00;Station-21;20641;8;50;CKB -LINE_8;Station-21;2022-03-07 03:03:00;2022-03-07 03:46:00;Station-20;20579;1;50;CKB -LINE_8;Station-20;2022-03-07 03:47:00;2022-03-07 04:25:00;Station-21;20641;0;50;CKB -LINE_8;Station-21;2022-03-07 04:25:00;2022-03-07 04:25:00;Station-0;0.06;0;50;CKB -LINE_23;Station-0;2022-03-07 00:30:00;2022-03-07 00:30:00;Station-46;0.06;0;51;CKB -LINE_23;Station-46;2022-03-07 00:30:00;2022-03-07 00:57:00;Station-45;10083;7;51;CKB -LINE_23;Station-45;2022-03-07 01:04:00;2022-03-07 01:30:00;Station-46;9016;0;51;CKB -LINE_23;Station-46;2022-03-07 01:30:00;2022-03-07 01:57:00;Station-45;10083;7;51;CKB -LINE_23;Station-45;2022-03-07 02:04:00;2022-03-07 02:30:00;Station-46;9016;0;51;CKB -LINE_23;Station-46;2022-03-07 02:30:00;2022-03-07 02:57:00;Station-45;10083;7;51;CKB -LINE_23;Station-45;2022-03-07 03:04:00;2022-03-07 03:30:00;Station-46;9016;0;51;CKB -LINE_23;Station-46;2022-03-07 03:30:00;2022-03-07 03:57:00;Station-45;10083;7;51;CKB -LINE_23;Station-45;2022-03-07 04:04:00;2022-03-07 04:30:00;Station-46;9016;0;51;CKB -LINE_23;Station-46;2022-03-07 04:30:00;2022-03-07 04:57:00;Station-45;10083;0;51;CKB -LINE_23;Station-45;2022-03-07 04:57:00;2022-03-07 04:57:00;Station-0;0.06;0;51;CKB -LINE_23;Station-0;2022-03-07 00:34:00;2022-03-07 00:34:00;Station-45;0.06;0;52;CKB -LINE_23;Station-45;2022-03-07 00:34:00;2022-03-07 01:00:00;Station-46;9016;0;52;CKB -LINE_23;Station-46;2022-03-07 01:00:00;2022-03-07 01:27:00;Station-45;10083;7;52;CKB -LINE_23;Station-45;2022-03-07 01:34:00;2022-03-07 02:00:00;Station-46;9016;0;52;CKB -LINE_23;Station-46;2022-03-07 02:00:00;2022-03-07 02:27:00;Station-45;10083;7;52;CKB -LINE_23;Station-45;2022-03-07 02:34:00;2022-03-07 03:00:00;Station-46;9016;0;52;CKB -LINE_23;Station-46;2022-03-07 03:00:00;2022-03-07 03:27:00;Station-45;10083;7;52;CKB -LINE_23;Station-45;2022-03-07 03:34:00;2022-03-07 04:00:00;Station-46;9016;0;52;CKB -LINE_23;Station-46;2022-03-07 04:00:00;2022-03-07 04:27:00;Station-45;10083;0;52;CKB -LINE_23;Station-45;2022-03-07 04:27:00;2022-03-07 04:27:00;Station-0;0.06;0;52;CKB -LINE_24;Station-0;2022-03-07 00:31:00;2022-03-07 00:31:00;Station-21;0.06;0;53;CKB -LINE_24;Station-21;2022-03-07 00:31:00;2022-03-07 00:44:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 00:44:00;2022-03-07 00:56:00;Station-21;5362;5;53;CKB -LINE_24;Station-21;2022-03-07 01:01:00;2022-03-07 01:14:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 01:14:00;2022-03-07 01:26:00;Station-21;5362;5;53;CKB -LINE_24;Station-21;2022-03-07 01:31:00;2022-03-07 01:44:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 01:44:00;2022-03-07 01:56:00;Station-21;5362;5;53;CKB -LINE_24;Station-21;2022-03-07 02:01:00;2022-03-07 02:14:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 02:14:00;2022-03-07 02:26:00;Station-21;5362;5;53;CKB -LINE_24;Station-21;2022-03-07 02:31:00;2022-03-07 02:44:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 02:44:00;2022-03-07 02:56:00;Station-21;5362;5;53;CKB -LINE_24;Station-21;2022-03-07 03:01:00;2022-03-07 03:14:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 03:14:00;2022-03-07 03:26:00;Station-21;5362;5;53;CKB -LINE_24;Station-21;2022-03-07 03:31:00;2022-03-07 03:44:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 03:44:00;2022-03-07 03:56:00;Station-21;5362;5;53;CKB -LINE_24;Station-21;2022-03-07 04:01:00;2022-03-07 04:14:00;Station-47;4872;0;53;CKB -LINE_24;Station-47;2022-03-07 04:14:00;2022-03-07 04:26:00;Station-21;5362;0;53;CKB -LINE_24;Station-21;2022-03-07 04:26:00;2022-03-07 04:26:00;Station-0;0.06;0;53;CKB -LINE_25;Station-0;2022-03-07 00:31:00;2022-03-07 00:31:00;Station-21;0.06;0;54;CKB -LINE_25;Station-21;2022-03-07 00:31:00;2022-03-07 00:45:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 00:47:00;2022-03-07 01:01:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 01:01:00;2022-03-07 01:15:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 01:17:00;2022-03-07 01:31:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 01:31:00;2022-03-07 01:45:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 01:47:00;2022-03-07 02:01:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 02:01:00;2022-03-07 02:15:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 02:17:00;2022-03-07 02:31:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 02:31:00;2022-03-07 02:45:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 02:47:00;2022-03-07 03:01:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 03:01:00;2022-03-07 03:15:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 03:17:00;2022-03-07 03:31:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 03:31:00;2022-03-07 03:45:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 03:47:00;2022-03-07 04:01:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 04:01:00;2022-03-07 04:15:00;Station-48;5225;2;54;CKB -LINE_25;Station-48;2022-03-07 04:17:00;2022-03-07 04:31:00;Station-21;7617;0;54;CKB -LINE_25;Station-21;2022-03-07 04:31:00;2022-03-07 04:31:00;Station-0;0.06;0;54;CKB -LINE_26;Station-0;2022-03-07 00:43:00;2022-03-07 00:43:00;Station-49;0.06;0;55;CKB -LINE_26;Station-49;2022-03-07 00:43:00;2022-03-07 00:53:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 00:53:00;2022-03-07 01:03:00;Station-49;4408;10;55;CKB -LINE_26;Station-49;2022-03-07 01:13:00;2022-03-07 01:23:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 01:23:00;2022-03-07 01:33:00;Station-49;4408;10;55;CKB -LINE_26;Station-49;2022-03-07 01:43:00;2022-03-07 01:53:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 01:53:00;2022-03-07 02:03:00;Station-49;4408;10;55;CKB -LINE_26;Station-49;2022-03-07 02:13:00;2022-03-07 02:23:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 02:23:00;2022-03-07 02:33:00;Station-49;4408;10;55;CKB -LINE_26;Station-49;2022-03-07 02:43:00;2022-03-07 02:53:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 02:53:00;2022-03-07 03:03:00;Station-49;4408;10;55;CKB -LINE_26;Station-49;2022-03-07 03:13:00;2022-03-07 03:23:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 03:23:00;2022-03-07 03:33:00;Station-49;4408;10;55;CKB -LINE_26;Station-49;2022-03-07 03:43:00;2022-03-07 03:53:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 03:53:00;2022-03-07 04:03:00;Station-49;4408;10;55;CKB -LINE_26;Station-49;2022-03-07 04:13:00;2022-03-07 04:23:00;Station-50;4507;0;55;CKB -LINE_26;Station-50;2022-03-07 04:23:00;2022-03-07 04:33:00;Station-49;4408;0;55;CKB -LINE_26;Station-49;2022-03-07 04:33:00;2022-03-07 04:33:00;Station-0;0.06;0;55;CKB -LINE_27;Station-0;2022-03-13 15:46:00;2022-03-13 15:46:00;Station-14;0.06;0;56;CKB -LINE_27;Station-14;2022-03-13 15:46:00;2022-03-13 15:53:00;Station-51;3147;12;56;CKB -LINE_27;Station-51;2022-03-13 16:05:00;2022-03-13 16:15:00;Station-14;3469;0;56;CKB -LINE_27;Station-14;2022-03-13 16:15:00;2022-03-13 16:23:00;Station-51;3351;12;56;CKB -LINE_27;Station-51;2022-03-13 16:35:00;2022-03-13 16:45:00;Station-14;3469;0;56;CKB -LINE_27;Station-14;2022-03-13 16:45:00;2022-03-13 16:53:00;Station-51;3351;12;56;CKB -LINE_27;Station-51;2022-03-13 17:05:00;2022-03-13 17:15:00;Station-14;3469;0;56;CKB -LINE_27;Station-14;2022-03-13 17:15:00;2022-03-13 17:23:00;Station-51;3351;12;56;CKB -LINE_27;Station-51;2022-03-13 17:35:00;2022-03-13 17:45:00;Station-14;3469;0;56;CKB -LINE_27;Station-14;2022-03-13 17:45:00;2022-03-13 17:53:00;Station-51;3351;12;56;CKB -LINE_27;Station-51;2022-03-13 18:05:00;2022-03-13 18:15:00;Station-14;3469;0;56;CKB -LINE_27;Station-14;2022-03-13 18:15:00;2022-03-13 18:23:00;Station-51;3351;0;56;CKB -LINE_28;Station-51;2022-03-13 18:23:00;2022-03-13 18:29:00;Station-14;3.1;22;56;CKB -LINE_28;Station-14;2022-03-13 18:51:00;2022-03-13 19:02:00;Station-52;4338;0;56;CKB -LINE_28;Station-52;2022-03-13 19:02:00;2022-03-13 19:13:00;Station-14;4427;12;56;CKB -LINE_5;Station-14;2022-03-13 19:25:00;2022-03-13 19:38:00;Station-15;6086;3;56;CKB -LINE_5;Station-15;2022-03-13 19:41:00;2022-03-13 19:55:00;Station-14;6232;0;56;CKB -LINE_5;Station-14;2022-03-13 19:55:00;2022-03-13 20:08:00;Station-15;6086;3;56;CKB -LINE_5;Station-15;2022-03-13 20:11:00;2022-03-13 20:25:00;Station-14;6232;6;56;CKB -LINE_28;Station-14;2022-03-13 20:31:00;2022-03-13 20:42:00;Station-52;4338;0;56;CKB -LINE_28;Station-52;2022-03-13 20:42:00;2022-03-13 20:53:00;Station-14;4427;18;56;CKB -LINE_28;Station-14;2022-03-13 21:11:00;2022-03-13 21:22:00;Station-52;4338;0;56;CKB -LINE_28;Station-52;2022-03-13 21:22:00;2022-03-13 21:33:00;Station-14;4427;18;56;CKB -LINE_28;Station-14;2022-03-13 21:51:00;2022-03-13 22:02:00;Station-52;4338;0;56;CKB -LINE_28;Station-52;2022-03-13 22:02:00;2022-03-13 22:13:00;Station-14;4427;18;56;CKB -LINE_28;Station-14;2022-03-13 22:31:00;2022-03-13 22:42:00;Station-52;4338;0;56;CKB -LINE_28;Station-52;2022-03-13 22:42:00;2022-03-13 22:53:00;Station-14;4427;2;56;CKB -LINE_5;Station-14;2022-03-13 22:55:00;2022-03-13 23:08:00;Station-15;6086;3;56;CKB -LINE_5;Station-15;2022-03-13 23:11:00;2022-03-13 23:25:00;Station-14;6232;0;56;CKB -LINE_5;Station-14;2022-03-13 23:25:00;2022-03-13 23:38:00;Station-15;6086;3;56;CKB -LINE_5;Station-15;2022-03-13 23:41:00;2022-03-13 23:55:00;Station-14;6232;0;56;CKB -LINE_5;Station-14;2022-03-13 23:55:00;2022-03-14 00:08:00;Station-15;6086;0;56;CKB -LINE_5;Station-15;2022-03-14 00:08:00;2022-03-14 00:08:00;Station-0;0.06;0;56;CKB -LINE_6;Station-0;2022-03-13 07:05:00;2022-03-13 07:05:00;Station-16;0.06;0;57;CKB -LINE_6;Station-16;2022-03-13 07:05:00;2022-03-13 07:14:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 07:14:00;2022-03-13 07:23:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 07:25:00;2022-03-13 07:34:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 07:34:00;2022-03-13 07:43:00;Station-16;5139;22;57;CKB -LINE_6;Station-16;2022-03-13 08:05:00;2022-03-13 08:14:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 08:14:00;2022-03-13 08:23:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 08:25:00;2022-03-13 08:34:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 08:34:00;2022-03-13 08:43:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 08:45:00;2022-03-13 08:54:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 08:54:00;2022-03-13 09:03:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 09:05:00;2022-03-13 09:14:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 09:14:00;2022-03-13 09:23:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 09:25:00;2022-03-13 09:34:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 09:34:00;2022-03-13 09:43:00;Station-16;5139;23;57;CKB -LINE_6;Station-16;2022-03-13 10:06:00;2022-03-13 10:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 10:15:00;2022-03-13 10:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 10:26:00;2022-03-13 10:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 10:35:00;2022-03-13 10:44:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 10:46:00;2022-03-13 10:55:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 10:55:00;2022-03-13 11:04:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 11:06:00;2022-03-13 11:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 11:15:00;2022-03-13 11:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 11:26:00;2022-03-13 11:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 11:35:00;2022-03-13 11:44:00;Station-16;5139;22;57;CKB -LINE_6;Station-16;2022-03-13 12:06:00;2022-03-13 12:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 12:15:00;2022-03-13 12:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 12:26:00;2022-03-13 12:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 12:35:00;2022-03-13 12:44:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 12:46:00;2022-03-13 12:55:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 12:55:00;2022-03-13 13:04:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 13:06:00;2022-03-13 13:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 13:15:00;2022-03-13 13:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 13:26:00;2022-03-13 13:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 13:35:00;2022-03-13 13:44:00;Station-16;5139;22;57;CKB -LINE_6;Station-16;2022-03-13 14:06:00;2022-03-13 14:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 14:15:00;2022-03-13 14:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 14:26:00;2022-03-13 14:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 14:35:00;2022-03-13 14:44:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 14:46:00;2022-03-13 14:55:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 14:55:00;2022-03-13 15:04:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 15:06:00;2022-03-13 15:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 15:15:00;2022-03-13 15:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 15:26:00;2022-03-13 15:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 15:35:00;2022-03-13 15:44:00;Station-16;5139;22;57;CKB -LINE_6;Station-16;2022-03-13 16:06:00;2022-03-13 16:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 16:15:00;2022-03-13 16:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 16:26:00;2022-03-13 16:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 16:35:00;2022-03-13 16:44:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 16:46:00;2022-03-13 16:55:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 16:55:00;2022-03-13 17:04:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 17:06:00;2022-03-13 17:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 17:15:00;2022-03-13 17:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 17:26:00;2022-03-13 17:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 17:35:00;2022-03-13 17:44:00;Station-16;5139;22;57;CKB -LINE_6;Station-16;2022-03-13 18:06:00;2022-03-13 18:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 18:15:00;2022-03-13 18:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 18:26:00;2022-03-13 18:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 18:35:00;2022-03-13 18:44:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 18:46:00;2022-03-13 18:55:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 18:55:00;2022-03-13 19:04:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 19:06:00;2022-03-13 19:15:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 19:15:00;2022-03-13 19:24:00;Station-16;5139;2;57;CKB -LINE_6;Station-16;2022-03-13 19:26:00;2022-03-13 19:35:00;Station-17;4781;0;57;CKB -LINE_6;Station-17;2022-03-13 19:35:00;2022-03-13 19:44:00;Station-16;5139;21;57;CKB -LINE_6;Station-16;2022-03-13 20:05:00;2022-03-13 20:14:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 20:15:00;2022-03-13 20:24:00;Station-16;5139;1;57;CKB -LINE_6;Station-16;2022-03-13 20:25:00;2022-03-13 20:34:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 20:35:00;2022-03-13 20:44:00;Station-16;5139;1;57;CKB -LINE_6;Station-16;2022-03-13 20:45:00;2022-03-13 20:54:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 20:55:00;2022-03-13 21:04:00;Station-16;5139;1;57;CKB -LINE_6;Station-16;2022-03-13 21:05:00;2022-03-13 21:14:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 21:15:00;2022-03-13 21:24:00;Station-16;5139;1;57;CKB -LINE_6;Station-16;2022-03-13 21:25:00;2022-03-13 21:34:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 21:35:00;2022-03-13 21:44:00;Station-16;5139;21;57;CKB -LINE_6;Station-16;2022-03-13 22:05:00;2022-03-13 22:14:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 22:15:00;2022-03-13 22:24:00;Station-16;5139;1;57;CKB -LINE_6;Station-16;2022-03-13 22:25:00;2022-03-13 22:34:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 22:35:00;2022-03-13 22:44:00;Station-16;5139;1;57;CKB -LINE_6;Station-16;2022-03-13 22:45:00;2022-03-13 22:54:00;Station-17;4781;1;57;CKB -LINE_6;Station-17;2022-03-13 22:55:00;2022-03-13 23:04:00;Station-16;5139;0;57;CKB -LINE_6;Station-16;2022-03-13 23:04:00;2022-03-13 23:04:00;Station-0;0.06;0;57;CKB -LINE_29;Station-0;2022-03-13 07:30:00;2022-03-13 07:30:00;Station-53;0.06;0;58;CKB -LINE_29;Station-53;2022-03-13 07:30:00;2022-03-13 07:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 07:39:00;2022-03-13 07:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 07:50:00;2022-03-13 07:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 07:59:00;2022-03-13 08:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 08:10:00;2022-03-13 08:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 08:19:00;2022-03-13 08:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 08:30:00;2022-03-13 08:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 08:39:00;2022-03-13 08:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 08:50:00;2022-03-13 08:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 08:59:00;2022-03-13 09:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 09:10:00;2022-03-13 09:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 09:19:00;2022-03-13 09:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 09:30:00;2022-03-13 09:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 09:39:00;2022-03-13 09:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 09:50:00;2022-03-13 09:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 09:59:00;2022-03-13 10:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 10:10:00;2022-03-13 10:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 10:19:00;2022-03-13 10:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 10:30:00;2022-03-13 10:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 10:39:00;2022-03-13 10:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 10:50:00;2022-03-13 10:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 10:59:00;2022-03-13 11:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 11:10:00;2022-03-13 11:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 11:19:00;2022-03-13 11:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 11:30:00;2022-03-13 11:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 11:39:00;2022-03-13 11:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 11:50:00;2022-03-13 11:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 11:59:00;2022-03-13 12:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 12:10:00;2022-03-13 12:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 12:19:00;2022-03-13 12:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 12:30:00;2022-03-13 12:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 12:39:00;2022-03-13 12:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 12:50:00;2022-03-13 12:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 12:59:00;2022-03-13 13:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 13:10:00;2022-03-13 13:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 13:19:00;2022-03-13 13:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 13:30:00;2022-03-13 13:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 13:39:00;2022-03-13 13:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 13:50:00;2022-03-13 13:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 13:59:00;2022-03-13 14:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 14:10:00;2022-03-13 14:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 14:19:00;2022-03-13 14:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 14:30:00;2022-03-13 14:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 14:39:00;2022-03-13 14:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 14:50:00;2022-03-13 14:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 14:59:00;2022-03-13 15:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 15:10:00;2022-03-13 15:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 15:19:00;2022-03-13 15:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 15:30:00;2022-03-13 15:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 15:39:00;2022-03-13 15:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 15:50:00;2022-03-13 15:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 15:59:00;2022-03-13 16:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 16:10:00;2022-03-13 16:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 16:19:00;2022-03-13 16:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 16:30:00;2022-03-13 16:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 16:39:00;2022-03-13 16:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 16:50:00;2022-03-13 16:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 16:59:00;2022-03-13 17:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 17:10:00;2022-03-13 17:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 17:19:00;2022-03-13 17:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 17:30:00;2022-03-13 17:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 17:39:00;2022-03-13 17:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 17:50:00;2022-03-13 17:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 17:59:00;2022-03-13 18:10:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 18:10:00;2022-03-13 18:15:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 18:19:00;2022-03-13 18:30:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 18:30:00;2022-03-13 18:35:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 18:39:00;2022-03-13 18:50:00;Station-53;4341;0;58;CKB -LINE_29;Station-53;2022-03-13 18:50:00;2022-03-13 18:55:00;Station-54;2217;4;58;CKB -LINE_29;Station-54;2022-03-13 18:59:00;2022-03-13 19:10:00;Station-53;4288;0;58;CKB -LINE_29;Station-53;2022-03-13 19:10:00;2022-03-13 19:10:00;Station-0;0.06;0;58;CKB -LINE_10;Station-0;2022-03-13 07:56:00;2022-03-13 07:56:00;Station-24;0.06;0;59;CKB -LINE_10;Station-24;2022-03-13 07:56:00;2022-03-13 07:56:00;Station-24;0.0;792;59;CKB -LINE_10;Station-24;2022-03-13 21:08:00;2022-03-13 21:08:00;Station-24;0.0;0;59;CKB -LINE_10;Station-24;2022-03-13 21:08:00;2022-03-13 21:08:00;Station-0;0.06;0;59;CKB -LINE_30;Station-0;2022-03-13 07:18:00;2022-03-13 07:18:00;Station-55;0.06;0;60;CKB -LINE_30;Station-55;2022-03-13 07:18:00;2022-03-13 07:26:00;Station-56;5562;10;60;CKB -LINE_30;Station-56;2022-03-13 07:36:00;2022-03-13 07:45:00;Station-57;5941;32;60;CKB -LINE_30;Station-57;2022-03-13 08:17:00;2022-03-13 08:26:00;Station-56;5994;10;60;CKB -LINE_30;Station-56;2022-03-13 08:36:00;2022-03-13 08:45:00;Station-57;5941;32;60;CKB -LINE_30;Station-57;2022-03-13 09:17:00;2022-03-13 09:26:00;Station-56;5994;8;60;CKB -LINE_30;Station-56;2022-03-13 09:34:00;2022-03-13 09:43:00;Station-57;5941;36;60;CKB -LINE_30;Station-57;2022-03-13 10:19:00;2022-03-13 10:30:00;Station-56;5994;2;60;CKB -LINE_30;Station-56;2022-03-13 10:32:00;2022-03-13 10:41:00;Station-55;5566;0;60;CKB -LINE_30;Station-55;2022-03-13 10:41:00;2022-03-13 10:41:00;Station-0;0.06;0;60;CKB -LINE_0;Station-0;2022-03-08 21:31:00;2022-03-08 21:31:00;Station-1;0.06;0;61;CKB -LINE_0;Station-1;2022-03-08 21:31:00;2022-03-08 22:04:00;Station-2;14519;4;61;CKB -LINE_0;Station-2;2022-03-08 22:08:00;2022-03-08 22:43:00;Station-1;13541;8;61;CKB -LINE_0;Station-1;2022-03-08 22:51:00;2022-03-08 23:24:00;Station-2;14519;4;61;CKB -LINE_0;Station-2;2022-03-08 23:28:00;2022-03-09 00:03:00;Station-1;13541;8;61;CKB -LINE_0;Station-1;2022-03-09 00:11:00;2022-03-09 00:44:00;Station-2;14519;0;61;CKB -LINE_1;Station-2;2022-03-09 00:44:00;2022-03-09 00:54:00;Station-3;4.1;25;61;CKB -LINE_1;Station-3;2022-03-09 01:19:00;2022-03-09 01:42:00;Station-4;8.36;6;61;CKB -LINE_1;Station-4;2022-03-09 01:48:00;2022-03-09 02:06:00;Station-3;9067;13;61;CKB -LINE_1;Station-3;2022-03-09 02:19:00;2022-03-09 02:42:00;Station-4;8.36;6;61;CKB -LINE_1;Station-4;2022-03-09 02:48:00;2022-03-09 03:06:00;Station-3;9067;13;61;CKB -LINE_1;Station-3;2022-03-09 03:19:00;2022-03-09 03:42:00;Station-4;8.36;6;61;CKB -LINE_1;Station-4;2022-03-09 03:48:00;2022-03-09 04:06:00;Station-3;9067;0;61;CKB -LINE_1;Station-3;2022-03-09 04:06:00;2022-03-09 04:06:00;Station-0;0.06;0;61;CKB -LINE_0;Station-0;2022-03-08 22:11:00;2022-03-08 22:11:00;Station-1;0.06;0;62;CKB -LINE_0;Station-1;2022-03-08 22:11:00;2022-03-08 22:44:00;Station-2;14519;4;62;CKB -LINE_0;Station-2;2022-03-08 22:48:00;2022-03-08 23:23:00;Station-1;13541;8;62;CKB -LINE_0;Station-1;2022-03-08 23:31:00;2022-03-09 00:04:00;Station-2;14519;4;62;CKB -LINE_0;Station-2;2022-03-09 00:08:00;2022-03-09 00:39:00;Station-5;12213;0;62;CKB -LINE_1;Station-5;2022-03-09 00:39:00;2022-03-09 00:47:00;Station-3;4.0;2;62;CKB -LINE_1;Station-3;2022-03-09 00:49:00;2022-03-09 01:12:00;Station-4;8.36;6;62;CKB -LINE_1;Station-4;2022-03-09 01:18:00;2022-03-09 01:36:00;Station-3;9067;13;62;CKB -LINE_1;Station-3;2022-03-09 01:49:00;2022-03-09 02:12:00;Station-4;8.36;6;62;CKB -LINE_1;Station-4;2022-03-09 02:18:00;2022-03-09 02:36:00;Station-3;9067;13;62;CKB -LINE_1;Station-3;2022-03-09 02:49:00;2022-03-09 03:12:00;Station-4;8.36;6;62;CKB -LINE_1;Station-4;2022-03-09 03:18:00;2022-03-09 03:36:00;Station-3;9067;13;62;CKB -LINE_1;Station-3;2022-03-09 03:49:00;2022-03-09 04:12:00;Station-4;8.36;0;62;CKB -LINE_1;Station-4;2022-03-09 04:12:00;2022-03-09 04:12:00;Station-0;0.06;0;62;CKB -LINE_2;Station-0;2022-03-08 21:06:00;2022-03-08 21:06:00;Station-6;0.06;0;63;CKB -LINE_2;Station-6;2022-03-08 21:06:00;2022-03-08 21:34:00;Station-7;13018;19;63;CKB -LINE_2;Station-7;2022-03-08 21:53:00;2022-03-08 22:13:00;Station-8;10332;17;63;CKB -LINE_2;Station-8;2022-03-08 22:30:00;2022-03-08 22:54:00;Station-7;10.48;19;63;CKB -LINE_2;Station-7;2022-03-08 23:13:00;2022-03-08 23:33:00;Station-8;10332;17;63;CKB -LINE_2;Station-8;2022-03-08 23:50:00;2022-03-09 00:14:00;Station-7;10.48;2;63;CKB -LINE_2;Station-7;2022-03-09 00:16:00;2022-03-09 00:23:00;Station-9;3709;5;63;CKB -LINE_3;Station-9;2022-03-09 00:28:00;2022-03-09 00:44:00;Station-10;6404;3;63;CKB -LINE_3;Station-10;2022-03-09 00:47:00;2022-03-09 01:10:00;Station-11;10579;7;63;CKB -LINE_3;Station-11;2022-03-09 01:17:00;2022-03-09 01:44:00;Station-10;12007;3;63;CKB -LINE_3;Station-10;2022-03-09 01:47:00;2022-03-09 02:10:00;Station-11;10579;7;63;CKB -LINE_3;Station-11;2022-03-09 02:17:00;2022-03-09 02:44:00;Station-10;12007;3;63;CKB -LINE_3;Station-10;2022-03-09 02:47:00;2022-03-09 03:10:00;Station-11;10579;7;63;CKB -LINE_3;Station-11;2022-03-09 03:17:00;2022-03-09 03:44:00;Station-10;12007;3;63;CKB -LINE_3;Station-10;2022-03-09 03:47:00;2022-03-09 04:10:00;Station-11;10579;7;63;CKB -LINE_3;Station-11;2022-03-09 04:17:00;2022-03-09 04:44:00;Station-10;12007;0;63;CKB -LINE_3;Station-10;2022-03-09 04:44:00;2022-03-09 04:44:00;Station-0;0.06;0;63;CKB -LINE_2;Station-0;2022-03-08 20:26:00;2022-03-08 20:26:00;Station-6;0.06;0;64;CKB -LINE_2;Station-6;2022-03-08 20:26:00;2022-03-08 20:56:00;Station-12;14097;14;64;CKB -LINE_2;Station-12;2022-03-08 21:10:00;2022-03-08 21:38:00;Station-6;13.19;8;64;CKB -LINE_2;Station-6;2022-03-08 21:46:00;2022-03-08 22:14:00;Station-7;13018;19;64;CKB -LINE_2;Station-7;2022-03-08 22:33:00;2022-03-08 22:53:00;Station-8;10332;17;64;CKB -LINE_2;Station-8;2022-03-08 23:10:00;2022-03-08 23:34:00;Station-7;10.48;19;64;CKB -LINE_2;Station-7;2022-03-08 23:53:00;2022-03-09 00:13:00;Station-8;10332;2;64;CKB -LINE_2;Station-8;2022-03-09 00:15:00;2022-03-09 00:16:00;Station-10;506;1;64;CKB -LINE_3;Station-10;2022-03-09 00:17:00;2022-03-09 00:40:00;Station-11;10579;7;64;CKB -LINE_3;Station-11;2022-03-09 00:47:00;2022-03-09 01:14:00;Station-10;12007;3;64;CKB -LINE_3;Station-10;2022-03-09 01:17:00;2022-03-09 01:40:00;Station-11;10579;7;64;CKB -LINE_3;Station-11;2022-03-09 01:47:00;2022-03-09 02:14:00;Station-10;12007;3;64;CKB -LINE_3;Station-10;2022-03-09 02:17:00;2022-03-09 02:40:00;Station-11;10579;7;64;CKB -LINE_3;Station-11;2022-03-09 02:47:00;2022-03-09 03:14:00;Station-10;12007;3;64;CKB -LINE_3;Station-10;2022-03-09 03:17:00;2022-03-09 03:40:00;Station-11;10579;7;64;CKB -LINE_3;Station-11;2022-03-09 03:47:00;2022-03-09 04:14:00;Station-10;12007;3;64;CKB -LINE_3;Station-10;2022-03-09 04:17:00;2022-03-09 04:40:00;Station-11;10579;3;64;CKB -LINE_4;Station-11;2022-03-09 04:43:00;2022-03-09 04:58:00;Station-13;6161;0;64;CKB -LINE_4;Station-13;2022-03-09 04:58:00;2022-03-09 04:58:00;Station-0;0.06;0;64;CKB -LINE_5;Station-0;2022-03-08 22:56:00;2022-03-08 22:56:00;Station-14;0.06;0;65;CKB -LINE_5;Station-14;2022-03-08 22:56:00;2022-03-08 23:08:00;Station-15;5882;3;65;CKB -LINE_5;Station-15;2022-03-08 23:11:00;2022-03-08 23:25:00;Station-14;6232;0;65;CKB -LINE_5;Station-14;2022-03-08 23:25:00;2022-03-08 23:38:00;Station-15;6086;3;65;CKB -LINE_5;Station-15;2022-03-08 23:41:00;2022-03-08 23:55:00;Station-14;6232;0;65;CKB -LINE_5;Station-14;2022-03-08 23:55:00;2022-03-09 00:08:00;Station-15;6086;0;65;CKB -LINE_5;Station-15;2022-03-09 00:08:00;2022-03-09 00:08:00;Station-0;0.06;0;65;CKB -LINE_6;Station-0;2022-03-08 05:05:00;2022-03-08 05:05:00;Station-16;0.06;0;66;CKB -LINE_6;Station-16;2022-03-08 05:05:00;2022-03-08 05:14:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 05:14:00;2022-03-08 05:23:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 05:25:00;2022-03-08 05:34:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 05:34:00;2022-03-08 05:43:00;Station-16;5139;23;66;CKB -LINE_6;Station-16;2022-03-08 06:06:00;2022-03-08 06:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 06:15:00;2022-03-08 06:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 06:26:00;2022-03-08 06:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 06:35:00;2022-03-08 06:44:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 06:46:00;2022-03-08 06:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 06:55:00;2022-03-08 07:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 07:06:00;2022-03-08 07:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 07:15:00;2022-03-08 07:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 07:26:00;2022-03-08 07:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 07:35:00;2022-03-08 07:44:00;Station-16;5139;22;66;CKB -LINE_6;Station-16;2022-03-08 08:06:00;2022-03-08 08:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 08:15:00;2022-03-08 08:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 08:26:00;2022-03-08 08:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 08:35:00;2022-03-08 08:44:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 08:46:00;2022-03-08 08:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 08:55:00;2022-03-08 09:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 09:06:00;2022-03-08 09:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 09:15:00;2022-03-08 09:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 09:26:00;2022-03-08 09:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 09:35:00;2022-03-08 09:44:00;Station-16;5139;22;66;CKB -LINE_6;Station-16;2022-03-08 10:06:00;2022-03-08 10:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 10:15:00;2022-03-08 10:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 10:26:00;2022-03-08 10:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 10:35:00;2022-03-08 10:44:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 10:46:00;2022-03-08 10:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 10:55:00;2022-03-08 11:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 11:06:00;2022-03-08 11:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 11:15:00;2022-03-08 11:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 11:26:00;2022-03-08 11:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 11:35:00;2022-03-08 11:44:00;Station-16;5139;22;66;CKB -LINE_6;Station-16;2022-03-08 12:06:00;2022-03-08 12:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 12:15:00;2022-03-08 12:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 12:26:00;2022-03-08 12:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 12:35:00;2022-03-08 12:44:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 12:46:00;2022-03-08 12:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 12:55:00;2022-03-08 13:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 13:06:00;2022-03-08 13:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 13:15:00;2022-03-08 13:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 13:26:00;2022-03-08 13:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 13:35:00;2022-03-08 13:44:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 13:46:00;2022-03-08 13:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 13:55:00;2022-03-08 14:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 14:06:00;2022-03-08 14:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 14:15:00;2022-03-08 14:24:00;Station-16;5139;22;66;CKB -LINE_6;Station-16;2022-03-08 14:46:00;2022-03-08 14:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 14:55:00;2022-03-08 15:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 15:06:00;2022-03-08 15:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 15:15:00;2022-03-08 15:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 15:26:00;2022-03-08 15:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 15:35:00;2022-03-08 15:44:00;Station-16;5139;22;66;CKB -LINE_6;Station-16;2022-03-08 16:06:00;2022-03-08 16:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 16:15:00;2022-03-08 16:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 16:26:00;2022-03-08 16:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 16:35:00;2022-03-08 16:44:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 16:46:00;2022-03-08 16:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 16:55:00;2022-03-08 17:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 17:06:00;2022-03-08 17:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 17:15:00;2022-03-08 17:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 17:26:00;2022-03-08 17:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 17:35:00;2022-03-08 17:44:00;Station-16;5139;22;66;CKB -LINE_6;Station-16;2022-03-08 18:06:00;2022-03-08 18:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 18:15:00;2022-03-08 18:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 18:26:00;2022-03-08 18:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 18:35:00;2022-03-08 18:44:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 18:46:00;2022-03-08 18:55:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 18:55:00;2022-03-08 19:04:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 19:06:00;2022-03-08 19:15:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 19:15:00;2022-03-08 19:24:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 19:26:00;2022-03-08 19:35:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 19:35:00;2022-03-08 19:44:00;Station-16;5139;21;66;CKB -LINE_6;Station-16;2022-03-08 20:05:00;2022-03-08 20:14:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 20:14:00;2022-03-08 20:23:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 20:25:00;2022-03-08 20:34:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 20:34:00;2022-03-08 20:43:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 20:45:00;2022-03-08 20:54:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 20:54:00;2022-03-08 21:03:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 21:05:00;2022-03-08 21:14:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 21:14:00;2022-03-08 21:23:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 21:25:00;2022-03-08 21:34:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 21:34:00;2022-03-08 21:43:00;Station-16;5139;22;66;CKB -LINE_6;Station-16;2022-03-08 22:05:00;2022-03-08 22:14:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 22:14:00;2022-03-08 22:23:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 22:25:00;2022-03-08 22:34:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 22:34:00;2022-03-08 22:43:00;Station-16;5139;2;66;CKB -LINE_6;Station-16;2022-03-08 22:45:00;2022-03-08 22:54:00;Station-17;4781;0;66;CKB -LINE_6;Station-17;2022-03-08 22:54:00;2022-03-08 23:03:00;Station-16;5139;0;66;CKB -LINE_6;Station-16;2022-03-08 23:03:00;2022-03-08 23:03:00;Station-0;0.06;0;66;CKB -LINE_7;Station-0;2022-03-09 00:06:00;2022-03-09 00:06:00;Station-18;0.06;0;67;CKB -LINE_7;Station-18;2022-03-09 00:06:00;2022-03-09 00:27:00;Station-19;7827;0;67;CKB -LINE_8;Station-19;2022-03-09 00:27:00;2022-03-09 00:48:00;Station-20;11079;0;67;CKB -LINE_8;Station-20;2022-03-09 00:48:00;2022-03-09 01:25:00;Station-21;20641;8;67;CKB -LINE_8;Station-21;2022-03-09 01:33:00;2022-03-09 02:16:00;Station-20;20579;1;67;CKB -LINE_8;Station-20;2022-03-09 02:17:00;2022-03-09 02:55:00;Station-21;20641;8;67;CKB -LINE_8;Station-21;2022-03-09 03:03:00;2022-03-09 03:46:00;Station-20;20579;1;67;CKB -LINE_8;Station-20;2022-03-09 03:47:00;2022-03-09 04:25:00;Station-21;20641;0;67;CKB -LINE_8;Station-21;2022-03-09 04:25:00;2022-03-09 04:25:00;Station-0;0.06;0;67;CKB -LINE_9;Station-22;2022-03-08 05:15:00;2022-03-08 06:01:00;Station-23;17.9;0;68;VDL -LINE_9;Station-23;2022-03-08 06:01:00;2022-03-08 06:15:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 06:23:00;2022-03-08 06:37:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 06:41:00;2022-03-08 06:55:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 07:03:00;2022-03-08 07:17:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 07:21:00;2022-03-08 07:35:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 07:43:00;2022-03-08 07:57:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 08:01:00;2022-03-08 08:15:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 08:23:00;2022-03-08 08:37:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 08:41:00;2022-03-08 08:55:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 09:03:00;2022-03-08 09:17:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 09:21:00;2022-03-08 09:35:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 09:43:00;2022-03-08 09:57:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 10:01:00;2022-03-08 10:15:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 10:23:00;2022-03-08 10:37:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 10:41:00;2022-03-08 10:55:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 11:03:00;2022-03-08 11:17:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 11:21:00;2022-03-08 11:35:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 11:43:00;2022-03-08 11:57:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 12:01:00;2022-03-08 12:15:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 12:23:00;2022-03-08 12:37:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 12:41:00;2022-03-08 12:55:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 13:03:00;2022-03-08 13:17:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 13:21:00;2022-03-08 13:35:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 13:43:00;2022-03-08 13:57:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 14:01:00;2022-03-08 14:15:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 14:23:00;2022-03-08 14:37:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 14:41:00;2022-03-08 14:55:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 15:03:00;2022-03-08 15:17:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 15:21:00;2022-03-08 15:35:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 15:43:00;2022-03-08 15:57:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 16:01:00;2022-03-08 16:15:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 16:23:00;2022-03-08 16:37:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 16:41:00;2022-03-08 16:55:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 17:03:00;2022-03-08 17:17:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 17:21:00;2022-03-08 17:35:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 17:43:00;2022-03-08 17:57:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 18:01:00;2022-03-08 18:15:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 18:23:00;2022-03-08 18:37:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 18:41:00;2022-03-08 18:55:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 19:03:00;2022-03-08 19:17:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 19:21:00;2022-03-08 19:35:00;Station-23;4637;8;68;VDL -LINE_9;Station-23;2022-03-08 19:43:00;2022-03-08 19:57:00;Station-23;4637;4;68;VDL -LINE_9;Station-23;2022-03-08 20:01:00;2022-03-08 20:14:00;Station-23;4637;9;68;VDL -LINE_9;Station-23;2022-03-08 20:23:00;2022-03-08 20:36:00;Station-23;4637;0;68;VDL -LINE_9;Station-23;2022-03-08 20:36:00;2022-03-08 21:15:00;Station-22;19.8;0;68;VDL -LINE_10;Station-0;2022-03-08 04:56:00;2022-03-08 04:56:00;Station-24;0.06;18;69;CKB -LINE_10;Station-24;2022-03-08 05:14:00;2022-03-08 05:20:00;Station-25;3.29;0;69;CKB -LINE_10;Station-25;2022-03-08 05:20:00;2022-03-08 05:24:00;Station-24;2954;20;69;CKB -LINE_10;Station-24;2022-03-08 05:44:00;2022-03-08 05:50:00;Station-25;3.29;0;69;CKB -LINE_10;Station-25;2022-03-08 05:50:00;2022-03-08 05:54:00;Station-24;2954;5;69;CKB -LINE_10;Station-24;2022-03-08 05:59:00;2022-03-08 06:06:00;Station-25;3.29;2;69;CKB -LINE_10;Station-25;2022-03-08 06:08:00;2022-03-08 06:13:00;Station-24;2954;19;69;CKB -LINE_10;Station-24;2022-03-08 06:32:00;2022-03-08 06:39:00;Station-25;3.29;1;69;CKB -LINE_10;Station-25;2022-03-08 06:40:00;2022-03-08 06:45:00;Station-24;2954;7;69;CKB -LINE_10;Station-24;2022-03-08 06:52:00;2022-03-08 06:59:00;Station-25;3.29;1;69;CKB -LINE_10;Station-25;2022-03-08 07:00:00;2022-03-08 07:05:00;Station-24;2954;7;69;CKB -LINE_10;Station-24;2022-03-08 07:12:00;2022-03-08 07:19:00;Station-25;3.29;1;69;CKB -LINE_10;Station-25;2022-03-08 07:20:00;2022-03-08 07:25:00;Station-24;2954;7;69;CKB -LINE_10;Station-24;2022-03-08 07:32:00;2022-03-08 07:39:00;Station-25;3.29;1;69;CKB -LINE_10;Station-25;2022-03-08 07:40:00;2022-03-08 07:45:00;Station-24;2954;295;69;CKB -LINE_10;Station-24;2022-03-08 12:40:00;2022-03-08 12:47:00;Station-25;3.29;2;69;CKB -LINE_10;Station-25;2022-03-08 12:49:00;2022-03-08 12:54:00;Station-24;2954;46;69;CKB -LINE_10;Station-24;2022-03-08 13:40:00;2022-03-08 13:47:00;Station-25;3.29;2;69;CKB -LINE_10;Station-25;2022-03-08 13:49:00;2022-03-08 13:54:00;Station-24;2954;434;69;CKB -LINE_10;Station-24;2022-03-08 21:08:00;2022-03-08 21:08:00;Station-0;0.06;0;69;CKB -LINE_11;Station-0;2022-03-08 07:20:00;2022-03-08 07:20:00;Station-26;0.06;0;70;CKB -LINE_11;Station-26;2022-03-08 07:20:00;2022-03-08 07:50:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 08:00:00;2022-03-08 08:30:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 08:40:00;2022-03-08 09:10:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 09:20:00;2022-03-08 09:50:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 10:00:00;2022-03-08 10:30:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 10:40:00;2022-03-08 11:10:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 11:20:00;2022-03-08 11:50:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 12:00:00;2022-03-08 12:30:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 12:40:00;2022-03-08 13:10:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 13:20:00;2022-03-08 13:50:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 14:00:00;2022-03-08 14:30:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 14:40:00;2022-03-08 15:10:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 15:20:00;2022-03-08 15:50:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 16:00:00;2022-03-08 16:30:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 16:40:00;2022-03-08 17:10:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 17:20:00;2022-03-08 17:50:00;Station-26;9266;10;70;CKB -LINE_11;Station-26;2022-03-08 18:00:00;2022-03-08 18:30:00;Station-26;9266;0;70;CKB -LINE_11;Station-26;2022-03-08 18:30:00;2022-03-08 18:30:00;Station-0;0.06;0;70;CKB -LINE_12;Station-0;2022-03-08 07:10:00;2022-03-08 07:10:00;Station-27;0.06;0;71;CKB -LINE_12;Station-27;2022-03-08 07:10:00;2022-03-08 07:18:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 07:28:00;2022-03-08 07:40:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 07:40:00;2022-03-08 07:48:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 07:58:00;2022-03-08 08:10:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 08:10:00;2022-03-08 08:18:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 08:28:00;2022-03-08 08:40:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 08:40:00;2022-03-08 08:48:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 08:58:00;2022-03-08 09:10:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 09:10:00;2022-03-08 09:18:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 09:28:00;2022-03-08 09:40:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 09:40:00;2022-03-08 09:48:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 09:58:00;2022-03-08 10:10:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 10:10:00;2022-03-08 10:18:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 10:28:00;2022-03-08 10:40:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 10:40:00;2022-03-08 10:48:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 10:58:00;2022-03-08 11:10:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 11:10:00;2022-03-08 11:18:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 11:28:00;2022-03-08 11:40:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 11:40:00;2022-03-08 11:48:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 11:58:00;2022-03-08 12:10:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 12:10:00;2022-03-08 12:18:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 12:28:00;2022-03-08 12:40:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 12:40:00;2022-03-08 12:48:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 12:58:00;2022-03-08 13:10:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 13:10:00;2022-03-08 13:18:00;Station-28;2169;10;71;CKB -LINE_12;Station-28;2022-03-08 13:28:00;2022-03-08 13:40:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 13:40:00;2022-03-08 13:48:00;Station-28;2169;8;71;CKB -LINE_12;Station-28;2022-03-08 13:56:00;2022-03-08 14:10:00;Station-27;2952;0;71;CKB -LINE_12;Station-27;2022-03-08 14:10:00;2022-03-08 14:19:00;Station-28;2169;14;71;CKB -LINE_12;Station-28;2022-03-08 14:33:00;2022-03-08 14:47:00;Station-27;2952;3;71;CKB -LINE_12;Station-27;2022-03-08 14:50:00;2022-03-08 14:59:00;Station-28;2169;14;71;CKB -LINE_12;Station-28;2022-03-08 15:13:00;2022-03-08 15:27:00;Station-27;2952;3;71;CKB -LINE_12;Station-27;2022-03-08 15:30:00;2022-03-08 15:39:00;Station-28;2169;14;71;CKB -LINE_12;Station-28;2022-03-08 15:53:00;2022-03-08 16:07:00;Station-27;2952;3;71;CKB -LINE_12;Station-27;2022-03-08 16:10:00;2022-03-08 16:19:00;Station-28;2169;14;71;CKB -LINE_12;Station-28;2022-03-08 16:33:00;2022-03-08 16:47:00;Station-27;2952;3;71;CKB -LINE_12;Station-27;2022-03-08 16:50:00;2022-03-08 16:59:00;Station-28;2169;14;71;CKB -LINE_12;Station-28;2022-03-08 17:13:00;2022-03-08 17:27:00;Station-27;2952;3;71;CKB -LINE_12;Station-27;2022-03-08 17:30:00;2022-03-08 17:39:00;Station-28;2169;13;71;CKB -LINE_12;Station-28;2022-03-08 17:52:00;2022-03-08 18:05:00;Station-27;2952;5;71;CKB -LINE_12;Station-27;2022-03-08 18:10:00;2022-03-08 18:18:00;Station-28;2169;0;71;CKB -LINE_12;Station-28;2022-03-08 18:18:00;2022-03-08 18:18:00;Station-0;0.06;0;71;CKB -LINE_12;Station-0;2022-03-08 14:13:00;2022-03-08 14:13:00;Station-28;0.06;0;72;CKB -LINE_12;Station-28;2022-03-08 14:13:00;2022-03-08 14:27:00;Station-27;2952;3;72;CKB -LINE_12;Station-27;2022-03-08 14:30:00;2022-03-08 14:39:00;Station-28;2169;14;72;CKB -LINE_12;Station-28;2022-03-08 14:53:00;2022-03-08 15:07:00;Station-27;2952;3;72;CKB -LINE_12;Station-27;2022-03-08 15:10:00;2022-03-08 15:19:00;Station-28;2169;14;72;CKB -LINE_12;Station-28;2022-03-08 15:33:00;2022-03-08 15:47:00;Station-27;2952;3;72;CKB -LINE_12;Station-27;2022-03-08 15:50:00;2022-03-08 15:59:00;Station-28;2169;14;72;CKB -LINE_12;Station-28;2022-03-08 16:13:00;2022-03-08 16:27:00;Station-27;2952;3;72;CKB -LINE_12;Station-27;2022-03-08 16:30:00;2022-03-08 16:39:00;Station-28;2169;14;72;CKB -LINE_12;Station-28;2022-03-08 16:53:00;2022-03-08 17:07:00;Station-27;2952;3;72;CKB -LINE_12;Station-27;2022-03-08 17:10:00;2022-03-08 17:19:00;Station-28;2169;14;72;CKB -LINE_12;Station-28;2022-03-08 17:33:00;2022-03-08 17:47:00;Station-27;2952;3;72;CKB -LINE_12;Station-27;2022-03-08 17:50:00;2022-03-08 17:59:00;Station-28;2169;14;72;CKB -LINE_12;Station-28;2022-03-08 18:13:00;2022-03-08 18:25:00;Station-27;2952;0;72;CKB -LINE_12;Station-27;2022-03-08 18:25:00;2022-03-08 18:25:00;Station-0;0.06;0;72;CKB -LINE_13;Station-0;2022-03-09 00:23:00;2022-03-09 00:23:00;Station-29;0.06;0;73;CKB -LINE_13;Station-29;2022-03-09 00:23:00;2022-03-09 00:30:00;Station-30;2577;9;73;CKB -LINE_14;Station-30;2022-03-09 00:39:00;2022-03-09 00:54:00;Station-31;5937;9;73;CKB -LINE_14;Station-31;2022-03-09 01:03:00;2022-03-09 01:17:00;Station-30;6.19;0;73;CKB -LINE_13;Station-30;2022-03-09 01:17:00;2022-03-09 01:23:00;Station-29;2555;0;73;CKB -LINE_13;Station-29;2022-03-09 01:23:00;2022-03-09 01:30:00;Station-30;2577;9;73;CKB -LINE_14;Station-30;2022-03-09 01:39:00;2022-03-09 01:54:00;Station-31;5937;9;73;CKB -LINE_14;Station-31;2022-03-09 02:03:00;2022-03-09 02:17:00;Station-30;6.19;0;73;CKB -LINE_13;Station-30;2022-03-09 02:17:00;2022-03-09 02:23:00;Station-29;2555;0;73;CKB -LINE_13;Station-29;2022-03-09 02:23:00;2022-03-09 02:30:00;Station-30;2577;9;73;CKB -LINE_14;Station-30;2022-03-09 02:39:00;2022-03-09 02:54:00;Station-31;5937;9;73;CKB -LINE_14;Station-31;2022-03-09 03:03:00;2022-03-09 03:17:00;Station-30;6.19;0;73;CKB -LINE_13;Station-30;2022-03-09 03:17:00;2022-03-09 03:23:00;Station-29;2555;0;73;CKB -LINE_13;Station-29;2022-03-09 03:23:00;2022-03-09 03:30:00;Station-30;2577;9;73;CKB -LINE_14;Station-30;2022-03-09 03:39:00;2022-03-09 03:54:00;Station-31;5937;9;73;CKB -LINE_14;Station-31;2022-03-09 04:03:00;2022-03-09 04:17:00;Station-30;6.19;0;73;CKB -LINE_13;Station-30;2022-03-09 04:17:00;2022-03-09 04:23:00;Station-29;2555;0;73;CKB -LINE_13;Station-29;2022-03-09 04:23:00;2022-03-09 04:23:00;Station-0;0.06;0;73;CKB -LINE_14;Station-0;2022-03-09 00:33:00;2022-03-09 00:33:00;Station-31;0.06;0;74;CKB -LINE_14;Station-31;2022-03-09 00:33:00;2022-03-09 00:47:00;Station-30;6.19;0;74;CKB -LINE_13;Station-30;2022-03-09 00:47:00;2022-03-09 00:53:00;Station-29;2555;0;74;CKB -LINE_13;Station-29;2022-03-09 00:53:00;2022-03-09 01:00:00;Station-30;2577;9;74;CKB -LINE_14;Station-30;2022-03-09 01:09:00;2022-03-09 01:24:00;Station-31;5937;9;74;CKB -LINE_14;Station-31;2022-03-09 01:33:00;2022-03-09 01:47:00;Station-30;6.19;0;74;CKB -LINE_13;Station-30;2022-03-09 01:47:00;2022-03-09 01:53:00;Station-29;2555;0;74;CKB -LINE_13;Station-29;2022-03-09 01:53:00;2022-03-09 02:00:00;Station-30;2577;9;74;CKB -LINE_14;Station-30;2022-03-09 02:09:00;2022-03-09 02:24:00;Station-31;5937;9;74;CKB -LINE_14;Station-31;2022-03-09 02:33:00;2022-03-09 02:47:00;Station-30;6.19;0;74;CKB -LINE_13;Station-30;2022-03-09 02:47:00;2022-03-09 02:53:00;Station-29;2555;0;74;CKB -LINE_13;Station-29;2022-03-09 02:53:00;2022-03-09 03:00:00;Station-30;2577;9;74;CKB -LINE_14;Station-30;2022-03-09 03:09:00;2022-03-09 03:24:00;Station-31;5937;9;74;CKB -LINE_14;Station-31;2022-03-09 03:33:00;2022-03-09 03:47:00;Station-30;6.19;0;74;CKB -LINE_13;Station-30;2022-03-09 03:47:00;2022-03-09 03:53:00;Station-29;2555;0;74;CKB -LINE_13;Station-29;2022-03-09 03:53:00;2022-03-09 04:00:00;Station-30;2577;9;74;CKB -LINE_14;Station-30;2022-03-09 04:09:00;2022-03-09 04:24:00;Station-31;5937;0;74;CKB -LINE_14;Station-31;2022-03-09 04:24:00;2022-03-09 04:24:00;Station-0;0.06;0;74;CKB -LINE_15;Station-0;2022-03-09 00:57:00;2022-03-09 00:57:00;Station-32;0.06;0;75;CKB -LINE_15;Station-32;2022-03-09 00:57:00;2022-03-09 01:06:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 01:06:00;2022-03-09 01:11:00;Station-32;2936;16;75;CKB -LINE_15;Station-32;2022-03-09 01:27:00;2022-03-09 01:36:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 01:36:00;2022-03-09 01:41:00;Station-32;2936;16;75;CKB -LINE_15;Station-32;2022-03-09 01:57:00;2022-03-09 02:06:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 02:06:00;2022-03-09 02:11:00;Station-32;2936;16;75;CKB -LINE_15;Station-32;2022-03-09 02:27:00;2022-03-09 02:36:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 02:36:00;2022-03-09 02:41:00;Station-32;2936;16;75;CKB -LINE_15;Station-32;2022-03-09 02:57:00;2022-03-09 03:06:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 03:06:00;2022-03-09 03:11:00;Station-32;2936;16;75;CKB -LINE_15;Station-32;2022-03-09 03:27:00;2022-03-09 03:36:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 03:36:00;2022-03-09 03:41:00;Station-32;2936;16;75;CKB -LINE_15;Station-32;2022-03-09 03:57:00;2022-03-09 04:06:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 04:06:00;2022-03-09 04:11:00;Station-32;2936;16;75;CKB -LINE_15;Station-32;2022-03-09 04:27:00;2022-03-09 04:36:00;Station-33;4343;0;75;CKB -LINE_15;Station-33;2022-03-09 04:36:00;2022-03-09 04:36:00;Station-0;0.06;0;75;CKB -LINE_16;Station-0;2022-03-09 00:29:00;2022-03-09 00:29:00;Station-34;0.06;0;76;CKB -LINE_16;Station-34;2022-03-09 00:29:00;2022-03-09 00:41:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 00:47:00;2022-03-09 00:57:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 00:59:00;2022-03-09 01:11:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 01:17:00;2022-03-09 01:27:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 01:29:00;2022-03-09 01:41:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 01:47:00;2022-03-09 01:57:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 01:59:00;2022-03-09 02:11:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 02:17:00;2022-03-09 02:27:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 02:29:00;2022-03-09 02:41:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 02:47:00;2022-03-09 02:57:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 02:59:00;2022-03-09 03:11:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 03:17:00;2022-03-09 03:27:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 03:29:00;2022-03-09 03:41:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 03:47:00;2022-03-09 03:57:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 03:59:00;2022-03-09 04:11:00;Station-35;4481;6;76;CKB -LINE_16;Station-35;2022-03-09 04:17:00;2022-03-09 04:27:00;Station-34;4031;2;76;CKB -LINE_16;Station-34;2022-03-09 04:29:00;2022-03-09 04:41:00;Station-35;4481;0;76;CKB -LINE_16;Station-35;2022-03-09 04:41:00;2022-03-09 04:41:00;Station-0;0.06;0;76;CKB -LINE_17;Station-0;2022-03-09 00:30:00;2022-03-09 00:30:00;Station-34;0.06;0;77;CKB -LINE_17;Station-34;2022-03-09 00:30:00;2022-03-09 00:44:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 00:44:00;2022-03-09 00:57:00;Station-34;5302;3;77;CKB -LINE_17;Station-34;2022-03-09 01:00:00;2022-03-09 01:14:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 01:14:00;2022-03-09 01:27:00;Station-34;5302;3;77;CKB -LINE_17;Station-34;2022-03-09 01:30:00;2022-03-09 01:44:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 01:44:00;2022-03-09 01:57:00;Station-34;5302;3;77;CKB -LINE_17;Station-34;2022-03-09 02:00:00;2022-03-09 02:14:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 02:14:00;2022-03-09 02:27:00;Station-34;5302;3;77;CKB -LINE_17;Station-34;2022-03-09 02:30:00;2022-03-09 02:44:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 02:44:00;2022-03-09 02:57:00;Station-34;5302;3;77;CKB -LINE_17;Station-34;2022-03-09 03:00:00;2022-03-09 03:14:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 03:14:00;2022-03-09 03:27:00;Station-34;5302;3;77;CKB -LINE_17;Station-34;2022-03-09 03:30:00;2022-03-09 03:44:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 03:44:00;2022-03-09 03:57:00;Station-34;5302;3;77;CKB -LINE_17;Station-34;2022-03-09 04:00:00;2022-03-09 04:14:00;Station-36;4801;0;77;CKB -LINE_17;Station-36;2022-03-09 04:14:00;2022-03-09 04:27:00;Station-34;5302;0;77;CKB -LINE_17;Station-34;2022-03-09 04:27:00;2022-03-09 04:27:00;Station-0;0.06;0;77;CKB -LINE_18;Station-0;2022-03-09 00:43:00;2022-03-09 00:43:00;Station-37;0.06;0;78;CKB -LINE_18;Station-37;2022-03-09 00:43:00;2022-03-09 01:33:00;Station-37;20434;10;78;CKB -LINE_18;Station-37;2022-03-09 01:43:00;2022-03-09 02:33:00;Station-37;20434;10;78;CKB -LINE_18;Station-37;2022-03-09 02:43:00;2022-03-09 03:33:00;Station-37;20434;10;78;CKB -LINE_18;Station-37;2022-03-09 03:43:00;2022-03-09 04:33:00;Station-37;20434;0;78;CKB -LINE_18;Station-37;2022-03-09 04:33:00;2022-03-09 04:33:00;Station-0;0.06;0;78;CKB -LINE_18;Station-0;2022-03-09 00:13:00;2022-03-09 00:13:00;Station-37;0.06;0;79;CKB -LINE_18;Station-37;2022-03-09 00:13:00;2022-03-09 01:03:00;Station-37;20434;10;79;CKB -LINE_18;Station-37;2022-03-09 01:13:00;2022-03-09 02:03:00;Station-37;20434;10;79;CKB -LINE_18;Station-37;2022-03-09 02:13:00;2022-03-09 03:03:00;Station-37;20434;10;79;CKB -LINE_18;Station-37;2022-03-09 03:13:00;2022-03-09 04:03:00;Station-37;20434;0;79;CKB -LINE_18;Station-37;2022-03-09 04:03:00;2022-03-09 04:03:00;Station-0;0.06;0;79;CKB -LINE_19;Station-0;2022-03-09 00:24:00;2022-03-09 00:24:00;Station-38;0.06;0;80;CKB -LINE_19;Station-38;2022-03-09 00:24:00;2022-03-09 00:48:00;Station-39;11.86;4;80;CKB -LINE_19;Station-39;2022-03-09 00:52:00;2022-03-09 01:14:00;Station-38;11139;10;80;CKB -LINE_19;Station-38;2022-03-09 01:24:00;2022-03-09 01:48:00;Station-39;11.86;4;80;CKB -LINE_19;Station-39;2022-03-09 01:52:00;2022-03-09 02:14:00;Station-38;11139;10;80;CKB -LINE_19;Station-38;2022-03-09 02:24:00;2022-03-09 02:48:00;Station-39;11.86;4;80;CKB -LINE_19;Station-39;2022-03-09 02:52:00;2022-03-09 03:14:00;Station-38;11139;10;80;CKB -LINE_19;Station-38;2022-03-09 03:24:00;2022-03-09 03:48:00;Station-39;11.86;4;80;CKB -LINE_19;Station-39;2022-03-09 03:52:00;2022-03-09 04:14:00;Station-38;11139;0;80;CKB -LINE_19;Station-38;2022-03-09 04:14:00;2022-03-09 04:14:00;Station-0;0.06;0;80;CKB -LINE_19;Station-0;2022-03-09 00:22:00;2022-03-09 00:22:00;Station-39;0.06;0;81;CKB -LINE_19;Station-39;2022-03-09 00:22:00;2022-03-09 00:44:00;Station-38;11139;10;81;CKB -LINE_19;Station-38;2022-03-09 00:54:00;2022-03-09 01:18:00;Station-39;11.86;4;81;CKB -LINE_19;Station-39;2022-03-09 01:22:00;2022-03-09 01:44:00;Station-38;11139;10;81;CKB -LINE_19;Station-38;2022-03-09 01:54:00;2022-03-09 02:18:00;Station-39;11.86;4;81;CKB -LINE_19;Station-39;2022-03-09 02:22:00;2022-03-09 02:44:00;Station-38;11139;10;81;CKB -LINE_19;Station-38;2022-03-09 02:54:00;2022-03-09 03:18:00;Station-39;11.86;4;81;CKB -LINE_19;Station-39;2022-03-09 03:22:00;2022-03-09 03:44:00;Station-38;11139;10;81;CKB -LINE_19;Station-38;2022-03-09 03:54:00;2022-03-09 04:18:00;Station-39;11.86;4;81;CKB -LINE_19;Station-39;2022-03-09 04:22:00;2022-03-09 04:44:00;Station-38;11139;0;81;CKB -LINE_19;Station-38;2022-03-09 04:44:00;2022-03-09 04:44:00;Station-0;0.06;0;81;CKB -LINE_20;Station-0;2022-03-09 00:32:00;2022-03-09 00:32:00;Station-13;0.06;0;82;CKB -LINE_20;Station-13;2022-03-09 00:32:00;2022-03-09 00:44:00;Station-40;4212;3;82;CKB -LINE_20;Station-40;2022-03-09 00:47:00;2022-03-09 01:16:00;Station-41;13048;0;82;CKB -LINE_20;Station-41;2022-03-09 01:16:00;2022-03-09 01:42:00;Station-40;12869;5;82;CKB -LINE_20;Station-40;2022-03-09 01:47:00;2022-03-09 02:16:00;Station-41;13048;0;82;CKB -LINE_20;Station-41;2022-03-09 02:16:00;2022-03-09 02:42:00;Station-40;12869;5;82;CKB -LINE_20;Station-40;2022-03-09 02:47:00;2022-03-09 03:16:00;Station-41;13048;0;82;CKB -LINE_20;Station-41;2022-03-09 03:16:00;2022-03-09 03:42:00;Station-40;12869;5;82;CKB -LINE_20;Station-40;2022-03-09 03:47:00;2022-03-09 04:16:00;Station-41;13048;0;82;CKB -LINE_20;Station-41;2022-03-09 04:16:00;2022-03-09 04:34:00;Station-42;9538;0;82;CKB -LINE_20;Station-42;2022-03-09 04:34:00;2022-03-09 04:34:00;Station-0;0.06;0;82;CKB -LINE_20;Station-0;2022-03-09 00:17:00;2022-03-09 00:17:00;Station-40;0.06;0;83;CKB -LINE_20;Station-40;2022-03-09 00:17:00;2022-03-09 00:46:00;Station-41;13048;0;83;CKB -LINE_20;Station-41;2022-03-09 00:46:00;2022-03-09 01:12:00;Station-40;12869;5;83;CKB -LINE_20;Station-40;2022-03-09 01:17:00;2022-03-09 01:46:00;Station-41;13048;0;83;CKB -LINE_20;Station-41;2022-03-09 01:46:00;2022-03-09 02:12:00;Station-40;12869;5;83;CKB -LINE_20;Station-40;2022-03-09 02:17:00;2022-03-09 02:46:00;Station-41;13048;0;83;CKB -LINE_20;Station-41;2022-03-09 02:46:00;2022-03-09 03:12:00;Station-40;12869;5;83;CKB -LINE_20;Station-40;2022-03-09 03:17:00;2022-03-09 03:46:00;Station-41;13048;0;83;CKB -LINE_20;Station-41;2022-03-09 03:46:00;2022-03-09 04:12:00;Station-40;12869;5;83;CKB -LINE_20;Station-40;2022-03-09 04:17:00;2022-03-09 04:28:00;Station-13;4316;0;83;CKB -LINE_20;Station-13;2022-03-09 04:28:00;2022-03-09 04:28:00;Station-0;0.06;0;83;CKB -LINE_21;Station-0;2022-03-09 00:49:00;2022-03-09 00:49:00;Station-3;0.06;0;84;CKB -LINE_21;Station-3;2022-03-09 00:49:00;2022-03-09 01:04:00;Station-16;10229;0;84;CKB -LINE_21;Station-16;2022-03-09 01:04:00;2022-03-09 01:19:00;Station-3;11801;0;84;CKB -LINE_21;Station-3;2022-03-09 01:19:00;2022-03-09 01:34:00;Station-16;10229;0;84;CKB -LINE_21;Station-16;2022-03-09 01:34:00;2022-03-09 01:49:00;Station-3;11801;0;84;CKB -LINE_21;Station-3;2022-03-09 01:49:00;2022-03-09 02:04:00;Station-16;10229;0;84;CKB -LINE_21;Station-16;2022-03-09 02:04:00;2022-03-09 02:19:00;Station-3;11801;0;84;CKB -LINE_21;Station-3;2022-03-09 02:19:00;2022-03-09 02:34:00;Station-16;10229;0;84;CKB -LINE_21;Station-16;2022-03-09 02:34:00;2022-03-09 02:49:00;Station-3;11801;0;84;CKB -LINE_21;Station-3;2022-03-09 02:49:00;2022-03-09 03:04:00;Station-16;10229;0;84;CKB -LINE_21;Station-16;2022-03-09 03:04:00;2022-03-09 03:19:00;Station-3;11801;0;84;CKB -LINE_21;Station-3;2022-03-09 03:19:00;2022-03-09 03:34:00;Station-16;10229;0;84;CKB -LINE_21;Station-16;2022-03-09 03:34:00;2022-03-09 03:49:00;Station-3;11801;0;84;CKB -LINE_21;Station-3;2022-03-09 03:49:00;2022-03-09 04:04:00;Station-16;10229;0;84;CKB -LINE_21;Station-16;2022-03-09 04:04:00;2022-03-09 04:19:00;Station-3;11801;23;84;CKB -LINE_22;Station-3;2022-03-09 04:42:00;2022-03-09 05:04:00;Station-43;6.81;0;84;CKB -LINE_22;Station-43;2022-03-09 05:04:00;2022-03-09 05:04:00;Station-0;0.06;0;84;CKB -LINE_8;Station-0;2022-03-09 00:32:00;2022-03-09 00:32:00;Station-13;0.06;0;85;CKB -LINE_8;Station-13;2022-03-09 00:32:00;2022-03-09 00:57:00;Station-21;11545;6;85;CKB -LINE_8;Station-21;2022-03-09 01:03:00;2022-03-09 01:46:00;Station-20;20579;1;85;CKB -LINE_8;Station-20;2022-03-09 01:47:00;2022-03-09 02:25:00;Station-21;20641;8;85;CKB -LINE_8;Station-21;2022-03-09 02:33:00;2022-03-09 03:16:00;Station-20;20579;1;85;CKB -LINE_8;Station-20;2022-03-09 03:17:00;2022-03-09 03:55:00;Station-21;20641;8;85;CKB -LINE_8;Station-21;2022-03-09 04:03:00;2022-03-09 04:28:00;Station-13;11499;0;85;CKB -LINE_8;Station-13;2022-03-09 04:28:00;2022-03-09 04:28:00;Station-0;0.06;0;85;CKB -LINE_8;Station-0;2022-03-09 00:33:00;2022-03-09 00:33:00;Station-21;0.06;0;86;CKB -LINE_8;Station-21;2022-03-09 00:33:00;2022-03-09 01:16:00;Station-20;20579;1;86;CKB -LINE_8;Station-20;2022-03-09 01:17:00;2022-03-09 01:55:00;Station-21;20641;8;86;CKB -LINE_8;Station-21;2022-03-09 02:03:00;2022-03-09 02:46:00;Station-20;20579;1;86;CKB -LINE_8;Station-20;2022-03-09 02:47:00;2022-03-09 03:25:00;Station-21;20641;8;86;CKB -LINE_8;Station-21;2022-03-09 03:33:00;2022-03-09 04:16:00;Station-20;20579;1;86;CKB -LINE_8;Station-20;2022-03-09 04:17:00;2022-03-09 04:51:00;Station-44;18752;0;86;CKB -LINE_8;Station-44;2022-03-09 04:51:00;2022-03-09 04:51:00;Station-0;0.06;0;86;CKB -LINE_23;Station-0;2022-03-09 00:34:00;2022-03-09 00:34:00;Station-45;0.06;0;87;CKB -LINE_23;Station-45;2022-03-09 00:34:00;2022-03-09 01:00:00;Station-46;9016;0;87;CKB -LINE_23;Station-46;2022-03-09 01:00:00;2022-03-09 01:27:00;Station-45;10083;7;87;CKB -LINE_23;Station-45;2022-03-09 01:34:00;2022-03-09 02:00:00;Station-46;9016;0;87;CKB -LINE_23;Station-46;2022-03-09 02:00:00;2022-03-09 02:27:00;Station-45;10083;7;87;CKB -LINE_23;Station-45;2022-03-09 02:34:00;2022-03-09 03:00:00;Station-46;9016;0;87;CKB -LINE_23;Station-46;2022-03-09 03:00:00;2022-03-09 03:27:00;Station-45;10083;7;87;CKB -LINE_23;Station-45;2022-03-09 03:34:00;2022-03-09 04:00:00;Station-46;9016;0;87;CKB -LINE_23;Station-46;2022-03-09 04:00:00;2022-03-09 04:27:00;Station-45;10083;0;87;CKB -LINE_23;Station-45;2022-03-09 04:27:00;2022-03-09 04:27:00;Station-0;0.06;0;87;CKB -LINE_23;Station-0;2022-03-09 00:30:00;2022-03-09 00:30:00;Station-46;0.06;0;88;CKB -LINE_23;Station-46;2022-03-09 00:30:00;2022-03-09 00:57:00;Station-45;10083;7;88;CKB -LINE_23;Station-45;2022-03-09 01:04:00;2022-03-09 01:30:00;Station-46;9016;0;88;CKB -LINE_23;Station-46;2022-03-09 01:30:00;2022-03-09 01:57:00;Station-45;10083;7;88;CKB -LINE_23;Station-45;2022-03-09 02:04:00;2022-03-09 02:30:00;Station-46;9016;0;88;CKB -LINE_23;Station-46;2022-03-09 02:30:00;2022-03-09 02:57:00;Station-45;10083;7;88;CKB -LINE_23;Station-45;2022-03-09 03:04:00;2022-03-09 03:30:00;Station-46;9016;0;88;CKB -LINE_23;Station-46;2022-03-09 03:30:00;2022-03-09 03:57:00;Station-45;10083;7;88;CKB -LINE_23;Station-45;2022-03-09 04:04:00;2022-03-09 04:30:00;Station-46;9016;0;88;CKB -LINE_23;Station-46;2022-03-09 04:30:00;2022-03-09 04:57:00;Station-45;10083;0;88;CKB -LINE_23;Station-45;2022-03-09 04:57:00;2022-03-09 04:57:00;Station-0;0.06;0;88;CKB -LINE_24;Station-0;2022-03-09 00:31:00;2022-03-09 00:31:00;Station-21;0.06;0;89;CKB -LINE_24;Station-21;2022-03-09 00:31:00;2022-03-09 00:44:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 00:44:00;2022-03-09 00:56:00;Station-21;5362;5;89;CKB -LINE_24;Station-21;2022-03-09 01:01:00;2022-03-09 01:14:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 01:14:00;2022-03-09 01:26:00;Station-21;5362;5;89;CKB -LINE_24;Station-21;2022-03-09 01:31:00;2022-03-09 01:44:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 01:44:00;2022-03-09 01:56:00;Station-21;5362;5;89;CKB -LINE_24;Station-21;2022-03-09 02:01:00;2022-03-09 02:14:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 02:14:00;2022-03-09 02:26:00;Station-21;5362;5;89;CKB -LINE_24;Station-21;2022-03-09 02:31:00;2022-03-09 02:44:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 02:44:00;2022-03-09 02:56:00;Station-21;5362;5;89;CKB -LINE_24;Station-21;2022-03-09 03:01:00;2022-03-09 03:14:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 03:14:00;2022-03-09 03:26:00;Station-21;5362;5;89;CKB -LINE_24;Station-21;2022-03-09 03:31:00;2022-03-09 03:44:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 03:44:00;2022-03-09 03:56:00;Station-21;5362;5;89;CKB -LINE_24;Station-21;2022-03-09 04:01:00;2022-03-09 04:14:00;Station-47;4872;0;89;CKB -LINE_24;Station-47;2022-03-09 04:14:00;2022-03-09 04:26:00;Station-21;5362;0;89;CKB -LINE_24;Station-21;2022-03-09 04:26:00;2022-03-09 04:26:00;Station-0;0.06;0;89;CKB -LINE_25;Station-0;2022-03-09 00:31:00;2022-03-09 00:31:00;Station-21;0.06;0;90;CKB -LINE_25;Station-21;2022-03-09 00:31:00;2022-03-09 00:45:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 00:47:00;2022-03-09 01:01:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 01:01:00;2022-03-09 01:15:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 01:17:00;2022-03-09 01:31:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 01:31:00;2022-03-09 01:45:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 01:47:00;2022-03-09 02:01:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 02:01:00;2022-03-09 02:15:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 02:17:00;2022-03-09 02:31:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 02:31:00;2022-03-09 02:45:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 02:47:00;2022-03-09 03:01:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 03:01:00;2022-03-09 03:15:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 03:17:00;2022-03-09 03:31:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 03:31:00;2022-03-09 03:45:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 03:47:00;2022-03-09 04:01:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 04:01:00;2022-03-09 04:15:00;Station-48;5225;2;90;CKB -LINE_25;Station-48;2022-03-09 04:17:00;2022-03-09 04:31:00;Station-21;7617;0;90;CKB -LINE_25;Station-21;2022-03-09 04:31:00;2022-03-09 04:31:00;Station-0;0.06;0;90;CKB -LINE_26;Station-0;2022-03-09 00:43:00;2022-03-09 00:43:00;Station-49;0.06;0;91;CKB -LINE_26;Station-49;2022-03-09 00:43:00;2022-03-09 00:53:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 00:53:00;2022-03-09 01:03:00;Station-49;4408;10;91;CKB -LINE_26;Station-49;2022-03-09 01:13:00;2022-03-09 01:23:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 01:23:00;2022-03-09 01:33:00;Station-49;4408;10;91;CKB -LINE_26;Station-49;2022-03-09 01:43:00;2022-03-09 01:53:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 01:53:00;2022-03-09 02:03:00;Station-49;4408;10;91;CKB -LINE_26;Station-49;2022-03-09 02:13:00;2022-03-09 02:23:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 02:23:00;2022-03-09 02:33:00;Station-49;4408;10;91;CKB -LINE_26;Station-49;2022-03-09 02:43:00;2022-03-09 02:53:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 02:53:00;2022-03-09 03:03:00;Station-49;4408;10;91;CKB -LINE_26;Station-49;2022-03-09 03:13:00;2022-03-09 03:23:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 03:23:00;2022-03-09 03:33:00;Station-49;4408;10;91;CKB -LINE_26;Station-49;2022-03-09 03:43:00;2022-03-09 03:53:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 03:53:00;2022-03-09 04:03:00;Station-49;4408;10;91;CKB -LINE_26;Station-49;2022-03-09 04:13:00;2022-03-09 04:23:00;Station-50;4507;0;91;CKB -LINE_26;Station-50;2022-03-09 04:23:00;2022-03-09 04:33:00;Station-49;4408;0;91;CKB -LINE_26;Station-49;2022-03-09 04:33:00;2022-03-09 04:33:00;Station-0;0.06;0;91;CKB -LINE_0;Station-0;2022-03-09 21:31:00;2022-03-09 21:31:00;Station-1;0.06;0;92;CKB -LINE_0;Station-1;2022-03-09 21:31:00;2022-03-09 22:04:00;Station-2;14519;4;92;CKB -LINE_0;Station-2;2022-03-09 22:08:00;2022-03-09 22:43:00;Station-1;13541;8;92;CKB -LINE_0;Station-1;2022-03-09 22:51:00;2022-03-09 23:24:00;Station-2;14519;4;92;CKB -LINE_0;Station-2;2022-03-09 23:28:00;2022-03-10 00:03:00;Station-1;13541;8;92;CKB -LINE_0;Station-1;2022-03-10 00:11:00;2022-03-10 00:44:00;Station-2;14519;0;92;CKB -LINE_1;Station-2;2022-03-10 00:44:00;2022-03-10 00:54:00;Station-3;4.1;25;92;CKB -LINE_1;Station-3;2022-03-10 01:19:00;2022-03-10 01:42:00;Station-4;8.36;6;92;CKB -LINE_1;Station-4;2022-03-10 01:48:00;2022-03-10 02:06:00;Station-3;9067;13;92;CKB -LINE_1;Station-3;2022-03-10 02:19:00;2022-03-10 02:42:00;Station-4;8.36;6;92;CKB -LINE_1;Station-4;2022-03-10 02:48:00;2022-03-10 03:06:00;Station-3;9067;13;92;CKB -LINE_1;Station-3;2022-03-10 03:19:00;2022-03-10 03:42:00;Station-4;8.36;6;92;CKB -LINE_1;Station-4;2022-03-10 03:48:00;2022-03-10 04:06:00;Station-3;9067;0;92;CKB -LINE_1;Station-3;2022-03-10 04:06:00;2022-03-10 04:06:00;Station-0;0.06;0;92;CKB -LINE_0;Station-0;2022-03-09 22:11:00;2022-03-09 22:11:00;Station-1;0.06;0;93;CKB -LINE_0;Station-1;2022-03-09 22:11:00;2022-03-09 22:44:00;Station-2;14519;4;93;CKB -LINE_0;Station-2;2022-03-09 22:48:00;2022-03-09 23:23:00;Station-1;13541;8;93;CKB -LINE_0;Station-1;2022-03-09 23:31:00;2022-03-10 00:04:00;Station-2;14519;4;93;CKB -LINE_0;Station-2;2022-03-10 00:08:00;2022-03-10 00:39:00;Station-5;12213;0;93;CKB -LINE_1;Station-5;2022-03-10 00:39:00;2022-03-10 00:47:00;Station-3;4.0;2;93;CKB -LINE_1;Station-3;2022-03-10 00:49:00;2022-03-10 01:12:00;Station-4;8.36;6;93;CKB -LINE_1;Station-4;2022-03-10 01:18:00;2022-03-10 01:36:00;Station-3;9067;13;93;CKB -LINE_1;Station-3;2022-03-10 01:49:00;2022-03-10 02:12:00;Station-4;8.36;6;93;CKB -LINE_1;Station-4;2022-03-10 02:18:00;2022-03-10 02:36:00;Station-3;9067;13;93;CKB -LINE_1;Station-3;2022-03-10 02:49:00;2022-03-10 03:12:00;Station-4;8.36;6;93;CKB -LINE_1;Station-4;2022-03-10 03:18:00;2022-03-10 03:36:00;Station-3;9067;13;93;CKB -LINE_1;Station-3;2022-03-10 03:49:00;2022-03-10 04:12:00;Station-4;8.36;0;93;CKB -LINE_1;Station-4;2022-03-10 04:12:00;2022-03-10 04:12:00;Station-0;0.06;0;93;CKB -LINE_2;Station-0;2022-03-09 21:06:00;2022-03-09 21:06:00;Station-6;0.06;0;94;CKB -LINE_2;Station-6;2022-03-09 21:06:00;2022-03-09 21:34:00;Station-7;13018;19;94;CKB -LINE_2;Station-7;2022-03-09 21:53:00;2022-03-09 22:13:00;Station-8;10332;17;94;CKB -LINE_2;Station-8;2022-03-09 22:30:00;2022-03-09 22:54:00;Station-7;10.48;19;94;CKB -LINE_2;Station-7;2022-03-09 23:13:00;2022-03-09 23:33:00;Station-8;10332;17;94;CKB -LINE_2;Station-8;2022-03-09 23:50:00;2022-03-10 00:14:00;Station-7;10.48;2;94;CKB -LINE_2;Station-7;2022-03-10 00:16:00;2022-03-10 00:23:00;Station-9;3709;5;94;CKB -LINE_3;Station-9;2022-03-10 00:28:00;2022-03-10 00:44:00;Station-10;6404;3;94;CKB -LINE_3;Station-10;2022-03-10 00:47:00;2022-03-10 01:10:00;Station-11;10579;7;94;CKB -LINE_3;Station-11;2022-03-10 01:17:00;2022-03-10 01:44:00;Station-10;12007;3;94;CKB -LINE_3;Station-10;2022-03-10 01:47:00;2022-03-10 02:10:00;Station-11;10579;7;94;CKB -LINE_3;Station-11;2022-03-10 02:17:00;2022-03-10 02:44:00;Station-10;12007;3;94;CKB -LINE_3;Station-10;2022-03-10 02:47:00;2022-03-10 03:10:00;Station-11;10579;7;94;CKB -LINE_3;Station-11;2022-03-10 03:17:00;2022-03-10 03:44:00;Station-10;12007;3;94;CKB -LINE_3;Station-10;2022-03-10 03:47:00;2022-03-10 04:10:00;Station-11;10579;7;94;CKB -LINE_3;Station-11;2022-03-10 04:17:00;2022-03-10 04:44:00;Station-10;12007;0;94;CKB -LINE_3;Station-10;2022-03-10 04:44:00;2022-03-10 04:44:00;Station-0;0.06;0;94;CKB -LINE_2;Station-0;2022-03-09 20:26:00;2022-03-09 20:26:00;Station-6;0.06;0;95;CKB -LINE_2;Station-6;2022-03-09 20:26:00;2022-03-09 20:56:00;Station-12;14097;14;95;CKB -LINE_2;Station-12;2022-03-09 21:10:00;2022-03-09 21:38:00;Station-6;13.19;8;95;CKB -LINE_2;Station-6;2022-03-09 21:46:00;2022-03-09 22:14:00;Station-7;13018;19;95;CKB -LINE_2;Station-7;2022-03-09 22:33:00;2022-03-09 22:53:00;Station-8;10332;17;95;CKB -LINE_2;Station-8;2022-03-09 23:10:00;2022-03-09 23:34:00;Station-7;10.48;19;95;CKB -LINE_2;Station-7;2022-03-09 23:53:00;2022-03-10 00:13:00;Station-8;10332;2;95;CKB -LINE_2;Station-8;2022-03-10 00:15:00;2022-03-10 00:16:00;Station-10;506;1;95;CKB -LINE_3;Station-10;2022-03-10 00:17:00;2022-03-10 00:40:00;Station-11;10579;7;95;CKB -LINE_3;Station-11;2022-03-10 00:47:00;2022-03-10 01:14:00;Station-10;12007;3;95;CKB -LINE_3;Station-10;2022-03-10 01:17:00;2022-03-10 01:40:00;Station-11;10579;7;95;CKB -LINE_3;Station-11;2022-03-10 01:47:00;2022-03-10 02:14:00;Station-10;12007;3;95;CKB -LINE_3;Station-10;2022-03-10 02:17:00;2022-03-10 02:40:00;Station-11;10579;7;95;CKB -LINE_3;Station-11;2022-03-10 02:47:00;2022-03-10 03:14:00;Station-10;12007;3;95;CKB -LINE_3;Station-10;2022-03-10 03:17:00;2022-03-10 03:40:00;Station-11;10579;7;95;CKB -LINE_3;Station-11;2022-03-10 03:47:00;2022-03-10 04:14:00;Station-10;12007;3;95;CKB -LINE_3;Station-10;2022-03-10 04:17:00;2022-03-10 04:40:00;Station-11;10579;3;95;CKB -LINE_4;Station-11;2022-03-10 04:43:00;2022-03-10 04:58:00;Station-13;6161;0;95;CKB -LINE_4;Station-13;2022-03-10 04:58:00;2022-03-10 04:58:00;Station-0;0.06;0;95;CKB -LINE_5;Station-0;2022-03-09 22:56:00;2022-03-09 22:56:00;Station-14;0.06;0;96;CKB -LINE_5;Station-14;2022-03-09 22:56:00;2022-03-09 23:08:00;Station-15;5882;3;96;CKB -LINE_5;Station-15;2022-03-09 23:11:00;2022-03-09 23:25:00;Station-14;6232;0;96;CKB -LINE_5;Station-14;2022-03-09 23:25:00;2022-03-09 23:38:00;Station-15;6086;3;96;CKB -LINE_5;Station-15;2022-03-09 23:41:00;2022-03-09 23:55:00;Station-14;6232;0;96;CKB -LINE_5;Station-14;2022-03-09 23:55:00;2022-03-10 00:08:00;Station-15;6086;0;96;CKB -LINE_5;Station-15;2022-03-10 00:08:00;2022-03-10 00:08:00;Station-0;0.06;0;96;CKB -LINE_6;Station-0;2022-03-09 05:05:00;2022-03-09 05:05:00;Station-16;0.06;0;97;CKB -LINE_6;Station-16;2022-03-09 05:05:00;2022-03-09 05:14:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 05:14:00;2022-03-09 05:23:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 05:25:00;2022-03-09 05:34:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 05:34:00;2022-03-09 05:43:00;Station-16;5139;23;97;CKB -LINE_6;Station-16;2022-03-09 06:06:00;2022-03-09 06:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 06:15:00;2022-03-09 06:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 06:26:00;2022-03-09 06:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 06:35:00;2022-03-09 06:44:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 06:46:00;2022-03-09 06:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 06:55:00;2022-03-09 07:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 07:06:00;2022-03-09 07:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 07:15:00;2022-03-09 07:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 07:26:00;2022-03-09 07:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 07:35:00;2022-03-09 07:44:00;Station-16;5139;22;97;CKB -LINE_6;Station-16;2022-03-09 08:06:00;2022-03-09 08:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 08:15:00;2022-03-09 08:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 08:26:00;2022-03-09 08:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 08:35:00;2022-03-09 08:44:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 08:46:00;2022-03-09 08:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 08:55:00;2022-03-09 09:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 09:06:00;2022-03-09 09:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 09:15:00;2022-03-09 09:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 09:26:00;2022-03-09 09:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 09:35:00;2022-03-09 09:44:00;Station-16;5139;22;97;CKB -LINE_6;Station-16;2022-03-09 10:06:00;2022-03-09 10:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 10:15:00;2022-03-09 10:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 10:26:00;2022-03-09 10:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 10:35:00;2022-03-09 10:44:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 10:46:00;2022-03-09 10:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 10:55:00;2022-03-09 11:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 11:06:00;2022-03-09 11:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 11:15:00;2022-03-09 11:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 11:26:00;2022-03-09 11:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 11:35:00;2022-03-09 11:44:00;Station-16;5139;22;97;CKB -LINE_6;Station-16;2022-03-09 12:06:00;2022-03-09 12:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 12:15:00;2022-03-09 12:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 12:26:00;2022-03-09 12:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 12:35:00;2022-03-09 12:44:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 12:46:00;2022-03-09 12:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 12:55:00;2022-03-09 13:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 13:06:00;2022-03-09 13:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 13:15:00;2022-03-09 13:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 13:26:00;2022-03-09 13:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 13:35:00;2022-03-09 13:44:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 13:46:00;2022-03-09 13:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 13:55:00;2022-03-09 14:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 14:06:00;2022-03-09 14:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 14:15:00;2022-03-09 14:24:00;Station-16;5139;22;97;CKB -LINE_6;Station-16;2022-03-09 14:46:00;2022-03-09 14:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 14:55:00;2022-03-09 15:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 15:06:00;2022-03-09 15:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 15:15:00;2022-03-09 15:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 15:26:00;2022-03-09 15:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 15:35:00;2022-03-09 15:44:00;Station-16;5139;22;97;CKB -LINE_6;Station-16;2022-03-09 16:06:00;2022-03-09 16:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 16:15:00;2022-03-09 16:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 16:26:00;2022-03-09 16:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 16:35:00;2022-03-09 16:44:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 16:46:00;2022-03-09 16:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 16:55:00;2022-03-09 17:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 17:06:00;2022-03-09 17:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 17:15:00;2022-03-09 17:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 17:26:00;2022-03-09 17:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 17:35:00;2022-03-09 17:44:00;Station-16;5139;22;97;CKB -LINE_6;Station-16;2022-03-09 18:06:00;2022-03-09 18:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 18:15:00;2022-03-09 18:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 18:26:00;2022-03-09 18:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 18:35:00;2022-03-09 18:44:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 18:46:00;2022-03-09 18:55:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 18:55:00;2022-03-09 19:04:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 19:06:00;2022-03-09 19:15:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 19:15:00;2022-03-09 19:24:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 19:26:00;2022-03-09 19:35:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 19:35:00;2022-03-09 19:44:00;Station-16;5139;21;97;CKB -LINE_6;Station-16;2022-03-09 20:05:00;2022-03-09 20:14:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 20:14:00;2022-03-09 20:23:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 20:25:00;2022-03-09 20:34:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 20:34:00;2022-03-09 20:43:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 20:45:00;2022-03-09 20:54:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 20:54:00;2022-03-09 21:03:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 21:05:00;2022-03-09 21:14:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 21:14:00;2022-03-09 21:23:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 21:25:00;2022-03-09 21:34:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 21:34:00;2022-03-09 21:43:00;Station-16;5139;22;97;CKB -LINE_6;Station-16;2022-03-09 22:05:00;2022-03-09 22:14:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 22:14:00;2022-03-09 22:23:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 22:25:00;2022-03-09 22:34:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 22:34:00;2022-03-09 22:43:00;Station-16;5139;2;97;CKB -LINE_6;Station-16;2022-03-09 22:45:00;2022-03-09 22:54:00;Station-17;4781;0;97;CKB -LINE_6;Station-17;2022-03-09 22:54:00;2022-03-09 23:03:00;Station-16;5139;0;97;CKB -LINE_6;Station-16;2022-03-09 23:03:00;2022-03-09 23:03:00;Station-0;0.06;0;97;CKB -LINE_7;Station-0;2022-03-10 00:06:00;2022-03-10 00:06:00;Station-18;0.06;0;98;CKB -LINE_7;Station-18;2022-03-10 00:06:00;2022-03-10 00:27:00;Station-19;7827;0;98;CKB -LINE_8;Station-19;2022-03-10 00:27:00;2022-03-10 00:48:00;Station-20;11079;0;98;CKB -LINE_8;Station-20;2022-03-10 00:48:00;2022-03-10 01:25:00;Station-21;20641;8;98;CKB -LINE_8;Station-21;2022-03-10 01:33:00;2022-03-10 02:16:00;Station-20;20579;1;98;CKB -LINE_8;Station-20;2022-03-10 02:17:00;2022-03-10 02:55:00;Station-21;20641;8;98;CKB -LINE_8;Station-21;2022-03-10 03:03:00;2022-03-10 03:46:00;Station-20;20579;1;98;CKB -LINE_8;Station-20;2022-03-10 03:47:00;2022-03-10 04:25:00;Station-21;20641;0;98;CKB -LINE_8;Station-21;2022-03-10 04:25:00;2022-03-10 04:25:00;Station-0;0.06;0;98;CKB -LINE_9;Station-22;2022-03-09 05:15:00;2022-03-09 06:01:00;Station-23;17.9;0;99;VDL -LINE_9;Station-23;2022-03-09 06:01:00;2022-03-09 06:15:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 06:23:00;2022-03-09 06:37:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 06:41:00;2022-03-09 06:55:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 07:03:00;2022-03-09 07:17:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 07:21:00;2022-03-09 07:35:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 07:43:00;2022-03-09 07:57:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 08:01:00;2022-03-09 08:15:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 08:23:00;2022-03-09 08:37:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 08:41:00;2022-03-09 08:55:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 09:03:00;2022-03-09 09:17:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 09:21:00;2022-03-09 09:35:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 09:43:00;2022-03-09 09:57:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 10:01:00;2022-03-09 10:15:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 10:23:00;2022-03-09 10:37:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 10:41:00;2022-03-09 10:55:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 11:03:00;2022-03-09 11:17:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 11:21:00;2022-03-09 11:35:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 11:43:00;2022-03-09 11:57:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 12:01:00;2022-03-09 12:15:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 12:23:00;2022-03-09 12:37:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 12:41:00;2022-03-09 12:55:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 13:03:00;2022-03-09 13:17:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 13:21:00;2022-03-09 13:35:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 13:43:00;2022-03-09 13:57:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 14:01:00;2022-03-09 14:15:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 14:23:00;2022-03-09 14:37:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 14:41:00;2022-03-09 14:55:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 15:03:00;2022-03-09 15:17:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 15:21:00;2022-03-09 15:35:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 15:43:00;2022-03-09 15:57:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 16:01:00;2022-03-09 16:15:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 16:23:00;2022-03-09 16:37:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 16:41:00;2022-03-09 16:55:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 17:03:00;2022-03-09 17:17:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 17:21:00;2022-03-09 17:35:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 17:43:00;2022-03-09 17:57:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 18:01:00;2022-03-09 18:15:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 18:23:00;2022-03-09 18:37:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 18:41:00;2022-03-09 18:55:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 19:03:00;2022-03-09 19:17:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 19:21:00;2022-03-09 19:35:00;Station-23;4637;8;99;VDL -LINE_9;Station-23;2022-03-09 19:43:00;2022-03-09 19:57:00;Station-23;4637;4;99;VDL -LINE_9;Station-23;2022-03-09 20:01:00;2022-03-09 20:14:00;Station-23;4637;9;99;VDL -LINE_9;Station-23;2022-03-09 20:23:00;2022-03-09 20:36:00;Station-23;4637;0;99;VDL -LINE_9;Station-23;2022-03-09 20:36:00;2022-03-09 21:15:00;Station-22;19.8;0;99;VDL -LINE_10;Station-0;2022-03-09 04:56:00;2022-03-09 04:56:00;Station-24;0.06;18;100;CKB -LINE_10;Station-24;2022-03-09 05:14:00;2022-03-09 05:20:00;Station-25;3.29;0;100;CKB -LINE_10;Station-25;2022-03-09 05:20:00;2022-03-09 05:24:00;Station-24;2954;20;100;CKB -LINE_10;Station-24;2022-03-09 05:44:00;2022-03-09 05:50:00;Station-25;3.29;0;100;CKB -LINE_10;Station-25;2022-03-09 05:50:00;2022-03-09 05:54:00;Station-24;2954;5;100;CKB -LINE_10;Station-24;2022-03-09 05:59:00;2022-03-09 06:06:00;Station-25;3.29;2;100;CKB -LINE_10;Station-25;2022-03-09 06:08:00;2022-03-09 06:13:00;Station-24;2954;19;100;CKB -LINE_10;Station-24;2022-03-09 06:32:00;2022-03-09 06:39:00;Station-25;3.29;1;100;CKB -LINE_10;Station-25;2022-03-09 06:40:00;2022-03-09 06:45:00;Station-24;2954;7;100;CKB -LINE_10;Station-24;2022-03-09 06:52:00;2022-03-09 06:59:00;Station-25;3.29;1;100;CKB -LINE_10;Station-25;2022-03-09 07:00:00;2022-03-09 07:05:00;Station-24;2954;7;100;CKB -LINE_10;Station-24;2022-03-09 07:12:00;2022-03-09 07:19:00;Station-25;3.29;1;100;CKB -LINE_10;Station-25;2022-03-09 07:20:00;2022-03-09 07:25:00;Station-24;2954;7;100;CKB -LINE_10;Station-24;2022-03-09 07:32:00;2022-03-09 07:39:00;Station-25;3.29;1;100;CKB -LINE_10;Station-25;2022-03-09 07:40:00;2022-03-09 07:45:00;Station-24;2954;295;100;CKB -LINE_10;Station-24;2022-03-09 12:40:00;2022-03-09 12:47:00;Station-25;3.29;2;100;CKB -LINE_10;Station-25;2022-03-09 12:49:00;2022-03-09 12:54:00;Station-24;2954;46;100;CKB -LINE_10;Station-24;2022-03-09 13:40:00;2022-03-09 13:47:00;Station-25;3.29;2;100;CKB -LINE_10;Station-25;2022-03-09 13:49:00;2022-03-09 13:54:00;Station-24;2954;434;100;CKB -LINE_10;Station-24;2022-03-09 21:08:00;2022-03-09 21:08:00;Station-0;0.06;0;100;CKB -LINE_11;Station-0;2022-03-09 07:20:00;2022-03-09 07:20:00;Station-26;0.06;0;101;CKB -LINE_11;Station-26;2022-03-09 07:20:00;2022-03-09 07:50:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 08:00:00;2022-03-09 08:30:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 08:40:00;2022-03-09 09:10:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 09:20:00;2022-03-09 09:50:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 10:00:00;2022-03-09 10:30:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 10:40:00;2022-03-09 11:10:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 11:20:00;2022-03-09 11:50:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 12:00:00;2022-03-09 12:30:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 12:40:00;2022-03-09 13:10:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 13:20:00;2022-03-09 13:50:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 14:00:00;2022-03-09 14:30:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 14:40:00;2022-03-09 15:10:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 15:20:00;2022-03-09 15:50:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 16:00:00;2022-03-09 16:30:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 16:40:00;2022-03-09 17:10:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 17:20:00;2022-03-09 17:50:00;Station-26;9266;10;101;CKB -LINE_11;Station-26;2022-03-09 18:00:00;2022-03-09 18:30:00;Station-26;9266;0;101;CKB -LINE_11;Station-26;2022-03-09 18:30:00;2022-03-09 18:30:00;Station-0;0.06;0;101;CKB -LINE_12;Station-0;2022-03-09 07:10:00;2022-03-09 07:10:00;Station-27;0.06;0;102;CKB -LINE_12;Station-27;2022-03-09 07:10:00;2022-03-09 07:18:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 07:28:00;2022-03-09 07:40:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 07:40:00;2022-03-09 07:48:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 07:58:00;2022-03-09 08:10:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 08:10:00;2022-03-09 08:18:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 08:28:00;2022-03-09 08:40:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 08:40:00;2022-03-09 08:48:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 08:58:00;2022-03-09 09:10:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 09:10:00;2022-03-09 09:18:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 09:28:00;2022-03-09 09:40:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 09:40:00;2022-03-09 09:48:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 09:58:00;2022-03-09 10:10:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 10:10:00;2022-03-09 10:18:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 10:28:00;2022-03-09 10:40:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 10:40:00;2022-03-09 10:48:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 10:58:00;2022-03-09 11:10:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 11:10:00;2022-03-09 11:18:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 11:28:00;2022-03-09 11:40:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 11:40:00;2022-03-09 11:48:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 11:58:00;2022-03-09 12:10:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 12:10:00;2022-03-09 12:18:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 12:28:00;2022-03-09 12:40:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 12:40:00;2022-03-09 12:48:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 12:58:00;2022-03-09 13:10:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 13:10:00;2022-03-09 13:18:00;Station-28;2169;10;102;CKB -LINE_12;Station-28;2022-03-09 13:28:00;2022-03-09 13:40:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 13:40:00;2022-03-09 13:48:00;Station-28;2169;8;102;CKB -LINE_12;Station-28;2022-03-09 13:56:00;2022-03-09 14:10:00;Station-27;2952;0;102;CKB -LINE_12;Station-27;2022-03-09 14:10:00;2022-03-09 14:19:00;Station-28;2169;14;102;CKB -LINE_12;Station-28;2022-03-09 14:33:00;2022-03-09 14:47:00;Station-27;2952;3;102;CKB -LINE_12;Station-27;2022-03-09 14:50:00;2022-03-09 14:59:00;Station-28;2169;14;102;CKB -LINE_12;Station-28;2022-03-09 15:13:00;2022-03-09 15:27:00;Station-27;2952;3;102;CKB -LINE_12;Station-27;2022-03-09 15:30:00;2022-03-09 15:39:00;Station-28;2169;14;102;CKB -LINE_12;Station-28;2022-03-09 15:53:00;2022-03-09 16:07:00;Station-27;2952;3;102;CKB -LINE_12;Station-27;2022-03-09 16:10:00;2022-03-09 16:19:00;Station-28;2169;14;102;CKB -LINE_12;Station-28;2022-03-09 16:33:00;2022-03-09 16:47:00;Station-27;2952;3;102;CKB -LINE_12;Station-27;2022-03-09 16:50:00;2022-03-09 16:59:00;Station-28;2169;14;102;CKB -LINE_12;Station-28;2022-03-09 17:13:00;2022-03-09 17:27:00;Station-27;2952;3;102;CKB -LINE_12;Station-27;2022-03-09 17:30:00;2022-03-09 17:39:00;Station-28;2169;13;102;CKB -LINE_12;Station-28;2022-03-09 17:52:00;2022-03-09 18:05:00;Station-27;2952;5;102;CKB -LINE_12;Station-27;2022-03-09 18:10:00;2022-03-09 18:18:00;Station-28;2169;0;102;CKB -LINE_12;Station-28;2022-03-09 18:18:00;2022-03-09 18:18:00;Station-0;0.06;0;102;CKB -LINE_12;Station-0;2022-03-09 14:13:00;2022-03-09 14:13:00;Station-28;0.06;0;103;CKB -LINE_12;Station-28;2022-03-09 14:13:00;2022-03-09 14:27:00;Station-27;2952;3;103;CKB -LINE_12;Station-27;2022-03-09 14:30:00;2022-03-09 14:39:00;Station-28;2169;14;103;CKB -LINE_12;Station-28;2022-03-09 14:53:00;2022-03-09 15:07:00;Station-27;2952;3;103;CKB -LINE_12;Station-27;2022-03-09 15:10:00;2022-03-09 15:19:00;Station-28;2169;14;103;CKB -LINE_12;Station-28;2022-03-09 15:33:00;2022-03-09 15:47:00;Station-27;2952;3;103;CKB -LINE_12;Station-27;2022-03-09 15:50:00;2022-03-09 15:59:00;Station-28;2169;14;103;CKB -LINE_12;Station-28;2022-03-09 16:13:00;2022-03-09 16:27:00;Station-27;2952;3;103;CKB -LINE_12;Station-27;2022-03-09 16:30:00;2022-03-09 16:39:00;Station-28;2169;14;103;CKB -LINE_12;Station-28;2022-03-09 16:53:00;2022-03-09 17:07:00;Station-27;2952;3;103;CKB -LINE_12;Station-27;2022-03-09 17:10:00;2022-03-09 17:19:00;Station-28;2169;14;103;CKB -LINE_12;Station-28;2022-03-09 17:33:00;2022-03-09 17:47:00;Station-27;2952;3;103;CKB -LINE_12;Station-27;2022-03-09 17:50:00;2022-03-09 17:59:00;Station-28;2169;14;103;CKB -LINE_12;Station-28;2022-03-09 18:13:00;2022-03-09 18:25:00;Station-27;2952;0;103;CKB -LINE_12;Station-27;2022-03-09 18:25:00;2022-03-09 18:25:00;Station-0;0.06;0;103;CKB -LINE_13;Station-0;2022-03-10 00:23:00;2022-03-10 00:23:00;Station-29;0.06;0;104;CKB -LINE_13;Station-29;2022-03-10 00:23:00;2022-03-10 00:30:00;Station-30;2577;9;104;CKB -LINE_14;Station-30;2022-03-10 00:39:00;2022-03-10 00:54:00;Station-31;5937;9;104;CKB -LINE_14;Station-31;2022-03-10 01:03:00;2022-03-10 01:17:00;Station-30;6.19;0;104;CKB -LINE_13;Station-30;2022-03-10 01:17:00;2022-03-10 01:23:00;Station-29;2555;0;104;CKB -LINE_13;Station-29;2022-03-10 01:23:00;2022-03-10 01:30:00;Station-30;2577;9;104;CKB -LINE_14;Station-30;2022-03-10 01:39:00;2022-03-10 01:54:00;Station-31;5937;9;104;CKB -LINE_14;Station-31;2022-03-10 02:03:00;2022-03-10 02:17:00;Station-30;6.19;0;104;CKB -LINE_13;Station-30;2022-03-10 02:17:00;2022-03-10 02:23:00;Station-29;2555;0;104;CKB -LINE_13;Station-29;2022-03-10 02:23:00;2022-03-10 02:30:00;Station-30;2577;9;104;CKB -LINE_14;Station-30;2022-03-10 02:39:00;2022-03-10 02:54:00;Station-31;5937;9;104;CKB -LINE_14;Station-31;2022-03-10 03:03:00;2022-03-10 03:17:00;Station-30;6.19;0;104;CKB -LINE_13;Station-30;2022-03-10 03:17:00;2022-03-10 03:23:00;Station-29;2555;0;104;CKB -LINE_13;Station-29;2022-03-10 03:23:00;2022-03-10 03:30:00;Station-30;2577;9;104;CKB -LINE_14;Station-30;2022-03-10 03:39:00;2022-03-10 03:54:00;Station-31;5937;9;104;CKB -LINE_14;Station-31;2022-03-10 04:03:00;2022-03-10 04:17:00;Station-30;6.19;0;104;CKB -LINE_13;Station-30;2022-03-10 04:17:00;2022-03-10 04:23:00;Station-29;2555;0;104;CKB -LINE_13;Station-29;2022-03-10 04:23:00;2022-03-10 04:23:00;Station-0;0.06;0;104;CKB -LINE_14;Station-0;2022-03-10 00:33:00;2022-03-10 00:33:00;Station-31;0.06;0;105;CKB -LINE_14;Station-31;2022-03-10 00:33:00;2022-03-10 00:47:00;Station-30;6.19;0;105;CKB -LINE_13;Station-30;2022-03-10 00:47:00;2022-03-10 00:53:00;Station-29;2555;0;105;CKB -LINE_13;Station-29;2022-03-10 00:53:00;2022-03-10 01:00:00;Station-30;2577;9;105;CKB -LINE_14;Station-30;2022-03-10 01:09:00;2022-03-10 01:24:00;Station-31;5937;9;105;CKB -LINE_14;Station-31;2022-03-10 01:33:00;2022-03-10 01:47:00;Station-30;6.19;0;105;CKB -LINE_13;Station-30;2022-03-10 01:47:00;2022-03-10 01:53:00;Station-29;2555;0;105;CKB -LINE_13;Station-29;2022-03-10 01:53:00;2022-03-10 02:00:00;Station-30;2577;9;105;CKB -LINE_14;Station-30;2022-03-10 02:09:00;2022-03-10 02:24:00;Station-31;5937;9;105;CKB -LINE_14;Station-31;2022-03-10 02:33:00;2022-03-10 02:47:00;Station-30;6.19;0;105;CKB -LINE_13;Station-30;2022-03-10 02:47:00;2022-03-10 02:53:00;Station-29;2555;0;105;CKB -LINE_13;Station-29;2022-03-10 02:53:00;2022-03-10 03:00:00;Station-30;2577;9;105;CKB -LINE_14;Station-30;2022-03-10 03:09:00;2022-03-10 03:24:00;Station-31;5937;9;105;CKB -LINE_14;Station-31;2022-03-10 03:33:00;2022-03-10 03:47:00;Station-30;6.19;0;105;CKB -LINE_13;Station-30;2022-03-10 03:47:00;2022-03-10 03:53:00;Station-29;2555;0;105;CKB -LINE_13;Station-29;2022-03-10 03:53:00;2022-03-10 04:00:00;Station-30;2577;9;105;CKB -LINE_14;Station-30;2022-03-10 04:09:00;2022-03-10 04:24:00;Station-31;5937;0;105;CKB -LINE_14;Station-31;2022-03-10 04:24:00;2022-03-10 04:24:00;Station-0;0.06;0;105;CKB -LINE_15;Station-0;2022-03-10 00:57:00;2022-03-10 00:57:00;Station-32;0.06;0;106;CKB -LINE_15;Station-32;2022-03-10 00:57:00;2022-03-10 01:06:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 01:06:00;2022-03-10 01:11:00;Station-32;2936;16;106;CKB -LINE_15;Station-32;2022-03-10 01:27:00;2022-03-10 01:36:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 01:36:00;2022-03-10 01:41:00;Station-32;2936;16;106;CKB -LINE_15;Station-32;2022-03-10 01:57:00;2022-03-10 02:06:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 02:06:00;2022-03-10 02:11:00;Station-32;2936;16;106;CKB -LINE_15;Station-32;2022-03-10 02:27:00;2022-03-10 02:36:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 02:36:00;2022-03-10 02:41:00;Station-32;2936;16;106;CKB -LINE_15;Station-32;2022-03-10 02:57:00;2022-03-10 03:06:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 03:06:00;2022-03-10 03:11:00;Station-32;2936;16;106;CKB -LINE_15;Station-32;2022-03-10 03:27:00;2022-03-10 03:36:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 03:36:00;2022-03-10 03:41:00;Station-32;2936;16;106;CKB -LINE_15;Station-32;2022-03-10 03:57:00;2022-03-10 04:06:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 04:06:00;2022-03-10 04:11:00;Station-32;2936;16;106;CKB -LINE_15;Station-32;2022-03-10 04:27:00;2022-03-10 04:36:00;Station-33;4343;0;106;CKB -LINE_15;Station-33;2022-03-10 04:36:00;2022-03-10 04:36:00;Station-0;0.06;0;106;CKB -LINE_16;Station-0;2022-03-10 00:29:00;2022-03-10 00:29:00;Station-34;0.06;0;107;CKB -LINE_16;Station-34;2022-03-10 00:29:00;2022-03-10 00:41:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 00:47:00;2022-03-10 00:57:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 00:59:00;2022-03-10 01:11:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 01:17:00;2022-03-10 01:27:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 01:29:00;2022-03-10 01:41:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 01:47:00;2022-03-10 01:57:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 01:59:00;2022-03-10 02:11:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 02:17:00;2022-03-10 02:27:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 02:29:00;2022-03-10 02:41:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 02:47:00;2022-03-10 02:57:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 02:59:00;2022-03-10 03:11:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 03:17:00;2022-03-10 03:27:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 03:29:00;2022-03-10 03:41:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 03:47:00;2022-03-10 03:57:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 03:59:00;2022-03-10 04:11:00;Station-35;4481;6;107;CKB -LINE_16;Station-35;2022-03-10 04:17:00;2022-03-10 04:27:00;Station-34;4031;2;107;CKB -LINE_16;Station-34;2022-03-10 04:29:00;2022-03-10 04:41:00;Station-35;4481;0;107;CKB -LINE_16;Station-35;2022-03-10 04:41:00;2022-03-10 04:41:00;Station-0;0.06;0;107;CKB -LINE_17;Station-0;2022-03-10 00:30:00;2022-03-10 00:30:00;Station-34;0.06;0;108;CKB -LINE_17;Station-34;2022-03-10 00:30:00;2022-03-10 00:44:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 00:44:00;2022-03-10 00:57:00;Station-34;5302;3;108;CKB -LINE_17;Station-34;2022-03-10 01:00:00;2022-03-10 01:14:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 01:14:00;2022-03-10 01:27:00;Station-34;5302;3;108;CKB -LINE_17;Station-34;2022-03-10 01:30:00;2022-03-10 01:44:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 01:44:00;2022-03-10 01:57:00;Station-34;5302;3;108;CKB -LINE_17;Station-34;2022-03-10 02:00:00;2022-03-10 02:14:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 02:14:00;2022-03-10 02:27:00;Station-34;5302;3;108;CKB -LINE_17;Station-34;2022-03-10 02:30:00;2022-03-10 02:44:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 02:44:00;2022-03-10 02:57:00;Station-34;5302;3;108;CKB -LINE_17;Station-34;2022-03-10 03:00:00;2022-03-10 03:14:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 03:14:00;2022-03-10 03:27:00;Station-34;5302;3;108;CKB -LINE_17;Station-34;2022-03-10 03:30:00;2022-03-10 03:44:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 03:44:00;2022-03-10 03:57:00;Station-34;5302;3;108;CKB -LINE_17;Station-34;2022-03-10 04:00:00;2022-03-10 04:14:00;Station-36;4801;0;108;CKB -LINE_17;Station-36;2022-03-10 04:14:00;2022-03-10 04:27:00;Station-34;5302;0;108;CKB -LINE_17;Station-34;2022-03-10 04:27:00;2022-03-10 04:27:00;Station-0;0.06;0;108;CKB -LINE_18;Station-0;2022-03-10 00:43:00;2022-03-10 00:43:00;Station-37;0.06;0;109;CKB -LINE_18;Station-37;2022-03-10 00:43:00;2022-03-10 01:33:00;Station-37;20434;10;109;CKB -LINE_18;Station-37;2022-03-10 01:43:00;2022-03-10 02:33:00;Station-37;20434;10;109;CKB -LINE_18;Station-37;2022-03-10 02:43:00;2022-03-10 03:33:00;Station-37;20434;10;109;CKB -LINE_18;Station-37;2022-03-10 03:43:00;2022-03-10 04:33:00;Station-37;20434;0;109;CKB -LINE_18;Station-37;2022-03-10 04:33:00;2022-03-10 04:33:00;Station-0;0.06;0;109;CKB -LINE_18;Station-0;2022-03-10 00:13:00;2022-03-10 00:13:00;Station-37;0.06;0;110;CKB -LINE_18;Station-37;2022-03-10 00:13:00;2022-03-10 01:03:00;Station-37;20434;10;110;CKB -LINE_18;Station-37;2022-03-10 01:13:00;2022-03-10 02:03:00;Station-37;20434;10;110;CKB -LINE_18;Station-37;2022-03-10 02:13:00;2022-03-10 03:03:00;Station-37;20434;10;110;CKB -LINE_18;Station-37;2022-03-10 03:13:00;2022-03-10 04:03:00;Station-37;20434;0;110;CKB -LINE_18;Station-37;2022-03-10 04:03:00;2022-03-10 04:03:00;Station-0;0.06;0;110;CKB -LINE_19;Station-0;2022-03-10 00:24:00;2022-03-10 00:24:00;Station-38;0.06;0;111;CKB -LINE_19;Station-38;2022-03-10 00:24:00;2022-03-10 00:48:00;Station-39;11.86;4;111;CKB -LINE_19;Station-39;2022-03-10 00:52:00;2022-03-10 01:14:00;Station-38;11139;10;111;CKB -LINE_19;Station-38;2022-03-10 01:24:00;2022-03-10 01:48:00;Station-39;11.86;4;111;CKB -LINE_19;Station-39;2022-03-10 01:52:00;2022-03-10 02:14:00;Station-38;11139;10;111;CKB -LINE_19;Station-38;2022-03-10 02:24:00;2022-03-10 02:48:00;Station-39;11.86;4;111;CKB -LINE_19;Station-39;2022-03-10 02:52:00;2022-03-10 03:14:00;Station-38;11139;10;111;CKB -LINE_19;Station-38;2022-03-10 03:24:00;2022-03-10 03:48:00;Station-39;11.86;4;111;CKB -LINE_19;Station-39;2022-03-10 03:52:00;2022-03-10 04:14:00;Station-38;11139;0;111;CKB -LINE_19;Station-38;2022-03-10 04:14:00;2022-03-10 04:14:00;Station-0;0.06;0;111;CKB -LINE_19;Station-0;2022-03-10 00:22:00;2022-03-10 00:22:00;Station-39;0.06;0;112;CKB -LINE_19;Station-39;2022-03-10 00:22:00;2022-03-10 00:44:00;Station-38;11139;10;112;CKB -LINE_19;Station-38;2022-03-10 00:54:00;2022-03-10 01:18:00;Station-39;11.86;4;112;CKB -LINE_19;Station-39;2022-03-10 01:22:00;2022-03-10 01:44:00;Station-38;11139;10;112;CKB -LINE_19;Station-38;2022-03-10 01:54:00;2022-03-10 02:18:00;Station-39;11.86;4;112;CKB -LINE_19;Station-39;2022-03-10 02:22:00;2022-03-10 02:44:00;Station-38;11139;10;112;CKB -LINE_19;Station-38;2022-03-10 02:54:00;2022-03-10 03:18:00;Station-39;11.86;4;112;CKB -LINE_19;Station-39;2022-03-10 03:22:00;2022-03-10 03:44:00;Station-38;11139;10;112;CKB -LINE_19;Station-38;2022-03-10 03:54:00;2022-03-10 04:18:00;Station-39;11.86;4;112;CKB -LINE_19;Station-39;2022-03-10 04:22:00;2022-03-10 04:44:00;Station-38;11139;0;112;CKB -LINE_19;Station-38;2022-03-10 04:44:00;2022-03-10 04:44:00;Station-0;0.06;0;112;CKB -LINE_20;Station-0;2022-03-10 00:32:00;2022-03-10 00:32:00;Station-13;0.06;0;113;CKB -LINE_20;Station-13;2022-03-10 00:32:00;2022-03-10 00:44:00;Station-40;4212;3;113;CKB -LINE_20;Station-40;2022-03-10 00:47:00;2022-03-10 01:16:00;Station-41;13048;0;113;CKB -LINE_20;Station-41;2022-03-10 01:16:00;2022-03-10 01:42:00;Station-40;12869;5;113;CKB -LINE_20;Station-40;2022-03-10 01:47:00;2022-03-10 02:16:00;Station-41;13048;0;113;CKB -LINE_20;Station-41;2022-03-10 02:16:00;2022-03-10 02:42:00;Station-40;12869;5;113;CKB -LINE_20;Station-40;2022-03-10 02:47:00;2022-03-10 03:16:00;Station-41;13048;0;113;CKB -LINE_20;Station-41;2022-03-10 03:16:00;2022-03-10 03:42:00;Station-40;12869;5;113;CKB -LINE_20;Station-40;2022-03-10 03:47:00;2022-03-10 04:16:00;Station-41;13048;0;113;CKB -LINE_20;Station-41;2022-03-10 04:16:00;2022-03-10 04:34:00;Station-42;9538;0;113;CKB -LINE_20;Station-42;2022-03-10 04:34:00;2022-03-10 04:34:00;Station-0;0.06;0;113;CKB -LINE_20;Station-0;2022-03-10 00:17:00;2022-03-10 00:17:00;Station-40;0.06;0;114;CKB -LINE_20;Station-40;2022-03-10 00:17:00;2022-03-10 00:46:00;Station-41;13048;0;114;CKB -LINE_20;Station-41;2022-03-10 00:46:00;2022-03-10 01:12:00;Station-40;12869;5;114;CKB -LINE_20;Station-40;2022-03-10 01:17:00;2022-03-10 01:46:00;Station-41;13048;0;114;CKB -LINE_20;Station-41;2022-03-10 01:46:00;2022-03-10 02:12:00;Station-40;12869;5;114;CKB -LINE_20;Station-40;2022-03-10 02:17:00;2022-03-10 02:46:00;Station-41;13048;0;114;CKB -LINE_20;Station-41;2022-03-10 02:46:00;2022-03-10 03:12:00;Station-40;12869;5;114;CKB -LINE_20;Station-40;2022-03-10 03:17:00;2022-03-10 03:46:00;Station-41;13048;0;114;CKB -LINE_20;Station-41;2022-03-10 03:46:00;2022-03-10 04:12:00;Station-40;12869;5;114;CKB -LINE_20;Station-40;2022-03-10 04:17:00;2022-03-10 04:28:00;Station-13;4316;0;114;CKB -LINE_20;Station-13;2022-03-10 04:28:00;2022-03-10 04:28:00;Station-0;0.06;0;114;CKB -LINE_21;Station-0;2022-03-10 00:49:00;2022-03-10 00:49:00;Station-3;0.06;0;115;CKB -LINE_21;Station-3;2022-03-10 00:49:00;2022-03-10 01:04:00;Station-16;10229;0;115;CKB -LINE_21;Station-16;2022-03-10 01:04:00;2022-03-10 01:19:00;Station-3;11801;0;115;CKB -LINE_21;Station-3;2022-03-10 01:19:00;2022-03-10 01:34:00;Station-16;10229;0;115;CKB -LINE_21;Station-16;2022-03-10 01:34:00;2022-03-10 01:49:00;Station-3;11801;0;115;CKB -LINE_21;Station-3;2022-03-10 01:49:00;2022-03-10 02:04:00;Station-16;10229;0;115;CKB -LINE_21;Station-16;2022-03-10 02:04:00;2022-03-10 02:19:00;Station-3;11801;0;115;CKB -LINE_21;Station-3;2022-03-10 02:19:00;2022-03-10 02:34:00;Station-16;10229;0;115;CKB -LINE_21;Station-16;2022-03-10 02:34:00;2022-03-10 02:49:00;Station-3;11801;0;115;CKB -LINE_21;Station-3;2022-03-10 02:49:00;2022-03-10 03:04:00;Station-16;10229;0;115;CKB -LINE_21;Station-16;2022-03-10 03:04:00;2022-03-10 03:19:00;Station-3;11801;0;115;CKB -LINE_21;Station-3;2022-03-10 03:19:00;2022-03-10 03:34:00;Station-16;10229;0;115;CKB -LINE_21;Station-16;2022-03-10 03:34:00;2022-03-10 03:49:00;Station-3;11801;0;115;CKB -LINE_21;Station-3;2022-03-10 03:49:00;2022-03-10 04:04:00;Station-16;10229;0;115;CKB -LINE_21;Station-16;2022-03-10 04:04:00;2022-03-10 04:19:00;Station-3;11801;23;115;CKB -LINE_22;Station-3;2022-03-10 04:42:00;2022-03-10 05:04:00;Station-43;6.81;0;115;CKB -LINE_22;Station-43;2022-03-10 05:04:00;2022-03-10 05:04:00;Station-0;0.06;0;115;CKB -LINE_8;Station-0;2022-03-10 00:32:00;2022-03-10 00:32:00;Station-13;0.06;0;116;CKB -LINE_8;Station-13;2022-03-10 00:32:00;2022-03-10 00:57:00;Station-21;11545;6;116;CKB -LINE_8;Station-21;2022-03-10 01:03:00;2022-03-10 01:46:00;Station-20;20579;1;116;CKB -LINE_8;Station-20;2022-03-10 01:47:00;2022-03-10 02:25:00;Station-21;20641;8;116;CKB -LINE_8;Station-21;2022-03-10 02:33:00;2022-03-10 03:16:00;Station-20;20579;1;116;CKB -LINE_8;Station-20;2022-03-10 03:17:00;2022-03-10 03:55:00;Station-21;20641;8;116;CKB -LINE_8;Station-21;2022-03-10 04:03:00;2022-03-10 04:28:00;Station-13;11499;0;116;CKB -LINE_8;Station-13;2022-03-10 04:28:00;2022-03-10 04:28:00;Station-0;0.06;0;116;CKB -LINE_8;Station-0;2022-03-10 00:33:00;2022-03-10 00:33:00;Station-21;0.06;0;117;CKB -LINE_8;Station-21;2022-03-10 00:33:00;2022-03-10 01:16:00;Station-20;20579;1;117;CKB -LINE_8;Station-20;2022-03-10 01:17:00;2022-03-10 01:55:00;Station-21;20641;8;117;CKB -LINE_8;Station-21;2022-03-10 02:03:00;2022-03-10 02:46:00;Station-20;20579;1;117;CKB -LINE_8;Station-20;2022-03-10 02:47:00;2022-03-10 03:25:00;Station-21;20641;8;117;CKB -LINE_8;Station-21;2022-03-10 03:33:00;2022-03-10 04:16:00;Station-20;20579;1;117;CKB -LINE_8;Station-20;2022-03-10 04:17:00;2022-03-10 04:51:00;Station-44;18752;0;117;CKB -LINE_8;Station-44;2022-03-10 04:51:00;2022-03-10 04:51:00;Station-0;0.06;0;117;CKB -LINE_23;Station-0;2022-03-10 00:34:00;2022-03-10 00:34:00;Station-45;0.06;0;118;CKB -LINE_23;Station-45;2022-03-10 00:34:00;2022-03-10 01:00:00;Station-46;9016;0;118;CKB -LINE_23;Station-46;2022-03-10 01:00:00;2022-03-10 01:27:00;Station-45;10083;7;118;CKB -LINE_23;Station-45;2022-03-10 01:34:00;2022-03-10 02:00:00;Station-46;9016;0;118;CKB -LINE_23;Station-46;2022-03-10 02:00:00;2022-03-10 02:27:00;Station-45;10083;7;118;CKB -LINE_23;Station-45;2022-03-10 02:34:00;2022-03-10 03:00:00;Station-46;9016;0;118;CKB -LINE_23;Station-46;2022-03-10 03:00:00;2022-03-10 03:27:00;Station-45;10083;7;118;CKB -LINE_23;Station-45;2022-03-10 03:34:00;2022-03-10 04:00:00;Station-46;9016;0;118;CKB -LINE_23;Station-46;2022-03-10 04:00:00;2022-03-10 04:27:00;Station-45;10083;0;118;CKB -LINE_23;Station-45;2022-03-10 04:27:00;2022-03-10 04:27:00;Station-0;0.06;0;118;CKB -LINE_23;Station-0;2022-03-10 00:30:00;2022-03-10 00:30:00;Station-46;0.06;0;119;CKB -LINE_23;Station-46;2022-03-10 00:30:00;2022-03-10 00:57:00;Station-45;10083;7;119;CKB -LINE_23;Station-45;2022-03-10 01:04:00;2022-03-10 01:30:00;Station-46;9016;0;119;CKB -LINE_23;Station-46;2022-03-10 01:30:00;2022-03-10 01:57:00;Station-45;10083;7;119;CKB -LINE_23;Station-45;2022-03-10 02:04:00;2022-03-10 02:30:00;Station-46;9016;0;119;CKB -LINE_23;Station-46;2022-03-10 02:30:00;2022-03-10 02:57:00;Station-45;10083;7;119;CKB -LINE_23;Station-45;2022-03-10 03:04:00;2022-03-10 03:30:00;Station-46;9016;0;119;CKB -LINE_23;Station-46;2022-03-10 03:30:00;2022-03-10 03:57:00;Station-45;10083;7;119;CKB -LINE_23;Station-45;2022-03-10 04:04:00;2022-03-10 04:30:00;Station-46;9016;0;119;CKB -LINE_23;Station-46;2022-03-10 04:30:00;2022-03-10 04:57:00;Station-45;10083;0;119;CKB -LINE_23;Station-45;2022-03-10 04:57:00;2022-03-10 04:57:00;Station-0;0.06;0;119;CKB -LINE_24;Station-0;2022-03-10 00:31:00;2022-03-10 00:31:00;Station-21;0.06;0;120;CKB -LINE_24;Station-21;2022-03-10 00:31:00;2022-03-10 00:44:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 00:44:00;2022-03-10 00:56:00;Station-21;5362;5;120;CKB -LINE_24;Station-21;2022-03-10 01:01:00;2022-03-10 01:14:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 01:14:00;2022-03-10 01:26:00;Station-21;5362;5;120;CKB -LINE_24;Station-21;2022-03-10 01:31:00;2022-03-10 01:44:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 01:44:00;2022-03-10 01:56:00;Station-21;5362;5;120;CKB -LINE_24;Station-21;2022-03-10 02:01:00;2022-03-10 02:14:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 02:14:00;2022-03-10 02:26:00;Station-21;5362;5;120;CKB -LINE_24;Station-21;2022-03-10 02:31:00;2022-03-10 02:44:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 02:44:00;2022-03-10 02:56:00;Station-21;5362;5;120;CKB -LINE_24;Station-21;2022-03-10 03:01:00;2022-03-10 03:14:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 03:14:00;2022-03-10 03:26:00;Station-21;5362;5;120;CKB -LINE_24;Station-21;2022-03-10 03:31:00;2022-03-10 03:44:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 03:44:00;2022-03-10 03:56:00;Station-21;5362;5;120;CKB -LINE_24;Station-21;2022-03-10 04:01:00;2022-03-10 04:14:00;Station-47;4872;0;120;CKB -LINE_24;Station-47;2022-03-10 04:14:00;2022-03-10 04:26:00;Station-21;5362;0;120;CKB -LINE_24;Station-21;2022-03-10 04:26:00;2022-03-10 04:26:00;Station-0;0.06;0;120;CKB -LINE_25;Station-0;2022-03-10 00:31:00;2022-03-10 00:31:00;Station-21;0.06;0;121;CKB -LINE_25;Station-21;2022-03-10 00:31:00;2022-03-10 00:45:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 00:47:00;2022-03-10 01:01:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 01:01:00;2022-03-10 01:15:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 01:17:00;2022-03-10 01:31:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 01:31:00;2022-03-10 01:45:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 01:47:00;2022-03-10 02:01:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 02:01:00;2022-03-10 02:15:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 02:17:00;2022-03-10 02:31:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 02:31:00;2022-03-10 02:45:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 02:47:00;2022-03-10 03:01:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 03:01:00;2022-03-10 03:15:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 03:17:00;2022-03-10 03:31:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 03:31:00;2022-03-10 03:45:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 03:47:00;2022-03-10 04:01:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 04:01:00;2022-03-10 04:15:00;Station-48;5225;2;121;CKB -LINE_25;Station-48;2022-03-10 04:17:00;2022-03-10 04:31:00;Station-21;7617;0;121;CKB -LINE_25;Station-21;2022-03-10 04:31:00;2022-03-10 04:31:00;Station-0;0.06;0;121;CKB -LINE_26;Station-0;2022-03-10 00:43:00;2022-03-10 00:43:00;Station-49;0.06;0;122;CKB -LINE_26;Station-49;2022-03-10 00:43:00;2022-03-10 00:53:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 00:53:00;2022-03-10 01:03:00;Station-49;4408;10;122;CKB -LINE_26;Station-49;2022-03-10 01:13:00;2022-03-10 01:23:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 01:23:00;2022-03-10 01:33:00;Station-49;4408;10;122;CKB -LINE_26;Station-49;2022-03-10 01:43:00;2022-03-10 01:53:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 01:53:00;2022-03-10 02:03:00;Station-49;4408;10;122;CKB -LINE_26;Station-49;2022-03-10 02:13:00;2022-03-10 02:23:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 02:23:00;2022-03-10 02:33:00;Station-49;4408;10;122;CKB -LINE_26;Station-49;2022-03-10 02:43:00;2022-03-10 02:53:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 02:53:00;2022-03-10 03:03:00;Station-49;4408;10;122;CKB -LINE_26;Station-49;2022-03-10 03:13:00;2022-03-10 03:23:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 03:23:00;2022-03-10 03:33:00;Station-49;4408;10;122;CKB -LINE_26;Station-49;2022-03-10 03:43:00;2022-03-10 03:53:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 03:53:00;2022-03-10 04:03:00;Station-49;4408;10;122;CKB -LINE_26;Station-49;2022-03-10 04:13:00;2022-03-10 04:23:00;Station-50;4507;0;122;CKB -LINE_26;Station-50;2022-03-10 04:23:00;2022-03-10 04:33:00;Station-49;4408;0;122;CKB -LINE_26;Station-49;2022-03-10 04:33:00;2022-03-10 04:33:00;Station-0;0.06;0;122;CKB -LINE_0;Station-0;2022-03-10 21:31:00;2022-03-10 21:31:00;Station-1;0.06;0;123;CKB -LINE_0;Station-1;2022-03-10 21:31:00;2022-03-10 22:04:00;Station-2;14519;4;123;CKB -LINE_0;Station-2;2022-03-10 22:08:00;2022-03-10 22:43:00;Station-1;13541;8;123;CKB -LINE_0;Station-1;2022-03-10 22:51:00;2022-03-10 23:24:00;Station-2;14519;4;123;CKB -LINE_0;Station-2;2022-03-10 23:28:00;2022-03-11 00:03:00;Station-1;13541;8;123;CKB -LINE_0;Station-1;2022-03-11 00:11:00;2022-03-11 00:44:00;Station-2;14519;0;123;CKB -LINE_1;Station-2;2022-03-11 00:44:00;2022-03-11 00:54:00;Station-3;4.1;25;123;CKB -LINE_1;Station-3;2022-03-11 01:19:00;2022-03-11 01:42:00;Station-4;8.36;6;123;CKB -LINE_1;Station-4;2022-03-11 01:48:00;2022-03-11 02:06:00;Station-3;9067;13;123;CKB -LINE_1;Station-3;2022-03-11 02:19:00;2022-03-11 02:42:00;Station-4;8.36;6;123;CKB -LINE_1;Station-4;2022-03-11 02:48:00;2022-03-11 03:06:00;Station-3;9067;13;123;CKB -LINE_1;Station-3;2022-03-11 03:19:00;2022-03-11 03:42:00;Station-4;8.36;6;123;CKB -LINE_1;Station-4;2022-03-11 03:48:00;2022-03-11 04:06:00;Station-3;9067;0;123;CKB -LINE_1;Station-3;2022-03-11 04:06:00;2022-03-11 04:06:00;Station-0;0.06;0;123;CKB -LINE_0;Station-0;2022-03-10 22:11:00;2022-03-10 22:11:00;Station-1;0.06;0;124;CKB -LINE_0;Station-1;2022-03-10 22:11:00;2022-03-10 22:44:00;Station-2;14519;4;124;CKB -LINE_0;Station-2;2022-03-10 22:48:00;2022-03-10 23:23:00;Station-1;13541;8;124;CKB -LINE_0;Station-1;2022-03-10 23:31:00;2022-03-11 00:04:00;Station-2;14519;4;124;CKB -LINE_0;Station-2;2022-03-11 00:08:00;2022-03-11 00:39:00;Station-5;12213;0;124;CKB -LINE_1;Station-5;2022-03-11 00:39:00;2022-03-11 00:47:00;Station-3;4.0;2;124;CKB -LINE_1;Station-3;2022-03-11 00:49:00;2022-03-11 01:12:00;Station-4;8.36;6;124;CKB -LINE_1;Station-4;2022-03-11 01:18:00;2022-03-11 01:36:00;Station-3;9067;13;124;CKB -LINE_1;Station-3;2022-03-11 01:49:00;2022-03-11 02:12:00;Station-4;8.36;6;124;CKB -LINE_1;Station-4;2022-03-11 02:18:00;2022-03-11 02:36:00;Station-3;9067;13;124;CKB -LINE_1;Station-3;2022-03-11 02:49:00;2022-03-11 03:12:00;Station-4;8.36;6;124;CKB -LINE_1;Station-4;2022-03-11 03:18:00;2022-03-11 03:36:00;Station-3;9067;13;124;CKB -LINE_1;Station-3;2022-03-11 03:49:00;2022-03-11 04:12:00;Station-4;8.36;0;124;CKB -LINE_1;Station-4;2022-03-11 04:12:00;2022-03-11 04:12:00;Station-0;0.06;0;124;CKB -LINE_2;Station-0;2022-03-10 21:06:00;2022-03-10 21:06:00;Station-6;0.06;0;125;CKB -LINE_2;Station-6;2022-03-10 21:06:00;2022-03-10 21:34:00;Station-7;13018;19;125;CKB -LINE_2;Station-7;2022-03-10 21:53:00;2022-03-10 22:13:00;Station-8;10332;17;125;CKB -LINE_2;Station-8;2022-03-10 22:30:00;2022-03-10 22:54:00;Station-7;10.48;19;125;CKB -LINE_2;Station-7;2022-03-10 23:13:00;2022-03-10 23:33:00;Station-8;10332;17;125;CKB -LINE_2;Station-8;2022-03-10 23:50:00;2022-03-11 00:14:00;Station-7;10.48;2;125;CKB -LINE_2;Station-7;2022-03-11 00:16:00;2022-03-11 00:23:00;Station-9;3709;5;125;CKB -LINE_3;Station-9;2022-03-11 00:28:00;2022-03-11 00:44:00;Station-10;6404;3;125;CKB -LINE_3;Station-10;2022-03-11 00:47:00;2022-03-11 01:10:00;Station-11;10579;7;125;CKB -LINE_3;Station-11;2022-03-11 01:17:00;2022-03-11 01:44:00;Station-10;12007;3;125;CKB -LINE_3;Station-10;2022-03-11 01:47:00;2022-03-11 02:10:00;Station-11;10579;7;125;CKB -LINE_3;Station-11;2022-03-11 02:17:00;2022-03-11 02:44:00;Station-10;12007;3;125;CKB -LINE_3;Station-10;2022-03-11 02:47:00;2022-03-11 03:10:00;Station-11;10579;7;125;CKB -LINE_3;Station-11;2022-03-11 03:17:00;2022-03-11 03:44:00;Station-10;12007;3;125;CKB -LINE_3;Station-10;2022-03-11 03:47:00;2022-03-11 04:10:00;Station-11;10579;7;125;CKB -LINE_3;Station-11;2022-03-11 04:17:00;2022-03-11 04:44:00;Station-10;12007;0;125;CKB -LINE_3;Station-10;2022-03-11 04:44:00;2022-03-11 04:44:00;Station-0;0.06;0;125;CKB -LINE_2;Station-0;2022-03-10 20:26:00;2022-03-10 20:26:00;Station-6;0.06;0;126;CKB -LINE_2;Station-6;2022-03-10 20:26:00;2022-03-10 20:56:00;Station-12;14097;14;126;CKB -LINE_2;Station-12;2022-03-10 21:10:00;2022-03-10 21:38:00;Station-6;13.19;8;126;CKB -LINE_2;Station-6;2022-03-10 21:46:00;2022-03-10 22:14:00;Station-7;13018;19;126;CKB -LINE_2;Station-7;2022-03-10 22:33:00;2022-03-10 22:53:00;Station-8;10332;17;126;CKB -LINE_2;Station-8;2022-03-10 23:10:00;2022-03-10 23:34:00;Station-7;10.48;19;126;CKB -LINE_2;Station-7;2022-03-10 23:53:00;2022-03-11 00:13:00;Station-8;10332;2;126;CKB -LINE_2;Station-8;2022-03-11 00:15:00;2022-03-11 00:16:00;Station-10;506;1;126;CKB -LINE_3;Station-10;2022-03-11 00:17:00;2022-03-11 00:40:00;Station-11;10579;7;126;CKB -LINE_3;Station-11;2022-03-11 00:47:00;2022-03-11 01:14:00;Station-10;12007;3;126;CKB -LINE_3;Station-10;2022-03-11 01:17:00;2022-03-11 01:40:00;Station-11;10579;7;126;CKB -LINE_3;Station-11;2022-03-11 01:47:00;2022-03-11 02:14:00;Station-10;12007;3;126;CKB -LINE_3;Station-10;2022-03-11 02:17:00;2022-03-11 02:40:00;Station-11;10579;7;126;CKB -LINE_3;Station-11;2022-03-11 02:47:00;2022-03-11 03:14:00;Station-10;12007;3;126;CKB -LINE_3;Station-10;2022-03-11 03:17:00;2022-03-11 03:40:00;Station-11;10579;7;126;CKB -LINE_3;Station-11;2022-03-11 03:47:00;2022-03-11 04:14:00;Station-10;12007;3;126;CKB -LINE_3;Station-10;2022-03-11 04:17:00;2022-03-11 04:40:00;Station-11;10579;3;126;CKB -LINE_4;Station-11;2022-03-11 04:43:00;2022-03-11 04:58:00;Station-13;6161;0;126;CKB -LINE_4;Station-13;2022-03-11 04:58:00;2022-03-11 04:58:00;Station-0;0.06;0;126;CKB -LINE_5;Station-0;2022-03-10 22:56:00;2022-03-10 22:56:00;Station-14;0.06;0;127;CKB -LINE_5;Station-14;2022-03-10 22:56:00;2022-03-10 23:08:00;Station-15;5882;3;127;CKB -LINE_5;Station-15;2022-03-10 23:11:00;2022-03-10 23:25:00;Station-14;6232;0;127;CKB -LINE_5;Station-14;2022-03-10 23:25:00;2022-03-10 23:38:00;Station-15;6086;3;127;CKB -LINE_5;Station-15;2022-03-10 23:41:00;2022-03-10 23:55:00;Station-14;6232;0;127;CKB -LINE_5;Station-14;2022-03-10 23:55:00;2022-03-11 00:08:00;Station-15;6086;0;127;CKB -LINE_5;Station-15;2022-03-11 00:08:00;2022-03-11 00:08:00;Station-0;0.06;0;127;CKB -LINE_6;Station-0;2022-03-10 05:05:00;2022-03-10 05:05:00;Station-16;0.06;0;128;CKB -LINE_6;Station-16;2022-03-10 05:05:00;2022-03-10 05:14:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 05:14:00;2022-03-10 05:23:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 05:25:00;2022-03-10 05:34:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 05:34:00;2022-03-10 05:43:00;Station-16;5139;23;128;CKB -LINE_6;Station-16;2022-03-10 06:06:00;2022-03-10 06:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 06:15:00;2022-03-10 06:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 06:26:00;2022-03-10 06:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 06:35:00;2022-03-10 06:44:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 06:46:00;2022-03-10 06:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 06:55:00;2022-03-10 07:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 07:06:00;2022-03-10 07:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 07:15:00;2022-03-10 07:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 07:26:00;2022-03-10 07:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 07:35:00;2022-03-10 07:44:00;Station-16;5139;22;128;CKB -LINE_6;Station-16;2022-03-10 08:06:00;2022-03-10 08:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 08:15:00;2022-03-10 08:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 08:26:00;2022-03-10 08:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 08:35:00;2022-03-10 08:44:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 08:46:00;2022-03-10 08:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 08:55:00;2022-03-10 09:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 09:06:00;2022-03-10 09:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 09:15:00;2022-03-10 09:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 09:26:00;2022-03-10 09:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 09:35:00;2022-03-10 09:44:00;Station-16;5139;22;128;CKB -LINE_6;Station-16;2022-03-10 10:06:00;2022-03-10 10:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 10:15:00;2022-03-10 10:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 10:26:00;2022-03-10 10:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 10:35:00;2022-03-10 10:44:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 10:46:00;2022-03-10 10:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 10:55:00;2022-03-10 11:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 11:06:00;2022-03-10 11:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 11:15:00;2022-03-10 11:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 11:26:00;2022-03-10 11:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 11:35:00;2022-03-10 11:44:00;Station-16;5139;22;128;CKB -LINE_6;Station-16;2022-03-10 12:06:00;2022-03-10 12:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 12:15:00;2022-03-10 12:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 12:26:00;2022-03-10 12:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 12:35:00;2022-03-10 12:44:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 12:46:00;2022-03-10 12:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 12:55:00;2022-03-10 13:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 13:06:00;2022-03-10 13:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 13:15:00;2022-03-10 13:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 13:26:00;2022-03-10 13:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 13:35:00;2022-03-10 13:44:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 13:46:00;2022-03-10 13:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 13:55:00;2022-03-10 14:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 14:06:00;2022-03-10 14:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 14:15:00;2022-03-10 14:24:00;Station-16;5139;22;128;CKB -LINE_6;Station-16;2022-03-10 14:46:00;2022-03-10 14:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 14:55:00;2022-03-10 15:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 15:06:00;2022-03-10 15:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 15:15:00;2022-03-10 15:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 15:26:00;2022-03-10 15:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 15:35:00;2022-03-10 15:44:00;Station-16;5139;22;128;CKB -LINE_6;Station-16;2022-03-10 16:06:00;2022-03-10 16:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 16:15:00;2022-03-10 16:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 16:26:00;2022-03-10 16:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 16:35:00;2022-03-10 16:44:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 16:46:00;2022-03-10 16:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 16:55:00;2022-03-10 17:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 17:06:00;2022-03-10 17:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 17:15:00;2022-03-10 17:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 17:26:00;2022-03-10 17:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 17:35:00;2022-03-10 17:44:00;Station-16;5139;22;128;CKB -LINE_6;Station-16;2022-03-10 18:06:00;2022-03-10 18:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 18:15:00;2022-03-10 18:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 18:26:00;2022-03-10 18:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 18:35:00;2022-03-10 18:44:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 18:46:00;2022-03-10 18:55:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 18:55:00;2022-03-10 19:04:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 19:06:00;2022-03-10 19:15:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 19:15:00;2022-03-10 19:24:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 19:26:00;2022-03-10 19:35:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 19:35:00;2022-03-10 19:44:00;Station-16;5139;21;128;CKB -LINE_6;Station-16;2022-03-10 20:05:00;2022-03-10 20:14:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 20:14:00;2022-03-10 20:23:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 20:25:00;2022-03-10 20:34:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 20:34:00;2022-03-10 20:43:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 20:45:00;2022-03-10 20:54:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 20:54:00;2022-03-10 21:03:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 21:05:00;2022-03-10 21:14:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 21:14:00;2022-03-10 21:23:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 21:25:00;2022-03-10 21:34:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 21:34:00;2022-03-10 21:43:00;Station-16;5139;22;128;CKB -LINE_6;Station-16;2022-03-10 22:05:00;2022-03-10 22:14:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 22:14:00;2022-03-10 22:23:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 22:25:00;2022-03-10 22:34:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 22:34:00;2022-03-10 22:43:00;Station-16;5139;2;128;CKB -LINE_6;Station-16;2022-03-10 22:45:00;2022-03-10 22:54:00;Station-17;4781;0;128;CKB -LINE_6;Station-17;2022-03-10 22:54:00;2022-03-10 23:03:00;Station-16;5139;0;128;CKB -LINE_6;Station-16;2022-03-10 23:03:00;2022-03-10 23:03:00;Station-0;0.06;0;128;CKB -LINE_7;Station-0;2022-03-11 00:06:00;2022-03-11 00:06:00;Station-18;0.06;0;129;CKB -LINE_7;Station-18;2022-03-11 00:06:00;2022-03-11 00:27:00;Station-19;7827;0;129;CKB -LINE_8;Station-19;2022-03-11 00:27:00;2022-03-11 00:48:00;Station-20;11079;0;129;CKB -LINE_8;Station-20;2022-03-11 00:48:00;2022-03-11 01:25:00;Station-21;20641;8;129;CKB -LINE_8;Station-21;2022-03-11 01:33:00;2022-03-11 02:16:00;Station-20;20579;1;129;CKB -LINE_8;Station-20;2022-03-11 02:17:00;2022-03-11 02:55:00;Station-21;20641;8;129;CKB -LINE_8;Station-21;2022-03-11 03:03:00;2022-03-11 03:46:00;Station-20;20579;1;129;CKB -LINE_8;Station-20;2022-03-11 03:47:00;2022-03-11 04:25:00;Station-21;20641;0;129;CKB -LINE_8;Station-21;2022-03-11 04:25:00;2022-03-11 04:25:00;Station-0;0.06;0;129;CKB -LINE_9;Station-22;2022-03-10 05:15:00;2022-03-10 06:01:00;Station-23;17.9;0;130;VDL -LINE_9;Station-23;2022-03-10 06:01:00;2022-03-10 06:15:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 06:23:00;2022-03-10 06:37:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 06:41:00;2022-03-10 06:55:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 07:03:00;2022-03-10 07:17:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 07:21:00;2022-03-10 07:35:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 07:43:00;2022-03-10 07:57:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 08:01:00;2022-03-10 08:15:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 08:23:00;2022-03-10 08:37:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 08:41:00;2022-03-10 08:55:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 09:03:00;2022-03-10 09:17:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 09:21:00;2022-03-10 09:35:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 09:43:00;2022-03-10 09:57:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 10:01:00;2022-03-10 10:15:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 10:23:00;2022-03-10 10:37:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 10:41:00;2022-03-10 10:55:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 11:03:00;2022-03-10 11:17:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 11:21:00;2022-03-10 11:35:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 11:43:00;2022-03-10 11:57:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 12:01:00;2022-03-10 12:15:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 12:23:00;2022-03-10 12:37:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 12:41:00;2022-03-10 12:55:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 13:03:00;2022-03-10 13:17:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 13:21:00;2022-03-10 13:35:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 13:43:00;2022-03-10 13:57:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 14:01:00;2022-03-10 14:15:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 14:23:00;2022-03-10 14:37:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 14:41:00;2022-03-10 14:55:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 15:03:00;2022-03-10 15:17:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 15:21:00;2022-03-10 15:35:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 15:43:00;2022-03-10 15:57:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 16:01:00;2022-03-10 16:15:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 16:23:00;2022-03-10 16:37:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 16:41:00;2022-03-10 16:55:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 17:03:00;2022-03-10 17:17:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 17:21:00;2022-03-10 17:35:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 17:43:00;2022-03-10 17:57:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 18:01:00;2022-03-10 18:15:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 18:23:00;2022-03-10 18:37:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 18:41:00;2022-03-10 18:55:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 19:03:00;2022-03-10 19:17:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 19:21:00;2022-03-10 19:35:00;Station-23;4637;8;130;VDL -LINE_9;Station-23;2022-03-10 19:43:00;2022-03-10 19:57:00;Station-23;4637;4;130;VDL -LINE_9;Station-23;2022-03-10 20:01:00;2022-03-10 20:14:00;Station-23;4637;9;130;VDL -LINE_9;Station-23;2022-03-10 20:23:00;2022-03-10 20:36:00;Station-23;4637;0;130;VDL -LINE_9;Station-23;2022-03-10 20:36:00;2022-03-10 21:15:00;Station-22;19.8;0;130;VDL -LINE_10;Station-0;2022-03-10 04:56:00;2022-03-10 04:56:00;Station-24;0.06;18;131;CKB -LINE_10;Station-24;2022-03-10 05:14:00;2022-03-10 05:20:00;Station-25;3.29;0;131;CKB -LINE_10;Station-25;2022-03-10 05:20:00;2022-03-10 05:24:00;Station-24;2954;20;131;CKB -LINE_10;Station-24;2022-03-10 05:44:00;2022-03-10 05:50:00;Station-25;3.29;0;131;CKB -LINE_10;Station-25;2022-03-10 05:50:00;2022-03-10 05:54:00;Station-24;2954;5;131;CKB -LINE_10;Station-24;2022-03-10 05:59:00;2022-03-10 06:06:00;Station-25;3.29;2;131;CKB -LINE_10;Station-25;2022-03-10 06:08:00;2022-03-10 06:13:00;Station-24;2954;19;131;CKB -LINE_10;Station-24;2022-03-10 06:32:00;2022-03-10 06:39:00;Station-25;3.29;1;131;CKB -LINE_10;Station-25;2022-03-10 06:40:00;2022-03-10 06:45:00;Station-24;2954;7;131;CKB -LINE_10;Station-24;2022-03-10 06:52:00;2022-03-10 06:59:00;Station-25;3.29;1;131;CKB -LINE_10;Station-25;2022-03-10 07:00:00;2022-03-10 07:05:00;Station-24;2954;7;131;CKB -LINE_10;Station-24;2022-03-10 07:12:00;2022-03-10 07:19:00;Station-25;3.29;1;131;CKB -LINE_10;Station-25;2022-03-10 07:20:00;2022-03-10 07:25:00;Station-24;2954;7;131;CKB -LINE_10;Station-24;2022-03-10 07:32:00;2022-03-10 07:39:00;Station-25;3.29;1;131;CKB -LINE_10;Station-25;2022-03-10 07:40:00;2022-03-10 07:45:00;Station-24;2954;295;131;CKB -LINE_10;Station-24;2022-03-10 12:40:00;2022-03-10 12:47:00;Station-25;3.29;2;131;CKB -LINE_10;Station-25;2022-03-10 12:49:00;2022-03-10 12:54:00;Station-24;2954;46;131;CKB -LINE_10;Station-24;2022-03-10 13:40:00;2022-03-10 13:47:00;Station-25;3.29;2;131;CKB -LINE_10;Station-25;2022-03-10 13:49:00;2022-03-10 13:54:00;Station-24;2954;434;131;CKB -LINE_10;Station-24;2022-03-10 21:08:00;2022-03-10 21:08:00;Station-0;0.06;0;131;CKB -LINE_11;Station-0;2022-03-10 07:20:00;2022-03-10 07:20:00;Station-26;0.06;0;132;CKB -LINE_11;Station-26;2022-03-10 07:20:00;2022-03-10 07:50:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 08:00:00;2022-03-10 08:30:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 08:40:00;2022-03-10 09:10:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 09:20:00;2022-03-10 09:50:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 10:00:00;2022-03-10 10:30:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 10:40:00;2022-03-10 11:10:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 11:20:00;2022-03-10 11:50:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 12:00:00;2022-03-10 12:30:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 12:40:00;2022-03-10 13:10:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 13:20:00;2022-03-10 13:50:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 14:00:00;2022-03-10 14:30:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 14:40:00;2022-03-10 15:10:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 15:20:00;2022-03-10 15:50:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 16:00:00;2022-03-10 16:30:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 16:40:00;2022-03-10 17:10:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 17:20:00;2022-03-10 17:50:00;Station-26;9266;10;132;CKB -LINE_11;Station-26;2022-03-10 18:00:00;2022-03-10 18:30:00;Station-26;9266;0;132;CKB -LINE_11;Station-26;2022-03-10 18:30:00;2022-03-10 18:30:00;Station-0;0.06;0;132;CKB -LINE_12;Station-0;2022-03-10 07:10:00;2022-03-10 07:10:00;Station-27;0.06;0;133;CKB -LINE_12;Station-27;2022-03-10 07:10:00;2022-03-10 07:18:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 07:28:00;2022-03-10 07:40:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 07:40:00;2022-03-10 07:48:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 07:58:00;2022-03-10 08:10:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 08:10:00;2022-03-10 08:18:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 08:28:00;2022-03-10 08:40:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 08:40:00;2022-03-10 08:48:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 08:58:00;2022-03-10 09:10:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 09:10:00;2022-03-10 09:18:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 09:28:00;2022-03-10 09:40:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 09:40:00;2022-03-10 09:48:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 09:58:00;2022-03-10 10:10:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 10:10:00;2022-03-10 10:18:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 10:28:00;2022-03-10 10:40:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 10:40:00;2022-03-10 10:48:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 10:58:00;2022-03-10 11:10:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 11:10:00;2022-03-10 11:18:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 11:28:00;2022-03-10 11:40:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 11:40:00;2022-03-10 11:48:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 11:58:00;2022-03-10 12:10:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 12:10:00;2022-03-10 12:18:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 12:28:00;2022-03-10 12:40:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 12:40:00;2022-03-10 12:48:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 12:58:00;2022-03-10 13:10:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 13:10:00;2022-03-10 13:18:00;Station-28;2169;10;133;CKB -LINE_12;Station-28;2022-03-10 13:28:00;2022-03-10 13:40:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 13:40:00;2022-03-10 13:48:00;Station-28;2169;8;133;CKB -LINE_12;Station-28;2022-03-10 13:56:00;2022-03-10 14:10:00;Station-27;2952;0;133;CKB -LINE_12;Station-27;2022-03-10 14:10:00;2022-03-10 14:19:00;Station-28;2169;14;133;CKB -LINE_12;Station-28;2022-03-10 14:33:00;2022-03-10 14:47:00;Station-27;2952;3;133;CKB -LINE_12;Station-27;2022-03-10 14:50:00;2022-03-10 14:59:00;Station-28;2169;14;133;CKB -LINE_12;Station-28;2022-03-10 15:13:00;2022-03-10 15:27:00;Station-27;2952;3;133;CKB -LINE_12;Station-27;2022-03-10 15:30:00;2022-03-10 15:39:00;Station-28;2169;14;133;CKB -LINE_12;Station-28;2022-03-10 15:53:00;2022-03-10 16:07:00;Station-27;2952;3;133;CKB -LINE_12;Station-27;2022-03-10 16:10:00;2022-03-10 16:19:00;Station-28;2169;14;133;CKB -LINE_12;Station-28;2022-03-10 16:33:00;2022-03-10 16:47:00;Station-27;2952;3;133;CKB -LINE_12;Station-27;2022-03-10 16:50:00;2022-03-10 16:59:00;Station-28;2169;14;133;CKB -LINE_12;Station-28;2022-03-10 17:13:00;2022-03-10 17:27:00;Station-27;2952;3;133;CKB -LINE_12;Station-27;2022-03-10 17:30:00;2022-03-10 17:39:00;Station-28;2169;13;133;CKB -LINE_12;Station-28;2022-03-10 17:52:00;2022-03-10 18:05:00;Station-27;2952;5;133;CKB -LINE_12;Station-27;2022-03-10 18:10:00;2022-03-10 18:18:00;Station-28;2169;0;133;CKB -LINE_12;Station-28;2022-03-10 18:18:00;2022-03-10 18:18:00;Station-0;0.06;0;133;CKB -LINE_12;Station-0;2022-03-10 14:13:00;2022-03-10 14:13:00;Station-28;0.06;0;134;CKB -LINE_12;Station-28;2022-03-10 14:13:00;2022-03-10 14:27:00;Station-27;2952;3;134;CKB -LINE_12;Station-27;2022-03-10 14:30:00;2022-03-10 14:39:00;Station-28;2169;14;134;CKB -LINE_12;Station-28;2022-03-10 14:53:00;2022-03-10 15:07:00;Station-27;2952;3;134;CKB -LINE_12;Station-27;2022-03-10 15:10:00;2022-03-10 15:19:00;Station-28;2169;14;134;CKB -LINE_12;Station-28;2022-03-10 15:33:00;2022-03-10 15:47:00;Station-27;2952;3;134;CKB -LINE_12;Station-27;2022-03-10 15:50:00;2022-03-10 15:59:00;Station-28;2169;14;134;CKB -LINE_12;Station-28;2022-03-10 16:13:00;2022-03-10 16:27:00;Station-27;2952;3;134;CKB -LINE_12;Station-27;2022-03-10 16:30:00;2022-03-10 16:39:00;Station-28;2169;14;134;CKB -LINE_12;Station-28;2022-03-10 16:53:00;2022-03-10 17:07:00;Station-27;2952;3;134;CKB -LINE_12;Station-27;2022-03-10 17:10:00;2022-03-10 17:19:00;Station-28;2169;14;134;CKB -LINE_12;Station-28;2022-03-10 17:33:00;2022-03-10 17:47:00;Station-27;2952;3;134;CKB -LINE_12;Station-27;2022-03-10 17:50:00;2022-03-10 17:59:00;Station-28;2169;14;134;CKB -LINE_12;Station-28;2022-03-10 18:13:00;2022-03-10 18:25:00;Station-27;2952;0;134;CKB -LINE_12;Station-27;2022-03-10 18:25:00;2022-03-10 18:25:00;Station-0;0.06;0;134;CKB -LINE_13;Station-0;2022-03-11 00:23:00;2022-03-11 00:23:00;Station-29;0.06;0;135;CKB -LINE_13;Station-29;2022-03-11 00:23:00;2022-03-11 00:30:00;Station-30;2577;9;135;CKB -LINE_14;Station-30;2022-03-11 00:39:00;2022-03-11 00:54:00;Station-31;5937;9;135;CKB -LINE_14;Station-31;2022-03-11 01:03:00;2022-03-11 01:17:00;Station-30;6.19;0;135;CKB -LINE_13;Station-30;2022-03-11 01:17:00;2022-03-11 01:23:00;Station-29;2555;0;135;CKB -LINE_13;Station-29;2022-03-11 01:23:00;2022-03-11 01:30:00;Station-30;2577;9;135;CKB -LINE_14;Station-30;2022-03-11 01:39:00;2022-03-11 01:54:00;Station-31;5937;9;135;CKB -LINE_14;Station-31;2022-03-11 02:03:00;2022-03-11 02:17:00;Station-30;6.19;0;135;CKB -LINE_13;Station-30;2022-03-11 02:17:00;2022-03-11 02:23:00;Station-29;2555;0;135;CKB -LINE_13;Station-29;2022-03-11 02:23:00;2022-03-11 02:30:00;Station-30;2577;9;135;CKB -LINE_14;Station-30;2022-03-11 02:39:00;2022-03-11 02:54:00;Station-31;5937;9;135;CKB -LINE_14;Station-31;2022-03-11 03:03:00;2022-03-11 03:17:00;Station-30;6.19;0;135;CKB -LINE_13;Station-30;2022-03-11 03:17:00;2022-03-11 03:23:00;Station-29;2555;0;135;CKB -LINE_13;Station-29;2022-03-11 03:23:00;2022-03-11 03:30:00;Station-30;2577;9;135;CKB -LINE_14;Station-30;2022-03-11 03:39:00;2022-03-11 03:54:00;Station-31;5937;9;135;CKB -LINE_14;Station-31;2022-03-11 04:03:00;2022-03-11 04:17:00;Station-30;6.19;0;135;CKB -LINE_13;Station-30;2022-03-11 04:17:00;2022-03-11 04:23:00;Station-29;2555;0;135;CKB -LINE_13;Station-29;2022-03-11 04:23:00;2022-03-11 04:23:00;Station-0;0.06;0;135;CKB -LINE_14;Station-0;2022-03-11 00:33:00;2022-03-11 00:33:00;Station-31;0.06;0;136;CKB -LINE_14;Station-31;2022-03-11 00:33:00;2022-03-11 00:47:00;Station-30;6.19;0;136;CKB -LINE_13;Station-30;2022-03-11 00:47:00;2022-03-11 00:53:00;Station-29;2555;0;136;CKB -LINE_13;Station-29;2022-03-11 00:53:00;2022-03-11 01:00:00;Station-30;2577;9;136;CKB -LINE_14;Station-30;2022-03-11 01:09:00;2022-03-11 01:24:00;Station-31;5937;9;136;CKB -LINE_14;Station-31;2022-03-11 01:33:00;2022-03-11 01:47:00;Station-30;6.19;0;136;CKB -LINE_13;Station-30;2022-03-11 01:47:00;2022-03-11 01:53:00;Station-29;2555;0;136;CKB -LINE_13;Station-29;2022-03-11 01:53:00;2022-03-11 02:00:00;Station-30;2577;9;136;CKB -LINE_14;Station-30;2022-03-11 02:09:00;2022-03-11 02:24:00;Station-31;5937;9;136;CKB -LINE_14;Station-31;2022-03-11 02:33:00;2022-03-11 02:47:00;Station-30;6.19;0;136;CKB -LINE_13;Station-30;2022-03-11 02:47:00;2022-03-11 02:53:00;Station-29;2555;0;136;CKB -LINE_13;Station-29;2022-03-11 02:53:00;2022-03-11 03:00:00;Station-30;2577;9;136;CKB -LINE_14;Station-30;2022-03-11 03:09:00;2022-03-11 03:24:00;Station-31;5937;9;136;CKB -LINE_14;Station-31;2022-03-11 03:33:00;2022-03-11 03:47:00;Station-30;6.19;0;136;CKB -LINE_13;Station-30;2022-03-11 03:47:00;2022-03-11 03:53:00;Station-29;2555;0;136;CKB -LINE_13;Station-29;2022-03-11 03:53:00;2022-03-11 04:00:00;Station-30;2577;9;136;CKB -LINE_14;Station-30;2022-03-11 04:09:00;2022-03-11 04:24:00;Station-31;5937;0;136;CKB -LINE_14;Station-31;2022-03-11 04:24:00;2022-03-11 04:24:00;Station-0;0.06;0;136;CKB -LINE_15;Station-0;2022-03-11 00:57:00;2022-03-11 00:57:00;Station-32;0.06;0;137;CKB -LINE_15;Station-32;2022-03-11 00:57:00;2022-03-11 01:06:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 01:06:00;2022-03-11 01:11:00;Station-32;2936;16;137;CKB -LINE_15;Station-32;2022-03-11 01:27:00;2022-03-11 01:36:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 01:36:00;2022-03-11 01:41:00;Station-32;2936;16;137;CKB -LINE_15;Station-32;2022-03-11 01:57:00;2022-03-11 02:06:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 02:06:00;2022-03-11 02:11:00;Station-32;2936;16;137;CKB -LINE_15;Station-32;2022-03-11 02:27:00;2022-03-11 02:36:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 02:36:00;2022-03-11 02:41:00;Station-32;2936;16;137;CKB -LINE_15;Station-32;2022-03-11 02:57:00;2022-03-11 03:06:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 03:06:00;2022-03-11 03:11:00;Station-32;2936;16;137;CKB -LINE_15;Station-32;2022-03-11 03:27:00;2022-03-11 03:36:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 03:36:00;2022-03-11 03:41:00;Station-32;2936;16;137;CKB -LINE_15;Station-32;2022-03-11 03:57:00;2022-03-11 04:06:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 04:06:00;2022-03-11 04:11:00;Station-32;2936;16;137;CKB -LINE_15;Station-32;2022-03-11 04:27:00;2022-03-11 04:36:00;Station-33;4343;0;137;CKB -LINE_15;Station-33;2022-03-11 04:36:00;2022-03-11 04:36:00;Station-0;0.06;0;137;CKB -LINE_16;Station-0;2022-03-11 00:29:00;2022-03-11 00:29:00;Station-34;0.06;0;138;CKB -LINE_16;Station-34;2022-03-11 00:29:00;2022-03-11 00:41:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 00:47:00;2022-03-11 00:57:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 00:59:00;2022-03-11 01:11:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 01:17:00;2022-03-11 01:27:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 01:29:00;2022-03-11 01:41:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 01:47:00;2022-03-11 01:57:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 01:59:00;2022-03-11 02:11:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 02:17:00;2022-03-11 02:27:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 02:29:00;2022-03-11 02:41:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 02:47:00;2022-03-11 02:57:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 02:59:00;2022-03-11 03:11:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 03:17:00;2022-03-11 03:27:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 03:29:00;2022-03-11 03:41:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 03:47:00;2022-03-11 03:57:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 03:59:00;2022-03-11 04:11:00;Station-35;4481;6;138;CKB -LINE_16;Station-35;2022-03-11 04:17:00;2022-03-11 04:27:00;Station-34;4031;2;138;CKB -LINE_16;Station-34;2022-03-11 04:29:00;2022-03-11 04:41:00;Station-35;4481;0;138;CKB -LINE_16;Station-35;2022-03-11 04:41:00;2022-03-11 04:41:00;Station-0;0.06;0;138;CKB -LINE_17;Station-0;2022-03-11 00:30:00;2022-03-11 00:30:00;Station-34;0.06;0;139;CKB -LINE_17;Station-34;2022-03-11 00:30:00;2022-03-11 00:44:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 00:44:00;2022-03-11 00:57:00;Station-34;5302;3;139;CKB -LINE_17;Station-34;2022-03-11 01:00:00;2022-03-11 01:14:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 01:14:00;2022-03-11 01:27:00;Station-34;5302;3;139;CKB -LINE_17;Station-34;2022-03-11 01:30:00;2022-03-11 01:44:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 01:44:00;2022-03-11 01:57:00;Station-34;5302;3;139;CKB -LINE_17;Station-34;2022-03-11 02:00:00;2022-03-11 02:14:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 02:14:00;2022-03-11 02:27:00;Station-34;5302;3;139;CKB -LINE_17;Station-34;2022-03-11 02:30:00;2022-03-11 02:44:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 02:44:00;2022-03-11 02:57:00;Station-34;5302;3;139;CKB -LINE_17;Station-34;2022-03-11 03:00:00;2022-03-11 03:14:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 03:14:00;2022-03-11 03:27:00;Station-34;5302;3;139;CKB -LINE_17;Station-34;2022-03-11 03:30:00;2022-03-11 03:44:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 03:44:00;2022-03-11 03:57:00;Station-34;5302;3;139;CKB -LINE_17;Station-34;2022-03-11 04:00:00;2022-03-11 04:14:00;Station-36;4801;0;139;CKB -LINE_17;Station-36;2022-03-11 04:14:00;2022-03-11 04:27:00;Station-34;5302;0;139;CKB -LINE_17;Station-34;2022-03-11 04:27:00;2022-03-11 04:27:00;Station-0;0.06;0;139;CKB -LINE_18;Station-0;2022-03-11 00:43:00;2022-03-11 00:43:00;Station-37;0.06;0;140;CKB -LINE_18;Station-37;2022-03-11 00:43:00;2022-03-11 01:33:00;Station-37;20434;10;140;CKB -LINE_18;Station-37;2022-03-11 01:43:00;2022-03-11 02:33:00;Station-37;20434;10;140;CKB -LINE_18;Station-37;2022-03-11 02:43:00;2022-03-11 03:33:00;Station-37;20434;10;140;CKB -LINE_18;Station-37;2022-03-11 03:43:00;2022-03-11 04:33:00;Station-37;20434;0;140;CKB -LINE_18;Station-37;2022-03-11 04:33:00;2022-03-11 04:33:00;Station-0;0.06;0;140;CKB -LINE_18;Station-0;2022-03-11 00:13:00;2022-03-11 00:13:00;Station-37;0.06;0;141;CKB -LINE_18;Station-37;2022-03-11 00:13:00;2022-03-11 01:03:00;Station-37;20434;10;141;CKB -LINE_18;Station-37;2022-03-11 01:13:00;2022-03-11 02:03:00;Station-37;20434;10;141;CKB -LINE_18;Station-37;2022-03-11 02:13:00;2022-03-11 03:03:00;Station-37;20434;10;141;CKB -LINE_18;Station-37;2022-03-11 03:13:00;2022-03-11 04:03:00;Station-37;20434;0;141;CKB -LINE_18;Station-37;2022-03-11 04:03:00;2022-03-11 04:03:00;Station-0;0.06;0;141;CKB -LINE_19;Station-0;2022-03-11 00:24:00;2022-03-11 00:24:00;Station-38;0.06;0;142;CKB -LINE_19;Station-38;2022-03-11 00:24:00;2022-03-11 00:48:00;Station-39;11.86;4;142;CKB -LINE_19;Station-39;2022-03-11 00:52:00;2022-03-11 01:14:00;Station-38;11139;10;142;CKB -LINE_19;Station-38;2022-03-11 01:24:00;2022-03-11 01:48:00;Station-39;11.86;4;142;CKB -LINE_19;Station-39;2022-03-11 01:52:00;2022-03-11 02:14:00;Station-38;11139;10;142;CKB -LINE_19;Station-38;2022-03-11 02:24:00;2022-03-11 02:48:00;Station-39;11.86;4;142;CKB -LINE_19;Station-39;2022-03-11 02:52:00;2022-03-11 03:14:00;Station-38;11139;10;142;CKB -LINE_19;Station-38;2022-03-11 03:24:00;2022-03-11 03:48:00;Station-39;11.86;4;142;CKB -LINE_19;Station-39;2022-03-11 03:52:00;2022-03-11 04:14:00;Station-38;11139;0;142;CKB -LINE_19;Station-38;2022-03-11 04:14:00;2022-03-11 04:14:00;Station-0;0.06;0;142;CKB -LINE_19;Station-0;2022-03-11 00:22:00;2022-03-11 00:22:00;Station-39;0.06;0;143;CKB -LINE_19;Station-39;2022-03-11 00:22:00;2022-03-11 00:44:00;Station-38;11139;10;143;CKB -LINE_19;Station-38;2022-03-11 00:54:00;2022-03-11 01:18:00;Station-39;11.86;4;143;CKB -LINE_19;Station-39;2022-03-11 01:22:00;2022-03-11 01:44:00;Station-38;11139;10;143;CKB -LINE_19;Station-38;2022-03-11 01:54:00;2022-03-11 02:18:00;Station-39;11.86;4;143;CKB -LINE_19;Station-39;2022-03-11 02:22:00;2022-03-11 02:44:00;Station-38;11139;10;143;CKB -LINE_19;Station-38;2022-03-11 02:54:00;2022-03-11 03:18:00;Station-39;11.86;4;143;CKB -LINE_19;Station-39;2022-03-11 03:22:00;2022-03-11 03:44:00;Station-38;11139;10;143;CKB -LINE_19;Station-38;2022-03-11 03:54:00;2022-03-11 04:18:00;Station-39;11.86;4;143;CKB -LINE_19;Station-39;2022-03-11 04:22:00;2022-03-11 04:44:00;Station-38;11139;0;143;CKB -LINE_19;Station-38;2022-03-11 04:44:00;2022-03-11 04:44:00;Station-0;0.06;0;143;CKB -LINE_20;Station-0;2022-03-11 00:32:00;2022-03-11 00:32:00;Station-13;0.06;0;144;CKB -LINE_20;Station-13;2022-03-11 00:32:00;2022-03-11 00:44:00;Station-40;4212;3;144;CKB -LINE_20;Station-40;2022-03-11 00:47:00;2022-03-11 01:16:00;Station-41;13048;0;144;CKB -LINE_20;Station-41;2022-03-11 01:16:00;2022-03-11 01:42:00;Station-40;12869;5;144;CKB -LINE_20;Station-40;2022-03-11 01:47:00;2022-03-11 02:16:00;Station-41;13048;0;144;CKB -LINE_20;Station-41;2022-03-11 02:16:00;2022-03-11 02:42:00;Station-40;12869;5;144;CKB -LINE_20;Station-40;2022-03-11 02:47:00;2022-03-11 03:16:00;Station-41;13048;0;144;CKB -LINE_20;Station-41;2022-03-11 03:16:00;2022-03-11 03:42:00;Station-40;12869;5;144;CKB -LINE_20;Station-40;2022-03-11 03:47:00;2022-03-11 04:16:00;Station-41;13048;0;144;CKB -LINE_20;Station-41;2022-03-11 04:16:00;2022-03-11 04:34:00;Station-42;9538;0;144;CKB -LINE_20;Station-42;2022-03-11 04:34:00;2022-03-11 04:34:00;Station-0;0.06;0;144;CKB -LINE_20;Station-0;2022-03-11 00:17:00;2022-03-11 00:17:00;Station-40;0.06;0;145;CKB -LINE_20;Station-40;2022-03-11 00:17:00;2022-03-11 00:46:00;Station-41;13048;0;145;CKB -LINE_20;Station-41;2022-03-11 00:46:00;2022-03-11 01:12:00;Station-40;12869;5;145;CKB -LINE_20;Station-40;2022-03-11 01:17:00;2022-03-11 01:46:00;Station-41;13048;0;145;CKB -LINE_20;Station-41;2022-03-11 01:46:00;2022-03-11 02:12:00;Station-40;12869;5;145;CKB -LINE_20;Station-40;2022-03-11 02:17:00;2022-03-11 02:46:00;Station-41;13048;0;145;CKB -LINE_20;Station-41;2022-03-11 02:46:00;2022-03-11 03:12:00;Station-40;12869;5;145;CKB -LINE_20;Station-40;2022-03-11 03:17:00;2022-03-11 03:46:00;Station-41;13048;0;145;CKB -LINE_20;Station-41;2022-03-11 03:46:00;2022-03-11 04:12:00;Station-40;12869;5;145;CKB -LINE_20;Station-40;2022-03-11 04:17:00;2022-03-11 04:28:00;Station-13;4316;0;145;CKB -LINE_20;Station-13;2022-03-11 04:28:00;2022-03-11 04:28:00;Station-0;0.06;0;145;CKB -LINE_21;Station-0;2022-03-11 00:49:00;2022-03-11 00:49:00;Station-3;0.06;0;146;CKB -LINE_21;Station-3;2022-03-11 00:49:00;2022-03-11 01:04:00;Station-16;10229;0;146;CKB -LINE_21;Station-16;2022-03-11 01:04:00;2022-03-11 01:19:00;Station-3;11801;0;146;CKB -LINE_21;Station-3;2022-03-11 01:19:00;2022-03-11 01:34:00;Station-16;10229;0;146;CKB -LINE_21;Station-16;2022-03-11 01:34:00;2022-03-11 01:49:00;Station-3;11801;0;146;CKB -LINE_21;Station-3;2022-03-11 01:49:00;2022-03-11 02:04:00;Station-16;10229;0;146;CKB -LINE_21;Station-16;2022-03-11 02:04:00;2022-03-11 02:19:00;Station-3;11801;0;146;CKB -LINE_21;Station-3;2022-03-11 02:19:00;2022-03-11 02:34:00;Station-16;10229;0;146;CKB -LINE_21;Station-16;2022-03-11 02:34:00;2022-03-11 02:49:00;Station-3;11801;0;146;CKB -LINE_21;Station-3;2022-03-11 02:49:00;2022-03-11 03:04:00;Station-16;10229;0;146;CKB -LINE_21;Station-16;2022-03-11 03:04:00;2022-03-11 03:19:00;Station-3;11801;0;146;CKB -LINE_21;Station-3;2022-03-11 03:19:00;2022-03-11 03:34:00;Station-16;10229;0;146;CKB -LINE_21;Station-16;2022-03-11 03:34:00;2022-03-11 03:49:00;Station-3;11801;0;146;CKB -LINE_21;Station-3;2022-03-11 03:49:00;2022-03-11 04:04:00;Station-16;10229;0;146;CKB -LINE_21;Station-16;2022-03-11 04:04:00;2022-03-11 04:19:00;Station-3;11801;23;146;CKB -LINE_22;Station-3;2022-03-11 04:42:00;2022-03-11 05:04:00;Station-43;6.81;0;146;CKB -LINE_22;Station-43;2022-03-11 05:04:00;2022-03-11 05:04:00;Station-0;0.06;0;146;CKB -LINE_8;Station-0;2022-03-11 00:32:00;2022-03-11 00:32:00;Station-13;0.06;0;147;CKB -LINE_8;Station-13;2022-03-11 00:32:00;2022-03-11 00:57:00;Station-21;11545;6;147;CKB -LINE_8;Station-21;2022-03-11 01:03:00;2022-03-11 01:46:00;Station-20;20579;1;147;CKB -LINE_8;Station-20;2022-03-11 01:47:00;2022-03-11 02:25:00;Station-21;20641;8;147;CKB -LINE_8;Station-21;2022-03-11 02:33:00;2022-03-11 03:16:00;Station-20;20579;1;147;CKB -LINE_8;Station-20;2022-03-11 03:17:00;2022-03-11 03:55:00;Station-21;20641;8;147;CKB -LINE_8;Station-21;2022-03-11 04:03:00;2022-03-11 04:28:00;Station-13;11499;0;147;CKB -LINE_8;Station-13;2022-03-11 04:28:00;2022-03-11 04:28:00;Station-0;0.06;0;147;CKB -LINE_8;Station-0;2022-03-11 00:33:00;2022-03-11 00:33:00;Station-21;0.06;0;148;CKB -LINE_8;Station-21;2022-03-11 00:33:00;2022-03-11 01:16:00;Station-20;20579;1;148;CKB -LINE_8;Station-20;2022-03-11 01:17:00;2022-03-11 01:55:00;Station-21;20641;8;148;CKB -LINE_8;Station-21;2022-03-11 02:03:00;2022-03-11 02:46:00;Station-20;20579;1;148;CKB -LINE_8;Station-20;2022-03-11 02:47:00;2022-03-11 03:25:00;Station-21;20641;8;148;CKB -LINE_8;Station-21;2022-03-11 03:33:00;2022-03-11 04:16:00;Station-20;20579;1;148;CKB -LINE_8;Station-20;2022-03-11 04:17:00;2022-03-11 04:51:00;Station-44;18752;0;148;CKB -LINE_8;Station-44;2022-03-11 04:51:00;2022-03-11 04:51:00;Station-0;0.06;0;148;CKB -LINE_23;Station-0;2022-03-11 00:34:00;2022-03-11 00:34:00;Station-45;0.06;0;149;CKB -LINE_23;Station-45;2022-03-11 00:34:00;2022-03-11 01:00:00;Station-46;9016;0;149;CKB -LINE_23;Station-46;2022-03-11 01:00:00;2022-03-11 01:27:00;Station-45;10083;7;149;CKB -LINE_23;Station-45;2022-03-11 01:34:00;2022-03-11 02:00:00;Station-46;9016;0;149;CKB -LINE_23;Station-46;2022-03-11 02:00:00;2022-03-11 02:27:00;Station-45;10083;7;149;CKB -LINE_23;Station-45;2022-03-11 02:34:00;2022-03-11 03:00:00;Station-46;9016;0;149;CKB -LINE_23;Station-46;2022-03-11 03:00:00;2022-03-11 03:27:00;Station-45;10083;7;149;CKB -LINE_23;Station-45;2022-03-11 03:34:00;2022-03-11 04:00:00;Station-46;9016;0;149;CKB -LINE_23;Station-46;2022-03-11 04:00:00;2022-03-11 04:27:00;Station-45;10083;0;149;CKB -LINE_23;Station-45;2022-03-11 04:27:00;2022-03-11 04:27:00;Station-0;0.06;0;149;CKB -LINE_23;Station-0;2022-03-11 00:30:00;2022-03-11 00:30:00;Station-46;0.06;0;150;CKB -LINE_23;Station-46;2022-03-11 00:30:00;2022-03-11 00:57:00;Station-45;10083;7;150;CKB -LINE_23;Station-45;2022-03-11 01:04:00;2022-03-11 01:30:00;Station-46;9016;0;150;CKB -LINE_23;Station-46;2022-03-11 01:30:00;2022-03-11 01:57:00;Station-45;10083;7;150;CKB -LINE_23;Station-45;2022-03-11 02:04:00;2022-03-11 02:30:00;Station-46;9016;0;150;CKB -LINE_23;Station-46;2022-03-11 02:30:00;2022-03-11 02:57:00;Station-45;10083;7;150;CKB -LINE_23;Station-45;2022-03-11 03:04:00;2022-03-11 03:30:00;Station-46;9016;0;150;CKB -LINE_23;Station-46;2022-03-11 03:30:00;2022-03-11 03:57:00;Station-45;10083;7;150;CKB -LINE_23;Station-45;2022-03-11 04:04:00;2022-03-11 04:30:00;Station-46;9016;0;150;CKB -LINE_23;Station-46;2022-03-11 04:30:00;2022-03-11 04:57:00;Station-45;10083;0;150;CKB -LINE_23;Station-45;2022-03-11 04:57:00;2022-03-11 04:57:00;Station-0;0.06;0;150;CKB -LINE_24;Station-0;2022-03-11 00:31:00;2022-03-11 00:31:00;Station-21;0.06;0;151;CKB -LINE_24;Station-21;2022-03-11 00:31:00;2022-03-11 00:44:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 00:44:00;2022-03-11 00:56:00;Station-21;5362;5;151;CKB -LINE_24;Station-21;2022-03-11 01:01:00;2022-03-11 01:14:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 01:14:00;2022-03-11 01:26:00;Station-21;5362;5;151;CKB -LINE_24;Station-21;2022-03-11 01:31:00;2022-03-11 01:44:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 01:44:00;2022-03-11 01:56:00;Station-21;5362;5;151;CKB -LINE_24;Station-21;2022-03-11 02:01:00;2022-03-11 02:14:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 02:14:00;2022-03-11 02:26:00;Station-21;5362;5;151;CKB -LINE_24;Station-21;2022-03-11 02:31:00;2022-03-11 02:44:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 02:44:00;2022-03-11 02:56:00;Station-21;5362;5;151;CKB -LINE_24;Station-21;2022-03-11 03:01:00;2022-03-11 03:14:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 03:14:00;2022-03-11 03:26:00;Station-21;5362;5;151;CKB -LINE_24;Station-21;2022-03-11 03:31:00;2022-03-11 03:44:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 03:44:00;2022-03-11 03:56:00;Station-21;5362;5;151;CKB -LINE_24;Station-21;2022-03-11 04:01:00;2022-03-11 04:14:00;Station-47;4872;0;151;CKB -LINE_24;Station-47;2022-03-11 04:14:00;2022-03-11 04:26:00;Station-21;5362;0;151;CKB -LINE_24;Station-21;2022-03-11 04:26:00;2022-03-11 04:26:00;Station-0;0.06;0;151;CKB -LINE_25;Station-0;2022-03-11 00:31:00;2022-03-11 00:31:00;Station-21;0.06;0;152;CKB -LINE_25;Station-21;2022-03-11 00:31:00;2022-03-11 00:45:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 00:47:00;2022-03-11 01:01:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 01:01:00;2022-03-11 01:15:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 01:17:00;2022-03-11 01:31:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 01:31:00;2022-03-11 01:45:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 01:47:00;2022-03-11 02:01:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 02:01:00;2022-03-11 02:15:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 02:17:00;2022-03-11 02:31:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 02:31:00;2022-03-11 02:45:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 02:47:00;2022-03-11 03:01:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 03:01:00;2022-03-11 03:15:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 03:17:00;2022-03-11 03:31:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 03:31:00;2022-03-11 03:45:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 03:47:00;2022-03-11 04:01:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 04:01:00;2022-03-11 04:15:00;Station-48;5225;2;152;CKB -LINE_25;Station-48;2022-03-11 04:17:00;2022-03-11 04:31:00;Station-21;7617;0;152;CKB -LINE_25;Station-21;2022-03-11 04:31:00;2022-03-11 04:31:00;Station-0;0.06;0;152;CKB -LINE_26;Station-0;2022-03-11 00:43:00;2022-03-11 00:43:00;Station-49;0.06;0;153;CKB -LINE_26;Station-49;2022-03-11 00:43:00;2022-03-11 00:53:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 00:53:00;2022-03-11 01:03:00;Station-49;4408;10;153;CKB -LINE_26;Station-49;2022-03-11 01:13:00;2022-03-11 01:23:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 01:23:00;2022-03-11 01:33:00;Station-49;4408;10;153;CKB -LINE_26;Station-49;2022-03-11 01:43:00;2022-03-11 01:53:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 01:53:00;2022-03-11 02:03:00;Station-49;4408;10;153;CKB -LINE_26;Station-49;2022-03-11 02:13:00;2022-03-11 02:23:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 02:23:00;2022-03-11 02:33:00;Station-49;4408;10;153;CKB -LINE_26;Station-49;2022-03-11 02:43:00;2022-03-11 02:53:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 02:53:00;2022-03-11 03:03:00;Station-49;4408;10;153;CKB -LINE_26;Station-49;2022-03-11 03:13:00;2022-03-11 03:23:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 03:23:00;2022-03-11 03:33:00;Station-49;4408;10;153;CKB -LINE_26;Station-49;2022-03-11 03:43:00;2022-03-11 03:53:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 03:53:00;2022-03-11 04:03:00;Station-49;4408;10;153;CKB -LINE_26;Station-49;2022-03-11 04:13:00;2022-03-11 04:23:00;Station-50;4507;0;153;CKB -LINE_26;Station-50;2022-03-11 04:23:00;2022-03-11 04:33:00;Station-49;4408;0;153;CKB -LINE_26;Station-49;2022-03-11 04:33:00;2022-03-11 04:33:00;Station-0;0.06;0;153;CKB -LINE_0;Station-0;2022-03-11 21:31:00;2022-03-11 21:31:00;Station-1;0.06;0;154;CKB -LINE_0;Station-1;2022-03-11 21:31:00;2022-03-11 22:04:00;Station-2;14519;4;154;CKB -LINE_0;Station-2;2022-03-11 22:08:00;2022-03-11 22:43:00;Station-1;13541;8;154;CKB -LINE_0;Station-1;2022-03-11 22:51:00;2022-03-11 23:24:00;Station-2;14519;4;154;CKB -LINE_0;Station-2;2022-03-11 23:28:00;2022-03-12 00:03:00;Station-1;13541;8;154;CKB -LINE_0;Station-1;2022-03-12 00:11:00;2022-03-12 00:44:00;Station-2;14519;0;154;CKB -LINE_1;Station-2;2022-03-12 00:44:00;2022-03-12 00:54:00;Station-3;4.1;25;154;CKB -LINE_1;Station-3;2022-03-12 01:19:00;2022-03-12 01:42:00;Station-4;8.36;6;154;CKB -LINE_1;Station-4;2022-03-12 01:48:00;2022-03-12 02:06:00;Station-3;9067;13;154;CKB -LINE_1;Station-3;2022-03-12 02:19:00;2022-03-12 02:42:00;Station-4;8.36;6;154;CKB -LINE_1;Station-4;2022-03-12 02:48:00;2022-03-12 03:06:00;Station-3;9067;13;154;CKB -LINE_1;Station-3;2022-03-12 03:19:00;2022-03-12 03:42:00;Station-4;8.36;6;154;CKB -LINE_1;Station-4;2022-03-12 03:48:00;2022-03-12 04:06:00;Station-3;9067;13;154;CKB -LINE_1;Station-3;2022-03-12 04:19:00;2022-03-12 04:42:00;Station-4;8.36;6;154;CKB -LINE_1;Station-4;2022-03-12 04:48:00;2022-03-12 05:06:00;Station-3;9067;13;154;CKB -LINE_1;Station-3;2022-03-12 05:19:00;2022-03-12 05:42:00;Station-4;8.36;16;154;CKB -LINE_22;Station-4;2022-03-12 05:58:00;2022-03-12 06:34:00;Station-43;12968;0;154;CKB -LINE_22;Station-43;2022-03-12 06:34:00;2022-03-12 06:34:00;Station-0;0.06;0;154;CKB -LINE_0;Station-0;2022-03-11 22:11:00;2022-03-11 22:11:00;Station-1;0.06;0;155;CKB -LINE_0;Station-1;2022-03-11 22:11:00;2022-03-11 22:44:00;Station-2;14519;4;155;CKB -LINE_0;Station-2;2022-03-11 22:48:00;2022-03-11 23:23:00;Station-1;13541;8;155;CKB -LINE_0;Station-1;2022-03-11 23:31:00;2022-03-12 00:04:00;Station-2;14519;4;155;CKB -LINE_0;Station-2;2022-03-12 00:08:00;2022-03-12 00:39:00;Station-5;12213;0;155;CKB -LINE_1;Station-5;2022-03-12 00:39:00;2022-03-12 00:47:00;Station-3;4.0;2;155;CKB -LINE_1;Station-3;2022-03-12 00:49:00;2022-03-12 01:12:00;Station-4;8.36;6;155;CKB -LINE_1;Station-4;2022-03-12 01:18:00;2022-03-12 01:36:00;Station-3;9067;13;155;CKB -LINE_1;Station-3;2022-03-12 01:49:00;2022-03-12 02:12:00;Station-4;8.36;6;155;CKB -LINE_1;Station-4;2022-03-12 02:18:00;2022-03-12 02:36:00;Station-3;9067;13;155;CKB -LINE_1;Station-3;2022-03-12 02:49:00;2022-03-12 03:12:00;Station-4;8.36;6;155;CKB -LINE_1;Station-4;2022-03-12 03:18:00;2022-03-12 03:36:00;Station-3;9067;13;155;CKB -LINE_1;Station-3;2022-03-12 03:49:00;2022-03-12 04:12:00;Station-4;8.36;6;155;CKB -LINE_1;Station-4;2022-03-12 04:18:00;2022-03-12 04:36:00;Station-3;9067;13;155;CKB -LINE_1;Station-3;2022-03-12 04:49:00;2022-03-12 05:12:00;Station-4;8.36;6;155;CKB -LINE_1;Station-4;2022-03-12 05:18:00;2022-03-12 05:36:00;Station-3;9067;0;155;CKB -LINE_1;Station-3;2022-03-12 05:36:00;2022-03-12 05:36:00;Station-0;0.06;0;155;CKB -LINE_2;Station-0;2022-03-11 21:06:00;2022-03-11 21:06:00;Station-6;0.06;0;156;CKB -LINE_2;Station-6;2022-03-11 21:06:00;2022-03-11 21:34:00;Station-7;13018;19;156;CKB -LINE_2;Station-7;2022-03-11 21:53:00;2022-03-11 22:13:00;Station-8;10332;17;156;CKB -LINE_2;Station-8;2022-03-11 22:30:00;2022-03-11 22:54:00;Station-7;10.48;19;156;CKB -LINE_2;Station-7;2022-03-11 23:13:00;2022-03-11 23:33:00;Station-8;10332;17;156;CKB -LINE_2;Station-8;2022-03-11 23:50:00;2022-03-12 00:14:00;Station-7;10.48;8;156;CKB -LINE_2;Station-7;2022-03-12 00:22:00;2022-03-12 00:27:00;Station-58;2533;2;156;CKB -LINE_3;Station-58;2022-03-12 00:29:00;2022-03-12 00:47:00;Station-10;7.58;0;156;CKB -LINE_3;Station-10;2022-03-12 00:47:00;2022-03-12 01:14:00;Station-11;12841;3;156;CKB -LINE_3;Station-11;2022-03-12 01:17:00;2022-03-12 01:47:00;Station-10;14281;0;156;CKB -LINE_3;Station-10;2022-03-12 01:47:00;2022-03-12 02:14:00;Station-11;12841;3;156;CKB -LINE_3;Station-11;2022-03-12 02:17:00;2022-03-12 02:47:00;Station-10;14281;0;156;CKB -LINE_3;Station-10;2022-03-12 02:47:00;2022-03-12 03:14:00;Station-11;12841;3;156;CKB -LINE_3;Station-11;2022-03-12 03:17:00;2022-03-12 03:47:00;Station-10;14281;0;156;CKB -LINE_3;Station-10;2022-03-12 03:47:00;2022-03-12 04:14:00;Station-11;12841;3;156;CKB -LINE_3;Station-11;2022-03-12 04:17:00;2022-03-12 04:47:00;Station-10;14281;0;156;CKB -LINE_3;Station-10;2022-03-12 04:47:00;2022-03-12 05:14:00;Station-11;12841;3;156;CKB -LINE_3;Station-11;2022-03-12 05:17:00;2022-03-12 05:47:00;Station-10;14281;0;156;CKB -LINE_3;Station-10;2022-03-12 05:47:00;2022-03-12 05:47:00;Station-0;0.06;0;156;CKB -LINE_2;Station-0;2022-03-11 20:26:00;2022-03-11 20:26:00;Station-6;0.06;0;157;CKB -LINE_2;Station-6;2022-03-11 20:26:00;2022-03-11 20:56:00;Station-12;14097;14;157;CKB -LINE_2;Station-12;2022-03-11 21:10:00;2022-03-11 21:38:00;Station-6;13.19;8;157;CKB -LINE_2;Station-6;2022-03-11 21:46:00;2022-03-11 22:14:00;Station-7;13018;19;157;CKB -LINE_2;Station-7;2022-03-11 22:33:00;2022-03-11 22:53:00;Station-8;10332;17;157;CKB -LINE_2;Station-8;2022-03-11 23:10:00;2022-03-11 23:34:00;Station-7;10.48;19;157;CKB -LINE_2;Station-7;2022-03-11 23:53:00;2022-03-12 00:13:00;Station-8;10332;2;157;CKB -LINE_2;Station-8;2022-03-12 00:15:00;2022-03-12 00:16:00;Station-10;506;1;157;CKB -LINE_3;Station-10;2022-03-12 00:17:00;2022-03-12 00:44:00;Station-11;12841;3;157;CKB -LINE_3;Station-11;2022-03-12 00:47:00;2022-03-12 01:17:00;Station-10;14281;0;157;CKB -LINE_3;Station-10;2022-03-12 01:17:00;2022-03-12 01:44:00;Station-11;12841;3;157;CKB -LINE_3;Station-11;2022-03-12 01:47:00;2022-03-12 02:17:00;Station-10;14281;0;157;CKB -LINE_3;Station-10;2022-03-12 02:17:00;2022-03-12 02:44:00;Station-11;12841;3;157;CKB -LINE_3;Station-11;2022-03-12 02:47:00;2022-03-12 03:17:00;Station-10;14281;0;157;CKB -LINE_3;Station-10;2022-03-12 03:17:00;2022-03-12 03:44:00;Station-11;12841;3;157;CKB -LINE_3;Station-11;2022-03-12 03:47:00;2022-03-12 04:17:00;Station-10;14281;0;157;CKB -LINE_3;Station-10;2022-03-12 04:17:00;2022-03-12 04:44:00;Station-11;12841;3;157;CKB -LINE_3;Station-11;2022-03-12 04:47:00;2022-03-12 05:17:00;Station-10;14281;0;157;CKB -LINE_3;Station-10;2022-03-12 05:17:00;2022-03-12 05:29:00;Station-58;5474;0;157;CKB -LINE_3;Station-58;2022-03-12 05:29:00;2022-03-12 05:29:00;Station-0;0.06;0;157;CKB -LINE_5;Station-0;2022-03-11 22:56:00;2022-03-11 22:56:00;Station-14;0.06;0;158;CKB -LINE_5;Station-14;2022-03-11 22:56:00;2022-03-11 23:08:00;Station-15;5882;3;158;CKB -LINE_5;Station-15;2022-03-11 23:11:00;2022-03-11 23:25:00;Station-14;6232;0;158;CKB -LINE_5;Station-14;2022-03-11 23:25:00;2022-03-11 23:38:00;Station-15;6086;3;158;CKB -LINE_5;Station-15;2022-03-11 23:41:00;2022-03-11 23:55:00;Station-14;6232;0;158;CKB -LINE_5;Station-14;2022-03-11 23:55:00;2022-03-12 00:08:00;Station-15;6086;0;158;CKB -LINE_5;Station-15;2022-03-12 00:08:00;2022-03-12 00:08:00;Station-0;0.06;0;158;CKB -LINE_6;Station-0;2022-03-11 05:05:00;2022-03-11 05:05:00;Station-16;0.06;0;159;CKB -LINE_6;Station-16;2022-03-11 05:05:00;2022-03-11 05:14:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 05:14:00;2022-03-11 05:23:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 05:25:00;2022-03-11 05:34:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 05:34:00;2022-03-11 05:43:00;Station-16;5139;23;159;CKB -LINE_6;Station-16;2022-03-11 06:06:00;2022-03-11 06:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 06:15:00;2022-03-11 06:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 06:26:00;2022-03-11 06:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 06:35:00;2022-03-11 06:44:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 06:46:00;2022-03-11 06:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 06:55:00;2022-03-11 07:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 07:06:00;2022-03-11 07:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 07:15:00;2022-03-11 07:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 07:26:00;2022-03-11 07:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 07:35:00;2022-03-11 07:44:00;Station-16;5139;22;159;CKB -LINE_6;Station-16;2022-03-11 08:06:00;2022-03-11 08:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 08:15:00;2022-03-11 08:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 08:26:00;2022-03-11 08:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 08:35:00;2022-03-11 08:44:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 08:46:00;2022-03-11 08:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 08:55:00;2022-03-11 09:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 09:06:00;2022-03-11 09:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 09:15:00;2022-03-11 09:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 09:26:00;2022-03-11 09:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 09:35:00;2022-03-11 09:44:00;Station-16;5139;22;159;CKB -LINE_6;Station-16;2022-03-11 10:06:00;2022-03-11 10:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 10:15:00;2022-03-11 10:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 10:26:00;2022-03-11 10:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 10:35:00;2022-03-11 10:44:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 10:46:00;2022-03-11 10:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 10:55:00;2022-03-11 11:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 11:06:00;2022-03-11 11:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 11:15:00;2022-03-11 11:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 11:26:00;2022-03-11 11:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 11:35:00;2022-03-11 11:44:00;Station-16;5139;22;159;CKB -LINE_6;Station-16;2022-03-11 12:06:00;2022-03-11 12:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 12:15:00;2022-03-11 12:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 12:26:00;2022-03-11 12:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 12:35:00;2022-03-11 12:44:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 12:46:00;2022-03-11 12:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 12:55:00;2022-03-11 13:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 13:06:00;2022-03-11 13:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 13:15:00;2022-03-11 13:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 13:26:00;2022-03-11 13:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 13:35:00;2022-03-11 13:44:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 13:46:00;2022-03-11 13:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 13:55:00;2022-03-11 14:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 14:06:00;2022-03-11 14:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 14:15:00;2022-03-11 14:24:00;Station-16;5139;22;159;CKB -LINE_6;Station-16;2022-03-11 14:46:00;2022-03-11 14:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 14:55:00;2022-03-11 15:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 15:06:00;2022-03-11 15:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 15:15:00;2022-03-11 15:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 15:26:00;2022-03-11 15:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 15:35:00;2022-03-11 15:44:00;Station-16;5139;22;159;CKB -LINE_6;Station-16;2022-03-11 16:06:00;2022-03-11 16:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 16:15:00;2022-03-11 16:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 16:26:00;2022-03-11 16:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 16:35:00;2022-03-11 16:44:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 16:46:00;2022-03-11 16:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 16:55:00;2022-03-11 17:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 17:06:00;2022-03-11 17:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 17:15:00;2022-03-11 17:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 17:26:00;2022-03-11 17:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 17:35:00;2022-03-11 17:44:00;Station-16;5139;22;159;CKB -LINE_6;Station-16;2022-03-11 18:06:00;2022-03-11 18:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 18:15:00;2022-03-11 18:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 18:26:00;2022-03-11 18:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 18:35:00;2022-03-11 18:44:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 18:46:00;2022-03-11 18:55:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 18:55:00;2022-03-11 19:04:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 19:06:00;2022-03-11 19:15:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 19:15:00;2022-03-11 19:24:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 19:26:00;2022-03-11 19:35:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 19:35:00;2022-03-11 19:44:00;Station-16;5139;21;159;CKB -LINE_6;Station-16;2022-03-11 20:05:00;2022-03-11 20:14:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 20:14:00;2022-03-11 20:23:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 20:25:00;2022-03-11 20:34:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 20:34:00;2022-03-11 20:43:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 20:45:00;2022-03-11 20:54:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 20:54:00;2022-03-11 21:03:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 21:05:00;2022-03-11 21:14:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 21:14:00;2022-03-11 21:23:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 21:25:00;2022-03-11 21:34:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 21:34:00;2022-03-11 21:43:00;Station-16;5139;22;159;CKB -LINE_6;Station-16;2022-03-11 22:05:00;2022-03-11 22:14:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 22:14:00;2022-03-11 22:23:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 22:25:00;2022-03-11 22:34:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 22:34:00;2022-03-11 22:43:00;Station-16;5139;2;159;CKB -LINE_6;Station-16;2022-03-11 22:45:00;2022-03-11 22:54:00;Station-17;4781;0;159;CKB -LINE_6;Station-17;2022-03-11 22:54:00;2022-03-11 23:03:00;Station-16;5139;0;159;CKB -LINE_6;Station-16;2022-03-11 23:03:00;2022-03-11 23:03:00;Station-0;0.06;0;159;CKB -LINE_9;Station-22;2022-03-11 05:15:00;2022-03-11 06:01:00;Station-23;17.9;0;160;VDL -LINE_9;Station-23;2022-03-11 06:01:00;2022-03-11 06:15:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 06:23:00;2022-03-11 06:37:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 06:41:00;2022-03-11 06:55:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 07:03:00;2022-03-11 07:17:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 07:21:00;2022-03-11 07:35:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 07:43:00;2022-03-11 07:57:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 08:01:00;2022-03-11 08:15:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 08:23:00;2022-03-11 08:37:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 08:41:00;2022-03-11 08:55:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 09:03:00;2022-03-11 09:17:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 09:21:00;2022-03-11 09:35:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 09:43:00;2022-03-11 09:57:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 10:01:00;2022-03-11 10:15:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 10:23:00;2022-03-11 10:37:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 10:41:00;2022-03-11 10:55:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 11:03:00;2022-03-11 11:17:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 11:21:00;2022-03-11 11:35:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 11:43:00;2022-03-11 11:57:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 12:01:00;2022-03-11 12:15:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 12:23:00;2022-03-11 12:37:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 12:41:00;2022-03-11 12:55:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 13:03:00;2022-03-11 13:17:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 13:21:00;2022-03-11 13:35:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 13:43:00;2022-03-11 13:57:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 14:01:00;2022-03-11 14:15:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 14:23:00;2022-03-11 14:37:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 14:41:00;2022-03-11 14:55:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 15:03:00;2022-03-11 15:17:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 15:21:00;2022-03-11 15:35:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 15:43:00;2022-03-11 15:57:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 16:01:00;2022-03-11 16:15:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 16:23:00;2022-03-11 16:37:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 16:41:00;2022-03-11 16:55:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 17:03:00;2022-03-11 17:17:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 17:21:00;2022-03-11 17:35:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 17:43:00;2022-03-11 17:57:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 18:01:00;2022-03-11 18:15:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 18:23:00;2022-03-11 18:37:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 18:41:00;2022-03-11 18:55:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 19:03:00;2022-03-11 19:17:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 19:21:00;2022-03-11 19:35:00;Station-23;4637;8;160;VDL -LINE_9;Station-23;2022-03-11 19:43:00;2022-03-11 19:57:00;Station-23;4637;4;160;VDL -LINE_9;Station-23;2022-03-11 20:01:00;2022-03-11 20:14:00;Station-23;4637;9;160;VDL -LINE_9;Station-23;2022-03-11 20:23:00;2022-03-11 20:36:00;Station-23;4637;0;160;VDL -LINE_9;Station-23;2022-03-11 20:36:00;2022-03-11 21:15:00;Station-22;19.8;0;160;VDL -LINE_10;Station-0;2022-03-11 04:56:00;2022-03-11 04:56:00;Station-24;0.06;18;161;CKB -LINE_10;Station-24;2022-03-11 05:14:00;2022-03-11 05:20:00;Station-25;3.29;0;161;CKB -LINE_10;Station-25;2022-03-11 05:20:00;2022-03-11 05:24:00;Station-24;2954;20;161;CKB -LINE_10;Station-24;2022-03-11 05:44:00;2022-03-11 05:50:00;Station-25;3.29;0;161;CKB -LINE_10;Station-25;2022-03-11 05:50:00;2022-03-11 05:54:00;Station-24;2954;5;161;CKB -LINE_10;Station-24;2022-03-11 05:59:00;2022-03-11 06:06:00;Station-25;3.29;2;161;CKB -LINE_10;Station-25;2022-03-11 06:08:00;2022-03-11 06:13:00;Station-24;2954;19;161;CKB -LINE_10;Station-24;2022-03-11 06:32:00;2022-03-11 06:39:00;Station-25;3.29;1;161;CKB -LINE_10;Station-25;2022-03-11 06:40:00;2022-03-11 06:45:00;Station-24;2954;7;161;CKB -LINE_10;Station-24;2022-03-11 06:52:00;2022-03-11 06:59:00;Station-25;3.29;1;161;CKB -LINE_10;Station-25;2022-03-11 07:00:00;2022-03-11 07:05:00;Station-24;2954;7;161;CKB -LINE_10;Station-24;2022-03-11 07:12:00;2022-03-11 07:19:00;Station-25;3.29;1;161;CKB -LINE_10;Station-25;2022-03-11 07:20:00;2022-03-11 07:25:00;Station-24;2954;7;161;CKB -LINE_10;Station-24;2022-03-11 07:32:00;2022-03-11 07:39:00;Station-25;3.29;1;161;CKB -LINE_10;Station-25;2022-03-11 07:40:00;2022-03-11 07:45:00;Station-24;2954;295;161;CKB -LINE_10;Station-24;2022-03-11 12:40:00;2022-03-11 12:47:00;Station-25;3.29;2;161;CKB -LINE_10;Station-25;2022-03-11 12:49:00;2022-03-11 12:54:00;Station-24;2954;46;161;CKB -LINE_10;Station-24;2022-03-11 13:40:00;2022-03-11 13:47:00;Station-25;3.29;2;161;CKB -LINE_10;Station-25;2022-03-11 13:49:00;2022-03-11 13:54:00;Station-24;2954;434;161;CKB -LINE_10;Station-24;2022-03-11 21:08:00;2022-03-11 21:08:00;Station-0;0.06;0;161;CKB -LINE_11;Station-0;2022-03-11 07:20:00;2022-03-11 07:20:00;Station-26;0.06;0;162;CKB -LINE_11;Station-26;2022-03-11 07:20:00;2022-03-11 07:50:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 08:00:00;2022-03-11 08:30:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 08:40:00;2022-03-11 09:10:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 09:20:00;2022-03-11 09:50:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 10:00:00;2022-03-11 10:30:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 10:40:00;2022-03-11 11:10:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 11:20:00;2022-03-11 11:50:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 12:00:00;2022-03-11 12:30:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 12:40:00;2022-03-11 13:10:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 13:20:00;2022-03-11 13:50:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 14:00:00;2022-03-11 14:30:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 14:40:00;2022-03-11 15:10:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 15:20:00;2022-03-11 15:50:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 16:00:00;2022-03-11 16:30:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 16:40:00;2022-03-11 17:10:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 17:20:00;2022-03-11 17:50:00;Station-26;9266;10;162;CKB -LINE_11;Station-26;2022-03-11 18:00:00;2022-03-11 18:30:00;Station-26;9266;0;162;CKB -LINE_11;Station-26;2022-03-11 18:30:00;2022-03-11 18:30:00;Station-0;0.06;0;162;CKB -LINE_12;Station-0;2022-03-11 07:10:00;2022-03-11 07:10:00;Station-27;0.06;0;163;CKB -LINE_12;Station-27;2022-03-11 07:10:00;2022-03-11 07:18:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 07:28:00;2022-03-11 07:40:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 07:40:00;2022-03-11 07:48:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 07:58:00;2022-03-11 08:10:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 08:10:00;2022-03-11 08:18:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 08:28:00;2022-03-11 08:40:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 08:40:00;2022-03-11 08:48:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 08:58:00;2022-03-11 09:10:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 09:10:00;2022-03-11 09:18:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 09:28:00;2022-03-11 09:40:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 09:40:00;2022-03-11 09:48:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 09:58:00;2022-03-11 10:10:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 10:10:00;2022-03-11 10:18:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 10:28:00;2022-03-11 10:40:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 10:40:00;2022-03-11 10:48:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 10:58:00;2022-03-11 11:10:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 11:10:00;2022-03-11 11:18:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 11:28:00;2022-03-11 11:40:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 11:40:00;2022-03-11 11:48:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 11:58:00;2022-03-11 12:10:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 12:10:00;2022-03-11 12:18:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 12:28:00;2022-03-11 12:40:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 12:40:00;2022-03-11 12:48:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 12:58:00;2022-03-11 13:10:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 13:10:00;2022-03-11 13:18:00;Station-28;2169;10;163;CKB -LINE_12;Station-28;2022-03-11 13:28:00;2022-03-11 13:40:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 13:40:00;2022-03-11 13:48:00;Station-28;2169;8;163;CKB -LINE_12;Station-28;2022-03-11 13:56:00;2022-03-11 14:10:00;Station-27;2952;0;163;CKB -LINE_12;Station-27;2022-03-11 14:10:00;2022-03-11 14:19:00;Station-28;2169;14;163;CKB -LINE_12;Station-28;2022-03-11 14:33:00;2022-03-11 14:47:00;Station-27;2952;3;163;CKB -LINE_12;Station-27;2022-03-11 14:50:00;2022-03-11 14:59:00;Station-28;2169;14;163;CKB -LINE_12;Station-28;2022-03-11 15:13:00;2022-03-11 15:27:00;Station-27;2952;3;163;CKB -LINE_12;Station-27;2022-03-11 15:30:00;2022-03-11 15:39:00;Station-28;2169;14;163;CKB -LINE_12;Station-28;2022-03-11 15:53:00;2022-03-11 16:07:00;Station-27;2952;3;163;CKB -LINE_12;Station-27;2022-03-11 16:10:00;2022-03-11 16:19:00;Station-28;2169;14;163;CKB -LINE_12;Station-28;2022-03-11 16:33:00;2022-03-11 16:47:00;Station-27;2952;3;163;CKB -LINE_12;Station-27;2022-03-11 16:50:00;2022-03-11 16:59:00;Station-28;2169;14;163;CKB -LINE_12;Station-28;2022-03-11 17:13:00;2022-03-11 17:27:00;Station-27;2952;3;163;CKB -LINE_12;Station-27;2022-03-11 17:30:00;2022-03-11 17:39:00;Station-28;2169;13;163;CKB -LINE_12;Station-28;2022-03-11 17:52:00;2022-03-11 18:05:00;Station-27;2952;5;163;CKB -LINE_12;Station-27;2022-03-11 18:10:00;2022-03-11 18:18:00;Station-28;2169;0;163;CKB -LINE_12;Station-28;2022-03-11 18:18:00;2022-03-11 18:18:00;Station-0;0.06;0;163;CKB -LINE_12;Station-0;2022-03-11 14:13:00;2022-03-11 14:13:00;Station-28;0.06;0;164;CKB -LINE_12;Station-28;2022-03-11 14:13:00;2022-03-11 14:27:00;Station-27;2952;3;164;CKB -LINE_12;Station-27;2022-03-11 14:30:00;2022-03-11 14:39:00;Station-28;2169;14;164;CKB -LINE_12;Station-28;2022-03-11 14:53:00;2022-03-11 15:07:00;Station-27;2952;3;164;CKB -LINE_12;Station-27;2022-03-11 15:10:00;2022-03-11 15:19:00;Station-28;2169;14;164;CKB -LINE_12;Station-28;2022-03-11 15:33:00;2022-03-11 15:47:00;Station-27;2952;3;164;CKB -LINE_12;Station-27;2022-03-11 15:50:00;2022-03-11 15:59:00;Station-28;2169;14;164;CKB -LINE_12;Station-28;2022-03-11 16:13:00;2022-03-11 16:27:00;Station-27;2952;3;164;CKB -LINE_12;Station-27;2022-03-11 16:30:00;2022-03-11 16:39:00;Station-28;2169;14;164;CKB -LINE_12;Station-28;2022-03-11 16:53:00;2022-03-11 17:07:00;Station-27;2952;3;164;CKB -LINE_12;Station-27;2022-03-11 17:10:00;2022-03-11 17:19:00;Station-28;2169;14;164;CKB -LINE_12;Station-28;2022-03-11 17:33:00;2022-03-11 17:47:00;Station-27;2952;3;164;CKB -LINE_12;Station-27;2022-03-11 17:50:00;2022-03-11 17:59:00;Station-28;2169;14;164;CKB -LINE_12;Station-28;2022-03-11 18:13:00;2022-03-11 18:25:00;Station-27;2952;0;164;CKB -LINE_12;Station-27;2022-03-11 18:25:00;2022-03-11 18:25:00;Station-0;0.06;0;164;CKB -LINE_13;Station-0;2022-03-12 00:23:00;2022-03-12 00:23:00;Station-29;0.06;0;165;CKB -LINE_13;Station-29;2022-03-12 00:23:00;2022-03-12 00:30:00;Station-30;2577;9;165;CKB -LINE_14;Station-30;2022-03-12 00:39:00;2022-03-12 00:54:00;Station-31;5937;9;165;CKB -LINE_14;Station-31;2022-03-12 01:03:00;2022-03-12 01:17:00;Station-30;6.19;0;165;CKB -LINE_13;Station-30;2022-03-12 01:17:00;2022-03-12 01:23:00;Station-29;2555;0;165;CKB -LINE_13;Station-29;2022-03-12 01:23:00;2022-03-12 01:30:00;Station-30;2577;9;165;CKB -LINE_14;Station-30;2022-03-12 01:39:00;2022-03-12 01:54:00;Station-31;5937;9;165;CKB -LINE_14;Station-31;2022-03-12 02:03:00;2022-03-12 02:17:00;Station-30;6.19;0;165;CKB -LINE_13;Station-30;2022-03-12 02:17:00;2022-03-12 02:23:00;Station-29;2555;0;165;CKB -LINE_13;Station-29;2022-03-12 02:23:00;2022-03-12 02:30:00;Station-30;2577;9;165;CKB -LINE_14;Station-30;2022-03-12 02:39:00;2022-03-12 02:54:00;Station-31;5937;9;165;CKB -LINE_14;Station-31;2022-03-12 03:03:00;2022-03-12 03:17:00;Station-30;6.19;0;165;CKB -LINE_13;Station-30;2022-03-12 03:17:00;2022-03-12 03:23:00;Station-29;2555;0;165;CKB -LINE_13;Station-29;2022-03-12 03:23:00;2022-03-12 03:30:00;Station-30;2577;9;165;CKB -LINE_14;Station-30;2022-03-12 03:39:00;2022-03-12 03:54:00;Station-31;5937;9;165;CKB -LINE_14;Station-31;2022-03-12 04:03:00;2022-03-12 04:17:00;Station-30;6.19;0;165;CKB -LINE_13;Station-30;2022-03-12 04:17:00;2022-03-12 04:23:00;Station-29;2555;0;165;CKB -LINE_13;Station-29;2022-03-12 04:23:00;2022-03-12 04:30:00;Station-30;2577;9;165;CKB -LINE_14;Station-30;2022-03-12 04:39:00;2022-03-12 04:54:00;Station-31;5937;9;165;CKB -LINE_14;Station-31;2022-03-12 05:03:00;2022-03-12 05:17:00;Station-30;6.19;0;165;CKB -LINE_15;Station-30;2022-03-12 05:17:00;2022-03-12 05:38:00;Station-33;12.0;28;165;CKB -LINE_15;Station-33;2022-03-12 06:06:00;2022-03-12 06:11:00;Station-32;2936;16;165;CKB -LINE_15;Station-32;2022-03-12 06:27:00;2022-03-12 06:36:00;Station-33;4343;10;165;CKB -LINE_15;Station-33;2022-03-12 06:46:00;2022-03-12 06:51:00;Station-32;2936;0;165;CKB -LINE_10;Station-32;2022-03-12 06:51:00;2022-03-12 07:00:00;Station-24;4.6;12;165;CKB -LINE_10;Station-24;2022-03-12 07:12:00;2022-03-12 07:12:00;Station-24;0.0;836;165;CKB -LINE_10;Station-24;2022-03-12 21:08:00;2022-03-12 21:08:00;Station-24;0.0;0;165;CKB -LINE_10;Station-24;2022-03-12 21:08:00;2022-03-12 21:08:00;Station-0;0.06;0;165;CKB -LINE_14;Station-0;2022-03-12 00:33:00;2022-03-12 00:33:00;Station-31;0.06;0;166;CKB -LINE_14;Station-31;2022-03-12 00:33:00;2022-03-12 00:47:00;Station-30;6.19;0;166;CKB -LINE_13;Station-30;2022-03-12 00:47:00;2022-03-12 00:53:00;Station-29;2555;0;166;CKB -LINE_13;Station-29;2022-03-12 00:53:00;2022-03-12 01:00:00;Station-30;2577;9;166;CKB -LINE_14;Station-30;2022-03-12 01:09:00;2022-03-12 01:24:00;Station-31;5937;9;166;CKB -LINE_14;Station-31;2022-03-12 01:33:00;2022-03-12 01:47:00;Station-30;6.19;0;166;CKB -LINE_13;Station-30;2022-03-12 01:47:00;2022-03-12 01:53:00;Station-29;2555;0;166;CKB -LINE_13;Station-29;2022-03-12 01:53:00;2022-03-12 02:00:00;Station-30;2577;9;166;CKB -LINE_14;Station-30;2022-03-12 02:09:00;2022-03-12 02:24:00;Station-31;5937;9;166;CKB -LINE_14;Station-31;2022-03-12 02:33:00;2022-03-12 02:47:00;Station-30;6.19;0;166;CKB -LINE_13;Station-30;2022-03-12 02:47:00;2022-03-12 02:53:00;Station-29;2555;0;166;CKB -LINE_13;Station-29;2022-03-12 02:53:00;2022-03-12 03:00:00;Station-30;2577;9;166;CKB -LINE_14;Station-30;2022-03-12 03:09:00;2022-03-12 03:24:00;Station-31;5937;9;166;CKB -LINE_14;Station-31;2022-03-12 03:33:00;2022-03-12 03:47:00;Station-30;6.19;0;166;CKB -LINE_13;Station-30;2022-03-12 03:47:00;2022-03-12 03:53:00;Station-29;2555;0;166;CKB -LINE_13;Station-29;2022-03-12 03:53:00;2022-03-12 04:00:00;Station-30;2577;9;166;CKB -LINE_14;Station-30;2022-03-12 04:09:00;2022-03-12 04:24:00;Station-31;5937;9;166;CKB -LINE_14;Station-31;2022-03-12 04:33:00;2022-03-12 04:47:00;Station-30;6.19;0;166;CKB -LINE_13;Station-30;2022-03-12 04:47:00;2022-03-12 04:53:00;Station-29;2555;0;166;CKB -LINE_13;Station-29;2022-03-12 04:53:00;2022-03-12 05:00:00;Station-30;2577;9;166;CKB -LINE_14;Station-30;2022-03-12 05:09:00;2022-03-12 05:24:00;Station-31;5937;0;166;CKB -LINE_14;Station-31;2022-03-12 05:24:00;2022-03-12 05:24:00;Station-0;0.06;0;166;CKB -LINE_15;Station-0;2022-03-12 00:57:00;2022-03-12 00:57:00;Station-32;0.06;0;167;CKB -LINE_15;Station-32;2022-03-12 00:57:00;2022-03-12 01:06:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 01:06:00;2022-03-12 01:11:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 01:27:00;2022-03-12 01:36:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 01:36:00;2022-03-12 01:41:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 01:57:00;2022-03-12 02:06:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 02:06:00;2022-03-12 02:11:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 02:27:00;2022-03-12 02:36:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 02:36:00;2022-03-12 02:41:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 02:57:00;2022-03-12 03:06:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 03:06:00;2022-03-12 03:11:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 03:27:00;2022-03-12 03:36:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 03:36:00;2022-03-12 03:41:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 03:57:00;2022-03-12 04:06:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 04:06:00;2022-03-12 04:11:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 04:27:00;2022-03-12 04:36:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 04:36:00;2022-03-12 04:41:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 04:57:00;2022-03-12 05:06:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 05:06:00;2022-03-12 05:11:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 05:27:00;2022-03-12 05:36:00;Station-33;4343;0;167;CKB -LINE_15;Station-33;2022-03-12 05:36:00;2022-03-12 05:41:00;Station-32;2936;16;167;CKB -LINE_15;Station-32;2022-03-12 05:57:00;2022-03-12 06:06:00;Station-33;4343;20;167;CKB -LINE_15;Station-33;2022-03-12 06:26:00;2022-03-12 06:31:00;Station-32;2936;0;167;CKB -LINE_15;Station-32;2022-03-12 06:31:00;2022-03-12 06:31:00;Station-0;0.06;0;167;CKB -LINE_17;Station-0;2022-03-12 00:30:00;2022-03-12 00:30:00;Station-34;0.06;0;168;CKB -LINE_17;Station-34;2022-03-12 00:30:00;2022-03-12 00:44:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 00:44:00;2022-03-12 00:57:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 01:00:00;2022-03-12 01:14:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 01:14:00;2022-03-12 01:27:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 01:30:00;2022-03-12 01:44:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 01:44:00;2022-03-12 01:57:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 02:00:00;2022-03-12 02:14:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 02:14:00;2022-03-12 02:27:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 02:30:00;2022-03-12 02:44:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 02:44:00;2022-03-12 02:57:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 03:00:00;2022-03-12 03:14:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 03:14:00;2022-03-12 03:27:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 03:30:00;2022-03-12 03:44:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 03:44:00;2022-03-12 03:57:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 04:00:00;2022-03-12 04:14:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 04:14:00;2022-03-12 04:27:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 04:30:00;2022-03-12 04:44:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 04:44:00;2022-03-12 04:57:00;Station-34;5302;3;168;CKB -LINE_17;Station-34;2022-03-12 05:00:00;2022-03-12 05:14:00;Station-36;4801;0;168;CKB -LINE_17;Station-36;2022-03-12 05:14:00;2022-03-12 05:27:00;Station-34;5302;0;168;CKB -LINE_17;Station-34;2022-03-12 05:27:00;2022-03-12 05:27:00;Station-0;0.06;0;168;CKB -LINE_20;Station-0;2022-03-12 00:32:00;2022-03-12 00:32:00;Station-13;0.06;0;169;CKB -LINE_20;Station-13;2022-03-12 00:32:00;2022-03-12 00:44:00;Station-40;4212;3;169;CKB -LINE_20;Station-40;2022-03-12 00:47:00;2022-03-12 01:16:00;Station-41;13048;0;169;CKB -LINE_20;Station-41;2022-03-12 01:16:00;2022-03-12 01:42:00;Station-40;12869;5;169;CKB -LINE_20;Station-40;2022-03-12 01:47:00;2022-03-12 02:16:00;Station-41;13048;0;169;CKB -LINE_20;Station-41;2022-03-12 02:16:00;2022-03-12 02:42:00;Station-40;12869;5;169;CKB -LINE_20;Station-40;2022-03-12 02:47:00;2022-03-12 03:16:00;Station-41;13048;0;169;CKB -LINE_20;Station-41;2022-03-12 03:16:00;2022-03-12 03:42:00;Station-40;12869;5;169;CKB -LINE_20;Station-40;2022-03-12 03:47:00;2022-03-12 04:16:00;Station-41;13048;0;169;CKB -LINE_20;Station-41;2022-03-12 04:16:00;2022-03-12 04:42:00;Station-40;12869;5;169;CKB -LINE_20;Station-40;2022-03-12 04:47:00;2022-03-12 05:16:00;Station-41;13048;0;169;CKB -LINE_20;Station-41;2022-03-12 05:16:00;2022-03-12 05:34:00;Station-42;9538;0;169;CKB -LINE_20;Station-42;2022-03-12 05:34:00;2022-03-12 05:34:00;Station-0;0.06;0;169;CKB -LINE_20;Station-0;2022-03-12 00:17:00;2022-03-12 00:17:00;Station-40;0.06;0;170;CKB -LINE_20;Station-40;2022-03-12 00:17:00;2022-03-12 00:46:00;Station-41;13048;0;170;CKB -LINE_20;Station-41;2022-03-12 00:46:00;2022-03-12 01:12:00;Station-40;12869;5;170;CKB -LINE_20;Station-40;2022-03-12 01:17:00;2022-03-12 01:46:00;Station-41;13048;0;170;CKB -LINE_20;Station-41;2022-03-12 01:46:00;2022-03-12 02:12:00;Station-40;12869;5;170;CKB -LINE_20;Station-40;2022-03-12 02:17:00;2022-03-12 02:46:00;Station-41;13048;0;170;CKB -LINE_20;Station-41;2022-03-12 02:46:00;2022-03-12 03:12:00;Station-40;12869;5;170;CKB -LINE_20;Station-40;2022-03-12 03:17:00;2022-03-12 03:46:00;Station-41;13048;0;170;CKB -LINE_20;Station-41;2022-03-12 03:46:00;2022-03-12 04:12:00;Station-40;12869;5;170;CKB -LINE_20;Station-40;2022-03-12 04:17:00;2022-03-12 04:46:00;Station-41;13048;0;170;CKB -LINE_20;Station-41;2022-03-12 04:46:00;2022-03-12 05:12:00;Station-40;12869;0;170;CKB -LINE_20;Station-40;2022-03-12 05:12:00;2022-03-12 05:12:00;Station-0;0.06;0;170;CKB -LINE_21;Station-0;2022-03-12 00:49:00;2022-03-12 00:49:00;Station-3;0.06;0;171;CKB -LINE_21;Station-3;2022-03-12 00:49:00;2022-03-12 01:04:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 01:04:00;2022-03-12 01:19:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 01:19:00;2022-03-12 01:34:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 01:34:00;2022-03-12 01:49:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 01:49:00;2022-03-12 02:04:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 02:04:00;2022-03-12 02:19:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 02:19:00;2022-03-12 02:34:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 02:34:00;2022-03-12 02:49:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 02:49:00;2022-03-12 03:04:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 03:04:00;2022-03-12 03:19:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 03:19:00;2022-03-12 03:34:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 03:34:00;2022-03-12 03:49:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 03:49:00;2022-03-12 04:04:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 04:04:00;2022-03-12 04:19:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 04:19:00;2022-03-12 04:34:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 04:34:00;2022-03-12 04:49:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 04:49:00;2022-03-12 05:04:00;Station-16;10229;0;171;CKB -LINE_21;Station-16;2022-03-12 05:04:00;2022-03-12 05:19:00;Station-3;11801;0;171;CKB -LINE_21;Station-3;2022-03-12 05:19:00;2022-03-12 05:19:00;Station-0;0.06;0;171;CKB -LINE_23;Station-0;2022-03-12 02:34:00;2022-03-12 02:34:00;Station-45;0.06;0;172;CKB -LINE_23;Station-45;2022-03-12 02:34:00;2022-03-12 03:00:00;Station-46;9016;0;172;CKB -LINE_23;Station-46;2022-03-12 03:00:00;2022-03-12 03:27:00;Station-45;10083;7;172;CKB -LINE_23;Station-45;2022-03-12 03:34:00;2022-03-12 04:00:00;Station-46;9016;0;172;CKB -LINE_23;Station-46;2022-03-12 04:00:00;2022-03-12 04:27:00;Station-45;10083;7;172;CKB -LINE_23;Station-45;2022-03-12 04:34:00;2022-03-12 05:00:00;Station-46;9016;0;172;CKB -LINE_23;Station-46;2022-03-12 05:00:00;2022-03-12 05:27:00;Station-45;10083;0;172;CKB -LINE_23;Station-45;2022-03-12 05:27:00;2022-03-12 05:27:00;Station-0;0.06;0;172;CKB -LINE_23;Station-0;2022-03-12 02:04:00;2022-03-12 02:04:00;Station-45;0.06;0;173;CKB -LINE_23;Station-45;2022-03-12 02:04:00;2022-03-12 02:30:00;Station-46;9016;0;173;CKB -LINE_23;Station-46;2022-03-12 02:30:00;2022-03-12 02:57:00;Station-45;10083;7;173;CKB -LINE_23;Station-45;2022-03-12 03:04:00;2022-03-12 03:30:00;Station-46;9016;0;173;CKB -LINE_23;Station-46;2022-03-12 03:30:00;2022-03-12 03:57:00;Station-45;10083;7;173;CKB -LINE_23;Station-45;2022-03-12 04:04:00;2022-03-12 04:30:00;Station-46;9016;0;173;CKB -LINE_23;Station-46;2022-03-12 04:30:00;2022-03-12 04:57:00;Station-45;10083;7;173;CKB -LINE_23;Station-45;2022-03-12 05:04:00;2022-03-12 05:30:00;Station-46;9016;0;173;CKB -LINE_23;Station-46;2022-03-12 05:30:00;2022-03-12 05:30:00;Station-0;0.06;0;173;CKB -LINE_24;Station-0;2022-03-12 00:31:00;2022-03-12 00:31:00;Station-21;0.06;0;174;CKB -LINE_24;Station-21;2022-03-12 00:31:00;2022-03-12 00:44:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 00:44:00;2022-03-12 00:56:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 01:01:00;2022-03-12 01:14:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 01:14:00;2022-03-12 01:26:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 01:31:00;2022-03-12 01:44:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 01:44:00;2022-03-12 01:56:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 02:01:00;2022-03-12 02:14:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 02:14:00;2022-03-12 02:26:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 02:31:00;2022-03-12 02:44:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 02:44:00;2022-03-12 02:56:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 03:01:00;2022-03-12 03:14:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 03:14:00;2022-03-12 03:26:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 03:31:00;2022-03-12 03:44:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 03:44:00;2022-03-12 03:56:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 04:01:00;2022-03-12 04:14:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 04:14:00;2022-03-12 04:26:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 04:31:00;2022-03-12 04:44:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 04:44:00;2022-03-12 04:56:00;Station-21;5362;5;174;CKB -LINE_24;Station-21;2022-03-12 05:01:00;2022-03-12 05:14:00;Station-47;4872;0;174;CKB -LINE_24;Station-47;2022-03-12 05:14:00;2022-03-12 05:26:00;Station-21;5362;0;174;CKB -LINE_24;Station-21;2022-03-12 05:26:00;2022-03-12 05:26:00;Station-0;0.06;0;174;CKB -LINE_25;Station-0;2022-03-12 00:31:00;2022-03-12 00:31:00;Station-21;0.06;0;175;CKB -LINE_25;Station-21;2022-03-12 00:31:00;2022-03-12 00:45:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 00:47:00;2022-03-12 01:01:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 01:01:00;2022-03-12 01:15:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 01:17:00;2022-03-12 01:31:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 01:31:00;2022-03-12 01:45:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 01:47:00;2022-03-12 02:01:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 02:01:00;2022-03-12 02:15:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 02:17:00;2022-03-12 02:31:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 02:31:00;2022-03-12 02:45:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 02:47:00;2022-03-12 03:01:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 03:01:00;2022-03-12 03:15:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 03:17:00;2022-03-12 03:31:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 03:31:00;2022-03-12 03:45:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 03:47:00;2022-03-12 04:01:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 04:01:00;2022-03-12 04:15:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 04:17:00;2022-03-12 04:31:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 04:31:00;2022-03-12 04:45:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 04:47:00;2022-03-12 05:01:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 05:01:00;2022-03-12 05:15:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 05:17:00;2022-03-12 05:31:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 05:31:00;2022-03-12 05:45:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 05:47:00;2022-03-12 06:01:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 06:01:00;2022-03-12 06:15:00;Station-48;5225;2;175;CKB -LINE_25;Station-48;2022-03-12 06:17:00;2022-03-12 06:31:00;Station-21;7617;0;175;CKB -LINE_25;Station-21;2022-03-12 06:31:00;2022-03-12 06:45:00;Station-48;5096;0;175;CKB -LINE_25;Station-48;2022-03-12 06:45:00;2022-03-12 06:45:00;Station-0;0.06;0;175;CKB -LINE_26;Station-0;2022-03-12 00:43:00;2022-03-12 00:43:00;Station-49;0.06;0;176;CKB -LINE_26;Station-49;2022-03-12 00:43:00;2022-03-12 00:53:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 00:53:00;2022-03-12 01:03:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 01:13:00;2022-03-12 01:23:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 01:23:00;2022-03-12 01:33:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 01:43:00;2022-03-12 01:53:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 01:53:00;2022-03-12 02:03:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 02:13:00;2022-03-12 02:23:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 02:23:00;2022-03-12 02:33:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 02:43:00;2022-03-12 02:53:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 02:53:00;2022-03-12 03:03:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 03:13:00;2022-03-12 03:23:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 03:23:00;2022-03-12 03:33:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 03:43:00;2022-03-12 03:53:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 03:53:00;2022-03-12 04:03:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 04:13:00;2022-03-12 04:23:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 04:23:00;2022-03-12 04:33:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 04:43:00;2022-03-12 04:53:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 04:53:00;2022-03-12 05:03:00;Station-49;4408;10;176;CKB -LINE_26;Station-49;2022-03-12 05:13:00;2022-03-12 05:23:00;Station-50;4507;0;176;CKB -LINE_26;Station-50;2022-03-12 05:23:00;2022-03-12 05:23:00;Station-0;0.06;0;176;CKB -LINE_0;Station-0;2022-03-12 20:51:00;2022-03-12 20:51:00;Station-1;0.06;0;177;CKB -LINE_0;Station-1;2022-03-12 20:51:00;2022-03-12 21:24:00;Station-2;14519;4;177;CKB -LINE_0;Station-2;2022-03-12 21:28:00;2022-03-12 22:03:00;Station-1;13541;8;177;CKB -LINE_0;Station-1;2022-03-12 22:11:00;2022-03-12 22:44:00;Station-2;14519;4;177;CKB -LINE_0;Station-2;2022-03-12 22:48:00;2022-03-12 23:23:00;Station-1;13541;8;177;CKB -LINE_0;Station-1;2022-03-12 23:31:00;2022-03-13 00:04:00;Station-2;14519;4;177;CKB -LINE_0;Station-2;2022-03-13 00:08:00;2022-03-13 00:39:00;Station-5;12213;0;177;CKB -LINE_1;Station-5;2022-03-13 00:39:00;2022-03-13 00:47:00;Station-3;4.0;2;177;CKB -LINE_1;Station-3;2022-03-13 00:49:00;2022-03-13 01:12:00;Station-4;8.36;6;177;CKB -LINE_1;Station-4;2022-03-13 01:18:00;2022-03-13 01:36:00;Station-3;9067;13;177;CKB -LINE_1;Station-3;2022-03-13 01:49:00;2022-03-13 02:12:00;Station-4;8.36;6;177;CKB -LINE_1;Station-4;2022-03-13 02:18:00;2022-03-13 02:36:00;Station-3;9067;13;177;CKB -LINE_1;Station-3;2022-03-13 02:49:00;2022-03-13 03:12:00;Station-4;8.36;6;177;CKB -LINE_1;Station-4;2022-03-13 03:18:00;2022-03-13 03:36:00;Station-3;9067;13;177;CKB -LINE_1;Station-3;2022-03-13 03:49:00;2022-03-13 04:12:00;Station-4;8.36;6;177;CKB -LINE_1;Station-4;2022-03-13 04:18:00;2022-03-13 04:36:00;Station-3;9067;13;177;CKB -LINE_1;Station-3;2022-03-13 04:49:00;2022-03-13 05:12:00;Station-4;8.36;6;177;CKB -LINE_1;Station-4;2022-03-13 05:18:00;2022-03-13 05:36:00;Station-3;9067;13;177;CKB -LINE_1;Station-3;2022-03-13 05:49:00;2022-03-13 06:08:00;Station-4;8762;10;177;CKB -LINE_1;Station-4;2022-03-13 06:18:00;2022-03-13 06:36:00;Station-3;9067;13;177;CKB -LINE_1;Station-3;2022-03-13 06:49:00;2022-03-13 07:08:00;Station-4;8762;0;177;CKB -LINE_1;Station-4;2022-03-13 07:08:00;2022-03-13 07:08:00;Station-0;0.06;0;177;CKB -LINE_0;Station-0;2022-03-12 21:31:00;2022-03-12 21:31:00;Station-1;0.06;0;178;CKB -LINE_0;Station-1;2022-03-12 21:31:00;2022-03-12 22:04:00;Station-2;14519;4;178;CKB -LINE_0;Station-2;2022-03-12 22:08:00;2022-03-12 22:43:00;Station-1;13541;8;178;CKB -LINE_0;Station-1;2022-03-12 22:51:00;2022-03-12 23:24:00;Station-2;14519;4;178;CKB -LINE_0;Station-2;2022-03-12 23:28:00;2022-03-13 00:03:00;Station-1;13541;8;178;CKB -LINE_0;Station-1;2022-03-13 00:11:00;2022-03-13 00:44:00;Station-2;14519;0;178;CKB -LINE_1;Station-2;2022-03-13 00:44:00;2022-03-13 00:54:00;Station-3;4.1;25;178;CKB -LINE_1;Station-3;2022-03-13 01:19:00;2022-03-13 01:42:00;Station-4;8.36;6;178;CKB -LINE_1;Station-4;2022-03-13 01:48:00;2022-03-13 02:06:00;Station-3;9067;13;178;CKB -LINE_1;Station-3;2022-03-13 02:19:00;2022-03-13 02:42:00;Station-4;8.36;6;178;CKB -LINE_1;Station-4;2022-03-13 02:48:00;2022-03-13 03:06:00;Station-3;9067;13;178;CKB -LINE_1;Station-3;2022-03-13 03:19:00;2022-03-13 03:42:00;Station-4;8.36;6;178;CKB -LINE_1;Station-4;2022-03-13 03:48:00;2022-03-13 04:06:00;Station-3;9067;13;178;CKB -LINE_1;Station-3;2022-03-13 04:19:00;2022-03-13 04:42:00;Station-4;8.36;6;178;CKB -LINE_1;Station-4;2022-03-13 04:48:00;2022-03-13 05:06:00;Station-3;9067;13;178;CKB -LINE_1;Station-3;2022-03-13 05:19:00;2022-03-13 05:42:00;Station-4;8.36;6;178;CKB -LINE_1;Station-4;2022-03-13 05:48:00;2022-03-13 06:06:00;Station-3;9067;0;178;CKB -LINE_1;Station-3;2022-03-13 06:06:00;2022-03-13 06:06:00;Station-0;0.06;0;178;CKB -LINE_2;Station-0;2022-03-12 21:06:00;2022-03-12 21:06:00;Station-6;0.06;0;179;CKB -LINE_2;Station-6;2022-03-12 21:06:00;2022-03-12 21:34:00;Station-7;13018;19;179;CKB -LINE_2;Station-7;2022-03-12 21:53:00;2022-03-12 22:13:00;Station-8;10332;17;179;CKB -LINE_2;Station-8;2022-03-12 22:30:00;2022-03-12 22:54:00;Station-7;10.48;19;179;CKB -LINE_2;Station-7;2022-03-12 23:13:00;2022-03-12 23:33:00;Station-8;10332;17;179;CKB -LINE_2;Station-8;2022-03-12 23:50:00;2022-03-13 00:14:00;Station-7;10.48;8;179;CKB -LINE_2;Station-7;2022-03-13 00:22:00;2022-03-13 00:27:00;Station-58;2533;2;179;CKB -LINE_3;Station-58;2022-03-13 00:29:00;2022-03-13 00:47:00;Station-10;7.58;0;179;CKB -LINE_3;Station-10;2022-03-13 00:47:00;2022-03-13 01:14:00;Station-11;12841;3;179;CKB -LINE_3;Station-11;2022-03-13 01:17:00;2022-03-13 01:47:00;Station-10;14281;0;179;CKB -LINE_3;Station-10;2022-03-13 01:47:00;2022-03-13 02:14:00;Station-11;12841;3;179;CKB -LINE_3;Station-11;2022-03-13 02:17:00;2022-03-13 02:47:00;Station-10;14281;0;179;CKB -LINE_3;Station-10;2022-03-13 02:47:00;2022-03-13 03:14:00;Station-11;12841;3;179;CKB -LINE_3;Station-11;2022-03-13 03:17:00;2022-03-13 03:47:00;Station-10;14281;0;179;CKB -LINE_3;Station-10;2022-03-13 03:47:00;2022-03-13 04:14:00;Station-11;12841;3;179;CKB -LINE_3;Station-11;2022-03-13 04:17:00;2022-03-13 04:47:00;Station-10;14281;0;179;CKB -LINE_3;Station-10;2022-03-13 04:47:00;2022-03-13 05:14:00;Station-11;12841;3;179;CKB -LINE_3;Station-11;2022-03-13 05:17:00;2022-03-13 05:47:00;Station-10;14281;0;179;CKB -LINE_3;Station-10;2022-03-13 05:47:00;2022-03-13 06:14:00;Station-11;12841;3;179;CKB -LINE_3;Station-11;2022-03-13 06:17:00;2022-03-13 06:47:00;Station-10;14281;0;179;CKB -LINE_3;Station-10;2022-03-13 06:47:00;2022-03-13 06:59:00;Station-58;5474;0;179;CKB -LINE_3;Station-58;2022-03-13 06:59:00;2022-03-13 06:59:00;Station-0;0.06;0;179;CKB -LINE_2;Station-0;2022-03-12 20:26:00;2022-03-12 20:26:00;Station-6;0.06;0;180;CKB -LINE_2;Station-6;2022-03-12 20:26:00;2022-03-12 20:56:00;Station-12;14097;14;180;CKB -LINE_2;Station-12;2022-03-12 21:10:00;2022-03-12 21:38:00;Station-6;13.19;8;180;CKB -LINE_2;Station-6;2022-03-12 21:46:00;2022-03-12 22:14:00;Station-7;13018;19;180;CKB -LINE_2;Station-7;2022-03-12 22:33:00;2022-03-12 22:53:00;Station-8;10332;17;180;CKB -LINE_2;Station-8;2022-03-12 23:10:00;2022-03-12 23:34:00;Station-7;10.48;19;180;CKB -LINE_2;Station-7;2022-03-12 23:53:00;2022-03-13 00:13:00;Station-8;10332;2;180;CKB -LINE_2;Station-8;2022-03-13 00:15:00;2022-03-13 00:16:00;Station-10;506;1;180;CKB -LINE_3;Station-10;2022-03-13 00:17:00;2022-03-13 00:44:00;Station-11;12841;3;180;CKB -LINE_3;Station-11;2022-03-13 00:47:00;2022-03-13 01:17:00;Station-10;14281;0;180;CKB -LINE_3;Station-10;2022-03-13 01:17:00;2022-03-13 01:44:00;Station-11;12841;3;180;CKB -LINE_3;Station-11;2022-03-13 01:47:00;2022-03-13 02:17:00;Station-10;14281;0;180;CKB -LINE_3;Station-10;2022-03-13 02:17:00;2022-03-13 02:44:00;Station-11;12841;3;180;CKB -LINE_3;Station-11;2022-03-13 02:47:00;2022-03-13 03:17:00;Station-10;14281;0;180;CKB -LINE_3;Station-10;2022-03-13 03:17:00;2022-03-13 03:44:00;Station-11;12841;3;180;CKB -LINE_3;Station-11;2022-03-13 03:47:00;2022-03-13 04:17:00;Station-10;14281;0;180;CKB -LINE_3;Station-10;2022-03-13 04:17:00;2022-03-13 04:44:00;Station-11;12841;3;180;CKB -LINE_3;Station-11;2022-03-13 04:47:00;2022-03-13 05:17:00;Station-10;14281;0;180;CKB -LINE_3;Station-10;2022-03-13 05:17:00;2022-03-13 05:44:00;Station-11;12841;3;180;CKB -LINE_3;Station-11;2022-03-13 05:47:00;2022-03-13 06:17:00;Station-10;14281;0;180;CKB -LINE_3;Station-10;2022-03-13 06:17:00;2022-03-13 06:44:00;Station-11;12841;3;180;CKB -LINE_3;Station-11;2022-03-13 06:47:00;2022-03-13 07:17:00;Station-10;14281;0;180;CKB -LINE_3;Station-10;2022-03-13 07:17:00;2022-03-13 07:17:00;Station-0;0.06;0;180;CKB -LINE_5;Station-0;2022-03-12 20:26:00;2022-03-12 20:26:00;Station-14;0.06;0;181;CKB -LINE_5;Station-14;2022-03-12 20:26:00;2022-03-12 20:38:00;Station-15;5882;3;181;CKB -LINE_5;Station-15;2022-03-12 20:41:00;2022-03-12 20:55:00;Station-14;6232;0;181;CKB -LINE_5;Station-14;2022-03-12 20:55:00;2022-03-12 21:08:00;Station-15;6086;3;181;CKB -LINE_5;Station-15;2022-03-12 21:11:00;2022-03-12 21:25:00;Station-14;6232;0;181;CKB -LINE_5;Station-14;2022-03-12 21:25:00;2022-03-12 21:38:00;Station-15;6086;3;181;CKB -LINE_5;Station-15;2022-03-12 21:41:00;2022-03-12 21:55:00;Station-14;6232;0;181;CKB -LINE_5;Station-14;2022-03-12 21:55:00;2022-03-12 22:08:00;Station-15;6086;3;181;CKB -LINE_5;Station-15;2022-03-12 22:11:00;2022-03-12 22:25:00;Station-14;6232;0;181;CKB -LINE_5;Station-14;2022-03-12 22:25:00;2022-03-12 22:38:00;Station-15;6086;3;181;CKB -LINE_5;Station-15;2022-03-12 22:41:00;2022-03-12 22:55:00;Station-14;6232;0;181;CKB -LINE_5;Station-14;2022-03-12 22:55:00;2022-03-12 23:08:00;Station-15;6086;3;181;CKB -LINE_5;Station-15;2022-03-12 23:11:00;2022-03-12 23:25:00;Station-14;6232;0;181;CKB -LINE_5;Station-14;2022-03-12 23:25:00;2022-03-12 23:38:00;Station-15;6086;3;181;CKB -LINE_5;Station-15;2022-03-12 23:41:00;2022-03-12 23:55:00;Station-14;6232;0;181;CKB -LINE_5;Station-14;2022-03-12 23:55:00;2022-03-13 00:08:00;Station-15;6086;0;181;CKB -LINE_5;Station-15;2022-03-13 00:08:00;2022-03-13 00:08:00;Station-0;0.06;0;181;CKB -LINE_6;Station-0;2022-03-12 05:25:00;2022-03-12 05:25:00;Station-16;0.06;0;182;CKB -LINE_6;Station-16;2022-03-12 05:25:00;2022-03-12 05:34:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 05:34:00;2022-03-12 05:43:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 06:05:00;2022-03-12 06:14:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 06:14:00;2022-03-12 06:23:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 06:25:00;2022-03-12 06:34:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 06:34:00;2022-03-12 06:43:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 06:45:00;2022-03-12 06:54:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 06:54:00;2022-03-12 07:03:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 07:05:00;2022-03-12 07:14:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 07:14:00;2022-03-12 07:23:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 07:25:00;2022-03-12 07:34:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 07:34:00;2022-03-12 07:43:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 08:05:00;2022-03-12 08:14:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 08:14:00;2022-03-12 08:23:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 08:25:00;2022-03-12 08:34:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 08:34:00;2022-03-12 08:43:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 08:45:00;2022-03-12 08:54:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 08:54:00;2022-03-12 09:03:00;Station-16;5139;3;182;CKB -LINE_6;Station-16;2022-03-12 09:06:00;2022-03-12 09:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 09:15:00;2022-03-12 09:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 09:26:00;2022-03-12 09:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 09:35:00;2022-03-12 09:44:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 10:06:00;2022-03-12 10:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 10:15:00;2022-03-12 10:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 10:26:00;2022-03-12 10:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 10:35:00;2022-03-12 10:44:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 10:46:00;2022-03-12 10:55:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 10:55:00;2022-03-12 11:04:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 11:06:00;2022-03-12 11:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 11:15:00;2022-03-12 11:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 11:26:00;2022-03-12 11:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 11:35:00;2022-03-12 11:44:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 12:06:00;2022-03-12 12:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 12:15:00;2022-03-12 12:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 12:26:00;2022-03-12 12:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 12:35:00;2022-03-12 12:44:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 12:46:00;2022-03-12 12:55:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 12:55:00;2022-03-12 13:04:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 13:06:00;2022-03-12 13:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 13:15:00;2022-03-12 13:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 13:26:00;2022-03-12 13:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 13:35:00;2022-03-12 13:44:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 14:06:00;2022-03-12 14:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 14:15:00;2022-03-12 14:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 14:26:00;2022-03-12 14:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 14:35:00;2022-03-12 14:44:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 14:46:00;2022-03-12 14:55:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 14:55:00;2022-03-12 15:04:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 15:06:00;2022-03-12 15:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 15:15:00;2022-03-12 15:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 15:26:00;2022-03-12 15:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 15:35:00;2022-03-12 15:44:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 16:06:00;2022-03-12 16:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 16:15:00;2022-03-12 16:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 16:26:00;2022-03-12 16:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 16:35:00;2022-03-12 16:44:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 16:46:00;2022-03-12 16:55:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 16:55:00;2022-03-12 17:04:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 17:06:00;2022-03-12 17:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 17:15:00;2022-03-12 17:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 17:26:00;2022-03-12 17:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 17:35:00;2022-03-12 17:44:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 18:06:00;2022-03-12 18:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 18:15:00;2022-03-12 18:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 18:26:00;2022-03-12 18:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 18:35:00;2022-03-12 18:44:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 18:46:00;2022-03-12 18:55:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 18:55:00;2022-03-12 19:04:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 19:06:00;2022-03-12 19:15:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 19:15:00;2022-03-12 19:24:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 19:26:00;2022-03-12 19:35:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 19:35:00;2022-03-12 19:44:00;Station-16;5139;21;182;CKB -LINE_6;Station-16;2022-03-12 20:05:00;2022-03-12 20:14:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 20:14:00;2022-03-12 20:23:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 20:25:00;2022-03-12 20:34:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 20:34:00;2022-03-12 20:43:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 20:45:00;2022-03-12 20:54:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 20:54:00;2022-03-12 21:03:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 21:05:00;2022-03-12 21:14:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 21:14:00;2022-03-12 21:23:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 21:25:00;2022-03-12 21:34:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 21:34:00;2022-03-12 21:43:00;Station-16;5139;22;182;CKB -LINE_6;Station-16;2022-03-12 22:05:00;2022-03-12 22:14:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 22:14:00;2022-03-12 22:23:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 22:25:00;2022-03-12 22:34:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 22:34:00;2022-03-12 22:43:00;Station-16;5139;2;182;CKB -LINE_6;Station-16;2022-03-12 22:45:00;2022-03-12 22:54:00;Station-17;4781;0;182;CKB -LINE_6;Station-17;2022-03-12 22:54:00;2022-03-12 23:03:00;Station-16;5139;0;182;CKB -LINE_6;Station-16;2022-03-12 23:03:00;2022-03-12 23:03:00;Station-0;0.06;0;182;CKB -LINE_29;Station-0;2022-03-12 07:30:00;2022-03-12 07:30:00;Station-53;0.06;0;183;CKB -LINE_29;Station-53;2022-03-12 07:30:00;2022-03-12 07:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 07:39:00;2022-03-12 07:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 07:50:00;2022-03-12 07:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 07:59:00;2022-03-12 08:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 08:10:00;2022-03-12 08:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 08:19:00;2022-03-12 08:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 08:30:00;2022-03-12 08:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 08:39:00;2022-03-12 08:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 08:50:00;2022-03-12 08:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 08:59:00;2022-03-12 09:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 09:10:00;2022-03-12 09:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 09:19:00;2022-03-12 09:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 09:30:00;2022-03-12 09:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 09:39:00;2022-03-12 09:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 09:50:00;2022-03-12 09:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 09:59:00;2022-03-12 10:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 10:10:00;2022-03-12 10:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 10:19:00;2022-03-12 10:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 10:30:00;2022-03-12 10:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 10:39:00;2022-03-12 10:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 10:50:00;2022-03-12 10:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 10:59:00;2022-03-12 11:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 11:10:00;2022-03-12 11:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 11:19:00;2022-03-12 11:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 11:30:00;2022-03-12 11:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 11:39:00;2022-03-12 11:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 11:50:00;2022-03-12 11:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 11:59:00;2022-03-12 12:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 12:10:00;2022-03-12 12:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 12:19:00;2022-03-12 12:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 12:30:00;2022-03-12 12:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 12:39:00;2022-03-12 12:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 12:50:00;2022-03-12 12:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 12:59:00;2022-03-12 13:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 13:10:00;2022-03-12 13:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 13:19:00;2022-03-12 13:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 13:30:00;2022-03-12 13:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 13:39:00;2022-03-12 13:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 13:50:00;2022-03-12 13:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 13:59:00;2022-03-12 14:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 14:10:00;2022-03-12 14:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 14:19:00;2022-03-12 14:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 14:30:00;2022-03-12 14:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 14:39:00;2022-03-12 14:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 14:50:00;2022-03-12 14:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 14:59:00;2022-03-12 15:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 15:10:00;2022-03-12 15:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 15:19:00;2022-03-12 15:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 15:30:00;2022-03-12 15:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 15:39:00;2022-03-12 15:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 15:50:00;2022-03-12 15:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 15:59:00;2022-03-12 16:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 16:10:00;2022-03-12 16:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 16:19:00;2022-03-12 16:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 16:30:00;2022-03-12 16:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 16:39:00;2022-03-12 16:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 16:50:00;2022-03-12 16:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 16:59:00;2022-03-12 17:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 17:10:00;2022-03-12 17:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 17:19:00;2022-03-12 17:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 17:30:00;2022-03-12 17:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 17:39:00;2022-03-12 17:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 17:50:00;2022-03-12 17:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 17:59:00;2022-03-12 18:10:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 18:10:00;2022-03-12 18:15:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 18:19:00;2022-03-12 18:30:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 18:30:00;2022-03-12 18:35:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 18:39:00;2022-03-12 18:50:00;Station-53;4341;0;183;CKB -LINE_29;Station-53;2022-03-12 18:50:00;2022-03-12 18:55:00;Station-54;2217;4;183;CKB -LINE_29;Station-54;2022-03-12 18:59:00;2022-03-12 19:10:00;Station-53;4288;0;183;CKB -LINE_29;Station-53;2022-03-12 19:10:00;2022-03-12 19:10:00;Station-0;0.06;0;183;CKB -LINE_9;Station-22;2022-03-12 08:08:00;2022-03-12 08:41:00;Station-23;17.9;0;184;VDL -LINE_9;Station-23;2022-03-12 08:41:00;2022-03-12 08:54:00;Station-23;4637;9;184;VDL -LINE_9;Station-23;2022-03-12 09:03:00;2022-03-12 09:17:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 09:21:00;2022-03-12 09:35:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 09:43:00;2022-03-12 09:57:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 10:01:00;2022-03-12 10:15:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 10:23:00;2022-03-12 10:37:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 10:41:00;2022-03-12 10:55:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 11:03:00;2022-03-12 11:17:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 11:21:00;2022-03-12 11:35:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 11:43:00;2022-03-12 11:57:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 12:01:00;2022-03-12 12:15:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 12:23:00;2022-03-12 12:37:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 12:41:00;2022-03-12 12:55:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 13:03:00;2022-03-12 13:17:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 13:21:00;2022-03-12 13:35:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 13:43:00;2022-03-12 13:57:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 14:01:00;2022-03-12 14:15:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 14:23:00;2022-03-12 14:37:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 14:41:00;2022-03-12 14:55:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 15:03:00;2022-03-12 15:17:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 15:21:00;2022-03-12 15:35:00;Station-23;4637;8;184;VDL -LINE_9;Station-23;2022-03-12 15:43:00;2022-03-12 15:57:00;Station-23;4637;4;184;VDL -LINE_9;Station-23;2022-03-12 16:01:00;2022-03-12 16:14:00;Station-23;4637;0;184;VDL -LINE_9;Station-23;2022-03-12 16:14:00;2022-03-12 16:57:00;Station-22;19.8;0;184;VDL -LINE_30;Station-0;2022-03-12 07:18:00;2022-03-12 07:18:00;Station-55;0.06;0;185;CKB -LINE_30;Station-55;2022-03-12 07:18:00;2022-03-12 07:26:00;Station-56;5562;10;185;CKB -LINE_30;Station-56;2022-03-12 07:36:00;2022-03-12 07:45:00;Station-57;5941;32;185;CKB -LINE_30;Station-57;2022-03-12 08:17:00;2022-03-12 08:26:00;Station-56;5994;8;185;CKB -LINE_30;Station-56;2022-03-12 08:34:00;2022-03-12 08:42:00;Station-55;5566;0;185;CKB -LINE_30;Station-55;2022-03-12 08:42:00;2022-03-12 08:42:00;Station-0;0.06;0;185;CKB -LINE_12;Station-0;2022-03-12 08:10:00;2022-03-12 08:10:00;Station-27;0.06;0;186;CKB -LINE_12;Station-27;2022-03-12 08:10:00;2022-03-12 08:16:00;Station-28;2169;12;186;CKB -LINE_12;Station-28;2022-03-12 08:28:00;2022-03-12 08:38:00;Station-27;2952;2;186;CKB -LINE_12;Station-27;2022-03-12 08:40:00;2022-03-12 08:46:00;Station-28;2169;12;186;CKB -LINE_12;Station-28;2022-03-12 08:58:00;2022-03-12 09:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 09:10:00;2022-03-12 09:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 09:28:00;2022-03-12 09:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 09:40:00;2022-03-12 09:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 09:58:00;2022-03-12 10:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 10:10:00;2022-03-12 10:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 10:28:00;2022-03-12 10:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 10:40:00;2022-03-12 10:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 10:58:00;2022-03-12 11:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 11:10:00;2022-03-12 11:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 11:28:00;2022-03-12 11:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 11:40:00;2022-03-12 11:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 11:58:00;2022-03-12 12:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 12:10:00;2022-03-12 12:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 12:28:00;2022-03-12 12:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 12:40:00;2022-03-12 12:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 12:58:00;2022-03-12 13:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 13:10:00;2022-03-12 13:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 13:28:00;2022-03-12 13:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 13:40:00;2022-03-12 13:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 13:58:00;2022-03-12 14:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 14:10:00;2022-03-12 14:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 14:28:00;2022-03-12 14:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 14:40:00;2022-03-12 14:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 14:58:00;2022-03-12 15:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 15:10:00;2022-03-12 15:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 15:28:00;2022-03-12 15:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 15:40:00;2022-03-12 15:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 15:58:00;2022-03-12 16:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 16:10:00;2022-03-12 16:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 16:28:00;2022-03-12 16:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 16:40:00;2022-03-12 16:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 16:58:00;2022-03-12 17:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 17:10:00;2022-03-12 17:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 17:28:00;2022-03-12 17:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 17:40:00;2022-03-12 17:48:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 17:58:00;2022-03-12 18:10:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 18:10:00;2022-03-12 18:18:00;Station-28;2169;10;186;CKB -LINE_12;Station-28;2022-03-12 18:28:00;2022-03-12 18:40:00;Station-27;2952;0;186;CKB -LINE_12;Station-27;2022-03-12 18:40:00;2022-03-12 18:48:00;Station-28;2169;0;186;CKB -LINE_12;Station-28;2022-03-12 18:48:00;2022-03-12 18:48:00;Station-0;0.06;0;186;CKB -LINE_13;Station-0;2022-03-13 00:23:00;2022-03-13 00:23:00;Station-29;0.06;0;187;CKB -LINE_13;Station-29;2022-03-13 00:23:00;2022-03-13 00:30:00;Station-30;2577;9;187;CKB -LINE_14;Station-30;2022-03-13 00:39:00;2022-03-13 00:54:00;Station-31;5937;9;187;CKB -LINE_14;Station-31;2022-03-13 01:03:00;2022-03-13 01:17:00;Station-30;6.19;0;187;CKB -LINE_13;Station-30;2022-03-13 01:17:00;2022-03-13 01:23:00;Station-29;2555;0;187;CKB -LINE_13;Station-29;2022-03-13 01:23:00;2022-03-13 01:30:00;Station-30;2577;9;187;CKB -LINE_14;Station-30;2022-03-13 01:39:00;2022-03-13 01:54:00;Station-31;5937;9;187;CKB -LINE_14;Station-31;2022-03-13 02:03:00;2022-03-13 02:17:00;Station-30;6.19;0;187;CKB -LINE_13;Station-30;2022-03-13 02:17:00;2022-03-13 02:23:00;Station-29;2555;0;187;CKB -LINE_13;Station-29;2022-03-13 02:23:00;2022-03-13 02:30:00;Station-30;2577;9;187;CKB -LINE_14;Station-30;2022-03-13 02:39:00;2022-03-13 02:54:00;Station-31;5937;9;187;CKB -LINE_14;Station-31;2022-03-13 03:03:00;2022-03-13 03:17:00;Station-30;6.19;0;187;CKB -LINE_13;Station-30;2022-03-13 03:17:00;2022-03-13 03:23:00;Station-29;2555;0;187;CKB -LINE_13;Station-29;2022-03-13 03:23:00;2022-03-13 03:30:00;Station-30;2577;9;187;CKB -LINE_14;Station-30;2022-03-13 03:39:00;2022-03-13 03:54:00;Station-31;5937;9;187;CKB -LINE_14;Station-31;2022-03-13 04:03:00;2022-03-13 04:17:00;Station-30;6.19;0;187;CKB -LINE_13;Station-30;2022-03-13 04:17:00;2022-03-13 04:23:00;Station-29;2555;0;187;CKB -LINE_13;Station-29;2022-03-13 04:23:00;2022-03-13 04:30:00;Station-30;2577;9;187;CKB -LINE_14;Station-30;2022-03-13 04:39:00;2022-03-13 04:54:00;Station-31;5937;9;187;CKB -LINE_14;Station-31;2022-03-13 05:03:00;2022-03-13 05:17:00;Station-30;6.19;0;187;CKB -LINE_13;Station-30;2022-03-13 05:17:00;2022-03-13 05:23:00;Station-29;2555;0;187;CKB -LINE_13;Station-29;2022-03-13 05:23:00;2022-03-13 05:30:00;Station-30;2577;9;187;CKB -LINE_14;Station-30;2022-03-13 05:39:00;2022-03-13 05:54:00;Station-31;5937;9;187;CKB -LINE_14;Station-31;2022-03-13 06:03:00;2022-03-13 06:17:00;Station-30;6.19;0;187;CKB -LINE_13;Station-30;2022-03-13 06:17:00;2022-03-13 06:23:00;Station-29;2555;0;187;CKB -LINE_13;Station-29;2022-03-13 06:23:00;2022-03-13 06:30:00;Station-30;2577;9;187;CKB -LINE_14;Station-30;2022-03-13 06:39:00;2022-03-13 06:54:00;Station-31;5937;0;187;CKB -LINE_14;Station-31;2022-03-13 06:54:00;2022-03-13 06:54:00;Station-0;0.06;0;187;CKB -LINE_14;Station-0;2022-03-13 00:33:00;2022-03-13 00:33:00;Station-31;0.06;0;188;CKB -LINE_14;Station-31;2022-03-13 00:33:00;2022-03-13 00:47:00;Station-30;6.19;0;188;CKB -LINE_13;Station-30;2022-03-13 00:47:00;2022-03-13 00:53:00;Station-29;2555;0;188;CKB -LINE_13;Station-29;2022-03-13 00:53:00;2022-03-13 01:00:00;Station-30;2577;9;188;CKB -LINE_14;Station-30;2022-03-13 01:09:00;2022-03-13 01:24:00;Station-31;5937;9;188;CKB -LINE_14;Station-31;2022-03-13 01:33:00;2022-03-13 01:47:00;Station-30;6.19;0;188;CKB -LINE_13;Station-30;2022-03-13 01:47:00;2022-03-13 01:53:00;Station-29;2555;0;188;CKB -LINE_13;Station-29;2022-03-13 01:53:00;2022-03-13 02:00:00;Station-30;2577;9;188;CKB -LINE_14;Station-30;2022-03-13 02:09:00;2022-03-13 02:24:00;Station-31;5937;9;188;CKB -LINE_14;Station-31;2022-03-13 02:33:00;2022-03-13 02:47:00;Station-30;6.19;0;188;CKB -LINE_13;Station-30;2022-03-13 02:47:00;2022-03-13 02:53:00;Station-29;2555;0;188;CKB -LINE_13;Station-29;2022-03-13 02:53:00;2022-03-13 03:00:00;Station-30;2577;9;188;CKB -LINE_14;Station-30;2022-03-13 03:09:00;2022-03-13 03:24:00;Station-31;5937;9;188;CKB -LINE_14;Station-31;2022-03-13 03:33:00;2022-03-13 03:47:00;Station-30;6.19;0;188;CKB -LINE_13;Station-30;2022-03-13 03:47:00;2022-03-13 03:53:00;Station-29;2555;0;188;CKB -LINE_13;Station-29;2022-03-13 03:53:00;2022-03-13 04:00:00;Station-30;2577;9;188;CKB -LINE_14;Station-30;2022-03-13 04:09:00;2022-03-13 04:24:00;Station-31;5937;9;188;CKB -LINE_14;Station-31;2022-03-13 04:33:00;2022-03-13 04:47:00;Station-30;6.19;0;188;CKB -LINE_13;Station-30;2022-03-13 04:47:00;2022-03-13 04:53:00;Station-29;2555;0;188;CKB -LINE_13;Station-29;2022-03-13 04:53:00;2022-03-13 05:00:00;Station-30;2577;9;188;CKB -LINE_14;Station-30;2022-03-13 05:09:00;2022-03-13 05:24:00;Station-31;5937;9;188;CKB -LINE_14;Station-31;2022-03-13 05:33:00;2022-03-13 05:47:00;Station-30;6.19;0;188;CKB -LINE_13;Station-30;2022-03-13 05:47:00;2022-03-13 05:53:00;Station-29;2555;0;188;CKB -LINE_13;Station-29;2022-03-13 05:53:00;2022-03-13 06:00:00;Station-30;2577;9;188;CKB -LINE_14;Station-30;2022-03-13 06:09:00;2022-03-13 06:24:00;Station-31;5937;9;188;CKB -LINE_14;Station-31;2022-03-13 06:33:00;2022-03-13 06:47:00;Station-30;6.19;0;188;CKB -LINE_14;Station-30;2022-03-13 06:47:00;2022-03-13 06:47:00;Station-0;0.06;0;188;CKB -LINE_15;Station-0;2022-03-13 00:57:00;2022-03-13 00:57:00;Station-32;0.06;0;189;CKB -LINE_15;Station-32;2022-03-13 00:57:00;2022-03-13 01:06:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 01:06:00;2022-03-13 01:11:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 01:27:00;2022-03-13 01:36:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 01:36:00;2022-03-13 01:41:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 01:57:00;2022-03-13 02:06:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 02:06:00;2022-03-13 02:11:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 02:27:00;2022-03-13 02:36:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 02:36:00;2022-03-13 02:41:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 02:57:00;2022-03-13 03:06:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 03:06:00;2022-03-13 03:11:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 03:27:00;2022-03-13 03:36:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 03:36:00;2022-03-13 03:41:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 03:57:00;2022-03-13 04:06:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 04:06:00;2022-03-13 04:11:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 04:27:00;2022-03-13 04:36:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 04:36:00;2022-03-13 04:41:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 04:57:00;2022-03-13 05:06:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 05:06:00;2022-03-13 05:11:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 05:27:00;2022-03-13 05:36:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 05:36:00;2022-03-13 05:41:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 05:57:00;2022-03-13 06:06:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 06:06:00;2022-03-13 06:11:00;Station-32;2936;16;189;CKB -LINE_15;Station-32;2022-03-13 06:27:00;2022-03-13 06:36:00;Station-33;4343;0;189;CKB -LINE_15;Station-33;2022-03-13 06:36:00;2022-03-13 06:41:00;Station-32;2936;0;189;CKB -LINE_15;Station-32;2022-03-13 06:41:00;2022-03-13 06:41:00;Station-0;0.06;0;189;CKB -LINE_17;Station-0;2022-03-13 00:30:00;2022-03-13 00:30:00;Station-34;0.06;0;190;CKB -LINE_17;Station-34;2022-03-13 00:30:00;2022-03-13 00:44:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 00:44:00;2022-03-13 00:57:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 01:00:00;2022-03-13 01:14:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 01:14:00;2022-03-13 01:27:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 01:30:00;2022-03-13 01:44:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 01:44:00;2022-03-13 01:57:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 02:00:00;2022-03-13 02:14:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 02:14:00;2022-03-13 02:27:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 02:30:00;2022-03-13 02:44:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 02:44:00;2022-03-13 02:57:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 03:00:00;2022-03-13 03:14:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 03:14:00;2022-03-13 03:27:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 03:30:00;2022-03-13 03:44:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 03:44:00;2022-03-13 03:57:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 04:00:00;2022-03-13 04:14:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 04:14:00;2022-03-13 04:27:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 04:30:00;2022-03-13 04:44:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 04:44:00;2022-03-13 04:57:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 05:00:00;2022-03-13 05:14:00;Station-36;4801;0;190;CKB -LINE_17;Station-36;2022-03-13 05:14:00;2022-03-13 05:27:00;Station-34;5302;3;190;CKB -LINE_17;Station-34;2022-03-13 05:30:00;2022-03-13 05:44:00;Station-36;4.8;0;190;CKB -LINE_17;Station-36;2022-03-13 05:44:00;2022-03-13 05:56:00;Station-34;5301;4;190;CKB -LINE_17;Station-34;2022-03-13 06:00:00;2022-03-13 06:14:00;Station-36;4.8;0;190;CKB -LINE_17;Station-36;2022-03-13 06:14:00;2022-03-13 06:26:00;Station-34;5301;4;190;CKB -LINE_17;Station-34;2022-03-13 06:30:00;2022-03-13 06:44:00;Station-36;4.8;0;190;CKB -LINE_17;Station-36;2022-03-13 06:44:00;2022-03-13 06:56:00;Station-34;5301;0;190;CKB -LINE_17;Station-34;2022-03-13 06:56:00;2022-03-13 06:56:00;Station-0;0.06;0;190;CKB -LINE_20;Station-0;2022-03-13 00:32:00;2022-03-13 00:32:00;Station-13;0.06;0;191;CKB -LINE_20;Station-13;2022-03-13 00:32:00;2022-03-13 00:44:00;Station-40;4212;3;191;CKB -LINE_20;Station-40;2022-03-13 00:47:00;2022-03-13 01:16:00;Station-41;13048;0;191;CKB -LINE_20;Station-41;2022-03-13 01:16:00;2022-03-13 01:42:00;Station-40;12869;5;191;CKB -LINE_20;Station-40;2022-03-13 01:47:00;2022-03-13 02:16:00;Station-41;13048;0;191;CKB -LINE_20;Station-41;2022-03-13 02:16:00;2022-03-13 02:42:00;Station-40;12869;5;191;CKB -LINE_20;Station-40;2022-03-13 02:47:00;2022-03-13 03:16:00;Station-41;13048;0;191;CKB -LINE_20;Station-41;2022-03-13 03:16:00;2022-03-13 03:42:00;Station-40;12869;5;191;CKB -LINE_20;Station-40;2022-03-13 03:47:00;2022-03-13 04:16:00;Station-41;13048;0;191;CKB -LINE_20;Station-41;2022-03-13 04:16:00;2022-03-13 04:42:00;Station-40;12869;5;191;CKB -LINE_20;Station-40;2022-03-13 04:47:00;2022-03-13 05:16:00;Station-41;13048;0;191;CKB -LINE_20;Station-41;2022-03-13 05:16:00;2022-03-13 05:42:00;Station-40;12869;5;191;CKB -LINE_20;Station-40;2022-03-13 05:47:00;2022-03-13 06:16:00;Station-41;13048;0;191;CKB -LINE_20;Station-41;2022-03-13 06:16:00;2022-03-13 06:42:00;Station-40;12869;0;191;CKB -LINE_20;Station-40;2022-03-13 06:42:00;2022-03-13 06:42:00;Station-0;0.06;0;191;CKB -LINE_20;Station-0;2022-03-13 00:17:00;2022-03-13 00:17:00;Station-40;0.06;0;192;CKB -LINE_20;Station-40;2022-03-13 00:17:00;2022-03-13 00:46:00;Station-41;13048;0;192;CKB -LINE_20;Station-41;2022-03-13 00:46:00;2022-03-13 01:12:00;Station-40;12869;5;192;CKB -LINE_20;Station-40;2022-03-13 01:17:00;2022-03-13 01:46:00;Station-41;13048;0;192;CKB -LINE_20;Station-41;2022-03-13 01:46:00;2022-03-13 02:12:00;Station-40;12869;5;192;CKB -LINE_20;Station-40;2022-03-13 02:17:00;2022-03-13 02:46:00;Station-41;13048;0;192;CKB -LINE_20;Station-41;2022-03-13 02:46:00;2022-03-13 03:12:00;Station-40;12869;5;192;CKB -LINE_20;Station-40;2022-03-13 03:17:00;2022-03-13 03:46:00;Station-41;13048;0;192;CKB -LINE_20;Station-41;2022-03-13 03:46:00;2022-03-13 04:12:00;Station-40;12869;5;192;CKB -LINE_20;Station-40;2022-03-13 04:17:00;2022-03-13 04:46:00;Station-41;13048;0;192;CKB -LINE_20;Station-41;2022-03-13 04:46:00;2022-03-13 05:12:00;Station-40;12869;5;192;CKB -LINE_20;Station-40;2022-03-13 05:17:00;2022-03-13 05:46:00;Station-41;13048;0;192;CKB -LINE_20;Station-41;2022-03-13 05:46:00;2022-03-13 06:12:00;Station-40;12869;5;192;CKB -LINE_20;Station-40;2022-03-13 06:17:00;2022-03-13 06:46:00;Station-41;13048;0;192;CKB -LINE_20;Station-41;2022-03-13 06:46:00;2022-03-13 07:12:00;Station-40;12869;0;192;CKB -LINE_20;Station-40;2022-03-13 07:12:00;2022-03-13 07:12:00;Station-0;0.06;0;192;CKB -LINE_21;Station-0;2022-03-13 00:49:00;2022-03-13 00:49:00;Station-3;0.06;0;193;CKB -LINE_21;Station-3;2022-03-13 00:49:00;2022-03-13 01:04:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 01:04:00;2022-03-13 01:19:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 01:19:00;2022-03-13 01:34:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 01:34:00;2022-03-13 01:49:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 01:49:00;2022-03-13 02:04:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 02:04:00;2022-03-13 02:19:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 02:19:00;2022-03-13 02:34:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 02:34:00;2022-03-13 02:49:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 02:49:00;2022-03-13 03:04:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 03:04:00;2022-03-13 03:19:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 03:19:00;2022-03-13 03:34:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 03:34:00;2022-03-13 03:49:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 03:49:00;2022-03-13 04:04:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 04:04:00;2022-03-13 04:19:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 04:19:00;2022-03-13 04:34:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 04:34:00;2022-03-13 04:49:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 04:49:00;2022-03-13 05:04:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 05:04:00;2022-03-13 05:19:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 05:19:00;2022-03-13 05:34:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 05:34:00;2022-03-13 05:49:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 05:49:00;2022-03-13 06:04:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 06:04:00;2022-03-13 06:19:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 06:19:00;2022-03-13 06:34:00;Station-16;10229;0;193;CKB -LINE_21;Station-16;2022-03-13 06:34:00;2022-03-13 06:49:00;Station-3;11801;0;193;CKB -LINE_21;Station-3;2022-03-13 06:49:00;2022-03-13 06:49:00;Station-0;0.06;0;193;CKB -LINE_23;Station-0;2022-03-13 02:34:00;2022-03-13 02:34:00;Station-45;0.06;0;194;CKB -LINE_23;Station-45;2022-03-13 02:34:00;2022-03-13 03:00:00;Station-46;9016;0;194;CKB -LINE_23;Station-46;2022-03-13 03:00:00;2022-03-13 03:27:00;Station-45;10083;7;194;CKB -LINE_23;Station-45;2022-03-13 03:34:00;2022-03-13 04:00:00;Station-46;9016;0;194;CKB -LINE_23;Station-46;2022-03-13 04:00:00;2022-03-13 04:27:00;Station-45;10083;7;194;CKB -LINE_23;Station-45;2022-03-13 04:34:00;2022-03-13 05:00:00;Station-46;9016;0;194;CKB -LINE_23;Station-46;2022-03-13 05:00:00;2022-03-13 05:27:00;Station-45;10083;7;194;CKB -LINE_23;Station-45;2022-03-13 05:34:00;2022-03-13 06:00:00;Station-46;9016;0;194;CKB -LINE_23;Station-46;2022-03-13 06:00:00;2022-03-13 06:27:00;Station-45;10083;7;194;CKB -LINE_23;Station-45;2022-03-13 06:34:00;2022-03-13 07:00:00;Station-46;9016;0;194;CKB -LINE_23;Station-46;2022-03-13 07:00:00;2022-03-13 07:00:00;Station-0;0.06;0;194;CKB -LINE_23;Station-0;2022-03-13 02:04:00;2022-03-13 02:04:00;Station-45;0.06;0;195;CKB -LINE_23;Station-45;2022-03-13 02:04:00;2022-03-13 02:30:00;Station-46;9016;0;195;CKB -LINE_23;Station-46;2022-03-13 02:30:00;2022-03-13 02:57:00;Station-45;10083;7;195;CKB -LINE_23;Station-45;2022-03-13 03:04:00;2022-03-13 03:30:00;Station-46;9016;0;195;CKB -LINE_23;Station-46;2022-03-13 03:30:00;2022-03-13 03:57:00;Station-45;10083;7;195;CKB -LINE_23;Station-45;2022-03-13 04:04:00;2022-03-13 04:30:00;Station-46;9016;0;195;CKB -LINE_23;Station-46;2022-03-13 04:30:00;2022-03-13 04:57:00;Station-45;10083;7;195;CKB -LINE_23;Station-45;2022-03-13 05:04:00;2022-03-13 05:30:00;Station-46;9016;0;195;CKB -LINE_23;Station-46;2022-03-13 05:30:00;2022-03-13 05:57:00;Station-45;10083;7;195;CKB -LINE_23;Station-45;2022-03-13 06:04:00;2022-03-13 06:30:00;Station-46;9016;0;195;CKB -LINE_23;Station-46;2022-03-13 06:30:00;2022-03-13 06:57:00;Station-45;10083;0;195;CKB -LINE_23;Station-45;2022-03-13 06:57:00;2022-03-13 06:57:00;Station-0;0.06;0;195;CKB -LINE_24;Station-0;2022-03-13 00:31:00;2022-03-13 00:31:00;Station-21;0.06;0;196;CKB -LINE_24;Station-21;2022-03-13 00:31:00;2022-03-13 00:44:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 00:44:00;2022-03-13 00:56:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 01:01:00;2022-03-13 01:14:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 01:14:00;2022-03-13 01:26:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 01:31:00;2022-03-13 01:44:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 01:44:00;2022-03-13 01:56:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 02:01:00;2022-03-13 02:14:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 02:14:00;2022-03-13 02:26:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 02:31:00;2022-03-13 02:44:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 02:44:00;2022-03-13 02:56:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 03:01:00;2022-03-13 03:14:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 03:14:00;2022-03-13 03:26:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 03:31:00;2022-03-13 03:44:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 03:44:00;2022-03-13 03:56:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 04:01:00;2022-03-13 04:14:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 04:14:00;2022-03-13 04:26:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 04:31:00;2022-03-13 04:44:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 04:44:00;2022-03-13 04:56:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 05:01:00;2022-03-13 05:14:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 05:14:00;2022-03-13 05:26:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 05:31:00;2022-03-13 05:44:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 05:44:00;2022-03-13 05:56:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 06:01:00;2022-03-13 06:14:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 06:14:00;2022-03-13 06:26:00;Station-21;5362;5;196;CKB -LINE_24;Station-21;2022-03-13 06:31:00;2022-03-13 06:44:00;Station-47;4872;0;196;CKB -LINE_24;Station-47;2022-03-13 06:44:00;2022-03-13 06:56:00;Station-21;5362;0;196;CKB -LINE_24;Station-21;2022-03-13 06:56:00;2022-03-13 06:56:00;Station-0;0.06;0;196;CKB -LINE_25;Station-0;2022-03-13 00:31:00;2022-03-13 00:31:00;Station-21;0.06;0;197;CKB -LINE_25;Station-21;2022-03-13 00:31:00;2022-03-13 00:45:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 00:47:00;2022-03-13 01:01:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 01:01:00;2022-03-13 01:15:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 01:17:00;2022-03-13 01:31:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 01:31:00;2022-03-13 01:45:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 01:47:00;2022-03-13 02:01:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 02:01:00;2022-03-13 02:15:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 02:17:00;2022-03-13 02:31:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 02:31:00;2022-03-13 02:45:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 02:47:00;2022-03-13 03:01:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 03:01:00;2022-03-13 03:15:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 03:17:00;2022-03-13 03:31:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 03:31:00;2022-03-13 03:45:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 03:47:00;2022-03-13 04:01:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 04:01:00;2022-03-13 04:15:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 04:17:00;2022-03-13 04:31:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 04:31:00;2022-03-13 04:45:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 04:47:00;2022-03-13 05:01:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 05:01:00;2022-03-13 05:15:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 05:17:00;2022-03-13 05:31:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 05:31:00;2022-03-13 05:45:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 05:47:00;2022-03-13 06:01:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 06:01:00;2022-03-13 06:15:00;Station-48;5225;2;197;CKB -LINE_25;Station-48;2022-03-13 06:17:00;2022-03-13 06:31:00;Station-21;7617;0;197;CKB -LINE_25;Station-21;2022-03-13 06:31:00;2022-03-13 06:45:00;Station-48;5096;0;197;CKB -LINE_25;Station-48;2022-03-13 06:45:00;2022-03-13 06:45:00;Station-0;0.06;0;197;CKB -LINE_26;Station-0;2022-03-13 00:43:00;2022-03-13 00:43:00;Station-49;0.06;0;198;CKB -LINE_26;Station-49;2022-03-13 00:43:00;2022-03-13 00:53:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 00:53:00;2022-03-13 01:03:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 01:13:00;2022-03-13 01:23:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 01:23:00;2022-03-13 01:33:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 01:43:00;2022-03-13 01:53:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 01:53:00;2022-03-13 02:03:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 02:13:00;2022-03-13 02:23:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 02:23:00;2022-03-13 02:33:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 02:43:00;2022-03-13 02:53:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 02:53:00;2022-03-13 03:03:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 03:13:00;2022-03-13 03:23:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 03:23:00;2022-03-13 03:33:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 03:43:00;2022-03-13 03:53:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 03:53:00;2022-03-13 04:03:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 04:13:00;2022-03-13 04:23:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 04:23:00;2022-03-13 04:33:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 04:43:00;2022-03-13 04:53:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 04:53:00;2022-03-13 05:03:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 05:13:00;2022-03-13 05:23:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 05:23:00;2022-03-13 05:33:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 05:43:00;2022-03-13 05:53:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 05:53:00;2022-03-13 06:03:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 06:13:00;2022-03-13 06:23:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 06:23:00;2022-03-13 06:33:00;Station-49;4408;10;198;CKB -LINE_26;Station-49;2022-03-13 06:43:00;2022-03-13 06:53:00;Station-50;4507;0;198;CKB -LINE_26;Station-50;2022-03-13 06:53:00;2022-03-13 07:03:00;Station-49;4408;0;198;CKB -LINE_26;Station-49;2022-03-13 07:03:00;2022-03-13 07:03:00;Station-0;0.06;0;198;CKB +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB \ No newline at end of file diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e6b0d91e..66b4d889 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -48,7 +48,7 @@ def from_csv(cls, path_to_csv, vehicle_types): schedule = cls(vehicle_types) with open(path_to_csv, 'r') as trips_file: - trip_reader = csv.DictReader(trips_file, delimiter=';') + trip_reader = csv.DictReader(trips_file) for trip in trip_reader: rotation_id = trip['rotation_id'] if rotation_id not in schedule.rotations.keys(): @@ -638,6 +638,6 @@ def generate_rotations_overview(self, args): rotation_infos.append(rotation_info) with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: - csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys()), delimiter=';') + csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) From 19ded8c46231268559204798d0556f9fc66ac836 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 16 May 2022 19:55:38 +0200 Subject: [PATCH 146/802] use spice_ev.scenario attributes --- ebus_toolbox/__main__.py | 6 +--- ebus_toolbox/report.py | 4 +-- ebus_toolbox/schedule.py | 61 +++++++++++----------------------------- ebus_toolbox/simulate.py | 6 ++-- 4 files changed, 23 insertions(+), 54 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 0e4f5d5f..0a8eb181 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,5 +1,4 @@ import argparse -from os import path from ebus_toolbox import simulate, util if __name__ == '__main__': @@ -99,10 +98,7 @@ raise SystemExit("The following argument is required: input_schedule") # arguments relevant to SpiceEV, setting automatically to reduce clutter in config - args.input = path.join(args.output_directory, "scenario.json") - args.save_timeseries = path.join(args.output_directory, "simulation_spiceEV.csv") - args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") - args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") args.ALLOW_NEGATIVE_SOC = True + args.attach_vehicle_soc = True simulate.simulate(args) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 1bdf9c43..24f0c51c 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -2,5 +2,5 @@ """ -def generate(schedule, args): - schedule.generate_rotations_overview(args) +def generate(schedule, scenario, args): + schedule.generate_rotations_overview(scenario, args) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a28c114d..5c7ccfac 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -2,7 +2,6 @@ import json import random import datetime -import itertools from os import path from datetime import timedelta @@ -192,7 +191,7 @@ def get_arrival_of_last_trip(self): sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.arrival_time) return sorted_rotations[-1].arrival_time - def readjust_charging_type(self, args): + def readjust_charging_type(self, args, scenario): """ Loads rotations with negative soc from spice_ev results and adjusts charging type from depb to oppb and vice versa. @@ -201,7 +200,7 @@ def readjust_charging_type(self, args): :param args: Command line arguments and/or arguments from config file. :type args: argparse.Namespace """ - negative_rotations = self.get_negative_rotations(args) + negative_rotations = self.get_negative_rotations(scenario) print(f"Rotations {negative_rotations} have negative SoC.") print("Adjust charging types for rotations with negative soc.") @@ -213,7 +212,7 @@ def readjust_charging_type(self, args): else: self.set_charging_type("depb", args, [rot]) - def get_negative_rotations(self, args): + def get_negative_rotations(self, scenario): """ Get rotations with negative soc from spice_ev outputs @@ -225,30 +224,10 @@ def get_negative_rotations(self, args): :raises TypeError: If args.save_results is not set. """ - # load any json output file of sice_ev - gcIDs = list(self.scenario["constants"]["grid_connectors"].keys()) - try: - filename, ext = path.splitext(args.save_results) - except TypeError: - raise TypeError("In order to get negative totations from spice_ev results, please " - "specify 'save_results' in your input arguments.") - # in spiceEV there is one results file for each grid connector and the filename indicates - # which results file corresponds to which grid connector - # in case there is only one grid connector the filename does not mention the grid connector - if len(gcIDs) > 1: - # every gc results file contains the same info with regard to negative socs - # so just pick the first one - filename = f"{filename}_{gcIDs[0]}{ext}" - else: - filename = args.save_results - - with open(filename) as f: - results = json.load(f) - # get dict of vehicles with negative soc's try: - negative_vehicles = results["vehicles with negative soc"] - except KeyError: + negative_vehicles = scenario.negative_soc_tracker + except AttributeError: return [] # get matching rotations negative_rotations = [] @@ -596,30 +575,24 @@ def generate_scenario(self, args): return Scenario(self.scenario, args.output_directory) - def generate_rotations_overview(self, args): + def generate_rotations_overview(self, scenario, args): rotation_infos = [] - negative_rotations = self.get_negative_rotations(args) + + negative_rotations = self.get_negative_rotations(scenario) + + interval = timedelta(minutes=args.interval) sim_start_time = \ self.get_departure_of_first_trip() - timedelta(minutes=args.signal_time_dif) for id, rotation in self.rotations.items(): # get SOC timeseries for this rotation - socs = [] vehicle_id = rotation.vehicle_id - with open(path.join(args.output_directory, 'simulation_soc_spiceEV.csv')) as f: - reader = csv.DictReader(f) - - interval = timedelta(minutes=args.interval) - read_start_time = rotation.departure_time - duration = rotation.arrival_time-rotation.departure_time - - start_reading = (read_start_time - sim_start_time) // interval - end_reading = start_reading + (duration // interval) - - reader = itertools.islice(reader, start_reading, end_reading) - for line in reader: - socs.append(line[vehicle_id]) + # get soc timeseries for current rotation + vehicle_soc = scenario.vehicle_socs[vehicle_id] + start_idx = (rotation.departure_time - sim_start_time) // interval + end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) + rotation_soc_ts = vehicle_soc[start_idx:end_idx] rotation_info = { "rotation_id": id, @@ -632,8 +605,8 @@ def generate_rotations_overview(self, args): "total_consumption_[kWh]": rotation.consumption, "distance": rotation.distance, "charging_type": rotation.charging_type, - "SOC_at_arrival": socs[-1], - "Minumum_SOC": min(socs), + "SOC_at_arrival": rotation_soc_ts[-1], + "Minumum_SOC": min(rotation_soc_ts), "Negative_SOC": 1 if id in negative_rotations else 0 } rotation_infos.append(rotation_info) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1eefa545..00b25c6a 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -47,9 +47,9 @@ def simulate(args): if i < args.iterations - 1: # TODO: replace with optimizer step in the future - schedule.readjust_charging_type(args) + schedule.readjust_charging_type(args, scenario) - print(f"Rotations {schedule.get_negative_rotations(args)} have negative SoC.") + print(f"Rotations {schedule.get_negative_rotations(scenario)} have negative SoC.") # create report - report.generate(schedule, args) + report.generate(schedule, scenario, args) From 1eabe391bcda012ffc2b6d02e68bcc2ae8cf4071 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 31 May 2022 16:33:26 +0200 Subject: [PATCH 147/802] flake8 --- ebus_toolbox/schedule.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5c7ccfac..db51132e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -199,6 +199,8 @@ def readjust_charging_type(self, args, scenario): # todo: all together, as they may influence one another :param args: Command line arguments and/or arguments from config file. :type args: argparse.Namespace + :param scenario: Scenario object containing results a completed simulation + :type scenario: spice_ev.Scenario """ negative_rotations = self.get_negative_rotations(scenario) @@ -216,12 +218,11 @@ def get_negative_rotations(self, scenario): """ Get rotations with negative soc from spice_ev outputs - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace + :param scenario: Simulation scenario containing simulation results + including the SoC of all vehicles over time + :type scenario: spice_ev.Scenario :return: list of negative rotation_id's :rtype: list - - :raises TypeError: If args.save_results is not set. """ # get dict of vehicles with negative soc's From 8454bb83677d0daf7ea6ab4290d1b9eba1ee21bc Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 13 Jun 2022 12:22:58 +0200 Subject: [PATCH 148/802] comments in simulate.py --- ebus_toolbox/simulate.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 00b25c6a..7b2ce39b 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -30,13 +30,14 @@ def simulate(args): schedule.set_charging_type(preferred_ct=args.preferred_charging_type, args=args) for i in range(args.iterations): - # construct szenario and simulate in spice ev until optimizer is happy - # if optimizer None, quit after single iteration + # (re)calculate the change in SoC for every trip + # charging types may have changed which may impact battery capacity + # while mileage is assumed to stay constant schedule.delta_soc_all_trips() + + # each rotation is assigned a vehicle ID schedule.assign_vehicles() - # RUN SPICE EV - # write trips to csv in spiceEV format scenario = schedule.generate_scenario(args) print("Running Spice EV...") From 10675249555592423bb846096d0efe22c7618ff5 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 28 Jun 2022 11:33:47 +0200 Subject: [PATCH 149/802] First optimization of oppb rotations - reworked simulation flow - removed unused functions from schedule - number_cs in electrified stations changed from "None" to null --- data/configs/ebus_toolbox.cfg | 10 +- data/examples/electrified_stations.json | 8 +- ebus_toolbox/schedule.py | 151 ++++++++++++++---------- ebus_toolbox/simulate.py | 82 +++++++++---- 4 files changed, 160 insertions(+), 91 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 40f228ad..f4392c6b 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -3,7 +3,7 @@ ##### INPUT/OUTPUT FILES AND PATHS ##### # Input file containing trip information (required) -input_schedule = "./data/examples/trips_example.csv" +input_schedule = "./data/examples/trips_example_short.csv" # output path for scenario.json -- called input since its input for spiceev #output_directory = "./data/sim_outputs/" @@ -15,7 +15,7 @@ input_schedule = "./data/examples/trips_example.csv" #vehicle_types = "./data/examples/vehicle_types.json" -##### SIMULATION HYPERPARAMETERS ##### +##### SIMULATION HYPERPARAMETERS ##### # set random seed (for always random: set seed = null) seed = 1 @@ -29,7 +29,7 @@ interval = 1 signal_time_dif = 10 -##### SIMULATION CONDITIONS AND BOUNDARIES ##### +##### SIMULATION CONDITIONS AND BOUNDARIES ##### # maximum number of days to simulate, if not set simulate entire schedule #days = 10 @@ -119,7 +119,7 @@ cs_power_deps_oppb = 150 strategy = distributed # possible strategies: greedy, balanced, balanced_market, schedule, flex_window # options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] -strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", 1]] +strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] # show plots after simulation visual = false @@ -127,4 +127,4 @@ visual = false # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. # margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. -margin = 1.0 +margin = 10.0 diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 9dd877c5..31cfdf00 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -1,7 +1,7 @@ { "Station-0": { "type": "deps", - "n_charging_stations": "None" + "n_charging_stations": null }, "Station-3": { "type": "opps", @@ -17,7 +17,7 @@ }, "Station-22": { "type": "deps", - "n_charging_stations": "None" + "n_charging_stations": null }, "Station-26": { "type": "opps", @@ -41,6 +41,6 @@ }, "Station-42": { "type": "deps", - "n_charging_stations": "None" + "n_charging_stations": null } -} \ No newline at end of file +} diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index db51132e..fb7964cf 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -3,7 +3,7 @@ import random import datetime from os import path -from datetime import timedelta +import warnings from ebus_toolbox.rotation import Rotation from src.scenario import Scenario @@ -11,7 +11,7 @@ class Schedule: - def __init__(self, vehicle_types) -> None: + def __init__(self, vehicle_types, stations_file): """Constructs Schedule object from CSV file containing all trips of schedule :param vehicle_types: Collection of vehicle types and their properties. @@ -31,11 +31,21 @@ def __init__(self, vehicle_types) -> None: assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_depb"]["mileage"] self.vehicle_types = vehicle_types + # load stations file + if stations_file is None: + stations_file = "examples/electrified_stations.json" + ext = stations_file.split('.')[-1] + if ext != "json": + print("File extension mismatch: electrified_stations file should be .json") + with open(stations_file) as f: + self.stations = json.load(f) + self.rotations = {} + self.original_rotations = None self.consumption = 0 @classmethod - def from_csv(cls, path_to_csv, vehicle_types): + def from_csv(cls, path_to_csv, vehicle_types, stations): """Constructs Schedule object from CSV file containing all trips of schedule. :param path_to_csv: Path to csv file containing trip data @@ -45,7 +55,7 @@ def from_csv(cls, path_to_csv, vehicle_types): :return: Returns a new instance of Schedule with all trips from csv loaded. :rtype: Schedule """ - schedule = cls(vehicle_types) + schedule = cls(vehicle_types, stations) with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) @@ -58,17 +68,23 @@ def from_csv(cls, path_to_csv, vehicle_types): return schedule - def remove_rotation_by_id(self, id): - """ Removes a rotation from schedule + def run(self, args): + # (re)calculate the change in SoC for every trip + # charging types may have changed which may impact battery capacity + # while mileage is assumed to stay constant + self.delta_soc_all_trips() - :param id: Rotation ID to be removed - :type id: int - """ - del self.rotations[id] + # each rotation is assigned a vehicle ID + self.assign_vehicles() + + scenario = self.generate_scenario(args) - def filter_rotations(self): - """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" - pass + print("Running Spice EV...") + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + scenario.run('distributed', vars(args).copy()) + + return scenario def set_charging_type(self, preferred_ct, args, rotation_ids=None): """ Change charging type of either all or specified rotations. Adjust minimum standing time @@ -102,7 +118,7 @@ def set_charging_type(self, preferred_ct, args, rotation_ids=None): if min_standing_time > desired_max_standing_time: min_standing_time = desired_max_standing_time - rot.earliest_departure_next_rot = rot.arrival_time + timedelta(hours=min_standing_time) + rot.earliest_departure_next_rot = rot.arrival_time + datetime.timedelta(hours=min_standing_time) def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. @@ -191,28 +207,48 @@ def get_arrival_of_last_trip(self): sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.arrival_time) return sorted_rotations[-1].arrival_time - def readjust_charging_type(self, args, scenario): + def get_common_stations(self, only_opps = True): """ - Loads rotations with negative soc from spice_ev results and adjusts charging type from - depb to oppb and vice versa. - # todo: it would maybe make sense to change each rotations charging type at a time and not - # todo: all together, as they may influence one another - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace - :param scenario: Scenario object containing results a completed simulation - :type scenario: spice_ev.Scenario + for each rotation, return set of rotations that share a station during any trip (with time info) + :param only_opps: only search for opps stations + :type only_opps: boolean + :return: dictionary of rotations """ - negative_rotations = self.get_negative_rotations(scenario) - - print(f"Rotations {negative_rotations} have negative SoC.") - print("Adjust charging types for rotations with negative soc.") - for rot in negative_rotations: - if self.rotations[rot].charging_type == "depb": - self.set_charging_type("oppb", args, [rot]) - # todo: actually this case should not happen, but it still does happen.. why? - else: - self.set_charging_type("depb", args, [rot]) + # rot -> stations with timings + rotations = {} + for rot_key, rotation in self.rotations.items(): + rotations[rot_key] = {} + for t in rotation.trips: + dep_station = self.stations.get(t.departure_name) + arr_station = self.stations.get(t.arrival_name) + if arr_station is None and not only_opps or arr_station is not None and arr_station["type"] == "opps": + if t.arrival_name in rotations[rot_key]: + rotations[rot_key][t.arrival_name].append([t.arrival_time, None]) + else: + rotations[rot_key][t.arrival_name] = [[t.arrival_time, None]] + if t.departure_name in rotations[rot_key]: + rotations[rot_key][t.departure_name][-1][1] = t.departure_time + + # check stations for overlaps + rot_set = {} + for rot_key, stations in rotations.items(): + rot_set[rot_key] = {} + for r, alt_stations in rotations.items(): + if rot_key == r: + continue + for station_name, times in stations.items(): + if station_name in alt_stations: + # both at same station. Check for same time + for t in times: + for alt_t in alt_stations[station_name]: + if max(t[0], alt_t[0]) < min(t[1], alt_t[1]): + # overlap + rot_set[rot_key][r] = min(t[0], alt_t[0]) + break + if r in rot_set[rot_key]: + break + return rot_set def get_negative_rotations(self, scenario): """ @@ -231,13 +267,14 @@ def get_negative_rotations(self, scenario): except AttributeError: return [] # get matching rotations - negative_rotations = [] - for v_id, time in negative_vehicles.items(): - time = datetime.datetime.fromisoformat(time) - rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} - negative_rotations.append([k for k, v in rides.items() if time >= v.departure_time and - time <= v.arrival_time][0]) - return negative_rotations + negative_rotations = set() + for v_id, times in negative_vehicles.items(): + for t_str in times: + time = datetime.datetime.fromisoformat(t_str) + rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} + negative_rotations.add([k for k, v in rides.items() + if time >= v.departure_time and time <= v.arrival_time][0]) + return list(negative_rotations) def generate_scenario(self, args): """ Generate scenario.json for spiceEV @@ -248,14 +285,6 @@ def generate_scenario(self, args): simulation outputs. :rtype: spice_ev.src.Scenario """ - # load stations file - if args.electrified_stations is None: - args.electrified_stations = "examples/electrified_stations.json" - ext = args.electrified_stations.split('.')[-1] - if ext != "json": - print("File extension mismatch: electrified_stations file should be .json") - with open(args.electrified_stations) as json_file: - stations_dict = json.load(json_file) interval = datetime.timedelta(minutes=args.interval) @@ -322,10 +351,8 @@ def generate_scenario(self, args): # time. It may resemble things like delays and/or docking procedures # use buffer time from electrified stations JSON or in case none is # provided use global default from config file - try: - buffer_time = stations_dict[trip.arrival_name]['buffer_time'] - except KeyError: - buffer_time = args.default_buffer_time_opps + buffer_time = self.stations.get(trip.arrival_name, {})\ + .get('buffer_time', args.default_buffer_time_opps) # distinct buffer times depending on time of day can be provided # in that case buffer time is of type dict instead of int @@ -354,16 +381,17 @@ def generate_scenario(self, args): # connect cs and add gc if station is electrified connected_charging_station = None desired_soc = 0 - if gc_name in stations_dict.keys(): - # electrified station - station_type = stations_dict[gc_name]["type"] + try: + # assume electrified station + station = self.stations[gc_name] + station_type = station["type"] if station_type == 'opps' and vehicle_rotations[v].charging_type == 'depb': # a depot bus cannot charge at an opp station station_type = None else: # at opp station, always try to charge as much as you can desired_soc = 1 if station_type == "opps" else args.desired_soc - else: + except KeyError: # non-electrified station station_type = None @@ -378,7 +406,7 @@ def generate_scenario(self, args): connected_charging_station = cs_name_and_type if cs_name not in charging_stations or gc_name not in grid_connectors: - number_cs = stations_dict[gc_name]["n_charging_stations"] + number_cs = station["n_charging_stations"] if station_type == "deps": cs_power = args.cs_power_deps_oppb if ct == 'oppb' \ else args.cs_power_deps_depb @@ -391,7 +419,7 @@ def generate_scenario(self, args): # gc power is not set in config if gc_power is None: - if number_cs != "None": + if number_cs is not None: gc_power = number_cs * cs_power else: # add a really large number @@ -404,7 +432,6 @@ def generate_scenario(self, args): "parent": gc_name } # add one grid connector for each bus station - number_cs = None if number_cs == 'None' else number_cs grid_connectors[gc_name] = { "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, @@ -441,7 +468,7 @@ def generate_scenario(self, args): # ######## END OF VEHICLE EVENTS ########## # # define start and stop times - start = self.get_departure_of_first_trip() - timedelta(minutes=args.signal_time_dif) + start = self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) stop = self.get_arrival_of_last_trip() + interval if args.days is not None: stop = min(stop, start + datetime.timedelta(days=args.days)) @@ -581,9 +608,9 @@ def generate_rotations_overview(self, scenario, args): negative_rotations = self.get_negative_rotations(scenario) - interval = timedelta(minutes=args.interval) + interval = datetime.timedelta(minutes=args.interval) sim_start_time = \ - self.get_departure_of_first_trip() - timedelta(minutes=args.signal_time_dif) + self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) for id, rotation in self.rotations.items(): # get SOC timeseries for this rotation diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 7b2ce39b..74a383a0 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,4 +1,6 @@ # imports +from copy import deepcopy +import datetime import json import warnings from ebus_toolbox.consumption import Consumption @@ -21,36 +23,76 @@ def simulate(args): with open("data/examples/vehicle_types.json") as f: vehicle_types = json.load(f) - schedule = Schedule.from_csv(args.input_schedule, vehicle_types) + schedule = Schedule.from_csv(args.input_schedule, vehicle_types, args.electrified_stations) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) - # filter trips according to args - schedule.filter_rotations() schedule.calculate_consumption() schedule.set_charging_type(preferred_ct=args.preferred_charging_type, args=args) - for i in range(args.iterations): - # (re)calculate the change in SoC for every trip - # charging types may have changed which may impact battery capacity - # while mileage is assumed to stay constant - schedule.delta_soc_all_trips() + common_stations = schedule.get_common_stations(only_opps = True) - # each rotation is assigned a vehicle ID - schedule.assign_vehicles() + # initial run + scenario = schedule.run(args) - scenario = schedule.generate_scenario(args) + # single out negative rotations. Try to run these with common non-negative rotations + original_rotations = deepcopy(schedule.rotations) + negative_rotations = schedule.get_negative_rotations(scenario) + print(f"Initially, rotations {sorted(negative_rotations, key=lambda r: int(r))} have negative SoC.") - print("Running Spice EV...") - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - scenario.run('distributed', vars(args).copy()) - print(f"Spice EV simulation complete. (Iteration {i})") + negative_sets = {} + for rot_key in negative_rotations: + rotation = schedule.rotations[rot_key] + if rotation.charging_type == "depb": + schedule.set_charging_type("oppb", args, [rot_key]) + # todo: actually this case should not happen, but it still does happen.. why? + else: + # oppb: build non-interfering sets of negative rotations + s = {rot_key} + vid = rotation.vehicle_id + last_neg_soc_time = datetime.datetime.fromisoformat(scenario.negative_soc_tracker[vid][-1]) + dep_stations = {r: t for r,t in common_stations[rot_key].items() if t <= last_neg_soc_time} + while dep_stations: + r, t = dep_stations.popitem() + if r not in negative_rotations: + s.add(r) + # add dependencies of r + dep_stations.update({r2: t2 for r2, t2 in common_stations[r].items() if t2 <= t}) + negative_sets[rot_key] = s - if i < args.iterations - 1: - # TODO: replace with optimizer step in the future - schedule.readjust_charging_type(args, scenario) + # run singled-out rotations + ignored = [] + for rot, s in negative_sets.items(): + schedule.rotations = {r: original_rotations[r] for r in s} + scenario = schedule.run(args) + if scenario.negative_soc_tracker: + # still fail: try just the negative rotation + schedule.rotations = {rot: original_rotations[rot]} + scenario = schedule.run(args) + if scenario.negative_soc_tracker: + # no hope, this just won't work + print(f"Rotation {rot} will stay negative") + else: + # works alone with other non-negative rotations + print(f"Rotation {rot} works with alone") + ignored.append(rot) - print(f"Rotations {schedule.get_negative_rotations(scenario)} have negative SoC.") + negative_sets = {k: v for k, v in negative_sets.items() if k not in ignored} + + # now, in negative_sets are just rotations that work with others still + # try to combine them + possible = [(a, b) for a in negative_sets for b in negative_sets if a != b] + while possible: + r1, r2 = possible.pop() + combined = negative_sets[r1].union(negative_sets[r2]) + schedule.rotations = {r: original_rotations[r] for r in s} + scenario = schedule.run(args) + if not scenario.negative_soc_tracker: + # compatible (don't interfere): keep union, remove r2 + negative_sets[r1] = combined + # simplified. What about triangle? (r1+r2, r1+r3, r2!+r3)? + possible = [t for t in possible if t[1] != r2] + + print(negative_sets) # create report report.generate(schedule, scenario, args) From cd2f90fe51418d320b1129b37e46af7a8e8e28f7 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 28 Jun 2022 11:45:44 +0200 Subject: [PATCH 150/802] pep8 changes --- ebus_toolbox/schedule.py | 17 +++++++++++------ ebus_toolbox/simulate.py | 13 ++++++++----- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index fb7964cf..b18ceb2d 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -118,7 +118,8 @@ def set_charging_type(self, preferred_ct, args, rotation_ids=None): if min_standing_time > desired_max_standing_time: min_standing_time = desired_max_standing_time - rot.earliest_departure_next_rot = rot.arrival_time + datetime.timedelta(hours=min_standing_time) + rot.earliest_departure_next_rot = \ + rot.arrival_time + datetime.timedelta(hours=min_standing_time) def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. @@ -207,9 +208,10 @@ def get_arrival_of_last_trip(self): sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.arrival_time) return sorted_rotations[-1].arrival_time - def get_common_stations(self, only_opps = True): + def get_common_stations(self, only_opps=True): """ - for each rotation, return set of rotations that share a station during any trip (with time info) + for each rotation key, return set of rotations + that share a station during any trip (with time info) :param only_opps: only search for opps stations :type only_opps: boolean :return: dictionary of rotations @@ -220,9 +222,11 @@ def get_common_stations(self, only_opps = True): for rot_key, rotation in self.rotations.items(): rotations[rot_key] = {} for t in rotation.trips: - dep_station = self.stations.get(t.departure_name) arr_station = self.stations.get(t.arrival_name) - if arr_station is None and not only_opps or arr_station is not None and arr_station["type"] == "opps": + if ( + arr_station is None and not only_opps or + arr_station is not None and arr_station["type"] == "opps" + ): if t.arrival_name in rotations[rot_key]: rotations[rot_key][t.arrival_name].append([t.arrival_time, None]) else: @@ -468,7 +472,8 @@ def generate_scenario(self, args): # ######## END OF VEHICLE EVENTS ########## # # define start and stop times - start = self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) + start = \ + self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) stop = self.get_arrival_of_last_trip() + interval if args.days is not None: stop = min(stop, start + datetime.timedelta(days=args.days)) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 74a383a0..187d9249 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -29,7 +29,7 @@ def simulate(args): schedule.calculate_consumption() schedule.set_charging_type(preferred_ct=args.preferred_charging_type, args=args) - common_stations = schedule.get_common_stations(only_opps = True) + common_stations = schedule.get_common_stations(only_opps=True) # initial run scenario = schedule.run(args) @@ -37,7 +37,7 @@ def simulate(args): # single out negative rotations. Try to run these with common non-negative rotations original_rotations = deepcopy(schedule.rotations) negative_rotations = schedule.get_negative_rotations(scenario) - print(f"Initially, rotations {sorted(negative_rotations, key=lambda r: int(r))} have negative SoC.") + print(f"Initially, rotations {sorted(negative_rotations, key=lambda r: int(r))} have neg. SoC.") negative_sets = {} for rot_key in negative_rotations: @@ -49,14 +49,17 @@ def simulate(args): # oppb: build non-interfering sets of negative rotations s = {rot_key} vid = rotation.vehicle_id - last_neg_soc_time = datetime.datetime.fromisoformat(scenario.negative_soc_tracker[vid][-1]) - dep_stations = {r: t for r,t in common_stations[rot_key].items() if t <= last_neg_soc_time} + last_neg_soc_time = scenario.negative_soc_tracker[vid][-1] + last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) + dep_stations = {r: t for r, t in common_stations[rot_key].items() + if t <= last_neg_soc_time} while dep_stations: r, t = dep_stations.popitem() if r not in negative_rotations: s.add(r) # add dependencies of r - dep_stations.update({r2: t2 for r2, t2 in common_stations[r].items() if t2 <= t}) + dep_stations.update({r2: t2 for r2, t2 + in common_stations[r].items() if t2 <= t}) negative_sets[rot_key] = s # run singled-out rotations From 867ae654c572efb10ea8019bc22cfbf7d15bfd30 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 28 Jun 2022 11:53:06 +0200 Subject: [PATCH 151/802] Schedule: add missing param docstring --- ebus_toolbox/schedule.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index b18ceb2d..2acc7fd8 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -16,6 +16,8 @@ def __init__(self, vehicle_types, stations_file): :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict + :param stations_file: json of electrified stations + :type stations_file: string """ # Check if all bus types have both an opp and depot version # Also make sure that both versions have the same mileage From 1c20e58d10f55630df4a7c1dee1a1e9b18c41226 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 28 Jun 2022 11:55:54 +0200 Subject: [PATCH 152/802] Schedule: add more missing param docstring --- ebus_toolbox/schedule.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 2acc7fd8..c162ab8f 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -54,6 +54,8 @@ def from_csv(cls, path_to_csv, vehicle_types, stations): :type path_to_csv: str :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict + :param stations: json of electrified stations + :type stations: string :return: Returns a new instance of Schedule with all trips from csv loaded. :rtype: Schedule """ From 5af77d1478c201ce858905664280cff2e9bc29eb Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 28 Jun 2022 12:01:26 +0200 Subject: [PATCH 153/802] fix test --- tests/test_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 796b311c..b0271b1b 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -13,5 +13,5 @@ def test_schedule_from_csv(): with open('./data/examples/vehicle_types.json') as f: vehicle_types = json.load(f) - empty_schedule = schedule.Schedule(vehicle_types) + empty_schedule = schedule.Schedule(vehicle_types, './data/examples/vehicle_types.json') assert empty_schedule.rotations == {} From 2161d85cddd590413ab10e0cc73d7482bffdbec7 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Jul 2022 10:49:25 +0200 Subject: [PATCH 154/802] let user specify rotation specific charging type --- ebus_toolbox/rotation.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 4e7de899..b768b5c7 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -28,6 +28,11 @@ def add_trip(self, trip): """ new_trip = Trip(self, **trip) + # set charging type if given + if ('charging_type' in trip and + any(trip['charging_type'] == t for t in ['depb', 'oppb'])): + self.charging_type = trip['charging_type'] + self.distance += new_trip.distance if new_trip.line: self.lines.add(new_trip.line) From 8330e00fee96b9b11b264a323a4adffa287b3bb1 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Jul 2022 17:43:00 +0200 Subject: [PATCH 155/802] allow for constant mileage --- ebus_toolbox/consumption.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 2309417f..aba33465 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -30,12 +30,18 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) """ + + vt_ct = f"{vehicle_type}_{charging_type}" + + # in case a constant mileage is provided + if isinstance(self.vehicle_types[vt_ct]['mileage'], float): + return self.vehicle_types[vt_ct]['mileage'] * distance / 1000 + temp = np.interp(time.hour, list(self.temperatures_by_hour.keys()), list(self.temperatures_by_hour.values())) # load consumption csv - vt_ct = f"{vehicle_type}_{charging_type}" consumption_file = self.vehicle_types[vt_ct]["mileage"] try: consumption = self.consumption_files[consumption_file] From 3d0d1e3fb93feee6c16e24e5998c7a00b372b8c0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 27 Jul 2022 17:44:24 +0200 Subject: [PATCH 156/802] allow for discharge curve for stationary batteries --- ebus_toolbox/schedule.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index db51132e..122f3256 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -546,17 +546,27 @@ def generate_scenario(self, args): print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) if args.battery: - for idx, (capacity, c_rate, gc) in enumerate(args.battery): + for idx, bat in enumerate(args.battery, 1): + capacity, c_rate, gc = bat[:3] + if gc not in grid_connectors: + # no vehicle charges here + continue if capacity > 0: max_power = c_rate * capacity else: # unlimited battery: set power directly max_power = c_rate - batteries["BAT{}".format(idx + 1)] = { + batteries[f"BAT{idx}"] = { "parent": gc, "capacity": capacity, - "charging_curve": [[0, max_power], [1, max_power]] + "charging_curve": [[0, max_power], [1, max_power]], } + if len(bat) == 4: + # discharge curve can be passed as optional 4th param + batteries[f"BAT{idx}"].update({ + "discharge_curve": bat[3] + }) + # create final dict self.scenario = { "scenario": { From 0d77504b0aeba498b220ea29a038c8ebf14f3686 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 1 Aug 2022 16:05:43 +0200 Subject: [PATCH 157/802] use random seed in scenario generation --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 122f3256..99cc16db 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -248,6 +248,9 @@ def generate_scenario(self, args): simulation outputs. :rtype: spice_ev.src.Scenario """ + + random.seed(args.seed) + # load stations file if args.electrified_stations is None: args.electrified_stations = "examples/electrified_stations.json" From 4a6457ceafc797f392376e72bb3c990ee2a5efd0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 1 Aug 2022 16:09:38 +0200 Subject: [PATCH 158/802] fix: generate first trip for each vehicle --- ebus_toolbox/schedule.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 99cc16db..585171a9 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -289,13 +289,27 @@ def generate_scenario(self, args): # define start conditions first_rotation = list(vehicle_rotations.values())[0] + departure = first_rotation.departure_time + # trips list is sorted by time + arrival = first_rotation.trips[0].arrival_time vehicles[v_name] = { "connected_charging_station": f'{v_name}_{first_rotation.departure_name}_deps', - "estimated_time_of_departure": first_rotation.departure_time.isoformat(), + "estimated_time_of_departure": departure.isoformat(), "desired_soc": None, "soc": args.desired_soc, "vehicle_type": vt + "_" + ct } + # initial departure event from starting depot + events["vehicle_events"].append({ + "signal_time": (departure + datetime.timedelta( + minutes=-args.signal_time_dif)).isoformat(), + "start_time": departure.isoformat(), + "vehicle_id": v_name, + "event_type": "departure", + "update": { + "estimated_time_of_arrival": arrival.isoformat() + } + }) for i, v in enumerate(rotation_ids): departure_event_in_input = True From 8a2dee2a45481052c988f8a2612b3ad4858ebc8f Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 1 Aug 2022 16:10:23 +0200 Subject: [PATCH 159/802] fix: parse strategy options correctly --- ebus_toolbox/simulate.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 7b2ce39b..fe37fea8 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -21,6 +21,17 @@ def simulate(args): with open("data/examples/vehicle_types.json") as f: vehicle_types = json.load(f) + # parse strategy options for Spice EV + if hasattr(args, 'strategy_option'): + for opt_key, opt_val in args.strategy_option: + try: + # option may be number + opt_val = float(opt_val) + except ValueError: + # or not + pass + setattr(args, opt_key, opt_val) + schedule = Schedule.from_csv(args.input_schedule, vehicle_types) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) From cf4500deeaf2f9eef2e3046f40e9e1fa202efa52 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 1 Aug 2022 16:27:58 +0200 Subject: [PATCH 160/802] allow for omittance of strategy options in config --- ebus_toolbox/simulate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index fe37fea8..ab7a4f13 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -22,7 +22,7 @@ def simulate(args): vehicle_types = json.load(f) # parse strategy options for Spice EV - if hasattr(args, 'strategy_option'): + if args.strategy_option is not None: for opt_key, opt_val in args.strategy_option: try: # option may be number From 84fbd313aa99ad442a7dbf888f76e2bd6d9ab915 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 1 Aug 2022 16:30:02 +0200 Subject: [PATCH 161/802] adapt get_negative_rotations to changes in spiceev --- ebus_toolbox/schedule.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 585171a9..ea09d374 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -231,13 +231,14 @@ def get_negative_rotations(self, scenario): except AttributeError: return [] # get matching rotations - negative_rotations = [] - for v_id, time in negative_vehicles.items(): - time = datetime.datetime.fromisoformat(time) - rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} - negative_rotations.append([k for k, v in rides.items() if time >= v.departure_time and - time <= v.arrival_time][0]) - return negative_rotations + negative_rotations = set() + for v_id, times in negative_vehicles.items(): + for t_str in times: + time = datetime.datetime.fromisoformat(t_str) + rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} + negative_rotations.add([k for k, v in rides.items() + if time >= v.departure_time and time <= v.arrival_time][0]) + return list(negative_rotations) def generate_scenario(self, args): """ Generate scenario.json for spiceEV From f65d93cde69bcd4a171b03b97e3fc6eeb42c937e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 3 Aug 2022 10:08:49 +0200 Subject: [PATCH 162/802] fix sorting of rotations in progress --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ea09d374..68159ca9 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -146,6 +146,9 @@ def assign_vehicles(self): # go through rotations in order, stop at same or higher departure if r.earliest_departure_next_rot >= rot.earliest_departure_next_rot: break + else: + # highest departure, insert at + i = i + 1 # insert at calculated index rotations_in_progress.insert(i, rot) From 27232add5b46e489594ae432d33ffcb365352339 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 3 Aug 2022 10:28:13 +0200 Subject: [PATCH 163/802] check for correct depot before dispatch --- ebus_toolbox/schedule.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 68159ca9..ce60c50b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -123,7 +123,7 @@ def assign_vehicles(self): # calculate min_standing_time deps r = rotations_in_progress.pop(0) if rot.departure_time > r.earliest_departure_next_rot: - idle_vehicles.append(r.vehicle_id) + idle_vehicles.append((r.vehicle_id, r.arrival_name)) else: rotations_in_progress.insert(0, r) break @@ -131,14 +131,14 @@ def assign_vehicles(self): # find idle vehicle for rotation if exists # else generate new vehicle id vt_ct = f"{rot.vehicle_type}_{rot.charging_type}" - vehicle_id = next((id for id in idle_vehicles if vt_ct in id), None) - if vehicle_id is None: + try: + rot.vehicle_id = [ + id for id, deps in idle_vehicles if vt_ct in id and deps == rot.departure_name + ].pop(0) + except IndexError: + # no vehicle available for dispatch, generate new one vehicle_type_counts[vt_ct] += 1 - vehicle_id = f"{vt_ct}_{vehicle_type_counts[vt_ct]}" - else: - idle_vehicles.remove(vehicle_id) - - rot.vehicle_id = vehicle_id + rot.vehicle_id = f"{vt_ct}_{vehicle_type_counts[vt_ct]}" # keep list of rotations in progress sorted i = 0 From 40f393d23fed0de618b09ee0496b9f49a8908b7f Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 3 Aug 2022 10:41:39 +0200 Subject: [PATCH 164/802] remove used vehicle from idle vehicles --- ebus_toolbox/schedule.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ce60c50b..a91fb112 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -131,11 +131,13 @@ def assign_vehicles(self): # find idle vehicle for rotation if exists # else generate new vehicle id vt_ct = f"{rot.vehicle_type}_{rot.charging_type}" - try: - rot.vehicle_id = [ - id for id, deps in idle_vehicles if vt_ct in id and deps == rot.departure_name - ].pop(0) - except IndexError: + for item in idle_vehicles: + id, deps = item + if vt_ct in id and deps == rot.departure_name: + rot.vehicle_id = id + idle_vehicles.remove(item) + break + else: # no vehicle available for dispatch, generate new one vehicle_type_counts[vt_ct] += 1 rot.vehicle_id = f"{vt_ct}_{vehicle_type_counts[vt_ct]}" From f746cf14e613012c47a352b3c4ae6b335a6d146b Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 3 Aug 2022 16:10:14 +0200 Subject: [PATCH 165/802] save spiceev output to output directory --- ebus_toolbox/__main__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 0a8eb181..41a77d9c 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,5 +1,6 @@ import argparse from ebus_toolbox import simulate, util +from os import path if __name__ == '__main__': parser = argparse.ArgumentParser( @@ -100,5 +101,8 @@ # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True + args.save_timeseries = path.join(args.output_directory, "simulation_spiceEV.csv") + args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") + args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") simulate.simulate(args) From 08b4988fb8b2ff8cf68a1653a7d2109d745381a1 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 10 Aug 2022 15:12:17 +0200 Subject: [PATCH 166/802] minor fixes - renamed eta to timing in argparse Namespace - sort initial neg. rotations by string id (no cast to integer) --- ebus_toolbox/__main__.py | 2 ++ ebus_toolbox/simulate.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 41a77d9c..3bf1519d 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -94,6 +94,8 @@ args = parser.parse_args() util.set_options_from_config(args, check=True, verbose=False) + # rename special options + args.timing = args.eta if args.input_schedule is None: raise SystemExit("The following argument is required: input_schedule") diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 47681383..f68e06db 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -48,7 +48,7 @@ def simulate(args): # single out negative rotations. Try to run these with common non-negative rotations original_rotations = deepcopy(schedule.rotations) negative_rotations = schedule.get_negative_rotations(scenario) - print(f"Initially, rotations {sorted(negative_rotations, key=lambda r: int(r))} have neg. SoC.") + print(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") negative_sets = {} for rot_key in negative_rotations: From 3c8cb36afb11f73943d3bdacc11f5820e5407c42 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 12 Aug 2022 15:52:12 +0200 Subject: [PATCH 167/802] optimization: fixes and improvements - ignore stations without departure in common_stations (prevents arithmetic error) - fixation of rotation generation of station combination - added counters for checks of negative rotations and possible combinations --- ebus_toolbox/schedule.py | 3 +++ ebus_toolbox/simulate.py | 10 ++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 31a1b088..c1bac2be 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -255,6 +255,9 @@ def get_common_stations(self, only_opps=True): # both at same station. Check for same time for t in times: for alt_t in alt_stations[station_name]: + if t[1] is None or alt_t[1] is None: + # no departure: ignore + continue if max(t[0], alt_t[0]) < min(t[1], alt_t[1]): # overlap rot_set[rot_key][r] = min(t[0], alt_t[0]) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f68e06db..b20fbf4c 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -75,8 +75,9 @@ def simulate(args): # run singled-out rotations ignored = [] - for rot, s in negative_sets.items(): + for i, (rot, s) in enumerate(negative_sets.items()): schedule.rotations = {r: original_rotations[r] for r in s} + print(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") scenario = schedule.run(args) if scenario.negative_soc_tracker: # still fail: try just the negative rotation @@ -87,7 +88,7 @@ def simulate(args): print(f"Rotation {rot} will stay negative") else: # works alone with other non-negative rotations - print(f"Rotation {rot} works with alone") + print(f"Rotation {rot} works alone") ignored.append(rot) negative_sets = {k: v for k, v in negative_sets.items() if k not in ignored} @@ -96,15 +97,16 @@ def simulate(args): # try to combine them possible = [(a, b) for a in negative_sets for b in negative_sets if a != b] while possible: + print(f"{len(possible)} combinations remain") r1, r2 = possible.pop() combined = negative_sets[r1].union(negative_sets[r2]) - schedule.rotations = {r: original_rotations[r] for r in s} + schedule.rotations = {r: original_rotations[r] for r in combined} scenario = schedule.run(args) if not scenario.negative_soc_tracker: # compatible (don't interfere): keep union, remove r2 negative_sets[r1] = combined # simplified. What about triangle? (r1+r2, r1+r3, r2!+r3)? - possible = [t for t in possible if t[1] != r2] + possible = [t for t in possible if r2 not in t] print(negative_sets) From 9c08e878dec2afb5db05f797f0bf195d34792980 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 12 Aug 2022 16:07:44 +0200 Subject: [PATCH 168/802] make flake8 happy: remove unused variable --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c1bac2be..e5e5750f 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -310,8 +310,8 @@ def generate_scenario(self, args): ext = args.electrified_stations.split('.')[-1] if ext != "json": print("File extension mismatch: electrified_stations file should be .json") - with open(args.electrified_stations) as json_file: - stations_dict = json.load(json_file) + # with open(args.electrified_stations) as json_file: + # stations_dict = json.load(json_file) interval = datetime.timedelta(minutes=args.interval) From 72ebba40cf154f3a75fbb1e95f197992fa7879f1 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Tue, 16 Aug 2022 12:40:31 +0200 Subject: [PATCH 169/802] Added calculation for investment costs in eBus-Toolbox: - added cost_params.json as argument - added distance to next transformer to electrified_stations - changed default values for gcs - fixed typos --- data/examples/cost_params.json | 31 +++++++++ data/examples/electrified_stations.json | 33 ++++++---- ebus_toolbox/__main__.py | 16 +++-- ebus_toolbox/costs.py | 87 +++++++++++++++++++++++++ ebus_toolbox/schedule.py | 9 +-- ebus_toolbox/simulate.py | 8 +++ 6 files changed, 162 insertions(+), 22 deletions(-) create mode 100644 data/examples/cost_params.json create mode 100644 ebus_toolbox/costs.py diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json new file mode 100644 index 00000000..a1b850fd --- /dev/null +++ b/data/examples/cost_params.json @@ -0,0 +1,31 @@ +{ + "bus": { + "solo_bus": 420000, + "articulated_bus": 600000, + "battery_kwh": 250, + "lifespan_bus": 14, + "lifespan_battery": 7 + }, + "gc": { + "building_cost_subsidy_per_kW": 158.3, + "fix": 62500, + "variable_per_meter": 562.5, + "transformer": 80000, + "lifespan_gc": 20 + }, + "cs": { + "depot_cs_per_kW": 877.5, + "opportunity_cs_per_kW": 1000, + "lifespan_cs": 20 + }, + "garage": { + "n_charging_stations": 1, + "busses_per_positions": 10, + "costs_position": 200000 + }, + "maintenance": { + "solo_bus_per_km": 0.24, + "articulated_bus_per_km": 0.30, + "percentage_of_cs_infra": 0.02 + } +} \ No newline at end of file diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 9dd877c5..35d7da11 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -1,46 +1,57 @@ { "Station-0": { "type": "deps", - "n_charging_stations": "None" + "n_charging_stations": "None", + "distance_transformer_in_meter": 0 }, "Station-3": { "type": "opps", - "n_charging_stations": 3 + "n_charging_stations": 3, + "distance_transformer_in_meter": 50 }, "Station-10": { "type": "opps", - "n_charging_stations": 1 + "n_charging_stations": 1, + "distance_transformer_in_meter": 50 }, "Station-21": { "type": "opps", - "n_charging_stations": 2 + "n_charging_stations": 2, + "distance_transformer_in_meter": 50 }, "Station-22": { "type": "deps", - "n_charging_stations": "None" + "n_charging_stations": "None", + "distance_transformer_in_meter": 0 }, "Station-26": { "type": "opps", - "n_charging_stations": 5 + "n_charging_stations": 5, + "distance_transformer_in_meter": 50 }, "Station-28": { "type": "opps", - "n_charging_stations": 4 + "n_charging_stations": 4, + "distance_transformer_in_meter": 50 }, "Station-30": { "type": "opps", - "n_charging_stations": 4 + "n_charging_stations": 4, + "distance_transformer_in_meter": 50 }, "Station-32": { "type": "opps", - "n_charging_stations": 3 + "n_charging_stations": 3, + "distance_transformer_in_meter": 50 }, "Station-39": { "type": "opps", - "n_charging_stations": 5 + "n_charging_stations": 5, + "distance_transformer_in_meter": 50 }, "Station-42": { "type": "deps", - "n_charging_stations": "None" + "n_charging_stations": "None", + "distance_transformer_in_meter": 0 } } \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 41a77d9c..7866a9e5 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -4,10 +4,10 @@ if __name__ == '__main__': parser = argparse.ArgumentParser( - description='Ebus Toolbox - \ - Simulation Program for Ebus Fleets.') + description='eBus-Toolbox - \ + Simulation Program for electric Bus Fleets.') parser.add_argument('--input_schedule', nargs='?', - help='Path to CSV file containing all trips of schdedule to be analyzed.') + help='Path to CSV file containing all trips of schedule to be analyzed.') parser.add_argument('--output_directory', default='data/sim_outputs', nargs='?', help='Location where all simulation outputs are stored') parser.add_argument('--preferred_charging_type', '-pct', default='depot', @@ -25,13 +25,13 @@ help='set number of minutes for each timestep (Δt)') parser.add_argument('--desired-soc', metavar='SOC', type=float, default=0.8, help='set minimum desired SOC (0 - 1) for each charging process') - parser.add_argument('--gc_power_opps', metavar='POPP', type=float, default=1500, + parser.add_argument('--gc_power_opps', metavar='POPP', type=float, default=None, help='max power of grid connector at opp stations') - parser.add_argument('--gc_power_deps', metavar='PDEP', type=float, default=1500, + parser.add_argument('--gc_power_deps', metavar='PDEP', type=float, default=None, help='max power of grid connector at depot stations') - parser.add_argument('--cs_power_opps', metavar='CSPOPP', type=float, default=150, + parser.add_argument('--cs_power_opps', metavar='CSPOPP', type=float, default=450, help='max power of charging station at opp stations') - parser.add_argument('--cs_power_deps_depb', metavar='CSPDEPDEP', type=float, default=150, + parser.add_argument('--cs_power_deps_depb', metavar='CSPDEPDEP', type=float, default=100, help='max power of charging station at depot stations for depot busses') parser.add_argument('--cs_power_deps_oppb', metavar='CSPDEPOPP', type=float, default=150, help='max power of charging station at depot stations for opp busses') @@ -64,6 +64,8 @@ default='data/examples/electrified_stations.json') parser.add_argument('--vehicle_types', help='include vehicle_types json', default='examples/vehicle_types.json') + parser.add_argument('--cost_params', help='include cost_params json', + default='examples/cost_params.json') parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', default=2) parser.add_argument('--default_buffer_time_opps', help='time to subtract off of standing time ' diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py new file mode 100644 index 00000000..6b1a034f --- /dev/null +++ b/ebus_toolbox/costs.py @@ -0,0 +1,87 @@ +import json + + +class Costs: + + def __init__(self, vehicle_types) -> None: + self.vehicle_types = vehicle_types + + @staticmethod + def calculate_costs(args, schedule): + """ Calculates annual costs of all necessary vehicles and infrastructure. + + :param args: Command line arguments and/or arguments from config file. + :type args: argparse.Namespace + :param schedule: Information about the whole bus schedule and all used parameters. + :type schedule: object + :return: Investment costs [€/a] + :rtype: (float) + """ + # general settings and imports for calculation + round_to_numbers = 2 + with open(args.cost_params) as json_file: + c_params = json.load(json_file) + with open(args.electrified_stations) as json_file: + el_stations = json.load(json_file) + + # VEHICLES + c_busses = 0 + v_types = schedule.scenario["constants"]["vehicle_types"] + for i in v_types: + if schedule.vehicle_type_counts[i] > 0: + if "solo" in v_types[i]["name"]: + costs_bus = c_params["bus"]["solo_bus"] + elif "articulated" in v_types[i]["name"]: + costs_bus = c_params["bus"]["articulated_bus"] + else: + costs_bus = c_params["bus"]["battery_kwh"] = 0 + print("Warning: Name of vehicle_type doesn't include 'solo' or 'articulated. " + "Unable to calculate investment and maintenance costs for busses.'") + c_busses += (schedule.vehicle_type_counts[i] * + (costs_bus - (-c_params["bus"]["lifespan_bus"] + // c_params["bus"]["lifespan_battery"]) * + v_types[i]["capacity"] * c_params["bus"]["battery_kwh"])) + c_busses_annual = round(c_busses / c_params["bus"]["lifespan_bus"], round_to_numbers) + + # GRID CONNECTION POINTS + c_gcs = 0 + gcs = schedule.scenario["constants"]["grid_connectors"] + for i in gcs: + c_gcs += c_params["gc"]["building_cost_subsidy_per_kW"] * gcs[i]["max_power"] + \ + c_params["gc"]["transformer"] + c_params["gc"]["fix"] + \ + c_params["gc"]["variable_per_meter"] * \ + el_stations[i]["distance_transformer_in_meter"] + c_gcs_annual = round(c_gcs / c_params["gc"]["lifespan_gc"], round_to_numbers) + + # CHARGING INFRASTRUCTURE + c_cs = 0 + cs = schedule.scenario["constants"]["charging_stations"] + for i in cs: + if "deps" in i: + c_cs += c_params["cs"]["depot_cs_per_kW"] * cs[i]["max_power"] + elif "opps" in i: + c_cs += c_params["cs"]["opportunity_cs_per_kW"] * cs[i]["max_power"] + c_cs_annual = round(c_cs / c_params["cs"]["lifespan_cs"], round_to_numbers) + + # GARAGE + + # MAINTENANCE + m_infra = c_cs * c_params["maintenance"]["percentage_of_cs_infra"] + m_bus = 0 + drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] / 60 / + schedule.scenario["scenario"]["interval"]) // 24) + for i in schedule.rotations: + vc_type = f"{schedule.rotations[i].vehicle_type}_{schedule.rotations[i].charging_type}" + v_name = v_types[vc_type]["name"] + if "solo" in v_name: + m_bus += (schedule.rotations[i].distance / 1000 / drive_days * 365) * \ + c_params["maintenance"]["solo_bus_per_km"] + elif "articulated" in v_name: + m_bus += (schedule.rotations[i].distance / 1000 / drive_days * 365) * \ + c_params["maintenance"]["articulated_bus_per_km"] + c_maintenance_annual = round(m_infra + m_bus, round_to_numbers) + + invest_costs = c_busses + c_cs + c_gcs + invest_costs_annual = c_busses_annual + c_cs_annual + c_gcs_annual + c_maintenance_annual + + return {"invest_costs": invest_costs, "invest_costs_annual": invest_costs_annual} diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a91fb112..2acac27e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -74,7 +74,7 @@ def set_charging_type(self, preferred_ct, args, rotation_ids=None): """ Change charging type of either all or specified rotations. Adjust minimum standing time at depot after completion of rotation. - :param preferred_ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. + :param preferred_ct: Choose this charging type whenever possible. Either 'depb' or 'oppb'. :type preferred_ct: str :param args: Command line arguments and/or arguments from config file. :type args: argparse.Namespace @@ -117,7 +117,7 @@ def assign_vehicles(self): rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) for rot in rotations: - # find vehicles that have completed rotation and stood for a minimum staning time + # find vehicles that have completed rotation and stood for a minimum standing time # mark those vehicle as idle while rotations_in_progress: # calculate min_standing_time deps @@ -230,7 +230,7 @@ def get_negative_rotations(self, scenario): :rtype: list """ - # get dict of vehicles with negative soc's + # get dict of vehicles with negative SOCs try: negative_vehicles = scenario.negative_soc_tracker except AttributeError: @@ -417,6 +417,7 @@ def generate_scenario(self, args): if number_cs != "None": gc_power = number_cs * cs_power else: + # ToDo: Check reason! Calculate via number of busses? # add a really large number gc_power = 100 * cs_power @@ -640,7 +641,7 @@ def generate_rotations_overview(self, scenario, args): "distance": rotation.distance, "charging_type": rotation.charging_type, "SOC_at_arrival": rotation_soc_ts[-1], - "Minumum_SOC": min(rotation_soc_ts), + "Minimum_SOC": min(rotation_soc_ts), "Negative_SOC": 1 if id in negative_rotations else 0 } rotation_infos.append(rotation_info) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index ab7a4f13..1dc46b15 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -4,6 +4,7 @@ from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip +from ebus_toolbox.costs import Costs from ebus_toolbox import report # , optimizer @@ -57,6 +58,13 @@ def simulate(args): scenario.run('distributed', vars(args).copy()) print(f"Spice EV simulation complete. (Iteration {i})") + # Calculate Costs of Iteration + capex = Costs.calculate_costs(args, schedule) + opex_annual = 0 # ToDo: Import annual OPEX from SpiceEV + costs = capex["invest_costs"] + costs_annual = capex["invest_costs_annual"] + opex_annual + print(f"Investment costs: {costs} €. Total annual costs: {costs_annual} €.") + if i < args.iterations - 1: # TODO: replace with optimizer step in the future schedule.readjust_charging_type(args, scenario) From b3095e7f9ca72c58510e8c693a91d02ab4d53120 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Tue, 16 Aug 2022 12:49:08 +0200 Subject: [PATCH 170/802] Added cost_params as input in cfg-file --- data/configs/ebus_toolbox.cfg | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 40f228ad..9c40acaf 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -6,13 +6,16 @@ input_schedule = "./data/examples/trips_example.csv" # output path for scenario.json -- called input since its input for spiceev -#output_directory = "./data/sim_outputs/" +output_directory = "./data/sim_outputs/" # electrified stations (defaults to: data/examples/electrified_stations.json) -#electrified_stations = "data/examples/electrified_stations.json" +electrified_stations = "data/examples/electrified_stations.json" # vehicle types (defaults to: ./data/examples/vehicle_types.json) -#vehicle_types = "./data/examples/vehicle_types.json" +vehicle_types = "./data/examples/vehicle_types.json" + +# cost parameters (defaults to: ./data/examples/vehicle_types.json) +cost_params = "./data/examples/cost_params.json" ##### SIMULATION HYPERPARAMETERS ##### From 713beec4e39d629b4e3ac98f7ad34c4376a7ecaa Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Tue, 16 Aug 2022 16:01:14 +0200 Subject: [PATCH 171/802] Splitted annual cost into investment and maintenance. Adjusted return description in docstrings. --- ebus_toolbox/costs.py | 11 ++++++----- ebus_toolbox/simulate.py | 10 +++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 6b1a034f..6f9260d8 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -14,8 +14,8 @@ def calculate_costs(args, schedule): :type args: argparse.Namespace :param schedule: Information about the whole bus schedule and all used parameters. :type schedule: object - :return: Investment costs [€/a] - :rtype: (float) + :return: Investment cost [€], annual investment cost [€/a], annual maintenance cost [€/a] + :rtype: (float, float, float) """ # general settings and imports for calculation round_to_numbers = 2 @@ -81,7 +81,8 @@ def calculate_costs(args, schedule): c_params["maintenance"]["articulated_bus_per_km"] c_maintenance_annual = round(m_infra + m_bus, round_to_numbers) - invest_costs = c_busses + c_cs + c_gcs - invest_costs_annual = c_busses_annual + c_cs_annual + c_gcs_annual + c_maintenance_annual + c_invest = c_busses + c_cs + c_gcs + c_invest_annual = c_busses_annual + c_cs_annual + c_gcs_annual - return {"invest_costs": invest_costs, "invest_costs_annual": invest_costs_annual} + return {"c_invest": c_invest, "c_invest_annual": c_invest_annual, + "c_maintenance_annual": c_maintenance_annual} diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1dc46b15..29761cbc 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -59,11 +59,11 @@ def simulate(args): print(f"Spice EV simulation complete. (Iteration {i})") # Calculate Costs of Iteration - capex = Costs.calculate_costs(args, schedule) - opex_annual = 0 # ToDo: Import annual OPEX from SpiceEV - costs = capex["invest_costs"] - costs_annual = capex["invest_costs_annual"] + opex_annual - print(f"Investment costs: {costs} €. Total annual costs: {costs_annual} €.") + costs = Costs.calculate_costs(args, schedule) + opex_energy_annual = 0 # ToDo: Import annual energy costs from SpiceEV + cost_invest = costs["c_invest"] + cost_annual = costs["c_invest_annual"] + costs["c_maintenance_annual"] + opex_energy_annual + print(f"Investment cost: {cost_invest} €. Total annual cost: {cost_annual} €.") if i < args.iterations - 1: # TODO: replace with optimizer step in the future From ef8fbd33c79b82703e3bd410c7c76fb27835328b Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Wed, 17 Aug 2022 12:05:55 +0200 Subject: [PATCH 172/802] - Implemented cost calculation as function - Added "type" as key in charging stations - Changed order of args relevant to SpiceEV in main - Minor changes in variable names --- data/examples/cost_params.json | 5 +- data/examples/electrified_stations.json | 22 ++-- ebus_toolbox/__main__.py | 15 +-- ebus_toolbox/costs.py | 159 ++++++++++++------------ ebus_toolbox/schedule.py | 1 + ebus_toolbox/simulate.py | 4 +- 6 files changed, 107 insertions(+), 99 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index a1b850fd..a2c13649 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -9,7 +9,7 @@ "gc": { "building_cost_subsidy_per_kW": 158.3, "fix": 62500, - "variable_per_meter": 562.5, + "variable": 562.5, "transformer": 80000, "lifespan_gc": 20 }, @@ -20,8 +20,9 @@ }, "garage": { "n_charging_stations": 1, + "power_cs": 50, "busses_per_positions": 10, - "costs_position": 200000 + "cost_per_position": 200000 }, "maintenance": { "solo_bus_per_km": 0.24, diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 35d7da11..84e73c19 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -2,56 +2,56 @@ "Station-0": { "type": "deps", "n_charging_stations": "None", - "distance_transformer_in_meter": 0 + "distance_transformer": 0 }, "Station-3": { "type": "opps", "n_charging_stations": 3, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-10": { "type": "opps", "n_charging_stations": 1, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-21": { "type": "opps", "n_charging_stations": 2, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-22": { "type": "deps", "n_charging_stations": "None", - "distance_transformer_in_meter": 0 + "distance_transformer": 0 }, "Station-26": { "type": "opps", "n_charging_stations": 5, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-28": { "type": "opps", "n_charging_stations": 4, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-30": { "type": "opps", "n_charging_stations": 4, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-32": { "type": "opps", "n_charging_stations": 3, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-39": { "type": "opps", "n_charging_stations": 5, - "distance_transformer_in_meter": 50 + "distance_transformer": 50 }, "Station-42": { "type": "deps", "n_charging_stations": "None", - "distance_transformer_in_meter": 0 + "distance_transformer": 0 } } \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 7866a9e5..8e646fb8 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -5,7 +5,7 @@ if __name__ == '__main__': parser = argparse.ArgumentParser( description='eBus-Toolbox - \ - Simulation Program for electric Bus Fleets.') + simulation program for electric bus fleets.') parser.add_argument('--input_schedule', nargs='?', help='Path to CSV file containing all trips of schedule to be analyzed.') parser.add_argument('--output_directory', default='data/sim_outputs', nargs='?', @@ -94,12 +94,6 @@ help='Append additional options to the charging strategy.') parser.add_argument('--config', help='Use config file to set arguments') args = parser.parse_args() - - util.set_options_from_config(args, check=True, verbose=False) - - if args.input_schedule is None: - raise SystemExit("The following argument is required: input_schedule") - # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True @@ -107,4 +101,11 @@ args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") + util.set_options_from_config(args, check=True, verbose=False) + # rename special options + args.timing = args.eta + + if args.input_schedule is None: + raise SystemExit("The following argument is required: input_schedule") + simulate.simulate(args) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 6f9260d8..1a1980b7 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,88 +1,93 @@ import json -class Costs: +def calculate_costs(args, schedule): + """ Calculates annual costs of all necessary vehicles and infrastructure. - def __init__(self, vehicle_types) -> None: - self.vehicle_types = vehicle_types + :param args: Command line arguments and/or arguments from config file. + :type args: argparse.Namespace + :param schedule: Information about the whole bus schedule and all used parameters. + :type schedule: object + :return: Investment cost [€], annual investment cost [€/a], annual maintenance cost [€/a] + :rtype: (float, float, float) + """ + # general settings and imports for calculation + ROUND_TO_PLACES = 2 + with open(args.cost_params) as json_file: + c_params = json.load(json_file) + with open(args.electrified_stations) as json_file: + el_stations = json.load(json_file) - @staticmethod - def calculate_costs(args, schedule): - """ Calculates annual costs of all necessary vehicles and infrastructure. + # VEHICLES + c_busses = 0 + v_types = schedule.scenario["constants"]["vehicle_types"] + for v_type, v_keys in v_types.items(): + if schedule.vehicle_type_counts[v_type] > 0: + if "solo" in v_keys["name"]: + costs_bus = c_params["bus"]["solo_bus"] + elif "articulated" in v_keys["name"]: + costs_bus = c_params["bus"]["articulated_bus"] + else: + costs_bus = c_params["bus"]["battery_kwh"] = 0 + print("Warning: Name of vehicle_type doesn't include 'solo' or 'articulated. " + "Unable to calculate investment and maintenance costs for busses.'") + # sum up cost of busses and its batteries, depending on how often the battery has to be + # replaced in the lifespan of the busses + c_busses += (schedule.vehicle_type_counts[v_type] * + (costs_bus - (-c_params["bus"]["lifespan_bus"] + // c_params["bus"]["lifespan_battery"]) * + v_keys["capacity"] * c_params["bus"]["battery_kwh"])) + # calculate annual cost of busses, depending on its lifespan + c_busses_annual = round(c_busses / c_params["bus"]["lifespan_bus"], ROUND_TO_PLACES) - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace - :param schedule: Information about the whole bus schedule and all used parameters. - :type schedule: object - :return: Investment cost [€], annual investment cost [€/a], annual maintenance cost [€/a] - :rtype: (float, float, float) - """ - # general settings and imports for calculation - round_to_numbers = 2 - with open(args.cost_params) as json_file: - c_params = json.load(json_file) - with open(args.electrified_stations) as json_file: - el_stations = json.load(json_file) + # GRID CONNECTION POINTS + c_gcs = 0 + gcs = schedule.scenario["constants"]["grid_connectors"] + for gcID, gc_keys in gcs.items(): + c_gcs += c_params["gc"]["building_cost_subsidy_per_kW"] * gc_keys["max_power"] + \ + c_params["gc"]["transformer"] + c_params["gc"]["fix"] + \ + c_params["gc"]["variable"] * el_stations[gcID]["distance_transformer"] + # calculate annual cost of grid connectors, depending on its lifespan + c_gcs_annual = round(c_gcs / c_params["gc"]["lifespan_gc"], ROUND_TO_PLACES) - # VEHICLES - c_busses = 0 - v_types = schedule.scenario["constants"]["vehicle_types"] - for i in v_types: - if schedule.vehicle_type_counts[i] > 0: - if "solo" in v_types[i]["name"]: - costs_bus = c_params["bus"]["solo_bus"] - elif "articulated" in v_types[i]["name"]: - costs_bus = c_params["bus"]["articulated_bus"] - else: - costs_bus = c_params["bus"]["battery_kwh"] = 0 - print("Warning: Name of vehicle_type doesn't include 'solo' or 'articulated. " - "Unable to calculate investment and maintenance costs for busses.'") - c_busses += (schedule.vehicle_type_counts[i] * - (costs_bus - (-c_params["bus"]["lifespan_bus"] - // c_params["bus"]["lifespan_battery"]) * - v_types[i]["capacity"] * c_params["bus"]["battery_kwh"])) - c_busses_annual = round(c_busses / c_params["bus"]["lifespan_bus"], round_to_numbers) + # CHARGING INFRASTRUCTURE + c_cs = 0 + cs = schedule.scenario["constants"]["charging_stations"] + for csID in cs.values(): + if csID["type"] == "deps": + c_cs += c_params["cs"]["depot_cs_per_kW"] * csID["max_power"] + elif csID["type"] == "opps": + c_cs += c_params["cs"]["opportunity_cs_per_kW"] * csID["max_power"] + # calculate annual cost of charging stations, depending on its lifespan + c_cs_annual = round(c_cs / c_params["cs"]["lifespan_cs"], ROUND_TO_PLACES) - # GRID CONNECTION POINTS - c_gcs = 0 - gcs = schedule.scenario["constants"]["grid_connectors"] - for i in gcs: - c_gcs += c_params["gc"]["building_cost_subsidy_per_kW"] * gcs[i]["max_power"] + \ - c_params["gc"]["transformer"] + c_params["gc"]["fix"] + \ - c_params["gc"]["variable_per_meter"] * \ - el_stations[i]["distance_transformer_in_meter"] - c_gcs_annual = round(c_gcs / c_params["gc"]["lifespan_gc"], round_to_numbers) + # GARAGE + c_garage_cs = (c_params["garage"]["n_charging_stations"] * c_params["garage"]["power_cs"] * + c_params["cs"]["depot_cs_per_kW"]) + c_garage_positions = -(-sum(schedule.vehicle_type_counts.values()) // + c_params["garage"]["busses_per_positions"] * + c_params["garage"]["cost_per_position"]) + c_garage = c_garage_cs + c_garage_positions + # ToDo: annual costs of garage? - # CHARGING INFRASTRUCTURE - c_cs = 0 - cs = schedule.scenario["constants"]["charging_stations"] - for i in cs: - if "deps" in i: - c_cs += c_params["cs"]["depot_cs_per_kW"] * cs[i]["max_power"] - elif "opps" in i: - c_cs += c_params["cs"]["opportunity_cs_per_kW"] * cs[i]["max_power"] - c_cs_annual = round(c_cs / c_params["cs"]["lifespan_cs"], round_to_numbers) + # MAINTENANCE + m_infra = c_cs * c_params["maintenance"]["percentage_of_cs_infra"] + m_bus = 0 + # calculate (ceil) number of days in scenario + drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * + schedule.scenario["scenario"]["interval"]) // (24 * 60)) + for rot in schedule.rotations.values(): + vt_ct = f"{rot.vehicle_type}_{rot.charging_type}" + if "solo" in v_types[vt_ct]["name"]: + m_bus += (rot.distance / 1000 / drive_days * 365) * \ + c_params["maintenance"]["solo_bus_per_km"] + elif "articulated" in v_types[vt_ct]["name"]: + m_bus += (rot.distance / 1000 / drive_days * 365) * \ + c_params["maintenance"]["articulated_bus_per_km"] + c_maintenance_annual = round(m_infra + m_bus, ROUND_TO_PLACES) - # GARAGE + c_invest = c_busses + c_cs + c_gcs + c_garage + c_invest_annual = c_busses_annual + c_cs_annual + c_gcs_annual - # MAINTENANCE - m_infra = c_cs * c_params["maintenance"]["percentage_of_cs_infra"] - m_bus = 0 - drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] / 60 / - schedule.scenario["scenario"]["interval"]) // 24) - for i in schedule.rotations: - vc_type = f"{schedule.rotations[i].vehicle_type}_{schedule.rotations[i].charging_type}" - v_name = v_types[vc_type]["name"] - if "solo" in v_name: - m_bus += (schedule.rotations[i].distance / 1000 / drive_days * 365) * \ - c_params["maintenance"]["solo_bus_per_km"] - elif "articulated" in v_name: - m_bus += (schedule.rotations[i].distance / 1000 / drive_days * 365) * \ - c_params["maintenance"]["articulated_bus_per_km"] - c_maintenance_annual = round(m_infra + m_bus, round_to_numbers) - - c_invest = c_busses + c_cs + c_gcs - c_invest_annual = c_busses_annual + c_cs_annual + c_gcs_annual - - return {"c_invest": c_invest, "c_invest_annual": c_invest_annual, - "c_maintenance_annual": c_maintenance_annual} + return {"c_invest": c_invest, "c_invest_annual": c_invest_annual, + "c_maintenance_annual": c_maintenance_annual} diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 2acac27e..ad0f5738 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -423,6 +423,7 @@ def generate_scenario(self, args): # add one charging station for each bus at bus station charging_stations[cs_name_and_type] = { + "type": station_type, "max_power": cs_power, "min_power": 0.1 * cs_power, "parent": gc_name diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 29761cbc..76b17a2b 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -4,7 +4,7 @@ from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip -from ebus_toolbox.costs import Costs +from ebus_toolbox.costs import calculate_costs from ebus_toolbox import report # , optimizer @@ -59,7 +59,7 @@ def simulate(args): print(f"Spice EV simulation complete. (Iteration {i})") # Calculate Costs of Iteration - costs = Costs.calculate_costs(args, schedule) + costs = calculate_costs(args, schedule) opex_energy_annual = 0 # ToDo: Import annual energy costs from SpiceEV cost_invest = costs["c_invest"] cost_annual = costs["c_invest_annual"] + costs["c_maintenance_annual"] + opex_energy_annual From 0d8f14055117c159b1f2b6b17d95344508ad83e0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 29 Aug 2022 16:28:52 +0200 Subject: [PATCH 173/802] allow for rotation specific charging type --- ebus_toolbox/consumption.py | 8 +++++++- ebus_toolbox/rotation.py | 2 +- ebus_toolbox/schedule.py | 10 +++++----- ebus_toolbox/simulate.py | 7 ++++++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index aba33465..8f977cb9 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -31,7 +31,13 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): :rtype: (float, float) """ - vt_ct = f"{vehicle_type}_{charging_type}" + # the charging type may not be set + # picking one of the available charging types as only vehicle's mileage is + # needed which does not depend on charging type + if charging_type is None: + vt_ct = next((t for t in self.vehicle_types.keys() if vehicle_type in t)) + else: + vt_ct = f"{vehicle_type}_{charging_type}" # in case a constant mileage is provided if isinstance(self.vehicle_types[vt_ct]['mileage'], float): diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index b768b5c7..c55840fa 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -9,7 +9,7 @@ def __init__(self, id, vehicle_type) -> None: self.vehicle_type = vehicle_type self.vehicle_id = None - self.charging_type = 'depb' + self.charging_type = None self.consumption = 0 self.distance = 0 diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a91fb112..f9806d7d 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -88,17 +88,17 @@ def set_charging_type(self, preferred_ct, args, rotation_ids=None): for id in rotation_ids: rot = self.rotations[id] - vehicle_type = self.vehicle_types[f"{rot.vehicle_type}_{rot.charging_type}"] - capacity = vehicle_type["capacity"] - if preferred_ct == "oppb" or capacity < rot.consumption: + capacity_depb = self.vehicle_types[f"{rot.vehicle_type}_depb"]["capacity"] + if preferred_ct == "oppb" or capacity_depb < rot.consumption: self.rotations[id].charging_type = "oppb" + capacity_oppb = self.vehicle_types[f"{rot.vehicle_type}_depb"]["capacity"] min_standing_time = \ - (capacity / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb + (capacity_oppb / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb else: self.rotations[id].charging_type = "depb" min_standing_time = (rot.consumption / args.cs_power_deps_depb) desired_max_standing_time = \ - (capacity / args.cs_power_deps_depb) * args.min_recharge_deps_oppb + (capacity_depb / args.cs_power_deps_depb) * args.min_recharge_deps_oppb if min_standing_time > desired_max_standing_time: min_standing_time = desired_max_standing_time diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index ab7a4f13..d222b701 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -38,7 +38,12 @@ def simulate(args): # filter trips according to args schedule.filter_rotations() schedule.calculate_consumption() - schedule.set_charging_type(preferred_ct=args.preferred_charging_type, args=args) + # set charging type for all rotations without explicitly specified charging type + for rot_id, rot in schedule.rotations.items(): + if rot.charging_type is None: + schedule.set_charging_type(preferred_ct=args.preferred_charging_type, + args=args, + rotation_ids=[rot_id]) for i in range(args.iterations): # (re)calculate the change in SoC for every trip From af5300fa8d99aaa8b15333ac226e34023dae9d44 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 29 Aug 2022 17:01:27 +0200 Subject: [PATCH 174/802] readme explains rotation specific charge type --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 7b934bae..4b7950bf 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,7 @@ To analyze your own electric bus schedule, the data needs to be provided as a CS | distance | Distance traveled in **m** | 1340 | | vehicle_type | ID of vehicle type defined in vehicle types file. Set path of this file in config.
(see default for reference: `data/examples/vehicle_types.json`) | some_bus_type | +| Column Name | Description | Example | +| :------------ | :----------------------------------------------------------- | ---------------------------- | +| line | The bus line | 512, M10, X11 etc | +| charging_type | The preferred charging type for this trip.
NOTE: All trips of a rotation need to have the same charging type. If omitted, charging type is set according to preferred charging type provided in the config file. | Options: **depb**, **oppb** | From 3290405e5ca2b80d06ffc62860fcca2af433b295 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 29 Aug 2022 17:53:26 +0200 Subject: [PATCH 175/802] move service_optimization to own file --- data/configs/ebus_toolbox.cfg | 6 ++- ebus_toolbox/__main__.py | 10 ++-- ebus_toolbox/optimization.py | 79 +++++++++++++++++++++++++++++++ ebus_toolbox/optimizer.py | 7 --- ebus_toolbox/simulate.py | 88 +++++++---------------------------- 5 files changed, 107 insertions(+), 83 deletions(-) create mode 100644 ebus_toolbox/optimization.py delete mode 100644 ebus_toolbox/optimizer.py diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index f4392c6b..6e1f8c1e 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -19,8 +19,10 @@ input_schedule = "./data/examples/trips_example_short.csv" # set random seed (for always random: set seed = null) seed = 1 -# number of interations for the adjustment of charging types (default:1) -iterations = 2 +# Specify what you want to do. Options: sim, service_optimization. Default: sim +# sim runs a single simulation with the given inputs. +# service optimization finds the largest set of electrified rotations. +#mode = sim # set length of timestep in minutes (default: 15 minute intervals) interval = 1 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 3bf1519d..d0ca4741 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -8,11 +8,15 @@ Simulation Program for Ebus Fleets.') parser.add_argument('--input_schedule', nargs='?', help='Path to CSV file containing all trips of schdedule to be analyzed.') + parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], + help='Specify what you want to do. Choose one from {sim, \ + service_optimization}. sim runs a single simulation with the given inputs. \ + service optimization finds the largest set of electrified rotations.') parser.add_argument('--output_directory', default='data/sim_outputs', nargs='?', help='Location where all simulation outputs are stored') - parser.add_argument('--preferred_charging_type', '-pct', default='depot', - choices=['depot', 'opp'], help="Preferred charging type. Choose one\ - from and . opp stands for opportunity.") + parser.add_argument('--preferred_charging_type', '-pct', default='depb', + choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ + from {depb, oppb}. opp stands for opportunity.") parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", help='location of vehicle type definitions') parser.add_argument('--min_recharge_deps_oppb', default=1, diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py new file mode 100644 index 00000000..035375c4 --- /dev/null +++ b/ebus_toolbox/optimization.py @@ -0,0 +1,79 @@ +""" Collection of procedures optimizing arbitrary parameters of a bus schedule or infrastructure. +""" + +import datetime +from copy import deepcopy + + +def service_optimization(schedule, args): + common_stations = schedule.get_common_stations(only_opps=True) + + # initial run + scenario = schedule.run(args) + + # single out negative rotations. Try to run these with common non-negative rotations + original_rotations = deepcopy(schedule.rotations) + negative_rotations = schedule.get_negative_rotations(scenario) + print(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") + + negative_sets = {} + for rot_key in negative_rotations: + rotation = schedule.rotations[rot_key] + if rotation.charging_type == "depb": + schedule.set_charging_type("oppb", args, [rot_key]) + # todo: actually this case should not happen, but it still does happen.. why? + else: + # oppb: build non-interfering sets of negative rotations + s = {rot_key} + vid = rotation.vehicle_id + last_neg_soc_time = scenario.negative_soc_tracker[vid][-1] + last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) + dep_stations = {r: t for r, t in common_stations[rot_key].items() + if t <= last_neg_soc_time} + while dep_stations: + r, t = dep_stations.popitem() + if r not in negative_rotations: + s.add(r) + # add dependencies of r + dep_stations.update({r2: t2 for r2, t2 + in common_stations[r].items() if t2 <= t}) + negative_sets[rot_key] = s + + # run singled-out rotations + ignored = [] + for i, (rot, s) in enumerate(negative_sets.items()): + schedule.rotations = {r: original_rotations[r] for r in s} + print(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") + scenario = schedule.run(args) + if scenario.negative_soc_tracker: + # still fail: try just the negative rotation + schedule.rotations = {rot: original_rotations[rot]} + scenario = schedule.run(args) + if scenario.negative_soc_tracker: + # no hope, this just won't work + print(f"Rotation {rot} will stay negative") + else: + # works alone with other non-negative rotations + print(f"Rotation {rot} works alone") + ignored.append(rot) + + negative_sets = {k: v for k, v in negative_sets.items() if k not in ignored} + + # now, in negative_sets are just rotations that work with others still + # try to combine them + possible = [(a, b) for a in negative_sets for b in negative_sets if a != b] + while possible: + print(f"{len(possible)} combinations remain") + r1, r2 = possible.pop() + combined = negative_sets[r1].union(negative_sets[r2]) + schedule.rotations = {r: original_rotations[r] for r in combined} + scenario = schedule.run(args) + if not scenario.negative_soc_tracker: + # compatible (don't interfere): keep union, remove r2 + negative_sets[r1] = combined + # simplified. What about triangle? (r1+r2, r1+r3, r2!+r3)? + possible = [t for t in possible if r2 not in t] + + print(negative_sets) + + return scenario diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py deleted file mode 100644 index 7b710c44..00000000 --- a/ebus_toolbox/optimizer.py +++ /dev/null @@ -1,7 +0,0 @@ -""" Optimizer that evaluates inputs and outputs of every iteration, adapting scenario setup - to optimize for specified metrics. -""" - - -def no_optimization(): - return "converged" diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 728c194e..52995aaa 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,12 +1,10 @@ # imports -from copy import deepcopy -import datetime import json import warnings from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip -from ebus_toolbox import report # , optimizer +from ebus_toolbox import report, optimization def simulate(args): @@ -45,75 +43,23 @@ def simulate(args): args=args, rotation_ids=[rot_id]) - common_stations = schedule.get_common_stations(only_opps=True) + if args.mode == 'service_optimization': + scenario = optimization.service_optimization(schedule, args) + else: + # calculate the change in SoC for every trip + # charging types may have changed which may impact battery capacity + # while mileage is assumed to stay constant + schedule.delta_soc_all_trips() + # each rotation is assigned a vehicle ID + schedule.assign_vehicles() + scenario = schedule.generate_scenario(args) + print("Running Spice EV...") + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + scenario.run('distributed', vars(args).copy()) + print("Spice EV simulation complete.") - # initial run - scenario = schedule.run(args) - - # single out negative rotations. Try to run these with common non-negative rotations - original_rotations = deepcopy(schedule.rotations) - negative_rotations = schedule.get_negative_rotations(scenario) - print(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") - - negative_sets = {} - for rot_key in negative_rotations: - rotation = schedule.rotations[rot_key] - if rotation.charging_type == "depb": - schedule.set_charging_type("oppb", args, [rot_key]) - # todo: actually this case should not happen, but it still does happen.. why? - else: - # oppb: build non-interfering sets of negative rotations - s = {rot_key} - vid = rotation.vehicle_id - last_neg_soc_time = scenario.negative_soc_tracker[vid][-1] - last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) - dep_stations = {r: t for r, t in common_stations[rot_key].items() - if t <= last_neg_soc_time} - while dep_stations: - r, t = dep_stations.popitem() - if r not in negative_rotations: - s.add(r) - # add dependencies of r - dep_stations.update({r2: t2 for r2, t2 - in common_stations[r].items() if t2 <= t}) - negative_sets[rot_key] = s - - # run singled-out rotations - ignored = [] - for i, (rot, s) in enumerate(negative_sets.items()): - schedule.rotations = {r: original_rotations[r] for r in s} - print(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") - scenario = schedule.run(args) - if scenario.negative_soc_tracker: - # still fail: try just the negative rotation - schedule.rotations = {rot: original_rotations[rot]} - scenario = schedule.run(args) - if scenario.negative_soc_tracker: - # no hope, this just won't work - print(f"Rotation {rot} will stay negative") - else: - # works alone with other non-negative rotations - print(f"Rotation {rot} works alone") - ignored.append(rot) - - negative_sets = {k: v for k, v in negative_sets.items() if k not in ignored} - - # now, in negative_sets are just rotations that work with others still - # try to combine them - possible = [(a, b) for a in negative_sets for b in negative_sets if a != b] - while possible: - print(f"{len(possible)} combinations remain") - r1, r2 = possible.pop() - combined = negative_sets[r1].union(negative_sets[r2]) - schedule.rotations = {r: original_rotations[r] for r in combined} - scenario = schedule.run(args) - if not scenario.negative_soc_tracker: - # compatible (don't interfere): keep union, remove r2 - negative_sets[r1] = combined - # simplified. What about triangle? (r1+r2, r1+r3, r2!+r3)? - possible = [t for t in possible if r2 not in t] - - print(negative_sets) + print(f"Rotations {schedule.get_negative_rotations(scenario)} have negative SoC.") # create report report.generate(schedule, scenario, args) From e8399728e2a6da2ff42f6f92f53088c09d745a6e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 31 Aug 2022 13:16:55 +0200 Subject: [PATCH 176/802] make default more explicit for readability --- ebus_toolbox/simulate.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 52995aaa..3e3e283b 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -43,9 +43,12 @@ def simulate(args): args=args, rotation_ids=[rot_id]) + # run the mode specified in config if args.mode == 'service_optimization': scenario = optimization.service_optimization(schedule, args) - else: + elif args.mode == "sim": + # DEFAULT if mode argument is not specified by user + # calculate the change in SoC for every trip # charging types may have changed which may impact battery capacity # while mileage is assumed to stay constant From 831e59374ef774e161641ee399af473008a2a785 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 31 Aug 2022 13:42:02 +0200 Subject: [PATCH 177/802] minor fix --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 72ac5705..6b5b796d 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -672,6 +672,9 @@ def generate_rotations_overview(self, scenario, args): vehicle_soc = scenario.vehicle_socs[vehicle_id] start_idx = (rotation.departure_time - sim_start_time) // interval end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) + if end_idx > len(vehicle_soc): + # SpiceEV stopped before rotation was fully simulated + continue rotation_soc_ts = vehicle_soc[start_idx:end_idx] rotation_info = { From 0fc0959fa960b3ea8ebe443a61f03c9bafe6e2bf Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 31 Aug 2022 17:07:11 +0200 Subject: [PATCH 178/802] move set charging type to rotation class --- ebus_toolbox/rotation.py | 43 ++++++++++++++++++++++---- ebus_toolbox/schedule.py | 66 ++++++++++++++++------------------------ ebus_toolbox/simulate.py | 9 +++--- 3 files changed, 68 insertions(+), 50 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index c55840fa..e2bfef3b 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -1,11 +1,14 @@ +import datetime + from ebus_toolbox.trip import Trip class Rotation: - def __init__(self, id, vehicle_type) -> None: + def __init__(self, id, vehicle_type, schedule) -> None: self.id = id self.trips = [] + self.schedule = schedule self.vehicle_type = vehicle_type self.vehicle_id = None @@ -28,11 +31,6 @@ def add_trip(self, trip): """ new_trip = Trip(self, **trip) - # set charging type if given - if ('charging_type' in trip and - any(trip['charging_type'] == t for t in ['depb', 'oppb'])): - self.charging_type = trip['charging_type'] - self.distance += new_trip.distance if new_trip.line: self.lines.add(new_trip.line) @@ -57,6 +55,13 @@ def add_trip(self, trip): self.arrival_time = new_trip.arrival_time self.arrival_name = new_trip.arrival_name + # set charging type if given + if ('charging_type' in trip and + any(trip['charging_type'] == t for t in ['depb', 'oppb'])): + assert (self.charging_type is None or self.charging_type == trip['charging_type']),\ + f"Two trips of rotation {self.id} have distinct charging types" + self.set_charging_type(trip['charging_type']) + self.trips.append(new_trip) def calculate_consumption(self): @@ -79,3 +84,29 @@ def delta_soc_all_trips(self): """ for trip in self.trips: trip.get_delta_soc() + + def set_charging_type(self, ct): + """ Change charging type of either all or specified rotations. Adjust minimum standing time + at depot after completion of rotation. + + :param ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. + :type ct: str + """ + assert ct in ["oppb", "depb"], f"Invalid charging type: {ct}" + + capacity_depb = self.schedule.vehicle_types[f"{self.vehicle_type}_depb"]["capacity"] + if ct == "oppb" or capacity_depb < self.consumption: + self.charging_type = "oppb" + capacity_oppb = self.schedule.vehicle_types[f"{self.vehicle_type}_oppb"]["capacity"] + min_standing_time = ((capacity_oppb / self.schedule.cs_power_deps_oppb) + * self.schedule.min_recharge_deps_oppb) + else: + self.charging_type = "depb" + min_standing_time = (self.consumption / self.schedule.cs_power_deps_depb) + desired_max_standing_time = ((capacity_depb / self.schedule.cs_power_deps_depb) + * self.schedule.min_recharge_deps_depb) + if min_standing_time > desired_max_standing_time: + min_standing_time = desired_max_standing_time + + self.earliest_departure_next_rot = \ + self.arrival_time + datetime.timedelta(hours=min_standing_time) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 6b5b796d..9a3b0a91 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -11,16 +11,18 @@ class Schedule: - def __init__(self, vehicle_types, stations_file): + def __init__(self, vehicle_types, stations_file, **kwargs): """Constructs Schedule object from CSV file containing all trips of schedule :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict :param stations_file: json of electrified stations :type stations_file: string + :param kwargs: Command line arguments """ # Check if all bus types have both an opp and depot version # Also make sure that both versions have the same mileage + # TODO: remove check for constant mileage completely vehicle_type_names = list(vehicle_types.keys()) for name in vehicle_type_names: try: @@ -46,8 +48,22 @@ def __init__(self, vehicle_types, stations_file): self.original_rotations = None self.consumption = 0 + # mandatory config parameters + mandatory_options = [ + "min_recharge_deps_oppb", + "min_recharge_deps_depb", + "gc_power_opps", + "gc_power_deps", + "cs_power_opps", + "cs_power_deps_depb", + "cs_power_deps_oppb", + ] + for opt in mandatory_options: + assert opt in kwargs, f"Missing config paramter: {opt}" + setattr(self, opt, kwargs.get(opt)) + @classmethod - def from_csv(cls, path_to_csv, vehicle_types, stations): + def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): """Constructs Schedule object from CSV file containing all trips of schedule. :param path_to_csv: Path to csv file containing trip data @@ -56,10 +72,12 @@ def from_csv(cls, path_to_csv, vehicle_types, stations): :type vehicle_types: dict :param stations: json of electrified stations :type stations: string + :param kwargs: Command line arguments + :type kwargs: dict :return: Returns a new instance of Schedule with all trips from csv loaded. :rtype: Schedule """ - schedule = cls(vehicle_types, stations) + schedule = cls(vehicle_types, stations, **kwargs) with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) @@ -67,7 +85,9 @@ def from_csv(cls, path_to_csv, vehicle_types, stations): rotation_id = trip['rotation_id'] if rotation_id not in schedule.rotations.keys(): schedule.rotations.update({ - rotation_id: Rotation(id=rotation_id, vehicle_type=trip['vehicle_type'])}) + rotation_id: Rotation(id=rotation_id, + vehicle_type=trip['vehicle_type'], + schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) return schedule @@ -90,41 +110,6 @@ def run(self, args): return scenario - def set_charging_type(self, preferred_ct, args, rotation_ids=None): - """ Change charging type of either all or specified rotations. Adjust minimum standing time - at depot after completion of rotation. - - :param preferred_ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. - :type preferred_ct: str - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace - :param rotation_ids: IDs of rotations for which to set charging type. If None set charging - charging type for all rotations. - :type rotation_ids: list - """ - assert preferred_ct in ["oppb", "depb"], f"Invalid charging type: {preferred_ct}" - if rotation_ids is None: - rotation_ids = self.rotations.keys() - - for id in rotation_ids: - rot = self.rotations[id] - capacity_depb = self.vehicle_types[f"{rot.vehicle_type}_depb"]["capacity"] - if preferred_ct == "oppb" or capacity_depb < rot.consumption: - self.rotations[id].charging_type = "oppb" - capacity_oppb = self.vehicle_types[f"{rot.vehicle_type}_depb"]["capacity"] - min_standing_time = \ - (capacity_oppb / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb - else: - self.rotations[id].charging_type = "depb" - min_standing_time = (rot.consumption / args.cs_power_deps_depb) - desired_max_standing_time = \ - (capacity_depb / args.cs_power_deps_depb) * args.min_recharge_deps_oppb - if min_standing_time > desired_max_standing_time: - min_standing_time = desired_max_standing_time - - rot.earliest_departure_next_rot = \ - rot.arrival_time + datetime.timedelta(hours=min_standing_time) - def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. For every rotation it is checked whether vehicles with matching type are idle, in which @@ -133,6 +118,7 @@ def assign_vehicles(self): """ rotations_in_progress = [] idle_vehicles = [] + # TODO: create vehicle type counts dict with ct and vt values of all types vehicle_type_counts = {vehicle_type: 0 for vehicle_type in self.vehicle_types.keys()} rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) @@ -636,6 +622,8 @@ def generate_scenario(self, args): "discharge_curve": bat[3] }) + # TODO: restructure vehicle types for SpiceEV + # create final dict self.scenario = { "scenario": { diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 3e3e283b..74626ea6 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -16,6 +16,7 @@ def simulate(args): try: with open(args.vehicle_types) as f: vehicle_types = json.load(f) + del args.vehicle_types except FileNotFoundError: warnings.warn("Invalid path for vehicle type JSON. Using default types from EXAMPLE dir.") with open("data/examples/vehicle_types.json") as f: @@ -32,16 +33,14 @@ def simulate(args): pass setattr(args, opt_key, opt_val) - schedule = Schedule.from_csv(args.input_schedule, vehicle_types, args.electrified_stations) + schedule = Schedule.from_csv(args.input_schedule, vehicle_types, args.electrified_stations, **vars(args)) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) schedule.calculate_consumption() # set charging type for all rotations without explicitly specified charging type - for rot_id, rot in schedule.rotations.items(): + for rot in schedule.rotations.values(): if rot.charging_type is None: - schedule.set_charging_type(preferred_ct=args.preferred_charging_type, - args=args, - rotation_ids=[rot_id]) + rot.set_charging_type(ct=args.preferred_charging_type) # run the mode specified in config if args.mode == 'service_optimization': From 85bcd41384d091ec868b2eeb211f14770b97d194 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 31 Aug 2022 17:08:12 +0200 Subject: [PATCH 179/802] add set charging type function for entire schedule --- ebus_toolbox/schedule.py | 16 ++++++++++++++++ ebus_toolbox/simulate.py | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 9a3b0a91..67c2c418 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -19,6 +19,7 @@ def __init__(self, vehicle_types, stations_file, **kwargs): :param stations_file: json of electrified stations :type stations_file: string :param kwargs: Command line arguments + :type kwargs: dict """ # Check if all bus types have both an opp and depot version # Also make sure that both versions have the same mileage @@ -110,6 +111,21 @@ def run(self, args): return scenario + def set_charging_type(self, ct, rotation_ids=None): + """ Change charging type of either all or specified rotations. Adjust minimum standing time + at depot after completion of rotation. + :param ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. + :type ct: str + :param rotation_ids: IDs of rotations for which to set charging type. If None set charging + charging type for all rotations. + :type rotation_ids: list + """ + assert ct in ["oppb", "depb"], f"Invalid charging type: {ct}" + + for id, rot in self.rotations.items(): + if rotation_ids is None or id in rotation_ids: + rot.set_charging_type(ct) + def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. For every rotation it is checked whether vehicles with matching type are idle, in which diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 74626ea6..f4329438 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -33,7 +33,10 @@ def simulate(args): pass setattr(args, opt_key, opt_val) - schedule = Schedule.from_csv(args.input_schedule, vehicle_types, args.electrified_stations, **vars(args)) + schedule = Schedule.from_csv(args.input_schedule, + vehicle_types, + args.electrified_stations, + **vars(args)) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) schedule.calculate_consumption() From b7f85258de8bb510acb4ca7de0adbdbd034a1bda Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 1 Sep 2022 16:51:43 +0200 Subject: [PATCH 180/802] cost function: rename several parameters and how vehicle types are accessed --- data/examples/cost_params.json | 61 +++++++++----- data/examples/electrified_stations.json | 32 +++---- ebus_toolbox/costs.py | 106 ++++++++++++++---------- 3 files changed, 112 insertions(+), 87 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index a2c13649..f0e1c979 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -1,32 +1,49 @@ { - "bus": { - "solo_bus": 420000, - "articulated_bus": 600000, - "battery_kwh": 250, - "lifespan_bus": 14, - "lifespan_battery": 7 + "vehicles": { + "SB": { + "capex": 420000, + "c_maint_per_km": 0.24, + "lifetime": 14 + }, + "AB": { + "capex": 600000, + "c_maint_per_km": 0.3, + "lifetime": 14 + }, + "CKB": { + "capex": 600000, + "c_maint_per_km": 0.3, + "lifetime": 14 + } + }, + "batteries": { + "lifetime_battery": 7, + "cost_per_kWh": 250 }, "gc": { "building_cost_subsidy_per_kW": 158.3, - "fix": 62500, - "variable": 562.5, - "transformer": 80000, - "lifespan_gc": 20 + "capex_gc_fix": 62500, + "capex_gc_per_meter": 562.5, + "default_distance": 50, + "lifetime_gc": 50, + "capex_transformer_fix": 80000, + "capex_transformer_per_kW": 0, + "c_maint_transformer_per_year": 0.02, + "lifetime_transformer": 20 }, - "cs": { - "depot_cs_per_kW": 877.5, - "opportunity_cs_per_kW": 1000, - "lifespan_cs": 20 + "cs":{ + "capex_opps_per_kW": 877.5, + "capex_deps_per_kW": 1000, + "lifetime_cs": 20, + "c_maint_cs_per_year": 0.02 }, "garage": { "n_charging_stations": 1, "power_cs": 50, - "busses_per_positions": 10, - "cost_per_position": 200000 - }, - "maintenance": { - "solo_bus_per_km": 0.24, - "articulated_bus_per_km": 0.30, - "percentage_of_cs_infra": 0.02 + "vehicles_per_workstation": 20, + "cost_per_workstation": 245000, + "lifetime_workstations": 20 } -} \ No newline at end of file +} + + \ No newline at end of file diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 84e73c19..73151ed1 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -2,56 +2,46 @@ "Station-0": { "type": "deps", "n_charging_stations": "None", - "distance_transformer": 0 + "distance_transformer": 150 }, "Station-3": { "type": "opps", - "n_charging_stations": 3, - "distance_transformer": 50 + "n_charging_stations": 3 }, "Station-10": { "type": "opps", - "n_charging_stations": 1, - "distance_transformer": 50 + "n_charging_stations": 1 }, "Station-21": { "type": "opps", - "n_charging_stations": 2, - "distance_transformer": 50 + "n_charging_stations": 2 }, "Station-22": { "type": "deps", - "n_charging_stations": "None", - "distance_transformer": 0 + "n_charging_stations": "None" }, "Station-26": { "type": "opps", - "n_charging_stations": 5, - "distance_transformer": 50 + "n_charging_stations": 5 }, "Station-28": { "type": "opps", - "n_charging_stations": 4, - "distance_transformer": 50 + "n_charging_stations": 4 }, "Station-30": { "type": "opps", - "n_charging_stations": 4, - "distance_transformer": 50 + "n_charging_stations": 4 }, "Station-32": { "type": "opps", - "n_charging_stations": 3, - "distance_transformer": 50 + "n_charging_stations": 3 }, "Station-39": { "type": "opps", - "n_charging_stations": 5, - "distance_transformer": 50 + "n_charging_stations": 5 }, "Station-42": { "type": "deps", - "n_charging_stations": "None", - "distance_transformer": 0 + "n_charging_stations": "None" } } \ No newline at end of file diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 1a1980b7..ed71459f 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -19,75 +19,93 @@ def calculate_costs(args, schedule): el_stations = json.load(json_file) # VEHICLES - c_busses = 0 + c_vehicles = 0 + c_vehicles_annual = 0 v_types = schedule.scenario["constants"]["vehicle_types"] for v_type, v_keys in v_types.items(): if schedule.vehicle_type_counts[v_type] > 0: - if "solo" in v_keys["name"]: - costs_bus = c_params["bus"]["solo_bus"] - elif "articulated" in v_keys["name"]: - costs_bus = c_params["bus"]["articulated_bus"] + try: + costs_vehicle = c_params["vehicles"][v_type.split("_")[0]]["capex"] + # future solution -> costs_vehicle= c_params["vehicles"][v_type]["capex"] + except KeyError: + print("Warning: No capex defined for vehicle type " + v_type.split("_")[0] + + ". Unable to calculate investment costs for this vehicle type.") else: - costs_bus = c_params["bus"]["battery_kwh"] = 0 - print("Warning: Name of vehicle_type doesn't include 'solo' or 'articulated. " - "Unable to calculate investment and maintenance costs for busses.'") - # sum up cost of busses and its batteries, depending on how often the battery has to be - # replaced in the lifespan of the busses - c_busses += (schedule.vehicle_type_counts[v_type] * - (costs_bus - (-c_params["bus"]["lifespan_bus"] - // c_params["bus"]["lifespan_battery"]) * - v_keys["capacity"] * c_params["bus"]["battery_kwh"])) - # calculate annual cost of busses, depending on its lifespan - c_busses_annual = round(c_busses / c_params["bus"]["lifespan_bus"], ROUND_TO_PLACES) + # sum up cost of vehicles and their batteries, depending on how often the battery + # has to be replaced in the lifetime of the vehicles + c_vehicles_vt = schedule.vehicle_type_counts[v_type] * \ + (costs_vehicle - (-c_params["vehicles"][v_type.split("_")[0]]["lifetime"] + // c_params["batteries"]["lifetime_battery"]) * + v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) + c_vehicles += c_vehicles_vt + # calculate annual cost of vehicles of this type, depending on their lifetime + c_vehicles_annual +=round(c_vehicles_vt/ + c_params["vehicles"][v_type.split("_")[0]]["lifetime"], + ROUND_TO_PLACES) + # GRID CONNECTION POINTS c_gcs = 0 + c_gcs_annual = 0 gcs = schedule.scenario["constants"]["grid_connectors"] for gcID, gc_keys in gcs.items(): - c_gcs += c_params["gc"]["building_cost_subsidy_per_kW"] * gc_keys["max_power"] + \ - c_params["gc"]["transformer"] + c_params["gc"]["fix"] + \ - c_params["gc"]["variable"] * el_stations[gcID]["distance_transformer"] - # calculate annual cost of grid connectors, depending on its lifespan - c_gcs_annual = round(c_gcs / c_params["gc"]["lifespan_gc"], ROUND_TO_PLACES) + try: + distance_transformer = el_stations[gcID]["distance_transformer"] + except KeyError: + distance_transformer = c_params["gc"]["default_distance"] + c_gc = c_params["gc"]["building_cost_subsidy_per_kW"] * gc_keys["max_power"] + \ + c_params["gc"]["capex_gc_fix"] + \ + c_params["gc"]["capex_gc_per_meter"] * distance_transformer + c_transformer = c_params["gc"]["capex_transformer_fix"] + \ + c_params["gc"]["capex_transformer_per_kW"] * gc_keys["max_power"] + c_gcs += c_gc + c_transformer + + # calculate annual costs of grid connectors, depending the lifetime of gc and transformator + c_gcs_annual += round(c_gc / c_params["gc"]["lifetime_gc"] + + c_transformer / c_params["gc"]["lifetime_transformer"], + ROUND_TO_PLACES) # CHARGING INFRASTRUCTURE c_cs = 0 cs = schedule.scenario["constants"]["charging_stations"] for csID in cs.values(): if csID["type"] == "deps": - c_cs += c_params["cs"]["depot_cs_per_kW"] * csID["max_power"] + c_cs += c_params["cs"]["capex_deps_per_kW"] * csID["max_power"] elif csID["type"] == "opps": - c_cs += c_params["cs"]["opportunity_cs_per_kW"] * csID["max_power"] - # calculate annual cost of charging stations, depending on its lifespan - c_cs_annual = round(c_cs / c_params["cs"]["lifespan_cs"], ROUND_TO_PLACES) + c_cs += c_params["cs"]["capex_opps_per_kW"] * csID["max_power"] + # calculate annual cost of charging stations, depending on their lifetime + c_cs_annual = round(c_cs / c_params["cs"]["lifetime_cs"], ROUND_TO_PLACES) # GARAGE c_garage_cs = (c_params["garage"]["n_charging_stations"] * c_params["garage"]["power_cs"] * - c_params["cs"]["depot_cs_per_kW"]) - c_garage_positions = -(-sum(schedule.vehicle_type_counts.values()) // - c_params["garage"]["busses_per_positions"] * - c_params["garage"]["cost_per_position"]) - c_garage = c_garage_cs + c_garage_positions - # ToDo: annual costs of garage? - + c_params["cs"]["capex_deps_per_kW"]) + c_garage_workstations = -(-sum(schedule.vehicle_type_counts.values()) // + c_params["garage"]["vehicles_per_workstation"] * + c_params["garage"]["cost_per_workstation"]) + c_garage = c_garage_cs + c_garage_workstations + c_garage_annual = round(c_garage_cs / c_params["cs"]["lifetime_cs"] + + c_garage_workstations / c_params["garage"]["lifetime_workstations"] + , ROUND_TO_PLACES) # MAINTENANCE - m_infra = c_cs * c_params["maintenance"]["percentage_of_cs_infra"] - m_bus = 0 + m_infra = c_cs * c_params["cs"]["c_maint_cs_per_year"] + \ + c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + m_vehicles = 0 # calculate (ceil) number of days in scenario drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * schedule.scenario["scenario"]["interval"]) // (24 * 60)) for rot in schedule.rotations.values(): - vt_ct = f"{rot.vehicle_type}_{rot.charging_type}" - if "solo" in v_types[vt_ct]["name"]: - m_bus += (rot.distance / 1000 / drive_days * 365) * \ - c_params["maintenance"]["solo_bus_per_km"] - elif "articulated" in v_types[vt_ct]["name"]: - m_bus += (rot.distance / 1000 / drive_days * 365) * \ - c_params["maintenance"]["articulated_bus_per_km"] - c_maintenance_annual = round(m_infra + m_bus, ROUND_TO_PLACES) + try: + m_vehicles += (rot.distance / 1000 / drive_days * 365) * \ + c_params["vehicles"][rot.vehicle_type]["c_maint_per_km"] + except KeyError: + print("Warning: No maintanance costs defined for vehicle type " + + c_params["vehicles"][rot.vehicle_type] + + ". Unable to calculate maintanance costs for this vehicle type.") - c_invest = c_busses + c_cs + c_gcs + c_garage - c_invest_annual = c_busses_annual + c_cs_annual + c_gcs_annual + c_maintenance_annual = round(m_infra + m_vehicles, ROUND_TO_PLACES) + c_invest = c_vehicles + c_cs + c_gcs + c_garage + c_invest_annual = round(c_vehicles_annual + c_cs_annual + c_gcs_annual + c_garage_annual, + ROUND_TO_PLACES) return {"c_invest": c_invest, "c_invest_annual": c_invest_annual, "c_maintenance_annual": c_maintenance_annual} From c7ddd99b907994976a08aa337ea5b9c8dc1d0a91 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 1 Sep 2022 16:58:54 +0200 Subject: [PATCH 181/802] flake8 --- ebus_toolbox/costs.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index ed71459f..c547d374 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -34,16 +34,16 @@ def calculate_costs(args, schedule): # sum up cost of vehicles and their batteries, depending on how often the battery # has to be replaced in the lifetime of the vehicles c_vehicles_vt = schedule.vehicle_type_counts[v_type] * \ - (costs_vehicle - (-c_params["vehicles"][v_type.split("_")[0]]["lifetime"] - // c_params["batteries"]["lifetime_battery"]) * - v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) + (costs_vehicle - + (-c_params["vehicles"][v_type.split("_")[0]]["lifetime"] + // c_params["batteries"]["lifetime_battery"]) * + v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) c_vehicles += c_vehicles_vt # calculate annual cost of vehicles of this type, depending on their lifetime - c_vehicles_annual +=round(c_vehicles_vt/ - c_params["vehicles"][v_type.split("_")[0]]["lifetime"], + c_vehicles_annual += round(c_vehicles_vt / + c_params["vehicles"][v_type.split("_")[0]]["lifetime"], ROUND_TO_PLACES) - # GRID CONNECTION POINTS c_gcs = 0 c_gcs_annual = 0 @@ -62,8 +62,8 @@ def calculate_costs(args, schedule): # calculate annual costs of grid connectors, depending the lifetime of gc and transformator c_gcs_annual += round(c_gc / c_params["gc"]["lifetime_gc"] + - c_transformer / c_params["gc"]["lifetime_transformer"], - ROUND_TO_PLACES) + c_transformer / c_params["gc"]["lifetime_transformer"], + ROUND_TO_PLACES) # CHARGING INFRASTRUCTURE c_cs = 0 @@ -84,8 +84,8 @@ def calculate_costs(args, schedule): c_params["garage"]["cost_per_workstation"]) c_garage = c_garage_cs + c_garage_workstations c_garage_annual = round(c_garage_cs / c_params["cs"]["lifetime_cs"] - + c_garage_workstations / c_params["garage"]["lifetime_workstations"] - , ROUND_TO_PLACES) + + c_garage_workstations / c_params["garage"]["lifetime_workstations"], + ROUND_TO_PLACES) # MAINTENANCE m_infra = c_cs * c_params["cs"]["c_maint_cs_per_year"] + \ c_transformer * c_params["gc"]["c_maint_transformer_per_year"] From 68d46f3c70e77a55daed4c7262062a0a21b9da31 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 1 Sep 2022 17:04:03 +0200 Subject: [PATCH 182/802] make flake8 happy --- ebus_toolbox/costs.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index c547d374..597ee316 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -53,11 +53,11 @@ def calculate_costs(args, schedule): distance_transformer = el_stations[gcID]["distance_transformer"] except KeyError: distance_transformer = c_params["gc"]["default_distance"] - c_gc = c_params["gc"]["building_cost_subsidy_per_kW"] * gc_keys["max_power"] + \ - c_params["gc"]["capex_gc_fix"] + \ - c_params["gc"]["capex_gc_per_meter"] * distance_transformer - c_transformer = c_params["gc"]["capex_transformer_fix"] + \ - c_params["gc"]["capex_transformer_per_kW"] * gc_keys["max_power"] + c_gc = (c_params["gc"]["building_cost_subsidy_per_kW"] * gc_keys["max_power"] + + c_params["gc"]["capex_gc_fix"] + + c_params["gc"]["capex_gc_per_meter"] * distance_transformer) + c_transformer = (c_params["gc"]["capex_transformer_fix"] + + c_params["gc"]["capex_transformer_per_kW"] * gc_keys["max_power"]) c_gcs += c_gc + c_transformer # calculate annual costs of grid connectors, depending the lifetime of gc and transformator @@ -87,8 +87,8 @@ def calculate_costs(args, schedule): + c_garage_workstations / c_params["garage"]["lifetime_workstations"], ROUND_TO_PLACES) # MAINTENANCE - m_infra = c_cs * c_params["cs"]["c_maint_cs_per_year"] + \ - c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + m_infra = (c_cs * c_params["cs"]["c_maint_cs_per_year"] + + c_transformer * c_params["gc"]["c_maint_transformer_per_year"]) m_vehicles = 0 # calculate (ceil) number of days in scenario drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * From a34152ee7f93ed6c4bae6409a319bf160c9c4d19 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 5 Sep 2022 09:35:34 +0200 Subject: [PATCH 183/802] correct description in config --- data/configs/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 9c40acaf..c3c7854a 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -14,7 +14,7 @@ electrified_stations = "data/examples/electrified_stations.json" # vehicle types (defaults to: ./data/examples/vehicle_types.json) vehicle_types = "./data/examples/vehicle_types.json" -# cost parameters (defaults to: ./data/examples/vehicle_types.json) +# cost parameters (defaults to: ./data/examples/cost_params.json) cost_params = "./data/examples/cost_params.json" From 27929e71e29e77efeb45dff44dfaa46e64228704 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 5 Sep 2022 16:17:05 +0200 Subject: [PATCH 184/802] adjust indentation characters --- data/examples/cost_params.json | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index f0e1c979..6e5e0407 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -1,24 +1,24 @@ { - "vehicles": { - "SB": { - "capex": 420000, - "c_maint_per_km": 0.24, - "lifetime": 14 - }, + "vehicles": { + "SB": { + "capex": 420000, + "c_maint_per_km": 0.24, + "lifetime": 14 + }, "AB": { - "capex": 600000, - "c_maint_per_km": 0.3, - "lifetime": 14 + "capex": 600000, + "c_maint_per_km": 0.3, + "lifetime": 14 }, "CKB": { - "capex": 600000, - "c_maint_per_km": 0.3, - "lifetime": 14 + "capex": 600000, + "c_maint_per_km": 0.3, + "lifetime": 14 } }, "batteries": { - "lifetime_battery": 7, - "cost_per_kWh": 250 + "lifetime_battery": 7, + "cost_per_kWh": 250 }, "gc": { "building_cost_subsidy_per_kW": 158.3, @@ -44,6 +44,4 @@ "cost_per_workstation": 245000, "lifetime_workstations": 20 } -} - - \ No newline at end of file +} \ No newline at end of file From 11f2690b00de029a78658847e3d649622c8ec0d9 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 5 Sep 2022 16:18:25 +0200 Subject: [PATCH 185/802] reformat indentation --- data/examples/cost_params.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 6e5e0407..0a2757a6 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -4,7 +4,7 @@ "capex": 420000, "c_maint_per_km": 0.24, "lifetime": 14 - }, + }, "AB": { "capex": 600000, "c_maint_per_km": 0.3, From 6f6358ecae276f511c1bfb58817143cc0453f503 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 6 Sep 2022 14:45:23 +0200 Subject: [PATCH 186/802] move consumption calculation to set_charging_type --- ebus_toolbox/rotation.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index e2bfef3b..d2ef9dfd 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -92,21 +92,39 @@ def set_charging_type(self, ct): :param ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. :type ct: str """ + if ct == self.charging_type: + return + assert ct in ["oppb", "depb"], f"Invalid charging type: {ct}" + old_consumption = self.consumption + capacity_depb = self.schedule.vehicle_types[f"{self.vehicle_type}_depb"]["capacity"] - if ct == "oppb" or capacity_depb < self.consumption: - self.charging_type = "oppb" - capacity_oppb = self.schedule.vehicle_types[f"{self.vehicle_type}_oppb"]["capacity"] - min_standing_time = ((capacity_oppb / self.schedule.cs_power_deps_oppb) - * self.schedule.min_recharge_deps_oppb) - else: + # if we want to set charging type to depb assume capacity suffices + # and set all parameters accordingly + if ct == "depb": self.charging_type = "depb" + self.consumption = self.calculate_consumption() + # time to recharge to SOC to level at departure min_standing_time = (self.consumption / self.schedule.cs_power_deps_depb) + # time to charge battery from 0 to desired SOC desired_max_standing_time = ((capacity_depb / self.schedule.cs_power_deps_depb) * self.schedule.min_recharge_deps_depb) if min_standing_time > desired_max_standing_time: min_standing_time = desired_max_standing_time + # if we want oppb set all parameters accordingly + # also set everything to oppb in case the solution in if clause above + # did not produce a valid result + if ct == "oppb" or capacity_depb < self.consumption: + self.charging_type = "oppb" + self.consumption = self.calculate_consumption() + capacity_oppb = self.schedule.vehicle_types[f"{self.vehicle_type}_oppb"]["capacity"] + min_standing_time = ((capacity_oppb / self.schedule.cs_power_deps_oppb) + * self.schedule.min_recharge_deps_oppb) + self.earliest_departure_next_rot = \ self.arrival_time + datetime.timedelta(hours=min_standing_time) + + # recalculate consumption + self.schedule.consumption += self.consumption - old_consumption From 156e12e93fbdd56840bf8108eb5f595b5100c614 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 6 Sep 2022 16:37:36 +0200 Subject: [PATCH 187/802] mileage can be float or int --- ebus_toolbox/consumption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 8f977cb9..ac190e89 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -40,7 +40,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): vt_ct = f"{vehicle_type}_{charging_type}" # in case a constant mileage is provided - if isinstance(self.vehicle_types[vt_ct]['mileage'], float): + if isinstance(self.vehicle_types[vt_ct]['mileage'], (int, float)): return self.vehicle_types[vt_ct]['mileage'] * distance / 1000 temp = np.interp(time.hour, From b59417f7db1ddb102c981595905fba4f79022ae8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Tue, 6 Sep 2022 16:38:16 +0200 Subject: [PATCH 188/802] set charging type tests --- tests/mocks.py | 22 +++++++++++++ .../electrified_stations.json | 6 ++++ tests/test_input_files/trips.csv | 6 ++++ tests/test_input_files/vehicle_types.json | 20 ++++++++++++ tests/test_rotation.py | 31 +++++++++++++++++++ tests/test_schedule.py | 9 ++---- 6 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 tests/mocks.py create mode 100644 tests/test_input_files/electrified_stations.json create mode 100644 tests/test_input_files/trips.csv create mode 100644 tests/test_input_files/vehicle_types.json create mode 100644 tests/test_rotation.py diff --git a/tests/mocks.py b/tests/mocks.py new file mode 100644 index 00000000..bfdf9adc --- /dev/null +++ b/tests/mocks.py @@ -0,0 +1,22 @@ +import json +from ebus_toolbox import schedule, trip, consumption + + +def mockSchedule(): + schedule_path = 'tests/test_input_files/trips.csv' + station_path = 'tests/test_input_files/electrified_stations.json' + with open("tests/test_input_files/vehicle_types.json", 'r') as f: + vehicle_types = json.load(f) + trip.Trip.consumption = consumption.Consumption(vehicle_types) + + mandatory_args = { + "min_recharge_deps_oppb": 0, + "min_recharge_deps_depb": 0, + "gc_power_opps": 1000, + "gc_power_deps": 1000, + "cs_power_opps": 100, + "cs_power_deps_depb": 50, + "cs_power_deps_oppb": 150 + } + + return schedule.Schedule.from_csv(schedule_path, vehicle_types, station_path, **mandatory_args) diff --git a/tests/test_input_files/electrified_stations.json b/tests/test_input_files/electrified_stations.json new file mode 100644 index 00000000..11e21383 --- /dev/null +++ b/tests/test_input_files/electrified_stations.json @@ -0,0 +1,6 @@ +{ + "Station-0": { + "type": "deps", + "n_charging_stations": null + } +} \ No newline at end of file diff --git a/tests/test_input_files/trips.csv b/tests/test_input_files/trips.csv new file mode 100644 index 00000000..c22bf992 --- /dev/null +++ b/tests/test_input_files/trips.csv @@ -0,0 +1,6 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB +LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_input_files/vehicle_types.json b/tests/test_input_files/vehicle_types.json new file mode 100644 index 00000000..6b017a1f --- /dev/null +++ b/tests/test_input_files/vehicle_types.json @@ -0,0 +1,20 @@ +{ + "CKB_oppb": { + "name": "articulated bus - opportunity charging", + "capacity": 50, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5, + "mileage": 10 + }, + "CKB_depb": { + "name": "articulated bus - depot charging", + "capacity": 150, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5, + "mileage": 15 + } +} diff --git a/tests/test_rotation.py b/tests/test_rotation.py new file mode 100644 index 00000000..9a2be1af --- /dev/null +++ b/tests/test_rotation.py @@ -0,0 +1,31 @@ +""" +run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` +pytest will look for all files starting with "test_" and run all functions +within this file. For basic example of tests you can look at our workshop +https://github.com/rl-institut/workshop/tree/master/test-driven-development. +Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html +are also good support. +""" +from tests.mocks import mockSchedule + + +def test_set_charging_type(): + s = mockSchedule() + rot = list(s.rotations.values())[0] + + # set charging type to oppb + rot.set_charging_type('oppb') + assert rot.charging_type == 'oppb' + assert rot.consumption == 420 + + # try setting charging type to depb + # not possible since capacity < consumption + rot.set_charging_type('depb') + assert rot.charging_type == 'oppb' + assert rot.consumption == 420 + + # increase capacity of depb and try again + s.vehicle_types["CKB_depb"]["capacity"] = 700 + rot.set_charging_type("depb") + assert rot.charging_type == 'depb' + assert rot.consumption == 630 diff --git a/tests/test_schedule.py b/tests/test_schedule.py index b0271b1b..ace8b19f 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -6,12 +6,9 @@ Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html are also good support. """ -from ebus_toolbox import schedule -import json +from tests.mocks import mockSchedule def test_schedule_from_csv(): - with open('./data/examples/vehicle_types.json') as f: - vehicle_types = json.load(f) - empty_schedule = schedule.Schedule(vehicle_types, './data/examples/vehicle_types.json') - assert empty_schedule.rotations == {} + schedule = mockSchedule() + assert len(schedule.rotations) == 1 From 8d6c4c3a8ac053e242b96029577441df74af99d1 Mon Sep 17 00:00:00 2001 From: PaulB Date: Tue, 6 Sep 2022 16:51:22 +0200 Subject: [PATCH 189/802] test for python 3.7 instead of 3.6 --- .github/workflows/test-python-app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-python-app.yml b/.github/workflows/test-python-app.yml index b7db6bfa..d9f0ce93 100644 --- a/.github/workflows/test-python-app.yml +++ b/.github/workflows/test-python-app.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.6', '3.8', '3.10'] + python-version: ['3.7', '3.8', '3.10'] steps: - uses: actions/checkout@v2 From f4211ee6051564a0a61e932a8475afe35a90743f Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Mon, 5 Sep 2022 13:27:06 +0200 Subject: [PATCH 190/802] implement suggested changes --- data/configs/ebus_toolbox.cfg | 6 +++--- ebus_toolbox/simulate.py | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 6e1f8c1e..c6b0d2f0 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -45,11 +45,11 @@ preferred_charging_type = "depb" # min charging time at opp station [minutes] (default: 2) min_charging_time_opps = 2 -# buffer time at opp station if no specific buffer time is provided +# buffer time at opp station if no specific buffer time is provided # via the electrified_stations.json [minutes] (default: 1) # Time specific buffer times can be set via a dict like: # {"10-22": 5, "else": 2} NOTE: else clause is a MUST! -# The buffer time is deducted off of the planned standing time. +# The buffer time is deducted off of the planned standing time. # It may resemble things like delays and/or docking procedures # default_buffer_time_opps = 1 @@ -129,4 +129,4 @@ visual = false # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. # margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. -margin = 10.0 +margin = 1.0 diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f4329438..f3d99f68 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -64,7 +64,5 @@ def simulate(args): scenario.run('distributed', vars(args).copy()) print("Spice EV simulation complete.") - print(f"Rotations {schedule.get_negative_rotations(scenario)} have negative SoC.") - # create report report.generate(schedule, scenario, args) From f1f6362ac7b90637163a501785fab0a2fdc2cf0a Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 6 Sep 2022 14:32:05 +0200 Subject: [PATCH 191/802] alter condition in get_common_stations --- ebus_toolbox/schedule.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 67c2c418..6b121152 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -234,10 +234,8 @@ def get_common_stations(self, only_opps=True): rotations[rot_key] = {} for t in rotation.trips: arr_station = self.stations.get(t.arrival_name) - if ( - arr_station is None and not only_opps or - arr_station is not None and arr_station["type"] == "opps" - ): + if not only_opps or arr_station is not None and arr_station["type"] == "opps": + # dependent station: add to rotation with arrival time if t.arrival_name in rotations[rot_key]: rotations[rot_key][t.arrival_name].append([t.arrival_time, None]) else: From 48c25dde305147de0c89905d79664f681470b1a0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 7 Sep 2022 09:26:24 +0200 Subject: [PATCH 192/802] adding changes lost in merge process --- ebus_toolbox/optimization.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 035375c4..4e18e52b 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -24,19 +24,20 @@ def service_optimization(schedule, args): # todo: actually this case should not happen, but it still does happen.. why? else: # oppb: build non-interfering sets of negative rotations + # (these include the dependent non-negative rotations) s = {rot_key} vid = rotation.vehicle_id last_neg_soc_time = scenario.negative_soc_tracker[vid][-1] last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) - dep_stations = {r: t for r, t in common_stations[rot_key].items() - if t <= last_neg_soc_time} - while dep_stations: - r, t = dep_stations.popitem() + dependent_station = {r: t for r, t in common_stations[rot_key].items() + if t <= last_neg_soc_time} + while dependent_station: + r, t = dependent_station.popitem() if r not in negative_rotations: s.add(r) # add dependencies of r - dep_stations.update({r2: t2 for r2, t2 - in common_stations[r].items() if t2 <= t}) + dependent_station.update({r2: t2 for r2, t2 + in common_stations[r].items() if t2 <= t}) negative_sets[rot_key] = s # run singled-out rotations From a16dc1baaa0162f138bd31f3879167bb315c2791 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 7 Sep 2022 09:40:51 +0200 Subject: [PATCH 193/802] remove check for equal mileage of opp and dep --- ebus_toolbox/schedule.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 6b121152..e5d6cc9a 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -21,19 +21,6 @@ def __init__(self, vehicle_types, stations_file, **kwargs): :param kwargs: Command line arguments :type kwargs: dict """ - # Check if all bus types have both an opp and depot version - # Also make sure that both versions have the same mileage - # TODO: remove check for constant mileage completely - vehicle_type_names = list(vehicle_types.keys()) - for name in vehicle_type_names: - try: - base, ct = name.rsplit('_', 1) - except ValueError: - continue - if f"{base}_oppb" in vehicle_types and ct == 'dep': - assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_oppb"]["mileage"] - elif f"{base}_depb" in vehicle_types and ct == 'opp': - assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_depb"]["mileage"] self.vehicle_types = vehicle_types # load stations file From de029ac3043388baadae6b5f350d633af0735ed8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 7 Sep 2022 09:42:21 +0200 Subject: [PATCH 194/802] readability change --- ebus_toolbox/schedule.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e5d6cc9a..e5279936 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -21,8 +21,6 @@ def __init__(self, vehicle_types, stations_file, **kwargs): :param kwargs: Command line arguments :type kwargs: dict """ - self.vehicle_types = vehicle_types - # load stations file if stations_file is None: stations_file = "examples/electrified_stations.json" @@ -33,8 +31,9 @@ def __init__(self, vehicle_types, stations_file, **kwargs): self.stations = json.load(f) self.rotations = {} - self.original_rotations = None self.consumption = 0 + self.vehicle_types = vehicle_types + self.original_rotations = None # mandatory config parameters mandatory_options = [ From 45751f1174d97e0cd05d58f6040134b5de946d77 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 7 Sep 2022 10:26:25 +0200 Subject: [PATCH 195/802] allow vehicle types with one ct only --- ebus_toolbox/rotation.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index d2ef9dfd..d0d2d123 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -60,6 +60,9 @@ def add_trip(self, trip): any(trip['charging_type'] == t for t in ['depb', 'oppb'])): assert (self.charging_type is None or self.charging_type == trip['charging_type']),\ f"Two trips of rotation {self.id} have distinct charging types" + assert (f'{self.vehicle_type}_{trip["charging_type"]}' in self.schedule.vehicle_types),\ + f"The required vehicle type {self.vehicle_type}({trip['charging_type']}) is not " + "given in the vehicle_types.json file." self.set_charging_type(trip['charging_type']) self.trips.append(new_trip) @@ -92,10 +95,12 @@ def set_charging_type(self, ct): :param ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. :type ct: str """ + assert ct in ["oppb", "depb"], f"Invalid charging type: {ct}" + if ct == self.charging_type: return - - assert ct in ["oppb", "depb"], f"Invalid charging type: {ct}" + if f'{self.vehicle_type}_{ct}' not in self.schedule.vehicle_types: + return old_consumption = self.consumption From dbbe808b9f1e57c7c3cac97ebe2c597b8c913d8e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 7 Sep 2022 10:35:44 +0200 Subject: [PATCH 196/802] remove get_delta_soc functionality --- ebus_toolbox/consumption.py | 10 +++++----- ebus_toolbox/rotation.py | 7 ------- ebus_toolbox/schedule.py | 14 -------------- ebus_toolbox/simulate.py | 4 ---- ebus_toolbox/trip.py | 11 +---------- 5 files changed, 6 insertions(+), 40 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index ac190e89..3f96358d 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -41,7 +41,9 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): # in case a constant mileage is provided if isinstance(self.vehicle_types[vt_ct]['mileage'], (int, float)): - return self.vehicle_types[vt_ct]['mileage'] * distance / 1000 + consumed_energy = self.vehicle_types[vt_ct]['mileage'] * distance / 1000 + delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + return consumed_energy, delta_soc temp = np.interp(time.hour, list(self.temperatures_by_hour.keys()), @@ -66,8 +68,6 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): mileage = np.interp(temp, xp, fp) # kWh / m consumed_energy = mileage * distance / 1000 # kWh - return consumed_energy + delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) - def get_delta_soc(self, consumed_energy, vehicle_type, charging_type): - vt_ct = f"{vehicle_type}_{charging_type}" - return -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + return consumed_energy, delta_soc diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index d0d2d123..10df5d3a 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -81,13 +81,6 @@ def calculate_consumption(self): return rotation_consumption - def delta_soc_all_trips(self): - """ Compute change in state of charge (SOC) for every trip - of this rotation. Stored in the trip objects. - """ - for trip in self.trips: - trip.get_delta_soc() - def set_charging_type(self, ct): """ Change charging type of either all or specified rotations. Adjust minimum standing time at depot after completion of rotation. diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e5279936..d4d46f39 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -80,11 +80,6 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): return schedule def run(self, args): - # (re)calculate the change in SoC for every trip - # charging types may have changed which may impact battery capacity - # while mileage is assumed to stay constant - self.delta_soc_all_trips() - # each rotation is assigned a vehicle ID self.assign_vehicles() @@ -178,15 +173,6 @@ def calculate_consumption(self): return self.consumption - def delta_soc_all_trips(self): - """ Computes delta SOC for all trips of all rotations. - Depends on vehicle type and on charging type, since - busses of the same vehicle type may have different - battery sizes for different charging types.""" - - for rot in self.rotations.values(): - rot.delta_soc_all_trips() - def get_departure_of_first_trip(self): """ Finds earliest departure time among all rotations. diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f3d99f68..d9809c84 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -51,10 +51,6 @@ def simulate(args): elif args.mode == "sim": # DEFAULT if mode argument is not specified by user - # calculate the change in SoC for every trip - # charging types may have changed which may impact battery capacity - # while mileage is assumed to stay constant - schedule.delta_soc_all_trips() # each rotation is assigned a vehicle ID schedule.assign_vehicles() scenario = schedule.generate_scenario(args) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 9ad4f498..e8475880 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -29,7 +29,7 @@ def calculate_consumption(self): :rtype: float """ try: - self.consumption = \ + self.consumption, self. delta_soc = \ Trip.consumption.calculate_consumption(self.arrival_time, self.distance, self.rotation.vehicle_type, @@ -39,12 +39,3 @@ def calculate_consumption(self): and linked to Trip class.""") return self.consumption - - def get_delta_soc(self): - """ Compute change in state of charge (SOC) for this trip.""" - if self.consumption is None: - self.calculate_consumption() - - self.delta_soc = Trip.consumption.get_delta_soc(self.consumption, - self.rotation.vehicle_type, - self.rotation.charging_type) From 14d9b51be7b8bbd4ca8fb22fcfe34769644b67f1 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 7 Sep 2022 13:40:26 +0200 Subject: [PATCH 197/802] rm calculate_consumption from setup process --- ebus_toolbox/simulate.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index d9809c84..becc4691 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -39,7 +39,6 @@ def simulate(args): **vars(args)) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) - schedule.calculate_consumption() # set charging type for all rotations without explicitly specified charging type for rot in schedule.rotations.values(): if rot.charging_type is None: From 00bf57778a0f78e7fe8f75f6d73e8b398a1ac0f7 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 7 Sep 2022 17:10:15 +0200 Subject: [PATCH 198/802] always allow ct=depb regardless of bat capacity --- ebus_toolbox/rotation.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 10df5d3a..33e003e1 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -92,17 +92,18 @@ def set_charging_type(self, ct): if ct == self.charging_type: return - if f'{self.vehicle_type}_{ct}' not in self.schedule.vehicle_types: - return + assert f'{self.vehicle_type}_{ct}' in self.schedule.vehicle_types,\ + f"Combination of vehicle type {self.vehicle_type} and {ct} not defined." old_consumption = self.consumption + self.charging_type = ct + # consumption may have changed with new charging type + self.consumption = self.calculate_consumption() - capacity_depb = self.schedule.vehicle_types[f"{self.vehicle_type}_depb"]["capacity"] - # if we want to set charging type to depb assume capacity suffices - # and set all parameters accordingly + # calculate earliest possible departure for this bus after completion + # of this rotation if ct == "depb": - self.charging_type = "depb" - self.consumption = self.calculate_consumption() + capacity_depb = self.schedule.vehicle_types[f"{self.vehicle_type}_depb"]["capacity"] # time to recharge to SOC to level at departure min_standing_time = (self.consumption / self.schedule.cs_power_deps_depb) # time to charge battery from 0 to desired SOC @@ -110,13 +111,7 @@ def set_charging_type(self, ct): * self.schedule.min_recharge_deps_depb) if min_standing_time > desired_max_standing_time: min_standing_time = desired_max_standing_time - - # if we want oppb set all parameters accordingly - # also set everything to oppb in case the solution in if clause above - # did not produce a valid result - if ct == "oppb" or capacity_depb < self.consumption: - self.charging_type = "oppb" - self.consumption = self.calculate_consumption() + elif ct == "oppb": capacity_oppb = self.schedule.vehicle_types[f"{self.vehicle_type}_oppb"]["capacity"] min_standing_time = ((capacity_oppb / self.schedule.cs_power_deps_oppb) * self.schedule.min_recharge_deps_oppb) From a9f5ecf2b62f42897e1caa578947c08288486ccc Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 11:17:07 +0200 Subject: [PATCH 199/802] PR review comments --- data/configs/ebus_toolbox.cfg | 2 +- ebus_toolbox/optimization.py | 11 +++++++++++ ebus_toolbox/rotation.py | 5 ++--- ebus_toolbox/schedule.py | 23 +++++++++++------------ ebus_toolbox/simulate.py | 11 ++--------- tests/{mocks.py => helpers.py} | 4 +++- tests/test_rotation.py | 13 +++---------- tests/test_schedule.py | 4 ++-- 8 files changed, 35 insertions(+), 38 deletions(-) rename tests/{mocks.py => helpers.py} (90%) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index c6b0d2f0..381bf24b 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -3,7 +3,7 @@ ##### INPUT/OUTPUT FILES AND PATHS ##### # Input file containing trip information (required) -input_schedule = "./data/examples/trips_example_short.csv" +input_schedule = "./data/examples/trips_example.csv" # output path for scenario.json -- called input since its input for spiceev #output_directory = "./data/sim_outputs/" diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 4e18e52b..94afabcb 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -6,6 +6,16 @@ def service_optimization(schedule, args): + """ Optimize rotations based on feasability. + Try to find sets of rotations that produce no negative SoC + + :param schedule: Schedule to be optimized + :type schedule: ebus_toolbox.Schedule + :param args: Command line arguments + :type args: argparse.Namespace + :return: Random scenario + :rtype: spice_ev.src.scenario + """ common_stations = schedule.get_common_stations(only_opps=True) # initial run @@ -77,4 +87,5 @@ def service_optimization(schedule, args): print(negative_sets) + # TODO: return sensible scenario (and negative_sets?), adapt docstring afterwards return scenario diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 33e003e1..df32a427 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -56,8 +56,7 @@ def add_trip(self, trip): self.arrival_name = new_trip.arrival_name # set charging type if given - if ('charging_type' in trip and - any(trip['charging_type'] == t for t in ['depb', 'oppb'])): + if ('charging_type' in trip and trip['charging_type'] in ['depb', 'oppb']): assert (self.charging_type is None or self.charging_type == trip['charging_type']),\ f"Two trips of rotation {self.id} have distinct charging types" assert (f'{self.vehicle_type}_{trip["charging_type"]}' in self.schedule.vehicle_types),\ @@ -104,7 +103,7 @@ def set_charging_type(self, ct): # of this rotation if ct == "depb": capacity_depb = self.schedule.vehicle_types[f"{self.vehicle_type}_depb"]["capacity"] - # time to recharge to SOC to level at departure + # minimum time needed to recharge consumed power from depot charger min_standing_time = (self.consumption / self.schedule.cs_power_deps_depb) # time to charge battery from 0 to desired SOC desired_max_standing_time = ((capacity_depb / self.schedule.cs_power_deps_depb) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index d4d46f39..e78ff049 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -18,6 +18,9 @@ def __init__(self, vehicle_types, stations_file, **kwargs): :type vehicle_types: dict :param stations_file: json of electrified stations :type stations_file: string + + :raises SystemExit: In case not all mandatory options are provided + :param kwargs: Command line arguments :type kwargs: dict """ @@ -45,9 +48,12 @@ def __init__(self, vehicle_types, stations_file, **kwargs): "cs_power_deps_depb", "cs_power_deps_oppb", ] - for opt in mandatory_options: - assert opt in kwargs, f"Missing config paramter: {opt}" - setattr(self, opt, kwargs.get(opt)) + missing = [opt for opt in mandatory_options if kwargs.get(opt) is None] + if missing: + raise SystemExit("The following arguments are required: {}".format(", ".join(missing))) + else: + for opt in mandatory_options: + setattr(self, opt, kwargs.get(opt)) @classmethod def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): @@ -276,15 +282,6 @@ def generate_scenario(self, args): random.seed(args.seed) - # load stations file - if args.electrified_stations is None: - args.electrified_stations = "examples/electrified_stations.json" - ext = args.electrified_stations.split('.')[-1] - if ext != "json": - print("File extension mismatch: electrified_stations file should be .json") - # with open(args.electrified_stations) as json_file: - # stations_dict = json.load(json_file) - interval = datetime.timedelta(minutes=args.interval) vehicles = {} @@ -648,6 +645,8 @@ def generate_rotations_overview(self, scenario, args): end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) if end_idx > len(vehicle_soc): # SpiceEV stopped before rotation was fully simulated + print(f"SpiceEV stopped before simulation of rotation {id} was completed. " + "Omit config parameter to simulate entire schedule.") continue rotation_soc_ts = vehicle_soc[start_idx:end_idx] diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index becc4691..76d3ad18 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -49,15 +49,8 @@ def simulate(args): scenario = optimization.service_optimization(schedule, args) elif args.mode == "sim": # DEFAULT if mode argument is not specified by user - - # each rotation is assigned a vehicle ID - schedule.assign_vehicles() - scenario = schedule.generate_scenario(args) - print("Running Spice EV...") - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - scenario.run('distributed', vars(args).copy()) - print("Spice EV simulation complete.") + # Scenario simulated once + scenario = schedule.run(args) # create report report.generate(schedule, scenario, args) diff --git a/tests/mocks.py b/tests/helpers.py similarity index 90% rename from tests/mocks.py rename to tests/helpers.py index bfdf9adc..45be5b35 100644 --- a/tests/mocks.py +++ b/tests/helpers.py @@ -1,8 +1,10 @@ +""" Reusable functions that support tests +""" import json from ebus_toolbox import schedule, trip, consumption -def mockSchedule(): +def generate_basic_schedule(): schedule_path = 'tests/test_input_files/trips.csv' station_path = 'tests/test_input_files/electrified_stations.json' with open("tests/test_input_files/vehicle_types.json", 'r') as f: diff --git a/tests/test_rotation.py b/tests/test_rotation.py index 9a2be1af..507c0685 100644 --- a/tests/test_rotation.py +++ b/tests/test_rotation.py @@ -6,11 +6,11 @@ Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html are also good support. """ -from tests.mocks import mockSchedule +from tests.helpers import generate_basic_schedule def test_set_charging_type(): - s = mockSchedule() + s = generate_basic_schedule() rot = list(s.rotations.values())[0] # set charging type to oppb @@ -18,14 +18,7 @@ def test_set_charging_type(): assert rot.charging_type == 'oppb' assert rot.consumption == 420 - # try setting charging type to depb - # not possible since capacity < consumption + # set charging type to depb rot.set_charging_type('depb') - assert rot.charging_type == 'oppb' - assert rot.consumption == 420 - - # increase capacity of depb and try again - s.vehicle_types["CKB_depb"]["capacity"] = 700 - rot.set_charging_type("depb") assert rot.charging_type == 'depb' assert rot.consumption == 630 diff --git a/tests/test_schedule.py b/tests/test_schedule.py index ace8b19f..f5b5e453 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -6,9 +6,9 @@ Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html are also good support. """ -from tests.mocks import mockSchedule +from tests.helpers import generate_basic_schedule def test_schedule_from_csv(): - schedule = mockSchedule() + schedule = generate_basic_schedule() assert len(schedule.rotations) == 1 From c7f7070e0e795f4c2dfcc7bda5854b6d0ff9daab Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 13:09:53 +0200 Subject: [PATCH 200/802] remove deprecated comment --- ebus_toolbox/optimization.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 94afabcb..257b71f5 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -31,7 +31,6 @@ def service_optimization(schedule, args): rotation = schedule.rotations[rot_key] if rotation.charging_type == "depb": schedule.set_charging_type("oppb", args, [rot_key]) - # todo: actually this case should not happen, but it still does happen.. why? else: # oppb: build non-interfering sets of negative rotations # (these include the dependent non-negative rotations) From cadfd0a7419a178af57888b8e9c7fafd7dd91932 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 13:46:23 +0200 Subject: [PATCH 201/802] add .env to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 11393235..03792e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ .vscode/ .DS_Store .python-version -* .pyc +*.pyc .idea/ +.env __pycache__ docs/_build From fd5f448dbd1ccfa7b18a6770b0940003dbf475b2 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 14:45:35 +0200 Subject: [PATCH 202/802] cost params are optional and default to None --- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/simulate.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 56faaad1..67b1fbdc 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -69,7 +69,7 @@ parser.add_argument('--vehicle_types', help='include vehicle_types json', default='examples/vehicle_types.json') parser.add_argument('--cost_params', help='include cost_params json', - default='examples/cost_params.json') + default=None) parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', default=2) parser.add_argument('--default_buffer_time_opps', help='time to subtract off of standing time ' diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e6c12d5b..9a5e728e 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -53,6 +53,7 @@ def simulate(args): # Scenario simulated once scenario = schedule.run(args) + if args.cost_params is not None: # Calculate Costs of Iteration costs = calculate_costs(args, schedule) opex_energy_annual = 0 # ToDo: Import annual energy costs from SpiceEV From 33e1a2493e24b8fd77b43a49f67159e2e1cbebb9 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 12 Sep 2022 15:41:11 +0200 Subject: [PATCH 203/802] Add dynamic multidimensional consumption from ld-model output --- .../default_level_of_loading_over_day.csv | 25 + data/examples/energy_consumption_example.csv | 2184 ++++++++++++++- .../energy_consumption_example_old.csv | 23 + ebus_toolbox/consumption.py | 89 +- ebus_toolbox/schedule.py | 4 +- s | 2339 +++++++++++++++++ 6 files changed, 4622 insertions(+), 42 deletions(-) create mode 100644 data/examples/default_level_of_loading_over_day.csv create mode 100644 data/examples/energy_consumption_example_old.csv create mode 100644 s diff --git a/data/examples/default_level_of_loading_over_day.csv b/data/examples/default_level_of_loading_over_day.csv new file mode 100644 index 00000000..00fd62d9 --- /dev/null +++ b/data/examples/default_level_of_loading_over_day.csv @@ -0,0 +1,25 @@ +hour,level_of_loading +0,0.5 +1,0.5 +2,0.5 +3,0.5 +4,0.5 +5,0.5 +6,0.5 +7,0.5 +8,0.5 +9,0.5 +10,0.5 +11,0.5 +12,0.5 +13,0.5 +14,0.5 +15,0.5 +16,0.5 +17,0.5 +18,0.5 +19,0.5 +20,0.5 +21,0.5 +22,0.5 +23,0.5 diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv index 0579860e..ff569e77 100644 --- a/data/examples/energy_consumption_example.csv +++ b/data/examples/energy_consumption_example.csv @@ -1,23 +1,2161 @@ -Temp.,Alle,Kat. A,Kat. B,Kat. C --8,2.07,2.2,2.04,1.71 --6,1.9,2.03,1.76,1.59 --4,1.81,1.89,1.75,1.58 --2,1.78,1.86,1.65,1.49 -0,1.65,1.73,1.6,1.44 -2,1.61,1.67,1.57,1.38 -4,1.54,1.6,1.48,1.31 -6,1.47,1.52,1.44,1.25 -8,1.4,1.45,1.38,1.19 -10,1.33,1.37,1.3,1.16 -12,1.29,1.32,1.27,1.1 -14,1.2,1.23,1.17,1.04 -16,1.09,1.13,1.06,0.96 -18,1.06,1.08,1.03,0.93 -20,1.04,1.07,1.00,0.92 -22,1.08,1.11,1.03,0.93 -24,1.16,1.19,1.12,0.96 -26,1.23,1.27,1.2,1.03 -28,1.31,1.34,1.25,1.06 -30,1.43,1.46,1.38,1.11 -32,1.44,1.47,1.42,1.17 -34,1.53,1.57,1.45,1.24 +vehicle_type,level_of_loading,incline,mean_speed_kmh,temp,consumption_kwh_per_km +0,0,-0.04,12.1,-15,2.967 +0,0,-0.04,12.1,-5,1.823 +0,0,-0.04,12.1,5,0.844 +0,0,-0.04,12.1,15,0.034 +0,0,-0.04,12.1,25,-0.181 +0,0,-0.04,12.1,35,0.314 +0,0,-0.04,18,-15,1.658 +0,0,-0.04,18,-5,0.939 +0,0,-0.04,18,5,0.317 +0,0,-0.04,18,15,-0.208 +0,0,-0.04,18,25,-0.353 +0,0,-0.04,18,35,-0.034 +0,0,-0.04,25.2,-15,0.724 +0,0,-0.04,25.2,-5,0.33 +0,0,-0.04,25.2,5,-0.026 +0,0,-0.04,25.2,15,-0.347 +0,0,-0.04,25.2,25,-0.445 +0,0,-0.04,25.2,35,-0.248 +0,0,-0.04,30,-15,0.476 +0,0,-0.04,30,-5,0.153 +0,0,-0.04,30,5,-0.141 +0,0,-0.04,30,15,-0.408 +0,0,-0.04,30,25,-0.492 +0,0,-0.04,30,35,-0.33 +0,0,-0.04,37.1,-15,0.281 +0,0,-0.04,37.1,-5,0.008 +0,0,-0.04,37.1,5,-0.241 +0,0,-0.04,37.1,15,-0.465 +0,0,-0.04,37.1,25,-0.536 +0,0,-0.04,37.1,35,-0.404 +0,0,-0.03,12.1,-15,3.297 +0,0,-0.03,12.1,-5,2.153 +0,0,-0.03,12.1,5,1.175 +0,0,-0.03,12.1,15,0.365 +0,0,-0.03,12.1,25,0.149 +0,0,-0.03,12.1,35,0.644 +0,0,-0.03,18,-15,1.996 +0,0,-0.03,18,-5,1.277 +0,0,-0.03,18,5,0.654 +0,0,-0.03,18,15,0.13 +0,0,-0.03,18,25,-0.015 +0,0,-0.03,18,35,0.304 +0,0,-0.03,25.2,-15,1.072 +0,0,-0.03,25.2,-5,0.678 +0,0,-0.03,25.2,5,0.321 +0,0,-0.03,25.2,15,0.001 +0,0,-0.03,25.2,25,-0.097 +0,0,-0.03,25.2,35,0.099 +0,0,-0.03,30,-15,0.812 +0,0,-0.03,30,-5,0.489 +0,0,-0.03,30,5,0.195 +0,0,-0.03,30,15,-0.072 +0,0,-0.03,30,25,-0.156 +0,0,-0.03,30,35,0.006 +0,0,-0.03,37.1,-15,0.606 +0,0,-0.03,37.1,-5,0.332 +0,0,-0.03,37.1,5,0.084 +0,0,-0.03,37.1,15,-0.14 +0,0,-0.03,37.1,25,-0.212 +0,0,-0.03,37.1,35,-0.08 +0,0,-0.02,12.1,-15,3.628 +0,0,-0.02,12.1,-5,2.484 +0,0,-0.02,12.1,5,1.505 +0,0,-0.02,12.1,15,0.695 +0,0,-0.02,12.1,25,0.48 +0,0,-0.02,12.1,35,0.974 +0,0,-0.02,18,-15,2.334 +0,0,-0.02,18,-5,1.615 +0,0,-0.02,18,5,0.992 +0,0,-0.02,18,15,0.467 +0,0,-0.02,18,25,0.322 +0,0,-0.02,18,35,0.642 +0,0,-0.02,25.2,-15,1.42 +0,0,-0.02,25.2,-5,1.026 +0,0,-0.02,25.2,5,0.669 +0,0,-0.02,25.2,15,0.349 +0,0,-0.02,25.2,25,0.251 +0,0,-0.02,25.2,35,0.447 +0,0,-0.02,30,-15,1.148 +0,0,-0.02,30,-5,0.826 +0,0,-0.02,30,5,0.531 +0,0,-0.02,30,15,0.264 +0,0,-0.02,30,25,0.18 +0,0,-0.02,30,35,0.342 +0,0,-0.02,37.1,-15,0.93 +0,0,-0.02,37.1,-5,0.657 +0,0,-0.02,37.1,5,0.408 +0,0,-0.02,37.1,15,0.184 +0,0,-0.02,37.1,25,0.113 +0,0,-0.02,37.1,35,0.245 +0,0,-0.01,12.1,-15,3.97 +0,0,-0.01,12.1,-5,2.826 +0,0,-0.01,12.1,5,1.847 +0,0,-0.01,12.1,15,1.036 +0,0,-0.01,12.1,25,0.82 +0,0,-0.01,12.1,35,1.315 +0,0,-0.01,18,-15,2.702 +0,0,-0.01,18,-5,1.982 +0,0,-0.01,18,5,1.358 +0,0,-0.01,18,15,0.833 +0,0,-0.01,18,25,0.687 +0,0,-0.01,18,35,1.005 +0,0,-0.01,25.2,-15,1.8 +0,0,-0.01,25.2,-5,1.406 +0,0,-0.01,25.2,5,1.048 +0,0,-0.01,25.2,15,0.726 +0,0,-0.01,25.2,25,0.627 +0,0,-0.01,25.2,35,0.823 +0,0,-0.01,30,-15,1.541 +0,0,-0.01,30,-5,1.217 +0,0,-0.01,30,5,0.92 +0,0,-0.01,30,15,0.651 +0,0,-0.01,30,25,0.566 +0,0,-0.01,30,35,0.726 +0,0,-0.01,37.1,-15,1.338 +0,0,-0.01,37.1,-5,1.062 +0,0,-0.01,37.1,5,0.81 +0,0,-0.01,37.1,15,0.583 +0,0,-0.01,37.1,25,0.51 +0,0,-0.01,37.1,35,0.639 +0,0,0,12.1,-15,4.356 +0,0,0,12.1,-5,3.211 +0,0,0,12.1,5,2.232 +0,0,0,12.1,15,1.422 +0,0,0,12.1,25,1.206 +0,0,0,12.1,35,1.7 +0,0,0,18,-15,3.099 +0,0,0,18,-5,2.379 +0,0,0,18,5,1.756 +0,0,0,18,15,1.23 +0,0,0,18,25,1.084 +0,0,0,18,35,1.402 +0,0,0,25.2,-15,2.201 +0,0,0,25.2,-5,1.806 +0,0,0,25.2,5,1.448 +0,0,0,25.2,15,1.127 +0,0,0,25.2,25,1.028 +0,0,0,25.2,35,1.223 +0,0,0,30,-15,1.953 +0,0,0,30,-5,1.628 +0,0,0,30,5,1.331 +0,0,0,30,15,1.062 +0,0,0,30,25,0.977 +0,0,0,30,35,1.137 +0,0,0,37.1,-15,1.76 +0,0,0,37.1,-5,1.484 +0,0,0,37.1,5,1.232 +0,0,0,37.1,15,1.006 +0,0,0,37.1,25,0.932 +0,0,0,37.1,35,1.062 +0,0,0.01,12.1,-15,4.742 +0,0,0.01,12.1,-5,3.597 +0,0,0.01,12.1,5,2.618 +0,0,0.01,12.1,15,1.808 +0,0,0.01,12.1,25,1.592 +0,0,0.01,12.1,35,2.087 +0,0,0.01,18,-15,3.497 +0,0,0.01,18,-5,2.777 +0,0,0.01,18,5,2.154 +0,0,0.01,18,15,1.628 +0,0,0.01,18,25,1.482 +0,0,0.01,18,35,1.8 +0,0,0.01,25.2,-15,2.602 +0,0,0.01,25.2,-5,2.207 +0,0,0.01,25.2,5,1.849 +0,0,0.01,25.2,15,1.528 +0,0,0.01,25.2,25,1.429 +0,0,0.01,25.2,35,1.624 +0,0,0.01,30,-15,2.364 +0,0,0.01,30,-5,2.039 +0,0,0.01,30,5,1.743 +0,0,0.01,30,15,1.474 +0,0,0.01,30,25,1.388 +0,0,0.01,30,35,1.548 +0,0,0.01,37.1,-15,2.183 +0,0,0.01,37.1,-5,1.907 +0,0,0.01,37.1,5,1.655 +0,0,0.01,37.1,15,1.428 +0,0,0.01,37.1,25,1.354 +0,0,0.01,37.1,35,1.484 +0,0,0.02,12.1,-15,5.128 +0,0,0.02,12.1,-5,3.983 +0,0,0.02,12.1,5,3.005 +0,0,0.02,12.1,15,2.194 +0,0,0.02,12.1,25,1.978 +0,0,0.02,12.1,35,2.473 +0,0,0.02,18,-15,3.895 +0,0,0.02,18,-5,3.175 +0,0,0.02,18,5,2.551 +0,0,0.02,18,15,2.026 +0,0,0.02,18,25,1.88 +0,0,0.02,18,35,2.198 +0,0,0.02,25.2,-15,3.003 +0,0,0.02,25.2,-5,2.608 +0,0,0.02,25.2,5,2.25 +0,0,0.02,25.2,15,1.928 +0,0,0.02,25.2,25,1.83 +0,0,0.02,25.2,35,2.025 +0,0,0.02,30,-15,2.775 +0,0,0.02,30,-5,2.451 +0,0,0.02,30,5,2.154 +0,0,0.02,30,15,1.885 +0,0,0.02,30,25,1.8 +0,0,0.02,30,35,1.96 +0,0,0.02,37.1,-15,2.606 +0,0,0.02,37.1,-5,2.329 +0,0,0.02,37.1,5,2.078 +0,0,0.02,37.1,15,1.851 +0,0,0.02,37.1,25,1.777 +0,0,0.02,37.1,35,1.907 +0,0,0.03,12.1,-15,5.514 +0,0,0.03,12.1,-5,4.37 +0,0,0.03,12.1,5,3.391 +0,0,0.03,12.1,15,2.58 +0,0,0.03,12.1,25,2.364 +0,0,0.03,12.1,35,2.859 +0,0,0.03,18,-15,4.293 +0,0,0.03,18,-5,3.573 +0,0,0.03,18,5,2.949 +0,0,0.03,18,15,2.424 +0,0,0.03,18,25,2.278 +0,0,0.03,18,35,2.596 +0,0,0.03,25.2,-15,3.405 +0,0,0.03,25.2,-5,3.01 +0,0,0.03,25.2,5,2.652 +0,0,0.03,25.2,15,2.33 +0,0,0.03,25.2,25,2.231 +0,0,0.03,25.2,35,2.427 +0,0,0.03,30,-15,3.187 +0,0,0.03,30,-5,2.862 +0,0,0.03,30,5,2.566 +0,0,0.03,30,15,2.297 +0,0,0.03,30,25,2.211 +0,0,0.03,30,35,2.371 +0,0,0.03,37.1,-15,3.028 +0,0,0.03,37.1,-5,2.752 +0,0,0.03,37.1,5,2.5 +0,0,0.03,37.1,15,2.274 +0,0,0.03,37.1,25,2.2 +0,0,0.03,37.1,35,2.329 +0,0,0.04,12.1,-15,5.9 +0,0,0.04,12.1,-5,4.756 +0,0,0.04,12.1,5,3.777 +0,0,0.04,12.1,15,2.966 +0,0,0.04,12.1,25,2.75 +0,0,0.04,12.1,35,3.245 +0,0,0.04,18,-15,4.691 +0,0,0.04,18,-5,3.971 +0,0,0.04,18,5,3.347 +0,0,0.04,18,15,2.821 +0,0,0.04,18,25,2.676 +0,0,0.04,18,35,2.994 +0,0,0.04,25.2,-15,3.806 +0,0,0.04,25.2,-5,3.411 +0,0,0.04,25.2,5,3.053 +0,0,0.04,25.2,15,2.732 +0,0,0.04,25.2,25,2.633 +0,0,0.04,25.2,35,2.828 +0,0,0.04,30,-15,3.599 +0,0,0.04,30,-5,3.274 +0,0,0.04,30,5,2.977 +0,0,0.04,30,15,2.709 +0,0,0.04,30,25,2.623 +0,0,0.04,30,35,2.783 +0,0,0.04,37.1,-15,3.451 +0,0,0.04,37.1,-5,3.175 +0,0,0.04,37.1,5,2.923 +0,0,0.04,37.1,15,2.696 +0,0,0.04,37.1,25,2.623 +0,0,0.04,37.1,35,2.752 +0,0.3,-0.04,12.1,-15,2.648 +0,0.3,-0.04,12.1,-5,1.504 +0,0.3,-0.04,12.1,5,0.526 +0,0.3,-0.04,12.1,15,-0.284 +0,0.3,-0.04,12.1,25,-0.177 +0,0.3,-0.04,12.1,35,0.373 +0,0.3,-0.04,18,-15,1.4 +0,0.3,-0.04,18,-5,0.682 +0,0.3,-0.04,18,5,0.059 +0,0.3,-0.04,18,15,-0.466 +0,0.3,-0.04,18,25,-0.393 +0,0.3,-0.04,18,35,-0.036 +0,0.3,-0.04,25.2,-15,0.505 +0,0.3,-0.04,25.2,-5,0.111 +0,0.3,-0.04,25.2,5,-0.246 +0,0.3,-0.04,25.2,15,-0.566 +0,0.3,-0.04,25.2,25,-0.508 +0,0.3,-0.04,25.2,35,-0.285 +0,0.3,-0.04,30,-15,0.268 +0,0.3,-0.04,30,-5,-0.054 +0,0.3,-0.04,30,5,-0.349 +0,0.3,-0.04,30,15,-0.616 +0,0.3,-0.04,30,25,-0.569 +0,0.3,-0.04,30,35,-0.385 +0,0.3,-0.04,37.1,-15,0.085 +0,0.3,-0.04,37.1,-5,-0.189 +0,0.3,-0.04,37.1,5,-0.437 +0,0.3,-0.04,37.1,15,-0.661 +0,0.3,-0.04,37.1,25,-0.627 +0,0.3,-0.04,37.1,35,-0.477 +0,0.3,-0.03,12.1,-15,3.025 +0,0.3,-0.03,12.1,-5,1.881 +0,0.3,-0.03,12.1,5,0.902 +0,0.3,-0.03,12.1,15,0.092 +0,0.3,-0.03,12.1,25,0.2 +0,0.3,-0.03,12.1,35,0.75 +0,0.3,-0.03,18,-15,1.786 +0,0.3,-0.03,18,-5,1.067 +0,0.3,-0.03,18,5,0.444 +0,0.3,-0.03,18,15,-0.08 +0,0.3,-0.03,18,25,-0.007 +0,0.3,-0.03,18,35,0.349 +0,0.3,-0.03,25.2,-15,0.901 +0,0.3,-0.03,25.2,-5,0.507 +0,0.3,-0.03,25.2,5,0.151 +0,0.3,-0.03,25.2,15,-0.17 +0,0.3,-0.03,25.2,25,-0.112 +0,0.3,-0.03,25.2,35,0.111 +0,0.3,-0.03,30,-15,0.651 +0,0.3,-0.03,30,-5,0.329 +0,0.3,-0.03,30,5,0.034 +0,0.3,-0.03,30,15,-0.233 +0,0.3,-0.03,30,25,-0.186 +0,0.3,-0.03,30,35,-0.002 +0,0.3,-0.03,37.1,-15,0.455 +0,0.3,-0.03,37.1,-5,0.181 +0,0.3,-0.03,37.1,5,-0.067 +0,0.3,-0.03,37.1,15,-0.292 +0,0.3,-0.03,37.1,25,-0.257 +0,0.3,-0.03,37.1,35,-0.107 +0,0.3,-0.02,12.1,-15,3.402 +0,0.3,-0.02,12.1,-5,2.257 +0,0.3,-0.02,12.1,5,1.279 +0,0.3,-0.02,12.1,15,0.469 +0,0.3,-0.02,12.1,25,0.577 +0,0.3,-0.02,12.1,35,1.127 +0,0.3,-0.02,18,-15,2.171 +0,0.3,-0.02,18,-5,1.452 +0,0.3,-0.02,18,5,0.83 +0,0.3,-0.02,18,15,0.305 +0,0.3,-0.02,18,25,0.378 +0,0.3,-0.02,18,35,0.735 +0,0.3,-0.02,25.2,-15,1.298 +0,0.3,-0.02,25.2,-5,0.904 +0,0.3,-0.02,25.2,5,0.548 +0,0.3,-0.02,25.2,15,0.227 +0,0.3,-0.02,25.2,25,0.285 +0,0.3,-0.02,25.2,35,0.508 +0,0.3,-0.02,30,-15,1.035 +0,0.3,-0.02,30,-5,0.713 +0,0.3,-0.02,30,5,0.418 +0,0.3,-0.02,30,15,0.151 +0,0.3,-0.02,30,25,0.198 +0,0.3,-0.02,30,35,0.382 +0,0.3,-0.02,37.1,-15,0.825 +0,0.3,-0.02,37.1,-5,0.551 +0,0.3,-0.02,37.1,5,0.303 +0,0.3,-0.02,37.1,15,0.078 +0,0.3,-0.02,37.1,25,0.113 +0,0.3,-0.02,37.1,35,0.263 +0,0.3,-0.01,12.1,-15,3.79 +0,0.3,-0.01,12.1,-5,2.646 +0,0.3,-0.01,12.1,5,1.667 +0,0.3,-0.01,12.1,15,0.856 +0,0.3,-0.01,12.1,25,0.964 +0,0.3,-0.01,12.1,35,1.514 +0,0.3,-0.01,18,-15,2.587 +0,0.3,-0.01,18,-5,1.867 +0,0.3,-0.01,18,5,1.243 +0,0.3,-0.01,18,15,0.717 +0,0.3,-0.01,18,25,0.79 +0,0.3,-0.01,18,35,1.145 +0,0.3,-0.01,25.2,-15,1.728 +0,0.3,-0.01,25.2,-5,1.333 +0,0.3,-0.01,25.2,5,0.975 +0,0.3,-0.01,25.2,15,0.653 +0,0.3,-0.01,25.2,25,0.71 +0,0.3,-0.01,25.2,35,0.932 +0,0.3,-0.01,30,-15,1.475 +0,0.3,-0.01,30,-5,1.151 +0,0.3,-0.01,30,5,0.854 +0,0.3,-0.01,30,15,0.585 +0,0.3,-0.01,30,25,0.63 +0,0.3,-0.01,30,35,0.813 +0,0.3,-0.01,37.1,-15,1.278 +0,0.3,-0.01,37.1,-5,1.002 +0,0.3,-0.01,37.1,5,0.75 +0,0.3,-0.01,37.1,15,0.523 +0,0.3,-0.01,37.1,25,0.555 +0,0.3,-0.01,37.1,35,0.703 +0,0.3,0,12.1,-15,4.23 +0,0.3,0,12.1,-5,3.086 +0,0.3,0,12.1,5,2.107 +0,0.3,0,12.1,15,1.296 +0,0.3,0,12.1,25,1.404 +0,0.3,0,12.1,35,1.953 +0,0.3,0,18,-15,3.04 +0,0.3,0,18,-5,2.32 +0,0.3,0,18,5,1.696 +0,0.3,0,18,15,1.17 +0,0.3,0,18,25,1.243 +0,0.3,0,18,35,1.598 +0,0.3,0,25.2,-15,2.185 +0,0.3,0,25.2,-5,1.79 +0,0.3,0,25.2,5,1.432 +0,0.3,0,25.2,15,1.11 +0,0.3,0,25.2,25,1.167 +0,0.3,0,25.2,35,1.389 +0,0.3,0,30,-15,1.944 +0,0.3,0,30,-5,1.619 +0,0.3,0,30,5,1.323 +0,0.3,0,30,15,1.054 +0,0.3,0,30,25,1.099 +0,0.3,0,30,35,1.282 +0,0.3,0,37.1,-15,1.759 +0,0.3,0,37.1,-5,1.483 +0,0.3,0,37.1,5,1.232 +0,0.3,0,37.1,15,1.005 +0,0.3,0,37.1,25,1.037 +0,0.3,0,37.1,35,1.184 +0,0.3,0.01,12.1,-15,4.67 +0,0.3,0.01,12.1,-5,3.526 +0,0.3,0.01,12.1,5,2.547 +0,0.3,0.01,12.1,15,1.737 +0,0.3,0.01,12.1,25,1.844 +0,0.3,0.01,12.1,35,2.394 +0,0.3,0.01,18,-15,3.494 +0,0.3,0.01,18,-5,2.773 +0,0.3,0.01,18,5,2.15 +0,0.3,0.01,18,15,1.624 +0,0.3,0.01,18,25,1.696 +0,0.3,0.01,18,35,2.052 +0,0.3,0.01,25.2,-15,2.642 +0,0.3,0.01,25.2,-5,2.247 +0,0.3,0.01,25.2,5,1.889 +0,0.3,0.01,25.2,15,1.567 +0,0.3,0.01,25.2,25,1.624 +0,0.3,0.01,25.2,35,1.846 +0,0.3,0.01,30,-15,2.413 +0,0.3,0.01,30,-5,2.089 +0,0.3,0.01,30,5,1.792 +0,0.3,0.01,30,15,1.523 +0,0.3,0.01,30,25,1.568 +0,0.3,0.01,30,35,1.751 +0,0.3,0.01,37.1,-15,2.241 +0,0.3,0.01,37.1,-5,1.965 +0,0.3,0.01,37.1,5,1.713 +0,0.3,0.01,37.1,15,1.487 +0,0.3,0.01,37.1,25,1.518 +0,0.3,0.01,37.1,35,1.666 +0,0.3,0.02,12.1,-15,5.111 +0,0.3,0.02,12.1,-5,3.966 +0,0.3,0.02,12.1,5,2.987 +0,0.3,0.02,12.1,15,2.177 +0,0.3,0.02,12.1,25,2.284 +0,0.3,0.02,12.1,35,2.834 +0,0.3,0.02,18,-15,3.947 +0,0.3,0.02,18,-5,3.227 +0,0.3,0.02,18,5,2.604 +0,0.3,0.02,18,15,2.078 +0,0.3,0.02,18,25,2.15 +0,0.3,0.02,18,35,2.506 +0,0.3,0.02,25.2,-15,3.099 +0,0.3,0.02,25.2,-5,2.704 +0,0.3,0.02,25.2,5,2.346 +0,0.3,0.02,25.2,15,2.024 +0,0.3,0.02,25.2,25,2.081 +0,0.3,0.02,25.2,35,2.303 +0,0.3,0.02,30,-15,2.882 +0,0.3,0.02,30,-5,2.558 +0,0.3,0.02,30,5,2.261 +0,0.3,0.02,30,15,1.992 +0,0.3,0.02,30,25,2.037 +0,0.3,0.02,30,35,2.22 +0,0.3,0.02,37.1,-15,2.723 +0,0.3,0.02,37.1,-5,2.447 +0,0.3,0.02,37.1,5,2.195 +0,0.3,0.02,37.1,15,1.969 +0,0.3,0.02,37.1,25,2.001 +0,0.3,0.02,37.1,35,2.148 +0,0.3,0.03,12.1,-15,5.551 +0,0.3,0.03,12.1,-5,4.406 +0,0.3,0.03,12.1,5,3.428 +0,0.3,0.03,12.1,15,2.617 +0,0.3,0.03,12.1,25,2.724 +0,0.3,0.03,12.1,35,3.274 +0,0.3,0.03,18,-15,4.401 +0,0.3,0.03,18,-5,3.681 +0,0.3,0.03,18,5,3.057 +0,0.3,0.03,18,15,2.532 +0,0.3,0.03,18,25,2.604 +0,0.3,0.03,18,35,2.96 +0,0.3,0.03,25.2,-15,3.557 +0,0.3,0.03,25.2,-5,3.162 +0,0.3,0.03,25.2,5,2.804 +0,0.3,0.03,25.2,15,2.482 +0,0.3,0.03,25.2,25,2.539 +0,0.3,0.03,25.2,35,2.761 +0,0.3,0.03,30,-15,3.352 +0,0.3,0.03,30,-5,3.027 +0,0.3,0.03,30,5,2.73 +0,0.3,0.03,30,15,2.462 +0,0.3,0.03,30,25,2.507 +0,0.3,0.03,30,35,2.689 +0,0.3,0.03,37.1,-15,3.205 +0,0.3,0.03,37.1,-5,2.929 +0,0.3,0.03,37.1,5,2.677 +0,0.3,0.03,37.1,15,2.451 +0,0.3,0.03,37.1,25,2.483 +0,0.3,0.03,37.1,35,2.63 +0,0.3,0.04,12.1,-15,5.991 +0,0.3,0.04,12.1,-5,4.847 +0,0.3,0.04,12.1,5,3.868 +0,0.3,0.04,12.1,15,3.057 +0,0.3,0.04,12.1,25,3.165 +0,0.3,0.04,12.1,35,3.714 +0,0.3,0.04,18,-15,4.855 +0,0.3,0.04,18,-5,4.135 +0,0.3,0.04,18,5,3.511 +0,0.3,0.04,18,15,2.985 +0,0.3,0.04,18,25,3.057 +0,0.3,0.04,18,35,3.413 +0,0.3,0.04,25.2,-15,4.015 +0,0.3,0.04,25.2,-5,3.62 +0,0.3,0.04,25.2,5,3.262 +0,0.3,0.04,25.2,15,2.94 +0,0.3,0.04,25.2,25,2.997 +0,0.3,0.04,25.2,35,3.219 +0,0.3,0.04,30,-15,3.821 +0,0.3,0.04,30,-5,3.497 +0,0.3,0.04,30,5,3.2 +0,0.3,0.04,30,15,2.931 +0,0.3,0.04,30,25,2.977 +0,0.3,0.04,30,35,3.159 +0,0.3,0.04,37.1,-15,3.687 +0,0.3,0.04,37.1,-5,3.411 +0,0.3,0.04,37.1,5,3.159 +0,0.3,0.04,37.1,15,2.933 +0,0.3,0.04,37.1,25,2.965 +0,0.3,0.04,37.1,35,3.112 +0,0.6,-0.04,12.1,-15,2.329 +0,0.6,-0.04,12.1,-5,1.185 +0,0.6,-0.04,12.1,5,0.207 +0,0.6,-0.04,12.1,15,-0.413 +0,0.6,-0.04,12.1,25,-0.173 +0,0.6,-0.04,12.1,35,0.433 +0,0.6,-0.04,18,-15,1.143 +0,0.6,-0.04,18,-5,0.424 +0,0.6,-0.04,18,5,-0.198 +0,0.6,-0.04,18,15,-0.594 +0,0.6,-0.04,18,25,-0.432 +0,0.6,-0.04,18,35,-0.038 +0,0.6,-0.04,25.2,-15,0.286 +0,0.6,-0.04,25.2,-5,-0.108 +0,0.6,-0.04,25.2,5,-0.465 +0,0.6,-0.04,25.2,15,-0.689 +0,0.6,-0.04,25.2,25,-0.572 +0,0.6,-0.04,25.2,35,-0.322 +0,0.6,-0.04,30,-15,0.061 +0,0.6,-0.04,30,-5,-0.262 +0,0.6,-0.04,30,5,-0.556 +0,0.6,-0.04,30,15,-0.743 +0,0.6,-0.04,30,25,-0.646 +0,0.6,-0.04,30,35,-0.439 +0,0.6,-0.04,37.1,-15,-0.112 +0,0.6,-0.04,37.1,-5,-0.385 +0,0.6,-0.04,37.1,5,-0.634 +0,0.6,-0.04,37.1,15,-0.795 +0,0.6,-0.04,37.1,25,-0.718 +0,0.6,-0.04,37.1,35,-0.55 +0,0.6,-0.03,12.1,-15,2.752 +0,0.6,-0.03,12.1,-5,1.608 +0,0.6,-0.03,12.1,5,0.63 +0,0.6,-0.03,12.1,15,0.01 +0,0.6,-0.03,12.1,25,0.251 +0,0.6,-0.03,12.1,35,0.856 +0,0.6,-0.03,18,-15,1.576 +0,0.6,-0.03,18,-5,0.857 +0,0.6,-0.03,18,5,0.234 +0,0.6,-0.03,18,15,-0.162 +0,0.6,-0.03,18,25,0.001 +0,0.6,-0.03,18,35,0.395 +0,0.6,-0.03,25.2,-15,0.731 +0,0.6,-0.03,25.2,-5,0.337 +0,0.6,-0.03,25.2,5,-0.02 +0,0.6,-0.03,25.2,15,-0.244 +0,0.6,-0.03,25.2,25,-0.127 +0,0.6,-0.03,25.2,35,0.123 +0,0.6,-0.03,30,-15,0.491 +0,0.6,-0.03,30,-5,0.168 +0,0.6,-0.03,30,5,-0.126 +0,0.6,-0.03,30,15,-0.313 +0,0.6,-0.03,30,25,-0.216 +0,0.6,-0.03,30,35,-0.009 +0,0.6,-0.03,37.1,-15,0.303 +0,0.6,-0.03,37.1,-5,0.03 +0,0.6,-0.03,37.1,5,-0.218 +0,0.6,-0.03,37.1,15,-0.379 +0,0.6,-0.03,37.1,25,-0.303 +0,0.6,-0.03,37.1,35,-0.134 +0,0.6,-0.02,12.1,-15,3.175 +0,0.6,-0.02,12.1,-5,2.031 +0,0.6,-0.02,12.1,5,1.053 +0,0.6,-0.02,12.1,15,0.433 +0,0.6,-0.02,12.1,25,0.674 +0,0.6,-0.02,12.1,35,1.279 +0,0.6,-0.02,18,-15,2.008 +0,0.6,-0.02,18,-5,1.29 +0,0.6,-0.02,18,5,0.667 +0,0.6,-0.02,18,15,0.271 +0,0.6,-0.02,18,25,0.434 +0,0.6,-0.02,18,35,0.828 +0,0.6,-0.02,25.2,-15,1.176 +0,0.6,-0.02,25.2,-5,0.783 +0,0.6,-0.02,25.2,5,0.426 +0,0.6,-0.02,25.2,15,0.202 +0,0.6,-0.02,25.2,25,0.319 +0,0.6,-0.02,25.2,35,0.569 +0,0.6,-0.02,30,-15,0.922 +0,0.6,-0.02,30,-5,0.599 +0,0.6,-0.02,30,5,0.305 +0,0.6,-0.02,30,15,0.118 +0,0.6,-0.02,30,25,0.215 +0,0.6,-0.02,30,35,0.422 +0,0.6,-0.02,37.1,-15,0.719 +0,0.6,-0.02,37.1,-5,0.446 +0,0.6,-0.02,37.1,5,0.197 +0,0.6,-0.02,37.1,15,0.036 +0,0.6,-0.02,37.1,25,0.113 +0,0.6,-0.02,37.1,35,0.281 +0,0.6,-0.01,12.1,-15,3.611 +0,0.6,-0.01,12.1,-5,2.466 +0,0.6,-0.01,12.1,5,1.487 +0,0.6,-0.01,12.1,15,0.867 +0,0.6,-0.01,12.1,25,1.107 +0,0.6,-0.01,12.1,35,1.713 +0,0.6,-0.01,18,-15,2.472 +0,0.6,-0.01,18,-5,1.751 +0,0.6,-0.01,18,5,1.128 +0,0.6,-0.01,18,15,0.731 +0,0.6,-0.01,18,25,0.893 +0,0.6,-0.01,18,35,1.286 +0,0.6,-0.01,25.2,-15,1.655 +0,0.6,-0.01,25.2,-5,1.26 +0,0.6,-0.01,25.2,5,0.902 +0,0.6,-0.01,25.2,15,0.677 +0,0.6,-0.01,25.2,25,0.793 +0,0.6,-0.01,25.2,35,1.042 +0,0.6,-0.01,30,-15,1.409 +0,0.6,-0.01,30,-5,1.085 +0,0.6,-0.01,30,5,0.788 +0,0.6,-0.01,30,15,0.599 +0,0.6,-0.01,30,25,0.695 +0,0.6,-0.01,30,35,0.9 +0,0.6,-0.01,37.1,-15,1.218 +0,0.6,-0.01,37.1,-5,0.941 +0,0.6,-0.01,37.1,5,0.69 +0,0.6,-0.01,37.1,15,0.526 +0,0.6,-0.01,37.1,25,0.601 +0,0.6,-0.01,37.1,35,0.767 +0,0.6,0,12.1,-15,4.104 +0,0.6,0,12.1,-5,2.96 +0,0.6,0,12.1,5,1.981 +0,0.6,0,12.1,15,1.36 +0,0.6,0,12.1,25,1.601 +0,0.6,0,12.1,35,2.206 +0,0.6,0,18,-15,2.98 +0,0.6,0,18,-5,2.26 +0,0.6,0,18,5,1.637 +0,0.6,0,18,15,1.24 +0,0.6,0,18,25,1.401 +0,0.6,0,18,35,1.794 +0,0.6,0,25.2,-15,2.168 +0,0.6,0,25.2,-5,1.773 +0,0.6,0,25.2,5,1.415 +0,0.6,0,25.2,15,1.19 +0,0.6,0,25.2,25,1.306 +0,0.6,0,25.2,35,1.555 +0,0.6,0,30,-15,1.936 +0,0.6,0,30,-5,1.611 +0,0.6,0,30,5,1.314 +0,0.6,0,30,15,1.126 +0,0.6,0,30,25,1.222 +0,0.6,0,30,35,1.426 +0,0.6,0,37.1,-15,1.759 +0,0.6,0,37.1,-5,1.482 +0,0.6,0,37.1,5,1.231 +0,0.6,0,37.1,15,1.067 +0,0.6,0,37.1,25,1.141 +0,0.6,0,37.1,35,1.307 +0,0.6,0.01,12.1,-15,4.599 +0,0.6,0.01,12.1,-5,3.454 +0,0.6,0.01,12.1,5,2.476 +0,0.6,0.01,12.1,15,1.855 +0,0.6,0.01,12.1,25,2.096 +0,0.6,0.01,12.1,35,2.701 +0,0.6,0.01,18,-15,3.49 +0,0.6,0.01,18,-5,2.77 +0,0.6,0.01,18,5,2.146 +0,0.6,0.01,18,15,1.749 +0,0.6,0.01,18,25,1.911 +0,0.6,0.01,18,35,2.304 +0,0.6,0.01,25.2,-15,2.681 +0,0.6,0.01,25.2,-5,2.287 +0,0.6,0.01,25.2,5,1.928 +0,0.6,0.01,25.2,15,1.703 +0,0.6,0.01,25.2,25,1.819 +0,0.6,0.01,25.2,35,2.068 +0,0.6,0.01,30,-15,2.463 +0,0.6,0.01,30,-5,2.138 +0,0.6,0.01,30,5,1.841 +0,0.6,0.01,30,15,1.653 +0,0.6,0.01,30,25,1.748 +0,0.6,0.01,30,35,1.953 +0,0.6,0.01,37.1,-15,2.3 +0,0.6,0.01,37.1,-5,2.023 +0,0.6,0.01,37.1,5,1.772 +0,0.6,0.01,37.1,15,1.608 +0,0.6,0.01,37.1,25,1.683 +0,0.6,0.01,37.1,35,1.848 +0,0.6,0.02,12.1,-15,5.093 +0,0.6,0.02,12.1,-5,3.949 +0,0.6,0.02,12.1,5,2.97 +0,0.6,0.02,12.1,15,2.349 +0,0.6,0.02,12.1,25,2.59 +0,0.6,0.02,12.1,35,3.195 +0,0.6,0.02,18,-15,3.999 +0,0.6,0.02,18,-5,3.279 +0,0.6,0.02,18,5,2.656 +0,0.6,0.02,18,15,2.259 +0,0.6,0.02,18,25,2.42 +0,0.6,0.02,18,35,2.814 +0,0.6,0.02,25.2,-15,3.195 +0,0.6,0.02,25.2,-5,2.8 +0,0.6,0.02,25.2,5,2.442 +0,0.6,0.02,25.2,15,2.216 +0,0.6,0.02,25.2,25,2.333 +0,0.6,0.02,25.2,35,2.582 +0,0.6,0.02,30,-15,2.989 +0,0.6,0.02,30,-5,2.665 +0,0.6,0.02,30,5,2.368 +0,0.6,0.02,30,15,2.179 +0,0.6,0.02,30,25,2.275 +0,0.6,0.02,30,35,2.48 +0,0.6,0.02,37.1,-15,2.841 +0,0.6,0.02,37.1,-5,2.565 +0,0.6,0.02,37.1,5,2.313 +0,0.6,0.02,37.1,15,2.15 +0,0.6,0.02,37.1,25,2.224 +0,0.6,0.02,37.1,35,2.39 +0,0.6,0.03,12.1,-15,5.588 +0,0.6,0.03,12.1,-5,4.443 +0,0.6,0.03,12.1,5,3.464 +0,0.6,0.03,12.1,15,2.844 +0,0.6,0.03,12.1,25,3.084 +0,0.6,0.03,12.1,35,3.69 +0,0.6,0.03,18,-15,4.509 +0,0.6,0.03,18,-5,3.789 +0,0.6,0.03,18,5,3.165 +0,0.6,0.03,18,15,2.768 +0,0.6,0.03,18,25,2.93 +0,0.6,0.03,18,35,3.323 +0,0.6,0.03,25.2,-15,3.709 +0,0.6,0.03,25.2,-5,3.314 +0,0.6,0.03,25.2,5,2.956 +0,0.6,0.03,25.2,15,2.731 +0,0.6,0.03,25.2,25,2.847 +0,0.6,0.03,25.2,35,3.096 +0,0.6,0.03,30,-15,3.517 +0,0.6,0.03,30,-5,3.192 +0,0.6,0.03,30,5,2.895 +0,0.6,0.03,30,15,2.707 +0,0.6,0.03,30,25,2.802 +0,0.6,0.03,30,35,3.007 +0,0.6,0.03,37.1,-15,3.382 +0,0.6,0.03,37.1,-5,3.106 +0,0.6,0.03,37.1,5,2.855 +0,0.6,0.03,37.1,15,2.691 +0,0.6,0.03,37.1,25,2.765 +0,0.6,0.03,37.1,35,2.931 +0,0.6,0.04,12.1,-15,6.082 +0,0.6,0.04,12.1,-5,4.938 +0,0.6,0.04,12.1,5,3.959 +0,0.6,0.04,12.1,15,3.338 +0,0.6,0.04,12.1,25,3.579 +0,0.6,0.04,12.1,35,4.184 +0,0.6,0.04,18,-15,5.018 +0,0.6,0.04,18,-5,4.298 +0,0.6,0.04,18,5,3.675 +0,0.6,0.04,18,15,3.278 +0,0.6,0.04,18,25,3.439 +0,0.6,0.04,18,35,3.833 +0,0.6,0.04,25.2,-15,4.223 +0,0.6,0.04,25.2,-5,3.828 +0,0.6,0.04,25.2,5,3.47 +0,0.6,0.04,25.2,15,3.245 +0,0.6,0.04,25.2,25,3.361 +0,0.6,0.04,25.2,35,3.61 +0,0.6,0.04,30,-15,4.044 +0,0.6,0.04,30,-5,3.719 +0,0.6,0.04,30,5,3.423 +0,0.6,0.04,30,15,3.234 +0,0.6,0.04,30,25,3.33 +0,0.6,0.04,30,35,3.535 +0,0.6,0.04,37.1,-15,3.924 +0,0.6,0.04,37.1,-5,3.647 +0,0.6,0.04,37.1,5,3.396 +0,0.6,0.04,37.1,15,3.232 +0,0.6,0.04,37.1,25,3.307 +0,0.6,0.04,37.1,35,3.472 +0,0.9,-0.04,12.1,-15,2.01 +0,0.9,-0.04,12.1,-5,0.866 +0,0.9,-0.04,12.1,5,-0.112 +0,0.9,-0.04,12.1,15,-0.504 +0,0.9,-0.04,12.1,25,-0.168 +0,0.9,-0.04,12.1,35,0.493 +0,0.9,-0.04,18,-15,0.886 +0,0.9,-0.04,18,-5,0.167 +0,0.9,-0.04,18,5,-0.456 +0,0.9,-0.04,18,15,-0.694 +0,0.9,-0.04,18,25,-0.471 +0,0.9,-0.04,18,35,-0.04 +0,0.9,-0.04,25.2,-15,0.067 +0,0.9,-0.04,25.2,-5,-0.327 +0,0.9,-0.04,25.2,5,-0.684 +0,0.9,-0.04,25.2,15,-0.789 +0,0.9,-0.04,25.2,25,-0.635 +0,0.9,-0.04,25.2,35,-0.359 +0,0.9,-0.04,30,-15,-0.147 +0,0.9,-0.04,30,-5,-0.469 +0,0.9,-0.04,30,5,-0.764 +0,0.9,-0.04,30,15,-0.85 +0,0.9,-0.04,30,25,-0.723 +0,0.9,-0.04,30,35,-0.494 +0,0.9,-0.04,37.1,-15,-0.308 +0,0.9,-0.04,37.1,-5,-0.582 +0,0.9,-0.04,37.1,5,-0.83 +0,0.9,-0.04,37.1,15,-0.91 +0,0.9,-0.04,37.1,25,-0.809 +0,0.9,-0.04,37.1,35,-0.622 +0,0.9,-0.03,12.1,-15,2.48 +0,0.9,-0.03,12.1,-5,1.336 +0,0.9,-0.03,12.1,5,0.357 +0,0.9,-0.03,12.1,15,-0.034 +0,0.9,-0.03,12.1,25,0.301 +0,0.9,-0.03,12.1,35,0.963 +0,0.9,-0.03,18,-15,1.366 +0,0.9,-0.03,18,-5,0.647 +0,0.9,-0.03,18,5,0.024 +0,0.9,-0.03,18,15,-0.214 +0,0.9,-0.03,18,25,0.009 +0,0.9,-0.03,18,35,0.441 +0,0.9,-0.03,25.2,-15,0.56 +0,0.9,-0.03,25.2,-5,0.167 +0,0.9,-0.03,25.2,5,-0.19 +0,0.9,-0.03,25.2,15,-0.295 +0,0.9,-0.03,25.2,25,-0.141 +0,0.9,-0.03,25.2,35,0.135 +0,0.9,-0.03,30,-15,0.331 +0,0.9,-0.03,30,-5,0.008 +0,0.9,-0.03,30,5,-0.287 +0,0.9,-0.03,30,15,-0.373 +0,0.9,-0.03,30,25,-0.245 +0,0.9,-0.03,30,35,-0.016 +0,0.9,-0.03,37.1,-15,0.152 +0,0.9,-0.03,37.1,-5,-0.121 +0,0.9,-0.03,37.1,5,-0.37 +0,0.9,-0.03,37.1,15,-0.45 +0,0.9,-0.03,37.1,25,-0.348 +0,0.9,-0.03,37.1,35,-0.162 +0,0.9,-0.02,12.1,-15,2.949 +0,0.9,-0.02,12.1,-5,1.805 +0,0.9,-0.02,12.1,5,0.827 +0,0.9,-0.02,12.1,15,0.435 +0,0.9,-0.02,12.1,25,0.771 +0,0.9,-0.02,12.1,35,1.432 +0,0.9,-0.02,18,-15,1.846 +0,0.9,-0.02,18,-5,1.127 +0,0.9,-0.02,18,5,0.504 +0,0.9,-0.02,18,15,0.266 +0,0.9,-0.02,18,25,0.489 +0,0.9,-0.02,18,35,0.921 +0,0.9,-0.02,25.2,-15,1.055 +0,0.9,-0.02,25.2,-5,0.661 +0,0.9,-0.02,25.2,5,0.304 +0,0.9,-0.02,25.2,15,0.199 +0,0.9,-0.02,25.2,25,0.353 +0,0.9,-0.02,25.2,35,0.63 +0,0.9,-0.02,30,-15,0.809 +0,0.9,-0.02,30,-5,0.486 +0,0.9,-0.02,30,5,0.191 +0,0.9,-0.02,30,15,0.105 +0,0.9,-0.02,30,25,0.233 +0,0.9,-0.02,30,35,0.462 +0,0.9,-0.02,37.1,-15,0.613 +0,0.9,-0.02,37.1,-5,0.34 +0,0.9,-0.02,37.1,5,0.091 +0,0.9,-0.02,37.1,15,0.011 +0,0.9,-0.02,37.1,25,0.113 +0,0.9,-0.02,37.1,35,0.299 +0,0.9,-0.01,12.1,-15,3.431 +0,0.9,-0.01,12.1,-5,2.286 +0,0.9,-0.01,12.1,5,1.307 +0,0.9,-0.01,12.1,15,0.915 +0,0.9,-0.01,12.1,25,1.251 +0,0.9,-0.01,12.1,35,1.911 +0,0.9,-0.01,18,-15,2.356 +0,0.9,-0.01,18,-5,1.636 +0,0.9,-0.01,18,5,1.013 +0,0.9,-0.01,18,15,0.773 +0,0.9,-0.01,18,25,0.995 +0,0.9,-0.01,18,35,1.426 +0,0.9,-0.01,25.2,-15,1.582 +0,0.9,-0.01,25.2,-5,1.187 +0,0.9,-0.01,25.2,5,0.829 +0,0.9,-0.01,25.2,15,0.723 +0,0.9,-0.01,25.2,25,0.876 +0,0.9,-0.01,25.2,35,1.152 +0,0.9,-0.01,30,-15,1.343 +0,0.9,-0.01,30,-5,1.019 +0,0.9,-0.01,30,5,0.722 +0,0.9,-0.01,30,15,0.634 +0,0.9,-0.01,30,25,0.76 +0,0.9,-0.01,30,35,0.987 +0,0.9,-0.01,37.1,-15,1.158 +0,0.9,-0.01,37.1,-5,0.881 +0,0.9,-0.01,37.1,5,0.63 +0,0.9,-0.01,37.1,15,0.547 +0,0.9,-0.01,37.1,25,0.646 +0,0.9,-0.01,37.1,35,0.83 +0,0.9,0,12.1,-15,3.979 +0,0.9,0,12.1,-5,2.834 +0,0.9,0,12.1,5,1.855 +0,0.9,0,12.1,15,1.463 +0,0.9,0,12.1,25,1.798 +0,0.9,0,12.1,35,2.459 +0,0.9,0,18,-15,2.921 +0,0.9,0,18,-5,2.201 +0,0.9,0,18,5,1.577 +0,0.9,0,18,15,1.338 +0,0.9,0,18,25,1.56 +0,0.9,0,18,35,1.991 +0,0.9,0,25.2,-15,2.151 +0,0.9,0,25.2,-5,1.756 +0,0.9,0,25.2,5,1.398 +0,0.9,0,25.2,15,1.292 +0,0.9,0,25.2,25,1.445 +0,0.9,0,25.2,35,1.721 +0,0.9,0,30,-15,1.927 +0,0.9,0,30,-5,1.603 +0,0.9,0,30,5,1.306 +0,0.9,0,30,15,1.218 +0,0.9,0,30,25,1.344 +0,0.9,0,30,35,1.571 +0,0.9,0,37.1,-15,1.758 +0,0.9,0,37.1,-5,1.481 +0,0.9,0,37.1,5,1.23 +0,0.9,0,37.1,15,1.147 +0,0.9,0,37.1,25,1.246 +0,0.9,0,37.1,35,1.43 +0,0.9,0.01,12.1,-15,4.528 +0,0.9,0.01,12.1,-5,3.383 +0,0.9,0.01,12.1,5,2.404 +0,0.9,0.01,12.1,15,2.012 +0,0.9,0.01,12.1,25,2.347 +0,0.9,0.01,12.1,35,3.008 +0,0.9,0.01,18,-15,3.486 +0,0.9,0.01,18,-5,2.766 +0,0.9,0.01,18,5,2.143 +0,0.9,0.01,18,15,1.903 +0,0.9,0.01,18,25,2.125 +0,0.9,0.01,18,35,2.556 +0,0.9,0.01,25.2,-15,2.721 +0,0.9,0.01,25.2,-5,2.326 +0,0.9,0.01,25.2,5,1.968 +0,0.9,0.01,25.2,15,1.862 +0,0.9,0.01,25.2,25,2.015 +0,0.9,0.01,25.2,35,2.29 +0,0.9,0.01,30,-15,2.512 +0,0.9,0.01,30,-5,2.187 +0,0.9,0.01,30,5,1.891 +0,0.9,0.01,30,15,1.803 +0,0.9,0.01,30,25,1.928 +0,0.9,0.01,30,35,2.156 +0,0.9,0.01,37.1,-15,2.358 +0,0.9,0.01,37.1,-5,2.082 +0,0.9,0.01,37.1,5,1.83 +0,0.9,0.01,37.1,15,1.747 +0,0.9,0.01,37.1,25,1.847 +0,0.9,0.01,37.1,35,2.031 +0,0.9,0.02,12.1,-15,5.076 +0,0.9,0.02,12.1,-5,3.932 +0,0.9,0.02,12.1,5,2.953 +0,0.9,0.02,12.1,15,2.561 +0,0.9,0.02,12.1,25,2.896 +0,0.9,0.02,12.1,35,3.557 +0,0.9,0.02,18,-15,4.052 +0,0.9,0.02,18,-5,3.332 +0,0.9,0.02,18,5,2.708 +0,0.9,0.02,18,15,2.468 +0,0.9,0.02,18,25,2.691 +0,0.9,0.02,18,35,3.121 +0,0.9,0.02,25.2,-15,3.291 +0,0.9,0.02,25.2,-5,2.896 +0,0.9,0.02,25.2,5,2.538 +0,0.9,0.02,25.2,15,2.432 +0,0.9,0.02,25.2,25,2.584 +0,0.9,0.02,25.2,35,2.86 +0,0.9,0.02,30,-15,3.096 +0,0.9,0.02,30,-5,2.772 +0,0.9,0.02,30,5,2.475 +0,0.9,0.02,30,15,2.387 +0,0.9,0.02,30,25,2.513 +0,0.9,0.02,30,35,2.74 +0,0.9,0.02,37.1,-15,2.959 +0,0.9,0.02,37.1,-5,2.683 +0,0.9,0.02,37.1,5,2.431 +0,0.9,0.02,37.1,15,2.348 +0,0.9,0.02,37.1,25,2.447 +0,0.9,0.02,37.1,35,2.631 +0,0.9,0.03,12.1,-15,5.625 +0,0.9,0.03,12.1,-5,4.48 +0,0.9,0.03,12.1,5,3.501 +0,0.9,0.03,12.1,15,3.109 +0,0.9,0.03,12.1,25,3.444 +0,0.9,0.03,12.1,35,4.105 +0,0.9,0.03,18,-15,4.617 +0,0.9,0.03,18,-5,3.897 +0,0.9,0.03,18,5,3.273 +0,0.9,0.03,18,15,3.034 +0,0.9,0.03,18,25,3.256 +0,0.9,0.03,18,35,3.687 +0,0.9,0.03,25.2,-15,3.861 +0,0.9,0.03,25.2,-5,3.466 +0,0.9,0.03,25.2,5,3.108 +0,0.9,0.03,25.2,15,3.002 +0,0.9,0.03,25.2,25,3.155 +0,0.9,0.03,25.2,35,3.431 +0,0.9,0.03,30,-15,3.682 +0,0.9,0.03,30,-5,3.357 +0,0.9,0.03,30,5,3.06 +0,0.9,0.03,30,15,2.972 +0,0.9,0.03,30,25,3.098 +0,0.9,0.03,30,35,3.325 +0,0.9,0.03,37.1,-15,3.56 +0,0.9,0.03,37.1,-5,3.283 +0,0.9,0.03,37.1,5,3.032 +0,0.9,0.03,37.1,15,2.949 +0,0.9,0.03,37.1,25,3.048 +0,0.9,0.03,37.1,35,3.232 +0,0.9,0.04,12.1,-15,6.173 +0,0.9,0.04,12.1,-5,5.029 +0,0.9,0.04,12.1,5,4.05 +0,0.9,0.04,12.1,15,3.658 +0,0.9,0.04,12.1,25,3.993 +0,0.9,0.04,12.1,35,4.654 +0,0.9,0.04,18,-15,5.182 +0,0.9,0.04,18,-5,4.462 +0,0.9,0.04,18,5,3.839 +0,0.9,0.04,18,15,3.599 +0,0.9,0.04,18,25,3.821 +0,0.9,0.04,18,35,4.252 +0,0.9,0.04,25.2,-15,4.432 +0,0.9,0.04,25.2,-5,4.037 +0,0.9,0.04,25.2,5,3.679 +0,0.9,0.04,25.2,15,3.573 +0,0.9,0.04,25.2,25,3.725 +0,0.9,0.04,25.2,35,4.001 +0,0.9,0.04,30,-15,4.267 +0,0.9,0.04,30,-5,3.942 +0,0.9,0.04,30,5,3.645 +0,0.9,0.04,30,15,3.557 +0,0.9,0.04,30,25,3.683 +0,0.9,0.04,30,35,3.91 +0,0.9,0.04,37.1,-15,4.16 +0,0.9,0.04,37.1,-5,3.884 +0,0.9,0.04,37.1,5,3.632 +0,0.9,0.04,37.1,15,3.549 +0,0.9,0.04,37.1,25,3.649 +0,0.9,0.04,37.1,35,3.833 +1,0,-0.04,12.1,-15,3.752 +1,0,-0.04,12.1,-5,2.322 +1,0,-0.04,12.1,5,1.069 +1,0,-0.04,12.1,15,-0.007 +1,0,-0.04,12.1,25,-0.308 +1,0,-0.04,12.1,35,0.361 +1,0,-0.04,18,-15,2.048 +1,0,-0.04,18,-5,1.134 +1,0,-0.04,18,5,0.323 +1,0,-0.04,18,15,-0.384 +1,0,-0.04,18,25,-0.588 +1,0,-0.04,18,35,-0.149 +1,0,-0.04,25.2,-15,0.887 +1,0,-0.04,25.2,-5,0.351 +1,0,-0.04,25.2,5,-0.143 +1,0,-0.04,25.2,15,-0.596 +1,0,-0.04,25.2,25,-0.736 +1,0,-0.04,25.2,35,-0.453 +1,0,-0.04,30,-15,0.534 +1,0,-0.04,30,-5,0.091 +1,0,-0.04,30,5,-0.32 +1,0,-0.04,30,15,-0.7 +1,0,-0.04,30,25,-0.82 +1,0,-0.04,30,35,-0.584 +1,0,-0.04,37.1,-15,0.231 +1,0,-0.04,37.1,-5,-0.141 +1,0,-0.04,37.1,5,-0.485 +1,0,-0.04,37.1,15,-0.801 +1,0,-0.04,37.1,25,-0.902 +1,0,-0.04,37.1,35,-0.71 +1,0,-0.03,12.1,-15,4.248 +1,0,-0.03,12.1,-5,2.818 +1,0,-0.03,12.1,5,1.564 +1,0,-0.03,12.1,15,0.488 +1,0,-0.03,12.1,25,0.187 +1,0,-0.03,12.1,35,0.856 +1,0,-0.03,18,-15,2.555 +1,0,-0.03,18,-5,1.641 +1,0,-0.03,18,5,0.83 +1,0,-0.03,18,15,0.123 +1,0,-0.03,18,25,-0.081 +1,0,-0.03,18,35,0.358 +1,0,-0.03,25.2,-15,1.408 +1,0,-0.03,25.2,-5,0.873 +1,0,-0.03,25.2,5,0.378 +1,0,-0.03,25.2,15,-0.075 +1,0,-0.03,25.2,25,-0.215 +1,0,-0.03,25.2,35,0.068 +1,0,-0.03,30,-15,1.037 +1,0,-0.03,30,-5,0.594 +1,0,-0.03,30,5,0.184 +1,0,-0.03,30,15,-0.196 +1,0,-0.03,30,25,-0.316 +1,0,-0.03,30,35,-0.08 +1,0,-0.03,37.1,-15,0.717 +1,0,-0.03,37.1,-5,0.345 +1,0,-0.03,37.1,5,0.002 +1,0,-0.03,37.1,15,-0.315 +1,0,-0.03,37.1,25,-0.416 +1,0,-0.03,37.1,35,-0.223 +1,0,-0.02,12.1,-15,4.743 +1,0,-0.02,12.1,-5,3.313 +1,0,-0.02,12.1,5,2.06 +1,0,-0.02,12.1,15,0.984 +1,0,-0.02,12.1,25,0.683 +1,0,-0.02,12.1,35,1.352 +1,0,-0.02,18,-15,3.062 +1,0,-0.02,18,-5,2.147 +1,0,-0.02,18,5,1.336 +1,0,-0.02,18,15,0.63 +1,0,-0.02,18,25,0.426 +1,0,-0.02,18,35,0.865 +1,0,-0.02,25.2,-15,1.93 +1,0,-0.02,25.2,-5,1.395 +1,0,-0.02,25.2,5,0.9 +1,0,-0.02,25.2,15,0.447 +1,0,-0.02,25.2,25,0.307 +1,0,-0.02,25.2,35,0.59 +1,0,-0.02,30,-15,1.542 +1,0,-0.02,30,-5,1.099 +1,0,-0.02,30,5,0.688 +1,0,-0.02,30,15,0.309 +1,0,-0.02,30,25,0.189 +1,0,-0.02,30,35,0.424 +1,0,-0.02,37.1,-15,1.204 +1,0,-0.02,37.1,-5,0.832 +1,0,-0.02,37.1,5,0.488 +1,0,-0.02,37.1,15,0.172 +1,0,-0.02,37.1,25,0.071 +1,0,-0.02,37.1,35,0.263 +1,0,-0.01,12.1,-15,5.251 +1,0,-0.01,12.1,-5,3.821 +1,0,-0.01,12.1,5,2.567 +1,0,-0.01,12.1,15,1.49 +1,0,-0.01,12.1,25,1.189 +1,0,-0.01,12.1,35,1.858 +1,0,-0.01,18,-15,3.6 +1,0,-0.01,18,-5,2.684 +1,0,-0.01,18,5,1.872 +1,0,-0.01,18,15,1.164 +1,0,-0.01,18,25,0.96 +1,0,-0.01,18,35,1.397 +1,0,-0.01,25.2,-15,2.486 +1,0,-0.01,25.2,-5,1.949 +1,0,-0.01,25.2,5,1.453 +1,0,-0.01,25.2,15,0.999 +1,0,-0.01,25.2,25,0.858 +1,0,-0.01,25.2,35,1.14 +1,0,-0.01,30,-15,2.104 +1,0,-0.01,30,-5,1.659 +1,0,-0.01,30,5,1.246 +1,0,-0.01,30,15,0.865 +1,0,-0.01,30,25,0.743 +1,0,-0.01,30,35,0.977 +1,0,-0.01,37.1,-15,1.776 +1,0,-0.01,37.1,-5,1.401 +1,0,-0.01,37.1,5,1.054 +1,0,-0.01,37.1,15,0.735 +1,0,-0.01,37.1,25,0.631 +1,0,-0.01,37.1,35,0.821 +1,0,0,12.1,-15,5.829 +1,0,0,12.1,-5,4.399 +1,0,0,12.1,5,3.145 +1,0,0,12.1,15,2.069 +1,0,0,12.1,25,1.767 +1,0,0,12.1,35,2.436 +1,0,0,18,-15,4.195 +1,0,0,18,-5,3.28 +1,0,0,18,5,2.468 +1,0,0,18,15,1.76 +1,0,0,18,25,1.555 +1,0,0,18,35,1.993 +1,0,0,25.2,-15,3.087 +1,0,0,25.2,-5,2.55 +1,0,0,25.2,5,2.054 +1,0,0,25.2,15,1.6 +1,0,0,25.2,25,1.459 +1,0,0,25.2,35,1.741 +1,0,0,30,-15,2.721 +1,0,0,30,-5,2.276 +1,0,0,30,5,1.863 +1,0,0,30,15,1.482 +1,0,0,30,25,1.36 +1,0,0,30,35,1.594 +1,0,0,37.1,-15,2.409 +1,0,0,37.1,-5,2.034 +1,0,0,37.1,5,1.687 +1,0,0,37.1,15,1.368 +1,0,0,37.1,25,1.265 +1,0,0,37.1,35,1.455 +1,0,0.01,12.1,-15,6.409 +1,0,0.01,12.1,-5,4.978 +1,0,0.01,12.1,5,3.724 +1,0,0.01,12.1,15,2.648 +1,0,0.01,12.1,25,2.347 +1,0,0.01,12.1,35,3.015 +1,0,0.01,18,-15,4.792 +1,0,0.01,18,-5,3.877 +1,0,0.01,18,5,3.065 +1,0,0.01,18,15,2.357 +1,0,0.01,18,25,2.152 +1,0,0.01,18,35,2.59 +1,0,0.01,25.2,-15,3.688 +1,0,0.01,25.2,-5,3.151 +1,0,0.01,25.2,5,2.656 +1,0,0.01,25.2,15,2.201 +1,0,0.01,25.2,25,2.06 +1,0,0.01,25.2,35,2.342 +1,0,0.01,30,-15,3.338 +1,0,0.01,30,-5,2.893 +1,0,0.01,30,5,2.48 +1,0,0.01,30,15,2.099 +1,0,0.01,30,25,1.977 +1,0,0.01,30,35,2.211 +1,0,0.01,37.1,-15,3.043 +1,0,0.01,37.1,-5,2.668 +1,0,0.01,37.1,5,2.321 +1,0,0.01,37.1,15,2.002 +1,0,0.01,37.1,25,1.899 +1,0,0.01,37.1,35,2.088 +1,0,0.02,12.1,-15,6.988 +1,0,0.02,12.1,-5,5.558 +1,0,0.02,12.1,5,4.303 +1,0,0.02,12.1,15,3.227 +1,0,0.02,12.1,25,2.926 +1,0,0.02,12.1,35,3.594 +1,0,0.02,18,-15,5.389 +1,0,0.02,18,-5,4.474 +1,0,0.02,18,5,3.662 +1,0,0.02,18,15,2.954 +1,0,0.02,18,25,2.749 +1,0,0.02,18,35,3.187 +1,0,0.02,25.2,-15,4.289 +1,0,0.02,25.2,-5,3.752 +1,0,0.02,25.2,5,3.257 +1,0,0.02,25.2,15,2.803 +1,0,0.02,25.2,25,2.661 +1,0,0.02,25.2,35,2.944 +1,0,0.02,30,-15,3.955 +1,0,0.02,30,-5,3.51 +1,0,0.02,30,5,3.097 +1,0,0.02,30,15,2.716 +1,0,0.02,30,25,2.594 +1,0,0.02,30,35,2.828 +1,0,0.02,37.1,-15,3.677 +1,0,0.02,37.1,-5,3.302 +1,0,0.02,37.1,5,2.955 +1,0,0.02,37.1,15,2.636 +1,0,0.02,37.1,25,2.533 +1,0,0.02,37.1,35,2.723 +1,0,0.03,12.1,-15,7.567 +1,0,0.03,12.1,-5,6.137 +1,0,0.03,12.1,5,4.882 +1,0,0.03,12.1,15,3.806 +1,0,0.03,12.1,25,3.505 +1,0,0.03,12.1,35,4.173 +1,0,0.03,18,-15,5.986 +1,0,0.03,18,-5,5.07 +1,0,0.03,18,5,4.258 +1,0,0.03,18,15,3.55 +1,0,0.03,18,25,3.346 +1,0,0.03,18,35,3.784 +1,0,0.03,25.2,-15,4.891 +1,0,0.03,25.2,-5,4.354 +1,0,0.03,25.2,5,3.859 +1,0,0.03,25.2,15,3.405 +1,0,0.03,25.2,25,3.263 +1,0,0.03,25.2,35,3.546 +1,0,0.03,30,-15,4.573 +1,0,0.03,30,-5,4.127 +1,0,0.03,30,5,3.714 +1,0,0.03,30,15,3.333 +1,0,0.03,30,25,3.212 +1,0,0.03,30,35,3.445 +1,0,0.03,37.1,-15,4.311 +1,0,0.03,37.1,-5,3.936 +1,0,0.03,37.1,5,3.589 +1,0,0.03,37.1,15,3.27 +1,0,0.03,37.1,25,3.167 +1,0,0.03,37.1,35,3.357 +1,0,0.04,12.1,-15,8.146 +1,0,0.04,12.1,-5,6.716 +1,0,0.04,12.1,5,5.462 +1,0,0.04,12.1,15,4.385 +1,0,0.04,12.1,25,4.084 +1,0,0.04,12.1,35,4.752 +1,0,0.04,18,-15,6.583 +1,0,0.04,18,-5,5.667 +1,0,0.04,18,5,4.855 +1,0,0.04,18,15,4.147 +1,0,0.04,18,25,3.943 +1,0,0.04,18,35,4.38 +1,0,0.04,25.2,-15,5.494 +1,0,0.04,25.2,-5,4.957 +1,0,0.04,25.2,5,4.461 +1,0,0.04,25.2,15,4.007 +1,0,0.04,25.2,25,3.866 +1,0,0.04,25.2,35,4.148 +1,0,0.04,30,-15,5.19 +1,0,0.04,30,-5,4.745 +1,0,0.04,30,5,4.332 +1,0,0.04,30,15,3.951 +1,0,0.04,30,25,3.829 +1,0,0.04,30,35,4.063 +1,0,0.04,37.1,-15,4.945 +1,0,0.04,37.1,-5,4.57 +1,0,0.04,37.1,5,4.223 +1,0,0.04,37.1,15,3.904 +1,0,0.04,37.1,25,3.801 +1,0,0.04,37.1,35,3.991 +1,0.3,-0.04,12.1,-15,3.274 +1,0.3,-0.04,12.1,-5,1.844 +1,0.3,-0.04,12.1,5,0.59 +1,0.3,-0.04,12.1,15,-0.486 +1,0.3,-0.04,12.1,25,-0.302 +1,0.3,-0.04,12.1,35,0.45 +1,0.3,-0.04,18,-15,1.662 +1,0.3,-0.04,18,-5,0.748 +1,0.3,-0.04,18,5,-0.063 +1,0.3,-0.04,18,15,-0.77 +1,0.3,-0.04,18,25,-0.647 +1,0.3,-0.04,18,35,-0.152 +1,0.3,-0.04,25.2,-15,0.558 +1,0.3,-0.04,25.2,-5,0.023 +1,0.3,-0.04,25.2,5,-0.471 +1,0.3,-0.04,25.2,15,-0.925 +1,0.3,-0.04,25.2,25,-0.832 +1,0.3,-0.04,25.2,35,-0.508 +1,0.3,-0.04,30,-15,0.222 +1,0.3,-0.04,30,-5,-0.221 +1,0.3,-0.04,30,5,-0.632 +1,0.3,-0.04,30,15,-1.011 +1,0.3,-0.04,30,25,-0.935 +1,0.3,-0.04,30,35,-0.666 +1,0.3,-0.04,37.1,-15,-0.064 +1,0.3,-0.04,37.1,-5,-0.436 +1,0.3,-0.04,37.1,5,-0.78 +1,0.3,-0.04,37.1,15,-1.096 +1,0.3,-0.04,37.1,25,-1.038 +1,0.3,-0.04,37.1,35,-0.819 +1,0.3,-0.03,12.1,-15,3.839 +1,0.3,-0.03,12.1,-5,2.409 +1,0.3,-0.03,12.1,5,1.156 +1,0.3,-0.03,12.1,15,0.08 +1,0.3,-0.03,12.1,25,0.263 +1,0.3,-0.03,12.1,35,1.016 +1,0.3,-0.03,18,-15,2.24 +1,0.3,-0.03,18,-5,1.326 +1,0.3,-0.03,18,5,0.515 +1,0.3,-0.03,18,15,-0.192 +1,0.3,-0.03,18,25,-0.069 +1,0.3,-0.03,18,35,0.426 +1,0.3,-0.03,25.2,-15,1.153 +1,0.3,-0.03,25.2,-5,0.617 +1,0.3,-0.03,25.2,5,0.123 +1,0.3,-0.03,25.2,15,-0.33 +1,0.3,-0.03,25.2,25,-0.237 +1,0.3,-0.03,25.2,35,0.086 +1,0.3,-0.03,30,-15,0.797 +1,0.3,-0.03,30,-5,0.354 +1,0.3,-0.03,30,5,-0.057 +1,0.3,-0.03,30,15,-0.437 +1,0.3,-0.03,30,25,-0.36 +1,0.3,-0.03,30,35,-0.091 +1,0.3,-0.03,37.1,-15,0.49 +1,0.3,-0.03,37.1,-5,0.119 +1,0.3,-0.03,37.1,5,-0.225 +1,0.3,-0.03,37.1,15,-0.541 +1,0.3,-0.03,37.1,25,-0.484 +1,0.3,-0.03,37.1,35,-0.264 +1,0.3,-0.02,12.1,-15,4.404 +1,0.3,-0.02,12.1,-5,2.974 +1,0.3,-0.02,12.1,5,1.721 +1,0.3,-0.02,12.1,15,0.645 +1,0.3,-0.02,12.1,25,0.828 +1,0.3,-0.02,12.1,35,1.581 +1,0.3,-0.02,18,-15,2.818 +1,0.3,-0.02,18,-5,1.904 +1,0.3,-0.02,18,5,1.093 +1,0.3,-0.02,18,15,0.386 +1,0.3,-0.02,18,25,0.509 +1,0.3,-0.02,18,35,1.004 +1,0.3,-0.02,25.2,-15,1.748 +1,0.3,-0.02,25.2,-5,1.212 +1,0.3,-0.02,25.2,5,0.718 +1,0.3,-0.02,25.2,15,0.265 +1,0.3,-0.02,25.2,25,0.358 +1,0.3,-0.02,25.2,35,0.681 +1,0.3,-0.02,30,-15,1.372 +1,0.3,-0.02,30,-5,0.929 +1,0.3,-0.02,30,5,0.518 +1,0.3,-0.02,30,15,0.139 +1,0.3,-0.02,30,25,0.215 +1,0.3,-0.02,30,35,0.484 +1,0.3,-0.02,37.1,-15,1.045 +1,0.3,-0.02,37.1,-5,0.674 +1,0.3,-0.02,37.1,5,0.33 +1,0.3,-0.02,37.1,15,0.013 +1,0.3,-0.02,37.1,25,0.071 +1,0.3,-0.02,37.1,35,0.291 +1,0.3,-0.01,12.1,-15,4.981 +1,0.3,-0.01,12.1,-5,3.551 +1,0.3,-0.01,12.1,5,2.297 +1,0.3,-0.01,12.1,15,1.221 +1,0.3,-0.01,12.1,25,1.404 +1,0.3,-0.01,12.1,35,2.156 +1,0.3,-0.01,18,-15,3.427 +1,0.3,-0.01,18,-5,2.511 +1,0.3,-0.01,18,5,1.699 +1,0.3,-0.01,18,15,0.991 +1,0.3,-0.01,18,25,1.114 +1,0.3,-0.01,18,35,1.608 +1,0.3,-0.01,25.2,-15,2.377 +1,0.3,-0.01,25.2,-5,1.84 +1,0.3,-0.01,25.2,5,1.344 +1,0.3,-0.01,25.2,15,0.89 +1,0.3,-0.01,25.2,25,0.982 +1,0.3,-0.01,25.2,35,1.305 +1,0.3,-0.01,30,-15,2.005 +1,0.3,-0.01,30,-5,1.56 +1,0.3,-0.01,30,5,1.147 +1,0.3,-0.01,30,15,0.766 +1,0.3,-0.01,30,25,0.84 +1,0.3,-0.01,30,35,1.108 +1,0.3,-0.01,37.1,-15,1.685 +1,0.3,-0.01,37.1,-5,1.31 +1,0.3,-0.01,37.1,5,0.964 +1,0.3,-0.01,37.1,15,0.645 +1,0.3,-0.01,37.1,25,0.7 +1,0.3,-0.01,37.1,35,0.917 +1,0.3,0,12.1,-15,5.641 +1,0.3,0,12.1,-5,4.211 +1,0.3,0,12.1,5,2.957 +1,0.3,0,12.1,15,1.88 +1,0.3,0,12.1,25,2.064 +1,0.3,0,12.1,35,2.815 +1,0.3,0,18,-15,4.106 +1,0.3,0,18,-5,3.191 +1,0.3,0,18,5,2.378 +1,0.3,0,18,15,1.671 +1,0.3,0,18,25,1.793 +1,0.3,0,18,35,2.287 +1,0.3,0,25.2,-15,3.062 +1,0.3,0,25.2,-5,2.525 +1,0.3,0,25.2,5,2.029 +1,0.3,0,25.2,15,1.575 +1,0.3,0,25.2,25,1.667 +1,0.3,0,25.2,35,1.99 +1,0.3,0,30,-15,2.708 +1,0.3,0,30,-5,2.263 +1,0.3,0,30,5,1.85 +1,0.3,0,30,15,1.469 +1,0.3,0,30,25,1.543 +1,0.3,0,30,35,1.811 +1,0.3,0,37.1,-15,2.408 +1,0.3,0,37.1,-5,2.033 +1,0.3,0,37.1,5,1.686 +1,0.3,0,37.1,15,1.367 +1,0.3,0,37.1,25,1.422 +1,0.3,0,37.1,35,1.639 +1,0.3,0.01,12.1,-15,6.301 +1,0.3,0.01,12.1,-5,4.871 +1,0.3,0.01,12.1,5,3.617 +1,0.3,0.01,12.1,15,2.541 +1,0.3,0.01,12.1,25,2.724 +1,0.3,0.01,12.1,35,3.476 +1,0.3,0.01,18,-15,4.787 +1,0.3,0.01,18,-5,3.871 +1,0.3,0.01,18,5,3.059 +1,0.3,0.01,18,15,2.351 +1,0.3,0.01,18,25,2.474 +1,0.3,0.01,18,35,2.968 +1,0.3,0.01,25.2,-15,3.748 +1,0.3,0.01,25.2,-5,3.21 +1,0.3,0.01,25.2,5,2.715 +1,0.3,0.01,25.2,15,2.261 +1,0.3,0.01,25.2,25,2.353 +1,0.3,0.01,25.2,35,2.675 +1,0.3,0.01,30,-15,3.412 +1,0.3,0.01,30,-5,2.967 +1,0.3,0.01,30,5,2.554 +1,0.3,0.01,30,15,2.173 +1,0.3,0.01,30,25,2.247 +1,0.3,0.01,30,35,2.514 +1,0.3,0.01,37.1,-15,3.13 +1,0.3,0.01,37.1,-5,2.755 +1,0.3,0.01,37.1,5,2.409 +1,0.3,0.01,37.1,15,2.09 +1,0.3,0.01,37.1,25,2.145 +1,0.3,0.01,37.1,35,2.362 +1,0.3,0.02,12.1,-15,6.962 +1,0.3,0.02,12.1,-5,5.532 +1,0.3,0.02,12.1,5,4.277 +1,0.3,0.02,12.1,15,3.201 +1,0.3,0.02,12.1,25,3.384 +1,0.3,0.02,12.1,35,4.136 +1,0.3,0.02,18,-15,5.467 +1,0.3,0.02,18,-5,4.552 +1,0.3,0.02,18,5,3.74 +1,0.3,0.02,18,15,3.032 +1,0.3,0.02,18,25,3.155 +1,0.3,0.02,18,35,3.648 +1,0.3,0.02,25.2,-15,4.433 +1,0.3,0.02,25.2,-5,3.896 +1,0.3,0.02,25.2,5,3.401 +1,0.3,0.02,25.2,15,2.947 +1,0.3,0.02,25.2,25,3.039 +1,0.3,0.02,25.2,35,3.361 +1,0.3,0.02,30,-15,4.116 +1,0.3,0.02,30,-5,3.67 +1,0.3,0.02,30,5,3.258 +1,0.3,0.02,30,15,2.876 +1,0.3,0.02,30,25,2.951 +1,0.3,0.02,30,35,3.218 +1,0.3,0.02,37.1,-15,3.853 +1,0.3,0.02,37.1,-5,3.478 +1,0.3,0.02,37.1,5,3.132 +1,0.3,0.02,37.1,15,2.813 +1,0.3,0.02,37.1,25,2.868 +1,0.3,0.02,37.1,35,3.085 +1,0.3,0.03,12.1,-15,7.622 +1,0.3,0.03,12.1,-5,6.192 +1,0.3,0.03,12.1,5,4.938 +1,0.3,0.03,12.1,15,3.861 +1,0.3,0.03,12.1,25,4.045 +1,0.3,0.03,12.1,35,4.797 +1,0.3,0.03,18,-15,6.148 +1,0.3,0.03,18,-5,5.232 +1,0.3,0.03,18,5,4.42 +1,0.3,0.03,18,15,3.712 +1,0.3,0.03,18,25,3.835 +1,0.3,0.03,18,35,4.329 +1,0.3,0.03,25.2,-15,5.12 +1,0.3,0.03,25.2,-5,4.583 +1,0.3,0.03,25.2,5,4.087 +1,0.3,0.03,25.2,15,3.633 +1,0.3,0.03,25.2,25,3.725 +1,0.3,0.03,25.2,35,4.048 +1,0.3,0.03,30,-15,4.82 +1,0.3,0.03,30,-5,4.375 +1,0.3,0.03,30,5,3.962 +1,0.3,0.03,30,15,3.58 +1,0.3,0.03,30,25,3.655 +1,0.3,0.03,30,35,3.922 +1,0.3,0.03,37.1,-15,4.576 +1,0.3,0.03,37.1,-5,4.201 +1,0.3,0.03,37.1,5,3.855 +1,0.3,0.03,37.1,15,3.536 +1,0.3,0.03,37.1,25,3.591 +1,0.3,0.03,37.1,35,3.808 +1,0.3,0.04,12.1,-15,8.283 +1,0.3,0.04,12.1,-5,6.852 +1,0.3,0.04,12.1,5,5.598 +1,0.3,0.04,12.1,15,4.522 +1,0.3,0.04,12.1,25,4.705 +1,0.3,0.04,12.1,35,5.457 +1,0.3,0.04,18,-15,6.828 +1,0.3,0.04,18,-5,5.913 +1,0.3,0.04,18,5,5.101 +1,0.3,0.04,18,15,4.393 +1,0.3,0.04,18,25,4.516 +1,0.3,0.04,18,35,5.01 +1,0.3,0.04,25.2,-15,5.807 +1,0.3,0.04,25.2,-5,5.27 +1,0.3,0.04,25.2,5,4.774 +1,0.3,0.04,25.2,15,4.32 +1,0.3,0.04,25.2,25,4.412 +1,0.3,0.04,25.2,35,4.735 +1,0.3,0.04,30,-15,5.524 +1,0.3,0.04,30,-5,5.079 +1,0.3,0.04,30,5,4.666 +1,0.3,0.04,30,15,4.285 +1,0.3,0.04,30,25,4.359 +1,0.3,0.04,30,35,4.626 +1,0.3,0.04,37.1,-15,5.299 +1,0.3,0.04,37.1,-5,4.924 +1,0.3,0.04,37.1,5,4.578 +1,0.3,0.04,37.1,15,4.259 +1,0.3,0.04,37.1,25,4.314 +1,0.3,0.04,37.1,35,4.531 +1,0.6,-0.04,12.1,-15,2.796 +1,0.6,-0.04,12.1,-5,1.366 +1,0.6,-0.04,12.1,5,0.112 +1,0.6,-0.04,12.1,15,-0.679 +1,0.6,-0.04,12.1,25,-0.295 +1,0.6,-0.04,12.1,35,0.54 +1,0.6,-0.04,18,-15,1.276 +1,0.6,-0.04,18,-5,0.362 +1,0.6,-0.04,18,5,-0.449 +1,0.6,-0.04,18,15,-0.963 +1,0.6,-0.04,18,25,-0.705 +1,0.6,-0.04,18,35,-0.154 +1,0.6,-0.04,25.2,-15,0.23 +1,0.6,-0.04,25.2,-5,-0.306 +1,0.6,-0.04,25.2,5,-0.8 +1,0.6,-0.04,25.2,15,-1.109 +1,0.6,-0.04,25.2,25,-0.927 +1,0.6,-0.04,25.2,35,-0.563 +1,0.6,-0.04,30,-15,-0.089 +1,0.6,-0.04,30,-5,-0.532 +1,0.6,-0.04,30,5,-0.943 +1,0.6,-0.04,30,15,-1.202 +1,0.6,-0.04,30,25,-1.05 +1,0.6,-0.04,30,35,-0.748 +1,0.6,-0.04,37.1,-15,-0.359 +1,0.6,-0.04,37.1,-5,-0.731 +1,0.6,-0.04,37.1,5,-1.075 +1,0.6,-0.04,37.1,15,-1.296 +1,0.6,-0.04,37.1,25,-1.175 +1,0.6,-0.04,37.1,35,-0.928 +1,0.6,-0.03,12.1,-15,3.43 +1,0.6,-0.03,12.1,-5,2.001 +1,0.6,-0.03,12.1,5,0.747 +1,0.6,-0.03,12.1,15,-0.044 +1,0.6,-0.03,12.1,25,0.339 +1,0.6,-0.03,12.1,35,1.175 +1,0.6,-0.03,18,-15,1.925 +1,0.6,-0.03,18,-5,1.011 +1,0.6,-0.03,18,5,0.2 +1,0.6,-0.03,18,15,-0.314 +1,0.6,-0.03,18,25,-0.056 +1,0.6,-0.03,18,35,0.495 +1,0.6,-0.03,25.2,-15,0.897 +1,0.6,-0.03,25.2,-5,0.361 +1,0.6,-0.03,25.2,5,-0.133 +1,0.6,-0.03,25.2,15,-0.442 +1,0.6,-0.03,25.2,25,-0.259 +1,0.6,-0.03,25.2,35,0.104 +1,0.6,-0.03,30,-15,0.556 +1,0.6,-0.03,30,-5,0.113 +1,0.6,-0.03,30,5,-0.298 +1,0.6,-0.03,30,15,-0.557 +1,0.6,-0.03,30,25,-0.405 +1,0.6,-0.03,30,35,-0.102 +1,0.6,-0.03,37.1,-15,0.264 +1,0.6,-0.03,37.1,-5,-0.108 +1,0.6,-0.03,37.1,5,-0.452 +1,0.6,-0.03,37.1,15,-0.673 +1,0.6,-0.03,37.1,25,-0.552 +1,0.6,-0.03,37.1,35,-0.305 +1,0.6,-0.02,12.1,-15,4.065 +1,0.6,-0.02,12.1,-5,2.635 +1,0.6,-0.02,12.1,5,1.381 +1,0.6,-0.02,12.1,15,0.59 +1,0.6,-0.02,12.1,25,0.974 +1,0.6,-0.02,12.1,35,1.809 +1,0.6,-0.02,18,-15,2.574 +1,0.6,-0.02,18,-5,1.66 +1,0.6,-0.02,18,5,0.849 +1,0.6,-0.02,18,15,0.335 +1,0.6,-0.02,18,25,0.593 +1,0.6,-0.02,18,35,1.144 +1,0.6,-0.02,25.2,-15,1.566 +1,0.6,-0.02,25.2,-5,1.03 +1,0.6,-0.02,25.2,5,0.536 +1,0.6,-0.02,25.2,15,0.227 +1,0.6,-0.02,25.2,25,0.409 +1,0.6,-0.02,25.2,35,0.773 +1,0.6,-0.02,30,-15,1.202 +1,0.6,-0.02,30,-5,0.759 +1,0.6,-0.02,30,5,0.348 +1,0.6,-0.02,30,15,0.089 +1,0.6,-0.02,30,25,0.241 +1,0.6,-0.02,30,35,0.544 +1,0.6,-0.02,37.1,-15,0.887 +1,0.6,-0.02,37.1,-5,0.515 +1,0.6,-0.02,37.1,5,0.171 +1,0.6,-0.02,37.1,15,-0.05 +1,0.6,-0.02,37.1,25,0.071 +1,0.6,-0.02,37.1,35,0.318 +1,0.6,-0.01,12.1,-15,4.712 +1,0.6,-0.01,12.1,-5,3.282 +1,0.6,-0.01,12.1,5,2.027 +1,0.6,-0.01,12.1,15,1.236 +1,0.6,-0.01,12.1,25,1.619 +1,0.6,-0.01,12.1,35,2.454 +1,0.6,-0.01,18,-15,3.254 +1,0.6,-0.01,18,-5,2.339 +1,0.6,-0.01,18,5,1.526 +1,0.6,-0.01,18,15,1.012 +1,0.6,-0.01,18,25,1.268 +1,0.6,-0.01,18,35,1.819 +1,0.6,-0.01,25.2,-15,2.268 +1,0.6,-0.01,25.2,-5,1.73 +1,0.6,-0.01,25.2,5,1.235 +1,0.6,-0.01,25.2,15,0.925 +1,0.6,-0.01,25.2,25,1.107 +1,0.6,-0.01,25.2,35,1.469 +1,0.6,-0.01,30,-15,1.906 +1,0.6,-0.01,30,-5,1.461 +1,0.6,-0.01,30,5,1.048 +1,0.6,-0.01,30,15,0.787 +1,0.6,-0.01,30,25,0.937 +1,0.6,-0.01,30,35,1.238 +1,0.6,-0.01,37.1,-15,1.595 +1,0.6,-0.01,37.1,-5,1.22 +1,0.6,-0.01,37.1,5,0.874 +1,0.6,-0.01,37.1,15,0.65 +1,0.6,-0.01,37.1,25,0.768 +1,0.6,-0.01,37.1,35,1.012 +1,0.6,0,12.1,-15,5.453 +1,0.6,0,12.1,-5,4.022 +1,0.6,0,12.1,5,2.768 +1,0.6,0,12.1,15,1.976 +1,0.6,0,12.1,25,2.36 +1,0.6,0,12.1,35,3.195 +1,0.6,0,18,-15,4.017 +1,0.6,0,18,-5,3.101 +1,0.6,0,18,5,2.289 +1,0.6,0,18,15,1.774 +1,0.6,0,18,25,2.031 +1,0.6,0,18,35,2.581 +1,0.6,0,25.2,-15,3.037 +1,0.6,0,25.2,-5,2.5 +1,0.6,0,25.2,5,2.005 +1,0.6,0,25.2,15,1.694 +1,0.6,0,25.2,25,1.876 +1,0.6,0,25.2,35,2.238 +1,0.6,0,30,-15,2.696 +1,0.6,0,30,-5,2.251 +1,0.6,0,30,5,1.838 +1,0.6,0,30,15,1.577 +1,0.6,0,30,25,1.727 +1,0.6,0,30,35,2.028 +1,0.6,0,37.1,-15,2.406 +1,0.6,0,37.1,-5,2.031 +1,0.6,0,37.1,5,1.685 +1,0.6,0,37.1,15,1.461 +1,0.6,0,37.1,25,1.579 +1,0.6,0,37.1,35,1.824 +1,0.6,0.01,12.1,-15,6.194 +1,0.6,0.01,12.1,-5,4.764 +1,0.6,0.01,12.1,5,3.51 +1,0.6,0.01,12.1,15,2.718 +1,0.6,0.01,12.1,25,3.102 +1,0.6,0.01,12.1,35,3.937 +1,0.6,0.01,18,-15,4.781 +1,0.6,0.01,18,-5,3.866 +1,0.6,0.01,18,5,3.054 +1,0.6,0.01,18,15,2.539 +1,0.6,0.01,18,25,2.796 +1,0.6,0.01,18,35,3.346 +1,0.6,0.01,25.2,-15,3.807 +1,0.6,0.01,25.2,-5,3.27 +1,0.6,0.01,25.2,5,2.775 +1,0.6,0.01,25.2,15,2.465 +1,0.6,0.01,25.2,25,2.646 +1,0.6,0.01,25.2,35,3.009 +1,0.6,0.01,30,-15,3.486 +1,0.6,0.01,30,-5,3.041 +1,0.6,0.01,30,5,2.628 +1,0.6,0.01,30,15,2.367 +1,0.6,0.01,30,25,2.517 +1,0.6,0.01,30,35,2.818 +1,0.6,0.01,37.1,-15,3.218 +1,0.6,0.01,37.1,-5,2.843 +1,0.6,0.01,37.1,5,2.496 +1,0.6,0.01,37.1,15,2.272 +1,0.6,0.01,37.1,25,2.391 +1,0.6,0.01,37.1,35,2.635 +1,0.6,0.02,12.1,-15,6.936 +1,0.6,0.02,12.1,-5,5.506 +1,0.6,0.02,12.1,5,4.252 +1,0.6,0.02,12.1,15,3.46 +1,0.6,0.02,12.1,25,3.843 +1,0.6,0.02,12.1,35,4.678 +1,0.6,0.02,18,-15,5.546 +1,0.6,0.02,18,-5,4.63 +1,0.6,0.02,18,5,3.818 +1,0.6,0.02,18,15,3.303 +1,0.6,0.02,18,25,3.56 +1,0.6,0.02,18,35,4.11 +1,0.6,0.02,25.2,-15,4.577 +1,0.6,0.02,25.2,-5,4.04 +1,0.6,0.02,25.2,5,3.545 +1,0.6,0.02,25.2,15,3.235 +1,0.6,0.02,25.2,25,3.416 +1,0.6,0.02,25.2,35,3.779 +1,0.6,0.02,30,-15,4.276 +1,0.6,0.02,30,-5,3.831 +1,0.6,0.02,30,5,3.418 +1,0.6,0.02,30,15,3.157 +1,0.6,0.02,30,25,3.307 +1,0.6,0.02,30,35,3.608 +1,0.6,0.02,37.1,-15,4.03 +1,0.6,0.02,37.1,-5,3.655 +1,0.6,0.02,37.1,5,3.308 +1,0.6,0.02,37.1,15,3.084 +1,0.6,0.02,37.1,25,3.203 +1,0.6,0.02,37.1,35,3.447 +1,0.6,0.03,12.1,-15,7.678 +1,0.6,0.03,12.1,-5,6.247 +1,0.6,0.03,12.1,5,4.993 +1,0.6,0.03,12.1,15,4.202 +1,0.6,0.03,12.1,25,4.585 +1,0.6,0.03,12.1,35,5.42 +1,0.6,0.03,18,-15,6.31 +1,0.6,0.03,18,-5,5.394 +1,0.6,0.03,18,5,4.582 +1,0.6,0.03,18,15,4.068 +1,0.6,0.03,18,25,4.324 +1,0.6,0.03,18,35,4.874 +1,0.6,0.03,25.2,-15,5.348 +1,0.6,0.03,25.2,-5,4.811 +1,0.6,0.03,25.2,5,4.316 +1,0.6,0.03,25.2,15,4.006 +1,0.6,0.03,25.2,25,4.187 +1,0.6,0.03,25.2,35,4.55 +1,0.6,0.03,30,-15,5.067 +1,0.6,0.03,30,-5,4.622 +1,0.6,0.03,30,5,4.209 +1,0.6,0.03,30,15,3.948 +1,0.6,0.03,30,25,4.098 +1,0.6,0.03,30,35,4.399 +1,0.6,0.03,37.1,-15,4.842 +1,0.6,0.03,37.1,-5,4.467 +1,0.6,0.03,37.1,5,4.12 +1,0.6,0.03,37.1,15,3.896 +1,0.6,0.03,37.1,25,4.015 +1,0.6,0.03,37.1,35,4.259 +1,0.6,0.04,12.1,-15,8.419 +1,0.6,0.04,12.1,-5,6.989 +1,0.6,0.04,12.1,5,5.735 +1,0.6,0.04,12.1,15,4.943 +1,0.6,0.04,12.1,25,5.326 +1,0.6,0.04,12.1,35,6.162 +1,0.6,0.04,18,-15,7.074 +1,0.6,0.04,18,-5,6.159 +1,0.6,0.04,18,5,5.347 +1,0.6,0.04,18,15,4.832 +1,0.6,0.04,18,25,5.089 +1,0.6,0.04,18,35,5.639 +1,0.6,0.04,25.2,-15,6.12 +1,0.6,0.04,25.2,-5,5.582 +1,0.6,0.04,25.2,5,5.087 +1,0.6,0.04,25.2,15,4.777 +1,0.6,0.04,25.2,25,4.958 +1,0.6,0.04,25.2,35,5.321 +1,0.6,0.04,30,-15,5.858 +1,0.6,0.04,30,-5,5.413 +1,0.6,0.04,30,5,5 +1,0.6,0.04,30,15,4.739 +1,0.6,0.04,30,25,4.889 +1,0.6,0.04,30,35,5.19 +1,0.6,0.04,37.1,-15,5.654 +1,0.6,0.04,37.1,-5,5.279 +1,0.6,0.04,37.1,5,4.932 +1,0.6,0.04,37.1,15,4.708 +1,0.6,0.04,37.1,25,4.827 +1,0.6,0.04,37.1,35,5.071 +1,0.9,-0.04,12.1,-15,2.318 +1,0.9,-0.04,12.1,-5,0.888 +1,0.9,-0.04,12.1,5,-0.366 +1,0.9,-0.04,12.1,15,-0.786 +1,0.9,-0.04,12.1,25,-0.289 +1,0.9,-0.04,12.1,35,0.63 +1,0.9,-0.04,18,-15,0.89 +1,0.9,-0.04,18,-5,-0.025 +1,0.9,-0.04,18,5,-0.836 +1,0.9,-0.04,18,15,-1.097 +1,0.9,-0.04,18,25,-0.764 +1,0.9,-0.04,18,35,-0.157 +1,0.9,-0.04,25.2,-15,-0.099 +1,0.9,-0.04,25.2,-5,-0.635 +1,0.9,-0.04,25.2,5,-1.129 +1,0.9,-0.04,25.2,15,-1.254 +1,0.9,-0.04,25.2,25,-1.022 +1,0.9,-0.04,25.2,35,-0.618 +1,0.9,-0.04,30,-15,-0.4 +1,0.9,-0.04,30,-5,-0.843 +1,0.9,-0.04,30,5,-1.254 +1,0.9,-0.04,30,15,-1.359 +1,0.9,-0.04,30,25,-1.166 +1,0.9,-0.04,30,35,-0.829 +1,0.9,-0.04,37.1,-15,-0.654 +1,0.9,-0.04,37.1,-5,-1.026 +1,0.9,-0.04,37.1,5,-1.37 +1,0.9,-0.04,37.1,15,-1.466 +1,0.9,-0.04,37.1,25,-1.311 +1,0.9,-0.04,37.1,35,-1.037 +1,0.9,-0.03,12.1,-15,3.022 +1,0.9,-0.03,12.1,-5,1.592 +1,0.9,-0.03,12.1,5,0.338 +1,0.9,-0.03,12.1,15,-0.082 +1,0.9,-0.03,12.1,25,0.415 +1,0.9,-0.03,12.1,35,1.334 +1,0.9,-0.03,18,-15,1.61 +1,0.9,-0.03,18,-5,0.696 +1,0.9,-0.03,18,5,-0.115 +1,0.9,-0.03,18,15,-0.377 +1,0.9,-0.03,18,25,-0.044 +1,0.9,-0.03,18,35,0.563 +1,0.9,-0.03,25.2,-15,0.642 +1,0.9,-0.03,25.2,-5,0.106 +1,0.9,-0.03,25.2,5,-0.388 +1,0.9,-0.03,25.2,15,-0.513 +1,0.9,-0.03,25.2,25,-0.281 +1,0.9,-0.03,25.2,35,0.122 +1,0.9,-0.03,30,-15,0.316 +1,0.9,-0.03,30,-5,-0.127 +1,0.9,-0.03,30,5,-0.538 +1,0.9,-0.03,30,15,-0.643 +1,0.9,-0.03,30,25,-0.45 +1,0.9,-0.03,30,35,-0.113 +1,0.9,-0.03,37.1,-15,0.037 +1,0.9,-0.03,37.1,-5,-0.335 +1,0.9,-0.03,37.1,5,-0.678 +1,0.9,-0.03,37.1,15,-0.775 +1,0.9,-0.03,37.1,25,-0.62 +1,0.9,-0.03,37.1,35,-0.346 +1,0.9,-0.02,12.1,-15,3.726 +1,0.9,-0.02,12.1,-5,2.296 +1,0.9,-0.02,12.1,5,1.042 +1,0.9,-0.02,12.1,15,0.622 +1,0.9,-0.02,12.1,25,1.119 +1,0.9,-0.02,12.1,35,2.038 +1,0.9,-0.02,18,-15,2.33 +1,0.9,-0.02,18,-5,1.416 +1,0.9,-0.02,18,5,0.605 +1,0.9,-0.02,18,15,0.343 +1,0.9,-0.02,18,25,0.676 +1,0.9,-0.02,18,35,1.283 +1,0.9,-0.02,25.2,-15,1.383 +1,0.9,-0.02,25.2,-5,0.847 +1,0.9,-0.02,25.2,5,0.353 +1,0.9,-0.02,25.2,15,0.228 +1,0.9,-0.02,25.2,25,0.46 +1,0.9,-0.02,25.2,35,0.864 +1,0.9,-0.02,30,-15,1.032 +1,0.9,-0.02,30,-5,0.589 +1,0.9,-0.02,30,5,0.178 +1,0.9,-0.02,30,15,0.074 +1,0.9,-0.02,30,25,0.267 +1,0.9,-0.02,30,35,0.603 +1,0.9,-0.02,37.1,-15,0.728 +1,0.9,-0.02,37.1,-5,0.357 +1,0.9,-0.02,37.1,5,0.013 +1,0.9,-0.02,37.1,15,-0.084 +1,0.9,-0.02,37.1,25,0.071 +1,0.9,-0.02,37.1,35,0.345 +1,0.9,-0.01,12.1,-15,4.442 +1,0.9,-0.01,12.1,-5,3.012 +1,0.9,-0.01,12.1,5,1.758 +1,0.9,-0.01,12.1,15,1.337 +1,0.9,-0.01,12.1,25,1.834 +1,0.9,-0.01,12.1,35,2.753 +1,0.9,-0.01,18,-15,3.081 +1,0.9,-0.01,18,-5,2.166 +1,0.9,-0.01,18,5,1.354 +1,0.9,-0.01,18,15,1.091 +1,0.9,-0.01,18,25,1.423 +1,0.9,-0.01,18,35,2.029 +1,0.9,-0.01,25.2,-15,2.158 +1,0.9,-0.01,25.2,-5,1.621 +1,0.9,-0.01,25.2,5,1.126 +1,0.9,-0.01,25.2,15,1 +1,0.9,-0.01,25.2,25,1.231 +1,0.9,-0.01,25.2,35,1.634 +1,0.9,-0.01,30,-15,1.807 +1,0.9,-0.01,30,-5,1.362 +1,0.9,-0.01,30,5,0.949 +1,0.9,-0.01,30,15,0.843 +1,0.9,-0.01,30,25,1.034 +1,0.9,-0.01,30,35,1.369 +1,0.9,-0.01,37.1,-15,1.505 +1,0.9,-0.01,37.1,-5,1.13 +1,0.9,-0.01,37.1,5,0.783 +1,0.9,-0.01,37.1,15,0.684 +1,0.9,-0.01,37.1,25,0.836 +1,0.9,-0.01,37.1,35,1.108 +1,0.9,0,12.1,-15,5.264 +1,0.9,0,12.1,-5,3.834 +1,0.9,0,12.1,5,2.58 +1,0.9,0,12.1,15,2.159 +1,0.9,0,12.1,25,2.656 +1,0.9,0,12.1,35,3.574 +1,0.9,0,18,-15,3.927 +1,0.9,0,18,-5,3.012 +1,0.9,0,18,5,2.2 +1,0.9,0,18,15,1.937 +1,0.9,0,18,25,2.269 +1,0.9,0,18,35,2.875 +1,0.9,0,25.2,-15,3.012 +1,0.9,0,25.2,-5,2.475 +1,0.9,0,25.2,5,1.98 +1,0.9,0,25.2,15,1.854 +1,0.9,0,25.2,25,2.084 +1,0.9,0,25.2,35,2.487 +1,0.9,0,30,-15,2.683 +1,0.9,0,30,-5,2.238 +1,0.9,0,30,5,1.825 +1,0.9,0,30,15,1.719 +1,0.9,0,30,25,1.91 +1,0.9,0,30,35,2.245 +1,0.9,0,37.1,-15,2.405 +1,0.9,0,37.1,-5,2.03 +1,0.9,0,37.1,5,1.684 +1,0.9,0,37.1,15,1.584 +1,0.9,0,37.1,25,1.736 +1,0.9,0,37.1,35,2.008 +1,0.9,0.01,12.1,-15,6.087 +1,0.9,0.01,12.1,-5,4.657 +1,0.9,0.01,12.1,5,3.403 +1,0.9,0.01,12.1,15,2.982 +1,0.9,0.01,12.1,25,3.479 +1,0.9,0.01,12.1,35,4.397 +1,0.9,0.01,18,-15,4.776 +1,0.9,0.01,18,-5,3.86 +1,0.9,0.01,18,5,3.048 +1,0.9,0.01,18,15,2.786 +1,0.9,0.01,18,25,3.117 +1,0.9,0.01,18,35,3.724 +1,0.9,0.01,25.2,-15,3.867 +1,0.9,0.01,25.2,-5,3.329 +1,0.9,0.01,25.2,5,2.834 +1,0.9,0.01,25.2,15,2.708 +1,0.9,0.01,25.2,25,2.939 +1,0.9,0.01,25.2,35,3.342 +1,0.9,0.01,30,-15,3.56 +1,0.9,0.01,30,-5,3.115 +1,0.9,0.01,30,5,2.702 +1,0.9,0.01,30,15,2.596 +1,0.9,0.01,30,25,2.787 +1,0.9,0.01,30,35,3.122 +1,0.9,0.01,37.1,-15,3.306 +1,0.9,0.01,37.1,-5,2.931 +1,0.9,0.01,37.1,5,2.584 +1,0.9,0.01,37.1,15,2.484 +1,0.9,0.01,37.1,25,2.637 +1,0.9,0.01,37.1,35,2.908 +1,0.9,0.02,12.1,-15,6.91 +1,0.9,0.02,12.1,-5,5.48 +1,0.9,0.02,12.1,5,4.226 +1,0.9,0.02,12.1,15,3.805 +1,0.9,0.02,12.1,25,4.302 +1,0.9,0.02,12.1,35,5.22 +1,0.9,0.02,18,-15,5.624 +1,0.9,0.02,18,-5,4.708 +1,0.9,0.02,18,5,3.896 +1,0.9,0.02,18,15,3.634 +1,0.9,0.02,18,25,3.965 +1,0.9,0.02,18,35,4.572 +1,0.9,0.02,25.2,-15,4.721 +1,0.9,0.02,25.2,-5,4.184 +1,0.9,0.02,25.2,5,3.689 +1,0.9,0.02,25.2,15,3.563 +1,0.9,0.02,25.2,25,3.793 +1,0.9,0.02,25.2,35,4.196 +1,0.9,0.02,30,-15,4.437 +1,0.9,0.02,30,-5,3.992 +1,0.9,0.02,30,5,3.579 +1,0.9,0.02,30,15,3.473 +1,0.9,0.02,30,25,3.664 +1,0.9,0.02,30,35,3.999 +1,0.9,0.02,37.1,-15,4.207 +1,0.9,0.02,37.1,-5,3.832 +1,0.9,0.02,37.1,5,3.485 +1,0.9,0.02,37.1,15,3.385 +1,0.9,0.02,37.1,25,3.538 +1,0.9,0.02,37.1,35,3.809 +1,0.9,0.03,12.1,-15,7.733 +1,0.9,0.03,12.1,-5,6.303 +1,0.9,0.03,12.1,5,5.049 +1,0.9,0.03,12.1,15,4.628 +1,0.9,0.03,12.1,25,5.125 +1,0.9,0.03,12.1,35,6.043 +1,0.9,0.03,18,-15,6.472 +1,0.9,0.03,18,-5,5.556 +1,0.9,0.03,18,5,4.744 +1,0.9,0.03,18,15,4.482 +1,0.9,0.03,18,25,4.813 +1,0.9,0.03,18,35,5.42 +1,0.9,0.03,25.2,-15,5.576 +1,0.9,0.03,25.2,-5,5.039 +1,0.9,0.03,25.2,5,4.544 +1,0.9,0.03,25.2,15,4.418 +1,0.9,0.03,25.2,25,4.649 +1,0.9,0.03,25.2,35,5.052 +1,0.9,0.03,30,-15,5.314 +1,0.9,0.03,30,-5,4.869 +1,0.9,0.03,30,5,4.456 +1,0.9,0.03,30,15,4.35 +1,0.9,0.03,30,25,4.541 +1,0.9,0.03,30,35,4.876 +1,0.9,0.03,37.1,-15,5.108 +1,0.9,0.03,37.1,-5,4.733 +1,0.9,0.03,37.1,5,4.386 +1,0.9,0.03,37.1,15,4.286 +1,0.9,0.03,37.1,25,4.439 +1,0.9,0.03,37.1,35,4.71 +1,0.9,0.04,12.1,-15,8.556 +1,0.9,0.04,12.1,-5,7.126 +1,0.9,0.04,12.1,5,5.871 +1,0.9,0.04,12.1,15,5.451 +1,0.9,0.04,12.1,25,5.948 +1,0.9,0.04,12.1,35,6.866 +1,0.9,0.04,18,-15,7.32 +1,0.9,0.04,18,-5,6.404 +1,0.9,0.04,18,5,5.592 +1,0.9,0.04,18,15,5.33 +1,0.9,0.04,18,25,5.661 +1,0.9,0.04,18,35,6.268 +1,0.9,0.04,25.2,-15,6.432 +1,0.9,0.04,25.2,-5,5.895 +1,0.9,0.04,25.2,5,5.4 +1,0.9,0.04,25.2,15,5.274 +1,0.9,0.04,25.2,25,5.505 +1,0.9,0.04,25.2,35,5.907 +1,0.9,0.04,30,-15,6.192 +1,0.9,0.04,30,-5,5.747 +1,0.9,0.04,30,5,5.334 +1,0.9,0.04,30,15,5.228 +1,0.9,0.04,30,25,5.419 +1,0.9,0.04,30,35,5.754 +1,0.9,0.04,37.1,-15,6.008 +1,0.9,0.04,37.1,-5,5.633 +1,0.9,0.04,37.1,5,5.287 +1,0.9,0.04,37.1,15,5.187 +1,0.9,0.04,37.1,25,5.34 +1,0.9,0.04,37.1,35,5.611 diff --git a/data/examples/energy_consumption_example_old.csv b/data/examples/energy_consumption_example_old.csv new file mode 100644 index 00000000..0579860e --- /dev/null +++ b/data/examples/energy_consumption_example_old.csv @@ -0,0 +1,23 @@ +Temp.,Alle,Kat. A,Kat. B,Kat. C +-8,2.07,2.2,2.04,1.71 +-6,1.9,2.03,1.76,1.59 +-4,1.81,1.89,1.75,1.58 +-2,1.78,1.86,1.65,1.49 +0,1.65,1.73,1.6,1.44 +2,1.61,1.67,1.57,1.38 +4,1.54,1.6,1.48,1.31 +6,1.47,1.52,1.44,1.25 +8,1.4,1.45,1.38,1.19 +10,1.33,1.37,1.3,1.16 +12,1.29,1.32,1.27,1.1 +14,1.2,1.23,1.17,1.04 +16,1.09,1.13,1.06,0.96 +18,1.06,1.08,1.03,0.93 +20,1.04,1.07,1.00,0.92 +22,1.08,1.11,1.03,0.93 +24,1.16,1.19,1.12,0.96 +26,1.23,1.27,1.2,1.03 +28,1.31,1.34,1.25,1.06 +30,1.43,1.46,1.38,1.11 +32,1.44,1.47,1.42,1.17 +34,1.53,1.57,1.45,1.24 diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 8f977cb9..e5fad4a5 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,5 +1,8 @@ import numpy as np import csv +import pandas as pd + +from scipy.interpolate import interpn class Consumption: @@ -12,23 +15,40 @@ def __init__(self, vehicle_types, **kwargs) -> None: for row in reader: self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) + with open(kwargs.get("level_of_loading_over_day", "data/examples/default_level_of_loading_over_day.csv")) as f: + reader = csv.DictReader(f) + self.lol_by_hour = {} + for row in reader: + self.lol_by_hour.update({int(row['hour']): float(row['level_of_loading'])}) + self.consumption_files = {} self.vehicle_types = vehicle_types - def calculate_consumption(self, time, distance, vehicle_type, charging_type): + def calculate_consumption(self, time, distance, vehicle_type, charging_type, + height_difference=0, level_of_loading=None, mean_speed=18): """ Calculates consumed amount of energy for a given distance. :param time: The date and time at which the trip ends :type time: datetime.datetime - :param distance: Distance travelled [km] + + # Is Distance traveled in km correct? seems to be in m + :param distance: Distance travelled [m] :type distance: float :param vehicle_type: The vehicle type for which to calculate consumption :type vehicle_type: str :param charging_type: Charging type for the trip. Consumption differs between distinct types. :type charging_type: str - :return: Consumed energy [kWh] and delta SOC as tuple - :rtype: (float, float) + :param height_difference: difference in height between stations in meters- + :type height_difference: float + :param level_of_loading: Level of loading of the bus between empty (=0) and completely full (=1.0). If None + is provided, Level of loading will be interpolated from timeseries + :type level_of_loading: float + :param mean_speed: Mean speed between two stops in km/h + :type mean_speed: float + + :return: Consumed energy [kWh] + :rtype: float """ # the charging type may not be set @@ -47,25 +67,58 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): list(self.temperatures_by_hour.keys()), list(self.temperatures_by_hour.values())) + # If no specific LoL is given, interpolate from demand time series. + if level_of_loading is None: + level_of_loading = np.interp(time.hour, + list(self.lol_by_hour.keys()), + list(self.lol_by_hour.values())) + # load consumption csv consumption_file = self.vehicle_types[vt_ct]["mileage"] + + # Consumption_files holds interpol functions of csv files which are called directly and held in memory + vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] try: - consumption = self.consumption_files[consumption_file] + mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, + incline=height_difference / distance, + temp=temp, + lol=level_of_loading, + speed=mean_speed) + return mileage * distance except KeyError: - consumption = {'temperature': [], 'consumption': []} - with open(consumption_file, 'r') as f: - reader = csv.DictReader(f) - for row in reader: - consumption['temperature'].append(float(row['Temp.'])) - consumption['consumption'].append(float(row['Kat. B'])) - self.consumption_files.update({consumption_file: consumption}) - - xp = self.consumption_files[consumption_file]['temperature'] - fp = self.consumption_files[consumption_file]['consumption'] - - mileage = np.interp(temp, xp, fp) # kWh / m - consumed_energy = mileage * distance / 1000 # kWh + # Creating the interpol function from csv file. + df = pd.read_csv(consumption_file, sep=",") + vehicle_type_u = list(df["vehicle_type"].unique()) + incline_u = list(df["incline"].unique()) + temp_u = list(df["temp"].unique()) + lol_u = list(df["level_of_loading"].unique()) + speed_u = list(df["mean_speed_kmh"].unique()) + points = (vehicle_type_u, incline_u, temp_u, lol_u, speed_u) + values = np.zeros((len(vehicle_type_u), len(incline_u), len(temp_u), len(lol_u), len(speed_u))) + + # Nested loops for creating values in grid + for i, vt in enumerate(vehicle_type_u): + for ii, inc in enumerate(incline_u): + for iii, temp in enumerate(temp_u): + for iv, lol in enumerate(lol_u): + for v, speed in enumerate(speed_u): + values[i, ii, iii, iv, v] = df[(df["vehicle_type"] == vt) * (df["incline"] == inc) * + (df["temp"] == temp) * (df["level_of_loading"] == lol) * + (df["mean_speed_kmh"] == speed)][ + "consumption_kwh_per_km"] + def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this_speed): + point = (this_vehicle_type, this_incline, this_temp, this_lol, this_speed) + return interpn(points, values, point)[0] + + self.consumption_files.update({consumption_file: interpol_function}) + + mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, + incline=height_difference / distance, + temp=temp, + lol=level_of_loading, + speed=mean_speed) + consumed_energy = mileage * distance / 1000 # kWh return consumed_energy def get_delta_soc(self, consumed_energy, vehicle_type, charging_type): diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index f9806d7d..be5a10be 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -288,7 +288,9 @@ def generate_scenario(self, args): # filter all rides for that bus vehicle_rotations = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} # sort events for their departure time, so that the matching departure time of an - # arrival event can be read out of the next element in vid_list + # arrival event can be read out of the + # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + # element in vid_list vehicle_rotations = {k: v for k, v in sorted( vehicle_rotations.items(), key=lambda x: x[1].departure_time)} rotation_ids = list(vehicle_rotations.keys()) diff --git a/s b/s new file mode 100644 index 00000000..173d1a4e --- /dev/null +++ b/s @@ -0,0 +1,2339 @@ +diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv +index 0579860..ff569e7 100644 +--- a/data/examples/energy_consumption_example.csv ++++ b/data/examples/energy_consumption_example.csv +@@ -1,23 +1,2161 @@ +-Temp.,Alle,Kat. A,Kat. B,Kat. C +--8,2.07,2.2,2.04,1.71 +--6,1.9,2.03,1.76,1.59 +--4,1.81,1.89,1.75,1.58 +--2,1.78,1.86,1.65,1.49 +-0,1.65,1.73,1.6,1.44 +-2,1.61,1.67,1.57,1.38 +-4,1.54,1.6,1.48,1.31 +-6,1.47,1.52,1.44,1.25 +-8,1.4,1.45,1.38,1.19 +-10,1.33,1.37,1.3,1.16 +-12,1.29,1.32,1.27,1.1 +-14,1.2,1.23,1.17,1.04 +-16,1.09,1.13,1.06,0.96 +-18,1.06,1.08,1.03,0.93 +-20,1.04,1.07,1.00,0.92 +-22,1.08,1.11,1.03,0.93 +-24,1.16,1.19,1.12,0.96 +-26,1.23,1.27,1.2,1.03 +-28,1.31,1.34,1.25,1.06 +-30,1.43,1.46,1.38,1.11 +-32,1.44,1.47,1.42,1.17 +-34,1.53,1.57,1.45,1.24 ++vehicle_type,level_of_loading,incline,mean_speed_kmh,temp,consumption_kwh_per_km ++0,0,-0.04,12.1,-15,2.967 ++0,0,-0.04,12.1,-5,1.823 ++0,0,-0.04,12.1,5,0.844 ++0,0,-0.04,12.1,15,0.034 ++0,0,-0.04,12.1,25,-0.181 ++0,0,-0.04,12.1,35,0.314 ++0,0,-0.04,18,-15,1.658 ++0,0,-0.04,18,-5,0.939 ++0,0,-0.04,18,5,0.317 ++0,0,-0.04,18,15,-0.208 ++0,0,-0.04,18,25,-0.353 ++0,0,-0.04,18,35,-0.034 ++0,0,-0.04,25.2,-15,0.724 ++0,0,-0.04,25.2,-5,0.33 ++0,0,-0.04,25.2,5,-0.026 ++0,0,-0.04,25.2,15,-0.347 ++0,0,-0.04,25.2,25,-0.445 ++0,0,-0.04,25.2,35,-0.248 ++0,0,-0.04,30,-15,0.476 ++0,0,-0.04,30,-5,0.153 ++0,0,-0.04,30,5,-0.141 ++0,0,-0.04,30,15,-0.408 ++0,0,-0.04,30,25,-0.492 ++0,0,-0.04,30,35,-0.33 ++0,0,-0.04,37.1,-15,0.281 ++0,0,-0.04,37.1,-5,0.008 ++0,0,-0.04,37.1,5,-0.241 ++0,0,-0.04,37.1,15,-0.465 ++0,0,-0.04,37.1,25,-0.536 ++0,0,-0.04,37.1,35,-0.404 ++0,0,-0.03,12.1,-15,3.297 ++0,0,-0.03,12.1,-5,2.153 ++0,0,-0.03,12.1,5,1.175 ++0,0,-0.03,12.1,15,0.365 ++0,0,-0.03,12.1,25,0.149 ++0,0,-0.03,12.1,35,0.644 ++0,0,-0.03,18,-15,1.996 ++0,0,-0.03,18,-5,1.277 ++0,0,-0.03,18,5,0.654 ++0,0,-0.03,18,15,0.13 ++0,0,-0.03,18,25,-0.015 ++0,0,-0.03,18,35,0.304 ++0,0,-0.03,25.2,-15,1.072 ++0,0,-0.03,25.2,-5,0.678 ++0,0,-0.03,25.2,5,0.321 ++0,0,-0.03,25.2,15,0.001 ++0,0,-0.03,25.2,25,-0.097 ++0,0,-0.03,25.2,35,0.099 ++0,0,-0.03,30,-15,0.812 ++0,0,-0.03,30,-5,0.489 ++0,0,-0.03,30,5,0.195 ++0,0,-0.03,30,15,-0.072 ++0,0,-0.03,30,25,-0.156 ++0,0,-0.03,30,35,0.006 ++0,0,-0.03,37.1,-15,0.606 ++0,0,-0.03,37.1,-5,0.332 ++0,0,-0.03,37.1,5,0.084 ++0,0,-0.03,37.1,15,-0.14 ++0,0,-0.03,37.1,25,-0.212 ++0,0,-0.03,37.1,35,-0.08 ++0,0,-0.02,12.1,-15,3.628 ++0,0,-0.02,12.1,-5,2.484 ++0,0,-0.02,12.1,5,1.505 ++0,0,-0.02,12.1,15,0.695 ++0,0,-0.02,12.1,25,0.48 ++0,0,-0.02,12.1,35,0.974 ++0,0,-0.02,18,-15,2.334 ++0,0,-0.02,18,-5,1.615 ++0,0,-0.02,18,5,0.992 ++0,0,-0.02,18,15,0.467 ++0,0,-0.02,18,25,0.322 ++0,0,-0.02,18,35,0.642 ++0,0,-0.02,25.2,-15,1.42 ++0,0,-0.02,25.2,-5,1.026 ++0,0,-0.02,25.2,5,0.669 ++0,0,-0.02,25.2,15,0.349 ++0,0,-0.02,25.2,25,0.251 ++0,0,-0.02,25.2,35,0.447 ++0,0,-0.02,30,-15,1.148 ++0,0,-0.02,30,-5,0.826 ++0,0,-0.02,30,5,0.531 ++0,0,-0.02,30,15,0.264 ++0,0,-0.02,30,25,0.18 ++0,0,-0.02,30,35,0.342 ++0,0,-0.02,37.1,-15,0.93 ++0,0,-0.02,37.1,-5,0.657 ++0,0,-0.02,37.1,5,0.408 ++0,0,-0.02,37.1,15,0.184 ++0,0,-0.02,37.1,25,0.113 ++0,0,-0.02,37.1,35,0.245 ++0,0,-0.01,12.1,-15,3.97 ++0,0,-0.01,12.1,-5,2.826 ++0,0,-0.01,12.1,5,1.847 ++0,0,-0.01,12.1,15,1.036 ++0,0,-0.01,12.1,25,0.82 ++0,0,-0.01,12.1,35,1.315 ++0,0,-0.01,18,-15,2.702 ++0,0,-0.01,18,-5,1.982 ++0,0,-0.01,18,5,1.358 ++0,0,-0.01,18,15,0.833 ++0,0,-0.01,18,25,0.687 ++0,0,-0.01,18,35,1.005 ++0,0,-0.01,25.2,-15,1.8 ++0,0,-0.01,25.2,-5,1.406 ++0,0,-0.01,25.2,5,1.048 ++0,0,-0.01,25.2,15,0.726 ++0,0,-0.01,25.2,25,0.627 ++0,0,-0.01,25.2,35,0.823 ++0,0,-0.01,30,-15,1.541 ++0,0,-0.01,30,-5,1.217 ++0,0,-0.01,30,5,0.92 ++0,0,-0.01,30,15,0.651 ++0,0,-0.01,30,25,0.566 ++0,0,-0.01,30,35,0.726 ++0,0,-0.01,37.1,-15,1.338 ++0,0,-0.01,37.1,-5,1.062 ++0,0,-0.01,37.1,5,0.81 ++0,0,-0.01,37.1,15,0.583 ++0,0,-0.01,37.1,25,0.51 ++0,0,-0.01,37.1,35,0.639 ++0,0,0,12.1,-15,4.356 ++0,0,0,12.1,-5,3.211 ++0,0,0,12.1,5,2.232 ++0,0,0,12.1,15,1.422 ++0,0,0,12.1,25,1.206 ++0,0,0,12.1,35,1.7 ++0,0,0,18,-15,3.099 ++0,0,0,18,-5,2.379 ++0,0,0,18,5,1.756 ++0,0,0,18,15,1.23 ++0,0,0,18,25,1.084 ++0,0,0,18,35,1.402 ++0,0,0,25.2,-15,2.201 ++0,0,0,25.2,-5,1.806 ++0,0,0,25.2,5,1.448 ++0,0,0,25.2,15,1.127 ++0,0,0,25.2,25,1.028 ++0,0,0,25.2,35,1.223 ++0,0,0,30,-15,1.953 ++0,0,0,30,-5,1.628 ++0,0,0,30,5,1.331 ++0,0,0,30,15,1.062 ++0,0,0,30,25,0.977 ++0,0,0,30,35,1.137 ++0,0,0,37.1,-15,1.76 ++0,0,0,37.1,-5,1.484 ++0,0,0,37.1,5,1.232 ++0,0,0,37.1,15,1.006 ++0,0,0,37.1,25,0.932 ++0,0,0,37.1,35,1.062 ++0,0,0.01,12.1,-15,4.742 ++0,0,0.01,12.1,-5,3.597 ++0,0,0.01,12.1,5,2.618 ++0,0,0.01,12.1,15,1.808 ++0,0,0.01,12.1,25,1.592 ++0,0,0.01,12.1,35,2.087 ++0,0,0.01,18,-15,3.497 ++0,0,0.01,18,-5,2.777 ++0,0,0.01,18,5,2.154 ++0,0,0.01,18,15,1.628 ++0,0,0.01,18,25,1.482 ++0,0,0.01,18,35,1.8 ++0,0,0.01,25.2,-15,2.602 ++0,0,0.01,25.2,-5,2.207 ++0,0,0.01,25.2,5,1.849 ++0,0,0.01,25.2,15,1.528 ++0,0,0.01,25.2,25,1.429 ++0,0,0.01,25.2,35,1.624 ++0,0,0.01,30,-15,2.364 ++0,0,0.01,30,-5,2.039 ++0,0,0.01,30,5,1.743 ++0,0,0.01,30,15,1.474 ++0,0,0.01,30,25,1.388 ++0,0,0.01,30,35,1.548 ++0,0,0.01,37.1,-15,2.183 ++0,0,0.01,37.1,-5,1.907 ++0,0,0.01,37.1,5,1.655 ++0,0,0.01,37.1,15,1.428 ++0,0,0.01,37.1,25,1.354 ++0,0,0.01,37.1,35,1.484 ++0,0,0.02,12.1,-15,5.128 ++0,0,0.02,12.1,-5,3.983 ++0,0,0.02,12.1,5,3.005 ++0,0,0.02,12.1,15,2.194 ++0,0,0.02,12.1,25,1.978 ++0,0,0.02,12.1,35,2.473 ++0,0,0.02,18,-15,3.895 ++0,0,0.02,18,-5,3.175 ++0,0,0.02,18,5,2.551 ++0,0,0.02,18,15,2.026 ++0,0,0.02,18,25,1.88 ++0,0,0.02,18,35,2.198 ++0,0,0.02,25.2,-15,3.003 ++0,0,0.02,25.2,-5,2.608 ++0,0,0.02,25.2,5,2.25 ++0,0,0.02,25.2,15,1.928 ++0,0,0.02,25.2,25,1.83 ++0,0,0.02,25.2,35,2.025 ++0,0,0.02,30,-15,2.775 ++0,0,0.02,30,-5,2.451 ++0,0,0.02,30,5,2.154 ++0,0,0.02,30,15,1.885 ++0,0,0.02,30,25,1.8 ++0,0,0.02,30,35,1.96 ++0,0,0.02,37.1,-15,2.606 ++0,0,0.02,37.1,-5,2.329 ++0,0,0.02,37.1,5,2.078 ++0,0,0.02,37.1,15,1.851 ++0,0,0.02,37.1,25,1.777 ++0,0,0.02,37.1,35,1.907 ++0,0,0.03,12.1,-15,5.514 ++0,0,0.03,12.1,-5,4.37 ++0,0,0.03,12.1,5,3.391 ++0,0,0.03,12.1,15,2.58 ++0,0,0.03,12.1,25,2.364 ++0,0,0.03,12.1,35,2.859 ++0,0,0.03,18,-15,4.293 ++0,0,0.03,18,-5,3.573 ++0,0,0.03,18,5,2.949 ++0,0,0.03,18,15,2.424 ++0,0,0.03,18,25,2.278 ++0,0,0.03,18,35,2.596 ++0,0,0.03,25.2,-15,3.405 ++0,0,0.03,25.2,-5,3.01 ++0,0,0.03,25.2,5,2.652 ++0,0,0.03,25.2,15,2.33 ++0,0,0.03,25.2,25,2.231 ++0,0,0.03,25.2,35,2.427 ++0,0,0.03,30,-15,3.187 ++0,0,0.03,30,-5,2.862 ++0,0,0.03,30,5,2.566 ++0,0,0.03,30,15,2.297 ++0,0,0.03,30,25,2.211 ++0,0,0.03,30,35,2.371 ++0,0,0.03,37.1,-15,3.028 ++0,0,0.03,37.1,-5,2.752 ++0,0,0.03,37.1,5,2.5 ++0,0,0.03,37.1,15,2.274 ++0,0,0.03,37.1,25,2.2 ++0,0,0.03,37.1,35,2.329 ++0,0,0.04,12.1,-15,5.9 ++0,0,0.04,12.1,-5,4.756 ++0,0,0.04,12.1,5,3.777 ++0,0,0.04,12.1,15,2.966 ++0,0,0.04,12.1,25,2.75 ++0,0,0.04,12.1,35,3.245 ++0,0,0.04,18,-15,4.691 ++0,0,0.04,18,-5,3.971 ++0,0,0.04,18,5,3.347 ++0,0,0.04,18,15,2.821 ++0,0,0.04,18,25,2.676 ++0,0,0.04,18,35,2.994 ++0,0,0.04,25.2,-15,3.806 ++0,0,0.04,25.2,-5,3.411 ++0,0,0.04,25.2,5,3.053 ++0,0,0.04,25.2,15,2.732 ++0,0,0.04,25.2,25,2.633 ++0,0,0.04,25.2,35,2.828 ++0,0,0.04,30,-15,3.599 ++0,0,0.04,30,-5,3.274 ++0,0,0.04,30,5,2.977 ++0,0,0.04,30,15,2.709 ++0,0,0.04,30,25,2.623 ++0,0,0.04,30,35,2.783 ++0,0,0.04,37.1,-15,3.451 ++0,0,0.04,37.1,-5,3.175 ++0,0,0.04,37.1,5,2.923 ++0,0,0.04,37.1,15,2.696 ++0,0,0.04,37.1,25,2.623 ++0,0,0.04,37.1,35,2.752 ++0,0.3,-0.04,12.1,-15,2.648 ++0,0.3,-0.04,12.1,-5,1.504 ++0,0.3,-0.04,12.1,5,0.526 ++0,0.3,-0.04,12.1,15,-0.284 ++0,0.3,-0.04,12.1,25,-0.177 ++0,0.3,-0.04,12.1,35,0.373 ++0,0.3,-0.04,18,-15,1.4 ++0,0.3,-0.04,18,-5,0.682 ++0,0.3,-0.04,18,5,0.059 ++0,0.3,-0.04,18,15,-0.466 ++0,0.3,-0.04,18,25,-0.393 ++0,0.3,-0.04,18,35,-0.036 ++0,0.3,-0.04,25.2,-15,0.505 ++0,0.3,-0.04,25.2,-5,0.111 ++0,0.3,-0.04,25.2,5,-0.246 ++0,0.3,-0.04,25.2,15,-0.566 ++0,0.3,-0.04,25.2,25,-0.508 ++0,0.3,-0.04,25.2,35,-0.285 ++0,0.3,-0.04,30,-15,0.268 ++0,0.3,-0.04,30,-5,-0.054 ++0,0.3,-0.04,30,5,-0.349 ++0,0.3,-0.04,30,15,-0.616 ++0,0.3,-0.04,30,25,-0.569 ++0,0.3,-0.04,30,35,-0.385 ++0,0.3,-0.04,37.1,-15,0.085 ++0,0.3,-0.04,37.1,-5,-0.189 ++0,0.3,-0.04,37.1,5,-0.437 ++0,0.3,-0.04,37.1,15,-0.661 ++0,0.3,-0.04,37.1,25,-0.627 ++0,0.3,-0.04,37.1,35,-0.477 ++0,0.3,-0.03,12.1,-15,3.025 ++0,0.3,-0.03,12.1,-5,1.881 ++0,0.3,-0.03,12.1,5,0.902 ++0,0.3,-0.03,12.1,15,0.092 ++0,0.3,-0.03,12.1,25,0.2 ++0,0.3,-0.03,12.1,35,0.75 ++0,0.3,-0.03,18,-15,1.786 ++0,0.3,-0.03,18,-5,1.067 ++0,0.3,-0.03,18,5,0.444 ++0,0.3,-0.03,18,15,-0.08 ++0,0.3,-0.03,18,25,-0.007 ++0,0.3,-0.03,18,35,0.349 ++0,0.3,-0.03,25.2,-15,0.901 ++0,0.3,-0.03,25.2,-5,0.507 ++0,0.3,-0.03,25.2,5,0.151 ++0,0.3,-0.03,25.2,15,-0.17 ++0,0.3,-0.03,25.2,25,-0.112 ++0,0.3,-0.03,25.2,35,0.111 ++0,0.3,-0.03,30,-15,0.651 ++0,0.3,-0.03,30,-5,0.329 ++0,0.3,-0.03,30,5,0.034 ++0,0.3,-0.03,30,15,-0.233 ++0,0.3,-0.03,30,25,-0.186 ++0,0.3,-0.03,30,35,-0.002 ++0,0.3,-0.03,37.1,-15,0.455 ++0,0.3,-0.03,37.1,-5,0.181 ++0,0.3,-0.03,37.1,5,-0.067 ++0,0.3,-0.03,37.1,15,-0.292 ++0,0.3,-0.03,37.1,25,-0.257 ++0,0.3,-0.03,37.1,35,-0.107 ++0,0.3,-0.02,12.1,-15,3.402 ++0,0.3,-0.02,12.1,-5,2.257 ++0,0.3,-0.02,12.1,5,1.279 ++0,0.3,-0.02,12.1,15,0.469 ++0,0.3,-0.02,12.1,25,0.577 ++0,0.3,-0.02,12.1,35,1.127 ++0,0.3,-0.02,18,-15,2.171 ++0,0.3,-0.02,18,-5,1.452 ++0,0.3,-0.02,18,5,0.83 ++0,0.3,-0.02,18,15,0.305 ++0,0.3,-0.02,18,25,0.378 ++0,0.3,-0.02,18,35,0.735 ++0,0.3,-0.02,25.2,-15,1.298 ++0,0.3,-0.02,25.2,-5,0.904 ++0,0.3,-0.02,25.2,5,0.548 ++0,0.3,-0.02,25.2,15,0.227 ++0,0.3,-0.02,25.2,25,0.285 ++0,0.3,-0.02,25.2,35,0.508 ++0,0.3,-0.02,30,-15,1.035 ++0,0.3,-0.02,30,-5,0.713 ++0,0.3,-0.02,30,5,0.418 ++0,0.3,-0.02,30,15,0.151 ++0,0.3,-0.02,30,25,0.198 ++0,0.3,-0.02,30,35,0.382 ++0,0.3,-0.02,37.1,-15,0.825 ++0,0.3,-0.02,37.1,-5,0.551 ++0,0.3,-0.02,37.1,5,0.303 ++0,0.3,-0.02,37.1,15,0.078 ++0,0.3,-0.02,37.1,25,0.113 ++0,0.3,-0.02,37.1,35,0.263 ++0,0.3,-0.01,12.1,-15,3.79 ++0,0.3,-0.01,12.1,-5,2.646 ++0,0.3,-0.01,12.1,5,1.667 ++0,0.3,-0.01,12.1,15,0.856 ++0,0.3,-0.01,12.1,25,0.964 ++0,0.3,-0.01,12.1,35,1.514 ++0,0.3,-0.01,18,-15,2.587 ++0,0.3,-0.01,18,-5,1.867 ++0,0.3,-0.01,18,5,1.243 ++0,0.3,-0.01,18,15,0.717 ++0,0.3,-0.01,18,25,0.79 ++0,0.3,-0.01,18,35,1.145 ++0,0.3,-0.01,25.2,-15,1.728 ++0,0.3,-0.01,25.2,-5,1.333 ++0,0.3,-0.01,25.2,5,0.975 ++0,0.3,-0.01,25.2,15,0.653 ++0,0.3,-0.01,25.2,25,0.71 ++0,0.3,-0.01,25.2,35,0.932 ++0,0.3,-0.01,30,-15,1.475 ++0,0.3,-0.01,30,-5,1.151 ++0,0.3,-0.01,30,5,0.854 ++0,0.3,-0.01,30,15,0.585 ++0,0.3,-0.01,30,25,0.63 ++0,0.3,-0.01,30,35,0.813 ++0,0.3,-0.01,37.1,-15,1.278 ++0,0.3,-0.01,37.1,-5,1.002 ++0,0.3,-0.01,37.1,5,0.75 ++0,0.3,-0.01,37.1,15,0.523 ++0,0.3,-0.01,37.1,25,0.555 ++0,0.3,-0.01,37.1,35,0.703 ++0,0.3,0,12.1,-15,4.23 ++0,0.3,0,12.1,-5,3.086 ++0,0.3,0,12.1,5,2.107 ++0,0.3,0,12.1,15,1.296 ++0,0.3,0,12.1,25,1.404 ++0,0.3,0,12.1,35,1.953 ++0,0.3,0,18,-15,3.04 ++0,0.3,0,18,-5,2.32 ++0,0.3,0,18,5,1.696 ++0,0.3,0,18,15,1.17 ++0,0.3,0,18,25,1.243 ++0,0.3,0,18,35,1.598 ++0,0.3,0,25.2,-15,2.185 ++0,0.3,0,25.2,-5,1.79 ++0,0.3,0,25.2,5,1.432 ++0,0.3,0,25.2,15,1.11 ++0,0.3,0,25.2,25,1.167 ++0,0.3,0,25.2,35,1.389 ++0,0.3,0,30,-15,1.944 ++0,0.3,0,30,-5,1.619 ++0,0.3,0,30,5,1.323 ++0,0.3,0,30,15,1.054 ++0,0.3,0,30,25,1.099 ++0,0.3,0,30,35,1.282 ++0,0.3,0,37.1,-15,1.759 ++0,0.3,0,37.1,-5,1.483 ++0,0.3,0,37.1,5,1.232 ++0,0.3,0,37.1,15,1.005 ++0,0.3,0,37.1,25,1.037 ++0,0.3,0,37.1,35,1.184 ++0,0.3,0.01,12.1,-15,4.67 ++0,0.3,0.01,12.1,-5,3.526 ++0,0.3,0.01,12.1,5,2.547 ++0,0.3,0.01,12.1,15,1.737 ++0,0.3,0.01,12.1,25,1.844 ++0,0.3,0.01,12.1,35,2.394 ++0,0.3,0.01,18,-15,3.494 ++0,0.3,0.01,18,-5,2.773 ++0,0.3,0.01,18,5,2.15 ++0,0.3,0.01,18,15,1.624 ++0,0.3,0.01,18,25,1.696 ++0,0.3,0.01,18,35,2.052 ++0,0.3,0.01,25.2,-15,2.642 ++0,0.3,0.01,25.2,-5,2.247 ++0,0.3,0.01,25.2,5,1.889 ++0,0.3,0.01,25.2,15,1.567 ++0,0.3,0.01,25.2,25,1.624 ++0,0.3,0.01,25.2,35,1.846 ++0,0.3,0.01,30,-15,2.413 ++0,0.3,0.01,30,-5,2.089 ++0,0.3,0.01,30,5,1.792 ++0,0.3,0.01,30,15,1.523 ++0,0.3,0.01,30,25,1.568 ++0,0.3,0.01,30,35,1.751 ++0,0.3,0.01,37.1,-15,2.241 ++0,0.3,0.01,37.1,-5,1.965 ++0,0.3,0.01,37.1,5,1.713 ++0,0.3,0.01,37.1,15,1.487 ++0,0.3,0.01,37.1,25,1.518 ++0,0.3,0.01,37.1,35,1.666 ++0,0.3,0.02,12.1,-15,5.111 ++0,0.3,0.02,12.1,-5,3.966 ++0,0.3,0.02,12.1,5,2.987 ++0,0.3,0.02,12.1,15,2.177 ++0,0.3,0.02,12.1,25,2.284 ++0,0.3,0.02,12.1,35,2.834 ++0,0.3,0.02,18,-15,3.947 ++0,0.3,0.02,18,-5,3.227 ++0,0.3,0.02,18,5,2.604 ++0,0.3,0.02,18,15,2.078 ++0,0.3,0.02,18,25,2.15 ++0,0.3,0.02,18,35,2.506 ++0,0.3,0.02,25.2,-15,3.099 ++0,0.3,0.02,25.2,-5,2.704 ++0,0.3,0.02,25.2,5,2.346 ++0,0.3,0.02,25.2,15,2.024 ++0,0.3,0.02,25.2,25,2.081 ++0,0.3,0.02,25.2,35,2.303 ++0,0.3,0.02,30,-15,2.882 ++0,0.3,0.02,30,-5,2.558 ++0,0.3,0.02,30,5,2.261 ++0,0.3,0.02,30,15,1.992 ++0,0.3,0.02,30,25,2.037 ++0,0.3,0.02,30,35,2.22 ++0,0.3,0.02,37.1,-15,2.723 ++0,0.3,0.02,37.1,-5,2.447 ++0,0.3,0.02,37.1,5,2.195 ++0,0.3,0.02,37.1,15,1.969 ++0,0.3,0.02,37.1,25,2.001 ++0,0.3,0.02,37.1,35,2.148 ++0,0.3,0.03,12.1,-15,5.551 ++0,0.3,0.03,12.1,-5,4.406 ++0,0.3,0.03,12.1,5,3.428 ++0,0.3,0.03,12.1,15,2.617 ++0,0.3,0.03,12.1,25,2.724 ++0,0.3,0.03,12.1,35,3.274 ++0,0.3,0.03,18,-15,4.401 ++0,0.3,0.03,18,-5,3.681 ++0,0.3,0.03,18,5,3.057 ++0,0.3,0.03,18,15,2.532 ++0,0.3,0.03,18,25,2.604 ++0,0.3,0.03,18,35,2.96 ++0,0.3,0.03,25.2,-15,3.557 ++0,0.3,0.03,25.2,-5,3.162 ++0,0.3,0.03,25.2,5,2.804 ++0,0.3,0.03,25.2,15,2.482 ++0,0.3,0.03,25.2,25,2.539 ++0,0.3,0.03,25.2,35,2.761 ++0,0.3,0.03,30,-15,3.352 ++0,0.3,0.03,30,-5,3.027 ++0,0.3,0.03,30,5,2.73 ++0,0.3,0.03,30,15,2.462 ++0,0.3,0.03,30,25,2.507 ++0,0.3,0.03,30,35,2.689 ++0,0.3,0.03,37.1,-15,3.205 ++0,0.3,0.03,37.1,-5,2.929 ++0,0.3,0.03,37.1,5,2.677 ++0,0.3,0.03,37.1,15,2.451 ++0,0.3,0.03,37.1,25,2.483 ++0,0.3,0.03,37.1,35,2.63 ++0,0.3,0.04,12.1,-15,5.991 ++0,0.3,0.04,12.1,-5,4.847 ++0,0.3,0.04,12.1,5,3.868 ++0,0.3,0.04,12.1,15,3.057 ++0,0.3,0.04,12.1,25,3.165 ++0,0.3,0.04,12.1,35,3.714 ++0,0.3,0.04,18,-15,4.855 ++0,0.3,0.04,18,-5,4.135 ++0,0.3,0.04,18,5,3.511 ++0,0.3,0.04,18,15,2.985 ++0,0.3,0.04,18,25,3.057 ++0,0.3,0.04,18,35,3.413 ++0,0.3,0.04,25.2,-15,4.015 ++0,0.3,0.04,25.2,-5,3.62 ++0,0.3,0.04,25.2,5,3.262 ++0,0.3,0.04,25.2,15,2.94 ++0,0.3,0.04,25.2,25,2.997 ++0,0.3,0.04,25.2,35,3.219 ++0,0.3,0.04,30,-15,3.821 ++0,0.3,0.04,30,-5,3.497 ++0,0.3,0.04,30,5,3.2 ++0,0.3,0.04,30,15,2.931 ++0,0.3,0.04,30,25,2.977 ++0,0.3,0.04,30,35,3.159 ++0,0.3,0.04,37.1,-15,3.687 ++0,0.3,0.04,37.1,-5,3.411 ++0,0.3,0.04,37.1,5,3.159 ++0,0.3,0.04,37.1,15,2.933 ++0,0.3,0.04,37.1,25,2.965 ++0,0.3,0.04,37.1,35,3.112 ++0,0.6,-0.04,12.1,-15,2.329 ++0,0.6,-0.04,12.1,-5,1.185 ++0,0.6,-0.04,12.1,5,0.207 ++0,0.6,-0.04,12.1,15,-0.413 ++0,0.6,-0.04,12.1,25,-0.173 ++0,0.6,-0.04,12.1,35,0.433 ++0,0.6,-0.04,18,-15,1.143 ++0,0.6,-0.04,18,-5,0.424 ++0,0.6,-0.04,18,5,-0.198 ++0,0.6,-0.04,18,15,-0.594 ++0,0.6,-0.04,18,25,-0.432 ++0,0.6,-0.04,18,35,-0.038 ++0,0.6,-0.04,25.2,-15,0.286 ++0,0.6,-0.04,25.2,-5,-0.108 ++0,0.6,-0.04,25.2,5,-0.465 ++0,0.6,-0.04,25.2,15,-0.689 ++0,0.6,-0.04,25.2,25,-0.572 ++0,0.6,-0.04,25.2,35,-0.322 ++0,0.6,-0.04,30,-15,0.061 ++0,0.6,-0.04,30,-5,-0.262 ++0,0.6,-0.04,30,5,-0.556 ++0,0.6,-0.04,30,15,-0.743 ++0,0.6,-0.04,30,25,-0.646 ++0,0.6,-0.04,30,35,-0.439 ++0,0.6,-0.04,37.1,-15,-0.112 ++0,0.6,-0.04,37.1,-5,-0.385 ++0,0.6,-0.04,37.1,5,-0.634 ++0,0.6,-0.04,37.1,15,-0.795 ++0,0.6,-0.04,37.1,25,-0.718 ++0,0.6,-0.04,37.1,35,-0.55 ++0,0.6,-0.03,12.1,-15,2.752 ++0,0.6,-0.03,12.1,-5,1.608 ++0,0.6,-0.03,12.1,5,0.63 ++0,0.6,-0.03,12.1,15,0.01 ++0,0.6,-0.03,12.1,25,0.251 ++0,0.6,-0.03,12.1,35,0.856 ++0,0.6,-0.03,18,-15,1.576 ++0,0.6,-0.03,18,-5,0.857 ++0,0.6,-0.03,18,5,0.234 ++0,0.6,-0.03,18,15,-0.162 ++0,0.6,-0.03,18,25,0.001 ++0,0.6,-0.03,18,35,0.395 ++0,0.6,-0.03,25.2,-15,0.731 ++0,0.6,-0.03,25.2,-5,0.337 ++0,0.6,-0.03,25.2,5,-0.02 ++0,0.6,-0.03,25.2,15,-0.244 ++0,0.6,-0.03,25.2,25,-0.127 ++0,0.6,-0.03,25.2,35,0.123 ++0,0.6,-0.03,30,-15,0.491 ++0,0.6,-0.03,30,-5,0.168 ++0,0.6,-0.03,30,5,-0.126 ++0,0.6,-0.03,30,15,-0.313 ++0,0.6,-0.03,30,25,-0.216 ++0,0.6,-0.03,30,35,-0.009 ++0,0.6,-0.03,37.1,-15,0.303 ++0,0.6,-0.03,37.1,-5,0.03 ++0,0.6,-0.03,37.1,5,-0.218 ++0,0.6,-0.03,37.1,15,-0.379 ++0,0.6,-0.03,37.1,25,-0.303 ++0,0.6,-0.03,37.1,35,-0.134 ++0,0.6,-0.02,12.1,-15,3.175 ++0,0.6,-0.02,12.1,-5,2.031 ++0,0.6,-0.02,12.1,5,1.053 ++0,0.6,-0.02,12.1,15,0.433 ++0,0.6,-0.02,12.1,25,0.674 ++0,0.6,-0.02,12.1,35,1.279 ++0,0.6,-0.02,18,-15,2.008 ++0,0.6,-0.02,18,-5,1.29 ++0,0.6,-0.02,18,5,0.667 ++0,0.6,-0.02,18,15,0.271 ++0,0.6,-0.02,18,25,0.434 ++0,0.6,-0.02,18,35,0.828 ++0,0.6,-0.02,25.2,-15,1.176 ++0,0.6,-0.02,25.2,-5,0.783 ++0,0.6,-0.02,25.2,5,0.426 ++0,0.6,-0.02,25.2,15,0.202 ++0,0.6,-0.02,25.2,25,0.319 ++0,0.6,-0.02,25.2,35,0.569 ++0,0.6,-0.02,30,-15,0.922 ++0,0.6,-0.02,30,-5,0.599 ++0,0.6,-0.02,30,5,0.305 ++0,0.6,-0.02,30,15,0.118 ++0,0.6,-0.02,30,25,0.215 ++0,0.6,-0.02,30,35,0.422 ++0,0.6,-0.02,37.1,-15,0.719 ++0,0.6,-0.02,37.1,-5,0.446 ++0,0.6,-0.02,37.1,5,0.197 ++0,0.6,-0.02,37.1,15,0.036 ++0,0.6,-0.02,37.1,25,0.113 ++0,0.6,-0.02,37.1,35,0.281 ++0,0.6,-0.01,12.1,-15,3.611 ++0,0.6,-0.01,12.1,-5,2.466 ++0,0.6,-0.01,12.1,5,1.487 ++0,0.6,-0.01,12.1,15,0.867 ++0,0.6,-0.01,12.1,25,1.107 ++0,0.6,-0.01,12.1,35,1.713 ++0,0.6,-0.01,18,-15,2.472 ++0,0.6,-0.01,18,-5,1.751 ++0,0.6,-0.01,18,5,1.128 ++0,0.6,-0.01,18,15,0.731 ++0,0.6,-0.01,18,25,0.893 ++0,0.6,-0.01,18,35,1.286 ++0,0.6,-0.01,25.2,-15,1.655 ++0,0.6,-0.01,25.2,-5,1.26 ++0,0.6,-0.01,25.2,5,0.902 ++0,0.6,-0.01,25.2,15,0.677 ++0,0.6,-0.01,25.2,25,0.793 ++0,0.6,-0.01,25.2,35,1.042 ++0,0.6,-0.01,30,-15,1.409 ++0,0.6,-0.01,30,-5,1.085 ++0,0.6,-0.01,30,5,0.788 ++0,0.6,-0.01,30,15,0.599 ++0,0.6,-0.01,30,25,0.695 ++0,0.6,-0.01,30,35,0.9 ++0,0.6,-0.01,37.1,-15,1.218 ++0,0.6,-0.01,37.1,-5,0.941 ++0,0.6,-0.01,37.1,5,0.69 ++0,0.6,-0.01,37.1,15,0.526 ++0,0.6,-0.01,37.1,25,0.601 ++0,0.6,-0.01,37.1,35,0.767 ++0,0.6,0,12.1,-15,4.104 ++0,0.6,0,12.1,-5,2.96 ++0,0.6,0,12.1,5,1.981 ++0,0.6,0,12.1,15,1.36 ++0,0.6,0,12.1,25,1.601 ++0,0.6,0,12.1,35,2.206 ++0,0.6,0,18,-15,2.98 ++0,0.6,0,18,-5,2.26 ++0,0.6,0,18,5,1.637 ++0,0.6,0,18,15,1.24 ++0,0.6,0,18,25,1.401 ++0,0.6,0,18,35,1.794 ++0,0.6,0,25.2,-15,2.168 ++0,0.6,0,25.2,-5,1.773 ++0,0.6,0,25.2,5,1.415 ++0,0.6,0,25.2,15,1.19 ++0,0.6,0,25.2,25,1.306 ++0,0.6,0,25.2,35,1.555 ++0,0.6,0,30,-15,1.936 ++0,0.6,0,30,-5,1.611 ++0,0.6,0,30,5,1.314 ++0,0.6,0,30,15,1.126 ++0,0.6,0,30,25,1.222 ++0,0.6,0,30,35,1.426 ++0,0.6,0,37.1,-15,1.759 ++0,0.6,0,37.1,-5,1.482 ++0,0.6,0,37.1,5,1.231 ++0,0.6,0,37.1,15,1.067 ++0,0.6,0,37.1,25,1.141 ++0,0.6,0,37.1,35,1.307 ++0,0.6,0.01,12.1,-15,4.599 ++0,0.6,0.01,12.1,-5,3.454 ++0,0.6,0.01,12.1,5,2.476 ++0,0.6,0.01,12.1,15,1.855 ++0,0.6,0.01,12.1,25,2.096 ++0,0.6,0.01,12.1,35,2.701 ++0,0.6,0.01,18,-15,3.49 ++0,0.6,0.01,18,-5,2.77 ++0,0.6,0.01,18,5,2.146 ++0,0.6,0.01,18,15,1.749 ++0,0.6,0.01,18,25,1.911 ++0,0.6,0.01,18,35,2.304 ++0,0.6,0.01,25.2,-15,2.681 ++0,0.6,0.01,25.2,-5,2.287 ++0,0.6,0.01,25.2,5,1.928 ++0,0.6,0.01,25.2,15,1.703 ++0,0.6,0.01,25.2,25,1.819 ++0,0.6,0.01,25.2,35,2.068 ++0,0.6,0.01,30,-15,2.463 ++0,0.6,0.01,30,-5,2.138 ++0,0.6,0.01,30,5,1.841 ++0,0.6,0.01,30,15,1.653 ++0,0.6,0.01,30,25,1.748 ++0,0.6,0.01,30,35,1.953 ++0,0.6,0.01,37.1,-15,2.3 ++0,0.6,0.01,37.1,-5,2.023 ++0,0.6,0.01,37.1,5,1.772 ++0,0.6,0.01,37.1,15,1.608 ++0,0.6,0.01,37.1,25,1.683 ++0,0.6,0.01,37.1,35,1.848 ++0,0.6,0.02,12.1,-15,5.093 ++0,0.6,0.02,12.1,-5,3.949 ++0,0.6,0.02,12.1,5,2.97 ++0,0.6,0.02,12.1,15,2.349 ++0,0.6,0.02,12.1,25,2.59 ++0,0.6,0.02,12.1,35,3.195 ++0,0.6,0.02,18,-15,3.999 ++0,0.6,0.02,18,-5,3.279 ++0,0.6,0.02,18,5,2.656 ++0,0.6,0.02,18,15,2.259 ++0,0.6,0.02,18,25,2.42 ++0,0.6,0.02,18,35,2.814 ++0,0.6,0.02,25.2,-15,3.195 ++0,0.6,0.02,25.2,-5,2.8 ++0,0.6,0.02,25.2,5,2.442 ++0,0.6,0.02,25.2,15,2.216 ++0,0.6,0.02,25.2,25,2.333 ++0,0.6,0.02,25.2,35,2.582 ++0,0.6,0.02,30,-15,2.989 ++0,0.6,0.02,30,-5,2.665 ++0,0.6,0.02,30,5,2.368 ++0,0.6,0.02,30,15,2.179 ++0,0.6,0.02,30,25,2.275 ++0,0.6,0.02,30,35,2.48 ++0,0.6,0.02,37.1,-15,2.841 ++0,0.6,0.02,37.1,-5,2.565 ++0,0.6,0.02,37.1,5,2.313 ++0,0.6,0.02,37.1,15,2.15 ++0,0.6,0.02,37.1,25,2.224 ++0,0.6,0.02,37.1,35,2.39 ++0,0.6,0.03,12.1,-15,5.588 ++0,0.6,0.03,12.1,-5,4.443 ++0,0.6,0.03,12.1,5,3.464 ++0,0.6,0.03,12.1,15,2.844 ++0,0.6,0.03,12.1,25,3.084 ++0,0.6,0.03,12.1,35,3.69 ++0,0.6,0.03,18,-15,4.509 ++0,0.6,0.03,18,-5,3.789 ++0,0.6,0.03,18,5,3.165 ++0,0.6,0.03,18,15,2.768 ++0,0.6,0.03,18,25,2.93 ++0,0.6,0.03,18,35,3.323 ++0,0.6,0.03,25.2,-15,3.709 ++0,0.6,0.03,25.2,-5,3.314 ++0,0.6,0.03,25.2,5,2.956 ++0,0.6,0.03,25.2,15,2.731 ++0,0.6,0.03,25.2,25,2.847 ++0,0.6,0.03,25.2,35,3.096 ++0,0.6,0.03,30,-15,3.517 ++0,0.6,0.03,30,-5,3.192 ++0,0.6,0.03,30,5,2.895 ++0,0.6,0.03,30,15,2.707 ++0,0.6,0.03,30,25,2.802 ++0,0.6,0.03,30,35,3.007 ++0,0.6,0.03,37.1,-15,3.382 ++0,0.6,0.03,37.1,-5,3.106 ++0,0.6,0.03,37.1,5,2.855 ++0,0.6,0.03,37.1,15,2.691 ++0,0.6,0.03,37.1,25,2.765 ++0,0.6,0.03,37.1,35,2.931 ++0,0.6,0.04,12.1,-15,6.082 ++0,0.6,0.04,12.1,-5,4.938 ++0,0.6,0.04,12.1,5,3.959 ++0,0.6,0.04,12.1,15,3.338 ++0,0.6,0.04,12.1,25,3.579 ++0,0.6,0.04,12.1,35,4.184 ++0,0.6,0.04,18,-15,5.018 ++0,0.6,0.04,18,-5,4.298 ++0,0.6,0.04,18,5,3.675 ++0,0.6,0.04,18,15,3.278 ++0,0.6,0.04,18,25,3.439 ++0,0.6,0.04,18,35,3.833 ++0,0.6,0.04,25.2,-15,4.223 ++0,0.6,0.04,25.2,-5,3.828 ++0,0.6,0.04,25.2,5,3.47 ++0,0.6,0.04,25.2,15,3.245 ++0,0.6,0.04,25.2,25,3.361 ++0,0.6,0.04,25.2,35,3.61 ++0,0.6,0.04,30,-15,4.044 ++0,0.6,0.04,30,-5,3.719 ++0,0.6,0.04,30,5,3.423 ++0,0.6,0.04,30,15,3.234 ++0,0.6,0.04,30,25,3.33 ++0,0.6,0.04,30,35,3.535 ++0,0.6,0.04,37.1,-15,3.924 ++0,0.6,0.04,37.1,-5,3.647 ++0,0.6,0.04,37.1,5,3.396 ++0,0.6,0.04,37.1,15,3.232 ++0,0.6,0.04,37.1,25,3.307 ++0,0.6,0.04,37.1,35,3.472 ++0,0.9,-0.04,12.1,-15,2.01 ++0,0.9,-0.04,12.1,-5,0.866 ++0,0.9,-0.04,12.1,5,-0.112 ++0,0.9,-0.04,12.1,15,-0.504 ++0,0.9,-0.04,12.1,25,-0.168 ++0,0.9,-0.04,12.1,35,0.493 ++0,0.9,-0.04,18,-15,0.886 ++0,0.9,-0.04,18,-5,0.167 ++0,0.9,-0.04,18,5,-0.456 ++0,0.9,-0.04,18,15,-0.694 ++0,0.9,-0.04,18,25,-0.471 ++0,0.9,-0.04,18,35,-0.04 ++0,0.9,-0.04,25.2,-15,0.067 ++0,0.9,-0.04,25.2,-5,-0.327 ++0,0.9,-0.04,25.2,5,-0.684 ++0,0.9,-0.04,25.2,15,-0.789 ++0,0.9,-0.04,25.2,25,-0.635 ++0,0.9,-0.04,25.2,35,-0.359 ++0,0.9,-0.04,30,-15,-0.147 ++0,0.9,-0.04,30,-5,-0.469 ++0,0.9,-0.04,30,5,-0.764 ++0,0.9,-0.04,30,15,-0.85 ++0,0.9,-0.04,30,25,-0.723 ++0,0.9,-0.04,30,35,-0.494 ++0,0.9,-0.04,37.1,-15,-0.308 ++0,0.9,-0.04,37.1,-5,-0.582 ++0,0.9,-0.04,37.1,5,-0.83 ++0,0.9,-0.04,37.1,15,-0.91 ++0,0.9,-0.04,37.1,25,-0.809 ++0,0.9,-0.04,37.1,35,-0.622 ++0,0.9,-0.03,12.1,-15,2.48 ++0,0.9,-0.03,12.1,-5,1.336 ++0,0.9,-0.03,12.1,5,0.357 ++0,0.9,-0.03,12.1,15,-0.034 ++0,0.9,-0.03,12.1,25,0.301 ++0,0.9,-0.03,12.1,35,0.963 ++0,0.9,-0.03,18,-15,1.366 ++0,0.9,-0.03,18,-5,0.647 ++0,0.9,-0.03,18,5,0.024 ++0,0.9,-0.03,18,15,-0.214 ++0,0.9,-0.03,18,25,0.009 ++0,0.9,-0.03,18,35,0.441 ++0,0.9,-0.03,25.2,-15,0.56 ++0,0.9,-0.03,25.2,-5,0.167 ++0,0.9,-0.03,25.2,5,-0.19 ++0,0.9,-0.03,25.2,15,-0.295 ++0,0.9,-0.03,25.2,25,-0.141 ++0,0.9,-0.03,25.2,35,0.135 ++0,0.9,-0.03,30,-15,0.331 ++0,0.9,-0.03,30,-5,0.008 ++0,0.9,-0.03,30,5,-0.287 ++0,0.9,-0.03,30,15,-0.373 ++0,0.9,-0.03,30,25,-0.245 ++0,0.9,-0.03,30,35,-0.016 ++0,0.9,-0.03,37.1,-15,0.152 ++0,0.9,-0.03,37.1,-5,-0.121 ++0,0.9,-0.03,37.1,5,-0.37 ++0,0.9,-0.03,37.1,15,-0.45 ++0,0.9,-0.03,37.1,25,-0.348 ++0,0.9,-0.03,37.1,35,-0.162 ++0,0.9,-0.02,12.1,-15,2.949 ++0,0.9,-0.02,12.1,-5,1.805 ++0,0.9,-0.02,12.1,5,0.827 ++0,0.9,-0.02,12.1,15,0.435 ++0,0.9,-0.02,12.1,25,0.771 ++0,0.9,-0.02,12.1,35,1.432 ++0,0.9,-0.02,18,-15,1.846 ++0,0.9,-0.02,18,-5,1.127 ++0,0.9,-0.02,18,5,0.504 ++0,0.9,-0.02,18,15,0.266 ++0,0.9,-0.02,18,25,0.489 ++0,0.9,-0.02,18,35,0.921 ++0,0.9,-0.02,25.2,-15,1.055 ++0,0.9,-0.02,25.2,-5,0.661 ++0,0.9,-0.02,25.2,5,0.304 ++0,0.9,-0.02,25.2,15,0.199 ++0,0.9,-0.02,25.2,25,0.353 ++0,0.9,-0.02,25.2,35,0.63 ++0,0.9,-0.02,30,-15,0.809 ++0,0.9,-0.02,30,-5,0.486 ++0,0.9,-0.02,30,5,0.191 ++0,0.9,-0.02,30,15,0.105 ++0,0.9,-0.02,30,25,0.233 ++0,0.9,-0.02,30,35,0.462 ++0,0.9,-0.02,37.1,-15,0.613 ++0,0.9,-0.02,37.1,-5,0.34 ++0,0.9,-0.02,37.1,5,0.091 ++0,0.9,-0.02,37.1,15,0.011 ++0,0.9,-0.02,37.1,25,0.113 ++0,0.9,-0.02,37.1,35,0.299 ++0,0.9,-0.01,12.1,-15,3.431 ++0,0.9,-0.01,12.1,-5,2.286 ++0,0.9,-0.01,12.1,5,1.307 ++0,0.9,-0.01,12.1,15,0.915 ++0,0.9,-0.01,12.1,25,1.251 ++0,0.9,-0.01,12.1,35,1.911 ++0,0.9,-0.01,18,-15,2.356 ++0,0.9,-0.01,18,-5,1.636 ++0,0.9,-0.01,18,5,1.013 ++0,0.9,-0.01,18,15,0.773 ++0,0.9,-0.01,18,25,0.995 ++0,0.9,-0.01,18,35,1.426 ++0,0.9,-0.01,25.2,-15,1.582 ++0,0.9,-0.01,25.2,-5,1.187 ++0,0.9,-0.01,25.2,5,0.829 ++0,0.9,-0.01,25.2,15,0.723 ++0,0.9,-0.01,25.2,25,0.876 ++0,0.9,-0.01,25.2,35,1.152 ++0,0.9,-0.01,30,-15,1.343 ++0,0.9,-0.01,30,-5,1.019 ++0,0.9,-0.01,30,5,0.722 ++0,0.9,-0.01,30,15,0.634 ++0,0.9,-0.01,30,25,0.76 ++0,0.9,-0.01,30,35,0.987 ++0,0.9,-0.01,37.1,-15,1.158 ++0,0.9,-0.01,37.1,-5,0.881 ++0,0.9,-0.01,37.1,5,0.63 ++0,0.9,-0.01,37.1,15,0.547 ++0,0.9,-0.01,37.1,25,0.646 ++0,0.9,-0.01,37.1,35,0.83 ++0,0.9,0,12.1,-15,3.979 ++0,0.9,0,12.1,-5,2.834 ++0,0.9,0,12.1,5,1.855 ++0,0.9,0,12.1,15,1.463 ++0,0.9,0,12.1,25,1.798 ++0,0.9,0,12.1,35,2.459 ++0,0.9,0,18,-15,2.921 ++0,0.9,0,18,-5,2.201 ++0,0.9,0,18,5,1.577 ++0,0.9,0,18,15,1.338 ++0,0.9,0,18,25,1.56 ++0,0.9,0,18,35,1.991 ++0,0.9,0,25.2,-15,2.151 ++0,0.9,0,25.2,-5,1.756 ++0,0.9,0,25.2,5,1.398 ++0,0.9,0,25.2,15,1.292 ++0,0.9,0,25.2,25,1.445 ++0,0.9,0,25.2,35,1.721 ++0,0.9,0,30,-15,1.927 ++0,0.9,0,30,-5,1.603 ++0,0.9,0,30,5,1.306 ++0,0.9,0,30,15,1.218 ++0,0.9,0,30,25,1.344 ++0,0.9,0,30,35,1.571 ++0,0.9,0,37.1,-15,1.758 ++0,0.9,0,37.1,-5,1.481 ++0,0.9,0,37.1,5,1.23 ++0,0.9,0,37.1,15,1.147 ++0,0.9,0,37.1,25,1.246 ++0,0.9,0,37.1,35,1.43 ++0,0.9,0.01,12.1,-15,4.528 ++0,0.9,0.01,12.1,-5,3.383 ++0,0.9,0.01,12.1,5,2.404 ++0,0.9,0.01,12.1,15,2.012 ++0,0.9,0.01,12.1,25,2.347 ++0,0.9,0.01,12.1,35,3.008 ++0,0.9,0.01,18,-15,3.486 ++0,0.9,0.01,18,-5,2.766 ++0,0.9,0.01,18,5,2.143 ++0,0.9,0.01,18,15,1.903 ++0,0.9,0.01,18,25,2.125 ++0,0.9,0.01,18,35,2.556 ++0,0.9,0.01,25.2,-15,2.721 ++0,0.9,0.01,25.2,-5,2.326 ++0,0.9,0.01,25.2,5,1.968 ++0,0.9,0.01,25.2,15,1.862 ++0,0.9,0.01,25.2,25,2.015 ++0,0.9,0.01,25.2,35,2.29 ++0,0.9,0.01,30,-15,2.512 ++0,0.9,0.01,30,-5,2.187 ++0,0.9,0.01,30,5,1.891 ++0,0.9,0.01,30,15,1.803 ++0,0.9,0.01,30,25,1.928 ++0,0.9,0.01,30,35,2.156 ++0,0.9,0.01,37.1,-15,2.358 ++0,0.9,0.01,37.1,-5,2.082 ++0,0.9,0.01,37.1,5,1.83 ++0,0.9,0.01,37.1,15,1.747 ++0,0.9,0.01,37.1,25,1.847 ++0,0.9,0.01,37.1,35,2.031 ++0,0.9,0.02,12.1,-15,5.076 ++0,0.9,0.02,12.1,-5,3.932 ++0,0.9,0.02,12.1,5,2.953 ++0,0.9,0.02,12.1,15,2.561 ++0,0.9,0.02,12.1,25,2.896 ++0,0.9,0.02,12.1,35,3.557 ++0,0.9,0.02,18,-15,4.052 ++0,0.9,0.02,18,-5,3.332 ++0,0.9,0.02,18,5,2.708 ++0,0.9,0.02,18,15,2.468 ++0,0.9,0.02,18,25,2.691 ++0,0.9,0.02,18,35,3.121 ++0,0.9,0.02,25.2,-15,3.291 ++0,0.9,0.02,25.2,-5,2.896 ++0,0.9,0.02,25.2,5,2.538 ++0,0.9,0.02,25.2,15,2.432 ++0,0.9,0.02,25.2,25,2.584 ++0,0.9,0.02,25.2,35,2.86 ++0,0.9,0.02,30,-15,3.096 ++0,0.9,0.02,30,-5,2.772 ++0,0.9,0.02,30,5,2.475 ++0,0.9,0.02,30,15,2.387 ++0,0.9,0.02,30,25,2.513 ++0,0.9,0.02,30,35,2.74 ++0,0.9,0.02,37.1,-15,2.959 ++0,0.9,0.02,37.1,-5,2.683 ++0,0.9,0.02,37.1,5,2.431 ++0,0.9,0.02,37.1,15,2.348 ++0,0.9,0.02,37.1,25,2.447 ++0,0.9,0.02,37.1,35,2.631 ++0,0.9,0.03,12.1,-15,5.625 ++0,0.9,0.03,12.1,-5,4.48 ++0,0.9,0.03,12.1,5,3.501 ++0,0.9,0.03,12.1,15,3.109 ++0,0.9,0.03,12.1,25,3.444 ++0,0.9,0.03,12.1,35,4.105 ++0,0.9,0.03,18,-15,4.617 ++0,0.9,0.03,18,-5,3.897 ++0,0.9,0.03,18,5,3.273 ++0,0.9,0.03,18,15,3.034 ++0,0.9,0.03,18,25,3.256 ++0,0.9,0.03,18,35,3.687 ++0,0.9,0.03,25.2,-15,3.861 ++0,0.9,0.03,25.2,-5,3.466 ++0,0.9,0.03,25.2,5,3.108 ++0,0.9,0.03,25.2,15,3.002 ++0,0.9,0.03,25.2,25,3.155 ++0,0.9,0.03,25.2,35,3.431 ++0,0.9,0.03,30,-15,3.682 ++0,0.9,0.03,30,-5,3.357 ++0,0.9,0.03,30,5,3.06 ++0,0.9,0.03,30,15,2.972 ++0,0.9,0.03,30,25,3.098 ++0,0.9,0.03,30,35,3.325 ++0,0.9,0.03,37.1,-15,3.56 ++0,0.9,0.03,37.1,-5,3.283 ++0,0.9,0.03,37.1,5,3.032 ++0,0.9,0.03,37.1,15,2.949 ++0,0.9,0.03,37.1,25,3.048 ++0,0.9,0.03,37.1,35,3.232 ++0,0.9,0.04,12.1,-15,6.173 ++0,0.9,0.04,12.1,-5,5.029 ++0,0.9,0.04,12.1,5,4.05 ++0,0.9,0.04,12.1,15,3.658 ++0,0.9,0.04,12.1,25,3.993 ++0,0.9,0.04,12.1,35,4.654 ++0,0.9,0.04,18,-15,5.182 ++0,0.9,0.04,18,-5,4.462 ++0,0.9,0.04,18,5,3.839 ++0,0.9,0.04,18,15,3.599 ++0,0.9,0.04,18,25,3.821 ++0,0.9,0.04,18,35,4.252 ++0,0.9,0.04,25.2,-15,4.432 ++0,0.9,0.04,25.2,-5,4.037 ++0,0.9,0.04,25.2,5,3.679 ++0,0.9,0.04,25.2,15,3.573 ++0,0.9,0.04,25.2,25,3.725 ++0,0.9,0.04,25.2,35,4.001 ++0,0.9,0.04,30,-15,4.267 ++0,0.9,0.04,30,-5,3.942 ++0,0.9,0.04,30,5,3.645 ++0,0.9,0.04,30,15,3.557 ++0,0.9,0.04,30,25,3.683 ++0,0.9,0.04,30,35,3.91 ++0,0.9,0.04,37.1,-15,4.16 ++0,0.9,0.04,37.1,-5,3.884 ++0,0.9,0.04,37.1,5,3.632 ++0,0.9,0.04,37.1,15,3.549 ++0,0.9,0.04,37.1,25,3.649 ++0,0.9,0.04,37.1,35,3.833 ++1,0,-0.04,12.1,-15,3.752 ++1,0,-0.04,12.1,-5,2.322 ++1,0,-0.04,12.1,5,1.069 ++1,0,-0.04,12.1,15,-0.007 ++1,0,-0.04,12.1,25,-0.308 ++1,0,-0.04,12.1,35,0.361 ++1,0,-0.04,18,-15,2.048 ++1,0,-0.04,18,-5,1.134 ++1,0,-0.04,18,5,0.323 ++1,0,-0.04,18,15,-0.384 ++1,0,-0.04,18,25,-0.588 ++1,0,-0.04,18,35,-0.149 ++1,0,-0.04,25.2,-15,0.887 ++1,0,-0.04,25.2,-5,0.351 ++1,0,-0.04,25.2,5,-0.143 ++1,0,-0.04,25.2,15,-0.596 ++1,0,-0.04,25.2,25,-0.736 ++1,0,-0.04,25.2,35,-0.453 ++1,0,-0.04,30,-15,0.534 ++1,0,-0.04,30,-5,0.091 ++1,0,-0.04,30,5,-0.32 ++1,0,-0.04,30,15,-0.7 ++1,0,-0.04,30,25,-0.82 ++1,0,-0.04,30,35,-0.584 ++1,0,-0.04,37.1,-15,0.231 ++1,0,-0.04,37.1,-5,-0.141 ++1,0,-0.04,37.1,5,-0.485 ++1,0,-0.04,37.1,15,-0.801 ++1,0,-0.04,37.1,25,-0.902 ++1,0,-0.04,37.1,35,-0.71 ++1,0,-0.03,12.1,-15,4.248 ++1,0,-0.03,12.1,-5,2.818 ++1,0,-0.03,12.1,5,1.564 ++1,0,-0.03,12.1,15,0.488 ++1,0,-0.03,12.1,25,0.187 ++1,0,-0.03,12.1,35,0.856 ++1,0,-0.03,18,-15,2.555 ++1,0,-0.03,18,-5,1.641 ++1,0,-0.03,18,5,0.83 ++1,0,-0.03,18,15,0.123 ++1,0,-0.03,18,25,-0.081 ++1,0,-0.03,18,35,0.358 ++1,0,-0.03,25.2,-15,1.408 ++1,0,-0.03,25.2,-5,0.873 ++1,0,-0.03,25.2,5,0.378 ++1,0,-0.03,25.2,15,-0.075 ++1,0,-0.03,25.2,25,-0.215 ++1,0,-0.03,25.2,35,0.068 ++1,0,-0.03,30,-15,1.037 ++1,0,-0.03,30,-5,0.594 ++1,0,-0.03,30,5,0.184 ++1,0,-0.03,30,15,-0.196 ++1,0,-0.03,30,25,-0.316 ++1,0,-0.03,30,35,-0.08 ++1,0,-0.03,37.1,-15,0.717 ++1,0,-0.03,37.1,-5,0.345 ++1,0,-0.03,37.1,5,0.002 ++1,0,-0.03,37.1,15,-0.315 ++1,0,-0.03,37.1,25,-0.416 ++1,0,-0.03,37.1,35,-0.223 ++1,0,-0.02,12.1,-15,4.743 ++1,0,-0.02,12.1,-5,3.313 ++1,0,-0.02,12.1,5,2.06 ++1,0,-0.02,12.1,15,0.984 ++1,0,-0.02,12.1,25,0.683 ++1,0,-0.02,12.1,35,1.352 ++1,0,-0.02,18,-15,3.062 ++1,0,-0.02,18,-5,2.147 ++1,0,-0.02,18,5,1.336 ++1,0,-0.02,18,15,0.63 ++1,0,-0.02,18,25,0.426 ++1,0,-0.02,18,35,0.865 ++1,0,-0.02,25.2,-15,1.93 ++1,0,-0.02,25.2,-5,1.395 ++1,0,-0.02,25.2,5,0.9 ++1,0,-0.02,25.2,15,0.447 ++1,0,-0.02,25.2,25,0.307 ++1,0,-0.02,25.2,35,0.59 ++1,0,-0.02,30,-15,1.542 ++1,0,-0.02,30,-5,1.099 ++1,0,-0.02,30,5,0.688 ++1,0,-0.02,30,15,0.309 ++1,0,-0.02,30,25,0.189 ++1,0,-0.02,30,35,0.424 ++1,0,-0.02,37.1,-15,1.204 ++1,0,-0.02,37.1,-5,0.832 ++1,0,-0.02,37.1,5,0.488 ++1,0,-0.02,37.1,15,0.172 ++1,0,-0.02,37.1,25,0.071 ++1,0,-0.02,37.1,35,0.263 ++1,0,-0.01,12.1,-15,5.251 ++1,0,-0.01,12.1,-5,3.821 ++1,0,-0.01,12.1,5,2.567 ++1,0,-0.01,12.1,15,1.49 ++1,0,-0.01,12.1,25,1.189 ++1,0,-0.01,12.1,35,1.858 ++1,0,-0.01,18,-15,3.6 ++1,0,-0.01,18,-5,2.684 ++1,0,-0.01,18,5,1.872 ++1,0,-0.01,18,15,1.164 ++1,0,-0.01,18,25,0.96 ++1,0,-0.01,18,35,1.397 ++1,0,-0.01,25.2,-15,2.486 ++1,0,-0.01,25.2,-5,1.949 ++1,0,-0.01,25.2,5,1.453 ++1,0,-0.01,25.2,15,0.999 ++1,0,-0.01,25.2,25,0.858 ++1,0,-0.01,25.2,35,1.14 ++1,0,-0.01,30,-15,2.104 ++1,0,-0.01,30,-5,1.659 ++1,0,-0.01,30,5,1.246 ++1,0,-0.01,30,15,0.865 ++1,0,-0.01,30,25,0.743 ++1,0,-0.01,30,35,0.977 ++1,0,-0.01,37.1,-15,1.776 ++1,0,-0.01,37.1,-5,1.401 ++1,0,-0.01,37.1,5,1.054 ++1,0,-0.01,37.1,15,0.735 ++1,0,-0.01,37.1,25,0.631 ++1,0,-0.01,37.1,35,0.821 ++1,0,0,12.1,-15,5.829 ++1,0,0,12.1,-5,4.399 ++1,0,0,12.1,5,3.145 ++1,0,0,12.1,15,2.069 ++1,0,0,12.1,25,1.767 ++1,0,0,12.1,35,2.436 ++1,0,0,18,-15,4.195 ++1,0,0,18,-5,3.28 ++1,0,0,18,5,2.468 ++1,0,0,18,15,1.76 ++1,0,0,18,25,1.555 ++1,0,0,18,35,1.993 ++1,0,0,25.2,-15,3.087 ++1,0,0,25.2,-5,2.55 ++1,0,0,25.2,5,2.054 ++1,0,0,25.2,15,1.6 ++1,0,0,25.2,25,1.459 ++1,0,0,25.2,35,1.741 ++1,0,0,30,-15,2.721 ++1,0,0,30,-5,2.276 ++1,0,0,30,5,1.863 ++1,0,0,30,15,1.482 ++1,0,0,30,25,1.36 ++1,0,0,30,35,1.594 ++1,0,0,37.1,-15,2.409 ++1,0,0,37.1,-5,2.034 ++1,0,0,37.1,5,1.687 ++1,0,0,37.1,15,1.368 ++1,0,0,37.1,25,1.265 ++1,0,0,37.1,35,1.455 ++1,0,0.01,12.1,-15,6.409 ++1,0,0.01,12.1,-5,4.978 ++1,0,0.01,12.1,5,3.724 ++1,0,0.01,12.1,15,2.648 ++1,0,0.01,12.1,25,2.347 ++1,0,0.01,12.1,35,3.015 ++1,0,0.01,18,-15,4.792 ++1,0,0.01,18,-5,3.877 ++1,0,0.01,18,5,3.065 ++1,0,0.01,18,15,2.357 ++1,0,0.01,18,25,2.152 ++1,0,0.01,18,35,2.59 ++1,0,0.01,25.2,-15,3.688 ++1,0,0.01,25.2,-5,3.151 ++1,0,0.01,25.2,5,2.656 ++1,0,0.01,25.2,15,2.201 ++1,0,0.01,25.2,25,2.06 ++1,0,0.01,25.2,35,2.342 ++1,0,0.01,30,-15,3.338 ++1,0,0.01,30,-5,2.893 ++1,0,0.01,30,5,2.48 ++1,0,0.01,30,15,2.099 ++1,0,0.01,30,25,1.977 ++1,0,0.01,30,35,2.211 ++1,0,0.01,37.1,-15,3.043 ++1,0,0.01,37.1,-5,2.668 ++1,0,0.01,37.1,5,2.321 ++1,0,0.01,37.1,15,2.002 ++1,0,0.01,37.1,25,1.899 ++1,0,0.01,37.1,35,2.088 ++1,0,0.02,12.1,-15,6.988 ++1,0,0.02,12.1,-5,5.558 ++1,0,0.02,12.1,5,4.303 ++1,0,0.02,12.1,15,3.227 ++1,0,0.02,12.1,25,2.926 ++1,0,0.02,12.1,35,3.594 ++1,0,0.02,18,-15,5.389 ++1,0,0.02,18,-5,4.474 ++1,0,0.02,18,5,3.662 ++1,0,0.02,18,15,2.954 ++1,0,0.02,18,25,2.749 ++1,0,0.02,18,35,3.187 ++1,0,0.02,25.2,-15,4.289 ++1,0,0.02,25.2,-5,3.752 ++1,0,0.02,25.2,5,3.257 ++1,0,0.02,25.2,15,2.803 ++1,0,0.02,25.2,25,2.661 ++1,0,0.02,25.2,35,2.944 ++1,0,0.02,30,-15,3.955 ++1,0,0.02,30,-5,3.51 ++1,0,0.02,30,5,3.097 ++1,0,0.02,30,15,2.716 ++1,0,0.02,30,25,2.594 ++1,0,0.02,30,35,2.828 ++1,0,0.02,37.1,-15,3.677 ++1,0,0.02,37.1,-5,3.302 ++1,0,0.02,37.1,5,2.955 ++1,0,0.02,37.1,15,2.636 ++1,0,0.02,37.1,25,2.533 ++1,0,0.02,37.1,35,2.723 ++1,0,0.03,12.1,-15,7.567 ++1,0,0.03,12.1,-5,6.137 ++1,0,0.03,12.1,5,4.882 ++1,0,0.03,12.1,15,3.806 ++1,0,0.03,12.1,25,3.505 ++1,0,0.03,12.1,35,4.173 ++1,0,0.03,18,-15,5.986 ++1,0,0.03,18,-5,5.07 ++1,0,0.03,18,5,4.258 ++1,0,0.03,18,15,3.55 ++1,0,0.03,18,25,3.346 ++1,0,0.03,18,35,3.784 ++1,0,0.03,25.2,-15,4.891 ++1,0,0.03,25.2,-5,4.354 ++1,0,0.03,25.2,5,3.859 ++1,0,0.03,25.2,15,3.405 ++1,0,0.03,25.2,25,3.263 ++1,0,0.03,25.2,35,3.546 ++1,0,0.03,30,-15,4.573 ++1,0,0.03,30,-5,4.127 ++1,0,0.03,30,5,3.714 ++1,0,0.03,30,15,3.333 ++1,0,0.03,30,25,3.212 ++1,0,0.03,30,35,3.445 ++1,0,0.03,37.1,-15,4.311 ++1,0,0.03,37.1,-5,3.936 ++1,0,0.03,37.1,5,3.589 ++1,0,0.03,37.1,15,3.27 ++1,0,0.03,37.1,25,3.167 ++1,0,0.03,37.1,35,3.357 ++1,0,0.04,12.1,-15,8.146 ++1,0,0.04,12.1,-5,6.716 ++1,0,0.04,12.1,5,5.462 ++1,0,0.04,12.1,15,4.385 ++1,0,0.04,12.1,25,4.084 ++1,0,0.04,12.1,35,4.752 ++1,0,0.04,18,-15,6.583 ++1,0,0.04,18,-5,5.667 ++1,0,0.04,18,5,4.855 ++1,0,0.04,18,15,4.147 ++1,0,0.04,18,25,3.943 ++1,0,0.04,18,35,4.38 ++1,0,0.04,25.2,-15,5.494 ++1,0,0.04,25.2,-5,4.957 ++1,0,0.04,25.2,5,4.461 ++1,0,0.04,25.2,15,4.007 ++1,0,0.04,25.2,25,3.866 ++1,0,0.04,25.2,35,4.148 ++1,0,0.04,30,-15,5.19 ++1,0,0.04,30,-5,4.745 ++1,0,0.04,30,5,4.332 ++1,0,0.04,30,15,3.951 ++1,0,0.04,30,25,3.829 ++1,0,0.04,30,35,4.063 ++1,0,0.04,37.1,-15,4.945 ++1,0,0.04,37.1,-5,4.57 ++1,0,0.04,37.1,5,4.223 ++1,0,0.04,37.1,15,3.904 ++1,0,0.04,37.1,25,3.801 ++1,0,0.04,37.1,35,3.991 ++1,0.3,-0.04,12.1,-15,3.274 ++1,0.3,-0.04,12.1,-5,1.844 ++1,0.3,-0.04,12.1,5,0.59 ++1,0.3,-0.04,12.1,15,-0.486 ++1,0.3,-0.04,12.1,25,-0.302 ++1,0.3,-0.04,12.1,35,0.45 ++1,0.3,-0.04,18,-15,1.662 ++1,0.3,-0.04,18,-5,0.748 ++1,0.3,-0.04,18,5,-0.063 ++1,0.3,-0.04,18,15,-0.77 ++1,0.3,-0.04,18,25,-0.647 ++1,0.3,-0.04,18,35,-0.152 ++1,0.3,-0.04,25.2,-15,0.558 ++1,0.3,-0.04,25.2,-5,0.023 ++1,0.3,-0.04,25.2,5,-0.471 ++1,0.3,-0.04,25.2,15,-0.925 ++1,0.3,-0.04,25.2,25,-0.832 ++1,0.3,-0.04,25.2,35,-0.508 ++1,0.3,-0.04,30,-15,0.222 ++1,0.3,-0.04,30,-5,-0.221 ++1,0.3,-0.04,30,5,-0.632 ++1,0.3,-0.04,30,15,-1.011 ++1,0.3,-0.04,30,25,-0.935 ++1,0.3,-0.04,30,35,-0.666 ++1,0.3,-0.04,37.1,-15,-0.064 ++1,0.3,-0.04,37.1,-5,-0.436 ++1,0.3,-0.04,37.1,5,-0.78 ++1,0.3,-0.04,37.1,15,-1.096 ++1,0.3,-0.04,37.1,25,-1.038 ++1,0.3,-0.04,37.1,35,-0.819 ++1,0.3,-0.03,12.1,-15,3.839 ++1,0.3,-0.03,12.1,-5,2.409 ++1,0.3,-0.03,12.1,5,1.156 ++1,0.3,-0.03,12.1,15,0.08 ++1,0.3,-0.03,12.1,25,0.263 ++1,0.3,-0.03,12.1,35,1.016 ++1,0.3,-0.03,18,-15,2.24 ++1,0.3,-0.03,18,-5,1.326 ++1,0.3,-0.03,18,5,0.515 ++1,0.3,-0.03,18,15,-0.192 ++1,0.3,-0.03,18,25,-0.069 ++1,0.3,-0.03,18,35,0.426 ++1,0.3,-0.03,25.2,-15,1.153 ++1,0.3,-0.03,25.2,-5,0.617 ++1,0.3,-0.03,25.2,5,0.123 ++1,0.3,-0.03,25.2,15,-0.33 ++1,0.3,-0.03,25.2,25,-0.237 ++1,0.3,-0.03,25.2,35,0.086 ++1,0.3,-0.03,30,-15,0.797 ++1,0.3,-0.03,30,-5,0.354 ++1,0.3,-0.03,30,5,-0.057 ++1,0.3,-0.03,30,15,-0.437 ++1,0.3,-0.03,30,25,-0.36 ++1,0.3,-0.03,30,35,-0.091 ++1,0.3,-0.03,37.1,-15,0.49 ++1,0.3,-0.03,37.1,-5,0.119 ++1,0.3,-0.03,37.1,5,-0.225 ++1,0.3,-0.03,37.1,15,-0.541 ++1,0.3,-0.03,37.1,25,-0.484 ++1,0.3,-0.03,37.1,35,-0.264 ++1,0.3,-0.02,12.1,-15,4.404 ++1,0.3,-0.02,12.1,-5,2.974 ++1,0.3,-0.02,12.1,5,1.721 ++1,0.3,-0.02,12.1,15,0.645 ++1,0.3,-0.02,12.1,25,0.828 ++1,0.3,-0.02,12.1,35,1.581 ++1,0.3,-0.02,18,-15,2.818 ++1,0.3,-0.02,18,-5,1.904 ++1,0.3,-0.02,18,5,1.093 ++1,0.3,-0.02,18,15,0.386 ++1,0.3,-0.02,18,25,0.509 ++1,0.3,-0.02,18,35,1.004 ++1,0.3,-0.02,25.2,-15,1.748 ++1,0.3,-0.02,25.2,-5,1.212 ++1,0.3,-0.02,25.2,5,0.718 ++1,0.3,-0.02,25.2,15,0.265 ++1,0.3,-0.02,25.2,25,0.358 ++1,0.3,-0.02,25.2,35,0.681 ++1,0.3,-0.02,30,-15,1.372 ++1,0.3,-0.02,30,-5,0.929 ++1,0.3,-0.02,30,5,0.518 ++1,0.3,-0.02,30,15,0.139 ++1,0.3,-0.02,30,25,0.215 ++1,0.3,-0.02,30,35,0.484 ++1,0.3,-0.02,37.1,-15,1.045 ++1,0.3,-0.02,37.1,-5,0.674 ++1,0.3,-0.02,37.1,5,0.33 ++1,0.3,-0.02,37.1,15,0.013 ++1,0.3,-0.02,37.1,25,0.071 ++1,0.3,-0.02,37.1,35,0.291 ++1,0.3,-0.01,12.1,-15,4.981 ++1,0.3,-0.01,12.1,-5,3.551 ++1,0.3,-0.01,12.1,5,2.297 ++1,0.3,-0.01,12.1,15,1.221 ++1,0.3,-0.01,12.1,25,1.404 ++1,0.3,-0.01,12.1,35,2.156 ++1,0.3,-0.01,18,-15,3.427 ++1,0.3,-0.01,18,-5,2.511 ++1,0.3,-0.01,18,5,1.699 ++1,0.3,-0.01,18,15,0.991 ++1,0.3,-0.01,18,25,1.114 ++1,0.3,-0.01,18,35,1.608 ++1,0.3,-0.01,25.2,-15,2.377 ++1,0.3,-0.01,25.2,-5,1.84 ++1,0.3,-0.01,25.2,5,1.344 ++1,0.3,-0.01,25.2,15,0.89 ++1,0.3,-0.01,25.2,25,0.982 ++1,0.3,-0.01,25.2,35,1.305 ++1,0.3,-0.01,30,-15,2.005 ++1,0.3,-0.01,30,-5,1.56 ++1,0.3,-0.01,30,5,1.147 ++1,0.3,-0.01,30,15,0.766 ++1,0.3,-0.01,30,25,0.84 ++1,0.3,-0.01,30,35,1.108 ++1,0.3,-0.01,37.1,-15,1.685 ++1,0.3,-0.01,37.1,-5,1.31 ++1,0.3,-0.01,37.1,5,0.964 ++1,0.3,-0.01,37.1,15,0.645 ++1,0.3,-0.01,37.1,25,0.7 ++1,0.3,-0.01,37.1,35,0.917 ++1,0.3,0,12.1,-15,5.641 ++1,0.3,0,12.1,-5,4.211 ++1,0.3,0,12.1,5,2.957 ++1,0.3,0,12.1,15,1.88 ++1,0.3,0,12.1,25,2.064 ++1,0.3,0,12.1,35,2.815 ++1,0.3,0,18,-15,4.106 ++1,0.3,0,18,-5,3.191 ++1,0.3,0,18,5,2.378 ++1,0.3,0,18,15,1.671 ++1,0.3,0,18,25,1.793 ++1,0.3,0,18,35,2.287 ++1,0.3,0,25.2,-15,3.062 ++1,0.3,0,25.2,-5,2.525 ++1,0.3,0,25.2,5,2.029 ++1,0.3,0,25.2,15,1.575 ++1,0.3,0,25.2,25,1.667 ++1,0.3,0,25.2,35,1.99 ++1,0.3,0,30,-15,2.708 ++1,0.3,0,30,-5,2.263 ++1,0.3,0,30,5,1.85 ++1,0.3,0,30,15,1.469 ++1,0.3,0,30,25,1.543 ++1,0.3,0,30,35,1.811 ++1,0.3,0,37.1,-15,2.408 ++1,0.3,0,37.1,-5,2.033 ++1,0.3,0,37.1,5,1.686 ++1,0.3,0,37.1,15,1.367 ++1,0.3,0,37.1,25,1.422 ++1,0.3,0,37.1,35,1.639 ++1,0.3,0.01,12.1,-15,6.301 ++1,0.3,0.01,12.1,-5,4.871 ++1,0.3,0.01,12.1,5,3.617 ++1,0.3,0.01,12.1,15,2.541 ++1,0.3,0.01,12.1,25,2.724 ++1,0.3,0.01,12.1,35,3.476 ++1,0.3,0.01,18,-15,4.787 ++1,0.3,0.01,18,-5,3.871 ++1,0.3,0.01,18,5,3.059 ++1,0.3,0.01,18,15,2.351 ++1,0.3,0.01,18,25,2.474 ++1,0.3,0.01,18,35,2.968 ++1,0.3,0.01,25.2,-15,3.748 ++1,0.3,0.01,25.2,-5,3.21 ++1,0.3,0.01,25.2,5,2.715 ++1,0.3,0.01,25.2,15,2.261 ++1,0.3,0.01,25.2,25,2.353 ++1,0.3,0.01,25.2,35,2.675 ++1,0.3,0.01,30,-15,3.412 ++1,0.3,0.01,30,-5,2.967 ++1,0.3,0.01,30,5,2.554 ++1,0.3,0.01,30,15,2.173 ++1,0.3,0.01,30,25,2.247 ++1,0.3,0.01,30,35,2.514 ++1,0.3,0.01,37.1,-15,3.13 ++1,0.3,0.01,37.1,-5,2.755 ++1,0.3,0.01,37.1,5,2.409 ++1,0.3,0.01,37.1,15,2.09 ++1,0.3,0.01,37.1,25,2.145 ++1,0.3,0.01,37.1,35,2.362 ++1,0.3,0.02,12.1,-15,6.962 ++1,0.3,0.02,12.1,-5,5.532 ++1,0.3,0.02,12.1,5,4.277 ++1,0.3,0.02,12.1,15,3.201 ++1,0.3,0.02,12.1,25,3.384 ++1,0.3,0.02,12.1,35,4.136 ++1,0.3,0.02,18,-15,5.467 ++1,0.3,0.02,18,-5,4.552 ++1,0.3,0.02,18,5,3.74 ++1,0.3,0.02,18,15,3.032 ++1,0.3,0.02,18,25,3.155 ++1,0.3,0.02,18,35,3.648 ++1,0.3,0.02,25.2,-15,4.433 ++1,0.3,0.02,25.2,-5,3.896 ++1,0.3,0.02,25.2,5,3.401 ++1,0.3,0.02,25.2,15,2.947 ++1,0.3,0.02,25.2,25,3.039 ++1,0.3,0.02,25.2,35,3.361 ++1,0.3,0.02,30,-15,4.116 ++1,0.3,0.02,30,-5,3.67 ++1,0.3,0.02,30,5,3.258 ++1,0.3,0.02,30,15,2.876 ++1,0.3,0.02,30,25,2.951 ++1,0.3,0.02,30,35,3.218 ++1,0.3,0.02,37.1,-15,3.853 ++1,0.3,0.02,37.1,-5,3.478 ++1,0.3,0.02,37.1,5,3.132 ++1,0.3,0.02,37.1,15,2.813 ++1,0.3,0.02,37.1,25,2.868 ++1,0.3,0.02,37.1,35,3.085 ++1,0.3,0.03,12.1,-15,7.622 ++1,0.3,0.03,12.1,-5,6.192 ++1,0.3,0.03,12.1,5,4.938 ++1,0.3,0.03,12.1,15,3.861 ++1,0.3,0.03,12.1,25,4.045 ++1,0.3,0.03,12.1,35,4.797 ++1,0.3,0.03,18,-15,6.148 ++1,0.3,0.03,18,-5,5.232 ++1,0.3,0.03,18,5,4.42 ++1,0.3,0.03,18,15,3.712 ++1,0.3,0.03,18,25,3.835 ++1,0.3,0.03,18,35,4.329 ++1,0.3,0.03,25.2,-15,5.12 ++1,0.3,0.03,25.2,-5,4.583 ++1,0.3,0.03,25.2,5,4.087 ++1,0.3,0.03,25.2,15,3.633 ++1,0.3,0.03,25.2,25,3.725 ++1,0.3,0.03,25.2,35,4.048 ++1,0.3,0.03,30,-15,4.82 ++1,0.3,0.03,30,-5,4.375 ++1,0.3,0.03,30,5,3.962 ++1,0.3,0.03,30,15,3.58 ++1,0.3,0.03,30,25,3.655 ++1,0.3,0.03,30,35,3.922 ++1,0.3,0.03,37.1,-15,4.576 ++1,0.3,0.03,37.1,-5,4.201 ++1,0.3,0.03,37.1,5,3.855 ++1,0.3,0.03,37.1,15,3.536 ++1,0.3,0.03,37.1,25,3.591 ++1,0.3,0.03,37.1,35,3.808 ++1,0.3,0.04,12.1,-15,8.283 ++1,0.3,0.04,12.1,-5,6.852 ++1,0.3,0.04,12.1,5,5.598 ++1,0.3,0.04,12.1,15,4.522 ++1,0.3,0.04,12.1,25,4.705 ++1,0.3,0.04,12.1,35,5.457 ++1,0.3,0.04,18,-15,6.828 ++1,0.3,0.04,18,-5,5.913 ++1,0.3,0.04,18,5,5.101 ++1,0.3,0.04,18,15,4.393 ++1,0.3,0.04,18,25,4.516 ++1,0.3,0.04,18,35,5.01 ++1,0.3,0.04,25.2,-15,5.807 ++1,0.3,0.04,25.2,-5,5.27 ++1,0.3,0.04,25.2,5,4.774 ++1,0.3,0.04,25.2,15,4.32 ++1,0.3,0.04,25.2,25,4.412 ++1,0.3,0.04,25.2,35,4.735 ++1,0.3,0.04,30,-15,5.524 ++1,0.3,0.04,30,-5,5.079 ++1,0.3,0.04,30,5,4.666 ++1,0.3,0.04,30,15,4.285 ++1,0.3,0.04,30,25,4.359 ++1,0.3,0.04,30,35,4.626 ++1,0.3,0.04,37.1,-15,5.299 ++1,0.3,0.04,37.1,-5,4.924 ++1,0.3,0.04,37.1,5,4.578 ++1,0.3,0.04,37.1,15,4.259 ++1,0.3,0.04,37.1,25,4.314 ++1,0.3,0.04,37.1,35,4.531 ++1,0.6,-0.04,12.1,-15,2.796 ++1,0.6,-0.04,12.1,-5,1.366 ++1,0.6,-0.04,12.1,5,0.112 ++1,0.6,-0.04,12.1,15,-0.679 ++1,0.6,-0.04,12.1,25,-0.295 ++1,0.6,-0.04,12.1,35,0.54 ++1,0.6,-0.04,18,-15,1.276 ++1,0.6,-0.04,18,-5,0.362 ++1,0.6,-0.04,18,5,-0.449 ++1,0.6,-0.04,18,15,-0.963 ++1,0.6,-0.04,18,25,-0.705 ++1,0.6,-0.04,18,35,-0.154 ++1,0.6,-0.04,25.2,-15,0.23 ++1,0.6,-0.04,25.2,-5,-0.306 ++1,0.6,-0.04,25.2,5,-0.8 ++1,0.6,-0.04,25.2,15,-1.109 ++1,0.6,-0.04,25.2,25,-0.927 ++1,0.6,-0.04,25.2,35,-0.563 ++1,0.6,-0.04,30,-15,-0.089 ++1,0.6,-0.04,30,-5,-0.532 ++1,0.6,-0.04,30,5,-0.943 ++1,0.6,-0.04,30,15,-1.202 ++1,0.6,-0.04,30,25,-1.05 ++1,0.6,-0.04,30,35,-0.748 ++1,0.6,-0.04,37.1,-15,-0.359 ++1,0.6,-0.04,37.1,-5,-0.731 ++1,0.6,-0.04,37.1,5,-1.075 ++1,0.6,-0.04,37.1,15,-1.296 ++1,0.6,-0.04,37.1,25,-1.175 ++1,0.6,-0.04,37.1,35,-0.928 ++1,0.6,-0.03,12.1,-15,3.43 ++1,0.6,-0.03,12.1,-5,2.001 ++1,0.6,-0.03,12.1,5,0.747 ++1,0.6,-0.03,12.1,15,-0.044 ++1,0.6,-0.03,12.1,25,0.339 ++1,0.6,-0.03,12.1,35,1.175 ++1,0.6,-0.03,18,-15,1.925 ++1,0.6,-0.03,18,-5,1.011 ++1,0.6,-0.03,18,5,0.2 ++1,0.6,-0.03,18,15,-0.314 ++1,0.6,-0.03,18,25,-0.056 ++1,0.6,-0.03,18,35,0.495 ++1,0.6,-0.03,25.2,-15,0.897 ++1,0.6,-0.03,25.2,-5,0.361 ++1,0.6,-0.03,25.2,5,-0.133 ++1,0.6,-0.03,25.2,15,-0.442 ++1,0.6,-0.03,25.2,25,-0.259 ++1,0.6,-0.03,25.2,35,0.104 ++1,0.6,-0.03,30,-15,0.556 ++1,0.6,-0.03,30,-5,0.113 ++1,0.6,-0.03,30,5,-0.298 ++1,0.6,-0.03,30,15,-0.557 ++1,0.6,-0.03,30,25,-0.405 ++1,0.6,-0.03,30,35,-0.102 ++1,0.6,-0.03,37.1,-15,0.264 ++1,0.6,-0.03,37.1,-5,-0.108 ++1,0.6,-0.03,37.1,5,-0.452 ++1,0.6,-0.03,37.1,15,-0.673 ++1,0.6,-0.03,37.1,25,-0.552 ++1,0.6,-0.03,37.1,35,-0.305 ++1,0.6,-0.02,12.1,-15,4.065 ++1,0.6,-0.02,12.1,-5,2.635 ++1,0.6,-0.02,12.1,5,1.381 ++1,0.6,-0.02,12.1,15,0.59 ++1,0.6,-0.02,12.1,25,0.974 ++1,0.6,-0.02,12.1,35,1.809 ++1,0.6,-0.02,18,-15,2.574 ++1,0.6,-0.02,18,-5,1.66 ++1,0.6,-0.02,18,5,0.849 ++1,0.6,-0.02,18,15,0.335 ++1,0.6,-0.02,18,25,0.593 ++1,0.6,-0.02,18,35,1.144 ++1,0.6,-0.02,25.2,-15,1.566 ++1,0.6,-0.02,25.2,-5,1.03 ++1,0.6,-0.02,25.2,5,0.536 ++1,0.6,-0.02,25.2,15,0.227 ++1,0.6,-0.02,25.2,25,0.409 ++1,0.6,-0.02,25.2,35,0.773 ++1,0.6,-0.02,30,-15,1.202 ++1,0.6,-0.02,30,-5,0.759 ++1,0.6,-0.02,30,5,0.348 ++1,0.6,-0.02,30,15,0.089 ++1,0.6,-0.02,30,25,0.241 ++1,0.6,-0.02,30,35,0.544 ++1,0.6,-0.02,37.1,-15,0.887 ++1,0.6,-0.02,37.1,-5,0.515 ++1,0.6,-0.02,37.1,5,0.171 ++1,0.6,-0.02,37.1,15,-0.05 ++1,0.6,-0.02,37.1,25,0.071 ++1,0.6,-0.02,37.1,35,0.318 ++1,0.6,-0.01,12.1,-15,4.712 ++1,0.6,-0.01,12.1,-5,3.282 ++1,0.6,-0.01,12.1,5,2.027 ++1,0.6,-0.01,12.1,15,1.236 ++1,0.6,-0.01,12.1,25,1.619 ++1,0.6,-0.01,12.1,35,2.454 ++1,0.6,-0.01,18,-15,3.254 ++1,0.6,-0.01,18,-5,2.339 ++1,0.6,-0.01,18,5,1.526 ++1,0.6,-0.01,18,15,1.012 ++1,0.6,-0.01,18,25,1.268 ++1,0.6,-0.01,18,35,1.819 ++1,0.6,-0.01,25.2,-15,2.268 ++1,0.6,-0.01,25.2,-5,1.73 ++1,0.6,-0.01,25.2,5,1.235 ++1,0.6,-0.01,25.2,15,0.925 ++1,0.6,-0.01,25.2,25,1.107 ++1,0.6,-0.01,25.2,35,1.469 ++1,0.6,-0.01,30,-15,1.906 ++1,0.6,-0.01,30,-5,1.461 ++1,0.6,-0.01,30,5,1.048 ++1,0.6,-0.01,30,15,0.787 ++1,0.6,-0.01,30,25,0.937 ++1,0.6,-0.01,30,35,1.238 ++1,0.6,-0.01,37.1,-15,1.595 ++1,0.6,-0.01,37.1,-5,1.22 ++1,0.6,-0.01,37.1,5,0.874 ++1,0.6,-0.01,37.1,15,0.65 ++1,0.6,-0.01,37.1,25,0.768 ++1,0.6,-0.01,37.1,35,1.012 ++1,0.6,0,12.1,-15,5.453 ++1,0.6,0,12.1,-5,4.022 ++1,0.6,0,12.1,5,2.768 ++1,0.6,0,12.1,15,1.976 ++1,0.6,0,12.1,25,2.36 ++1,0.6,0,12.1,35,3.195 ++1,0.6,0,18,-15,4.017 ++1,0.6,0,18,-5,3.101 ++1,0.6,0,18,5,2.289 ++1,0.6,0,18,15,1.774 ++1,0.6,0,18,25,2.031 ++1,0.6,0,18,35,2.581 ++1,0.6,0,25.2,-15,3.037 ++1,0.6,0,25.2,-5,2.5 ++1,0.6,0,25.2,5,2.005 ++1,0.6,0,25.2,15,1.694 ++1,0.6,0,25.2,25,1.876 ++1,0.6,0,25.2,35,2.238 ++1,0.6,0,30,-15,2.696 ++1,0.6,0,30,-5,2.251 ++1,0.6,0,30,5,1.838 ++1,0.6,0,30,15,1.577 ++1,0.6,0,30,25,1.727 ++1,0.6,0,30,35,2.028 ++1,0.6,0,37.1,-15,2.406 ++1,0.6,0,37.1,-5,2.031 ++1,0.6,0,37.1,5,1.685 ++1,0.6,0,37.1,15,1.461 ++1,0.6,0,37.1,25,1.579 ++1,0.6,0,37.1,35,1.824 ++1,0.6,0.01,12.1,-15,6.194 ++1,0.6,0.01,12.1,-5,4.764 ++1,0.6,0.01,12.1,5,3.51 ++1,0.6,0.01,12.1,15,2.718 ++1,0.6,0.01,12.1,25,3.102 ++1,0.6,0.01,12.1,35,3.937 ++1,0.6,0.01,18,-15,4.781 ++1,0.6,0.01,18,-5,3.866 ++1,0.6,0.01,18,5,3.054 ++1,0.6,0.01,18,15,2.539 ++1,0.6,0.01,18,25,2.796 ++1,0.6,0.01,18,35,3.346 ++1,0.6,0.01,25.2,-15,3.807 ++1,0.6,0.01,25.2,-5,3.27 ++1,0.6,0.01,25.2,5,2.775 ++1,0.6,0.01,25.2,15,2.465 ++1,0.6,0.01,25.2,25,2.646 ++1,0.6,0.01,25.2,35,3.009 ++1,0.6,0.01,30,-15,3.486 ++1,0.6,0.01,30,-5,3.041 ++1,0.6,0.01,30,5,2.628 ++1,0.6,0.01,30,15,2.367 ++1,0.6,0.01,30,25,2.517 ++1,0.6,0.01,30,35,2.818 ++1,0.6,0.01,37.1,-15,3.218 ++1,0.6,0.01,37.1,-5,2.843 ++1,0.6,0.01,37.1,5,2.496 ++1,0.6,0.01,37.1,15,2.272 ++1,0.6,0.01,37.1,25,2.391 ++1,0.6,0.01,37.1,35,2.635 ++1,0.6,0.02,12.1,-15,6.936 ++1,0.6,0.02,12.1,-5,5.506 ++1,0.6,0.02,12.1,5,4.252 ++1,0.6,0.02,12.1,15,3.46 ++1,0.6,0.02,12.1,25,3.843 ++1,0.6,0.02,12.1,35,4.678 ++1,0.6,0.02,18,-15,5.546 ++1,0.6,0.02,18,-5,4.63 ++1,0.6,0.02,18,5,3.818 ++1,0.6,0.02,18,15,3.303 ++1,0.6,0.02,18,25,3.56 ++1,0.6,0.02,18,35,4.11 ++1,0.6,0.02,25.2,-15,4.577 ++1,0.6,0.02,25.2,-5,4.04 ++1,0.6,0.02,25.2,5,3.545 ++1,0.6,0.02,25.2,15,3.235 ++1,0.6,0.02,25.2,25,3.416 ++1,0.6,0.02,25.2,35,3.779 ++1,0.6,0.02,30,-15,4.276 ++1,0.6,0.02,30,-5,3.831 ++1,0.6,0.02,30,5,3.418 ++1,0.6,0.02,30,15,3.157 ++1,0.6,0.02,30,25,3.307 ++1,0.6,0.02,30,35,3.608 ++1,0.6,0.02,37.1,-15,4.03 ++1,0.6,0.02,37.1,-5,3.655 ++1,0.6,0.02,37.1,5,3.308 ++1,0.6,0.02,37.1,15,3.084 ++1,0.6,0.02,37.1,25,3.203 ++1,0.6,0.02,37.1,35,3.447 ++1,0.6,0.03,12.1,-15,7.678 ++1,0.6,0.03,12.1,-5,6.247 ++1,0.6,0.03,12.1,5,4.993 ++1,0.6,0.03,12.1,15,4.202 ++1,0.6,0.03,12.1,25,4.585 ++1,0.6,0.03,12.1,35,5.42 ++1,0.6,0.03,18,-15,6.31 ++1,0.6,0.03,18,-5,5.394 ++1,0.6,0.03,18,5,4.582 ++1,0.6,0.03,18,15,4.068 ++1,0.6,0.03,18,25,4.324 ++1,0.6,0.03,18,35,4.874 ++1,0.6,0.03,25.2,-15,5.348 ++1,0.6,0.03,25.2,-5,4.811 ++1,0.6,0.03,25.2,5,4.316 ++1,0.6,0.03,25.2,15,4.006 ++1,0.6,0.03,25.2,25,4.187 ++1,0.6,0.03,25.2,35,4.55 ++1,0.6,0.03,30,-15,5.067 ++1,0.6,0.03,30,-5,4.622 ++1,0.6,0.03,30,5,4.209 ++1,0.6,0.03,30,15,3.948 ++1,0.6,0.03,30,25,4.098 ++1,0.6,0.03,30,35,4.399 ++1,0.6,0.03,37.1,-15,4.842 ++1,0.6,0.03,37.1,-5,4.467 ++1,0.6,0.03,37.1,5,4.12 ++1,0.6,0.03,37.1,15,3.896 ++1,0.6,0.03,37.1,25,4.015 ++1,0.6,0.03,37.1,35,4.259 ++1,0.6,0.04,12.1,-15,8.419 ++1,0.6,0.04,12.1,-5,6.989 ++1,0.6,0.04,12.1,5,5.735 ++1,0.6,0.04,12.1,15,4.943 ++1,0.6,0.04,12.1,25,5.326 ++1,0.6,0.04,12.1,35,6.162 ++1,0.6,0.04,18,-15,7.074 ++1,0.6,0.04,18,-5,6.159 ++1,0.6,0.04,18,5,5.347 ++1,0.6,0.04,18,15,4.832 ++1,0.6,0.04,18,25,5.089 ++1,0.6,0.04,18,35,5.639 ++1,0.6,0.04,25.2,-15,6.12 ++1,0.6,0.04,25.2,-5,5.582 ++1,0.6,0.04,25.2,5,5.087 ++1,0.6,0.04,25.2,15,4.777 ++1,0.6,0.04,25.2,25,4.958 ++1,0.6,0.04,25.2,35,5.321 ++1,0.6,0.04,30,-15,5.858 ++1,0.6,0.04,30,-5,5.413 ++1,0.6,0.04,30,5,5 ++1,0.6,0.04,30,15,4.739 ++1,0.6,0.04,30,25,4.889 ++1,0.6,0.04,30,35,5.19 ++1,0.6,0.04,37.1,-15,5.654 ++1,0.6,0.04,37.1,-5,5.279 ++1,0.6,0.04,37.1,5,4.932 ++1,0.6,0.04,37.1,15,4.708 ++1,0.6,0.04,37.1,25,4.827 ++1,0.6,0.04,37.1,35,5.071 ++1,0.9,-0.04,12.1,-15,2.318 ++1,0.9,-0.04,12.1,-5,0.888 ++1,0.9,-0.04,12.1,5,-0.366 ++1,0.9,-0.04,12.1,15,-0.786 ++1,0.9,-0.04,12.1,25,-0.289 ++1,0.9,-0.04,12.1,35,0.63 ++1,0.9,-0.04,18,-15,0.89 ++1,0.9,-0.04,18,-5,-0.025 ++1,0.9,-0.04,18,5,-0.836 ++1,0.9,-0.04,18,15,-1.097 ++1,0.9,-0.04,18,25,-0.764 ++1,0.9,-0.04,18,35,-0.157 ++1,0.9,-0.04,25.2,-15,-0.099 ++1,0.9,-0.04,25.2,-5,-0.635 ++1,0.9,-0.04,25.2,5,-1.129 ++1,0.9,-0.04,25.2,15,-1.254 ++1,0.9,-0.04,25.2,25,-1.022 ++1,0.9,-0.04,25.2,35,-0.618 ++1,0.9,-0.04,30,-15,-0.4 ++1,0.9,-0.04,30,-5,-0.843 ++1,0.9,-0.04,30,5,-1.254 ++1,0.9,-0.04,30,15,-1.359 ++1,0.9,-0.04,30,25,-1.166 ++1,0.9,-0.04,30,35,-0.829 ++1,0.9,-0.04,37.1,-15,-0.654 ++1,0.9,-0.04,37.1,-5,-1.026 ++1,0.9,-0.04,37.1,5,-1.37 ++1,0.9,-0.04,37.1,15,-1.466 ++1,0.9,-0.04,37.1,25,-1.311 ++1,0.9,-0.04,37.1,35,-1.037 ++1,0.9,-0.03,12.1,-15,3.022 ++1,0.9,-0.03,12.1,-5,1.592 ++1,0.9,-0.03,12.1,5,0.338 ++1,0.9,-0.03,12.1,15,-0.082 ++1,0.9,-0.03,12.1,25,0.415 ++1,0.9,-0.03,12.1,35,1.334 ++1,0.9,-0.03,18,-15,1.61 ++1,0.9,-0.03,18,-5,0.696 ++1,0.9,-0.03,18,5,-0.115 ++1,0.9,-0.03,18,15,-0.377 ++1,0.9,-0.03,18,25,-0.044 ++1,0.9,-0.03,18,35,0.563 ++1,0.9,-0.03,25.2,-15,0.642 ++1,0.9,-0.03,25.2,-5,0.106 ++1,0.9,-0.03,25.2,5,-0.388 ++1,0.9,-0.03,25.2,15,-0.513 ++1,0.9,-0.03,25.2,25,-0.281 ++1,0.9,-0.03,25.2,35,0.122 ++1,0.9,-0.03,30,-15,0.316 ++1,0.9,-0.03,30,-5,-0.127 ++1,0.9,-0.03,30,5,-0.538 ++1,0.9,-0.03,30,15,-0.643 ++1,0.9,-0.03,30,25,-0.45 ++1,0.9,-0.03,30,35,-0.113 ++1,0.9,-0.03,37.1,-15,0.037 ++1,0.9,-0.03,37.1,-5,-0.335 ++1,0.9,-0.03,37.1,5,-0.678 ++1,0.9,-0.03,37.1,15,-0.775 ++1,0.9,-0.03,37.1,25,-0.62 ++1,0.9,-0.03,37.1,35,-0.346 ++1,0.9,-0.02,12.1,-15,3.726 ++1,0.9,-0.02,12.1,-5,2.296 ++1,0.9,-0.02,12.1,5,1.042 ++1,0.9,-0.02,12.1,15,0.622 ++1,0.9,-0.02,12.1,25,1.119 ++1,0.9,-0.02,12.1,35,2.038 ++1,0.9,-0.02,18,-15,2.33 ++1,0.9,-0.02,18,-5,1.416 ++1,0.9,-0.02,18,5,0.605 ++1,0.9,-0.02,18,15,0.343 ++1,0.9,-0.02,18,25,0.676 ++1,0.9,-0.02,18,35,1.283 ++1,0.9,-0.02,25.2,-15,1.383 ++1,0.9,-0.02,25.2,-5,0.847 ++1,0.9,-0.02,25.2,5,0.353 ++1,0.9,-0.02,25.2,15,0.228 ++1,0.9,-0.02,25.2,25,0.46 ++1,0.9,-0.02,25.2,35,0.864 ++1,0.9,-0.02,30,-15,1.032 ++1,0.9,-0.02,30,-5,0.589 ++1,0.9,-0.02,30,5,0.178 ++1,0.9,-0.02,30,15,0.074 ++1,0.9,-0.02,30,25,0.267 ++1,0.9,-0.02,30,35,0.603 ++1,0.9,-0.02,37.1,-15,0.728 ++1,0.9,-0.02,37.1,-5,0.357 ++1,0.9,-0.02,37.1,5,0.013 ++1,0.9,-0.02,37.1,15,-0.084 ++1,0.9,-0.02,37.1,25,0.071 ++1,0.9,-0.02,37.1,35,0.345 ++1,0.9,-0.01,12.1,-15,4.442 ++1,0.9,-0.01,12.1,-5,3.012 ++1,0.9,-0.01,12.1,5,1.758 ++1,0.9,-0.01,12.1,15,1.337 ++1,0.9,-0.01,12.1,25,1.834 ++1,0.9,-0.01,12.1,35,2.753 ++1,0.9,-0.01,18,-15,3.081 ++1,0.9,-0.01,18,-5,2.166 ++1,0.9,-0.01,18,5,1.354 ++1,0.9,-0.01,18,15,1.091 ++1,0.9,-0.01,18,25,1.423 ++1,0.9,-0.01,18,35,2.029 ++1,0.9,-0.01,25.2,-15,2.158 ++1,0.9,-0.01,25.2,-5,1.621 ++1,0.9,-0.01,25.2,5,1.126 ++1,0.9,-0.01,25.2,15,1 ++1,0.9,-0.01,25.2,25,1.231 ++1,0.9,-0.01,25.2,35,1.634 ++1,0.9,-0.01,30,-15,1.807 ++1,0.9,-0.01,30,-5,1.362 ++1,0.9,-0.01,30,5,0.949 ++1,0.9,-0.01,30,15,0.843 ++1,0.9,-0.01,30,25,1.034 ++1,0.9,-0.01,30,35,1.369 ++1,0.9,-0.01,37.1,-15,1.505 ++1,0.9,-0.01,37.1,-5,1.13 ++1,0.9,-0.01,37.1,5,0.783 ++1,0.9,-0.01,37.1,15,0.684 ++1,0.9,-0.01,37.1,25,0.836 ++1,0.9,-0.01,37.1,35,1.108 ++1,0.9,0,12.1,-15,5.264 ++1,0.9,0,12.1,-5,3.834 ++1,0.9,0,12.1,5,2.58 ++1,0.9,0,12.1,15,2.159 ++1,0.9,0,12.1,25,2.656 ++1,0.9,0,12.1,35,3.574 ++1,0.9,0,18,-15,3.927 ++1,0.9,0,18,-5,3.012 ++1,0.9,0,18,5,2.2 ++1,0.9,0,18,15,1.937 ++1,0.9,0,18,25,2.269 ++1,0.9,0,18,35,2.875 ++1,0.9,0,25.2,-15,3.012 ++1,0.9,0,25.2,-5,2.475 ++1,0.9,0,25.2,5,1.98 ++1,0.9,0,25.2,15,1.854 ++1,0.9,0,25.2,25,2.084 ++1,0.9,0,25.2,35,2.487 ++1,0.9,0,30,-15,2.683 ++1,0.9,0,30,-5,2.238 ++1,0.9,0,30,5,1.825 ++1,0.9,0,30,15,1.719 ++1,0.9,0,30,25,1.91 ++1,0.9,0,30,35,2.245 ++1,0.9,0,37.1,-15,2.405 ++1,0.9,0,37.1,-5,2.03 ++1,0.9,0,37.1,5,1.684 ++1,0.9,0,37.1,15,1.584 ++1,0.9,0,37.1,25,1.736 ++1,0.9,0,37.1,35,2.008 ++1,0.9,0.01,12.1,-15,6.087 ++1,0.9,0.01,12.1,-5,4.657 ++1,0.9,0.01,12.1,5,3.403 ++1,0.9,0.01,12.1,15,2.982 ++1,0.9,0.01,12.1,25,3.479 ++1,0.9,0.01,12.1,35,4.397 ++1,0.9,0.01,18,-15,4.776 ++1,0.9,0.01,18,-5,3.86 ++1,0.9,0.01,18,5,3.048 ++1,0.9,0.01,18,15,2.786 ++1,0.9,0.01,18,25,3.117 ++1,0.9,0.01,18,35,3.724 ++1,0.9,0.01,25.2,-15,3.867 ++1,0.9,0.01,25.2,-5,3.329 ++1,0.9,0.01,25.2,5,2.834 ++1,0.9,0.01,25.2,15,2.708 ++1,0.9,0.01,25.2,25,2.939 ++1,0.9,0.01,25.2,35,3.342 ++1,0.9,0.01,30,-15,3.56 ++1,0.9,0.01,30,-5,3.115 ++1,0.9,0.01,30,5,2.702 ++1,0.9,0.01,30,15,2.596 ++1,0.9,0.01,30,25,2.787 ++1,0.9,0.01,30,35,3.122 ++1,0.9,0.01,37.1,-15,3.306 ++1,0.9,0.01,37.1,-5,2.931 ++1,0.9,0.01,37.1,5,2.584 ++1,0.9,0.01,37.1,15,2.484 ++1,0.9,0.01,37.1,25,2.637 ++1,0.9,0.01,37.1,35,2.908 ++1,0.9,0.02,12.1,-15,6.91 ++1,0.9,0.02,12.1,-5,5.48 ++1,0.9,0.02,12.1,5,4.226 ++1,0.9,0.02,12.1,15,3.805 ++1,0.9,0.02,12.1,25,4.302 ++1,0.9,0.02,12.1,35,5.22 ++1,0.9,0.02,18,-15,5.624 ++1,0.9,0.02,18,-5,4.708 ++1,0.9,0.02,18,5,3.896 ++1,0.9,0.02,18,15,3.634 ++1,0.9,0.02,18,25,3.965 ++1,0.9,0.02,18,35,4.572 ++1,0.9,0.02,25.2,-15,4.721 ++1,0.9,0.02,25.2,-5,4.184 ++1,0.9,0.02,25.2,5,3.689 ++1,0.9,0.02,25.2,15,3.563 ++1,0.9,0.02,25.2,25,3.793 ++1,0.9,0.02,25.2,35,4.196 ++1,0.9,0.02,30,-15,4.437 ++1,0.9,0.02,30,-5,3.992 ++1,0.9,0.02,30,5,3.579 ++1,0.9,0.02,30,15,3.473 ++1,0.9,0.02,30,25,3.664 ++1,0.9,0.02,30,35,3.999 ++1,0.9,0.02,37.1,-15,4.207 ++1,0.9,0.02,37.1,-5,3.832 ++1,0.9,0.02,37.1,5,3.485 ++1,0.9,0.02,37.1,15,3.385 ++1,0.9,0.02,37.1,25,3.538 ++1,0.9,0.02,37.1,35,3.809 ++1,0.9,0.03,12.1,-15,7.733 ++1,0.9,0.03,12.1,-5,6.303 ++1,0.9,0.03,12.1,5,5.049 ++1,0.9,0.03,12.1,15,4.628 ++1,0.9,0.03,12.1,25,5.125 ++1,0.9,0.03,12.1,35,6.043 ++1,0.9,0.03,18,-15,6.472 ++1,0.9,0.03,18,-5,5.556 ++1,0.9,0.03,18,5,4.744 ++1,0.9,0.03,18,15,4.482 ++1,0.9,0.03,18,25,4.813 ++1,0.9,0.03,18,35,5.42 ++1,0.9,0.03,25.2,-15,5.576 ++1,0.9,0.03,25.2,-5,5.039 ++1,0.9,0.03,25.2,5,4.544 ++1,0.9,0.03,25.2,15,4.418 ++1,0.9,0.03,25.2,25,4.649 ++1,0.9,0.03,25.2,35,5.052 ++1,0.9,0.03,30,-15,5.314 ++1,0.9,0.03,30,-5,4.869 ++1,0.9,0.03,30,5,4.456 ++1,0.9,0.03,30,15,4.35 ++1,0.9,0.03,30,25,4.541 ++1,0.9,0.03,30,35,4.876 ++1,0.9,0.03,37.1,-15,5.108 ++1,0.9,0.03,37.1,-5,4.733 ++1,0.9,0.03,37.1,5,4.386 ++1,0.9,0.03,37.1,15,4.286 ++1,0.9,0.03,37.1,25,4.439 ++1,0.9,0.03,37.1,35,4.71 ++1,0.9,0.04,12.1,-15,8.556 ++1,0.9,0.04,12.1,-5,7.126 ++1,0.9,0.04,12.1,5,5.871 ++1,0.9,0.04,12.1,15,5.451 ++1,0.9,0.04,12.1,25,5.948 ++1,0.9,0.04,12.1,35,6.866 ++1,0.9,0.04,18,-15,7.32 ++1,0.9,0.04,18,-5,6.404 ++1,0.9,0.04,18,5,5.592 ++1,0.9,0.04,18,15,5.33 ++1,0.9,0.04,18,25,5.661 ++1,0.9,0.04,18,35,6.268 ++1,0.9,0.04,25.2,-15,6.432 ++1,0.9,0.04,25.2,-5,5.895 ++1,0.9,0.04,25.2,5,5.4 ++1,0.9,0.04,25.2,15,5.274 ++1,0.9,0.04,25.2,25,5.505 ++1,0.9,0.04,25.2,35,5.907 ++1,0.9,0.04,30,-15,6.192 ++1,0.9,0.04,30,-5,5.747 ++1,0.9,0.04,30,5,5.334 ++1,0.9,0.04,30,15,5.228 ++1,0.9,0.04,30,25,5.419 ++1,0.9,0.04,30,35,5.754 ++1,0.9,0.04,37.1,-15,6.008 ++1,0.9,0.04,37.1,-5,5.633 ++1,0.9,0.04,37.1,5,5.287 ++1,0.9,0.04,37.1,15,5.187 ++1,0.9,0.04,37.1,25,5.34 ++1,0.9,0.04,37.1,35,5.611 +diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py +index 6318cab..2f9132a 100644 +--- a/ebus_toolbox/consumption.py ++++ b/ebus_toolbox/consumption.py +@@ -1,6 +1,7 @@ + import numpy as np + import csv + import pandas as pd ++ + from scipy.interpolate import interpn +  +  +@@ -16,21 +17,23 @@ class Consumption: +  + with open(kwargs.get("level_of_loading_over_day", "data/examples/default_level_of_loading_over_day.csv")) as f: + reader = csv.DictReader(f) ++ self.lol_by_hour = {} + for row in reader: + self.lol_by_hour.update({int(row['hour']): float(row['level_of_loading'])}) +  + self.consumption_files = {} + self.vehicle_types = vehicle_types +  ++ # ToDo Height Difference, lea + def calculate_consumption(self, time, distance, vehicle_type, charging_type, +- height_difference=0, level_of_loading=None, mean_speed=10): ++ height_difference=0, level_of_loading=None, mean_speed=18): + """ Calculates consumed amount of energy for a given distance. +  + :param time: The date and time at which the trip ends + :type time: datetime.datetime +  + # Is Distance traveled in km correct? seems to be in m +- :param distance: Distance travelled [km] ++ :param distance: Distance travelled [m] + :type distance: float + :param vehicle_type: The vehicle type for which to calculate consumption + :type vehicle_type: str +@@ -40,7 +43,9 @@ class Consumption: + :param height_difference: difference in height between stations in meters- + :type height_difference: float + :param level_of_loading: Level of loading of the bus between empty (=0) and completely full (=1.0) +- :type charging_type: float ++ :type level_of_loading: float ++ :param mean_speed: Mean speed between two stops in kmh ++ :type mean_speed: float +  + :return: Consumed energy [kWh] and delta SOC as tuple + :rtype: (float, float) +@@ -65,64 +70,56 @@ class Consumption: + # If no specific LoL is given, interpolate from demand time series. + if level_of_loading is None: + level_of_loading = np.interp(time.hour, +- list(self.lol_by_hour.keys()), +- list(self.lol_by_hour.values())) ++ list(self.lol_by_hour.keys()), ++ list(self.lol_by_hour.values())) +  + # load consumption csv + consumption_file = self.vehicle_types[vt_ct]["mileage"] +  +- # consumption_files holds interpol functions of csv files which are called directly and held in memory. --> No +- # repeated Generation of multi-dimensional interpolation functionality needed. +- +- # ToDO Same pinciple for vehicle types and names in consumption matrix has to be implemented with correct names +- vehicle_type_nr = dict(CKB=0, SOLO=1)[vehicle_type] ++ # Consumption_files holds interpol functions of csv files which are called directly and held in memory ++ vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] + try: +- # ToDo Check distance unit + mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, + incline=height_difference / distance, + temp=temp, + lol=level_of_loading, +- speed_profile=mean_speed) ++ speed=mean_speed) ++ print(vehicle_type_nr,height_difference / distance, temp, level_of_loading, mean_speed) ++ print(mileage) + return mileage * distance + except KeyError: +- df=pd.read_csv(consumption_file, sep=",") +- vehicle_type_u = df["vehicle_type"].unique() +- incline_u = df["incline"].unique() +- temp_u = df["temp"].unique() +- lol_u = df["level_of_loading"].unique() +- speed_u = df["mean_speed"].unique() +- points=(vehicle_type_u, incline_u,temp_u,lol_u,speed_u) +- +- def func_con(df, vt, inc, temp, lol, speed): +- return df[df["vehicle_type"]==vt * df["incline"]==inc * +- df["temp"]==temp * df["level_of_loading"]==lol * +- df["mean_speed"]==speed].values()[0] +- values = func_con(*np.meshgrid(*points, indexing='ij')) +- +- def interpol_function(vehicle_type,incline,temp,lol,speed): +- point=(vehicle_type,incline,temp,lol,speed) +- return interpn(points, values, point) ++ df = pd.read_csv(consumption_file, sep=",") ++ vehicle_type_u = list(df["vehicle_type"].unique()) ++ incline_u = list(df["incline"].unique()) ++ temp_u = list(df["temp"].unique()) ++ lol_u = list(df["level_of_loading"].unique()) ++ speed_u = list(df["mean_speed_kmh"].unique()) ++ points = (vehicle_type_u, incline_u, temp_u, lol_u, speed_u) ++ values = np.zeros((len(vehicle_type_u), len(incline_u), len(temp_u), len(lol_u), len(speed_u))) ++ ++ # Nested loops for creating values in grid ++ for i, vt in enumerate(vehicle_type_u): ++ for ii, inc in enumerate(incline_u): ++ for iii, temp in enumerate(temp_u): ++ for iv, lol in enumerate(lol_u): ++ for v, speed in enumerate(speed_u): ++ values[i, ii, iii, iv, v] = df[(df["vehicle_type"] == vt) * (df["incline"] == inc) * ++ (df["temp"] == temp) * (df["level_of_loading"] == lol) * ++ (df["mean_speed_kmh"] == speed)][ ++ "consumption_kwh_per_km"] ++ ++ def interpol_function(vehicle_type, incline, temp, lol, speed): ++ point = (vehicle_type, incline, temp, lol, speed) ++ return interpn(points, values, point)[0] ++ + self.consumption_files.update({consumption_file: interpol_function}) +  +- # # load consumption csv +- # consumption_file = self.vehicle_types[vt_ct]["mileage"] +- # try: +- # consumption = self.consumption_files[consumption_file] +- # except KeyError: +- # consumption = {'temperature': [], 'consumption': []} +- # with open(consumption_file, 'r') as f: +- # reader = csv.DictReader(f) +- # for row in reader: +- # consumption['temperature'].append(float(row['Temp.'])) +- # consumption['consumption'].append(float(row['Kat. B'])) +- # self.consumption_files.update({consumption_file: consumption}) +- +- xp = self.consumption_files[consumption_file]['temperature'] +- fp = self.consumption_files[consumption_file]['consumption'] +- +- mileage = np.interp(temp, xp, fp) # kWh / m ++ mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, ++ incline=height_difference / distance, ++ temp=temp, ++ lol=level_of_loading, ++ speed=mean_speed) + consumed_energy = mileage * distance / 1000 # kWh +- + return consumed_energy +  + def get_delta_soc(self, consumed_energy, vehicle_type, charging_type): From ce00aec924307370e902ec9eaf5ac88dd294e60b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 12 Sep 2022 15:59:23 +0200 Subject: [PATCH 204/802] Fix comments and requirements --- ebus_toolbox/consumption.py | 3 --- ebus_toolbox/schedule.py | 4 +--- requirements.txt | 4 +++- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index e5fad4a5..3a453cd8 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,7 +1,6 @@ import numpy as np import csv import pandas as pd - from scipy.interpolate import interpn @@ -30,8 +29,6 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, :param time: The date and time at which the trip ends :type time: datetime.datetime - - # Is Distance traveled in km correct? seems to be in m :param distance: Distance travelled [m] :type distance: float :param vehicle_type: The vehicle type for which to calculate consumption diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index be5a10be..ad92fbf6 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -288,9 +288,7 @@ def generate_scenario(self, args): # filter all rides for that bus vehicle_rotations = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} # sort events for their departure time, so that the matching departure time of an - # arrival event can be read out of the - # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - # element in vid_list + # arrival event can be read out of the element in vid_list vehicle_rotations = {k: v for k, v in sorted( vehicle_rotations.items(), key=lambda x: x[1].departure_time)} rotation_ids = list(vehicle_rotations.keys()) diff --git a/requirements.txt b/requirements.txt index dc2070c8..1dd8492d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ -numpy >= 1.12.0 +numpy matplotlib -e git+https://github.com/rl-institut/spice_ev.git@dev#egg=spiceev +pandas +scipy \ No newline at end of file From 12a7159858b146db363d4c658c4cfa91097ae3be Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 12 Sep 2022 16:14:23 +0200 Subject: [PATCH 205/802] Revert schedule changes --- ebus_toolbox/schedule.py | 236 +++++++++++++++++++++------------------ 1 file changed, 129 insertions(+), 107 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ad92fbf6..e78ff049 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -3,7 +3,7 @@ import random import datetime from os import path -from datetime import timedelta +import warnings from ebus_toolbox.rotation import Rotation from src.scenario import Scenario @@ -11,41 +11,66 @@ class Schedule: - def __init__(self, vehicle_types) -> None: + def __init__(self, vehicle_types, stations_file, **kwargs): """Constructs Schedule object from CSV file containing all trips of schedule :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict + :param stations_file: json of electrified stations + :type stations_file: string + + :raises SystemExit: In case not all mandatory options are provided + + :param kwargs: Command line arguments + :type kwargs: dict """ - # Check if all bus types have both an opp and depot version - # Also make sure that both versions have the same mileage - vehicle_type_names = list(vehicle_types.keys()) - for name in vehicle_type_names: - try: - base, ct = name.rsplit('_', 1) - except ValueError: - continue - if f"{base}_oppb" in vehicle_types and ct == 'dep': - assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_oppb"]["mileage"] - elif f"{base}_depb" in vehicle_types and ct == 'opp': - assert vehicle_types[name]["mileage"] == vehicle_types[f"{base}_depb"]["mileage"] - self.vehicle_types = vehicle_types + # load stations file + if stations_file is None: + stations_file = "examples/electrified_stations.json" + ext = stations_file.split('.')[-1] + if ext != "json": + print("File extension mismatch: electrified_stations file should be .json") + with open(stations_file) as f: + self.stations = json.load(f) self.rotations = {} self.consumption = 0 + self.vehicle_types = vehicle_types + self.original_rotations = None + + # mandatory config parameters + mandatory_options = [ + "min_recharge_deps_oppb", + "min_recharge_deps_depb", + "gc_power_opps", + "gc_power_deps", + "cs_power_opps", + "cs_power_deps_depb", + "cs_power_deps_oppb", + ] + missing = [opt for opt in mandatory_options if kwargs.get(opt) is None] + if missing: + raise SystemExit("The following arguments are required: {}".format(", ".join(missing))) + else: + for opt in mandatory_options: + setattr(self, opt, kwargs.get(opt)) @classmethod - def from_csv(cls, path_to_csv, vehicle_types): + def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): """Constructs Schedule object from CSV file containing all trips of schedule. :param path_to_csv: Path to csv file containing trip data :type path_to_csv: str :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict + :param stations: json of electrified stations + :type stations: string + :param kwargs: Command line arguments + :type kwargs: dict :return: Returns a new instance of Schedule with all trips from csv loaded. :rtype: Schedule """ - schedule = cls(vehicle_types) + schedule = cls(vehicle_types, stations, **kwargs) with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) @@ -53,56 +78,40 @@ def from_csv(cls, path_to_csv, vehicle_types): rotation_id = trip['rotation_id'] if rotation_id not in schedule.rotations.keys(): schedule.rotations.update({ - rotation_id: Rotation(id=rotation_id, vehicle_type=trip['vehicle_type'])}) + rotation_id: Rotation(id=rotation_id, + vehicle_type=trip['vehicle_type'], + schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) return schedule - def remove_rotation_by_id(self, id): - """ Removes a rotation from schedule + def run(self, args): + # each rotation is assigned a vehicle ID + self.assign_vehicles() - :param id: Rotation ID to be removed - :type id: int - """ - del self.rotations[id] + scenario = self.generate_scenario(args) - def filter_rotations(self): - """Based on a given filter definition (tbd), rotations will be dropped from schedule.""" - pass + print("Running Spice EV...") + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + scenario.run('distributed', vars(args).copy()) - def set_charging_type(self, preferred_ct, args, rotation_ids=None): - """ Change charging type of either all or specified rotations. Adjust minimum standing time - at depot after completion of rotation. + return scenario - :param preferred_ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. - :type preferred_ct: str - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace + def set_charging_type(self, ct, rotation_ids=None): + """ Change charging type of either all or specified rotations. Adjust minimum standing time + at depot after completion of rotation. + :param ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. + :type ct: str :param rotation_ids: IDs of rotations for which to set charging type. If None set charging - charging type for all rotations. + charging type for all rotations. :type rotation_ids: list """ - assert preferred_ct in ["oppb", "depb"], f"Invalid charging type: {preferred_ct}" - if rotation_ids is None: - rotation_ids = self.rotations.keys() - - for id in rotation_ids: - rot = self.rotations[id] - capacity_depb = self.vehicle_types[f"{rot.vehicle_type}_depb"]["capacity"] - if preferred_ct == "oppb" or capacity_depb < rot.consumption: - self.rotations[id].charging_type = "oppb" - capacity_oppb = self.vehicle_types[f"{rot.vehicle_type}_depb"]["capacity"] - min_standing_time = \ - (capacity_oppb / args.cs_power_deps_oppb) * args.min_recharge_deps_oppb - else: - self.rotations[id].charging_type = "depb" - min_standing_time = (rot.consumption / args.cs_power_deps_depb) - desired_max_standing_time = \ - (capacity_depb / args.cs_power_deps_depb) * args.min_recharge_deps_oppb - if min_standing_time > desired_max_standing_time: - min_standing_time = desired_max_standing_time + assert ct in ["oppb", "depb"], f"Invalid charging type: {ct}" - rot.earliest_departure_next_rot = rot.arrival_time + timedelta(hours=min_standing_time) + for id, rot in self.rotations.items(): + if rotation_ids is None or id in rotation_ids: + rot.set_charging_type(ct) def assign_vehicles(self): """ Assign vehicle IDs to rotations. A FIFO approach is used. @@ -112,6 +121,7 @@ def assign_vehicles(self): """ rotations_in_progress = [] idle_vehicles = [] + # TODO: create vehicle type counts dict with ct and vt values of all types vehicle_type_counts = {vehicle_type: 0 for vehicle_type in self.vehicle_types.keys()} rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) @@ -169,15 +179,6 @@ def calculate_consumption(self): return self.consumption - def delta_soc_all_trips(self): - """ Computes delta SOC for all trips of all rotations. - Depends on vehicle type and on charging type, since - busses of the same vehicle type may have different - battery sizes for different charging types.""" - - for rot in self.rotations.values(): - rot.delta_soc_all_trips() - def get_departure_of_first_trip(self): """ Finds earliest departure time among all rotations. @@ -196,28 +197,52 @@ def get_arrival_of_last_trip(self): sorted_rotations = sorted(self.rotations.values(), key=lambda rot: rot.arrival_time) return sorted_rotations[-1].arrival_time - def readjust_charging_type(self, args, scenario): + def get_common_stations(self, only_opps=True): """ - Loads rotations with negative soc from spice_ev results and adjusts charging type from - depb to oppb and vice versa. - # todo: it would maybe make sense to change each rotations charging type at a time and not - # todo: all together, as they may influence one another - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace - :param scenario: Scenario object containing results a completed simulation - :type scenario: spice_ev.Scenario + for each rotation key, return set of rotations + that share a station during any trip (with time info) + :param only_opps: only search for opps stations + :type only_opps: boolean + :return: dictionary of rotations """ - negative_rotations = self.get_negative_rotations(scenario) - - print(f"Rotations {negative_rotations} have negative SoC.") - print("Adjust charging types for rotations with negative soc.") - for rot in negative_rotations: - if self.rotations[rot].charging_type == "depb": - self.set_charging_type("oppb", args, [rot]) - # todo: actually this case should not happen, but it still does happen.. why? - else: - self.set_charging_type("depb", args, [rot]) + # rot -> stations with timings + rotations = {} + for rot_key, rotation in self.rotations.items(): + rotations[rot_key] = {} + for t in rotation.trips: + arr_station = self.stations.get(t.arrival_name) + if not only_opps or arr_station is not None and arr_station["type"] == "opps": + # dependent station: add to rotation with arrival time + if t.arrival_name in rotations[rot_key]: + rotations[rot_key][t.arrival_name].append([t.arrival_time, None]) + else: + rotations[rot_key][t.arrival_name] = [[t.arrival_time, None]] + if t.departure_name in rotations[rot_key]: + rotations[rot_key][t.departure_name][-1][1] = t.departure_time + + # check stations for overlaps + rot_set = {} + for rot_key, stations in rotations.items(): + rot_set[rot_key] = {} + for r, alt_stations in rotations.items(): + if rot_key == r: + continue + for station_name, times in stations.items(): + if station_name in alt_stations: + # both at same station. Check for same time + for t in times: + for alt_t in alt_stations[station_name]: + if t[1] is None or alt_t[1] is None: + # no departure: ignore + continue + if max(t[0], alt_t[0]) < min(t[1], alt_t[1]): + # overlap + rot_set[rot_key][r] = min(t[0], alt_t[0]) + break + if r in rot_set[rot_key]: + break + return rot_set def get_negative_rotations(self, scenario): """ @@ -257,15 +282,6 @@ def generate_scenario(self, args): random.seed(args.seed) - # load stations file - if args.electrified_stations is None: - args.electrified_stations = "examples/electrified_stations.json" - ext = args.electrified_stations.split('.')[-1] - if ext != "json": - print("File extension mismatch: electrified_stations file should be .json") - with open(args.electrified_stations) as json_file: - stations_dict = json.load(json_file) - interval = datetime.timedelta(minutes=args.interval) vehicles = {} @@ -288,7 +304,7 @@ def generate_scenario(self, args): # filter all rides for that bus vehicle_rotations = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} # sort events for their departure time, so that the matching departure time of an - # arrival event can be read out of the element in vid_list + # arrival event can be read out of the next element in vid_list vehicle_rotations = {k: v for k, v in sorted( vehicle_rotations.items(), key=lambda x: x[1].departure_time)} rotation_ids = list(vehicle_rotations.keys()) @@ -345,10 +361,8 @@ def generate_scenario(self, args): # time. It may resemble things like delays and/or docking procedures # use buffer time from electrified stations JSON or in case none is # provided use global default from config file - try: - buffer_time = stations_dict[trip.arrival_name]['buffer_time'] - except KeyError: - buffer_time = args.default_buffer_time_opps + buffer_time = self.stations.get(trip.arrival_name, {})\ + .get('buffer_time', args.default_buffer_time_opps) # distinct buffer times depending on time of day can be provided # in that case buffer time is of type dict instead of int @@ -377,16 +391,17 @@ def generate_scenario(self, args): # connect cs and add gc if station is electrified connected_charging_station = None desired_soc = 0 - if gc_name in stations_dict.keys(): - # electrified station - station_type = stations_dict[gc_name]["type"] + try: + # assume electrified station + station = self.stations[gc_name] + station_type = station["type"] if station_type == 'opps' and vehicle_rotations[v].charging_type == 'depb': # a depot bus cannot charge at an opp station station_type = None else: # at opp station, always try to charge as much as you can desired_soc = 1 if station_type == "opps" else args.desired_soc - else: + except KeyError: # non-electrified station station_type = None @@ -401,7 +416,7 @@ def generate_scenario(self, args): connected_charging_station = cs_name_and_type if cs_name not in charging_stations or gc_name not in grid_connectors: - number_cs = stations_dict[gc_name]["n_charging_stations"] + number_cs = station["n_charging_stations"] if station_type == "deps": cs_power = args.cs_power_deps_oppb if ct == 'oppb' \ else args.cs_power_deps_depb @@ -414,7 +429,7 @@ def generate_scenario(self, args): # gc power is not set in config if gc_power is None: - if number_cs != "None": + if number_cs is not None: gc_power = number_cs * cs_power else: # add a really large number @@ -427,7 +442,6 @@ def generate_scenario(self, args): "parent": gc_name } # add one grid connector for each bus station - number_cs = None if number_cs == 'None' else number_cs grid_connectors[gc_name] = { "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, @@ -464,7 +478,8 @@ def generate_scenario(self, args): # ######## END OF VEHICLE EVENTS ########## # # define start and stop times - start = self.get_departure_of_first_trip() - timedelta(minutes=args.signal_time_dif) + start = \ + self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) stop = self.get_arrival_of_last_trip() + interval if args.days is not None: stop = min(stop, start + datetime.timedelta(days=args.days)) @@ -590,6 +605,8 @@ def generate_scenario(self, args): "discharge_curve": bat[3] }) + # TODO: restructure vehicle types for SpiceEV + # create final dict self.scenario = { "scenario": { @@ -614,9 +631,9 @@ def generate_rotations_overview(self, scenario, args): negative_rotations = self.get_negative_rotations(scenario) - interval = timedelta(minutes=args.interval) + interval = datetime.timedelta(minutes=args.interval) sim_start_time = \ - self.get_departure_of_first_trip() - timedelta(minutes=args.signal_time_dif) + self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) for id, rotation in self.rotations.items(): # get SOC timeseries for this rotation @@ -626,6 +643,11 @@ def generate_rotations_overview(self, scenario, args): vehicle_soc = scenario.vehicle_socs[vehicle_id] start_idx = (rotation.departure_time - sim_start_time) // interval end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) + if end_idx > len(vehicle_soc): + # SpiceEV stopped before rotation was fully simulated + print(f"SpiceEV stopped before simulation of rotation {id} was completed. " + "Omit config parameter to simulate entire schedule.") + continue rotation_soc_ts = vehicle_soc[start_idx:end_idx] rotation_info = { From a4f22297036ea2b076df92c1a932c49da368c33a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 12 Sep 2022 16:28:06 +0200 Subject: [PATCH 206/802] Add min version for numpy --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1dd8492d..0d5a005d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy +numpy >= 1.12.0 matplotlib -e git+https://github.com/rl-institut/spice_ev.git@dev#egg=spiceev pandas From a6f67fba84a2340b398d5d93eef4332f54202c2d Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 17:20:22 +0200 Subject: [PATCH 207/802] review comments --- ebus_toolbox/costs.py | 50 ++++++++++++++++++---------------------- ebus_toolbox/schedule.py | 16 ++++--------- ebus_toolbox/simulate.py | 30 +++++++++++++++++++----- 3 files changed, 51 insertions(+), 45 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 597ee316..25c7be52 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,22 +1,15 @@ -import json - - -def calculate_costs(args, schedule): +def calculate_costs(c_params, schedule): """ Calculates annual costs of all necessary vehicles and infrastructure. - :param args: Command line arguments and/or arguments from config file. - :type args: argparse.Namespace + :param c_params: Cost of various infrastructure components. + :type c_params: dict :param schedule: Information about the whole bus schedule and all used parameters. :type schedule: object :return: Investment cost [€], annual investment cost [€/a], annual maintenance cost [€/a] - :rtype: (float, float, float) + :rtype: dict """ # general settings and imports for calculation ROUND_TO_PLACES = 2 - with open(args.cost_params) as json_file: - c_params = json.load(json_file) - with open(args.electrified_stations) as json_file: - el_stations = json.load(json_file) # VEHICLES c_vehicles = 0 @@ -30,19 +23,19 @@ def calculate_costs(args, schedule): except KeyError: print("Warning: No capex defined for vehicle type " + v_type.split("_")[0] + ". Unable to calculate investment costs for this vehicle type.") - else: - # sum up cost of vehicles and their batteries, depending on how often the battery - # has to be replaced in the lifetime of the vehicles - c_vehicles_vt = schedule.vehicle_type_counts[v_type] * \ - (costs_vehicle - - (-c_params["vehicles"][v_type.split("_")[0]]["lifetime"] - // c_params["batteries"]["lifetime_battery"]) * - v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) - c_vehicles += c_vehicles_vt - # calculate annual cost of vehicles of this type, depending on their lifetime - c_vehicles_annual += round(c_vehicles_vt / - c_params["vehicles"][v_type.split("_")[0]]["lifetime"], - ROUND_TO_PLACES) + continue + # sum up cost of vehicles and their batteries, depending on how often the battery + # has to be replaced in the lifetime of the vehicles + c_vehicles_vt = schedule.vehicle_type_counts[v_type] * \ + (costs_vehicle + + (c_params["vehicles"][v_type.split("_")[0]]["lifetime"] + // c_params["batteries"]["lifetime_battery"]) * + v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) + c_vehicles += c_vehicles_vt + # calculate annual cost of vehicles of this type, depending on their lifetime + c_vehicles_annual += round(c_vehicles_vt / + c_params["vehicles"][v_type.split("_")[0]]["lifetime"], + ROUND_TO_PLACES) # GRID CONNECTION POINTS c_gcs = 0 @@ -50,7 +43,7 @@ def calculate_costs(args, schedule): gcs = schedule.scenario["constants"]["grid_connectors"] for gcID, gc_keys in gcs.items(): try: - distance_transformer = el_stations[gcID]["distance_transformer"] + distance_transformer = schedule.stations[gcID]["distance_transformer"] except KeyError: distance_transformer = c_params["gc"]["default_distance"] c_gc = (c_params["gc"]["building_cost_subsidy_per_kW"] * gc_keys["max_power"] + @@ -107,5 +100,8 @@ def calculate_costs(args, schedule): c_invest_annual = round(c_vehicles_annual + c_cs_annual + c_gcs_annual + c_garage_annual, ROUND_TO_PLACES) - return {"c_invest": c_invest, "c_invest_annual": c_invest_annual, - "c_maintenance_annual": c_maintenance_annual} + return { + "c_invest": c_invest, + "c_invest_annual": c_invest_annual, + "c_maintenance_annual": c_maintenance_annual + } diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 0d5c4ee4..6a66b420 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,5 +1,4 @@ import csv -import json import random import datetime from os import path @@ -11,28 +10,21 @@ class Schedule: - def __init__(self, vehicle_types, stations_file, **kwargs): + def __init__(self, vehicle_types, stations, **kwargs): """Constructs Schedule object from CSV file containing all trips of schedule :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict - :param stations_file: json of electrified stations - :type stations_file: string + :param stations: electrified stations + :type stations: dict :raises SystemExit: In case not all mandatory options are provided :param kwargs: Command line arguments :type kwargs: dict """ - # load stations file - if stations_file is None: - stations_file = "examples/electrified_stations.json" - ext = stations_file.split('.')[-1] - if ext != "json": - print("File extension mismatch: electrified_stations file should be .json") - with open(stations_file) as f: - self.stations = json.load(f) + self.stations = stations self.rotations = {} self.consumption = 0 self.vehicle_types = vehicle_types diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 9a5e728e..3df2e67b 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,6 +1,5 @@ # imports import json -import warnings from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip @@ -13,15 +12,34 @@ def simulate(args): :param args: Configuration arguments specified in config files contained in configs directory. :type args: argparse.Namespace + + :raises SystemExit: If an input file does not exist, exit the program. """ + # load vehicle types try: with open(args.vehicle_types) as f: vehicle_types = json.load(f) del args.vehicle_types except FileNotFoundError: - warnings.warn("Invalid path for vehicle type JSON. Using default types from EXAMPLE dir.") - with open("data/examples/vehicle_types.json") as f: - vehicle_types = json.load(f) + raise SystemExit(f"Path to vehicle types ({args.vehicle_types}) " + "does not exist. Exiting...") + + # load stations file + try: + with open(args.electrified_stations) as f: + stations = json.load(f) + except FileNotFoundError: + raise SystemExit(f"Path to electrified stations ({args.electrified_stations}) " + "does not exist. Exiting...") + + # load cost parameters + if args.cost_params is not None: + try: + with open(args.cost_params) as f: + cost_params = json.load(f) + except FileNotFoundError: + raise SystemExit(f"Path to cost parameters ({args.cost_params}) " + "does not exist. Exiting...") # parse strategy options for Spice EV if args.strategy_option is not None: @@ -36,7 +54,7 @@ def simulate(args): schedule = Schedule.from_csv(args.input_schedule, vehicle_types, - args.electrified_stations, + stations, **vars(args)) # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) @@ -55,7 +73,7 @@ def simulate(args): if args.cost_params is not None: # Calculate Costs of Iteration - costs = calculate_costs(args, schedule) + costs = calculate_costs(cost_params, schedule) opex_energy_annual = 0 # ToDo: Import annual energy costs from SpiceEV cost_invest = costs["c_invest"] cost_annual = costs["c_invest_annual"] + costs["c_maintenance_annual"] + opex_energy_annual From 145583e33b2a9c54a0e264477f38dd20554787a0 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 17:51:58 +0200 Subject: [PATCH 208/802] warning for incomplete rotations --- ebus_toolbox/schedule.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 6a66b420..9a10125b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -629,6 +629,7 @@ def generate_rotations_overview(self, scenario, args): sim_start_time = \ self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) + incomplete_rotations = [] for id, rotation in self.rotations.items(): # get SOC timeseries for this rotation vehicle_id = rotation.vehicle_id @@ -639,8 +640,7 @@ def generate_rotations_overview(self, scenario, args): end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) if end_idx > len(vehicle_soc): # SpiceEV stopped before rotation was fully simulated - print(f"SpiceEV stopped before simulation of rotation {id} was completed. " - "Omit config parameter to simulate entire schedule.") + incomplete_rotations.append(id) continue rotation_soc_ts = vehicle_soc[start_idx:end_idx] @@ -661,6 +661,10 @@ def generate_rotations_overview(self, scenario, args): } rotation_infos.append(rotation_info) + warnings.warn("SpiceEV stopped before simulation of the following rotations was completed. " + "Omit config parameter to simulate entire schedule.\n", + ", ".join(incomplete_rotations)) + with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() From ee1ca49c6744dd45fd14b9baa16304de7fb60270 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 17:54:27 +0200 Subject: [PATCH 209/802] fix warning for incomplete rotations --- ebus_toolbox/schedule.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 9a10125b..bcd1f32c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -661,9 +661,10 @@ def generate_rotations_overview(self, scenario, args): } rotation_infos.append(rotation_info) - warnings.warn("SpiceEV stopped before simulation of the following rotations was completed. " - "Omit config parameter to simulate entire schedule.\n", - ", ".join(incomplete_rotations)) + if incomplete_rotations: + warnings.warn("SpiceEV stopped before simulation of the following rotations " + "was completed. Omit parameter to simulate entire schedule.\n", + ", ".join(incomplete_rotations)) with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) From 37a40b8d478191d5440ff648ae0a6650cddf5ed2 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 12 Sep 2022 18:25:44 +0200 Subject: [PATCH 210/802] move rotation overview gen to report.py --- ebus_toolbox/report.py | 56 +++++++++++++++++++++++++++++++++++++++- ebus_toolbox/schedule.py | 51 ------------------------------------ 2 files changed, 55 insertions(+), 52 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 24f0c51c..72c0c72e 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -1,6 +1,60 @@ """ Module to generate meaningful output files and/or figures to describe simulation process """ +import csv +import datetime +import warnings + +from os import path def generate(schedule, scenario, args): - schedule.generate_rotations_overview(scenario, args) + rotation_infos = [] + + negative_rotations = schedule.get_negative_rotations(scenario) + + interval = datetime.timedelta(minutes=args.interval) + sim_start_time = \ + schedule.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) + + incomplete_rotations = [] + for id, rotation in schedule.rotations.items(): + # get SOC timeseries for this rotation + vehicle_id = rotation.vehicle_id + + # get soc timeseries for current rotation + vehicle_soc = scenario.vehicle_socs[vehicle_id] + start_idx = (rotation.departure_time - sim_start_time) // interval + end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) + if end_idx > len(vehicle_soc): + # SpiceEV stopped before rotation was fully simulated + incomplete_rotations.append(id) + continue + rotation_soc_ts = vehicle_soc[start_idx:end_idx] + + rotation_info = { + "rotation_id": id, + "start_time": rotation.departure_time.isoformat(), + "end_time": rotation.arrival_time.isoformat(), + "vehicle_type": rotation.vehicle_type, + "vehicle_id": rotation.vehicle_id, + "depot_name": rotation.departure_name, + "lines": ':'.join(rotation.lines), + "total_consumption_[kWh]": rotation.consumption, + "distance": rotation.distance, + "charging_type": rotation.charging_type, + "SOC_at_arrival": rotation_soc_ts[-1], + "Minimum_SOC": min(rotation_soc_ts), + "Negative_SOC": 1 if id in negative_rotations else 0 + } + rotation_infos.append(rotation_info) + + if incomplete_rotations: + warnings.warn("SpiceEV stopped before simulation of the these rotations were completed:\n" + f"{', '.join(incomplete_rotations)}\n" + "Omit parameter to simulate entire schedule.", + stacklevel=100) + + with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: + csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) + csv_writer.writeheader() + csv_writer.writerows(rotation_infos) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index bcd1f32c..939ae9b4 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -619,54 +619,3 @@ def generate_scenario(self, args): } return Scenario(self.scenario, args.output_directory) - - def generate_rotations_overview(self, scenario, args): - rotation_infos = [] - - negative_rotations = self.get_negative_rotations(scenario) - - interval = datetime.timedelta(minutes=args.interval) - sim_start_time = \ - self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) - - incomplete_rotations = [] - for id, rotation in self.rotations.items(): - # get SOC timeseries for this rotation - vehicle_id = rotation.vehicle_id - - # get soc timeseries for current rotation - vehicle_soc = scenario.vehicle_socs[vehicle_id] - start_idx = (rotation.departure_time - sim_start_time) // interval - end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) - if end_idx > len(vehicle_soc): - # SpiceEV stopped before rotation was fully simulated - incomplete_rotations.append(id) - continue - rotation_soc_ts = vehicle_soc[start_idx:end_idx] - - rotation_info = { - "rotation_id": id, - "start_time": rotation.departure_time.isoformat(), - "end_time": rotation.arrival_time.isoformat(), - "vehicle_type": rotation.vehicle_type, - "vehicle_id": rotation.vehicle_id, - "depot_name": rotation.departure_name, - "lines": ':'.join(rotation.lines), - "total_consumption_[kWh]": rotation.consumption, - "distance": rotation.distance, - "charging_type": rotation.charging_type, - "SOC_at_arrival": rotation_soc_ts[-1], - "Minimum_SOC": min(rotation_soc_ts), - "Negative_SOC": 1 if id in negative_rotations else 0 - } - rotation_infos.append(rotation_info) - - if incomplete_rotations: - warnings.warn("SpiceEV stopped before simulation of the following rotations " - "was completed. Omit parameter to simulate entire schedule.\n", - ", ".join(incomplete_rotations)) - - with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: - csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) - csv_writer.writeheader() - csv_writer.writerows(rotation_infos) From df70db0f48050f54e289088c18f935916f4f7799 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 09:45:46 +0200 Subject: [PATCH 211/802] Add back delta soc in return function. Remove delta function --- ebus_toolbox/consumption.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 3a453cd8..5ca3635b 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -58,7 +58,9 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, # in case a constant mileage is provided if isinstance(self.vehicle_types[vt_ct]['mileage'], float): - return self.vehicle_types[vt_ct]['mileage'] * distance / 1000 + consumed_energy = self.vehicle_types[vt_ct]['mileage'] * distance / 1000 + delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + return consumed_energy, delta_soc temp = np.interp(time.hour, list(self.temperatures_by_hour.keys()), @@ -116,8 +118,7 @@ def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this lol=level_of_loading, speed=mean_speed) consumed_energy = mileage * distance / 1000 # kWh - return consumed_energy - def get_delta_soc(self, consumed_energy, vehicle_type, charging_type): - vt_ct = f"{vehicle_type}_{charging_type}" - return -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + + return consumed_energy, delta_soc \ No newline at end of file From 3e418a400b28196fa9a53f7db20c1aeb96bc3b04 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 09:48:33 +0200 Subject: [PATCH 212/802] Add int to data type check of mileage --- ebus_toolbox/consumption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 5ca3635b..91354981 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -57,7 +57,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, vt_ct = f"{vehicle_type}_{charging_type}" # in case a constant mileage is provided - if isinstance(self.vehicle_types[vt_ct]['mileage'], float): + if isinstance(self.vehicle_types[vt_ct]['mileage'],(int, float)): consumed_energy = self.vehicle_types[vt_ct]['mileage'] * distance / 1000 delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) return consumed_energy, delta_soc From 1595565d974ca4eb3f6582eb7d3f197ed6a4ae2c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 09:53:54 +0200 Subject: [PATCH 213/802] Restore schedule.py from dev --- ebus_toolbox/schedule.py | 68 +++++----------------------------------- 1 file changed, 8 insertions(+), 60 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e78ff049..939ae9b4 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,5 +1,4 @@ import csv -import json import random import datetime from os import path @@ -11,28 +10,21 @@ class Schedule: - def __init__(self, vehicle_types, stations_file, **kwargs): + def __init__(self, vehicle_types, stations, **kwargs): """Constructs Schedule object from CSV file containing all trips of schedule :param vehicle_types: Collection of vehicle types and their properties. :type vehicle_types: dict - :param stations_file: json of electrified stations - :type stations_file: string + :param stations: electrified stations + :type stations: dict :raises SystemExit: In case not all mandatory options are provided :param kwargs: Command line arguments :type kwargs: dict """ - # load stations file - if stations_file is None: - stations_file = "examples/electrified_stations.json" - ext = stations_file.split('.')[-1] - if ext != "json": - print("File extension mismatch: electrified_stations file should be .json") - with open(stations_file) as f: - self.stations = json.load(f) + self.stations = stations self.rotations = {} self.consumption = 0 self.vehicle_types = vehicle_types @@ -127,7 +119,7 @@ def assign_vehicles(self): rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) for rot in rotations: - # find vehicles that have completed rotation and stood for a minimum staning time + # find vehicles that have completed rotation and stood for a minimum standing time # mark those vehicle as idle while rotations_in_progress: # calculate min_standing_time deps @@ -255,7 +247,7 @@ def get_negative_rotations(self, scenario): :rtype: list """ - # get dict of vehicles with negative soc's + # get dict of vehicles with negative SOCs try: negative_vehicles = scenario.negative_soc_tracker except AttributeError: @@ -432,11 +424,13 @@ def generate_scenario(self, args): if number_cs is not None: gc_power = number_cs * cs_power else: + # ToDo: Check reason! Calculate via number of busses? # add a really large number gc_power = 100 * cs_power # add one charging station for each bus at bus station charging_stations[cs_name_and_type] = { + "type": station_type, "max_power": cs_power, "min_power": 0.1 * cs_power, "parent": gc_name @@ -625,49 +619,3 @@ def generate_scenario(self, args): } return Scenario(self.scenario, args.output_directory) - - def generate_rotations_overview(self, scenario, args): - rotation_infos = [] - - negative_rotations = self.get_negative_rotations(scenario) - - interval = datetime.timedelta(minutes=args.interval) - sim_start_time = \ - self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) - - for id, rotation in self.rotations.items(): - # get SOC timeseries for this rotation - vehicle_id = rotation.vehicle_id - - # get soc timeseries for current rotation - vehicle_soc = scenario.vehicle_socs[vehicle_id] - start_idx = (rotation.departure_time - sim_start_time) // interval - end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) - if end_idx > len(vehicle_soc): - # SpiceEV stopped before rotation was fully simulated - print(f"SpiceEV stopped before simulation of rotation {id} was completed. " - "Omit config parameter to simulate entire schedule.") - continue - rotation_soc_ts = vehicle_soc[start_idx:end_idx] - - rotation_info = { - "rotation_id": id, - "start_time": rotation.departure_time.isoformat(), - "end_time": rotation.arrival_time.isoformat(), - "vehicle_type": rotation.vehicle_type, - "vehicle_id": rotation.vehicle_id, - "depot_name": rotation.departure_name, - "lines": ':'.join(rotation.lines), - "total_consumption_[kWh]": rotation.consumption, - "distance": rotation.distance, - "charging_type": rotation.charging_type, - "SOC_at_arrival": rotation_soc_ts[-1], - "Minumum_SOC": min(rotation_soc_ts), - "Negative_SOC": 1 if id in negative_rotations else 0 - } - rotation_infos.append(rotation_info) - - with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: - csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) - csv_writer.writeheader() - csv_writer.writerows(rotation_infos) From e78a1797b2f0af2aead62a833fb49545374e12bd Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 13 Sep 2022 10:31:24 +0200 Subject: [PATCH 214/802] update cost_params description in config --- data/configs/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 9afee72c..94d2f5c4 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -14,7 +14,7 @@ electrified_stations = "data/examples/electrified_stations.json" # vehicle types (defaults to: ./data/examples/vehicle_types.json) vehicle_types = "./data/examples/vehicle_types.json" -# cost parameters (defaults to: ./data/examples/cost_params.json) +# cost parameters (Calculation of costs is optional, defaults to None) cost_params = "./data/examples/cost_params.json" From aecdcc1dec3078657f079af91cdb6ff709ce376e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 10:41:57 +0200 Subject: [PATCH 215/802] Fix missing delta_soc return and change keywords for interpol --- ebus_toolbox/consumption.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 319ac4cb..52583d7a 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -79,12 +79,14 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, # Consumption_files holds interpol functions of csv files which are called directly and held in memory vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] try: - mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, - incline=height_difference / distance, - temp=temp, - lol=level_of_loading, - speed=mean_speed) - return mileage * distance + mileage = self.consumption_files[consumption_file](this_vehicle_type=vehicle_type_nr, + this_incline=height_difference / distance, + this_temp=temp, + this_lol=level_of_loading, + this_speed=mean_speed) + consumed_energy= mileage * distance + delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + return consumed_energy, delta_soc except KeyError: # Creating the interpol function from csv file. df = pd.read_csv(consumption_file, sep=",") @@ -113,11 +115,11 @@ def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this self.consumption_files.update({consumption_file: interpol_function}) - mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, - incline=height_difference / distance, - temp=temp, - lol=level_of_loading, - speed=mean_speed) + mileage = self.consumption_files[consumption_file](this_vehicle_type=vehicle_type_nr, + this_incline=height_difference / distance, + this_temp=temp, + this_lol=level_of_loading, + this_speed=mean_speed) consumed_energy = mileage * distance / 1000 # kWh delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) From e1c4a25fa0d8a285d8a3fa9e8d3d7466858ed9d8 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 10:43:39 +0200 Subject: [PATCH 216/802] Fix Consumption docstring --- ebus_toolbox/consumption.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 52583d7a..602fc0dd 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -44,8 +44,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, :param mean_speed: Mean speed between two stops in km/h :type mean_speed: float - :return: Consumed energy [kWh] - :rtype: float + :return: Consumed energy [kWh] and delta SOC as tuple + :rtype: (float, float) """ # the charging type may not be set From 88ed4f344a0a6f485a873c52e5a79b3cf20453ed Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 11:32:10 +0200 Subject: [PATCH 217/802] Add directory checking and folder creation with timestamp --- ebus_toolbox/__main__.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 67b1fbdc..77825876 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,6 +1,7 @@ import argparse from ebus_toolbox import simulate, util -from os import path +from os import path, makedirs +from datetime import datetime if __name__ == '__main__': parser = argparse.ArgumentParser( @@ -12,7 +13,7 @@ help='Specify what you want to do. Choose one from {sim, \ service_optimization}. sim runs a single simulation with the given inputs. \ service optimization finds the largest set of electrified rotations.') - parser.add_argument('--output_directory', default='data/sim_outputs', nargs='?', + parser.add_argument('--output_directory', default="/data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') parser.add_argument('--preferred_charging_type', '-pct', default='depb', choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ @@ -101,11 +102,22 @@ # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True + + util.set_options_from_config(args, check=True, verbose=False) + + # Create subfolder for specific sim results with timestamp. + # If folder doesnt exists, create folder. + # Needs to happen after set_options_from_config since args.output_directory can be overwritten by config + output_folder = path.join(args.output_directory, datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + args.output_directory = output_folder + if not path.isdir(args.output_directory): + makedirs(args.output_directory) + args.save_timeseries = path.join(args.output_directory, "simulation_spiceEV.csv") args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") - util.set_options_from_config(args, check=True, verbose=False) + # rename special options args.timing = args.eta From 54c7661cc10310bff30f2412610b6ed1b382cc38 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 12:10:12 +0200 Subject: [PATCH 218/802] Change for flake8 --- ebus_toolbox/consumption.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 602fc0dd..3de4a662 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -14,7 +14,8 @@ def __init__(self, vehicle_types, **kwargs) -> None: for row in reader: self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) - with open(kwargs.get("level_of_loading_over_day", "data/examples/default_level_of_loading_over_day.csv")) as f: + with open(kwargs.get("level_of_loading_over_day", + "data/examples/default_level_of_loading_over_day.csv")) as f: reader = csv.DictReader(f) self.lol_by_hour = {} for row in reader: @@ -24,7 +25,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: self.vehicle_types = vehicle_types def calculate_consumption(self, time, distance, vehicle_type, charging_type, - height_difference=0, level_of_loading=None, mean_speed=18): + height_diff=0, level_of_loading=None, mean_speed=18): """ Calculates consumed amount of energy for a given distance. :param time: The date and time at which the trip ends @@ -36,14 +37,14 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, :param charging_type: Charging type for the trip. Consumption differs between distinct types. :type charging_type: str - :param height_difference: difference in height between stations in meters- - :type height_difference: float - :param level_of_loading: Level of loading of the bus between empty (=0) and completely full (=1.0). If None + :param height_diff: difference in height between stations in meters- + :type height_diff: float + :param level_of_loading: Level of loading of the bus between empty (=0) and + completely full (=1.0). If None is provided, Level of loading will be interpolated from timeseries :type level_of_loading: float :param mean_speed: Mean speed between two stops in km/h :type mean_speed: float - :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) """ @@ -76,15 +77,15 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, # load consumption csv consumption_file = self.vehicle_types[vt_ct]["mileage"] - # Consumption_files holds interpol functions of csv files which are called directly and held in memory + # Consumption_files holds interpol functions of csv files which are called directly vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] try: mileage = self.consumption_files[consumption_file](this_vehicle_type=vehicle_type_nr, - this_incline=height_difference / distance, + this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, this_speed=mean_speed) - consumed_energy= mileage * distance + consumed_energy = mileage * distance delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) return consumed_energy, delta_soc except KeyError: @@ -96,16 +97,21 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, lol_u = list(df["level_of_loading"].unique()) speed_u = list(df["mean_speed_kmh"].unique()) points = (vehicle_type_u, incline_u, temp_u, lol_u, speed_u) - values = np.zeros((len(vehicle_type_u), len(incline_u), len(temp_u), len(lol_u), len(speed_u))) + values = np.zeros((len(vehicle_type_u), len(incline_u), + len(temp_u), len(lol_u), len(speed_u))) # Nested loops for creating values in grid for i, vt in enumerate(vehicle_type_u): + mask_vt = df["vehicle_type"] == vt for ii, inc in enumerate(incline_u): + mask_inc = df["incline"] == inc for iii, temp in enumerate(temp_u): + mask_temp = df["temp"] == temp for iv, lol in enumerate(lol_u): + mask_lol = df["level_of_loading"] == lol for v, speed in enumerate(speed_u): - values[i, ii, iii, iv, v] = df[(df["vehicle_type"] == vt) * (df["incline"] == inc) * - (df["temp"] == temp) * (df["level_of_loading"] == lol) * + values[i, ii, iii, iv, v] = df[mask_vt * mask_inc * + mask_temp * mask_lol * (df["mean_speed_kmh"] == speed)][ "consumption_kwh_per_km"] @@ -116,7 +122,7 @@ def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this self.consumption_files.update({consumption_file: interpol_function}) mileage = self.consumption_files[consumption_file](this_vehicle_type=vehicle_type_nr, - this_incline=height_difference / distance, + this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, this_speed=mean_speed) From 7a071cfbfbc86e15bbc187caa36bd8367153282b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 12:13:00 +0200 Subject: [PATCH 219/802] Fix indentation error --- ebus_toolbox/consumption.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 3de4a662..90d92ca0 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -40,8 +40,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, :param height_diff: difference in height between stations in meters- :type height_diff: float :param level_of_loading: Level of loading of the bus between empty (=0) and - completely full (=1.0). If None - is provided, Level of loading will be interpolated from timeseries + completely full (=1.0). If None + is provided, Level of loading will be interpolated from time series :type level_of_loading: float :param mean_speed: Mean speed between two stops in km/h :type mean_speed: float From fa359f887d149bb39201fdc34da3e7df52f97324 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 12:30:58 +0200 Subject: [PATCH 220/802] Fix line length --- ebus_toolbox/__main__.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 77825876..7ae9e057 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -74,7 +74,9 @@ parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', default=2) parser.add_argument('--default_buffer_time_opps', help='time to subtract off of standing time ' - 'at opp station to simulate docking procedure.', default=1) + 'at opp station to simulate docking ' + 'procedure.', + default=1) parser.add_argument('--signal_time_dif', help='time difference between signal time and actual ' 'start time of a vehicle event im min.', default=10) @@ -107,8 +109,10 @@ # Create subfolder for specific sim results with timestamp. # If folder doesnt exists, create folder. - # Needs to happen after set_options_from_config since args.output_directory can be overwritten by config - output_folder = path.join(args.output_directory, datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + # Needs to happen after set_options_from_config since args.output_directory + # can be overwritten by config + output_folder = path.join(args.output_directory, datetime.now(). + strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") args.output_directory = output_folder if not path.isdir(args.output_directory): makedirs(args.output_directory) @@ -117,7 +121,6 @@ args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") - # rename special options args.timing = args.eta From baf76c9d0dc6e38c17b69e3364d5dd5672ba424d Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 14 Sep 2022 10:05:58 +0200 Subject: [PATCH 221/802] visual change --- ebus_toolbox/report.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 72c0c72e..7467314e 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -32,20 +32,20 @@ def generate(schedule, scenario, args): rotation_soc_ts = vehicle_soc[start_idx:end_idx] rotation_info = { - "rotation_id": id, - "start_time": rotation.departure_time.isoformat(), - "end_time": rotation.arrival_time.isoformat(), - "vehicle_type": rotation.vehicle_type, - "vehicle_id": rotation.vehicle_id, - "depot_name": rotation.departure_name, - "lines": ':'.join(rotation.lines), - "total_consumption_[kWh]": rotation.consumption, - "distance": rotation.distance, - "charging_type": rotation.charging_type, - "SOC_at_arrival": rotation_soc_ts[-1], - "Minimum_SOC": min(rotation_soc_ts), - "Negative_SOC": 1 if id in negative_rotations else 0 - } + "rotation_id": id, + "start_time": rotation.departure_time.isoformat(), + "end_time": rotation.arrival_time.isoformat(), + "vehicle_type": rotation.vehicle_type, + "vehicle_id": rotation.vehicle_id, + "depot_name": rotation.departure_name, + "lines": ':'.join(rotation.lines), + "total_consumption_[kWh]": rotation.consumption, + "distance": rotation.distance, + "charging_type": rotation.charging_type, + "SOC_at_arrival": rotation_soc_ts[-1], + "Minimum_SOC": min(rotation_soc_ts), + "Negative_SOC": 1 if id in negative_rotations else 0 + } rotation_infos.append(rotation_info) if incomplete_rotations: From b42c682739e4c7f7c4cb8f559678923f6c41740a Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 14 Sep 2022 10:44:56 +0200 Subject: [PATCH 222/802] replace os.path with pathlib --- ebus_toolbox/__main__.py | 10 ++++++---- ebus_toolbox/report.py | 4 ++-- ebus_toolbox/schedule.py | 20 +++++++++----------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 67b1fbdc..372eed80 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,6 +1,6 @@ import argparse from ebus_toolbox import simulate, util -from os import path +from pathlib import Path if __name__ == '__main__': parser = argparse.ArgumentParser( @@ -101,9 +101,11 @@ # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True - args.save_timeseries = path.join(args.output_directory, "simulation_spiceEV.csv") - args.save_results = path.join(args.output_directory, "simulation_spiceEV.json") - args.save_soc = path.join(args.output_directory, "simulation_soc_spiceEV.csv") + + out_path = Path(args.output_directory) + args.save_timeseries = out_path / "simulation_spiceEV.csv" + args.save_results = out_path / "simulation_spiceEV.json" + args.save_soc = out_path / "simulation_soc_spiceEV.csv" util.set_options_from_config(args, check=True, verbose=False) # rename special options diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 7467314e..3acc9894 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,7 +4,7 @@ import datetime import warnings -from os import path +from pathlib import Path def generate(schedule, scenario, args): @@ -54,7 +54,7 @@ def generate(schedule, scenario, args): "Omit parameter to simulate entire schedule.", stacklevel=100) - with open(path.join(args.output_directory, "rotations.csv"), "w+") as f: + with open(Path(args.output_directory) / "rotations.csv", "w+") as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 939ae9b4..c19390bf 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,8 +1,8 @@ import csv import random import datetime -from os import path import warnings +from pathlib import Path from ebus_toolbox.rotation import Rotation from src.scenario import Scenario @@ -520,7 +520,6 @@ def generate_scenario(self, args): if args.include_ext_load_csv: for filename, gc_name in args.include_ext_load_csv: - basename = path.splitext(path.basename(filename))[0] options = { "csv_file": filename, "start_time": start.isoformat(), @@ -533,15 +532,14 @@ def generate_scenario(self, args): if key == "step_duration_s": value = int(value) options[key] = value - events['external_load'][basename] = options + events['external_load'][Path(filename).stem] = options # check if CSV file exists - ext_csv_path = path.join(args.output_directory, filename) - if not path.exists(ext_csv_path): + ext_csv_path = Path(args.output_directory) / filename + if not ext_csv_path.exists(): print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) if args.include_feed_in_csv: for filename, gc_name in args.include_feed_in_csv: - basename = path.splitext(path.basename(filename))[0] options = { "csv_file": filename, "start_time": start.isoformat(), @@ -554,9 +552,9 @@ def generate_scenario(self, args): if key == "step_duration_s": value = int(value) options[key] = value - events['energy_feed_in'][basename] = options - feed_in_path = path.join(args.output_directory, filename) - if not path.exists(feed_in_path): + events['energy_feed_in'][Path(filename).stem] = options + feed_in_path = Path(args.output_directory) / filename + if not feed_in_path.exists(): print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) if args.include_price_csv: @@ -573,8 +571,8 @@ def generate_scenario(self, args): value = int(value) options[key] = value events['energy_price_from_csv'] = options - price_csv_path = path.join(args.output_directory, filename) - if not path.exists(price_csv_path): + price_csv_path = Path(args.output_directory) / filename + if not price_csv_path.exists(): print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) if args.battery: From 247165be01feb6adf3a57ebf3142f223532081ed Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Sep 2022 11:32:10 +0200 Subject: [PATCH 223/802] Add directory checking and folder creation with timestamp Merge dev into feature/issue_45 with pathlib --- ebus_toolbox/__main__.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 372eed80..1e876841 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,6 +1,7 @@ import argparse from ebus_toolbox import simulate, util from pathlib import Path +from datetime import datetime if __name__ == '__main__': parser = argparse.ArgumentParser( @@ -12,7 +13,7 @@ help='Specify what you want to do. Choose one from {sim, \ service_optimization}. sim runs a single simulation with the given inputs. \ service optimization finds the largest set of electrified rotations.') - parser.add_argument('--output_directory', default='data/sim_outputs', nargs='?', + parser.add_argument('--output_directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') parser.add_argument('--preferred_charging_type', '-pct', default='depb', choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ @@ -102,12 +103,23 @@ args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True + util.set_options_from_config(args, check=True, verbose=False) + out_path = Path(args.output_directory) + out_path = out_path / str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + + # Create subfolder for specific sim results with timestamp. + # If folder doesnt exists, create folder. + # Needs to happen after set_options_from_config since + # args.output_directory can be overwritten by config + args.output_directory = out_path + Path(out_path).mkdir(parents=True, exist_ok=True) + args.save_timeseries = out_path / "simulation_spiceEV.csv" args.save_results = out_path / "simulation_spiceEV.json" args.save_soc = out_path / "simulation_soc_spiceEV.csv" - util.set_options_from_config(args, check=True, verbose=False) + # rename special options args.timing = args.eta From f26191998eb9d591695605d628b35d26a3bab68a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 14 Sep 2022 13:05:26 +0200 Subject: [PATCH 224/802] Remove empty lines --- ebus_toolbox/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 1e876841..d5e30e7f 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -119,7 +119,6 @@ args.save_results = out_path / "simulation_spiceEV.json" args.save_soc = out_path / "simulation_soc_spiceEV.csv" - # rename special options args.timing = args.eta From a8f628d57dd1f9fb7899af2d6af452cc7e7bec2f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 14 Sep 2022 13:55:55 +0200 Subject: [PATCH 225/802] Change output_directory to Path type --- ebus_toolbox/__main__.py | 13 ++++++------- ebus_toolbox/report.py | 2 +- ebus_toolbox/schedule.py | 6 +++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index d5e30e7f..b809de3b 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -105,19 +105,18 @@ util.set_options_from_config(args, check=True, verbose=False) - out_path = Path(args.output_directory) - out_path = out_path / str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + args.output_directory = Path(args.output_directory) / \ + str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") # Create subfolder for specific sim results with timestamp. # If folder doesnt exists, create folder. # Needs to happen after set_options_from_config since # args.output_directory can be overwritten by config - args.output_directory = out_path - Path(out_path).mkdir(parents=True, exist_ok=True) + args.output_directory.mkdir(parents=True, exist_ok=True) - args.save_timeseries = out_path / "simulation_spiceEV.csv" - args.save_results = out_path / "simulation_spiceEV.json" - args.save_soc = out_path / "simulation_soc_spiceEV.csv" + args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" + args.save_results = args.output_directory / "simulation_spiceEV.json" + args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" # rename special options args.timing = args.eta diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 3acc9894..c1ff6244 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -54,7 +54,7 @@ def generate(schedule, scenario, args): "Omit parameter to simulate entire schedule.", stacklevel=100) - with open(Path(args.output_directory) / "rotations.csv", "w+") as f: + with open(args.output_directory / "rotations.csv", "w+") as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c19390bf..1384dc66 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -534,7 +534,7 @@ def generate_scenario(self, args): options[key] = value events['external_load'][Path(filename).stem] = options # check if CSV file exists - ext_csv_path = Path(args.output_directory) / filename + ext_csv_path = args.output_directory / filename if not ext_csv_path.exists(): print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) @@ -553,7 +553,7 @@ def generate_scenario(self, args): value = int(value) options[key] = value events['energy_feed_in'][Path(filename).stem] = options - feed_in_path = Path(args.output_directory) / filename + feed_in_path = args.output_directory / filename if not feed_in_path.exists(): print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) @@ -571,7 +571,7 @@ def generate_scenario(self, args): value = int(value) options[key] = value events['energy_price_from_csv'] = options - price_csv_path = Path(args.output_directory) / filename + price_csv_path = args.output_directory / filename if not price_csv_path.exists(): print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) From 9404b8caf3957bd720122e2e8b34886b35c60c6e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 14 Sep 2022 14:02:41 +0200 Subject: [PATCH 226/802] Remove pathlib import from report.py --- ebus_toolbox/report.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index c1ff6244..ffcb17b5 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,8 +4,6 @@ import datetime import warnings -from pathlib import Path - def generate(schedule, scenario, args): rotation_infos = [] From cb269c8ca8b16132d3a8fdec1d5889c0f6ca67af Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 15 Sep 2022 10:40:04 +0200 Subject: [PATCH 227/802] Add comments for grid, remove redundant return and clean up --- ebus_toolbox/consumption.py | 51 +- s | 2339 ----------------------------------- 2 files changed, 29 insertions(+), 2361 deletions(-) delete mode 100644 s diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 90d92ca0..19e28cab 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -75,32 +75,40 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, list(self.lol_by_hour.values())) # load consumption csv - consumption_file = self.vehicle_types[vt_ct]["mileage"] + consumption_func = self.vehicle_types[vt_ct]["mileage"] # Consumption_files holds interpol functions of csv files which are called directly vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] + + # Try to use the interpol function. If it does not exist yet its created in except case. try: - mileage = self.consumption_files[consumption_file](this_vehicle_type=vehicle_type_nr, + mileage = self.consumption_files[consumption_func](this_vehicle_type=vehicle_type_nr, this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, this_speed=mean_speed) - consumed_energy = mileage * distance - delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) - return consumed_energy, delta_soc except KeyError: # Creating the interpol function from csv file. - df = pd.read_csv(consumption_file, sep=",") - vehicle_type_u = list(df["vehicle_type"].unique()) - incline_u = list(df["incline"].unique()) - temp_u = list(df["temp"].unique()) - lol_u = list(df["level_of_loading"].unique()) - speed_u = list(df["mean_speed_kmh"].unique()) + # Find the unique values of the grid for each dimension, e.g. unique temperatures + # for which consumption values are present. + df = pd.read_csv(consumption_func, sep=",") + vehicle_type_u = df["vehicle_type"].unique() + incline_u = df["incline"].unique() + temp_u = df["temp"].unique() + lol_u = df["level_of_loading"].unique() + speed_u = df["mean_speed_kmh"].unique() points = (vehicle_type_u, incline_u, temp_u, lol_u, speed_u) values = np.zeros((len(vehicle_type_u), len(incline_u), len(temp_u), len(lol_u), len(speed_u))) # Nested loops for creating values in grid + # Each given dependence of consumption, e.g. temperature, speed, level of loading, + # creates a dimension of the value matrix. Eg. 2*Temperatures,4*speeds and + # 3* levels of loading create a 3d matrix, with the shape (2,4,3). While one matrix + # holds all the input values (see "points") another one has to hold all the output + # consumption values. This matrix is filled with this nested for loop (loops in loops) + # Later on the scypy interpn function can get created with the "points" from above and + # the here created value grid. for i, vt in enumerate(vehicle_type_u): mask_vt = df["vehicle_type"] == vt for ii, inc in enumerate(incline_u): @@ -110,24 +118,23 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, for iv, lol in enumerate(lol_u): mask_lol = df["level_of_loading"] == lol for v, speed in enumerate(speed_u): - values[i, ii, iii, iv, v] = df[mask_vt * mask_inc * - mask_temp * mask_lol * - (df["mean_speed_kmh"] == speed)][ - "consumption_kwh_per_km"] + values[i, ii, iii, iv, v] = \ + df[mask_vt * mask_inc * mask_temp * mask_lol * + (df["mean_speed_kmh"] == speed)]["consumption_kwh_per_km"] def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this_speed): point = (this_vehicle_type, this_incline, this_temp, this_lol, this_speed) return interpn(points, values, point)[0] - self.consumption_files.update({consumption_file: interpol_function}) + self.consumption_files.update({consumption_func: interpol_function}) - mileage = self.consumption_files[consumption_file](this_vehicle_type=vehicle_type_nr, - this_incline=height_diff / distance, - this_temp=temp, - this_lol=level_of_loading, - this_speed=mean_speed) - consumed_energy = mileage * distance / 1000 # kWh + mileage = self.consumption_files[consumption_func](this_vehicle_type=vehicle_type_nr, + this_incline=height_diff / distance, + this_temp=temp, + this_lol=level_of_loading, + this_speed=mean_speed) + consumed_energy = mileage * distance / 1000 # kWh delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) return consumed_energy, delta_soc diff --git a/s b/s deleted file mode 100644 index 173d1a4e..00000000 --- a/s +++ /dev/null @@ -1,2339 +0,0 @@ -diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv -index 0579860..ff569e7 100644 ---- a/data/examples/energy_consumption_example.csv -+++ b/data/examples/energy_consumption_example.csv -@@ -1,23 +1,2161 @@ --Temp.,Alle,Kat. A,Kat. B,Kat. C ---8,2.07,2.2,2.04,1.71 ---6,1.9,2.03,1.76,1.59 ---4,1.81,1.89,1.75,1.58 ---2,1.78,1.86,1.65,1.49 --0,1.65,1.73,1.6,1.44 --2,1.61,1.67,1.57,1.38 --4,1.54,1.6,1.48,1.31 --6,1.47,1.52,1.44,1.25 --8,1.4,1.45,1.38,1.19 --10,1.33,1.37,1.3,1.16 --12,1.29,1.32,1.27,1.1 --14,1.2,1.23,1.17,1.04 --16,1.09,1.13,1.06,0.96 --18,1.06,1.08,1.03,0.93 --20,1.04,1.07,1.00,0.92 --22,1.08,1.11,1.03,0.93 --24,1.16,1.19,1.12,0.96 --26,1.23,1.27,1.2,1.03 --28,1.31,1.34,1.25,1.06 --30,1.43,1.46,1.38,1.11 --32,1.44,1.47,1.42,1.17 --34,1.53,1.57,1.45,1.24 -+vehicle_type,level_of_loading,incline,mean_speed_kmh,temp,consumption_kwh_per_km -+0,0,-0.04,12.1,-15,2.967 -+0,0,-0.04,12.1,-5,1.823 -+0,0,-0.04,12.1,5,0.844 -+0,0,-0.04,12.1,15,0.034 -+0,0,-0.04,12.1,25,-0.181 -+0,0,-0.04,12.1,35,0.314 -+0,0,-0.04,18,-15,1.658 -+0,0,-0.04,18,-5,0.939 -+0,0,-0.04,18,5,0.317 -+0,0,-0.04,18,15,-0.208 -+0,0,-0.04,18,25,-0.353 -+0,0,-0.04,18,35,-0.034 -+0,0,-0.04,25.2,-15,0.724 -+0,0,-0.04,25.2,-5,0.33 -+0,0,-0.04,25.2,5,-0.026 -+0,0,-0.04,25.2,15,-0.347 -+0,0,-0.04,25.2,25,-0.445 -+0,0,-0.04,25.2,35,-0.248 -+0,0,-0.04,30,-15,0.476 -+0,0,-0.04,30,-5,0.153 -+0,0,-0.04,30,5,-0.141 -+0,0,-0.04,30,15,-0.408 -+0,0,-0.04,30,25,-0.492 -+0,0,-0.04,30,35,-0.33 -+0,0,-0.04,37.1,-15,0.281 -+0,0,-0.04,37.1,-5,0.008 -+0,0,-0.04,37.1,5,-0.241 -+0,0,-0.04,37.1,15,-0.465 -+0,0,-0.04,37.1,25,-0.536 -+0,0,-0.04,37.1,35,-0.404 -+0,0,-0.03,12.1,-15,3.297 -+0,0,-0.03,12.1,-5,2.153 -+0,0,-0.03,12.1,5,1.175 -+0,0,-0.03,12.1,15,0.365 -+0,0,-0.03,12.1,25,0.149 -+0,0,-0.03,12.1,35,0.644 -+0,0,-0.03,18,-15,1.996 -+0,0,-0.03,18,-5,1.277 -+0,0,-0.03,18,5,0.654 -+0,0,-0.03,18,15,0.13 -+0,0,-0.03,18,25,-0.015 -+0,0,-0.03,18,35,0.304 -+0,0,-0.03,25.2,-15,1.072 -+0,0,-0.03,25.2,-5,0.678 -+0,0,-0.03,25.2,5,0.321 -+0,0,-0.03,25.2,15,0.001 -+0,0,-0.03,25.2,25,-0.097 -+0,0,-0.03,25.2,35,0.099 -+0,0,-0.03,30,-15,0.812 -+0,0,-0.03,30,-5,0.489 -+0,0,-0.03,30,5,0.195 -+0,0,-0.03,30,15,-0.072 -+0,0,-0.03,30,25,-0.156 -+0,0,-0.03,30,35,0.006 -+0,0,-0.03,37.1,-15,0.606 -+0,0,-0.03,37.1,-5,0.332 -+0,0,-0.03,37.1,5,0.084 -+0,0,-0.03,37.1,15,-0.14 -+0,0,-0.03,37.1,25,-0.212 -+0,0,-0.03,37.1,35,-0.08 -+0,0,-0.02,12.1,-15,3.628 -+0,0,-0.02,12.1,-5,2.484 -+0,0,-0.02,12.1,5,1.505 -+0,0,-0.02,12.1,15,0.695 -+0,0,-0.02,12.1,25,0.48 -+0,0,-0.02,12.1,35,0.974 -+0,0,-0.02,18,-15,2.334 -+0,0,-0.02,18,-5,1.615 -+0,0,-0.02,18,5,0.992 -+0,0,-0.02,18,15,0.467 -+0,0,-0.02,18,25,0.322 -+0,0,-0.02,18,35,0.642 -+0,0,-0.02,25.2,-15,1.42 -+0,0,-0.02,25.2,-5,1.026 -+0,0,-0.02,25.2,5,0.669 -+0,0,-0.02,25.2,15,0.349 -+0,0,-0.02,25.2,25,0.251 -+0,0,-0.02,25.2,35,0.447 -+0,0,-0.02,30,-15,1.148 -+0,0,-0.02,30,-5,0.826 -+0,0,-0.02,30,5,0.531 -+0,0,-0.02,30,15,0.264 -+0,0,-0.02,30,25,0.18 -+0,0,-0.02,30,35,0.342 -+0,0,-0.02,37.1,-15,0.93 -+0,0,-0.02,37.1,-5,0.657 -+0,0,-0.02,37.1,5,0.408 -+0,0,-0.02,37.1,15,0.184 -+0,0,-0.02,37.1,25,0.113 -+0,0,-0.02,37.1,35,0.245 -+0,0,-0.01,12.1,-15,3.97 -+0,0,-0.01,12.1,-5,2.826 -+0,0,-0.01,12.1,5,1.847 -+0,0,-0.01,12.1,15,1.036 -+0,0,-0.01,12.1,25,0.82 -+0,0,-0.01,12.1,35,1.315 -+0,0,-0.01,18,-15,2.702 -+0,0,-0.01,18,-5,1.982 -+0,0,-0.01,18,5,1.358 -+0,0,-0.01,18,15,0.833 -+0,0,-0.01,18,25,0.687 -+0,0,-0.01,18,35,1.005 -+0,0,-0.01,25.2,-15,1.8 -+0,0,-0.01,25.2,-5,1.406 -+0,0,-0.01,25.2,5,1.048 -+0,0,-0.01,25.2,15,0.726 -+0,0,-0.01,25.2,25,0.627 -+0,0,-0.01,25.2,35,0.823 -+0,0,-0.01,30,-15,1.541 -+0,0,-0.01,30,-5,1.217 -+0,0,-0.01,30,5,0.92 -+0,0,-0.01,30,15,0.651 -+0,0,-0.01,30,25,0.566 -+0,0,-0.01,30,35,0.726 -+0,0,-0.01,37.1,-15,1.338 -+0,0,-0.01,37.1,-5,1.062 -+0,0,-0.01,37.1,5,0.81 -+0,0,-0.01,37.1,15,0.583 -+0,0,-0.01,37.1,25,0.51 -+0,0,-0.01,37.1,35,0.639 -+0,0,0,12.1,-15,4.356 -+0,0,0,12.1,-5,3.211 -+0,0,0,12.1,5,2.232 -+0,0,0,12.1,15,1.422 -+0,0,0,12.1,25,1.206 -+0,0,0,12.1,35,1.7 -+0,0,0,18,-15,3.099 -+0,0,0,18,-5,2.379 -+0,0,0,18,5,1.756 -+0,0,0,18,15,1.23 -+0,0,0,18,25,1.084 -+0,0,0,18,35,1.402 -+0,0,0,25.2,-15,2.201 -+0,0,0,25.2,-5,1.806 -+0,0,0,25.2,5,1.448 -+0,0,0,25.2,15,1.127 -+0,0,0,25.2,25,1.028 -+0,0,0,25.2,35,1.223 -+0,0,0,30,-15,1.953 -+0,0,0,30,-5,1.628 -+0,0,0,30,5,1.331 -+0,0,0,30,15,1.062 -+0,0,0,30,25,0.977 -+0,0,0,30,35,1.137 -+0,0,0,37.1,-15,1.76 -+0,0,0,37.1,-5,1.484 -+0,0,0,37.1,5,1.232 -+0,0,0,37.1,15,1.006 -+0,0,0,37.1,25,0.932 -+0,0,0,37.1,35,1.062 -+0,0,0.01,12.1,-15,4.742 -+0,0,0.01,12.1,-5,3.597 -+0,0,0.01,12.1,5,2.618 -+0,0,0.01,12.1,15,1.808 -+0,0,0.01,12.1,25,1.592 -+0,0,0.01,12.1,35,2.087 -+0,0,0.01,18,-15,3.497 -+0,0,0.01,18,-5,2.777 -+0,0,0.01,18,5,2.154 -+0,0,0.01,18,15,1.628 -+0,0,0.01,18,25,1.482 -+0,0,0.01,18,35,1.8 -+0,0,0.01,25.2,-15,2.602 -+0,0,0.01,25.2,-5,2.207 -+0,0,0.01,25.2,5,1.849 -+0,0,0.01,25.2,15,1.528 -+0,0,0.01,25.2,25,1.429 -+0,0,0.01,25.2,35,1.624 -+0,0,0.01,30,-15,2.364 -+0,0,0.01,30,-5,2.039 -+0,0,0.01,30,5,1.743 -+0,0,0.01,30,15,1.474 -+0,0,0.01,30,25,1.388 -+0,0,0.01,30,35,1.548 -+0,0,0.01,37.1,-15,2.183 -+0,0,0.01,37.1,-5,1.907 -+0,0,0.01,37.1,5,1.655 -+0,0,0.01,37.1,15,1.428 -+0,0,0.01,37.1,25,1.354 -+0,0,0.01,37.1,35,1.484 -+0,0,0.02,12.1,-15,5.128 -+0,0,0.02,12.1,-5,3.983 -+0,0,0.02,12.1,5,3.005 -+0,0,0.02,12.1,15,2.194 -+0,0,0.02,12.1,25,1.978 -+0,0,0.02,12.1,35,2.473 -+0,0,0.02,18,-15,3.895 -+0,0,0.02,18,-5,3.175 -+0,0,0.02,18,5,2.551 -+0,0,0.02,18,15,2.026 -+0,0,0.02,18,25,1.88 -+0,0,0.02,18,35,2.198 -+0,0,0.02,25.2,-15,3.003 -+0,0,0.02,25.2,-5,2.608 -+0,0,0.02,25.2,5,2.25 -+0,0,0.02,25.2,15,1.928 -+0,0,0.02,25.2,25,1.83 -+0,0,0.02,25.2,35,2.025 -+0,0,0.02,30,-15,2.775 -+0,0,0.02,30,-5,2.451 -+0,0,0.02,30,5,2.154 -+0,0,0.02,30,15,1.885 -+0,0,0.02,30,25,1.8 -+0,0,0.02,30,35,1.96 -+0,0,0.02,37.1,-15,2.606 -+0,0,0.02,37.1,-5,2.329 -+0,0,0.02,37.1,5,2.078 -+0,0,0.02,37.1,15,1.851 -+0,0,0.02,37.1,25,1.777 -+0,0,0.02,37.1,35,1.907 -+0,0,0.03,12.1,-15,5.514 -+0,0,0.03,12.1,-5,4.37 -+0,0,0.03,12.1,5,3.391 -+0,0,0.03,12.1,15,2.58 -+0,0,0.03,12.1,25,2.364 -+0,0,0.03,12.1,35,2.859 -+0,0,0.03,18,-15,4.293 -+0,0,0.03,18,-5,3.573 -+0,0,0.03,18,5,2.949 -+0,0,0.03,18,15,2.424 -+0,0,0.03,18,25,2.278 -+0,0,0.03,18,35,2.596 -+0,0,0.03,25.2,-15,3.405 -+0,0,0.03,25.2,-5,3.01 -+0,0,0.03,25.2,5,2.652 -+0,0,0.03,25.2,15,2.33 -+0,0,0.03,25.2,25,2.231 -+0,0,0.03,25.2,35,2.427 -+0,0,0.03,30,-15,3.187 -+0,0,0.03,30,-5,2.862 -+0,0,0.03,30,5,2.566 -+0,0,0.03,30,15,2.297 -+0,0,0.03,30,25,2.211 -+0,0,0.03,30,35,2.371 -+0,0,0.03,37.1,-15,3.028 -+0,0,0.03,37.1,-5,2.752 -+0,0,0.03,37.1,5,2.5 -+0,0,0.03,37.1,15,2.274 -+0,0,0.03,37.1,25,2.2 -+0,0,0.03,37.1,35,2.329 -+0,0,0.04,12.1,-15,5.9 -+0,0,0.04,12.1,-5,4.756 -+0,0,0.04,12.1,5,3.777 -+0,0,0.04,12.1,15,2.966 -+0,0,0.04,12.1,25,2.75 -+0,0,0.04,12.1,35,3.245 -+0,0,0.04,18,-15,4.691 -+0,0,0.04,18,-5,3.971 -+0,0,0.04,18,5,3.347 -+0,0,0.04,18,15,2.821 -+0,0,0.04,18,25,2.676 -+0,0,0.04,18,35,2.994 -+0,0,0.04,25.2,-15,3.806 -+0,0,0.04,25.2,-5,3.411 -+0,0,0.04,25.2,5,3.053 -+0,0,0.04,25.2,15,2.732 -+0,0,0.04,25.2,25,2.633 -+0,0,0.04,25.2,35,2.828 -+0,0,0.04,30,-15,3.599 -+0,0,0.04,30,-5,3.274 -+0,0,0.04,30,5,2.977 -+0,0,0.04,30,15,2.709 -+0,0,0.04,30,25,2.623 -+0,0,0.04,30,35,2.783 -+0,0,0.04,37.1,-15,3.451 -+0,0,0.04,37.1,-5,3.175 -+0,0,0.04,37.1,5,2.923 -+0,0,0.04,37.1,15,2.696 -+0,0,0.04,37.1,25,2.623 -+0,0,0.04,37.1,35,2.752 -+0,0.3,-0.04,12.1,-15,2.648 -+0,0.3,-0.04,12.1,-5,1.504 -+0,0.3,-0.04,12.1,5,0.526 -+0,0.3,-0.04,12.1,15,-0.284 -+0,0.3,-0.04,12.1,25,-0.177 -+0,0.3,-0.04,12.1,35,0.373 -+0,0.3,-0.04,18,-15,1.4 -+0,0.3,-0.04,18,-5,0.682 -+0,0.3,-0.04,18,5,0.059 -+0,0.3,-0.04,18,15,-0.466 -+0,0.3,-0.04,18,25,-0.393 -+0,0.3,-0.04,18,35,-0.036 -+0,0.3,-0.04,25.2,-15,0.505 -+0,0.3,-0.04,25.2,-5,0.111 -+0,0.3,-0.04,25.2,5,-0.246 -+0,0.3,-0.04,25.2,15,-0.566 -+0,0.3,-0.04,25.2,25,-0.508 -+0,0.3,-0.04,25.2,35,-0.285 -+0,0.3,-0.04,30,-15,0.268 -+0,0.3,-0.04,30,-5,-0.054 -+0,0.3,-0.04,30,5,-0.349 -+0,0.3,-0.04,30,15,-0.616 -+0,0.3,-0.04,30,25,-0.569 -+0,0.3,-0.04,30,35,-0.385 -+0,0.3,-0.04,37.1,-15,0.085 -+0,0.3,-0.04,37.1,-5,-0.189 -+0,0.3,-0.04,37.1,5,-0.437 -+0,0.3,-0.04,37.1,15,-0.661 -+0,0.3,-0.04,37.1,25,-0.627 -+0,0.3,-0.04,37.1,35,-0.477 -+0,0.3,-0.03,12.1,-15,3.025 -+0,0.3,-0.03,12.1,-5,1.881 -+0,0.3,-0.03,12.1,5,0.902 -+0,0.3,-0.03,12.1,15,0.092 -+0,0.3,-0.03,12.1,25,0.2 -+0,0.3,-0.03,12.1,35,0.75 -+0,0.3,-0.03,18,-15,1.786 -+0,0.3,-0.03,18,-5,1.067 -+0,0.3,-0.03,18,5,0.444 -+0,0.3,-0.03,18,15,-0.08 -+0,0.3,-0.03,18,25,-0.007 -+0,0.3,-0.03,18,35,0.349 -+0,0.3,-0.03,25.2,-15,0.901 -+0,0.3,-0.03,25.2,-5,0.507 -+0,0.3,-0.03,25.2,5,0.151 -+0,0.3,-0.03,25.2,15,-0.17 -+0,0.3,-0.03,25.2,25,-0.112 -+0,0.3,-0.03,25.2,35,0.111 -+0,0.3,-0.03,30,-15,0.651 -+0,0.3,-0.03,30,-5,0.329 -+0,0.3,-0.03,30,5,0.034 -+0,0.3,-0.03,30,15,-0.233 -+0,0.3,-0.03,30,25,-0.186 -+0,0.3,-0.03,30,35,-0.002 -+0,0.3,-0.03,37.1,-15,0.455 -+0,0.3,-0.03,37.1,-5,0.181 -+0,0.3,-0.03,37.1,5,-0.067 -+0,0.3,-0.03,37.1,15,-0.292 -+0,0.3,-0.03,37.1,25,-0.257 -+0,0.3,-0.03,37.1,35,-0.107 -+0,0.3,-0.02,12.1,-15,3.402 -+0,0.3,-0.02,12.1,-5,2.257 -+0,0.3,-0.02,12.1,5,1.279 -+0,0.3,-0.02,12.1,15,0.469 -+0,0.3,-0.02,12.1,25,0.577 -+0,0.3,-0.02,12.1,35,1.127 -+0,0.3,-0.02,18,-15,2.171 -+0,0.3,-0.02,18,-5,1.452 -+0,0.3,-0.02,18,5,0.83 -+0,0.3,-0.02,18,15,0.305 -+0,0.3,-0.02,18,25,0.378 -+0,0.3,-0.02,18,35,0.735 -+0,0.3,-0.02,25.2,-15,1.298 -+0,0.3,-0.02,25.2,-5,0.904 -+0,0.3,-0.02,25.2,5,0.548 -+0,0.3,-0.02,25.2,15,0.227 -+0,0.3,-0.02,25.2,25,0.285 -+0,0.3,-0.02,25.2,35,0.508 -+0,0.3,-0.02,30,-15,1.035 -+0,0.3,-0.02,30,-5,0.713 -+0,0.3,-0.02,30,5,0.418 -+0,0.3,-0.02,30,15,0.151 -+0,0.3,-0.02,30,25,0.198 -+0,0.3,-0.02,30,35,0.382 -+0,0.3,-0.02,37.1,-15,0.825 -+0,0.3,-0.02,37.1,-5,0.551 -+0,0.3,-0.02,37.1,5,0.303 -+0,0.3,-0.02,37.1,15,0.078 -+0,0.3,-0.02,37.1,25,0.113 -+0,0.3,-0.02,37.1,35,0.263 -+0,0.3,-0.01,12.1,-15,3.79 -+0,0.3,-0.01,12.1,-5,2.646 -+0,0.3,-0.01,12.1,5,1.667 -+0,0.3,-0.01,12.1,15,0.856 -+0,0.3,-0.01,12.1,25,0.964 -+0,0.3,-0.01,12.1,35,1.514 -+0,0.3,-0.01,18,-15,2.587 -+0,0.3,-0.01,18,-5,1.867 -+0,0.3,-0.01,18,5,1.243 -+0,0.3,-0.01,18,15,0.717 -+0,0.3,-0.01,18,25,0.79 -+0,0.3,-0.01,18,35,1.145 -+0,0.3,-0.01,25.2,-15,1.728 -+0,0.3,-0.01,25.2,-5,1.333 -+0,0.3,-0.01,25.2,5,0.975 -+0,0.3,-0.01,25.2,15,0.653 -+0,0.3,-0.01,25.2,25,0.71 -+0,0.3,-0.01,25.2,35,0.932 -+0,0.3,-0.01,30,-15,1.475 -+0,0.3,-0.01,30,-5,1.151 -+0,0.3,-0.01,30,5,0.854 -+0,0.3,-0.01,30,15,0.585 -+0,0.3,-0.01,30,25,0.63 -+0,0.3,-0.01,30,35,0.813 -+0,0.3,-0.01,37.1,-15,1.278 -+0,0.3,-0.01,37.1,-5,1.002 -+0,0.3,-0.01,37.1,5,0.75 -+0,0.3,-0.01,37.1,15,0.523 -+0,0.3,-0.01,37.1,25,0.555 -+0,0.3,-0.01,37.1,35,0.703 -+0,0.3,0,12.1,-15,4.23 -+0,0.3,0,12.1,-5,3.086 -+0,0.3,0,12.1,5,2.107 -+0,0.3,0,12.1,15,1.296 -+0,0.3,0,12.1,25,1.404 -+0,0.3,0,12.1,35,1.953 -+0,0.3,0,18,-15,3.04 -+0,0.3,0,18,-5,2.32 -+0,0.3,0,18,5,1.696 -+0,0.3,0,18,15,1.17 -+0,0.3,0,18,25,1.243 -+0,0.3,0,18,35,1.598 -+0,0.3,0,25.2,-15,2.185 -+0,0.3,0,25.2,-5,1.79 -+0,0.3,0,25.2,5,1.432 -+0,0.3,0,25.2,15,1.11 -+0,0.3,0,25.2,25,1.167 -+0,0.3,0,25.2,35,1.389 -+0,0.3,0,30,-15,1.944 -+0,0.3,0,30,-5,1.619 -+0,0.3,0,30,5,1.323 -+0,0.3,0,30,15,1.054 -+0,0.3,0,30,25,1.099 -+0,0.3,0,30,35,1.282 -+0,0.3,0,37.1,-15,1.759 -+0,0.3,0,37.1,-5,1.483 -+0,0.3,0,37.1,5,1.232 -+0,0.3,0,37.1,15,1.005 -+0,0.3,0,37.1,25,1.037 -+0,0.3,0,37.1,35,1.184 -+0,0.3,0.01,12.1,-15,4.67 -+0,0.3,0.01,12.1,-5,3.526 -+0,0.3,0.01,12.1,5,2.547 -+0,0.3,0.01,12.1,15,1.737 -+0,0.3,0.01,12.1,25,1.844 -+0,0.3,0.01,12.1,35,2.394 -+0,0.3,0.01,18,-15,3.494 -+0,0.3,0.01,18,-5,2.773 -+0,0.3,0.01,18,5,2.15 -+0,0.3,0.01,18,15,1.624 -+0,0.3,0.01,18,25,1.696 -+0,0.3,0.01,18,35,2.052 -+0,0.3,0.01,25.2,-15,2.642 -+0,0.3,0.01,25.2,-5,2.247 -+0,0.3,0.01,25.2,5,1.889 -+0,0.3,0.01,25.2,15,1.567 -+0,0.3,0.01,25.2,25,1.624 -+0,0.3,0.01,25.2,35,1.846 -+0,0.3,0.01,30,-15,2.413 -+0,0.3,0.01,30,-5,2.089 -+0,0.3,0.01,30,5,1.792 -+0,0.3,0.01,30,15,1.523 -+0,0.3,0.01,30,25,1.568 -+0,0.3,0.01,30,35,1.751 -+0,0.3,0.01,37.1,-15,2.241 -+0,0.3,0.01,37.1,-5,1.965 -+0,0.3,0.01,37.1,5,1.713 -+0,0.3,0.01,37.1,15,1.487 -+0,0.3,0.01,37.1,25,1.518 -+0,0.3,0.01,37.1,35,1.666 -+0,0.3,0.02,12.1,-15,5.111 -+0,0.3,0.02,12.1,-5,3.966 -+0,0.3,0.02,12.1,5,2.987 -+0,0.3,0.02,12.1,15,2.177 -+0,0.3,0.02,12.1,25,2.284 -+0,0.3,0.02,12.1,35,2.834 -+0,0.3,0.02,18,-15,3.947 -+0,0.3,0.02,18,-5,3.227 -+0,0.3,0.02,18,5,2.604 -+0,0.3,0.02,18,15,2.078 -+0,0.3,0.02,18,25,2.15 -+0,0.3,0.02,18,35,2.506 -+0,0.3,0.02,25.2,-15,3.099 -+0,0.3,0.02,25.2,-5,2.704 -+0,0.3,0.02,25.2,5,2.346 -+0,0.3,0.02,25.2,15,2.024 -+0,0.3,0.02,25.2,25,2.081 -+0,0.3,0.02,25.2,35,2.303 -+0,0.3,0.02,30,-15,2.882 -+0,0.3,0.02,30,-5,2.558 -+0,0.3,0.02,30,5,2.261 -+0,0.3,0.02,30,15,1.992 -+0,0.3,0.02,30,25,2.037 -+0,0.3,0.02,30,35,2.22 -+0,0.3,0.02,37.1,-15,2.723 -+0,0.3,0.02,37.1,-5,2.447 -+0,0.3,0.02,37.1,5,2.195 -+0,0.3,0.02,37.1,15,1.969 -+0,0.3,0.02,37.1,25,2.001 -+0,0.3,0.02,37.1,35,2.148 -+0,0.3,0.03,12.1,-15,5.551 -+0,0.3,0.03,12.1,-5,4.406 -+0,0.3,0.03,12.1,5,3.428 -+0,0.3,0.03,12.1,15,2.617 -+0,0.3,0.03,12.1,25,2.724 -+0,0.3,0.03,12.1,35,3.274 -+0,0.3,0.03,18,-15,4.401 -+0,0.3,0.03,18,-5,3.681 -+0,0.3,0.03,18,5,3.057 -+0,0.3,0.03,18,15,2.532 -+0,0.3,0.03,18,25,2.604 -+0,0.3,0.03,18,35,2.96 -+0,0.3,0.03,25.2,-15,3.557 -+0,0.3,0.03,25.2,-5,3.162 -+0,0.3,0.03,25.2,5,2.804 -+0,0.3,0.03,25.2,15,2.482 -+0,0.3,0.03,25.2,25,2.539 -+0,0.3,0.03,25.2,35,2.761 -+0,0.3,0.03,30,-15,3.352 -+0,0.3,0.03,30,-5,3.027 -+0,0.3,0.03,30,5,2.73 -+0,0.3,0.03,30,15,2.462 -+0,0.3,0.03,30,25,2.507 -+0,0.3,0.03,30,35,2.689 -+0,0.3,0.03,37.1,-15,3.205 -+0,0.3,0.03,37.1,-5,2.929 -+0,0.3,0.03,37.1,5,2.677 -+0,0.3,0.03,37.1,15,2.451 -+0,0.3,0.03,37.1,25,2.483 -+0,0.3,0.03,37.1,35,2.63 -+0,0.3,0.04,12.1,-15,5.991 -+0,0.3,0.04,12.1,-5,4.847 -+0,0.3,0.04,12.1,5,3.868 -+0,0.3,0.04,12.1,15,3.057 -+0,0.3,0.04,12.1,25,3.165 -+0,0.3,0.04,12.1,35,3.714 -+0,0.3,0.04,18,-15,4.855 -+0,0.3,0.04,18,-5,4.135 -+0,0.3,0.04,18,5,3.511 -+0,0.3,0.04,18,15,2.985 -+0,0.3,0.04,18,25,3.057 -+0,0.3,0.04,18,35,3.413 -+0,0.3,0.04,25.2,-15,4.015 -+0,0.3,0.04,25.2,-5,3.62 -+0,0.3,0.04,25.2,5,3.262 -+0,0.3,0.04,25.2,15,2.94 -+0,0.3,0.04,25.2,25,2.997 -+0,0.3,0.04,25.2,35,3.219 -+0,0.3,0.04,30,-15,3.821 -+0,0.3,0.04,30,-5,3.497 -+0,0.3,0.04,30,5,3.2 -+0,0.3,0.04,30,15,2.931 -+0,0.3,0.04,30,25,2.977 -+0,0.3,0.04,30,35,3.159 -+0,0.3,0.04,37.1,-15,3.687 -+0,0.3,0.04,37.1,-5,3.411 -+0,0.3,0.04,37.1,5,3.159 -+0,0.3,0.04,37.1,15,2.933 -+0,0.3,0.04,37.1,25,2.965 -+0,0.3,0.04,37.1,35,3.112 -+0,0.6,-0.04,12.1,-15,2.329 -+0,0.6,-0.04,12.1,-5,1.185 -+0,0.6,-0.04,12.1,5,0.207 -+0,0.6,-0.04,12.1,15,-0.413 -+0,0.6,-0.04,12.1,25,-0.173 -+0,0.6,-0.04,12.1,35,0.433 -+0,0.6,-0.04,18,-15,1.143 -+0,0.6,-0.04,18,-5,0.424 -+0,0.6,-0.04,18,5,-0.198 -+0,0.6,-0.04,18,15,-0.594 -+0,0.6,-0.04,18,25,-0.432 -+0,0.6,-0.04,18,35,-0.038 -+0,0.6,-0.04,25.2,-15,0.286 -+0,0.6,-0.04,25.2,-5,-0.108 -+0,0.6,-0.04,25.2,5,-0.465 -+0,0.6,-0.04,25.2,15,-0.689 -+0,0.6,-0.04,25.2,25,-0.572 -+0,0.6,-0.04,25.2,35,-0.322 -+0,0.6,-0.04,30,-15,0.061 -+0,0.6,-0.04,30,-5,-0.262 -+0,0.6,-0.04,30,5,-0.556 -+0,0.6,-0.04,30,15,-0.743 -+0,0.6,-0.04,30,25,-0.646 -+0,0.6,-0.04,30,35,-0.439 -+0,0.6,-0.04,37.1,-15,-0.112 -+0,0.6,-0.04,37.1,-5,-0.385 -+0,0.6,-0.04,37.1,5,-0.634 -+0,0.6,-0.04,37.1,15,-0.795 -+0,0.6,-0.04,37.1,25,-0.718 -+0,0.6,-0.04,37.1,35,-0.55 -+0,0.6,-0.03,12.1,-15,2.752 -+0,0.6,-0.03,12.1,-5,1.608 -+0,0.6,-0.03,12.1,5,0.63 -+0,0.6,-0.03,12.1,15,0.01 -+0,0.6,-0.03,12.1,25,0.251 -+0,0.6,-0.03,12.1,35,0.856 -+0,0.6,-0.03,18,-15,1.576 -+0,0.6,-0.03,18,-5,0.857 -+0,0.6,-0.03,18,5,0.234 -+0,0.6,-0.03,18,15,-0.162 -+0,0.6,-0.03,18,25,0.001 -+0,0.6,-0.03,18,35,0.395 -+0,0.6,-0.03,25.2,-15,0.731 -+0,0.6,-0.03,25.2,-5,0.337 -+0,0.6,-0.03,25.2,5,-0.02 -+0,0.6,-0.03,25.2,15,-0.244 -+0,0.6,-0.03,25.2,25,-0.127 -+0,0.6,-0.03,25.2,35,0.123 -+0,0.6,-0.03,30,-15,0.491 -+0,0.6,-0.03,30,-5,0.168 -+0,0.6,-0.03,30,5,-0.126 -+0,0.6,-0.03,30,15,-0.313 -+0,0.6,-0.03,30,25,-0.216 -+0,0.6,-0.03,30,35,-0.009 -+0,0.6,-0.03,37.1,-15,0.303 -+0,0.6,-0.03,37.1,-5,0.03 -+0,0.6,-0.03,37.1,5,-0.218 -+0,0.6,-0.03,37.1,15,-0.379 -+0,0.6,-0.03,37.1,25,-0.303 -+0,0.6,-0.03,37.1,35,-0.134 -+0,0.6,-0.02,12.1,-15,3.175 -+0,0.6,-0.02,12.1,-5,2.031 -+0,0.6,-0.02,12.1,5,1.053 -+0,0.6,-0.02,12.1,15,0.433 -+0,0.6,-0.02,12.1,25,0.674 -+0,0.6,-0.02,12.1,35,1.279 -+0,0.6,-0.02,18,-15,2.008 -+0,0.6,-0.02,18,-5,1.29 -+0,0.6,-0.02,18,5,0.667 -+0,0.6,-0.02,18,15,0.271 -+0,0.6,-0.02,18,25,0.434 -+0,0.6,-0.02,18,35,0.828 -+0,0.6,-0.02,25.2,-15,1.176 -+0,0.6,-0.02,25.2,-5,0.783 -+0,0.6,-0.02,25.2,5,0.426 -+0,0.6,-0.02,25.2,15,0.202 -+0,0.6,-0.02,25.2,25,0.319 -+0,0.6,-0.02,25.2,35,0.569 -+0,0.6,-0.02,30,-15,0.922 -+0,0.6,-0.02,30,-5,0.599 -+0,0.6,-0.02,30,5,0.305 -+0,0.6,-0.02,30,15,0.118 -+0,0.6,-0.02,30,25,0.215 -+0,0.6,-0.02,30,35,0.422 -+0,0.6,-0.02,37.1,-15,0.719 -+0,0.6,-0.02,37.1,-5,0.446 -+0,0.6,-0.02,37.1,5,0.197 -+0,0.6,-0.02,37.1,15,0.036 -+0,0.6,-0.02,37.1,25,0.113 -+0,0.6,-0.02,37.1,35,0.281 -+0,0.6,-0.01,12.1,-15,3.611 -+0,0.6,-0.01,12.1,-5,2.466 -+0,0.6,-0.01,12.1,5,1.487 -+0,0.6,-0.01,12.1,15,0.867 -+0,0.6,-0.01,12.1,25,1.107 -+0,0.6,-0.01,12.1,35,1.713 -+0,0.6,-0.01,18,-15,2.472 -+0,0.6,-0.01,18,-5,1.751 -+0,0.6,-0.01,18,5,1.128 -+0,0.6,-0.01,18,15,0.731 -+0,0.6,-0.01,18,25,0.893 -+0,0.6,-0.01,18,35,1.286 -+0,0.6,-0.01,25.2,-15,1.655 -+0,0.6,-0.01,25.2,-5,1.26 -+0,0.6,-0.01,25.2,5,0.902 -+0,0.6,-0.01,25.2,15,0.677 -+0,0.6,-0.01,25.2,25,0.793 -+0,0.6,-0.01,25.2,35,1.042 -+0,0.6,-0.01,30,-15,1.409 -+0,0.6,-0.01,30,-5,1.085 -+0,0.6,-0.01,30,5,0.788 -+0,0.6,-0.01,30,15,0.599 -+0,0.6,-0.01,30,25,0.695 -+0,0.6,-0.01,30,35,0.9 -+0,0.6,-0.01,37.1,-15,1.218 -+0,0.6,-0.01,37.1,-5,0.941 -+0,0.6,-0.01,37.1,5,0.69 -+0,0.6,-0.01,37.1,15,0.526 -+0,0.6,-0.01,37.1,25,0.601 -+0,0.6,-0.01,37.1,35,0.767 -+0,0.6,0,12.1,-15,4.104 -+0,0.6,0,12.1,-5,2.96 -+0,0.6,0,12.1,5,1.981 -+0,0.6,0,12.1,15,1.36 -+0,0.6,0,12.1,25,1.601 -+0,0.6,0,12.1,35,2.206 -+0,0.6,0,18,-15,2.98 -+0,0.6,0,18,-5,2.26 -+0,0.6,0,18,5,1.637 -+0,0.6,0,18,15,1.24 -+0,0.6,0,18,25,1.401 -+0,0.6,0,18,35,1.794 -+0,0.6,0,25.2,-15,2.168 -+0,0.6,0,25.2,-5,1.773 -+0,0.6,0,25.2,5,1.415 -+0,0.6,0,25.2,15,1.19 -+0,0.6,0,25.2,25,1.306 -+0,0.6,0,25.2,35,1.555 -+0,0.6,0,30,-15,1.936 -+0,0.6,0,30,-5,1.611 -+0,0.6,0,30,5,1.314 -+0,0.6,0,30,15,1.126 -+0,0.6,0,30,25,1.222 -+0,0.6,0,30,35,1.426 -+0,0.6,0,37.1,-15,1.759 -+0,0.6,0,37.1,-5,1.482 -+0,0.6,0,37.1,5,1.231 -+0,0.6,0,37.1,15,1.067 -+0,0.6,0,37.1,25,1.141 -+0,0.6,0,37.1,35,1.307 -+0,0.6,0.01,12.1,-15,4.599 -+0,0.6,0.01,12.1,-5,3.454 -+0,0.6,0.01,12.1,5,2.476 -+0,0.6,0.01,12.1,15,1.855 -+0,0.6,0.01,12.1,25,2.096 -+0,0.6,0.01,12.1,35,2.701 -+0,0.6,0.01,18,-15,3.49 -+0,0.6,0.01,18,-5,2.77 -+0,0.6,0.01,18,5,2.146 -+0,0.6,0.01,18,15,1.749 -+0,0.6,0.01,18,25,1.911 -+0,0.6,0.01,18,35,2.304 -+0,0.6,0.01,25.2,-15,2.681 -+0,0.6,0.01,25.2,-5,2.287 -+0,0.6,0.01,25.2,5,1.928 -+0,0.6,0.01,25.2,15,1.703 -+0,0.6,0.01,25.2,25,1.819 -+0,0.6,0.01,25.2,35,2.068 -+0,0.6,0.01,30,-15,2.463 -+0,0.6,0.01,30,-5,2.138 -+0,0.6,0.01,30,5,1.841 -+0,0.6,0.01,30,15,1.653 -+0,0.6,0.01,30,25,1.748 -+0,0.6,0.01,30,35,1.953 -+0,0.6,0.01,37.1,-15,2.3 -+0,0.6,0.01,37.1,-5,2.023 -+0,0.6,0.01,37.1,5,1.772 -+0,0.6,0.01,37.1,15,1.608 -+0,0.6,0.01,37.1,25,1.683 -+0,0.6,0.01,37.1,35,1.848 -+0,0.6,0.02,12.1,-15,5.093 -+0,0.6,0.02,12.1,-5,3.949 -+0,0.6,0.02,12.1,5,2.97 -+0,0.6,0.02,12.1,15,2.349 -+0,0.6,0.02,12.1,25,2.59 -+0,0.6,0.02,12.1,35,3.195 -+0,0.6,0.02,18,-15,3.999 -+0,0.6,0.02,18,-5,3.279 -+0,0.6,0.02,18,5,2.656 -+0,0.6,0.02,18,15,2.259 -+0,0.6,0.02,18,25,2.42 -+0,0.6,0.02,18,35,2.814 -+0,0.6,0.02,25.2,-15,3.195 -+0,0.6,0.02,25.2,-5,2.8 -+0,0.6,0.02,25.2,5,2.442 -+0,0.6,0.02,25.2,15,2.216 -+0,0.6,0.02,25.2,25,2.333 -+0,0.6,0.02,25.2,35,2.582 -+0,0.6,0.02,30,-15,2.989 -+0,0.6,0.02,30,-5,2.665 -+0,0.6,0.02,30,5,2.368 -+0,0.6,0.02,30,15,2.179 -+0,0.6,0.02,30,25,2.275 -+0,0.6,0.02,30,35,2.48 -+0,0.6,0.02,37.1,-15,2.841 -+0,0.6,0.02,37.1,-5,2.565 -+0,0.6,0.02,37.1,5,2.313 -+0,0.6,0.02,37.1,15,2.15 -+0,0.6,0.02,37.1,25,2.224 -+0,0.6,0.02,37.1,35,2.39 -+0,0.6,0.03,12.1,-15,5.588 -+0,0.6,0.03,12.1,-5,4.443 -+0,0.6,0.03,12.1,5,3.464 -+0,0.6,0.03,12.1,15,2.844 -+0,0.6,0.03,12.1,25,3.084 -+0,0.6,0.03,12.1,35,3.69 -+0,0.6,0.03,18,-15,4.509 -+0,0.6,0.03,18,-5,3.789 -+0,0.6,0.03,18,5,3.165 -+0,0.6,0.03,18,15,2.768 -+0,0.6,0.03,18,25,2.93 -+0,0.6,0.03,18,35,3.323 -+0,0.6,0.03,25.2,-15,3.709 -+0,0.6,0.03,25.2,-5,3.314 -+0,0.6,0.03,25.2,5,2.956 -+0,0.6,0.03,25.2,15,2.731 -+0,0.6,0.03,25.2,25,2.847 -+0,0.6,0.03,25.2,35,3.096 -+0,0.6,0.03,30,-15,3.517 -+0,0.6,0.03,30,-5,3.192 -+0,0.6,0.03,30,5,2.895 -+0,0.6,0.03,30,15,2.707 -+0,0.6,0.03,30,25,2.802 -+0,0.6,0.03,30,35,3.007 -+0,0.6,0.03,37.1,-15,3.382 -+0,0.6,0.03,37.1,-5,3.106 -+0,0.6,0.03,37.1,5,2.855 -+0,0.6,0.03,37.1,15,2.691 -+0,0.6,0.03,37.1,25,2.765 -+0,0.6,0.03,37.1,35,2.931 -+0,0.6,0.04,12.1,-15,6.082 -+0,0.6,0.04,12.1,-5,4.938 -+0,0.6,0.04,12.1,5,3.959 -+0,0.6,0.04,12.1,15,3.338 -+0,0.6,0.04,12.1,25,3.579 -+0,0.6,0.04,12.1,35,4.184 -+0,0.6,0.04,18,-15,5.018 -+0,0.6,0.04,18,-5,4.298 -+0,0.6,0.04,18,5,3.675 -+0,0.6,0.04,18,15,3.278 -+0,0.6,0.04,18,25,3.439 -+0,0.6,0.04,18,35,3.833 -+0,0.6,0.04,25.2,-15,4.223 -+0,0.6,0.04,25.2,-5,3.828 -+0,0.6,0.04,25.2,5,3.47 -+0,0.6,0.04,25.2,15,3.245 -+0,0.6,0.04,25.2,25,3.361 -+0,0.6,0.04,25.2,35,3.61 -+0,0.6,0.04,30,-15,4.044 -+0,0.6,0.04,30,-5,3.719 -+0,0.6,0.04,30,5,3.423 -+0,0.6,0.04,30,15,3.234 -+0,0.6,0.04,30,25,3.33 -+0,0.6,0.04,30,35,3.535 -+0,0.6,0.04,37.1,-15,3.924 -+0,0.6,0.04,37.1,-5,3.647 -+0,0.6,0.04,37.1,5,3.396 -+0,0.6,0.04,37.1,15,3.232 -+0,0.6,0.04,37.1,25,3.307 -+0,0.6,0.04,37.1,35,3.472 -+0,0.9,-0.04,12.1,-15,2.01 -+0,0.9,-0.04,12.1,-5,0.866 -+0,0.9,-0.04,12.1,5,-0.112 -+0,0.9,-0.04,12.1,15,-0.504 -+0,0.9,-0.04,12.1,25,-0.168 -+0,0.9,-0.04,12.1,35,0.493 -+0,0.9,-0.04,18,-15,0.886 -+0,0.9,-0.04,18,-5,0.167 -+0,0.9,-0.04,18,5,-0.456 -+0,0.9,-0.04,18,15,-0.694 -+0,0.9,-0.04,18,25,-0.471 -+0,0.9,-0.04,18,35,-0.04 -+0,0.9,-0.04,25.2,-15,0.067 -+0,0.9,-0.04,25.2,-5,-0.327 -+0,0.9,-0.04,25.2,5,-0.684 -+0,0.9,-0.04,25.2,15,-0.789 -+0,0.9,-0.04,25.2,25,-0.635 -+0,0.9,-0.04,25.2,35,-0.359 -+0,0.9,-0.04,30,-15,-0.147 -+0,0.9,-0.04,30,-5,-0.469 -+0,0.9,-0.04,30,5,-0.764 -+0,0.9,-0.04,30,15,-0.85 -+0,0.9,-0.04,30,25,-0.723 -+0,0.9,-0.04,30,35,-0.494 -+0,0.9,-0.04,37.1,-15,-0.308 -+0,0.9,-0.04,37.1,-5,-0.582 -+0,0.9,-0.04,37.1,5,-0.83 -+0,0.9,-0.04,37.1,15,-0.91 -+0,0.9,-0.04,37.1,25,-0.809 -+0,0.9,-0.04,37.1,35,-0.622 -+0,0.9,-0.03,12.1,-15,2.48 -+0,0.9,-0.03,12.1,-5,1.336 -+0,0.9,-0.03,12.1,5,0.357 -+0,0.9,-0.03,12.1,15,-0.034 -+0,0.9,-0.03,12.1,25,0.301 -+0,0.9,-0.03,12.1,35,0.963 -+0,0.9,-0.03,18,-15,1.366 -+0,0.9,-0.03,18,-5,0.647 -+0,0.9,-0.03,18,5,0.024 -+0,0.9,-0.03,18,15,-0.214 -+0,0.9,-0.03,18,25,0.009 -+0,0.9,-0.03,18,35,0.441 -+0,0.9,-0.03,25.2,-15,0.56 -+0,0.9,-0.03,25.2,-5,0.167 -+0,0.9,-0.03,25.2,5,-0.19 -+0,0.9,-0.03,25.2,15,-0.295 -+0,0.9,-0.03,25.2,25,-0.141 -+0,0.9,-0.03,25.2,35,0.135 -+0,0.9,-0.03,30,-15,0.331 -+0,0.9,-0.03,30,-5,0.008 -+0,0.9,-0.03,30,5,-0.287 -+0,0.9,-0.03,30,15,-0.373 -+0,0.9,-0.03,30,25,-0.245 -+0,0.9,-0.03,30,35,-0.016 -+0,0.9,-0.03,37.1,-15,0.152 -+0,0.9,-0.03,37.1,-5,-0.121 -+0,0.9,-0.03,37.1,5,-0.37 -+0,0.9,-0.03,37.1,15,-0.45 -+0,0.9,-0.03,37.1,25,-0.348 -+0,0.9,-0.03,37.1,35,-0.162 -+0,0.9,-0.02,12.1,-15,2.949 -+0,0.9,-0.02,12.1,-5,1.805 -+0,0.9,-0.02,12.1,5,0.827 -+0,0.9,-0.02,12.1,15,0.435 -+0,0.9,-0.02,12.1,25,0.771 -+0,0.9,-0.02,12.1,35,1.432 -+0,0.9,-0.02,18,-15,1.846 -+0,0.9,-0.02,18,-5,1.127 -+0,0.9,-0.02,18,5,0.504 -+0,0.9,-0.02,18,15,0.266 -+0,0.9,-0.02,18,25,0.489 -+0,0.9,-0.02,18,35,0.921 -+0,0.9,-0.02,25.2,-15,1.055 -+0,0.9,-0.02,25.2,-5,0.661 -+0,0.9,-0.02,25.2,5,0.304 -+0,0.9,-0.02,25.2,15,0.199 -+0,0.9,-0.02,25.2,25,0.353 -+0,0.9,-0.02,25.2,35,0.63 -+0,0.9,-0.02,30,-15,0.809 -+0,0.9,-0.02,30,-5,0.486 -+0,0.9,-0.02,30,5,0.191 -+0,0.9,-0.02,30,15,0.105 -+0,0.9,-0.02,30,25,0.233 -+0,0.9,-0.02,30,35,0.462 -+0,0.9,-0.02,37.1,-15,0.613 -+0,0.9,-0.02,37.1,-5,0.34 -+0,0.9,-0.02,37.1,5,0.091 -+0,0.9,-0.02,37.1,15,0.011 -+0,0.9,-0.02,37.1,25,0.113 -+0,0.9,-0.02,37.1,35,0.299 -+0,0.9,-0.01,12.1,-15,3.431 -+0,0.9,-0.01,12.1,-5,2.286 -+0,0.9,-0.01,12.1,5,1.307 -+0,0.9,-0.01,12.1,15,0.915 -+0,0.9,-0.01,12.1,25,1.251 -+0,0.9,-0.01,12.1,35,1.911 -+0,0.9,-0.01,18,-15,2.356 -+0,0.9,-0.01,18,-5,1.636 -+0,0.9,-0.01,18,5,1.013 -+0,0.9,-0.01,18,15,0.773 -+0,0.9,-0.01,18,25,0.995 -+0,0.9,-0.01,18,35,1.426 -+0,0.9,-0.01,25.2,-15,1.582 -+0,0.9,-0.01,25.2,-5,1.187 -+0,0.9,-0.01,25.2,5,0.829 -+0,0.9,-0.01,25.2,15,0.723 -+0,0.9,-0.01,25.2,25,0.876 -+0,0.9,-0.01,25.2,35,1.152 -+0,0.9,-0.01,30,-15,1.343 -+0,0.9,-0.01,30,-5,1.019 -+0,0.9,-0.01,30,5,0.722 -+0,0.9,-0.01,30,15,0.634 -+0,0.9,-0.01,30,25,0.76 -+0,0.9,-0.01,30,35,0.987 -+0,0.9,-0.01,37.1,-15,1.158 -+0,0.9,-0.01,37.1,-5,0.881 -+0,0.9,-0.01,37.1,5,0.63 -+0,0.9,-0.01,37.1,15,0.547 -+0,0.9,-0.01,37.1,25,0.646 -+0,0.9,-0.01,37.1,35,0.83 -+0,0.9,0,12.1,-15,3.979 -+0,0.9,0,12.1,-5,2.834 -+0,0.9,0,12.1,5,1.855 -+0,0.9,0,12.1,15,1.463 -+0,0.9,0,12.1,25,1.798 -+0,0.9,0,12.1,35,2.459 -+0,0.9,0,18,-15,2.921 -+0,0.9,0,18,-5,2.201 -+0,0.9,0,18,5,1.577 -+0,0.9,0,18,15,1.338 -+0,0.9,0,18,25,1.56 -+0,0.9,0,18,35,1.991 -+0,0.9,0,25.2,-15,2.151 -+0,0.9,0,25.2,-5,1.756 -+0,0.9,0,25.2,5,1.398 -+0,0.9,0,25.2,15,1.292 -+0,0.9,0,25.2,25,1.445 -+0,0.9,0,25.2,35,1.721 -+0,0.9,0,30,-15,1.927 -+0,0.9,0,30,-5,1.603 -+0,0.9,0,30,5,1.306 -+0,0.9,0,30,15,1.218 -+0,0.9,0,30,25,1.344 -+0,0.9,0,30,35,1.571 -+0,0.9,0,37.1,-15,1.758 -+0,0.9,0,37.1,-5,1.481 -+0,0.9,0,37.1,5,1.23 -+0,0.9,0,37.1,15,1.147 -+0,0.9,0,37.1,25,1.246 -+0,0.9,0,37.1,35,1.43 -+0,0.9,0.01,12.1,-15,4.528 -+0,0.9,0.01,12.1,-5,3.383 -+0,0.9,0.01,12.1,5,2.404 -+0,0.9,0.01,12.1,15,2.012 -+0,0.9,0.01,12.1,25,2.347 -+0,0.9,0.01,12.1,35,3.008 -+0,0.9,0.01,18,-15,3.486 -+0,0.9,0.01,18,-5,2.766 -+0,0.9,0.01,18,5,2.143 -+0,0.9,0.01,18,15,1.903 -+0,0.9,0.01,18,25,2.125 -+0,0.9,0.01,18,35,2.556 -+0,0.9,0.01,25.2,-15,2.721 -+0,0.9,0.01,25.2,-5,2.326 -+0,0.9,0.01,25.2,5,1.968 -+0,0.9,0.01,25.2,15,1.862 -+0,0.9,0.01,25.2,25,2.015 -+0,0.9,0.01,25.2,35,2.29 -+0,0.9,0.01,30,-15,2.512 -+0,0.9,0.01,30,-5,2.187 -+0,0.9,0.01,30,5,1.891 -+0,0.9,0.01,30,15,1.803 -+0,0.9,0.01,30,25,1.928 -+0,0.9,0.01,30,35,2.156 -+0,0.9,0.01,37.1,-15,2.358 -+0,0.9,0.01,37.1,-5,2.082 -+0,0.9,0.01,37.1,5,1.83 -+0,0.9,0.01,37.1,15,1.747 -+0,0.9,0.01,37.1,25,1.847 -+0,0.9,0.01,37.1,35,2.031 -+0,0.9,0.02,12.1,-15,5.076 -+0,0.9,0.02,12.1,-5,3.932 -+0,0.9,0.02,12.1,5,2.953 -+0,0.9,0.02,12.1,15,2.561 -+0,0.9,0.02,12.1,25,2.896 -+0,0.9,0.02,12.1,35,3.557 -+0,0.9,0.02,18,-15,4.052 -+0,0.9,0.02,18,-5,3.332 -+0,0.9,0.02,18,5,2.708 -+0,0.9,0.02,18,15,2.468 -+0,0.9,0.02,18,25,2.691 -+0,0.9,0.02,18,35,3.121 -+0,0.9,0.02,25.2,-15,3.291 -+0,0.9,0.02,25.2,-5,2.896 -+0,0.9,0.02,25.2,5,2.538 -+0,0.9,0.02,25.2,15,2.432 -+0,0.9,0.02,25.2,25,2.584 -+0,0.9,0.02,25.2,35,2.86 -+0,0.9,0.02,30,-15,3.096 -+0,0.9,0.02,30,-5,2.772 -+0,0.9,0.02,30,5,2.475 -+0,0.9,0.02,30,15,2.387 -+0,0.9,0.02,30,25,2.513 -+0,0.9,0.02,30,35,2.74 -+0,0.9,0.02,37.1,-15,2.959 -+0,0.9,0.02,37.1,-5,2.683 -+0,0.9,0.02,37.1,5,2.431 -+0,0.9,0.02,37.1,15,2.348 -+0,0.9,0.02,37.1,25,2.447 -+0,0.9,0.02,37.1,35,2.631 -+0,0.9,0.03,12.1,-15,5.625 -+0,0.9,0.03,12.1,-5,4.48 -+0,0.9,0.03,12.1,5,3.501 -+0,0.9,0.03,12.1,15,3.109 -+0,0.9,0.03,12.1,25,3.444 -+0,0.9,0.03,12.1,35,4.105 -+0,0.9,0.03,18,-15,4.617 -+0,0.9,0.03,18,-5,3.897 -+0,0.9,0.03,18,5,3.273 -+0,0.9,0.03,18,15,3.034 -+0,0.9,0.03,18,25,3.256 -+0,0.9,0.03,18,35,3.687 -+0,0.9,0.03,25.2,-15,3.861 -+0,0.9,0.03,25.2,-5,3.466 -+0,0.9,0.03,25.2,5,3.108 -+0,0.9,0.03,25.2,15,3.002 -+0,0.9,0.03,25.2,25,3.155 -+0,0.9,0.03,25.2,35,3.431 -+0,0.9,0.03,30,-15,3.682 -+0,0.9,0.03,30,-5,3.357 -+0,0.9,0.03,30,5,3.06 -+0,0.9,0.03,30,15,2.972 -+0,0.9,0.03,30,25,3.098 -+0,0.9,0.03,30,35,3.325 -+0,0.9,0.03,37.1,-15,3.56 -+0,0.9,0.03,37.1,-5,3.283 -+0,0.9,0.03,37.1,5,3.032 -+0,0.9,0.03,37.1,15,2.949 -+0,0.9,0.03,37.1,25,3.048 -+0,0.9,0.03,37.1,35,3.232 -+0,0.9,0.04,12.1,-15,6.173 -+0,0.9,0.04,12.1,-5,5.029 -+0,0.9,0.04,12.1,5,4.05 -+0,0.9,0.04,12.1,15,3.658 -+0,0.9,0.04,12.1,25,3.993 -+0,0.9,0.04,12.1,35,4.654 -+0,0.9,0.04,18,-15,5.182 -+0,0.9,0.04,18,-5,4.462 -+0,0.9,0.04,18,5,3.839 -+0,0.9,0.04,18,15,3.599 -+0,0.9,0.04,18,25,3.821 -+0,0.9,0.04,18,35,4.252 -+0,0.9,0.04,25.2,-15,4.432 -+0,0.9,0.04,25.2,-5,4.037 -+0,0.9,0.04,25.2,5,3.679 -+0,0.9,0.04,25.2,15,3.573 -+0,0.9,0.04,25.2,25,3.725 -+0,0.9,0.04,25.2,35,4.001 -+0,0.9,0.04,30,-15,4.267 -+0,0.9,0.04,30,-5,3.942 -+0,0.9,0.04,30,5,3.645 -+0,0.9,0.04,30,15,3.557 -+0,0.9,0.04,30,25,3.683 -+0,0.9,0.04,30,35,3.91 -+0,0.9,0.04,37.1,-15,4.16 -+0,0.9,0.04,37.1,-5,3.884 -+0,0.9,0.04,37.1,5,3.632 -+0,0.9,0.04,37.1,15,3.549 -+0,0.9,0.04,37.1,25,3.649 -+0,0.9,0.04,37.1,35,3.833 -+1,0,-0.04,12.1,-15,3.752 -+1,0,-0.04,12.1,-5,2.322 -+1,0,-0.04,12.1,5,1.069 -+1,0,-0.04,12.1,15,-0.007 -+1,0,-0.04,12.1,25,-0.308 -+1,0,-0.04,12.1,35,0.361 -+1,0,-0.04,18,-15,2.048 -+1,0,-0.04,18,-5,1.134 -+1,0,-0.04,18,5,0.323 -+1,0,-0.04,18,15,-0.384 -+1,0,-0.04,18,25,-0.588 -+1,0,-0.04,18,35,-0.149 -+1,0,-0.04,25.2,-15,0.887 -+1,0,-0.04,25.2,-5,0.351 -+1,0,-0.04,25.2,5,-0.143 -+1,0,-0.04,25.2,15,-0.596 -+1,0,-0.04,25.2,25,-0.736 -+1,0,-0.04,25.2,35,-0.453 -+1,0,-0.04,30,-15,0.534 -+1,0,-0.04,30,-5,0.091 -+1,0,-0.04,30,5,-0.32 -+1,0,-0.04,30,15,-0.7 -+1,0,-0.04,30,25,-0.82 -+1,0,-0.04,30,35,-0.584 -+1,0,-0.04,37.1,-15,0.231 -+1,0,-0.04,37.1,-5,-0.141 -+1,0,-0.04,37.1,5,-0.485 -+1,0,-0.04,37.1,15,-0.801 -+1,0,-0.04,37.1,25,-0.902 -+1,0,-0.04,37.1,35,-0.71 -+1,0,-0.03,12.1,-15,4.248 -+1,0,-0.03,12.1,-5,2.818 -+1,0,-0.03,12.1,5,1.564 -+1,0,-0.03,12.1,15,0.488 -+1,0,-0.03,12.1,25,0.187 -+1,0,-0.03,12.1,35,0.856 -+1,0,-0.03,18,-15,2.555 -+1,0,-0.03,18,-5,1.641 -+1,0,-0.03,18,5,0.83 -+1,0,-0.03,18,15,0.123 -+1,0,-0.03,18,25,-0.081 -+1,0,-0.03,18,35,0.358 -+1,0,-0.03,25.2,-15,1.408 -+1,0,-0.03,25.2,-5,0.873 -+1,0,-0.03,25.2,5,0.378 -+1,0,-0.03,25.2,15,-0.075 -+1,0,-0.03,25.2,25,-0.215 -+1,0,-0.03,25.2,35,0.068 -+1,0,-0.03,30,-15,1.037 -+1,0,-0.03,30,-5,0.594 -+1,0,-0.03,30,5,0.184 -+1,0,-0.03,30,15,-0.196 -+1,0,-0.03,30,25,-0.316 -+1,0,-0.03,30,35,-0.08 -+1,0,-0.03,37.1,-15,0.717 -+1,0,-0.03,37.1,-5,0.345 -+1,0,-0.03,37.1,5,0.002 -+1,0,-0.03,37.1,15,-0.315 -+1,0,-0.03,37.1,25,-0.416 -+1,0,-0.03,37.1,35,-0.223 -+1,0,-0.02,12.1,-15,4.743 -+1,0,-0.02,12.1,-5,3.313 -+1,0,-0.02,12.1,5,2.06 -+1,0,-0.02,12.1,15,0.984 -+1,0,-0.02,12.1,25,0.683 -+1,0,-0.02,12.1,35,1.352 -+1,0,-0.02,18,-15,3.062 -+1,0,-0.02,18,-5,2.147 -+1,0,-0.02,18,5,1.336 -+1,0,-0.02,18,15,0.63 -+1,0,-0.02,18,25,0.426 -+1,0,-0.02,18,35,0.865 -+1,0,-0.02,25.2,-15,1.93 -+1,0,-0.02,25.2,-5,1.395 -+1,0,-0.02,25.2,5,0.9 -+1,0,-0.02,25.2,15,0.447 -+1,0,-0.02,25.2,25,0.307 -+1,0,-0.02,25.2,35,0.59 -+1,0,-0.02,30,-15,1.542 -+1,0,-0.02,30,-5,1.099 -+1,0,-0.02,30,5,0.688 -+1,0,-0.02,30,15,0.309 -+1,0,-0.02,30,25,0.189 -+1,0,-0.02,30,35,0.424 -+1,0,-0.02,37.1,-15,1.204 -+1,0,-0.02,37.1,-5,0.832 -+1,0,-0.02,37.1,5,0.488 -+1,0,-0.02,37.1,15,0.172 -+1,0,-0.02,37.1,25,0.071 -+1,0,-0.02,37.1,35,0.263 -+1,0,-0.01,12.1,-15,5.251 -+1,0,-0.01,12.1,-5,3.821 -+1,0,-0.01,12.1,5,2.567 -+1,0,-0.01,12.1,15,1.49 -+1,0,-0.01,12.1,25,1.189 -+1,0,-0.01,12.1,35,1.858 -+1,0,-0.01,18,-15,3.6 -+1,0,-0.01,18,-5,2.684 -+1,0,-0.01,18,5,1.872 -+1,0,-0.01,18,15,1.164 -+1,0,-0.01,18,25,0.96 -+1,0,-0.01,18,35,1.397 -+1,0,-0.01,25.2,-15,2.486 -+1,0,-0.01,25.2,-5,1.949 -+1,0,-0.01,25.2,5,1.453 -+1,0,-0.01,25.2,15,0.999 -+1,0,-0.01,25.2,25,0.858 -+1,0,-0.01,25.2,35,1.14 -+1,0,-0.01,30,-15,2.104 -+1,0,-0.01,30,-5,1.659 -+1,0,-0.01,30,5,1.246 -+1,0,-0.01,30,15,0.865 -+1,0,-0.01,30,25,0.743 -+1,0,-0.01,30,35,0.977 -+1,0,-0.01,37.1,-15,1.776 -+1,0,-0.01,37.1,-5,1.401 -+1,0,-0.01,37.1,5,1.054 -+1,0,-0.01,37.1,15,0.735 -+1,0,-0.01,37.1,25,0.631 -+1,0,-0.01,37.1,35,0.821 -+1,0,0,12.1,-15,5.829 -+1,0,0,12.1,-5,4.399 -+1,0,0,12.1,5,3.145 -+1,0,0,12.1,15,2.069 -+1,0,0,12.1,25,1.767 -+1,0,0,12.1,35,2.436 -+1,0,0,18,-15,4.195 -+1,0,0,18,-5,3.28 -+1,0,0,18,5,2.468 -+1,0,0,18,15,1.76 -+1,0,0,18,25,1.555 -+1,0,0,18,35,1.993 -+1,0,0,25.2,-15,3.087 -+1,0,0,25.2,-5,2.55 -+1,0,0,25.2,5,2.054 -+1,0,0,25.2,15,1.6 -+1,0,0,25.2,25,1.459 -+1,0,0,25.2,35,1.741 -+1,0,0,30,-15,2.721 -+1,0,0,30,-5,2.276 -+1,0,0,30,5,1.863 -+1,0,0,30,15,1.482 -+1,0,0,30,25,1.36 -+1,0,0,30,35,1.594 -+1,0,0,37.1,-15,2.409 -+1,0,0,37.1,-5,2.034 -+1,0,0,37.1,5,1.687 -+1,0,0,37.1,15,1.368 -+1,0,0,37.1,25,1.265 -+1,0,0,37.1,35,1.455 -+1,0,0.01,12.1,-15,6.409 -+1,0,0.01,12.1,-5,4.978 -+1,0,0.01,12.1,5,3.724 -+1,0,0.01,12.1,15,2.648 -+1,0,0.01,12.1,25,2.347 -+1,0,0.01,12.1,35,3.015 -+1,0,0.01,18,-15,4.792 -+1,0,0.01,18,-5,3.877 -+1,0,0.01,18,5,3.065 -+1,0,0.01,18,15,2.357 -+1,0,0.01,18,25,2.152 -+1,0,0.01,18,35,2.59 -+1,0,0.01,25.2,-15,3.688 -+1,0,0.01,25.2,-5,3.151 -+1,0,0.01,25.2,5,2.656 -+1,0,0.01,25.2,15,2.201 -+1,0,0.01,25.2,25,2.06 -+1,0,0.01,25.2,35,2.342 -+1,0,0.01,30,-15,3.338 -+1,0,0.01,30,-5,2.893 -+1,0,0.01,30,5,2.48 -+1,0,0.01,30,15,2.099 -+1,0,0.01,30,25,1.977 -+1,0,0.01,30,35,2.211 -+1,0,0.01,37.1,-15,3.043 -+1,0,0.01,37.1,-5,2.668 -+1,0,0.01,37.1,5,2.321 -+1,0,0.01,37.1,15,2.002 -+1,0,0.01,37.1,25,1.899 -+1,0,0.01,37.1,35,2.088 -+1,0,0.02,12.1,-15,6.988 -+1,0,0.02,12.1,-5,5.558 -+1,0,0.02,12.1,5,4.303 -+1,0,0.02,12.1,15,3.227 -+1,0,0.02,12.1,25,2.926 -+1,0,0.02,12.1,35,3.594 -+1,0,0.02,18,-15,5.389 -+1,0,0.02,18,-5,4.474 -+1,0,0.02,18,5,3.662 -+1,0,0.02,18,15,2.954 -+1,0,0.02,18,25,2.749 -+1,0,0.02,18,35,3.187 -+1,0,0.02,25.2,-15,4.289 -+1,0,0.02,25.2,-5,3.752 -+1,0,0.02,25.2,5,3.257 -+1,0,0.02,25.2,15,2.803 -+1,0,0.02,25.2,25,2.661 -+1,0,0.02,25.2,35,2.944 -+1,0,0.02,30,-15,3.955 -+1,0,0.02,30,-5,3.51 -+1,0,0.02,30,5,3.097 -+1,0,0.02,30,15,2.716 -+1,0,0.02,30,25,2.594 -+1,0,0.02,30,35,2.828 -+1,0,0.02,37.1,-15,3.677 -+1,0,0.02,37.1,-5,3.302 -+1,0,0.02,37.1,5,2.955 -+1,0,0.02,37.1,15,2.636 -+1,0,0.02,37.1,25,2.533 -+1,0,0.02,37.1,35,2.723 -+1,0,0.03,12.1,-15,7.567 -+1,0,0.03,12.1,-5,6.137 -+1,0,0.03,12.1,5,4.882 -+1,0,0.03,12.1,15,3.806 -+1,0,0.03,12.1,25,3.505 -+1,0,0.03,12.1,35,4.173 -+1,0,0.03,18,-15,5.986 -+1,0,0.03,18,-5,5.07 -+1,0,0.03,18,5,4.258 -+1,0,0.03,18,15,3.55 -+1,0,0.03,18,25,3.346 -+1,0,0.03,18,35,3.784 -+1,0,0.03,25.2,-15,4.891 -+1,0,0.03,25.2,-5,4.354 -+1,0,0.03,25.2,5,3.859 -+1,0,0.03,25.2,15,3.405 -+1,0,0.03,25.2,25,3.263 -+1,0,0.03,25.2,35,3.546 -+1,0,0.03,30,-15,4.573 -+1,0,0.03,30,-5,4.127 -+1,0,0.03,30,5,3.714 -+1,0,0.03,30,15,3.333 -+1,0,0.03,30,25,3.212 -+1,0,0.03,30,35,3.445 -+1,0,0.03,37.1,-15,4.311 -+1,0,0.03,37.1,-5,3.936 -+1,0,0.03,37.1,5,3.589 -+1,0,0.03,37.1,15,3.27 -+1,0,0.03,37.1,25,3.167 -+1,0,0.03,37.1,35,3.357 -+1,0,0.04,12.1,-15,8.146 -+1,0,0.04,12.1,-5,6.716 -+1,0,0.04,12.1,5,5.462 -+1,0,0.04,12.1,15,4.385 -+1,0,0.04,12.1,25,4.084 -+1,0,0.04,12.1,35,4.752 -+1,0,0.04,18,-15,6.583 -+1,0,0.04,18,-5,5.667 -+1,0,0.04,18,5,4.855 -+1,0,0.04,18,15,4.147 -+1,0,0.04,18,25,3.943 -+1,0,0.04,18,35,4.38 -+1,0,0.04,25.2,-15,5.494 -+1,0,0.04,25.2,-5,4.957 -+1,0,0.04,25.2,5,4.461 -+1,0,0.04,25.2,15,4.007 -+1,0,0.04,25.2,25,3.866 -+1,0,0.04,25.2,35,4.148 -+1,0,0.04,30,-15,5.19 -+1,0,0.04,30,-5,4.745 -+1,0,0.04,30,5,4.332 -+1,0,0.04,30,15,3.951 -+1,0,0.04,30,25,3.829 -+1,0,0.04,30,35,4.063 -+1,0,0.04,37.1,-15,4.945 -+1,0,0.04,37.1,-5,4.57 -+1,0,0.04,37.1,5,4.223 -+1,0,0.04,37.1,15,3.904 -+1,0,0.04,37.1,25,3.801 -+1,0,0.04,37.1,35,3.991 -+1,0.3,-0.04,12.1,-15,3.274 -+1,0.3,-0.04,12.1,-5,1.844 -+1,0.3,-0.04,12.1,5,0.59 -+1,0.3,-0.04,12.1,15,-0.486 -+1,0.3,-0.04,12.1,25,-0.302 -+1,0.3,-0.04,12.1,35,0.45 -+1,0.3,-0.04,18,-15,1.662 -+1,0.3,-0.04,18,-5,0.748 -+1,0.3,-0.04,18,5,-0.063 -+1,0.3,-0.04,18,15,-0.77 -+1,0.3,-0.04,18,25,-0.647 -+1,0.3,-0.04,18,35,-0.152 -+1,0.3,-0.04,25.2,-15,0.558 -+1,0.3,-0.04,25.2,-5,0.023 -+1,0.3,-0.04,25.2,5,-0.471 -+1,0.3,-0.04,25.2,15,-0.925 -+1,0.3,-0.04,25.2,25,-0.832 -+1,0.3,-0.04,25.2,35,-0.508 -+1,0.3,-0.04,30,-15,0.222 -+1,0.3,-0.04,30,-5,-0.221 -+1,0.3,-0.04,30,5,-0.632 -+1,0.3,-0.04,30,15,-1.011 -+1,0.3,-0.04,30,25,-0.935 -+1,0.3,-0.04,30,35,-0.666 -+1,0.3,-0.04,37.1,-15,-0.064 -+1,0.3,-0.04,37.1,-5,-0.436 -+1,0.3,-0.04,37.1,5,-0.78 -+1,0.3,-0.04,37.1,15,-1.096 -+1,0.3,-0.04,37.1,25,-1.038 -+1,0.3,-0.04,37.1,35,-0.819 -+1,0.3,-0.03,12.1,-15,3.839 -+1,0.3,-0.03,12.1,-5,2.409 -+1,0.3,-0.03,12.1,5,1.156 -+1,0.3,-0.03,12.1,15,0.08 -+1,0.3,-0.03,12.1,25,0.263 -+1,0.3,-0.03,12.1,35,1.016 -+1,0.3,-0.03,18,-15,2.24 -+1,0.3,-0.03,18,-5,1.326 -+1,0.3,-0.03,18,5,0.515 -+1,0.3,-0.03,18,15,-0.192 -+1,0.3,-0.03,18,25,-0.069 -+1,0.3,-0.03,18,35,0.426 -+1,0.3,-0.03,25.2,-15,1.153 -+1,0.3,-0.03,25.2,-5,0.617 -+1,0.3,-0.03,25.2,5,0.123 -+1,0.3,-0.03,25.2,15,-0.33 -+1,0.3,-0.03,25.2,25,-0.237 -+1,0.3,-0.03,25.2,35,0.086 -+1,0.3,-0.03,30,-15,0.797 -+1,0.3,-0.03,30,-5,0.354 -+1,0.3,-0.03,30,5,-0.057 -+1,0.3,-0.03,30,15,-0.437 -+1,0.3,-0.03,30,25,-0.36 -+1,0.3,-0.03,30,35,-0.091 -+1,0.3,-0.03,37.1,-15,0.49 -+1,0.3,-0.03,37.1,-5,0.119 -+1,0.3,-0.03,37.1,5,-0.225 -+1,0.3,-0.03,37.1,15,-0.541 -+1,0.3,-0.03,37.1,25,-0.484 -+1,0.3,-0.03,37.1,35,-0.264 -+1,0.3,-0.02,12.1,-15,4.404 -+1,0.3,-0.02,12.1,-5,2.974 -+1,0.3,-0.02,12.1,5,1.721 -+1,0.3,-0.02,12.1,15,0.645 -+1,0.3,-0.02,12.1,25,0.828 -+1,0.3,-0.02,12.1,35,1.581 -+1,0.3,-0.02,18,-15,2.818 -+1,0.3,-0.02,18,-5,1.904 -+1,0.3,-0.02,18,5,1.093 -+1,0.3,-0.02,18,15,0.386 -+1,0.3,-0.02,18,25,0.509 -+1,0.3,-0.02,18,35,1.004 -+1,0.3,-0.02,25.2,-15,1.748 -+1,0.3,-0.02,25.2,-5,1.212 -+1,0.3,-0.02,25.2,5,0.718 -+1,0.3,-0.02,25.2,15,0.265 -+1,0.3,-0.02,25.2,25,0.358 -+1,0.3,-0.02,25.2,35,0.681 -+1,0.3,-0.02,30,-15,1.372 -+1,0.3,-0.02,30,-5,0.929 -+1,0.3,-0.02,30,5,0.518 -+1,0.3,-0.02,30,15,0.139 -+1,0.3,-0.02,30,25,0.215 -+1,0.3,-0.02,30,35,0.484 -+1,0.3,-0.02,37.1,-15,1.045 -+1,0.3,-0.02,37.1,-5,0.674 -+1,0.3,-0.02,37.1,5,0.33 -+1,0.3,-0.02,37.1,15,0.013 -+1,0.3,-0.02,37.1,25,0.071 -+1,0.3,-0.02,37.1,35,0.291 -+1,0.3,-0.01,12.1,-15,4.981 -+1,0.3,-0.01,12.1,-5,3.551 -+1,0.3,-0.01,12.1,5,2.297 -+1,0.3,-0.01,12.1,15,1.221 -+1,0.3,-0.01,12.1,25,1.404 -+1,0.3,-0.01,12.1,35,2.156 -+1,0.3,-0.01,18,-15,3.427 -+1,0.3,-0.01,18,-5,2.511 -+1,0.3,-0.01,18,5,1.699 -+1,0.3,-0.01,18,15,0.991 -+1,0.3,-0.01,18,25,1.114 -+1,0.3,-0.01,18,35,1.608 -+1,0.3,-0.01,25.2,-15,2.377 -+1,0.3,-0.01,25.2,-5,1.84 -+1,0.3,-0.01,25.2,5,1.344 -+1,0.3,-0.01,25.2,15,0.89 -+1,0.3,-0.01,25.2,25,0.982 -+1,0.3,-0.01,25.2,35,1.305 -+1,0.3,-0.01,30,-15,2.005 -+1,0.3,-0.01,30,-5,1.56 -+1,0.3,-0.01,30,5,1.147 -+1,0.3,-0.01,30,15,0.766 -+1,0.3,-0.01,30,25,0.84 -+1,0.3,-0.01,30,35,1.108 -+1,0.3,-0.01,37.1,-15,1.685 -+1,0.3,-0.01,37.1,-5,1.31 -+1,0.3,-0.01,37.1,5,0.964 -+1,0.3,-0.01,37.1,15,0.645 -+1,0.3,-0.01,37.1,25,0.7 -+1,0.3,-0.01,37.1,35,0.917 -+1,0.3,0,12.1,-15,5.641 -+1,0.3,0,12.1,-5,4.211 -+1,0.3,0,12.1,5,2.957 -+1,0.3,0,12.1,15,1.88 -+1,0.3,0,12.1,25,2.064 -+1,0.3,0,12.1,35,2.815 -+1,0.3,0,18,-15,4.106 -+1,0.3,0,18,-5,3.191 -+1,0.3,0,18,5,2.378 -+1,0.3,0,18,15,1.671 -+1,0.3,0,18,25,1.793 -+1,0.3,0,18,35,2.287 -+1,0.3,0,25.2,-15,3.062 -+1,0.3,0,25.2,-5,2.525 -+1,0.3,0,25.2,5,2.029 -+1,0.3,0,25.2,15,1.575 -+1,0.3,0,25.2,25,1.667 -+1,0.3,0,25.2,35,1.99 -+1,0.3,0,30,-15,2.708 -+1,0.3,0,30,-5,2.263 -+1,0.3,0,30,5,1.85 -+1,0.3,0,30,15,1.469 -+1,0.3,0,30,25,1.543 -+1,0.3,0,30,35,1.811 -+1,0.3,0,37.1,-15,2.408 -+1,0.3,0,37.1,-5,2.033 -+1,0.3,0,37.1,5,1.686 -+1,0.3,0,37.1,15,1.367 -+1,0.3,0,37.1,25,1.422 -+1,0.3,0,37.1,35,1.639 -+1,0.3,0.01,12.1,-15,6.301 -+1,0.3,0.01,12.1,-5,4.871 -+1,0.3,0.01,12.1,5,3.617 -+1,0.3,0.01,12.1,15,2.541 -+1,0.3,0.01,12.1,25,2.724 -+1,0.3,0.01,12.1,35,3.476 -+1,0.3,0.01,18,-15,4.787 -+1,0.3,0.01,18,-5,3.871 -+1,0.3,0.01,18,5,3.059 -+1,0.3,0.01,18,15,2.351 -+1,0.3,0.01,18,25,2.474 -+1,0.3,0.01,18,35,2.968 -+1,0.3,0.01,25.2,-15,3.748 -+1,0.3,0.01,25.2,-5,3.21 -+1,0.3,0.01,25.2,5,2.715 -+1,0.3,0.01,25.2,15,2.261 -+1,0.3,0.01,25.2,25,2.353 -+1,0.3,0.01,25.2,35,2.675 -+1,0.3,0.01,30,-15,3.412 -+1,0.3,0.01,30,-5,2.967 -+1,0.3,0.01,30,5,2.554 -+1,0.3,0.01,30,15,2.173 -+1,0.3,0.01,30,25,2.247 -+1,0.3,0.01,30,35,2.514 -+1,0.3,0.01,37.1,-15,3.13 -+1,0.3,0.01,37.1,-5,2.755 -+1,0.3,0.01,37.1,5,2.409 -+1,0.3,0.01,37.1,15,2.09 -+1,0.3,0.01,37.1,25,2.145 -+1,0.3,0.01,37.1,35,2.362 -+1,0.3,0.02,12.1,-15,6.962 -+1,0.3,0.02,12.1,-5,5.532 -+1,0.3,0.02,12.1,5,4.277 -+1,0.3,0.02,12.1,15,3.201 -+1,0.3,0.02,12.1,25,3.384 -+1,0.3,0.02,12.1,35,4.136 -+1,0.3,0.02,18,-15,5.467 -+1,0.3,0.02,18,-5,4.552 -+1,0.3,0.02,18,5,3.74 -+1,0.3,0.02,18,15,3.032 -+1,0.3,0.02,18,25,3.155 -+1,0.3,0.02,18,35,3.648 -+1,0.3,0.02,25.2,-15,4.433 -+1,0.3,0.02,25.2,-5,3.896 -+1,0.3,0.02,25.2,5,3.401 -+1,0.3,0.02,25.2,15,2.947 -+1,0.3,0.02,25.2,25,3.039 -+1,0.3,0.02,25.2,35,3.361 -+1,0.3,0.02,30,-15,4.116 -+1,0.3,0.02,30,-5,3.67 -+1,0.3,0.02,30,5,3.258 -+1,0.3,0.02,30,15,2.876 -+1,0.3,0.02,30,25,2.951 -+1,0.3,0.02,30,35,3.218 -+1,0.3,0.02,37.1,-15,3.853 -+1,0.3,0.02,37.1,-5,3.478 -+1,0.3,0.02,37.1,5,3.132 -+1,0.3,0.02,37.1,15,2.813 -+1,0.3,0.02,37.1,25,2.868 -+1,0.3,0.02,37.1,35,3.085 -+1,0.3,0.03,12.1,-15,7.622 -+1,0.3,0.03,12.1,-5,6.192 -+1,0.3,0.03,12.1,5,4.938 -+1,0.3,0.03,12.1,15,3.861 -+1,0.3,0.03,12.1,25,4.045 -+1,0.3,0.03,12.1,35,4.797 -+1,0.3,0.03,18,-15,6.148 -+1,0.3,0.03,18,-5,5.232 -+1,0.3,0.03,18,5,4.42 -+1,0.3,0.03,18,15,3.712 -+1,0.3,0.03,18,25,3.835 -+1,0.3,0.03,18,35,4.329 -+1,0.3,0.03,25.2,-15,5.12 -+1,0.3,0.03,25.2,-5,4.583 -+1,0.3,0.03,25.2,5,4.087 -+1,0.3,0.03,25.2,15,3.633 -+1,0.3,0.03,25.2,25,3.725 -+1,0.3,0.03,25.2,35,4.048 -+1,0.3,0.03,30,-15,4.82 -+1,0.3,0.03,30,-5,4.375 -+1,0.3,0.03,30,5,3.962 -+1,0.3,0.03,30,15,3.58 -+1,0.3,0.03,30,25,3.655 -+1,0.3,0.03,30,35,3.922 -+1,0.3,0.03,37.1,-15,4.576 -+1,0.3,0.03,37.1,-5,4.201 -+1,0.3,0.03,37.1,5,3.855 -+1,0.3,0.03,37.1,15,3.536 -+1,0.3,0.03,37.1,25,3.591 -+1,0.3,0.03,37.1,35,3.808 -+1,0.3,0.04,12.1,-15,8.283 -+1,0.3,0.04,12.1,-5,6.852 -+1,0.3,0.04,12.1,5,5.598 -+1,0.3,0.04,12.1,15,4.522 -+1,0.3,0.04,12.1,25,4.705 -+1,0.3,0.04,12.1,35,5.457 -+1,0.3,0.04,18,-15,6.828 -+1,0.3,0.04,18,-5,5.913 -+1,0.3,0.04,18,5,5.101 -+1,0.3,0.04,18,15,4.393 -+1,0.3,0.04,18,25,4.516 -+1,0.3,0.04,18,35,5.01 -+1,0.3,0.04,25.2,-15,5.807 -+1,0.3,0.04,25.2,-5,5.27 -+1,0.3,0.04,25.2,5,4.774 -+1,0.3,0.04,25.2,15,4.32 -+1,0.3,0.04,25.2,25,4.412 -+1,0.3,0.04,25.2,35,4.735 -+1,0.3,0.04,30,-15,5.524 -+1,0.3,0.04,30,-5,5.079 -+1,0.3,0.04,30,5,4.666 -+1,0.3,0.04,30,15,4.285 -+1,0.3,0.04,30,25,4.359 -+1,0.3,0.04,30,35,4.626 -+1,0.3,0.04,37.1,-15,5.299 -+1,0.3,0.04,37.1,-5,4.924 -+1,0.3,0.04,37.1,5,4.578 -+1,0.3,0.04,37.1,15,4.259 -+1,0.3,0.04,37.1,25,4.314 -+1,0.3,0.04,37.1,35,4.531 -+1,0.6,-0.04,12.1,-15,2.796 -+1,0.6,-0.04,12.1,-5,1.366 -+1,0.6,-0.04,12.1,5,0.112 -+1,0.6,-0.04,12.1,15,-0.679 -+1,0.6,-0.04,12.1,25,-0.295 -+1,0.6,-0.04,12.1,35,0.54 -+1,0.6,-0.04,18,-15,1.276 -+1,0.6,-0.04,18,-5,0.362 -+1,0.6,-0.04,18,5,-0.449 -+1,0.6,-0.04,18,15,-0.963 -+1,0.6,-0.04,18,25,-0.705 -+1,0.6,-0.04,18,35,-0.154 -+1,0.6,-0.04,25.2,-15,0.23 -+1,0.6,-0.04,25.2,-5,-0.306 -+1,0.6,-0.04,25.2,5,-0.8 -+1,0.6,-0.04,25.2,15,-1.109 -+1,0.6,-0.04,25.2,25,-0.927 -+1,0.6,-0.04,25.2,35,-0.563 -+1,0.6,-0.04,30,-15,-0.089 -+1,0.6,-0.04,30,-5,-0.532 -+1,0.6,-0.04,30,5,-0.943 -+1,0.6,-0.04,30,15,-1.202 -+1,0.6,-0.04,30,25,-1.05 -+1,0.6,-0.04,30,35,-0.748 -+1,0.6,-0.04,37.1,-15,-0.359 -+1,0.6,-0.04,37.1,-5,-0.731 -+1,0.6,-0.04,37.1,5,-1.075 -+1,0.6,-0.04,37.1,15,-1.296 -+1,0.6,-0.04,37.1,25,-1.175 -+1,0.6,-0.04,37.1,35,-0.928 -+1,0.6,-0.03,12.1,-15,3.43 -+1,0.6,-0.03,12.1,-5,2.001 -+1,0.6,-0.03,12.1,5,0.747 -+1,0.6,-0.03,12.1,15,-0.044 -+1,0.6,-0.03,12.1,25,0.339 -+1,0.6,-0.03,12.1,35,1.175 -+1,0.6,-0.03,18,-15,1.925 -+1,0.6,-0.03,18,-5,1.011 -+1,0.6,-0.03,18,5,0.2 -+1,0.6,-0.03,18,15,-0.314 -+1,0.6,-0.03,18,25,-0.056 -+1,0.6,-0.03,18,35,0.495 -+1,0.6,-0.03,25.2,-15,0.897 -+1,0.6,-0.03,25.2,-5,0.361 -+1,0.6,-0.03,25.2,5,-0.133 -+1,0.6,-0.03,25.2,15,-0.442 -+1,0.6,-0.03,25.2,25,-0.259 -+1,0.6,-0.03,25.2,35,0.104 -+1,0.6,-0.03,30,-15,0.556 -+1,0.6,-0.03,30,-5,0.113 -+1,0.6,-0.03,30,5,-0.298 -+1,0.6,-0.03,30,15,-0.557 -+1,0.6,-0.03,30,25,-0.405 -+1,0.6,-0.03,30,35,-0.102 -+1,0.6,-0.03,37.1,-15,0.264 -+1,0.6,-0.03,37.1,-5,-0.108 -+1,0.6,-0.03,37.1,5,-0.452 -+1,0.6,-0.03,37.1,15,-0.673 -+1,0.6,-0.03,37.1,25,-0.552 -+1,0.6,-0.03,37.1,35,-0.305 -+1,0.6,-0.02,12.1,-15,4.065 -+1,0.6,-0.02,12.1,-5,2.635 -+1,0.6,-0.02,12.1,5,1.381 -+1,0.6,-0.02,12.1,15,0.59 -+1,0.6,-0.02,12.1,25,0.974 -+1,0.6,-0.02,12.1,35,1.809 -+1,0.6,-0.02,18,-15,2.574 -+1,0.6,-0.02,18,-5,1.66 -+1,0.6,-0.02,18,5,0.849 -+1,0.6,-0.02,18,15,0.335 -+1,0.6,-0.02,18,25,0.593 -+1,0.6,-0.02,18,35,1.144 -+1,0.6,-0.02,25.2,-15,1.566 -+1,0.6,-0.02,25.2,-5,1.03 -+1,0.6,-0.02,25.2,5,0.536 -+1,0.6,-0.02,25.2,15,0.227 -+1,0.6,-0.02,25.2,25,0.409 -+1,0.6,-0.02,25.2,35,0.773 -+1,0.6,-0.02,30,-15,1.202 -+1,0.6,-0.02,30,-5,0.759 -+1,0.6,-0.02,30,5,0.348 -+1,0.6,-0.02,30,15,0.089 -+1,0.6,-0.02,30,25,0.241 -+1,0.6,-0.02,30,35,0.544 -+1,0.6,-0.02,37.1,-15,0.887 -+1,0.6,-0.02,37.1,-5,0.515 -+1,0.6,-0.02,37.1,5,0.171 -+1,0.6,-0.02,37.1,15,-0.05 -+1,0.6,-0.02,37.1,25,0.071 -+1,0.6,-0.02,37.1,35,0.318 -+1,0.6,-0.01,12.1,-15,4.712 -+1,0.6,-0.01,12.1,-5,3.282 -+1,0.6,-0.01,12.1,5,2.027 -+1,0.6,-0.01,12.1,15,1.236 -+1,0.6,-0.01,12.1,25,1.619 -+1,0.6,-0.01,12.1,35,2.454 -+1,0.6,-0.01,18,-15,3.254 -+1,0.6,-0.01,18,-5,2.339 -+1,0.6,-0.01,18,5,1.526 -+1,0.6,-0.01,18,15,1.012 -+1,0.6,-0.01,18,25,1.268 -+1,0.6,-0.01,18,35,1.819 -+1,0.6,-0.01,25.2,-15,2.268 -+1,0.6,-0.01,25.2,-5,1.73 -+1,0.6,-0.01,25.2,5,1.235 -+1,0.6,-0.01,25.2,15,0.925 -+1,0.6,-0.01,25.2,25,1.107 -+1,0.6,-0.01,25.2,35,1.469 -+1,0.6,-0.01,30,-15,1.906 -+1,0.6,-0.01,30,-5,1.461 -+1,0.6,-0.01,30,5,1.048 -+1,0.6,-0.01,30,15,0.787 -+1,0.6,-0.01,30,25,0.937 -+1,0.6,-0.01,30,35,1.238 -+1,0.6,-0.01,37.1,-15,1.595 -+1,0.6,-0.01,37.1,-5,1.22 -+1,0.6,-0.01,37.1,5,0.874 -+1,0.6,-0.01,37.1,15,0.65 -+1,0.6,-0.01,37.1,25,0.768 -+1,0.6,-0.01,37.1,35,1.012 -+1,0.6,0,12.1,-15,5.453 -+1,0.6,0,12.1,-5,4.022 -+1,0.6,0,12.1,5,2.768 -+1,0.6,0,12.1,15,1.976 -+1,0.6,0,12.1,25,2.36 -+1,0.6,0,12.1,35,3.195 -+1,0.6,0,18,-15,4.017 -+1,0.6,0,18,-5,3.101 -+1,0.6,0,18,5,2.289 -+1,0.6,0,18,15,1.774 -+1,0.6,0,18,25,2.031 -+1,0.6,0,18,35,2.581 -+1,0.6,0,25.2,-15,3.037 -+1,0.6,0,25.2,-5,2.5 -+1,0.6,0,25.2,5,2.005 -+1,0.6,0,25.2,15,1.694 -+1,0.6,0,25.2,25,1.876 -+1,0.6,0,25.2,35,2.238 -+1,0.6,0,30,-15,2.696 -+1,0.6,0,30,-5,2.251 -+1,0.6,0,30,5,1.838 -+1,0.6,0,30,15,1.577 -+1,0.6,0,30,25,1.727 -+1,0.6,0,30,35,2.028 -+1,0.6,0,37.1,-15,2.406 -+1,0.6,0,37.1,-5,2.031 -+1,0.6,0,37.1,5,1.685 -+1,0.6,0,37.1,15,1.461 -+1,0.6,0,37.1,25,1.579 -+1,0.6,0,37.1,35,1.824 -+1,0.6,0.01,12.1,-15,6.194 -+1,0.6,0.01,12.1,-5,4.764 -+1,0.6,0.01,12.1,5,3.51 -+1,0.6,0.01,12.1,15,2.718 -+1,0.6,0.01,12.1,25,3.102 -+1,0.6,0.01,12.1,35,3.937 -+1,0.6,0.01,18,-15,4.781 -+1,0.6,0.01,18,-5,3.866 -+1,0.6,0.01,18,5,3.054 -+1,0.6,0.01,18,15,2.539 -+1,0.6,0.01,18,25,2.796 -+1,0.6,0.01,18,35,3.346 -+1,0.6,0.01,25.2,-15,3.807 -+1,0.6,0.01,25.2,-5,3.27 -+1,0.6,0.01,25.2,5,2.775 -+1,0.6,0.01,25.2,15,2.465 -+1,0.6,0.01,25.2,25,2.646 -+1,0.6,0.01,25.2,35,3.009 -+1,0.6,0.01,30,-15,3.486 -+1,0.6,0.01,30,-5,3.041 -+1,0.6,0.01,30,5,2.628 -+1,0.6,0.01,30,15,2.367 -+1,0.6,0.01,30,25,2.517 -+1,0.6,0.01,30,35,2.818 -+1,0.6,0.01,37.1,-15,3.218 -+1,0.6,0.01,37.1,-5,2.843 -+1,0.6,0.01,37.1,5,2.496 -+1,0.6,0.01,37.1,15,2.272 -+1,0.6,0.01,37.1,25,2.391 -+1,0.6,0.01,37.1,35,2.635 -+1,0.6,0.02,12.1,-15,6.936 -+1,0.6,0.02,12.1,-5,5.506 -+1,0.6,0.02,12.1,5,4.252 -+1,0.6,0.02,12.1,15,3.46 -+1,0.6,0.02,12.1,25,3.843 -+1,0.6,0.02,12.1,35,4.678 -+1,0.6,0.02,18,-15,5.546 -+1,0.6,0.02,18,-5,4.63 -+1,0.6,0.02,18,5,3.818 -+1,0.6,0.02,18,15,3.303 -+1,0.6,0.02,18,25,3.56 -+1,0.6,0.02,18,35,4.11 -+1,0.6,0.02,25.2,-15,4.577 -+1,0.6,0.02,25.2,-5,4.04 -+1,0.6,0.02,25.2,5,3.545 -+1,0.6,0.02,25.2,15,3.235 -+1,0.6,0.02,25.2,25,3.416 -+1,0.6,0.02,25.2,35,3.779 -+1,0.6,0.02,30,-15,4.276 -+1,0.6,0.02,30,-5,3.831 -+1,0.6,0.02,30,5,3.418 -+1,0.6,0.02,30,15,3.157 -+1,0.6,0.02,30,25,3.307 -+1,0.6,0.02,30,35,3.608 -+1,0.6,0.02,37.1,-15,4.03 -+1,0.6,0.02,37.1,-5,3.655 -+1,0.6,0.02,37.1,5,3.308 -+1,0.6,0.02,37.1,15,3.084 -+1,0.6,0.02,37.1,25,3.203 -+1,0.6,0.02,37.1,35,3.447 -+1,0.6,0.03,12.1,-15,7.678 -+1,0.6,0.03,12.1,-5,6.247 -+1,0.6,0.03,12.1,5,4.993 -+1,0.6,0.03,12.1,15,4.202 -+1,0.6,0.03,12.1,25,4.585 -+1,0.6,0.03,12.1,35,5.42 -+1,0.6,0.03,18,-15,6.31 -+1,0.6,0.03,18,-5,5.394 -+1,0.6,0.03,18,5,4.582 -+1,0.6,0.03,18,15,4.068 -+1,0.6,0.03,18,25,4.324 -+1,0.6,0.03,18,35,4.874 -+1,0.6,0.03,25.2,-15,5.348 -+1,0.6,0.03,25.2,-5,4.811 -+1,0.6,0.03,25.2,5,4.316 -+1,0.6,0.03,25.2,15,4.006 -+1,0.6,0.03,25.2,25,4.187 -+1,0.6,0.03,25.2,35,4.55 -+1,0.6,0.03,30,-15,5.067 -+1,0.6,0.03,30,-5,4.622 -+1,0.6,0.03,30,5,4.209 -+1,0.6,0.03,30,15,3.948 -+1,0.6,0.03,30,25,4.098 -+1,0.6,0.03,30,35,4.399 -+1,0.6,0.03,37.1,-15,4.842 -+1,0.6,0.03,37.1,-5,4.467 -+1,0.6,0.03,37.1,5,4.12 -+1,0.6,0.03,37.1,15,3.896 -+1,0.6,0.03,37.1,25,4.015 -+1,0.6,0.03,37.1,35,4.259 -+1,0.6,0.04,12.1,-15,8.419 -+1,0.6,0.04,12.1,-5,6.989 -+1,0.6,0.04,12.1,5,5.735 -+1,0.6,0.04,12.1,15,4.943 -+1,0.6,0.04,12.1,25,5.326 -+1,0.6,0.04,12.1,35,6.162 -+1,0.6,0.04,18,-15,7.074 -+1,0.6,0.04,18,-5,6.159 -+1,0.6,0.04,18,5,5.347 -+1,0.6,0.04,18,15,4.832 -+1,0.6,0.04,18,25,5.089 -+1,0.6,0.04,18,35,5.639 -+1,0.6,0.04,25.2,-15,6.12 -+1,0.6,0.04,25.2,-5,5.582 -+1,0.6,0.04,25.2,5,5.087 -+1,0.6,0.04,25.2,15,4.777 -+1,0.6,0.04,25.2,25,4.958 -+1,0.6,0.04,25.2,35,5.321 -+1,0.6,0.04,30,-15,5.858 -+1,0.6,0.04,30,-5,5.413 -+1,0.6,0.04,30,5,5 -+1,0.6,0.04,30,15,4.739 -+1,0.6,0.04,30,25,4.889 -+1,0.6,0.04,30,35,5.19 -+1,0.6,0.04,37.1,-15,5.654 -+1,0.6,0.04,37.1,-5,5.279 -+1,0.6,0.04,37.1,5,4.932 -+1,0.6,0.04,37.1,15,4.708 -+1,0.6,0.04,37.1,25,4.827 -+1,0.6,0.04,37.1,35,5.071 -+1,0.9,-0.04,12.1,-15,2.318 -+1,0.9,-0.04,12.1,-5,0.888 -+1,0.9,-0.04,12.1,5,-0.366 -+1,0.9,-0.04,12.1,15,-0.786 -+1,0.9,-0.04,12.1,25,-0.289 -+1,0.9,-0.04,12.1,35,0.63 -+1,0.9,-0.04,18,-15,0.89 -+1,0.9,-0.04,18,-5,-0.025 -+1,0.9,-0.04,18,5,-0.836 -+1,0.9,-0.04,18,15,-1.097 -+1,0.9,-0.04,18,25,-0.764 -+1,0.9,-0.04,18,35,-0.157 -+1,0.9,-0.04,25.2,-15,-0.099 -+1,0.9,-0.04,25.2,-5,-0.635 -+1,0.9,-0.04,25.2,5,-1.129 -+1,0.9,-0.04,25.2,15,-1.254 -+1,0.9,-0.04,25.2,25,-1.022 -+1,0.9,-0.04,25.2,35,-0.618 -+1,0.9,-0.04,30,-15,-0.4 -+1,0.9,-0.04,30,-5,-0.843 -+1,0.9,-0.04,30,5,-1.254 -+1,0.9,-0.04,30,15,-1.359 -+1,0.9,-0.04,30,25,-1.166 -+1,0.9,-0.04,30,35,-0.829 -+1,0.9,-0.04,37.1,-15,-0.654 -+1,0.9,-0.04,37.1,-5,-1.026 -+1,0.9,-0.04,37.1,5,-1.37 -+1,0.9,-0.04,37.1,15,-1.466 -+1,0.9,-0.04,37.1,25,-1.311 -+1,0.9,-0.04,37.1,35,-1.037 -+1,0.9,-0.03,12.1,-15,3.022 -+1,0.9,-0.03,12.1,-5,1.592 -+1,0.9,-0.03,12.1,5,0.338 -+1,0.9,-0.03,12.1,15,-0.082 -+1,0.9,-0.03,12.1,25,0.415 -+1,0.9,-0.03,12.1,35,1.334 -+1,0.9,-0.03,18,-15,1.61 -+1,0.9,-0.03,18,-5,0.696 -+1,0.9,-0.03,18,5,-0.115 -+1,0.9,-0.03,18,15,-0.377 -+1,0.9,-0.03,18,25,-0.044 -+1,0.9,-0.03,18,35,0.563 -+1,0.9,-0.03,25.2,-15,0.642 -+1,0.9,-0.03,25.2,-5,0.106 -+1,0.9,-0.03,25.2,5,-0.388 -+1,0.9,-0.03,25.2,15,-0.513 -+1,0.9,-0.03,25.2,25,-0.281 -+1,0.9,-0.03,25.2,35,0.122 -+1,0.9,-0.03,30,-15,0.316 -+1,0.9,-0.03,30,-5,-0.127 -+1,0.9,-0.03,30,5,-0.538 -+1,0.9,-0.03,30,15,-0.643 -+1,0.9,-0.03,30,25,-0.45 -+1,0.9,-0.03,30,35,-0.113 -+1,0.9,-0.03,37.1,-15,0.037 -+1,0.9,-0.03,37.1,-5,-0.335 -+1,0.9,-0.03,37.1,5,-0.678 -+1,0.9,-0.03,37.1,15,-0.775 -+1,0.9,-0.03,37.1,25,-0.62 -+1,0.9,-0.03,37.1,35,-0.346 -+1,0.9,-0.02,12.1,-15,3.726 -+1,0.9,-0.02,12.1,-5,2.296 -+1,0.9,-0.02,12.1,5,1.042 -+1,0.9,-0.02,12.1,15,0.622 -+1,0.9,-0.02,12.1,25,1.119 -+1,0.9,-0.02,12.1,35,2.038 -+1,0.9,-0.02,18,-15,2.33 -+1,0.9,-0.02,18,-5,1.416 -+1,0.9,-0.02,18,5,0.605 -+1,0.9,-0.02,18,15,0.343 -+1,0.9,-0.02,18,25,0.676 -+1,0.9,-0.02,18,35,1.283 -+1,0.9,-0.02,25.2,-15,1.383 -+1,0.9,-0.02,25.2,-5,0.847 -+1,0.9,-0.02,25.2,5,0.353 -+1,0.9,-0.02,25.2,15,0.228 -+1,0.9,-0.02,25.2,25,0.46 -+1,0.9,-0.02,25.2,35,0.864 -+1,0.9,-0.02,30,-15,1.032 -+1,0.9,-0.02,30,-5,0.589 -+1,0.9,-0.02,30,5,0.178 -+1,0.9,-0.02,30,15,0.074 -+1,0.9,-0.02,30,25,0.267 -+1,0.9,-0.02,30,35,0.603 -+1,0.9,-0.02,37.1,-15,0.728 -+1,0.9,-0.02,37.1,-5,0.357 -+1,0.9,-0.02,37.1,5,0.013 -+1,0.9,-0.02,37.1,15,-0.084 -+1,0.9,-0.02,37.1,25,0.071 -+1,0.9,-0.02,37.1,35,0.345 -+1,0.9,-0.01,12.1,-15,4.442 -+1,0.9,-0.01,12.1,-5,3.012 -+1,0.9,-0.01,12.1,5,1.758 -+1,0.9,-0.01,12.1,15,1.337 -+1,0.9,-0.01,12.1,25,1.834 -+1,0.9,-0.01,12.1,35,2.753 -+1,0.9,-0.01,18,-15,3.081 -+1,0.9,-0.01,18,-5,2.166 -+1,0.9,-0.01,18,5,1.354 -+1,0.9,-0.01,18,15,1.091 -+1,0.9,-0.01,18,25,1.423 -+1,0.9,-0.01,18,35,2.029 -+1,0.9,-0.01,25.2,-15,2.158 -+1,0.9,-0.01,25.2,-5,1.621 -+1,0.9,-0.01,25.2,5,1.126 -+1,0.9,-0.01,25.2,15,1 -+1,0.9,-0.01,25.2,25,1.231 -+1,0.9,-0.01,25.2,35,1.634 -+1,0.9,-0.01,30,-15,1.807 -+1,0.9,-0.01,30,-5,1.362 -+1,0.9,-0.01,30,5,0.949 -+1,0.9,-0.01,30,15,0.843 -+1,0.9,-0.01,30,25,1.034 -+1,0.9,-0.01,30,35,1.369 -+1,0.9,-0.01,37.1,-15,1.505 -+1,0.9,-0.01,37.1,-5,1.13 -+1,0.9,-0.01,37.1,5,0.783 -+1,0.9,-0.01,37.1,15,0.684 -+1,0.9,-0.01,37.1,25,0.836 -+1,0.9,-0.01,37.1,35,1.108 -+1,0.9,0,12.1,-15,5.264 -+1,0.9,0,12.1,-5,3.834 -+1,0.9,0,12.1,5,2.58 -+1,0.9,0,12.1,15,2.159 -+1,0.9,0,12.1,25,2.656 -+1,0.9,0,12.1,35,3.574 -+1,0.9,0,18,-15,3.927 -+1,0.9,0,18,-5,3.012 -+1,0.9,0,18,5,2.2 -+1,0.9,0,18,15,1.937 -+1,0.9,0,18,25,2.269 -+1,0.9,0,18,35,2.875 -+1,0.9,0,25.2,-15,3.012 -+1,0.9,0,25.2,-5,2.475 -+1,0.9,0,25.2,5,1.98 -+1,0.9,0,25.2,15,1.854 -+1,0.9,0,25.2,25,2.084 -+1,0.9,0,25.2,35,2.487 -+1,0.9,0,30,-15,2.683 -+1,0.9,0,30,-5,2.238 -+1,0.9,0,30,5,1.825 -+1,0.9,0,30,15,1.719 -+1,0.9,0,30,25,1.91 -+1,0.9,0,30,35,2.245 -+1,0.9,0,37.1,-15,2.405 -+1,0.9,0,37.1,-5,2.03 -+1,0.9,0,37.1,5,1.684 -+1,0.9,0,37.1,15,1.584 -+1,0.9,0,37.1,25,1.736 -+1,0.9,0,37.1,35,2.008 -+1,0.9,0.01,12.1,-15,6.087 -+1,0.9,0.01,12.1,-5,4.657 -+1,0.9,0.01,12.1,5,3.403 -+1,0.9,0.01,12.1,15,2.982 -+1,0.9,0.01,12.1,25,3.479 -+1,0.9,0.01,12.1,35,4.397 -+1,0.9,0.01,18,-15,4.776 -+1,0.9,0.01,18,-5,3.86 -+1,0.9,0.01,18,5,3.048 -+1,0.9,0.01,18,15,2.786 -+1,0.9,0.01,18,25,3.117 -+1,0.9,0.01,18,35,3.724 -+1,0.9,0.01,25.2,-15,3.867 -+1,0.9,0.01,25.2,-5,3.329 -+1,0.9,0.01,25.2,5,2.834 -+1,0.9,0.01,25.2,15,2.708 -+1,0.9,0.01,25.2,25,2.939 -+1,0.9,0.01,25.2,35,3.342 -+1,0.9,0.01,30,-15,3.56 -+1,0.9,0.01,30,-5,3.115 -+1,0.9,0.01,30,5,2.702 -+1,0.9,0.01,30,15,2.596 -+1,0.9,0.01,30,25,2.787 -+1,0.9,0.01,30,35,3.122 -+1,0.9,0.01,37.1,-15,3.306 -+1,0.9,0.01,37.1,-5,2.931 -+1,0.9,0.01,37.1,5,2.584 -+1,0.9,0.01,37.1,15,2.484 -+1,0.9,0.01,37.1,25,2.637 -+1,0.9,0.01,37.1,35,2.908 -+1,0.9,0.02,12.1,-15,6.91 -+1,0.9,0.02,12.1,-5,5.48 -+1,0.9,0.02,12.1,5,4.226 -+1,0.9,0.02,12.1,15,3.805 -+1,0.9,0.02,12.1,25,4.302 -+1,0.9,0.02,12.1,35,5.22 -+1,0.9,0.02,18,-15,5.624 -+1,0.9,0.02,18,-5,4.708 -+1,0.9,0.02,18,5,3.896 -+1,0.9,0.02,18,15,3.634 -+1,0.9,0.02,18,25,3.965 -+1,0.9,0.02,18,35,4.572 -+1,0.9,0.02,25.2,-15,4.721 -+1,0.9,0.02,25.2,-5,4.184 -+1,0.9,0.02,25.2,5,3.689 -+1,0.9,0.02,25.2,15,3.563 -+1,0.9,0.02,25.2,25,3.793 -+1,0.9,0.02,25.2,35,4.196 -+1,0.9,0.02,30,-15,4.437 -+1,0.9,0.02,30,-5,3.992 -+1,0.9,0.02,30,5,3.579 -+1,0.9,0.02,30,15,3.473 -+1,0.9,0.02,30,25,3.664 -+1,0.9,0.02,30,35,3.999 -+1,0.9,0.02,37.1,-15,4.207 -+1,0.9,0.02,37.1,-5,3.832 -+1,0.9,0.02,37.1,5,3.485 -+1,0.9,0.02,37.1,15,3.385 -+1,0.9,0.02,37.1,25,3.538 -+1,0.9,0.02,37.1,35,3.809 -+1,0.9,0.03,12.1,-15,7.733 -+1,0.9,0.03,12.1,-5,6.303 -+1,0.9,0.03,12.1,5,5.049 -+1,0.9,0.03,12.1,15,4.628 -+1,0.9,0.03,12.1,25,5.125 -+1,0.9,0.03,12.1,35,6.043 -+1,0.9,0.03,18,-15,6.472 -+1,0.9,0.03,18,-5,5.556 -+1,0.9,0.03,18,5,4.744 -+1,0.9,0.03,18,15,4.482 -+1,0.9,0.03,18,25,4.813 -+1,0.9,0.03,18,35,5.42 -+1,0.9,0.03,25.2,-15,5.576 -+1,0.9,0.03,25.2,-5,5.039 -+1,0.9,0.03,25.2,5,4.544 -+1,0.9,0.03,25.2,15,4.418 -+1,0.9,0.03,25.2,25,4.649 -+1,0.9,0.03,25.2,35,5.052 -+1,0.9,0.03,30,-15,5.314 -+1,0.9,0.03,30,-5,4.869 -+1,0.9,0.03,30,5,4.456 -+1,0.9,0.03,30,15,4.35 -+1,0.9,0.03,30,25,4.541 -+1,0.9,0.03,30,35,4.876 -+1,0.9,0.03,37.1,-15,5.108 -+1,0.9,0.03,37.1,-5,4.733 -+1,0.9,0.03,37.1,5,4.386 -+1,0.9,0.03,37.1,15,4.286 -+1,0.9,0.03,37.1,25,4.439 -+1,0.9,0.03,37.1,35,4.71 -+1,0.9,0.04,12.1,-15,8.556 -+1,0.9,0.04,12.1,-5,7.126 -+1,0.9,0.04,12.1,5,5.871 -+1,0.9,0.04,12.1,15,5.451 -+1,0.9,0.04,12.1,25,5.948 -+1,0.9,0.04,12.1,35,6.866 -+1,0.9,0.04,18,-15,7.32 -+1,0.9,0.04,18,-5,6.404 -+1,0.9,0.04,18,5,5.592 -+1,0.9,0.04,18,15,5.33 -+1,0.9,0.04,18,25,5.661 -+1,0.9,0.04,18,35,6.268 -+1,0.9,0.04,25.2,-15,6.432 -+1,0.9,0.04,25.2,-5,5.895 -+1,0.9,0.04,25.2,5,5.4 -+1,0.9,0.04,25.2,15,5.274 -+1,0.9,0.04,25.2,25,5.505 -+1,0.9,0.04,25.2,35,5.907 -+1,0.9,0.04,30,-15,6.192 -+1,0.9,0.04,30,-5,5.747 -+1,0.9,0.04,30,5,5.334 -+1,0.9,0.04,30,15,5.228 -+1,0.9,0.04,30,25,5.419 -+1,0.9,0.04,30,35,5.754 -+1,0.9,0.04,37.1,-15,6.008 -+1,0.9,0.04,37.1,-5,5.633 -+1,0.9,0.04,37.1,5,5.287 -+1,0.9,0.04,37.1,15,5.187 -+1,0.9,0.04,37.1,25,5.34 -+1,0.9,0.04,37.1,35,5.611 -diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py -index 6318cab..2f9132a 100644 ---- a/ebus_toolbox/consumption.py -+++ b/ebus_toolbox/consumption.py -@@ -1,6 +1,7 @@ - import numpy as np - import csv - import pandas as pd -+ - from scipy.interpolate import interpn -  -  -@@ -16,21 +17,23 @@ class Consumption: -  - with open(kwargs.get("level_of_loading_over_day", "data/examples/default_level_of_loading_over_day.csv")) as f: - reader = csv.DictReader(f) -+ self.lol_by_hour = {} - for row in reader: - self.lol_by_hour.update({int(row['hour']): float(row['level_of_loading'])}) -  - self.consumption_files = {} - self.vehicle_types = vehicle_types -  -+ # ToDo Height Difference, lea - def calculate_consumption(self, time, distance, vehicle_type, charging_type, -- height_difference=0, level_of_loading=None, mean_speed=10): -+ height_difference=0, level_of_loading=None, mean_speed=18): - """ Calculates consumed amount of energy for a given distance. -  - :param time: The date and time at which the trip ends - :type time: datetime.datetime -  - # Is Distance traveled in km correct? seems to be in m -- :param distance: Distance travelled [km] -+ :param distance: Distance travelled [m] - :type distance: float - :param vehicle_type: The vehicle type for which to calculate consumption - :type vehicle_type: str -@@ -40,7 +43,9 @@ class Consumption: - :param height_difference: difference in height between stations in meters- - :type height_difference: float - :param level_of_loading: Level of loading of the bus between empty (=0) and completely full (=1.0) -- :type charging_type: float -+ :type level_of_loading: float -+ :param mean_speed: Mean speed between two stops in kmh -+ :type mean_speed: float -  - :return: Consumed energy [kWh] and delta SOC as tuple - :rtype: (float, float) -@@ -65,64 +70,56 @@ class Consumption: - # If no specific LoL is given, interpolate from demand time series. - if level_of_loading is None: - level_of_loading = np.interp(time.hour, -- list(self.lol_by_hour.keys()), -- list(self.lol_by_hour.values())) -+ list(self.lol_by_hour.keys()), -+ list(self.lol_by_hour.values())) -  - # load consumption csv - consumption_file = self.vehicle_types[vt_ct]["mileage"] -  -- # consumption_files holds interpol functions of csv files which are called directly and held in memory. --> No -- # repeated Generation of multi-dimensional interpolation functionality needed. -- -- # ToDO Same pinciple for vehicle types and names in consumption matrix has to be implemented with correct names -- vehicle_type_nr = dict(CKB=0, SOLO=1)[vehicle_type] -+ # Consumption_files holds interpol functions of csv files which are called directly and held in memory -+ vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] - try: -- # ToDo Check distance unit - mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, - incline=height_difference / distance, - temp=temp, - lol=level_of_loading, -- speed_profile=mean_speed) -+ speed=mean_speed) -+ print(vehicle_type_nr,height_difference / distance, temp, level_of_loading, mean_speed) -+ print(mileage) - return mileage * distance - except KeyError: -- df=pd.read_csv(consumption_file, sep=",") -- vehicle_type_u = df["vehicle_type"].unique() -- incline_u = df["incline"].unique() -- temp_u = df["temp"].unique() -- lol_u = df["level_of_loading"].unique() -- speed_u = df["mean_speed"].unique() -- points=(vehicle_type_u, incline_u,temp_u,lol_u,speed_u) -- -- def func_con(df, vt, inc, temp, lol, speed): -- return df[df["vehicle_type"]==vt * df["incline"]==inc * -- df["temp"]==temp * df["level_of_loading"]==lol * -- df["mean_speed"]==speed].values()[0] -- values = func_con(*np.meshgrid(*points, indexing='ij')) -- -- def interpol_function(vehicle_type,incline,temp,lol,speed): -- point=(vehicle_type,incline,temp,lol,speed) -- return interpn(points, values, point) -+ df = pd.read_csv(consumption_file, sep=",") -+ vehicle_type_u = list(df["vehicle_type"].unique()) -+ incline_u = list(df["incline"].unique()) -+ temp_u = list(df["temp"].unique()) -+ lol_u = list(df["level_of_loading"].unique()) -+ speed_u = list(df["mean_speed_kmh"].unique()) -+ points = (vehicle_type_u, incline_u, temp_u, lol_u, speed_u) -+ values = np.zeros((len(vehicle_type_u), len(incline_u), len(temp_u), len(lol_u), len(speed_u))) -+ -+ # Nested loops for creating values in grid -+ for i, vt in enumerate(vehicle_type_u): -+ for ii, inc in enumerate(incline_u): -+ for iii, temp in enumerate(temp_u): -+ for iv, lol in enumerate(lol_u): -+ for v, speed in enumerate(speed_u): -+ values[i, ii, iii, iv, v] = df[(df["vehicle_type"] == vt) * (df["incline"] == inc) * -+ (df["temp"] == temp) * (df["level_of_loading"] == lol) * -+ (df["mean_speed_kmh"] == speed)][ -+ "consumption_kwh_per_km"] -+ -+ def interpol_function(vehicle_type, incline, temp, lol, speed): -+ point = (vehicle_type, incline, temp, lol, speed) -+ return interpn(points, values, point)[0] -+ - self.consumption_files.update({consumption_file: interpol_function}) -  -- # # load consumption csv -- # consumption_file = self.vehicle_types[vt_ct]["mileage"] -- # try: -- # consumption = self.consumption_files[consumption_file] -- # except KeyError: -- # consumption = {'temperature': [], 'consumption': []} -- # with open(consumption_file, 'r') as f: -- # reader = csv.DictReader(f) -- # for row in reader: -- # consumption['temperature'].append(float(row['Temp.'])) -- # consumption['consumption'].append(float(row['Kat. B'])) -- # self.consumption_files.update({consumption_file: consumption}) -- -- xp = self.consumption_files[consumption_file]['temperature'] -- fp = self.consumption_files[consumption_file]['consumption'] -- -- mileage = np.interp(temp, xp, fp) # kWh / m -+ mileage = self.consumption_files[consumption_file](vehicle_type=vehicle_type_nr, -+ incline=height_difference / distance, -+ temp=temp, -+ lol=level_of_loading, -+ speed=mean_speed) - consumed_energy = mileage * distance / 1000 # kWh -- - return consumed_energy -  - def get_delta_soc(self, consumed_energy, vehicle_type, charging_type): From 38c6d8b25cc34f4dfed29e3b203bf319816bad0d Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 19 Sep 2022 13:21:11 +0200 Subject: [PATCH 228/802] output SOC timeseries for each rotation --- ebus_toolbox/report.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 3acc9894..50e25442 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -17,6 +17,7 @@ def generate(schedule, scenario, args): schedule.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) incomplete_rotations = [] + rotation_socs = {} for id, rotation in schedule.rotations.items(): # get SOC timeseries for this rotation vehicle_id = rotation.vehicle_id @@ -25,7 +26,7 @@ def generate(schedule, scenario, args): vehicle_soc = scenario.vehicle_socs[vehicle_id] start_idx = (rotation.departure_time - sim_start_time) // interval end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) - if end_idx > len(vehicle_soc): + if end_idx > scenario.n_intervals: # SpiceEV stopped before rotation was fully simulated incomplete_rotations.append(id) continue @@ -48,13 +49,24 @@ def generate(schedule, scenario, args): } rotation_infos.append(rotation_info) + # save SOCs for each rotation + rotation_socs[id] = [None]*scenario.n_intervals + rotation_socs[id][start_idx:end_idx] = rotation_soc_ts + if incomplete_rotations: warnings.warn("SpiceEV stopped before simulation of the these rotations were completed:\n" f"{', '.join(incomplete_rotations)}\n" "Omit parameter to simulate entire schedule.", stacklevel=100) - with open(Path(args.output_directory) / "rotations.csv", "w+") as f: + with open(Path(args.output_directory) / "rotation_socs.csv", "w+") as f: + csv_writer = csv.writer(f) + csv_writer.writerow(("time",) + tuple(rotation_socs.keys())) + for i, row in enumerate(zip(*rotation_socs.values())): + t = sim_start_time + i * scenario.interval + csv_writer.writerow((t,) + row) + + with open(Path(args.output_directory) / "rotation_summary.csv", "w+") as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) From 130fec45af49e303766176af4a74a38d6bda6156 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 19 Sep 2022 14:37:17 +0200 Subject: [PATCH 229/802] cfg output_directory comment --- data/configs/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 94d2f5c4..cf2cba95 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -5,7 +5,7 @@ # Input file containing trip information (required) input_schedule = "./data/examples/trips_example.csv" -# output path for scenario.json -- called input since its input for spiceev +# output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) output_directory = "./data/sim_outputs/" # electrified stations (defaults to: data/examples/electrified_stations.json) From bedf0e6885dce82b899f2b91a91662292a972bd2 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 19 Sep 2022 14:39:01 +0200 Subject: [PATCH 230/802] move example config to examples folder --- data/{configs => examples}/ebus_toolbox.cfg | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data/{configs => examples}/ebus_toolbox.cfg (100%) diff --git a/data/configs/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg similarity index 100% rename from data/configs/ebus_toolbox.cfg rename to data/examples/ebus_toolbox.cfg From 50f7f66aa1922e5b83ce17bf5040982fcc5e845b Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 19 Sep 2022 17:49:39 +0200 Subject: [PATCH 231/802] set next_departure_time = end_of_sim for last trip --- ebus_toolbox/schedule.py | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 1384dc66..064360fa 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -287,6 +287,14 @@ def generate_scenario(self, args): "vehicle_events": [] } + # define start and stop times + start_simulation = \ + self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) + stop_simulation = self.get_arrival_of_last_trip() + interval + if args.days is not None: + stop_simulation = min( + stop_simulation, start_simulation + datetime.timedelta(days=args.days)) + # add vehicle events for vehicle_id in {rot.vehicle_id for rot in self.rotations.values()}: v_name = vehicle_id @@ -343,7 +351,7 @@ def generate_scenario(self, args): vehicle_rotations[rotation_ids[i + 1]].trips[0].arrival_time except IndexError: departure_event_in_input = False - departure = arrival + datetime.timedelta(hours=8) + departure = stop_simulation # no more rotations # calculate total minutes spend at station @@ -471,33 +479,27 @@ def generate_scenario(self, args): # ######## END OF VEHICLE EVENTS ########## # - # define start and stop times - start = \ - self.get_departure_of_first_trip() - datetime.timedelta(minutes=args.signal_time_dif) - stop = self.get_arrival_of_last_trip() + interval - if args.days is not None: - stop = min(stop, start + datetime.timedelta(days=args.days)) daily = datetime.timedelta(days=1) # price events for key in grid_connectors.keys(): if not args.include_price_csv: - now = start - daily - while now < stop + 2 * daily: + now = start_simulation - daily + while now < stop_simulation + 2 * daily: now += daily for v_id, v in vehicles.items(): - if now >= stop: + if now >= stop_simulation: # after end of scenario: keep generating trips, but don't include in # scenario continue # generate prices for the day - if now < stop: + if now < stop_simulation: morning = now + datetime.timedelta(hours=6) evening_by_month = now + datetime.timedelta( hours=22 - abs(6 - now.month)) events['grid_operator_signals'] += [{ # day (6-evening): 15ct - "signal_time": max(start, now - daily).isoformat(), + "signal_time": max(start_simulation, now - daily).isoformat(), "grid_connector_id": key, "start_time": morning.isoformat(), "cost": { @@ -506,7 +508,7 @@ def generate_scenario(self, args): } }, { # night (depending on month - 6): 5ct - "signal_time": max(start, now - daily).isoformat(), + "signal_time": max(start_simulation, now - daily).isoformat(), "grid_connector_id": key, "start_time": evening_by_month.isoformat(), "cost": { @@ -522,7 +524,7 @@ def generate_scenario(self, args): for filename, gc_name in args.include_ext_load_csv: options = { "csv_file": filename, - "start_time": start.isoformat(), + "start_time": start_simulation.isoformat(), "step_duration_s": 900, # 15 minutes "grid_connector_id": gc_name, "column": "energy" @@ -542,7 +544,7 @@ def generate_scenario(self, args): for filename, gc_name in args.include_feed_in_csv: options = { "csv_file": filename, - "start_time": start.isoformat(), + "start_time": start_simulation.isoformat(), "step_duration_s": 3600, # 60 minutes "grid_connector_id": gc_name, "column": "energy" @@ -561,7 +563,7 @@ def generate_scenario(self, args): for filename, gc_name in args.include_price_csv: options = { "csv_file": filename, - "start_time": start.isoformat(), + "start_time": start_simulation.isoformat(), "step_duration_s": 3600, # 60 minutes "grid_connector_id": gc_name, "column": "price [ct/kWh]" @@ -602,9 +604,9 @@ def generate_scenario(self, args): # create final dict self.scenario = { "scenario": { - "start_time": start.isoformat(), + "start_time": start_simulation.isoformat(), "interval": interval.days * 24 * 60 + interval.seconds // 60, - "n_intervals": (stop - start) // interval + "n_intervals": (stop_simulation - start_simulation) // interval }, "constants": { "vehicle_types": self.vehicle_types, From 0b56d995426fb309aff644f1404a0cea7f24e05e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 21 Sep 2022 09:36:01 +0200 Subject: [PATCH 232/802] temporary fix last departure time per vehicle --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 064360fa..01d568e4 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -351,7 +351,7 @@ def generate_scenario(self, args): vehicle_rotations[rotation_ids[i + 1]].trips[0].arrival_time except IndexError: departure_event_in_input = False - departure = stop_simulation + departure = max(stop_simulation, arrival + datetime.timedelta(hours=1)) # no more rotations # calculate total minutes spend at station From e41a225cdff3138bd64e5fe600f477be646d0960 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 21 Sep 2022 09:47:06 +0200 Subject: [PATCH 233/802] remove empty lines from output csvs on windows --- ebus_toolbox/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index b6c4c646..6946a82a 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -57,14 +57,14 @@ def generate(schedule, scenario, args): "Omit parameter to simulate entire schedule.", stacklevel=100) - with open(args.output_directory / "rotation_socs.csv", "w+") as f: + with open(args.output_directory / "rotation_socs.csv", "w+", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(("time",) + tuple(rotation_socs.keys())) for i, row in enumerate(zip(*rotation_socs.values())): t = sim_start_time + i * scenario.interval csv_writer.writerow((t,) + row) - with open(args.output_directory / "rotation_summary.csv", "w+") as f: + with open(args.output_directory / "rotation_summary.csv", "w+", newline='') as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) From 4bb78ecac649f4e0b1a56f2cf6c18dd71bc9c0a9 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 21 Sep 2022 10:16:55 +0200 Subject: [PATCH 234/802] vehicle events generation refactored --- ebus_toolbox/schedule.py | 269 ++++++++++++++++++--------------------- 1 file changed, 125 insertions(+), 144 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 064360fa..edd955a5 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -296,66 +296,46 @@ def generate_scenario(self, args): stop_simulation, start_simulation + datetime.timedelta(days=args.days)) # add vehicle events - for vehicle_id in {rot.vehicle_id for rot in self.rotations.values()}: - v_name = vehicle_id - vt = vehicle_id.split("_")[0] - ct = vehicle_id.split("_")[1] - + for vehicle_id in sorted({rot.vehicle_id for rot in self.rotations.values()}): # filter all rides for that bus - vehicle_rotations = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_name} + vehicle_rotations = {k: v for k, v in self.rotations.items() + if v.vehicle_id == vehicle_id} # sort events for their departure time, so that the matching departure time of an # arrival event can be read out of the next element in vid_list vehicle_rotations = {k: v for k, v in sorted( vehicle_rotations.items(), key=lambda x: x[1].departure_time)} - rotation_ids = list(vehicle_rotations.keys()) - - # define start conditions - first_rotation = list(vehicle_rotations.values())[0] - departure = first_rotation.departure_time - # trips list is sorted by time - arrival = first_rotation.trips[0].arrival_time - vehicles[v_name] = { - "connected_charging_station": f'{v_name}_{first_rotation.departure_name}_deps', - "estimated_time_of_departure": departure.isoformat(), - "desired_soc": None, - "soc": args.desired_soc, - "vehicle_type": vt + "_" + ct - } - # initial departure event from starting depot - events["vehicle_events"].append({ - "signal_time": (departure + datetime.timedelta( - minutes=-args.signal_time_dif)).isoformat(), - "start_time": departure.isoformat(), - "vehicle_id": v_name, - "event_type": "departure", - "update": { - "estimated_time_of_arrival": arrival.isoformat() - } - }) - - for i, v in enumerate(rotation_ids): - departure_event_in_input = True - # create events for all trips of one rotation - for j, trip in enumerate(vehicle_rotations[v].trips): - cs_name = "{}_{}".format(v_name, trip.arrival_name) - gc_name = trip.arrival_name - arrival = trip.arrival_time - try: - departure = vehicle_rotations[v].trips[j + 1].departure_time - next_arrival = vehicle_rotations[v].trips[j + 1].arrival_time - except IndexError: - # get departure of the first trip of the next rotation - try: - departure = vehicle_rotations[rotation_ids[i + 1]].departure_time - next_arrival = \ - vehicle_rotations[rotation_ids[i + 1]].trips[0].arrival_time - except IndexError: - departure_event_in_input = False - departure = stop_simulation - # no more rotations - - # calculate total minutes spend at station - standing_time = (departure - arrival).seconds / 60 + + vehicle_trips = [t for rot in vehicle_rotations.values() for t in rot.trips] + + for i, trip in enumerate(vehicle_trips): + + cs_name = f"{vehicle_id}_{trip.arrival_name}" + gc_name = trip.arrival_name + + try: + next_departure_time = vehicle_trips[i+1].departure_time + except IndexError: + # last trip + next_departure_time = stop_simulation + + # connect cs and add gc if station is electrified + connected_charging_station = None + desired_soc = 0 + try: + # assume electrified station + station = self.stations[gc_name] + station_type = station["type"] + if station_type == 'opps' and trip.rotation.charging_type == 'depb': + # a depot bus cannot charge at an opp station + station_type = None + else: + # at opp station, always try to charge as much as you can + desired_soc = 1 if station_type == "opps" else args.desired_soc + except KeyError: + # non-electrified station + station_type = None + + if station_type == 'opps': # get buffer time from user configuration # buffer time resembles amount of time deducted off of the planned standing # time. It may resemble things like delays and/or docking procedures @@ -369,7 +349,7 @@ def generate_scenario(self, args): if isinstance(buffer_time, dict): # sort dict to make sure 'else' key is last key buffer_time = {key: buffer_time[key] for key in sorted(buffer_time)} - current_hour = arrival.hour + current_hour = trip.arrival_time.hour for time_range, buffer in buffer_time.items(): if time_range == 'else': buffer_time = buffer @@ -387,95 +367,96 @@ def generate_scenario(self, args): else: # buffer time not specified for hour of current stop buffer_time = args.default_buffer_time_opps - - # connect cs and add gc if station is electrified - connected_charging_station = None - desired_soc = 0 - try: - # assume electrified station - station = self.stations[gc_name] - station_type = station["type"] - if station_type == 'opps' and vehicle_rotations[v].charging_type == 'depb': - # a depot bus cannot charge at an opp station - station_type = None - else: - # at opp station, always try to charge as much as you can - desired_soc = 1 if station_type == "opps" else args.desired_soc - except KeyError: - # non-electrified station - station_type = None - - # 1. if standing time - buffer time shorter than min_charging_time, - # do not connect charging station - # 2. if current station has no charger or a depot bus arrives at opp charger, - # do not connect charging station either - if (station_type is not None and - (standing_time - buffer_time >= args.min_charging_time_opps)): - - cs_name_and_type = cs_name + "_" + station_type - connected_charging_station = cs_name_and_type - - if cs_name not in charging_stations or gc_name not in grid_connectors: - number_cs = station["n_charging_stations"] - if station_type == "deps": - cs_power = args.cs_power_deps_oppb if ct == 'oppb' \ - else args.cs_power_deps_depb - gc_power = args.gc_power_deps - elif station_type == "opps": - # delay the arrival time to account for docking procedure - arrival = arrival + datetime.timedelta(minutes=buffer_time) - cs_power = args.cs_power_opps - gc_power = args.gc_power_opps - - # gc power is not set in config - if gc_power is None: - if number_cs is not None: - gc_power = number_cs * cs_power - else: - # ToDo: Check reason! Calculate via number of busses? - # add a really large number - gc_power = 100 * cs_power - - # add one charging station for each bus at bus station - charging_stations[cs_name_and_type] = { - "type": station_type, - "max_power": cs_power, - "min_power": 0.1 * cs_power, - "parent": gc_name - } - # add one grid connector for each bus station - grid_connectors[gc_name] = { - "max_power": gc_power, - "cost": {"type": "fixed", "value": 0.3}, - "number_cs": number_cs - } - - # create arrival events - events["vehicle_events"].append({ - "signal_time": (arrival + datetime.timedelta(minutes=-args.signal_time_dif) - ).isoformat(), - "start_time": arrival.isoformat(), - "vehicle_id": v_name, - "event_type": "arrival", - "update": { - "connected_charging_station": connected_charging_station, - "estimated_time_of_departure": departure.isoformat(), - "soc_delta": trip.delta_soc, - "desired_soc": desired_soc + # adapt arrival time with buffer time + arrival_time = trip.arrival_time + datetime.timedelta(minutes=buffer_time) + else: + arrival_time = trip.arrival_time + + # calculate total minutes spend at station + standing_time = (next_departure_time - arrival_time).seconds / 60 + + # 1. if standing time - buffer time shorter than min_charging_time, + # do not connect charging station + # 2. if current station has no charger or a depot bus arrives at opp charger, + # do not connect charging station either + if (station_type is not None and + (standing_time >= args.min_charging_time_opps)): + + cs_name_and_type = f"{cs_name}_{station_type}" + connected_charging_station = cs_name_and_type + + if cs_name not in charging_stations or gc_name not in grid_connectors: + number_cs = station["n_charging_stations"] + if station_type == "deps": + cs_power = args.cs_power_deps_oppb \ + if trip.rotation.charging_type == 'oppb' \ + else args.cs_power_deps_depb + gc_power = args.gc_power_deps + elif station_type == "opps": + cs_power = args.cs_power_opps + gc_power = args.gc_power_opps + + # gc power is not set in config + if gc_power is None: + if number_cs is not None: + gc_power = number_cs * cs_power + else: + # ToDo: Check reason! Calculate via number of busses? + # add a really large number + gc_power = 100 * cs_power + + # add one charging station for each bus at bus station + charging_stations[cs_name_and_type] = { + "type": station_type, + "max_power": cs_power, + "min_power": 0.1 * cs_power, + "parent": gc_name } - }) - # create departure events - if departure_event_in_input: - events["vehicle_events"].append({ - "signal_time": (departure + datetime.timedelta( - minutes=-args.signal_time_dif)).isoformat(), - "start_time": departure.isoformat(), - "vehicle_id": v_name, - "event_type": "departure", - "update": { - "estimated_time_of_arrival": next_arrival.isoformat() - } - }) + # add one grid connector for each bus station + grid_connectors[gc_name] = { + "max_power": gc_power, + "cost": {"type": "fixed", "value": 0.3}, + "number_cs": number_cs + } + + # initial condition of vehicle + if i == 0: + vehicles[vehicle_id] = { + "connected_charging_station": connected_charging_station, + "estimated_time_of_departure": trip.departure_time.isoformat(), + "desired_soc": None, + "soc": args.desired_soc, + "vehicle_type": + f"{trip.rotation.vehicle_type}_{trip.rotation.charging_type}" + } + + # create departure event + events["vehicle_events"].append({ + "signal_time": (trip.departure_time + datetime.timedelta( + minutes=-args.signal_time_dif)).isoformat(), + "start_time": trip.departure_time.isoformat(), + "vehicle_id": vehicle_id, + "event_type": "departure", + "update": { + "estimated_time_of_arrival": arrival_time.isoformat() + } + }) + + # create arrival event + events["vehicle_events"].append({ + "signal_time": (arrival_time + + datetime.timedelta(minutes=-args.signal_time_dif) + ).isoformat(), + "start_time": arrival_time.isoformat(), + "vehicle_id": vehicle_id, + "event_type": "arrival", + "update": { + "connected_charging_station": connected_charging_station, + "estimated_time_of_departure": next_departure_time.isoformat(), + "soc_delta": trip.delta_soc, + "desired_soc": desired_soc + } + }) # ######## END OF VEHICLE EVENTS ########## # From 6c0bb031a39e593549933e9198991ae4122dda0f Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 21 Sep 2022 10:32:04 +0200 Subject: [PATCH 235/802] fix estimated departure after last trip --- ebus_toolbox/schedule.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index edd955a5..482e939e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -316,7 +316,8 @@ def generate_scenario(self, args): next_departure_time = vehicle_trips[i+1].departure_time except IndexError: # last trip - next_departure_time = stop_simulation + next_departure_time = max(stop_simulation, + trip.arrival_time + datetime.timedelta(hours=8)) # connect cs and add gc if station is electrified connected_charging_station = None @@ -379,8 +380,9 @@ def generate_scenario(self, args): # do not connect charging station # 2. if current station has no charger or a depot bus arrives at opp charger, # do not connect charging station either - if (station_type is not None and - (standing_time >= args.min_charging_time_opps)): + if (station_type == 'deps' or + (station_type == 'opps' and + (standing_time >= args.min_charging_time_opps))): cs_name_and_type = f"{cs_name}_{station_type}" connected_charging_station = cs_name_and_type @@ -445,7 +447,7 @@ def generate_scenario(self, args): # create arrival event events["vehicle_events"].append({ "signal_time": (arrival_time - + datetime.timedelta(minutes=-args.signal_time_dif) + - datetime.timedelta(minutes=args.signal_time_dif) ).isoformat(), "start_time": arrival_time.isoformat(), "vehicle_id": vehicle_id, From 5d42b981f99c8864a8dfe1627abed3572bf6ece8 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 21 Sep 2022 11:50:43 +0200 Subject: [PATCH 236/802] limit arrival time to next departure time --- ebus_toolbox/schedule.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 482e939e..ba791837 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -369,14 +369,15 @@ def generate_scenario(self, args): # buffer time not specified for hour of current stop buffer_time = args.default_buffer_time_opps # adapt arrival time with buffer time - arrival_time = trip.arrival_time + datetime.timedelta(minutes=buffer_time) + arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), + next_departure_time) else: arrival_time = trip.arrival_time # calculate total minutes spend at station standing_time = (next_departure_time - arrival_time).seconds / 60 - # 1. if standing time - buffer time shorter than min_charging_time, + # 1. if standing time is shorter than min_charging_time, # do not connect charging station # 2. if current station has no charger or a depot bus arrives at opp charger, # do not connect charging station either From b4aa6b181864cda217527579d116759d2c2fb529 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 21 Sep 2022 13:09:45 +0200 Subject: [PATCH 237/802] remove unnecessary variable --- ebus_toolbox/schedule.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ba791837..c523990f 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -385,8 +385,7 @@ def generate_scenario(self, args): (station_type == 'opps' and (standing_time >= args.min_charging_time_opps))): - cs_name_and_type = f"{cs_name}_{station_type}" - connected_charging_station = cs_name_and_type + connected_charging_station = f"{cs_name}_{station_type}" if cs_name not in charging_stations or gc_name not in grid_connectors: number_cs = station["n_charging_stations"] @@ -404,12 +403,12 @@ def generate_scenario(self, args): if number_cs is not None: gc_power = number_cs * cs_power else: - # ToDo: Check reason! Calculate via number of busses? + # TODO: Check reason! Calculate via number of busses? # add a really large number gc_power = 100 * cs_power # add one charging station for each bus at bus station - charging_stations[cs_name_and_type] = { + charging_stations[connected_charging_station] = { "type": station_type, "max_power": cs_power, "min_power": 0.1 * cs_power, From a21474288f2db8454ba9a547b6ef1089f746f0cd Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 21 Sep 2022 13:11:05 +0200 Subject: [PATCH 238/802] set estimated departure after last arrival to 8h --- ebus_toolbox/schedule.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c523990f..4382dc2d 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -316,8 +316,7 @@ def generate_scenario(self, args): next_departure_time = vehicle_trips[i+1].departure_time except IndexError: # last trip - next_departure_time = max(stop_simulation, - trip.arrival_time + datetime.timedelta(hours=8)) + next_departure_time = trip.arrival_time + datetime.timedelta(hours=8) # connect cs and add gc if station is electrified connected_charging_station = None From 99f4f3312a3e60ea8286e5739d4b985a56e00458 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 23 Sep 2022 08:48:41 +0200 Subject: [PATCH 239/802] move get buffer time to util --- ebus_toolbox/schedule.py | 48 ++++++++++++---------------------------- ebus_toolbox/util.py | 30 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 4382dc2d..82202425 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -4,6 +4,7 @@ import warnings from pathlib import Path +from ebus_toolbox import util from ebus_toolbox.rotation import Rotation from src.scenario import Scenario @@ -300,18 +301,18 @@ def generate_scenario(self, args): # filter all rides for that bus vehicle_rotations = {k: v for k, v in self.rotations.items() if v.vehicle_id == vehicle_id} - # sort events for their departure time, so that the matching departure time of an - # arrival event can be read out of the next element in vid_list + # get sorted list of all trips for current vehicle + # sort rotations by time leveraging the fact that the + # list of trips per rotation is always sorted vehicle_rotations = {k: v for k, v in sorted( vehicle_rotations.items(), key=lambda x: x[1].departure_time)} - vehicle_trips = [t for rot in vehicle_rotations.values() for t in rot.trips] for i, trip in enumerate(vehicle_trips): - cs_name = f"{vehicle_id}_{trip.arrival_name}" gc_name = trip.arrival_name + # departure time of next trip for standing time calculation try: next_departure_time = vehicle_trips[i+1].departure_time except IndexError: @@ -335,39 +336,16 @@ def generate_scenario(self, args): # non-electrified station station_type = None + # add buffer time to arrival time for opps if station_type == 'opps': # get buffer time from user configuration # buffer time resembles amount of time deducted off of the planned standing # time. It may resemble things like delays and/or docking procedures # use buffer time from electrified stations JSON or in case none is # provided use global default from config file - buffer_time = self.stations.get(trip.arrival_name, {})\ - .get('buffer_time', args.default_buffer_time_opps) - - # distinct buffer times depending on time of day can be provided - # in that case buffer time is of type dict instead of int - if isinstance(buffer_time, dict): - # sort dict to make sure 'else' key is last key - buffer_time = {key: buffer_time[key] for key in sorted(buffer_time)} - current_hour = trip.arrival_time.hour - for time_range, buffer in buffer_time.items(): - if time_range == 'else': - buffer_time = buffer - break - else: - start_hour, end_hour = [int(t) for t in time_range.split('-')] - if end_hour < start_hour: - if current_hour >= start_hour or current_hour < end_hour: - buffer_time = buffer - break - else: - if start_hour <= current_hour < end_hour: - buffer_time = buffer - break - else: - # buffer time not specified for hour of current stop - buffer_time = args.default_buffer_time_opps - # adapt arrival time with buffer time + buffer_time = util.get_buffer_time(schedule=self, + trip=trip, + default=args.default_buffer_time_opps) arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), next_departure_time) else: @@ -383,9 +361,10 @@ def generate_scenario(self, args): if (station_type == 'deps' or (station_type == 'opps' and (standing_time >= args.min_charging_time_opps))): - + # vehicle connects to charging station connected_charging_station = f"{cs_name}_{station_type}" + # create charging station and grid connector if necessary if cs_name not in charging_stations or gc_name not in grid_connectors: number_cs = station["n_charging_stations"] if station_type == "deps": @@ -433,8 +412,9 @@ def generate_scenario(self, args): # create departure event events["vehicle_events"].append({ - "signal_time": (trip.departure_time + datetime.timedelta( - minutes=-args.signal_time_dif)).isoformat(), + "signal_time": (trip.departure_time + - datetime.timedelta(minutes=args.signal_time_dif) + ).isoformat(), "start_time": trip.departure_time.isoformat(), "vehicle_id": vehicle_id, "event_type": "departure", diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 20f8cb92..e823863f 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -43,3 +43,33 @@ def set_options_from_config(args, check=False, verbose=True): # Give overview of options if verbose: print("Options: {}".format(vars(args))) + + +def get_buffer_time(schedule, trip, default): + buffer_time = schedule.stations.get(trip.arrival_name, {}).get('buffer_time', default) + + # distinct buffer times depending on time of day can be provided + # in that case buffer time is of type dict instead of int + if isinstance(buffer_time, dict): + # sort dict to make sure 'else' key is last key + buffer_time = {key: buffer_time[key] for key in sorted(buffer_time)} + current_hour = trip.arrival_time.hour + for time_range, buffer in buffer_time.items(): + if time_range == 'else': + buffer_time = buffer + break + else: + start_hour, end_hour = [int(t) for t in time_range.split('-')] + if end_hour < start_hour: + if current_hour >= start_hour or current_hour < end_hour: + buffer_time = buffer + break + else: + if start_hour <= current_hour < end_hour: + buffer_time = buffer + break + else: + # buffer time not specified for hour of current stop + buffer_time = default + + return buffer_time From 4e75983dca3beeb2ccfb7ae120d4326c991fb7cc Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 23 Sep 2022 08:59:19 +0200 Subject: [PATCH 240/802] fix bug created by previous merge --- ebus_toolbox/schedule.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index da9b5a31..e56508d4 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -358,9 +358,10 @@ def generate_scenario(self, args): # do not connect charging station # 2. if current station has no charger or a depot bus arrives at opp charger, # do not connect charging station either - if (station_type is not None and - (standing_time - buffer_time >= args.min_charging_time_opps)): - + if (station_type is not None and + (standing_time >= args.min_charging_time_opps)): + # vehicle connects to charging station + connected_charging_station = f"{cs_name}_{station_type}" # create charging station and grid connector if necessary if cs_name not in charging_stations or gc_name not in grid_connectors: number_cs = station["n_charging_stations"] From fd239a4d2f1b8bcb9e1be95596e3b5b038f6f476 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 23 Sep 2022 09:05:39 +0200 Subject: [PATCH 241/802] min charging time applies to deps as well --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/schedule.py | 26 +++++++++++--------------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index cf2cba95..8e8a1afb 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -46,7 +46,7 @@ desired_soc = 1 preferred_charging_type = "depb" # min charging time at opp station [minutes] (default: 2) -min_charging_time_opps = 2 +min_charging_time = 2 # buffer time at opp station if no specific buffer time is provided # via the electrified_stations.json [minutes] (default: 1) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index b809de3b..1d7fe461 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -71,7 +71,7 @@ default='examples/vehicle_types.json') parser.add_argument('--cost_params', help='include cost_params json', default=None) - parser.add_argument('--min_charging_time_opps', help='define minimum time of charging at opps', + parser.add_argument('--min_charging_time', help='define minimum time of charging', default=2) parser.add_argument('--default_buffer_time_opps', help='time to subtract off of standing time ' 'at opp station to simulate docking procedure.', default=1) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e56508d4..a98e2333 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -336,20 +336,16 @@ def generate_scenario(self, args): # non-electrified station station_type = None - # add buffer time to arrival time for opps - if station_type == 'opps': - # get buffer time from user configuration - # buffer time resembles amount of time deducted off of the planned standing - # time. It may resemble things like delays and/or docking procedures - # use buffer time from electrified stations JSON or in case none is - # provided use global default from config file - buffer_time = util.get_buffer_time(schedule=self, - trip=trip, - default=args.default_buffer_time_opps) - arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), - next_departure_time) - else: - arrival_time = trip.arrival_time + # get buffer time from user configuration + # buffer time resembles amount of time deducted off of the planned standing + # time. It may resemble things like delays and/or docking procedures + # use buffer time from electrified stations JSON or in case none is + # provided use global default from config file + buffer_time = util.get_buffer_time(schedule=self, + trip=trip, + default=args.default_buffer_time_opps) + arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), + next_departure_time) # calculate total minutes spend at station standing_time = (next_departure_time - arrival_time).seconds / 60 @@ -359,7 +355,7 @@ def generate_scenario(self, args): # 2. if current station has no charger or a depot bus arrives at opp charger, # do not connect charging station either if (station_type is not None and - (standing_time >= args.min_charging_time_opps)): + (standing_time >= args.min_charging_time)): # vehicle connects to charging station connected_charging_station = f"{cs_name}_{station_type}" # create charging station and grid connector if necessary From 1de07c458669989808fa791090f440e47156d490 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 23 Sep 2022 09:07:09 +0200 Subject: [PATCH 242/802] cosmetics --- ebus_toolbox/schedule.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a98e2333..4ea6f1cc 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -354,8 +354,7 @@ def generate_scenario(self, args): # do not connect charging station # 2. if current station has no charger or a depot bus arrives at opp charger, # do not connect charging station either - if (station_type is not None and - (standing_time >= args.min_charging_time)): + if station_type is not None and standing_time >= args.min_charging_time: # vehicle connects to charging station connected_charging_station = f"{cs_name}_{station_type}" # create charging station and grid connector if necessary From f95bc72c5ed98465617ace881c350ce005bce978 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 23 Sep 2022 09:16:08 +0200 Subject: [PATCH 243/802] comments --- ebus_toolbox/schedule.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 4ea6f1cc..d157896c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -319,7 +319,7 @@ def generate_scenario(self, args): # last trip next_departure_time = trip.arrival_time + datetime.timedelta(hours=8) - # connect cs and add gc if station is electrified + # get current station if electrified connected_charging_station = None desired_soc = 0 try: @@ -347,13 +347,11 @@ def generate_scenario(self, args): arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), next_departure_time) - # calculate total minutes spend at station + # total minutes spend at station standing_time = (next_departure_time - arrival_time).seconds / 60 - # 1. if standing time is shorter than min_charging_time, - # do not connect charging station - # 2. if current station has no charger or a depot bus arrives at opp charger, - # do not connect charging station either + # connect to charging station + # generate gc and cs if they dont exist if station_type is not None and standing_time >= args.min_charging_time: # vehicle connects to charging station connected_charging_station = f"{cs_name}_{station_type}" @@ -369,15 +367,6 @@ def generate_scenario(self, args): cs_power = args.cs_power_opps gc_power = args.gc_power_opps - # gc power is not set in config - if gc_power is None: - if number_cs is not None: - gc_power = number_cs * cs_power - else: - # TODO: Check reason! Calculate via number of busses? - # add a really large number - gc_power = 100 * cs_power - # add one charging station for each bus at bus station charging_stations[connected_charging_station] = { "type": station_type, @@ -395,7 +384,7 @@ def generate_scenario(self, args): # initial condition of vehicle if i == 0: vehicles[vehicle_id] = { - "connected_charging_station": connected_charging_station, + "connected_charging_station": None, "estimated_time_of_departure": trip.departure_time.isoformat(), "desired_soc": None, "soc": args.desired_soc, From ed6b8de6cbdd0828b4798a60e713bbcb0cd0fdfc Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Fri, 23 Sep 2022 09:32:12 +0200 Subject: [PATCH 244/802] comment and simplification of util.get_buffer_time --- ebus_toolbox/schedule.py | 3 +-- ebus_toolbox/util.py | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index d157896c..0ad3c0d3 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -341,8 +341,7 @@ def generate_scenario(self, args): # time. It may resemble things like delays and/or docking procedures # use buffer time from electrified stations JSON or in case none is # provided use global default from config file - buffer_time = util.get_buffer_time(schedule=self, - trip=trip, + buffer_time = util.get_buffer_time(trip=trip, default=args.default_buffer_time_opps) arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), next_departure_time) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index e823863f..8efe93f0 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -45,7 +45,17 @@ def set_options_from_config(args, check=False, verbose=True): print("Options: {}".format(vars(args))) -def get_buffer_time(schedule, trip, default): +def get_buffer_time(trip, default): + """ Get buffer time at arrival station of a trip + + :param trip: The of buffer time of this trips arrival is returned. + :type trip: ebus_toolbox.Trip + :param default: Default buffer time if no station specific buffer time is given. + :type default: dict, numeric + :return: Buffer time + :rtype: numeric + """ + schedule = trip.rotation.schedule buffer_time = schedule.stations.get(trip.arrival_name, {}).get('buffer_time', default) # distinct buffer times depending on time of day can be provided @@ -68,8 +78,8 @@ def get_buffer_time(schedule, trip, default): if start_hour <= current_hour < end_hour: buffer_time = buffer break - else: - # buffer time not specified for hour of current stop - buffer_time = default + else: + # buffer time not specified for hour of current stop + buffer_time = default return buffer_time From b6776f46d8a0130abe619135d15d75830bdc30c5 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 26 Sep 2022 11:07:28 +0200 Subject: [PATCH 245/802] cap arrival time one time step before sim end --- ebus_toolbox/schedule.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 0ad3c0d3..d93f70d3 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -343,8 +343,11 @@ def generate_scenario(self, args): # provided use global default from config file buffer_time = util.get_buffer_time(trip=trip, default=args.default_buffer_time_opps) + # arrival event must occur no later than next departure and + # one step before simulation terminates for arrival event to be taken into account arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), - next_departure_time) + next_departure_time, + stop_simulation - interval) # total minutes spend at station standing_time = (next_departure_time - arrival_time).seconds / 60 From 88641301c552d5cab52a203d5c3a39e99482e896 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 26 Sep 2022 11:28:18 +0200 Subject: [PATCH 246/802] soc ts - fill trailing none with last known value --- ebus_toolbox/report.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 6946a82a..18df5dc9 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -30,6 +30,14 @@ def generate(schedule, scenario, args): continue rotation_soc_ts = vehicle_soc[start_idx:end_idx] + # bus does not return before simulation end + # replace trailing None values with last numeric value + for i, soc in enumerate(reversed(rotation_soc_ts)): + if soc is not None: + break + last_known_idx = len(rotation_soc_ts) - 1 - i + rotation_soc_ts[last_known_idx+1:] = i * [rotation_soc_ts[last_known_idx]] + rotation_info = { "rotation_id": id, "start_time": rotation.departure_time.isoformat(), From 740d83531e8f00b303375dfd637ea8dcc0f4a6b4 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 26 Sep 2022 11:44:23 +0200 Subject: [PATCH 247/802] do not generate events that start after sim end --- ebus_toolbox/schedule.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index d93f70d3..9ecf3338 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -309,6 +309,10 @@ def generate_scenario(self, args): vehicle_trips = [t for rot in vehicle_rotations.values() for t in rot.trips] for i, trip in enumerate(vehicle_trips): + # dont generated events that start after simulation has stopped + if trip.departure_time >= stop_simulation: + break + cs_name = f"{vehicle_id}_{trip.arrival_name}" gc_name = trip.arrival_name From f12691914dbaf27407f5cbd901a021c3ff7a5c65 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Mon, 26 Sep 2022 12:29:29 +0200 Subject: [PATCH 248/802] ignore buffer time at last arrival per vehicle --- ebus_toolbox/schedule.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 9ecf3338..8d386e6a 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -342,16 +342,21 @@ def generate_scenario(self, args): # get buffer time from user configuration # buffer time resembles amount of time deducted off of the planned standing - # time. It may resemble things like delays and/or docking procedures + # time. + # It may resemble things like delays and/or docking procedures # use buffer time from electrified stations JSON or in case none is # provided use global default from config file - buffer_time = util.get_buffer_time(trip=trip, - default=args.default_buffer_time_opps) + # ignore buffer time for end of last trip to make sure vehicles arrive + # before simulation ends + if i < len(vehicle_trips) - 1: + buffer_time = util.get_buffer_time(trip=trip, + default=args.default_buffer_time_opps) + else: + buffer_time = 0 # arrival event must occur no later than next departure and # one step before simulation terminates for arrival event to be taken into account arrival_time = min(trip.arrival_time + datetime.timedelta(minutes=buffer_time), - next_departure_time, - stop_simulation - interval) + next_departure_time) # total minutes spend at station standing_time = (next_departure_time - arrival_time).seconds / 60 From f822065913c7f6244d9f3d55add05073ee50903a Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 10:43:04 +0200 Subject: [PATCH 249/802] change structure of vehicle_types.json --- data/examples/vehicle_types.json | 132 +++++++++++++++++-------------- ebus_toolbox/consumption.py | 21 ++--- ebus_toolbox/rotation.py | 6 +- ebus_toolbox/schedule.py | 11 ++- 4 files changed, 90 insertions(+), 80 deletions(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 05b21136..42291422 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -1,70 +1,80 @@ { - "AB_oppb": { - "name": "articulated bus - opportunity charging", - "capacity": 50, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5 + "AB": { + "depb": { + "name": "articulated bus - depot charging", + "capacity": 150, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5 + }, + "oppb": { + "name": "articulated bus - opportunity charging", + "capacity": 50, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5 + } }, - "AB_depb": { - "name": "articulated bus - opportunity charging", - "capacity": 150, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5 + "CKB": { + "depb": { + "name": "articulated bus", + "capacity": 310, + "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" + }, + "oppb": { + "name": "articulated bus", + "capacity": 190, + "charging_curve": [[0, 190], [0.8, 190], [1, 190]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" + } }, - "CKB_depb": { - "name": "articulated bus", - "capacity": 310, - "charging_curve": [[0, 250], [0.8, 250], [1, 250]], - "min_charging_power": 0, - "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" - }, - "CKB_oppb": { - "name": "articulated bus", - "capacity": 190, - "charging_curve": [[0, 190], [0.8, 190], [1, 190]], - "min_charging_power": 0, - "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" - }, - "VDL_depb": { - "name": "solo bus", - "capacity": 250, - "charging_curve": [[0, 250], [0.8, 250], [1, 250]], - "min_charging_power": 0, - "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" - }, - "VDL_oppb": { - "name": "solo bus", - "capacity": 250, - "charging_curve": [[0, 250], [0.8, 250], [1, 250]], - "min_charging_power": 0, - "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "VDL": { + "depb": { + "name": "solo bus", + "capacity": 250, + "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" + }, + "oppb": { + "name": "solo bus", + "capacity": 250, + "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" + } }, "minimum_information": { - "name": "Displayed name", - "capacity": 0, - "mileage": 0, - "charging_curve": [[0,1],[1,0]] + "charging_type": { + "name": "Displayed name", + "capacity": 0, + "mileage": 0, + "charging_curve": [[0,1],[1,0]] + } }, "all_information": { - "name": "Displayed name", - "capacity": 0, - "mileage": 0, - "charging_curve": [[0,1],[1,0]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "battery_efficiency": 0.95 + "charging_type": { + "name": "Displayed name", + "capacity": 0, + "mileage": 0, + "charging_curve": [[0,1],[1,0]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5, + "battery_efficiency": 0.95 + } } } diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 3f96358d..ad48e93e 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -31,18 +31,12 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): :rtype: (float, float) """ - # the charging type may not be set - # picking one of the available charging types as only vehicle's mileage is - # needed which does not depend on charging type - if charging_type is None: - vt_ct = next((t for t in self.vehicle_types.keys() if vehicle_type in t)) - else: - vt_ct = f"{vehicle_type}_{charging_type}" - # in case a constant mileage is provided - if isinstance(self.vehicle_types[vt_ct]['mileage'], (int, float)): - consumed_energy = self.vehicle_types[vt_ct]['mileage'] * distance / 1000 - delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + if isinstance(self.vehicle_types[vehicle_type][charging_type]['mileage'], (int, float)): + consumed_energy = \ + self.vehicle_types[vehicle_type][charging_type]['mileage'] * distance / 1000 + delta_soc = -1 * (consumed_energy / + self.vehicle_types[vehicle_type][charging_type]["capacity"]) return consumed_energy, delta_soc temp = np.interp(time.hour, @@ -50,7 +44,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): list(self.temperatures_by_hour.values())) # load consumption csv - consumption_file = self.vehicle_types[vt_ct]["mileage"] + consumption_file = self.vehicle_types[vehicle_type][charging_type]["mileage"] try: consumption = self.consumption_files[consumption_file] except KeyError: @@ -68,6 +62,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): mileage = np.interp(temp, xp, fp) # kWh / m consumed_energy = mileage * distance / 1000 # kWh - delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) + delta_soc = -1 * (consumed_energy / + self.vehicle_types[vehicle_type][charging_type]["capacity"]) return consumed_energy, delta_soc diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index df32a427..54c74baf 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -91,7 +91,7 @@ def set_charging_type(self, ct): if ct == self.charging_type: return - assert f'{self.vehicle_type}_{ct}' in self.schedule.vehicle_types,\ + assert self.schedule.vehicle_types.get(self.vehicle_type).get(ct),\ f"Combination of vehicle type {self.vehicle_type} and {ct} not defined." old_consumption = self.consumption @@ -102,7 +102,7 @@ def set_charging_type(self, ct): # calculate earliest possible departure for this bus after completion # of this rotation if ct == "depb": - capacity_depb = self.schedule.vehicle_types[f"{self.vehicle_type}_depb"]["capacity"] + capacity_depb = self.schedule.vehicle_types[self.vehicle_type]["depb"]["capacity"] # minimum time needed to recharge consumed power from depot charger min_standing_time = (self.consumption / self.schedule.cs_power_deps_depb) # time to charge battery from 0 to desired SOC @@ -111,7 +111,7 @@ def set_charging_type(self, ct): if min_standing_time > desired_max_standing_time: min_standing_time = desired_max_standing_time elif ct == "oppb": - capacity_oppb = self.schedule.vehicle_types[f"{self.vehicle_type}_oppb"]["capacity"] + capacity_oppb = self.schedule.vehicle_types[self.vehicle_type]["oppb"]["capacity"] min_standing_time = ((capacity_oppb / self.schedule.cs_power_deps_oppb) * self.schedule.min_recharge_deps_oppb) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8d386e6a..391d76e0 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -115,7 +115,9 @@ def assign_vehicles(self): rotations_in_progress = [] idle_vehicles = [] # TODO: create vehicle type counts dict with ct and vt values of all types - vehicle_type_counts = {vehicle_type: 0 for vehicle_type in self.vehicle_types.keys()} + vehicle_type_counts = {f'{vehicle_type}_{charging_type}': 0 + for vehicle_type, charging_types in self.vehicle_types.items() + for charging_type in charging_types.keys()} rotations = sorted(self.rotations.values(), key=lambda rot: rot.departure_time) @@ -554,7 +556,10 @@ def generate_scenario(self, args): "discharge_curve": bat[3] }) - # TODO: restructure vehicle types for SpiceEV + # reformat vehicle types for spiceEV + vehicle_types_spiceev = {f'{vehicle_type}_{charging_type}': body + for vehicle_type, subtypes in self.vehicle_types.items() + for charging_type, body in subtypes.items()} # create final dict self.scenario = { @@ -564,7 +569,7 @@ def generate_scenario(self, args): "n_intervals": (stop_simulation - start_simulation) // interval }, "constants": { - "vehicle_types": self.vehicle_types, + "vehicle_types": vehicle_types_spiceev, "vehicles": vehicles, "grid_connectors": grid_connectors, "charging_stations": charging_stations, From 0900c68bda97916d0994d4e6f00f8edbaf272e37 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 10:59:39 +0200 Subject: [PATCH 250/802] move setting of default ct to schedule generation --- ebus_toolbox/consumption.py | 6 +++++- ebus_toolbox/schedule.py | 7 +++++++ ebus_toolbox/simulate.py | 9 +++------ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 3f96358d..ee5a1452 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -27,6 +27,9 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): :param charging_type: Charging type for the trip. Consumption differs between distinct types. :type charging_type: str + + :raises SystemExit: Charging type must be defined. + :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) """ @@ -35,7 +38,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): # picking one of the available charging types as only vehicle's mileage is # needed which does not depend on charging type if charging_type is None: - vt_ct = next((t for t in self.vehicle_types.keys() if vehicle_type in t)) + raise SystemExit("Charging types must be defined for all rotations " + "to allow for consumption calculation.") else: vt_ct = f"{vehicle_type}_{charging_type}" diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 01d568e4..0590e777 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -75,6 +75,13 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) + # set charging type for all rotations without explicitly specified charging type + # charging type may have been set above if a trip of a rotation has a specified + # charging type + for rot in schedule.rotations.values(): + if rot.charging_type is None: + rot.set_charging_type(ct=kwargs.get('preferred_charging_type')) + return schedule def run(self, args): diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 3df2e67b..ae316d54 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -52,16 +52,13 @@ def simulate(args): pass setattr(args, opt_key, opt_val) + # setup consumption calculator that can be accessed by all trips + Trip.consumption = Consumption(vehicle_types) + schedule = Schedule.from_csv(args.input_schedule, vehicle_types, stations, **vars(args)) - # setup consumption calculator that can be accessed by all trips - Trip.consumption = Consumption(vehicle_types) - # set charging type for all rotations without explicitly specified charging type - for rot in schedule.rotations.values(): - if rot.charging_type is None: - rot.set_charging_type(ct=args.preferred_charging_type) # run the mode specified in config if args.mode == 'service_optimization': From a4655ab6006c2f82eebdc4c7324da93c2e76d312 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 15:38:01 +0200 Subject: [PATCH 251/802] comments in get buffer time --- ebus_toolbox/util.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 8efe93f0..3dde7183 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -45,15 +45,29 @@ def set_options_from_config(args, check=False, verbose=True): print("Options: {}".format(vars(args))) -def get_buffer_time(trip, default): - """ Get buffer time at arrival station of a trip +def get_buffer_time(trip, default=0): + """ Get buffer time at arrival station of a trip. + Buffer_time is an abstraction of delays like docking procedures and + is added to the planned arrival time :param trip: The of buffer time of this trips arrival is returned. :type trip: ebus_toolbox.Trip - :param default: Default buffer time if no station specific buffer time is given. + :param default: Default buffer time if no station specific buffer time is given. [minutes] :type default: dict, numeric :return: Buffer time :rtype: numeric + + NOTE: Buffertime dictionaries map hours of the day to a buffer time. + Keys are ranges of hours and corresponding values provide buffer time in + minutes for that time range. + An entry with key "else" is a must if not all + hours of the day are covered. + E.g. + buffer_time = { + "10-22": 2, + "22-6": 3, + "else": 1 + } """ schedule = trip.rotation.schedule buffer_time = schedule.stations.get(trip.arrival_name, {}).get('buffer_time', default) @@ -78,8 +92,5 @@ def get_buffer_time(trip, default): if start_hour <= current_hour < end_hour: buffer_time = buffer break - else: - # buffer time not specified for hour of current stop - buffer_time = default return buffer_time From 4cc7fcf1389b703232ebdb533b72f2263a66725e Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 15:38:35 +0200 Subject: [PATCH 252/802] comments and minor fix --- ebus_toolbox/schedule.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8d386e6a..ea18efa1 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -309,7 +309,7 @@ def generate_scenario(self, args): vehicle_trips = [t for rot in vehicle_rotations.values() for t in rot.trips] for i, trip in enumerate(vehicle_trips): - # dont generated events that start after simulation has stopped + # don't generate events that start after simulation has stopped if trip.departure_time >= stop_simulation: break @@ -341,11 +341,8 @@ def generate_scenario(self, args): station_type = None # get buffer time from user configuration - # buffer time resembles amount of time deducted off of the planned standing - # time. - # It may resemble things like delays and/or docking procedures - # use buffer time from electrified stations JSON or in case none is - # provided use global default from config file + # buffer_time is an abstraction of delays like docking procedures and + # is added to the planned arrival time # ignore buffer time for end of last trip to make sure vehicles arrive # before simulation ends if i < len(vehicle_trips) - 1: @@ -359,7 +356,7 @@ def generate_scenario(self, args): next_departure_time) # total minutes spend at station - standing_time = (next_departure_time - arrival_time).seconds / 60 + standing_time = (next_departure_time - arrival_time).total_seconds / 60 # connect to charging station # generate gc and cs if they dont exist From bb9d7d76960dc063c90d05d2180088492ac479f9 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 15:56:54 +0200 Subject: [PATCH 253/802] use - instead of _ for config param names --- ebus_toolbox/__main__.py | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 1d7fe461..702a14ee 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -7,22 +7,22 @@ parser = argparse.ArgumentParser( description='eBus-Toolbox - \ simulation program for electric bus fleets.') - parser.add_argument('--input_schedule', nargs='?', + parser.add_argument('--input-schedule', nargs='?', help='Path to CSV file containing all trips of schdedule to be analyzed.') parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], help='Specify what you want to do. Choose one from {sim, \ service_optimization}. sim runs a single simulation with the given inputs. \ service optimization finds the largest set of electrified rotations.') - parser.add_argument('--output_directory', default="./data/sim_outputs", nargs='?', + parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') - parser.add_argument('--preferred_charging_type', '-pct', default='depb', + parser.add_argument('--preferred-charging-type', '-pct', default='depb', choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ from {depb, oppb}. opp stands for opportunity.") parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", help='location of vehicle type definitions') - parser.add_argument('--min_recharge_deps_oppb', default=1, + parser.add_argument('--min-recharge-deps-oppb', default=1, help='Minimum fraction of capacity for recharge when leaving the depot.') - parser.add_argument('--min_recharge_deps_depb', default=1, + parser.add_argument('--min-recharge-deps-depb', default=1, help='Minimum fraction of capacity for recharge when leaving the depot.') parser.add_argument('--days', metavar='N', type=int, default=None, help='set duration of scenario as number of days') @@ -30,15 +30,15 @@ help='set number of minutes for each timestep (Δt)') parser.add_argument('--desired-soc', metavar='SOC', type=float, default=0.8, help='set minimum desired SOC (0 - 1) for each charging process') - parser.add_argument('--gc_power_opps', metavar='POPP', type=float, default=None, + parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=None, help='max power of grid connector at opp stations') - parser.add_argument('--gc_power_deps', metavar='PDEP', type=float, default=None, + parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=None, help='max power of grid connector at depot stations') - parser.add_argument('--cs_power_opps', metavar='CSPOPP', type=float, default=450, + parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=450, help='max power of charging station at opp stations') - parser.add_argument('--cs_power_deps_depb', metavar='CSPDEPDEP', type=float, default=100, + parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=100, help='max power of charging station at depot stations for depot busses') - parser.add_argument('--cs_power_deps_oppb', metavar='CSPDEPOPP', type=float, default=150, + parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, help='max power of charging station at depot stations for opp busses') parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', help='add battery with specified capacity in kWh and C-rate \ @@ -62,24 +62,21 @@ parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), nargs=2, default=[], action='append', help='append additional argument to price signals') - parser.add_argument('--start_date', default='2018-01-02', + parser.add_argument('--start-date', default='2018-01-02', help='Provide start date of simulation in format YYYY-MM-DD.E.g. ' '2018-01-31') - parser.add_argument('--electrified_stations', help='include electrified_stations json', + parser.add_argument('--electrified-stations', help='include electrified_stations json', default='data/examples/electrified_stations.json') - parser.add_argument('--vehicle_types', help='include vehicle_types json', - default='examples/vehicle_types.json') - parser.add_argument('--cost_params', help='include cost_params json', + parser.add_argument('--cost-params', help='include cost_params json', default=None) - parser.add_argument('--min_charging_time', help='define minimum time of charging', + parser.add_argument('--min-charging-time', help='define minimum time of charging', default=2) - parser.add_argument('--default_buffer_time_opps', help='time to subtract off of standing time ' + parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' 'at opp station to simulate docking procedure.', default=1) - parser.add_argument('--signal_time_dif', help='time difference between signal time and actual ' + parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' 'start time of a vehicle event im min.', default=10) parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') - parser.add_argument('--desired_soc', default=1, help='desired_soc of vehicles') parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') From 013db24b78692a2b67cea51a5920b5d5c2b65c33 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 16:01:04 +0200 Subject: [PATCH 254/802] minor fix --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ea18efa1..551a6e78 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -356,7 +356,7 @@ def generate_scenario(self, args): next_departure_time) # total minutes spend at station - standing_time = (next_departure_time - arrival_time).total_seconds / 60 + standing_time = (next_departure_time - arrival_time).total_seconds() / 60 # connect to charging station # generate gc and cs if they dont exist From 53dd512e86909e3927bc85cd507ce11ebf700e71 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 16:44:07 +0200 Subject: [PATCH 255/802] make oppb default charging type --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/schedule.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index cf2cba95..4783661e 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -42,7 +42,7 @@ signal_time_dif = 10 # set minimum allowed state of charge when leaving (default: 0.8) desired_soc = 1 -# Preferred charging type. Options: depb, oppb (default: depb) +# Preferred charging type. Options: depb, oppb (default: oppb) preferred_charging_type = "depb" # min charging time at opp station [minutes] (default: 2) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index b809de3b..19af680d 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -15,7 +15,7 @@ service optimization finds the largest set of electrified rotations.') parser.add_argument('--output_directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') - parser.add_argument('--preferred_charging_type', '-pct', default='depb', + parser.add_argument('--preferred_charging_type', '-pct', default='oppb', choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ from {depb, oppb}. opp stands for opportunity.") parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 0590e777..57158d2e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -80,7 +80,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): # charging type for rot in schedule.rotations.values(): if rot.charging_type is None: - rot.set_charging_type(ct=kwargs.get('preferred_charging_type')) + rot.set_charging_type(ct=kwargs.get('preferred_charging_type', 'oppb')) return schedule From c012f347c474175a432a9a465790e402cf0a4644 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Wed, 28 Sep 2022 17:13:07 +0200 Subject: [PATCH 256/802] flake8 and test vehicle types --- ebus_toolbox/consumption.py | 3 -- tests/test_input_files/vehicle_types.json | 36 ++++++++++++----------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 393139e6..ad48e93e 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -27,9 +27,6 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): :param charging_type: Charging type for the trip. Consumption differs between distinct types. :type charging_type: str - - :raises SystemExit: Charging type must be defined. - :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) """ diff --git a/tests/test_input_files/vehicle_types.json b/tests/test_input_files/vehicle_types.json index 6b017a1f..413aa438 100644 --- a/tests/test_input_files/vehicle_types.json +++ b/tests/test_input_files/vehicle_types.json @@ -1,20 +1,22 @@ { - "CKB_oppb": { - "name": "articulated bus - opportunity charging", - "capacity": 50, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 10 - }, - "CKB_depb": { - "name": "articulated bus - depot charging", - "capacity": 150, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 15 + "CKB": { + "oppb": { + "name": "articulated bus - opportunity charging", + "capacity": 50, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5, + "mileage": 10 + }, + "depb": { + "name": "articulated bus - depot charging", + "capacity": 150, + "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "min_charging_power": 0, + "v2g": false, + "v2g_power_factor": 0.5, + "mileage": 15 + } } } From 1b3f5e248ce37eff54c36d2c2385f26af3e4e610 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 29 Sep 2022 10:52:56 +0200 Subject: [PATCH 257/802] remove superfluous docstring which caused flake8 to fail --- ebus_toolbox/consumption.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 393139e6..dae4c872 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -28,8 +28,6 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): distinct types. :type charging_type: str - :raises SystemExit: Charging type must be defined. - :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) """ From 18e99a5329b68533fbfbba472461f9bf9fcc1cb4 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Thu, 29 Sep 2022 13:25:05 +0200 Subject: [PATCH 258/802] remove all_info and min_info from vehicle types --- data/examples/vehicle_types.json | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 42291422..65d00bf4 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -56,25 +56,5 @@ "mileage": "data/examples/energy_consumption_example.csv", "hc": "winter" } - }, - "minimum_information": { - "charging_type": { - "name": "Displayed name", - "capacity": 0, - "mileage": 0, - "charging_curve": [[0,1],[1,0]] - } - }, - "all_information": { - "charging_type": { - "name": "Displayed name", - "capacity": 0, - "mileage": 0, - "charging_curve": [[0,1],[1,0]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "battery_efficiency": 0.95 - } } -} +} \ No newline at end of file From f8bde671217a0a1d9bfc5eab0bf6102ade4a4209 Mon Sep 17 00:00:00 2001 From: Paul Boehnke Date: Thu, 29 Sep 2022 14:02:40 +0200 Subject: [PATCH 259/802] review comments --- ebus_toolbox/consumption.py | 18 ++++++++++-------- ebus_toolbox/rotation.py | 2 +- ebus_toolbox/schedule.py | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index dae4c872..ad4b6f8b 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -32,12 +32,15 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): :rtype: (float, float) """ + assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ + f"Combination of vehicle type {vehicle_type} and {charging_type} not defined." + + vehicle_info = self.vehicle_types[vehicle_type][charging_type] + # in case a constant mileage is provided - if isinstance(self.vehicle_types[vehicle_type][charging_type]['mileage'], (int, float)): - consumed_energy = \ - self.vehicle_types[vehicle_type][charging_type]['mileage'] * distance / 1000 - delta_soc = -1 * (consumed_energy / - self.vehicle_types[vehicle_type][charging_type]["capacity"]) + if isinstance(vehicle_info['mileage'], (int, float)): + consumed_energy = vehicle_info['mileage'] * distance / 1000 + delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) return consumed_energy, delta_soc temp = np.interp(time.hour, @@ -45,7 +48,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): list(self.temperatures_by_hour.values())) # load consumption csv - consumption_file = self.vehicle_types[vehicle_type][charging_type]["mileage"] + consumption_file = vehicle_info["mileage"] try: consumption = self.consumption_files[consumption_file] except KeyError: @@ -63,7 +66,6 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type): mileage = np.interp(temp, xp, fp) # kWh / m consumed_energy = mileage * distance / 1000 # kWh - delta_soc = -1 * (consumed_energy / - self.vehicle_types[vehicle_type][charging_type]["capacity"]) + delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) return consumed_energy, delta_soc diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 54c74baf..1cf1e23f 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -91,7 +91,7 @@ def set_charging_type(self, ct): if ct == self.charging_type: return - assert self.schedule.vehicle_types.get(self.vehicle_type).get(ct),\ + assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct),\ f"Combination of vehicle type {self.vehicle_type} and {ct} not defined." old_consumption = self.consumption diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 36f47f28..ff171f31 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -121,7 +121,8 @@ def assign_vehicles(self): """ rotations_in_progress = [] idle_vehicles = [] - # TODO: create vehicle type counts dict with ct and vt values of all types + # count number of vehicles per type + # used for unique vehicle id e.g. vehicletype_chargingtype_id vehicle_type_counts = {f'{vehicle_type}_{charging_type}': 0 for vehicle_type, charging_types in self.vehicle_types.items() for charging_type in charging_types.keys()} From 93dfdc36b3230b5991eb567abdf3e9119f2f3d7c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 14 Oct 2022 15:27:52 +0200 Subject: [PATCH 260/802] Add Stefans nd interpol and add sources for input of calc consumption --- .gitignore | 2 + data/configs/ebus_toolbox.cfg | 2 + data/examples/station_data.csv | 15 ++++ ebus_toolbox/__main__.py | 4 + ebus_toolbox/consumption.py | 129 ++++++++++++++++++++++----------- ebus_toolbox/schedule.py | 14 +++- ebus_toolbox/simulate.py | 2 + ebus_toolbox/trip.py | 28 ++++++- 8 files changed, 146 insertions(+), 50 deletions(-) create mode 100644 data/examples/station_data.csv diff --git a/.gitignore b/.gitignore index 03792e9f..22889a19 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ docs/source/temp data/private_examples data/sim_outputs data/preprocessing_scripts +src/ +*.bak \ No newline at end of file diff --git a/data/configs/ebus_toolbox.cfg b/data/configs/ebus_toolbox.cfg index 9afee72c..0a5fc83c 100644 --- a/data/configs/ebus_toolbox.cfg +++ b/data/configs/ebus_toolbox.cfg @@ -33,6 +33,8 @@ interval = 1 # time difference between signal time and actual start time of a vehicle event im min. (default: 10) signal_time_dif = 10 +# Path to station data with stations heights and possibly more information +station_data_path = "data/examples/station_data.csv" ##### SIMULATION CONDITIONS AND BOUNDARIES ##### diff --git a/data/examples/station_data.csv b/data/examples/station_data.csv new file mode 100644 index 00000000..87638e4f --- /dev/null +++ b/data/examples/station_data.csv @@ -0,0 +1,15 @@ +Station,Height_m +Station-0,1 +Station-1,2 +Station-2,3 +Station-3,4 +Station-4,5 +Station-5,6 +Station-6,7 +Station-7,8 +Station-8,9 +Station-9,10 +Station-10,11 +Station-11,12 +Station-12,13 +Station-13,14 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 67b1fbdc..098cff9c 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -97,6 +97,10 @@ nargs=2, action='append', help='Append additional options to the charging strategy.') parser.add_argument('--config', help='Use config file to set arguments') + parser.add_argument('--station_data_path', help='Use station data to back calculation \ + of consumption with height information of \ + stations') + args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 19e28cab..89fa700c 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -24,7 +24,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: self.consumption_files = {} self.vehicle_types = vehicle_types - def calculate_consumption(self, time, distance, vehicle_type, charging_type, + def calculate_consumption(self, time, distance, vehicle_type, charging_type,temp=None, height_diff=0, level_of_loading=None, mean_speed=18): """ Calculates consumed amount of energy for a given distance. @@ -48,7 +48,6 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) """ - # the charging type may not be set # picking one of the available charging types as only vehicle's mileage is # needed which does not depend on charging type @@ -59,14 +58,15 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, # in case a constant mileage is provided if isinstance(self.vehicle_types[vt_ct]['mileage'], (int, float)): - consumed_energy = self.vehicle_types[vt_ct]['mileage'] * distance / 1000 delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) return consumed_energy, delta_soc - temp = np.interp(time.hour, - list(self.temperatures_by_hour.keys()), - list(self.temperatures_by_hour.values())) + # If no specific LoL is given, interpolate from demand time series. + if temp is None: + temp = np.interp(time.hour, + list(self.temperatures_by_hour.keys()), + list(self.temperatures_by_hour.values())) # If no specific LoL is given, interpolate from demand time series. if level_of_loading is None: @@ -75,60 +75,39 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, list(self.lol_by_hour.values())) # load consumption csv - consumption_func = self.vehicle_types[vt_ct]["mileage"] + consumption_path = self.vehicle_types[vt_ct]["mileage"] # Consumption_files holds interpol functions of csv files which are called directly vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] # Try to use the interpol function. If it does not exist yet its created in except case. try: - mileage = self.consumption_files[consumption_func](this_vehicle_type=vehicle_type_nr, + mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type_nr, this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, this_speed=mean_speed) except KeyError: # Creating the interpol function from csv file. - # Find the unique values of the grid for each dimension, e.g. unique temperatures - # for which consumption values are present. - df = pd.read_csv(consumption_func, sep=",") - vehicle_type_u = df["vehicle_type"].unique() - incline_u = df["incline"].unique() - temp_u = df["temp"].unique() - lol_u = df["level_of_loading"].unique() - speed_u = df["mean_speed_kmh"].unique() - points = (vehicle_type_u, incline_u, temp_u, lol_u, speed_u) - values = np.zeros((len(vehicle_type_u), len(incline_u), - len(temp_u), len(lol_u), len(speed_u))) - - # Nested loops for creating values in grid - # Each given dependence of consumption, e.g. temperature, speed, level of loading, - # creates a dimension of the value matrix. Eg. 2*Temperatures,4*speeds and - # 3* levels of loading create a 3d matrix, with the shape (2,4,3). While one matrix - # holds all the input values (see "points") another one has to hold all the output - # consumption values. This matrix is filled with this nested for loop (loops in loops) - # Later on the scypy interpn function can get created with the "points" from above and - # the here created value grid. - for i, vt in enumerate(vehicle_type_u): - mask_vt = df["vehicle_type"] == vt - for ii, inc in enumerate(incline_u): - mask_inc = df["incline"] == inc - for iii, temp in enumerate(temp_u): - mask_temp = df["temp"] == temp - for iv, lol in enumerate(lol_u): - mask_lol = df["level_of_loading"] == lol - for v, speed in enumerate(speed_u): - values[i, ii, iii, iv, v] = \ - df[mask_vt * mask_inc * mask_temp * mask_lol * - (df["mean_speed_kmh"] == speed)]["consumption_kwh_per_km"] + df = pd.read_csv(consumption_path, sep=",") + + # Create lookup table and make sure its in the same order as the input point + # which will be the input for the nd lookup + vt_col = df["vehicle_type"] + inc_col = df["incline"] + tmp_col = df["temp"] + lol_col = df["level_of_loading"] + speed_col = df["mean_speed_kmh"] + cons_col = df["consumption_kwh_per_km"] + data_table= list(zip(vt_col, inc_col, tmp_col, lol_col, speed_col,cons_col)) def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this_speed): - point = (this_vehicle_type, this_incline, this_temp, this_lol, this_speed) - return interpn(points, values, point)[0] + input_point = (this_vehicle_type, this_incline, this_temp, this_lol, this_speed) + return nd_interp(input_point, data_table) - self.consumption_files.update({consumption_func: interpol_function}) + self.consumption_files.update({consumption_path: interpol_function}) - mileage = self.consumption_files[consumption_func](this_vehicle_type=vehicle_type_nr, + mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type_nr, this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, @@ -138,3 +117,65 @@ def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this delta_soc = -1 * (consumed_energy / self.vehicle_types[vt_ct]["capacity"]) return consumed_energy, delta_soc + + +def nd_interp(input_values, lookup_table): + # find all unique values in table per column + dim_sets = [set() for _ in input_values] + for row in lookup_table: + for i, v in enumerate(row[:-1]): + dim_sets[i].add(v) + dim_values = [sorted(s) for s in dim_sets] + # find nearest value(s) per column + # go through sorted column values until last less / first greater + lower = [None] * len(input_values) + upper = [None] * len(input_values) + for i, v in enumerate(input_values): + for c in dim_values[i]: + if v >= c: + lower[i] = c + if v <= c and upper[i] is None: + upper[i] = c + break + # find rows in table made up of only lower or upper values + points = [] + for row in lookup_table: + for i, v in enumerate(row[:-1]): + if lower[i] != v and upper[i] != v: + break + else: + points.append(row) + + # interpolate between points that differ only in current dimension + for i, x in enumerate(input_values): + new_points = [] + # find points that differ in just that dimension + for j, p1 in enumerate(points): + for p2 in points[j + 1:]: + for k in range(len(input_values)): + if p1[k] != p2[k] and i != k: + break + else: + # differing row found + x1 = p1[i] + y1 = p1[-1] + x2 = p2[i] + y2 = p2[-1] + dx = x2 - x1 + dy = y2 - y1 + m = dy / dx + n = y1 - m * x1 + y = m * x + n + # generate new point at interpolation + p = [v for v in p1] + p[i] = x + p[-1] = y + new_points.append(p) + # only couple + break + else: + # no matching row (singleton dimension?) + new_points.append(p1) + points = new_points + + return points[0][-1] \ No newline at end of file diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 939ae9b4..93e8cb90 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -64,10 +64,20 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): """ schedule = cls(vehicle_types, stations, **kwargs) + if kwargs.get("station_data_path") is not None: + try: + reader = csv.DictReader(kwargs.get("station_data_path")) + station_data=dict() + for row in reader: + station_data.update({int(row['Station']): float(row['Height_m'])}) + except: + station_data = dict() + with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) for trip in trip_reader: rotation_id = trip['rotation_id'] + trip["station_data"]=station_data if rotation_id not in schedule.rotations.keys(): schedule.rotations.update({ rotation_id: Rotation(id=rotation_id, @@ -287,8 +297,8 @@ def generate_scenario(self, args): "vehicle_events": [] } - # add vehicle events - for vehicle_id in {rot.vehicle_id for rot in self.rotations.values()}: + # add vehicle events. Cast to sorted list for reproducible vehicle assigning + for vehicle_id in sorted({rot.vehicle_id for rot in self.rotations.values()}): v_name = vehicle_id vt = vehicle_id.split("_")[0] ct = vehicle_id.split("_")[1] diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 3df2e67b..a452b970 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,4 +1,5 @@ # imports +import csv import json from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule @@ -56,6 +57,7 @@ def simulate(args): vehicle_types, stations, **vars(args)) + # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption(vehicle_types) # set charging type for all rotations without explicitly specified charging type diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index e8475880..c2bfc4bd 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -1,8 +1,6 @@ -from datetime import datetime - +from datetime import datetime, timedelta class Trip: - def __init__(self, rotation, departure_time, departure_name, arrival_time, arrival_name, distance, **kwargs): self.departure_name = departure_name @@ -11,6 +9,22 @@ def __init__(self, rotation, departure_time, departure_name, self.arrival_name = arrival_name self.distance = float(distance) self.line = kwargs.get('line', None) + self.temperature = kwargs.get('temperature', None) + height_diff = kwargs.get("height_difference", None) + if height_diff is None: + station_data= kwargs.get("station_data", dict()) + try: + height_diff = station_data[self.arrival_name]["height"]\ + -station_data[self.departure_name]["height"] + except KeyError: + height_diff=0 + self.height_diff = height_diff + self.level_of_loading = None + # Meanspeed in km/h from distance and travel time or from initalization + # Travel time is at least 1 min + mean_speed = kwargs.get("mean_speed", (self.distance /1000)/\ + max(1/60,((self.arrival_time- self.departure_time)/timedelta(hours=1)))) + self.mean_speed = mean_speed # Attention: Circular reference! # While a rotation carries a references to this trip, this trip @@ -28,12 +42,18 @@ def calculate_consumption(self): :return: Consumption of trip [kWh] :rtype: float """ + + try: self.consumption, self. delta_soc = \ Trip.consumption.calculate_consumption(self.arrival_time, self.distance, self.rotation.vehicle_type, - self.rotation.charging_type) + self.rotation.charging_type, + temp=self.temperature, + height_diff=self.height_diff, + level_of_loading=self.level_of_loading, + mean_speed=self.mean_speed) except AttributeError: print("""To calculate consumption, a consumption object needs to be constructed and linked to Trip class.""") From 3d978cfcd173ab246a83d08714b53d0f565792ba Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 14 Oct 2022 15:32:22 +0200 Subject: [PATCH 261/802] Make flake8 conform --- ebus_toolbox/consumption.py | 7 +++---- ebus_toolbox/schedule.py | 14 +++++++------- ebus_toolbox/simulate.py | 1 - ebus_toolbox/trip.py | 17 +++++++++-------- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 89fa700c..327f36ef 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,7 +1,6 @@ import numpy as np import csv import pandas as pd -from scipy.interpolate import interpn class Consumption: @@ -24,7 +23,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: self.consumption_files = {} self.vehicle_types = vehicle_types - def calculate_consumption(self, time, distance, vehicle_type, charging_type,temp=None, + def calculate_consumption(self, time, distance, vehicle_type, charging_type, temp=None, height_diff=0, level_of_loading=None, mean_speed=18): """ Calculates consumed amount of energy for a given distance. @@ -99,7 +98,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type,temp lol_col = df["level_of_loading"] speed_col = df["mean_speed_kmh"] cons_col = df["consumption_kwh_per_km"] - data_table= list(zip(vt_col, inc_col, tmp_col, lol_col, speed_col,cons_col)) + data_table = list(zip(vt_col, inc_col, tmp_col, lol_col, speed_col, cons_col)) def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this_speed): input_point = (this_vehicle_type, this_incline, this_temp, this_lol, this_speed) @@ -178,4 +177,4 @@ def nd_interp(input_values, lookup_table): new_points.append(p1) points = new_points - return points[0][-1] \ No newline at end of file + return points[0][-1] diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 93e8cb90..d6fa44aa 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -67,17 +67,17 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): if kwargs.get("station_data_path") is not None: try: reader = csv.DictReader(kwargs.get("station_data_path")) - station_data=dict() + station_data = dict() for row in reader: station_data.update({int(row['Station']): float(row['Height_m'])}) - except: + except FileNotFoundError or KeyError: station_data = dict() with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) for trip in trip_reader: rotation_id = trip['rotation_id'] - trip["station_data"]=station_data + trip["station_data"] = station_data if rotation_id not in schedule.rotations.keys(): schedule.rotations.update({ rotation_id: Rotation(id=rotation_id, @@ -308,7 +308,7 @@ def generate_scenario(self, args): # sort events for their departure time, so that the matching departure time of an # arrival event can be read out of the next element in vid_list vehicle_rotations = {k: v for k, v in sorted( - vehicle_rotations.items(), key=lambda x: x[1].departure_time)} + vehicle_rotations.items(), key=lambda x: x[1].departure_time)} rotation_ids = list(vehicle_rotations.keys()) # define start conditions @@ -326,7 +326,7 @@ def generate_scenario(self, args): # initial departure event from starting depot events["vehicle_events"].append({ "signal_time": (departure + datetime.timedelta( - minutes=-args.signal_time_dif)).isoformat(), + minutes=-args.signal_time_dif)).isoformat(), "start_time": departure.isoformat(), "vehicle_id": v_name, "event_type": "departure", @@ -363,7 +363,7 @@ def generate_scenario(self, args): # time. It may resemble things like delays and/or docking procedures # use buffer time from electrified stations JSON or in case none is # provided use global default from config file - buffer_time = self.stations.get(trip.arrival_name, {})\ + buffer_time = self.stations.get(trip.arrival_name, {}) \ .get('buffer_time', args.default_buffer_time_opps) # distinct buffer times depending on time of day can be provided @@ -470,7 +470,7 @@ def generate_scenario(self, args): if departure_event_in_input: events["vehicle_events"].append({ "signal_time": (departure + datetime.timedelta( - minutes=-args.signal_time_dif)).isoformat(), + minutes=-args.signal_time_dif)).isoformat(), "start_time": departure.isoformat(), "vehicle_id": v_name, "event_type": "departure", diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index a452b970..8978174f 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,5 +1,4 @@ # imports -import csv import json from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index c2bfc4bd..9317407e 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -1,5 +1,6 @@ from datetime import datetime, timedelta + class Trip: def __init__(self, rotation, departure_time, departure_name, arrival_time, arrival_name, distance, **kwargs): @@ -12,18 +13,19 @@ def __init__(self, rotation, departure_time, departure_name, self.temperature = kwargs.get('temperature', None) height_diff = kwargs.get("height_difference", None) if height_diff is None: - station_data= kwargs.get("station_data", dict()) + station_data = kwargs.get("station_data", dict()) try: - height_diff = station_data[self.arrival_name]["height"]\ - -station_data[self.departure_name]["height"] + height_diff = station_data[self.arrival_name]["height"] \ + - station_data[self.departure_name]["height"] except KeyError: - height_diff=0 + height_diff = 0 self.height_diff = height_diff self.level_of_loading = None # Meanspeed in km/h from distance and travel time or from initalization # Travel time is at least 1 min - mean_speed = kwargs.get("mean_speed", (self.distance /1000)/\ - max(1/60,((self.arrival_time- self.departure_time)/timedelta(hours=1)))) + mean_speed = kwargs.get("mean_speed", (self.distance / 1000) / + max(1 / 60, ((self.arrival_time - self.departure_time) / timedelta( + hours=1)))) self.mean_speed = mean_speed # Attention: Circular reference! @@ -43,9 +45,8 @@ def calculate_consumption(self): :rtype: float """ - try: - self.consumption, self. delta_soc = \ + self.consumption, self.delta_soc = \ Trip.consumption.calculate_consumption(self.arrival_time, self.distance, self.rotation.vehicle_type, From 4ecfeb91afb32c0e0ba471a9ca04f12a2d3db937 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 14 Oct 2022 15:37:20 +0200 Subject: [PATCH 262/802] Fix Typo --- ebus_toolbox/trip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 9317407e..921bac3e 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -21,7 +21,7 @@ def __init__(self, rotation, departure_time, departure_name, height_diff = 0 self.height_diff = height_diff self.level_of_loading = None - # Meanspeed in km/h from distance and travel time or from initalization + # Meandered in km/h from distance and travel time or from initialization # Travel time is at least 1 min mean_speed = kwargs.get("mean_speed", (self.distance / 1000) / max(1 / 60, ((self.arrival_time - self.departure_time) / timedelta( From 888a7ca9e3cebd3def649c45f486114e6843d4c4 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 17 Oct 2022 09:09:37 +0200 Subject: [PATCH 263/802] Fix small flake8 stuff --- ebus_toolbox/consumption.py | 8 ++++---- ebus_toolbox/schedule.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 800b3ae4..6679a386 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -2,6 +2,7 @@ import csv import pandas as pd + class Consumption: def __init__(self, vehicle_types, **kwargs) -> None: # load temperature of the day, now dummy winter day @@ -46,7 +47,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :rtype: (float, float) """ - assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ + assert self.vehicle_types.get(vehicle_type, {}).get(charging_type), \ f"Combination of vehicle type {vehicle_type} and {charging_type} not defined." vehicle_info = self.vehicle_types[vehicle_type][charging_type] @@ -70,7 +71,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem list(self.lol_by_hour.values())) # load consumption csv - consumption_path = vehicle_info["mileage"] + consumption_path = vehicle_info["mileage"] # Consumption_files holds interpol functions of csv files which are called directly vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] @@ -108,12 +109,11 @@ def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this this_speed=mean_speed) consumed_energy = mileage * distance / 1000 # kWh - delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) + delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) return consumed_energy, delta_soc - def nd_interp(input_values, lookup_table): # find all unique values in table per column dim_sets = [set() for _ in input_values] diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c4ebab7b..32bc10ed 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -71,7 +71,8 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): reader = csv.DictReader(f) station_data = dict() for row in reader: - station_data.update({str(row['Station']): {"Height_m":float(row['Height_m'])}}) + station_data.update({str(row['Station']): + {"Height_m": float(row['Height_m'])}}) except FileNotFoundError or KeyError: station_data = dict() @@ -317,7 +318,6 @@ def generate_scenario(self, args): stop_simulation = min( stop_simulation, start_simulation + datetime.timedelta(days=args.days)) - # add vehicle events for vehicle_id in sorted({rot.vehicle_id for rot in self.rotations.values()}): # filter all rides for that bus @@ -326,7 +326,8 @@ def generate_scenario(self, args): # get sorted list of all trips for current vehicle # sort rotations by time leveraging the fact that the # list of trips per rotation is always sorted - vehicle_rotations = {k: v for k, v in sorted(vehicle_rotations.items(), key=lambda x: x[1].departure_time)} + vehicle_rotations = {k: v for k, v in sorted(vehicle_rotations.items(), + key=lambda x: x[1].departure_time)} vehicle_trips = [t for rot in vehicle_rotations.values() for t in rot.trips] for i, trip in enumerate(vehicle_trips): @@ -343,7 +344,6 @@ def generate_scenario(self, args): # last trip next_departure_time = trip.arrival_time + datetime.timedelta(hours=8) - # get current station if electrified connected_charging_station = None desired_soc = 0 From 0ffd2f38b00a76200461563bba47afab2fbb6f7b Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer <49757031+jakobgemassmer@users.noreply.github.com> Date: Mon, 17 Oct 2022 13:18:51 +0200 Subject: [PATCH 264/802] Update ebus_toolbox.cfg Fixed comment for "min_charging_time" --- data/examples/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 59bd486d..603dc32f 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -45,7 +45,7 @@ desired_soc = 1 # Preferred charging type. Options: depb, oppb (default: oppb) preferred_charging_type = "depb" -# min charging time at opp station [minutes] (default: 2) +# min charging time at depots and opp stations [minutes] (default: 2) min_charging_time = 2 # buffer time at opp station if no specific buffer time is provided From 20ac2838ac2145daf91bdaa83f2dc264f0803e1a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 18 Oct 2022 11:02:59 +0200 Subject: [PATCH 265/802] Add temp to docstring --- ebus_toolbox/consumption.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 6679a386..32987159 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -26,6 +26,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem height_diff=0, level_of_loading=None, mean_speed=18): """ Calculates consumed amount of energy for a given distance. + :param time: The date and time at which the trip ends :type time: datetime.datetime :param distance: Distance travelled [m] @@ -35,6 +36,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :param charging_type: Charging type for the trip. Consumption differs between distinct types. :type charging_type: str + :param temp: Temperature outside of the bus in °Celsius + :type temp: float :param height_diff: difference in height between stations in meters- :type height_diff: float :param level_of_loading: Level of loading of the bus between empty (=0) and From e8b6ca07275ed40945f4381780197f4ad9e60af6 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 18 Oct 2022 11:18:36 +0200 Subject: [PATCH 266/802] Added missing station data init --- ebus_toolbox/schedule.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 32bc10ed..130aaf2c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -65,6 +65,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): """ schedule = cls(vehicle_types, stations, **kwargs) + station_data = dict() if kwargs.get("station_data_path") is not None: try: with open(kwargs.get("station_data_path"), "r") as f: @@ -74,12 +75,17 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): station_data.update({str(row['Station']): {"Height_m": float(row['Height_m'])}}) except FileNotFoundError or KeyError: - station_data = dict() + print("Warning: external csv file '{}' not found or not named properly" + "(Needed column names are 'Station' and 'Height_m')". + format(kwargs.get("station_data_path"))) + with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) for trip in trip_reader: rotation_id = trip['rotation_id'] + # Trip gets reference to station data and calculates height diff during Trip + # initialization. Could also get the height difference from here on trip["station_data"] = station_data if rotation_id not in schedule.rotations.keys(): schedule.rotations.update({ From e2e90378378227c27798f05b71204190075d051e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 18 Oct 2022 11:33:20 +0200 Subject: [PATCH 267/802] Add station data init --- ebus_toolbox/schedule.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 130aaf2c..c6a6ea23 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -66,9 +66,10 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule = cls(vehicle_types, stations, **kwargs) station_data = dict() - if kwargs.get("station_data_path") is not None: + station_path = kwargs.get("station_data_path") + if station_path is not None: try: - with open(kwargs.get("station_data_path"), "r") as f: + with open(str(station_path), "r") as f: reader = csv.DictReader(f) station_data = dict() for row in reader: @@ -77,7 +78,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): except FileNotFoundError or KeyError: print("Warning: external csv file '{}' not found or not named properly" "(Needed column names are 'Station' and 'Height_m')". - format(kwargs.get("station_data_path"))) + format(station_path)) with open(path_to_csv, 'r') as trips_file: From f89f5a938d8830fdc2f46fc8875fc896322b571c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 18 Oct 2022 11:36:12 +0200 Subject: [PATCH 268/802] Delete one empty line for flake8 --- ebus_toolbox/schedule.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c6a6ea23..7e6990bc 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -80,7 +80,6 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): "(Needed column names are 'Station' and 'Height_m')". format(station_path)) - with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) for trip in trip_reader: From 311d6f8b2e2f5444028f2746196db493cc7fa855 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 19 Oct 2022 12:00:08 +0200 Subject: [PATCH 269/802] optimization: return original and optimized scenario --- ebus_toolbox/optimization.py | 31 ++++++++++++++++++++++--------- ebus_toolbox/schedule.py | 6 ++++-- ebus_toolbox/simulate.py | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 257b71f5..d42fe8ab 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -13,16 +13,17 @@ def service_optimization(schedule, args): :type schedule: ebus_toolbox.Schedule :param args: Command line arguments :type args: argparse.Namespace - :return: Random scenario - :rtype: spice_ev.src.scenario + :return: original and most optimized scenario (highest electrification rate) + :rtype: dict of tuple of schedule and spice_ev.src.scenario """ common_stations = schedule.get_common_stations(only_opps=True) # initial run scenario = schedule.run(args) + original = (deepcopy(schedule), deepcopy(scenario)) + optimal = (None, None) # single out negative rotations. Try to run these with common non-negative rotations - original_rotations = deepcopy(schedule.rotations) negative_rotations = schedule.get_negative_rotations(scenario) print(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") @@ -48,16 +49,22 @@ def service_optimization(schedule, args): dependent_station.update({r2: t2 for r2, t2 in common_stations[r].items() if t2 <= t}) negative_sets[rot_key] = s + # remove negative rotation from initial schedule + del schedule.rotations[rot_key] - # run singled-out rotations + # run scenario with non-negative rotations only + scenario = schedule.run(args) + optimal = (deepcopy(schedule), deepcopy(scenario)) + + # run singled-out negative rotations ignored = [] for i, (rot, s) in enumerate(negative_sets.items()): - schedule.rotations = {r: original_rotations[r] for r in s} + schedule.rotations = {r: original[0].rotations[r] for r in s} print(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") scenario = schedule.run(args) if scenario.negative_soc_tracker: # still fail: try just the negative rotation - schedule.rotations = {rot: original_rotations[rot]} + schedule.rotations = {rot: original[0].rotations[rot]} scenario = schedule.run(args) if scenario.negative_soc_tracker: # no hope, this just won't work @@ -76,7 +83,7 @@ def service_optimization(schedule, args): print(f"{len(possible)} combinations remain") r1, r2 = possible.pop() combined = negative_sets[r1].union(negative_sets[r2]) - schedule.rotations = {r: original_rotations[r] for r in combined} + schedule.rotations = {r: original[0].rotations[r] for r in combined} scenario = schedule.run(args) if not scenario.negative_soc_tracker: # compatible (don't interfere): keep union, remove r2 @@ -84,7 +91,13 @@ def service_optimization(schedule, args): # simplified. What about triangle? (r1+r2, r1+r3, r2!+r3)? possible = [t for t in possible if r2 not in t] + # save scenario with highest electrification rate + if len(scenario[0].rotations) > len(optimal[0].rotations): + optimal = (deepcopy(schedule), deepcopy(scenario)) + print(negative_sets) - # TODO: return sensible scenario (and negative_sets?), adapt docstring afterwards - return scenario + return { + "original": original, + "optimized": optimal, + } diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ff171f31..8a62bfbc 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -269,8 +269,10 @@ def get_negative_rotations(self, scenario): for t_str in times: time = datetime.datetime.fromisoformat(t_str) rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} - negative_rotations.add([k for k, v in rides.items() - if time >= v.departure_time and time <= v.arrival_time][0]) + if rides: + negative_rotations.add([k for k, v in rides.items() + if time >= v.departure_time + and time <= v.arrival_time][0]) return list(negative_rotations) def generate_scenario(self, args): diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index ae316d54..c9eed5ea 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,7 +62,7 @@ def simulate(args): # run the mode specified in config if args.mode == 'service_optimization': - scenario = optimization.service_optimization(schedule, args) + schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] elif args.mode == "sim": # DEFAULT if mode argument is not specified by user # Scenario simulated once From 20e257822b4afa2ed85b731e4589ba0d9090d5bc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 19 Oct 2022 16:01:02 +0200 Subject: [PATCH 270/802] Add constant out of bounds values for nd interpol --- ebus_toolbox/consumption.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 32987159..407e6722 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -129,10 +129,13 @@ def nd_interp(input_values, lookup_table): lower = [None] * len(input_values) upper = [None] * len(input_values) for i, v in enumerate(input_values): + # initialize for out of bound values -> Constant value + lower[i] = dim_values[i][0] + upper[i] = dim_values[i][-1] for c in dim_values[i]: if v >= c: lower[i] = c - if v <= c and upper[i] is None: + if v <= c: upper[i] = c break # find rows in table made up of only lower or upper values From 3149983dcc323e279ca8ea2fe498c9b18b97f97c Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 20 Oct 2022 13:37:57 +0200 Subject: [PATCH 271/802] fix get_negative_rotations --- ebus_toolbox/schedule.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8a62bfbc..ceb49043 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -268,11 +268,21 @@ def get_negative_rotations(self, scenario): for v_id, times in negative_vehicles.items(): for t_str in times: time = datetime.datetime.fromisoformat(t_str) + # filter rotations by vehicle ID rides = {k: v for k, v in self.rotations.items() if v.vehicle_id == v_id} - if rides: - negative_rotations.add([k for k, v in rides.items() - if time >= v.departure_time - and time <= v.arrival_time][0]) + # sort rotations by departure time + rides = sorted(rides.items(), key=lambda r: r[1].departure_time) + # find rotation before negative arrival + last_rot_id = None + for k, v in rides: + if v.departure_time >= time: + # departure after negative arrival found: stop search + break + last_rot_id = k + # end of iteration (next departure found / end of list): add last rotation ID + if last_rot_id is not None: + negative_rotations.add(last_rot_id) + return list(negative_rotations) def generate_scenario(self, args): From 43fb2c5b179f58e807a459ddfa51b5acd0f84bfd Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 20 Oct 2022 13:44:36 +0200 Subject: [PATCH 272/802] extracted depb->oppb change from service optimization --- ebus_toolbox/optimization.py | 42 ++++++++++++++++++------------------ ebus_toolbox/simulate.py | 15 ++++++++++++- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index d42fe8ab..ecee3d9f 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -30,27 +30,27 @@ def service_optimization(schedule, args): negative_sets = {} for rot_key in negative_rotations: rotation = schedule.rotations[rot_key] - if rotation.charging_type == "depb": - schedule.set_charging_type("oppb", args, [rot_key]) - else: - # oppb: build non-interfering sets of negative rotations - # (these include the dependent non-negative rotations) - s = {rot_key} - vid = rotation.vehicle_id - last_neg_soc_time = scenario.negative_soc_tracker[vid][-1] - last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) - dependent_station = {r: t for r, t in common_stations[rot_key].items() - if t <= last_neg_soc_time} - while dependent_station: - r, t = dependent_station.popitem() - if r not in negative_rotations: - s.add(r) - # add dependencies of r - dependent_station.update({r2: t2 for r2, t2 - in common_stations[r].items() if t2 <= t}) - negative_sets[rot_key] = s - # remove negative rotation from initial schedule - del schedule.rotations[rot_key] + if rotation.charging_type != "oppb": + raise Exception(f"Rotation {rot_key} should be optimized, " + "but is of type {rotation.charging_type}.") + # oppb: build non-interfering sets of negative rotations + # (these include the dependent non-negative rotations) + s = {rot_key} + vid = rotation.vehicle_id + last_neg_soc_time = scenario.negative_soc_tracker[vid][-1] + last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) + dependent_station = {r: t for r, t in common_stations[rot_key].items() + if t <= last_neg_soc_time} + while dependent_station: + r, t = dependent_station.popitem() + if r not in negative_rotations: + s.add(r) + # add dependencies of r + dependent_station.update({r2: t2 for r2, t2 + in common_stations[r].items() if t2 <= t}) + negative_sets[rot_key] = s + # remove negative rotation from initial schedule + del schedule.rotations[rot_key] # run scenario with non-negative rotations only scenario = schedule.run(args) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index c9eed5ea..8587445d 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -63,10 +63,23 @@ def simulate(args): # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] - elif args.mode == "sim": + elif args.mode in ["sim", "depb_optimization"]: # DEFAULT if mode argument is not specified by user # Scenario simulated once scenario = schedule.run(args) + if args.mode == "depb_optimization": + # simple optimization: change charging type from depot to opportunity, simulate again + neg_rot = schedule.get_negative_rotations(scenario) + # only depot rotations relevant + neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == "depb"] + if neg_rot: + print("Changing charging type from depb to oppb for rotations " + ', '.join(neg_rot)) + schedule.set_charging_type("oppb", neg_rot) + # simulate again + scenario = schedule.run(args) + neg_rot = schedule.get_negative_rotations(scenario) + if neg_rot: + print(f"Rotations {', '.join(neg_rot)} remain negative.") if args.cost_params is not None: # Calculate Costs of Iteration From 76ec04fe05081c5cbe8a9dd69783ba6f32ebe461 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Oct 2022 09:08:14 +0200 Subject: [PATCH 273/802] make flake8 happy: add raises to docstring --- ebus_toolbox/optimization.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index ecee3d9f..24e83f59 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -15,6 +15,7 @@ def service_optimization(schedule, args): :type args: argparse.Namespace :return: original and most optimized scenario (highest electrification rate) :rtype: dict of tuple of schedule and spice_ev.src.scenario + :raises: Exception if the charging type of a rotation with negative SoC is not oppb """ common_stations = schedule.get_common_stations(only_opps=True) From 0b3dca3dea7991310624517e8dfa5f51156fb577 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Oct 2022 09:20:31 +0200 Subject: [PATCH 274/802] make flake8 happy: add raises to docstring --- ebus_toolbox/optimization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 24e83f59..00b4182c 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -15,7 +15,7 @@ def service_optimization(schedule, args): :type args: argparse.Namespace :return: original and most optimized scenario (highest electrification rate) :rtype: dict of tuple of schedule and spice_ev.src.scenario - :raises: Exception if the charging type of a rotation with negative SoC is not oppb + :raises Exception: if the charging type of a rotation with negative SoC is not oppb """ common_stations = schedule.get_common_stations(only_opps=True) From 68b5a568a5d6242efc81f91d56c233a2e1973f72 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Oct 2022 12:53:28 +0200 Subject: [PATCH 275/802] change name of new mode to neg_depb_to_oppb --- data/examples/ebus_toolbox.cfg | 3 ++- ebus_toolbox/simulate.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 603dc32f..90482185 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -22,8 +22,9 @@ cost_params = "./data/examples/cost_params.json" # set random seed (for always random: set seed = null) seed = 1 -# Specify what you want to do. Options: sim, service_optimization. Default: sim +# Specify what you want to do. Options: sim, neg_depb_to_oppb, service_optimization. Default: sim # sim runs a single simulation with the given inputs. +# neg_depb_to_oppb changes negative depb-rotations to oppb charging. # service optimization finds the largest set of electrified rotations. #mode = sim diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 8587445d..d3ad1597 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -63,11 +63,11 @@ def simulate(args): # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] - elif args.mode in ["sim", "depb_optimization"]: + elif args.mode in ["sim", "neg_depb_to_oppb"]: # DEFAULT if mode argument is not specified by user # Scenario simulated once scenario = schedule.run(args) - if args.mode == "depb_optimization": + if args.mode == "neg_depb_to_oppb": # simple optimization: change charging type from depot to opportunity, simulate again neg_rot = schedule.get_negative_rotations(scenario) # only depot rotations relevant From 6ea73e2382f51290bc704e2ee57ac544ddf403ce Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Oct 2022 14:45:49 +0200 Subject: [PATCH 276/802] fix service_opt if all rotations are negative --- ebus_toolbox/optimization.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 00b4182c..6043ae09 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -54,8 +54,9 @@ def service_optimization(schedule, args): del schedule.rotations[rot_key] # run scenario with non-negative rotations only - scenario = schedule.run(args) - optimal = (deepcopy(schedule), deepcopy(scenario)) + if schedule.rotations: + scenario = schedule.run(args) + optimal = (deepcopy(schedule), deepcopy(scenario)) # run singled-out negative rotations ignored = [] @@ -93,7 +94,7 @@ def service_optimization(schedule, args): possible = [t for t in possible if r2 not in t] # save scenario with highest electrification rate - if len(scenario[0].rotations) > len(optimal[0].rotations): + if optimal is None or len(scenario[0].rotations) > len(optimal[0].rotations): optimal = (deepcopy(schedule), deepcopy(scenario)) print(negative_sets) From 8a7c14a775754a63772c876cc6f53b98e9246764 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Oct 2022 14:50:52 +0200 Subject: [PATCH 277/802] implement #62: chain multiple modes --- data/examples/ebus_toolbox.cfg | 11 ++++-- ebus_toolbox/__main__.py | 12 ++++-- ebus_toolbox/report.py | 6 +-- ebus_toolbox/simulate.py | 72 +++++++++++++++++++++------------- 4 files changed, 63 insertions(+), 38 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 90482185..669c079d 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -22,11 +22,16 @@ cost_params = "./data/examples/cost_params.json" # set random seed (for always random: set seed = null) seed = 1 -# Specify what you want to do. Options: sim, neg_depb_to_oppb, service_optimization. Default: sim +# Specify what you want to do. Options: sim, neg_depb_to_oppb, service_optimization, report, cost. +# Multiple modes can be chained. +# Default: sim # sim runs a single simulation with the given inputs. # neg_depb_to_oppb changes negative depb-rotations to oppb charging. -# service optimization finds the largest set of electrified rotations. -#mode = sim +# service_optimization finds the largest set of electrified rotations. +# report generates simulation output files. +# cost calculates scenario costs. +mode = ["sim"] +#mode = ["sim", "neg_depb_to_oppb", "service_optimization", "cost", "report"] # set length of timestep in minutes (default: 15 minute intervals) interval = 1 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 702a14ee..6c1a1783 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -9,10 +9,14 @@ simulation program for electric bus fleets.') parser.add_argument('--input-schedule', nargs='?', help='Path to CSV file containing all trips of schdedule to be analyzed.') - parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], - help='Specify what you want to do. Choose one from {sim, \ - service_optimization}. sim runs a single simulation with the given inputs. \ - service optimization finds the largest set of electrified rotations.') + parser.add_argument('--mode', default='[sim]', type=list, + help='Specify what you want to do. Choose one or more from \ + {sim, neg_depb_to_oppb, service_optimization, report, cost}. \ + sim runs a single simulation with the given inputs. \ + neg_depb_to_oppb changes charging type of negative depb rotations. \ + service optimization finds the largest set of electrified rotations. \ + report generates simulation output files. \ + cost calculates scenario costs.') parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') parser.add_argument('--preferred-charging-type', '-pct', default='depb', diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 18df5dc9..1d3338a7 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -5,7 +5,7 @@ import warnings -def generate(schedule, scenario, args): +def generate(schedule, scenario, args, prefix=""): rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) @@ -65,14 +65,14 @@ def generate(schedule, scenario, args): "Omit parameter to simulate entire schedule.", stacklevel=100) - with open(args.output_directory / "rotation_socs.csv", "w+", newline='') as f: + with open(args.output_directory / (prefix + "rotation_socs.csv"), "w+", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(("time",) + tuple(rotation_socs.keys())) for i, row in enumerate(zip(*rotation_socs.values())): t = sim_start_time + i * scenario.interval csv_writer.writerow((t,) + row) - with open(args.output_directory / "rotation_summary.csv", "w+", newline='') as f: + with open(args.output_directory / (prefix + "rotation_summary.csv"), "w+", newline='') as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index d3ad1597..2b106a97 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -59,35 +59,51 @@ def simulate(args): vehicle_types, stations, **vars(args)) + scenario = None - # run the mode specified in config - if args.mode == 'service_optimization': - schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] - elif args.mode in ["sim", "neg_depb_to_oppb"]: - # DEFAULT if mode argument is not specified by user - # Scenario simulated once - scenario = schedule.run(args) - if args.mode == "neg_depb_to_oppb": - # simple optimization: change charging type from depot to opportunity, simulate again - neg_rot = schedule.get_negative_rotations(scenario) - # only depot rotations relevant - neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == "depb"] - if neg_rot: - print("Changing charging type from depb to oppb for rotations " + ', '.join(neg_rot)) - schedule.set_charging_type("oppb", neg_rot) - # simulate again + # run the mode(s) specified in config + if type(args.mode) != list: + # backwards compatibility: run single mode + args.mode = [args.mode] + + for i, mode in enumerate(args.mode): + if mode == "sim": + # scenario simulated once + # default if mode argument is not specified by user scenario = schedule.run(args) + elif mode == "neg_depb_to_oppb": + # simple optimization + # change charging type of negative depb rotations from depot to opportunity + if scenario is None: + # not simulated yet + scenario = schedule.run(args) neg_rot = schedule.get_negative_rotations(scenario) + # only depot rotations relevant + neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == "depb"] if neg_rot: - print(f"Rotations {', '.join(neg_rot)} remain negative.") - - if args.cost_params is not None: - # Calculate Costs of Iteration - costs = calculate_costs(cost_params, schedule) - opex_energy_annual = 0 # ToDo: Import annual energy costs from SpiceEV - cost_invest = costs["c_invest"] - cost_annual = costs["c_invest_annual"] + costs["c_maintenance_annual"] + opex_energy_annual - print(f"Investment cost: {cost_invest} €. Total annual cost: {cost_annual} €.") - - # create report - report.generate(schedule, scenario, args) + print("Changing charging type to oppb for rotations " + ', '.join(neg_rot)) + schedule.set_charging_type("oppb", neg_rot) + # simulate again + scenario = schedule.run(args) + neg_rot = schedule.get_negative_rotations(scenario) + if neg_rot: + print(f"Rotations {', '.join(neg_rot)} remain negative.") + elif mode == 'service_optimization': + # find largest set of rotations that produce no negative SoC + schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] + if scenario is None: + print("*"*49 + "\nNo optimization possible (all rotations negative)") + elif mode == 'report': + # create report based on all previous modes + assert scenario is not None, "Can't report without simulation" + report_name = '__'.join([m for m in args.mode[:i] if m not in ["report", "cost"]]) + report.generate(schedule, scenario, args, prefix=report_name + '_') + elif mode == 'cost' and args.cost_params is not None: + # calculate costs of iteration + costs = calculate_costs(cost_params, schedule) + opex_energy_annual = 0 # ToDo: Import annual energy costs from SpiceEV + cost_invest = costs["c_invest"] + cost_annual = (opex_energy_annual + + costs["c_invest_annual"] + + costs["c_maintenance_annual"]) + print(f"Investment cost: {cost_invest} €. Total annual cost: {cost_annual} €.") From 66d2419edc2c0a635829bfd112e225e102f5795c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:14:48 +0200 Subject: [PATCH 278/802] Add delimter finder for csv. Change Station data to new format of all_stations --- data/examples/all_stations.csv | 183 +++++++++++++++++++++++++++++++++ data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/schedule.py | 17 ++- ebus_toolbox/trip.py | 8 +- ebus_toolbox/util.py | 24 +++++ 5 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 data/examples/all_stations.csv diff --git a/data/examples/all_stations.csv b/data/examples/all_stations.csv new file mode 100644 index 00000000..a2f1b1c1 --- /dev/null +++ b/data/examples/all_stations.csv @@ -0,0 +1,183 @@ +Endhaltestelle;ID;geo_lat;geo_long;elevation;pv_area;pv_type;pv_kwp +Bensheim Bahnhof/ ZOB;;;;0;;; +Heppenheim Bahnhof;;;;0;;; +Weinheim Hauptbahnhof;;;;0;;; +Grasellenbach Im Erzfeld;;;;0;;; +Viernheim Bahnhof;;;;0;;; +Wald-Michelbach ZOB;;;;0;;; +Wald-Michelbach Alter Bahnhof;;;;0;;; +Bensheim Betriebshof VGG W-v.S.Str.;;;;0;;; +Lindenfels Poststraße;;;;0;;; +Nieder-Liebersbach Rathaus;;;;0;;; +Fürth Bahnhof;;;;0;;; +Hirschhorn Grundschule;;;;0;;; +Alsbach Am Hinkelstein;;;;0;;; +Bürstadt Lampertheimer Straße;;;;0;;; +Heppenheim Vogelsbergstraße;;;;0;;; +Rimbach Schulzentrum;;;;0;;; +Mörlenbach Schulzentrum;;;;0;;; +Viernheim Betriebshof Winkler;;;;0;;; +Heppenheim Graben;;;;0;;; +Gadernheim Schulzentrum;;;;0;;; +Winterkasten Eleonoren-Klinik;;;;0;;; +Wald-Michelbach Schulzentrum;;;;0;;; +Bensheim Betriebshof VGG R-Bosch Str;;;;0;;; +Wahlen Grundschule;;;;0;;; +Worms Hauptbahnhof;;;;0;;; +Gronau Am Mühlkandel;;;;0;;; +Fürth Grundschule;;;;0;;; +Fürth Gesamtschule;;;;0;;; +Heppenheim Gießener Straße;;;;0;;; +Bensheim H.-Metzendorf-Schule;;;;0;;; +Gadernheim Jarnacplatz;;;;0;;; +Birkenau Bahnhof;;;;0;;; +Auerbach Schillerschule;;;;0;;; +Heppenheim Kreiskrankenhaus;;;;0;;; +Bensheim Geschw.-Scholl-Schule;;;;0;;; +Geisenbach Ort;;;;0;;; +Ober-Abtsteinach Mackenheimer Straße;;;;0;;; +Mörlenbach Bahnhof;;;;0;;; +Heppenheim Starkenburg-Gymnasium;;;;0;;; +Viernheim Heppenheimer Straße;;;;0;;; +Bensheim G.-Scholl-Schule;;;;0;;; +Rimbach Kirche;;;;0;;; +Fehlheim Mühlgrabenstraße;;;;0;;; +Zwingenberg Schule;;;;0;;; +Erbach Post;;;;0;;; +Reichelsheim Schwimmbad;;;;0;;; +Bensheim G.-Sch.-S./Berl.Ring;;;;0;;; +Mörlenbach Grundschule;;;;0;;; +Unter-Abtsteinach Schule;;;;0;;; +Hornbach Herrenwiese;;;;0;;; +Kirschhausen Schule;;;;0;;; +Lindenfels Carl-Orff-Schule;;;;0;;; +Lorsch Wingertsbergschule;;;;0;;; +Mitlechtern Mitte;;;;0;;; +Ober-Laudenbach Finstertal;;;;0;;; +Reichenbach Schule;;;;0;;; +Gorxheim Gorxenbuckel;;;;0;;; +Hirschhorn Heinrich-Weis-Straße;;;;0;;; +Wattenheim Ort;;;;0;;; +Zotzenbach Schule;;;;0;;; +Bensheim Karl-Kübel-Schule;;;;0;;; +Gadern Dorfplatz;;;;0;;; +Vöckelsbach Feuerwehrhaus;;;;0;;; +Birkenau Grundschule;;;;0;;; +Reisen Bahnhof;;;;0;;; +Lorsch Siemensschule;;;;0;;; +Lampertheim Bahnhof;;;;0;;; +Balkhausen Bürgerhalle;;;;0;;; +Erbach Gesundheiszentrum;;;;0;;; +Staffel;;;;0;;; +Einhausen Almenstraße;;;;0;;; +Viernheim Schulzentrum;;;;0;;; +Birkenau Langenbergschule;;;;0;;; +Neunkirchen Heilquelle;;;;0;;; +Hirschhorn Bahnhof;;;;0;;; +Birkenau Schloss;;;;0;;; +Bürstadt Bahnhof;;;;0;;; +Ober-Hambach Odenwaldschule;;;;0;;; +Erlenbach Schule;;;;0;;; +Trösel Bergweg;;;;0;;; +Bonsweiher Waldparkplatz;;;;0;;; +Oberflockenbach Rose;;;;0;;; +Rimbach Bahnhof;;;;0;;; +Lampertheim Schulzent. West;;;;0;;; +Krumbach Rotenbergstraße;;;;0;;; +Bensheim Kirchbergschule;;;;0;;; +Kreidach Unterdorf;;;;0;;; +Siedelsbrunn Tannenberg/Morgenstern;;;;0;;; +Hähnlein Engpass;;;;0;;; +Unter-Abtsteinach Brücke;;;;0;;; +Bensheim Bensheimer Werkstätten;;;;0;;; +Viernheim Bürgerhaus;;;;0;;; +Gadernheim Linde;;;;0;;; +Bürstadt Erich-Kästner-Schule;;;;0;;; +Unter-Schönmattenwag Kreuz;;;;0;;; +Unter-Schönmattenwag Kirche;;;;0;;; +Unter-Schönmattenwag Flockenbusch;;;;0;;; +Unter-Schönmattenwag Betriebshof BVÜ;;;;0;;; +Glattbach Ort;;;;0;;; +Bickenbach Bürgerhaus;;;;0;;; +Trösel Daumbergschule;;;;0;;; +Viernheim Röntgenstraße;;;;0;;; +Straßburg Ort;;;;0;;; +Brandau Feuerwehr;;;;0;;; +Siedelsbrunn Buddhas Weg;;;;0;;; +Seidenbuch Mitte;;;;0;;; +Seidenbach Ort;;;;0;;; +Schlierbach Betriebshof Pfeifer;;;;0;;; +Scheuerberg Seidenbacher Weg;;;;0;;; +Viernheim Nibelungenschule;;;;0;;; +Fürth Marktplatz;;;;0;;; +Rodau Hauptstraße;;;;0;;; +Beedenkirchen An den Römersteinen;;;;0;;; +Zotzenbach Trommhalle;;;;0;;; +Fehlheim Kirche;;;;0;;; +Wünschmichelbach Daummühle;;;;0;;; +Auerbach Saarstraße;;;;0;;; +Fürth Finanzamt;;;;0;;; +Winkel Ort;;;;0;;; +Weschnitz Wendeplatz;;;;0;;; +Weschnitz Mitte;;;;0;;; +Weinheim Wormser Straße;;;;0;;; +Weinheim D.-Bonhoeffer-Schule;;;;0;;; +Viernheim Walter-Gropius-Allee;;;;0;;; +Einhausen Siedlung;;;;0;;; +Beedenkirchen Mitte;;;;0;;; +Beerfelden Betriebshof Sauter;;;;0;;; +Wald-Michelbach Polizei;;;;0;;; +Wald-Michelbach Einkaufszentrum;;;;0;;; +Bensheim AKG;;;;0;;; +Wahlen Mitte;;;;0;;; +Bensheim An der Hartbrücke;;;;0;;; +Einhausen Jacobstraße;;;;0;;; +Scharbach Brücke;;;;0;;; +Rimbach Stadion;;;;0;;; +Rodau Friedhof;;;;0;;; +Lindenfels Mitte;;;;0;;; +Heddesheim Bus Betr Hof VGG(Sauter Spedition0X;;;;0;;; +Lörzenbach Mitlechterner Straße;;;;0;;; +Löhrbach Alte Landstraße;;;;0;;; +Bobstadt Sporthalle;;;;0;;; +Heppenheim Betriebshof Marquardt;;;;0;;; +Lorsch Odenwaldallee;;;;0;;; +Lorsch Betr.Hof Kollerer Industriestr;;;;0;;; +Lorsch Bahnhof;;;;0;;; +Biblis Betriebshof Fa. Müller;;;;0;;; +Lindenfels Kirschenweg;;;;0;;; +Mittershausen Abzweig;;;;0;;; +Heppenheim Christuskirche;;;;0;;; +Lauten-Weschnitz Ort;;;;0;;; +Langwaden Gemeinschaftshaus;;;;0;;; +Hornbach Mitte;;;;0;;; +Heppenheim Firma Marquardt;;;;0;;; +Auerbach Fasanenweg;;;;0;;; +Krumbach Betriebshof Lannert;;;;0;;; +Kocherbach Mitte;;;;0;;; +Heppenheim Niedermühlstraße;;;;0;;; +Mitlechtern Schule;;;;0;;; +Mörlenbach Abzw. Groß Breitenbach;;;;0;;; +Juhöhe Juhöhe;;;;0;;; +Birkenau Brücke;;;;0;;; +Bensheim Platanenallee;;;;0;;; +Hirschhorn Ersheim Gewerbegebiet;;;;0;;; +Reisen Odenwaldstraße;;;;0;;; +Bickenbach Mitte;;;;0;;; +Großsachsen Rose;;;;0;;; +Reichenbach Markt;;;;0;;; +Hammelbach Betriebshof Rothermel;;;;0;;; +Reichelsheim Gesamtschule;;;;0;;; +Reichelsheim Betriebshof;;;;0;;; +Ober-Mengelbach Ort;;;;0;;; +Biblis Berliner Straße;;;;0;;; +Hammelbach Jägerhof;;;;0;;; +Hammelbach Markt;;;;0;;; +Bensheim Schillerstraße;;;;0;;; +Bensheim Schloß Falkenhof;;;;0;;; +Heddesbach Heddesbach;;;;0;;; +Biblis Bahnhof;;;;0;;; +Mörlenbach Schlesierstraße;;;;0;;; +Eulsbach Ort;;;;0;;; +Mörlenbach Fürther Straße;;;;0;;; +Heppenheim Zollhausstraße/B3;;;;0;;; diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 6ebef305..bbdbde7a 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -34,7 +34,7 @@ interval = 1 signal_time_dif = 10 # Path to station data with stations heights and possibly more information -station_data_path = "data/examples/station_data.csv" +station_data_path = "data/examples/all_stations.csv" ##### SIMULATION CONDITIONS AND BOUNDARIES ##### diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 7e6990bc..ffeb3284 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -67,17 +67,24 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): station_data = dict() station_path = kwargs.get("station_data_path") + + if station_path is not None: try: with open(str(station_path), "r") as f: - reader = csv.DictReader(f) + delim=util.get_csv_delim(station_path) + reader = csv.DictReader(f, delimiter=delim) station_data = dict() for row in reader: - station_data.update({str(row['Station']): - {"Height_m": float(row['Height_m'])}}) + station_data.update({str(row['Endhaltestelle']): + {"elevation": float(row['elevation'])}}) except FileNotFoundError or KeyError: - print("Warning: external csv file '{}' not found or not named properly" - "(Needed column names are 'Station' and 'Height_m')". + print("Warning: external csv file '{}' not found or not named properly \n" + "(Needed column names are 'Endhaltestelle' and 'elevation')". + format(station_path)) + except ValueError: + print("Warning: external csv file '{}' does not contain numeric values in the \n" + "column 'elevation'. Station data is discarded". format(station_path)) with open(path_to_csv, 'r') as trips_file: diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 93051c51..4fe9cb9a 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -15,13 +15,13 @@ def __init__(self, rotation, departure_time, departure_name, if height_diff is None: station_data = kwargs.get("station_data", dict()) try: - height_diff = station_data[self.arrival_name]["Height_m"] \ - - station_data[self.departure_name]["Height_m"] - except KeyError: + height_diff = station_data[self.arrival_name]["elevation"] \ + - station_data[self.departure_name]["elevation"] + except KeyError or ArithmeticError: height_diff = 0 self.height_diff = height_diff self.level_of_loading = None - # Meandered in km/h from distance and travel time or from initialization + # Mean Speed in km/h from distance and travel time or from initialization # Travel time is at least 1 min mean_speed = kwargs.get("mean_speed", (self.distance / 1000) / max(1 / 60, ((self.arrival_time - self.departure_time) / timedelta( diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 3dde7183..32fdb6a6 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -94,3 +94,27 @@ def get_buffer_time(trip, default=0): break return buffer_time + + +def get_csv_delim(path): + possible_delims = [",", ";", "\t", " ", ] + counters = [[] for x in possible_delims] + skip_delim = set() + with open(path, "r") as f: + for line_nr, line in enumerate(f): + for delim_nr, delim in enumerate(possible_delims): + if delim in skip_delim: continue + counters[delim_nr].append(line.count(delim)) + if line_nr > 0: + for delim_nr, delim in enumerate(possible_delims): + if len(set(counters[delim_nr])) > 1 or counters[delim_nr][-1] == 0: + skip_delim.add(delim) + if len(skip_delim) == len(possible_delims) - 1: + return set(possible_delims).difference(skip_delim).pop() + elif len(skip_delim) >= len(possible_delims): + print("Warning: Delimiter could not be found.\n" + "returning standard Delimiter ','") + return "," + print("Warning: Delimiter could not be found.\n" + "returning standard Delimiter ','") + return "," From 1f169535aa68598877d4a5d0ffd0c1038332e50e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:16:21 +0200 Subject: [PATCH 279/802] Flake8 files --- ebus_toolbox/schedule.py | 5 ++--- ebus_toolbox/util.py | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index ffeb3284..37d7b26a 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -68,11 +68,10 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): station_data = dict() station_path = kwargs.get("station_data_path") - if station_path is not None: try: with open(str(station_path), "r") as f: - delim=util.get_csv_delim(station_path) + delim = util.get_csv_delim(station_path) reader = csv.DictReader(f, delimiter=delim) station_data = dict() for row in reader: @@ -352,7 +351,7 @@ def generate_scenario(self, args): # departure time of next trip for standing time calculation try: - next_departure_time = vehicle_trips[i+1].departure_time + next_departure_time = vehicle_trips[i + 1].departure_time except IndexError: # last trip next_departure_time = trip.arrival_time + datetime.timedelta(hours=8) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 32fdb6a6..f9f559c2 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -103,7 +103,8 @@ def get_csv_delim(path): with open(path, "r") as f: for line_nr, line in enumerate(f): for delim_nr, delim in enumerate(possible_delims): - if delim in skip_delim: continue + if delim in skip_delim: + continue counters[delim_nr].append(line.count(delim)) if line_nr > 0: for delim_nr, delim in enumerate(possible_delims): From d47ffedd35d11c85b06fc7e095a322fc2cf31e08 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:33:32 +0200 Subject: [PATCH 280/802] Change station data for example trips --- data/examples/all_stations.csv | 198 +++------------------------------ 1 file changed, 15 insertions(+), 183 deletions(-) diff --git a/data/examples/all_stations.csv b/data/examples/all_stations.csv index a2f1b1c1..b2903b89 100644 --- a/data/examples/all_stations.csv +++ b/data/examples/all_stations.csv @@ -1,183 +1,15 @@ -Endhaltestelle;ID;geo_lat;geo_long;elevation;pv_area;pv_type;pv_kwp -Bensheim Bahnhof/ ZOB;;;;0;;; -Heppenheim Bahnhof;;;;0;;; -Weinheim Hauptbahnhof;;;;0;;; -Grasellenbach Im Erzfeld;;;;0;;; -Viernheim Bahnhof;;;;0;;; -Wald-Michelbach ZOB;;;;0;;; -Wald-Michelbach Alter Bahnhof;;;;0;;; -Bensheim Betriebshof VGG W-v.S.Str.;;;;0;;; -Lindenfels Poststraße;;;;0;;; -Nieder-Liebersbach Rathaus;;;;0;;; -Fürth Bahnhof;;;;0;;; -Hirschhorn Grundschule;;;;0;;; -Alsbach Am Hinkelstein;;;;0;;; -Bürstadt Lampertheimer Straße;;;;0;;; -Heppenheim Vogelsbergstraße;;;;0;;; -Rimbach Schulzentrum;;;;0;;; -Mörlenbach Schulzentrum;;;;0;;; -Viernheim Betriebshof Winkler;;;;0;;; -Heppenheim Graben;;;;0;;; -Gadernheim Schulzentrum;;;;0;;; -Winterkasten Eleonoren-Klinik;;;;0;;; -Wald-Michelbach Schulzentrum;;;;0;;; -Bensheim Betriebshof VGG R-Bosch Str;;;;0;;; -Wahlen Grundschule;;;;0;;; -Worms Hauptbahnhof;;;;0;;; -Gronau Am Mühlkandel;;;;0;;; -Fürth Grundschule;;;;0;;; -Fürth Gesamtschule;;;;0;;; -Heppenheim Gießener Straße;;;;0;;; -Bensheim H.-Metzendorf-Schule;;;;0;;; -Gadernheim Jarnacplatz;;;;0;;; -Birkenau Bahnhof;;;;0;;; -Auerbach Schillerschule;;;;0;;; -Heppenheim Kreiskrankenhaus;;;;0;;; -Bensheim Geschw.-Scholl-Schule;;;;0;;; -Geisenbach Ort;;;;0;;; -Ober-Abtsteinach Mackenheimer Straße;;;;0;;; -Mörlenbach Bahnhof;;;;0;;; -Heppenheim Starkenburg-Gymnasium;;;;0;;; -Viernheim Heppenheimer Straße;;;;0;;; -Bensheim G.-Scholl-Schule;;;;0;;; -Rimbach Kirche;;;;0;;; -Fehlheim Mühlgrabenstraße;;;;0;;; -Zwingenberg Schule;;;;0;;; -Erbach Post;;;;0;;; -Reichelsheim Schwimmbad;;;;0;;; -Bensheim G.-Sch.-S./Berl.Ring;;;;0;;; -Mörlenbach Grundschule;;;;0;;; -Unter-Abtsteinach Schule;;;;0;;; -Hornbach Herrenwiese;;;;0;;; -Kirschhausen Schule;;;;0;;; -Lindenfels Carl-Orff-Schule;;;;0;;; -Lorsch Wingertsbergschule;;;;0;;; -Mitlechtern Mitte;;;;0;;; -Ober-Laudenbach Finstertal;;;;0;;; -Reichenbach Schule;;;;0;;; -Gorxheim Gorxenbuckel;;;;0;;; -Hirschhorn Heinrich-Weis-Straße;;;;0;;; -Wattenheim Ort;;;;0;;; -Zotzenbach Schule;;;;0;;; -Bensheim Karl-Kübel-Schule;;;;0;;; -Gadern Dorfplatz;;;;0;;; -Vöckelsbach Feuerwehrhaus;;;;0;;; -Birkenau Grundschule;;;;0;;; -Reisen Bahnhof;;;;0;;; -Lorsch Siemensschule;;;;0;;; -Lampertheim Bahnhof;;;;0;;; -Balkhausen Bürgerhalle;;;;0;;; -Erbach Gesundheiszentrum;;;;0;;; -Staffel;;;;0;;; -Einhausen Almenstraße;;;;0;;; -Viernheim Schulzentrum;;;;0;;; -Birkenau Langenbergschule;;;;0;;; -Neunkirchen Heilquelle;;;;0;;; -Hirschhorn Bahnhof;;;;0;;; -Birkenau Schloss;;;;0;;; -Bürstadt Bahnhof;;;;0;;; -Ober-Hambach Odenwaldschule;;;;0;;; -Erlenbach Schule;;;;0;;; -Trösel Bergweg;;;;0;;; -Bonsweiher Waldparkplatz;;;;0;;; -Oberflockenbach Rose;;;;0;;; -Rimbach Bahnhof;;;;0;;; -Lampertheim Schulzent. West;;;;0;;; -Krumbach Rotenbergstraße;;;;0;;; -Bensheim Kirchbergschule;;;;0;;; -Kreidach Unterdorf;;;;0;;; -Siedelsbrunn Tannenberg/Morgenstern;;;;0;;; -Hähnlein Engpass;;;;0;;; -Unter-Abtsteinach Brücke;;;;0;;; -Bensheim Bensheimer Werkstätten;;;;0;;; -Viernheim Bürgerhaus;;;;0;;; -Gadernheim Linde;;;;0;;; -Bürstadt Erich-Kästner-Schule;;;;0;;; -Unter-Schönmattenwag Kreuz;;;;0;;; -Unter-Schönmattenwag Kirche;;;;0;;; -Unter-Schönmattenwag Flockenbusch;;;;0;;; -Unter-Schönmattenwag Betriebshof BVÜ;;;;0;;; -Glattbach Ort;;;;0;;; -Bickenbach Bürgerhaus;;;;0;;; -Trösel Daumbergschule;;;;0;;; -Viernheim Röntgenstraße;;;;0;;; -Straßburg Ort;;;;0;;; -Brandau Feuerwehr;;;;0;;; -Siedelsbrunn Buddhas Weg;;;;0;;; -Seidenbuch Mitte;;;;0;;; -Seidenbach Ort;;;;0;;; -Schlierbach Betriebshof Pfeifer;;;;0;;; -Scheuerberg Seidenbacher Weg;;;;0;;; -Viernheim Nibelungenschule;;;;0;;; -Fürth Marktplatz;;;;0;;; -Rodau Hauptstraße;;;;0;;; -Beedenkirchen An den Römersteinen;;;;0;;; -Zotzenbach Trommhalle;;;;0;;; -Fehlheim Kirche;;;;0;;; -Wünschmichelbach Daummühle;;;;0;;; -Auerbach Saarstraße;;;;0;;; -Fürth Finanzamt;;;;0;;; -Winkel Ort;;;;0;;; -Weschnitz Wendeplatz;;;;0;;; -Weschnitz Mitte;;;;0;;; -Weinheim Wormser Straße;;;;0;;; -Weinheim D.-Bonhoeffer-Schule;;;;0;;; -Viernheim Walter-Gropius-Allee;;;;0;;; -Einhausen Siedlung;;;;0;;; -Beedenkirchen Mitte;;;;0;;; -Beerfelden Betriebshof Sauter;;;;0;;; -Wald-Michelbach Polizei;;;;0;;; -Wald-Michelbach Einkaufszentrum;;;;0;;; -Bensheim AKG;;;;0;;; -Wahlen Mitte;;;;0;;; -Bensheim An der Hartbrücke;;;;0;;; -Einhausen Jacobstraße;;;;0;;; -Scharbach Brücke;;;;0;;; -Rimbach Stadion;;;;0;;; -Rodau Friedhof;;;;0;;; -Lindenfels Mitte;;;;0;;; -Heddesheim Bus Betr Hof VGG(Sauter Spedition0X;;;;0;;; -Lörzenbach Mitlechterner Straße;;;;0;;; -Löhrbach Alte Landstraße;;;;0;;; -Bobstadt Sporthalle;;;;0;;; -Heppenheim Betriebshof Marquardt;;;;0;;; -Lorsch Odenwaldallee;;;;0;;; -Lorsch Betr.Hof Kollerer Industriestr;;;;0;;; -Lorsch Bahnhof;;;;0;;; -Biblis Betriebshof Fa. Müller;;;;0;;; -Lindenfels Kirschenweg;;;;0;;; -Mittershausen Abzweig;;;;0;;; -Heppenheim Christuskirche;;;;0;;; -Lauten-Weschnitz Ort;;;;0;;; -Langwaden Gemeinschaftshaus;;;;0;;; -Hornbach Mitte;;;;0;;; -Heppenheim Firma Marquardt;;;;0;;; -Auerbach Fasanenweg;;;;0;;; -Krumbach Betriebshof Lannert;;;;0;;; -Kocherbach Mitte;;;;0;;; -Heppenheim Niedermühlstraße;;;;0;;; -Mitlechtern Schule;;;;0;;; -Mörlenbach Abzw. Groß Breitenbach;;;;0;;; -Juhöhe Juhöhe;;;;0;;; -Birkenau Brücke;;;;0;;; -Bensheim Platanenallee;;;;0;;; -Hirschhorn Ersheim Gewerbegebiet;;;;0;;; -Reisen Odenwaldstraße;;;;0;;; -Bickenbach Mitte;;;;0;;; -Großsachsen Rose;;;;0;;; -Reichenbach Markt;;;;0;;; -Hammelbach Betriebshof Rothermel;;;;0;;; -Reichelsheim Gesamtschule;;;;0;;; -Reichelsheim Betriebshof;;;;0;;; -Ober-Mengelbach Ort;;;;0;;; -Biblis Berliner Straße;;;;0;;; -Hammelbach Jägerhof;;;;0;;; -Hammelbach Markt;;;;0;;; -Bensheim Schillerstraße;;;;0;;; -Bensheim Schloß Falkenhof;;;;0;;; -Heddesbach Heddesbach;;;;0;;; -Biblis Bahnhof;;;;0;;; -Mörlenbach Schlesierstraße;;;;0;;; -Eulsbach Ort;;;;0;;; -Mörlenbach Fürther Straße;;;;0;;; -Heppenheim Zollhausstraße/B3;;;;0;;; +Endhaltestelle,ID,geo_lat,geo_long,elevation,pv_area,pv_type,pv_kwp +Station-0,,,,0,,, +Station-1,,,,0,,, +Station-2,,,,0,,, +Station-3,,,,0,,, +Station-4,,,,0,,, +Station-5,,,,0,,, +Station-6,,,,0,,, +Station-7,,,,0,,, +Station-8,,,,0,,, +Station-9,,,,0,,, +Station-10,,,,0,,, +Station-11,,,,0,,, +Station-12,,,,0,,, +Station-13,,,,0,,, From 2687cebfa3a5f6b194dbfefcd111f34df220f215 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:37:39 +0200 Subject: [PATCH 281/802] Make use of delim getter from util --- ebus_toolbox/consumption.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 407e6722..771fbaaa 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,20 +1,25 @@ import numpy as np import csv import pandas as pd +from ebus_toolbox import util class Consumption: def __init__(self, vehicle_types, **kwargs) -> None: # load temperature of the day, now dummy winter day self.temperatures_by_hour = {} - with open(kwargs.get("outside_temperatures", "data/examples/default_temp_winter.csv")) as f: - reader = csv.DictReader(f) + temp_path = kwargs.get("outside_temperatures", "data/examples/default_temp_winter.csv") + with open(temp_path) as f: + delim = util.get_csv_delim(temp_path) + reader = csv.DictReader(f, delimiter=delim) for row in reader: self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) - with open(kwargs.get("level_of_loading_over_day", - "data/examples/default_level_of_loading_over_day.csv")) as f: - reader = csv.DictReader(f) + lol_path = kwargs.get("level_of_loading_over_day", + "data/examples/default_level_of_loading_over_day.csv") + with open(lol_path) as f: + delim = util.get_csv_delim(lol_path) + reader = csv.DictReader(f, delimiter=delim) self.lol_by_hour = {} for row in reader: self.lol_by_hour.update({int(row['hour']): float(row['level_of_loading'])}) @@ -88,7 +93,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem this_speed=mean_speed) except KeyError: # Creating the interpol function from csv file. - df = pd.read_csv(consumption_path, sep=",") + delim = util.get_csv_delim(consumption_path) + df = pd.read_csv(consumption_path, sep=delim) # Create lookup table and make sure its in the same order as the input point # which will be the input for the nd lookup vt_col = df["vehicle_type"] From 7cfdebfc1c84609788fa45877d57f24391353b58 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:41:11 +0200 Subject: [PATCH 282/802] Delete station_data which is replaced by all_stations --- data/examples/station_data.csv | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 data/examples/station_data.csv diff --git a/data/examples/station_data.csv b/data/examples/station_data.csv deleted file mode 100644 index 87638e4f..00000000 --- a/data/examples/station_data.csv +++ /dev/null @@ -1,15 +0,0 @@ -Station,Height_m -Station-0,1 -Station-1,2 -Station-2,3 -Station-3,4 -Station-4,5 -Station-5,6 -Station-6,7 -Station-7,8 -Station-8,9 -Station-9,10 -Station-10,11 -Station-11,12 -Station-12,13 -Station-13,14 From 732df57da5ee514a4b3bdb453222b02e21ebae0f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:43:14 +0200 Subject: [PATCH 283/802] Revert some formatting changes --- ebus_toolbox/schedule.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 37d7b26a..e6c2fde5 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -338,20 +338,21 @@ def generate_scenario(self, args): # get sorted list of all trips for current vehicle # sort rotations by time leveraging the fact that the # list of trips per rotation is always sorted - vehicle_rotations = {k: v for k, v in sorted(vehicle_rotations.items(), - key=lambda x: x[1].departure_time)} + vehicle_rotations = {k: v for k, v in sorted( + vehicle_rotations.items(), key=lambda x: x[1].departure_time)} vehicle_trips = [t for rot in vehicle_rotations.values() for t in rot.trips] for i, trip in enumerate(vehicle_trips): # don't generate events that start after simulation has stopped if trip.departure_time >= stop_simulation: break + cs_name = f"{vehicle_id}_{trip.arrival_name}" gc_name = trip.arrival_name # departure time of next trip for standing time calculation try: - next_departure_time = vehicle_trips[i + 1].departure_time + next_departure_time = vehicle_trips[i+1].departure_time except IndexError: # last trip next_departure_time = trip.arrival_time + datetime.timedelta(hours=8) From 310ce288de62dea13a2a5850a896ddce64011655 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:46:10 +0200 Subject: [PATCH 284/802] Delete old consumption file --- .../energy_consumption_example_old.csv | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 data/examples/energy_consumption_example_old.csv diff --git a/data/examples/energy_consumption_example_old.csv b/data/examples/energy_consumption_example_old.csv deleted file mode 100644 index 0579860e..00000000 --- a/data/examples/energy_consumption_example_old.csv +++ /dev/null @@ -1,23 +0,0 @@ -Temp.,Alle,Kat. A,Kat. B,Kat. C --8,2.07,2.2,2.04,1.71 --6,1.9,2.03,1.76,1.59 --4,1.81,1.89,1.75,1.58 --2,1.78,1.86,1.65,1.49 -0,1.65,1.73,1.6,1.44 -2,1.61,1.67,1.57,1.38 -4,1.54,1.6,1.48,1.31 -6,1.47,1.52,1.44,1.25 -8,1.4,1.45,1.38,1.19 -10,1.33,1.37,1.3,1.16 -12,1.29,1.32,1.27,1.1 -14,1.2,1.23,1.17,1.04 -16,1.09,1.13,1.06,0.96 -18,1.06,1.08,1.03,0.93 -20,1.04,1.07,1.00,0.92 -22,1.08,1.11,1.03,0.93 -24,1.16,1.19,1.12,0.96 -26,1.23,1.27,1.2,1.03 -28,1.31,1.34,1.25,1.06 -30,1.43,1.46,1.38,1.11 -32,1.44,1.47,1.42,1.17 -34,1.53,1.57,1.45,1.24 From f736e924b3b457334dd88c0870228ecae27bbe48 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 24 Oct 2022 12:47:26 +0200 Subject: [PATCH 285/802] Remove scipy --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d5a005d..432394c1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,3 @@ numpy >= 1.12.0 matplotlib -e git+https://github.com/rl-institut/spice_ev.git@dev#egg=spiceev pandas -scipy \ No newline at end of file From 4037510350b055273c2640a9e637ad5b88ac5819 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Oct 2022 12:38:53 +0200 Subject: [PATCH 286/802] Add comments, docstring, and clear up interpol and delimiter function --- ebus_toolbox/consumption.py | 101 +++++---------------------- ebus_toolbox/schedule.py | 14 ++-- ebus_toolbox/trip.py | 2 +- ebus_toolbox/util.py | 132 ++++++++++++++++++++++++++++++++---- 4 files changed, 143 insertions(+), 106 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 771fbaaa..6fc43ea8 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -1,4 +1,3 @@ -import numpy as np import csv import pandas as pd from ebus_toolbox import util @@ -8,17 +7,20 @@ class Consumption: def __init__(self, vehicle_types, **kwargs) -> None: # load temperature of the day, now dummy winter day self.temperatures_by_hour = {} - temp_path = kwargs.get("outside_temperatures", "data/examples/default_temp_winter.csv") - with open(temp_path) as f: - delim = util.get_csv_delim(temp_path) + temperature_file_path = kwargs.get("outside_temperatures", + "data/examples/default_temp_winter.csv") + # Parsing the Temperature to a dict + with open(temperature_file_path) as f: + delim = util.get_csv_delim(temperature_file_path) reader = csv.DictReader(f, delimiter=delim) for row in reader: self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) - lol_path = kwargs.get("level_of_loading_over_day", - "data/examples/default_level_of_loading_over_day.csv") - with open(lol_path) as f: - delim = util.get_csv_delim(lol_path) + lol_file_path = kwargs.get("level_of_loading_over_day", + "data/examples/default_level_of_loading_over_day.csv") + # Parsing the level of loading to a dict + with open(lol_file_path) as f: + delim = util.get_csv_delim(lol_file_path) reader = csv.DictReader(f, delimiter=delim) self.lol_by_hour = {} for row in reader: @@ -30,8 +32,6 @@ def __init__(self, vehicle_types, **kwargs) -> None: def calculate_consumption(self, time, distance, vehicle_type, charging_type, temp=None, height_diff=0, level_of_loading=None, mean_speed=18): """ Calculates consumed amount of energy for a given distance. - - :param time: The date and time at which the trip ends :type time: datetime.datetime :param distance: Distance travelled [m] @@ -55,7 +55,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :rtype: (float, float) """ - assert self.vehicle_types.get(vehicle_type, {}).get(charging_type), \ + assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ f"Combination of vehicle type {vehicle_type} and {charging_type} not defined." vehicle_info = self.vehicle_types[vehicle_type][charging_type] @@ -66,17 +66,13 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) return consumed_energy, delta_soc - # If no specific LoL is given, interpolate from demand time series. + # If no specific Temperature is given, lookup temperature if temp is None: - temp = np.interp(time.hour, - list(self.temperatures_by_hour.keys()), - list(self.temperatures_by_hour.values())) + temp = self.temperatures_by_hour[time.hour] - # If no specific LoL is given, interpolate from demand time series. + # If no specific LoL is given, lookup temperature if level_of_loading is None: - level_of_loading = np.interp(time.hour, - list(self.lol_by_hour.keys()), - list(self.lol_by_hour.values())) + level_of_loading = self.lol_by_hour[time.hour] # load consumption csv consumption_path = vehicle_info["mileage"] @@ -107,7 +103,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this_speed): input_point = (this_vehicle_type, this_incline, this_temp, this_lol, this_speed) - return nd_interp(input_point, data_table) + return util.nd_interp(input_point, data_table) self.consumption_files.update({consumption_path: interpol_function}) @@ -121,68 +117,3 @@ def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) return consumed_energy, delta_soc - - -def nd_interp(input_values, lookup_table): - # find all unique values in table per column - dim_sets = [set() for _ in input_values] - for row in lookup_table: - for i, v in enumerate(row[:-1]): - dim_sets[i].add(v) - dim_values = [sorted(s) for s in dim_sets] - # find nearest value(s) per column - # go through sorted column values until last less / first greater - lower = [None] * len(input_values) - upper = [None] * len(input_values) - for i, v in enumerate(input_values): - # initialize for out of bound values -> Constant value - lower[i] = dim_values[i][0] - upper[i] = dim_values[i][-1] - for c in dim_values[i]: - if v >= c: - lower[i] = c - if v <= c: - upper[i] = c - break - # find rows in table made up of only lower or upper values - points = [] - for row in lookup_table: - for i, v in enumerate(row[:-1]): - if lower[i] != v and upper[i] != v: - break - else: - points.append(row) - - # interpolate between points that differ only in current dimension - for i, x in enumerate(input_values): - new_points = [] - # find points that differ in just that dimension - for j, p1 in enumerate(points): - for p2 in points[j + 1:]: - for k in range(len(input_values)): - if p1[k] != p2[k] and i != k: - break - else: - # differing row found - x1 = p1[i] - y1 = p1[-1] - x2 = p2[i] - y2 = p2[-1] - dx = x2 - x1 - dy = y2 - y1 - m = dy / dx - n = y1 - m * x1 - y = m * x + n - # generate new point at interpolation - p = [v for v in p1] - p[i] = x - p[-1] = y - new_points.append(p) - # only couple - break - else: - # no matching row (singleton dimension?) - new_points.append(p1) - points = new_points - - return points[0][-1] diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e6c2fde5..dac927a3 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -78,13 +78,15 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): station_data.update({str(row['Endhaltestelle']): {"elevation": float(row['elevation'])}}) except FileNotFoundError or KeyError: - print("Warning: external csv file '{}' not found or not named properly \n" - "(Needed column names are 'Endhaltestelle' and 'elevation')". - format(station_path)) + warnings.warn("Warning: external csv file '{}' not found or not named properly " + "(Needed column names are 'Endhaltestelle' and 'elevation')". + format(station_path), + stacklevel=100) except ValueError: - print("Warning: external csv file '{}' does not contain numeric values in the \n" - "column 'elevation'. Station data is discarded". - format(station_path)) + warnings.warn("Warning: external csv file '{}' does not contain numeric" + "values in the column 'elevation'. Station data is discarded". + format(station_path), + stacklevel=100) with open(path_to_csv, 'r') as trips_file: trip_reader = csv.DictReader(trips_file) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 4fe9cb9a..cb6feee7 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -17,7 +17,7 @@ def __init__(self, rotation, departure_time, departure_name, try: height_diff = station_data[self.arrival_name]["elevation"] \ - station_data[self.departure_name]["elevation"] - except KeyError or ArithmeticError: + except KeyError or TypeError: height_diff = 0 self.height_diff = height_diff self.level_of_loading = None diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index f9f559c2..28ea88c4 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -96,26 +96,130 @@ def get_buffer_time(trip, default=0): return buffer_time -def get_csv_delim(path): - possible_delims = [",", ";", "\t", " ", ] - counters = [[] for x in possible_delims] - skip_delim = set() +def get_csv_delim(path, other_delims=set()): + """ Get the delimiter of a character separated file. + Checks the file for ",", "tabulator" and ";" as well as optional other characters + or strings. + In case no clear delimiter is found "," as delimiter is returned + + :param path: Path to file to be checked + :type path: str + :param other_delims: Other delimiters besides the default delimiters to be checked + :type other_delims: set() of str + :return: delimiter + :rtype: str + """ + + # Create union of default and optional other delimiters + possible_delims = {",", ";", "\t"}.union(other_delims) + # Create a dict which counts the occurances of the delimter per row + counters = dict.fromkeys(possible_delims, []) with open(path, "r") as f: for line_nr, line in enumerate(f): - for delim_nr, delim in enumerate(possible_delims): - if delim in skip_delim: - continue - counters[delim_nr].append(line.count(delim)) + + # For every delimiter in the dictionary + for delim in counters.keys(): + # Append the list with the counted amount + counters[delim].append(line.count(delim)) + + # After the first row if line_nr > 0: - for delim_nr, delim in enumerate(possible_delims): - if len(set(counters[delim_nr])) > 1 or counters[delim_nr][-1] == 0: - skip_delim.add(delim) - if len(skip_delim) == len(possible_delims) - 1: - return set(possible_delims).difference(skip_delim).pop() - elif len(skip_delim) >= len(possible_delims): + # for every delimiter in the counters dictionary + for delim in counters.keys(): + # if different amounts of this delimiter were counted from row to row or the + # last amount was 0 + if len(set(counters[delim])) > 1 or counters[delim][-1] == 0: + # remove this delimiter from the dictionary + counters.pop(delim) + # If only one delimiter is remaining + if len(counters) == 1: + return counters.keys()[0] + + # If not even a single delimiter is remaining + elif len(counters) < 1: print("Warning: Delimiter could not be found.\n" "returning standard Delimiter ','") return "," + # Multiple delimiters are possible. Every row was checked but more than 1 delimiter + # has the same amount of occurences (>0) in every row. print("Warning: Delimiter could not be found.\n" "returning standard Delimiter ','") return "," + + +def nd_interp(input_values, lookup_table): + """ Get the interpolated output value for a given input value of n dimensions and a given + lookup table with n+1 columns. Input values outside of the lookup table are + clipped to the bounds. + :param input_values: tuple with n input values + :type input_values: tuple(floats) + :param lookup_table: Table with n+1 columns, with the output values in the (n+1)th column + :type lookup_table: list() of lists() + :return: interpolated value + :rtype: float + """ + + # find all unique values in table per column + dim_sets = [set() for _ in input_values] + for row in lookup_table: + for i, v in enumerate(row[:-1]): + dim_sets[i].add(v) + dim_values = [sorted(s) for s in dim_sets] + # find nearest value(s) per column + # go through sorted column values until last less / first greater + lower = [None] * len(input_values) + upper = [None] * len(input_values) + for i, v in enumerate(input_values): + # initialize for out of bound values -> Constant value since lower and upper will both + # be the same boundary value. Still allows for interpolation in other dimensions + # forcing lower= c: + lower[i] = c + if v <= c: + upper[i] = c + break + # find rows in table made up of only lower or upper values + points = [] + for row in lookup_table: + for i, v in enumerate(row[:-1]): + if lower[i] != v and upper[i] != v: + break + else: + points.append(row) + + # interpolate between points that differ only in current dimension + for i, x in enumerate(input_values): + new_points = [] + # find points that differ in just that dimension + for j, p1 in enumerate(points): + for p2 in points[j + 1:]: + for k in range(len(input_values)): + if p1[k] != p2[k] and i != k: + break + else: + # differing row found + x1 = p1[i] + y1 = p1[-1] + x2 = p2[i] + y2 = p2[-1] + dx = x2 - x1 + dy = y2 - y1 + m = dy / dx + n = y1 - m * x1 + y = m * x + n + # generate new point at interpolation + p = [v for v in p1] + p[i] = x + p[-1] = y + new_points.append(p) + # only couple + break + else: + # no matching row (singleton dimension?) + new_points.append(p1) + points = new_points + + return points[0][-1] From 93460e6fc86f8b128fadf82399f0a2cf3ed5a7e6 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Oct 2022 12:51:35 +0200 Subject: [PATCH 287/802] Fix iteration over changing dict --- ebus_toolbox/util.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 28ea88c4..f365cb36 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -112,20 +112,22 @@ def get_csv_delim(path, other_delims=set()): # Create union of default and optional other delimiters possible_delims = {",", ";", "\t"}.union(other_delims) - # Create a dict which counts the occurances of the delimter per row - counters = dict.fromkeys(possible_delims, []) + # Create a dict which counts the occurances of the delimiter per row + counters = {delim:list() for delim in possible_delims} with open(path, "r") as f: for line_nr, line in enumerate(f): # For every delimiter in the dictionary for delim in counters.keys(): # Append the list with the counted amount - counters[delim].append(line.count(delim)) + amount=line.count(delim) + counters[delim].append(amount) # After the first row if line_nr > 0: # for every delimiter in the counters dictionary - for delim in counters.keys(): + keys = set(counters.keys()) + for delim in keys: # if different amounts of this delimiter were counted from row to row or the # last amount was 0 if len(set(counters[delim])) > 1 or counters[delim][-1] == 0: @@ -133,7 +135,8 @@ def get_csv_delim(path, other_delims=set()): counters.pop(delim) # If only one delimiter is remaining if len(counters) == 1: - return counters.keys()[0] + # Take the last item and return the key + return counters.popitem()[0] # If not even a single delimiter is remaining elif len(counters) < 1: From b98411c3acc83c6d23a6b6edd1ebef578736a94a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Oct 2022 12:52:28 +0200 Subject: [PATCH 288/802] Make flake8 happy --- ebus_toolbox/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index f365cb36..13591f0e 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -113,14 +113,14 @@ def get_csv_delim(path, other_delims=set()): # Create union of default and optional other delimiters possible_delims = {",", ";", "\t"}.union(other_delims) # Create a dict which counts the occurances of the delimiter per row - counters = {delim:list() for delim in possible_delims} + counters = {delim: list() for delim in possible_delims} with open(path, "r") as f: for line_nr, line in enumerate(f): # For every delimiter in the dictionary for delim in counters.keys(): # Append the list with the counted amount - amount=line.count(delim) + amount = line.count(delim) counters[delim].append(amount) # After the first row From 4936e660253ae50ed4cd00b3d866c19f8462d61b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Oct 2022 16:09:03 +0200 Subject: [PATCH 289/802] Make comments lowercase --- ebus_toolbox/consumption.py | 16 ++++++++-------- ebus_toolbox/util.py | 17 ++++++++--------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 6fc43ea8..643d28a1 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -9,7 +9,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: self.temperatures_by_hour = {} temperature_file_path = kwargs.get("outside_temperatures", "data/examples/default_temp_winter.csv") - # Parsing the Temperature to a dict + # parsing the Temperature to a dict with open(temperature_file_path) as f: delim = util.get_csv_delim(temperature_file_path) reader = csv.DictReader(f, delimiter=delim) @@ -18,7 +18,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: lol_file_path = kwargs.get("level_of_loading_over_day", "data/examples/default_level_of_loading_over_day.csv") - # Parsing the level of loading to a dict + # parsing the level of loading to a dict with open(lol_file_path) as f: delim = util.get_csv_delim(lol_file_path) reader = csv.DictReader(f, delimiter=delim) @@ -66,21 +66,21 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) return consumed_energy, delta_soc - # If no specific Temperature is given, lookup temperature + # if no specific Temperature is given, lookup temperature if temp is None: temp = self.temperatures_by_hour[time.hour] - # If no specific LoL is given, lookup temperature + # if no specific LoL is given, lookup temperature if level_of_loading is None: level_of_loading = self.lol_by_hour[time.hour] # load consumption csv consumption_path = vehicle_info["mileage"] - # Consumption_files holds interpol functions of csv files which are called directly + # consumption_files holds interpol functions of csv files which are called directly vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] - # Try to use the interpol function. If it does not exist yet its created in except case. + # try to use the interpol function. If it does not exist yet its created in except case. try: mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type_nr, this_incline=height_diff / distance, @@ -88,10 +88,10 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem this_lol=level_of_loading, this_speed=mean_speed) except KeyError: - # Creating the interpol function from csv file. + # creating the interpol function from csv file. delim = util.get_csv_delim(consumption_path) df = pd.read_csv(consumption_path, sep=delim) - # Create lookup table and make sure its in the same order as the input point + # create lookup table and make sure its in the same order as the input point # which will be the input for the nd lookup vt_col = df["vehicle_type"] inc_col = df["incline"] diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 13591f0e..580645e8 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -110,20 +110,20 @@ def get_csv_delim(path, other_delims=set()): :rtype: str """ - # Create union of default and optional other delimiters + # create union of default and optional other delimiters possible_delims = {",", ";", "\t"}.union(other_delims) - # Create a dict which counts the occurances of the delimiter per row + # create a dict which counts the occurances of the delimiter per row counters = {delim: list() for delim in possible_delims} with open(path, "r") as f: for line_nr, line in enumerate(f): - # For every delimiter in the dictionary + # for every delimiter in the dictionary for delim in counters.keys(): # Append the list with the counted amount amount = line.count(delim) counters[delim].append(amount) - # After the first row + # after the first row if line_nr > 0: # for every delimiter in the counters dictionary keys = set(counters.keys()) @@ -133,17 +133,17 @@ def get_csv_delim(path, other_delims=set()): if len(set(counters[delim])) > 1 or counters[delim][-1] == 0: # remove this delimiter from the dictionary counters.pop(delim) - # If only one delimiter is remaining + # if only one delimiter is remaining if len(counters) == 1: - # Take the last item and return the key + # take the last item and return the key return counters.popitem()[0] - # If not even a single delimiter is remaining + # if not even a single delimiter is remaining elif len(counters) < 1: print("Warning: Delimiter could not be found.\n" "returning standard Delimiter ','") return "," - # Multiple delimiters are possible. Every row was checked but more than 1 delimiter + # multiple delimiters are possible. Every row was checked but more than 1 delimiter # has the same amount of occurences (>0) in every row. print("Warning: Delimiter could not be found.\n" "returning standard Delimiter ','") @@ -161,7 +161,6 @@ def nd_interp(input_values, lookup_table): :return: interpolated value :rtype: float """ - # find all unique values in table per column dim_sets = [set() for _ in input_values] for row in lookup_table: From 701d9510c9e0a760cedbb7090e12303be92019c1 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Oct 2022 16:27:31 +0200 Subject: [PATCH 290/802] Make delimiter finding more efficient and pretty --- data/examples/all_stations.csv | 2 +- ebus_toolbox/util.py | 43 ++++++++++++++-------------------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/data/examples/all_stations.csv b/data/examples/all_stations.csv index b2903b89..22f1c8a6 100644 --- a/data/examples/all_stations.csv +++ b/data/examples/all_stations.csv @@ -1,4 +1,4 @@ -Endhaltestelle,ID,geo_lat,geo_long,elevation,pv_area,pv_type,pv_kwp +Endhaltestelle,ID,geo_lat,geo_long,elevation,pv_area,pv_type,pv_kwp; Station-0,,,,0,,, Station-1,,,,0,,, Station-2,,,,0,,, diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 580645e8..c055c3ce 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,5 +1,5 @@ import json - +import warnings def set_options_from_config(args, check=False, verbose=True): """Read options from config file, update given args, try to parse options @@ -112,41 +112,34 @@ def get_csv_delim(path, other_delims=set()): # create union of default and optional other delimiters possible_delims = {",", ";", "\t"}.union(other_delims) - # create a dict which counts the occurances of the delimiter per row - counters = {delim: list() for delim in possible_delims} + # create a dict which counts the occurrences of the delimiter per row + with open(path, "r") as f: + # count delims in first line + line = f.readline() + counters = {d: line.count(d) for d in possible_delims if line.count(d) > 0} for line_nr, line in enumerate(f): - - # for every delimiter in the dictionary - for delim in counters.keys(): + # for every delimiter in the dictionary. Casting to set creates new instance + # needed in case of counter changing during the iteration. + possible_delims = set(counters.keys()) + for delim in possible_delims: # Append the list with the counted amount amount = line.count(delim) - counters[delim].append(amount) - - # after the first row - if line_nr > 0: - # for every delimiter in the counters dictionary - keys = set(counters.keys()) - for delim in keys: - # if different amounts of this delimiter were counted from row to row or the - # last amount was 0 - if len(set(counters[delim])) > 1 or counters[delim][-1] == 0: - # remove this delimiter from the dictionary - counters.pop(delim) + if counters[delim] != amount: + del counters[delim] # if only one delimiter is remaining if len(counters) == 1: # take the last item and return the key return counters.popitem()[0] - # if not even a single delimiter is remaining - elif len(counters) < 1: - print("Warning: Delimiter could not be found.\n" - "returning standard Delimiter ','") + elif not counters: + warnings.warn("Warning: Delimiter could not be found.\n" + "Returning standard Delimiter ','", stacklevel=100) return "," # multiple delimiters are possible. Every row was checked but more than 1 delimiter - # has the same amount of occurences (>0) in every row. - print("Warning: Delimiter could not be found.\n" - "returning standard Delimiter ','") + # has the same amount of occurrences (>0) in every row. + warnings.warn("Warning: Delimiter could not be found.\n" + "Returning standard Delimiter ','", stacklevel=100) return "," From f1bb173b59d2b64db8cb952a1f905060df7a32a1 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Oct 2022 16:30:32 +0200 Subject: [PATCH 291/802] Make flake8 happy and fix comment --- ebus_toolbox/util.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index c055c3ce..4bff6bce 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,6 +1,7 @@ import json import warnings + def set_options_from_config(args, check=False, verbose=True): """Read options from config file, update given args, try to parse options , ignore comment lines (begin with #) @@ -118,13 +119,16 @@ def get_csv_delim(path, other_delims=set()): # count delims in first line line = f.readline() counters = {d: line.count(d) for d in possible_delims if line.count(d) > 0} + + # count delims in all following lines, rejecting those with different count than before for line_nr, line in enumerate(f): # for every delimiter in the dictionary. Casting to set creates new instance # needed in case of counter changing during the iteration. possible_delims = set(counters.keys()) for delim in possible_delims: - # Append the list with the counted amount + # compare the counted amount with the first row values amount = line.count(delim) + # delete the counter if its different to the first row if counters[delim] != amount: del counters[delim] # if only one delimiter is remaining From 72de0937d5c13f3352956d41d95be928e5d4b5ee Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 26 Oct 2022 11:34:48 +0200 Subject: [PATCH 292/802] Fix some uppercase comments --- data/examples/all_stations.csv | 2 +- ebus_toolbox/schedule.py | 2 +- ebus_toolbox/trip.py | 4 ++-- ebus_toolbox/util.py | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/examples/all_stations.csv b/data/examples/all_stations.csv index 22f1c8a6..b2903b89 100644 --- a/data/examples/all_stations.csv +++ b/data/examples/all_stations.csv @@ -1,4 +1,4 @@ -Endhaltestelle,ID,geo_lat,geo_long,elevation,pv_area,pv_type,pv_kwp; +Endhaltestelle,ID,geo_lat,geo_long,elevation,pv_area,pv_type,pv_kwp Station-0,,,,0,,, Station-1,,,,0,,, Station-2,,,,0,,, diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index dac927a3..dda4e4ab 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -92,7 +92,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): trip_reader = csv.DictReader(trips_file) for trip in trip_reader: rotation_id = trip['rotation_id'] - # Trip gets reference to station data and calculates height diff during Trip + # trip gets reference to station data and calculates height diff during trip # initialization. Could also get the height difference from here on trip["station_data"] = station_data if rotation_id not in schedule.rotations.keys(): diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index cb6feee7..67719828 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -21,8 +21,8 @@ def __init__(self, rotation, departure_time, departure_name, height_diff = 0 self.height_diff = height_diff self.level_of_loading = None - # Mean Speed in km/h from distance and travel time or from initialization - # Travel time is at least 1 min + # mean speed in km/h from distance and travel time or from initialization + # travel time is at least 1 min mean_speed = kwargs.get("mean_speed", (self.distance / 1000) / max(1 / 60, ((self.arrival_time - self.departure_time) / timedelta( hours=1)))) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 4bff6bce..b1bf6f29 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -116,11 +116,11 @@ def get_csv_delim(path, other_delims=set()): # create a dict which counts the occurrences of the delimiter per row with open(path, "r") as f: - # count delims in first line + # count delimiters in first line line = f.readline() counters = {d: line.count(d) for d in possible_delims if line.count(d) > 0} - # count delims in all following lines, rejecting those with different count than before + # count delimiters in all following lines, rejecting those with different count than before for line_nr, line in enumerate(f): # for every delimiter in the dictionary. Casting to set creates new instance # needed in case of counter changing during the iteration. @@ -128,7 +128,7 @@ def get_csv_delim(path, other_delims=set()): for delim in possible_delims: # compare the counted amount with the first row values amount = line.count(delim) - # delete the counter if its different to the first row + # delete the counter if it is different to the first row if counters[delim] != amount: del counters[delim] # if only one delimiter is remaining @@ -143,7 +143,7 @@ def get_csv_delim(path, other_delims=set()): # multiple delimiters are possible. Every row was checked but more than 1 delimiter # has the same amount of occurrences (>0) in every row. warnings.warn("Warning: Delimiter could not be found.\n" - "Returning standard Delimiter ','", stacklevel=100) + "Returning standard delimiter ','", stacklevel=100) return "," From f603532ab547096fa9ad129a48cfb294f22cec13 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 27 Oct 2022 13:53:28 +0200 Subject: [PATCH 293/802] output file args no longer ignored --- ebus_toolbox/__main__.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 9ba121f8..cd50e862 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -115,9 +115,12 @@ # args.output_directory can be overwritten by config args.output_directory.mkdir(parents=True, exist_ok=True) - args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" - args.save_results = args.output_directory / "simulation_spiceEV.json" - args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" + if not args.save_timeseries: + args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" + if not args.save_results: + args.save_results = args.output_directory / "simulation_spiceEV.json" + if not args.save_soc: + args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" # rename special options args.timing = args.eta From 873f9ce886f92dd710bde2b604a5745657c50ad8 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 27 Oct 2022 14:34:11 +0200 Subject: [PATCH 294/802] implement #55: distinguish desired soc by station type --- data/examples/ebus_toolbox.cfg | 6 ++++-- ebus_toolbox/__main__.py | 6 ++++-- ebus_toolbox/schedule.py | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 0d69250f..c5524cbf 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -42,8 +42,10 @@ station_data_path = "data/examples/all_stations.csv" # maximum number of days to simulate, if not set simulate entire schedule #days = 10 -# set minimum allowed state of charge when leaving (default: 0.8) -desired_soc = 1 +# set minimum allowed state of charge when leaving +# distinguish between depot and opportunity station +desired_soc_deps = 1.0 +desired_soc_opps = 0.8 # Preferred charging type. Options: depb, oppb (default: oppb) preferred_charging_type = "depb" diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index cd50e862..98257c06 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -28,8 +28,10 @@ help='set duration of scenario as number of days') parser.add_argument('--interval', metavar='MIN', type=int, default=15, help='set number of minutes for each timestep (Δt)') - parser.add_argument('--desired-soc', metavar='SOC', type=float, default=0.8, - help='set minimum desired SOC (0 - 1) for each charging process') + parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, + help='set minimum desired SOC (0 - 1) for depot charging') + parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=0.8, + help='set minimum desired SOC (0 - 1) for opportunity charging') parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=None, help='max power of grid connector at opp stations') parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=None, diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 04b26efe..10975083 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -382,8 +382,8 @@ def generate_scenario(self, args): # a depot bus cannot charge at an opp station station_type = None else: - # at opp station, always try to charge as much as you can - desired_soc = 1 if station_type == "opps" else args.desired_soc + # get desired soc by station type + desired_soc = vars(args).get("desired_soc_" + station_type) except KeyError: # non-electrified station station_type = None @@ -443,7 +443,7 @@ def generate_scenario(self, args): "connected_charging_station": None, "estimated_time_of_departure": trip.departure_time.isoformat(), "desired_soc": None, - "soc": args.desired_soc, + "soc": args.desired_soc_deps, "vehicle_type": f"{trip.rotation.vehicle_type}_{trip.rotation.charging_type}" } From 7216ef1253ababf80053a7cb7e0f461d345d0e17 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 27 Oct 2022 14:57:16 +0200 Subject: [PATCH 295/802] implement #44: enable comments in input JSON files --- ebus_toolbox/simulate.py | 9 ++++----- ebus_toolbox/util.py | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index d3ad1597..00c6de75 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,10 +1,9 @@ # imports -import json from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip from ebus_toolbox.costs import calculate_costs -from ebus_toolbox import report, optimization +from ebus_toolbox import report, optimization, util def simulate(args): @@ -18,7 +17,7 @@ def simulate(args): # load vehicle types try: with open(args.vehicle_types) as f: - vehicle_types = json.load(f) + vehicle_types = util.uncomment_json_file(f) del args.vehicle_types except FileNotFoundError: raise SystemExit(f"Path to vehicle types ({args.vehicle_types}) " @@ -27,7 +26,7 @@ def simulate(args): # load stations file try: with open(args.electrified_stations) as f: - stations = json.load(f) + stations = util.uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to electrified stations ({args.electrified_stations}) " "does not exist. Exiting...") @@ -36,7 +35,7 @@ def simulate(args): if args.cost_params is not None: try: with open(args.cost_params) as f: - cost_params = json.load(f) + cost_params = util.uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to cost parameters ({args.cost_params}) " "does not exist. Exiting...") diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index b1bf6f29..5ac186ac 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -97,6 +97,30 @@ def get_buffer_time(trip, default=0): return buffer_time +def uncomment_json_file(f, char='#'): + """ + Remove comments from JSON file. + + Wouldn't it be nice to have comments in JSON data? Now you can! + Both full-line comments and trailing lines are supported. + :param f: file to read + :type f: JSON file handle + :param char: char used for commenting, defaults to # + :type char: char + :return: JSON file content + :rtype: dict + """ + uncommented_data = "" + for line in f: + try: + comment_idx = line.index(char) + uncommented_data += line[:comment_idx] + except ValueError: + # no comment in line + uncommented_data += line + return json.loads(uncommented_data) + + def get_csv_delim(path, other_delims=set()): """ Get the delimiter of a character separated file. Checks the file for ",", "tabulator" and ";" as well as optional other characters From 920efc672d6f3e081c10a145da5311d3d828e566 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 27 Oct 2022 15:31:49 +0200 Subject: [PATCH 296/802] Schedule.csv: check trip assumptions --- ebus_toolbox/schedule.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 10975083..8d5579bb 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -109,6 +109,40 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): if rot.charging_type is None: rot.set_charging_type(ct=kwargs.get('preferred_charging_type', 'oppb')) + """ + check expectations, such as + - each rotation has one "Einsetzfahrt" + - each rotation has one "Aussetzfahrt" + - the "Einsatzfahrt" starts where the "Aussetzfahrt" ends + - the rotation name is unique + - every trip within a rotation starts where the previous trip ended + """ + for rot_id, rotation in schedule.rotations.items(): + # iterate over trips, looking for initial and final stations + dep_name = None + arr_name = None + prev_station_name = None + try: + for trip in rotation.trips: + if trip.line == "Einsetzfahrt": + # must have exactly one "Einsetzfahrt" + assert dep_name is None, "Einsetzfahrt encountered mutliple times" + dep_name = trip.departure_name + if trip.line == "Aussetzfahrt": + # must have exactly one "Aussetzfahrt" + assert arr_name is None, "Aussetzfahrt encountered multiple times" + arr_name = trip.arrival_name + if prev_station_name is not None: + # must depart from the previous station + assert trip.departure_name == prev_station_name, "Wrong departure station" + prev_station_name = trip.arrival_name + # must have exactly one "Einsetzfahrt" and "Aussetzfahrt" + assert dep_name is not None and arr_name is not None, "No Ein- or Aussetzfahrt" + # rotation must end where it started + assert dep_name == arr_name, "Start and end of rotation differ" + except AssertionError as e: + print(f"Rotation {rot_id}: {e}") + return schedule def run(self, args): From abc6488963a24a19999df59f7cfe9376abc8538b Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 2 Nov 2022 10:44:27 +0100 Subject: [PATCH 297/802] add options for schedule checking check_rotation_consistency: general check, faulty rotations are printed and written to file ignore_inconsistent_rotations: remove rotations that violate assumptions --- data/examples/ebus_toolbox.cfg | 5 +++++ ebus_toolbox/__main__.py | 4 ++++ ebus_toolbox/schedule.py | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index c5524cbf..0acc0b51 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -37,6 +37,11 @@ signal_time_dif = 10 # Path to station data with stations heights and possibly more information station_data_path = "data/examples/all_stations.csv" +# Check rotation assumptions when building schedule? +check_rotation_consistency = false +# Remove rotations from schedule that violate assumptions? Needs check_rotation_consistency to have an effect +ignore_inconsistent_rotations = false + ##### SIMULATION CONDITIONS AND BOUNDARIES ##### # maximum number of days to simulate, if not set simulate entire schedule diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 98257c06..29772a85 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -24,6 +24,10 @@ help='Minimum fraction of capacity for recharge when leaving the depot.') parser.add_argument('--min-recharge-deps-depb', default=1, help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--check-rotation-consistency', action='store_true', + help='Check rotation assumptions when building schedule.') + parser.add_argument('--ignore-inconsistent-rotations', action='store_true', + help='Remove rotations from schedule that violate assumptions. ') parser.add_argument('--days', metavar='N', type=int, default=None, help='set duration of scenario as number of days') parser.add_argument('--interval', metavar='MIN', type=int, default=15, diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 8d5579bb..f9360922 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -109,14 +109,39 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): if rot.charging_type is None: rot.set_charging_type(ct=kwargs.get('preferred_charging_type', 'oppb')) + if kwargs.get("check_rotation_consistency"): + # check rotation expectations + ignored_rotations = cls.check_consistency(schedule) + if ignored_rotations: + # write errors to file + with open(kwargs["output_directory"] / "removed_rotations.csv", "w") as f: + for rot_id, e in ignored_rotations.items(): + f.write(f"Rotation {rot_id}: {e}\n") + print(f"Rotation {rot_id}: {e}") + if kwargs.get("ignore_inconsistent_rotations"): + # remove this rotation from schedule + del schedule.rotations[rot_id] + elif kwargs.get("ignore_inconsistent_rotations"): + warnings.warn("Option ignore_inconsistent_rotations ignored, " + "as check_rotation_consistency is not set") + + return schedule + + def check_consistency(schedule): """ - check expectations, such as + Check rotation expectations, such as - each rotation has one "Einsetzfahrt" - each rotation has one "Aussetzfahrt" - the "Einsatzfahrt" starts where the "Aussetzfahrt" ends - the rotation name is unique - every trip within a rotation starts where the previous trip ended + + :param schedule: the schedule to check + :type schedule: dict + :return: faulty rotations. Dict of rotation ID -> error message + :rtype: dict """ + ignored_rotations = {} for rot_id, rotation in schedule.rotations.items(): # iterate over trips, looking for initial and final stations dep_name = None @@ -141,9 +166,11 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): # rotation must end where it started assert dep_name == arr_name, "Start and end of rotation differ" except AssertionError as e: - print(f"Rotation {rot_id}: {e}") + # some assumption is violated + # save error text + ignored_rotations[rot_id] = e - return schedule + return ignored_rotations def run(self, args): # each rotation is assigned a vehicle ID From ec26d2f8e4bce4ecc34a70c3ab0ccdfe136ab054 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 2 Nov 2022 10:56:15 +0100 Subject: [PATCH 298/802] make flake8 happy --- ebus_toolbox/schedule.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index f9360922..55b0ebbb 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -127,7 +127,8 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): return schedule - def check_consistency(schedule): + @classmethod + def check_consistency(cls, schedule): """ Check rotation expectations, such as - each rotation has one "Einsetzfahrt" From 7874d402e572ffc993d3ebeb92b72ed01c67e331 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 3 Nov 2022 09:07:43 +0100 Subject: [PATCH 299/802] rename removed rotations to inconsistent rotations --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 55b0ebbb..3be33792 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -114,7 +114,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): ignored_rotations = cls.check_consistency(schedule) if ignored_rotations: # write errors to file - with open(kwargs["output_directory"] / "removed_rotations.csv", "w") as f: + with open(kwargs["output_directory"] / "inconsistent_rotations.csv", "w") as f: for rot_id, e in ignored_rotations.items(): f.write(f"Rotation {rot_id}: {e}\n") print(f"Rotation {rot_id}: {e}") From d830ebbf0c65bc46cf2fe7fab44e1686bb37c1a1 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 3 Nov 2022 15:10:31 +0100 Subject: [PATCH 300/802] hotfix energy consumption and rearrange lines in config --- data/examples/ebus_toolbox.cfg | 6 +++--- data/examples/energy_consumption_example.csv | 2 +- ebus_toolbox/consumption.py | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 0acc0b51..671e2cca 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -17,6 +17,9 @@ vehicle_types = "./data/examples/vehicle_types.json" # cost parameters (Calculation of costs is optional, defaults to None) cost_params = "./data/examples/cost_params.json" +# Path to station data with stations heights and possibly more information +station_data_path = "data/examples/all_stations.csv" + ##### SIMULATION HYPERPARAMETERS ##### # set random seed (for always random: set seed = null) @@ -34,9 +37,6 @@ interval = 1 # time difference between signal time and actual start time of a vehicle event im min. (default: 10) signal_time_dif = 10 -# Path to station data with stations heights and possibly more information -station_data_path = "data/examples/all_stations.csv" - # Check rotation assumptions when building schedule? check_rotation_consistency = false # Remove rotations from schedule that violate assumptions? Needs check_rotation_consistency to have an effect diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv index ff569e77..c1a60ba8 100644 --- a/data/examples/energy_consumption_example.csv +++ b/data/examples/energy_consumption_example.csv @@ -1,4 +1,4 @@ -vehicle_type,level_of_loading,incline,mean_speed_kmh,temp,consumption_kwh_per_km +vehicle_type,level_of_loading,incline,mean_speed_kmh,t_amb,consumption_kwh_per_km 0,0,-0.04,12.1,-15,2.967 0,0,-0.04,12.1,-5,1.823 0,0,-0.04,12.1,5,0.844 diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 643d28a1..40559af6 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -78,11 +78,10 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem consumption_path = vehicle_info["mileage"] # consumption_files holds interpol functions of csv files which are called directly - vehicle_type_nr = dict(SB=0, VDL=0, AB=1, CKB=1)[vehicle_type] # try to use the interpol function. If it does not exist yet its created in except case. try: - mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type_nr, + mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type, this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, @@ -95,7 +94,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem # which will be the input for the nd lookup vt_col = df["vehicle_type"] inc_col = df["incline"] - tmp_col = df["temp"] + tmp_col = df["t_amb"] lol_col = df["level_of_loading"] speed_col = df["mean_speed_kmh"] cons_col = df["consumption_kwh_per_km"] @@ -107,7 +106,7 @@ def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this self.consumption_files.update({consumption_path: interpol_function}) - mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type_nr, + mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type, this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, From 6ca98c56d19208bd9c477fa965966e0f1f5739da Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Sat, 12 Nov 2022 16:49:15 +0100 Subject: [PATCH 301/802] Combine costs for electricity and investment - included cost calculation of spice_ev for electricity costs - added costs as dict to scenario object - added photovoltaics with feed-in name and power at gc as constants to scenario object - added necessary cost parameters to cfg file - added arguments to main - added cost parameters for electricity in cost_params.json - adjusted names of default vehicles in cost_params.json - print costs - report now writes a summary_costs.csv --- data/examples/cost_params.json | 113 ++++++++++++++++++++++- data/examples/ebus_toolbox.cfg | 14 ++- ebus_toolbox/__main__.py | 10 +- ebus_toolbox/costs.py | 164 +++++++++++++++++++++------------ ebus_toolbox/report.py | 12 +++ ebus_toolbox/schedule.py | 15 ++- ebus_toolbox/simulate.py | 18 ++-- 7 files changed, 265 insertions(+), 81 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 0a2757a6..05152f57 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -1,16 +1,16 @@ { "vehicles": { - "SB": { + "SB_depb": { "capex": 420000, - "c_maint_per_km": 0.24, - "lifetime": 14 + "c_maint_per_km": 0.24, + "lifetime": 14 }, - "AB": { + "AB_depb": { "capex": 600000, "c_maint_per_km": 0.3, "lifetime": 14 }, - "CKB": { + "AB_oppb": { "capex": 600000, "c_maint_per_km": 0.3, "lifetime": 14 @@ -43,5 +43,108 @@ "vehicles_per_workstation": 20, "cost_per_workstation": 245000, "lifetime_workstations": 20 + }, + "grid_fee":{ + "SLP": { + "basic_charge_EUR/a": { + "net_price": 65.7, + "gross_price": 78.18, + "unit": "EUR/a", + "info": "basic charge for SLP (standard load profile) customers." + }, + "commodity_charge_ct/kWh": { + "net_price": 7.48, + "gross_price": 8.9, + "unit": "ct/kWh", + "info": "commodity costs for SLP (standard load profile) customers" + } + }, + "RLM": { + "<2500_h/a": { + "capacity_charge_EUR/kW*a": { + "HV": 19.13, + "HV/MV": 25.25, + "MV": 41.06, + "MV/LV": 44.26, + "LV": 44.26, + "unit": "EUR/(kW*a)", + "info": ["capacity charge depending on the voltage level for RLM", + "(Registrierende Leistungsmessung, engl.: consumption metering) customers with", + "annual utilization time < 2500 h/a"] + }, + "commodity_charge_ct/kWh": { + "HV": 2.3, + "HV/MV": 3.81, + "MV": 3.49, + "MV/LV": 4.39, + "LV": 4.83, + "unit": "ct/kWh", + "info": ["commodity charge depending on the voltage level for RLM", + "(Registrierende Leistungsmessung, engl.: consumption metering) customers with", + "annual utilization time < 2500 h/a"] + } + }, + ">=2500_h/a": { + "capacity_charge_EUR/kW*a": { + "HV": 56.33, + "HV/MV": 101.52, + "MV": 70.14, + "MV/LV": 97.01, + "LV": 64.33, + "unit": "EUR/(kW*a)", + "info": ["capacity charge depending on the voltage level for RLM customers with", + "annual utilization time >= 2500 h/a"] + }, + "commodity_charge_ct/kWh": { + "HV": 0.81, + "HV/MV": 0.76, + "MV": 2.32, + "MV/LV": 2.28, + "LV": 4.03, + "unit": "ct/kWh", + "info": ["commodity charge depending on the voltage level for RLM customers with", + "annual utilization time >= 2500 h/a"] + } + }, + "additional_costs": { + "costs": 0, + "unit": "EUR", + "info": "additional costs for RLM customers per year (f.i. costs for metering point operation)" + } + } + }, + "power_procurement": { + "charge": 7.7, + "unit": "ct/kWh", + "info": "charge for power generation, power procurement and sales" + }, + "levies": { + "EEG-levy": 0, + "chp_levy": 0.378, + "individual_charge_levy": 0.437, + "offshore_levy": 0.419, + "interruptible_loads_levy": 0.003, + "unit": "ct/kWh", + "info": ["levies on energy supplied from the power grid"] + }, + "concession_fee": { + "charge": 1.32, + "unit": "ct/kWh", + "info": "concession fee depending on the tariff and the size of the municipality" + }, + "taxes": { + "value_added_tax": 19, + "tax_on_electricity": 2.05, + "unit": "value added tax: %, tax on electricity: ct/kWh", + "info": "taxes on energy supplied from the power grid" + }, + "feed-in_remuneration": { + "PV": { + "kWp": [10, 40, 100], + "remuneration": [6.24, 6.06, 4.74] + }, + "V2G": 0, + "unit": "ct/kWh", + "info": "remuneration for power fed into the grid by PV power plants or electric vehicles" } } \ No newline at end of file diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 671e2cca..3ff80289 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -14,13 +14,21 @@ electrified_stations = "data/examples/electrified_stations.json" # vehicle types (defaults to: ./data/examples/vehicle_types.json) vehicle_types = "./data/examples/vehicle_types.json" -# cost parameters (Calculation of costs is optional, defaults to None) -cost_params = "./data/examples/cost_params.json" - # Path to station data with stations heights and possibly more information station_data_path = "data/examples/all_stations.csv" +##### COST CALCULATION ##### +# set flag for cost calculation: +cost_calculation = true +# cost parameters (Calculation of costs is optional, defaults to None) +cost_params = "./data/examples/cost_params.json" +# set voltage level for cost calculation (possible voltage levels: LV, MV, HV) +voltage_level = MV +# set nominal power of photovoltaic power plant in kW (necessary for feed-in remuneration) +pv_power = 100 + + ##### SIMULATION HYPERPARAMETERS ##### # set random seed (for always random: set seed = null) seed = 1 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 29772a85..4828b5e2 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -8,7 +8,7 @@ description='eBus-Toolbox - \ simulation program for electric bus fleets.') parser.add_argument('--input-schedule', nargs='?', - help='Path to CSV file containing all trips of schdedule to be analyzed.') + help='Path to CSV file containing all trips of schedule to be analyzed.') parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], help='Specify what you want to do. Choose one from {sim, \ service_optimization}. sim runs a single simulation with the given inputs. \ @@ -73,8 +73,12 @@ '2018-01-31') parser.add_argument('--electrified-stations', help='include electrified_stations json', default='data/examples/electrified_stations.json') - parser.add_argument('--cost-params', help='include cost_params json', - default=None) + parser.add_argument('--cost-calculation', '-cc', action='store_true', + help='Calculate costs') + parser.add_argument('--cost-parameters-file', help='include cost_params json', default=None) + parser.add_argument('--voltage-level', '-vl', help='choose voltage level for cost calculation') + parser.add_argument('--pv-power', type=int, default=0, help='set nominal power for local ' + 'photovoltaic power plant in kWp') parser.add_argument('--min-charging-time', help='define minimum time of charging', default=2) parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 25c7be52..84103953 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,45 +1,53 @@ -def calculate_costs(c_params, schedule): +import os +from calculate_costs import calculate_costs as calc_costs_spice_ev + + +def calculate_costs(c_params, scenario, schedule, args): """ Calculates annual costs of all necessary vehicles and infrastructure. :param c_params: Cost of various infrastructure components. :type c_params: dict + :param scenario: Information about the simulated scenario and all used parameters. + :type scenario: object :param schedule: Information about the whole bus schedule and all used parameters. :type schedule: object - :return: Investment cost [€], annual investment cost [€/a], annual maintenance cost [€/a] - :rtype: dict + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + :return: scenario + :rtype: object """ - # general settings and imports for calculation - ROUND_TO_PLACES = 2 + + # initialize dictionary with all costs + costs = {"c_vehicles": 0, "c_vehicles_annual": 0, "c_gcs": 0, "c_gcs_annual": 0, "c_cs": 0, + "c_cs_annual": 0, "c_garage_cs": 0, "c_garage_workstations": 0, "c_garage": 0, + "c_garage_annual": 0, "c_invest": 0, "c_invest_annual": 0, + "c_maint_infrastructure_annual": 0, "c_maint_vehicles_annual": 0, "c_maint_annual": 0, + "c_el_procurement_annual": 0, "c_el_power_price": 0, "c_el_energy_price_annual": 0, + "c_el_taxes_annual": 0, "c_el_feed_in_remuneration_annual": 0, + "c_electricity_annual": 0} + + ##### INVESTMENT COSTS ##### # VEHICLES - c_vehicles = 0 - c_vehicles_annual = 0 v_types = schedule.scenario["constants"]["vehicle_types"] for v_type, v_keys in v_types.items(): if schedule.vehicle_type_counts[v_type] > 0: try: - costs_vehicle = c_params["vehicles"][v_type.split("_")[0]]["capex"] - # future solution -> costs_vehicle= c_params["vehicles"][v_type]["capex"] + costs_vehicle = c_params["vehicles"][v_type]["capex"] except KeyError: - print("Warning: No capex defined for vehicle type " + v_type.split("_")[0] + + print("Warning: No capex defined for vehicle type " + v_type + ". Unable to calculate investment costs for this vehicle type.") continue # sum up cost of vehicles and their batteries, depending on how often the battery # has to be replaced in the lifetime of the vehicles c_vehicles_vt = schedule.vehicle_type_counts[v_type] * \ - (costs_vehicle + - (c_params["vehicles"][v_type.split("_")[0]]["lifetime"] - // c_params["batteries"]["lifetime_battery"]) * - v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) - c_vehicles += c_vehicles_vt + (costs_vehicle + (c_params["vehicles"][v_type]["lifetime"] // + c_params["batteries"]["lifetime_battery"]) * + v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) + costs["c_vehicles"] += c_vehicles_vt # calculate annual cost of vehicles of this type, depending on their lifetime - c_vehicles_annual += round(c_vehicles_vt / - c_params["vehicles"][v_type.split("_")[0]]["lifetime"], - ROUND_TO_PLACES) - + costs["c_vehicles_annual"] += c_vehicles_vt / c_params["vehicles"][v_type]["lifetime"] # GRID CONNECTION POINTS - c_gcs = 0 - c_gcs_annual = 0 gcs = schedule.scenario["constants"]["grid_connectors"] for gcID, gc_keys in gcs.items(): try: @@ -51,57 +59,97 @@ def calculate_costs(c_params, schedule): c_params["gc"]["capex_gc_per_meter"] * distance_transformer) c_transformer = (c_params["gc"]["capex_transformer_fix"] + c_params["gc"]["capex_transformer_per_kW"] * gc_keys["max_power"]) - c_gcs += c_gc + c_transformer - - # calculate annual costs of grid connectors, depending the lifetime of gc and transformator - c_gcs_annual += round(c_gc / c_params["gc"]["lifetime_gc"] + - c_transformer / c_params["gc"]["lifetime_transformer"], - ROUND_TO_PLACES) + costs["c_gcs"] += c_gc + c_transformer + # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + + c_transformer / c_params["gc"]["lifetime_transformer"]) # CHARGING INFRASTRUCTURE - c_cs = 0 cs = schedule.scenario["constants"]["charging_stations"] for csID in cs.values(): if csID["type"] == "deps": - c_cs += c_params["cs"]["capex_deps_per_kW"] * csID["max_power"] + costs["c_cs"] += c_params["cs"]["capex_deps_per_kW"] * csID["max_power"] elif csID["type"] == "opps": - c_cs += c_params["cs"]["capex_opps_per_kW"] * csID["max_power"] - # calculate annual cost of charging stations, depending on their lifetime - c_cs_annual = round(c_cs / c_params["cs"]["lifetime_cs"], ROUND_TO_PLACES) + costs["c_cs"] += c_params["cs"]["capex_opps_per_kW"] * csID["max_power"] + # Calculate annual cost of charging stations, depending on their lifetime + costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] # GARAGE - c_garage_cs = (c_params["garage"]["n_charging_stations"] * c_params["garage"]["power_cs"] * - c_params["cs"]["capex_deps_per_kW"]) - c_garage_workstations = -(-sum(schedule.vehicle_type_counts.values()) // - c_params["garage"]["vehicles_per_workstation"] * - c_params["garage"]["cost_per_workstation"]) - c_garage = c_garage_cs + c_garage_workstations - c_garage_annual = round(c_garage_cs / c_params["cs"]["lifetime_cs"] - + c_garage_workstations / c_params["garage"]["lifetime_workstations"], - ROUND_TO_PLACES) + costs["c_garage_cs"] = (c_params["garage"]["n_charging_stations"] * + c_params["garage"]["power_cs"] * c_params["cs"]["capex_deps_per_kW"]) + costs["c_garage_workstations"] = -(-sum(schedule.vehicle_type_counts.values()) // + c_params["garage"]["vehicles_per_workstation"] * + c_params["garage"]["cost_per_workstation"]) + costs["c_garage"] = costs["c_garage_cs"] + costs["c_garage_workstations"] + costs["c_garage_annual"] = (costs["c_garage_cs"] / c_params["cs"]["lifetime_cs"] + + costs["c_garage_workstations"] / + c_params["garage"]["lifetime_workstations"]) # MAINTENANCE - m_infra = (c_cs * c_params["cs"]["c_maint_cs_per_year"] + - c_transformer * c_params["gc"]["c_maint_transformer_per_year"]) - m_vehicles = 0 + costs["c_maint_infrastructure_annual"] = (costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] + + c_transformer * + c_params["gc"]["c_maint_transformer_per_year"]) # calculate (ceil) number of days in scenario drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * schedule.scenario["scenario"]["interval"]) // (24 * 60)) for rot in schedule.rotations.values(): + v_type_rot = f"{rot.vehicle_type}_{rot.charging_type}" try: - m_vehicles += (rot.distance / 1000 / drive_days * 365) * \ - c_params["vehicles"][rot.vehicle_type]["c_maint_per_km"] + costs["c_maint_vehicles_annual"] += (rot.distance / 1000 / drive_days * 365) * \ + c_params["vehicles"][v_type_rot]["c_maint_per_km"] except KeyError: - print("Warning: No maintanance costs defined for vehicle type " + - c_params["vehicles"][rot.vehicle_type] + - ". Unable to calculate maintanance costs for this vehicle type.") + print("Warning: No maintenance costs defined for vehicle type " + + c_params["vehicles"][v_type_rot] + + ". Unable to calculate maintenance costs for this vehicle type.") + costs["c_maint_annual"] = (costs["c_maint_infrastructure_annual"] + + costs["c_maint_vehicles_annual"]) + costs["c_invest"] = costs["c_vehicles"] + costs["c_cs"] + costs["c_gcs"] + costs["c_garage"] + costs["c_invest_annual"] = (costs["c_vehicles_annual"] + costs["c_cs_annual"] + + costs["c_gcs_annual"] + costs["c_garage_annual"]) + + ##### ELECTRICITY COSTS ##### + for gcID, gc in scenario.constants.grid_connectors.items(): + pv = sum([pv.nominal_power for pv in scenario.constants.photovoltaics.values() + if pv.parent == gcID]) + timeseries = vars(scenario).get(f"{gcID}_timeseries") + + # add GC name to results file for cost calculation + file_name, ext = os.path.splitext(args.save_results) + save_results = f"{file_name}_{gcID}{ext}" + + # calculate costs for electricity + costs_electricity = calc_costs_spice_ev( + strategy=args.strategy, + voltage_level=args.voltage_level, + interval=scenario.interval, + timestamps_list=timeseries.get("time"), + power_grid_supply_list=timeseries.get("grid power [kW]"), + price_list=timeseries.get("price [EUR/kWh]"), + power_fix_load_list=timeseries.get("ext.load [kW]"), + charging_signal_list=timeseries.get("window"), + core_standing_time_dict=scenario.core_standing_time, + price_sheet_json=args.cost_parameters_file, + results_json=save_results, + power_pv_nominal=pv, + ) + print(f"Costs for electricity at {gcID}: {costs_electricity['total_costs_per_year']} €/a") + costs["c_el_procurement_annual"] += costs_electricity['power_procurement_per_year'] + costs["c_el_power_price"] += costs_electricity['capacity_costs_eur'] + costs["c_el_energy_price_annual"] += costs_electricity['commodity_costs_eur_per_year'] + costs["c_el_taxes_annual"] += costs_electricity['levies_fees_and_taxes_per_year'] + costs["c_el_feed_in_remuneration_annual"] += costs_electricity[ + 'feed_in_remuneration_per_year'] + costs["c_electricity_annual"] += costs_electricity['total_costs_per_year'] + + # round all costs to ct + for key, v in costs.items(): + costs[key] = round(v, 2) - c_maintenance_annual = round(m_infra + m_vehicles, ROUND_TO_PLACES) - c_invest = c_vehicles + c_cs + c_gcs + c_garage - c_invest_annual = round(c_vehicles_annual + c_cs_annual + c_gcs_annual + c_garage_annual, - ROUND_TO_PLACES) + print(f"\n" + f"Total costs: \n" + f"Investment cost: {costs['c_invest']} €. " + f"Annual investment costs: {costs['c_invest_annual']} €/a. " + f"Annual maintenance costs: {costs['c_maint_annual']} €/a. " + f"Annual costs for electricity: {costs['c_electricity_annual']} €/a.") - return { - "c_invest": c_invest, - "c_invest_annual": c_invest_annual, - "c_maintenance_annual": c_maintenance_annual - } + setattr(scenario, "costs", costs) + return {scenario} diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 18df5dc9..884df19c 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -76,3 +76,15 @@ def generate(schedule, scenario, args): csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) + + # summary of used vehicle types and all costs + with open(args.output_directory / "costs_summary.csv", "w+", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["vehicle type", "number"]) + for key, value in schedule.vehicle_type_counts.items(): + if value > 0: + csv_writer.writerow([key, value]) + csv_writer.writerow(["", ""]) + csv_writer.writerow(["cost parameter", "€"]) + for key, value in scenario.costs.items(): + csv_writer.writerow([key, round(value, 2)]) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 3be33792..b994543e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -389,6 +389,7 @@ def generate_scenario(self, args): vehicles = {} batteries = {} + photovoltaics = {} charging_stations = {} grid_connectors = {} events = { @@ -498,6 +499,17 @@ def generate_scenario(self, args): "cost": {"type": "fixed", "value": 0.3}, "number_cs": number_cs } + # add feed-in name and power at grid connector if exists + if args.include_feed_in_csv: + if gc_name == args.include_feed_in_csv[0][1]: + # ToDo: Make universal! Adjust how to include feed-in timeseries? + # also in SpiceEV? + photovoltaics[gc_name] = { + "parent": gc_name, + "nominal_power": vars(args).get("pv_power", 0) + # ToDo: Allow to set pv_power for specific GC + # (include in include_feed_in_csv as third argument?) + } # initial condition of vehicle if i == 0: @@ -678,7 +690,8 @@ def generate_scenario(self, args): "vehicles": vehicles, "grid_connectors": grid_connectors, "charging_stations": charging_stations, - "batteries": batteries + "batteries": batteries, + "photovoltaics": photovoltaics, }, "events": events } diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 00c6de75..804d8b9c 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -32,12 +32,12 @@ def simulate(args): "does not exist. Exiting...") # load cost parameters - if args.cost_params is not None: + if args.cost_parameters_file is not None: try: - with open(args.cost_params) as f: - cost_params = util.uncomment_json_file(f) + with open(args.cost_parameters_file) as f: + cost_parameters_file = util.uncomment_json_file(f) except FileNotFoundError: - raise SystemExit(f"Path to cost parameters ({args.cost_params}) " + raise SystemExit(f"Path to cost parameters ({args.cost_parameters_file}) " "does not exist. Exiting...") # parse strategy options for Spice EV @@ -80,13 +80,9 @@ def simulate(args): if neg_rot: print(f"Rotations {', '.join(neg_rot)} remain negative.") - if args.cost_params is not None: - # Calculate Costs of Iteration - costs = calculate_costs(cost_params, schedule) - opex_energy_annual = 0 # ToDo: Import annual energy costs from SpiceEV - cost_invest = costs["c_invest"] - cost_annual = costs["c_invest_annual"] + costs["c_maintenance_annual"] + opex_energy_annual - print(f"Investment cost: {cost_invest} €. Total annual cost: {cost_annual} €.") + if args.cost_calculation: + # cost calculation following directly after simulation + calculate_costs(cost_parameters_file, scenario, schedule, args) # create report report.generate(schedule, scenario, args) From 2d0d07683a26c917609488e5712da0bfe7463930 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Sat, 12 Nov 2022 17:00:14 +0100 Subject: [PATCH 302/802] Removed unnecessary comma --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index b994543e..132b2cf7 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -691,7 +691,7 @@ def generate_scenario(self, args): "grid_connectors": grid_connectors, "charging_stations": charging_stations, "batteries": batteries, - "photovoltaics": photovoltaics, + "photovoltaics": photovoltaics }, "events": events } From a2979759250002afbe3bd017c57b72065fd4688a Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Sat, 12 Nov 2022 17:12:59 +0100 Subject: [PATCH 303/802] Make flake8 happy --- ebus_toolbox/costs.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 84103953..a84797cf 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -26,7 +26,7 @@ def calculate_costs(c_params, scenario, schedule, args): "c_el_taxes_annual": 0, "c_el_feed_in_remuneration_annual": 0, "c_electricity_annual": 0} - ##### INVESTMENT COSTS ##### + # INVESTMENT COSTS # # VEHICLES v_types = schedule.scenario["constants"]["vehicle_types"] @@ -40,10 +40,10 @@ def calculate_costs(c_params, scenario, schedule, args): continue # sum up cost of vehicles and their batteries, depending on how often the battery # has to be replaced in the lifetime of the vehicles - c_vehicles_vt = schedule.vehicle_type_counts[v_type] * \ - (costs_vehicle + (c_params["vehicles"][v_type]["lifetime"] // - c_params["batteries"]["lifetime_battery"]) * - v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"]) + c_vehicles_vt = (schedule.vehicle_type_counts[v_type] * + (costs_vehicle + (c_params["vehicles"][v_type]["lifetime"] // + c_params["batteries"]["lifetime_battery"]) * + v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"])) costs["c_vehicles"] += c_vehicles_vt # calculate annual cost of vehicles of this type, depending on their lifetime costs["c_vehicles_annual"] += c_vehicles_vt / c_params["vehicles"][v_type]["lifetime"] @@ -106,7 +106,8 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_invest_annual"] = (costs["c_vehicles_annual"] + costs["c_cs_annual"] + costs["c_gcs_annual"] + costs["c_garage_annual"]) - ##### ELECTRICITY COSTS ##### + # ELECTRICITY COSTS # + for gcID, gc in scenario.constants.grid_connectors.items(): pv = sum([pv.nominal_power for pv in scenario.constants.photovoltaics.values() if pv.parent == gcID]) From b8e17fb223f4c7ae8143643db9de9df2349e880f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 14 Nov 2022 09:52:04 +0100 Subject: [PATCH 304/802] Remove vehicle type from interpolation and assert existance of vehicle type in data table --- data/examples/energy_consumption_example.csv | 4320 +++++++++--------- ebus_toolbox/consumption.py | 16 +- 2 files changed, 2169 insertions(+), 2167 deletions(-) diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv index c1a60ba8..d58f0db4 100644 --- a/data/examples/energy_consumption_example.csv +++ b/data/examples/energy_consumption_example.csv @@ -1,2161 +1,2161 @@ vehicle_type,level_of_loading,incline,mean_speed_kmh,t_amb,consumption_kwh_per_km -0,0,-0.04,12.1,-15,2.967 -0,0,-0.04,12.1,-5,1.823 -0,0,-0.04,12.1,5,0.844 -0,0,-0.04,12.1,15,0.034 -0,0,-0.04,12.1,25,-0.181 -0,0,-0.04,12.1,35,0.314 -0,0,-0.04,18,-15,1.658 -0,0,-0.04,18,-5,0.939 -0,0,-0.04,18,5,0.317 -0,0,-0.04,18,15,-0.208 -0,0,-0.04,18,25,-0.353 -0,0,-0.04,18,35,-0.034 -0,0,-0.04,25.2,-15,0.724 -0,0,-0.04,25.2,-5,0.33 -0,0,-0.04,25.2,5,-0.026 -0,0,-0.04,25.2,15,-0.347 -0,0,-0.04,25.2,25,-0.445 -0,0,-0.04,25.2,35,-0.248 -0,0,-0.04,30,-15,0.476 -0,0,-0.04,30,-5,0.153 -0,0,-0.04,30,5,-0.141 -0,0,-0.04,30,15,-0.408 -0,0,-0.04,30,25,-0.492 -0,0,-0.04,30,35,-0.33 -0,0,-0.04,37.1,-15,0.281 -0,0,-0.04,37.1,-5,0.008 -0,0,-0.04,37.1,5,-0.241 -0,0,-0.04,37.1,15,-0.465 -0,0,-0.04,37.1,25,-0.536 -0,0,-0.04,37.1,35,-0.404 -0,0,-0.03,12.1,-15,3.297 -0,0,-0.03,12.1,-5,2.153 -0,0,-0.03,12.1,5,1.175 -0,0,-0.03,12.1,15,0.365 -0,0,-0.03,12.1,25,0.149 -0,0,-0.03,12.1,35,0.644 -0,0,-0.03,18,-15,1.996 -0,0,-0.03,18,-5,1.277 -0,0,-0.03,18,5,0.654 -0,0,-0.03,18,15,0.13 -0,0,-0.03,18,25,-0.015 -0,0,-0.03,18,35,0.304 -0,0,-0.03,25.2,-15,1.072 -0,0,-0.03,25.2,-5,0.678 -0,0,-0.03,25.2,5,0.321 -0,0,-0.03,25.2,15,0.001 -0,0,-0.03,25.2,25,-0.097 -0,0,-0.03,25.2,35,0.099 -0,0,-0.03,30,-15,0.812 -0,0,-0.03,30,-5,0.489 -0,0,-0.03,30,5,0.195 -0,0,-0.03,30,15,-0.072 -0,0,-0.03,30,25,-0.156 -0,0,-0.03,30,35,0.006 -0,0,-0.03,37.1,-15,0.606 -0,0,-0.03,37.1,-5,0.332 -0,0,-0.03,37.1,5,0.084 -0,0,-0.03,37.1,15,-0.14 -0,0,-0.03,37.1,25,-0.212 -0,0,-0.03,37.1,35,-0.08 -0,0,-0.02,12.1,-15,3.628 -0,0,-0.02,12.1,-5,2.484 -0,0,-0.02,12.1,5,1.505 -0,0,-0.02,12.1,15,0.695 -0,0,-0.02,12.1,25,0.48 -0,0,-0.02,12.1,35,0.974 -0,0,-0.02,18,-15,2.334 -0,0,-0.02,18,-5,1.615 -0,0,-0.02,18,5,0.992 -0,0,-0.02,18,15,0.467 -0,0,-0.02,18,25,0.322 -0,0,-0.02,18,35,0.642 -0,0,-0.02,25.2,-15,1.42 -0,0,-0.02,25.2,-5,1.026 -0,0,-0.02,25.2,5,0.669 -0,0,-0.02,25.2,15,0.349 -0,0,-0.02,25.2,25,0.251 -0,0,-0.02,25.2,35,0.447 -0,0,-0.02,30,-15,1.148 -0,0,-0.02,30,-5,0.826 -0,0,-0.02,30,5,0.531 -0,0,-0.02,30,15,0.264 -0,0,-0.02,30,25,0.18 -0,0,-0.02,30,35,0.342 -0,0,-0.02,37.1,-15,0.93 -0,0,-0.02,37.1,-5,0.657 -0,0,-0.02,37.1,5,0.408 -0,0,-0.02,37.1,15,0.184 -0,0,-0.02,37.1,25,0.113 -0,0,-0.02,37.1,35,0.245 -0,0,-0.01,12.1,-15,3.97 -0,0,-0.01,12.1,-5,2.826 -0,0,-0.01,12.1,5,1.847 -0,0,-0.01,12.1,15,1.036 -0,0,-0.01,12.1,25,0.82 -0,0,-0.01,12.1,35,1.315 -0,0,-0.01,18,-15,2.702 -0,0,-0.01,18,-5,1.982 -0,0,-0.01,18,5,1.358 -0,0,-0.01,18,15,0.833 -0,0,-0.01,18,25,0.687 -0,0,-0.01,18,35,1.005 -0,0,-0.01,25.2,-15,1.8 -0,0,-0.01,25.2,-5,1.406 -0,0,-0.01,25.2,5,1.048 -0,0,-0.01,25.2,15,0.726 -0,0,-0.01,25.2,25,0.627 -0,0,-0.01,25.2,35,0.823 -0,0,-0.01,30,-15,1.541 -0,0,-0.01,30,-5,1.217 -0,0,-0.01,30,5,0.92 -0,0,-0.01,30,15,0.651 -0,0,-0.01,30,25,0.566 -0,0,-0.01,30,35,0.726 -0,0,-0.01,37.1,-15,1.338 -0,0,-0.01,37.1,-5,1.062 -0,0,-0.01,37.1,5,0.81 -0,0,-0.01,37.1,15,0.583 -0,0,-0.01,37.1,25,0.51 -0,0,-0.01,37.1,35,0.639 -0,0,0,12.1,-15,4.356 -0,0,0,12.1,-5,3.211 -0,0,0,12.1,5,2.232 -0,0,0,12.1,15,1.422 -0,0,0,12.1,25,1.206 -0,0,0,12.1,35,1.7 -0,0,0,18,-15,3.099 -0,0,0,18,-5,2.379 -0,0,0,18,5,1.756 -0,0,0,18,15,1.23 -0,0,0,18,25,1.084 -0,0,0,18,35,1.402 -0,0,0,25.2,-15,2.201 -0,0,0,25.2,-5,1.806 -0,0,0,25.2,5,1.448 -0,0,0,25.2,15,1.127 -0,0,0,25.2,25,1.028 -0,0,0,25.2,35,1.223 -0,0,0,30,-15,1.953 -0,0,0,30,-5,1.628 -0,0,0,30,5,1.331 -0,0,0,30,15,1.062 -0,0,0,30,25,0.977 -0,0,0,30,35,1.137 -0,0,0,37.1,-15,1.76 -0,0,0,37.1,-5,1.484 -0,0,0,37.1,5,1.232 -0,0,0,37.1,15,1.006 -0,0,0,37.1,25,0.932 -0,0,0,37.1,35,1.062 -0,0,0.01,12.1,-15,4.742 -0,0,0.01,12.1,-5,3.597 -0,0,0.01,12.1,5,2.618 -0,0,0.01,12.1,15,1.808 -0,0,0.01,12.1,25,1.592 -0,0,0.01,12.1,35,2.087 -0,0,0.01,18,-15,3.497 -0,0,0.01,18,-5,2.777 -0,0,0.01,18,5,2.154 -0,0,0.01,18,15,1.628 -0,0,0.01,18,25,1.482 -0,0,0.01,18,35,1.8 -0,0,0.01,25.2,-15,2.602 -0,0,0.01,25.2,-5,2.207 -0,0,0.01,25.2,5,1.849 -0,0,0.01,25.2,15,1.528 -0,0,0.01,25.2,25,1.429 -0,0,0.01,25.2,35,1.624 -0,0,0.01,30,-15,2.364 -0,0,0.01,30,-5,2.039 -0,0,0.01,30,5,1.743 -0,0,0.01,30,15,1.474 -0,0,0.01,30,25,1.388 -0,0,0.01,30,35,1.548 -0,0,0.01,37.1,-15,2.183 -0,0,0.01,37.1,-5,1.907 -0,0,0.01,37.1,5,1.655 -0,0,0.01,37.1,15,1.428 -0,0,0.01,37.1,25,1.354 -0,0,0.01,37.1,35,1.484 -0,0,0.02,12.1,-15,5.128 -0,0,0.02,12.1,-5,3.983 -0,0,0.02,12.1,5,3.005 -0,0,0.02,12.1,15,2.194 -0,0,0.02,12.1,25,1.978 -0,0,0.02,12.1,35,2.473 -0,0,0.02,18,-15,3.895 -0,0,0.02,18,-5,3.175 -0,0,0.02,18,5,2.551 -0,0,0.02,18,15,2.026 -0,0,0.02,18,25,1.88 -0,0,0.02,18,35,2.198 -0,0,0.02,25.2,-15,3.003 -0,0,0.02,25.2,-5,2.608 -0,0,0.02,25.2,5,2.25 -0,0,0.02,25.2,15,1.928 -0,0,0.02,25.2,25,1.83 -0,0,0.02,25.2,35,2.025 -0,0,0.02,30,-15,2.775 -0,0,0.02,30,-5,2.451 -0,0,0.02,30,5,2.154 -0,0,0.02,30,15,1.885 -0,0,0.02,30,25,1.8 -0,0,0.02,30,35,1.96 -0,0,0.02,37.1,-15,2.606 -0,0,0.02,37.1,-5,2.329 -0,0,0.02,37.1,5,2.078 -0,0,0.02,37.1,15,1.851 -0,0,0.02,37.1,25,1.777 -0,0,0.02,37.1,35,1.907 -0,0,0.03,12.1,-15,5.514 -0,0,0.03,12.1,-5,4.37 -0,0,0.03,12.1,5,3.391 -0,0,0.03,12.1,15,2.58 -0,0,0.03,12.1,25,2.364 -0,0,0.03,12.1,35,2.859 -0,0,0.03,18,-15,4.293 -0,0,0.03,18,-5,3.573 -0,0,0.03,18,5,2.949 -0,0,0.03,18,15,2.424 -0,0,0.03,18,25,2.278 -0,0,0.03,18,35,2.596 -0,0,0.03,25.2,-15,3.405 -0,0,0.03,25.2,-5,3.01 -0,0,0.03,25.2,5,2.652 -0,0,0.03,25.2,15,2.33 -0,0,0.03,25.2,25,2.231 -0,0,0.03,25.2,35,2.427 -0,0,0.03,30,-15,3.187 -0,0,0.03,30,-5,2.862 -0,0,0.03,30,5,2.566 -0,0,0.03,30,15,2.297 -0,0,0.03,30,25,2.211 -0,0,0.03,30,35,2.371 -0,0,0.03,37.1,-15,3.028 -0,0,0.03,37.1,-5,2.752 -0,0,0.03,37.1,5,2.5 -0,0,0.03,37.1,15,2.274 -0,0,0.03,37.1,25,2.2 -0,0,0.03,37.1,35,2.329 -0,0,0.04,12.1,-15,5.9 -0,0,0.04,12.1,-5,4.756 -0,0,0.04,12.1,5,3.777 -0,0,0.04,12.1,15,2.966 -0,0,0.04,12.1,25,2.75 -0,0,0.04,12.1,35,3.245 -0,0,0.04,18,-15,4.691 -0,0,0.04,18,-5,3.971 -0,0,0.04,18,5,3.347 -0,0,0.04,18,15,2.821 -0,0,0.04,18,25,2.676 -0,0,0.04,18,35,2.994 -0,0,0.04,25.2,-15,3.806 -0,0,0.04,25.2,-5,3.411 -0,0,0.04,25.2,5,3.053 -0,0,0.04,25.2,15,2.732 -0,0,0.04,25.2,25,2.633 -0,0,0.04,25.2,35,2.828 -0,0,0.04,30,-15,3.599 -0,0,0.04,30,-5,3.274 -0,0,0.04,30,5,2.977 -0,0,0.04,30,15,2.709 -0,0,0.04,30,25,2.623 -0,0,0.04,30,35,2.783 -0,0,0.04,37.1,-15,3.451 -0,0,0.04,37.1,-5,3.175 -0,0,0.04,37.1,5,2.923 -0,0,0.04,37.1,15,2.696 -0,0,0.04,37.1,25,2.623 -0,0,0.04,37.1,35,2.752 -0,0.3,-0.04,12.1,-15,2.648 -0,0.3,-0.04,12.1,-5,1.504 -0,0.3,-0.04,12.1,5,0.526 -0,0.3,-0.04,12.1,15,-0.284 -0,0.3,-0.04,12.1,25,-0.177 -0,0.3,-0.04,12.1,35,0.373 -0,0.3,-0.04,18,-15,1.4 -0,0.3,-0.04,18,-5,0.682 -0,0.3,-0.04,18,5,0.059 -0,0.3,-0.04,18,15,-0.466 -0,0.3,-0.04,18,25,-0.393 -0,0.3,-0.04,18,35,-0.036 -0,0.3,-0.04,25.2,-15,0.505 -0,0.3,-0.04,25.2,-5,0.111 -0,0.3,-0.04,25.2,5,-0.246 -0,0.3,-0.04,25.2,15,-0.566 -0,0.3,-0.04,25.2,25,-0.508 -0,0.3,-0.04,25.2,35,-0.285 -0,0.3,-0.04,30,-15,0.268 -0,0.3,-0.04,30,-5,-0.054 -0,0.3,-0.04,30,5,-0.349 -0,0.3,-0.04,30,15,-0.616 -0,0.3,-0.04,30,25,-0.569 -0,0.3,-0.04,30,35,-0.385 -0,0.3,-0.04,37.1,-15,0.085 -0,0.3,-0.04,37.1,-5,-0.189 -0,0.3,-0.04,37.1,5,-0.437 -0,0.3,-0.04,37.1,15,-0.661 -0,0.3,-0.04,37.1,25,-0.627 -0,0.3,-0.04,37.1,35,-0.477 -0,0.3,-0.03,12.1,-15,3.025 -0,0.3,-0.03,12.1,-5,1.881 -0,0.3,-0.03,12.1,5,0.902 -0,0.3,-0.03,12.1,15,0.092 -0,0.3,-0.03,12.1,25,0.2 -0,0.3,-0.03,12.1,35,0.75 -0,0.3,-0.03,18,-15,1.786 -0,0.3,-0.03,18,-5,1.067 -0,0.3,-0.03,18,5,0.444 -0,0.3,-0.03,18,15,-0.08 -0,0.3,-0.03,18,25,-0.007 -0,0.3,-0.03,18,35,0.349 -0,0.3,-0.03,25.2,-15,0.901 -0,0.3,-0.03,25.2,-5,0.507 -0,0.3,-0.03,25.2,5,0.151 -0,0.3,-0.03,25.2,15,-0.17 -0,0.3,-0.03,25.2,25,-0.112 -0,0.3,-0.03,25.2,35,0.111 -0,0.3,-0.03,30,-15,0.651 -0,0.3,-0.03,30,-5,0.329 -0,0.3,-0.03,30,5,0.034 -0,0.3,-0.03,30,15,-0.233 -0,0.3,-0.03,30,25,-0.186 -0,0.3,-0.03,30,35,-0.002 -0,0.3,-0.03,37.1,-15,0.455 -0,0.3,-0.03,37.1,-5,0.181 -0,0.3,-0.03,37.1,5,-0.067 -0,0.3,-0.03,37.1,15,-0.292 -0,0.3,-0.03,37.1,25,-0.257 -0,0.3,-0.03,37.1,35,-0.107 -0,0.3,-0.02,12.1,-15,3.402 -0,0.3,-0.02,12.1,-5,2.257 -0,0.3,-0.02,12.1,5,1.279 -0,0.3,-0.02,12.1,15,0.469 -0,0.3,-0.02,12.1,25,0.577 -0,0.3,-0.02,12.1,35,1.127 -0,0.3,-0.02,18,-15,2.171 -0,0.3,-0.02,18,-5,1.452 -0,0.3,-0.02,18,5,0.83 -0,0.3,-0.02,18,15,0.305 -0,0.3,-0.02,18,25,0.378 -0,0.3,-0.02,18,35,0.735 -0,0.3,-0.02,25.2,-15,1.298 -0,0.3,-0.02,25.2,-5,0.904 -0,0.3,-0.02,25.2,5,0.548 -0,0.3,-0.02,25.2,15,0.227 -0,0.3,-0.02,25.2,25,0.285 -0,0.3,-0.02,25.2,35,0.508 -0,0.3,-0.02,30,-15,1.035 -0,0.3,-0.02,30,-5,0.713 -0,0.3,-0.02,30,5,0.418 -0,0.3,-0.02,30,15,0.151 -0,0.3,-0.02,30,25,0.198 -0,0.3,-0.02,30,35,0.382 -0,0.3,-0.02,37.1,-15,0.825 -0,0.3,-0.02,37.1,-5,0.551 -0,0.3,-0.02,37.1,5,0.303 -0,0.3,-0.02,37.1,15,0.078 -0,0.3,-0.02,37.1,25,0.113 -0,0.3,-0.02,37.1,35,0.263 -0,0.3,-0.01,12.1,-15,3.79 -0,0.3,-0.01,12.1,-5,2.646 -0,0.3,-0.01,12.1,5,1.667 -0,0.3,-0.01,12.1,15,0.856 -0,0.3,-0.01,12.1,25,0.964 -0,0.3,-0.01,12.1,35,1.514 -0,0.3,-0.01,18,-15,2.587 -0,0.3,-0.01,18,-5,1.867 -0,0.3,-0.01,18,5,1.243 -0,0.3,-0.01,18,15,0.717 -0,0.3,-0.01,18,25,0.79 -0,0.3,-0.01,18,35,1.145 -0,0.3,-0.01,25.2,-15,1.728 -0,0.3,-0.01,25.2,-5,1.333 -0,0.3,-0.01,25.2,5,0.975 -0,0.3,-0.01,25.2,15,0.653 -0,0.3,-0.01,25.2,25,0.71 -0,0.3,-0.01,25.2,35,0.932 -0,0.3,-0.01,30,-15,1.475 -0,0.3,-0.01,30,-5,1.151 -0,0.3,-0.01,30,5,0.854 -0,0.3,-0.01,30,15,0.585 -0,0.3,-0.01,30,25,0.63 -0,0.3,-0.01,30,35,0.813 -0,0.3,-0.01,37.1,-15,1.278 -0,0.3,-0.01,37.1,-5,1.002 -0,0.3,-0.01,37.1,5,0.75 -0,0.3,-0.01,37.1,15,0.523 -0,0.3,-0.01,37.1,25,0.555 -0,0.3,-0.01,37.1,35,0.703 -0,0.3,0,12.1,-15,4.23 -0,0.3,0,12.1,-5,3.086 -0,0.3,0,12.1,5,2.107 -0,0.3,0,12.1,15,1.296 -0,0.3,0,12.1,25,1.404 -0,0.3,0,12.1,35,1.953 -0,0.3,0,18,-15,3.04 -0,0.3,0,18,-5,2.32 -0,0.3,0,18,5,1.696 -0,0.3,0,18,15,1.17 -0,0.3,0,18,25,1.243 -0,0.3,0,18,35,1.598 -0,0.3,0,25.2,-15,2.185 -0,0.3,0,25.2,-5,1.79 -0,0.3,0,25.2,5,1.432 -0,0.3,0,25.2,15,1.11 -0,0.3,0,25.2,25,1.167 -0,0.3,0,25.2,35,1.389 -0,0.3,0,30,-15,1.944 -0,0.3,0,30,-5,1.619 -0,0.3,0,30,5,1.323 -0,0.3,0,30,15,1.054 -0,0.3,0,30,25,1.099 -0,0.3,0,30,35,1.282 -0,0.3,0,37.1,-15,1.759 -0,0.3,0,37.1,-5,1.483 -0,0.3,0,37.1,5,1.232 -0,0.3,0,37.1,15,1.005 -0,0.3,0,37.1,25,1.037 -0,0.3,0,37.1,35,1.184 -0,0.3,0.01,12.1,-15,4.67 -0,0.3,0.01,12.1,-5,3.526 -0,0.3,0.01,12.1,5,2.547 -0,0.3,0.01,12.1,15,1.737 -0,0.3,0.01,12.1,25,1.844 -0,0.3,0.01,12.1,35,2.394 -0,0.3,0.01,18,-15,3.494 -0,0.3,0.01,18,-5,2.773 -0,0.3,0.01,18,5,2.15 -0,0.3,0.01,18,15,1.624 -0,0.3,0.01,18,25,1.696 -0,0.3,0.01,18,35,2.052 -0,0.3,0.01,25.2,-15,2.642 -0,0.3,0.01,25.2,-5,2.247 -0,0.3,0.01,25.2,5,1.889 -0,0.3,0.01,25.2,15,1.567 -0,0.3,0.01,25.2,25,1.624 -0,0.3,0.01,25.2,35,1.846 -0,0.3,0.01,30,-15,2.413 -0,0.3,0.01,30,-5,2.089 -0,0.3,0.01,30,5,1.792 -0,0.3,0.01,30,15,1.523 -0,0.3,0.01,30,25,1.568 -0,0.3,0.01,30,35,1.751 -0,0.3,0.01,37.1,-15,2.241 -0,0.3,0.01,37.1,-5,1.965 -0,0.3,0.01,37.1,5,1.713 -0,0.3,0.01,37.1,15,1.487 -0,0.3,0.01,37.1,25,1.518 -0,0.3,0.01,37.1,35,1.666 -0,0.3,0.02,12.1,-15,5.111 -0,0.3,0.02,12.1,-5,3.966 -0,0.3,0.02,12.1,5,2.987 -0,0.3,0.02,12.1,15,2.177 -0,0.3,0.02,12.1,25,2.284 -0,0.3,0.02,12.1,35,2.834 -0,0.3,0.02,18,-15,3.947 -0,0.3,0.02,18,-5,3.227 -0,0.3,0.02,18,5,2.604 -0,0.3,0.02,18,15,2.078 -0,0.3,0.02,18,25,2.15 -0,0.3,0.02,18,35,2.506 -0,0.3,0.02,25.2,-15,3.099 -0,0.3,0.02,25.2,-5,2.704 -0,0.3,0.02,25.2,5,2.346 -0,0.3,0.02,25.2,15,2.024 -0,0.3,0.02,25.2,25,2.081 -0,0.3,0.02,25.2,35,2.303 -0,0.3,0.02,30,-15,2.882 -0,0.3,0.02,30,-5,2.558 -0,0.3,0.02,30,5,2.261 -0,0.3,0.02,30,15,1.992 -0,0.3,0.02,30,25,2.037 -0,0.3,0.02,30,35,2.22 -0,0.3,0.02,37.1,-15,2.723 -0,0.3,0.02,37.1,-5,2.447 -0,0.3,0.02,37.1,5,2.195 -0,0.3,0.02,37.1,15,1.969 -0,0.3,0.02,37.1,25,2.001 -0,0.3,0.02,37.1,35,2.148 -0,0.3,0.03,12.1,-15,5.551 -0,0.3,0.03,12.1,-5,4.406 -0,0.3,0.03,12.1,5,3.428 -0,0.3,0.03,12.1,15,2.617 -0,0.3,0.03,12.1,25,2.724 -0,0.3,0.03,12.1,35,3.274 -0,0.3,0.03,18,-15,4.401 -0,0.3,0.03,18,-5,3.681 -0,0.3,0.03,18,5,3.057 -0,0.3,0.03,18,15,2.532 -0,0.3,0.03,18,25,2.604 -0,0.3,0.03,18,35,2.96 -0,0.3,0.03,25.2,-15,3.557 -0,0.3,0.03,25.2,-5,3.162 -0,0.3,0.03,25.2,5,2.804 -0,0.3,0.03,25.2,15,2.482 -0,0.3,0.03,25.2,25,2.539 -0,0.3,0.03,25.2,35,2.761 -0,0.3,0.03,30,-15,3.352 -0,0.3,0.03,30,-5,3.027 -0,0.3,0.03,30,5,2.73 -0,0.3,0.03,30,15,2.462 -0,0.3,0.03,30,25,2.507 -0,0.3,0.03,30,35,2.689 -0,0.3,0.03,37.1,-15,3.205 -0,0.3,0.03,37.1,-5,2.929 -0,0.3,0.03,37.1,5,2.677 -0,0.3,0.03,37.1,15,2.451 -0,0.3,0.03,37.1,25,2.483 -0,0.3,0.03,37.1,35,2.63 -0,0.3,0.04,12.1,-15,5.991 -0,0.3,0.04,12.1,-5,4.847 -0,0.3,0.04,12.1,5,3.868 -0,0.3,0.04,12.1,15,3.057 -0,0.3,0.04,12.1,25,3.165 -0,0.3,0.04,12.1,35,3.714 -0,0.3,0.04,18,-15,4.855 -0,0.3,0.04,18,-5,4.135 -0,0.3,0.04,18,5,3.511 -0,0.3,0.04,18,15,2.985 -0,0.3,0.04,18,25,3.057 -0,0.3,0.04,18,35,3.413 -0,0.3,0.04,25.2,-15,4.015 -0,0.3,0.04,25.2,-5,3.62 -0,0.3,0.04,25.2,5,3.262 -0,0.3,0.04,25.2,15,2.94 -0,0.3,0.04,25.2,25,2.997 -0,0.3,0.04,25.2,35,3.219 -0,0.3,0.04,30,-15,3.821 -0,0.3,0.04,30,-5,3.497 -0,0.3,0.04,30,5,3.2 -0,0.3,0.04,30,15,2.931 -0,0.3,0.04,30,25,2.977 -0,0.3,0.04,30,35,3.159 -0,0.3,0.04,37.1,-15,3.687 -0,0.3,0.04,37.1,-5,3.411 -0,0.3,0.04,37.1,5,3.159 -0,0.3,0.04,37.1,15,2.933 -0,0.3,0.04,37.1,25,2.965 -0,0.3,0.04,37.1,35,3.112 -0,0.6,-0.04,12.1,-15,2.329 -0,0.6,-0.04,12.1,-5,1.185 -0,0.6,-0.04,12.1,5,0.207 -0,0.6,-0.04,12.1,15,-0.413 -0,0.6,-0.04,12.1,25,-0.173 -0,0.6,-0.04,12.1,35,0.433 -0,0.6,-0.04,18,-15,1.143 -0,0.6,-0.04,18,-5,0.424 -0,0.6,-0.04,18,5,-0.198 -0,0.6,-0.04,18,15,-0.594 -0,0.6,-0.04,18,25,-0.432 -0,0.6,-0.04,18,35,-0.038 -0,0.6,-0.04,25.2,-15,0.286 -0,0.6,-0.04,25.2,-5,-0.108 -0,0.6,-0.04,25.2,5,-0.465 -0,0.6,-0.04,25.2,15,-0.689 -0,0.6,-0.04,25.2,25,-0.572 -0,0.6,-0.04,25.2,35,-0.322 -0,0.6,-0.04,30,-15,0.061 -0,0.6,-0.04,30,-5,-0.262 -0,0.6,-0.04,30,5,-0.556 -0,0.6,-0.04,30,15,-0.743 -0,0.6,-0.04,30,25,-0.646 -0,0.6,-0.04,30,35,-0.439 -0,0.6,-0.04,37.1,-15,-0.112 -0,0.6,-0.04,37.1,-5,-0.385 -0,0.6,-0.04,37.1,5,-0.634 -0,0.6,-0.04,37.1,15,-0.795 -0,0.6,-0.04,37.1,25,-0.718 -0,0.6,-0.04,37.1,35,-0.55 -0,0.6,-0.03,12.1,-15,2.752 -0,0.6,-0.03,12.1,-5,1.608 -0,0.6,-0.03,12.1,5,0.63 -0,0.6,-0.03,12.1,15,0.01 -0,0.6,-0.03,12.1,25,0.251 -0,0.6,-0.03,12.1,35,0.856 -0,0.6,-0.03,18,-15,1.576 -0,0.6,-0.03,18,-5,0.857 -0,0.6,-0.03,18,5,0.234 -0,0.6,-0.03,18,15,-0.162 -0,0.6,-0.03,18,25,0.001 -0,0.6,-0.03,18,35,0.395 -0,0.6,-0.03,25.2,-15,0.731 -0,0.6,-0.03,25.2,-5,0.337 -0,0.6,-0.03,25.2,5,-0.02 -0,0.6,-0.03,25.2,15,-0.244 -0,0.6,-0.03,25.2,25,-0.127 -0,0.6,-0.03,25.2,35,0.123 -0,0.6,-0.03,30,-15,0.491 -0,0.6,-0.03,30,-5,0.168 -0,0.6,-0.03,30,5,-0.126 -0,0.6,-0.03,30,15,-0.313 -0,0.6,-0.03,30,25,-0.216 -0,0.6,-0.03,30,35,-0.009 -0,0.6,-0.03,37.1,-15,0.303 -0,0.6,-0.03,37.1,-5,0.03 -0,0.6,-0.03,37.1,5,-0.218 -0,0.6,-0.03,37.1,15,-0.379 -0,0.6,-0.03,37.1,25,-0.303 -0,0.6,-0.03,37.1,35,-0.134 -0,0.6,-0.02,12.1,-15,3.175 -0,0.6,-0.02,12.1,-5,2.031 -0,0.6,-0.02,12.1,5,1.053 -0,0.6,-0.02,12.1,15,0.433 -0,0.6,-0.02,12.1,25,0.674 -0,0.6,-0.02,12.1,35,1.279 -0,0.6,-0.02,18,-15,2.008 -0,0.6,-0.02,18,-5,1.29 -0,0.6,-0.02,18,5,0.667 -0,0.6,-0.02,18,15,0.271 -0,0.6,-0.02,18,25,0.434 -0,0.6,-0.02,18,35,0.828 -0,0.6,-0.02,25.2,-15,1.176 -0,0.6,-0.02,25.2,-5,0.783 -0,0.6,-0.02,25.2,5,0.426 -0,0.6,-0.02,25.2,15,0.202 -0,0.6,-0.02,25.2,25,0.319 -0,0.6,-0.02,25.2,35,0.569 -0,0.6,-0.02,30,-15,0.922 -0,0.6,-0.02,30,-5,0.599 -0,0.6,-0.02,30,5,0.305 -0,0.6,-0.02,30,15,0.118 -0,0.6,-0.02,30,25,0.215 -0,0.6,-0.02,30,35,0.422 -0,0.6,-0.02,37.1,-15,0.719 -0,0.6,-0.02,37.1,-5,0.446 -0,0.6,-0.02,37.1,5,0.197 -0,0.6,-0.02,37.1,15,0.036 -0,0.6,-0.02,37.1,25,0.113 -0,0.6,-0.02,37.1,35,0.281 -0,0.6,-0.01,12.1,-15,3.611 -0,0.6,-0.01,12.1,-5,2.466 -0,0.6,-0.01,12.1,5,1.487 -0,0.6,-0.01,12.1,15,0.867 -0,0.6,-0.01,12.1,25,1.107 -0,0.6,-0.01,12.1,35,1.713 -0,0.6,-0.01,18,-15,2.472 -0,0.6,-0.01,18,-5,1.751 -0,0.6,-0.01,18,5,1.128 -0,0.6,-0.01,18,15,0.731 -0,0.6,-0.01,18,25,0.893 -0,0.6,-0.01,18,35,1.286 -0,0.6,-0.01,25.2,-15,1.655 -0,0.6,-0.01,25.2,-5,1.26 -0,0.6,-0.01,25.2,5,0.902 -0,0.6,-0.01,25.2,15,0.677 -0,0.6,-0.01,25.2,25,0.793 -0,0.6,-0.01,25.2,35,1.042 -0,0.6,-0.01,30,-15,1.409 -0,0.6,-0.01,30,-5,1.085 -0,0.6,-0.01,30,5,0.788 -0,0.6,-0.01,30,15,0.599 -0,0.6,-0.01,30,25,0.695 -0,0.6,-0.01,30,35,0.9 -0,0.6,-0.01,37.1,-15,1.218 -0,0.6,-0.01,37.1,-5,0.941 -0,0.6,-0.01,37.1,5,0.69 -0,0.6,-0.01,37.1,15,0.526 -0,0.6,-0.01,37.1,25,0.601 -0,0.6,-0.01,37.1,35,0.767 -0,0.6,0,12.1,-15,4.104 -0,0.6,0,12.1,-5,2.96 -0,0.6,0,12.1,5,1.981 -0,0.6,0,12.1,15,1.36 -0,0.6,0,12.1,25,1.601 -0,0.6,0,12.1,35,2.206 -0,0.6,0,18,-15,2.98 -0,0.6,0,18,-5,2.26 -0,0.6,0,18,5,1.637 -0,0.6,0,18,15,1.24 -0,0.6,0,18,25,1.401 -0,0.6,0,18,35,1.794 -0,0.6,0,25.2,-15,2.168 -0,0.6,0,25.2,-5,1.773 -0,0.6,0,25.2,5,1.415 -0,0.6,0,25.2,15,1.19 -0,0.6,0,25.2,25,1.306 -0,0.6,0,25.2,35,1.555 -0,0.6,0,30,-15,1.936 -0,0.6,0,30,-5,1.611 -0,0.6,0,30,5,1.314 -0,0.6,0,30,15,1.126 -0,0.6,0,30,25,1.222 -0,0.6,0,30,35,1.426 -0,0.6,0,37.1,-15,1.759 -0,0.6,0,37.1,-5,1.482 -0,0.6,0,37.1,5,1.231 -0,0.6,0,37.1,15,1.067 -0,0.6,0,37.1,25,1.141 -0,0.6,0,37.1,35,1.307 -0,0.6,0.01,12.1,-15,4.599 -0,0.6,0.01,12.1,-5,3.454 -0,0.6,0.01,12.1,5,2.476 -0,0.6,0.01,12.1,15,1.855 -0,0.6,0.01,12.1,25,2.096 -0,0.6,0.01,12.1,35,2.701 -0,0.6,0.01,18,-15,3.49 -0,0.6,0.01,18,-5,2.77 -0,0.6,0.01,18,5,2.146 -0,0.6,0.01,18,15,1.749 -0,0.6,0.01,18,25,1.911 -0,0.6,0.01,18,35,2.304 -0,0.6,0.01,25.2,-15,2.681 -0,0.6,0.01,25.2,-5,2.287 -0,0.6,0.01,25.2,5,1.928 -0,0.6,0.01,25.2,15,1.703 -0,0.6,0.01,25.2,25,1.819 -0,0.6,0.01,25.2,35,2.068 -0,0.6,0.01,30,-15,2.463 -0,0.6,0.01,30,-5,2.138 -0,0.6,0.01,30,5,1.841 -0,0.6,0.01,30,15,1.653 -0,0.6,0.01,30,25,1.748 -0,0.6,0.01,30,35,1.953 -0,0.6,0.01,37.1,-15,2.3 -0,0.6,0.01,37.1,-5,2.023 -0,0.6,0.01,37.1,5,1.772 -0,0.6,0.01,37.1,15,1.608 -0,0.6,0.01,37.1,25,1.683 -0,0.6,0.01,37.1,35,1.848 -0,0.6,0.02,12.1,-15,5.093 -0,0.6,0.02,12.1,-5,3.949 -0,0.6,0.02,12.1,5,2.97 -0,0.6,0.02,12.1,15,2.349 -0,0.6,0.02,12.1,25,2.59 -0,0.6,0.02,12.1,35,3.195 -0,0.6,0.02,18,-15,3.999 -0,0.6,0.02,18,-5,3.279 -0,0.6,0.02,18,5,2.656 -0,0.6,0.02,18,15,2.259 -0,0.6,0.02,18,25,2.42 -0,0.6,0.02,18,35,2.814 -0,0.6,0.02,25.2,-15,3.195 -0,0.6,0.02,25.2,-5,2.8 -0,0.6,0.02,25.2,5,2.442 -0,0.6,0.02,25.2,15,2.216 -0,0.6,0.02,25.2,25,2.333 -0,0.6,0.02,25.2,35,2.582 -0,0.6,0.02,30,-15,2.989 -0,0.6,0.02,30,-5,2.665 -0,0.6,0.02,30,5,2.368 -0,0.6,0.02,30,15,2.179 -0,0.6,0.02,30,25,2.275 -0,0.6,0.02,30,35,2.48 -0,0.6,0.02,37.1,-15,2.841 -0,0.6,0.02,37.1,-5,2.565 -0,0.6,0.02,37.1,5,2.313 -0,0.6,0.02,37.1,15,2.15 -0,0.6,0.02,37.1,25,2.224 -0,0.6,0.02,37.1,35,2.39 -0,0.6,0.03,12.1,-15,5.588 -0,0.6,0.03,12.1,-5,4.443 -0,0.6,0.03,12.1,5,3.464 -0,0.6,0.03,12.1,15,2.844 -0,0.6,0.03,12.1,25,3.084 -0,0.6,0.03,12.1,35,3.69 -0,0.6,0.03,18,-15,4.509 -0,0.6,0.03,18,-5,3.789 -0,0.6,0.03,18,5,3.165 -0,0.6,0.03,18,15,2.768 -0,0.6,0.03,18,25,2.93 -0,0.6,0.03,18,35,3.323 -0,0.6,0.03,25.2,-15,3.709 -0,0.6,0.03,25.2,-5,3.314 -0,0.6,0.03,25.2,5,2.956 -0,0.6,0.03,25.2,15,2.731 -0,0.6,0.03,25.2,25,2.847 -0,0.6,0.03,25.2,35,3.096 -0,0.6,0.03,30,-15,3.517 -0,0.6,0.03,30,-5,3.192 -0,0.6,0.03,30,5,2.895 -0,0.6,0.03,30,15,2.707 -0,0.6,0.03,30,25,2.802 -0,0.6,0.03,30,35,3.007 -0,0.6,0.03,37.1,-15,3.382 -0,0.6,0.03,37.1,-5,3.106 -0,0.6,0.03,37.1,5,2.855 -0,0.6,0.03,37.1,15,2.691 -0,0.6,0.03,37.1,25,2.765 -0,0.6,0.03,37.1,35,2.931 -0,0.6,0.04,12.1,-15,6.082 -0,0.6,0.04,12.1,-5,4.938 -0,0.6,0.04,12.1,5,3.959 -0,0.6,0.04,12.1,15,3.338 -0,0.6,0.04,12.1,25,3.579 -0,0.6,0.04,12.1,35,4.184 -0,0.6,0.04,18,-15,5.018 -0,0.6,0.04,18,-5,4.298 -0,0.6,0.04,18,5,3.675 -0,0.6,0.04,18,15,3.278 -0,0.6,0.04,18,25,3.439 -0,0.6,0.04,18,35,3.833 -0,0.6,0.04,25.2,-15,4.223 -0,0.6,0.04,25.2,-5,3.828 -0,0.6,0.04,25.2,5,3.47 -0,0.6,0.04,25.2,15,3.245 -0,0.6,0.04,25.2,25,3.361 -0,0.6,0.04,25.2,35,3.61 -0,0.6,0.04,30,-15,4.044 -0,0.6,0.04,30,-5,3.719 -0,0.6,0.04,30,5,3.423 -0,0.6,0.04,30,15,3.234 -0,0.6,0.04,30,25,3.33 -0,0.6,0.04,30,35,3.535 -0,0.6,0.04,37.1,-15,3.924 -0,0.6,0.04,37.1,-5,3.647 -0,0.6,0.04,37.1,5,3.396 -0,0.6,0.04,37.1,15,3.232 -0,0.6,0.04,37.1,25,3.307 -0,0.6,0.04,37.1,35,3.472 -0,0.9,-0.04,12.1,-15,2.01 -0,0.9,-0.04,12.1,-5,0.866 -0,0.9,-0.04,12.1,5,-0.112 -0,0.9,-0.04,12.1,15,-0.504 -0,0.9,-0.04,12.1,25,-0.168 -0,0.9,-0.04,12.1,35,0.493 -0,0.9,-0.04,18,-15,0.886 -0,0.9,-0.04,18,-5,0.167 -0,0.9,-0.04,18,5,-0.456 -0,0.9,-0.04,18,15,-0.694 -0,0.9,-0.04,18,25,-0.471 -0,0.9,-0.04,18,35,-0.04 -0,0.9,-0.04,25.2,-15,0.067 -0,0.9,-0.04,25.2,-5,-0.327 -0,0.9,-0.04,25.2,5,-0.684 -0,0.9,-0.04,25.2,15,-0.789 -0,0.9,-0.04,25.2,25,-0.635 -0,0.9,-0.04,25.2,35,-0.359 -0,0.9,-0.04,30,-15,-0.147 -0,0.9,-0.04,30,-5,-0.469 -0,0.9,-0.04,30,5,-0.764 -0,0.9,-0.04,30,15,-0.85 -0,0.9,-0.04,30,25,-0.723 -0,0.9,-0.04,30,35,-0.494 -0,0.9,-0.04,37.1,-15,-0.308 -0,0.9,-0.04,37.1,-5,-0.582 -0,0.9,-0.04,37.1,5,-0.83 -0,0.9,-0.04,37.1,15,-0.91 -0,0.9,-0.04,37.1,25,-0.809 -0,0.9,-0.04,37.1,35,-0.622 -0,0.9,-0.03,12.1,-15,2.48 -0,0.9,-0.03,12.1,-5,1.336 -0,0.9,-0.03,12.1,5,0.357 -0,0.9,-0.03,12.1,15,-0.034 -0,0.9,-0.03,12.1,25,0.301 -0,0.9,-0.03,12.1,35,0.963 -0,0.9,-0.03,18,-15,1.366 -0,0.9,-0.03,18,-5,0.647 -0,0.9,-0.03,18,5,0.024 -0,0.9,-0.03,18,15,-0.214 -0,0.9,-0.03,18,25,0.009 -0,0.9,-0.03,18,35,0.441 -0,0.9,-0.03,25.2,-15,0.56 -0,0.9,-0.03,25.2,-5,0.167 -0,0.9,-0.03,25.2,5,-0.19 -0,0.9,-0.03,25.2,15,-0.295 -0,0.9,-0.03,25.2,25,-0.141 -0,0.9,-0.03,25.2,35,0.135 -0,0.9,-0.03,30,-15,0.331 -0,0.9,-0.03,30,-5,0.008 -0,0.9,-0.03,30,5,-0.287 -0,0.9,-0.03,30,15,-0.373 -0,0.9,-0.03,30,25,-0.245 -0,0.9,-0.03,30,35,-0.016 -0,0.9,-0.03,37.1,-15,0.152 -0,0.9,-0.03,37.1,-5,-0.121 -0,0.9,-0.03,37.1,5,-0.37 -0,0.9,-0.03,37.1,15,-0.45 -0,0.9,-0.03,37.1,25,-0.348 -0,0.9,-0.03,37.1,35,-0.162 -0,0.9,-0.02,12.1,-15,2.949 -0,0.9,-0.02,12.1,-5,1.805 -0,0.9,-0.02,12.1,5,0.827 -0,0.9,-0.02,12.1,15,0.435 -0,0.9,-0.02,12.1,25,0.771 -0,0.9,-0.02,12.1,35,1.432 -0,0.9,-0.02,18,-15,1.846 -0,0.9,-0.02,18,-5,1.127 -0,0.9,-0.02,18,5,0.504 -0,0.9,-0.02,18,15,0.266 -0,0.9,-0.02,18,25,0.489 -0,0.9,-0.02,18,35,0.921 -0,0.9,-0.02,25.2,-15,1.055 -0,0.9,-0.02,25.2,-5,0.661 -0,0.9,-0.02,25.2,5,0.304 -0,0.9,-0.02,25.2,15,0.199 -0,0.9,-0.02,25.2,25,0.353 -0,0.9,-0.02,25.2,35,0.63 -0,0.9,-0.02,30,-15,0.809 -0,0.9,-0.02,30,-5,0.486 -0,0.9,-0.02,30,5,0.191 -0,0.9,-0.02,30,15,0.105 -0,0.9,-0.02,30,25,0.233 -0,0.9,-0.02,30,35,0.462 -0,0.9,-0.02,37.1,-15,0.613 -0,0.9,-0.02,37.1,-5,0.34 -0,0.9,-0.02,37.1,5,0.091 -0,0.9,-0.02,37.1,15,0.011 -0,0.9,-0.02,37.1,25,0.113 -0,0.9,-0.02,37.1,35,0.299 -0,0.9,-0.01,12.1,-15,3.431 -0,0.9,-0.01,12.1,-5,2.286 -0,0.9,-0.01,12.1,5,1.307 -0,0.9,-0.01,12.1,15,0.915 -0,0.9,-0.01,12.1,25,1.251 -0,0.9,-0.01,12.1,35,1.911 -0,0.9,-0.01,18,-15,2.356 -0,0.9,-0.01,18,-5,1.636 -0,0.9,-0.01,18,5,1.013 -0,0.9,-0.01,18,15,0.773 -0,0.9,-0.01,18,25,0.995 -0,0.9,-0.01,18,35,1.426 -0,0.9,-0.01,25.2,-15,1.582 -0,0.9,-0.01,25.2,-5,1.187 -0,0.9,-0.01,25.2,5,0.829 -0,0.9,-0.01,25.2,15,0.723 -0,0.9,-0.01,25.2,25,0.876 -0,0.9,-0.01,25.2,35,1.152 -0,0.9,-0.01,30,-15,1.343 -0,0.9,-0.01,30,-5,1.019 -0,0.9,-0.01,30,5,0.722 -0,0.9,-0.01,30,15,0.634 -0,0.9,-0.01,30,25,0.76 -0,0.9,-0.01,30,35,0.987 -0,0.9,-0.01,37.1,-15,1.158 -0,0.9,-0.01,37.1,-5,0.881 -0,0.9,-0.01,37.1,5,0.63 -0,0.9,-0.01,37.1,15,0.547 -0,0.9,-0.01,37.1,25,0.646 -0,0.9,-0.01,37.1,35,0.83 -0,0.9,0,12.1,-15,3.979 -0,0.9,0,12.1,-5,2.834 -0,0.9,0,12.1,5,1.855 -0,0.9,0,12.1,15,1.463 -0,0.9,0,12.1,25,1.798 -0,0.9,0,12.1,35,2.459 -0,0.9,0,18,-15,2.921 -0,0.9,0,18,-5,2.201 -0,0.9,0,18,5,1.577 -0,0.9,0,18,15,1.338 -0,0.9,0,18,25,1.56 -0,0.9,0,18,35,1.991 -0,0.9,0,25.2,-15,2.151 -0,0.9,0,25.2,-5,1.756 -0,0.9,0,25.2,5,1.398 -0,0.9,0,25.2,15,1.292 -0,0.9,0,25.2,25,1.445 -0,0.9,0,25.2,35,1.721 -0,0.9,0,30,-15,1.927 -0,0.9,0,30,-5,1.603 -0,0.9,0,30,5,1.306 -0,0.9,0,30,15,1.218 -0,0.9,0,30,25,1.344 -0,0.9,0,30,35,1.571 -0,0.9,0,37.1,-15,1.758 -0,0.9,0,37.1,-5,1.481 -0,0.9,0,37.1,5,1.23 -0,0.9,0,37.1,15,1.147 -0,0.9,0,37.1,25,1.246 -0,0.9,0,37.1,35,1.43 -0,0.9,0.01,12.1,-15,4.528 -0,0.9,0.01,12.1,-5,3.383 -0,0.9,0.01,12.1,5,2.404 -0,0.9,0.01,12.1,15,2.012 -0,0.9,0.01,12.1,25,2.347 -0,0.9,0.01,12.1,35,3.008 -0,0.9,0.01,18,-15,3.486 -0,0.9,0.01,18,-5,2.766 -0,0.9,0.01,18,5,2.143 -0,0.9,0.01,18,15,1.903 -0,0.9,0.01,18,25,2.125 -0,0.9,0.01,18,35,2.556 -0,0.9,0.01,25.2,-15,2.721 -0,0.9,0.01,25.2,-5,2.326 -0,0.9,0.01,25.2,5,1.968 -0,0.9,0.01,25.2,15,1.862 -0,0.9,0.01,25.2,25,2.015 -0,0.9,0.01,25.2,35,2.29 -0,0.9,0.01,30,-15,2.512 -0,0.9,0.01,30,-5,2.187 -0,0.9,0.01,30,5,1.891 -0,0.9,0.01,30,15,1.803 -0,0.9,0.01,30,25,1.928 -0,0.9,0.01,30,35,2.156 -0,0.9,0.01,37.1,-15,2.358 -0,0.9,0.01,37.1,-5,2.082 -0,0.9,0.01,37.1,5,1.83 -0,0.9,0.01,37.1,15,1.747 -0,0.9,0.01,37.1,25,1.847 -0,0.9,0.01,37.1,35,2.031 -0,0.9,0.02,12.1,-15,5.076 -0,0.9,0.02,12.1,-5,3.932 -0,0.9,0.02,12.1,5,2.953 -0,0.9,0.02,12.1,15,2.561 -0,0.9,0.02,12.1,25,2.896 -0,0.9,0.02,12.1,35,3.557 -0,0.9,0.02,18,-15,4.052 -0,0.9,0.02,18,-5,3.332 -0,0.9,0.02,18,5,2.708 -0,0.9,0.02,18,15,2.468 -0,0.9,0.02,18,25,2.691 -0,0.9,0.02,18,35,3.121 -0,0.9,0.02,25.2,-15,3.291 -0,0.9,0.02,25.2,-5,2.896 -0,0.9,0.02,25.2,5,2.538 -0,0.9,0.02,25.2,15,2.432 -0,0.9,0.02,25.2,25,2.584 -0,0.9,0.02,25.2,35,2.86 -0,0.9,0.02,30,-15,3.096 -0,0.9,0.02,30,-5,2.772 -0,0.9,0.02,30,5,2.475 -0,0.9,0.02,30,15,2.387 -0,0.9,0.02,30,25,2.513 -0,0.9,0.02,30,35,2.74 -0,0.9,0.02,37.1,-15,2.959 -0,0.9,0.02,37.1,-5,2.683 -0,0.9,0.02,37.1,5,2.431 -0,0.9,0.02,37.1,15,2.348 -0,0.9,0.02,37.1,25,2.447 -0,0.9,0.02,37.1,35,2.631 -0,0.9,0.03,12.1,-15,5.625 -0,0.9,0.03,12.1,-5,4.48 -0,0.9,0.03,12.1,5,3.501 -0,0.9,0.03,12.1,15,3.109 -0,0.9,0.03,12.1,25,3.444 -0,0.9,0.03,12.1,35,4.105 -0,0.9,0.03,18,-15,4.617 -0,0.9,0.03,18,-5,3.897 -0,0.9,0.03,18,5,3.273 -0,0.9,0.03,18,15,3.034 -0,0.9,0.03,18,25,3.256 -0,0.9,0.03,18,35,3.687 -0,0.9,0.03,25.2,-15,3.861 -0,0.9,0.03,25.2,-5,3.466 -0,0.9,0.03,25.2,5,3.108 -0,0.9,0.03,25.2,15,3.002 -0,0.9,0.03,25.2,25,3.155 -0,0.9,0.03,25.2,35,3.431 -0,0.9,0.03,30,-15,3.682 -0,0.9,0.03,30,-5,3.357 -0,0.9,0.03,30,5,3.06 -0,0.9,0.03,30,15,2.972 -0,0.9,0.03,30,25,3.098 -0,0.9,0.03,30,35,3.325 -0,0.9,0.03,37.1,-15,3.56 -0,0.9,0.03,37.1,-5,3.283 -0,0.9,0.03,37.1,5,3.032 -0,0.9,0.03,37.1,15,2.949 -0,0.9,0.03,37.1,25,3.048 -0,0.9,0.03,37.1,35,3.232 -0,0.9,0.04,12.1,-15,6.173 -0,0.9,0.04,12.1,-5,5.029 -0,0.9,0.04,12.1,5,4.05 -0,0.9,0.04,12.1,15,3.658 -0,0.9,0.04,12.1,25,3.993 -0,0.9,0.04,12.1,35,4.654 -0,0.9,0.04,18,-15,5.182 -0,0.9,0.04,18,-5,4.462 -0,0.9,0.04,18,5,3.839 -0,0.9,0.04,18,15,3.599 -0,0.9,0.04,18,25,3.821 -0,0.9,0.04,18,35,4.252 -0,0.9,0.04,25.2,-15,4.432 -0,0.9,0.04,25.2,-5,4.037 -0,0.9,0.04,25.2,5,3.679 -0,0.9,0.04,25.2,15,3.573 -0,0.9,0.04,25.2,25,3.725 -0,0.9,0.04,25.2,35,4.001 -0,0.9,0.04,30,-15,4.267 -0,0.9,0.04,30,-5,3.942 -0,0.9,0.04,30,5,3.645 -0,0.9,0.04,30,15,3.557 -0,0.9,0.04,30,25,3.683 -0,0.9,0.04,30,35,3.91 -0,0.9,0.04,37.1,-15,4.16 -0,0.9,0.04,37.1,-5,3.884 -0,0.9,0.04,37.1,5,3.632 -0,0.9,0.04,37.1,15,3.549 -0,0.9,0.04,37.1,25,3.649 -0,0.9,0.04,37.1,35,3.833 -1,0,-0.04,12.1,-15,3.752 -1,0,-0.04,12.1,-5,2.322 -1,0,-0.04,12.1,5,1.069 -1,0,-0.04,12.1,15,-0.007 -1,0,-0.04,12.1,25,-0.308 -1,0,-0.04,12.1,35,0.361 -1,0,-0.04,18,-15,2.048 -1,0,-0.04,18,-5,1.134 -1,0,-0.04,18,5,0.323 -1,0,-0.04,18,15,-0.384 -1,0,-0.04,18,25,-0.588 -1,0,-0.04,18,35,-0.149 -1,0,-0.04,25.2,-15,0.887 -1,0,-0.04,25.2,-5,0.351 -1,0,-0.04,25.2,5,-0.143 -1,0,-0.04,25.2,15,-0.596 -1,0,-0.04,25.2,25,-0.736 -1,0,-0.04,25.2,35,-0.453 -1,0,-0.04,30,-15,0.534 -1,0,-0.04,30,-5,0.091 -1,0,-0.04,30,5,-0.32 -1,0,-0.04,30,15,-0.7 -1,0,-0.04,30,25,-0.82 -1,0,-0.04,30,35,-0.584 -1,0,-0.04,37.1,-15,0.231 -1,0,-0.04,37.1,-5,-0.141 -1,0,-0.04,37.1,5,-0.485 -1,0,-0.04,37.1,15,-0.801 -1,0,-0.04,37.1,25,-0.902 -1,0,-0.04,37.1,35,-0.71 -1,0,-0.03,12.1,-15,4.248 -1,0,-0.03,12.1,-5,2.818 -1,0,-0.03,12.1,5,1.564 -1,0,-0.03,12.1,15,0.488 -1,0,-0.03,12.1,25,0.187 -1,0,-0.03,12.1,35,0.856 -1,0,-0.03,18,-15,2.555 -1,0,-0.03,18,-5,1.641 -1,0,-0.03,18,5,0.83 -1,0,-0.03,18,15,0.123 -1,0,-0.03,18,25,-0.081 -1,0,-0.03,18,35,0.358 -1,0,-0.03,25.2,-15,1.408 -1,0,-0.03,25.2,-5,0.873 -1,0,-0.03,25.2,5,0.378 -1,0,-0.03,25.2,15,-0.075 -1,0,-0.03,25.2,25,-0.215 -1,0,-0.03,25.2,35,0.068 -1,0,-0.03,30,-15,1.037 -1,0,-0.03,30,-5,0.594 -1,0,-0.03,30,5,0.184 -1,0,-0.03,30,15,-0.196 -1,0,-0.03,30,25,-0.316 -1,0,-0.03,30,35,-0.08 -1,0,-0.03,37.1,-15,0.717 -1,0,-0.03,37.1,-5,0.345 -1,0,-0.03,37.1,5,0.002 -1,0,-0.03,37.1,15,-0.315 -1,0,-0.03,37.1,25,-0.416 -1,0,-0.03,37.1,35,-0.223 -1,0,-0.02,12.1,-15,4.743 -1,0,-0.02,12.1,-5,3.313 -1,0,-0.02,12.1,5,2.06 -1,0,-0.02,12.1,15,0.984 -1,0,-0.02,12.1,25,0.683 -1,0,-0.02,12.1,35,1.352 -1,0,-0.02,18,-15,3.062 -1,0,-0.02,18,-5,2.147 -1,0,-0.02,18,5,1.336 -1,0,-0.02,18,15,0.63 -1,0,-0.02,18,25,0.426 -1,0,-0.02,18,35,0.865 -1,0,-0.02,25.2,-15,1.93 -1,0,-0.02,25.2,-5,1.395 -1,0,-0.02,25.2,5,0.9 -1,0,-0.02,25.2,15,0.447 -1,0,-0.02,25.2,25,0.307 -1,0,-0.02,25.2,35,0.59 -1,0,-0.02,30,-15,1.542 -1,0,-0.02,30,-5,1.099 -1,0,-0.02,30,5,0.688 -1,0,-0.02,30,15,0.309 -1,0,-0.02,30,25,0.189 -1,0,-0.02,30,35,0.424 -1,0,-0.02,37.1,-15,1.204 -1,0,-0.02,37.1,-5,0.832 -1,0,-0.02,37.1,5,0.488 -1,0,-0.02,37.1,15,0.172 -1,0,-0.02,37.1,25,0.071 -1,0,-0.02,37.1,35,0.263 -1,0,-0.01,12.1,-15,5.251 -1,0,-0.01,12.1,-5,3.821 -1,0,-0.01,12.1,5,2.567 -1,0,-0.01,12.1,15,1.49 -1,0,-0.01,12.1,25,1.189 -1,0,-0.01,12.1,35,1.858 -1,0,-0.01,18,-15,3.6 -1,0,-0.01,18,-5,2.684 -1,0,-0.01,18,5,1.872 -1,0,-0.01,18,15,1.164 -1,0,-0.01,18,25,0.96 -1,0,-0.01,18,35,1.397 -1,0,-0.01,25.2,-15,2.486 -1,0,-0.01,25.2,-5,1.949 -1,0,-0.01,25.2,5,1.453 -1,0,-0.01,25.2,15,0.999 -1,0,-0.01,25.2,25,0.858 -1,0,-0.01,25.2,35,1.14 -1,0,-0.01,30,-15,2.104 -1,0,-0.01,30,-5,1.659 -1,0,-0.01,30,5,1.246 -1,0,-0.01,30,15,0.865 -1,0,-0.01,30,25,0.743 -1,0,-0.01,30,35,0.977 -1,0,-0.01,37.1,-15,1.776 -1,0,-0.01,37.1,-5,1.401 -1,0,-0.01,37.1,5,1.054 -1,0,-0.01,37.1,15,0.735 -1,0,-0.01,37.1,25,0.631 -1,0,-0.01,37.1,35,0.821 -1,0,0,12.1,-15,5.829 -1,0,0,12.1,-5,4.399 -1,0,0,12.1,5,3.145 -1,0,0,12.1,15,2.069 -1,0,0,12.1,25,1.767 -1,0,0,12.1,35,2.436 -1,0,0,18,-15,4.195 -1,0,0,18,-5,3.28 -1,0,0,18,5,2.468 -1,0,0,18,15,1.76 -1,0,0,18,25,1.555 -1,0,0,18,35,1.993 -1,0,0,25.2,-15,3.087 -1,0,0,25.2,-5,2.55 -1,0,0,25.2,5,2.054 -1,0,0,25.2,15,1.6 -1,0,0,25.2,25,1.459 -1,0,0,25.2,35,1.741 -1,0,0,30,-15,2.721 -1,0,0,30,-5,2.276 -1,0,0,30,5,1.863 -1,0,0,30,15,1.482 -1,0,0,30,25,1.36 -1,0,0,30,35,1.594 -1,0,0,37.1,-15,2.409 -1,0,0,37.1,-5,2.034 -1,0,0,37.1,5,1.687 -1,0,0,37.1,15,1.368 -1,0,0,37.1,25,1.265 -1,0,0,37.1,35,1.455 -1,0,0.01,12.1,-15,6.409 -1,0,0.01,12.1,-5,4.978 -1,0,0.01,12.1,5,3.724 -1,0,0.01,12.1,15,2.648 -1,0,0.01,12.1,25,2.347 -1,0,0.01,12.1,35,3.015 -1,0,0.01,18,-15,4.792 -1,0,0.01,18,-5,3.877 -1,0,0.01,18,5,3.065 -1,0,0.01,18,15,2.357 -1,0,0.01,18,25,2.152 -1,0,0.01,18,35,2.59 -1,0,0.01,25.2,-15,3.688 -1,0,0.01,25.2,-5,3.151 -1,0,0.01,25.2,5,2.656 -1,0,0.01,25.2,15,2.201 -1,0,0.01,25.2,25,2.06 -1,0,0.01,25.2,35,2.342 -1,0,0.01,30,-15,3.338 -1,0,0.01,30,-5,2.893 -1,0,0.01,30,5,2.48 -1,0,0.01,30,15,2.099 -1,0,0.01,30,25,1.977 -1,0,0.01,30,35,2.211 -1,0,0.01,37.1,-15,3.043 -1,0,0.01,37.1,-5,2.668 -1,0,0.01,37.1,5,2.321 -1,0,0.01,37.1,15,2.002 -1,0,0.01,37.1,25,1.899 -1,0,0.01,37.1,35,2.088 -1,0,0.02,12.1,-15,6.988 -1,0,0.02,12.1,-5,5.558 -1,0,0.02,12.1,5,4.303 -1,0,0.02,12.1,15,3.227 -1,0,0.02,12.1,25,2.926 -1,0,0.02,12.1,35,3.594 -1,0,0.02,18,-15,5.389 -1,0,0.02,18,-5,4.474 -1,0,0.02,18,5,3.662 -1,0,0.02,18,15,2.954 -1,0,0.02,18,25,2.749 -1,0,0.02,18,35,3.187 -1,0,0.02,25.2,-15,4.289 -1,0,0.02,25.2,-5,3.752 -1,0,0.02,25.2,5,3.257 -1,0,0.02,25.2,15,2.803 -1,0,0.02,25.2,25,2.661 -1,0,0.02,25.2,35,2.944 -1,0,0.02,30,-15,3.955 -1,0,0.02,30,-5,3.51 -1,0,0.02,30,5,3.097 -1,0,0.02,30,15,2.716 -1,0,0.02,30,25,2.594 -1,0,0.02,30,35,2.828 -1,0,0.02,37.1,-15,3.677 -1,0,0.02,37.1,-5,3.302 -1,0,0.02,37.1,5,2.955 -1,0,0.02,37.1,15,2.636 -1,0,0.02,37.1,25,2.533 -1,0,0.02,37.1,35,2.723 -1,0,0.03,12.1,-15,7.567 -1,0,0.03,12.1,-5,6.137 -1,0,0.03,12.1,5,4.882 -1,0,0.03,12.1,15,3.806 -1,0,0.03,12.1,25,3.505 -1,0,0.03,12.1,35,4.173 -1,0,0.03,18,-15,5.986 -1,0,0.03,18,-5,5.07 -1,0,0.03,18,5,4.258 -1,0,0.03,18,15,3.55 -1,0,0.03,18,25,3.346 -1,0,0.03,18,35,3.784 -1,0,0.03,25.2,-15,4.891 -1,0,0.03,25.2,-5,4.354 -1,0,0.03,25.2,5,3.859 -1,0,0.03,25.2,15,3.405 -1,0,0.03,25.2,25,3.263 -1,0,0.03,25.2,35,3.546 -1,0,0.03,30,-15,4.573 -1,0,0.03,30,-5,4.127 -1,0,0.03,30,5,3.714 -1,0,0.03,30,15,3.333 -1,0,0.03,30,25,3.212 -1,0,0.03,30,35,3.445 -1,0,0.03,37.1,-15,4.311 -1,0,0.03,37.1,-5,3.936 -1,0,0.03,37.1,5,3.589 -1,0,0.03,37.1,15,3.27 -1,0,0.03,37.1,25,3.167 -1,0,0.03,37.1,35,3.357 -1,0,0.04,12.1,-15,8.146 -1,0,0.04,12.1,-5,6.716 -1,0,0.04,12.1,5,5.462 -1,0,0.04,12.1,15,4.385 -1,0,0.04,12.1,25,4.084 -1,0,0.04,12.1,35,4.752 -1,0,0.04,18,-15,6.583 -1,0,0.04,18,-5,5.667 -1,0,0.04,18,5,4.855 -1,0,0.04,18,15,4.147 -1,0,0.04,18,25,3.943 -1,0,0.04,18,35,4.38 -1,0,0.04,25.2,-15,5.494 -1,0,0.04,25.2,-5,4.957 -1,0,0.04,25.2,5,4.461 -1,0,0.04,25.2,15,4.007 -1,0,0.04,25.2,25,3.866 -1,0,0.04,25.2,35,4.148 -1,0,0.04,30,-15,5.19 -1,0,0.04,30,-5,4.745 -1,0,0.04,30,5,4.332 -1,0,0.04,30,15,3.951 -1,0,0.04,30,25,3.829 -1,0,0.04,30,35,4.063 -1,0,0.04,37.1,-15,4.945 -1,0,0.04,37.1,-5,4.57 -1,0,0.04,37.1,5,4.223 -1,0,0.04,37.1,15,3.904 -1,0,0.04,37.1,25,3.801 -1,0,0.04,37.1,35,3.991 -1,0.3,-0.04,12.1,-15,3.274 -1,0.3,-0.04,12.1,-5,1.844 -1,0.3,-0.04,12.1,5,0.59 -1,0.3,-0.04,12.1,15,-0.486 -1,0.3,-0.04,12.1,25,-0.302 -1,0.3,-0.04,12.1,35,0.45 -1,0.3,-0.04,18,-15,1.662 -1,0.3,-0.04,18,-5,0.748 -1,0.3,-0.04,18,5,-0.063 -1,0.3,-0.04,18,15,-0.77 -1,0.3,-0.04,18,25,-0.647 -1,0.3,-0.04,18,35,-0.152 -1,0.3,-0.04,25.2,-15,0.558 -1,0.3,-0.04,25.2,-5,0.023 -1,0.3,-0.04,25.2,5,-0.471 -1,0.3,-0.04,25.2,15,-0.925 -1,0.3,-0.04,25.2,25,-0.832 -1,0.3,-0.04,25.2,35,-0.508 -1,0.3,-0.04,30,-15,0.222 -1,0.3,-0.04,30,-5,-0.221 -1,0.3,-0.04,30,5,-0.632 -1,0.3,-0.04,30,15,-1.011 -1,0.3,-0.04,30,25,-0.935 -1,0.3,-0.04,30,35,-0.666 -1,0.3,-0.04,37.1,-15,-0.064 -1,0.3,-0.04,37.1,-5,-0.436 -1,0.3,-0.04,37.1,5,-0.78 -1,0.3,-0.04,37.1,15,-1.096 -1,0.3,-0.04,37.1,25,-1.038 -1,0.3,-0.04,37.1,35,-0.819 -1,0.3,-0.03,12.1,-15,3.839 -1,0.3,-0.03,12.1,-5,2.409 -1,0.3,-0.03,12.1,5,1.156 -1,0.3,-0.03,12.1,15,0.08 -1,0.3,-0.03,12.1,25,0.263 -1,0.3,-0.03,12.1,35,1.016 -1,0.3,-0.03,18,-15,2.24 -1,0.3,-0.03,18,-5,1.326 -1,0.3,-0.03,18,5,0.515 -1,0.3,-0.03,18,15,-0.192 -1,0.3,-0.03,18,25,-0.069 -1,0.3,-0.03,18,35,0.426 -1,0.3,-0.03,25.2,-15,1.153 -1,0.3,-0.03,25.2,-5,0.617 -1,0.3,-0.03,25.2,5,0.123 -1,0.3,-0.03,25.2,15,-0.33 -1,0.3,-0.03,25.2,25,-0.237 -1,0.3,-0.03,25.2,35,0.086 -1,0.3,-0.03,30,-15,0.797 -1,0.3,-0.03,30,-5,0.354 -1,0.3,-0.03,30,5,-0.057 -1,0.3,-0.03,30,15,-0.437 -1,0.3,-0.03,30,25,-0.36 -1,0.3,-0.03,30,35,-0.091 -1,0.3,-0.03,37.1,-15,0.49 -1,0.3,-0.03,37.1,-5,0.119 -1,0.3,-0.03,37.1,5,-0.225 -1,0.3,-0.03,37.1,15,-0.541 -1,0.3,-0.03,37.1,25,-0.484 -1,0.3,-0.03,37.1,35,-0.264 -1,0.3,-0.02,12.1,-15,4.404 -1,0.3,-0.02,12.1,-5,2.974 -1,0.3,-0.02,12.1,5,1.721 -1,0.3,-0.02,12.1,15,0.645 -1,0.3,-0.02,12.1,25,0.828 -1,0.3,-0.02,12.1,35,1.581 -1,0.3,-0.02,18,-15,2.818 -1,0.3,-0.02,18,-5,1.904 -1,0.3,-0.02,18,5,1.093 -1,0.3,-0.02,18,15,0.386 -1,0.3,-0.02,18,25,0.509 -1,0.3,-0.02,18,35,1.004 -1,0.3,-0.02,25.2,-15,1.748 -1,0.3,-0.02,25.2,-5,1.212 -1,0.3,-0.02,25.2,5,0.718 -1,0.3,-0.02,25.2,15,0.265 -1,0.3,-0.02,25.2,25,0.358 -1,0.3,-0.02,25.2,35,0.681 -1,0.3,-0.02,30,-15,1.372 -1,0.3,-0.02,30,-5,0.929 -1,0.3,-0.02,30,5,0.518 -1,0.3,-0.02,30,15,0.139 -1,0.3,-0.02,30,25,0.215 -1,0.3,-0.02,30,35,0.484 -1,0.3,-0.02,37.1,-15,1.045 -1,0.3,-0.02,37.1,-5,0.674 -1,0.3,-0.02,37.1,5,0.33 -1,0.3,-0.02,37.1,15,0.013 -1,0.3,-0.02,37.1,25,0.071 -1,0.3,-0.02,37.1,35,0.291 -1,0.3,-0.01,12.1,-15,4.981 -1,0.3,-0.01,12.1,-5,3.551 -1,0.3,-0.01,12.1,5,2.297 -1,0.3,-0.01,12.1,15,1.221 -1,0.3,-0.01,12.1,25,1.404 -1,0.3,-0.01,12.1,35,2.156 -1,0.3,-0.01,18,-15,3.427 -1,0.3,-0.01,18,-5,2.511 -1,0.3,-0.01,18,5,1.699 -1,0.3,-0.01,18,15,0.991 -1,0.3,-0.01,18,25,1.114 -1,0.3,-0.01,18,35,1.608 -1,0.3,-0.01,25.2,-15,2.377 -1,0.3,-0.01,25.2,-5,1.84 -1,0.3,-0.01,25.2,5,1.344 -1,0.3,-0.01,25.2,15,0.89 -1,0.3,-0.01,25.2,25,0.982 -1,0.3,-0.01,25.2,35,1.305 -1,0.3,-0.01,30,-15,2.005 -1,0.3,-0.01,30,-5,1.56 -1,0.3,-0.01,30,5,1.147 -1,0.3,-0.01,30,15,0.766 -1,0.3,-0.01,30,25,0.84 -1,0.3,-0.01,30,35,1.108 -1,0.3,-0.01,37.1,-15,1.685 -1,0.3,-0.01,37.1,-5,1.31 -1,0.3,-0.01,37.1,5,0.964 -1,0.3,-0.01,37.1,15,0.645 -1,0.3,-0.01,37.1,25,0.7 -1,0.3,-0.01,37.1,35,0.917 -1,0.3,0,12.1,-15,5.641 -1,0.3,0,12.1,-5,4.211 -1,0.3,0,12.1,5,2.957 -1,0.3,0,12.1,15,1.88 -1,0.3,0,12.1,25,2.064 -1,0.3,0,12.1,35,2.815 -1,0.3,0,18,-15,4.106 -1,0.3,0,18,-5,3.191 -1,0.3,0,18,5,2.378 -1,0.3,0,18,15,1.671 -1,0.3,0,18,25,1.793 -1,0.3,0,18,35,2.287 -1,0.3,0,25.2,-15,3.062 -1,0.3,0,25.2,-5,2.525 -1,0.3,0,25.2,5,2.029 -1,0.3,0,25.2,15,1.575 -1,0.3,0,25.2,25,1.667 -1,0.3,0,25.2,35,1.99 -1,0.3,0,30,-15,2.708 -1,0.3,0,30,-5,2.263 -1,0.3,0,30,5,1.85 -1,0.3,0,30,15,1.469 -1,0.3,0,30,25,1.543 -1,0.3,0,30,35,1.811 -1,0.3,0,37.1,-15,2.408 -1,0.3,0,37.1,-5,2.033 -1,0.3,0,37.1,5,1.686 -1,0.3,0,37.1,15,1.367 -1,0.3,0,37.1,25,1.422 -1,0.3,0,37.1,35,1.639 -1,0.3,0.01,12.1,-15,6.301 -1,0.3,0.01,12.1,-5,4.871 -1,0.3,0.01,12.1,5,3.617 -1,0.3,0.01,12.1,15,2.541 -1,0.3,0.01,12.1,25,2.724 -1,0.3,0.01,12.1,35,3.476 -1,0.3,0.01,18,-15,4.787 -1,0.3,0.01,18,-5,3.871 -1,0.3,0.01,18,5,3.059 -1,0.3,0.01,18,15,2.351 -1,0.3,0.01,18,25,2.474 -1,0.3,0.01,18,35,2.968 -1,0.3,0.01,25.2,-15,3.748 -1,0.3,0.01,25.2,-5,3.21 -1,0.3,0.01,25.2,5,2.715 -1,0.3,0.01,25.2,15,2.261 -1,0.3,0.01,25.2,25,2.353 -1,0.3,0.01,25.2,35,2.675 -1,0.3,0.01,30,-15,3.412 -1,0.3,0.01,30,-5,2.967 -1,0.3,0.01,30,5,2.554 -1,0.3,0.01,30,15,2.173 -1,0.3,0.01,30,25,2.247 -1,0.3,0.01,30,35,2.514 -1,0.3,0.01,37.1,-15,3.13 -1,0.3,0.01,37.1,-5,2.755 -1,0.3,0.01,37.1,5,2.409 -1,0.3,0.01,37.1,15,2.09 -1,0.3,0.01,37.1,25,2.145 -1,0.3,0.01,37.1,35,2.362 -1,0.3,0.02,12.1,-15,6.962 -1,0.3,0.02,12.1,-5,5.532 -1,0.3,0.02,12.1,5,4.277 -1,0.3,0.02,12.1,15,3.201 -1,0.3,0.02,12.1,25,3.384 -1,0.3,0.02,12.1,35,4.136 -1,0.3,0.02,18,-15,5.467 -1,0.3,0.02,18,-5,4.552 -1,0.3,0.02,18,5,3.74 -1,0.3,0.02,18,15,3.032 -1,0.3,0.02,18,25,3.155 -1,0.3,0.02,18,35,3.648 -1,0.3,0.02,25.2,-15,4.433 -1,0.3,0.02,25.2,-5,3.896 -1,0.3,0.02,25.2,5,3.401 -1,0.3,0.02,25.2,15,2.947 -1,0.3,0.02,25.2,25,3.039 -1,0.3,0.02,25.2,35,3.361 -1,0.3,0.02,30,-15,4.116 -1,0.3,0.02,30,-5,3.67 -1,0.3,0.02,30,5,3.258 -1,0.3,0.02,30,15,2.876 -1,0.3,0.02,30,25,2.951 -1,0.3,0.02,30,35,3.218 -1,0.3,0.02,37.1,-15,3.853 -1,0.3,0.02,37.1,-5,3.478 -1,0.3,0.02,37.1,5,3.132 -1,0.3,0.02,37.1,15,2.813 -1,0.3,0.02,37.1,25,2.868 -1,0.3,0.02,37.1,35,3.085 -1,0.3,0.03,12.1,-15,7.622 -1,0.3,0.03,12.1,-5,6.192 -1,0.3,0.03,12.1,5,4.938 -1,0.3,0.03,12.1,15,3.861 -1,0.3,0.03,12.1,25,4.045 -1,0.3,0.03,12.1,35,4.797 -1,0.3,0.03,18,-15,6.148 -1,0.3,0.03,18,-5,5.232 -1,0.3,0.03,18,5,4.42 -1,0.3,0.03,18,15,3.712 -1,0.3,0.03,18,25,3.835 -1,0.3,0.03,18,35,4.329 -1,0.3,0.03,25.2,-15,5.12 -1,0.3,0.03,25.2,-5,4.583 -1,0.3,0.03,25.2,5,4.087 -1,0.3,0.03,25.2,15,3.633 -1,0.3,0.03,25.2,25,3.725 -1,0.3,0.03,25.2,35,4.048 -1,0.3,0.03,30,-15,4.82 -1,0.3,0.03,30,-5,4.375 -1,0.3,0.03,30,5,3.962 -1,0.3,0.03,30,15,3.58 -1,0.3,0.03,30,25,3.655 -1,0.3,0.03,30,35,3.922 -1,0.3,0.03,37.1,-15,4.576 -1,0.3,0.03,37.1,-5,4.201 -1,0.3,0.03,37.1,5,3.855 -1,0.3,0.03,37.1,15,3.536 -1,0.3,0.03,37.1,25,3.591 -1,0.3,0.03,37.1,35,3.808 -1,0.3,0.04,12.1,-15,8.283 -1,0.3,0.04,12.1,-5,6.852 -1,0.3,0.04,12.1,5,5.598 -1,0.3,0.04,12.1,15,4.522 -1,0.3,0.04,12.1,25,4.705 -1,0.3,0.04,12.1,35,5.457 -1,0.3,0.04,18,-15,6.828 -1,0.3,0.04,18,-5,5.913 -1,0.3,0.04,18,5,5.101 -1,0.3,0.04,18,15,4.393 -1,0.3,0.04,18,25,4.516 -1,0.3,0.04,18,35,5.01 -1,0.3,0.04,25.2,-15,5.807 -1,0.3,0.04,25.2,-5,5.27 -1,0.3,0.04,25.2,5,4.774 -1,0.3,0.04,25.2,15,4.32 -1,0.3,0.04,25.2,25,4.412 -1,0.3,0.04,25.2,35,4.735 -1,0.3,0.04,30,-15,5.524 -1,0.3,0.04,30,-5,5.079 -1,0.3,0.04,30,5,4.666 -1,0.3,0.04,30,15,4.285 -1,0.3,0.04,30,25,4.359 -1,0.3,0.04,30,35,4.626 -1,0.3,0.04,37.1,-15,5.299 -1,0.3,0.04,37.1,-5,4.924 -1,0.3,0.04,37.1,5,4.578 -1,0.3,0.04,37.1,15,4.259 -1,0.3,0.04,37.1,25,4.314 -1,0.3,0.04,37.1,35,4.531 -1,0.6,-0.04,12.1,-15,2.796 -1,0.6,-0.04,12.1,-5,1.366 -1,0.6,-0.04,12.1,5,0.112 -1,0.6,-0.04,12.1,15,-0.679 -1,0.6,-0.04,12.1,25,-0.295 -1,0.6,-0.04,12.1,35,0.54 -1,0.6,-0.04,18,-15,1.276 -1,0.6,-0.04,18,-5,0.362 -1,0.6,-0.04,18,5,-0.449 -1,0.6,-0.04,18,15,-0.963 -1,0.6,-0.04,18,25,-0.705 -1,0.6,-0.04,18,35,-0.154 -1,0.6,-0.04,25.2,-15,0.23 -1,0.6,-0.04,25.2,-5,-0.306 -1,0.6,-0.04,25.2,5,-0.8 -1,0.6,-0.04,25.2,15,-1.109 -1,0.6,-0.04,25.2,25,-0.927 -1,0.6,-0.04,25.2,35,-0.563 -1,0.6,-0.04,30,-15,-0.089 -1,0.6,-0.04,30,-5,-0.532 -1,0.6,-0.04,30,5,-0.943 -1,0.6,-0.04,30,15,-1.202 -1,0.6,-0.04,30,25,-1.05 -1,0.6,-0.04,30,35,-0.748 -1,0.6,-0.04,37.1,-15,-0.359 -1,0.6,-0.04,37.1,-5,-0.731 -1,0.6,-0.04,37.1,5,-1.075 -1,0.6,-0.04,37.1,15,-1.296 -1,0.6,-0.04,37.1,25,-1.175 -1,0.6,-0.04,37.1,35,-0.928 -1,0.6,-0.03,12.1,-15,3.43 -1,0.6,-0.03,12.1,-5,2.001 -1,0.6,-0.03,12.1,5,0.747 -1,0.6,-0.03,12.1,15,-0.044 -1,0.6,-0.03,12.1,25,0.339 -1,0.6,-0.03,12.1,35,1.175 -1,0.6,-0.03,18,-15,1.925 -1,0.6,-0.03,18,-5,1.011 -1,0.6,-0.03,18,5,0.2 -1,0.6,-0.03,18,15,-0.314 -1,0.6,-0.03,18,25,-0.056 -1,0.6,-0.03,18,35,0.495 -1,0.6,-0.03,25.2,-15,0.897 -1,0.6,-0.03,25.2,-5,0.361 -1,0.6,-0.03,25.2,5,-0.133 -1,0.6,-0.03,25.2,15,-0.442 -1,0.6,-0.03,25.2,25,-0.259 -1,0.6,-0.03,25.2,35,0.104 -1,0.6,-0.03,30,-15,0.556 -1,0.6,-0.03,30,-5,0.113 -1,0.6,-0.03,30,5,-0.298 -1,0.6,-0.03,30,15,-0.557 -1,0.6,-0.03,30,25,-0.405 -1,0.6,-0.03,30,35,-0.102 -1,0.6,-0.03,37.1,-15,0.264 -1,0.6,-0.03,37.1,-5,-0.108 -1,0.6,-0.03,37.1,5,-0.452 -1,0.6,-0.03,37.1,15,-0.673 -1,0.6,-0.03,37.1,25,-0.552 -1,0.6,-0.03,37.1,35,-0.305 -1,0.6,-0.02,12.1,-15,4.065 -1,0.6,-0.02,12.1,-5,2.635 -1,0.6,-0.02,12.1,5,1.381 -1,0.6,-0.02,12.1,15,0.59 -1,0.6,-0.02,12.1,25,0.974 -1,0.6,-0.02,12.1,35,1.809 -1,0.6,-0.02,18,-15,2.574 -1,0.6,-0.02,18,-5,1.66 -1,0.6,-0.02,18,5,0.849 -1,0.6,-0.02,18,15,0.335 -1,0.6,-0.02,18,25,0.593 -1,0.6,-0.02,18,35,1.144 -1,0.6,-0.02,25.2,-15,1.566 -1,0.6,-0.02,25.2,-5,1.03 -1,0.6,-0.02,25.2,5,0.536 -1,0.6,-0.02,25.2,15,0.227 -1,0.6,-0.02,25.2,25,0.409 -1,0.6,-0.02,25.2,35,0.773 -1,0.6,-0.02,30,-15,1.202 -1,0.6,-0.02,30,-5,0.759 -1,0.6,-0.02,30,5,0.348 -1,0.6,-0.02,30,15,0.089 -1,0.6,-0.02,30,25,0.241 -1,0.6,-0.02,30,35,0.544 -1,0.6,-0.02,37.1,-15,0.887 -1,0.6,-0.02,37.1,-5,0.515 -1,0.6,-0.02,37.1,5,0.171 -1,0.6,-0.02,37.1,15,-0.05 -1,0.6,-0.02,37.1,25,0.071 -1,0.6,-0.02,37.1,35,0.318 -1,0.6,-0.01,12.1,-15,4.712 -1,0.6,-0.01,12.1,-5,3.282 -1,0.6,-0.01,12.1,5,2.027 -1,0.6,-0.01,12.1,15,1.236 -1,0.6,-0.01,12.1,25,1.619 -1,0.6,-0.01,12.1,35,2.454 -1,0.6,-0.01,18,-15,3.254 -1,0.6,-0.01,18,-5,2.339 -1,0.6,-0.01,18,5,1.526 -1,0.6,-0.01,18,15,1.012 -1,0.6,-0.01,18,25,1.268 -1,0.6,-0.01,18,35,1.819 -1,0.6,-0.01,25.2,-15,2.268 -1,0.6,-0.01,25.2,-5,1.73 -1,0.6,-0.01,25.2,5,1.235 -1,0.6,-0.01,25.2,15,0.925 -1,0.6,-0.01,25.2,25,1.107 -1,0.6,-0.01,25.2,35,1.469 -1,0.6,-0.01,30,-15,1.906 -1,0.6,-0.01,30,-5,1.461 -1,0.6,-0.01,30,5,1.048 -1,0.6,-0.01,30,15,0.787 -1,0.6,-0.01,30,25,0.937 -1,0.6,-0.01,30,35,1.238 -1,0.6,-0.01,37.1,-15,1.595 -1,0.6,-0.01,37.1,-5,1.22 -1,0.6,-0.01,37.1,5,0.874 -1,0.6,-0.01,37.1,15,0.65 -1,0.6,-0.01,37.1,25,0.768 -1,0.6,-0.01,37.1,35,1.012 -1,0.6,0,12.1,-15,5.453 -1,0.6,0,12.1,-5,4.022 -1,0.6,0,12.1,5,2.768 -1,0.6,0,12.1,15,1.976 -1,0.6,0,12.1,25,2.36 -1,0.6,0,12.1,35,3.195 -1,0.6,0,18,-15,4.017 -1,0.6,0,18,-5,3.101 -1,0.6,0,18,5,2.289 -1,0.6,0,18,15,1.774 -1,0.6,0,18,25,2.031 -1,0.6,0,18,35,2.581 -1,0.6,0,25.2,-15,3.037 -1,0.6,0,25.2,-5,2.5 -1,0.6,0,25.2,5,2.005 -1,0.6,0,25.2,15,1.694 -1,0.6,0,25.2,25,1.876 -1,0.6,0,25.2,35,2.238 -1,0.6,0,30,-15,2.696 -1,0.6,0,30,-5,2.251 -1,0.6,0,30,5,1.838 -1,0.6,0,30,15,1.577 -1,0.6,0,30,25,1.727 -1,0.6,0,30,35,2.028 -1,0.6,0,37.1,-15,2.406 -1,0.6,0,37.1,-5,2.031 -1,0.6,0,37.1,5,1.685 -1,0.6,0,37.1,15,1.461 -1,0.6,0,37.1,25,1.579 -1,0.6,0,37.1,35,1.824 -1,0.6,0.01,12.1,-15,6.194 -1,0.6,0.01,12.1,-5,4.764 -1,0.6,0.01,12.1,5,3.51 -1,0.6,0.01,12.1,15,2.718 -1,0.6,0.01,12.1,25,3.102 -1,0.6,0.01,12.1,35,3.937 -1,0.6,0.01,18,-15,4.781 -1,0.6,0.01,18,-5,3.866 -1,0.6,0.01,18,5,3.054 -1,0.6,0.01,18,15,2.539 -1,0.6,0.01,18,25,2.796 -1,0.6,0.01,18,35,3.346 -1,0.6,0.01,25.2,-15,3.807 -1,0.6,0.01,25.2,-5,3.27 -1,0.6,0.01,25.2,5,2.775 -1,0.6,0.01,25.2,15,2.465 -1,0.6,0.01,25.2,25,2.646 -1,0.6,0.01,25.2,35,3.009 -1,0.6,0.01,30,-15,3.486 -1,0.6,0.01,30,-5,3.041 -1,0.6,0.01,30,5,2.628 -1,0.6,0.01,30,15,2.367 -1,0.6,0.01,30,25,2.517 -1,0.6,0.01,30,35,2.818 -1,0.6,0.01,37.1,-15,3.218 -1,0.6,0.01,37.1,-5,2.843 -1,0.6,0.01,37.1,5,2.496 -1,0.6,0.01,37.1,15,2.272 -1,0.6,0.01,37.1,25,2.391 -1,0.6,0.01,37.1,35,2.635 -1,0.6,0.02,12.1,-15,6.936 -1,0.6,0.02,12.1,-5,5.506 -1,0.6,0.02,12.1,5,4.252 -1,0.6,0.02,12.1,15,3.46 -1,0.6,0.02,12.1,25,3.843 -1,0.6,0.02,12.1,35,4.678 -1,0.6,0.02,18,-15,5.546 -1,0.6,0.02,18,-5,4.63 -1,0.6,0.02,18,5,3.818 -1,0.6,0.02,18,15,3.303 -1,0.6,0.02,18,25,3.56 -1,0.6,0.02,18,35,4.11 -1,0.6,0.02,25.2,-15,4.577 -1,0.6,0.02,25.2,-5,4.04 -1,0.6,0.02,25.2,5,3.545 -1,0.6,0.02,25.2,15,3.235 -1,0.6,0.02,25.2,25,3.416 -1,0.6,0.02,25.2,35,3.779 -1,0.6,0.02,30,-15,4.276 -1,0.6,0.02,30,-5,3.831 -1,0.6,0.02,30,5,3.418 -1,0.6,0.02,30,15,3.157 -1,0.6,0.02,30,25,3.307 -1,0.6,0.02,30,35,3.608 -1,0.6,0.02,37.1,-15,4.03 -1,0.6,0.02,37.1,-5,3.655 -1,0.6,0.02,37.1,5,3.308 -1,0.6,0.02,37.1,15,3.084 -1,0.6,0.02,37.1,25,3.203 -1,0.6,0.02,37.1,35,3.447 -1,0.6,0.03,12.1,-15,7.678 -1,0.6,0.03,12.1,-5,6.247 -1,0.6,0.03,12.1,5,4.993 -1,0.6,0.03,12.1,15,4.202 -1,0.6,0.03,12.1,25,4.585 -1,0.6,0.03,12.1,35,5.42 -1,0.6,0.03,18,-15,6.31 -1,0.6,0.03,18,-5,5.394 -1,0.6,0.03,18,5,4.582 -1,0.6,0.03,18,15,4.068 -1,0.6,0.03,18,25,4.324 -1,0.6,0.03,18,35,4.874 -1,0.6,0.03,25.2,-15,5.348 -1,0.6,0.03,25.2,-5,4.811 -1,0.6,0.03,25.2,5,4.316 -1,0.6,0.03,25.2,15,4.006 -1,0.6,0.03,25.2,25,4.187 -1,0.6,0.03,25.2,35,4.55 -1,0.6,0.03,30,-15,5.067 -1,0.6,0.03,30,-5,4.622 -1,0.6,0.03,30,5,4.209 -1,0.6,0.03,30,15,3.948 -1,0.6,0.03,30,25,4.098 -1,0.6,0.03,30,35,4.399 -1,0.6,0.03,37.1,-15,4.842 -1,0.6,0.03,37.1,-5,4.467 -1,0.6,0.03,37.1,5,4.12 -1,0.6,0.03,37.1,15,3.896 -1,0.6,0.03,37.1,25,4.015 -1,0.6,0.03,37.1,35,4.259 -1,0.6,0.04,12.1,-15,8.419 -1,0.6,0.04,12.1,-5,6.989 -1,0.6,0.04,12.1,5,5.735 -1,0.6,0.04,12.1,15,4.943 -1,0.6,0.04,12.1,25,5.326 -1,0.6,0.04,12.1,35,6.162 -1,0.6,0.04,18,-15,7.074 -1,0.6,0.04,18,-5,6.159 -1,0.6,0.04,18,5,5.347 -1,0.6,0.04,18,15,4.832 -1,0.6,0.04,18,25,5.089 -1,0.6,0.04,18,35,5.639 -1,0.6,0.04,25.2,-15,6.12 -1,0.6,0.04,25.2,-5,5.582 -1,0.6,0.04,25.2,5,5.087 -1,0.6,0.04,25.2,15,4.777 -1,0.6,0.04,25.2,25,4.958 -1,0.6,0.04,25.2,35,5.321 -1,0.6,0.04,30,-15,5.858 -1,0.6,0.04,30,-5,5.413 -1,0.6,0.04,30,5,5 -1,0.6,0.04,30,15,4.739 -1,0.6,0.04,30,25,4.889 -1,0.6,0.04,30,35,5.19 -1,0.6,0.04,37.1,-15,5.654 -1,0.6,0.04,37.1,-5,5.279 -1,0.6,0.04,37.1,5,4.932 -1,0.6,0.04,37.1,15,4.708 -1,0.6,0.04,37.1,25,4.827 -1,0.6,0.04,37.1,35,5.071 -1,0.9,-0.04,12.1,-15,2.318 -1,0.9,-0.04,12.1,-5,0.888 -1,0.9,-0.04,12.1,5,-0.366 -1,0.9,-0.04,12.1,15,-0.786 -1,0.9,-0.04,12.1,25,-0.289 -1,0.9,-0.04,12.1,35,0.63 -1,0.9,-0.04,18,-15,0.89 -1,0.9,-0.04,18,-5,-0.025 -1,0.9,-0.04,18,5,-0.836 -1,0.9,-0.04,18,15,-1.097 -1,0.9,-0.04,18,25,-0.764 -1,0.9,-0.04,18,35,-0.157 -1,0.9,-0.04,25.2,-15,-0.099 -1,0.9,-0.04,25.2,-5,-0.635 -1,0.9,-0.04,25.2,5,-1.129 -1,0.9,-0.04,25.2,15,-1.254 -1,0.9,-0.04,25.2,25,-1.022 -1,0.9,-0.04,25.2,35,-0.618 -1,0.9,-0.04,30,-15,-0.4 -1,0.9,-0.04,30,-5,-0.843 -1,0.9,-0.04,30,5,-1.254 -1,0.9,-0.04,30,15,-1.359 -1,0.9,-0.04,30,25,-1.166 -1,0.9,-0.04,30,35,-0.829 -1,0.9,-0.04,37.1,-15,-0.654 -1,0.9,-0.04,37.1,-5,-1.026 -1,0.9,-0.04,37.1,5,-1.37 -1,0.9,-0.04,37.1,15,-1.466 -1,0.9,-0.04,37.1,25,-1.311 -1,0.9,-0.04,37.1,35,-1.037 -1,0.9,-0.03,12.1,-15,3.022 -1,0.9,-0.03,12.1,-5,1.592 -1,0.9,-0.03,12.1,5,0.338 -1,0.9,-0.03,12.1,15,-0.082 -1,0.9,-0.03,12.1,25,0.415 -1,0.9,-0.03,12.1,35,1.334 -1,0.9,-0.03,18,-15,1.61 -1,0.9,-0.03,18,-5,0.696 -1,0.9,-0.03,18,5,-0.115 -1,0.9,-0.03,18,15,-0.377 -1,0.9,-0.03,18,25,-0.044 -1,0.9,-0.03,18,35,0.563 -1,0.9,-0.03,25.2,-15,0.642 -1,0.9,-0.03,25.2,-5,0.106 -1,0.9,-0.03,25.2,5,-0.388 -1,0.9,-0.03,25.2,15,-0.513 -1,0.9,-0.03,25.2,25,-0.281 -1,0.9,-0.03,25.2,35,0.122 -1,0.9,-0.03,30,-15,0.316 -1,0.9,-0.03,30,-5,-0.127 -1,0.9,-0.03,30,5,-0.538 -1,0.9,-0.03,30,15,-0.643 -1,0.9,-0.03,30,25,-0.45 -1,0.9,-0.03,30,35,-0.113 -1,0.9,-0.03,37.1,-15,0.037 -1,0.9,-0.03,37.1,-5,-0.335 -1,0.9,-0.03,37.1,5,-0.678 -1,0.9,-0.03,37.1,15,-0.775 -1,0.9,-0.03,37.1,25,-0.62 -1,0.9,-0.03,37.1,35,-0.346 -1,0.9,-0.02,12.1,-15,3.726 -1,0.9,-0.02,12.1,-5,2.296 -1,0.9,-0.02,12.1,5,1.042 -1,0.9,-0.02,12.1,15,0.622 -1,0.9,-0.02,12.1,25,1.119 -1,0.9,-0.02,12.1,35,2.038 -1,0.9,-0.02,18,-15,2.33 -1,0.9,-0.02,18,-5,1.416 -1,0.9,-0.02,18,5,0.605 -1,0.9,-0.02,18,15,0.343 -1,0.9,-0.02,18,25,0.676 -1,0.9,-0.02,18,35,1.283 -1,0.9,-0.02,25.2,-15,1.383 -1,0.9,-0.02,25.2,-5,0.847 -1,0.9,-0.02,25.2,5,0.353 -1,0.9,-0.02,25.2,15,0.228 -1,0.9,-0.02,25.2,25,0.46 -1,0.9,-0.02,25.2,35,0.864 -1,0.9,-0.02,30,-15,1.032 -1,0.9,-0.02,30,-5,0.589 -1,0.9,-0.02,30,5,0.178 -1,0.9,-0.02,30,15,0.074 -1,0.9,-0.02,30,25,0.267 -1,0.9,-0.02,30,35,0.603 -1,0.9,-0.02,37.1,-15,0.728 -1,0.9,-0.02,37.1,-5,0.357 -1,0.9,-0.02,37.1,5,0.013 -1,0.9,-0.02,37.1,15,-0.084 -1,0.9,-0.02,37.1,25,0.071 -1,0.9,-0.02,37.1,35,0.345 -1,0.9,-0.01,12.1,-15,4.442 -1,0.9,-0.01,12.1,-5,3.012 -1,0.9,-0.01,12.1,5,1.758 -1,0.9,-0.01,12.1,15,1.337 -1,0.9,-0.01,12.1,25,1.834 -1,0.9,-0.01,12.1,35,2.753 -1,0.9,-0.01,18,-15,3.081 -1,0.9,-0.01,18,-5,2.166 -1,0.9,-0.01,18,5,1.354 -1,0.9,-0.01,18,15,1.091 -1,0.9,-0.01,18,25,1.423 -1,0.9,-0.01,18,35,2.029 -1,0.9,-0.01,25.2,-15,2.158 -1,0.9,-0.01,25.2,-5,1.621 -1,0.9,-0.01,25.2,5,1.126 -1,0.9,-0.01,25.2,15,1 -1,0.9,-0.01,25.2,25,1.231 -1,0.9,-0.01,25.2,35,1.634 -1,0.9,-0.01,30,-15,1.807 -1,0.9,-0.01,30,-5,1.362 -1,0.9,-0.01,30,5,0.949 -1,0.9,-0.01,30,15,0.843 -1,0.9,-0.01,30,25,1.034 -1,0.9,-0.01,30,35,1.369 -1,0.9,-0.01,37.1,-15,1.505 -1,0.9,-0.01,37.1,-5,1.13 -1,0.9,-0.01,37.1,5,0.783 -1,0.9,-0.01,37.1,15,0.684 -1,0.9,-0.01,37.1,25,0.836 -1,0.9,-0.01,37.1,35,1.108 -1,0.9,0,12.1,-15,5.264 -1,0.9,0,12.1,-5,3.834 -1,0.9,0,12.1,5,2.58 -1,0.9,0,12.1,15,2.159 -1,0.9,0,12.1,25,2.656 -1,0.9,0,12.1,35,3.574 -1,0.9,0,18,-15,3.927 -1,0.9,0,18,-5,3.012 -1,0.9,0,18,5,2.2 -1,0.9,0,18,15,1.937 -1,0.9,0,18,25,2.269 -1,0.9,0,18,35,2.875 -1,0.9,0,25.2,-15,3.012 -1,0.9,0,25.2,-5,2.475 -1,0.9,0,25.2,5,1.98 -1,0.9,0,25.2,15,1.854 -1,0.9,0,25.2,25,2.084 -1,0.9,0,25.2,35,2.487 -1,0.9,0,30,-15,2.683 -1,0.9,0,30,-5,2.238 -1,0.9,0,30,5,1.825 -1,0.9,0,30,15,1.719 -1,0.9,0,30,25,1.91 -1,0.9,0,30,35,2.245 -1,0.9,0,37.1,-15,2.405 -1,0.9,0,37.1,-5,2.03 -1,0.9,0,37.1,5,1.684 -1,0.9,0,37.1,15,1.584 -1,0.9,0,37.1,25,1.736 -1,0.9,0,37.1,35,2.008 -1,0.9,0.01,12.1,-15,6.087 -1,0.9,0.01,12.1,-5,4.657 -1,0.9,0.01,12.1,5,3.403 -1,0.9,0.01,12.1,15,2.982 -1,0.9,0.01,12.1,25,3.479 -1,0.9,0.01,12.1,35,4.397 -1,0.9,0.01,18,-15,4.776 -1,0.9,0.01,18,-5,3.86 -1,0.9,0.01,18,5,3.048 -1,0.9,0.01,18,15,2.786 -1,0.9,0.01,18,25,3.117 -1,0.9,0.01,18,35,3.724 -1,0.9,0.01,25.2,-15,3.867 -1,0.9,0.01,25.2,-5,3.329 -1,0.9,0.01,25.2,5,2.834 -1,0.9,0.01,25.2,15,2.708 -1,0.9,0.01,25.2,25,2.939 -1,0.9,0.01,25.2,35,3.342 -1,0.9,0.01,30,-15,3.56 -1,0.9,0.01,30,-5,3.115 -1,0.9,0.01,30,5,2.702 -1,0.9,0.01,30,15,2.596 -1,0.9,0.01,30,25,2.787 -1,0.9,0.01,30,35,3.122 -1,0.9,0.01,37.1,-15,3.306 -1,0.9,0.01,37.1,-5,2.931 -1,0.9,0.01,37.1,5,2.584 -1,0.9,0.01,37.1,15,2.484 -1,0.9,0.01,37.1,25,2.637 -1,0.9,0.01,37.1,35,2.908 -1,0.9,0.02,12.1,-15,6.91 -1,0.9,0.02,12.1,-5,5.48 -1,0.9,0.02,12.1,5,4.226 -1,0.9,0.02,12.1,15,3.805 -1,0.9,0.02,12.1,25,4.302 -1,0.9,0.02,12.1,35,5.22 -1,0.9,0.02,18,-15,5.624 -1,0.9,0.02,18,-5,4.708 -1,0.9,0.02,18,5,3.896 -1,0.9,0.02,18,15,3.634 -1,0.9,0.02,18,25,3.965 -1,0.9,0.02,18,35,4.572 -1,0.9,0.02,25.2,-15,4.721 -1,0.9,0.02,25.2,-5,4.184 -1,0.9,0.02,25.2,5,3.689 -1,0.9,0.02,25.2,15,3.563 -1,0.9,0.02,25.2,25,3.793 -1,0.9,0.02,25.2,35,4.196 -1,0.9,0.02,30,-15,4.437 -1,0.9,0.02,30,-5,3.992 -1,0.9,0.02,30,5,3.579 -1,0.9,0.02,30,15,3.473 -1,0.9,0.02,30,25,3.664 -1,0.9,0.02,30,35,3.999 -1,0.9,0.02,37.1,-15,4.207 -1,0.9,0.02,37.1,-5,3.832 -1,0.9,0.02,37.1,5,3.485 -1,0.9,0.02,37.1,15,3.385 -1,0.9,0.02,37.1,25,3.538 -1,0.9,0.02,37.1,35,3.809 -1,0.9,0.03,12.1,-15,7.733 -1,0.9,0.03,12.1,-5,6.303 -1,0.9,0.03,12.1,5,5.049 -1,0.9,0.03,12.1,15,4.628 -1,0.9,0.03,12.1,25,5.125 -1,0.9,0.03,12.1,35,6.043 -1,0.9,0.03,18,-15,6.472 -1,0.9,0.03,18,-5,5.556 -1,0.9,0.03,18,5,4.744 -1,0.9,0.03,18,15,4.482 -1,0.9,0.03,18,25,4.813 -1,0.9,0.03,18,35,5.42 -1,0.9,0.03,25.2,-15,5.576 -1,0.9,0.03,25.2,-5,5.039 -1,0.9,0.03,25.2,5,4.544 -1,0.9,0.03,25.2,15,4.418 -1,0.9,0.03,25.2,25,4.649 -1,0.9,0.03,25.2,35,5.052 -1,0.9,0.03,30,-15,5.314 -1,0.9,0.03,30,-5,4.869 -1,0.9,0.03,30,5,4.456 -1,0.9,0.03,30,15,4.35 -1,0.9,0.03,30,25,4.541 -1,0.9,0.03,30,35,4.876 -1,0.9,0.03,37.1,-15,5.108 -1,0.9,0.03,37.1,-5,4.733 -1,0.9,0.03,37.1,5,4.386 -1,0.9,0.03,37.1,15,4.286 -1,0.9,0.03,37.1,25,4.439 -1,0.9,0.03,37.1,35,4.71 -1,0.9,0.04,12.1,-15,8.556 -1,0.9,0.04,12.1,-5,7.126 -1,0.9,0.04,12.1,5,5.871 -1,0.9,0.04,12.1,15,5.451 -1,0.9,0.04,12.1,25,5.948 -1,0.9,0.04,12.1,35,6.866 -1,0.9,0.04,18,-15,7.32 -1,0.9,0.04,18,-5,6.404 -1,0.9,0.04,18,5,5.592 -1,0.9,0.04,18,15,5.33 -1,0.9,0.04,18,25,5.661 -1,0.9,0.04,18,35,6.268 -1,0.9,0.04,25.2,-15,6.432 -1,0.9,0.04,25.2,-5,5.895 -1,0.9,0.04,25.2,5,5.4 -1,0.9,0.04,25.2,15,5.274 -1,0.9,0.04,25.2,25,5.505 -1,0.9,0.04,25.2,35,5.907 -1,0.9,0.04,30,-15,6.192 -1,0.9,0.04,30,-5,5.747 -1,0.9,0.04,30,5,5.334 -1,0.9,0.04,30,15,5.228 -1,0.9,0.04,30,25,5.419 -1,0.9,0.04,30,35,5.754 -1,0.9,0.04,37.1,-15,6.008 -1,0.9,0.04,37.1,-5,5.633 -1,0.9,0.04,37.1,5,5.287 -1,0.9,0.04,37.1,15,5.187 -1,0.9,0.04,37.1,25,5.34 -1,0.9,0.04,37.1,35,5.611 +xx,0,-0.04,12.1,-15,2.967 +xx,0,-0.04,12.1,-5,1.823 +xx,0,-0.04,12.1,5,0.844 +xx,0,-0.04,12.1,15,0.034 +xx,0,-0.04,12.1,25,-0.181 +xx,0,-0.04,12.1,35,0.314 +xx,0,-0.04,18,-15,1.658 +xx,0,-0.04,18,-5,0.939 +xx,0,-0.04,18,5,0.317 +xx,0,-0.04,18,15,-0.208 +xx,0,-0.04,18,25,-0.353 +xx,0,-0.04,18,35,-0.034 +xx,0,-0.04,25.2,-15,0.724 +xx,0,-0.04,25.2,-5,0.33 +xx,0,-0.04,25.2,5,-0.026 +xx,0,-0.04,25.2,15,-0.347 +xx,0,-0.04,25.2,25,-0.445 +xx,0,-0.04,25.2,35,-0.248 +xx,0,-0.04,30,-15,0.476 +xx,0,-0.04,30,-5,0.153 +xx,0,-0.04,30,5,-0.141 +xx,0,-0.04,30,15,-0.408 +xx,0,-0.04,30,25,-0.492 +xx,0,-0.04,30,35,-0.33 +xx,0,-0.04,37.1,-15,0.281 +xx,0,-0.04,37.1,-5,0.008 +xx,0,-0.04,37.1,5,-0.241 +xx,0,-0.04,37.1,15,-0.465 +xx,0,-0.04,37.1,25,-0.536 +xx,0,-0.04,37.1,35,-0.404 +xx,0,-0.03,12.1,-15,3.297 +xx,0,-0.03,12.1,-5,2.153 +xx,0,-0.03,12.1,5,1.175 +xx,0,-0.03,12.1,15,0.365 +xx,0,-0.03,12.1,25,0.149 +xx,0,-0.03,12.1,35,0.644 +xx,0,-0.03,18,-15,1.996 +xx,0,-0.03,18,-5,1.277 +xx,0,-0.03,18,5,0.654 +xx,0,-0.03,18,15,0.13 +xx,0,-0.03,18,25,-0.015 +xx,0,-0.03,18,35,0.304 +xx,0,-0.03,25.2,-15,1.072 +xx,0,-0.03,25.2,-5,0.678 +xx,0,-0.03,25.2,5,0.321 +xx,0,-0.03,25.2,15,0.001 +xx,0,-0.03,25.2,25,-0.097 +xx,0,-0.03,25.2,35,0.099 +xx,0,-0.03,30,-15,0.812 +xx,0,-0.03,30,-5,0.489 +xx,0,-0.03,30,5,0.195 +xx,0,-0.03,30,15,-0.072 +xx,0,-0.03,30,25,-0.156 +xx,0,-0.03,30,35,0.006 +xx,0,-0.03,37.1,-15,0.606 +xx,0,-0.03,37.1,-5,0.332 +xx,0,-0.03,37.1,5,0.084 +xx,0,-0.03,37.1,15,-0.14 +xx,0,-0.03,37.1,25,-0.212 +xx,0,-0.03,37.1,35,-0.08 +xx,0,-0.02,12.1,-15,3.628 +xx,0,-0.02,12.1,-5,2.484 +xx,0,-0.02,12.1,5,1.505 +xx,0,-0.02,12.1,15,0.695 +xx,0,-0.02,12.1,25,0.48 +xx,0,-0.02,12.1,35,0.974 +xx,0,-0.02,18,-15,2.334 +xx,0,-0.02,18,-5,1.615 +xx,0,-0.02,18,5,0.992 +xx,0,-0.02,18,15,0.467 +xx,0,-0.02,18,25,0.322 +xx,0,-0.02,18,35,0.642 +xx,0,-0.02,25.2,-15,1.42 +xx,0,-0.02,25.2,-5,1.026 +xx,0,-0.02,25.2,5,0.669 +xx,0,-0.02,25.2,15,0.349 +xx,0,-0.02,25.2,25,0.251 +xx,0,-0.02,25.2,35,0.447 +xx,0,-0.02,30,-15,1.148 +xx,0,-0.02,30,-5,0.826 +xx,0,-0.02,30,5,0.531 +xx,0,-0.02,30,15,0.264 +xx,0,-0.02,30,25,0.18 +xx,0,-0.02,30,35,0.342 +xx,0,-0.02,37.1,-15,0.93 +xx,0,-0.02,37.1,-5,0.657 +xx,0,-0.02,37.1,5,0.408 +xx,0,-0.02,37.1,15,0.184 +xx,0,-0.02,37.1,25,0.113 +xx,0,-0.02,37.1,35,0.245 +xx,0,-0.01,12.1,-15,3.97 +xx,0,-0.01,12.1,-5,2.826 +xx,0,-0.01,12.1,5,1.847 +xx,0,-0.01,12.1,15,1.036 +xx,0,-0.01,12.1,25,0.82 +xx,0,-0.01,12.1,35,1.315 +xx,0,-0.01,18,-15,2.702 +xx,0,-0.01,18,-5,1.982 +xx,0,-0.01,18,5,1.358 +xx,0,-0.01,18,15,0.833 +xx,0,-0.01,18,25,0.687 +xx,0,-0.01,18,35,1.005 +xx,0,-0.01,25.2,-15,1.8 +xx,0,-0.01,25.2,-5,1.406 +xx,0,-0.01,25.2,5,1.048 +xx,0,-0.01,25.2,15,0.726 +xx,0,-0.01,25.2,25,0.627 +xx,0,-0.01,25.2,35,0.823 +xx,0,-0.01,30,-15,1.541 +xx,0,-0.01,30,-5,1.217 +xx,0,-0.01,30,5,0.92 +xx,0,-0.01,30,15,0.651 +xx,0,-0.01,30,25,0.566 +xx,0,-0.01,30,35,0.726 +xx,0,-0.01,37.1,-15,1.338 +xx,0,-0.01,37.1,-5,1.062 +xx,0,-0.01,37.1,5,0.81 +xx,0,-0.01,37.1,15,0.583 +xx,0,-0.01,37.1,25,0.51 +xx,0,-0.01,37.1,35,0.639 +xx,0,0,12.1,-15,4.356 +xx,0,0,12.1,-5,3.211 +xx,0,0,12.1,5,2.232 +xx,0,0,12.1,15,1.422 +xx,0,0,12.1,25,1.206 +xx,0,0,12.1,35,1.7 +xx,0,0,18,-15,3.099 +xx,0,0,18,-5,2.379 +xx,0,0,18,5,1.756 +xx,0,0,18,15,1.23 +xx,0,0,18,25,1.084 +xx,0,0,18,35,1.402 +xx,0,0,25.2,-15,2.201 +xx,0,0,25.2,-5,1.806 +xx,0,0,25.2,5,1.448 +xx,0,0,25.2,15,1.127 +xx,0,0,25.2,25,1.028 +xx,0,0,25.2,35,1.223 +xx,0,0,30,-15,1.953 +xx,0,0,30,-5,1.628 +xx,0,0,30,5,1.331 +xx,0,0,30,15,1.062 +xx,0,0,30,25,0.977 +xx,0,0,30,35,1.137 +xx,0,0,37.1,-15,1.76 +xx,0,0,37.1,-5,1.484 +xx,0,0,37.1,5,1.232 +xx,0,0,37.1,15,1.006 +xx,0,0,37.1,25,0.932 +xx,0,0,37.1,35,1.062 +xx,0,0.01,12.1,-15,4.742 +xx,0,0.01,12.1,-5,3.597 +xx,0,0.01,12.1,5,2.618 +xx,0,0.01,12.1,15,1.808 +xx,0,0.01,12.1,25,1.592 +xx,0,0.01,12.1,35,2.087 +xx,0,0.01,18,-15,3.497 +xx,0,0.01,18,-5,2.777 +xx,0,0.01,18,5,2.154 +xx,0,0.01,18,15,1.628 +xx,0,0.01,18,25,1.482 +xx,0,0.01,18,35,1.8 +xx,0,0.01,25.2,-15,2.602 +xx,0,0.01,25.2,-5,2.207 +xx,0,0.01,25.2,5,1.849 +xx,0,0.01,25.2,15,1.528 +xx,0,0.01,25.2,25,1.429 +xx,0,0.01,25.2,35,1.624 +xx,0,0.01,30,-15,2.364 +xx,0,0.01,30,-5,2.039 +xx,0,0.01,30,5,1.743 +xx,0,0.01,30,15,1.474 +xx,0,0.01,30,25,1.388 +xx,0,0.01,30,35,1.548 +xx,0,0.01,37.1,-15,2.183 +xx,0,0.01,37.1,-5,1.907 +xx,0,0.01,37.1,5,1.655 +xx,0,0.01,37.1,15,1.428 +xx,0,0.01,37.1,25,1.354 +xx,0,0.01,37.1,35,1.484 +xx,0,0.02,12.1,-15,5.128 +xx,0,0.02,12.1,-5,3.983 +xx,0,0.02,12.1,5,3.005 +xx,0,0.02,12.1,15,2.194 +xx,0,0.02,12.1,25,1.978 +xx,0,0.02,12.1,35,2.473 +xx,0,0.02,18,-15,3.895 +xx,0,0.02,18,-5,3.175 +xx,0,0.02,18,5,2.551 +xx,0,0.02,18,15,2.026 +xx,0,0.02,18,25,1.88 +xx,0,0.02,18,35,2.198 +xx,0,0.02,25.2,-15,3.003 +xx,0,0.02,25.2,-5,2.608 +xx,0,0.02,25.2,5,2.25 +xx,0,0.02,25.2,15,1.928 +xx,0,0.02,25.2,25,1.83 +xx,0,0.02,25.2,35,2.025 +xx,0,0.02,30,-15,2.775 +xx,0,0.02,30,-5,2.451 +xx,0,0.02,30,5,2.154 +xx,0,0.02,30,15,1.885 +xx,0,0.02,30,25,1.8 +xx,0,0.02,30,35,1.96 +xx,0,0.02,37.1,-15,2.606 +xx,0,0.02,37.1,-5,2.329 +xx,0,0.02,37.1,5,2.078 +xx,0,0.02,37.1,15,1.851 +xx,0,0.02,37.1,25,1.777 +xx,0,0.02,37.1,35,1.907 +xx,0,0.03,12.1,-15,5.514 +xx,0,0.03,12.1,-5,4.37 +xx,0,0.03,12.1,5,3.391 +xx,0,0.03,12.1,15,2.58 +xx,0,0.03,12.1,25,2.364 +xx,0,0.03,12.1,35,2.859 +xx,0,0.03,18,-15,4.293 +xx,0,0.03,18,-5,3.573 +xx,0,0.03,18,5,2.949 +xx,0,0.03,18,15,2.424 +xx,0,0.03,18,25,2.278 +xx,0,0.03,18,35,2.596 +xx,0,0.03,25.2,-15,3.405 +xx,0,0.03,25.2,-5,3.01 +xx,0,0.03,25.2,5,2.652 +xx,0,0.03,25.2,15,2.33 +xx,0,0.03,25.2,25,2.231 +xx,0,0.03,25.2,35,2.427 +xx,0,0.03,30,-15,3.187 +xx,0,0.03,30,-5,2.862 +xx,0,0.03,30,5,2.566 +xx,0,0.03,30,15,2.297 +xx,0,0.03,30,25,2.211 +xx,0,0.03,30,35,2.371 +xx,0,0.03,37.1,-15,3.028 +xx,0,0.03,37.1,-5,2.752 +xx,0,0.03,37.1,5,2.5 +xx,0,0.03,37.1,15,2.274 +xx,0,0.03,37.1,25,2.2 +xx,0,0.03,37.1,35,2.329 +xx,0,0.04,12.1,-15,5.9 +xx,0,0.04,12.1,-5,4.756 +xx,0,0.04,12.1,5,3.777 +xx,0,0.04,12.1,15,2.966 +xx,0,0.04,12.1,25,2.75 +xx,0,0.04,12.1,35,3.245 +xx,0,0.04,18,-15,4.691 +xx,0,0.04,18,-5,3.971 +xx,0,0.04,18,5,3.347 +xx,0,0.04,18,15,2.821 +xx,0,0.04,18,25,2.676 +xx,0,0.04,18,35,2.994 +xx,0,0.04,25.2,-15,3.806 +xx,0,0.04,25.2,-5,3.411 +xx,0,0.04,25.2,5,3.053 +xx,0,0.04,25.2,15,2.732 +xx,0,0.04,25.2,25,2.633 +xx,0,0.04,25.2,35,2.828 +xx,0,0.04,30,-15,3.599 +xx,0,0.04,30,-5,3.274 +xx,0,0.04,30,5,2.977 +xx,0,0.04,30,15,2.709 +xx,0,0.04,30,25,2.623 +xx,0,0.04,30,35,2.783 +xx,0,0.04,37.1,-15,3.451 +xx,0,0.04,37.1,-5,3.175 +xx,0,0.04,37.1,5,2.923 +xx,0,0.04,37.1,15,2.696 +xx,0,0.04,37.1,25,2.623 +xx,0,0.04,37.1,35,2.752 +xx,0.3,-0.04,12.1,-15,2.648 +xx,0.3,-0.04,12.1,-5,1.504 +xx,0.3,-0.04,12.1,5,0.526 +xx,0.3,-0.04,12.1,15,-0.284 +xx,0.3,-0.04,12.1,25,-0.177 +xx,0.3,-0.04,12.1,35,0.373 +xx,0.3,-0.04,18,-15,1.4 +xx,0.3,-0.04,18,-5,0.682 +xx,0.3,-0.04,18,5,0.059 +xx,0.3,-0.04,18,15,-0.466 +xx,0.3,-0.04,18,25,-0.393 +xx,0.3,-0.04,18,35,-0.036 +xx,0.3,-0.04,25.2,-15,0.505 +xx,0.3,-0.04,25.2,-5,0.111 +xx,0.3,-0.04,25.2,5,-0.246 +xx,0.3,-0.04,25.2,15,-0.566 +xx,0.3,-0.04,25.2,25,-0.508 +xx,0.3,-0.04,25.2,35,-0.285 +xx,0.3,-0.04,30,-15,0.268 +xx,0.3,-0.04,30,-5,-0.054 +xx,0.3,-0.04,30,5,-0.349 +xx,0.3,-0.04,30,15,-0.616 +xx,0.3,-0.04,30,25,-0.569 +xx,0.3,-0.04,30,35,-0.385 +xx,0.3,-0.04,37.1,-15,0.085 +xx,0.3,-0.04,37.1,-5,-0.189 +xx,0.3,-0.04,37.1,5,-0.437 +xx,0.3,-0.04,37.1,15,-0.661 +xx,0.3,-0.04,37.1,25,-0.627 +xx,0.3,-0.04,37.1,35,-0.477 +xx,0.3,-0.03,12.1,-15,3.025 +xx,0.3,-0.03,12.1,-5,1.881 +xx,0.3,-0.03,12.1,5,0.902 +xx,0.3,-0.03,12.1,15,0.092 +xx,0.3,-0.03,12.1,25,0.2 +xx,0.3,-0.03,12.1,35,0.75 +xx,0.3,-0.03,18,-15,1.786 +xx,0.3,-0.03,18,-5,1.067 +xx,0.3,-0.03,18,5,0.444 +xx,0.3,-0.03,18,15,-0.08 +xx,0.3,-0.03,18,25,-0.007 +xx,0.3,-0.03,18,35,0.349 +xx,0.3,-0.03,25.2,-15,0.901 +xx,0.3,-0.03,25.2,-5,0.507 +xx,0.3,-0.03,25.2,5,0.151 +xx,0.3,-0.03,25.2,15,-0.17 +xx,0.3,-0.03,25.2,25,-0.112 +xx,0.3,-0.03,25.2,35,0.111 +xx,0.3,-0.03,30,-15,0.651 +xx,0.3,-0.03,30,-5,0.329 +xx,0.3,-0.03,30,5,0.034 +xx,0.3,-0.03,30,15,-0.233 +xx,0.3,-0.03,30,25,-0.186 +xx,0.3,-0.03,30,35,-0.002 +xx,0.3,-0.03,37.1,-15,0.455 +xx,0.3,-0.03,37.1,-5,0.181 +xx,0.3,-0.03,37.1,5,-0.067 +xx,0.3,-0.03,37.1,15,-0.292 +xx,0.3,-0.03,37.1,25,-0.257 +xx,0.3,-0.03,37.1,35,-0.107 +xx,0.3,-0.02,12.1,-15,3.402 +xx,0.3,-0.02,12.1,-5,2.257 +xx,0.3,-0.02,12.1,5,1.279 +xx,0.3,-0.02,12.1,15,0.469 +xx,0.3,-0.02,12.1,25,0.577 +xx,0.3,-0.02,12.1,35,1.127 +xx,0.3,-0.02,18,-15,2.171 +xx,0.3,-0.02,18,-5,1.452 +xx,0.3,-0.02,18,5,0.83 +xx,0.3,-0.02,18,15,0.305 +xx,0.3,-0.02,18,25,0.378 +xx,0.3,-0.02,18,35,0.735 +xx,0.3,-0.02,25.2,-15,1.298 +xx,0.3,-0.02,25.2,-5,0.904 +xx,0.3,-0.02,25.2,5,0.548 +xx,0.3,-0.02,25.2,15,0.227 +xx,0.3,-0.02,25.2,25,0.285 +xx,0.3,-0.02,25.2,35,0.508 +xx,0.3,-0.02,30,-15,1.035 +xx,0.3,-0.02,30,-5,0.713 +xx,0.3,-0.02,30,5,0.418 +xx,0.3,-0.02,30,15,0.151 +xx,0.3,-0.02,30,25,0.198 +xx,0.3,-0.02,30,35,0.382 +xx,0.3,-0.02,37.1,-15,0.825 +xx,0.3,-0.02,37.1,-5,0.551 +xx,0.3,-0.02,37.1,5,0.303 +xx,0.3,-0.02,37.1,15,0.078 +xx,0.3,-0.02,37.1,25,0.113 +xx,0.3,-0.02,37.1,35,0.263 +xx,0.3,-0.01,12.1,-15,3.79 +xx,0.3,-0.01,12.1,-5,2.646 +xx,0.3,-0.01,12.1,5,1.667 +xx,0.3,-0.01,12.1,15,0.856 +xx,0.3,-0.01,12.1,25,0.964 +xx,0.3,-0.01,12.1,35,1.514 +xx,0.3,-0.01,18,-15,2.587 +xx,0.3,-0.01,18,-5,1.867 +xx,0.3,-0.01,18,5,1.243 +xx,0.3,-0.01,18,15,0.717 +xx,0.3,-0.01,18,25,0.79 +xx,0.3,-0.01,18,35,1.145 +xx,0.3,-0.01,25.2,-15,1.728 +xx,0.3,-0.01,25.2,-5,1.333 +xx,0.3,-0.01,25.2,5,0.975 +xx,0.3,-0.01,25.2,15,0.653 +xx,0.3,-0.01,25.2,25,0.71 +xx,0.3,-0.01,25.2,35,0.932 +xx,0.3,-0.01,30,-15,1.475 +xx,0.3,-0.01,30,-5,1.151 +xx,0.3,-0.01,30,5,0.854 +xx,0.3,-0.01,30,15,0.585 +xx,0.3,-0.01,30,25,0.63 +xx,0.3,-0.01,30,35,0.813 +xx,0.3,-0.01,37.1,-15,1.278 +xx,0.3,-0.01,37.1,-5,1.002 +xx,0.3,-0.01,37.1,5,0.75 +xx,0.3,-0.01,37.1,15,0.523 +xx,0.3,-0.01,37.1,25,0.555 +xx,0.3,-0.01,37.1,35,0.703 +xx,0.3,0,12.1,-15,4.23 +xx,0.3,0,12.1,-5,3.086 +xx,0.3,0,12.1,5,2.107 +xx,0.3,0,12.1,15,1.296 +xx,0.3,0,12.1,25,1.404 +xx,0.3,0,12.1,35,1.953 +xx,0.3,0,18,-15,3.04 +xx,0.3,0,18,-5,2.32 +xx,0.3,0,18,5,1.696 +xx,0.3,0,18,15,1.17 +xx,0.3,0,18,25,1.243 +xx,0.3,0,18,35,1.598 +xx,0.3,0,25.2,-15,2.185 +xx,0.3,0,25.2,-5,1.79 +xx,0.3,0,25.2,5,1.432 +xx,0.3,0,25.2,15,1.11 +xx,0.3,0,25.2,25,1.167 +xx,0.3,0,25.2,35,1.389 +xx,0.3,0,30,-15,1.944 +xx,0.3,0,30,-5,1.619 +xx,0.3,0,30,5,1.323 +xx,0.3,0,30,15,1.054 +xx,0.3,0,30,25,1.099 +xx,0.3,0,30,35,1.282 +xx,0.3,0,37.1,-15,1.759 +xx,0.3,0,37.1,-5,1.483 +xx,0.3,0,37.1,5,1.232 +xx,0.3,0,37.1,15,1.005 +xx,0.3,0,37.1,25,1.037 +xx,0.3,0,37.1,35,1.184 +xx,0.3,0.01,12.1,-15,4.67 +xx,0.3,0.01,12.1,-5,3.526 +xx,0.3,0.01,12.1,5,2.547 +xx,0.3,0.01,12.1,15,1.737 +xx,0.3,0.01,12.1,25,1.844 +xx,0.3,0.01,12.1,35,2.394 +xx,0.3,0.01,18,-15,3.494 +xx,0.3,0.01,18,-5,2.773 +xx,0.3,0.01,18,5,2.15 +xx,0.3,0.01,18,15,1.624 +xx,0.3,0.01,18,25,1.696 +xx,0.3,0.01,18,35,2.052 +xx,0.3,0.01,25.2,-15,2.642 +xx,0.3,0.01,25.2,-5,2.247 +xx,0.3,0.01,25.2,5,1.889 +xx,0.3,0.01,25.2,15,1.567 +xx,0.3,0.01,25.2,25,1.624 +xx,0.3,0.01,25.2,35,1.846 +xx,0.3,0.01,30,-15,2.413 +xx,0.3,0.01,30,-5,2.089 +xx,0.3,0.01,30,5,1.792 +xx,0.3,0.01,30,15,1.523 +xx,0.3,0.01,30,25,1.568 +xx,0.3,0.01,30,35,1.751 +xx,0.3,0.01,37.1,-15,2.241 +xx,0.3,0.01,37.1,-5,1.965 +xx,0.3,0.01,37.1,5,1.713 +xx,0.3,0.01,37.1,15,1.487 +xx,0.3,0.01,37.1,25,1.518 +xx,0.3,0.01,37.1,35,1.666 +xx,0.3,0.02,12.1,-15,5.111 +xx,0.3,0.02,12.1,-5,3.966 +xx,0.3,0.02,12.1,5,2.987 +xx,0.3,0.02,12.1,15,2.177 +xx,0.3,0.02,12.1,25,2.284 +xx,0.3,0.02,12.1,35,2.834 +xx,0.3,0.02,18,-15,3.947 +xx,0.3,0.02,18,-5,3.227 +xx,0.3,0.02,18,5,2.604 +xx,0.3,0.02,18,15,2.078 +xx,0.3,0.02,18,25,2.15 +xx,0.3,0.02,18,35,2.506 +xx,0.3,0.02,25.2,-15,3.099 +xx,0.3,0.02,25.2,-5,2.704 +xx,0.3,0.02,25.2,5,2.346 +xx,0.3,0.02,25.2,15,2.024 +xx,0.3,0.02,25.2,25,2.081 +xx,0.3,0.02,25.2,35,2.303 +xx,0.3,0.02,30,-15,2.882 +xx,0.3,0.02,30,-5,2.558 +xx,0.3,0.02,30,5,2.261 +xx,0.3,0.02,30,15,1.992 +xx,0.3,0.02,30,25,2.037 +xx,0.3,0.02,30,35,2.22 +xx,0.3,0.02,37.1,-15,2.723 +xx,0.3,0.02,37.1,-5,2.447 +xx,0.3,0.02,37.1,5,2.195 +xx,0.3,0.02,37.1,15,1.969 +xx,0.3,0.02,37.1,25,2.001 +xx,0.3,0.02,37.1,35,2.148 +xx,0.3,0.03,12.1,-15,5.551 +xx,0.3,0.03,12.1,-5,4.406 +xx,0.3,0.03,12.1,5,3.428 +xx,0.3,0.03,12.1,15,2.617 +xx,0.3,0.03,12.1,25,2.724 +xx,0.3,0.03,12.1,35,3.274 +xx,0.3,0.03,18,-15,4.401 +xx,0.3,0.03,18,-5,3.681 +xx,0.3,0.03,18,5,3.057 +xx,0.3,0.03,18,15,2.532 +xx,0.3,0.03,18,25,2.604 +xx,0.3,0.03,18,35,2.96 +xx,0.3,0.03,25.2,-15,3.557 +xx,0.3,0.03,25.2,-5,3.162 +xx,0.3,0.03,25.2,5,2.804 +xx,0.3,0.03,25.2,15,2.482 +xx,0.3,0.03,25.2,25,2.539 +xx,0.3,0.03,25.2,35,2.761 +xx,0.3,0.03,30,-15,3.352 +xx,0.3,0.03,30,-5,3.027 +xx,0.3,0.03,30,5,2.73 +xx,0.3,0.03,30,15,2.462 +xx,0.3,0.03,30,25,2.507 +xx,0.3,0.03,30,35,2.689 +xx,0.3,0.03,37.1,-15,3.205 +xx,0.3,0.03,37.1,-5,2.929 +xx,0.3,0.03,37.1,5,2.677 +xx,0.3,0.03,37.1,15,2.451 +xx,0.3,0.03,37.1,25,2.483 +xx,0.3,0.03,37.1,35,2.63 +xx,0.3,0.04,12.1,-15,5.991 +xx,0.3,0.04,12.1,-5,4.847 +xx,0.3,0.04,12.1,5,3.868 +xx,0.3,0.04,12.1,15,3.057 +xx,0.3,0.04,12.1,25,3.165 +xx,0.3,0.04,12.1,35,3.714 +xx,0.3,0.04,18,-15,4.855 +xx,0.3,0.04,18,-5,4.135 +xx,0.3,0.04,18,5,3.511 +xx,0.3,0.04,18,15,2.985 +xx,0.3,0.04,18,25,3.057 +xx,0.3,0.04,18,35,3.413 +xx,0.3,0.04,25.2,-15,4.015 +xx,0.3,0.04,25.2,-5,3.62 +xx,0.3,0.04,25.2,5,3.262 +xx,0.3,0.04,25.2,15,2.94 +xx,0.3,0.04,25.2,25,2.997 +xx,0.3,0.04,25.2,35,3.219 +xx,0.3,0.04,30,-15,3.821 +xx,0.3,0.04,30,-5,3.497 +xx,0.3,0.04,30,5,3.2 +xx,0.3,0.04,30,15,2.931 +xx,0.3,0.04,30,25,2.977 +xx,0.3,0.04,30,35,3.159 +xx,0.3,0.04,37.1,-15,3.687 +xx,0.3,0.04,37.1,-5,3.411 +xx,0.3,0.04,37.1,5,3.159 +xx,0.3,0.04,37.1,15,2.933 +xx,0.3,0.04,37.1,25,2.965 +xx,0.3,0.04,37.1,35,3.112 +xx,0.6,-0.04,12.1,-15,2.329 +xx,0.6,-0.04,12.1,-5,1.185 +xx,0.6,-0.04,12.1,5,0.207 +xx,0.6,-0.04,12.1,15,-0.413 +xx,0.6,-0.04,12.1,25,-0.173 +xx,0.6,-0.04,12.1,35,0.433 +xx,0.6,-0.04,18,-15,1.143 +xx,0.6,-0.04,18,-5,0.424 +xx,0.6,-0.04,18,5,-0.198 +xx,0.6,-0.04,18,15,-0.594 +xx,0.6,-0.04,18,25,-0.432 +xx,0.6,-0.04,18,35,-0.038 +xx,0.6,-0.04,25.2,-15,0.286 +xx,0.6,-0.04,25.2,-5,-0.108 +xx,0.6,-0.04,25.2,5,-0.465 +xx,0.6,-0.04,25.2,15,-0.689 +xx,0.6,-0.04,25.2,25,-0.572 +xx,0.6,-0.04,25.2,35,-0.322 +xx,0.6,-0.04,30,-15,0.061 +xx,0.6,-0.04,30,-5,-0.262 +xx,0.6,-0.04,30,5,-0.556 +xx,0.6,-0.04,30,15,-0.743 +xx,0.6,-0.04,30,25,-0.646 +xx,0.6,-0.04,30,35,-0.439 +xx,0.6,-0.04,37.1,-15,-0.112 +xx,0.6,-0.04,37.1,-5,-0.385 +xx,0.6,-0.04,37.1,5,-0.634 +xx,0.6,-0.04,37.1,15,-0.795 +xx,0.6,-0.04,37.1,25,-0.718 +xx,0.6,-0.04,37.1,35,-0.55 +xx,0.6,-0.03,12.1,-15,2.752 +xx,0.6,-0.03,12.1,-5,1.608 +xx,0.6,-0.03,12.1,5,0.63 +xx,0.6,-0.03,12.1,15,0.01 +xx,0.6,-0.03,12.1,25,0.251 +xx,0.6,-0.03,12.1,35,0.856 +xx,0.6,-0.03,18,-15,1.576 +xx,0.6,-0.03,18,-5,0.857 +xx,0.6,-0.03,18,5,0.234 +xx,0.6,-0.03,18,15,-0.162 +xx,0.6,-0.03,18,25,0.001 +xx,0.6,-0.03,18,35,0.395 +xx,0.6,-0.03,25.2,-15,0.731 +xx,0.6,-0.03,25.2,-5,0.337 +xx,0.6,-0.03,25.2,5,-0.02 +xx,0.6,-0.03,25.2,15,-0.244 +xx,0.6,-0.03,25.2,25,-0.127 +xx,0.6,-0.03,25.2,35,0.123 +xx,0.6,-0.03,30,-15,0.491 +xx,0.6,-0.03,30,-5,0.168 +xx,0.6,-0.03,30,5,-0.126 +xx,0.6,-0.03,30,15,-0.313 +xx,0.6,-0.03,30,25,-0.216 +xx,0.6,-0.03,30,35,-0.009 +xx,0.6,-0.03,37.1,-15,0.303 +xx,0.6,-0.03,37.1,-5,0.03 +xx,0.6,-0.03,37.1,5,-0.218 +xx,0.6,-0.03,37.1,15,-0.379 +xx,0.6,-0.03,37.1,25,-0.303 +xx,0.6,-0.03,37.1,35,-0.134 +xx,0.6,-0.02,12.1,-15,3.175 +xx,0.6,-0.02,12.1,-5,2.031 +xx,0.6,-0.02,12.1,5,1.053 +xx,0.6,-0.02,12.1,15,0.433 +xx,0.6,-0.02,12.1,25,0.674 +xx,0.6,-0.02,12.1,35,1.279 +xx,0.6,-0.02,18,-15,2.008 +xx,0.6,-0.02,18,-5,1.29 +xx,0.6,-0.02,18,5,0.667 +xx,0.6,-0.02,18,15,0.271 +xx,0.6,-0.02,18,25,0.434 +xx,0.6,-0.02,18,35,0.828 +xx,0.6,-0.02,25.2,-15,1.176 +xx,0.6,-0.02,25.2,-5,0.783 +xx,0.6,-0.02,25.2,5,0.426 +xx,0.6,-0.02,25.2,15,0.202 +xx,0.6,-0.02,25.2,25,0.319 +xx,0.6,-0.02,25.2,35,0.569 +xx,0.6,-0.02,30,-15,0.922 +xx,0.6,-0.02,30,-5,0.599 +xx,0.6,-0.02,30,5,0.305 +xx,0.6,-0.02,30,15,0.118 +xx,0.6,-0.02,30,25,0.215 +xx,0.6,-0.02,30,35,0.422 +xx,0.6,-0.02,37.1,-15,0.719 +xx,0.6,-0.02,37.1,-5,0.446 +xx,0.6,-0.02,37.1,5,0.197 +xx,0.6,-0.02,37.1,15,0.036 +xx,0.6,-0.02,37.1,25,0.113 +xx,0.6,-0.02,37.1,35,0.281 +xx,0.6,-0.01,12.1,-15,3.611 +xx,0.6,-0.01,12.1,-5,2.466 +xx,0.6,-0.01,12.1,5,1.487 +xx,0.6,-0.01,12.1,15,0.867 +xx,0.6,-0.01,12.1,25,1.107 +xx,0.6,-0.01,12.1,35,1.713 +xx,0.6,-0.01,18,-15,2.472 +xx,0.6,-0.01,18,-5,1.751 +xx,0.6,-0.01,18,5,1.128 +xx,0.6,-0.01,18,15,0.731 +xx,0.6,-0.01,18,25,0.893 +xx,0.6,-0.01,18,35,1.286 +xx,0.6,-0.01,25.2,-15,1.655 +xx,0.6,-0.01,25.2,-5,1.26 +xx,0.6,-0.01,25.2,5,0.902 +xx,0.6,-0.01,25.2,15,0.677 +xx,0.6,-0.01,25.2,25,0.793 +xx,0.6,-0.01,25.2,35,1.042 +xx,0.6,-0.01,30,-15,1.409 +xx,0.6,-0.01,30,-5,1.085 +xx,0.6,-0.01,30,5,0.788 +xx,0.6,-0.01,30,15,0.599 +xx,0.6,-0.01,30,25,0.695 +xx,0.6,-0.01,30,35,0.9 +xx,0.6,-0.01,37.1,-15,1.218 +xx,0.6,-0.01,37.1,-5,0.941 +xx,0.6,-0.01,37.1,5,0.69 +xx,0.6,-0.01,37.1,15,0.526 +xx,0.6,-0.01,37.1,25,0.601 +xx,0.6,-0.01,37.1,35,0.767 +xx,0.6,0,12.1,-15,4.104 +xx,0.6,0,12.1,-5,2.96 +xx,0.6,0,12.1,5,1.981 +xx,0.6,0,12.1,15,1.36 +xx,0.6,0,12.1,25,1.601 +xx,0.6,0,12.1,35,2.206 +xx,0.6,0,18,-15,2.98 +xx,0.6,0,18,-5,2.26 +xx,0.6,0,18,5,1.637 +xx,0.6,0,18,15,1.24 +xx,0.6,0,18,25,1.401 +xx,0.6,0,18,35,1.794 +xx,0.6,0,25.2,-15,2.168 +xx,0.6,0,25.2,-5,1.773 +xx,0.6,0,25.2,5,1.415 +xx,0.6,0,25.2,15,1.19 +xx,0.6,0,25.2,25,1.306 +xx,0.6,0,25.2,35,1.555 +xx,0.6,0,30,-15,1.936 +xx,0.6,0,30,-5,1.611 +xx,0.6,0,30,5,1.314 +xx,0.6,0,30,15,1.126 +xx,0.6,0,30,25,1.222 +xx,0.6,0,30,35,1.426 +xx,0.6,0,37.1,-15,1.759 +xx,0.6,0,37.1,-5,1.482 +xx,0.6,0,37.1,5,1.231 +xx,0.6,0,37.1,15,1.067 +xx,0.6,0,37.1,25,1.141 +xx,0.6,0,37.1,35,1.307 +xx,0.6,0.01,12.1,-15,4.599 +xx,0.6,0.01,12.1,-5,3.454 +xx,0.6,0.01,12.1,5,2.476 +xx,0.6,0.01,12.1,15,1.855 +xx,0.6,0.01,12.1,25,2.096 +xx,0.6,0.01,12.1,35,2.701 +xx,0.6,0.01,18,-15,3.49 +xx,0.6,0.01,18,-5,2.77 +xx,0.6,0.01,18,5,2.146 +xx,0.6,0.01,18,15,1.749 +xx,0.6,0.01,18,25,1.911 +xx,0.6,0.01,18,35,2.304 +xx,0.6,0.01,25.2,-15,2.681 +xx,0.6,0.01,25.2,-5,2.287 +xx,0.6,0.01,25.2,5,1.928 +xx,0.6,0.01,25.2,15,1.703 +xx,0.6,0.01,25.2,25,1.819 +xx,0.6,0.01,25.2,35,2.068 +xx,0.6,0.01,30,-15,2.463 +xx,0.6,0.01,30,-5,2.138 +xx,0.6,0.01,30,5,1.841 +xx,0.6,0.01,30,15,1.653 +xx,0.6,0.01,30,25,1.748 +xx,0.6,0.01,30,35,1.953 +xx,0.6,0.01,37.1,-15,2.3 +xx,0.6,0.01,37.1,-5,2.023 +xx,0.6,0.01,37.1,5,1.772 +xx,0.6,0.01,37.1,15,1.608 +xx,0.6,0.01,37.1,25,1.683 +xx,0.6,0.01,37.1,35,1.848 +xx,0.6,0.02,12.1,-15,5.093 +xx,0.6,0.02,12.1,-5,3.949 +xx,0.6,0.02,12.1,5,2.97 +xx,0.6,0.02,12.1,15,2.349 +xx,0.6,0.02,12.1,25,2.59 +xx,0.6,0.02,12.1,35,3.195 +xx,0.6,0.02,18,-15,3.999 +xx,0.6,0.02,18,-5,3.279 +xx,0.6,0.02,18,5,2.656 +xx,0.6,0.02,18,15,2.259 +xx,0.6,0.02,18,25,2.42 +xx,0.6,0.02,18,35,2.814 +xx,0.6,0.02,25.2,-15,3.195 +xx,0.6,0.02,25.2,-5,2.8 +xx,0.6,0.02,25.2,5,2.442 +xx,0.6,0.02,25.2,15,2.216 +xx,0.6,0.02,25.2,25,2.333 +xx,0.6,0.02,25.2,35,2.582 +xx,0.6,0.02,30,-15,2.989 +xx,0.6,0.02,30,-5,2.665 +xx,0.6,0.02,30,5,2.368 +xx,0.6,0.02,30,15,2.179 +xx,0.6,0.02,30,25,2.275 +xx,0.6,0.02,30,35,2.48 +xx,0.6,0.02,37.1,-15,2.841 +xx,0.6,0.02,37.1,-5,2.565 +xx,0.6,0.02,37.1,5,2.313 +xx,0.6,0.02,37.1,15,2.15 +xx,0.6,0.02,37.1,25,2.224 +xx,0.6,0.02,37.1,35,2.39 +xx,0.6,0.03,12.1,-15,5.588 +xx,0.6,0.03,12.1,-5,4.443 +xx,0.6,0.03,12.1,5,3.464 +xx,0.6,0.03,12.1,15,2.844 +xx,0.6,0.03,12.1,25,3.084 +xx,0.6,0.03,12.1,35,3.69 +xx,0.6,0.03,18,-15,4.509 +xx,0.6,0.03,18,-5,3.789 +xx,0.6,0.03,18,5,3.165 +xx,0.6,0.03,18,15,2.768 +xx,0.6,0.03,18,25,2.93 +xx,0.6,0.03,18,35,3.323 +xx,0.6,0.03,25.2,-15,3.709 +xx,0.6,0.03,25.2,-5,3.314 +xx,0.6,0.03,25.2,5,2.956 +xx,0.6,0.03,25.2,15,2.731 +xx,0.6,0.03,25.2,25,2.847 +xx,0.6,0.03,25.2,35,3.096 +xx,0.6,0.03,30,-15,3.517 +xx,0.6,0.03,30,-5,3.192 +xx,0.6,0.03,30,5,2.895 +xx,0.6,0.03,30,15,2.707 +xx,0.6,0.03,30,25,2.802 +xx,0.6,0.03,30,35,3.007 +xx,0.6,0.03,37.1,-15,3.382 +xx,0.6,0.03,37.1,-5,3.106 +xx,0.6,0.03,37.1,5,2.855 +xx,0.6,0.03,37.1,15,2.691 +xx,0.6,0.03,37.1,25,2.765 +xx,0.6,0.03,37.1,35,2.931 +xx,0.6,0.04,12.1,-15,6.082 +xx,0.6,0.04,12.1,-5,4.938 +xx,0.6,0.04,12.1,5,3.959 +xx,0.6,0.04,12.1,15,3.338 +xx,0.6,0.04,12.1,25,3.579 +xx,0.6,0.04,12.1,35,4.184 +xx,0.6,0.04,18,-15,5.018 +xx,0.6,0.04,18,-5,4.298 +xx,0.6,0.04,18,5,3.675 +xx,0.6,0.04,18,15,3.278 +xx,0.6,0.04,18,25,3.439 +xx,0.6,0.04,18,35,3.833 +xx,0.6,0.04,25.2,-15,4.223 +xx,0.6,0.04,25.2,-5,3.828 +xx,0.6,0.04,25.2,5,3.47 +xx,0.6,0.04,25.2,15,3.245 +xx,0.6,0.04,25.2,25,3.361 +xx,0.6,0.04,25.2,35,3.61 +xx,0.6,0.04,30,-15,4.044 +xx,0.6,0.04,30,-5,3.719 +xx,0.6,0.04,30,5,3.423 +xx,0.6,0.04,30,15,3.234 +xx,0.6,0.04,30,25,3.33 +xx,0.6,0.04,30,35,3.535 +xx,0.6,0.04,37.1,-15,3.924 +xx,0.6,0.04,37.1,-5,3.647 +xx,0.6,0.04,37.1,5,3.396 +xx,0.6,0.04,37.1,15,3.232 +xx,0.6,0.04,37.1,25,3.307 +xx,0.6,0.04,37.1,35,3.472 +xx,0.9,-0.04,12.1,-15,2.01 +xx,0.9,-0.04,12.1,-5,0.866 +xx,0.9,-0.04,12.1,5,-0.112 +xx,0.9,-0.04,12.1,15,-0.504 +xx,0.9,-0.04,12.1,25,-0.168 +xx,0.9,-0.04,12.1,35,0.493 +xx,0.9,-0.04,18,-15,0.886 +xx,0.9,-0.04,18,-5,0.167 +xx,0.9,-0.04,18,5,-0.456 +xx,0.9,-0.04,18,15,-0.694 +xx,0.9,-0.04,18,25,-0.471 +xx,0.9,-0.04,18,35,-0.04 +xx,0.9,-0.04,25.2,-15,0.067 +xx,0.9,-0.04,25.2,-5,-0.327 +xx,0.9,-0.04,25.2,5,-0.684 +xx,0.9,-0.04,25.2,15,-0.789 +xx,0.9,-0.04,25.2,25,-0.635 +xx,0.9,-0.04,25.2,35,-0.359 +xx,0.9,-0.04,30,-15,-0.147 +xx,0.9,-0.04,30,-5,-0.469 +xx,0.9,-0.04,30,5,-0.764 +xx,0.9,-0.04,30,15,-0.85 +xx,0.9,-0.04,30,25,-0.723 +xx,0.9,-0.04,30,35,-0.494 +xx,0.9,-0.04,37.1,-15,-0.308 +xx,0.9,-0.04,37.1,-5,-0.582 +xx,0.9,-0.04,37.1,5,-0.83 +xx,0.9,-0.04,37.1,15,-0.91 +xx,0.9,-0.04,37.1,25,-0.809 +xx,0.9,-0.04,37.1,35,-0.622 +xx,0.9,-0.03,12.1,-15,2.48 +xx,0.9,-0.03,12.1,-5,1.336 +xx,0.9,-0.03,12.1,5,0.357 +xx,0.9,-0.03,12.1,15,-0.034 +xx,0.9,-0.03,12.1,25,0.301 +xx,0.9,-0.03,12.1,35,0.963 +xx,0.9,-0.03,18,-15,1.366 +xx,0.9,-0.03,18,-5,0.647 +xx,0.9,-0.03,18,5,0.024 +xx,0.9,-0.03,18,15,-0.214 +xx,0.9,-0.03,18,25,0.009 +xx,0.9,-0.03,18,35,0.441 +xx,0.9,-0.03,25.2,-15,0.56 +xx,0.9,-0.03,25.2,-5,0.167 +xx,0.9,-0.03,25.2,5,-0.19 +xx,0.9,-0.03,25.2,15,-0.295 +xx,0.9,-0.03,25.2,25,-0.141 +xx,0.9,-0.03,25.2,35,0.135 +xx,0.9,-0.03,30,-15,0.331 +xx,0.9,-0.03,30,-5,0.008 +xx,0.9,-0.03,30,5,-0.287 +xx,0.9,-0.03,30,15,-0.373 +xx,0.9,-0.03,30,25,-0.245 +xx,0.9,-0.03,30,35,-0.016 +xx,0.9,-0.03,37.1,-15,0.152 +xx,0.9,-0.03,37.1,-5,-0.121 +xx,0.9,-0.03,37.1,5,-0.37 +xx,0.9,-0.03,37.1,15,-0.45 +xx,0.9,-0.03,37.1,25,-0.348 +xx,0.9,-0.03,37.1,35,-0.162 +xx,0.9,-0.02,12.1,-15,2.949 +xx,0.9,-0.02,12.1,-5,1.805 +xx,0.9,-0.02,12.1,5,0.827 +xx,0.9,-0.02,12.1,15,0.435 +xx,0.9,-0.02,12.1,25,0.771 +xx,0.9,-0.02,12.1,35,1.432 +xx,0.9,-0.02,18,-15,1.846 +xx,0.9,-0.02,18,-5,1.127 +xx,0.9,-0.02,18,5,0.504 +xx,0.9,-0.02,18,15,0.266 +xx,0.9,-0.02,18,25,0.489 +xx,0.9,-0.02,18,35,0.921 +xx,0.9,-0.02,25.2,-15,1.055 +xx,0.9,-0.02,25.2,-5,0.661 +xx,0.9,-0.02,25.2,5,0.304 +xx,0.9,-0.02,25.2,15,0.199 +xx,0.9,-0.02,25.2,25,0.353 +xx,0.9,-0.02,25.2,35,0.63 +xx,0.9,-0.02,30,-15,0.809 +xx,0.9,-0.02,30,-5,0.486 +xx,0.9,-0.02,30,5,0.191 +xx,0.9,-0.02,30,15,0.105 +xx,0.9,-0.02,30,25,0.233 +xx,0.9,-0.02,30,35,0.462 +xx,0.9,-0.02,37.1,-15,0.613 +xx,0.9,-0.02,37.1,-5,0.34 +xx,0.9,-0.02,37.1,5,0.091 +xx,0.9,-0.02,37.1,15,0.011 +xx,0.9,-0.02,37.1,25,0.113 +xx,0.9,-0.02,37.1,35,0.299 +xx,0.9,-0.01,12.1,-15,3.431 +xx,0.9,-0.01,12.1,-5,2.286 +xx,0.9,-0.01,12.1,5,1.307 +xx,0.9,-0.01,12.1,15,0.915 +xx,0.9,-0.01,12.1,25,1.251 +xx,0.9,-0.01,12.1,35,1.911 +xx,0.9,-0.01,18,-15,2.356 +xx,0.9,-0.01,18,-5,1.636 +xx,0.9,-0.01,18,5,1.013 +xx,0.9,-0.01,18,15,0.773 +xx,0.9,-0.01,18,25,0.995 +xx,0.9,-0.01,18,35,1.426 +xx,0.9,-0.01,25.2,-15,1.582 +xx,0.9,-0.01,25.2,-5,1.187 +xx,0.9,-0.01,25.2,5,0.829 +xx,0.9,-0.01,25.2,15,0.723 +xx,0.9,-0.01,25.2,25,0.876 +xx,0.9,-0.01,25.2,35,1.152 +xx,0.9,-0.01,30,-15,1.343 +xx,0.9,-0.01,30,-5,1.019 +xx,0.9,-0.01,30,5,0.722 +xx,0.9,-0.01,30,15,0.634 +xx,0.9,-0.01,30,25,0.76 +xx,0.9,-0.01,30,35,0.987 +xx,0.9,-0.01,37.1,-15,1.158 +xx,0.9,-0.01,37.1,-5,0.881 +xx,0.9,-0.01,37.1,5,0.63 +xx,0.9,-0.01,37.1,15,0.547 +xx,0.9,-0.01,37.1,25,0.646 +xx,0.9,-0.01,37.1,35,0.83 +xx,0.9,0,12.1,-15,3.979 +xx,0.9,0,12.1,-5,2.834 +xx,0.9,0,12.1,5,1.855 +xx,0.9,0,12.1,15,1.463 +xx,0.9,0,12.1,25,1.798 +xx,0.9,0,12.1,35,2.459 +xx,0.9,0,18,-15,2.921 +xx,0.9,0,18,-5,2.201 +xx,0.9,0,18,5,1.577 +xx,0.9,0,18,15,1.338 +xx,0.9,0,18,25,1.56 +xx,0.9,0,18,35,1.991 +xx,0.9,0,25.2,-15,2.151 +xx,0.9,0,25.2,-5,1.756 +xx,0.9,0,25.2,5,1.398 +xx,0.9,0,25.2,15,1.292 +xx,0.9,0,25.2,25,1.445 +xx,0.9,0,25.2,35,1.721 +xx,0.9,0,30,-15,1.927 +xx,0.9,0,30,-5,1.603 +xx,0.9,0,30,5,1.306 +xx,0.9,0,30,15,1.218 +xx,0.9,0,30,25,1.344 +xx,0.9,0,30,35,1.571 +xx,0.9,0,37.1,-15,1.758 +xx,0.9,0,37.1,-5,1.481 +xx,0.9,0,37.1,5,1.23 +xx,0.9,0,37.1,15,1.147 +xx,0.9,0,37.1,25,1.246 +xx,0.9,0,37.1,35,1.43 +xx,0.9,0.01,12.1,-15,4.528 +xx,0.9,0.01,12.1,-5,3.383 +xx,0.9,0.01,12.1,5,2.404 +xx,0.9,0.01,12.1,15,2.012 +xx,0.9,0.01,12.1,25,2.347 +xx,0.9,0.01,12.1,35,3.008 +xx,0.9,0.01,18,-15,3.486 +xx,0.9,0.01,18,-5,2.766 +xx,0.9,0.01,18,5,2.143 +xx,0.9,0.01,18,15,1.903 +xx,0.9,0.01,18,25,2.125 +xx,0.9,0.01,18,35,2.556 +xx,0.9,0.01,25.2,-15,2.721 +xx,0.9,0.01,25.2,-5,2.326 +xx,0.9,0.01,25.2,5,1.968 +xx,0.9,0.01,25.2,15,1.862 +xx,0.9,0.01,25.2,25,2.015 +xx,0.9,0.01,25.2,35,2.29 +xx,0.9,0.01,30,-15,2.512 +xx,0.9,0.01,30,-5,2.187 +xx,0.9,0.01,30,5,1.891 +xx,0.9,0.01,30,15,1.803 +xx,0.9,0.01,30,25,1.928 +xx,0.9,0.01,30,35,2.156 +xx,0.9,0.01,37.1,-15,2.358 +xx,0.9,0.01,37.1,-5,2.082 +xx,0.9,0.01,37.1,5,1.83 +xx,0.9,0.01,37.1,15,1.747 +xx,0.9,0.01,37.1,25,1.847 +xx,0.9,0.01,37.1,35,2.031 +xx,0.9,0.02,12.1,-15,5.076 +xx,0.9,0.02,12.1,-5,3.932 +xx,0.9,0.02,12.1,5,2.953 +xx,0.9,0.02,12.1,15,2.561 +xx,0.9,0.02,12.1,25,2.896 +xx,0.9,0.02,12.1,35,3.557 +xx,0.9,0.02,18,-15,4.052 +xx,0.9,0.02,18,-5,3.332 +xx,0.9,0.02,18,5,2.708 +xx,0.9,0.02,18,15,2.468 +xx,0.9,0.02,18,25,2.691 +xx,0.9,0.02,18,35,3.121 +xx,0.9,0.02,25.2,-15,3.291 +xx,0.9,0.02,25.2,-5,2.896 +xx,0.9,0.02,25.2,5,2.538 +xx,0.9,0.02,25.2,15,2.432 +xx,0.9,0.02,25.2,25,2.584 +xx,0.9,0.02,25.2,35,2.86 +xx,0.9,0.02,30,-15,3.096 +xx,0.9,0.02,30,-5,2.772 +xx,0.9,0.02,30,5,2.475 +xx,0.9,0.02,30,15,2.387 +xx,0.9,0.02,30,25,2.513 +xx,0.9,0.02,30,35,2.74 +xx,0.9,0.02,37.1,-15,2.959 +xx,0.9,0.02,37.1,-5,2.683 +xx,0.9,0.02,37.1,5,2.431 +xx,0.9,0.02,37.1,15,2.348 +xx,0.9,0.02,37.1,25,2.447 +xx,0.9,0.02,37.1,35,2.631 +xx,0.9,0.03,12.1,-15,5.625 +xx,0.9,0.03,12.1,-5,4.48 +xx,0.9,0.03,12.1,5,3.501 +xx,0.9,0.03,12.1,15,3.109 +xx,0.9,0.03,12.1,25,3.444 +xx,0.9,0.03,12.1,35,4.105 +xx,0.9,0.03,18,-15,4.617 +xx,0.9,0.03,18,-5,3.897 +xx,0.9,0.03,18,5,3.273 +xx,0.9,0.03,18,15,3.034 +xx,0.9,0.03,18,25,3.256 +xx,0.9,0.03,18,35,3.687 +xx,0.9,0.03,25.2,-15,3.861 +xx,0.9,0.03,25.2,-5,3.466 +xx,0.9,0.03,25.2,5,3.108 +xx,0.9,0.03,25.2,15,3.002 +xx,0.9,0.03,25.2,25,3.155 +xx,0.9,0.03,25.2,35,3.431 +xx,0.9,0.03,30,-15,3.682 +xx,0.9,0.03,30,-5,3.357 +xx,0.9,0.03,30,5,3.06 +xx,0.9,0.03,30,15,2.972 +xx,0.9,0.03,30,25,3.098 +xx,0.9,0.03,30,35,3.325 +xx,0.9,0.03,37.1,-15,3.56 +xx,0.9,0.03,37.1,-5,3.283 +xx,0.9,0.03,37.1,5,3.032 +xx,0.9,0.03,37.1,15,2.949 +xx,0.9,0.03,37.1,25,3.048 +xx,0.9,0.03,37.1,35,3.232 +xx,0.9,0.04,12.1,-15,6.173 +xx,0.9,0.04,12.1,-5,5.029 +xx,0.9,0.04,12.1,5,4.05 +xx,0.9,0.04,12.1,15,3.658 +xx,0.9,0.04,12.1,25,3.993 +xx,0.9,0.04,12.1,35,4.654 +xx,0.9,0.04,18,-15,5.182 +xx,0.9,0.04,18,-5,4.462 +xx,0.9,0.04,18,5,3.839 +xx,0.9,0.04,18,15,3.599 +xx,0.9,0.04,18,25,3.821 +xx,0.9,0.04,18,35,4.252 +xx,0.9,0.04,25.2,-15,4.432 +xx,0.9,0.04,25.2,-5,4.037 +xx,0.9,0.04,25.2,5,3.679 +xx,0.9,0.04,25.2,15,3.573 +xx,0.9,0.04,25.2,25,3.725 +xx,0.9,0.04,25.2,35,4.001 +xx,0.9,0.04,30,-15,4.267 +xx,0.9,0.04,30,-5,3.942 +xx,0.9,0.04,30,5,3.645 +xx,0.9,0.04,30,15,3.557 +xx,0.9,0.04,30,25,3.683 +xx,0.9,0.04,30,35,3.91 +xx,0.9,0.04,37.1,-15,4.16 +xx,0.9,0.04,37.1,-5,3.884 +xx,0.9,0.04,37.1,5,3.632 +xx,0.9,0.04,37.1,15,3.549 +xx,0.9,0.04,37.1,25,3.649 +xx,0.9,0.04,37.1,35,3.833 +CKB,0,-0.04,12.1,-15,3.752 +CKB,0,-0.04,12.1,-5,2.322 +CKB,0,-0.04,12.1,5,1.069 +CKB,0,-0.04,12.1,15,-0.007 +CKB,0,-0.04,12.1,25,-0.308 +CKB,0,-0.04,12.1,35,0.361 +CKB,0,-0.04,18,-15,2.048 +CKB,0,-0.04,18,-5,1.134 +CKB,0,-0.04,18,5,0.323 +CKB,0,-0.04,18,15,-0.384 +CKB,0,-0.04,18,25,-0.588 +CKB,0,-0.04,18,35,-0.149 +CKB,0,-0.04,25.2,-15,0.887 +CKB,0,-0.04,25.2,-5,0.351 +CKB,0,-0.04,25.2,5,-0.143 +CKB,0,-0.04,25.2,15,-0.596 +CKB,0,-0.04,25.2,25,-0.736 +CKB,0,-0.04,25.2,35,-0.453 +CKB,0,-0.04,30,-15,0.534 +CKB,0,-0.04,30,-5,0.091 +CKB,0,-0.04,30,5,-0.32 +CKB,0,-0.04,30,15,-0.7 +CKB,0,-0.04,30,25,-0.82 +CKB,0,-0.04,30,35,-0.584 +CKB,0,-0.04,37.1,-15,0.231 +CKB,0,-0.04,37.1,-5,-0.141 +CKB,0,-0.04,37.1,5,-0.485 +CKB,0,-0.04,37.1,15,-0.801 +CKB,0,-0.04,37.1,25,-0.902 +CKB,0,-0.04,37.1,35,-0.71 +CKB,0,-0.03,12.1,-15,4.248 +CKB,0,-0.03,12.1,-5,2.818 +CKB,0,-0.03,12.1,5,1.564 +CKB,0,-0.03,12.1,15,0.488 +CKB,0,-0.03,12.1,25,0.187 +CKB,0,-0.03,12.1,35,0.856 +CKB,0,-0.03,18,-15,2.555 +CKB,0,-0.03,18,-5,1.641 +CKB,0,-0.03,18,5,0.83 +CKB,0,-0.03,18,15,0.123 +CKB,0,-0.03,18,25,-0.081 +CKB,0,-0.03,18,35,0.358 +CKB,0,-0.03,25.2,-15,1.408 +CKB,0,-0.03,25.2,-5,0.873 +CKB,0,-0.03,25.2,5,0.378 +CKB,0,-0.03,25.2,15,-0.075 +CKB,0,-0.03,25.2,25,-0.215 +CKB,0,-0.03,25.2,35,0.068 +CKB,0,-0.03,30,-15,1.037 +CKB,0,-0.03,30,-5,0.594 +CKB,0,-0.03,30,5,0.184 +CKB,0,-0.03,30,15,-0.196 +CKB,0,-0.03,30,25,-0.316 +CKB,0,-0.03,30,35,-0.08 +CKB,0,-0.03,37.1,-15,0.717 +CKB,0,-0.03,37.1,-5,0.345 +CKB,0,-0.03,37.1,5,0.002 +CKB,0,-0.03,37.1,15,-0.315 +CKB,0,-0.03,37.1,25,-0.416 +CKB,0,-0.03,37.1,35,-0.223 +CKB,0,-0.02,12.1,-15,4.743 +CKB,0,-0.02,12.1,-5,3.313 +CKB,0,-0.02,12.1,5,2.06 +CKB,0,-0.02,12.1,15,0.984 +CKB,0,-0.02,12.1,25,0.683 +CKB,0,-0.02,12.1,35,1.352 +CKB,0,-0.02,18,-15,3.062 +CKB,0,-0.02,18,-5,2.147 +CKB,0,-0.02,18,5,1.336 +CKB,0,-0.02,18,15,0.63 +CKB,0,-0.02,18,25,0.426 +CKB,0,-0.02,18,35,0.865 +CKB,0,-0.02,25.2,-15,1.93 +CKB,0,-0.02,25.2,-5,1.395 +CKB,0,-0.02,25.2,5,0.9 +CKB,0,-0.02,25.2,15,0.447 +CKB,0,-0.02,25.2,25,0.307 +CKB,0,-0.02,25.2,35,0.59 +CKB,0,-0.02,30,-15,1.542 +CKB,0,-0.02,30,-5,1.099 +CKB,0,-0.02,30,5,0.688 +CKB,0,-0.02,30,15,0.309 +CKB,0,-0.02,30,25,0.189 +CKB,0,-0.02,30,35,0.424 +CKB,0,-0.02,37.1,-15,1.204 +CKB,0,-0.02,37.1,-5,0.832 +CKB,0,-0.02,37.1,5,0.488 +CKB,0,-0.02,37.1,15,0.172 +CKB,0,-0.02,37.1,25,0.071 +CKB,0,-0.02,37.1,35,0.263 +CKB,0,-0.01,12.1,-15,5.251 +CKB,0,-0.01,12.1,-5,3.821 +CKB,0,-0.01,12.1,5,2.567 +CKB,0,-0.01,12.1,15,1.49 +CKB,0,-0.01,12.1,25,1.189 +CKB,0,-0.01,12.1,35,1.858 +CKB,0,-0.01,18,-15,3.6 +CKB,0,-0.01,18,-5,2.684 +CKB,0,-0.01,18,5,1.872 +CKB,0,-0.01,18,15,1.164 +CKB,0,-0.01,18,25,0.96 +CKB,0,-0.01,18,35,1.397 +CKB,0,-0.01,25.2,-15,2.486 +CKB,0,-0.01,25.2,-5,1.949 +CKB,0,-0.01,25.2,5,1.453 +CKB,0,-0.01,25.2,15,0.999 +CKB,0,-0.01,25.2,25,0.858 +CKB,0,-0.01,25.2,35,1.14 +CKB,0,-0.01,30,-15,2.104 +CKB,0,-0.01,30,-5,1.659 +CKB,0,-0.01,30,5,1.246 +CKB,0,-0.01,30,15,0.865 +CKB,0,-0.01,30,25,0.743 +CKB,0,-0.01,30,35,0.977 +CKB,0,-0.01,37.1,-15,1.776 +CKB,0,-0.01,37.1,-5,1.401 +CKB,0,-0.01,37.1,5,1.054 +CKB,0,-0.01,37.1,15,0.735 +CKB,0,-0.01,37.1,25,0.631 +CKB,0,-0.01,37.1,35,0.821 +CKB,0,0,12.1,-15,5.829 +CKB,0,0,12.1,-5,4.399 +CKB,0,0,12.1,5,3.145 +CKB,0,0,12.1,15,2.069 +CKB,0,0,12.1,25,1.767 +CKB,0,0,12.1,35,2.436 +CKB,0,0,18,-15,4.195 +CKB,0,0,18,-5,3.28 +CKB,0,0,18,5,2.468 +CKB,0,0,18,15,1.76 +CKB,0,0,18,25,1.555 +CKB,0,0,18,35,1.993 +CKB,0,0,25.2,-15,3.087 +CKB,0,0,25.2,-5,2.55 +CKB,0,0,25.2,5,2.054 +CKB,0,0,25.2,15,1.6 +CKB,0,0,25.2,25,1.459 +CKB,0,0,25.2,35,1.741 +CKB,0,0,30,-15,2.721 +CKB,0,0,30,-5,2.276 +CKB,0,0,30,5,1.863 +CKB,0,0,30,15,1.482 +CKB,0,0,30,25,1.36 +CKB,0,0,30,35,1.594 +CKB,0,0,37.1,-15,2.409 +CKB,0,0,37.1,-5,2.034 +CKB,0,0,37.1,5,1.687 +CKB,0,0,37.1,15,1.368 +CKB,0,0,37.1,25,1.265 +CKB,0,0,37.1,35,1.455 +CKB,0,0.01,12.1,-15,6.409 +CKB,0,0.01,12.1,-5,4.978 +CKB,0,0.01,12.1,5,3.724 +CKB,0,0.01,12.1,15,2.648 +CKB,0,0.01,12.1,25,2.347 +CKB,0,0.01,12.1,35,3.015 +CKB,0,0.01,18,-15,4.792 +CKB,0,0.01,18,-5,3.877 +CKB,0,0.01,18,5,3.065 +CKB,0,0.01,18,15,2.357 +CKB,0,0.01,18,25,2.152 +CKB,0,0.01,18,35,2.59 +CKB,0,0.01,25.2,-15,3.688 +CKB,0,0.01,25.2,-5,3.151 +CKB,0,0.01,25.2,5,2.656 +CKB,0,0.01,25.2,15,2.201 +CKB,0,0.01,25.2,25,2.06 +CKB,0,0.01,25.2,35,2.342 +CKB,0,0.01,30,-15,3.338 +CKB,0,0.01,30,-5,2.893 +CKB,0,0.01,30,5,2.48 +CKB,0,0.01,30,15,2.099 +CKB,0,0.01,30,25,1.977 +CKB,0,0.01,30,35,2.211 +CKB,0,0.01,37.1,-15,3.043 +CKB,0,0.01,37.1,-5,2.668 +CKB,0,0.01,37.1,5,2.321 +CKB,0,0.01,37.1,15,2.002 +CKB,0,0.01,37.1,25,1.899 +CKB,0,0.01,37.1,35,2.088 +CKB,0,0.02,12.1,-15,6.988 +CKB,0,0.02,12.1,-5,5.558 +CKB,0,0.02,12.1,5,4.303 +CKB,0,0.02,12.1,15,3.227 +CKB,0,0.02,12.1,25,2.926 +CKB,0,0.02,12.1,35,3.594 +CKB,0,0.02,18,-15,5.389 +CKB,0,0.02,18,-5,4.474 +CKB,0,0.02,18,5,3.662 +CKB,0,0.02,18,15,2.954 +CKB,0,0.02,18,25,2.749 +CKB,0,0.02,18,35,3.187 +CKB,0,0.02,25.2,-15,4.289 +CKB,0,0.02,25.2,-5,3.752 +CKB,0,0.02,25.2,5,3.257 +CKB,0,0.02,25.2,15,2.803 +CKB,0,0.02,25.2,25,2.661 +CKB,0,0.02,25.2,35,2.944 +CKB,0,0.02,30,-15,3.955 +CKB,0,0.02,30,-5,3.51 +CKB,0,0.02,30,5,3.097 +CKB,0,0.02,30,15,2.716 +CKB,0,0.02,30,25,2.594 +CKB,0,0.02,30,35,2.828 +CKB,0,0.02,37.1,-15,3.677 +CKB,0,0.02,37.1,-5,3.302 +CKB,0,0.02,37.1,5,2.955 +CKB,0,0.02,37.1,15,2.636 +CKB,0,0.02,37.1,25,2.533 +CKB,0,0.02,37.1,35,2.723 +CKB,0,0.03,12.1,-15,7.567 +CKB,0,0.03,12.1,-5,6.137 +CKB,0,0.03,12.1,5,4.882 +CKB,0,0.03,12.1,15,3.806 +CKB,0,0.03,12.1,25,3.505 +CKB,0,0.03,12.1,35,4.173 +CKB,0,0.03,18,-15,5.986 +CKB,0,0.03,18,-5,5.07 +CKB,0,0.03,18,5,4.258 +CKB,0,0.03,18,15,3.55 +CKB,0,0.03,18,25,3.346 +CKB,0,0.03,18,35,3.784 +CKB,0,0.03,25.2,-15,4.891 +CKB,0,0.03,25.2,-5,4.354 +CKB,0,0.03,25.2,5,3.859 +CKB,0,0.03,25.2,15,3.405 +CKB,0,0.03,25.2,25,3.263 +CKB,0,0.03,25.2,35,3.546 +CKB,0,0.03,30,-15,4.573 +CKB,0,0.03,30,-5,4.127 +CKB,0,0.03,30,5,3.714 +CKB,0,0.03,30,15,3.333 +CKB,0,0.03,30,25,3.212 +CKB,0,0.03,30,35,3.445 +CKB,0,0.03,37.1,-15,4.311 +CKB,0,0.03,37.1,-5,3.936 +CKB,0,0.03,37.1,5,3.589 +CKB,0,0.03,37.1,15,3.27 +CKB,0,0.03,37.1,25,3.167 +CKB,0,0.03,37.1,35,3.357 +CKB,0,0.04,12.1,-15,8.146 +CKB,0,0.04,12.1,-5,6.716 +CKB,0,0.04,12.1,5,5.462 +CKB,0,0.04,12.1,15,4.385 +CKB,0,0.04,12.1,25,4.084 +CKB,0,0.04,12.1,35,4.752 +CKB,0,0.04,18,-15,6.583 +CKB,0,0.04,18,-5,5.667 +CKB,0,0.04,18,5,4.855 +CKB,0,0.04,18,15,4.147 +CKB,0,0.04,18,25,3.943 +CKB,0,0.04,18,35,4.38 +CKB,0,0.04,25.2,-15,5.494 +CKB,0,0.04,25.2,-5,4.957 +CKB,0,0.04,25.2,5,4.461 +CKB,0,0.04,25.2,15,4.007 +CKB,0,0.04,25.2,25,3.866 +CKB,0,0.04,25.2,35,4.148 +CKB,0,0.04,30,-15,5.19 +CKB,0,0.04,30,-5,4.745 +CKB,0,0.04,30,5,4.332 +CKB,0,0.04,30,15,3.951 +CKB,0,0.04,30,25,3.829 +CKB,0,0.04,30,35,4.063 +CKB,0,0.04,37.1,-15,4.945 +CKB,0,0.04,37.1,-5,4.57 +CKB,0,0.04,37.1,5,4.223 +CKB,0,0.04,37.1,15,3.904 +CKB,0,0.04,37.1,25,3.801 +CKB,0,0.04,37.1,35,3.991 +CKB,0.3,-0.04,12.1,-15,3.274 +CKB,0.3,-0.04,12.1,-5,1.844 +CKB,0.3,-0.04,12.1,5,0.59 +CKB,0.3,-0.04,12.1,15,-0.486 +CKB,0.3,-0.04,12.1,25,-0.302 +CKB,0.3,-0.04,12.1,35,0.45 +CKB,0.3,-0.04,18,-15,1.662 +CKB,0.3,-0.04,18,-5,0.748 +CKB,0.3,-0.04,18,5,-0.063 +CKB,0.3,-0.04,18,15,-0.77 +CKB,0.3,-0.04,18,25,-0.647 +CKB,0.3,-0.04,18,35,-0.152 +CKB,0.3,-0.04,25.2,-15,0.558 +CKB,0.3,-0.04,25.2,-5,0.023 +CKB,0.3,-0.04,25.2,5,-0.471 +CKB,0.3,-0.04,25.2,15,-0.925 +CKB,0.3,-0.04,25.2,25,-0.832 +CKB,0.3,-0.04,25.2,35,-0.508 +CKB,0.3,-0.04,30,-15,0.222 +CKB,0.3,-0.04,30,-5,-0.221 +CKB,0.3,-0.04,30,5,-0.632 +CKB,0.3,-0.04,30,15,-1.011 +CKB,0.3,-0.04,30,25,-0.935 +CKB,0.3,-0.04,30,35,-0.666 +CKB,0.3,-0.04,37.1,-15,-0.064 +CKB,0.3,-0.04,37.1,-5,-0.436 +CKB,0.3,-0.04,37.1,5,-0.78 +CKB,0.3,-0.04,37.1,15,-1.096 +CKB,0.3,-0.04,37.1,25,-1.038 +CKB,0.3,-0.04,37.1,35,-0.819 +CKB,0.3,-0.03,12.1,-15,3.839 +CKB,0.3,-0.03,12.1,-5,2.409 +CKB,0.3,-0.03,12.1,5,1.156 +CKB,0.3,-0.03,12.1,15,0.08 +CKB,0.3,-0.03,12.1,25,0.263 +CKB,0.3,-0.03,12.1,35,1.016 +CKB,0.3,-0.03,18,-15,2.24 +CKB,0.3,-0.03,18,-5,1.326 +CKB,0.3,-0.03,18,5,0.515 +CKB,0.3,-0.03,18,15,-0.192 +CKB,0.3,-0.03,18,25,-0.069 +CKB,0.3,-0.03,18,35,0.426 +CKB,0.3,-0.03,25.2,-15,1.153 +CKB,0.3,-0.03,25.2,-5,0.617 +CKB,0.3,-0.03,25.2,5,0.123 +CKB,0.3,-0.03,25.2,15,-0.33 +CKB,0.3,-0.03,25.2,25,-0.237 +CKB,0.3,-0.03,25.2,35,0.086 +CKB,0.3,-0.03,30,-15,0.797 +CKB,0.3,-0.03,30,-5,0.354 +CKB,0.3,-0.03,30,5,-0.057 +CKB,0.3,-0.03,30,15,-0.437 +CKB,0.3,-0.03,30,25,-0.36 +CKB,0.3,-0.03,30,35,-0.091 +CKB,0.3,-0.03,37.1,-15,0.49 +CKB,0.3,-0.03,37.1,-5,0.119 +CKB,0.3,-0.03,37.1,5,-0.225 +CKB,0.3,-0.03,37.1,15,-0.541 +CKB,0.3,-0.03,37.1,25,-0.484 +CKB,0.3,-0.03,37.1,35,-0.264 +CKB,0.3,-0.02,12.1,-15,4.404 +CKB,0.3,-0.02,12.1,-5,2.974 +CKB,0.3,-0.02,12.1,5,1.721 +CKB,0.3,-0.02,12.1,15,0.645 +CKB,0.3,-0.02,12.1,25,0.828 +CKB,0.3,-0.02,12.1,35,1.581 +CKB,0.3,-0.02,18,-15,2.818 +CKB,0.3,-0.02,18,-5,1.904 +CKB,0.3,-0.02,18,5,1.093 +CKB,0.3,-0.02,18,15,0.386 +CKB,0.3,-0.02,18,25,0.509 +CKB,0.3,-0.02,18,35,1.004 +CKB,0.3,-0.02,25.2,-15,1.748 +CKB,0.3,-0.02,25.2,-5,1.212 +CKB,0.3,-0.02,25.2,5,0.718 +CKB,0.3,-0.02,25.2,15,0.265 +CKB,0.3,-0.02,25.2,25,0.358 +CKB,0.3,-0.02,25.2,35,0.681 +CKB,0.3,-0.02,30,-15,1.372 +CKB,0.3,-0.02,30,-5,0.929 +CKB,0.3,-0.02,30,5,0.518 +CKB,0.3,-0.02,30,15,0.139 +CKB,0.3,-0.02,30,25,0.215 +CKB,0.3,-0.02,30,35,0.484 +CKB,0.3,-0.02,37.1,-15,1.045 +CKB,0.3,-0.02,37.1,-5,0.674 +CKB,0.3,-0.02,37.1,5,0.33 +CKB,0.3,-0.02,37.1,15,0.013 +CKB,0.3,-0.02,37.1,25,0.071 +CKB,0.3,-0.02,37.1,35,0.291 +CKB,0.3,-0.01,12.1,-15,4.981 +CKB,0.3,-0.01,12.1,-5,3.551 +CKB,0.3,-0.01,12.1,5,2.297 +CKB,0.3,-0.01,12.1,15,1.221 +CKB,0.3,-0.01,12.1,25,1.404 +CKB,0.3,-0.01,12.1,35,2.156 +CKB,0.3,-0.01,18,-15,3.427 +CKB,0.3,-0.01,18,-5,2.511 +CKB,0.3,-0.01,18,5,1.699 +CKB,0.3,-0.01,18,15,0.991 +CKB,0.3,-0.01,18,25,1.114 +CKB,0.3,-0.01,18,35,1.608 +CKB,0.3,-0.01,25.2,-15,2.377 +CKB,0.3,-0.01,25.2,-5,1.84 +CKB,0.3,-0.01,25.2,5,1.344 +CKB,0.3,-0.01,25.2,15,0.89 +CKB,0.3,-0.01,25.2,25,0.982 +CKB,0.3,-0.01,25.2,35,1.305 +CKB,0.3,-0.01,30,-15,2.005 +CKB,0.3,-0.01,30,-5,1.56 +CKB,0.3,-0.01,30,5,1.147 +CKB,0.3,-0.01,30,15,0.766 +CKB,0.3,-0.01,30,25,0.84 +CKB,0.3,-0.01,30,35,1.108 +CKB,0.3,-0.01,37.1,-15,1.685 +CKB,0.3,-0.01,37.1,-5,1.31 +CKB,0.3,-0.01,37.1,5,0.964 +CKB,0.3,-0.01,37.1,15,0.645 +CKB,0.3,-0.01,37.1,25,0.7 +CKB,0.3,-0.01,37.1,35,0.917 +CKB,0.3,0,12.1,-15,5.641 +CKB,0.3,0,12.1,-5,4.211 +CKB,0.3,0,12.1,5,2.957 +CKB,0.3,0,12.1,15,1.88 +CKB,0.3,0,12.1,25,2.064 +CKB,0.3,0,12.1,35,2.815 +CKB,0.3,0,18,-15,4.106 +CKB,0.3,0,18,-5,3.191 +CKB,0.3,0,18,5,2.378 +CKB,0.3,0,18,15,1.671 +CKB,0.3,0,18,25,1.793 +CKB,0.3,0,18,35,2.287 +CKB,0.3,0,25.2,-15,3.062 +CKB,0.3,0,25.2,-5,2.525 +CKB,0.3,0,25.2,5,2.029 +CKB,0.3,0,25.2,15,1.575 +CKB,0.3,0,25.2,25,1.667 +CKB,0.3,0,25.2,35,1.99 +CKB,0.3,0,30,-15,2.708 +CKB,0.3,0,30,-5,2.263 +CKB,0.3,0,30,5,1.85 +CKB,0.3,0,30,15,1.469 +CKB,0.3,0,30,25,1.543 +CKB,0.3,0,30,35,1.811 +CKB,0.3,0,37.1,-15,2.408 +CKB,0.3,0,37.1,-5,2.033 +CKB,0.3,0,37.1,5,1.686 +CKB,0.3,0,37.1,15,1.367 +CKB,0.3,0,37.1,25,1.422 +CKB,0.3,0,37.1,35,1.639 +CKB,0.3,0.01,12.1,-15,6.301 +CKB,0.3,0.01,12.1,-5,4.871 +CKB,0.3,0.01,12.1,5,3.617 +CKB,0.3,0.01,12.1,15,2.541 +CKB,0.3,0.01,12.1,25,2.724 +CKB,0.3,0.01,12.1,35,3.476 +CKB,0.3,0.01,18,-15,4.787 +CKB,0.3,0.01,18,-5,3.871 +CKB,0.3,0.01,18,5,3.059 +CKB,0.3,0.01,18,15,2.351 +CKB,0.3,0.01,18,25,2.474 +CKB,0.3,0.01,18,35,2.968 +CKB,0.3,0.01,25.2,-15,3.748 +CKB,0.3,0.01,25.2,-5,3.21 +CKB,0.3,0.01,25.2,5,2.715 +CKB,0.3,0.01,25.2,15,2.261 +CKB,0.3,0.01,25.2,25,2.353 +CKB,0.3,0.01,25.2,35,2.675 +CKB,0.3,0.01,30,-15,3.412 +CKB,0.3,0.01,30,-5,2.967 +CKB,0.3,0.01,30,5,2.554 +CKB,0.3,0.01,30,15,2.173 +CKB,0.3,0.01,30,25,2.247 +CKB,0.3,0.01,30,35,2.514 +CKB,0.3,0.01,37.1,-15,3.13 +CKB,0.3,0.01,37.1,-5,2.755 +CKB,0.3,0.01,37.1,5,2.409 +CKB,0.3,0.01,37.1,15,2.09 +CKB,0.3,0.01,37.1,25,2.145 +CKB,0.3,0.01,37.1,35,2.362 +CKB,0.3,0.02,12.1,-15,6.962 +CKB,0.3,0.02,12.1,-5,5.532 +CKB,0.3,0.02,12.1,5,4.277 +CKB,0.3,0.02,12.1,15,3.201 +CKB,0.3,0.02,12.1,25,3.384 +CKB,0.3,0.02,12.1,35,4.136 +CKB,0.3,0.02,18,-15,5.467 +CKB,0.3,0.02,18,-5,4.552 +CKB,0.3,0.02,18,5,3.74 +CKB,0.3,0.02,18,15,3.032 +CKB,0.3,0.02,18,25,3.155 +CKB,0.3,0.02,18,35,3.648 +CKB,0.3,0.02,25.2,-15,4.433 +CKB,0.3,0.02,25.2,-5,3.896 +CKB,0.3,0.02,25.2,5,3.401 +CKB,0.3,0.02,25.2,15,2.947 +CKB,0.3,0.02,25.2,25,3.039 +CKB,0.3,0.02,25.2,35,3.361 +CKB,0.3,0.02,30,-15,4.116 +CKB,0.3,0.02,30,-5,3.67 +CKB,0.3,0.02,30,5,3.258 +CKB,0.3,0.02,30,15,2.876 +CKB,0.3,0.02,30,25,2.951 +CKB,0.3,0.02,30,35,3.218 +CKB,0.3,0.02,37.1,-15,3.853 +CKB,0.3,0.02,37.1,-5,3.478 +CKB,0.3,0.02,37.1,5,3.132 +CKB,0.3,0.02,37.1,15,2.813 +CKB,0.3,0.02,37.1,25,2.868 +CKB,0.3,0.02,37.1,35,3.085 +CKB,0.3,0.03,12.1,-15,7.622 +CKB,0.3,0.03,12.1,-5,6.192 +CKB,0.3,0.03,12.1,5,4.938 +CKB,0.3,0.03,12.1,15,3.861 +CKB,0.3,0.03,12.1,25,4.045 +CKB,0.3,0.03,12.1,35,4.797 +CKB,0.3,0.03,18,-15,6.148 +CKB,0.3,0.03,18,-5,5.232 +CKB,0.3,0.03,18,5,4.42 +CKB,0.3,0.03,18,15,3.712 +CKB,0.3,0.03,18,25,3.835 +CKB,0.3,0.03,18,35,4.329 +CKB,0.3,0.03,25.2,-15,5.12 +CKB,0.3,0.03,25.2,-5,4.583 +CKB,0.3,0.03,25.2,5,4.087 +CKB,0.3,0.03,25.2,15,3.633 +CKB,0.3,0.03,25.2,25,3.725 +CKB,0.3,0.03,25.2,35,4.048 +CKB,0.3,0.03,30,-15,4.82 +CKB,0.3,0.03,30,-5,4.375 +CKB,0.3,0.03,30,5,3.962 +CKB,0.3,0.03,30,15,3.58 +CKB,0.3,0.03,30,25,3.655 +CKB,0.3,0.03,30,35,3.922 +CKB,0.3,0.03,37.1,-15,4.576 +CKB,0.3,0.03,37.1,-5,4.201 +CKB,0.3,0.03,37.1,5,3.855 +CKB,0.3,0.03,37.1,15,3.536 +CKB,0.3,0.03,37.1,25,3.591 +CKB,0.3,0.03,37.1,35,3.808 +CKB,0.3,0.04,12.1,-15,8.283 +CKB,0.3,0.04,12.1,-5,6.852 +CKB,0.3,0.04,12.1,5,5.598 +CKB,0.3,0.04,12.1,15,4.522 +CKB,0.3,0.04,12.1,25,4.705 +CKB,0.3,0.04,12.1,35,5.457 +CKB,0.3,0.04,18,-15,6.828 +CKB,0.3,0.04,18,-5,5.913 +CKB,0.3,0.04,18,5,5.101 +CKB,0.3,0.04,18,15,4.393 +CKB,0.3,0.04,18,25,4.516 +CKB,0.3,0.04,18,35,5.01 +CKB,0.3,0.04,25.2,-15,5.807 +CKB,0.3,0.04,25.2,-5,5.27 +CKB,0.3,0.04,25.2,5,4.774 +CKB,0.3,0.04,25.2,15,4.32 +CKB,0.3,0.04,25.2,25,4.412 +CKB,0.3,0.04,25.2,35,4.735 +CKB,0.3,0.04,30,-15,5.524 +CKB,0.3,0.04,30,-5,5.079 +CKB,0.3,0.04,30,5,4.666 +CKB,0.3,0.04,30,15,4.285 +CKB,0.3,0.04,30,25,4.359 +CKB,0.3,0.04,30,35,4.626 +CKB,0.3,0.04,37.1,-15,5.299 +CKB,0.3,0.04,37.1,-5,4.924 +CKB,0.3,0.04,37.1,5,4.578 +CKB,0.3,0.04,37.1,15,4.259 +CKB,0.3,0.04,37.1,25,4.314 +CKB,0.3,0.04,37.1,35,4.531 +CKB,0.6,-0.04,12.1,-15,2.796 +CKB,0.6,-0.04,12.1,-5,1.366 +CKB,0.6,-0.04,12.1,5,0.112 +CKB,0.6,-0.04,12.1,15,-0.679 +CKB,0.6,-0.04,12.1,25,-0.295 +CKB,0.6,-0.04,12.1,35,0.54 +CKB,0.6,-0.04,18,-15,1.276 +CKB,0.6,-0.04,18,-5,0.362 +CKB,0.6,-0.04,18,5,-0.449 +CKB,0.6,-0.04,18,15,-0.963 +CKB,0.6,-0.04,18,25,-0.705 +CKB,0.6,-0.04,18,35,-0.154 +CKB,0.6,-0.04,25.2,-15,0.23 +CKB,0.6,-0.04,25.2,-5,-0.306 +CKB,0.6,-0.04,25.2,5,-0.8 +CKB,0.6,-0.04,25.2,15,-1.109 +CKB,0.6,-0.04,25.2,25,-0.927 +CKB,0.6,-0.04,25.2,35,-0.563 +CKB,0.6,-0.04,30,-15,-0.089 +CKB,0.6,-0.04,30,-5,-0.532 +CKB,0.6,-0.04,30,5,-0.943 +CKB,0.6,-0.04,30,15,-1.202 +CKB,0.6,-0.04,30,25,-1.05 +CKB,0.6,-0.04,30,35,-0.748 +CKB,0.6,-0.04,37.1,-15,-0.359 +CKB,0.6,-0.04,37.1,-5,-0.731 +CKB,0.6,-0.04,37.1,5,-1.075 +CKB,0.6,-0.04,37.1,15,-1.296 +CKB,0.6,-0.04,37.1,25,-1.175 +CKB,0.6,-0.04,37.1,35,-0.928 +CKB,0.6,-0.03,12.1,-15,3.43 +CKB,0.6,-0.03,12.1,-5,2.001 +CKB,0.6,-0.03,12.1,5,0.747 +CKB,0.6,-0.03,12.1,15,-0.044 +CKB,0.6,-0.03,12.1,25,0.339 +CKB,0.6,-0.03,12.1,35,1.175 +CKB,0.6,-0.03,18,-15,1.925 +CKB,0.6,-0.03,18,-5,1.011 +CKB,0.6,-0.03,18,5,0.2 +CKB,0.6,-0.03,18,15,-0.314 +CKB,0.6,-0.03,18,25,-0.056 +CKB,0.6,-0.03,18,35,0.495 +CKB,0.6,-0.03,25.2,-15,0.897 +CKB,0.6,-0.03,25.2,-5,0.361 +CKB,0.6,-0.03,25.2,5,-0.133 +CKB,0.6,-0.03,25.2,15,-0.442 +CKB,0.6,-0.03,25.2,25,-0.259 +CKB,0.6,-0.03,25.2,35,0.104 +CKB,0.6,-0.03,30,-15,0.556 +CKB,0.6,-0.03,30,-5,0.113 +CKB,0.6,-0.03,30,5,-0.298 +CKB,0.6,-0.03,30,15,-0.557 +CKB,0.6,-0.03,30,25,-0.405 +CKB,0.6,-0.03,30,35,-0.102 +CKB,0.6,-0.03,37.1,-15,0.264 +CKB,0.6,-0.03,37.1,-5,-0.108 +CKB,0.6,-0.03,37.1,5,-0.452 +CKB,0.6,-0.03,37.1,15,-0.673 +CKB,0.6,-0.03,37.1,25,-0.552 +CKB,0.6,-0.03,37.1,35,-0.305 +CKB,0.6,-0.02,12.1,-15,4.065 +CKB,0.6,-0.02,12.1,-5,2.635 +CKB,0.6,-0.02,12.1,5,1.381 +CKB,0.6,-0.02,12.1,15,0.59 +CKB,0.6,-0.02,12.1,25,0.974 +CKB,0.6,-0.02,12.1,35,1.809 +CKB,0.6,-0.02,18,-15,2.574 +CKB,0.6,-0.02,18,-5,1.66 +CKB,0.6,-0.02,18,5,0.849 +CKB,0.6,-0.02,18,15,0.335 +CKB,0.6,-0.02,18,25,0.593 +CKB,0.6,-0.02,18,35,1.144 +CKB,0.6,-0.02,25.2,-15,1.566 +CKB,0.6,-0.02,25.2,-5,1.03 +CKB,0.6,-0.02,25.2,5,0.536 +CKB,0.6,-0.02,25.2,15,0.227 +CKB,0.6,-0.02,25.2,25,0.409 +CKB,0.6,-0.02,25.2,35,0.773 +CKB,0.6,-0.02,30,-15,1.202 +CKB,0.6,-0.02,30,-5,0.759 +CKB,0.6,-0.02,30,5,0.348 +CKB,0.6,-0.02,30,15,0.089 +CKB,0.6,-0.02,30,25,0.241 +CKB,0.6,-0.02,30,35,0.544 +CKB,0.6,-0.02,37.1,-15,0.887 +CKB,0.6,-0.02,37.1,-5,0.515 +CKB,0.6,-0.02,37.1,5,0.171 +CKB,0.6,-0.02,37.1,15,-0.05 +CKB,0.6,-0.02,37.1,25,0.071 +CKB,0.6,-0.02,37.1,35,0.318 +CKB,0.6,-0.01,12.1,-15,4.712 +CKB,0.6,-0.01,12.1,-5,3.282 +CKB,0.6,-0.01,12.1,5,2.027 +CKB,0.6,-0.01,12.1,15,1.236 +CKB,0.6,-0.01,12.1,25,1.619 +CKB,0.6,-0.01,12.1,35,2.454 +CKB,0.6,-0.01,18,-15,3.254 +CKB,0.6,-0.01,18,-5,2.339 +CKB,0.6,-0.01,18,5,1.526 +CKB,0.6,-0.01,18,15,1.012 +CKB,0.6,-0.01,18,25,1.268 +CKB,0.6,-0.01,18,35,1.819 +CKB,0.6,-0.01,25.2,-15,2.268 +CKB,0.6,-0.01,25.2,-5,1.73 +CKB,0.6,-0.01,25.2,5,1.235 +CKB,0.6,-0.01,25.2,15,0.925 +CKB,0.6,-0.01,25.2,25,1.107 +CKB,0.6,-0.01,25.2,35,1.469 +CKB,0.6,-0.01,30,-15,1.906 +CKB,0.6,-0.01,30,-5,1.461 +CKB,0.6,-0.01,30,5,1.048 +CKB,0.6,-0.01,30,15,0.787 +CKB,0.6,-0.01,30,25,0.937 +CKB,0.6,-0.01,30,35,1.238 +CKB,0.6,-0.01,37.1,-15,1.595 +CKB,0.6,-0.01,37.1,-5,1.22 +CKB,0.6,-0.01,37.1,5,0.874 +CKB,0.6,-0.01,37.1,15,0.65 +CKB,0.6,-0.01,37.1,25,0.768 +CKB,0.6,-0.01,37.1,35,1.012 +CKB,0.6,0,12.1,-15,5.453 +CKB,0.6,0,12.1,-5,4.022 +CKB,0.6,0,12.1,5,2.768 +CKB,0.6,0,12.1,15,1.976 +CKB,0.6,0,12.1,25,2.36 +CKB,0.6,0,12.1,35,3.195 +CKB,0.6,0,18,-15,4.017 +CKB,0.6,0,18,-5,3.101 +CKB,0.6,0,18,5,2.289 +CKB,0.6,0,18,15,1.774 +CKB,0.6,0,18,25,2.031 +CKB,0.6,0,18,35,2.581 +CKB,0.6,0,25.2,-15,3.037 +CKB,0.6,0,25.2,-5,2.5 +CKB,0.6,0,25.2,5,2.005 +CKB,0.6,0,25.2,15,1.694 +CKB,0.6,0,25.2,25,1.876 +CKB,0.6,0,25.2,35,2.238 +CKB,0.6,0,30,-15,2.696 +CKB,0.6,0,30,-5,2.251 +CKB,0.6,0,30,5,1.838 +CKB,0.6,0,30,15,1.577 +CKB,0.6,0,30,25,1.727 +CKB,0.6,0,30,35,2.028 +CKB,0.6,0,37.1,-15,2.406 +CKB,0.6,0,37.1,-5,2.031 +CKB,0.6,0,37.1,5,1.685 +CKB,0.6,0,37.1,15,1.461 +CKB,0.6,0,37.1,25,1.579 +CKB,0.6,0,37.1,35,1.824 +CKB,0.6,0.01,12.1,-15,6.194 +CKB,0.6,0.01,12.1,-5,4.764 +CKB,0.6,0.01,12.1,5,3.51 +CKB,0.6,0.01,12.1,15,2.718 +CKB,0.6,0.01,12.1,25,3.102 +CKB,0.6,0.01,12.1,35,3.937 +CKB,0.6,0.01,18,-15,4.781 +CKB,0.6,0.01,18,-5,3.866 +CKB,0.6,0.01,18,5,3.054 +CKB,0.6,0.01,18,15,2.539 +CKB,0.6,0.01,18,25,2.796 +CKB,0.6,0.01,18,35,3.346 +CKB,0.6,0.01,25.2,-15,3.807 +CKB,0.6,0.01,25.2,-5,3.27 +CKB,0.6,0.01,25.2,5,2.775 +CKB,0.6,0.01,25.2,15,2.465 +CKB,0.6,0.01,25.2,25,2.646 +CKB,0.6,0.01,25.2,35,3.009 +CKB,0.6,0.01,30,-15,3.486 +CKB,0.6,0.01,30,-5,3.041 +CKB,0.6,0.01,30,5,2.628 +CKB,0.6,0.01,30,15,2.367 +CKB,0.6,0.01,30,25,2.517 +CKB,0.6,0.01,30,35,2.818 +CKB,0.6,0.01,37.1,-15,3.218 +CKB,0.6,0.01,37.1,-5,2.843 +CKB,0.6,0.01,37.1,5,2.496 +CKB,0.6,0.01,37.1,15,2.272 +CKB,0.6,0.01,37.1,25,2.391 +CKB,0.6,0.01,37.1,35,2.635 +CKB,0.6,0.02,12.1,-15,6.936 +CKB,0.6,0.02,12.1,-5,5.506 +CKB,0.6,0.02,12.1,5,4.252 +CKB,0.6,0.02,12.1,15,3.46 +CKB,0.6,0.02,12.1,25,3.843 +CKB,0.6,0.02,12.1,35,4.678 +CKB,0.6,0.02,18,-15,5.546 +CKB,0.6,0.02,18,-5,4.63 +CKB,0.6,0.02,18,5,3.818 +CKB,0.6,0.02,18,15,3.303 +CKB,0.6,0.02,18,25,3.56 +CKB,0.6,0.02,18,35,4.11 +CKB,0.6,0.02,25.2,-15,4.577 +CKB,0.6,0.02,25.2,-5,4.04 +CKB,0.6,0.02,25.2,5,3.545 +CKB,0.6,0.02,25.2,15,3.235 +CKB,0.6,0.02,25.2,25,3.416 +CKB,0.6,0.02,25.2,35,3.779 +CKB,0.6,0.02,30,-15,4.276 +CKB,0.6,0.02,30,-5,3.831 +CKB,0.6,0.02,30,5,3.418 +CKB,0.6,0.02,30,15,3.157 +CKB,0.6,0.02,30,25,3.307 +CKB,0.6,0.02,30,35,3.608 +CKB,0.6,0.02,37.1,-15,4.03 +CKB,0.6,0.02,37.1,-5,3.655 +CKB,0.6,0.02,37.1,5,3.308 +CKB,0.6,0.02,37.1,15,3.084 +CKB,0.6,0.02,37.1,25,3.203 +CKB,0.6,0.02,37.1,35,3.447 +CKB,0.6,0.03,12.1,-15,7.678 +CKB,0.6,0.03,12.1,-5,6.247 +CKB,0.6,0.03,12.1,5,4.993 +CKB,0.6,0.03,12.1,15,4.202 +CKB,0.6,0.03,12.1,25,4.585 +CKB,0.6,0.03,12.1,35,5.42 +CKB,0.6,0.03,18,-15,6.31 +CKB,0.6,0.03,18,-5,5.394 +CKB,0.6,0.03,18,5,4.582 +CKB,0.6,0.03,18,15,4.068 +CKB,0.6,0.03,18,25,4.324 +CKB,0.6,0.03,18,35,4.874 +CKB,0.6,0.03,25.2,-15,5.348 +CKB,0.6,0.03,25.2,-5,4.811 +CKB,0.6,0.03,25.2,5,4.316 +CKB,0.6,0.03,25.2,15,4.006 +CKB,0.6,0.03,25.2,25,4.187 +CKB,0.6,0.03,25.2,35,4.55 +CKB,0.6,0.03,30,-15,5.067 +CKB,0.6,0.03,30,-5,4.622 +CKB,0.6,0.03,30,5,4.209 +CKB,0.6,0.03,30,15,3.948 +CKB,0.6,0.03,30,25,4.098 +CKB,0.6,0.03,30,35,4.399 +CKB,0.6,0.03,37.1,-15,4.842 +CKB,0.6,0.03,37.1,-5,4.467 +CKB,0.6,0.03,37.1,5,4.12 +CKB,0.6,0.03,37.1,15,3.896 +CKB,0.6,0.03,37.1,25,4.015 +CKB,0.6,0.03,37.1,35,4.259 +CKB,0.6,0.04,12.1,-15,8.419 +CKB,0.6,0.04,12.1,-5,6.989 +CKB,0.6,0.04,12.1,5,5.735 +CKB,0.6,0.04,12.1,15,4.943 +CKB,0.6,0.04,12.1,25,5.326 +CKB,0.6,0.04,12.1,35,6.162 +CKB,0.6,0.04,18,-15,7.074 +CKB,0.6,0.04,18,-5,6.159 +CKB,0.6,0.04,18,5,5.347 +CKB,0.6,0.04,18,15,4.832 +CKB,0.6,0.04,18,25,5.089 +CKB,0.6,0.04,18,35,5.639 +CKB,0.6,0.04,25.2,-15,6.12 +CKB,0.6,0.04,25.2,-5,5.582 +CKB,0.6,0.04,25.2,5,5.087 +CKB,0.6,0.04,25.2,15,4.777 +CKB,0.6,0.04,25.2,25,4.958 +CKB,0.6,0.04,25.2,35,5.321 +CKB,0.6,0.04,30,-15,5.858 +CKB,0.6,0.04,30,-5,5.413 +CKB,0.6,0.04,30,5,5 +CKB,0.6,0.04,30,15,4.739 +CKB,0.6,0.04,30,25,4.889 +CKB,0.6,0.04,30,35,5.19 +CKB,0.6,0.04,37.1,-15,5.654 +CKB,0.6,0.04,37.1,-5,5.279 +CKB,0.6,0.04,37.1,5,4.932 +CKB,0.6,0.04,37.1,15,4.708 +CKB,0.6,0.04,37.1,25,4.827 +CKB,0.6,0.04,37.1,35,5.071 +CKB,0.9,-0.04,12.1,-15,2.318 +CKB,0.9,-0.04,12.1,-5,0.888 +CKB,0.9,-0.04,12.1,5,-0.366 +CKB,0.9,-0.04,12.1,15,-0.786 +CKB,0.9,-0.04,12.1,25,-0.289 +CKB,0.9,-0.04,12.1,35,0.63 +CKB,0.9,-0.04,18,-15,0.89 +CKB,0.9,-0.04,18,-5,-0.025 +CKB,0.9,-0.04,18,5,-0.836 +CKB,0.9,-0.04,18,15,-1.097 +CKB,0.9,-0.04,18,25,-0.764 +CKB,0.9,-0.04,18,35,-0.157 +CKB,0.9,-0.04,25.2,-15,-0.099 +CKB,0.9,-0.04,25.2,-5,-0.635 +CKB,0.9,-0.04,25.2,5,-1.129 +CKB,0.9,-0.04,25.2,15,-1.254 +CKB,0.9,-0.04,25.2,25,-1.022 +CKB,0.9,-0.04,25.2,35,-0.618 +CKB,0.9,-0.04,30,-15,-0.4 +CKB,0.9,-0.04,30,-5,-0.843 +CKB,0.9,-0.04,30,5,-1.254 +CKB,0.9,-0.04,30,15,-1.359 +CKB,0.9,-0.04,30,25,-1.166 +CKB,0.9,-0.04,30,35,-0.829 +CKB,0.9,-0.04,37.1,-15,-0.654 +CKB,0.9,-0.04,37.1,-5,-1.026 +CKB,0.9,-0.04,37.1,5,-1.37 +CKB,0.9,-0.04,37.1,15,-1.466 +CKB,0.9,-0.04,37.1,25,-1.311 +CKB,0.9,-0.04,37.1,35,-1.037 +CKB,0.9,-0.03,12.1,-15,3.022 +CKB,0.9,-0.03,12.1,-5,1.592 +CKB,0.9,-0.03,12.1,5,0.338 +CKB,0.9,-0.03,12.1,15,-0.082 +CKB,0.9,-0.03,12.1,25,0.415 +CKB,0.9,-0.03,12.1,35,1.334 +CKB,0.9,-0.03,18,-15,1.61 +CKB,0.9,-0.03,18,-5,0.696 +CKB,0.9,-0.03,18,5,-0.115 +CKB,0.9,-0.03,18,15,-0.377 +CKB,0.9,-0.03,18,25,-0.044 +CKB,0.9,-0.03,18,35,0.563 +CKB,0.9,-0.03,25.2,-15,0.642 +CKB,0.9,-0.03,25.2,-5,0.106 +CKB,0.9,-0.03,25.2,5,-0.388 +CKB,0.9,-0.03,25.2,15,-0.513 +CKB,0.9,-0.03,25.2,25,-0.281 +CKB,0.9,-0.03,25.2,35,0.122 +CKB,0.9,-0.03,30,-15,0.316 +CKB,0.9,-0.03,30,-5,-0.127 +CKB,0.9,-0.03,30,5,-0.538 +CKB,0.9,-0.03,30,15,-0.643 +CKB,0.9,-0.03,30,25,-0.45 +CKB,0.9,-0.03,30,35,-0.113 +CKB,0.9,-0.03,37.1,-15,0.037 +CKB,0.9,-0.03,37.1,-5,-0.335 +CKB,0.9,-0.03,37.1,5,-0.678 +CKB,0.9,-0.03,37.1,15,-0.775 +CKB,0.9,-0.03,37.1,25,-0.62 +CKB,0.9,-0.03,37.1,35,-0.346 +CKB,0.9,-0.02,12.1,-15,3.726 +CKB,0.9,-0.02,12.1,-5,2.296 +CKB,0.9,-0.02,12.1,5,1.042 +CKB,0.9,-0.02,12.1,15,0.622 +CKB,0.9,-0.02,12.1,25,1.119 +CKB,0.9,-0.02,12.1,35,2.038 +CKB,0.9,-0.02,18,-15,2.33 +CKB,0.9,-0.02,18,-5,1.416 +CKB,0.9,-0.02,18,5,0.605 +CKB,0.9,-0.02,18,15,0.343 +CKB,0.9,-0.02,18,25,0.676 +CKB,0.9,-0.02,18,35,1.283 +CKB,0.9,-0.02,25.2,-15,1.383 +CKB,0.9,-0.02,25.2,-5,0.847 +CKB,0.9,-0.02,25.2,5,0.353 +CKB,0.9,-0.02,25.2,15,0.228 +CKB,0.9,-0.02,25.2,25,0.46 +CKB,0.9,-0.02,25.2,35,0.864 +CKB,0.9,-0.02,30,-15,1.032 +CKB,0.9,-0.02,30,-5,0.589 +CKB,0.9,-0.02,30,5,0.178 +CKB,0.9,-0.02,30,15,0.074 +CKB,0.9,-0.02,30,25,0.267 +CKB,0.9,-0.02,30,35,0.603 +CKB,0.9,-0.02,37.1,-15,0.728 +CKB,0.9,-0.02,37.1,-5,0.357 +CKB,0.9,-0.02,37.1,5,0.013 +CKB,0.9,-0.02,37.1,15,-0.084 +CKB,0.9,-0.02,37.1,25,0.071 +CKB,0.9,-0.02,37.1,35,0.345 +CKB,0.9,-0.01,12.1,-15,4.442 +CKB,0.9,-0.01,12.1,-5,3.012 +CKB,0.9,-0.01,12.1,5,1.758 +CKB,0.9,-0.01,12.1,15,1.337 +CKB,0.9,-0.01,12.1,25,1.834 +CKB,0.9,-0.01,12.1,35,2.753 +CKB,0.9,-0.01,18,-15,3.081 +CKB,0.9,-0.01,18,-5,2.166 +CKB,0.9,-0.01,18,5,1.354 +CKB,0.9,-0.01,18,15,1.091 +CKB,0.9,-0.01,18,25,1.423 +CKB,0.9,-0.01,18,35,2.029 +CKB,0.9,-0.01,25.2,-15,2.158 +CKB,0.9,-0.01,25.2,-5,1.621 +CKB,0.9,-0.01,25.2,5,1.126 +CKB,0.9,-0.01,25.2,15,1 +CKB,0.9,-0.01,25.2,25,1.231 +CKB,0.9,-0.01,25.2,35,1.634 +CKB,0.9,-0.01,30,-15,1.807 +CKB,0.9,-0.01,30,-5,1.362 +CKB,0.9,-0.01,30,5,0.949 +CKB,0.9,-0.01,30,15,0.843 +CKB,0.9,-0.01,30,25,1.034 +CKB,0.9,-0.01,30,35,1.369 +CKB,0.9,-0.01,37.1,-15,1.505 +CKB,0.9,-0.01,37.1,-5,1.13 +CKB,0.9,-0.01,37.1,5,0.783 +CKB,0.9,-0.01,37.1,15,0.684 +CKB,0.9,-0.01,37.1,25,0.836 +CKB,0.9,-0.01,37.1,35,1.108 +CKB,0.9,0,12.1,-15,5.264 +CKB,0.9,0,12.1,-5,3.834 +CKB,0.9,0,12.1,5,2.58 +CKB,0.9,0,12.1,15,2.159 +CKB,0.9,0,12.1,25,2.656 +CKB,0.9,0,12.1,35,3.574 +CKB,0.9,0,18,-15,3.927 +CKB,0.9,0,18,-5,3.012 +CKB,0.9,0,18,5,2.2 +CKB,0.9,0,18,15,1.937 +CKB,0.9,0,18,25,2.269 +CKB,0.9,0,18,35,2.875 +CKB,0.9,0,25.2,-15,3.012 +CKB,0.9,0,25.2,-5,2.475 +CKB,0.9,0,25.2,5,1.98 +CKB,0.9,0,25.2,15,1.854 +CKB,0.9,0,25.2,25,2.084 +CKB,0.9,0,25.2,35,2.487 +CKB,0.9,0,30,-15,2.683 +CKB,0.9,0,30,-5,2.238 +CKB,0.9,0,30,5,1.825 +CKB,0.9,0,30,15,1.719 +CKB,0.9,0,30,25,1.91 +CKB,0.9,0,30,35,2.245 +CKB,0.9,0,37.1,-15,2.405 +CKB,0.9,0,37.1,-5,2.03 +CKB,0.9,0,37.1,5,1.684 +CKB,0.9,0,37.1,15,1.584 +CKB,0.9,0,37.1,25,1.736 +CKB,0.9,0,37.1,35,2.008 +CKB,0.9,0.01,12.1,-15,6.087 +CKB,0.9,0.01,12.1,-5,4.657 +CKB,0.9,0.01,12.1,5,3.403 +CKB,0.9,0.01,12.1,15,2.982 +CKB,0.9,0.01,12.1,25,3.479 +CKB,0.9,0.01,12.1,35,4.397 +CKB,0.9,0.01,18,-15,4.776 +CKB,0.9,0.01,18,-5,3.86 +CKB,0.9,0.01,18,5,3.048 +CKB,0.9,0.01,18,15,2.786 +CKB,0.9,0.01,18,25,3.117 +CKB,0.9,0.01,18,35,3.724 +CKB,0.9,0.01,25.2,-15,3.867 +CKB,0.9,0.01,25.2,-5,3.329 +CKB,0.9,0.01,25.2,5,2.834 +CKB,0.9,0.01,25.2,15,2.708 +CKB,0.9,0.01,25.2,25,2.939 +CKB,0.9,0.01,25.2,35,3.342 +CKB,0.9,0.01,30,-15,3.56 +CKB,0.9,0.01,30,-5,3.115 +CKB,0.9,0.01,30,5,2.702 +CKB,0.9,0.01,30,15,2.596 +CKB,0.9,0.01,30,25,2.787 +CKB,0.9,0.01,30,35,3.122 +CKB,0.9,0.01,37.1,-15,3.306 +CKB,0.9,0.01,37.1,-5,2.931 +CKB,0.9,0.01,37.1,5,2.584 +CKB,0.9,0.01,37.1,15,2.484 +CKB,0.9,0.01,37.1,25,2.637 +CKB,0.9,0.01,37.1,35,2.908 +CKB,0.9,0.02,12.1,-15,6.91 +CKB,0.9,0.02,12.1,-5,5.48 +CKB,0.9,0.02,12.1,5,4.226 +CKB,0.9,0.02,12.1,15,3.805 +CKB,0.9,0.02,12.1,25,4.302 +CKB,0.9,0.02,12.1,35,5.22 +CKB,0.9,0.02,18,-15,5.624 +CKB,0.9,0.02,18,-5,4.708 +CKB,0.9,0.02,18,5,3.896 +CKB,0.9,0.02,18,15,3.634 +CKB,0.9,0.02,18,25,3.965 +CKB,0.9,0.02,18,35,4.572 +CKB,0.9,0.02,25.2,-15,4.721 +CKB,0.9,0.02,25.2,-5,4.184 +CKB,0.9,0.02,25.2,5,3.689 +CKB,0.9,0.02,25.2,15,3.563 +CKB,0.9,0.02,25.2,25,3.793 +CKB,0.9,0.02,25.2,35,4.196 +CKB,0.9,0.02,30,-15,4.437 +CKB,0.9,0.02,30,-5,3.992 +CKB,0.9,0.02,30,5,3.579 +CKB,0.9,0.02,30,15,3.473 +CKB,0.9,0.02,30,25,3.664 +CKB,0.9,0.02,30,35,3.999 +CKB,0.9,0.02,37.1,-15,4.207 +CKB,0.9,0.02,37.1,-5,3.832 +CKB,0.9,0.02,37.1,5,3.485 +CKB,0.9,0.02,37.1,15,3.385 +CKB,0.9,0.02,37.1,25,3.538 +CKB,0.9,0.02,37.1,35,3.809 +CKB,0.9,0.03,12.1,-15,7.733 +CKB,0.9,0.03,12.1,-5,6.303 +CKB,0.9,0.03,12.1,5,5.049 +CKB,0.9,0.03,12.1,15,4.628 +CKB,0.9,0.03,12.1,25,5.125 +CKB,0.9,0.03,12.1,35,6.043 +CKB,0.9,0.03,18,-15,6.472 +CKB,0.9,0.03,18,-5,5.556 +CKB,0.9,0.03,18,5,4.744 +CKB,0.9,0.03,18,15,4.482 +CKB,0.9,0.03,18,25,4.813 +CKB,0.9,0.03,18,35,5.42 +CKB,0.9,0.03,25.2,-15,5.576 +CKB,0.9,0.03,25.2,-5,5.039 +CKB,0.9,0.03,25.2,5,4.544 +CKB,0.9,0.03,25.2,15,4.418 +CKB,0.9,0.03,25.2,25,4.649 +CKB,0.9,0.03,25.2,35,5.052 +CKB,0.9,0.03,30,-15,5.314 +CKB,0.9,0.03,30,-5,4.869 +CKB,0.9,0.03,30,5,4.456 +CKB,0.9,0.03,30,15,4.35 +CKB,0.9,0.03,30,25,4.541 +CKB,0.9,0.03,30,35,4.876 +CKB,0.9,0.03,37.1,-15,5.108 +CKB,0.9,0.03,37.1,-5,4.733 +CKB,0.9,0.03,37.1,5,4.386 +CKB,0.9,0.03,37.1,15,4.286 +CKB,0.9,0.03,37.1,25,4.439 +CKB,0.9,0.03,37.1,35,4.71 +CKB,0.9,0.04,12.1,-15,8.556 +CKB,0.9,0.04,12.1,-5,7.126 +CKB,0.9,0.04,12.1,5,5.871 +CKB,0.9,0.04,12.1,15,5.451 +CKB,0.9,0.04,12.1,25,5.948 +CKB,0.9,0.04,12.1,35,6.866 +CKB,0.9,0.04,18,-15,7.32 +CKB,0.9,0.04,18,-5,6.404 +CKB,0.9,0.04,18,5,5.592 +CKB,0.9,0.04,18,15,5.33 +CKB,0.9,0.04,18,25,5.661 +CKB,0.9,0.04,18,35,6.268 +CKB,0.9,0.04,25.2,-15,6.432 +CKB,0.9,0.04,25.2,-5,5.895 +CKB,0.9,0.04,25.2,5,5.4 +CKB,0.9,0.04,25.2,15,5.274 +CKB,0.9,0.04,25.2,25,5.505 +CKB,0.9,0.04,25.2,35,5.907 +CKB,0.9,0.04,30,-15,6.192 +CKB,0.9,0.04,30,-5,5.747 +CKB,0.9,0.04,30,5,5.334 +CKB,0.9,0.04,30,15,5.228 +CKB,0.9,0.04,30,25,5.419 +CKB,0.9,0.04,30,35,5.754 +CKB,0.9,0.04,37.1,-15,6.008 +CKB,0.9,0.04,37.1,-5,5.633 +CKB,0.9,0.04,37.1,5,5.287 +CKB,0.9,0.04,37.1,15,5.187 +CKB,0.9,0.04,37.1,25,5.34 +CKB,0.9,0.04,37.1,35,5.611 diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 40559af6..843be71c 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -80,8 +80,9 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem # consumption_files holds interpol functions of csv files which are called directly # try to use the interpol function. If it does not exist yet its created in except case. + consumption_function = vehicle_type+"_from_"+consumption_path try: - mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type, + mileage = self.consumption_files[consumption_function](\ this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, @@ -92,21 +93,22 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem df = pd.read_csv(consumption_path, sep=delim) # create lookup table and make sure its in the same order as the input point # which will be the input for the nd lookup - vt_col = df["vehicle_type"] + df = df[df["vehicle_type"] == vehicle_type] + assert len(df)>0, f"Vehicle type {vehicle_type} not found in {consumption_path}" inc_col = df["incline"] tmp_col = df["t_amb"] lol_col = df["level_of_loading"] speed_col = df["mean_speed_kmh"] cons_col = df["consumption_kwh_per_km"] - data_table = list(zip(vt_col, inc_col, tmp_col, lol_col, speed_col, cons_col)) + data_table = list(zip(inc_col, tmp_col, lol_col, speed_col, cons_col)) - def interpol_function(this_vehicle_type, this_incline, this_temp, this_lol, this_speed): - input_point = (this_vehicle_type, this_incline, this_temp, this_lol, this_speed) + def interpol_function(this_incline, this_temp, this_lol, this_speed): + input_point = (this_incline, this_temp, this_lol, this_speed) return util.nd_interp(input_point, data_table) - self.consumption_files.update({consumption_path: interpol_function}) + self.consumption_files.update({consumption_function: interpol_function}) - mileage = self.consumption_files[consumption_path](this_vehicle_type=vehicle_type, + mileage = self.consumption_files[consumption_function]( this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, From 6796b448c9c9fcfcd055400c79268a88b07eb9cc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 14 Nov 2022 09:58:58 +0100 Subject: [PATCH 305/802] Make flake8 happy --- ebus_toolbox/consumption.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 843be71c..ca112000 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -82,7 +82,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem # try to use the interpol function. If it does not exist yet its created in except case. consumption_function = vehicle_type+"_from_"+consumption_path try: - mileage = self.consumption_files[consumption_function](\ + mileage = self.consumption_files[consumption_function]( this_incline=height_diff / distance, this_temp=temp, this_lol=level_of_loading, @@ -94,7 +94,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem # create lookup table and make sure its in the same order as the input point # which will be the input for the nd lookup df = df[df["vehicle_type"] == vehicle_type] - assert len(df)>0, f"Vehicle type {vehicle_type} not found in {consumption_path}" + assert len(df) > 0, f"Vehicle type {vehicle_type} not found in {consumption_path}" inc_col = df["incline"] tmp_col = df["t_amb"] lol_col = df["level_of_loading"] From 278c0a64f5c825e73e4a9603c18ebb57fc71c70a Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 14 Nov 2022 11:30:01 +0100 Subject: [PATCH 306/802] add pv to electrified stations --- data/examples/electrified_stations.json | 9 +- data/examples/example_pv_feedin.csv | 169 ++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 data/examples/example_pv_feedin.csv diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 182108fc..c1af97a0 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -2,7 +2,14 @@ "Station-0": { "type": "deps", "n_charging_stations": null, - "distance_transformer": 150 + "distance_transformer": 150, + "energy_feed_in": { + "csv_file": "example_pv_feedin.csv", + "start_time": "2018-01-01T00:00:00+02:00", + "step_duration_s": 3600, + "column": "Feed-in Total (kW)", + "factor": 1 + } }, "Station-3": { "type": "opps", diff --git a/data/examples/example_pv_feedin.csv b/data/examples/example_pv_feedin.csv new file mode 100644 index 00000000..c2a28c8f --- /dev/null +++ b/data/examples/example_pv_feedin.csv @@ -0,0 +1,169 @@ +time,Feed-in Total (kW) +2018-01-01 00:30:00+01:00,0.0 +2018-01-01 01:30:00+01:00,0.0 +2018-01-01 02:30:00+01:00,0.0 +2018-01-01 03:30:00+01:00,0.0 +2018-01-01 04:30:00+01:00,0.0 +2018-01-01 05:30:00+01:00,0.0 +2018-01-01 06:30:00+01:00,0.0 +2018-01-01 07:30:00+01:00,0.0 +2018-01-01 08:30:00+01:00,0.0 +2018-01-01 09:30:00+01:00,20.59949737304199 +2018-01-01 10:30:00+01:00,57.44536767395442 +2018-01-01 11:30:00+01:00,87.80795648835002 +2018-01-01 12:30:00+01:00,82.4312872827236 +2018-01-01 13:30:00+01:00,60.73295277209872 +2018-01-01 14:30:00+01:00,38.57275076938971 +2018-01-01 15:30:00+01:00,0.0 +2018-01-01 16:30:00+01:00,0.0 +2018-01-01 17:30:00+01:00,0.0 +2018-01-01 18:30:00+01:00,0.0 +2018-01-01 19:30:00+01:00,0.0 +2018-01-01 20:30:00+01:00,0.0 +2018-01-01 21:30:00+01:00,0.0 +2018-01-01 22:30:00+01:00,0.0 +2018-01-01 23:30:00+01:00,0.0 +2018-01-02 00:30:00+01:00,0.0 +2018-01-02 01:30:00+01:00,0.0 +2018-01-02 02:30:00+01:00,0.0 +2018-01-02 03:30:00+01:00,0.0 +2018-01-02 04:30:00+01:00,0.0 +2018-01-02 05:30:00+01:00,0.0 +2018-01-02 06:30:00+01:00,0.0 +2018-01-02 07:30:00+01:00,0.0 +2018-01-02 08:30:00+01:00,0.0 +2018-01-02 09:30:00+01:00,0.9282483231458806 +2018-01-02 10:30:00+01:00,6.522839084117224 +2018-01-02 11:30:00+01:00,18.113391973670502 +2018-01-02 12:30:00+01:00,23.93442006207004 +2018-01-02 13:30:00+01:00,19.02198413802917 +2018-01-02 14:30:00+01:00,3.7944513234994064 +2018-01-02 15:30:00+01:00,0.0 +2018-01-02 16:30:00+01:00,0.0 +2018-01-02 17:30:00+01:00,0.0 +2018-01-02 18:30:00+01:00,0.0 +2018-01-02 19:30:00+01:00,0.0 +2018-01-02 20:30:00+01:00,0.0 +2018-01-02 21:30:00+01:00,0.0 +2018-01-02 22:30:00+01:00,0.0 +2018-01-02 23:30:00+01:00,0.0 +2018-01-03 00:30:00+01:00,0.0 +2018-01-03 01:30:00+01:00,0.0 +2018-01-03 02:30:00+01:00,0.0 +2018-01-03 03:30:00+01:00,0.0 +2018-01-03 04:30:00+01:00,0.0 +2018-01-03 05:30:00+01:00,0.0 +2018-01-03 06:30:00+01:00,0.0 +2018-01-03 07:30:00+01:00,0.0 +2018-01-03 08:30:00+01:00,0.0 +2018-01-03 09:30:00+01:00,0.0 +2018-01-03 10:30:00+01:00,0.0 +2018-01-03 11:30:00+01:00,3.1043054608116027 +2018-01-03 12:30:00+01:00,44.500155163804976 +2018-01-03 13:30:00+01:00,48.60707644284791 +2018-01-03 14:30:00+01:00,5.352609987933698 +2018-01-03 15:30:00+01:00,0.0 +2018-01-03 16:30:00+01:00,0.0 +2018-01-03 17:30:00+01:00,0.0 +2018-01-03 18:30:00+01:00,0.0 +2018-01-03 19:30:00+01:00,0.0 +2018-01-03 20:30:00+01:00,0.0 +2018-01-03 21:30:00+01:00,0.0 +2018-01-03 22:30:00+01:00,0.0 +2018-01-03 23:30:00+01:00,0.0 +2018-01-04 00:30:00+01:00,0.0 +2018-01-04 01:30:00+01:00,0.0 +2018-01-04 02:30:00+01:00,0.0 +2018-01-04 03:30:00+01:00,0.0 +2018-01-04 04:30:00+01:00,0.0 +2018-01-04 05:30:00+01:00,0.0 +2018-01-04 06:30:00+01:00,0.0 +2018-01-04 07:30:00+01:00,0.0 +2018-01-04 08:30:00+01:00,0.0 +2018-01-04 09:30:00+01:00,2.412911528138851 +2018-01-04 10:30:00+01:00,7.735581619871407 +2018-01-04 11:30:00+01:00,21.291168270279613 +2018-01-04 12:30:00+01:00,40.94436918414178 +2018-01-04 13:30:00+01:00,42.373288765911056 +2018-01-04 14:30:00+01:00,29.225648212630627 +2018-01-04 15:30:00+01:00,0.0 +2018-01-04 16:30:00+01:00,0.0 +2018-01-04 17:30:00+01:00,0.0 +2018-01-04 18:30:00+01:00,0.0 +2018-01-04 19:30:00+01:00,0.0 +2018-01-04 20:30:00+01:00,0.0 +2018-01-04 21:30:00+01:00,0.0 +2018-01-04 22:30:00+01:00,0.0 +2018-01-04 23:30:00+01:00,0.0 +2018-01-05 00:30:00+01:00,0.0 +2018-01-05 01:30:00+01:00,0.0 +2018-01-05 02:30:00+01:00,0.0 +2018-01-05 03:30:00+01:00,0.0 +2018-01-05 04:30:00+01:00,0.0 +2018-01-05 05:30:00+01:00,0.0 +2018-01-05 06:30:00+01:00,0.0 +2018-01-05 07:30:00+01:00,0.0 +2018-01-05 08:30:00+01:00,0.0 +2018-01-05 09:30:00+01:00,19.40043544618326 +2018-01-05 10:30:00+01:00,17.78003649979294 +2018-01-05 11:30:00+01:00,19.1828395051374 +2018-01-05 12:30:00+01:00,17.28758152431003 +2018-01-05 13:30:00+01:00,37.19451480924751 +2018-01-05 14:30:00+01:00,26.347029652712724 +2018-01-05 15:30:00+01:00,0.0 +2018-01-05 16:30:00+01:00,0.0 +2018-01-05 17:30:00+01:00,0.0 +2018-01-05 18:30:00+01:00,0.0 +2018-01-05 19:30:00+01:00,0.0 +2018-01-05 20:30:00+01:00,0.0 +2018-01-05 21:30:00+01:00,0.0 +2018-01-05 22:30:00+01:00,0.0 +2018-01-05 23:30:00+01:00,0.0 +2018-01-06 00:30:00+01:00,0.0 +2018-01-06 01:30:00+01:00,0.0 +2018-01-06 02:30:00+01:00,0.0 +2018-01-06 03:30:00+01:00,0.0 +2018-01-06 04:30:00+01:00,0.0 +2018-01-06 05:30:00+01:00,0.0 +2018-01-06 06:30:00+01:00,0.0 +2018-01-06 07:30:00+01:00,0.0 +2018-01-06 08:30:00+01:00,0.0 +2018-01-06 09:30:00+01:00,24.258760014041247 +2018-01-06 10:30:00+01:00,54.91375116003941 +2018-01-06 11:30:00+01:00,85.00597424688478 +2018-01-06 12:30:00+01:00,85.90006197264941 +2018-01-06 13:30:00+01:00,67.37653052865542 +2018-01-06 14:30:00+01:00,31.174064306596133 +2018-01-06 15:30:00+01:00,0.0 +2018-01-06 16:30:00+01:00,0.0 +2018-01-06 17:30:00+01:00,0.0 +2018-01-06 18:30:00+01:00,0.0 +2018-01-06 19:30:00+01:00,0.0 +2018-01-06 20:30:00+01:00,0.0 +2018-01-06 21:30:00+01:00,0.0 +2018-01-06 22:30:00+01:00,0.0 +2018-01-06 23:30:00+01:00,0.0 +2018-01-07 00:30:00+01:00,0.0 +2018-01-07 01:30:00+01:00,0.0 +2018-01-07 02:30:00+01:00,0.0 +2018-01-07 03:30:00+01:00,0.0 +2018-01-07 04:30:00+01:00,0.0 +2018-01-07 05:30:00+01:00,0.0 +2018-01-07 06:30:00+01:00,0.0 +2018-01-07 07:30:00+01:00,0.0 +2018-01-07 08:30:00+01:00,0.0 +2018-01-07 09:30:00+01:00,8.361867062873221 +2018-01-07 10:30:00+01:00,26.028288674715704 +2018-01-07 11:30:00+01:00,43.634635884057296 +2018-01-07 12:30:00+01:00,34.49380141729803 +2018-01-07 13:30:00+01:00,36.91816671510759 +2018-01-07 14:30:00+01:00,33.35423932538908 +2018-01-07 15:30:00+01:00,0.652259558172688 +2018-01-07 16:30:00+01:00,0.0 +2018-01-07 17:30:00+01:00,0.0 +2018-01-07 18:30:00+01:00,0.0 +2018-01-07 19:30:00+01:00,0.0 +2018-01-07 20:30:00+01:00,0.0 +2018-01-07 21:30:00+01:00,0.0 +2018-01-07 22:30:00+01:00,0.0 +2018-01-07 23:30:00+01:00,0.0 From 1a481e0def3f04501f7e9835fade803c64c28a86 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 14 Nov 2022 14:13:15 +0100 Subject: [PATCH 307/802] Change Vehicle type name in consumption table --- data/examples/energy_consumption_example.csv | 2160 +++++++++--------- 1 file changed, 1080 insertions(+), 1080 deletions(-) diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv index d58f0db4..659d6544 100644 --- a/data/examples/energy_consumption_example.csv +++ b/data/examples/energy_consumption_example.csv @@ -1,1084 +1,1084 @@ vehicle_type,level_of_loading,incline,mean_speed_kmh,t_amb,consumption_kwh_per_km -xx,0,-0.04,12.1,-15,2.967 -xx,0,-0.04,12.1,-5,1.823 -xx,0,-0.04,12.1,5,0.844 -xx,0,-0.04,12.1,15,0.034 -xx,0,-0.04,12.1,25,-0.181 -xx,0,-0.04,12.1,35,0.314 -xx,0,-0.04,18,-15,1.658 -xx,0,-0.04,18,-5,0.939 -xx,0,-0.04,18,5,0.317 -xx,0,-0.04,18,15,-0.208 -xx,0,-0.04,18,25,-0.353 -xx,0,-0.04,18,35,-0.034 -xx,0,-0.04,25.2,-15,0.724 -xx,0,-0.04,25.2,-5,0.33 -xx,0,-0.04,25.2,5,-0.026 -xx,0,-0.04,25.2,15,-0.347 -xx,0,-0.04,25.2,25,-0.445 -xx,0,-0.04,25.2,35,-0.248 -xx,0,-0.04,30,-15,0.476 -xx,0,-0.04,30,-5,0.153 -xx,0,-0.04,30,5,-0.141 -xx,0,-0.04,30,15,-0.408 -xx,0,-0.04,30,25,-0.492 -xx,0,-0.04,30,35,-0.33 -xx,0,-0.04,37.1,-15,0.281 -xx,0,-0.04,37.1,-5,0.008 -xx,0,-0.04,37.1,5,-0.241 -xx,0,-0.04,37.1,15,-0.465 -xx,0,-0.04,37.1,25,-0.536 -xx,0,-0.04,37.1,35,-0.404 -xx,0,-0.03,12.1,-15,3.297 -xx,0,-0.03,12.1,-5,2.153 -xx,0,-0.03,12.1,5,1.175 -xx,0,-0.03,12.1,15,0.365 -xx,0,-0.03,12.1,25,0.149 -xx,0,-0.03,12.1,35,0.644 -xx,0,-0.03,18,-15,1.996 -xx,0,-0.03,18,-5,1.277 -xx,0,-0.03,18,5,0.654 -xx,0,-0.03,18,15,0.13 -xx,0,-0.03,18,25,-0.015 -xx,0,-0.03,18,35,0.304 -xx,0,-0.03,25.2,-15,1.072 -xx,0,-0.03,25.2,-5,0.678 -xx,0,-0.03,25.2,5,0.321 -xx,0,-0.03,25.2,15,0.001 -xx,0,-0.03,25.2,25,-0.097 -xx,0,-0.03,25.2,35,0.099 -xx,0,-0.03,30,-15,0.812 -xx,0,-0.03,30,-5,0.489 -xx,0,-0.03,30,5,0.195 -xx,0,-0.03,30,15,-0.072 -xx,0,-0.03,30,25,-0.156 -xx,0,-0.03,30,35,0.006 -xx,0,-0.03,37.1,-15,0.606 -xx,0,-0.03,37.1,-5,0.332 -xx,0,-0.03,37.1,5,0.084 -xx,0,-0.03,37.1,15,-0.14 -xx,0,-0.03,37.1,25,-0.212 -xx,0,-0.03,37.1,35,-0.08 -xx,0,-0.02,12.1,-15,3.628 -xx,0,-0.02,12.1,-5,2.484 -xx,0,-0.02,12.1,5,1.505 -xx,0,-0.02,12.1,15,0.695 -xx,0,-0.02,12.1,25,0.48 -xx,0,-0.02,12.1,35,0.974 -xx,0,-0.02,18,-15,2.334 -xx,0,-0.02,18,-5,1.615 -xx,0,-0.02,18,5,0.992 -xx,0,-0.02,18,15,0.467 -xx,0,-0.02,18,25,0.322 -xx,0,-0.02,18,35,0.642 -xx,0,-0.02,25.2,-15,1.42 -xx,0,-0.02,25.2,-5,1.026 -xx,0,-0.02,25.2,5,0.669 -xx,0,-0.02,25.2,15,0.349 -xx,0,-0.02,25.2,25,0.251 -xx,0,-0.02,25.2,35,0.447 -xx,0,-0.02,30,-15,1.148 -xx,0,-0.02,30,-5,0.826 -xx,0,-0.02,30,5,0.531 -xx,0,-0.02,30,15,0.264 -xx,0,-0.02,30,25,0.18 -xx,0,-0.02,30,35,0.342 -xx,0,-0.02,37.1,-15,0.93 -xx,0,-0.02,37.1,-5,0.657 -xx,0,-0.02,37.1,5,0.408 -xx,0,-0.02,37.1,15,0.184 -xx,0,-0.02,37.1,25,0.113 -xx,0,-0.02,37.1,35,0.245 -xx,0,-0.01,12.1,-15,3.97 -xx,0,-0.01,12.1,-5,2.826 -xx,0,-0.01,12.1,5,1.847 -xx,0,-0.01,12.1,15,1.036 -xx,0,-0.01,12.1,25,0.82 -xx,0,-0.01,12.1,35,1.315 -xx,0,-0.01,18,-15,2.702 -xx,0,-0.01,18,-5,1.982 -xx,0,-0.01,18,5,1.358 -xx,0,-0.01,18,15,0.833 -xx,0,-0.01,18,25,0.687 -xx,0,-0.01,18,35,1.005 -xx,0,-0.01,25.2,-15,1.8 -xx,0,-0.01,25.2,-5,1.406 -xx,0,-0.01,25.2,5,1.048 -xx,0,-0.01,25.2,15,0.726 -xx,0,-0.01,25.2,25,0.627 -xx,0,-0.01,25.2,35,0.823 -xx,0,-0.01,30,-15,1.541 -xx,0,-0.01,30,-5,1.217 -xx,0,-0.01,30,5,0.92 -xx,0,-0.01,30,15,0.651 -xx,0,-0.01,30,25,0.566 -xx,0,-0.01,30,35,0.726 -xx,0,-0.01,37.1,-15,1.338 -xx,0,-0.01,37.1,-5,1.062 -xx,0,-0.01,37.1,5,0.81 -xx,0,-0.01,37.1,15,0.583 -xx,0,-0.01,37.1,25,0.51 -xx,0,-0.01,37.1,35,0.639 -xx,0,0,12.1,-15,4.356 -xx,0,0,12.1,-5,3.211 -xx,0,0,12.1,5,2.232 -xx,0,0,12.1,15,1.422 -xx,0,0,12.1,25,1.206 -xx,0,0,12.1,35,1.7 -xx,0,0,18,-15,3.099 -xx,0,0,18,-5,2.379 -xx,0,0,18,5,1.756 -xx,0,0,18,15,1.23 -xx,0,0,18,25,1.084 -xx,0,0,18,35,1.402 -xx,0,0,25.2,-15,2.201 -xx,0,0,25.2,-5,1.806 -xx,0,0,25.2,5,1.448 -xx,0,0,25.2,15,1.127 -xx,0,0,25.2,25,1.028 -xx,0,0,25.2,35,1.223 -xx,0,0,30,-15,1.953 -xx,0,0,30,-5,1.628 -xx,0,0,30,5,1.331 -xx,0,0,30,15,1.062 -xx,0,0,30,25,0.977 -xx,0,0,30,35,1.137 -xx,0,0,37.1,-15,1.76 -xx,0,0,37.1,-5,1.484 -xx,0,0,37.1,5,1.232 -xx,0,0,37.1,15,1.006 -xx,0,0,37.1,25,0.932 -xx,0,0,37.1,35,1.062 -xx,0,0.01,12.1,-15,4.742 -xx,0,0.01,12.1,-5,3.597 -xx,0,0.01,12.1,5,2.618 -xx,0,0.01,12.1,15,1.808 -xx,0,0.01,12.1,25,1.592 -xx,0,0.01,12.1,35,2.087 -xx,0,0.01,18,-15,3.497 -xx,0,0.01,18,-5,2.777 -xx,0,0.01,18,5,2.154 -xx,0,0.01,18,15,1.628 -xx,0,0.01,18,25,1.482 -xx,0,0.01,18,35,1.8 -xx,0,0.01,25.2,-15,2.602 -xx,0,0.01,25.2,-5,2.207 -xx,0,0.01,25.2,5,1.849 -xx,0,0.01,25.2,15,1.528 -xx,0,0.01,25.2,25,1.429 -xx,0,0.01,25.2,35,1.624 -xx,0,0.01,30,-15,2.364 -xx,0,0.01,30,-5,2.039 -xx,0,0.01,30,5,1.743 -xx,0,0.01,30,15,1.474 -xx,0,0.01,30,25,1.388 -xx,0,0.01,30,35,1.548 -xx,0,0.01,37.1,-15,2.183 -xx,0,0.01,37.1,-5,1.907 -xx,0,0.01,37.1,5,1.655 -xx,0,0.01,37.1,15,1.428 -xx,0,0.01,37.1,25,1.354 -xx,0,0.01,37.1,35,1.484 -xx,0,0.02,12.1,-15,5.128 -xx,0,0.02,12.1,-5,3.983 -xx,0,0.02,12.1,5,3.005 -xx,0,0.02,12.1,15,2.194 -xx,0,0.02,12.1,25,1.978 -xx,0,0.02,12.1,35,2.473 -xx,0,0.02,18,-15,3.895 -xx,0,0.02,18,-5,3.175 -xx,0,0.02,18,5,2.551 -xx,0,0.02,18,15,2.026 -xx,0,0.02,18,25,1.88 -xx,0,0.02,18,35,2.198 -xx,0,0.02,25.2,-15,3.003 -xx,0,0.02,25.2,-5,2.608 -xx,0,0.02,25.2,5,2.25 -xx,0,0.02,25.2,15,1.928 -xx,0,0.02,25.2,25,1.83 -xx,0,0.02,25.2,35,2.025 -xx,0,0.02,30,-15,2.775 -xx,0,0.02,30,-5,2.451 -xx,0,0.02,30,5,2.154 -xx,0,0.02,30,15,1.885 -xx,0,0.02,30,25,1.8 -xx,0,0.02,30,35,1.96 -xx,0,0.02,37.1,-15,2.606 -xx,0,0.02,37.1,-5,2.329 -xx,0,0.02,37.1,5,2.078 -xx,0,0.02,37.1,15,1.851 -xx,0,0.02,37.1,25,1.777 -xx,0,0.02,37.1,35,1.907 -xx,0,0.03,12.1,-15,5.514 -xx,0,0.03,12.1,-5,4.37 -xx,0,0.03,12.1,5,3.391 -xx,0,0.03,12.1,15,2.58 -xx,0,0.03,12.1,25,2.364 -xx,0,0.03,12.1,35,2.859 -xx,0,0.03,18,-15,4.293 -xx,0,0.03,18,-5,3.573 -xx,0,0.03,18,5,2.949 -xx,0,0.03,18,15,2.424 -xx,0,0.03,18,25,2.278 -xx,0,0.03,18,35,2.596 -xx,0,0.03,25.2,-15,3.405 -xx,0,0.03,25.2,-5,3.01 -xx,0,0.03,25.2,5,2.652 -xx,0,0.03,25.2,15,2.33 -xx,0,0.03,25.2,25,2.231 -xx,0,0.03,25.2,35,2.427 -xx,0,0.03,30,-15,3.187 -xx,0,0.03,30,-5,2.862 -xx,0,0.03,30,5,2.566 -xx,0,0.03,30,15,2.297 -xx,0,0.03,30,25,2.211 -xx,0,0.03,30,35,2.371 -xx,0,0.03,37.1,-15,3.028 -xx,0,0.03,37.1,-5,2.752 -xx,0,0.03,37.1,5,2.5 -xx,0,0.03,37.1,15,2.274 -xx,0,0.03,37.1,25,2.2 -xx,0,0.03,37.1,35,2.329 -xx,0,0.04,12.1,-15,5.9 -xx,0,0.04,12.1,-5,4.756 -xx,0,0.04,12.1,5,3.777 -xx,0,0.04,12.1,15,2.966 -xx,0,0.04,12.1,25,2.75 -xx,0,0.04,12.1,35,3.245 -xx,0,0.04,18,-15,4.691 -xx,0,0.04,18,-5,3.971 -xx,0,0.04,18,5,3.347 -xx,0,0.04,18,15,2.821 -xx,0,0.04,18,25,2.676 -xx,0,0.04,18,35,2.994 -xx,0,0.04,25.2,-15,3.806 -xx,0,0.04,25.2,-5,3.411 -xx,0,0.04,25.2,5,3.053 -xx,0,0.04,25.2,15,2.732 -xx,0,0.04,25.2,25,2.633 -xx,0,0.04,25.2,35,2.828 -xx,0,0.04,30,-15,3.599 -xx,0,0.04,30,-5,3.274 -xx,0,0.04,30,5,2.977 -xx,0,0.04,30,15,2.709 -xx,0,0.04,30,25,2.623 -xx,0,0.04,30,35,2.783 -xx,0,0.04,37.1,-15,3.451 -xx,0,0.04,37.1,-5,3.175 -xx,0,0.04,37.1,5,2.923 -xx,0,0.04,37.1,15,2.696 -xx,0,0.04,37.1,25,2.623 -xx,0,0.04,37.1,35,2.752 -xx,0.3,-0.04,12.1,-15,2.648 -xx,0.3,-0.04,12.1,-5,1.504 -xx,0.3,-0.04,12.1,5,0.526 -xx,0.3,-0.04,12.1,15,-0.284 -xx,0.3,-0.04,12.1,25,-0.177 -xx,0.3,-0.04,12.1,35,0.373 -xx,0.3,-0.04,18,-15,1.4 -xx,0.3,-0.04,18,-5,0.682 -xx,0.3,-0.04,18,5,0.059 -xx,0.3,-0.04,18,15,-0.466 -xx,0.3,-0.04,18,25,-0.393 -xx,0.3,-0.04,18,35,-0.036 -xx,0.3,-0.04,25.2,-15,0.505 -xx,0.3,-0.04,25.2,-5,0.111 -xx,0.3,-0.04,25.2,5,-0.246 -xx,0.3,-0.04,25.2,15,-0.566 -xx,0.3,-0.04,25.2,25,-0.508 -xx,0.3,-0.04,25.2,35,-0.285 -xx,0.3,-0.04,30,-15,0.268 -xx,0.3,-0.04,30,-5,-0.054 -xx,0.3,-0.04,30,5,-0.349 -xx,0.3,-0.04,30,15,-0.616 -xx,0.3,-0.04,30,25,-0.569 -xx,0.3,-0.04,30,35,-0.385 -xx,0.3,-0.04,37.1,-15,0.085 -xx,0.3,-0.04,37.1,-5,-0.189 -xx,0.3,-0.04,37.1,5,-0.437 -xx,0.3,-0.04,37.1,15,-0.661 -xx,0.3,-0.04,37.1,25,-0.627 -xx,0.3,-0.04,37.1,35,-0.477 -xx,0.3,-0.03,12.1,-15,3.025 -xx,0.3,-0.03,12.1,-5,1.881 -xx,0.3,-0.03,12.1,5,0.902 -xx,0.3,-0.03,12.1,15,0.092 -xx,0.3,-0.03,12.1,25,0.2 -xx,0.3,-0.03,12.1,35,0.75 -xx,0.3,-0.03,18,-15,1.786 -xx,0.3,-0.03,18,-5,1.067 -xx,0.3,-0.03,18,5,0.444 -xx,0.3,-0.03,18,15,-0.08 -xx,0.3,-0.03,18,25,-0.007 -xx,0.3,-0.03,18,35,0.349 -xx,0.3,-0.03,25.2,-15,0.901 -xx,0.3,-0.03,25.2,-5,0.507 -xx,0.3,-0.03,25.2,5,0.151 -xx,0.3,-0.03,25.2,15,-0.17 -xx,0.3,-0.03,25.2,25,-0.112 -xx,0.3,-0.03,25.2,35,0.111 -xx,0.3,-0.03,30,-15,0.651 -xx,0.3,-0.03,30,-5,0.329 -xx,0.3,-0.03,30,5,0.034 -xx,0.3,-0.03,30,15,-0.233 -xx,0.3,-0.03,30,25,-0.186 -xx,0.3,-0.03,30,35,-0.002 -xx,0.3,-0.03,37.1,-15,0.455 -xx,0.3,-0.03,37.1,-5,0.181 -xx,0.3,-0.03,37.1,5,-0.067 -xx,0.3,-0.03,37.1,15,-0.292 -xx,0.3,-0.03,37.1,25,-0.257 -xx,0.3,-0.03,37.1,35,-0.107 -xx,0.3,-0.02,12.1,-15,3.402 -xx,0.3,-0.02,12.1,-5,2.257 -xx,0.3,-0.02,12.1,5,1.279 -xx,0.3,-0.02,12.1,15,0.469 -xx,0.3,-0.02,12.1,25,0.577 -xx,0.3,-0.02,12.1,35,1.127 -xx,0.3,-0.02,18,-15,2.171 -xx,0.3,-0.02,18,-5,1.452 -xx,0.3,-0.02,18,5,0.83 -xx,0.3,-0.02,18,15,0.305 -xx,0.3,-0.02,18,25,0.378 -xx,0.3,-0.02,18,35,0.735 -xx,0.3,-0.02,25.2,-15,1.298 -xx,0.3,-0.02,25.2,-5,0.904 -xx,0.3,-0.02,25.2,5,0.548 -xx,0.3,-0.02,25.2,15,0.227 -xx,0.3,-0.02,25.2,25,0.285 -xx,0.3,-0.02,25.2,35,0.508 -xx,0.3,-0.02,30,-15,1.035 -xx,0.3,-0.02,30,-5,0.713 -xx,0.3,-0.02,30,5,0.418 -xx,0.3,-0.02,30,15,0.151 -xx,0.3,-0.02,30,25,0.198 -xx,0.3,-0.02,30,35,0.382 -xx,0.3,-0.02,37.1,-15,0.825 -xx,0.3,-0.02,37.1,-5,0.551 -xx,0.3,-0.02,37.1,5,0.303 -xx,0.3,-0.02,37.1,15,0.078 -xx,0.3,-0.02,37.1,25,0.113 -xx,0.3,-0.02,37.1,35,0.263 -xx,0.3,-0.01,12.1,-15,3.79 -xx,0.3,-0.01,12.1,-5,2.646 -xx,0.3,-0.01,12.1,5,1.667 -xx,0.3,-0.01,12.1,15,0.856 -xx,0.3,-0.01,12.1,25,0.964 -xx,0.3,-0.01,12.1,35,1.514 -xx,0.3,-0.01,18,-15,2.587 -xx,0.3,-0.01,18,-5,1.867 -xx,0.3,-0.01,18,5,1.243 -xx,0.3,-0.01,18,15,0.717 -xx,0.3,-0.01,18,25,0.79 -xx,0.3,-0.01,18,35,1.145 -xx,0.3,-0.01,25.2,-15,1.728 -xx,0.3,-0.01,25.2,-5,1.333 -xx,0.3,-0.01,25.2,5,0.975 -xx,0.3,-0.01,25.2,15,0.653 -xx,0.3,-0.01,25.2,25,0.71 -xx,0.3,-0.01,25.2,35,0.932 -xx,0.3,-0.01,30,-15,1.475 -xx,0.3,-0.01,30,-5,1.151 -xx,0.3,-0.01,30,5,0.854 -xx,0.3,-0.01,30,15,0.585 -xx,0.3,-0.01,30,25,0.63 -xx,0.3,-0.01,30,35,0.813 -xx,0.3,-0.01,37.1,-15,1.278 -xx,0.3,-0.01,37.1,-5,1.002 -xx,0.3,-0.01,37.1,5,0.75 -xx,0.3,-0.01,37.1,15,0.523 -xx,0.3,-0.01,37.1,25,0.555 -xx,0.3,-0.01,37.1,35,0.703 -xx,0.3,0,12.1,-15,4.23 -xx,0.3,0,12.1,-5,3.086 -xx,0.3,0,12.1,5,2.107 -xx,0.3,0,12.1,15,1.296 -xx,0.3,0,12.1,25,1.404 -xx,0.3,0,12.1,35,1.953 -xx,0.3,0,18,-15,3.04 -xx,0.3,0,18,-5,2.32 -xx,0.3,0,18,5,1.696 -xx,0.3,0,18,15,1.17 -xx,0.3,0,18,25,1.243 -xx,0.3,0,18,35,1.598 -xx,0.3,0,25.2,-15,2.185 -xx,0.3,0,25.2,-5,1.79 -xx,0.3,0,25.2,5,1.432 -xx,0.3,0,25.2,15,1.11 -xx,0.3,0,25.2,25,1.167 -xx,0.3,0,25.2,35,1.389 -xx,0.3,0,30,-15,1.944 -xx,0.3,0,30,-5,1.619 -xx,0.3,0,30,5,1.323 -xx,0.3,0,30,15,1.054 -xx,0.3,0,30,25,1.099 -xx,0.3,0,30,35,1.282 -xx,0.3,0,37.1,-15,1.759 -xx,0.3,0,37.1,-5,1.483 -xx,0.3,0,37.1,5,1.232 -xx,0.3,0,37.1,15,1.005 -xx,0.3,0,37.1,25,1.037 -xx,0.3,0,37.1,35,1.184 -xx,0.3,0.01,12.1,-15,4.67 -xx,0.3,0.01,12.1,-5,3.526 -xx,0.3,0.01,12.1,5,2.547 -xx,0.3,0.01,12.1,15,1.737 -xx,0.3,0.01,12.1,25,1.844 -xx,0.3,0.01,12.1,35,2.394 -xx,0.3,0.01,18,-15,3.494 -xx,0.3,0.01,18,-5,2.773 -xx,0.3,0.01,18,5,2.15 -xx,0.3,0.01,18,15,1.624 -xx,0.3,0.01,18,25,1.696 -xx,0.3,0.01,18,35,2.052 -xx,0.3,0.01,25.2,-15,2.642 -xx,0.3,0.01,25.2,-5,2.247 -xx,0.3,0.01,25.2,5,1.889 -xx,0.3,0.01,25.2,15,1.567 -xx,0.3,0.01,25.2,25,1.624 -xx,0.3,0.01,25.2,35,1.846 -xx,0.3,0.01,30,-15,2.413 -xx,0.3,0.01,30,-5,2.089 -xx,0.3,0.01,30,5,1.792 -xx,0.3,0.01,30,15,1.523 -xx,0.3,0.01,30,25,1.568 -xx,0.3,0.01,30,35,1.751 -xx,0.3,0.01,37.1,-15,2.241 -xx,0.3,0.01,37.1,-5,1.965 -xx,0.3,0.01,37.1,5,1.713 -xx,0.3,0.01,37.1,15,1.487 -xx,0.3,0.01,37.1,25,1.518 -xx,0.3,0.01,37.1,35,1.666 -xx,0.3,0.02,12.1,-15,5.111 -xx,0.3,0.02,12.1,-5,3.966 -xx,0.3,0.02,12.1,5,2.987 -xx,0.3,0.02,12.1,15,2.177 -xx,0.3,0.02,12.1,25,2.284 -xx,0.3,0.02,12.1,35,2.834 -xx,0.3,0.02,18,-15,3.947 -xx,0.3,0.02,18,-5,3.227 -xx,0.3,0.02,18,5,2.604 -xx,0.3,0.02,18,15,2.078 -xx,0.3,0.02,18,25,2.15 -xx,0.3,0.02,18,35,2.506 -xx,0.3,0.02,25.2,-15,3.099 -xx,0.3,0.02,25.2,-5,2.704 -xx,0.3,0.02,25.2,5,2.346 -xx,0.3,0.02,25.2,15,2.024 -xx,0.3,0.02,25.2,25,2.081 -xx,0.3,0.02,25.2,35,2.303 -xx,0.3,0.02,30,-15,2.882 -xx,0.3,0.02,30,-5,2.558 -xx,0.3,0.02,30,5,2.261 -xx,0.3,0.02,30,15,1.992 -xx,0.3,0.02,30,25,2.037 -xx,0.3,0.02,30,35,2.22 -xx,0.3,0.02,37.1,-15,2.723 -xx,0.3,0.02,37.1,-5,2.447 -xx,0.3,0.02,37.1,5,2.195 -xx,0.3,0.02,37.1,15,1.969 -xx,0.3,0.02,37.1,25,2.001 -xx,0.3,0.02,37.1,35,2.148 -xx,0.3,0.03,12.1,-15,5.551 -xx,0.3,0.03,12.1,-5,4.406 -xx,0.3,0.03,12.1,5,3.428 -xx,0.3,0.03,12.1,15,2.617 -xx,0.3,0.03,12.1,25,2.724 -xx,0.3,0.03,12.1,35,3.274 -xx,0.3,0.03,18,-15,4.401 -xx,0.3,0.03,18,-5,3.681 -xx,0.3,0.03,18,5,3.057 -xx,0.3,0.03,18,15,2.532 -xx,0.3,0.03,18,25,2.604 -xx,0.3,0.03,18,35,2.96 -xx,0.3,0.03,25.2,-15,3.557 -xx,0.3,0.03,25.2,-5,3.162 -xx,0.3,0.03,25.2,5,2.804 -xx,0.3,0.03,25.2,15,2.482 -xx,0.3,0.03,25.2,25,2.539 -xx,0.3,0.03,25.2,35,2.761 -xx,0.3,0.03,30,-15,3.352 -xx,0.3,0.03,30,-5,3.027 -xx,0.3,0.03,30,5,2.73 -xx,0.3,0.03,30,15,2.462 -xx,0.3,0.03,30,25,2.507 -xx,0.3,0.03,30,35,2.689 -xx,0.3,0.03,37.1,-15,3.205 -xx,0.3,0.03,37.1,-5,2.929 -xx,0.3,0.03,37.1,5,2.677 -xx,0.3,0.03,37.1,15,2.451 -xx,0.3,0.03,37.1,25,2.483 -xx,0.3,0.03,37.1,35,2.63 -xx,0.3,0.04,12.1,-15,5.991 -xx,0.3,0.04,12.1,-5,4.847 -xx,0.3,0.04,12.1,5,3.868 -xx,0.3,0.04,12.1,15,3.057 -xx,0.3,0.04,12.1,25,3.165 -xx,0.3,0.04,12.1,35,3.714 -xx,0.3,0.04,18,-15,4.855 -xx,0.3,0.04,18,-5,4.135 -xx,0.3,0.04,18,5,3.511 -xx,0.3,0.04,18,15,2.985 -xx,0.3,0.04,18,25,3.057 -xx,0.3,0.04,18,35,3.413 -xx,0.3,0.04,25.2,-15,4.015 -xx,0.3,0.04,25.2,-5,3.62 -xx,0.3,0.04,25.2,5,3.262 -xx,0.3,0.04,25.2,15,2.94 -xx,0.3,0.04,25.2,25,2.997 -xx,0.3,0.04,25.2,35,3.219 -xx,0.3,0.04,30,-15,3.821 -xx,0.3,0.04,30,-5,3.497 -xx,0.3,0.04,30,5,3.2 -xx,0.3,0.04,30,15,2.931 -xx,0.3,0.04,30,25,2.977 -xx,0.3,0.04,30,35,3.159 -xx,0.3,0.04,37.1,-15,3.687 -xx,0.3,0.04,37.1,-5,3.411 -xx,0.3,0.04,37.1,5,3.159 -xx,0.3,0.04,37.1,15,2.933 -xx,0.3,0.04,37.1,25,2.965 -xx,0.3,0.04,37.1,35,3.112 -xx,0.6,-0.04,12.1,-15,2.329 -xx,0.6,-0.04,12.1,-5,1.185 -xx,0.6,-0.04,12.1,5,0.207 -xx,0.6,-0.04,12.1,15,-0.413 -xx,0.6,-0.04,12.1,25,-0.173 -xx,0.6,-0.04,12.1,35,0.433 -xx,0.6,-0.04,18,-15,1.143 -xx,0.6,-0.04,18,-5,0.424 -xx,0.6,-0.04,18,5,-0.198 -xx,0.6,-0.04,18,15,-0.594 -xx,0.6,-0.04,18,25,-0.432 -xx,0.6,-0.04,18,35,-0.038 -xx,0.6,-0.04,25.2,-15,0.286 -xx,0.6,-0.04,25.2,-5,-0.108 -xx,0.6,-0.04,25.2,5,-0.465 -xx,0.6,-0.04,25.2,15,-0.689 -xx,0.6,-0.04,25.2,25,-0.572 -xx,0.6,-0.04,25.2,35,-0.322 -xx,0.6,-0.04,30,-15,0.061 -xx,0.6,-0.04,30,-5,-0.262 -xx,0.6,-0.04,30,5,-0.556 -xx,0.6,-0.04,30,15,-0.743 -xx,0.6,-0.04,30,25,-0.646 -xx,0.6,-0.04,30,35,-0.439 -xx,0.6,-0.04,37.1,-15,-0.112 -xx,0.6,-0.04,37.1,-5,-0.385 -xx,0.6,-0.04,37.1,5,-0.634 -xx,0.6,-0.04,37.1,15,-0.795 -xx,0.6,-0.04,37.1,25,-0.718 -xx,0.6,-0.04,37.1,35,-0.55 -xx,0.6,-0.03,12.1,-15,2.752 -xx,0.6,-0.03,12.1,-5,1.608 -xx,0.6,-0.03,12.1,5,0.63 -xx,0.6,-0.03,12.1,15,0.01 -xx,0.6,-0.03,12.1,25,0.251 -xx,0.6,-0.03,12.1,35,0.856 -xx,0.6,-0.03,18,-15,1.576 -xx,0.6,-0.03,18,-5,0.857 -xx,0.6,-0.03,18,5,0.234 -xx,0.6,-0.03,18,15,-0.162 -xx,0.6,-0.03,18,25,0.001 -xx,0.6,-0.03,18,35,0.395 -xx,0.6,-0.03,25.2,-15,0.731 -xx,0.6,-0.03,25.2,-5,0.337 -xx,0.6,-0.03,25.2,5,-0.02 -xx,0.6,-0.03,25.2,15,-0.244 -xx,0.6,-0.03,25.2,25,-0.127 -xx,0.6,-0.03,25.2,35,0.123 -xx,0.6,-0.03,30,-15,0.491 -xx,0.6,-0.03,30,-5,0.168 -xx,0.6,-0.03,30,5,-0.126 -xx,0.6,-0.03,30,15,-0.313 -xx,0.6,-0.03,30,25,-0.216 -xx,0.6,-0.03,30,35,-0.009 -xx,0.6,-0.03,37.1,-15,0.303 -xx,0.6,-0.03,37.1,-5,0.03 -xx,0.6,-0.03,37.1,5,-0.218 -xx,0.6,-0.03,37.1,15,-0.379 -xx,0.6,-0.03,37.1,25,-0.303 -xx,0.6,-0.03,37.1,35,-0.134 -xx,0.6,-0.02,12.1,-15,3.175 -xx,0.6,-0.02,12.1,-5,2.031 -xx,0.6,-0.02,12.1,5,1.053 -xx,0.6,-0.02,12.1,15,0.433 -xx,0.6,-0.02,12.1,25,0.674 -xx,0.6,-0.02,12.1,35,1.279 -xx,0.6,-0.02,18,-15,2.008 -xx,0.6,-0.02,18,-5,1.29 -xx,0.6,-0.02,18,5,0.667 -xx,0.6,-0.02,18,15,0.271 -xx,0.6,-0.02,18,25,0.434 -xx,0.6,-0.02,18,35,0.828 -xx,0.6,-0.02,25.2,-15,1.176 -xx,0.6,-0.02,25.2,-5,0.783 -xx,0.6,-0.02,25.2,5,0.426 -xx,0.6,-0.02,25.2,15,0.202 -xx,0.6,-0.02,25.2,25,0.319 -xx,0.6,-0.02,25.2,35,0.569 -xx,0.6,-0.02,30,-15,0.922 -xx,0.6,-0.02,30,-5,0.599 -xx,0.6,-0.02,30,5,0.305 -xx,0.6,-0.02,30,15,0.118 -xx,0.6,-0.02,30,25,0.215 -xx,0.6,-0.02,30,35,0.422 -xx,0.6,-0.02,37.1,-15,0.719 -xx,0.6,-0.02,37.1,-5,0.446 -xx,0.6,-0.02,37.1,5,0.197 -xx,0.6,-0.02,37.1,15,0.036 -xx,0.6,-0.02,37.1,25,0.113 -xx,0.6,-0.02,37.1,35,0.281 -xx,0.6,-0.01,12.1,-15,3.611 -xx,0.6,-0.01,12.1,-5,2.466 -xx,0.6,-0.01,12.1,5,1.487 -xx,0.6,-0.01,12.1,15,0.867 -xx,0.6,-0.01,12.1,25,1.107 -xx,0.6,-0.01,12.1,35,1.713 -xx,0.6,-0.01,18,-15,2.472 -xx,0.6,-0.01,18,-5,1.751 -xx,0.6,-0.01,18,5,1.128 -xx,0.6,-0.01,18,15,0.731 -xx,0.6,-0.01,18,25,0.893 -xx,0.6,-0.01,18,35,1.286 -xx,0.6,-0.01,25.2,-15,1.655 -xx,0.6,-0.01,25.2,-5,1.26 -xx,0.6,-0.01,25.2,5,0.902 -xx,0.6,-0.01,25.2,15,0.677 -xx,0.6,-0.01,25.2,25,0.793 -xx,0.6,-0.01,25.2,35,1.042 -xx,0.6,-0.01,30,-15,1.409 -xx,0.6,-0.01,30,-5,1.085 -xx,0.6,-0.01,30,5,0.788 -xx,0.6,-0.01,30,15,0.599 -xx,0.6,-0.01,30,25,0.695 -xx,0.6,-0.01,30,35,0.9 -xx,0.6,-0.01,37.1,-15,1.218 -xx,0.6,-0.01,37.1,-5,0.941 -xx,0.6,-0.01,37.1,5,0.69 -xx,0.6,-0.01,37.1,15,0.526 -xx,0.6,-0.01,37.1,25,0.601 -xx,0.6,-0.01,37.1,35,0.767 -xx,0.6,0,12.1,-15,4.104 -xx,0.6,0,12.1,-5,2.96 -xx,0.6,0,12.1,5,1.981 -xx,0.6,0,12.1,15,1.36 -xx,0.6,0,12.1,25,1.601 -xx,0.6,0,12.1,35,2.206 -xx,0.6,0,18,-15,2.98 -xx,0.6,0,18,-5,2.26 -xx,0.6,0,18,5,1.637 -xx,0.6,0,18,15,1.24 -xx,0.6,0,18,25,1.401 -xx,0.6,0,18,35,1.794 -xx,0.6,0,25.2,-15,2.168 -xx,0.6,0,25.2,-5,1.773 -xx,0.6,0,25.2,5,1.415 -xx,0.6,0,25.2,15,1.19 -xx,0.6,0,25.2,25,1.306 -xx,0.6,0,25.2,35,1.555 -xx,0.6,0,30,-15,1.936 -xx,0.6,0,30,-5,1.611 -xx,0.6,0,30,5,1.314 -xx,0.6,0,30,15,1.126 -xx,0.6,0,30,25,1.222 -xx,0.6,0,30,35,1.426 -xx,0.6,0,37.1,-15,1.759 -xx,0.6,0,37.1,-5,1.482 -xx,0.6,0,37.1,5,1.231 -xx,0.6,0,37.1,15,1.067 -xx,0.6,0,37.1,25,1.141 -xx,0.6,0,37.1,35,1.307 -xx,0.6,0.01,12.1,-15,4.599 -xx,0.6,0.01,12.1,-5,3.454 -xx,0.6,0.01,12.1,5,2.476 -xx,0.6,0.01,12.1,15,1.855 -xx,0.6,0.01,12.1,25,2.096 -xx,0.6,0.01,12.1,35,2.701 -xx,0.6,0.01,18,-15,3.49 -xx,0.6,0.01,18,-5,2.77 -xx,0.6,0.01,18,5,2.146 -xx,0.6,0.01,18,15,1.749 -xx,0.6,0.01,18,25,1.911 -xx,0.6,0.01,18,35,2.304 -xx,0.6,0.01,25.2,-15,2.681 -xx,0.6,0.01,25.2,-5,2.287 -xx,0.6,0.01,25.2,5,1.928 -xx,0.6,0.01,25.2,15,1.703 -xx,0.6,0.01,25.2,25,1.819 -xx,0.6,0.01,25.2,35,2.068 -xx,0.6,0.01,30,-15,2.463 -xx,0.6,0.01,30,-5,2.138 -xx,0.6,0.01,30,5,1.841 -xx,0.6,0.01,30,15,1.653 -xx,0.6,0.01,30,25,1.748 -xx,0.6,0.01,30,35,1.953 -xx,0.6,0.01,37.1,-15,2.3 -xx,0.6,0.01,37.1,-5,2.023 -xx,0.6,0.01,37.1,5,1.772 -xx,0.6,0.01,37.1,15,1.608 -xx,0.6,0.01,37.1,25,1.683 -xx,0.6,0.01,37.1,35,1.848 -xx,0.6,0.02,12.1,-15,5.093 -xx,0.6,0.02,12.1,-5,3.949 -xx,0.6,0.02,12.1,5,2.97 -xx,0.6,0.02,12.1,15,2.349 -xx,0.6,0.02,12.1,25,2.59 -xx,0.6,0.02,12.1,35,3.195 -xx,0.6,0.02,18,-15,3.999 -xx,0.6,0.02,18,-5,3.279 -xx,0.6,0.02,18,5,2.656 -xx,0.6,0.02,18,15,2.259 -xx,0.6,0.02,18,25,2.42 -xx,0.6,0.02,18,35,2.814 -xx,0.6,0.02,25.2,-15,3.195 -xx,0.6,0.02,25.2,-5,2.8 -xx,0.6,0.02,25.2,5,2.442 -xx,0.6,0.02,25.2,15,2.216 -xx,0.6,0.02,25.2,25,2.333 -xx,0.6,0.02,25.2,35,2.582 -xx,0.6,0.02,30,-15,2.989 -xx,0.6,0.02,30,-5,2.665 -xx,0.6,0.02,30,5,2.368 -xx,0.6,0.02,30,15,2.179 -xx,0.6,0.02,30,25,2.275 -xx,0.6,0.02,30,35,2.48 -xx,0.6,0.02,37.1,-15,2.841 -xx,0.6,0.02,37.1,-5,2.565 -xx,0.6,0.02,37.1,5,2.313 -xx,0.6,0.02,37.1,15,2.15 -xx,0.6,0.02,37.1,25,2.224 -xx,0.6,0.02,37.1,35,2.39 -xx,0.6,0.03,12.1,-15,5.588 -xx,0.6,0.03,12.1,-5,4.443 -xx,0.6,0.03,12.1,5,3.464 -xx,0.6,0.03,12.1,15,2.844 -xx,0.6,0.03,12.1,25,3.084 -xx,0.6,0.03,12.1,35,3.69 -xx,0.6,0.03,18,-15,4.509 -xx,0.6,0.03,18,-5,3.789 -xx,0.6,0.03,18,5,3.165 -xx,0.6,0.03,18,15,2.768 -xx,0.6,0.03,18,25,2.93 -xx,0.6,0.03,18,35,3.323 -xx,0.6,0.03,25.2,-15,3.709 -xx,0.6,0.03,25.2,-5,3.314 -xx,0.6,0.03,25.2,5,2.956 -xx,0.6,0.03,25.2,15,2.731 -xx,0.6,0.03,25.2,25,2.847 -xx,0.6,0.03,25.2,35,3.096 -xx,0.6,0.03,30,-15,3.517 -xx,0.6,0.03,30,-5,3.192 -xx,0.6,0.03,30,5,2.895 -xx,0.6,0.03,30,15,2.707 -xx,0.6,0.03,30,25,2.802 -xx,0.6,0.03,30,35,3.007 -xx,0.6,0.03,37.1,-15,3.382 -xx,0.6,0.03,37.1,-5,3.106 -xx,0.6,0.03,37.1,5,2.855 -xx,0.6,0.03,37.1,15,2.691 -xx,0.6,0.03,37.1,25,2.765 -xx,0.6,0.03,37.1,35,2.931 -xx,0.6,0.04,12.1,-15,6.082 -xx,0.6,0.04,12.1,-5,4.938 -xx,0.6,0.04,12.1,5,3.959 -xx,0.6,0.04,12.1,15,3.338 -xx,0.6,0.04,12.1,25,3.579 -xx,0.6,0.04,12.1,35,4.184 -xx,0.6,0.04,18,-15,5.018 -xx,0.6,0.04,18,-5,4.298 -xx,0.6,0.04,18,5,3.675 -xx,0.6,0.04,18,15,3.278 -xx,0.6,0.04,18,25,3.439 -xx,0.6,0.04,18,35,3.833 -xx,0.6,0.04,25.2,-15,4.223 -xx,0.6,0.04,25.2,-5,3.828 -xx,0.6,0.04,25.2,5,3.47 -xx,0.6,0.04,25.2,15,3.245 -xx,0.6,0.04,25.2,25,3.361 -xx,0.6,0.04,25.2,35,3.61 -xx,0.6,0.04,30,-15,4.044 -xx,0.6,0.04,30,-5,3.719 -xx,0.6,0.04,30,5,3.423 -xx,0.6,0.04,30,15,3.234 -xx,0.6,0.04,30,25,3.33 -xx,0.6,0.04,30,35,3.535 -xx,0.6,0.04,37.1,-15,3.924 -xx,0.6,0.04,37.1,-5,3.647 -xx,0.6,0.04,37.1,5,3.396 -xx,0.6,0.04,37.1,15,3.232 -xx,0.6,0.04,37.1,25,3.307 -xx,0.6,0.04,37.1,35,3.472 -xx,0.9,-0.04,12.1,-15,2.01 -xx,0.9,-0.04,12.1,-5,0.866 -xx,0.9,-0.04,12.1,5,-0.112 -xx,0.9,-0.04,12.1,15,-0.504 -xx,0.9,-0.04,12.1,25,-0.168 -xx,0.9,-0.04,12.1,35,0.493 -xx,0.9,-0.04,18,-15,0.886 -xx,0.9,-0.04,18,-5,0.167 -xx,0.9,-0.04,18,5,-0.456 -xx,0.9,-0.04,18,15,-0.694 -xx,0.9,-0.04,18,25,-0.471 -xx,0.9,-0.04,18,35,-0.04 -xx,0.9,-0.04,25.2,-15,0.067 -xx,0.9,-0.04,25.2,-5,-0.327 -xx,0.9,-0.04,25.2,5,-0.684 -xx,0.9,-0.04,25.2,15,-0.789 -xx,0.9,-0.04,25.2,25,-0.635 -xx,0.9,-0.04,25.2,35,-0.359 -xx,0.9,-0.04,30,-15,-0.147 -xx,0.9,-0.04,30,-5,-0.469 -xx,0.9,-0.04,30,5,-0.764 -xx,0.9,-0.04,30,15,-0.85 -xx,0.9,-0.04,30,25,-0.723 -xx,0.9,-0.04,30,35,-0.494 -xx,0.9,-0.04,37.1,-15,-0.308 -xx,0.9,-0.04,37.1,-5,-0.582 -xx,0.9,-0.04,37.1,5,-0.83 -xx,0.9,-0.04,37.1,15,-0.91 -xx,0.9,-0.04,37.1,25,-0.809 -xx,0.9,-0.04,37.1,35,-0.622 -xx,0.9,-0.03,12.1,-15,2.48 -xx,0.9,-0.03,12.1,-5,1.336 -xx,0.9,-0.03,12.1,5,0.357 -xx,0.9,-0.03,12.1,15,-0.034 -xx,0.9,-0.03,12.1,25,0.301 -xx,0.9,-0.03,12.1,35,0.963 -xx,0.9,-0.03,18,-15,1.366 -xx,0.9,-0.03,18,-5,0.647 -xx,0.9,-0.03,18,5,0.024 -xx,0.9,-0.03,18,15,-0.214 -xx,0.9,-0.03,18,25,0.009 -xx,0.9,-0.03,18,35,0.441 -xx,0.9,-0.03,25.2,-15,0.56 -xx,0.9,-0.03,25.2,-5,0.167 -xx,0.9,-0.03,25.2,5,-0.19 -xx,0.9,-0.03,25.2,15,-0.295 -xx,0.9,-0.03,25.2,25,-0.141 -xx,0.9,-0.03,25.2,35,0.135 -xx,0.9,-0.03,30,-15,0.331 -xx,0.9,-0.03,30,-5,0.008 -xx,0.9,-0.03,30,5,-0.287 -xx,0.9,-0.03,30,15,-0.373 -xx,0.9,-0.03,30,25,-0.245 -xx,0.9,-0.03,30,35,-0.016 -xx,0.9,-0.03,37.1,-15,0.152 -xx,0.9,-0.03,37.1,-5,-0.121 -xx,0.9,-0.03,37.1,5,-0.37 -xx,0.9,-0.03,37.1,15,-0.45 -xx,0.9,-0.03,37.1,25,-0.348 -xx,0.9,-0.03,37.1,35,-0.162 -xx,0.9,-0.02,12.1,-15,2.949 -xx,0.9,-0.02,12.1,-5,1.805 -xx,0.9,-0.02,12.1,5,0.827 -xx,0.9,-0.02,12.1,15,0.435 -xx,0.9,-0.02,12.1,25,0.771 -xx,0.9,-0.02,12.1,35,1.432 -xx,0.9,-0.02,18,-15,1.846 -xx,0.9,-0.02,18,-5,1.127 -xx,0.9,-0.02,18,5,0.504 -xx,0.9,-0.02,18,15,0.266 -xx,0.9,-0.02,18,25,0.489 -xx,0.9,-0.02,18,35,0.921 -xx,0.9,-0.02,25.2,-15,1.055 -xx,0.9,-0.02,25.2,-5,0.661 -xx,0.9,-0.02,25.2,5,0.304 -xx,0.9,-0.02,25.2,15,0.199 -xx,0.9,-0.02,25.2,25,0.353 -xx,0.9,-0.02,25.2,35,0.63 -xx,0.9,-0.02,30,-15,0.809 -xx,0.9,-0.02,30,-5,0.486 -xx,0.9,-0.02,30,5,0.191 -xx,0.9,-0.02,30,15,0.105 -xx,0.9,-0.02,30,25,0.233 -xx,0.9,-0.02,30,35,0.462 -xx,0.9,-0.02,37.1,-15,0.613 -xx,0.9,-0.02,37.1,-5,0.34 -xx,0.9,-0.02,37.1,5,0.091 -xx,0.9,-0.02,37.1,15,0.011 -xx,0.9,-0.02,37.1,25,0.113 -xx,0.9,-0.02,37.1,35,0.299 -xx,0.9,-0.01,12.1,-15,3.431 -xx,0.9,-0.01,12.1,-5,2.286 -xx,0.9,-0.01,12.1,5,1.307 -xx,0.9,-0.01,12.1,15,0.915 -xx,0.9,-0.01,12.1,25,1.251 -xx,0.9,-0.01,12.1,35,1.911 -xx,0.9,-0.01,18,-15,2.356 -xx,0.9,-0.01,18,-5,1.636 -xx,0.9,-0.01,18,5,1.013 -xx,0.9,-0.01,18,15,0.773 -xx,0.9,-0.01,18,25,0.995 -xx,0.9,-0.01,18,35,1.426 -xx,0.9,-0.01,25.2,-15,1.582 -xx,0.9,-0.01,25.2,-5,1.187 -xx,0.9,-0.01,25.2,5,0.829 -xx,0.9,-0.01,25.2,15,0.723 -xx,0.9,-0.01,25.2,25,0.876 -xx,0.9,-0.01,25.2,35,1.152 -xx,0.9,-0.01,30,-15,1.343 -xx,0.9,-0.01,30,-5,1.019 -xx,0.9,-0.01,30,5,0.722 -xx,0.9,-0.01,30,15,0.634 -xx,0.9,-0.01,30,25,0.76 -xx,0.9,-0.01,30,35,0.987 -xx,0.9,-0.01,37.1,-15,1.158 -xx,0.9,-0.01,37.1,-5,0.881 -xx,0.9,-0.01,37.1,5,0.63 -xx,0.9,-0.01,37.1,15,0.547 -xx,0.9,-0.01,37.1,25,0.646 -xx,0.9,-0.01,37.1,35,0.83 -xx,0.9,0,12.1,-15,3.979 -xx,0.9,0,12.1,-5,2.834 -xx,0.9,0,12.1,5,1.855 -xx,0.9,0,12.1,15,1.463 -xx,0.9,0,12.1,25,1.798 -xx,0.9,0,12.1,35,2.459 -xx,0.9,0,18,-15,2.921 -xx,0.9,0,18,-5,2.201 -xx,0.9,0,18,5,1.577 -xx,0.9,0,18,15,1.338 -xx,0.9,0,18,25,1.56 -xx,0.9,0,18,35,1.991 -xx,0.9,0,25.2,-15,2.151 -xx,0.9,0,25.2,-5,1.756 -xx,0.9,0,25.2,5,1.398 -xx,0.9,0,25.2,15,1.292 -xx,0.9,0,25.2,25,1.445 -xx,0.9,0,25.2,35,1.721 -xx,0.9,0,30,-15,1.927 -xx,0.9,0,30,-5,1.603 -xx,0.9,0,30,5,1.306 -xx,0.9,0,30,15,1.218 -xx,0.9,0,30,25,1.344 -xx,0.9,0,30,35,1.571 -xx,0.9,0,37.1,-15,1.758 -xx,0.9,0,37.1,-5,1.481 -xx,0.9,0,37.1,5,1.23 -xx,0.9,0,37.1,15,1.147 -xx,0.9,0,37.1,25,1.246 -xx,0.9,0,37.1,35,1.43 -xx,0.9,0.01,12.1,-15,4.528 -xx,0.9,0.01,12.1,-5,3.383 -xx,0.9,0.01,12.1,5,2.404 -xx,0.9,0.01,12.1,15,2.012 -xx,0.9,0.01,12.1,25,2.347 -xx,0.9,0.01,12.1,35,3.008 -xx,0.9,0.01,18,-15,3.486 -xx,0.9,0.01,18,-5,2.766 -xx,0.9,0.01,18,5,2.143 -xx,0.9,0.01,18,15,1.903 -xx,0.9,0.01,18,25,2.125 -xx,0.9,0.01,18,35,2.556 -xx,0.9,0.01,25.2,-15,2.721 -xx,0.9,0.01,25.2,-5,2.326 -xx,0.9,0.01,25.2,5,1.968 -xx,0.9,0.01,25.2,15,1.862 -xx,0.9,0.01,25.2,25,2.015 -xx,0.9,0.01,25.2,35,2.29 -xx,0.9,0.01,30,-15,2.512 -xx,0.9,0.01,30,-5,2.187 -xx,0.9,0.01,30,5,1.891 -xx,0.9,0.01,30,15,1.803 -xx,0.9,0.01,30,25,1.928 -xx,0.9,0.01,30,35,2.156 -xx,0.9,0.01,37.1,-15,2.358 -xx,0.9,0.01,37.1,-5,2.082 -xx,0.9,0.01,37.1,5,1.83 -xx,0.9,0.01,37.1,15,1.747 -xx,0.9,0.01,37.1,25,1.847 -xx,0.9,0.01,37.1,35,2.031 -xx,0.9,0.02,12.1,-15,5.076 -xx,0.9,0.02,12.1,-5,3.932 -xx,0.9,0.02,12.1,5,2.953 -xx,0.9,0.02,12.1,15,2.561 -xx,0.9,0.02,12.1,25,2.896 -xx,0.9,0.02,12.1,35,3.557 -xx,0.9,0.02,18,-15,4.052 -xx,0.9,0.02,18,-5,3.332 -xx,0.9,0.02,18,5,2.708 -xx,0.9,0.02,18,15,2.468 -xx,0.9,0.02,18,25,2.691 -xx,0.9,0.02,18,35,3.121 -xx,0.9,0.02,25.2,-15,3.291 -xx,0.9,0.02,25.2,-5,2.896 -xx,0.9,0.02,25.2,5,2.538 -xx,0.9,0.02,25.2,15,2.432 -xx,0.9,0.02,25.2,25,2.584 -xx,0.9,0.02,25.2,35,2.86 -xx,0.9,0.02,30,-15,3.096 -xx,0.9,0.02,30,-5,2.772 -xx,0.9,0.02,30,5,2.475 -xx,0.9,0.02,30,15,2.387 -xx,0.9,0.02,30,25,2.513 -xx,0.9,0.02,30,35,2.74 -xx,0.9,0.02,37.1,-15,2.959 -xx,0.9,0.02,37.1,-5,2.683 -xx,0.9,0.02,37.1,5,2.431 -xx,0.9,0.02,37.1,15,2.348 -xx,0.9,0.02,37.1,25,2.447 -xx,0.9,0.02,37.1,35,2.631 -xx,0.9,0.03,12.1,-15,5.625 -xx,0.9,0.03,12.1,-5,4.48 -xx,0.9,0.03,12.1,5,3.501 -xx,0.9,0.03,12.1,15,3.109 -xx,0.9,0.03,12.1,25,3.444 -xx,0.9,0.03,12.1,35,4.105 -xx,0.9,0.03,18,-15,4.617 -xx,0.9,0.03,18,-5,3.897 -xx,0.9,0.03,18,5,3.273 -xx,0.9,0.03,18,15,3.034 -xx,0.9,0.03,18,25,3.256 -xx,0.9,0.03,18,35,3.687 -xx,0.9,0.03,25.2,-15,3.861 -xx,0.9,0.03,25.2,-5,3.466 -xx,0.9,0.03,25.2,5,3.108 -xx,0.9,0.03,25.2,15,3.002 -xx,0.9,0.03,25.2,25,3.155 -xx,0.9,0.03,25.2,35,3.431 -xx,0.9,0.03,30,-15,3.682 -xx,0.9,0.03,30,-5,3.357 -xx,0.9,0.03,30,5,3.06 -xx,0.9,0.03,30,15,2.972 -xx,0.9,0.03,30,25,3.098 -xx,0.9,0.03,30,35,3.325 -xx,0.9,0.03,37.1,-15,3.56 -xx,0.9,0.03,37.1,-5,3.283 -xx,0.9,0.03,37.1,5,3.032 -xx,0.9,0.03,37.1,15,2.949 -xx,0.9,0.03,37.1,25,3.048 -xx,0.9,0.03,37.1,35,3.232 -xx,0.9,0.04,12.1,-15,6.173 -xx,0.9,0.04,12.1,-5,5.029 -xx,0.9,0.04,12.1,5,4.05 -xx,0.9,0.04,12.1,15,3.658 -xx,0.9,0.04,12.1,25,3.993 -xx,0.9,0.04,12.1,35,4.654 -xx,0.9,0.04,18,-15,5.182 -xx,0.9,0.04,18,-5,4.462 -xx,0.9,0.04,18,5,3.839 -xx,0.9,0.04,18,15,3.599 -xx,0.9,0.04,18,25,3.821 -xx,0.9,0.04,18,35,4.252 -xx,0.9,0.04,25.2,-15,4.432 -xx,0.9,0.04,25.2,-5,4.037 -xx,0.9,0.04,25.2,5,3.679 -xx,0.9,0.04,25.2,15,3.573 -xx,0.9,0.04,25.2,25,3.725 -xx,0.9,0.04,25.2,35,4.001 -xx,0.9,0.04,30,-15,4.267 -xx,0.9,0.04,30,-5,3.942 -xx,0.9,0.04,30,5,3.645 -xx,0.9,0.04,30,15,3.557 -xx,0.9,0.04,30,25,3.683 -xx,0.9,0.04,30,35,3.91 -xx,0.9,0.04,37.1,-15,4.16 -xx,0.9,0.04,37.1,-5,3.884 -xx,0.9,0.04,37.1,5,3.632 -xx,0.9,0.04,37.1,15,3.549 -xx,0.9,0.04,37.1,25,3.649 -xx,0.9,0.04,37.1,35,3.833 +VDL,0,-0.04,12.1,-15,2.967 +VDL,0,-0.04,12.1,-5,1.823 +VDL,0,-0.04,12.1,5,0.844 +VDL,0,-0.04,12.1,15,0.034 +VDL,0,-0.04,12.1,25,-0.181 +VDL,0,-0.04,12.1,35,0.314 +VDL,0,-0.04,18,-15,1.658 +VDL,0,-0.04,18,-5,0.939 +VDL,0,-0.04,18,5,0.317 +VDL,0,-0.04,18,15,-0.208 +VDL,0,-0.04,18,25,-0.353 +VDL,0,-0.04,18,35,-0.034 +VDL,0,-0.04,25.2,-15,0.724 +VDL,0,-0.04,25.2,-5,0.33 +VDL,0,-0.04,25.2,5,-0.026 +VDL,0,-0.04,25.2,15,-0.347 +VDL,0,-0.04,25.2,25,-0.445 +VDL,0,-0.04,25.2,35,-0.248 +VDL,0,-0.04,30,-15,0.476 +VDL,0,-0.04,30,-5,0.153 +VDL,0,-0.04,30,5,-0.141 +VDL,0,-0.04,30,15,-0.408 +VDL,0,-0.04,30,25,-0.492 +VDL,0,-0.04,30,35,-0.33 +VDL,0,-0.04,37.1,-15,0.281 +VDL,0,-0.04,37.1,-5,0.008 +VDL,0,-0.04,37.1,5,-0.241 +VDL,0,-0.04,37.1,15,-0.465 +VDL,0,-0.04,37.1,25,-0.536 +VDL,0,-0.04,37.1,35,-0.404 +VDL,0,-0.03,12.1,-15,3.297 +VDL,0,-0.03,12.1,-5,2.153 +VDL,0,-0.03,12.1,5,1.175 +VDL,0,-0.03,12.1,15,0.365 +VDL,0,-0.03,12.1,25,0.149 +VDL,0,-0.03,12.1,35,0.644 +VDL,0,-0.03,18,-15,1.996 +VDL,0,-0.03,18,-5,1.277 +VDL,0,-0.03,18,5,0.654 +VDL,0,-0.03,18,15,0.13 +VDL,0,-0.03,18,25,-0.015 +VDL,0,-0.03,18,35,0.304 +VDL,0,-0.03,25.2,-15,1.072 +VDL,0,-0.03,25.2,-5,0.678 +VDL,0,-0.03,25.2,5,0.321 +VDL,0,-0.03,25.2,15,0.001 +VDL,0,-0.03,25.2,25,-0.097 +VDL,0,-0.03,25.2,35,0.099 +VDL,0,-0.03,30,-15,0.812 +VDL,0,-0.03,30,-5,0.489 +VDL,0,-0.03,30,5,0.195 +VDL,0,-0.03,30,15,-0.072 +VDL,0,-0.03,30,25,-0.156 +VDL,0,-0.03,30,35,0.006 +VDL,0,-0.03,37.1,-15,0.606 +VDL,0,-0.03,37.1,-5,0.332 +VDL,0,-0.03,37.1,5,0.084 +VDL,0,-0.03,37.1,15,-0.14 +VDL,0,-0.03,37.1,25,-0.212 +VDL,0,-0.03,37.1,35,-0.08 +VDL,0,-0.02,12.1,-15,3.628 +VDL,0,-0.02,12.1,-5,2.484 +VDL,0,-0.02,12.1,5,1.505 +VDL,0,-0.02,12.1,15,0.695 +VDL,0,-0.02,12.1,25,0.48 +VDL,0,-0.02,12.1,35,0.974 +VDL,0,-0.02,18,-15,2.334 +VDL,0,-0.02,18,-5,1.615 +VDL,0,-0.02,18,5,0.992 +VDL,0,-0.02,18,15,0.467 +VDL,0,-0.02,18,25,0.322 +VDL,0,-0.02,18,35,0.642 +VDL,0,-0.02,25.2,-15,1.42 +VDL,0,-0.02,25.2,-5,1.026 +VDL,0,-0.02,25.2,5,0.669 +VDL,0,-0.02,25.2,15,0.349 +VDL,0,-0.02,25.2,25,0.251 +VDL,0,-0.02,25.2,35,0.447 +VDL,0,-0.02,30,-15,1.148 +VDL,0,-0.02,30,-5,0.826 +VDL,0,-0.02,30,5,0.531 +VDL,0,-0.02,30,15,0.264 +VDL,0,-0.02,30,25,0.18 +VDL,0,-0.02,30,35,0.342 +VDL,0,-0.02,37.1,-15,0.93 +VDL,0,-0.02,37.1,-5,0.657 +VDL,0,-0.02,37.1,5,0.408 +VDL,0,-0.02,37.1,15,0.184 +VDL,0,-0.02,37.1,25,0.113 +VDL,0,-0.02,37.1,35,0.245 +VDL,0,-0.01,12.1,-15,3.97 +VDL,0,-0.01,12.1,-5,2.826 +VDL,0,-0.01,12.1,5,1.847 +VDL,0,-0.01,12.1,15,1.036 +VDL,0,-0.01,12.1,25,0.82 +VDL,0,-0.01,12.1,35,1.315 +VDL,0,-0.01,18,-15,2.702 +VDL,0,-0.01,18,-5,1.982 +VDL,0,-0.01,18,5,1.358 +VDL,0,-0.01,18,15,0.833 +VDL,0,-0.01,18,25,0.687 +VDL,0,-0.01,18,35,1.005 +VDL,0,-0.01,25.2,-15,1.8 +VDL,0,-0.01,25.2,-5,1.406 +VDL,0,-0.01,25.2,5,1.048 +VDL,0,-0.01,25.2,15,0.726 +VDL,0,-0.01,25.2,25,0.627 +VDL,0,-0.01,25.2,35,0.823 +VDL,0,-0.01,30,-15,1.541 +VDL,0,-0.01,30,-5,1.217 +VDL,0,-0.01,30,5,0.92 +VDL,0,-0.01,30,15,0.651 +VDL,0,-0.01,30,25,0.566 +VDL,0,-0.01,30,35,0.726 +VDL,0,-0.01,37.1,-15,1.338 +VDL,0,-0.01,37.1,-5,1.062 +VDL,0,-0.01,37.1,5,0.81 +VDL,0,-0.01,37.1,15,0.583 +VDL,0,-0.01,37.1,25,0.51 +VDL,0,-0.01,37.1,35,0.639 +VDL,0,0,12.1,-15,4.356 +VDL,0,0,12.1,-5,3.211 +VDL,0,0,12.1,5,2.232 +VDL,0,0,12.1,15,1.422 +VDL,0,0,12.1,25,1.206 +VDL,0,0,12.1,35,1.7 +VDL,0,0,18,-15,3.099 +VDL,0,0,18,-5,2.379 +VDL,0,0,18,5,1.756 +VDL,0,0,18,15,1.23 +VDL,0,0,18,25,1.084 +VDL,0,0,18,35,1.402 +VDL,0,0,25.2,-15,2.201 +VDL,0,0,25.2,-5,1.806 +VDL,0,0,25.2,5,1.448 +VDL,0,0,25.2,15,1.127 +VDL,0,0,25.2,25,1.028 +VDL,0,0,25.2,35,1.223 +VDL,0,0,30,-15,1.953 +VDL,0,0,30,-5,1.628 +VDL,0,0,30,5,1.331 +VDL,0,0,30,15,1.062 +VDL,0,0,30,25,0.977 +VDL,0,0,30,35,1.137 +VDL,0,0,37.1,-15,1.76 +VDL,0,0,37.1,-5,1.484 +VDL,0,0,37.1,5,1.232 +VDL,0,0,37.1,15,1.006 +VDL,0,0,37.1,25,0.932 +VDL,0,0,37.1,35,1.062 +VDL,0,0.01,12.1,-15,4.742 +VDL,0,0.01,12.1,-5,3.597 +VDL,0,0.01,12.1,5,2.618 +VDL,0,0.01,12.1,15,1.808 +VDL,0,0.01,12.1,25,1.592 +VDL,0,0.01,12.1,35,2.087 +VDL,0,0.01,18,-15,3.497 +VDL,0,0.01,18,-5,2.777 +VDL,0,0.01,18,5,2.154 +VDL,0,0.01,18,15,1.628 +VDL,0,0.01,18,25,1.482 +VDL,0,0.01,18,35,1.8 +VDL,0,0.01,25.2,-15,2.602 +VDL,0,0.01,25.2,-5,2.207 +VDL,0,0.01,25.2,5,1.849 +VDL,0,0.01,25.2,15,1.528 +VDL,0,0.01,25.2,25,1.429 +VDL,0,0.01,25.2,35,1.624 +VDL,0,0.01,30,-15,2.364 +VDL,0,0.01,30,-5,2.039 +VDL,0,0.01,30,5,1.743 +VDL,0,0.01,30,15,1.474 +VDL,0,0.01,30,25,1.388 +VDL,0,0.01,30,35,1.548 +VDL,0,0.01,37.1,-15,2.183 +VDL,0,0.01,37.1,-5,1.907 +VDL,0,0.01,37.1,5,1.655 +VDL,0,0.01,37.1,15,1.428 +VDL,0,0.01,37.1,25,1.354 +VDL,0,0.01,37.1,35,1.484 +VDL,0,0.02,12.1,-15,5.128 +VDL,0,0.02,12.1,-5,3.983 +VDL,0,0.02,12.1,5,3.005 +VDL,0,0.02,12.1,15,2.194 +VDL,0,0.02,12.1,25,1.978 +VDL,0,0.02,12.1,35,2.473 +VDL,0,0.02,18,-15,3.895 +VDL,0,0.02,18,-5,3.175 +VDL,0,0.02,18,5,2.551 +VDL,0,0.02,18,15,2.026 +VDL,0,0.02,18,25,1.88 +VDL,0,0.02,18,35,2.198 +VDL,0,0.02,25.2,-15,3.003 +VDL,0,0.02,25.2,-5,2.608 +VDL,0,0.02,25.2,5,2.25 +VDL,0,0.02,25.2,15,1.928 +VDL,0,0.02,25.2,25,1.83 +VDL,0,0.02,25.2,35,2.025 +VDL,0,0.02,30,-15,2.775 +VDL,0,0.02,30,-5,2.451 +VDL,0,0.02,30,5,2.154 +VDL,0,0.02,30,15,1.885 +VDL,0,0.02,30,25,1.8 +VDL,0,0.02,30,35,1.96 +VDL,0,0.02,37.1,-15,2.606 +VDL,0,0.02,37.1,-5,2.329 +VDL,0,0.02,37.1,5,2.078 +VDL,0,0.02,37.1,15,1.851 +VDL,0,0.02,37.1,25,1.777 +VDL,0,0.02,37.1,35,1.907 +VDL,0,0.03,12.1,-15,5.514 +VDL,0,0.03,12.1,-5,4.37 +VDL,0,0.03,12.1,5,3.391 +VDL,0,0.03,12.1,15,2.58 +VDL,0,0.03,12.1,25,2.364 +VDL,0,0.03,12.1,35,2.859 +VDL,0,0.03,18,-15,4.293 +VDL,0,0.03,18,-5,3.573 +VDL,0,0.03,18,5,2.949 +VDL,0,0.03,18,15,2.424 +VDL,0,0.03,18,25,2.278 +VDL,0,0.03,18,35,2.596 +VDL,0,0.03,25.2,-15,3.405 +VDL,0,0.03,25.2,-5,3.01 +VDL,0,0.03,25.2,5,2.652 +VDL,0,0.03,25.2,15,2.33 +VDL,0,0.03,25.2,25,2.231 +VDL,0,0.03,25.2,35,2.427 +VDL,0,0.03,30,-15,3.187 +VDL,0,0.03,30,-5,2.862 +VDL,0,0.03,30,5,2.566 +VDL,0,0.03,30,15,2.297 +VDL,0,0.03,30,25,2.211 +VDL,0,0.03,30,35,2.371 +VDL,0,0.03,37.1,-15,3.028 +VDL,0,0.03,37.1,-5,2.752 +VDL,0,0.03,37.1,5,2.5 +VDL,0,0.03,37.1,15,2.274 +VDL,0,0.03,37.1,25,2.2 +VDL,0,0.03,37.1,35,2.329 +VDL,0,0.04,12.1,-15,5.9 +VDL,0,0.04,12.1,-5,4.756 +VDL,0,0.04,12.1,5,3.777 +VDL,0,0.04,12.1,15,2.966 +VDL,0,0.04,12.1,25,2.75 +VDL,0,0.04,12.1,35,3.245 +VDL,0,0.04,18,-15,4.691 +VDL,0,0.04,18,-5,3.971 +VDL,0,0.04,18,5,3.347 +VDL,0,0.04,18,15,2.821 +VDL,0,0.04,18,25,2.676 +VDL,0,0.04,18,35,2.994 +VDL,0,0.04,25.2,-15,3.806 +VDL,0,0.04,25.2,-5,3.411 +VDL,0,0.04,25.2,5,3.053 +VDL,0,0.04,25.2,15,2.732 +VDL,0,0.04,25.2,25,2.633 +VDL,0,0.04,25.2,35,2.828 +VDL,0,0.04,30,-15,3.599 +VDL,0,0.04,30,-5,3.274 +VDL,0,0.04,30,5,2.977 +VDL,0,0.04,30,15,2.709 +VDL,0,0.04,30,25,2.623 +VDL,0,0.04,30,35,2.783 +VDL,0,0.04,37.1,-15,3.451 +VDL,0,0.04,37.1,-5,3.175 +VDL,0,0.04,37.1,5,2.923 +VDL,0,0.04,37.1,15,2.696 +VDL,0,0.04,37.1,25,2.623 +VDL,0,0.04,37.1,35,2.752 +VDL,0.3,-0.04,12.1,-15,2.648 +VDL,0.3,-0.04,12.1,-5,1.504 +VDL,0.3,-0.04,12.1,5,0.526 +VDL,0.3,-0.04,12.1,15,-0.284 +VDL,0.3,-0.04,12.1,25,-0.177 +VDL,0.3,-0.04,12.1,35,0.373 +VDL,0.3,-0.04,18,-15,1.4 +VDL,0.3,-0.04,18,-5,0.682 +VDL,0.3,-0.04,18,5,0.059 +VDL,0.3,-0.04,18,15,-0.466 +VDL,0.3,-0.04,18,25,-0.393 +VDL,0.3,-0.04,18,35,-0.036 +VDL,0.3,-0.04,25.2,-15,0.505 +VDL,0.3,-0.04,25.2,-5,0.111 +VDL,0.3,-0.04,25.2,5,-0.246 +VDL,0.3,-0.04,25.2,15,-0.566 +VDL,0.3,-0.04,25.2,25,-0.508 +VDL,0.3,-0.04,25.2,35,-0.285 +VDL,0.3,-0.04,30,-15,0.268 +VDL,0.3,-0.04,30,-5,-0.054 +VDL,0.3,-0.04,30,5,-0.349 +VDL,0.3,-0.04,30,15,-0.616 +VDL,0.3,-0.04,30,25,-0.569 +VDL,0.3,-0.04,30,35,-0.385 +VDL,0.3,-0.04,37.1,-15,0.085 +VDL,0.3,-0.04,37.1,-5,-0.189 +VDL,0.3,-0.04,37.1,5,-0.437 +VDL,0.3,-0.04,37.1,15,-0.661 +VDL,0.3,-0.04,37.1,25,-0.627 +VDL,0.3,-0.04,37.1,35,-0.477 +VDL,0.3,-0.03,12.1,-15,3.025 +VDL,0.3,-0.03,12.1,-5,1.881 +VDL,0.3,-0.03,12.1,5,0.902 +VDL,0.3,-0.03,12.1,15,0.092 +VDL,0.3,-0.03,12.1,25,0.2 +VDL,0.3,-0.03,12.1,35,0.75 +VDL,0.3,-0.03,18,-15,1.786 +VDL,0.3,-0.03,18,-5,1.067 +VDL,0.3,-0.03,18,5,0.444 +VDL,0.3,-0.03,18,15,-0.08 +VDL,0.3,-0.03,18,25,-0.007 +VDL,0.3,-0.03,18,35,0.349 +VDL,0.3,-0.03,25.2,-15,0.901 +VDL,0.3,-0.03,25.2,-5,0.507 +VDL,0.3,-0.03,25.2,5,0.151 +VDL,0.3,-0.03,25.2,15,-0.17 +VDL,0.3,-0.03,25.2,25,-0.112 +VDL,0.3,-0.03,25.2,35,0.111 +VDL,0.3,-0.03,30,-15,0.651 +VDL,0.3,-0.03,30,-5,0.329 +VDL,0.3,-0.03,30,5,0.034 +VDL,0.3,-0.03,30,15,-0.233 +VDL,0.3,-0.03,30,25,-0.186 +VDL,0.3,-0.03,30,35,-0.002 +VDL,0.3,-0.03,37.1,-15,0.455 +VDL,0.3,-0.03,37.1,-5,0.181 +VDL,0.3,-0.03,37.1,5,-0.067 +VDL,0.3,-0.03,37.1,15,-0.292 +VDL,0.3,-0.03,37.1,25,-0.257 +VDL,0.3,-0.03,37.1,35,-0.107 +VDL,0.3,-0.02,12.1,-15,3.402 +VDL,0.3,-0.02,12.1,-5,2.257 +VDL,0.3,-0.02,12.1,5,1.279 +VDL,0.3,-0.02,12.1,15,0.469 +VDL,0.3,-0.02,12.1,25,0.577 +VDL,0.3,-0.02,12.1,35,1.127 +VDL,0.3,-0.02,18,-15,2.171 +VDL,0.3,-0.02,18,-5,1.452 +VDL,0.3,-0.02,18,5,0.83 +VDL,0.3,-0.02,18,15,0.305 +VDL,0.3,-0.02,18,25,0.378 +VDL,0.3,-0.02,18,35,0.735 +VDL,0.3,-0.02,25.2,-15,1.298 +VDL,0.3,-0.02,25.2,-5,0.904 +VDL,0.3,-0.02,25.2,5,0.548 +VDL,0.3,-0.02,25.2,15,0.227 +VDL,0.3,-0.02,25.2,25,0.285 +VDL,0.3,-0.02,25.2,35,0.508 +VDL,0.3,-0.02,30,-15,1.035 +VDL,0.3,-0.02,30,-5,0.713 +VDL,0.3,-0.02,30,5,0.418 +VDL,0.3,-0.02,30,15,0.151 +VDL,0.3,-0.02,30,25,0.198 +VDL,0.3,-0.02,30,35,0.382 +VDL,0.3,-0.02,37.1,-15,0.825 +VDL,0.3,-0.02,37.1,-5,0.551 +VDL,0.3,-0.02,37.1,5,0.303 +VDL,0.3,-0.02,37.1,15,0.078 +VDL,0.3,-0.02,37.1,25,0.113 +VDL,0.3,-0.02,37.1,35,0.263 +VDL,0.3,-0.01,12.1,-15,3.79 +VDL,0.3,-0.01,12.1,-5,2.646 +VDL,0.3,-0.01,12.1,5,1.667 +VDL,0.3,-0.01,12.1,15,0.856 +VDL,0.3,-0.01,12.1,25,0.964 +VDL,0.3,-0.01,12.1,35,1.514 +VDL,0.3,-0.01,18,-15,2.587 +VDL,0.3,-0.01,18,-5,1.867 +VDL,0.3,-0.01,18,5,1.243 +VDL,0.3,-0.01,18,15,0.717 +VDL,0.3,-0.01,18,25,0.79 +VDL,0.3,-0.01,18,35,1.145 +VDL,0.3,-0.01,25.2,-15,1.728 +VDL,0.3,-0.01,25.2,-5,1.333 +VDL,0.3,-0.01,25.2,5,0.975 +VDL,0.3,-0.01,25.2,15,0.653 +VDL,0.3,-0.01,25.2,25,0.71 +VDL,0.3,-0.01,25.2,35,0.932 +VDL,0.3,-0.01,30,-15,1.475 +VDL,0.3,-0.01,30,-5,1.151 +VDL,0.3,-0.01,30,5,0.854 +VDL,0.3,-0.01,30,15,0.585 +VDL,0.3,-0.01,30,25,0.63 +VDL,0.3,-0.01,30,35,0.813 +VDL,0.3,-0.01,37.1,-15,1.278 +VDL,0.3,-0.01,37.1,-5,1.002 +VDL,0.3,-0.01,37.1,5,0.75 +VDL,0.3,-0.01,37.1,15,0.523 +VDL,0.3,-0.01,37.1,25,0.555 +VDL,0.3,-0.01,37.1,35,0.703 +VDL,0.3,0,12.1,-15,4.23 +VDL,0.3,0,12.1,-5,3.086 +VDL,0.3,0,12.1,5,2.107 +VDL,0.3,0,12.1,15,1.296 +VDL,0.3,0,12.1,25,1.404 +VDL,0.3,0,12.1,35,1.953 +VDL,0.3,0,18,-15,3.04 +VDL,0.3,0,18,-5,2.32 +VDL,0.3,0,18,5,1.696 +VDL,0.3,0,18,15,1.17 +VDL,0.3,0,18,25,1.243 +VDL,0.3,0,18,35,1.598 +VDL,0.3,0,25.2,-15,2.185 +VDL,0.3,0,25.2,-5,1.79 +VDL,0.3,0,25.2,5,1.432 +VDL,0.3,0,25.2,15,1.11 +VDL,0.3,0,25.2,25,1.167 +VDL,0.3,0,25.2,35,1.389 +VDL,0.3,0,30,-15,1.944 +VDL,0.3,0,30,-5,1.619 +VDL,0.3,0,30,5,1.323 +VDL,0.3,0,30,15,1.054 +VDL,0.3,0,30,25,1.099 +VDL,0.3,0,30,35,1.282 +VDL,0.3,0,37.1,-15,1.759 +VDL,0.3,0,37.1,-5,1.483 +VDL,0.3,0,37.1,5,1.232 +VDL,0.3,0,37.1,15,1.005 +VDL,0.3,0,37.1,25,1.037 +VDL,0.3,0,37.1,35,1.184 +VDL,0.3,0.01,12.1,-15,4.67 +VDL,0.3,0.01,12.1,-5,3.526 +VDL,0.3,0.01,12.1,5,2.547 +VDL,0.3,0.01,12.1,15,1.737 +VDL,0.3,0.01,12.1,25,1.844 +VDL,0.3,0.01,12.1,35,2.394 +VDL,0.3,0.01,18,-15,3.494 +VDL,0.3,0.01,18,-5,2.773 +VDL,0.3,0.01,18,5,2.15 +VDL,0.3,0.01,18,15,1.624 +VDL,0.3,0.01,18,25,1.696 +VDL,0.3,0.01,18,35,2.052 +VDL,0.3,0.01,25.2,-15,2.642 +VDL,0.3,0.01,25.2,-5,2.247 +VDL,0.3,0.01,25.2,5,1.889 +VDL,0.3,0.01,25.2,15,1.567 +VDL,0.3,0.01,25.2,25,1.624 +VDL,0.3,0.01,25.2,35,1.846 +VDL,0.3,0.01,30,-15,2.413 +VDL,0.3,0.01,30,-5,2.089 +VDL,0.3,0.01,30,5,1.792 +VDL,0.3,0.01,30,15,1.523 +VDL,0.3,0.01,30,25,1.568 +VDL,0.3,0.01,30,35,1.751 +VDL,0.3,0.01,37.1,-15,2.241 +VDL,0.3,0.01,37.1,-5,1.965 +VDL,0.3,0.01,37.1,5,1.713 +VDL,0.3,0.01,37.1,15,1.487 +VDL,0.3,0.01,37.1,25,1.518 +VDL,0.3,0.01,37.1,35,1.666 +VDL,0.3,0.02,12.1,-15,5.111 +VDL,0.3,0.02,12.1,-5,3.966 +VDL,0.3,0.02,12.1,5,2.987 +VDL,0.3,0.02,12.1,15,2.177 +VDL,0.3,0.02,12.1,25,2.284 +VDL,0.3,0.02,12.1,35,2.834 +VDL,0.3,0.02,18,-15,3.947 +VDL,0.3,0.02,18,-5,3.227 +VDL,0.3,0.02,18,5,2.604 +VDL,0.3,0.02,18,15,2.078 +VDL,0.3,0.02,18,25,2.15 +VDL,0.3,0.02,18,35,2.506 +VDL,0.3,0.02,25.2,-15,3.099 +VDL,0.3,0.02,25.2,-5,2.704 +VDL,0.3,0.02,25.2,5,2.346 +VDL,0.3,0.02,25.2,15,2.024 +VDL,0.3,0.02,25.2,25,2.081 +VDL,0.3,0.02,25.2,35,2.303 +VDL,0.3,0.02,30,-15,2.882 +VDL,0.3,0.02,30,-5,2.558 +VDL,0.3,0.02,30,5,2.261 +VDL,0.3,0.02,30,15,1.992 +VDL,0.3,0.02,30,25,2.037 +VDL,0.3,0.02,30,35,2.22 +VDL,0.3,0.02,37.1,-15,2.723 +VDL,0.3,0.02,37.1,-5,2.447 +VDL,0.3,0.02,37.1,5,2.195 +VDL,0.3,0.02,37.1,15,1.969 +VDL,0.3,0.02,37.1,25,2.001 +VDL,0.3,0.02,37.1,35,2.148 +VDL,0.3,0.03,12.1,-15,5.551 +VDL,0.3,0.03,12.1,-5,4.406 +VDL,0.3,0.03,12.1,5,3.428 +VDL,0.3,0.03,12.1,15,2.617 +VDL,0.3,0.03,12.1,25,2.724 +VDL,0.3,0.03,12.1,35,3.274 +VDL,0.3,0.03,18,-15,4.401 +VDL,0.3,0.03,18,-5,3.681 +VDL,0.3,0.03,18,5,3.057 +VDL,0.3,0.03,18,15,2.532 +VDL,0.3,0.03,18,25,2.604 +VDL,0.3,0.03,18,35,2.96 +VDL,0.3,0.03,25.2,-15,3.557 +VDL,0.3,0.03,25.2,-5,3.162 +VDL,0.3,0.03,25.2,5,2.804 +VDL,0.3,0.03,25.2,15,2.482 +VDL,0.3,0.03,25.2,25,2.539 +VDL,0.3,0.03,25.2,35,2.761 +VDL,0.3,0.03,30,-15,3.352 +VDL,0.3,0.03,30,-5,3.027 +VDL,0.3,0.03,30,5,2.73 +VDL,0.3,0.03,30,15,2.462 +VDL,0.3,0.03,30,25,2.507 +VDL,0.3,0.03,30,35,2.689 +VDL,0.3,0.03,37.1,-15,3.205 +VDL,0.3,0.03,37.1,-5,2.929 +VDL,0.3,0.03,37.1,5,2.677 +VDL,0.3,0.03,37.1,15,2.451 +VDL,0.3,0.03,37.1,25,2.483 +VDL,0.3,0.03,37.1,35,2.63 +VDL,0.3,0.04,12.1,-15,5.991 +VDL,0.3,0.04,12.1,-5,4.847 +VDL,0.3,0.04,12.1,5,3.868 +VDL,0.3,0.04,12.1,15,3.057 +VDL,0.3,0.04,12.1,25,3.165 +VDL,0.3,0.04,12.1,35,3.714 +VDL,0.3,0.04,18,-15,4.855 +VDL,0.3,0.04,18,-5,4.135 +VDL,0.3,0.04,18,5,3.511 +VDL,0.3,0.04,18,15,2.985 +VDL,0.3,0.04,18,25,3.057 +VDL,0.3,0.04,18,35,3.413 +VDL,0.3,0.04,25.2,-15,4.015 +VDL,0.3,0.04,25.2,-5,3.62 +VDL,0.3,0.04,25.2,5,3.262 +VDL,0.3,0.04,25.2,15,2.94 +VDL,0.3,0.04,25.2,25,2.997 +VDL,0.3,0.04,25.2,35,3.219 +VDL,0.3,0.04,30,-15,3.821 +VDL,0.3,0.04,30,-5,3.497 +VDL,0.3,0.04,30,5,3.2 +VDL,0.3,0.04,30,15,2.931 +VDL,0.3,0.04,30,25,2.977 +VDL,0.3,0.04,30,35,3.159 +VDL,0.3,0.04,37.1,-15,3.687 +VDL,0.3,0.04,37.1,-5,3.411 +VDL,0.3,0.04,37.1,5,3.159 +VDL,0.3,0.04,37.1,15,2.933 +VDL,0.3,0.04,37.1,25,2.965 +VDL,0.3,0.04,37.1,35,3.112 +VDL,0.6,-0.04,12.1,-15,2.329 +VDL,0.6,-0.04,12.1,-5,1.185 +VDL,0.6,-0.04,12.1,5,0.207 +VDL,0.6,-0.04,12.1,15,-0.413 +VDL,0.6,-0.04,12.1,25,-0.173 +VDL,0.6,-0.04,12.1,35,0.433 +VDL,0.6,-0.04,18,-15,1.143 +VDL,0.6,-0.04,18,-5,0.424 +VDL,0.6,-0.04,18,5,-0.198 +VDL,0.6,-0.04,18,15,-0.594 +VDL,0.6,-0.04,18,25,-0.432 +VDL,0.6,-0.04,18,35,-0.038 +VDL,0.6,-0.04,25.2,-15,0.286 +VDL,0.6,-0.04,25.2,-5,-0.108 +VDL,0.6,-0.04,25.2,5,-0.465 +VDL,0.6,-0.04,25.2,15,-0.689 +VDL,0.6,-0.04,25.2,25,-0.572 +VDL,0.6,-0.04,25.2,35,-0.322 +VDL,0.6,-0.04,30,-15,0.061 +VDL,0.6,-0.04,30,-5,-0.262 +VDL,0.6,-0.04,30,5,-0.556 +VDL,0.6,-0.04,30,15,-0.743 +VDL,0.6,-0.04,30,25,-0.646 +VDL,0.6,-0.04,30,35,-0.439 +VDL,0.6,-0.04,37.1,-15,-0.112 +VDL,0.6,-0.04,37.1,-5,-0.385 +VDL,0.6,-0.04,37.1,5,-0.634 +VDL,0.6,-0.04,37.1,15,-0.795 +VDL,0.6,-0.04,37.1,25,-0.718 +VDL,0.6,-0.04,37.1,35,-0.55 +VDL,0.6,-0.03,12.1,-15,2.752 +VDL,0.6,-0.03,12.1,-5,1.608 +VDL,0.6,-0.03,12.1,5,0.63 +VDL,0.6,-0.03,12.1,15,0.01 +VDL,0.6,-0.03,12.1,25,0.251 +VDL,0.6,-0.03,12.1,35,0.856 +VDL,0.6,-0.03,18,-15,1.576 +VDL,0.6,-0.03,18,-5,0.857 +VDL,0.6,-0.03,18,5,0.234 +VDL,0.6,-0.03,18,15,-0.162 +VDL,0.6,-0.03,18,25,0.001 +VDL,0.6,-0.03,18,35,0.395 +VDL,0.6,-0.03,25.2,-15,0.731 +VDL,0.6,-0.03,25.2,-5,0.337 +VDL,0.6,-0.03,25.2,5,-0.02 +VDL,0.6,-0.03,25.2,15,-0.244 +VDL,0.6,-0.03,25.2,25,-0.127 +VDL,0.6,-0.03,25.2,35,0.123 +VDL,0.6,-0.03,30,-15,0.491 +VDL,0.6,-0.03,30,-5,0.168 +VDL,0.6,-0.03,30,5,-0.126 +VDL,0.6,-0.03,30,15,-0.313 +VDL,0.6,-0.03,30,25,-0.216 +VDL,0.6,-0.03,30,35,-0.009 +VDL,0.6,-0.03,37.1,-15,0.303 +VDL,0.6,-0.03,37.1,-5,0.03 +VDL,0.6,-0.03,37.1,5,-0.218 +VDL,0.6,-0.03,37.1,15,-0.379 +VDL,0.6,-0.03,37.1,25,-0.303 +VDL,0.6,-0.03,37.1,35,-0.134 +VDL,0.6,-0.02,12.1,-15,3.175 +VDL,0.6,-0.02,12.1,-5,2.031 +VDL,0.6,-0.02,12.1,5,1.053 +VDL,0.6,-0.02,12.1,15,0.433 +VDL,0.6,-0.02,12.1,25,0.674 +VDL,0.6,-0.02,12.1,35,1.279 +VDL,0.6,-0.02,18,-15,2.008 +VDL,0.6,-0.02,18,-5,1.29 +VDL,0.6,-0.02,18,5,0.667 +VDL,0.6,-0.02,18,15,0.271 +VDL,0.6,-0.02,18,25,0.434 +VDL,0.6,-0.02,18,35,0.828 +VDL,0.6,-0.02,25.2,-15,1.176 +VDL,0.6,-0.02,25.2,-5,0.783 +VDL,0.6,-0.02,25.2,5,0.426 +VDL,0.6,-0.02,25.2,15,0.202 +VDL,0.6,-0.02,25.2,25,0.319 +VDL,0.6,-0.02,25.2,35,0.569 +VDL,0.6,-0.02,30,-15,0.922 +VDL,0.6,-0.02,30,-5,0.599 +VDL,0.6,-0.02,30,5,0.305 +VDL,0.6,-0.02,30,15,0.118 +VDL,0.6,-0.02,30,25,0.215 +VDL,0.6,-0.02,30,35,0.422 +VDL,0.6,-0.02,37.1,-15,0.719 +VDL,0.6,-0.02,37.1,-5,0.446 +VDL,0.6,-0.02,37.1,5,0.197 +VDL,0.6,-0.02,37.1,15,0.036 +VDL,0.6,-0.02,37.1,25,0.113 +VDL,0.6,-0.02,37.1,35,0.281 +VDL,0.6,-0.01,12.1,-15,3.611 +VDL,0.6,-0.01,12.1,-5,2.466 +VDL,0.6,-0.01,12.1,5,1.487 +VDL,0.6,-0.01,12.1,15,0.867 +VDL,0.6,-0.01,12.1,25,1.107 +VDL,0.6,-0.01,12.1,35,1.713 +VDL,0.6,-0.01,18,-15,2.472 +VDL,0.6,-0.01,18,-5,1.751 +VDL,0.6,-0.01,18,5,1.128 +VDL,0.6,-0.01,18,15,0.731 +VDL,0.6,-0.01,18,25,0.893 +VDL,0.6,-0.01,18,35,1.286 +VDL,0.6,-0.01,25.2,-15,1.655 +VDL,0.6,-0.01,25.2,-5,1.26 +VDL,0.6,-0.01,25.2,5,0.902 +VDL,0.6,-0.01,25.2,15,0.677 +VDL,0.6,-0.01,25.2,25,0.793 +VDL,0.6,-0.01,25.2,35,1.042 +VDL,0.6,-0.01,30,-15,1.409 +VDL,0.6,-0.01,30,-5,1.085 +VDL,0.6,-0.01,30,5,0.788 +VDL,0.6,-0.01,30,15,0.599 +VDL,0.6,-0.01,30,25,0.695 +VDL,0.6,-0.01,30,35,0.9 +VDL,0.6,-0.01,37.1,-15,1.218 +VDL,0.6,-0.01,37.1,-5,0.941 +VDL,0.6,-0.01,37.1,5,0.69 +VDL,0.6,-0.01,37.1,15,0.526 +VDL,0.6,-0.01,37.1,25,0.601 +VDL,0.6,-0.01,37.1,35,0.767 +VDL,0.6,0,12.1,-15,4.104 +VDL,0.6,0,12.1,-5,2.96 +VDL,0.6,0,12.1,5,1.981 +VDL,0.6,0,12.1,15,1.36 +VDL,0.6,0,12.1,25,1.601 +VDL,0.6,0,12.1,35,2.206 +VDL,0.6,0,18,-15,2.98 +VDL,0.6,0,18,-5,2.26 +VDL,0.6,0,18,5,1.637 +VDL,0.6,0,18,15,1.24 +VDL,0.6,0,18,25,1.401 +VDL,0.6,0,18,35,1.794 +VDL,0.6,0,25.2,-15,2.168 +VDL,0.6,0,25.2,-5,1.773 +VDL,0.6,0,25.2,5,1.415 +VDL,0.6,0,25.2,15,1.19 +VDL,0.6,0,25.2,25,1.306 +VDL,0.6,0,25.2,35,1.555 +VDL,0.6,0,30,-15,1.936 +VDL,0.6,0,30,-5,1.611 +VDL,0.6,0,30,5,1.314 +VDL,0.6,0,30,15,1.126 +VDL,0.6,0,30,25,1.222 +VDL,0.6,0,30,35,1.426 +VDL,0.6,0,37.1,-15,1.759 +VDL,0.6,0,37.1,-5,1.482 +VDL,0.6,0,37.1,5,1.231 +VDL,0.6,0,37.1,15,1.067 +VDL,0.6,0,37.1,25,1.141 +VDL,0.6,0,37.1,35,1.307 +VDL,0.6,0.01,12.1,-15,4.599 +VDL,0.6,0.01,12.1,-5,3.454 +VDL,0.6,0.01,12.1,5,2.476 +VDL,0.6,0.01,12.1,15,1.855 +VDL,0.6,0.01,12.1,25,2.096 +VDL,0.6,0.01,12.1,35,2.701 +VDL,0.6,0.01,18,-15,3.49 +VDL,0.6,0.01,18,-5,2.77 +VDL,0.6,0.01,18,5,2.146 +VDL,0.6,0.01,18,15,1.749 +VDL,0.6,0.01,18,25,1.911 +VDL,0.6,0.01,18,35,2.304 +VDL,0.6,0.01,25.2,-15,2.681 +VDL,0.6,0.01,25.2,-5,2.287 +VDL,0.6,0.01,25.2,5,1.928 +VDL,0.6,0.01,25.2,15,1.703 +VDL,0.6,0.01,25.2,25,1.819 +VDL,0.6,0.01,25.2,35,2.068 +VDL,0.6,0.01,30,-15,2.463 +VDL,0.6,0.01,30,-5,2.138 +VDL,0.6,0.01,30,5,1.841 +VDL,0.6,0.01,30,15,1.653 +VDL,0.6,0.01,30,25,1.748 +VDL,0.6,0.01,30,35,1.953 +VDL,0.6,0.01,37.1,-15,2.3 +VDL,0.6,0.01,37.1,-5,2.023 +VDL,0.6,0.01,37.1,5,1.772 +VDL,0.6,0.01,37.1,15,1.608 +VDL,0.6,0.01,37.1,25,1.683 +VDL,0.6,0.01,37.1,35,1.848 +VDL,0.6,0.02,12.1,-15,5.093 +VDL,0.6,0.02,12.1,-5,3.949 +VDL,0.6,0.02,12.1,5,2.97 +VDL,0.6,0.02,12.1,15,2.349 +VDL,0.6,0.02,12.1,25,2.59 +VDL,0.6,0.02,12.1,35,3.195 +VDL,0.6,0.02,18,-15,3.999 +VDL,0.6,0.02,18,-5,3.279 +VDL,0.6,0.02,18,5,2.656 +VDL,0.6,0.02,18,15,2.259 +VDL,0.6,0.02,18,25,2.42 +VDL,0.6,0.02,18,35,2.814 +VDL,0.6,0.02,25.2,-15,3.195 +VDL,0.6,0.02,25.2,-5,2.8 +VDL,0.6,0.02,25.2,5,2.442 +VDL,0.6,0.02,25.2,15,2.216 +VDL,0.6,0.02,25.2,25,2.333 +VDL,0.6,0.02,25.2,35,2.582 +VDL,0.6,0.02,30,-15,2.989 +VDL,0.6,0.02,30,-5,2.665 +VDL,0.6,0.02,30,5,2.368 +VDL,0.6,0.02,30,15,2.179 +VDL,0.6,0.02,30,25,2.275 +VDL,0.6,0.02,30,35,2.48 +VDL,0.6,0.02,37.1,-15,2.841 +VDL,0.6,0.02,37.1,-5,2.565 +VDL,0.6,0.02,37.1,5,2.313 +VDL,0.6,0.02,37.1,15,2.15 +VDL,0.6,0.02,37.1,25,2.224 +VDL,0.6,0.02,37.1,35,2.39 +VDL,0.6,0.03,12.1,-15,5.588 +VDL,0.6,0.03,12.1,-5,4.443 +VDL,0.6,0.03,12.1,5,3.464 +VDL,0.6,0.03,12.1,15,2.844 +VDL,0.6,0.03,12.1,25,3.084 +VDL,0.6,0.03,12.1,35,3.69 +VDL,0.6,0.03,18,-15,4.509 +VDL,0.6,0.03,18,-5,3.789 +VDL,0.6,0.03,18,5,3.165 +VDL,0.6,0.03,18,15,2.768 +VDL,0.6,0.03,18,25,2.93 +VDL,0.6,0.03,18,35,3.323 +VDL,0.6,0.03,25.2,-15,3.709 +VDL,0.6,0.03,25.2,-5,3.314 +VDL,0.6,0.03,25.2,5,2.956 +VDL,0.6,0.03,25.2,15,2.731 +VDL,0.6,0.03,25.2,25,2.847 +VDL,0.6,0.03,25.2,35,3.096 +VDL,0.6,0.03,30,-15,3.517 +VDL,0.6,0.03,30,-5,3.192 +VDL,0.6,0.03,30,5,2.895 +VDL,0.6,0.03,30,15,2.707 +VDL,0.6,0.03,30,25,2.802 +VDL,0.6,0.03,30,35,3.007 +VDL,0.6,0.03,37.1,-15,3.382 +VDL,0.6,0.03,37.1,-5,3.106 +VDL,0.6,0.03,37.1,5,2.855 +VDL,0.6,0.03,37.1,15,2.691 +VDL,0.6,0.03,37.1,25,2.765 +VDL,0.6,0.03,37.1,35,2.931 +VDL,0.6,0.04,12.1,-15,6.082 +VDL,0.6,0.04,12.1,-5,4.938 +VDL,0.6,0.04,12.1,5,3.959 +VDL,0.6,0.04,12.1,15,3.338 +VDL,0.6,0.04,12.1,25,3.579 +VDL,0.6,0.04,12.1,35,4.184 +VDL,0.6,0.04,18,-15,5.018 +VDL,0.6,0.04,18,-5,4.298 +VDL,0.6,0.04,18,5,3.675 +VDL,0.6,0.04,18,15,3.278 +VDL,0.6,0.04,18,25,3.439 +VDL,0.6,0.04,18,35,3.833 +VDL,0.6,0.04,25.2,-15,4.223 +VDL,0.6,0.04,25.2,-5,3.828 +VDL,0.6,0.04,25.2,5,3.47 +VDL,0.6,0.04,25.2,15,3.245 +VDL,0.6,0.04,25.2,25,3.361 +VDL,0.6,0.04,25.2,35,3.61 +VDL,0.6,0.04,30,-15,4.044 +VDL,0.6,0.04,30,-5,3.719 +VDL,0.6,0.04,30,5,3.423 +VDL,0.6,0.04,30,15,3.234 +VDL,0.6,0.04,30,25,3.33 +VDL,0.6,0.04,30,35,3.535 +VDL,0.6,0.04,37.1,-15,3.924 +VDL,0.6,0.04,37.1,-5,3.647 +VDL,0.6,0.04,37.1,5,3.396 +VDL,0.6,0.04,37.1,15,3.232 +VDL,0.6,0.04,37.1,25,3.307 +VDL,0.6,0.04,37.1,35,3.472 +VDL,0.9,-0.04,12.1,-15,2.01 +VDL,0.9,-0.04,12.1,-5,0.866 +VDL,0.9,-0.04,12.1,5,-0.112 +VDL,0.9,-0.04,12.1,15,-0.504 +VDL,0.9,-0.04,12.1,25,-0.168 +VDL,0.9,-0.04,12.1,35,0.493 +VDL,0.9,-0.04,18,-15,0.886 +VDL,0.9,-0.04,18,-5,0.167 +VDL,0.9,-0.04,18,5,-0.456 +VDL,0.9,-0.04,18,15,-0.694 +VDL,0.9,-0.04,18,25,-0.471 +VDL,0.9,-0.04,18,35,-0.04 +VDL,0.9,-0.04,25.2,-15,0.067 +VDL,0.9,-0.04,25.2,-5,-0.327 +VDL,0.9,-0.04,25.2,5,-0.684 +VDL,0.9,-0.04,25.2,15,-0.789 +VDL,0.9,-0.04,25.2,25,-0.635 +VDL,0.9,-0.04,25.2,35,-0.359 +VDL,0.9,-0.04,30,-15,-0.147 +VDL,0.9,-0.04,30,-5,-0.469 +VDL,0.9,-0.04,30,5,-0.764 +VDL,0.9,-0.04,30,15,-0.85 +VDL,0.9,-0.04,30,25,-0.723 +VDL,0.9,-0.04,30,35,-0.494 +VDL,0.9,-0.04,37.1,-15,-0.308 +VDL,0.9,-0.04,37.1,-5,-0.582 +VDL,0.9,-0.04,37.1,5,-0.83 +VDL,0.9,-0.04,37.1,15,-0.91 +VDL,0.9,-0.04,37.1,25,-0.809 +VDL,0.9,-0.04,37.1,35,-0.622 +VDL,0.9,-0.03,12.1,-15,2.48 +VDL,0.9,-0.03,12.1,-5,1.336 +VDL,0.9,-0.03,12.1,5,0.357 +VDL,0.9,-0.03,12.1,15,-0.034 +VDL,0.9,-0.03,12.1,25,0.301 +VDL,0.9,-0.03,12.1,35,0.963 +VDL,0.9,-0.03,18,-15,1.366 +VDL,0.9,-0.03,18,-5,0.647 +VDL,0.9,-0.03,18,5,0.024 +VDL,0.9,-0.03,18,15,-0.214 +VDL,0.9,-0.03,18,25,0.009 +VDL,0.9,-0.03,18,35,0.441 +VDL,0.9,-0.03,25.2,-15,0.56 +VDL,0.9,-0.03,25.2,-5,0.167 +VDL,0.9,-0.03,25.2,5,-0.19 +VDL,0.9,-0.03,25.2,15,-0.295 +VDL,0.9,-0.03,25.2,25,-0.141 +VDL,0.9,-0.03,25.2,35,0.135 +VDL,0.9,-0.03,30,-15,0.331 +VDL,0.9,-0.03,30,-5,0.008 +VDL,0.9,-0.03,30,5,-0.287 +VDL,0.9,-0.03,30,15,-0.373 +VDL,0.9,-0.03,30,25,-0.245 +VDL,0.9,-0.03,30,35,-0.016 +VDL,0.9,-0.03,37.1,-15,0.152 +VDL,0.9,-0.03,37.1,-5,-0.121 +VDL,0.9,-0.03,37.1,5,-0.37 +VDL,0.9,-0.03,37.1,15,-0.45 +VDL,0.9,-0.03,37.1,25,-0.348 +VDL,0.9,-0.03,37.1,35,-0.162 +VDL,0.9,-0.02,12.1,-15,2.949 +VDL,0.9,-0.02,12.1,-5,1.805 +VDL,0.9,-0.02,12.1,5,0.827 +VDL,0.9,-0.02,12.1,15,0.435 +VDL,0.9,-0.02,12.1,25,0.771 +VDL,0.9,-0.02,12.1,35,1.432 +VDL,0.9,-0.02,18,-15,1.846 +VDL,0.9,-0.02,18,-5,1.127 +VDL,0.9,-0.02,18,5,0.504 +VDL,0.9,-0.02,18,15,0.266 +VDL,0.9,-0.02,18,25,0.489 +VDL,0.9,-0.02,18,35,0.921 +VDL,0.9,-0.02,25.2,-15,1.055 +VDL,0.9,-0.02,25.2,-5,0.661 +VDL,0.9,-0.02,25.2,5,0.304 +VDL,0.9,-0.02,25.2,15,0.199 +VDL,0.9,-0.02,25.2,25,0.353 +VDL,0.9,-0.02,25.2,35,0.63 +VDL,0.9,-0.02,30,-15,0.809 +VDL,0.9,-0.02,30,-5,0.486 +VDL,0.9,-0.02,30,5,0.191 +VDL,0.9,-0.02,30,15,0.105 +VDL,0.9,-0.02,30,25,0.233 +VDL,0.9,-0.02,30,35,0.462 +VDL,0.9,-0.02,37.1,-15,0.613 +VDL,0.9,-0.02,37.1,-5,0.34 +VDL,0.9,-0.02,37.1,5,0.091 +VDL,0.9,-0.02,37.1,15,0.011 +VDL,0.9,-0.02,37.1,25,0.113 +VDL,0.9,-0.02,37.1,35,0.299 +VDL,0.9,-0.01,12.1,-15,3.431 +VDL,0.9,-0.01,12.1,-5,2.286 +VDL,0.9,-0.01,12.1,5,1.307 +VDL,0.9,-0.01,12.1,15,0.915 +VDL,0.9,-0.01,12.1,25,1.251 +VDL,0.9,-0.01,12.1,35,1.911 +VDL,0.9,-0.01,18,-15,2.356 +VDL,0.9,-0.01,18,-5,1.636 +VDL,0.9,-0.01,18,5,1.013 +VDL,0.9,-0.01,18,15,0.773 +VDL,0.9,-0.01,18,25,0.995 +VDL,0.9,-0.01,18,35,1.426 +VDL,0.9,-0.01,25.2,-15,1.582 +VDL,0.9,-0.01,25.2,-5,1.187 +VDL,0.9,-0.01,25.2,5,0.829 +VDL,0.9,-0.01,25.2,15,0.723 +VDL,0.9,-0.01,25.2,25,0.876 +VDL,0.9,-0.01,25.2,35,1.152 +VDL,0.9,-0.01,30,-15,1.343 +VDL,0.9,-0.01,30,-5,1.019 +VDL,0.9,-0.01,30,5,0.722 +VDL,0.9,-0.01,30,15,0.634 +VDL,0.9,-0.01,30,25,0.76 +VDL,0.9,-0.01,30,35,0.987 +VDL,0.9,-0.01,37.1,-15,1.158 +VDL,0.9,-0.01,37.1,-5,0.881 +VDL,0.9,-0.01,37.1,5,0.63 +VDL,0.9,-0.01,37.1,15,0.547 +VDL,0.9,-0.01,37.1,25,0.646 +VDL,0.9,-0.01,37.1,35,0.83 +VDL,0.9,0,12.1,-15,3.979 +VDL,0.9,0,12.1,-5,2.834 +VDL,0.9,0,12.1,5,1.855 +VDL,0.9,0,12.1,15,1.463 +VDL,0.9,0,12.1,25,1.798 +VDL,0.9,0,12.1,35,2.459 +VDL,0.9,0,18,-15,2.921 +VDL,0.9,0,18,-5,2.201 +VDL,0.9,0,18,5,1.577 +VDL,0.9,0,18,15,1.338 +VDL,0.9,0,18,25,1.56 +VDL,0.9,0,18,35,1.991 +VDL,0.9,0,25.2,-15,2.151 +VDL,0.9,0,25.2,-5,1.756 +VDL,0.9,0,25.2,5,1.398 +VDL,0.9,0,25.2,15,1.292 +VDL,0.9,0,25.2,25,1.445 +VDL,0.9,0,25.2,35,1.721 +VDL,0.9,0,30,-15,1.927 +VDL,0.9,0,30,-5,1.603 +VDL,0.9,0,30,5,1.306 +VDL,0.9,0,30,15,1.218 +VDL,0.9,0,30,25,1.344 +VDL,0.9,0,30,35,1.571 +VDL,0.9,0,37.1,-15,1.758 +VDL,0.9,0,37.1,-5,1.481 +VDL,0.9,0,37.1,5,1.23 +VDL,0.9,0,37.1,15,1.147 +VDL,0.9,0,37.1,25,1.246 +VDL,0.9,0,37.1,35,1.43 +VDL,0.9,0.01,12.1,-15,4.528 +VDL,0.9,0.01,12.1,-5,3.383 +VDL,0.9,0.01,12.1,5,2.404 +VDL,0.9,0.01,12.1,15,2.012 +VDL,0.9,0.01,12.1,25,2.347 +VDL,0.9,0.01,12.1,35,3.008 +VDL,0.9,0.01,18,-15,3.486 +VDL,0.9,0.01,18,-5,2.766 +VDL,0.9,0.01,18,5,2.143 +VDL,0.9,0.01,18,15,1.903 +VDL,0.9,0.01,18,25,2.125 +VDL,0.9,0.01,18,35,2.556 +VDL,0.9,0.01,25.2,-15,2.721 +VDL,0.9,0.01,25.2,-5,2.326 +VDL,0.9,0.01,25.2,5,1.968 +VDL,0.9,0.01,25.2,15,1.862 +VDL,0.9,0.01,25.2,25,2.015 +VDL,0.9,0.01,25.2,35,2.29 +VDL,0.9,0.01,30,-15,2.512 +VDL,0.9,0.01,30,-5,2.187 +VDL,0.9,0.01,30,5,1.891 +VDL,0.9,0.01,30,15,1.803 +VDL,0.9,0.01,30,25,1.928 +VDL,0.9,0.01,30,35,2.156 +VDL,0.9,0.01,37.1,-15,2.358 +VDL,0.9,0.01,37.1,-5,2.082 +VDL,0.9,0.01,37.1,5,1.83 +VDL,0.9,0.01,37.1,15,1.747 +VDL,0.9,0.01,37.1,25,1.847 +VDL,0.9,0.01,37.1,35,2.031 +VDL,0.9,0.02,12.1,-15,5.076 +VDL,0.9,0.02,12.1,-5,3.932 +VDL,0.9,0.02,12.1,5,2.953 +VDL,0.9,0.02,12.1,15,2.561 +VDL,0.9,0.02,12.1,25,2.896 +VDL,0.9,0.02,12.1,35,3.557 +VDL,0.9,0.02,18,-15,4.052 +VDL,0.9,0.02,18,-5,3.332 +VDL,0.9,0.02,18,5,2.708 +VDL,0.9,0.02,18,15,2.468 +VDL,0.9,0.02,18,25,2.691 +VDL,0.9,0.02,18,35,3.121 +VDL,0.9,0.02,25.2,-15,3.291 +VDL,0.9,0.02,25.2,-5,2.896 +VDL,0.9,0.02,25.2,5,2.538 +VDL,0.9,0.02,25.2,15,2.432 +VDL,0.9,0.02,25.2,25,2.584 +VDL,0.9,0.02,25.2,35,2.86 +VDL,0.9,0.02,30,-15,3.096 +VDL,0.9,0.02,30,-5,2.772 +VDL,0.9,0.02,30,5,2.475 +VDL,0.9,0.02,30,15,2.387 +VDL,0.9,0.02,30,25,2.513 +VDL,0.9,0.02,30,35,2.74 +VDL,0.9,0.02,37.1,-15,2.959 +VDL,0.9,0.02,37.1,-5,2.683 +VDL,0.9,0.02,37.1,5,2.431 +VDL,0.9,0.02,37.1,15,2.348 +VDL,0.9,0.02,37.1,25,2.447 +VDL,0.9,0.02,37.1,35,2.631 +VDL,0.9,0.03,12.1,-15,5.625 +VDL,0.9,0.03,12.1,-5,4.48 +VDL,0.9,0.03,12.1,5,3.501 +VDL,0.9,0.03,12.1,15,3.109 +VDL,0.9,0.03,12.1,25,3.444 +VDL,0.9,0.03,12.1,35,4.105 +VDL,0.9,0.03,18,-15,4.617 +VDL,0.9,0.03,18,-5,3.897 +VDL,0.9,0.03,18,5,3.273 +VDL,0.9,0.03,18,15,3.034 +VDL,0.9,0.03,18,25,3.256 +VDL,0.9,0.03,18,35,3.687 +VDL,0.9,0.03,25.2,-15,3.861 +VDL,0.9,0.03,25.2,-5,3.466 +VDL,0.9,0.03,25.2,5,3.108 +VDL,0.9,0.03,25.2,15,3.002 +VDL,0.9,0.03,25.2,25,3.155 +VDL,0.9,0.03,25.2,35,3.431 +VDL,0.9,0.03,30,-15,3.682 +VDL,0.9,0.03,30,-5,3.357 +VDL,0.9,0.03,30,5,3.06 +VDL,0.9,0.03,30,15,2.972 +VDL,0.9,0.03,30,25,3.098 +VDL,0.9,0.03,30,35,3.325 +VDL,0.9,0.03,37.1,-15,3.56 +VDL,0.9,0.03,37.1,-5,3.283 +VDL,0.9,0.03,37.1,5,3.032 +VDL,0.9,0.03,37.1,15,2.949 +VDL,0.9,0.03,37.1,25,3.048 +VDL,0.9,0.03,37.1,35,3.232 +VDL,0.9,0.04,12.1,-15,6.173 +VDL,0.9,0.04,12.1,-5,5.029 +VDL,0.9,0.04,12.1,5,4.05 +VDL,0.9,0.04,12.1,15,3.658 +VDL,0.9,0.04,12.1,25,3.993 +VDL,0.9,0.04,12.1,35,4.654 +VDL,0.9,0.04,18,-15,5.182 +VDL,0.9,0.04,18,-5,4.462 +VDL,0.9,0.04,18,5,3.839 +VDL,0.9,0.04,18,15,3.599 +VDL,0.9,0.04,18,25,3.821 +VDL,0.9,0.04,18,35,4.252 +VDL,0.9,0.04,25.2,-15,4.432 +VDL,0.9,0.04,25.2,-5,4.037 +VDL,0.9,0.04,25.2,5,3.679 +VDL,0.9,0.04,25.2,15,3.573 +VDL,0.9,0.04,25.2,25,3.725 +VDL,0.9,0.04,25.2,35,4.001 +VDL,0.9,0.04,30,-15,4.267 +VDL,0.9,0.04,30,-5,3.942 +VDL,0.9,0.04,30,5,3.645 +VDL,0.9,0.04,30,15,3.557 +VDL,0.9,0.04,30,25,3.683 +VDL,0.9,0.04,30,35,3.91 +VDL,0.9,0.04,37.1,-15,4.16 +VDL,0.9,0.04,37.1,-5,3.884 +VDL,0.9,0.04,37.1,5,3.632 +VDL,0.9,0.04,37.1,15,3.549 +VDL,0.9,0.04,37.1,25,3.649 +VDL,0.9,0.04,37.1,35,3.833 CKB,0,-0.04,12.1,-15,3.752 CKB,0,-0.04,12.1,-5,2.322 CKB,0,-0.04,12.1,5,1.069 From fdc813c4fa298c8d835b6c487ff410d1352603aa Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 14 Nov 2022 16:27:10 +0100 Subject: [PATCH 308/802] include encoding in open csv file --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 3be33792..a5e9dc73 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -70,7 +70,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): if station_path is not None: try: - with open(str(station_path), "r") as f: + with open(str(station_path), "r", encoding='utf-8') as f: delim = util.get_csv_delim(station_path) reader = csv.DictReader(f, delimiter=delim) station_data = dict() @@ -88,7 +88,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): format(station_path), stacklevel=100) - with open(path_to_csv, 'r') as trips_file: + with open(path_to_csv, 'r', encoding='utf-8') as trips_file: trip_reader = csv.DictReader(trips_file) for trip in trip_reader: rotation_id = trip['rotation_id'] From d61469a71f05efc060981819521143dd44a16168 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 14 Nov 2022 17:18:08 +0100 Subject: [PATCH 309/802] enlarge pv example --- data/examples/electrified_stations.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index c1af97a0..3c0d2b3f 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -8,12 +8,19 @@ "start_time": "2018-01-01T00:00:00+02:00", "step_duration_s": 3600, "column": "Feed-in Total (kW)", - "factor": 1 + "factor": 10 } }, "Station-3": { "type": "opps", - "n_charging_stations": 3 + "n_charging_stations": 3, + "energy_feed_in": { + "csv_file": "example_pv_feedin.csv", + "start_time": "2018-01-01T00:00:00+02:00", + "step_duration_s": 3600, + "column": "Feed-in Total (kW)", + "factor": 2 + } }, "Station-10": { "type": "opps", From 08eee2c8de04c6e12cdaf570a161e633869cbbfd Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 15 Nov 2022 10:38:31 +0100 Subject: [PATCH 310/802] fix trip type check --- ebus_toolbox/rotation.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index 1cf1e23f..d07991f8 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -56,13 +56,15 @@ def add_trip(self, trip): self.arrival_name = new_trip.arrival_name # set charging type if given - if ('charging_type' in trip and trip['charging_type'] in ['depb', 'oppb']): - assert (self.charging_type is None or self.charging_type == trip['charging_type']),\ + charging_type = trip.get('charging_type') + if charging_type in ['depb', 'oppb']: + assert self.charging_type is None or self.charging_type == charging_type,\ f"Two trips of rotation {self.id} have distinct charging types" - assert (f'{self.vehicle_type}_{trip["charging_type"]}' in self.schedule.vehicle_types),\ - f"The required vehicle type {self.vehicle_type}({trip['charging_type']}) is not " - "given in the vehicle_types.json file." - self.set_charging_type(trip['charging_type']) + assert self.schedule.vehicle_types.get( + self.vehicle_type, {}).get(charging_type) is not None,\ + (f"The required vehicle type {self.vehicle_type}({charging_type}) " + "is not given in the vehicle_types.json file.") + self.set_charging_type(charging_type) self.trips.append(new_trip) From def47da4ceeafccc79214bdf9be59f1298013551 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 15 Nov 2022 10:39:00 +0100 Subject: [PATCH 311/802] added missing space in warning --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a5e9dc73..5e05b3e1 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -83,8 +83,8 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): format(station_path), stacklevel=100) except ValueError: - warnings.warn("Warning: external csv file '{}' does not contain numeric" - "values in the column 'elevation'. Station data is discarded". + warnings.warn("Warning: external csv file '{}' does not contain numeric " + "values in the column 'elevation'. Station data is discarded.". format(station_path), stacklevel=100) From f30093e664d92a2c243f0e344b948a1a36db9c3e Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 15 Nov 2022 10:39:37 +0100 Subject: [PATCH 312/802] re-added consumption calculation for simulation --- ebus_toolbox/simulate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 00c6de75..f536ab44 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -58,6 +58,7 @@ def simulate(args): vehicle_types, stations, **vars(args)) + schedule.calculate_consumption() # run the mode specified in config if args.mode == 'service_optimization': From 40a326d7e03dc6ea8c5a29ddfa6e10b282e46681 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 13:22:45 +0100 Subject: [PATCH 313/802] Add temp and lol reading, empty row catching and paths to config --- data/examples/default_temp_summer.csv | 2 +- data/examples/ebus_toolbox.cfg | 6 ++ data/examples/trips_example.csv | 130 +++++++++++++------------- ebus_toolbox/__main__.py | 15 ++- ebus_toolbox/consumption.py | 7 +- ebus_toolbox/trip.py | 9 +- 6 files changed, 96 insertions(+), 73 deletions(-) diff --git a/data/examples/default_temp_summer.csv b/data/examples/default_temp_summer.csv index 9296654d..3cffcdf6 100644 --- a/data/examples/default_temp_summer.csv +++ b/data/examples/default_temp_summer.csv @@ -1,4 +1,4 @@ -Time,Temperature in C +hour,temperature 00:00:00,23.8 01:00:00,23.8 02:00:00,22.7 diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 671e2cca..75de69d7 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -20,6 +20,12 @@ cost_params = "./data/examples/cost_params.json" # Path to station data with stations heights and possibly more information station_data_path = "data/examples/all_stations.csv" +# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours +outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" + +# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours +level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" + ##### SIMULATION HYPERPARAMETERS ##### # set random seed (for always random: set seed = null) diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index eb338e34..59889b17 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB \ No newline at end of file +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,level_of_loading,temperature +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,, +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,, +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,, +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,, +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,, +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,, +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,, +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,, +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,, +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,, +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,, +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,, \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 29772a85..760db57c 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -101,9 +101,20 @@ nargs=2, action='append', help='Append additional options to the charging strategy.') parser.add_argument('--config', help='Use config file to set arguments') - parser.add_argument('--station_data_path', help='Use station data to back calculation \ - of consumption with height information of \ + parser.add_argument('--station_data_path', help='Use station data to back calculation \ + of consumption with height information of \ stations') + parser.add_argument('--outside_temperature_over_day_path', help="Use csv. data with 'hour' and \ + 'temperature' columns to set \ + temperatures in case they are not \ + in trips.csv") + + parser.add_argument('--level_of_loading_over_day_path', help="Use csv. data with 'hour' and \ + 'level_of_loading' columns to set \ + level of loading in case they are \ + not in trips.csv") + + args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index ca112000..84a5b730 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -7,8 +7,8 @@ class Consumption: def __init__(self, vehicle_types, **kwargs) -> None: # load temperature of the day, now dummy winter day self.temperatures_by_hour = {} - temperature_file_path = kwargs.get("outside_temperatures", - "data/examples/default_temp_winter.csv") + + temperature_file_path = kwargs.get("outside_temperatures") # parsing the Temperature to a dict with open(temperature_file_path) as f: delim = util.get_csv_delim(temperature_file_path) @@ -16,8 +16,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: for row in reader: self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) - lol_file_path = kwargs.get("level_of_loading_over_day", - "data/examples/default_level_of_loading_over_day.csv") + lol_file_path = kwargs.get("level_of_loading_over_day") # parsing the level of loading to a dict with open(lol_file_path) as f: delim = util.get_csv_delim(lol_file_path) diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 67719828..5cc0ffb3 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -11,6 +11,9 @@ def __init__(self, rotation, departure_time, departure_name, self.distance = float(distance) self.line = kwargs.get('line', None) self.temperature = kwargs.get('temperature', None) + # In case of empty temperature column + if self.temperature == '': + self.temperature = None height_diff = kwargs.get("height_difference", None) if height_diff is None: station_data = kwargs.get("station_data", dict()) @@ -20,7 +23,11 @@ def __init__(self, rotation, departure_time, departure_name, except KeyError or TypeError: height_diff = 0 self.height_diff = height_diff - self.level_of_loading = None + self.level_of_loading = kwargs.get('level_of_loading', None) + # In case of empty temperature column + if self.level_of_loading == '': + self.level_of_loading = None + # mean speed in km/h from distance and travel time or from initialization # travel time is at least 1 min mean_speed = kwargs.get("mean_speed", (self.distance / 1000) / From ecaf24013a318fe93886da78106be2455039d34a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 14:16:49 +0100 Subject: [PATCH 314/802] Cast inputs to float and make example trips, clip lol to (0,1) --- data/examples/trips_example.csv | 128 ++++++++++++++++---------------- ebus_toolbox/simulate.py | 4 +- ebus_toolbox/trip.py | 14 +++- 3 files changed, 78 insertions(+), 68 deletions(-) diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 59889b17..152b5cd5 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,level_of_loading,temperature -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,, -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,, -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,, -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,, -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,, -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,, -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,, -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,, -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,, -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,, -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,, -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,, -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,, \ No newline at end of file +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,0,-40 +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,0,-40 +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,0,-40 +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,0,-40 +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,0,-40 +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,0,-40 +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,0,-40 +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,0,-40 +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,1,-40 +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,0, +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,0, +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,0, +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,0, +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,0, +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,0, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,0, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,,99 +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,0, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,0, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,0, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,0, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,0, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,0, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,0, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,0, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,0, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,0, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,0, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,0, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,0, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,0, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,0, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,0, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,0, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,0, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,0, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,0, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,0, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,0, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,0, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,0, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,0, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,0, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,0, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,0, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,0, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,0, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,0, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,0, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,0, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,0, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,0, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,0, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,0, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,0, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,0, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,0, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,0, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,0, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,0, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,0, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,0, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,0, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,0, \ No newline at end of file diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f536ab44..5776ef52 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -52,7 +52,9 @@ def simulate(args): setattr(args, opt_key, opt_val) # setup consumption calculator that can be accessed by all trips - Trip.consumption = Consumption(vehicle_types) + Trip.consumption = Consumption(vehicle_types, + outside_temperatures=args.outside_temperature_over_day_path, + level_of_loading_over_day=args.level_of_loading_over_day_path) schedule = Schedule.from_csv(args.input_schedule, vehicle_types, diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 5cc0ffb3..3c44538f 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -12,8 +12,12 @@ def __init__(self, rotation, departure_time, departure_name, self.line = kwargs.get('line', None) self.temperature = kwargs.get('temperature', None) # In case of empty temperature column - if self.temperature == '': + try: + self.temperature = float(self.temperature) + # In Case of None or empty string + except ValueError: self.temperature = None + height_diff = kwargs.get("height_difference", None) if height_diff is None: station_data = kwargs.get("station_data", dict()) @@ -24,10 +28,14 @@ def __init__(self, rotation, departure_time, departure_name, height_diff = 0 self.height_diff = height_diff self.level_of_loading = kwargs.get('level_of_loading', None) - # In case of empty temperature column - if self.level_of_loading == '': + try: + # Clip level of loading to [0,1] + self.level_of_loading = max(0, min(float(self.level_of_loading), 1)) + # In Case of None or empty string + except ValueError: self.level_of_loading = None + # mean speed in km/h from distance and travel time or from initialization # travel time is at least 1 min mean_speed = kwargs.get("mean_speed", (self.distance / 1000) / From b4775be8497dd19bf07f05888003bb419010ab21 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 14:18:28 +0100 Subject: [PATCH 315/802] Make flake8 happy --- ebus_toolbox/__main__.py | 2 -- ebus_toolbox/trip.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 760db57c..6021f3da 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -114,8 +114,6 @@ level of loading in case they are \ not in trips.csv") - - args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 3c44538f..832c8ba3 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -34,8 +34,6 @@ def __init__(self, rotation, departure_time, departure_name, # In Case of None or empty string except ValueError: self.level_of_loading = None - - # mean speed in km/h from distance and travel time or from initialization # travel time is at least 1 min mean_speed = kwargs.get("mean_speed", (self.distance / 1000) / From c01f3815d963778f553617763e81c219f6faef58 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 14:47:05 +0100 Subject: [PATCH 316/802] Add test inputs and fix tests --- data/examples/trips_example.csv | 130 +++++++++--------- ebus_toolbox/trip.py | 4 +- tests/helpers.py | 6 +- .../default_level_of_loading_over_day.csv | 25 ++++ .../test_input_files/default_temp_winter.csv | 25 ++++ 5 files changed, 122 insertions(+), 68 deletions(-) create mode 100644 tests/test_input_files/default_level_of_loading_over_day.csv create mode 100644 tests/test_input_files/default_temp_winter.csv diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 152b5cd5..f387a625 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,level_of_loading,temperature -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,0,-40 -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,0,-40 -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,0,-40 -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,0,-40 -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,0,-40 -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,0,-40 -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,0,-40 -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,0,-40 -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,1,-40 -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,0, -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,0, -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,0, -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,0, -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,0, -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,0, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,0, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,,99 -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,0, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,0, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,0, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,0, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,0, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,0, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,0, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,0, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,0, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,0, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,0, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,0, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,0, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,0, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,0, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,0, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,0, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,0, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,0, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,0, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,0, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,0, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,0, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,0, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,0, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,0, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,0, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,0, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,0, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,0, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,0, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,0, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,0, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,0, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,0, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,0, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,0, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,0, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,0, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,0, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,0, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,0, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,0, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,0, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,0, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,0, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,0, \ No newline at end of file +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB \ No newline at end of file diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 832c8ba3..da4ee98f 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -15,7 +15,7 @@ def __init__(self, rotation, departure_time, departure_name, try: self.temperature = float(self.temperature) # In Case of None or empty string - except ValueError: + except TypeError or ValueError: self.temperature = None height_diff = kwargs.get("height_difference", None) @@ -32,7 +32,7 @@ def __init__(self, rotation, departure_time, departure_name, # Clip level of loading to [0,1] self.level_of_loading = max(0, min(float(self.level_of_loading), 1)) # In Case of None or empty string - except ValueError: + except TypeError or ValueError: self.level_of_loading = None # mean speed in km/h from distance and travel time or from initialization # travel time is at least 1 min diff --git a/tests/helpers.py b/tests/helpers.py index 45be5b35..b5107280 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -7,9 +7,13 @@ def generate_basic_schedule(): schedule_path = 'tests/test_input_files/trips.csv' station_path = 'tests/test_input_files/electrified_stations.json' + temperature_path = 'tests/test_input_files/default_temp_winter.csv' + lol_path = 'tests/test_input_files/default_level_of_loading_over_day.csv' with open("tests/test_input_files/vehicle_types.json", 'r') as f: vehicle_types = json.load(f) - trip.Trip.consumption = consumption.Consumption(vehicle_types) + trip.Trip.consumption = consumption.Consumption(vehicle_types, + outside_temperatures=temperature_path, + level_of_loading_over_day=lol_path) mandatory_args = { "min_recharge_deps_oppb": 0, diff --git a/tests/test_input_files/default_level_of_loading_over_day.csv b/tests/test_input_files/default_level_of_loading_over_day.csv new file mode 100644 index 00000000..00fd62d9 --- /dev/null +++ b/tests/test_input_files/default_level_of_loading_over_day.csv @@ -0,0 +1,25 @@ +hour,level_of_loading +0,0.5 +1,0.5 +2,0.5 +3,0.5 +4,0.5 +5,0.5 +6,0.5 +7,0.5 +8,0.5 +9,0.5 +10,0.5 +11,0.5 +12,0.5 +13,0.5 +14,0.5 +15,0.5 +16,0.5 +17,0.5 +18,0.5 +19,0.5 +20,0.5 +21,0.5 +22,0.5 +23,0.5 diff --git a/tests/test_input_files/default_temp_winter.csv b/tests/test_input_files/default_temp_winter.csv new file mode 100644 index 00000000..67ea0d6d --- /dev/null +++ b/tests/test_input_files/default_temp_winter.csv @@ -0,0 +1,25 @@ +hour,temperature +00,-1.1 +01,-1.1 +02,-2.2 +03,-2.7 +04,-2.7 +05,-2.7 +06,-2.7 +07,-3.8 +08,-3.8 +09,-3.8 +10,-3.8 +11,-2.7 +12,-1.1 +13,1.1 +14,2.2 +15,2.2 +16,1.1 +17,0 +18,0 +19,-1.1 +20,-1.1 +21,-1.1 +22,-1.1 +23,-1.1 From 12d4136c8192faf653f4d1ae0c39fdfe0951b186 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 14:48:55 +0100 Subject: [PATCH 317/802] Fix hours to int --- data/examples/default_temp_summer.csv | 48 +++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/data/examples/default_temp_summer.csv b/data/examples/default_temp_summer.csv index 3cffcdf6..c5fda4bd 100644 --- a/data/examples/default_temp_summer.csv +++ b/data/examples/default_temp_summer.csv @@ -1,25 +1,25 @@ hour,temperature -00:00:00,23.8 -01:00:00,23.8 -02:00:00,22.7 -03:00:00,22.2 -04:00:00,21.1 -05:00:00,20 -06:00:00,20 -07:00:00,21.1 -08:00:00,22.7 -09:00:00,25 -10:00:00,28.8 -11:00:00,31.1 -12:00:00,32.7 -13:00:00,33.8 -14:00:00,36.1 -15:00:00,36.1 -16:00:00,36.1 -17:00:00,33.8 -18:00:00,32.2 -19:00:00,32.2 -20:00:00,27.2 -21:00:00,25 -22:00:00,23.8 -23:00:00,25 +0,23.8 +1,23.8 +2,22.7 +3,22.2 +4,21.1 +5,20 +6,20 +7,21.1 +8,22.7 +9,25 +10,28.8 +11,31.1 +12,32.7 +13,33.8 +14,36.1 +15,36.1 +16,36.1 +17,33.8 +18,32.2 +19,32.2 +20,27.2 +21,25 +22,23.8 +23,25 From f498cff3eeadec202dcda89ada7adfae2a026a59 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 14:55:20 +0100 Subject: [PATCH 318/802] Clean up differences --- data/examples/trips_example.csv | 2 +- ebus_toolbox/__main__.py | 4 ++-- ebus_toolbox/trip.py | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index f387a625..eb338e34 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -9,7 +9,7 @@ LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 6021f3da..6bda89d3 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -101,8 +101,8 @@ nargs=2, action='append', help='Append additional options to the charging strategy.') parser.add_argument('--config', help='Use config file to set arguments') - parser.add_argument('--station_data_path', help='Use station data to back calculation \ - of consumption with height information of \ + parser.add_argument('--station_data_path', help='Use station data to back calculation \ + of consumption with height information of \ stations') parser.add_argument('--outside_temperature_over_day_path', help="Use csv. data with 'hour' and \ 'temperature' columns to set \ diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index da4ee98f..639735c0 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -11,10 +11,9 @@ def __init__(self, rotation, departure_time, departure_name, self.distance = float(distance) self.line = kwargs.get('line', None) self.temperature = kwargs.get('temperature', None) - # In case of empty temperature column try: self.temperature = float(self.temperature) - # In Case of None or empty string + # In case of empty temperature column or no column at all except TypeError or ValueError: self.temperature = None @@ -31,7 +30,7 @@ def __init__(self, rotation, departure_time, departure_name, try: # Clip level of loading to [0,1] self.level_of_loading = max(0, min(float(self.level_of_loading), 1)) - # In Case of None or empty string + # In case of empty temperature column or no column at all except TypeError or ValueError: self.level_of_loading = None # mean speed in km/h from distance and travel time or from initialization From 203d09ae502b4929f485bcb171976af04805ee88 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 15:01:47 +0100 Subject: [PATCH 319/802] Fix except clauses with brackets --- data/examples/trips_example.csv | 130 ++++++++++++++++---------------- ebus_toolbox/trip.py | 6 +- 2 files changed, 68 insertions(+), 68 deletions(-) diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index eb338e34..22bb5902 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB \ No newline at end of file +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,20,0 +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,-5,0.9 +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,, +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,, +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,, +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,, +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,, +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,, +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,, +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,, +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,, +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,, \ No newline at end of file diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 639735c0..da9fe205 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -14,7 +14,7 @@ def __init__(self, rotation, departure_time, departure_name, try: self.temperature = float(self.temperature) # In case of empty temperature column or no column at all - except TypeError or ValueError: + except (TypeError, ValueError): self.temperature = None height_diff = kwargs.get("height_difference", None) @@ -23,7 +23,7 @@ def __init__(self, rotation, departure_time, departure_name, try: height_diff = station_data[self.arrival_name]["elevation"] \ - station_data[self.departure_name]["elevation"] - except KeyError or TypeError: + except (KeyError, TypeError): height_diff = 0 self.height_diff = height_diff self.level_of_loading = kwargs.get('level_of_loading', None) @@ -31,7 +31,7 @@ def __init__(self, rotation, departure_time, departure_name, # Clip level of loading to [0,1] self.level_of_loading = max(0, min(float(self.level_of_loading), 1)) # In case of empty temperature column or no column at all - except TypeError or ValueError: + except (TypeError, ValueError): self.level_of_loading = None # mean speed in km/h from distance and travel time or from initialization # travel time is at least 1 min From bd09e1250e4543a917c222d86b9b9c93e93756f0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 15:34:16 +0100 Subject: [PATCH 320/802] Add copy paste of input files and git hash --- ebus_toolbox/__main__.py | 9 +++++++++ ebus_toolbox/util.py | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 29772a85..eefb2440 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,4 +1,5 @@ import argparse +import shutil from ebus_toolbox import simulate, util from pathlib import Path from datetime import datetime @@ -128,6 +129,13 @@ if not args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" + # Copy input files to output to ensure reproducibility + copy_list=[args.config, args.cost_params, args.electrified_stations, args.vehicle_types] + for c_file in copy_list: + shutil.copy(str(c_file), str(args.output_directory / Path(c_file).name)) + + + # rename special options args.timing = args.eta @@ -135,3 +143,4 @@ raise SystemExit("The following argument is required: input_schedule") simulate.simulate(args) + diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 5ac186ac..516fbbe0 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,6 +1,11 @@ import json import warnings +import subprocess +def get_git_revision_hash() -> str: + return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() + +print(get_git_revision_hash()) def set_options_from_config(args, check=False, verbose=True): """Read options from config file, update given args, try to parse options From 44c8922552de4099f4387d6ed493bdeb38854fca Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 15:46:09 +0100 Subject: [PATCH 321/802] Make flake8 happy --- ebus_toolbox/__main__.py | 5 ++--- ebus_toolbox/util.py | 7 ++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index eefb2440..effea50e 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -130,11 +130,11 @@ args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" # Copy input files to output to ensure reproducibility - copy_list=[args.config, args.cost_params, args.electrified_stations, args.vehicle_types] + copy_list = [args.config, args.cost_params, args.electrified_stations, args.vehicle_types] for c_file in copy_list: shutil.copy(str(c_file), str(args.output_directory / Path(c_file).name)) - + util.save_version(Path(args.output_directory / "program_version.txt")) # rename special options args.timing = args.eta @@ -143,4 +143,3 @@ raise SystemExit("The following argument is required: input_schedule") simulate.simulate(args) - diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 516fbbe0..3741874a 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -2,10 +2,15 @@ import warnings import subprocess + def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() -print(get_git_revision_hash()) + +def save_version(file_path): + with open(file_path, "w") as f: + f.write("Git Hash eBus-Toolbox:" + get_git_revision_hash()) + def set_options_from_config(args, check=False, verbose=True): """Read options from config file, update given args, try to parse options From d2069737c36c3e50a192bddf0f5df534491aee81 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 16 Nov 2022 15:49:21 +0100 Subject: [PATCH 322/802] Make cost params optional for copying --- ebus_toolbox/__main__.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index effea50e..c983e524 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -116,9 +116,9 @@ args.output_directory = Path(args.output_directory) / \ str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") - # Create subfolder for specific sim results with timestamp. - # If folder doesnt exists, create folder. - # Needs to happen after set_options_from_config since + # create subfolder for specific sim results with timestamp. + # if folder doesnt exists, create folder. + # needs to happen after set_options_from_config since # args.output_directory can be overwritten by config args.output_directory.mkdir(parents=True, exist_ok=True) @@ -129,8 +129,12 @@ if not args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - # Copy input files to output to ensure reproducibility - copy_list = [args.config, args.cost_params, args.electrified_stations, args.vehicle_types] + # copy input files to output to ensure reproducibility + copy_list = [args.config, args.electrified_stations, args.vehicle_types] + + # only copy cost params if they exist + if args.cost_params is not None: + copy_list.append(args.cost_params) for c_file in copy_list: shutil.copy(str(c_file), str(args.output_directory / Path(c_file).name)) From 83ab822d6eb9efd7e4dedd7dac9482492aeda7c7 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Thu, 17 Nov 2022 17:39:22 +0100 Subject: [PATCH 323/802] Moved voltage_level to electrified_stations - minor changes in costs.py and report.py - pv_power in cfg set to 0 - added voltage level to gc --- data/examples/ebus_toolbox.cfg | 6 ++--- data/examples/electrified_stations.json | 33 ++++++++++++++++--------- ebus_toolbox/costs.py | 33 ++++++++++++------------- ebus_toolbox/report.py | 2 +- ebus_toolbox/schedule.py | 5 ++-- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 3ff80289..b9d0fe4b 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -23,10 +23,8 @@ station_data_path = "data/examples/all_stations.csv" cost_calculation = true # cost parameters (Calculation of costs is optional, defaults to None) cost_params = "./data/examples/cost_params.json" -# set voltage level for cost calculation (possible voltage levels: LV, MV, HV) -voltage_level = MV -# set nominal power of photovoltaic power plant in kW (necessary for feed-in remuneration) -pv_power = 100 +# set nominal power of PV plant in kW (necessary for feed-in remuneration - set for all GCs) +pv_power = 0 ##### SIMULATION HYPERPARAMETERS ##### diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 182108fc..3514cd74 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -2,46 +2,57 @@ "Station-0": { "type": "deps", "n_charging_stations": null, - "distance_transformer": 150 + "distance_transformer": 150, + "voltage_level" : "MV" }, "Station-3": { "type": "opps", - "n_charging_stations": 3 + "n_charging_stations": 3, + "voltage_level" : "MV" }, "Station-10": { "type": "opps", - "n_charging_stations": 1 + "n_charging_stations": 1, + "voltage_level" : "MV" }, "Station-21": { "type": "opps", - "n_charging_stations": 2 + "n_charging_stations": 2, + "voltage_level" : "MV" }, "Station-22": { "type": "deps", - "n_charging_stations": null + "n_charging_stations": null, + "voltage_level" : "MV" }, "Station-26": { "type": "opps", - "n_charging_stations": 5 + "n_charging_stations": 5, + "voltage_level" : "MV" }, "Station-28": { "type": "opps", - "n_charging_stations": 4 + "n_charging_stations": 4, + "voltage_level" : "MV" }, "Station-30": { "type": "opps", - "n_charging_stations": 4 + "n_charging_stations": 4, + "voltage_level" : "MV" }, "Station-32": { "type": "opps", - "n_charging_stations": 3 + "n_charging_stations": 3, + "voltage_level" : "MV" }, "Station-39": { "type": "opps", - "n_charging_stations": 5 + "n_charging_stations": 5, + "voltage_level" : "MV" }, "Station-42": { "type": "deps", - "n_charging_stations": null + "n_charging_stations": null, + "voltage_level" : "MV" } } diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index a84797cf..1d7dbf3b 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,4 +1,6 @@ import os +import warnings + from calculate_costs import calculate_costs as calc_costs_spice_ev @@ -13,18 +15,16 @@ def calculate_costs(c_params, scenario, schedule, args): :type schedule: object :param args: Configuration arguments specified in config files contained in configs directory. :type args: argparse.Namespace - :return: scenario - :rtype: object """ # initialize dictionary with all costs - costs = {"c_vehicles": 0, "c_vehicles_annual": 0, "c_gcs": 0, "c_gcs_annual": 0, "c_cs": 0, - "c_cs_annual": 0, "c_garage_cs": 0, "c_garage_workstations": 0, "c_garage": 0, - "c_garage_annual": 0, "c_invest": 0, "c_invest_annual": 0, - "c_maint_infrastructure_annual": 0, "c_maint_vehicles_annual": 0, "c_maint_annual": 0, - "c_el_procurement_annual": 0, "c_el_power_price": 0, "c_el_energy_price_annual": 0, - "c_el_taxes_annual": 0, "c_el_feed_in_remuneration_annual": 0, - "c_electricity_annual": 0} + costs = {cost: 0 for cost in ["c_vehicles", "c_vehicles_annual", "c_gcs", "c_gcs_annual", + "c_cs", "c_cs_annual", "c_garage_cs", "c_garage_workstations", + "c_garage", "c_garage_annual", "c_invest", "c_invest_annual", + "c_maint_infrastructure_annual", "c_maint_vehicles_annual", + "c_maint_annual", "c_el_procurement_annual", "c_el_power_price", + "c_el_energy_price_annual", "c_el_taxes_annual", + "c_el_feed_in_remuneration_annual", "c_electricity_annual"]} # INVESTMENT COSTS # @@ -35,8 +35,8 @@ def calculate_costs(c_params, scenario, schedule, args): try: costs_vehicle = c_params["vehicles"][v_type]["capex"] except KeyError: - print("Warning: No capex defined for vehicle type " + v_type + - ". Unable to calculate investment costs for this vehicle type.") + warnings.warn("No capex defined for vehicle type " + v_type + + ". Unable to calculate investment costs for this vehicle type.") continue # sum up cost of vehicles and their batteries, depending on how often the battery # has to be replaced in the lifetime of the vehicles @@ -71,7 +71,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_cs"] += c_params["cs"]["capex_deps_per_kW"] * csID["max_power"] elif csID["type"] == "opps": costs["c_cs"] += c_params["cs"]["capex_opps_per_kW"] * csID["max_power"] - # Calculate annual cost of charging stations, depending on their lifetime + # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] # GARAGE @@ -97,9 +97,9 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_maint_vehicles_annual"] += (rot.distance / 1000 / drive_days * 365) * \ c_params["vehicles"][v_type_rot]["c_maint_per_km"] except KeyError: - print("Warning: No maintenance costs defined for vehicle type " + - c_params["vehicles"][v_type_rot] + - ". Unable to calculate maintenance costs for this vehicle type.") + warnings.warn("No maintenance costs defined for vehicle type " + + c_params["vehicles"][v_type_rot] + + ". Unable to calculate maintenance costs for this vehicle type.") costs["c_maint_annual"] = (costs["c_maint_infrastructure_annual"] + costs["c_maint_vehicles_annual"]) costs["c_invest"] = costs["c_vehicles"] + costs["c_cs"] + costs["c_gcs"] + costs["c_garage"] @@ -120,7 +120,7 @@ def calculate_costs(c_params, scenario, schedule, args): # calculate costs for electricity costs_electricity = calc_costs_spice_ev( strategy=args.strategy, - voltage_level=args.voltage_level, + voltage_level=gc.voltage_level, interval=scenario.interval, timestamps_list=timeseries.get("time"), power_grid_supply_list=timeseries.get("grid power [kW]"), @@ -153,4 +153,3 @@ def calculate_costs(c_params, scenario, schedule, args): f"Annual costs for electricity: {costs['c_electricity_annual']} €/a.") setattr(scenario, "costs", costs) - return {scenario} diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 884df19c..f34dd8a1 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -78,7 +78,7 @@ def generate(schedule, scenario, args): csv_writer.writerows(rotation_infos) # summary of used vehicle types and all costs - with open(args.output_directory / "costs_summary.csv", "w+", newline='') as f: + with open(args.output_directory / "costs_summary.csv", "w", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(["vehicle type", "number"]) for key, value in schedule.vehicle_type_counts.items(): diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 132b2cf7..2c74503e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -497,7 +497,8 @@ def generate_scenario(self, args): grid_connectors[gc_name] = { "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, - "number_cs": number_cs + "number_cs": number_cs, + "voltage_level": self.stations[gc_name]["voltage_level"] } # add feed-in name and power at grid connector if exists if args.include_feed_in_csv: @@ -691,7 +692,7 @@ def generate_scenario(self, args): "grid_connectors": grid_connectors, "charging_stations": charging_stations, "batteries": batteries, - "photovoltaics": photovoltaics + "photovoltaics": photovoltaics, }, "events": events } From 259f69ce838eda59dc1aa498b072f867323c7254 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Thu, 17 Nov 2022 17:43:02 +0100 Subject: [PATCH 324/802] Removed voltagel_level from argument list --- ebus_toolbox/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 4828b5e2..d5658aa5 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -76,7 +76,6 @@ parser.add_argument('--cost-calculation', '-cc', action='store_true', help='Calculate costs') parser.add_argument('--cost-parameters-file', help='include cost_params json', default=None) - parser.add_argument('--voltage-level', '-vl', help='choose voltage level for cost calculation') parser.add_argument('--pv-power', type=int, default=0, help='set nominal power for local ' 'photovoltaic power plant in kWp') parser.add_argument('--min-charging-time', help='define minimum time of charging', From 32f8d4a910549351838ff142c9716abb2a7732a0 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Fri, 18 Nov 2022 13:54:43 +0100 Subject: [PATCH 325/802] updated report and wording - added todos, that have to be adressed in #63 --- ebus_toolbox/costs.py | 19 ++++++++++++------- ebus_toolbox/report.py | 19 ++++++++++--------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 1d7dbf3b..c2f32fe6 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -22,9 +22,10 @@ def calculate_costs(c_params, scenario, schedule, args): "c_cs", "c_cs_annual", "c_garage_cs", "c_garage_workstations", "c_garage", "c_garage_annual", "c_invest", "c_invest_annual", "c_maint_infrastructure_annual", "c_maint_vehicles_annual", - "c_maint_annual", "c_el_procurement_annual", "c_el_power_price", - "c_el_energy_price_annual", "c_el_taxes_annual", - "c_el_feed_in_remuneration_annual", "c_electricity_annual"]} + "c_maint_annual", "c_el_procurement_annual", + "c_el_power_price_annual", "c_el_energy_price_annual", + "c_el_taxes_annual", "c_el_feed_in_remuneration_annual", + "c_el_annual"]} # INVESTMENT COSTS # @@ -113,10 +114,13 @@ def calculate_costs(c_params, scenario, schedule, args): if pv.parent == gcID]) timeseries = vars(scenario).get(f"{gcID}_timeseries") + # Todo: Decide, if costs are saved to json here or later in report.py. + # If so, the following three lines can be removed # add GC name to results file for cost calculation file_name, ext = os.path.splitext(args.save_results) save_results = f"{file_name}_{gcID}{ext}" + # Todo: Decide, if currently unnecessary params should be given to calc_costs_spice_ev # calculate costs for electricity costs_electricity = calc_costs_spice_ev( strategy=args.strategy, @@ -132,14 +136,15 @@ def calculate_costs(c_params, scenario, schedule, args): results_json=save_results, power_pv_nominal=pv, ) - print(f"Costs for electricity at {gcID}: {costs_electricity['total_costs_per_year']} €/a") + # ToDo: Decide if gc-specific costs should be added to scenario object to use in report.py + # setattr(scenario.constants.grid_connectors[gcID], "costs_electricity", costs_electricity) costs["c_el_procurement_annual"] += costs_electricity['power_procurement_per_year'] - costs["c_el_power_price"] += costs_electricity['capacity_costs_eur'] + costs["c_el_power_price_annual"] += costs_electricity['capacity_costs_eur'] costs["c_el_energy_price_annual"] += costs_electricity['commodity_costs_eur_per_year'] costs["c_el_taxes_annual"] += costs_electricity['levies_fees_and_taxes_per_year'] costs["c_el_feed_in_remuneration_annual"] += costs_electricity[ 'feed_in_remuneration_per_year'] - costs["c_electricity_annual"] += costs_electricity['total_costs_per_year'] + costs["c_el_annual"] += costs_electricity['total_costs_per_year'] # round all costs to ct for key, v in costs.items(): @@ -150,6 +155,6 @@ def calculate_costs(c_params, scenario, schedule, args): f"Investment cost: {costs['c_invest']} €. " f"Annual investment costs: {costs['c_invest_annual']} €/a. " f"Annual maintenance costs: {costs['c_maint_annual']} €/a. " - f"Annual costs for electricity: {costs['c_electricity_annual']} €/a.") + f"Annual costs for electricity: {costs['c_el_annual']} €/a.") setattr(scenario, "costs", costs) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index f34dd8a1..cacf041b 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -23,7 +23,7 @@ def generate(schedule, scenario, args): # get soc timeseries for current rotation vehicle_soc = scenario.vehicle_socs[vehicle_id] start_idx = (rotation.departure_time - sim_start_time) // interval - end_idx = start_idx + ((rotation.arrival_time-rotation.departure_time) // interval) + end_idx = start_idx + ((rotation.arrival_time - rotation.departure_time) // interval) if end_idx > scenario.n_intervals: # SpiceEV stopped before rotation was fully simulated incomplete_rotations.append(id) @@ -36,7 +36,7 @@ def generate(schedule, scenario, args): if soc is not None: break last_known_idx = len(rotation_soc_ts) - 1 - i - rotation_soc_ts[last_known_idx+1:] = i * [rotation_soc_ts[last_known_idx]] + rotation_soc_ts[last_known_idx + 1:] = i * [rotation_soc_ts[last_known_idx]] rotation_info = { "rotation_id": id, @@ -56,7 +56,7 @@ def generate(schedule, scenario, args): rotation_infos.append(rotation_info) # save SOCs for each rotation - rotation_socs[id] = [None]*scenario.n_intervals + rotation_socs[id] = [None] * scenario.n_intervals rotation_socs[id][start_idx:end_idx] = rotation_soc_ts if incomplete_rotations: @@ -78,13 +78,14 @@ def generate(schedule, scenario, args): csv_writer.writerows(rotation_infos) # summary of used vehicle types and all costs - with open(args.output_directory / "costs_summary.csv", "w", newline='') as f: + with open(args.output_directory / "summary_vehicles_costs.csv", "w", newline='') as f: csv_writer = csv.writer(f) - csv_writer.writerow(["vehicle type", "number"]) + csv_writer.writerow(["parameter", "value", "unit"]) for key, value in schedule.vehicle_type_counts.items(): if value > 0: - csv_writer.writerow([key, value]) - csv_writer.writerow(["", ""]) - csv_writer.writerow(["cost parameter", "€"]) + csv_writer.writerow([key, value, "vehicles"]) for key, value in scenario.costs.items(): - csv_writer.writerow([key, round(value, 2)]) + if "annual" in key: + csv_writer.writerow([key, round(value, 2), "€/year"]) + else: + csv_writer.writerow([key, round(value, 2), "€"]) From 2f57747eed5bfbd8df584c8cb3d6ecad9076bf7d Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Mon, 21 Nov 2022 15:27:47 +0100 Subject: [PATCH 326/802] Corrected name of argument --- data/examples/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index b9d0fe4b..cd258ae6 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -22,7 +22,7 @@ station_data_path = "data/examples/all_stations.csv" # set flag for cost calculation: cost_calculation = true # cost parameters (Calculation of costs is optional, defaults to None) -cost_params = "./data/examples/cost_params.json" +cost_parameters_file = "./data/examples/cost_params.json" # set nominal power of PV plant in kW (necessary for feed-in remuneration - set for all GCs) pv_power = 0 From 386651ae091aac04078a3aef524acf5393ee1eb6 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Mon, 21 Nov 2022 16:15:15 +0100 Subject: [PATCH 327/802] Only save summary_vehicle_costs.csv if costs are calculated --- ebus_toolbox/report.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index cacf041b..b71ec2f0 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -78,14 +78,15 @@ def generate(schedule, scenario, args): csv_writer.writerows(rotation_infos) # summary of used vehicle types and all costs - with open(args.output_directory / "summary_vehicles_costs.csv", "w", newline='') as f: - csv_writer = csv.writer(f) - csv_writer.writerow(["parameter", "value", "unit"]) - for key, value in schedule.vehicle_type_counts.items(): - if value > 0: - csv_writer.writerow([key, value, "vehicles"]) - for key, value in scenario.costs.items(): - if "annual" in key: - csv_writer.writerow([key, round(value, 2), "€/year"]) - else: - csv_writer.writerow([key, round(value, 2), "€"]) + if args.cost_calculation: + with open(args.output_directory / "summary_vehicles_costs.csv", "w", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["parameter", "value", "unit"]) + for key, value in schedule.vehicle_type_counts.items(): + if value > 0: + csv_writer.writerow([key, value, "vehicles"]) + for key, value in scenario.costs.items(): + if "annual" in key: + csv_writer.writerow([key, round(value, 2), "€/year"]) + else: + csv_writer.writerow([key, round(value, 2), "€"]) From 90a9f72b8b5dcfeae4a5884aca72f1cf8af25049 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 27 Oct 2022 09:48:31 +0200 Subject: [PATCH 328/802] Add various test cases for nd interpol --- tests/test_nd_interpolate.py | 188 +++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 tests/test_nd_interpolate.py diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py new file mode 100644 index 00000000..4b74da9f --- /dev/null +++ b/tests/test_nd_interpolate.py @@ -0,0 +1,188 @@ +""" +run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` +pytest will look for all files starting with "test_" and run all functions +within this file. For basic example of tests you can look at our workshop +https://github.com/rl-institut/workshop/tree/master/test-driven-development. +Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html +are also good support. +""" + +import random + +from ebus_toolbox.util import nd_interp + +random.seed(5) +linear_function = None +TOLERANCE = 0.0001 +POINTS_TO_CHECK = 10 +DIM_AMOUNT = 4 + + +def test_lookup_tables(): + table = [(1, 2, 3), (2, 2, 4), (1, 5, 3), (2, 5, 10)] + assert nd_interp((1, 2), table) == 3 + assert nd_interp((100, 100), table) == 10 + assert nd_interp((1.5, 2), table) == 3.5 + table = [(1, 2, 3), (2, 2, 4), ] + assert nd_interp((1, 2), table) == 3 + table = [(1, 2, 3)] + assert nd_interp((1, 2), table) == 3 + assert nd_interp((100, 100), table) == 3 + assert nd_interp((-100, -100), table) == 3 + + +def get_boundaries(table): + idims = len(table[0]) - 1 + # get the boundaries of each dimension + lower_bounds = [float('inf')] * idims + upper_bounds = [float('-inf')] * idims + for row in table: + for dim in range(0, idims): + lower_bounds[dim] = min(lower_bounds[dim], row[dim]) + upper_bounds[dim] = max(upper_bounds[dim], row[dim]) + return lower_bounds, upper_bounds + + +# Test if out of bound dims are correctly calculated. At this stage clipping of values is assumed, +# e.g. constant values of the dimension onwards. Extrapolation could also be possible but isnt +# used at this point +def test_out_of_bounds(): + for num_dim in range(1, DIM_AMOUNT): + data_table = generate_data_table(num_dimensions=num_dim, random_values=True, + dim_length=[2] * num_dim) + lower_bounds, upper_bounds = get_boundaries(data_table) + for out_of_bounds_dim in range(1, num_dim): + # copy table + stuffed_table = [p for p in data_table] + point = get_outer_point(data_table, dims_out_of_bound=out_of_bounds_dim) + for row in data_table: + for dim, v in enumerate(point): + row = list(row) + if (v < lower_bounds[dim] and row[dim] == lower_bounds[dim]) \ + or (v > upper_bounds[dim] and row[dim] == upper_bounds[dim]): + row[dim] = v + stuffed_table.append(tuple(row)) + assert nd_interp(point, data_table) \ + == nd_interp(point, stuffed_table) + + +# select a random point in between each boundary of each dimensions +def get_outer_point(table, dims_out_of_bound=1): + idims = len(table[0]) - 1 + dims_out_of_bound = min(dims_out_of_bound, idims) + low_bounds, upper_bounds = get_boundaries(table) + + # define a point with the number of dims_out_of_bound values which are not inside + # the dimension values + point = () + for dim in range(0, idims): + offset = random.random() + # out of bounds + if dim < dims_out_of_bound: + point += ((low_bounds[dim] - offset) + (offset > 0.5) * \ + ((-low_bounds[dim] + offset) + (upper_bounds[dim] + offset)),) + else: + # inside bounds + point += (offset * (upper_bounds[dim] - low_bounds[dim]) + low_bounds[dim],) + return point + + +# test each point on the grid of an automatically and randomly generated data table. +def test_grid_points(): + for i in range(1, DIM_AMOUNT): + data_table = generate_data_table(num_dimensions=i, random_values=True) + for row in data_table: + assert nd_interp(row[:-1], data_table) == row[-1] + + +# test 10 randomly generated points in between the table bounds. Values are checked against +# a linear function with a TOLERANCE of 0.0001 +def test_random_points(): + global linear_function + for i in range(1, DIM_AMOUNT): + data_table = generate_data_table(num_dimensions=i, random_values=False) + for _ in range(0, POINTS_TO_CHECK): + point = get_random_inner_point(data_table) + exact_value = linear_function(point) + # get signature of value for tolerance (sig=+1 or -1) + sig = 1 - (exact_value < 0) * 2 + assert ((1 - TOLERANCE * sig) * linear_function(point)) <= nd_interp(point, data_table) + assert nd_interp(point, data_table) <= ((1 + TOLERANCE * sig) * linear_function(point)) + + +# select a random point in between each boundary of each dimensions +def get_random_inner_point(table): + idims = len(table[0]) - 1 + lower_bounds, upper_bounds = get_boundaries(table) + point = () + for dim in range(0, idims): + point += (random.random() * (upper_bounds[dim] - lower_bounds[dim]) + lower_bounds[dim],) + return point + + +def test_singleton(): + for i in range(1, DIM_AMOUNT): + data_table = generate_data_table(num_dimensions=i, random_values=True) + singleton_value = random.random() + for ii, row in enumerate(data_table): + row = list(row) + row.insert(0, singleton_value) + data_table[ii] = row + for row in data_table: + assert nd_interp(row[:-1], data_table) == row[-1] + + +# generate a data table with num_dimensions as input plus 1 output dimension +# output values can be random values or follow a linear function +# nr of values per dimension can be specified via dim_length +# dimension values are not sorted and dont follow a constant stride / step size +def generate_data_table(num_dimensions: int, random_values=True, dim_length=None): + dims = [] + # generate dimensions with random values with random step size + for _ in range(0, num_dimensions): + start = random.randint(-100, 100) + if dim_length is not None: + steps = dim_length[_] + else: + steps = random.randint(1, 5) + dims.append(list( + {start + (random.randint(1, 4) * random.randint(-10, 10)) * k for k in + range(0, steps)})) + # combine dimensions via list_combinator and append random or linear value as output to each + # row + if random_values: + output_table = [row + (random.randint(1, 4) * random.randint(1, 10),) for row in + list_combinator(dims)] + return output_table + else: + def get_linear_function(num_dimensions): + linear_factors = [random.random() * random.randint(-5, 5) for _ in + range(0, num_dimensions)] + + def linear_function(inputs): + result = 0 + for i, inp in enumerate(inputs): + result += inp * linear_factors[i] + return result + + return linear_function + + global linear_function + linear_function = get_linear_function(num_dimensions) + + output_table = [row + (linear_function(row),) for row in + list_combinator(dims)] + return output_table + + +def list_combinator(dimension_list): + table = [(x,) for x in dimension_list[0]] + for i, l in enumerate(dimension_list): + if i == 0: + continue + new_table = [] + for v in l: + for ii, t in enumerate(table): + new_table.append((*table[ii], v,)) + table = new_table + return table From 3932242d29b495720a5b23f3beddcc468c562204 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 22 Nov 2022 14:55:50 +0100 Subject: [PATCH 329/802] Make flake8 happy --- tests/test_nd_interpolate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 4b74da9f..23d31eaf 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -79,7 +79,7 @@ def get_outer_point(table, dims_out_of_bound=1): offset = random.random() # out of bounds if dim < dims_out_of_bound: - point += ((low_bounds[dim] - offset) + (offset > 0.5) * \ + point += ((low_bounds[dim] - offset) + (offset > 0.5) * ((-low_bounds[dim] + offset) + (upper_bounds[dim] + offset)),) else: # inside bounds From 468e9554dce91e8669913817cce90d1a12cfd2b8 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 23 Nov 2022 14:35:38 +0100 Subject: [PATCH 330/802] Add new function generate_vehicle_socs #39 --- ebus_toolbox/report.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 18df5dc9..199ca645 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -5,7 +5,26 @@ import warnings +def generate_vehicle_socs(scenario, args): + + sim_start_time = scenario.start_time + v_list = [] + for v in scenario.vehicle_socs: + v_list.append(v) + + with open(args.output_directory / "vehicle_socs.csv", "w+", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["timestep", "time",] + v_list) + for i, row in enumerate(zip(*scenario.vehicle_socs.values())): + t = sim_start_time + i * scenario.interval + csv_writer.writerow((i, t,) + row) + + def generate(schedule, scenario, args): + + # create csv out of vehicle's socs + generate_vehicle_socs(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From 7cd750a01ac442d03f9c90c266854d4b07e42992 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 23 Nov 2022 17:52:49 +0100 Subject: [PATCH 331/802] Add new function generate_station_name csv #39 --- ebus_toolbox/report.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 199ca645..c45a4755 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,6 +4,8 @@ import datetime import warnings +from src.report import aggregate_timeseries + def generate_vehicle_socs(scenario, args): @@ -20,11 +22,24 @@ def generate_vehicle_socs(scenario, args): csv_writer.writerow((i, t,) + row) +def generate_station_name(scenario, args): + for gc in scenario.gcPowerSchedule: + gc_info = aggregate_timeseries(scenario, gc) + with open(args.output_directory / f"simulation_spiceEV_{gc}.csv", "w+", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(gc_info["header"]) + for elem in gc_info["timeseries"]: + csv_writer.writerow(elem) + + def generate(schedule, scenario, args): # create csv out of vehicle's socs generate_vehicle_socs(scenario, args) + # create csv for all stations + generate_station_name(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From 34d4d070692b313edaf3898096af21715c1dbe71 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Fri, 25 Nov 2022 10:58:37 +0100 Subject: [PATCH 332/802] costs results are now only saved to csv file for whole scenario - adjusted example files to run - corrected parameter wording in main --- data/examples/energy_consumption_example.csv | 2160 +++++++++--------- data/examples/trips_example.csv | 128 +- data/examples/vehicle_types.json | 6 +- ebus_toolbox/__main__.py | 6 +- ebus_toolbox/costs.py | 11 +- 5 files changed, 1153 insertions(+), 1158 deletions(-) diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv index 659d6544..d7125a3e 100644 --- a/data/examples/energy_consumption_example.csv +++ b/data/examples/energy_consumption_example.csv @@ -1079,1083 +1079,1083 @@ VDL,0.9,0.04,37.1,5,3.632 VDL,0.9,0.04,37.1,15,3.549 VDL,0.9,0.04,37.1,25,3.649 VDL,0.9,0.04,37.1,35,3.833 -CKB,0,-0.04,12.1,-15,3.752 -CKB,0,-0.04,12.1,-5,2.322 -CKB,0,-0.04,12.1,5,1.069 -CKB,0,-0.04,12.1,15,-0.007 -CKB,0,-0.04,12.1,25,-0.308 -CKB,0,-0.04,12.1,35,0.361 -CKB,0,-0.04,18,-15,2.048 -CKB,0,-0.04,18,-5,1.134 -CKB,0,-0.04,18,5,0.323 -CKB,0,-0.04,18,15,-0.384 -CKB,0,-0.04,18,25,-0.588 -CKB,0,-0.04,18,35,-0.149 -CKB,0,-0.04,25.2,-15,0.887 -CKB,0,-0.04,25.2,-5,0.351 -CKB,0,-0.04,25.2,5,-0.143 -CKB,0,-0.04,25.2,15,-0.596 -CKB,0,-0.04,25.2,25,-0.736 -CKB,0,-0.04,25.2,35,-0.453 -CKB,0,-0.04,30,-15,0.534 -CKB,0,-0.04,30,-5,0.091 -CKB,0,-0.04,30,5,-0.32 -CKB,0,-0.04,30,15,-0.7 -CKB,0,-0.04,30,25,-0.82 -CKB,0,-0.04,30,35,-0.584 -CKB,0,-0.04,37.1,-15,0.231 -CKB,0,-0.04,37.1,-5,-0.141 -CKB,0,-0.04,37.1,5,-0.485 -CKB,0,-0.04,37.1,15,-0.801 -CKB,0,-0.04,37.1,25,-0.902 -CKB,0,-0.04,37.1,35,-0.71 -CKB,0,-0.03,12.1,-15,4.248 -CKB,0,-0.03,12.1,-5,2.818 -CKB,0,-0.03,12.1,5,1.564 -CKB,0,-0.03,12.1,15,0.488 -CKB,0,-0.03,12.1,25,0.187 -CKB,0,-0.03,12.1,35,0.856 -CKB,0,-0.03,18,-15,2.555 -CKB,0,-0.03,18,-5,1.641 -CKB,0,-0.03,18,5,0.83 -CKB,0,-0.03,18,15,0.123 -CKB,0,-0.03,18,25,-0.081 -CKB,0,-0.03,18,35,0.358 -CKB,0,-0.03,25.2,-15,1.408 -CKB,0,-0.03,25.2,-5,0.873 -CKB,0,-0.03,25.2,5,0.378 -CKB,0,-0.03,25.2,15,-0.075 -CKB,0,-0.03,25.2,25,-0.215 -CKB,0,-0.03,25.2,35,0.068 -CKB,0,-0.03,30,-15,1.037 -CKB,0,-0.03,30,-5,0.594 -CKB,0,-0.03,30,5,0.184 -CKB,0,-0.03,30,15,-0.196 -CKB,0,-0.03,30,25,-0.316 -CKB,0,-0.03,30,35,-0.08 -CKB,0,-0.03,37.1,-15,0.717 -CKB,0,-0.03,37.1,-5,0.345 -CKB,0,-0.03,37.1,5,0.002 -CKB,0,-0.03,37.1,15,-0.315 -CKB,0,-0.03,37.1,25,-0.416 -CKB,0,-0.03,37.1,35,-0.223 -CKB,0,-0.02,12.1,-15,4.743 -CKB,0,-0.02,12.1,-5,3.313 -CKB,0,-0.02,12.1,5,2.06 -CKB,0,-0.02,12.1,15,0.984 -CKB,0,-0.02,12.1,25,0.683 -CKB,0,-0.02,12.1,35,1.352 -CKB,0,-0.02,18,-15,3.062 -CKB,0,-0.02,18,-5,2.147 -CKB,0,-0.02,18,5,1.336 -CKB,0,-0.02,18,15,0.63 -CKB,0,-0.02,18,25,0.426 -CKB,0,-0.02,18,35,0.865 -CKB,0,-0.02,25.2,-15,1.93 -CKB,0,-0.02,25.2,-5,1.395 -CKB,0,-0.02,25.2,5,0.9 -CKB,0,-0.02,25.2,15,0.447 -CKB,0,-0.02,25.2,25,0.307 -CKB,0,-0.02,25.2,35,0.59 -CKB,0,-0.02,30,-15,1.542 -CKB,0,-0.02,30,-5,1.099 -CKB,0,-0.02,30,5,0.688 -CKB,0,-0.02,30,15,0.309 -CKB,0,-0.02,30,25,0.189 -CKB,0,-0.02,30,35,0.424 -CKB,0,-0.02,37.1,-15,1.204 -CKB,0,-0.02,37.1,-5,0.832 -CKB,0,-0.02,37.1,5,0.488 -CKB,0,-0.02,37.1,15,0.172 -CKB,0,-0.02,37.1,25,0.071 -CKB,0,-0.02,37.1,35,0.263 -CKB,0,-0.01,12.1,-15,5.251 -CKB,0,-0.01,12.1,-5,3.821 -CKB,0,-0.01,12.1,5,2.567 -CKB,0,-0.01,12.1,15,1.49 -CKB,0,-0.01,12.1,25,1.189 -CKB,0,-0.01,12.1,35,1.858 -CKB,0,-0.01,18,-15,3.6 -CKB,0,-0.01,18,-5,2.684 -CKB,0,-0.01,18,5,1.872 -CKB,0,-0.01,18,15,1.164 -CKB,0,-0.01,18,25,0.96 -CKB,0,-0.01,18,35,1.397 -CKB,0,-0.01,25.2,-15,2.486 -CKB,0,-0.01,25.2,-5,1.949 -CKB,0,-0.01,25.2,5,1.453 -CKB,0,-0.01,25.2,15,0.999 -CKB,0,-0.01,25.2,25,0.858 -CKB,0,-0.01,25.2,35,1.14 -CKB,0,-0.01,30,-15,2.104 -CKB,0,-0.01,30,-5,1.659 -CKB,0,-0.01,30,5,1.246 -CKB,0,-0.01,30,15,0.865 -CKB,0,-0.01,30,25,0.743 -CKB,0,-0.01,30,35,0.977 -CKB,0,-0.01,37.1,-15,1.776 -CKB,0,-0.01,37.1,-5,1.401 -CKB,0,-0.01,37.1,5,1.054 -CKB,0,-0.01,37.1,15,0.735 -CKB,0,-0.01,37.1,25,0.631 -CKB,0,-0.01,37.1,35,0.821 -CKB,0,0,12.1,-15,5.829 -CKB,0,0,12.1,-5,4.399 -CKB,0,0,12.1,5,3.145 -CKB,0,0,12.1,15,2.069 -CKB,0,0,12.1,25,1.767 -CKB,0,0,12.1,35,2.436 -CKB,0,0,18,-15,4.195 -CKB,0,0,18,-5,3.28 -CKB,0,0,18,5,2.468 -CKB,0,0,18,15,1.76 -CKB,0,0,18,25,1.555 -CKB,0,0,18,35,1.993 -CKB,0,0,25.2,-15,3.087 -CKB,0,0,25.2,-5,2.55 -CKB,0,0,25.2,5,2.054 -CKB,0,0,25.2,15,1.6 -CKB,0,0,25.2,25,1.459 -CKB,0,0,25.2,35,1.741 -CKB,0,0,30,-15,2.721 -CKB,0,0,30,-5,2.276 -CKB,0,0,30,5,1.863 -CKB,0,0,30,15,1.482 -CKB,0,0,30,25,1.36 -CKB,0,0,30,35,1.594 -CKB,0,0,37.1,-15,2.409 -CKB,0,0,37.1,-5,2.034 -CKB,0,0,37.1,5,1.687 -CKB,0,0,37.1,15,1.368 -CKB,0,0,37.1,25,1.265 -CKB,0,0,37.1,35,1.455 -CKB,0,0.01,12.1,-15,6.409 -CKB,0,0.01,12.1,-5,4.978 -CKB,0,0.01,12.1,5,3.724 -CKB,0,0.01,12.1,15,2.648 -CKB,0,0.01,12.1,25,2.347 -CKB,0,0.01,12.1,35,3.015 -CKB,0,0.01,18,-15,4.792 -CKB,0,0.01,18,-5,3.877 -CKB,0,0.01,18,5,3.065 -CKB,0,0.01,18,15,2.357 -CKB,0,0.01,18,25,2.152 -CKB,0,0.01,18,35,2.59 -CKB,0,0.01,25.2,-15,3.688 -CKB,0,0.01,25.2,-5,3.151 -CKB,0,0.01,25.2,5,2.656 -CKB,0,0.01,25.2,15,2.201 -CKB,0,0.01,25.2,25,2.06 -CKB,0,0.01,25.2,35,2.342 -CKB,0,0.01,30,-15,3.338 -CKB,0,0.01,30,-5,2.893 -CKB,0,0.01,30,5,2.48 -CKB,0,0.01,30,15,2.099 -CKB,0,0.01,30,25,1.977 -CKB,0,0.01,30,35,2.211 -CKB,0,0.01,37.1,-15,3.043 -CKB,0,0.01,37.1,-5,2.668 -CKB,0,0.01,37.1,5,2.321 -CKB,0,0.01,37.1,15,2.002 -CKB,0,0.01,37.1,25,1.899 -CKB,0,0.01,37.1,35,2.088 -CKB,0,0.02,12.1,-15,6.988 -CKB,0,0.02,12.1,-5,5.558 -CKB,0,0.02,12.1,5,4.303 -CKB,0,0.02,12.1,15,3.227 -CKB,0,0.02,12.1,25,2.926 -CKB,0,0.02,12.1,35,3.594 -CKB,0,0.02,18,-15,5.389 -CKB,0,0.02,18,-5,4.474 -CKB,0,0.02,18,5,3.662 -CKB,0,0.02,18,15,2.954 -CKB,0,0.02,18,25,2.749 -CKB,0,0.02,18,35,3.187 -CKB,0,0.02,25.2,-15,4.289 -CKB,0,0.02,25.2,-5,3.752 -CKB,0,0.02,25.2,5,3.257 -CKB,0,0.02,25.2,15,2.803 -CKB,0,0.02,25.2,25,2.661 -CKB,0,0.02,25.2,35,2.944 -CKB,0,0.02,30,-15,3.955 -CKB,0,0.02,30,-5,3.51 -CKB,0,0.02,30,5,3.097 -CKB,0,0.02,30,15,2.716 -CKB,0,0.02,30,25,2.594 -CKB,0,0.02,30,35,2.828 -CKB,0,0.02,37.1,-15,3.677 -CKB,0,0.02,37.1,-5,3.302 -CKB,0,0.02,37.1,5,2.955 -CKB,0,0.02,37.1,15,2.636 -CKB,0,0.02,37.1,25,2.533 -CKB,0,0.02,37.1,35,2.723 -CKB,0,0.03,12.1,-15,7.567 -CKB,0,0.03,12.1,-5,6.137 -CKB,0,0.03,12.1,5,4.882 -CKB,0,0.03,12.1,15,3.806 -CKB,0,0.03,12.1,25,3.505 -CKB,0,0.03,12.1,35,4.173 -CKB,0,0.03,18,-15,5.986 -CKB,0,0.03,18,-5,5.07 -CKB,0,0.03,18,5,4.258 -CKB,0,0.03,18,15,3.55 -CKB,0,0.03,18,25,3.346 -CKB,0,0.03,18,35,3.784 -CKB,0,0.03,25.2,-15,4.891 -CKB,0,0.03,25.2,-5,4.354 -CKB,0,0.03,25.2,5,3.859 -CKB,0,0.03,25.2,15,3.405 -CKB,0,0.03,25.2,25,3.263 -CKB,0,0.03,25.2,35,3.546 -CKB,0,0.03,30,-15,4.573 -CKB,0,0.03,30,-5,4.127 -CKB,0,0.03,30,5,3.714 -CKB,0,0.03,30,15,3.333 -CKB,0,0.03,30,25,3.212 -CKB,0,0.03,30,35,3.445 -CKB,0,0.03,37.1,-15,4.311 -CKB,0,0.03,37.1,-5,3.936 -CKB,0,0.03,37.1,5,3.589 -CKB,0,0.03,37.1,15,3.27 -CKB,0,0.03,37.1,25,3.167 -CKB,0,0.03,37.1,35,3.357 -CKB,0,0.04,12.1,-15,8.146 -CKB,0,0.04,12.1,-5,6.716 -CKB,0,0.04,12.1,5,5.462 -CKB,0,0.04,12.1,15,4.385 -CKB,0,0.04,12.1,25,4.084 -CKB,0,0.04,12.1,35,4.752 -CKB,0,0.04,18,-15,6.583 -CKB,0,0.04,18,-5,5.667 -CKB,0,0.04,18,5,4.855 -CKB,0,0.04,18,15,4.147 -CKB,0,0.04,18,25,3.943 -CKB,0,0.04,18,35,4.38 -CKB,0,0.04,25.2,-15,5.494 -CKB,0,0.04,25.2,-5,4.957 -CKB,0,0.04,25.2,5,4.461 -CKB,0,0.04,25.2,15,4.007 -CKB,0,0.04,25.2,25,3.866 -CKB,0,0.04,25.2,35,4.148 -CKB,0,0.04,30,-15,5.19 -CKB,0,0.04,30,-5,4.745 -CKB,0,0.04,30,5,4.332 -CKB,0,0.04,30,15,3.951 -CKB,0,0.04,30,25,3.829 -CKB,0,0.04,30,35,4.063 -CKB,0,0.04,37.1,-15,4.945 -CKB,0,0.04,37.1,-5,4.57 -CKB,0,0.04,37.1,5,4.223 -CKB,0,0.04,37.1,15,3.904 -CKB,0,0.04,37.1,25,3.801 -CKB,0,0.04,37.1,35,3.991 -CKB,0.3,-0.04,12.1,-15,3.274 -CKB,0.3,-0.04,12.1,-5,1.844 -CKB,0.3,-0.04,12.1,5,0.59 -CKB,0.3,-0.04,12.1,15,-0.486 -CKB,0.3,-0.04,12.1,25,-0.302 -CKB,0.3,-0.04,12.1,35,0.45 -CKB,0.3,-0.04,18,-15,1.662 -CKB,0.3,-0.04,18,-5,0.748 -CKB,0.3,-0.04,18,5,-0.063 -CKB,0.3,-0.04,18,15,-0.77 -CKB,0.3,-0.04,18,25,-0.647 -CKB,0.3,-0.04,18,35,-0.152 -CKB,0.3,-0.04,25.2,-15,0.558 -CKB,0.3,-0.04,25.2,-5,0.023 -CKB,0.3,-0.04,25.2,5,-0.471 -CKB,0.3,-0.04,25.2,15,-0.925 -CKB,0.3,-0.04,25.2,25,-0.832 -CKB,0.3,-0.04,25.2,35,-0.508 -CKB,0.3,-0.04,30,-15,0.222 -CKB,0.3,-0.04,30,-5,-0.221 -CKB,0.3,-0.04,30,5,-0.632 -CKB,0.3,-0.04,30,15,-1.011 -CKB,0.3,-0.04,30,25,-0.935 -CKB,0.3,-0.04,30,35,-0.666 -CKB,0.3,-0.04,37.1,-15,-0.064 -CKB,0.3,-0.04,37.1,-5,-0.436 -CKB,0.3,-0.04,37.1,5,-0.78 -CKB,0.3,-0.04,37.1,15,-1.096 -CKB,0.3,-0.04,37.1,25,-1.038 -CKB,0.3,-0.04,37.1,35,-0.819 -CKB,0.3,-0.03,12.1,-15,3.839 -CKB,0.3,-0.03,12.1,-5,2.409 -CKB,0.3,-0.03,12.1,5,1.156 -CKB,0.3,-0.03,12.1,15,0.08 -CKB,0.3,-0.03,12.1,25,0.263 -CKB,0.3,-0.03,12.1,35,1.016 -CKB,0.3,-0.03,18,-15,2.24 -CKB,0.3,-0.03,18,-5,1.326 -CKB,0.3,-0.03,18,5,0.515 -CKB,0.3,-0.03,18,15,-0.192 -CKB,0.3,-0.03,18,25,-0.069 -CKB,0.3,-0.03,18,35,0.426 -CKB,0.3,-0.03,25.2,-15,1.153 -CKB,0.3,-0.03,25.2,-5,0.617 -CKB,0.3,-0.03,25.2,5,0.123 -CKB,0.3,-0.03,25.2,15,-0.33 -CKB,0.3,-0.03,25.2,25,-0.237 -CKB,0.3,-0.03,25.2,35,0.086 -CKB,0.3,-0.03,30,-15,0.797 -CKB,0.3,-0.03,30,-5,0.354 -CKB,0.3,-0.03,30,5,-0.057 -CKB,0.3,-0.03,30,15,-0.437 -CKB,0.3,-0.03,30,25,-0.36 -CKB,0.3,-0.03,30,35,-0.091 -CKB,0.3,-0.03,37.1,-15,0.49 -CKB,0.3,-0.03,37.1,-5,0.119 -CKB,0.3,-0.03,37.1,5,-0.225 -CKB,0.3,-0.03,37.1,15,-0.541 -CKB,0.3,-0.03,37.1,25,-0.484 -CKB,0.3,-0.03,37.1,35,-0.264 -CKB,0.3,-0.02,12.1,-15,4.404 -CKB,0.3,-0.02,12.1,-5,2.974 -CKB,0.3,-0.02,12.1,5,1.721 -CKB,0.3,-0.02,12.1,15,0.645 -CKB,0.3,-0.02,12.1,25,0.828 -CKB,0.3,-0.02,12.1,35,1.581 -CKB,0.3,-0.02,18,-15,2.818 -CKB,0.3,-0.02,18,-5,1.904 -CKB,0.3,-0.02,18,5,1.093 -CKB,0.3,-0.02,18,15,0.386 -CKB,0.3,-0.02,18,25,0.509 -CKB,0.3,-0.02,18,35,1.004 -CKB,0.3,-0.02,25.2,-15,1.748 -CKB,0.3,-0.02,25.2,-5,1.212 -CKB,0.3,-0.02,25.2,5,0.718 -CKB,0.3,-0.02,25.2,15,0.265 -CKB,0.3,-0.02,25.2,25,0.358 -CKB,0.3,-0.02,25.2,35,0.681 -CKB,0.3,-0.02,30,-15,1.372 -CKB,0.3,-0.02,30,-5,0.929 -CKB,0.3,-0.02,30,5,0.518 -CKB,0.3,-0.02,30,15,0.139 -CKB,0.3,-0.02,30,25,0.215 -CKB,0.3,-0.02,30,35,0.484 -CKB,0.3,-0.02,37.1,-15,1.045 -CKB,0.3,-0.02,37.1,-5,0.674 -CKB,0.3,-0.02,37.1,5,0.33 -CKB,0.3,-0.02,37.1,15,0.013 -CKB,0.3,-0.02,37.1,25,0.071 -CKB,0.3,-0.02,37.1,35,0.291 -CKB,0.3,-0.01,12.1,-15,4.981 -CKB,0.3,-0.01,12.1,-5,3.551 -CKB,0.3,-0.01,12.1,5,2.297 -CKB,0.3,-0.01,12.1,15,1.221 -CKB,0.3,-0.01,12.1,25,1.404 -CKB,0.3,-0.01,12.1,35,2.156 -CKB,0.3,-0.01,18,-15,3.427 -CKB,0.3,-0.01,18,-5,2.511 -CKB,0.3,-0.01,18,5,1.699 -CKB,0.3,-0.01,18,15,0.991 -CKB,0.3,-0.01,18,25,1.114 -CKB,0.3,-0.01,18,35,1.608 -CKB,0.3,-0.01,25.2,-15,2.377 -CKB,0.3,-0.01,25.2,-5,1.84 -CKB,0.3,-0.01,25.2,5,1.344 -CKB,0.3,-0.01,25.2,15,0.89 -CKB,0.3,-0.01,25.2,25,0.982 -CKB,0.3,-0.01,25.2,35,1.305 -CKB,0.3,-0.01,30,-15,2.005 -CKB,0.3,-0.01,30,-5,1.56 -CKB,0.3,-0.01,30,5,1.147 -CKB,0.3,-0.01,30,15,0.766 -CKB,0.3,-0.01,30,25,0.84 -CKB,0.3,-0.01,30,35,1.108 -CKB,0.3,-0.01,37.1,-15,1.685 -CKB,0.3,-0.01,37.1,-5,1.31 -CKB,0.3,-0.01,37.1,5,0.964 -CKB,0.3,-0.01,37.1,15,0.645 -CKB,0.3,-0.01,37.1,25,0.7 -CKB,0.3,-0.01,37.1,35,0.917 -CKB,0.3,0,12.1,-15,5.641 -CKB,0.3,0,12.1,-5,4.211 -CKB,0.3,0,12.1,5,2.957 -CKB,0.3,0,12.1,15,1.88 -CKB,0.3,0,12.1,25,2.064 -CKB,0.3,0,12.1,35,2.815 -CKB,0.3,0,18,-15,4.106 -CKB,0.3,0,18,-5,3.191 -CKB,0.3,0,18,5,2.378 -CKB,0.3,0,18,15,1.671 -CKB,0.3,0,18,25,1.793 -CKB,0.3,0,18,35,2.287 -CKB,0.3,0,25.2,-15,3.062 -CKB,0.3,0,25.2,-5,2.525 -CKB,0.3,0,25.2,5,2.029 -CKB,0.3,0,25.2,15,1.575 -CKB,0.3,0,25.2,25,1.667 -CKB,0.3,0,25.2,35,1.99 -CKB,0.3,0,30,-15,2.708 -CKB,0.3,0,30,-5,2.263 -CKB,0.3,0,30,5,1.85 -CKB,0.3,0,30,15,1.469 -CKB,0.3,0,30,25,1.543 -CKB,0.3,0,30,35,1.811 -CKB,0.3,0,37.1,-15,2.408 -CKB,0.3,0,37.1,-5,2.033 -CKB,0.3,0,37.1,5,1.686 -CKB,0.3,0,37.1,15,1.367 -CKB,0.3,0,37.1,25,1.422 -CKB,0.3,0,37.1,35,1.639 -CKB,0.3,0.01,12.1,-15,6.301 -CKB,0.3,0.01,12.1,-5,4.871 -CKB,0.3,0.01,12.1,5,3.617 -CKB,0.3,0.01,12.1,15,2.541 -CKB,0.3,0.01,12.1,25,2.724 -CKB,0.3,0.01,12.1,35,3.476 -CKB,0.3,0.01,18,-15,4.787 -CKB,0.3,0.01,18,-5,3.871 -CKB,0.3,0.01,18,5,3.059 -CKB,0.3,0.01,18,15,2.351 -CKB,0.3,0.01,18,25,2.474 -CKB,0.3,0.01,18,35,2.968 -CKB,0.3,0.01,25.2,-15,3.748 -CKB,0.3,0.01,25.2,-5,3.21 -CKB,0.3,0.01,25.2,5,2.715 -CKB,0.3,0.01,25.2,15,2.261 -CKB,0.3,0.01,25.2,25,2.353 -CKB,0.3,0.01,25.2,35,2.675 -CKB,0.3,0.01,30,-15,3.412 -CKB,0.3,0.01,30,-5,2.967 -CKB,0.3,0.01,30,5,2.554 -CKB,0.3,0.01,30,15,2.173 -CKB,0.3,0.01,30,25,2.247 -CKB,0.3,0.01,30,35,2.514 -CKB,0.3,0.01,37.1,-15,3.13 -CKB,0.3,0.01,37.1,-5,2.755 -CKB,0.3,0.01,37.1,5,2.409 -CKB,0.3,0.01,37.1,15,2.09 -CKB,0.3,0.01,37.1,25,2.145 -CKB,0.3,0.01,37.1,35,2.362 -CKB,0.3,0.02,12.1,-15,6.962 -CKB,0.3,0.02,12.1,-5,5.532 -CKB,0.3,0.02,12.1,5,4.277 -CKB,0.3,0.02,12.1,15,3.201 -CKB,0.3,0.02,12.1,25,3.384 -CKB,0.3,0.02,12.1,35,4.136 -CKB,0.3,0.02,18,-15,5.467 -CKB,0.3,0.02,18,-5,4.552 -CKB,0.3,0.02,18,5,3.74 -CKB,0.3,0.02,18,15,3.032 -CKB,0.3,0.02,18,25,3.155 -CKB,0.3,0.02,18,35,3.648 -CKB,0.3,0.02,25.2,-15,4.433 -CKB,0.3,0.02,25.2,-5,3.896 -CKB,0.3,0.02,25.2,5,3.401 -CKB,0.3,0.02,25.2,15,2.947 -CKB,0.3,0.02,25.2,25,3.039 -CKB,0.3,0.02,25.2,35,3.361 -CKB,0.3,0.02,30,-15,4.116 -CKB,0.3,0.02,30,-5,3.67 -CKB,0.3,0.02,30,5,3.258 -CKB,0.3,0.02,30,15,2.876 -CKB,0.3,0.02,30,25,2.951 -CKB,0.3,0.02,30,35,3.218 -CKB,0.3,0.02,37.1,-15,3.853 -CKB,0.3,0.02,37.1,-5,3.478 -CKB,0.3,0.02,37.1,5,3.132 -CKB,0.3,0.02,37.1,15,2.813 -CKB,0.3,0.02,37.1,25,2.868 -CKB,0.3,0.02,37.1,35,3.085 -CKB,0.3,0.03,12.1,-15,7.622 -CKB,0.3,0.03,12.1,-5,6.192 -CKB,0.3,0.03,12.1,5,4.938 -CKB,0.3,0.03,12.1,15,3.861 -CKB,0.3,0.03,12.1,25,4.045 -CKB,0.3,0.03,12.1,35,4.797 -CKB,0.3,0.03,18,-15,6.148 -CKB,0.3,0.03,18,-5,5.232 -CKB,0.3,0.03,18,5,4.42 -CKB,0.3,0.03,18,15,3.712 -CKB,0.3,0.03,18,25,3.835 -CKB,0.3,0.03,18,35,4.329 -CKB,0.3,0.03,25.2,-15,5.12 -CKB,0.3,0.03,25.2,-5,4.583 -CKB,0.3,0.03,25.2,5,4.087 -CKB,0.3,0.03,25.2,15,3.633 -CKB,0.3,0.03,25.2,25,3.725 -CKB,0.3,0.03,25.2,35,4.048 -CKB,0.3,0.03,30,-15,4.82 -CKB,0.3,0.03,30,-5,4.375 -CKB,0.3,0.03,30,5,3.962 -CKB,0.3,0.03,30,15,3.58 -CKB,0.3,0.03,30,25,3.655 -CKB,0.3,0.03,30,35,3.922 -CKB,0.3,0.03,37.1,-15,4.576 -CKB,0.3,0.03,37.1,-5,4.201 -CKB,0.3,0.03,37.1,5,3.855 -CKB,0.3,0.03,37.1,15,3.536 -CKB,0.3,0.03,37.1,25,3.591 -CKB,0.3,0.03,37.1,35,3.808 -CKB,0.3,0.04,12.1,-15,8.283 -CKB,0.3,0.04,12.1,-5,6.852 -CKB,0.3,0.04,12.1,5,5.598 -CKB,0.3,0.04,12.1,15,4.522 -CKB,0.3,0.04,12.1,25,4.705 -CKB,0.3,0.04,12.1,35,5.457 -CKB,0.3,0.04,18,-15,6.828 -CKB,0.3,0.04,18,-5,5.913 -CKB,0.3,0.04,18,5,5.101 -CKB,0.3,0.04,18,15,4.393 -CKB,0.3,0.04,18,25,4.516 -CKB,0.3,0.04,18,35,5.01 -CKB,0.3,0.04,25.2,-15,5.807 -CKB,0.3,0.04,25.2,-5,5.27 -CKB,0.3,0.04,25.2,5,4.774 -CKB,0.3,0.04,25.2,15,4.32 -CKB,0.3,0.04,25.2,25,4.412 -CKB,0.3,0.04,25.2,35,4.735 -CKB,0.3,0.04,30,-15,5.524 -CKB,0.3,0.04,30,-5,5.079 -CKB,0.3,0.04,30,5,4.666 -CKB,0.3,0.04,30,15,4.285 -CKB,0.3,0.04,30,25,4.359 -CKB,0.3,0.04,30,35,4.626 -CKB,0.3,0.04,37.1,-15,5.299 -CKB,0.3,0.04,37.1,-5,4.924 -CKB,0.3,0.04,37.1,5,4.578 -CKB,0.3,0.04,37.1,15,4.259 -CKB,0.3,0.04,37.1,25,4.314 -CKB,0.3,0.04,37.1,35,4.531 -CKB,0.6,-0.04,12.1,-15,2.796 -CKB,0.6,-0.04,12.1,-5,1.366 -CKB,0.6,-0.04,12.1,5,0.112 -CKB,0.6,-0.04,12.1,15,-0.679 -CKB,0.6,-0.04,12.1,25,-0.295 -CKB,0.6,-0.04,12.1,35,0.54 -CKB,0.6,-0.04,18,-15,1.276 -CKB,0.6,-0.04,18,-5,0.362 -CKB,0.6,-0.04,18,5,-0.449 -CKB,0.6,-0.04,18,15,-0.963 -CKB,0.6,-0.04,18,25,-0.705 -CKB,0.6,-0.04,18,35,-0.154 -CKB,0.6,-0.04,25.2,-15,0.23 -CKB,0.6,-0.04,25.2,-5,-0.306 -CKB,0.6,-0.04,25.2,5,-0.8 -CKB,0.6,-0.04,25.2,15,-1.109 -CKB,0.6,-0.04,25.2,25,-0.927 -CKB,0.6,-0.04,25.2,35,-0.563 -CKB,0.6,-0.04,30,-15,-0.089 -CKB,0.6,-0.04,30,-5,-0.532 -CKB,0.6,-0.04,30,5,-0.943 -CKB,0.6,-0.04,30,15,-1.202 -CKB,0.6,-0.04,30,25,-1.05 -CKB,0.6,-0.04,30,35,-0.748 -CKB,0.6,-0.04,37.1,-15,-0.359 -CKB,0.6,-0.04,37.1,-5,-0.731 -CKB,0.6,-0.04,37.1,5,-1.075 -CKB,0.6,-0.04,37.1,15,-1.296 -CKB,0.6,-0.04,37.1,25,-1.175 -CKB,0.6,-0.04,37.1,35,-0.928 -CKB,0.6,-0.03,12.1,-15,3.43 -CKB,0.6,-0.03,12.1,-5,2.001 -CKB,0.6,-0.03,12.1,5,0.747 -CKB,0.6,-0.03,12.1,15,-0.044 -CKB,0.6,-0.03,12.1,25,0.339 -CKB,0.6,-0.03,12.1,35,1.175 -CKB,0.6,-0.03,18,-15,1.925 -CKB,0.6,-0.03,18,-5,1.011 -CKB,0.6,-0.03,18,5,0.2 -CKB,0.6,-0.03,18,15,-0.314 -CKB,0.6,-0.03,18,25,-0.056 -CKB,0.6,-0.03,18,35,0.495 -CKB,0.6,-0.03,25.2,-15,0.897 -CKB,0.6,-0.03,25.2,-5,0.361 -CKB,0.6,-0.03,25.2,5,-0.133 -CKB,0.6,-0.03,25.2,15,-0.442 -CKB,0.6,-0.03,25.2,25,-0.259 -CKB,0.6,-0.03,25.2,35,0.104 -CKB,0.6,-0.03,30,-15,0.556 -CKB,0.6,-0.03,30,-5,0.113 -CKB,0.6,-0.03,30,5,-0.298 -CKB,0.6,-0.03,30,15,-0.557 -CKB,0.6,-0.03,30,25,-0.405 -CKB,0.6,-0.03,30,35,-0.102 -CKB,0.6,-0.03,37.1,-15,0.264 -CKB,0.6,-0.03,37.1,-5,-0.108 -CKB,0.6,-0.03,37.1,5,-0.452 -CKB,0.6,-0.03,37.1,15,-0.673 -CKB,0.6,-0.03,37.1,25,-0.552 -CKB,0.6,-0.03,37.1,35,-0.305 -CKB,0.6,-0.02,12.1,-15,4.065 -CKB,0.6,-0.02,12.1,-5,2.635 -CKB,0.6,-0.02,12.1,5,1.381 -CKB,0.6,-0.02,12.1,15,0.59 -CKB,0.6,-0.02,12.1,25,0.974 -CKB,0.6,-0.02,12.1,35,1.809 -CKB,0.6,-0.02,18,-15,2.574 -CKB,0.6,-0.02,18,-5,1.66 -CKB,0.6,-0.02,18,5,0.849 -CKB,0.6,-0.02,18,15,0.335 -CKB,0.6,-0.02,18,25,0.593 -CKB,0.6,-0.02,18,35,1.144 -CKB,0.6,-0.02,25.2,-15,1.566 -CKB,0.6,-0.02,25.2,-5,1.03 -CKB,0.6,-0.02,25.2,5,0.536 -CKB,0.6,-0.02,25.2,15,0.227 -CKB,0.6,-0.02,25.2,25,0.409 -CKB,0.6,-0.02,25.2,35,0.773 -CKB,0.6,-0.02,30,-15,1.202 -CKB,0.6,-0.02,30,-5,0.759 -CKB,0.6,-0.02,30,5,0.348 -CKB,0.6,-0.02,30,15,0.089 -CKB,0.6,-0.02,30,25,0.241 -CKB,0.6,-0.02,30,35,0.544 -CKB,0.6,-0.02,37.1,-15,0.887 -CKB,0.6,-0.02,37.1,-5,0.515 -CKB,0.6,-0.02,37.1,5,0.171 -CKB,0.6,-0.02,37.1,15,-0.05 -CKB,0.6,-0.02,37.1,25,0.071 -CKB,0.6,-0.02,37.1,35,0.318 -CKB,0.6,-0.01,12.1,-15,4.712 -CKB,0.6,-0.01,12.1,-5,3.282 -CKB,0.6,-0.01,12.1,5,2.027 -CKB,0.6,-0.01,12.1,15,1.236 -CKB,0.6,-0.01,12.1,25,1.619 -CKB,0.6,-0.01,12.1,35,2.454 -CKB,0.6,-0.01,18,-15,3.254 -CKB,0.6,-0.01,18,-5,2.339 -CKB,0.6,-0.01,18,5,1.526 -CKB,0.6,-0.01,18,15,1.012 -CKB,0.6,-0.01,18,25,1.268 -CKB,0.6,-0.01,18,35,1.819 -CKB,0.6,-0.01,25.2,-15,2.268 -CKB,0.6,-0.01,25.2,-5,1.73 -CKB,0.6,-0.01,25.2,5,1.235 -CKB,0.6,-0.01,25.2,15,0.925 -CKB,0.6,-0.01,25.2,25,1.107 -CKB,0.6,-0.01,25.2,35,1.469 -CKB,0.6,-0.01,30,-15,1.906 -CKB,0.6,-0.01,30,-5,1.461 -CKB,0.6,-0.01,30,5,1.048 -CKB,0.6,-0.01,30,15,0.787 -CKB,0.6,-0.01,30,25,0.937 -CKB,0.6,-0.01,30,35,1.238 -CKB,0.6,-0.01,37.1,-15,1.595 -CKB,0.6,-0.01,37.1,-5,1.22 -CKB,0.6,-0.01,37.1,5,0.874 -CKB,0.6,-0.01,37.1,15,0.65 -CKB,0.6,-0.01,37.1,25,0.768 -CKB,0.6,-0.01,37.1,35,1.012 -CKB,0.6,0,12.1,-15,5.453 -CKB,0.6,0,12.1,-5,4.022 -CKB,0.6,0,12.1,5,2.768 -CKB,0.6,0,12.1,15,1.976 -CKB,0.6,0,12.1,25,2.36 -CKB,0.6,0,12.1,35,3.195 -CKB,0.6,0,18,-15,4.017 -CKB,0.6,0,18,-5,3.101 -CKB,0.6,0,18,5,2.289 -CKB,0.6,0,18,15,1.774 -CKB,0.6,0,18,25,2.031 -CKB,0.6,0,18,35,2.581 -CKB,0.6,0,25.2,-15,3.037 -CKB,0.6,0,25.2,-5,2.5 -CKB,0.6,0,25.2,5,2.005 -CKB,0.6,0,25.2,15,1.694 -CKB,0.6,0,25.2,25,1.876 -CKB,0.6,0,25.2,35,2.238 -CKB,0.6,0,30,-15,2.696 -CKB,0.6,0,30,-5,2.251 -CKB,0.6,0,30,5,1.838 -CKB,0.6,0,30,15,1.577 -CKB,0.6,0,30,25,1.727 -CKB,0.6,0,30,35,2.028 -CKB,0.6,0,37.1,-15,2.406 -CKB,0.6,0,37.1,-5,2.031 -CKB,0.6,0,37.1,5,1.685 -CKB,0.6,0,37.1,15,1.461 -CKB,0.6,0,37.1,25,1.579 -CKB,0.6,0,37.1,35,1.824 -CKB,0.6,0.01,12.1,-15,6.194 -CKB,0.6,0.01,12.1,-5,4.764 -CKB,0.6,0.01,12.1,5,3.51 -CKB,0.6,0.01,12.1,15,2.718 -CKB,0.6,0.01,12.1,25,3.102 -CKB,0.6,0.01,12.1,35,3.937 -CKB,0.6,0.01,18,-15,4.781 -CKB,0.6,0.01,18,-5,3.866 -CKB,0.6,0.01,18,5,3.054 -CKB,0.6,0.01,18,15,2.539 -CKB,0.6,0.01,18,25,2.796 -CKB,0.6,0.01,18,35,3.346 -CKB,0.6,0.01,25.2,-15,3.807 -CKB,0.6,0.01,25.2,-5,3.27 -CKB,0.6,0.01,25.2,5,2.775 -CKB,0.6,0.01,25.2,15,2.465 -CKB,0.6,0.01,25.2,25,2.646 -CKB,0.6,0.01,25.2,35,3.009 -CKB,0.6,0.01,30,-15,3.486 -CKB,0.6,0.01,30,-5,3.041 -CKB,0.6,0.01,30,5,2.628 -CKB,0.6,0.01,30,15,2.367 -CKB,0.6,0.01,30,25,2.517 -CKB,0.6,0.01,30,35,2.818 -CKB,0.6,0.01,37.1,-15,3.218 -CKB,0.6,0.01,37.1,-5,2.843 -CKB,0.6,0.01,37.1,5,2.496 -CKB,0.6,0.01,37.1,15,2.272 -CKB,0.6,0.01,37.1,25,2.391 -CKB,0.6,0.01,37.1,35,2.635 -CKB,0.6,0.02,12.1,-15,6.936 -CKB,0.6,0.02,12.1,-5,5.506 -CKB,0.6,0.02,12.1,5,4.252 -CKB,0.6,0.02,12.1,15,3.46 -CKB,0.6,0.02,12.1,25,3.843 -CKB,0.6,0.02,12.1,35,4.678 -CKB,0.6,0.02,18,-15,5.546 -CKB,0.6,0.02,18,-5,4.63 -CKB,0.6,0.02,18,5,3.818 -CKB,0.6,0.02,18,15,3.303 -CKB,0.6,0.02,18,25,3.56 -CKB,0.6,0.02,18,35,4.11 -CKB,0.6,0.02,25.2,-15,4.577 -CKB,0.6,0.02,25.2,-5,4.04 -CKB,0.6,0.02,25.2,5,3.545 -CKB,0.6,0.02,25.2,15,3.235 -CKB,0.6,0.02,25.2,25,3.416 -CKB,0.6,0.02,25.2,35,3.779 -CKB,0.6,0.02,30,-15,4.276 -CKB,0.6,0.02,30,-5,3.831 -CKB,0.6,0.02,30,5,3.418 -CKB,0.6,0.02,30,15,3.157 -CKB,0.6,0.02,30,25,3.307 -CKB,0.6,0.02,30,35,3.608 -CKB,0.6,0.02,37.1,-15,4.03 -CKB,0.6,0.02,37.1,-5,3.655 -CKB,0.6,0.02,37.1,5,3.308 -CKB,0.6,0.02,37.1,15,3.084 -CKB,0.6,0.02,37.1,25,3.203 -CKB,0.6,0.02,37.1,35,3.447 -CKB,0.6,0.03,12.1,-15,7.678 -CKB,0.6,0.03,12.1,-5,6.247 -CKB,0.6,0.03,12.1,5,4.993 -CKB,0.6,0.03,12.1,15,4.202 -CKB,0.6,0.03,12.1,25,4.585 -CKB,0.6,0.03,12.1,35,5.42 -CKB,0.6,0.03,18,-15,6.31 -CKB,0.6,0.03,18,-5,5.394 -CKB,0.6,0.03,18,5,4.582 -CKB,0.6,0.03,18,15,4.068 -CKB,0.6,0.03,18,25,4.324 -CKB,0.6,0.03,18,35,4.874 -CKB,0.6,0.03,25.2,-15,5.348 -CKB,0.6,0.03,25.2,-5,4.811 -CKB,0.6,0.03,25.2,5,4.316 -CKB,0.6,0.03,25.2,15,4.006 -CKB,0.6,0.03,25.2,25,4.187 -CKB,0.6,0.03,25.2,35,4.55 -CKB,0.6,0.03,30,-15,5.067 -CKB,0.6,0.03,30,-5,4.622 -CKB,0.6,0.03,30,5,4.209 -CKB,0.6,0.03,30,15,3.948 -CKB,0.6,0.03,30,25,4.098 -CKB,0.6,0.03,30,35,4.399 -CKB,0.6,0.03,37.1,-15,4.842 -CKB,0.6,0.03,37.1,-5,4.467 -CKB,0.6,0.03,37.1,5,4.12 -CKB,0.6,0.03,37.1,15,3.896 -CKB,0.6,0.03,37.1,25,4.015 -CKB,0.6,0.03,37.1,35,4.259 -CKB,0.6,0.04,12.1,-15,8.419 -CKB,0.6,0.04,12.1,-5,6.989 -CKB,0.6,0.04,12.1,5,5.735 -CKB,0.6,0.04,12.1,15,4.943 -CKB,0.6,0.04,12.1,25,5.326 -CKB,0.6,0.04,12.1,35,6.162 -CKB,0.6,0.04,18,-15,7.074 -CKB,0.6,0.04,18,-5,6.159 -CKB,0.6,0.04,18,5,5.347 -CKB,0.6,0.04,18,15,4.832 -CKB,0.6,0.04,18,25,5.089 -CKB,0.6,0.04,18,35,5.639 -CKB,0.6,0.04,25.2,-15,6.12 -CKB,0.6,0.04,25.2,-5,5.582 -CKB,0.6,0.04,25.2,5,5.087 -CKB,0.6,0.04,25.2,15,4.777 -CKB,0.6,0.04,25.2,25,4.958 -CKB,0.6,0.04,25.2,35,5.321 -CKB,0.6,0.04,30,-15,5.858 -CKB,0.6,0.04,30,-5,5.413 -CKB,0.6,0.04,30,5,5 -CKB,0.6,0.04,30,15,4.739 -CKB,0.6,0.04,30,25,4.889 -CKB,0.6,0.04,30,35,5.19 -CKB,0.6,0.04,37.1,-15,5.654 -CKB,0.6,0.04,37.1,-5,5.279 -CKB,0.6,0.04,37.1,5,4.932 -CKB,0.6,0.04,37.1,15,4.708 -CKB,0.6,0.04,37.1,25,4.827 -CKB,0.6,0.04,37.1,35,5.071 -CKB,0.9,-0.04,12.1,-15,2.318 -CKB,0.9,-0.04,12.1,-5,0.888 -CKB,0.9,-0.04,12.1,5,-0.366 -CKB,0.9,-0.04,12.1,15,-0.786 -CKB,0.9,-0.04,12.1,25,-0.289 -CKB,0.9,-0.04,12.1,35,0.63 -CKB,0.9,-0.04,18,-15,0.89 -CKB,0.9,-0.04,18,-5,-0.025 -CKB,0.9,-0.04,18,5,-0.836 -CKB,0.9,-0.04,18,15,-1.097 -CKB,0.9,-0.04,18,25,-0.764 -CKB,0.9,-0.04,18,35,-0.157 -CKB,0.9,-0.04,25.2,-15,-0.099 -CKB,0.9,-0.04,25.2,-5,-0.635 -CKB,0.9,-0.04,25.2,5,-1.129 -CKB,0.9,-0.04,25.2,15,-1.254 -CKB,0.9,-0.04,25.2,25,-1.022 -CKB,0.9,-0.04,25.2,35,-0.618 -CKB,0.9,-0.04,30,-15,-0.4 -CKB,0.9,-0.04,30,-5,-0.843 -CKB,0.9,-0.04,30,5,-1.254 -CKB,0.9,-0.04,30,15,-1.359 -CKB,0.9,-0.04,30,25,-1.166 -CKB,0.9,-0.04,30,35,-0.829 -CKB,0.9,-0.04,37.1,-15,-0.654 -CKB,0.9,-0.04,37.1,-5,-1.026 -CKB,0.9,-0.04,37.1,5,-1.37 -CKB,0.9,-0.04,37.1,15,-1.466 -CKB,0.9,-0.04,37.1,25,-1.311 -CKB,0.9,-0.04,37.1,35,-1.037 -CKB,0.9,-0.03,12.1,-15,3.022 -CKB,0.9,-0.03,12.1,-5,1.592 -CKB,0.9,-0.03,12.1,5,0.338 -CKB,0.9,-0.03,12.1,15,-0.082 -CKB,0.9,-0.03,12.1,25,0.415 -CKB,0.9,-0.03,12.1,35,1.334 -CKB,0.9,-0.03,18,-15,1.61 -CKB,0.9,-0.03,18,-5,0.696 -CKB,0.9,-0.03,18,5,-0.115 -CKB,0.9,-0.03,18,15,-0.377 -CKB,0.9,-0.03,18,25,-0.044 -CKB,0.9,-0.03,18,35,0.563 -CKB,0.9,-0.03,25.2,-15,0.642 -CKB,0.9,-0.03,25.2,-5,0.106 -CKB,0.9,-0.03,25.2,5,-0.388 -CKB,0.9,-0.03,25.2,15,-0.513 -CKB,0.9,-0.03,25.2,25,-0.281 -CKB,0.9,-0.03,25.2,35,0.122 -CKB,0.9,-0.03,30,-15,0.316 -CKB,0.9,-0.03,30,-5,-0.127 -CKB,0.9,-0.03,30,5,-0.538 -CKB,0.9,-0.03,30,15,-0.643 -CKB,0.9,-0.03,30,25,-0.45 -CKB,0.9,-0.03,30,35,-0.113 -CKB,0.9,-0.03,37.1,-15,0.037 -CKB,0.9,-0.03,37.1,-5,-0.335 -CKB,0.9,-0.03,37.1,5,-0.678 -CKB,0.9,-0.03,37.1,15,-0.775 -CKB,0.9,-0.03,37.1,25,-0.62 -CKB,0.9,-0.03,37.1,35,-0.346 -CKB,0.9,-0.02,12.1,-15,3.726 -CKB,0.9,-0.02,12.1,-5,2.296 -CKB,0.9,-0.02,12.1,5,1.042 -CKB,0.9,-0.02,12.1,15,0.622 -CKB,0.9,-0.02,12.1,25,1.119 -CKB,0.9,-0.02,12.1,35,2.038 -CKB,0.9,-0.02,18,-15,2.33 -CKB,0.9,-0.02,18,-5,1.416 -CKB,0.9,-0.02,18,5,0.605 -CKB,0.9,-0.02,18,15,0.343 -CKB,0.9,-0.02,18,25,0.676 -CKB,0.9,-0.02,18,35,1.283 -CKB,0.9,-0.02,25.2,-15,1.383 -CKB,0.9,-0.02,25.2,-5,0.847 -CKB,0.9,-0.02,25.2,5,0.353 -CKB,0.9,-0.02,25.2,15,0.228 -CKB,0.9,-0.02,25.2,25,0.46 -CKB,0.9,-0.02,25.2,35,0.864 -CKB,0.9,-0.02,30,-15,1.032 -CKB,0.9,-0.02,30,-5,0.589 -CKB,0.9,-0.02,30,5,0.178 -CKB,0.9,-0.02,30,15,0.074 -CKB,0.9,-0.02,30,25,0.267 -CKB,0.9,-0.02,30,35,0.603 -CKB,0.9,-0.02,37.1,-15,0.728 -CKB,0.9,-0.02,37.1,-5,0.357 -CKB,0.9,-0.02,37.1,5,0.013 -CKB,0.9,-0.02,37.1,15,-0.084 -CKB,0.9,-0.02,37.1,25,0.071 -CKB,0.9,-0.02,37.1,35,0.345 -CKB,0.9,-0.01,12.1,-15,4.442 -CKB,0.9,-0.01,12.1,-5,3.012 -CKB,0.9,-0.01,12.1,5,1.758 -CKB,0.9,-0.01,12.1,15,1.337 -CKB,0.9,-0.01,12.1,25,1.834 -CKB,0.9,-0.01,12.1,35,2.753 -CKB,0.9,-0.01,18,-15,3.081 -CKB,0.9,-0.01,18,-5,2.166 -CKB,0.9,-0.01,18,5,1.354 -CKB,0.9,-0.01,18,15,1.091 -CKB,0.9,-0.01,18,25,1.423 -CKB,0.9,-0.01,18,35,2.029 -CKB,0.9,-0.01,25.2,-15,2.158 -CKB,0.9,-0.01,25.2,-5,1.621 -CKB,0.9,-0.01,25.2,5,1.126 -CKB,0.9,-0.01,25.2,15,1 -CKB,0.9,-0.01,25.2,25,1.231 -CKB,0.9,-0.01,25.2,35,1.634 -CKB,0.9,-0.01,30,-15,1.807 -CKB,0.9,-0.01,30,-5,1.362 -CKB,0.9,-0.01,30,5,0.949 -CKB,0.9,-0.01,30,15,0.843 -CKB,0.9,-0.01,30,25,1.034 -CKB,0.9,-0.01,30,35,1.369 -CKB,0.9,-0.01,37.1,-15,1.505 -CKB,0.9,-0.01,37.1,-5,1.13 -CKB,0.9,-0.01,37.1,5,0.783 -CKB,0.9,-0.01,37.1,15,0.684 -CKB,0.9,-0.01,37.1,25,0.836 -CKB,0.9,-0.01,37.1,35,1.108 -CKB,0.9,0,12.1,-15,5.264 -CKB,0.9,0,12.1,-5,3.834 -CKB,0.9,0,12.1,5,2.58 -CKB,0.9,0,12.1,15,2.159 -CKB,0.9,0,12.1,25,2.656 -CKB,0.9,0,12.1,35,3.574 -CKB,0.9,0,18,-15,3.927 -CKB,0.9,0,18,-5,3.012 -CKB,0.9,0,18,5,2.2 -CKB,0.9,0,18,15,1.937 -CKB,0.9,0,18,25,2.269 -CKB,0.9,0,18,35,2.875 -CKB,0.9,0,25.2,-15,3.012 -CKB,0.9,0,25.2,-5,2.475 -CKB,0.9,0,25.2,5,1.98 -CKB,0.9,0,25.2,15,1.854 -CKB,0.9,0,25.2,25,2.084 -CKB,0.9,0,25.2,35,2.487 -CKB,0.9,0,30,-15,2.683 -CKB,0.9,0,30,-5,2.238 -CKB,0.9,0,30,5,1.825 -CKB,0.9,0,30,15,1.719 -CKB,0.9,0,30,25,1.91 -CKB,0.9,0,30,35,2.245 -CKB,0.9,0,37.1,-15,2.405 -CKB,0.9,0,37.1,-5,2.03 -CKB,0.9,0,37.1,5,1.684 -CKB,0.9,0,37.1,15,1.584 -CKB,0.9,0,37.1,25,1.736 -CKB,0.9,0,37.1,35,2.008 -CKB,0.9,0.01,12.1,-15,6.087 -CKB,0.9,0.01,12.1,-5,4.657 -CKB,0.9,0.01,12.1,5,3.403 -CKB,0.9,0.01,12.1,15,2.982 -CKB,0.9,0.01,12.1,25,3.479 -CKB,0.9,0.01,12.1,35,4.397 -CKB,0.9,0.01,18,-15,4.776 -CKB,0.9,0.01,18,-5,3.86 -CKB,0.9,0.01,18,5,3.048 -CKB,0.9,0.01,18,15,2.786 -CKB,0.9,0.01,18,25,3.117 -CKB,0.9,0.01,18,35,3.724 -CKB,0.9,0.01,25.2,-15,3.867 -CKB,0.9,0.01,25.2,-5,3.329 -CKB,0.9,0.01,25.2,5,2.834 -CKB,0.9,0.01,25.2,15,2.708 -CKB,0.9,0.01,25.2,25,2.939 -CKB,0.9,0.01,25.2,35,3.342 -CKB,0.9,0.01,30,-15,3.56 -CKB,0.9,0.01,30,-5,3.115 -CKB,0.9,0.01,30,5,2.702 -CKB,0.9,0.01,30,15,2.596 -CKB,0.9,0.01,30,25,2.787 -CKB,0.9,0.01,30,35,3.122 -CKB,0.9,0.01,37.1,-15,3.306 -CKB,0.9,0.01,37.1,-5,2.931 -CKB,0.9,0.01,37.1,5,2.584 -CKB,0.9,0.01,37.1,15,2.484 -CKB,0.9,0.01,37.1,25,2.637 -CKB,0.9,0.01,37.1,35,2.908 -CKB,0.9,0.02,12.1,-15,6.91 -CKB,0.9,0.02,12.1,-5,5.48 -CKB,0.9,0.02,12.1,5,4.226 -CKB,0.9,0.02,12.1,15,3.805 -CKB,0.9,0.02,12.1,25,4.302 -CKB,0.9,0.02,12.1,35,5.22 -CKB,0.9,0.02,18,-15,5.624 -CKB,0.9,0.02,18,-5,4.708 -CKB,0.9,0.02,18,5,3.896 -CKB,0.9,0.02,18,15,3.634 -CKB,0.9,0.02,18,25,3.965 -CKB,0.9,0.02,18,35,4.572 -CKB,0.9,0.02,25.2,-15,4.721 -CKB,0.9,0.02,25.2,-5,4.184 -CKB,0.9,0.02,25.2,5,3.689 -CKB,0.9,0.02,25.2,15,3.563 -CKB,0.9,0.02,25.2,25,3.793 -CKB,0.9,0.02,25.2,35,4.196 -CKB,0.9,0.02,30,-15,4.437 -CKB,0.9,0.02,30,-5,3.992 -CKB,0.9,0.02,30,5,3.579 -CKB,0.9,0.02,30,15,3.473 -CKB,0.9,0.02,30,25,3.664 -CKB,0.9,0.02,30,35,3.999 -CKB,0.9,0.02,37.1,-15,4.207 -CKB,0.9,0.02,37.1,-5,3.832 -CKB,0.9,0.02,37.1,5,3.485 -CKB,0.9,0.02,37.1,15,3.385 -CKB,0.9,0.02,37.1,25,3.538 -CKB,0.9,0.02,37.1,35,3.809 -CKB,0.9,0.03,12.1,-15,7.733 -CKB,0.9,0.03,12.1,-5,6.303 -CKB,0.9,0.03,12.1,5,5.049 -CKB,0.9,0.03,12.1,15,4.628 -CKB,0.9,0.03,12.1,25,5.125 -CKB,0.9,0.03,12.1,35,6.043 -CKB,0.9,0.03,18,-15,6.472 -CKB,0.9,0.03,18,-5,5.556 -CKB,0.9,0.03,18,5,4.744 -CKB,0.9,0.03,18,15,4.482 -CKB,0.9,0.03,18,25,4.813 -CKB,0.9,0.03,18,35,5.42 -CKB,0.9,0.03,25.2,-15,5.576 -CKB,0.9,0.03,25.2,-5,5.039 -CKB,0.9,0.03,25.2,5,4.544 -CKB,0.9,0.03,25.2,15,4.418 -CKB,0.9,0.03,25.2,25,4.649 -CKB,0.9,0.03,25.2,35,5.052 -CKB,0.9,0.03,30,-15,5.314 -CKB,0.9,0.03,30,-5,4.869 -CKB,0.9,0.03,30,5,4.456 -CKB,0.9,0.03,30,15,4.35 -CKB,0.9,0.03,30,25,4.541 -CKB,0.9,0.03,30,35,4.876 -CKB,0.9,0.03,37.1,-15,5.108 -CKB,0.9,0.03,37.1,-5,4.733 -CKB,0.9,0.03,37.1,5,4.386 -CKB,0.9,0.03,37.1,15,4.286 -CKB,0.9,0.03,37.1,25,4.439 -CKB,0.9,0.03,37.1,35,4.71 -CKB,0.9,0.04,12.1,-15,8.556 -CKB,0.9,0.04,12.1,-5,7.126 -CKB,0.9,0.04,12.1,5,5.871 -CKB,0.9,0.04,12.1,15,5.451 -CKB,0.9,0.04,12.1,25,5.948 -CKB,0.9,0.04,12.1,35,6.866 -CKB,0.9,0.04,18,-15,7.32 -CKB,0.9,0.04,18,-5,6.404 -CKB,0.9,0.04,18,5,5.592 -CKB,0.9,0.04,18,15,5.33 -CKB,0.9,0.04,18,25,5.661 -CKB,0.9,0.04,18,35,6.268 -CKB,0.9,0.04,25.2,-15,6.432 -CKB,0.9,0.04,25.2,-5,5.895 -CKB,0.9,0.04,25.2,5,5.4 -CKB,0.9,0.04,25.2,15,5.274 -CKB,0.9,0.04,25.2,25,5.505 -CKB,0.9,0.04,25.2,35,5.907 -CKB,0.9,0.04,30,-15,6.192 -CKB,0.9,0.04,30,-5,5.747 -CKB,0.9,0.04,30,5,5.334 -CKB,0.9,0.04,30,15,5.228 -CKB,0.9,0.04,30,25,5.419 -CKB,0.9,0.04,30,35,5.754 -CKB,0.9,0.04,37.1,-15,6.008 -CKB,0.9,0.04,37.1,-5,5.633 -CKB,0.9,0.04,37.1,5,5.287 -CKB,0.9,0.04,37.1,15,5.187 -CKB,0.9,0.04,37.1,25,5.34 -CKB,0.9,0.04,37.1,35,5.611 +AB,0,-0.04,12.1,-15,3.752 +AB,0,-0.04,12.1,-5,2.322 +AB,0,-0.04,12.1,5,1.069 +AB,0,-0.04,12.1,15,-0.007 +AB,0,-0.04,12.1,25,-0.308 +AB,0,-0.04,12.1,35,0.361 +AB,0,-0.04,18,-15,2.048 +AB,0,-0.04,18,-5,1.134 +AB,0,-0.04,18,5,0.323 +AB,0,-0.04,18,15,-0.384 +AB,0,-0.04,18,25,-0.588 +AB,0,-0.04,18,35,-0.149 +AB,0,-0.04,25.2,-15,0.887 +AB,0,-0.04,25.2,-5,0.351 +AB,0,-0.04,25.2,5,-0.143 +AB,0,-0.04,25.2,15,-0.596 +AB,0,-0.04,25.2,25,-0.736 +AB,0,-0.04,25.2,35,-0.453 +AB,0,-0.04,30,-15,0.534 +AB,0,-0.04,30,-5,0.091 +AB,0,-0.04,30,5,-0.32 +AB,0,-0.04,30,15,-0.7 +AB,0,-0.04,30,25,-0.82 +AB,0,-0.04,30,35,-0.584 +AB,0,-0.04,37.1,-15,0.231 +AB,0,-0.04,37.1,-5,-0.141 +AB,0,-0.04,37.1,5,-0.485 +AB,0,-0.04,37.1,15,-0.801 +AB,0,-0.04,37.1,25,-0.902 +AB,0,-0.04,37.1,35,-0.71 +AB,0,-0.03,12.1,-15,4.248 +AB,0,-0.03,12.1,-5,2.818 +AB,0,-0.03,12.1,5,1.564 +AB,0,-0.03,12.1,15,0.488 +AB,0,-0.03,12.1,25,0.187 +AB,0,-0.03,12.1,35,0.856 +AB,0,-0.03,18,-15,2.555 +AB,0,-0.03,18,-5,1.641 +AB,0,-0.03,18,5,0.83 +AB,0,-0.03,18,15,0.123 +AB,0,-0.03,18,25,-0.081 +AB,0,-0.03,18,35,0.358 +AB,0,-0.03,25.2,-15,1.408 +AB,0,-0.03,25.2,-5,0.873 +AB,0,-0.03,25.2,5,0.378 +AB,0,-0.03,25.2,15,-0.075 +AB,0,-0.03,25.2,25,-0.215 +AB,0,-0.03,25.2,35,0.068 +AB,0,-0.03,30,-15,1.037 +AB,0,-0.03,30,-5,0.594 +AB,0,-0.03,30,5,0.184 +AB,0,-0.03,30,15,-0.196 +AB,0,-0.03,30,25,-0.316 +AB,0,-0.03,30,35,-0.08 +AB,0,-0.03,37.1,-15,0.717 +AB,0,-0.03,37.1,-5,0.345 +AB,0,-0.03,37.1,5,0.002 +AB,0,-0.03,37.1,15,-0.315 +AB,0,-0.03,37.1,25,-0.416 +AB,0,-0.03,37.1,35,-0.223 +AB,0,-0.02,12.1,-15,4.743 +AB,0,-0.02,12.1,-5,3.313 +AB,0,-0.02,12.1,5,2.06 +AB,0,-0.02,12.1,15,0.984 +AB,0,-0.02,12.1,25,0.683 +AB,0,-0.02,12.1,35,1.352 +AB,0,-0.02,18,-15,3.062 +AB,0,-0.02,18,-5,2.147 +AB,0,-0.02,18,5,1.336 +AB,0,-0.02,18,15,0.63 +AB,0,-0.02,18,25,0.426 +AB,0,-0.02,18,35,0.865 +AB,0,-0.02,25.2,-15,1.93 +AB,0,-0.02,25.2,-5,1.395 +AB,0,-0.02,25.2,5,0.9 +AB,0,-0.02,25.2,15,0.447 +AB,0,-0.02,25.2,25,0.307 +AB,0,-0.02,25.2,35,0.59 +AB,0,-0.02,30,-15,1.542 +AB,0,-0.02,30,-5,1.099 +AB,0,-0.02,30,5,0.688 +AB,0,-0.02,30,15,0.309 +AB,0,-0.02,30,25,0.189 +AB,0,-0.02,30,35,0.424 +AB,0,-0.02,37.1,-15,1.204 +AB,0,-0.02,37.1,-5,0.832 +AB,0,-0.02,37.1,5,0.488 +AB,0,-0.02,37.1,15,0.172 +AB,0,-0.02,37.1,25,0.071 +AB,0,-0.02,37.1,35,0.263 +AB,0,-0.01,12.1,-15,5.251 +AB,0,-0.01,12.1,-5,3.821 +AB,0,-0.01,12.1,5,2.567 +AB,0,-0.01,12.1,15,1.49 +AB,0,-0.01,12.1,25,1.189 +AB,0,-0.01,12.1,35,1.858 +AB,0,-0.01,18,-15,3.6 +AB,0,-0.01,18,-5,2.684 +AB,0,-0.01,18,5,1.872 +AB,0,-0.01,18,15,1.164 +AB,0,-0.01,18,25,0.96 +AB,0,-0.01,18,35,1.397 +AB,0,-0.01,25.2,-15,2.486 +AB,0,-0.01,25.2,-5,1.949 +AB,0,-0.01,25.2,5,1.453 +AB,0,-0.01,25.2,15,0.999 +AB,0,-0.01,25.2,25,0.858 +AB,0,-0.01,25.2,35,1.14 +AB,0,-0.01,30,-15,2.104 +AB,0,-0.01,30,-5,1.659 +AB,0,-0.01,30,5,1.246 +AB,0,-0.01,30,15,0.865 +AB,0,-0.01,30,25,0.743 +AB,0,-0.01,30,35,0.977 +AB,0,-0.01,37.1,-15,1.776 +AB,0,-0.01,37.1,-5,1.401 +AB,0,-0.01,37.1,5,1.054 +AB,0,-0.01,37.1,15,0.735 +AB,0,-0.01,37.1,25,0.631 +AB,0,-0.01,37.1,35,0.821 +AB,0,0,12.1,-15,5.829 +AB,0,0,12.1,-5,4.399 +AB,0,0,12.1,5,3.145 +AB,0,0,12.1,15,2.069 +AB,0,0,12.1,25,1.767 +AB,0,0,12.1,35,2.436 +AB,0,0,18,-15,4.195 +AB,0,0,18,-5,3.28 +AB,0,0,18,5,2.468 +AB,0,0,18,15,1.76 +AB,0,0,18,25,1.555 +AB,0,0,18,35,1.993 +AB,0,0,25.2,-15,3.087 +AB,0,0,25.2,-5,2.55 +AB,0,0,25.2,5,2.054 +AB,0,0,25.2,15,1.6 +AB,0,0,25.2,25,1.459 +AB,0,0,25.2,35,1.741 +AB,0,0,30,-15,2.721 +AB,0,0,30,-5,2.276 +AB,0,0,30,5,1.863 +AB,0,0,30,15,1.482 +AB,0,0,30,25,1.36 +AB,0,0,30,35,1.594 +AB,0,0,37.1,-15,2.409 +AB,0,0,37.1,-5,2.034 +AB,0,0,37.1,5,1.687 +AB,0,0,37.1,15,1.368 +AB,0,0,37.1,25,1.265 +AB,0,0,37.1,35,1.455 +AB,0,0.01,12.1,-15,6.409 +AB,0,0.01,12.1,-5,4.978 +AB,0,0.01,12.1,5,3.724 +AB,0,0.01,12.1,15,2.648 +AB,0,0.01,12.1,25,2.347 +AB,0,0.01,12.1,35,3.015 +AB,0,0.01,18,-15,4.792 +AB,0,0.01,18,-5,3.877 +AB,0,0.01,18,5,3.065 +AB,0,0.01,18,15,2.357 +AB,0,0.01,18,25,2.152 +AB,0,0.01,18,35,2.59 +AB,0,0.01,25.2,-15,3.688 +AB,0,0.01,25.2,-5,3.151 +AB,0,0.01,25.2,5,2.656 +AB,0,0.01,25.2,15,2.201 +AB,0,0.01,25.2,25,2.06 +AB,0,0.01,25.2,35,2.342 +AB,0,0.01,30,-15,3.338 +AB,0,0.01,30,-5,2.893 +AB,0,0.01,30,5,2.48 +AB,0,0.01,30,15,2.099 +AB,0,0.01,30,25,1.977 +AB,0,0.01,30,35,2.211 +AB,0,0.01,37.1,-15,3.043 +AB,0,0.01,37.1,-5,2.668 +AB,0,0.01,37.1,5,2.321 +AB,0,0.01,37.1,15,2.002 +AB,0,0.01,37.1,25,1.899 +AB,0,0.01,37.1,35,2.088 +AB,0,0.02,12.1,-15,6.988 +AB,0,0.02,12.1,-5,5.558 +AB,0,0.02,12.1,5,4.303 +AB,0,0.02,12.1,15,3.227 +AB,0,0.02,12.1,25,2.926 +AB,0,0.02,12.1,35,3.594 +AB,0,0.02,18,-15,5.389 +AB,0,0.02,18,-5,4.474 +AB,0,0.02,18,5,3.662 +AB,0,0.02,18,15,2.954 +AB,0,0.02,18,25,2.749 +AB,0,0.02,18,35,3.187 +AB,0,0.02,25.2,-15,4.289 +AB,0,0.02,25.2,-5,3.752 +AB,0,0.02,25.2,5,3.257 +AB,0,0.02,25.2,15,2.803 +AB,0,0.02,25.2,25,2.661 +AB,0,0.02,25.2,35,2.944 +AB,0,0.02,30,-15,3.955 +AB,0,0.02,30,-5,3.51 +AB,0,0.02,30,5,3.097 +AB,0,0.02,30,15,2.716 +AB,0,0.02,30,25,2.594 +AB,0,0.02,30,35,2.828 +AB,0,0.02,37.1,-15,3.677 +AB,0,0.02,37.1,-5,3.302 +AB,0,0.02,37.1,5,2.955 +AB,0,0.02,37.1,15,2.636 +AB,0,0.02,37.1,25,2.533 +AB,0,0.02,37.1,35,2.723 +AB,0,0.03,12.1,-15,7.567 +AB,0,0.03,12.1,-5,6.137 +AB,0,0.03,12.1,5,4.882 +AB,0,0.03,12.1,15,3.806 +AB,0,0.03,12.1,25,3.505 +AB,0,0.03,12.1,35,4.173 +AB,0,0.03,18,-15,5.986 +AB,0,0.03,18,-5,5.07 +AB,0,0.03,18,5,4.258 +AB,0,0.03,18,15,3.55 +AB,0,0.03,18,25,3.346 +AB,0,0.03,18,35,3.784 +AB,0,0.03,25.2,-15,4.891 +AB,0,0.03,25.2,-5,4.354 +AB,0,0.03,25.2,5,3.859 +AB,0,0.03,25.2,15,3.405 +AB,0,0.03,25.2,25,3.263 +AB,0,0.03,25.2,35,3.546 +AB,0,0.03,30,-15,4.573 +AB,0,0.03,30,-5,4.127 +AB,0,0.03,30,5,3.714 +AB,0,0.03,30,15,3.333 +AB,0,0.03,30,25,3.212 +AB,0,0.03,30,35,3.445 +AB,0,0.03,37.1,-15,4.311 +AB,0,0.03,37.1,-5,3.936 +AB,0,0.03,37.1,5,3.589 +AB,0,0.03,37.1,15,3.27 +AB,0,0.03,37.1,25,3.167 +AB,0,0.03,37.1,35,3.357 +AB,0,0.04,12.1,-15,8.146 +AB,0,0.04,12.1,-5,6.716 +AB,0,0.04,12.1,5,5.462 +AB,0,0.04,12.1,15,4.385 +AB,0,0.04,12.1,25,4.084 +AB,0,0.04,12.1,35,4.752 +AB,0,0.04,18,-15,6.583 +AB,0,0.04,18,-5,5.667 +AB,0,0.04,18,5,4.855 +AB,0,0.04,18,15,4.147 +AB,0,0.04,18,25,3.943 +AB,0,0.04,18,35,4.38 +AB,0,0.04,25.2,-15,5.494 +AB,0,0.04,25.2,-5,4.957 +AB,0,0.04,25.2,5,4.461 +AB,0,0.04,25.2,15,4.007 +AB,0,0.04,25.2,25,3.866 +AB,0,0.04,25.2,35,4.148 +AB,0,0.04,30,-15,5.19 +AB,0,0.04,30,-5,4.745 +AB,0,0.04,30,5,4.332 +AB,0,0.04,30,15,3.951 +AB,0,0.04,30,25,3.829 +AB,0,0.04,30,35,4.063 +AB,0,0.04,37.1,-15,4.945 +AB,0,0.04,37.1,-5,4.57 +AB,0,0.04,37.1,5,4.223 +AB,0,0.04,37.1,15,3.904 +AB,0,0.04,37.1,25,3.801 +AB,0,0.04,37.1,35,3.991 +AB,0.3,-0.04,12.1,-15,3.274 +AB,0.3,-0.04,12.1,-5,1.844 +AB,0.3,-0.04,12.1,5,0.59 +AB,0.3,-0.04,12.1,15,-0.486 +AB,0.3,-0.04,12.1,25,-0.302 +AB,0.3,-0.04,12.1,35,0.45 +AB,0.3,-0.04,18,-15,1.662 +AB,0.3,-0.04,18,-5,0.748 +AB,0.3,-0.04,18,5,-0.063 +AB,0.3,-0.04,18,15,-0.77 +AB,0.3,-0.04,18,25,-0.647 +AB,0.3,-0.04,18,35,-0.152 +AB,0.3,-0.04,25.2,-15,0.558 +AB,0.3,-0.04,25.2,-5,0.023 +AB,0.3,-0.04,25.2,5,-0.471 +AB,0.3,-0.04,25.2,15,-0.925 +AB,0.3,-0.04,25.2,25,-0.832 +AB,0.3,-0.04,25.2,35,-0.508 +AB,0.3,-0.04,30,-15,0.222 +AB,0.3,-0.04,30,-5,-0.221 +AB,0.3,-0.04,30,5,-0.632 +AB,0.3,-0.04,30,15,-1.011 +AB,0.3,-0.04,30,25,-0.935 +AB,0.3,-0.04,30,35,-0.666 +AB,0.3,-0.04,37.1,-15,-0.064 +AB,0.3,-0.04,37.1,-5,-0.436 +AB,0.3,-0.04,37.1,5,-0.78 +AB,0.3,-0.04,37.1,15,-1.096 +AB,0.3,-0.04,37.1,25,-1.038 +AB,0.3,-0.04,37.1,35,-0.819 +AB,0.3,-0.03,12.1,-15,3.839 +AB,0.3,-0.03,12.1,-5,2.409 +AB,0.3,-0.03,12.1,5,1.156 +AB,0.3,-0.03,12.1,15,0.08 +AB,0.3,-0.03,12.1,25,0.263 +AB,0.3,-0.03,12.1,35,1.016 +AB,0.3,-0.03,18,-15,2.24 +AB,0.3,-0.03,18,-5,1.326 +AB,0.3,-0.03,18,5,0.515 +AB,0.3,-0.03,18,15,-0.192 +AB,0.3,-0.03,18,25,-0.069 +AB,0.3,-0.03,18,35,0.426 +AB,0.3,-0.03,25.2,-15,1.153 +AB,0.3,-0.03,25.2,-5,0.617 +AB,0.3,-0.03,25.2,5,0.123 +AB,0.3,-0.03,25.2,15,-0.33 +AB,0.3,-0.03,25.2,25,-0.237 +AB,0.3,-0.03,25.2,35,0.086 +AB,0.3,-0.03,30,-15,0.797 +AB,0.3,-0.03,30,-5,0.354 +AB,0.3,-0.03,30,5,-0.057 +AB,0.3,-0.03,30,15,-0.437 +AB,0.3,-0.03,30,25,-0.36 +AB,0.3,-0.03,30,35,-0.091 +AB,0.3,-0.03,37.1,-15,0.49 +AB,0.3,-0.03,37.1,-5,0.119 +AB,0.3,-0.03,37.1,5,-0.225 +AB,0.3,-0.03,37.1,15,-0.541 +AB,0.3,-0.03,37.1,25,-0.484 +AB,0.3,-0.03,37.1,35,-0.264 +AB,0.3,-0.02,12.1,-15,4.404 +AB,0.3,-0.02,12.1,-5,2.974 +AB,0.3,-0.02,12.1,5,1.721 +AB,0.3,-0.02,12.1,15,0.645 +AB,0.3,-0.02,12.1,25,0.828 +AB,0.3,-0.02,12.1,35,1.581 +AB,0.3,-0.02,18,-15,2.818 +AB,0.3,-0.02,18,-5,1.904 +AB,0.3,-0.02,18,5,1.093 +AB,0.3,-0.02,18,15,0.386 +AB,0.3,-0.02,18,25,0.509 +AB,0.3,-0.02,18,35,1.004 +AB,0.3,-0.02,25.2,-15,1.748 +AB,0.3,-0.02,25.2,-5,1.212 +AB,0.3,-0.02,25.2,5,0.718 +AB,0.3,-0.02,25.2,15,0.265 +AB,0.3,-0.02,25.2,25,0.358 +AB,0.3,-0.02,25.2,35,0.681 +AB,0.3,-0.02,30,-15,1.372 +AB,0.3,-0.02,30,-5,0.929 +AB,0.3,-0.02,30,5,0.518 +AB,0.3,-0.02,30,15,0.139 +AB,0.3,-0.02,30,25,0.215 +AB,0.3,-0.02,30,35,0.484 +AB,0.3,-0.02,37.1,-15,1.045 +AB,0.3,-0.02,37.1,-5,0.674 +AB,0.3,-0.02,37.1,5,0.33 +AB,0.3,-0.02,37.1,15,0.013 +AB,0.3,-0.02,37.1,25,0.071 +AB,0.3,-0.02,37.1,35,0.291 +AB,0.3,-0.01,12.1,-15,4.981 +AB,0.3,-0.01,12.1,-5,3.551 +AB,0.3,-0.01,12.1,5,2.297 +AB,0.3,-0.01,12.1,15,1.221 +AB,0.3,-0.01,12.1,25,1.404 +AB,0.3,-0.01,12.1,35,2.156 +AB,0.3,-0.01,18,-15,3.427 +AB,0.3,-0.01,18,-5,2.511 +AB,0.3,-0.01,18,5,1.699 +AB,0.3,-0.01,18,15,0.991 +AB,0.3,-0.01,18,25,1.114 +AB,0.3,-0.01,18,35,1.608 +AB,0.3,-0.01,25.2,-15,2.377 +AB,0.3,-0.01,25.2,-5,1.84 +AB,0.3,-0.01,25.2,5,1.344 +AB,0.3,-0.01,25.2,15,0.89 +AB,0.3,-0.01,25.2,25,0.982 +AB,0.3,-0.01,25.2,35,1.305 +AB,0.3,-0.01,30,-15,2.005 +AB,0.3,-0.01,30,-5,1.56 +AB,0.3,-0.01,30,5,1.147 +AB,0.3,-0.01,30,15,0.766 +AB,0.3,-0.01,30,25,0.84 +AB,0.3,-0.01,30,35,1.108 +AB,0.3,-0.01,37.1,-15,1.685 +AB,0.3,-0.01,37.1,-5,1.31 +AB,0.3,-0.01,37.1,5,0.964 +AB,0.3,-0.01,37.1,15,0.645 +AB,0.3,-0.01,37.1,25,0.7 +AB,0.3,-0.01,37.1,35,0.917 +AB,0.3,0,12.1,-15,5.641 +AB,0.3,0,12.1,-5,4.211 +AB,0.3,0,12.1,5,2.957 +AB,0.3,0,12.1,15,1.88 +AB,0.3,0,12.1,25,2.064 +AB,0.3,0,12.1,35,2.815 +AB,0.3,0,18,-15,4.106 +AB,0.3,0,18,-5,3.191 +AB,0.3,0,18,5,2.378 +AB,0.3,0,18,15,1.671 +AB,0.3,0,18,25,1.793 +AB,0.3,0,18,35,2.287 +AB,0.3,0,25.2,-15,3.062 +AB,0.3,0,25.2,-5,2.525 +AB,0.3,0,25.2,5,2.029 +AB,0.3,0,25.2,15,1.575 +AB,0.3,0,25.2,25,1.667 +AB,0.3,0,25.2,35,1.99 +AB,0.3,0,30,-15,2.708 +AB,0.3,0,30,-5,2.263 +AB,0.3,0,30,5,1.85 +AB,0.3,0,30,15,1.469 +AB,0.3,0,30,25,1.543 +AB,0.3,0,30,35,1.811 +AB,0.3,0,37.1,-15,2.408 +AB,0.3,0,37.1,-5,2.033 +AB,0.3,0,37.1,5,1.686 +AB,0.3,0,37.1,15,1.367 +AB,0.3,0,37.1,25,1.422 +AB,0.3,0,37.1,35,1.639 +AB,0.3,0.01,12.1,-15,6.301 +AB,0.3,0.01,12.1,-5,4.871 +AB,0.3,0.01,12.1,5,3.617 +AB,0.3,0.01,12.1,15,2.541 +AB,0.3,0.01,12.1,25,2.724 +AB,0.3,0.01,12.1,35,3.476 +AB,0.3,0.01,18,-15,4.787 +AB,0.3,0.01,18,-5,3.871 +AB,0.3,0.01,18,5,3.059 +AB,0.3,0.01,18,15,2.351 +AB,0.3,0.01,18,25,2.474 +AB,0.3,0.01,18,35,2.968 +AB,0.3,0.01,25.2,-15,3.748 +AB,0.3,0.01,25.2,-5,3.21 +AB,0.3,0.01,25.2,5,2.715 +AB,0.3,0.01,25.2,15,2.261 +AB,0.3,0.01,25.2,25,2.353 +AB,0.3,0.01,25.2,35,2.675 +AB,0.3,0.01,30,-15,3.412 +AB,0.3,0.01,30,-5,2.967 +AB,0.3,0.01,30,5,2.554 +AB,0.3,0.01,30,15,2.173 +AB,0.3,0.01,30,25,2.247 +AB,0.3,0.01,30,35,2.514 +AB,0.3,0.01,37.1,-15,3.13 +AB,0.3,0.01,37.1,-5,2.755 +AB,0.3,0.01,37.1,5,2.409 +AB,0.3,0.01,37.1,15,2.09 +AB,0.3,0.01,37.1,25,2.145 +AB,0.3,0.01,37.1,35,2.362 +AB,0.3,0.02,12.1,-15,6.962 +AB,0.3,0.02,12.1,-5,5.532 +AB,0.3,0.02,12.1,5,4.277 +AB,0.3,0.02,12.1,15,3.201 +AB,0.3,0.02,12.1,25,3.384 +AB,0.3,0.02,12.1,35,4.136 +AB,0.3,0.02,18,-15,5.467 +AB,0.3,0.02,18,-5,4.552 +AB,0.3,0.02,18,5,3.74 +AB,0.3,0.02,18,15,3.032 +AB,0.3,0.02,18,25,3.155 +AB,0.3,0.02,18,35,3.648 +AB,0.3,0.02,25.2,-15,4.433 +AB,0.3,0.02,25.2,-5,3.896 +AB,0.3,0.02,25.2,5,3.401 +AB,0.3,0.02,25.2,15,2.947 +AB,0.3,0.02,25.2,25,3.039 +AB,0.3,0.02,25.2,35,3.361 +AB,0.3,0.02,30,-15,4.116 +AB,0.3,0.02,30,-5,3.67 +AB,0.3,0.02,30,5,3.258 +AB,0.3,0.02,30,15,2.876 +AB,0.3,0.02,30,25,2.951 +AB,0.3,0.02,30,35,3.218 +AB,0.3,0.02,37.1,-15,3.853 +AB,0.3,0.02,37.1,-5,3.478 +AB,0.3,0.02,37.1,5,3.132 +AB,0.3,0.02,37.1,15,2.813 +AB,0.3,0.02,37.1,25,2.868 +AB,0.3,0.02,37.1,35,3.085 +AB,0.3,0.03,12.1,-15,7.622 +AB,0.3,0.03,12.1,-5,6.192 +AB,0.3,0.03,12.1,5,4.938 +AB,0.3,0.03,12.1,15,3.861 +AB,0.3,0.03,12.1,25,4.045 +AB,0.3,0.03,12.1,35,4.797 +AB,0.3,0.03,18,-15,6.148 +AB,0.3,0.03,18,-5,5.232 +AB,0.3,0.03,18,5,4.42 +AB,0.3,0.03,18,15,3.712 +AB,0.3,0.03,18,25,3.835 +AB,0.3,0.03,18,35,4.329 +AB,0.3,0.03,25.2,-15,5.12 +AB,0.3,0.03,25.2,-5,4.583 +AB,0.3,0.03,25.2,5,4.087 +AB,0.3,0.03,25.2,15,3.633 +AB,0.3,0.03,25.2,25,3.725 +AB,0.3,0.03,25.2,35,4.048 +AB,0.3,0.03,30,-15,4.82 +AB,0.3,0.03,30,-5,4.375 +AB,0.3,0.03,30,5,3.962 +AB,0.3,0.03,30,15,3.58 +AB,0.3,0.03,30,25,3.655 +AB,0.3,0.03,30,35,3.922 +AB,0.3,0.03,37.1,-15,4.576 +AB,0.3,0.03,37.1,-5,4.201 +AB,0.3,0.03,37.1,5,3.855 +AB,0.3,0.03,37.1,15,3.536 +AB,0.3,0.03,37.1,25,3.591 +AB,0.3,0.03,37.1,35,3.808 +AB,0.3,0.04,12.1,-15,8.283 +AB,0.3,0.04,12.1,-5,6.852 +AB,0.3,0.04,12.1,5,5.598 +AB,0.3,0.04,12.1,15,4.522 +AB,0.3,0.04,12.1,25,4.705 +AB,0.3,0.04,12.1,35,5.457 +AB,0.3,0.04,18,-15,6.828 +AB,0.3,0.04,18,-5,5.913 +AB,0.3,0.04,18,5,5.101 +AB,0.3,0.04,18,15,4.393 +AB,0.3,0.04,18,25,4.516 +AB,0.3,0.04,18,35,5.01 +AB,0.3,0.04,25.2,-15,5.807 +AB,0.3,0.04,25.2,-5,5.27 +AB,0.3,0.04,25.2,5,4.774 +AB,0.3,0.04,25.2,15,4.32 +AB,0.3,0.04,25.2,25,4.412 +AB,0.3,0.04,25.2,35,4.735 +AB,0.3,0.04,30,-15,5.524 +AB,0.3,0.04,30,-5,5.079 +AB,0.3,0.04,30,5,4.666 +AB,0.3,0.04,30,15,4.285 +AB,0.3,0.04,30,25,4.359 +AB,0.3,0.04,30,35,4.626 +AB,0.3,0.04,37.1,-15,5.299 +AB,0.3,0.04,37.1,-5,4.924 +AB,0.3,0.04,37.1,5,4.578 +AB,0.3,0.04,37.1,15,4.259 +AB,0.3,0.04,37.1,25,4.314 +AB,0.3,0.04,37.1,35,4.531 +AB,0.6,-0.04,12.1,-15,2.796 +AB,0.6,-0.04,12.1,-5,1.366 +AB,0.6,-0.04,12.1,5,0.112 +AB,0.6,-0.04,12.1,15,-0.679 +AB,0.6,-0.04,12.1,25,-0.295 +AB,0.6,-0.04,12.1,35,0.54 +AB,0.6,-0.04,18,-15,1.276 +AB,0.6,-0.04,18,-5,0.362 +AB,0.6,-0.04,18,5,-0.449 +AB,0.6,-0.04,18,15,-0.963 +AB,0.6,-0.04,18,25,-0.705 +AB,0.6,-0.04,18,35,-0.154 +AB,0.6,-0.04,25.2,-15,0.23 +AB,0.6,-0.04,25.2,-5,-0.306 +AB,0.6,-0.04,25.2,5,-0.8 +AB,0.6,-0.04,25.2,15,-1.109 +AB,0.6,-0.04,25.2,25,-0.927 +AB,0.6,-0.04,25.2,35,-0.563 +AB,0.6,-0.04,30,-15,-0.089 +AB,0.6,-0.04,30,-5,-0.532 +AB,0.6,-0.04,30,5,-0.943 +AB,0.6,-0.04,30,15,-1.202 +AB,0.6,-0.04,30,25,-1.05 +AB,0.6,-0.04,30,35,-0.748 +AB,0.6,-0.04,37.1,-15,-0.359 +AB,0.6,-0.04,37.1,-5,-0.731 +AB,0.6,-0.04,37.1,5,-1.075 +AB,0.6,-0.04,37.1,15,-1.296 +AB,0.6,-0.04,37.1,25,-1.175 +AB,0.6,-0.04,37.1,35,-0.928 +AB,0.6,-0.03,12.1,-15,3.43 +AB,0.6,-0.03,12.1,-5,2.001 +AB,0.6,-0.03,12.1,5,0.747 +AB,0.6,-0.03,12.1,15,-0.044 +AB,0.6,-0.03,12.1,25,0.339 +AB,0.6,-0.03,12.1,35,1.175 +AB,0.6,-0.03,18,-15,1.925 +AB,0.6,-0.03,18,-5,1.011 +AB,0.6,-0.03,18,5,0.2 +AB,0.6,-0.03,18,15,-0.314 +AB,0.6,-0.03,18,25,-0.056 +AB,0.6,-0.03,18,35,0.495 +AB,0.6,-0.03,25.2,-15,0.897 +AB,0.6,-0.03,25.2,-5,0.361 +AB,0.6,-0.03,25.2,5,-0.133 +AB,0.6,-0.03,25.2,15,-0.442 +AB,0.6,-0.03,25.2,25,-0.259 +AB,0.6,-0.03,25.2,35,0.104 +AB,0.6,-0.03,30,-15,0.556 +AB,0.6,-0.03,30,-5,0.113 +AB,0.6,-0.03,30,5,-0.298 +AB,0.6,-0.03,30,15,-0.557 +AB,0.6,-0.03,30,25,-0.405 +AB,0.6,-0.03,30,35,-0.102 +AB,0.6,-0.03,37.1,-15,0.264 +AB,0.6,-0.03,37.1,-5,-0.108 +AB,0.6,-0.03,37.1,5,-0.452 +AB,0.6,-0.03,37.1,15,-0.673 +AB,0.6,-0.03,37.1,25,-0.552 +AB,0.6,-0.03,37.1,35,-0.305 +AB,0.6,-0.02,12.1,-15,4.065 +AB,0.6,-0.02,12.1,-5,2.635 +AB,0.6,-0.02,12.1,5,1.381 +AB,0.6,-0.02,12.1,15,0.59 +AB,0.6,-0.02,12.1,25,0.974 +AB,0.6,-0.02,12.1,35,1.809 +AB,0.6,-0.02,18,-15,2.574 +AB,0.6,-0.02,18,-5,1.66 +AB,0.6,-0.02,18,5,0.849 +AB,0.6,-0.02,18,15,0.335 +AB,0.6,-0.02,18,25,0.593 +AB,0.6,-0.02,18,35,1.144 +AB,0.6,-0.02,25.2,-15,1.566 +AB,0.6,-0.02,25.2,-5,1.03 +AB,0.6,-0.02,25.2,5,0.536 +AB,0.6,-0.02,25.2,15,0.227 +AB,0.6,-0.02,25.2,25,0.409 +AB,0.6,-0.02,25.2,35,0.773 +AB,0.6,-0.02,30,-15,1.202 +AB,0.6,-0.02,30,-5,0.759 +AB,0.6,-0.02,30,5,0.348 +AB,0.6,-0.02,30,15,0.089 +AB,0.6,-0.02,30,25,0.241 +AB,0.6,-0.02,30,35,0.544 +AB,0.6,-0.02,37.1,-15,0.887 +AB,0.6,-0.02,37.1,-5,0.515 +AB,0.6,-0.02,37.1,5,0.171 +AB,0.6,-0.02,37.1,15,-0.05 +AB,0.6,-0.02,37.1,25,0.071 +AB,0.6,-0.02,37.1,35,0.318 +AB,0.6,-0.01,12.1,-15,4.712 +AB,0.6,-0.01,12.1,-5,3.282 +AB,0.6,-0.01,12.1,5,2.027 +AB,0.6,-0.01,12.1,15,1.236 +AB,0.6,-0.01,12.1,25,1.619 +AB,0.6,-0.01,12.1,35,2.454 +AB,0.6,-0.01,18,-15,3.254 +AB,0.6,-0.01,18,-5,2.339 +AB,0.6,-0.01,18,5,1.526 +AB,0.6,-0.01,18,15,1.012 +AB,0.6,-0.01,18,25,1.268 +AB,0.6,-0.01,18,35,1.819 +AB,0.6,-0.01,25.2,-15,2.268 +AB,0.6,-0.01,25.2,-5,1.73 +AB,0.6,-0.01,25.2,5,1.235 +AB,0.6,-0.01,25.2,15,0.925 +AB,0.6,-0.01,25.2,25,1.107 +AB,0.6,-0.01,25.2,35,1.469 +AB,0.6,-0.01,30,-15,1.906 +AB,0.6,-0.01,30,-5,1.461 +AB,0.6,-0.01,30,5,1.048 +AB,0.6,-0.01,30,15,0.787 +AB,0.6,-0.01,30,25,0.937 +AB,0.6,-0.01,30,35,1.238 +AB,0.6,-0.01,37.1,-15,1.595 +AB,0.6,-0.01,37.1,-5,1.22 +AB,0.6,-0.01,37.1,5,0.874 +AB,0.6,-0.01,37.1,15,0.65 +AB,0.6,-0.01,37.1,25,0.768 +AB,0.6,-0.01,37.1,35,1.012 +AB,0.6,0,12.1,-15,5.453 +AB,0.6,0,12.1,-5,4.022 +AB,0.6,0,12.1,5,2.768 +AB,0.6,0,12.1,15,1.976 +AB,0.6,0,12.1,25,2.36 +AB,0.6,0,12.1,35,3.195 +AB,0.6,0,18,-15,4.017 +AB,0.6,0,18,-5,3.101 +AB,0.6,0,18,5,2.289 +AB,0.6,0,18,15,1.774 +AB,0.6,0,18,25,2.031 +AB,0.6,0,18,35,2.581 +AB,0.6,0,25.2,-15,3.037 +AB,0.6,0,25.2,-5,2.5 +AB,0.6,0,25.2,5,2.005 +AB,0.6,0,25.2,15,1.694 +AB,0.6,0,25.2,25,1.876 +AB,0.6,0,25.2,35,2.238 +AB,0.6,0,30,-15,2.696 +AB,0.6,0,30,-5,2.251 +AB,0.6,0,30,5,1.838 +AB,0.6,0,30,15,1.577 +AB,0.6,0,30,25,1.727 +AB,0.6,0,30,35,2.028 +AB,0.6,0,37.1,-15,2.406 +AB,0.6,0,37.1,-5,2.031 +AB,0.6,0,37.1,5,1.685 +AB,0.6,0,37.1,15,1.461 +AB,0.6,0,37.1,25,1.579 +AB,0.6,0,37.1,35,1.824 +AB,0.6,0.01,12.1,-15,6.194 +AB,0.6,0.01,12.1,-5,4.764 +AB,0.6,0.01,12.1,5,3.51 +AB,0.6,0.01,12.1,15,2.718 +AB,0.6,0.01,12.1,25,3.102 +AB,0.6,0.01,12.1,35,3.937 +AB,0.6,0.01,18,-15,4.781 +AB,0.6,0.01,18,-5,3.866 +AB,0.6,0.01,18,5,3.054 +AB,0.6,0.01,18,15,2.539 +AB,0.6,0.01,18,25,2.796 +AB,0.6,0.01,18,35,3.346 +AB,0.6,0.01,25.2,-15,3.807 +AB,0.6,0.01,25.2,-5,3.27 +AB,0.6,0.01,25.2,5,2.775 +AB,0.6,0.01,25.2,15,2.465 +AB,0.6,0.01,25.2,25,2.646 +AB,0.6,0.01,25.2,35,3.009 +AB,0.6,0.01,30,-15,3.486 +AB,0.6,0.01,30,-5,3.041 +AB,0.6,0.01,30,5,2.628 +AB,0.6,0.01,30,15,2.367 +AB,0.6,0.01,30,25,2.517 +AB,0.6,0.01,30,35,2.818 +AB,0.6,0.01,37.1,-15,3.218 +AB,0.6,0.01,37.1,-5,2.843 +AB,0.6,0.01,37.1,5,2.496 +AB,0.6,0.01,37.1,15,2.272 +AB,0.6,0.01,37.1,25,2.391 +AB,0.6,0.01,37.1,35,2.635 +AB,0.6,0.02,12.1,-15,6.936 +AB,0.6,0.02,12.1,-5,5.506 +AB,0.6,0.02,12.1,5,4.252 +AB,0.6,0.02,12.1,15,3.46 +AB,0.6,0.02,12.1,25,3.843 +AB,0.6,0.02,12.1,35,4.678 +AB,0.6,0.02,18,-15,5.546 +AB,0.6,0.02,18,-5,4.63 +AB,0.6,0.02,18,5,3.818 +AB,0.6,0.02,18,15,3.303 +AB,0.6,0.02,18,25,3.56 +AB,0.6,0.02,18,35,4.11 +AB,0.6,0.02,25.2,-15,4.577 +AB,0.6,0.02,25.2,-5,4.04 +AB,0.6,0.02,25.2,5,3.545 +AB,0.6,0.02,25.2,15,3.235 +AB,0.6,0.02,25.2,25,3.416 +AB,0.6,0.02,25.2,35,3.779 +AB,0.6,0.02,30,-15,4.276 +AB,0.6,0.02,30,-5,3.831 +AB,0.6,0.02,30,5,3.418 +AB,0.6,0.02,30,15,3.157 +AB,0.6,0.02,30,25,3.307 +AB,0.6,0.02,30,35,3.608 +AB,0.6,0.02,37.1,-15,4.03 +AB,0.6,0.02,37.1,-5,3.655 +AB,0.6,0.02,37.1,5,3.308 +AB,0.6,0.02,37.1,15,3.084 +AB,0.6,0.02,37.1,25,3.203 +AB,0.6,0.02,37.1,35,3.447 +AB,0.6,0.03,12.1,-15,7.678 +AB,0.6,0.03,12.1,-5,6.247 +AB,0.6,0.03,12.1,5,4.993 +AB,0.6,0.03,12.1,15,4.202 +AB,0.6,0.03,12.1,25,4.585 +AB,0.6,0.03,12.1,35,5.42 +AB,0.6,0.03,18,-15,6.31 +AB,0.6,0.03,18,-5,5.394 +AB,0.6,0.03,18,5,4.582 +AB,0.6,0.03,18,15,4.068 +AB,0.6,0.03,18,25,4.324 +AB,0.6,0.03,18,35,4.874 +AB,0.6,0.03,25.2,-15,5.348 +AB,0.6,0.03,25.2,-5,4.811 +AB,0.6,0.03,25.2,5,4.316 +AB,0.6,0.03,25.2,15,4.006 +AB,0.6,0.03,25.2,25,4.187 +AB,0.6,0.03,25.2,35,4.55 +AB,0.6,0.03,30,-15,5.067 +AB,0.6,0.03,30,-5,4.622 +AB,0.6,0.03,30,5,4.209 +AB,0.6,0.03,30,15,3.948 +AB,0.6,0.03,30,25,4.098 +AB,0.6,0.03,30,35,4.399 +AB,0.6,0.03,37.1,-15,4.842 +AB,0.6,0.03,37.1,-5,4.467 +AB,0.6,0.03,37.1,5,4.12 +AB,0.6,0.03,37.1,15,3.896 +AB,0.6,0.03,37.1,25,4.015 +AB,0.6,0.03,37.1,35,4.259 +AB,0.6,0.04,12.1,-15,8.419 +AB,0.6,0.04,12.1,-5,6.989 +AB,0.6,0.04,12.1,5,5.735 +AB,0.6,0.04,12.1,15,4.943 +AB,0.6,0.04,12.1,25,5.326 +AB,0.6,0.04,12.1,35,6.162 +AB,0.6,0.04,18,-15,7.074 +AB,0.6,0.04,18,-5,6.159 +AB,0.6,0.04,18,5,5.347 +AB,0.6,0.04,18,15,4.832 +AB,0.6,0.04,18,25,5.089 +AB,0.6,0.04,18,35,5.639 +AB,0.6,0.04,25.2,-15,6.12 +AB,0.6,0.04,25.2,-5,5.582 +AB,0.6,0.04,25.2,5,5.087 +AB,0.6,0.04,25.2,15,4.777 +AB,0.6,0.04,25.2,25,4.958 +AB,0.6,0.04,25.2,35,5.321 +AB,0.6,0.04,30,-15,5.858 +AB,0.6,0.04,30,-5,5.413 +AB,0.6,0.04,30,5,5 +AB,0.6,0.04,30,15,4.739 +AB,0.6,0.04,30,25,4.889 +AB,0.6,0.04,30,35,5.19 +AB,0.6,0.04,37.1,-15,5.654 +AB,0.6,0.04,37.1,-5,5.279 +AB,0.6,0.04,37.1,5,4.932 +AB,0.6,0.04,37.1,15,4.708 +AB,0.6,0.04,37.1,25,4.827 +AB,0.6,0.04,37.1,35,5.071 +AB,0.9,-0.04,12.1,-15,2.318 +AB,0.9,-0.04,12.1,-5,0.888 +AB,0.9,-0.04,12.1,5,-0.366 +AB,0.9,-0.04,12.1,15,-0.786 +AB,0.9,-0.04,12.1,25,-0.289 +AB,0.9,-0.04,12.1,35,0.63 +AB,0.9,-0.04,18,-15,0.89 +AB,0.9,-0.04,18,-5,-0.025 +AB,0.9,-0.04,18,5,-0.836 +AB,0.9,-0.04,18,15,-1.097 +AB,0.9,-0.04,18,25,-0.764 +AB,0.9,-0.04,18,35,-0.157 +AB,0.9,-0.04,25.2,-15,-0.099 +AB,0.9,-0.04,25.2,-5,-0.635 +AB,0.9,-0.04,25.2,5,-1.129 +AB,0.9,-0.04,25.2,15,-1.254 +AB,0.9,-0.04,25.2,25,-1.022 +AB,0.9,-0.04,25.2,35,-0.618 +AB,0.9,-0.04,30,-15,-0.4 +AB,0.9,-0.04,30,-5,-0.843 +AB,0.9,-0.04,30,5,-1.254 +AB,0.9,-0.04,30,15,-1.359 +AB,0.9,-0.04,30,25,-1.166 +AB,0.9,-0.04,30,35,-0.829 +AB,0.9,-0.04,37.1,-15,-0.654 +AB,0.9,-0.04,37.1,-5,-1.026 +AB,0.9,-0.04,37.1,5,-1.37 +AB,0.9,-0.04,37.1,15,-1.466 +AB,0.9,-0.04,37.1,25,-1.311 +AB,0.9,-0.04,37.1,35,-1.037 +AB,0.9,-0.03,12.1,-15,3.022 +AB,0.9,-0.03,12.1,-5,1.592 +AB,0.9,-0.03,12.1,5,0.338 +AB,0.9,-0.03,12.1,15,-0.082 +AB,0.9,-0.03,12.1,25,0.415 +AB,0.9,-0.03,12.1,35,1.334 +AB,0.9,-0.03,18,-15,1.61 +AB,0.9,-0.03,18,-5,0.696 +AB,0.9,-0.03,18,5,-0.115 +AB,0.9,-0.03,18,15,-0.377 +AB,0.9,-0.03,18,25,-0.044 +AB,0.9,-0.03,18,35,0.563 +AB,0.9,-0.03,25.2,-15,0.642 +AB,0.9,-0.03,25.2,-5,0.106 +AB,0.9,-0.03,25.2,5,-0.388 +AB,0.9,-0.03,25.2,15,-0.513 +AB,0.9,-0.03,25.2,25,-0.281 +AB,0.9,-0.03,25.2,35,0.122 +AB,0.9,-0.03,30,-15,0.316 +AB,0.9,-0.03,30,-5,-0.127 +AB,0.9,-0.03,30,5,-0.538 +AB,0.9,-0.03,30,15,-0.643 +AB,0.9,-0.03,30,25,-0.45 +AB,0.9,-0.03,30,35,-0.113 +AB,0.9,-0.03,37.1,-15,0.037 +AB,0.9,-0.03,37.1,-5,-0.335 +AB,0.9,-0.03,37.1,5,-0.678 +AB,0.9,-0.03,37.1,15,-0.775 +AB,0.9,-0.03,37.1,25,-0.62 +AB,0.9,-0.03,37.1,35,-0.346 +AB,0.9,-0.02,12.1,-15,3.726 +AB,0.9,-0.02,12.1,-5,2.296 +AB,0.9,-0.02,12.1,5,1.042 +AB,0.9,-0.02,12.1,15,0.622 +AB,0.9,-0.02,12.1,25,1.119 +AB,0.9,-0.02,12.1,35,2.038 +AB,0.9,-0.02,18,-15,2.33 +AB,0.9,-0.02,18,-5,1.416 +AB,0.9,-0.02,18,5,0.605 +AB,0.9,-0.02,18,15,0.343 +AB,0.9,-0.02,18,25,0.676 +AB,0.9,-0.02,18,35,1.283 +AB,0.9,-0.02,25.2,-15,1.383 +AB,0.9,-0.02,25.2,-5,0.847 +AB,0.9,-0.02,25.2,5,0.353 +AB,0.9,-0.02,25.2,15,0.228 +AB,0.9,-0.02,25.2,25,0.46 +AB,0.9,-0.02,25.2,35,0.864 +AB,0.9,-0.02,30,-15,1.032 +AB,0.9,-0.02,30,-5,0.589 +AB,0.9,-0.02,30,5,0.178 +AB,0.9,-0.02,30,15,0.074 +AB,0.9,-0.02,30,25,0.267 +AB,0.9,-0.02,30,35,0.603 +AB,0.9,-0.02,37.1,-15,0.728 +AB,0.9,-0.02,37.1,-5,0.357 +AB,0.9,-0.02,37.1,5,0.013 +AB,0.9,-0.02,37.1,15,-0.084 +AB,0.9,-0.02,37.1,25,0.071 +AB,0.9,-0.02,37.1,35,0.345 +AB,0.9,-0.01,12.1,-15,4.442 +AB,0.9,-0.01,12.1,-5,3.012 +AB,0.9,-0.01,12.1,5,1.758 +AB,0.9,-0.01,12.1,15,1.337 +AB,0.9,-0.01,12.1,25,1.834 +AB,0.9,-0.01,12.1,35,2.753 +AB,0.9,-0.01,18,-15,3.081 +AB,0.9,-0.01,18,-5,2.166 +AB,0.9,-0.01,18,5,1.354 +AB,0.9,-0.01,18,15,1.091 +AB,0.9,-0.01,18,25,1.423 +AB,0.9,-0.01,18,35,2.029 +AB,0.9,-0.01,25.2,-15,2.158 +AB,0.9,-0.01,25.2,-5,1.621 +AB,0.9,-0.01,25.2,5,1.126 +AB,0.9,-0.01,25.2,15,1 +AB,0.9,-0.01,25.2,25,1.231 +AB,0.9,-0.01,25.2,35,1.634 +AB,0.9,-0.01,30,-15,1.807 +AB,0.9,-0.01,30,-5,1.362 +AB,0.9,-0.01,30,5,0.949 +AB,0.9,-0.01,30,15,0.843 +AB,0.9,-0.01,30,25,1.034 +AB,0.9,-0.01,30,35,1.369 +AB,0.9,-0.01,37.1,-15,1.505 +AB,0.9,-0.01,37.1,-5,1.13 +AB,0.9,-0.01,37.1,5,0.783 +AB,0.9,-0.01,37.1,15,0.684 +AB,0.9,-0.01,37.1,25,0.836 +AB,0.9,-0.01,37.1,35,1.108 +AB,0.9,0,12.1,-15,5.264 +AB,0.9,0,12.1,-5,3.834 +AB,0.9,0,12.1,5,2.58 +AB,0.9,0,12.1,15,2.159 +AB,0.9,0,12.1,25,2.656 +AB,0.9,0,12.1,35,3.574 +AB,0.9,0,18,-15,3.927 +AB,0.9,0,18,-5,3.012 +AB,0.9,0,18,5,2.2 +AB,0.9,0,18,15,1.937 +AB,0.9,0,18,25,2.269 +AB,0.9,0,18,35,2.875 +AB,0.9,0,25.2,-15,3.012 +AB,0.9,0,25.2,-5,2.475 +AB,0.9,0,25.2,5,1.98 +AB,0.9,0,25.2,15,1.854 +AB,0.9,0,25.2,25,2.084 +AB,0.9,0,25.2,35,2.487 +AB,0.9,0,30,-15,2.683 +AB,0.9,0,30,-5,2.238 +AB,0.9,0,30,5,1.825 +AB,0.9,0,30,15,1.719 +AB,0.9,0,30,25,1.91 +AB,0.9,0,30,35,2.245 +AB,0.9,0,37.1,-15,2.405 +AB,0.9,0,37.1,-5,2.03 +AB,0.9,0,37.1,5,1.684 +AB,0.9,0,37.1,15,1.584 +AB,0.9,0,37.1,25,1.736 +AB,0.9,0,37.1,35,2.008 +AB,0.9,0.01,12.1,-15,6.087 +AB,0.9,0.01,12.1,-5,4.657 +AB,0.9,0.01,12.1,5,3.403 +AB,0.9,0.01,12.1,15,2.982 +AB,0.9,0.01,12.1,25,3.479 +AB,0.9,0.01,12.1,35,4.397 +AB,0.9,0.01,18,-15,4.776 +AB,0.9,0.01,18,-5,3.86 +AB,0.9,0.01,18,5,3.048 +AB,0.9,0.01,18,15,2.786 +AB,0.9,0.01,18,25,3.117 +AB,0.9,0.01,18,35,3.724 +AB,0.9,0.01,25.2,-15,3.867 +AB,0.9,0.01,25.2,-5,3.329 +AB,0.9,0.01,25.2,5,2.834 +AB,0.9,0.01,25.2,15,2.708 +AB,0.9,0.01,25.2,25,2.939 +AB,0.9,0.01,25.2,35,3.342 +AB,0.9,0.01,30,-15,3.56 +AB,0.9,0.01,30,-5,3.115 +AB,0.9,0.01,30,5,2.702 +AB,0.9,0.01,30,15,2.596 +AB,0.9,0.01,30,25,2.787 +AB,0.9,0.01,30,35,3.122 +AB,0.9,0.01,37.1,-15,3.306 +AB,0.9,0.01,37.1,-5,2.931 +AB,0.9,0.01,37.1,5,2.584 +AB,0.9,0.01,37.1,15,2.484 +AB,0.9,0.01,37.1,25,2.637 +AB,0.9,0.01,37.1,35,2.908 +AB,0.9,0.02,12.1,-15,6.91 +AB,0.9,0.02,12.1,-5,5.48 +AB,0.9,0.02,12.1,5,4.226 +AB,0.9,0.02,12.1,15,3.805 +AB,0.9,0.02,12.1,25,4.302 +AB,0.9,0.02,12.1,35,5.22 +AB,0.9,0.02,18,-15,5.624 +AB,0.9,0.02,18,-5,4.708 +AB,0.9,0.02,18,5,3.896 +AB,0.9,0.02,18,15,3.634 +AB,0.9,0.02,18,25,3.965 +AB,0.9,0.02,18,35,4.572 +AB,0.9,0.02,25.2,-15,4.721 +AB,0.9,0.02,25.2,-5,4.184 +AB,0.9,0.02,25.2,5,3.689 +AB,0.9,0.02,25.2,15,3.563 +AB,0.9,0.02,25.2,25,3.793 +AB,0.9,0.02,25.2,35,4.196 +AB,0.9,0.02,30,-15,4.437 +AB,0.9,0.02,30,-5,3.992 +AB,0.9,0.02,30,5,3.579 +AB,0.9,0.02,30,15,3.473 +AB,0.9,0.02,30,25,3.664 +AB,0.9,0.02,30,35,3.999 +AB,0.9,0.02,37.1,-15,4.207 +AB,0.9,0.02,37.1,-5,3.832 +AB,0.9,0.02,37.1,5,3.485 +AB,0.9,0.02,37.1,15,3.385 +AB,0.9,0.02,37.1,25,3.538 +AB,0.9,0.02,37.1,35,3.809 +AB,0.9,0.03,12.1,-15,7.733 +AB,0.9,0.03,12.1,-5,6.303 +AB,0.9,0.03,12.1,5,5.049 +AB,0.9,0.03,12.1,15,4.628 +AB,0.9,0.03,12.1,25,5.125 +AB,0.9,0.03,12.1,35,6.043 +AB,0.9,0.03,18,-15,6.472 +AB,0.9,0.03,18,-5,5.556 +AB,0.9,0.03,18,5,4.744 +AB,0.9,0.03,18,15,4.482 +AB,0.9,0.03,18,25,4.813 +AB,0.9,0.03,18,35,5.42 +AB,0.9,0.03,25.2,-15,5.576 +AB,0.9,0.03,25.2,-5,5.039 +AB,0.9,0.03,25.2,5,4.544 +AB,0.9,0.03,25.2,15,4.418 +AB,0.9,0.03,25.2,25,4.649 +AB,0.9,0.03,25.2,35,5.052 +AB,0.9,0.03,30,-15,5.314 +AB,0.9,0.03,30,-5,4.869 +AB,0.9,0.03,30,5,4.456 +AB,0.9,0.03,30,15,4.35 +AB,0.9,0.03,30,25,4.541 +AB,0.9,0.03,30,35,4.876 +AB,0.9,0.03,37.1,-15,5.108 +AB,0.9,0.03,37.1,-5,4.733 +AB,0.9,0.03,37.1,5,4.386 +AB,0.9,0.03,37.1,15,4.286 +AB,0.9,0.03,37.1,25,4.439 +AB,0.9,0.03,37.1,35,4.71 +AB,0.9,0.04,12.1,-15,8.556 +AB,0.9,0.04,12.1,-5,7.126 +AB,0.9,0.04,12.1,5,5.871 +AB,0.9,0.04,12.1,15,5.451 +AB,0.9,0.04,12.1,25,5.948 +AB,0.9,0.04,12.1,35,6.866 +AB,0.9,0.04,18,-15,7.32 +AB,0.9,0.04,18,-5,6.404 +AB,0.9,0.04,18,5,5.592 +AB,0.9,0.04,18,15,5.33 +AB,0.9,0.04,18,25,5.661 +AB,0.9,0.04,18,35,6.268 +AB,0.9,0.04,25.2,-15,6.432 +AB,0.9,0.04,25.2,-5,5.895 +AB,0.9,0.04,25.2,5,5.4 +AB,0.9,0.04,25.2,15,5.274 +AB,0.9,0.04,25.2,25,5.505 +AB,0.9,0.04,25.2,35,5.907 +AB,0.9,0.04,30,-15,6.192 +AB,0.9,0.04,30,-5,5.747 +AB,0.9,0.04,30,5,5.334 +AB,0.9,0.04,30,15,5.228 +AB,0.9,0.04,30,25,5.419 +AB,0.9,0.04,30,35,5.754 +AB,0.9,0.04,37.1,-15,6.008 +AB,0.9,0.04,37.1,-5,5.633 +AB,0.9,0.04,37.1,5,5.287 +AB,0.9,0.04,37.1,15,5.187 +AB,0.9,0.04,37.1,25,5.34 +AB,0.9,0.04,37.1,35,5.611 diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 22bb5902..4036a2c2 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,20,0 -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,-5,0.9 -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,, -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,, -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,, -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,, -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,, -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,, -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,, -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,, -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,, -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,, -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,, \ No newline at end of file +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0 +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9 +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,, +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,, +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,, +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,, +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,, +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,, +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,, +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,, +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,, +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,, \ No newline at end of file diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 65d00bf4..8e3a8ac6 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -6,7 +6,8 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "v2g_power_factor": 0.5 + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" }, "oppb": { "name": "articulated bus - opportunity charging", @@ -14,7 +15,8 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "v2g_power_factor": 0.5 + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" } }, "CKB": { diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 5bbdb47a..87f63025 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -76,7 +76,7 @@ default='data/examples/electrified_stations.json') parser.add_argument('--cost-calculation', '-cc', action='store_true', help='Calculate costs') - parser.add_argument('--cost-parameters-file', help='include cost_params json', default=None) + parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) parser.add_argument('--pv-power', type=int, default=0, help='set nominal power for local ' 'photovoltaic power plant in kWp') parser.add_argument('--min-charging-time', help='define minimum time of charging', @@ -145,8 +145,8 @@ copy_list = [args.config, args.electrified_stations, args.vehicle_types] # only copy cost params if they exist - if args.cost_params is not None: - copy_list.append(args.cost_params) + if args.cost_parameters_file is not None: + copy_list.append(args.cost_parameters_file) for c_file in copy_list: shutil.copy(str(c_file), str(args.output_directory / Path(c_file).name)) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index c2f32fe6..b8f2302c 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,4 +1,3 @@ -import os import warnings from calculate_costs import calculate_costs as calc_costs_spice_ev @@ -48,6 +47,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_vehicles"] += c_vehicles_vt # calculate annual cost of vehicles of this type, depending on their lifetime costs["c_vehicles_annual"] += c_vehicles_vt / c_params["vehicles"][v_type]["lifetime"] + # GRID CONNECTION POINTS gcs = schedule.scenario["constants"]["grid_connectors"] for gcID, gc_keys in gcs.items(): @@ -85,6 +85,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_garage_annual"] = (costs["c_garage_cs"] / c_params["cs"]["lifetime_cs"] + costs["c_garage_workstations"] / c_params["garage"]["lifetime_workstations"]) + # MAINTENANCE costs["c_maint_infrastructure_annual"] = (costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] + c_transformer * @@ -114,13 +115,6 @@ def calculate_costs(c_params, scenario, schedule, args): if pv.parent == gcID]) timeseries = vars(scenario).get(f"{gcID}_timeseries") - # Todo: Decide, if costs are saved to json here or later in report.py. - # If so, the following three lines can be removed - # add GC name to results file for cost calculation - file_name, ext = os.path.splitext(args.save_results) - save_results = f"{file_name}_{gcID}{ext}" - - # Todo: Decide, if currently unnecessary params should be given to calc_costs_spice_ev # calculate costs for electricity costs_electricity = calc_costs_spice_ev( strategy=args.strategy, @@ -133,7 +127,6 @@ def calculate_costs(c_params, scenario, schedule, args): charging_signal_list=timeseries.get("window"), core_standing_time_dict=scenario.core_standing_time, price_sheet_json=args.cost_parameters_file, - results_json=save_results, power_pv_nominal=pv, ) # ToDo: Decide if gc-specific costs should be added to scenario object to use in report.py From b078120544965c72628c6f0d5f93eba182092dc2 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 25 Nov 2022 11:36:43 +0100 Subject: [PATCH 333/802] make only vehicle types in examples SB and AB in all files --- data/examples/cost_params.json | 5 + data/examples/energy_consumption_example.csv | 2160 +++++++++--------- data/examples/vehicle_types.json | 26 +- 3 files changed, 1088 insertions(+), 1103 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 05152f57..87d35ec6 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -5,6 +5,11 @@ "c_maint_per_km": 0.24, "lifetime": 14 }, + "SB_oppb": { + "capex": 420000, + "c_maint_per_km": 0.24, + "lifetime": 14 + }, "AB_depb": { "capex": 600000, "c_maint_per_km": 0.3, diff --git a/data/examples/energy_consumption_example.csv b/data/examples/energy_consumption_example.csv index d7125a3e..a4b73d62 100644 --- a/data/examples/energy_consumption_example.csv +++ b/data/examples/energy_consumption_example.csv @@ -1,1084 +1,1084 @@ vehicle_type,level_of_loading,incline,mean_speed_kmh,t_amb,consumption_kwh_per_km -VDL,0,-0.04,12.1,-15,2.967 -VDL,0,-0.04,12.1,-5,1.823 -VDL,0,-0.04,12.1,5,0.844 -VDL,0,-0.04,12.1,15,0.034 -VDL,0,-0.04,12.1,25,-0.181 -VDL,0,-0.04,12.1,35,0.314 -VDL,0,-0.04,18,-15,1.658 -VDL,0,-0.04,18,-5,0.939 -VDL,0,-0.04,18,5,0.317 -VDL,0,-0.04,18,15,-0.208 -VDL,0,-0.04,18,25,-0.353 -VDL,0,-0.04,18,35,-0.034 -VDL,0,-0.04,25.2,-15,0.724 -VDL,0,-0.04,25.2,-5,0.33 -VDL,0,-0.04,25.2,5,-0.026 -VDL,0,-0.04,25.2,15,-0.347 -VDL,0,-0.04,25.2,25,-0.445 -VDL,0,-0.04,25.2,35,-0.248 -VDL,0,-0.04,30,-15,0.476 -VDL,0,-0.04,30,-5,0.153 -VDL,0,-0.04,30,5,-0.141 -VDL,0,-0.04,30,15,-0.408 -VDL,0,-0.04,30,25,-0.492 -VDL,0,-0.04,30,35,-0.33 -VDL,0,-0.04,37.1,-15,0.281 -VDL,0,-0.04,37.1,-5,0.008 -VDL,0,-0.04,37.1,5,-0.241 -VDL,0,-0.04,37.1,15,-0.465 -VDL,0,-0.04,37.1,25,-0.536 -VDL,0,-0.04,37.1,35,-0.404 -VDL,0,-0.03,12.1,-15,3.297 -VDL,0,-0.03,12.1,-5,2.153 -VDL,0,-0.03,12.1,5,1.175 -VDL,0,-0.03,12.1,15,0.365 -VDL,0,-0.03,12.1,25,0.149 -VDL,0,-0.03,12.1,35,0.644 -VDL,0,-0.03,18,-15,1.996 -VDL,0,-0.03,18,-5,1.277 -VDL,0,-0.03,18,5,0.654 -VDL,0,-0.03,18,15,0.13 -VDL,0,-0.03,18,25,-0.015 -VDL,0,-0.03,18,35,0.304 -VDL,0,-0.03,25.2,-15,1.072 -VDL,0,-0.03,25.2,-5,0.678 -VDL,0,-0.03,25.2,5,0.321 -VDL,0,-0.03,25.2,15,0.001 -VDL,0,-0.03,25.2,25,-0.097 -VDL,0,-0.03,25.2,35,0.099 -VDL,0,-0.03,30,-15,0.812 -VDL,0,-0.03,30,-5,0.489 -VDL,0,-0.03,30,5,0.195 -VDL,0,-0.03,30,15,-0.072 -VDL,0,-0.03,30,25,-0.156 -VDL,0,-0.03,30,35,0.006 -VDL,0,-0.03,37.1,-15,0.606 -VDL,0,-0.03,37.1,-5,0.332 -VDL,0,-0.03,37.1,5,0.084 -VDL,0,-0.03,37.1,15,-0.14 -VDL,0,-0.03,37.1,25,-0.212 -VDL,0,-0.03,37.1,35,-0.08 -VDL,0,-0.02,12.1,-15,3.628 -VDL,0,-0.02,12.1,-5,2.484 -VDL,0,-0.02,12.1,5,1.505 -VDL,0,-0.02,12.1,15,0.695 -VDL,0,-0.02,12.1,25,0.48 -VDL,0,-0.02,12.1,35,0.974 -VDL,0,-0.02,18,-15,2.334 -VDL,0,-0.02,18,-5,1.615 -VDL,0,-0.02,18,5,0.992 -VDL,0,-0.02,18,15,0.467 -VDL,0,-0.02,18,25,0.322 -VDL,0,-0.02,18,35,0.642 -VDL,0,-0.02,25.2,-15,1.42 -VDL,0,-0.02,25.2,-5,1.026 -VDL,0,-0.02,25.2,5,0.669 -VDL,0,-0.02,25.2,15,0.349 -VDL,0,-0.02,25.2,25,0.251 -VDL,0,-0.02,25.2,35,0.447 -VDL,0,-0.02,30,-15,1.148 -VDL,0,-0.02,30,-5,0.826 -VDL,0,-0.02,30,5,0.531 -VDL,0,-0.02,30,15,0.264 -VDL,0,-0.02,30,25,0.18 -VDL,0,-0.02,30,35,0.342 -VDL,0,-0.02,37.1,-15,0.93 -VDL,0,-0.02,37.1,-5,0.657 -VDL,0,-0.02,37.1,5,0.408 -VDL,0,-0.02,37.1,15,0.184 -VDL,0,-0.02,37.1,25,0.113 -VDL,0,-0.02,37.1,35,0.245 -VDL,0,-0.01,12.1,-15,3.97 -VDL,0,-0.01,12.1,-5,2.826 -VDL,0,-0.01,12.1,5,1.847 -VDL,0,-0.01,12.1,15,1.036 -VDL,0,-0.01,12.1,25,0.82 -VDL,0,-0.01,12.1,35,1.315 -VDL,0,-0.01,18,-15,2.702 -VDL,0,-0.01,18,-5,1.982 -VDL,0,-0.01,18,5,1.358 -VDL,0,-0.01,18,15,0.833 -VDL,0,-0.01,18,25,0.687 -VDL,0,-0.01,18,35,1.005 -VDL,0,-0.01,25.2,-15,1.8 -VDL,0,-0.01,25.2,-5,1.406 -VDL,0,-0.01,25.2,5,1.048 -VDL,0,-0.01,25.2,15,0.726 -VDL,0,-0.01,25.2,25,0.627 -VDL,0,-0.01,25.2,35,0.823 -VDL,0,-0.01,30,-15,1.541 -VDL,0,-0.01,30,-5,1.217 -VDL,0,-0.01,30,5,0.92 -VDL,0,-0.01,30,15,0.651 -VDL,0,-0.01,30,25,0.566 -VDL,0,-0.01,30,35,0.726 -VDL,0,-0.01,37.1,-15,1.338 -VDL,0,-0.01,37.1,-5,1.062 -VDL,0,-0.01,37.1,5,0.81 -VDL,0,-0.01,37.1,15,0.583 -VDL,0,-0.01,37.1,25,0.51 -VDL,0,-0.01,37.1,35,0.639 -VDL,0,0,12.1,-15,4.356 -VDL,0,0,12.1,-5,3.211 -VDL,0,0,12.1,5,2.232 -VDL,0,0,12.1,15,1.422 -VDL,0,0,12.1,25,1.206 -VDL,0,0,12.1,35,1.7 -VDL,0,0,18,-15,3.099 -VDL,0,0,18,-5,2.379 -VDL,0,0,18,5,1.756 -VDL,0,0,18,15,1.23 -VDL,0,0,18,25,1.084 -VDL,0,0,18,35,1.402 -VDL,0,0,25.2,-15,2.201 -VDL,0,0,25.2,-5,1.806 -VDL,0,0,25.2,5,1.448 -VDL,0,0,25.2,15,1.127 -VDL,0,0,25.2,25,1.028 -VDL,0,0,25.2,35,1.223 -VDL,0,0,30,-15,1.953 -VDL,0,0,30,-5,1.628 -VDL,0,0,30,5,1.331 -VDL,0,0,30,15,1.062 -VDL,0,0,30,25,0.977 -VDL,0,0,30,35,1.137 -VDL,0,0,37.1,-15,1.76 -VDL,0,0,37.1,-5,1.484 -VDL,0,0,37.1,5,1.232 -VDL,0,0,37.1,15,1.006 -VDL,0,0,37.1,25,0.932 -VDL,0,0,37.1,35,1.062 -VDL,0,0.01,12.1,-15,4.742 -VDL,0,0.01,12.1,-5,3.597 -VDL,0,0.01,12.1,5,2.618 -VDL,0,0.01,12.1,15,1.808 -VDL,0,0.01,12.1,25,1.592 -VDL,0,0.01,12.1,35,2.087 -VDL,0,0.01,18,-15,3.497 -VDL,0,0.01,18,-5,2.777 -VDL,0,0.01,18,5,2.154 -VDL,0,0.01,18,15,1.628 -VDL,0,0.01,18,25,1.482 -VDL,0,0.01,18,35,1.8 -VDL,0,0.01,25.2,-15,2.602 -VDL,0,0.01,25.2,-5,2.207 -VDL,0,0.01,25.2,5,1.849 -VDL,0,0.01,25.2,15,1.528 -VDL,0,0.01,25.2,25,1.429 -VDL,0,0.01,25.2,35,1.624 -VDL,0,0.01,30,-15,2.364 -VDL,0,0.01,30,-5,2.039 -VDL,0,0.01,30,5,1.743 -VDL,0,0.01,30,15,1.474 -VDL,0,0.01,30,25,1.388 -VDL,0,0.01,30,35,1.548 -VDL,0,0.01,37.1,-15,2.183 -VDL,0,0.01,37.1,-5,1.907 -VDL,0,0.01,37.1,5,1.655 -VDL,0,0.01,37.1,15,1.428 -VDL,0,0.01,37.1,25,1.354 -VDL,0,0.01,37.1,35,1.484 -VDL,0,0.02,12.1,-15,5.128 -VDL,0,0.02,12.1,-5,3.983 -VDL,0,0.02,12.1,5,3.005 -VDL,0,0.02,12.1,15,2.194 -VDL,0,0.02,12.1,25,1.978 -VDL,0,0.02,12.1,35,2.473 -VDL,0,0.02,18,-15,3.895 -VDL,0,0.02,18,-5,3.175 -VDL,0,0.02,18,5,2.551 -VDL,0,0.02,18,15,2.026 -VDL,0,0.02,18,25,1.88 -VDL,0,0.02,18,35,2.198 -VDL,0,0.02,25.2,-15,3.003 -VDL,0,0.02,25.2,-5,2.608 -VDL,0,0.02,25.2,5,2.25 -VDL,0,0.02,25.2,15,1.928 -VDL,0,0.02,25.2,25,1.83 -VDL,0,0.02,25.2,35,2.025 -VDL,0,0.02,30,-15,2.775 -VDL,0,0.02,30,-5,2.451 -VDL,0,0.02,30,5,2.154 -VDL,0,0.02,30,15,1.885 -VDL,0,0.02,30,25,1.8 -VDL,0,0.02,30,35,1.96 -VDL,0,0.02,37.1,-15,2.606 -VDL,0,0.02,37.1,-5,2.329 -VDL,0,0.02,37.1,5,2.078 -VDL,0,0.02,37.1,15,1.851 -VDL,0,0.02,37.1,25,1.777 -VDL,0,0.02,37.1,35,1.907 -VDL,0,0.03,12.1,-15,5.514 -VDL,0,0.03,12.1,-5,4.37 -VDL,0,0.03,12.1,5,3.391 -VDL,0,0.03,12.1,15,2.58 -VDL,0,0.03,12.1,25,2.364 -VDL,0,0.03,12.1,35,2.859 -VDL,0,0.03,18,-15,4.293 -VDL,0,0.03,18,-5,3.573 -VDL,0,0.03,18,5,2.949 -VDL,0,0.03,18,15,2.424 -VDL,0,0.03,18,25,2.278 -VDL,0,0.03,18,35,2.596 -VDL,0,0.03,25.2,-15,3.405 -VDL,0,0.03,25.2,-5,3.01 -VDL,0,0.03,25.2,5,2.652 -VDL,0,0.03,25.2,15,2.33 -VDL,0,0.03,25.2,25,2.231 -VDL,0,0.03,25.2,35,2.427 -VDL,0,0.03,30,-15,3.187 -VDL,0,0.03,30,-5,2.862 -VDL,0,0.03,30,5,2.566 -VDL,0,0.03,30,15,2.297 -VDL,0,0.03,30,25,2.211 -VDL,0,0.03,30,35,2.371 -VDL,0,0.03,37.1,-15,3.028 -VDL,0,0.03,37.1,-5,2.752 -VDL,0,0.03,37.1,5,2.5 -VDL,0,0.03,37.1,15,2.274 -VDL,0,0.03,37.1,25,2.2 -VDL,0,0.03,37.1,35,2.329 -VDL,0,0.04,12.1,-15,5.9 -VDL,0,0.04,12.1,-5,4.756 -VDL,0,0.04,12.1,5,3.777 -VDL,0,0.04,12.1,15,2.966 -VDL,0,0.04,12.1,25,2.75 -VDL,0,0.04,12.1,35,3.245 -VDL,0,0.04,18,-15,4.691 -VDL,0,0.04,18,-5,3.971 -VDL,0,0.04,18,5,3.347 -VDL,0,0.04,18,15,2.821 -VDL,0,0.04,18,25,2.676 -VDL,0,0.04,18,35,2.994 -VDL,0,0.04,25.2,-15,3.806 -VDL,0,0.04,25.2,-5,3.411 -VDL,0,0.04,25.2,5,3.053 -VDL,0,0.04,25.2,15,2.732 -VDL,0,0.04,25.2,25,2.633 -VDL,0,0.04,25.2,35,2.828 -VDL,0,0.04,30,-15,3.599 -VDL,0,0.04,30,-5,3.274 -VDL,0,0.04,30,5,2.977 -VDL,0,0.04,30,15,2.709 -VDL,0,0.04,30,25,2.623 -VDL,0,0.04,30,35,2.783 -VDL,0,0.04,37.1,-15,3.451 -VDL,0,0.04,37.1,-5,3.175 -VDL,0,0.04,37.1,5,2.923 -VDL,0,0.04,37.1,15,2.696 -VDL,0,0.04,37.1,25,2.623 -VDL,0,0.04,37.1,35,2.752 -VDL,0.3,-0.04,12.1,-15,2.648 -VDL,0.3,-0.04,12.1,-5,1.504 -VDL,0.3,-0.04,12.1,5,0.526 -VDL,0.3,-0.04,12.1,15,-0.284 -VDL,0.3,-0.04,12.1,25,-0.177 -VDL,0.3,-0.04,12.1,35,0.373 -VDL,0.3,-0.04,18,-15,1.4 -VDL,0.3,-0.04,18,-5,0.682 -VDL,0.3,-0.04,18,5,0.059 -VDL,0.3,-0.04,18,15,-0.466 -VDL,0.3,-0.04,18,25,-0.393 -VDL,0.3,-0.04,18,35,-0.036 -VDL,0.3,-0.04,25.2,-15,0.505 -VDL,0.3,-0.04,25.2,-5,0.111 -VDL,0.3,-0.04,25.2,5,-0.246 -VDL,0.3,-0.04,25.2,15,-0.566 -VDL,0.3,-0.04,25.2,25,-0.508 -VDL,0.3,-0.04,25.2,35,-0.285 -VDL,0.3,-0.04,30,-15,0.268 -VDL,0.3,-0.04,30,-5,-0.054 -VDL,0.3,-0.04,30,5,-0.349 -VDL,0.3,-0.04,30,15,-0.616 -VDL,0.3,-0.04,30,25,-0.569 -VDL,0.3,-0.04,30,35,-0.385 -VDL,0.3,-0.04,37.1,-15,0.085 -VDL,0.3,-0.04,37.1,-5,-0.189 -VDL,0.3,-0.04,37.1,5,-0.437 -VDL,0.3,-0.04,37.1,15,-0.661 -VDL,0.3,-0.04,37.1,25,-0.627 -VDL,0.3,-0.04,37.1,35,-0.477 -VDL,0.3,-0.03,12.1,-15,3.025 -VDL,0.3,-0.03,12.1,-5,1.881 -VDL,0.3,-0.03,12.1,5,0.902 -VDL,0.3,-0.03,12.1,15,0.092 -VDL,0.3,-0.03,12.1,25,0.2 -VDL,0.3,-0.03,12.1,35,0.75 -VDL,0.3,-0.03,18,-15,1.786 -VDL,0.3,-0.03,18,-5,1.067 -VDL,0.3,-0.03,18,5,0.444 -VDL,0.3,-0.03,18,15,-0.08 -VDL,0.3,-0.03,18,25,-0.007 -VDL,0.3,-0.03,18,35,0.349 -VDL,0.3,-0.03,25.2,-15,0.901 -VDL,0.3,-0.03,25.2,-5,0.507 -VDL,0.3,-0.03,25.2,5,0.151 -VDL,0.3,-0.03,25.2,15,-0.17 -VDL,0.3,-0.03,25.2,25,-0.112 -VDL,0.3,-0.03,25.2,35,0.111 -VDL,0.3,-0.03,30,-15,0.651 -VDL,0.3,-0.03,30,-5,0.329 -VDL,0.3,-0.03,30,5,0.034 -VDL,0.3,-0.03,30,15,-0.233 -VDL,0.3,-0.03,30,25,-0.186 -VDL,0.3,-0.03,30,35,-0.002 -VDL,0.3,-0.03,37.1,-15,0.455 -VDL,0.3,-0.03,37.1,-5,0.181 -VDL,0.3,-0.03,37.1,5,-0.067 -VDL,0.3,-0.03,37.1,15,-0.292 -VDL,0.3,-0.03,37.1,25,-0.257 -VDL,0.3,-0.03,37.1,35,-0.107 -VDL,0.3,-0.02,12.1,-15,3.402 -VDL,0.3,-0.02,12.1,-5,2.257 -VDL,0.3,-0.02,12.1,5,1.279 -VDL,0.3,-0.02,12.1,15,0.469 -VDL,0.3,-0.02,12.1,25,0.577 -VDL,0.3,-0.02,12.1,35,1.127 -VDL,0.3,-0.02,18,-15,2.171 -VDL,0.3,-0.02,18,-5,1.452 -VDL,0.3,-0.02,18,5,0.83 -VDL,0.3,-0.02,18,15,0.305 -VDL,0.3,-0.02,18,25,0.378 -VDL,0.3,-0.02,18,35,0.735 -VDL,0.3,-0.02,25.2,-15,1.298 -VDL,0.3,-0.02,25.2,-5,0.904 -VDL,0.3,-0.02,25.2,5,0.548 -VDL,0.3,-0.02,25.2,15,0.227 -VDL,0.3,-0.02,25.2,25,0.285 -VDL,0.3,-0.02,25.2,35,0.508 -VDL,0.3,-0.02,30,-15,1.035 -VDL,0.3,-0.02,30,-5,0.713 -VDL,0.3,-0.02,30,5,0.418 -VDL,0.3,-0.02,30,15,0.151 -VDL,0.3,-0.02,30,25,0.198 -VDL,0.3,-0.02,30,35,0.382 -VDL,0.3,-0.02,37.1,-15,0.825 -VDL,0.3,-0.02,37.1,-5,0.551 -VDL,0.3,-0.02,37.1,5,0.303 -VDL,0.3,-0.02,37.1,15,0.078 -VDL,0.3,-0.02,37.1,25,0.113 -VDL,0.3,-0.02,37.1,35,0.263 -VDL,0.3,-0.01,12.1,-15,3.79 -VDL,0.3,-0.01,12.1,-5,2.646 -VDL,0.3,-0.01,12.1,5,1.667 -VDL,0.3,-0.01,12.1,15,0.856 -VDL,0.3,-0.01,12.1,25,0.964 -VDL,0.3,-0.01,12.1,35,1.514 -VDL,0.3,-0.01,18,-15,2.587 -VDL,0.3,-0.01,18,-5,1.867 -VDL,0.3,-0.01,18,5,1.243 -VDL,0.3,-0.01,18,15,0.717 -VDL,0.3,-0.01,18,25,0.79 -VDL,0.3,-0.01,18,35,1.145 -VDL,0.3,-0.01,25.2,-15,1.728 -VDL,0.3,-0.01,25.2,-5,1.333 -VDL,0.3,-0.01,25.2,5,0.975 -VDL,0.3,-0.01,25.2,15,0.653 -VDL,0.3,-0.01,25.2,25,0.71 -VDL,0.3,-0.01,25.2,35,0.932 -VDL,0.3,-0.01,30,-15,1.475 -VDL,0.3,-0.01,30,-5,1.151 -VDL,0.3,-0.01,30,5,0.854 -VDL,0.3,-0.01,30,15,0.585 -VDL,0.3,-0.01,30,25,0.63 -VDL,0.3,-0.01,30,35,0.813 -VDL,0.3,-0.01,37.1,-15,1.278 -VDL,0.3,-0.01,37.1,-5,1.002 -VDL,0.3,-0.01,37.1,5,0.75 -VDL,0.3,-0.01,37.1,15,0.523 -VDL,0.3,-0.01,37.1,25,0.555 -VDL,0.3,-0.01,37.1,35,0.703 -VDL,0.3,0,12.1,-15,4.23 -VDL,0.3,0,12.1,-5,3.086 -VDL,0.3,0,12.1,5,2.107 -VDL,0.3,0,12.1,15,1.296 -VDL,0.3,0,12.1,25,1.404 -VDL,0.3,0,12.1,35,1.953 -VDL,0.3,0,18,-15,3.04 -VDL,0.3,0,18,-5,2.32 -VDL,0.3,0,18,5,1.696 -VDL,0.3,0,18,15,1.17 -VDL,0.3,0,18,25,1.243 -VDL,0.3,0,18,35,1.598 -VDL,0.3,0,25.2,-15,2.185 -VDL,0.3,0,25.2,-5,1.79 -VDL,0.3,0,25.2,5,1.432 -VDL,0.3,0,25.2,15,1.11 -VDL,0.3,0,25.2,25,1.167 -VDL,0.3,0,25.2,35,1.389 -VDL,0.3,0,30,-15,1.944 -VDL,0.3,0,30,-5,1.619 -VDL,0.3,0,30,5,1.323 -VDL,0.3,0,30,15,1.054 -VDL,0.3,0,30,25,1.099 -VDL,0.3,0,30,35,1.282 -VDL,0.3,0,37.1,-15,1.759 -VDL,0.3,0,37.1,-5,1.483 -VDL,0.3,0,37.1,5,1.232 -VDL,0.3,0,37.1,15,1.005 -VDL,0.3,0,37.1,25,1.037 -VDL,0.3,0,37.1,35,1.184 -VDL,0.3,0.01,12.1,-15,4.67 -VDL,0.3,0.01,12.1,-5,3.526 -VDL,0.3,0.01,12.1,5,2.547 -VDL,0.3,0.01,12.1,15,1.737 -VDL,0.3,0.01,12.1,25,1.844 -VDL,0.3,0.01,12.1,35,2.394 -VDL,0.3,0.01,18,-15,3.494 -VDL,0.3,0.01,18,-5,2.773 -VDL,0.3,0.01,18,5,2.15 -VDL,0.3,0.01,18,15,1.624 -VDL,0.3,0.01,18,25,1.696 -VDL,0.3,0.01,18,35,2.052 -VDL,0.3,0.01,25.2,-15,2.642 -VDL,0.3,0.01,25.2,-5,2.247 -VDL,0.3,0.01,25.2,5,1.889 -VDL,0.3,0.01,25.2,15,1.567 -VDL,0.3,0.01,25.2,25,1.624 -VDL,0.3,0.01,25.2,35,1.846 -VDL,0.3,0.01,30,-15,2.413 -VDL,0.3,0.01,30,-5,2.089 -VDL,0.3,0.01,30,5,1.792 -VDL,0.3,0.01,30,15,1.523 -VDL,0.3,0.01,30,25,1.568 -VDL,0.3,0.01,30,35,1.751 -VDL,0.3,0.01,37.1,-15,2.241 -VDL,0.3,0.01,37.1,-5,1.965 -VDL,0.3,0.01,37.1,5,1.713 -VDL,0.3,0.01,37.1,15,1.487 -VDL,0.3,0.01,37.1,25,1.518 -VDL,0.3,0.01,37.1,35,1.666 -VDL,0.3,0.02,12.1,-15,5.111 -VDL,0.3,0.02,12.1,-5,3.966 -VDL,0.3,0.02,12.1,5,2.987 -VDL,0.3,0.02,12.1,15,2.177 -VDL,0.3,0.02,12.1,25,2.284 -VDL,0.3,0.02,12.1,35,2.834 -VDL,0.3,0.02,18,-15,3.947 -VDL,0.3,0.02,18,-5,3.227 -VDL,0.3,0.02,18,5,2.604 -VDL,0.3,0.02,18,15,2.078 -VDL,0.3,0.02,18,25,2.15 -VDL,0.3,0.02,18,35,2.506 -VDL,0.3,0.02,25.2,-15,3.099 -VDL,0.3,0.02,25.2,-5,2.704 -VDL,0.3,0.02,25.2,5,2.346 -VDL,0.3,0.02,25.2,15,2.024 -VDL,0.3,0.02,25.2,25,2.081 -VDL,0.3,0.02,25.2,35,2.303 -VDL,0.3,0.02,30,-15,2.882 -VDL,0.3,0.02,30,-5,2.558 -VDL,0.3,0.02,30,5,2.261 -VDL,0.3,0.02,30,15,1.992 -VDL,0.3,0.02,30,25,2.037 -VDL,0.3,0.02,30,35,2.22 -VDL,0.3,0.02,37.1,-15,2.723 -VDL,0.3,0.02,37.1,-5,2.447 -VDL,0.3,0.02,37.1,5,2.195 -VDL,0.3,0.02,37.1,15,1.969 -VDL,0.3,0.02,37.1,25,2.001 -VDL,0.3,0.02,37.1,35,2.148 -VDL,0.3,0.03,12.1,-15,5.551 -VDL,0.3,0.03,12.1,-5,4.406 -VDL,0.3,0.03,12.1,5,3.428 -VDL,0.3,0.03,12.1,15,2.617 -VDL,0.3,0.03,12.1,25,2.724 -VDL,0.3,0.03,12.1,35,3.274 -VDL,0.3,0.03,18,-15,4.401 -VDL,0.3,0.03,18,-5,3.681 -VDL,0.3,0.03,18,5,3.057 -VDL,0.3,0.03,18,15,2.532 -VDL,0.3,0.03,18,25,2.604 -VDL,0.3,0.03,18,35,2.96 -VDL,0.3,0.03,25.2,-15,3.557 -VDL,0.3,0.03,25.2,-5,3.162 -VDL,0.3,0.03,25.2,5,2.804 -VDL,0.3,0.03,25.2,15,2.482 -VDL,0.3,0.03,25.2,25,2.539 -VDL,0.3,0.03,25.2,35,2.761 -VDL,0.3,0.03,30,-15,3.352 -VDL,0.3,0.03,30,-5,3.027 -VDL,0.3,0.03,30,5,2.73 -VDL,0.3,0.03,30,15,2.462 -VDL,0.3,0.03,30,25,2.507 -VDL,0.3,0.03,30,35,2.689 -VDL,0.3,0.03,37.1,-15,3.205 -VDL,0.3,0.03,37.1,-5,2.929 -VDL,0.3,0.03,37.1,5,2.677 -VDL,0.3,0.03,37.1,15,2.451 -VDL,0.3,0.03,37.1,25,2.483 -VDL,0.3,0.03,37.1,35,2.63 -VDL,0.3,0.04,12.1,-15,5.991 -VDL,0.3,0.04,12.1,-5,4.847 -VDL,0.3,0.04,12.1,5,3.868 -VDL,0.3,0.04,12.1,15,3.057 -VDL,0.3,0.04,12.1,25,3.165 -VDL,0.3,0.04,12.1,35,3.714 -VDL,0.3,0.04,18,-15,4.855 -VDL,0.3,0.04,18,-5,4.135 -VDL,0.3,0.04,18,5,3.511 -VDL,0.3,0.04,18,15,2.985 -VDL,0.3,0.04,18,25,3.057 -VDL,0.3,0.04,18,35,3.413 -VDL,0.3,0.04,25.2,-15,4.015 -VDL,0.3,0.04,25.2,-5,3.62 -VDL,0.3,0.04,25.2,5,3.262 -VDL,0.3,0.04,25.2,15,2.94 -VDL,0.3,0.04,25.2,25,2.997 -VDL,0.3,0.04,25.2,35,3.219 -VDL,0.3,0.04,30,-15,3.821 -VDL,0.3,0.04,30,-5,3.497 -VDL,0.3,0.04,30,5,3.2 -VDL,0.3,0.04,30,15,2.931 -VDL,0.3,0.04,30,25,2.977 -VDL,0.3,0.04,30,35,3.159 -VDL,0.3,0.04,37.1,-15,3.687 -VDL,0.3,0.04,37.1,-5,3.411 -VDL,0.3,0.04,37.1,5,3.159 -VDL,0.3,0.04,37.1,15,2.933 -VDL,0.3,0.04,37.1,25,2.965 -VDL,0.3,0.04,37.1,35,3.112 -VDL,0.6,-0.04,12.1,-15,2.329 -VDL,0.6,-0.04,12.1,-5,1.185 -VDL,0.6,-0.04,12.1,5,0.207 -VDL,0.6,-0.04,12.1,15,-0.413 -VDL,0.6,-0.04,12.1,25,-0.173 -VDL,0.6,-0.04,12.1,35,0.433 -VDL,0.6,-0.04,18,-15,1.143 -VDL,0.6,-0.04,18,-5,0.424 -VDL,0.6,-0.04,18,5,-0.198 -VDL,0.6,-0.04,18,15,-0.594 -VDL,0.6,-0.04,18,25,-0.432 -VDL,0.6,-0.04,18,35,-0.038 -VDL,0.6,-0.04,25.2,-15,0.286 -VDL,0.6,-0.04,25.2,-5,-0.108 -VDL,0.6,-0.04,25.2,5,-0.465 -VDL,0.6,-0.04,25.2,15,-0.689 -VDL,0.6,-0.04,25.2,25,-0.572 -VDL,0.6,-0.04,25.2,35,-0.322 -VDL,0.6,-0.04,30,-15,0.061 -VDL,0.6,-0.04,30,-5,-0.262 -VDL,0.6,-0.04,30,5,-0.556 -VDL,0.6,-0.04,30,15,-0.743 -VDL,0.6,-0.04,30,25,-0.646 -VDL,0.6,-0.04,30,35,-0.439 -VDL,0.6,-0.04,37.1,-15,-0.112 -VDL,0.6,-0.04,37.1,-5,-0.385 -VDL,0.6,-0.04,37.1,5,-0.634 -VDL,0.6,-0.04,37.1,15,-0.795 -VDL,0.6,-0.04,37.1,25,-0.718 -VDL,0.6,-0.04,37.1,35,-0.55 -VDL,0.6,-0.03,12.1,-15,2.752 -VDL,0.6,-0.03,12.1,-5,1.608 -VDL,0.6,-0.03,12.1,5,0.63 -VDL,0.6,-0.03,12.1,15,0.01 -VDL,0.6,-0.03,12.1,25,0.251 -VDL,0.6,-0.03,12.1,35,0.856 -VDL,0.6,-0.03,18,-15,1.576 -VDL,0.6,-0.03,18,-5,0.857 -VDL,0.6,-0.03,18,5,0.234 -VDL,0.6,-0.03,18,15,-0.162 -VDL,0.6,-0.03,18,25,0.001 -VDL,0.6,-0.03,18,35,0.395 -VDL,0.6,-0.03,25.2,-15,0.731 -VDL,0.6,-0.03,25.2,-5,0.337 -VDL,0.6,-0.03,25.2,5,-0.02 -VDL,0.6,-0.03,25.2,15,-0.244 -VDL,0.6,-0.03,25.2,25,-0.127 -VDL,0.6,-0.03,25.2,35,0.123 -VDL,0.6,-0.03,30,-15,0.491 -VDL,0.6,-0.03,30,-5,0.168 -VDL,0.6,-0.03,30,5,-0.126 -VDL,0.6,-0.03,30,15,-0.313 -VDL,0.6,-0.03,30,25,-0.216 -VDL,0.6,-0.03,30,35,-0.009 -VDL,0.6,-0.03,37.1,-15,0.303 -VDL,0.6,-0.03,37.1,-5,0.03 -VDL,0.6,-0.03,37.1,5,-0.218 -VDL,0.6,-0.03,37.1,15,-0.379 -VDL,0.6,-0.03,37.1,25,-0.303 -VDL,0.6,-0.03,37.1,35,-0.134 -VDL,0.6,-0.02,12.1,-15,3.175 -VDL,0.6,-0.02,12.1,-5,2.031 -VDL,0.6,-0.02,12.1,5,1.053 -VDL,0.6,-0.02,12.1,15,0.433 -VDL,0.6,-0.02,12.1,25,0.674 -VDL,0.6,-0.02,12.1,35,1.279 -VDL,0.6,-0.02,18,-15,2.008 -VDL,0.6,-0.02,18,-5,1.29 -VDL,0.6,-0.02,18,5,0.667 -VDL,0.6,-0.02,18,15,0.271 -VDL,0.6,-0.02,18,25,0.434 -VDL,0.6,-0.02,18,35,0.828 -VDL,0.6,-0.02,25.2,-15,1.176 -VDL,0.6,-0.02,25.2,-5,0.783 -VDL,0.6,-0.02,25.2,5,0.426 -VDL,0.6,-0.02,25.2,15,0.202 -VDL,0.6,-0.02,25.2,25,0.319 -VDL,0.6,-0.02,25.2,35,0.569 -VDL,0.6,-0.02,30,-15,0.922 -VDL,0.6,-0.02,30,-5,0.599 -VDL,0.6,-0.02,30,5,0.305 -VDL,0.6,-0.02,30,15,0.118 -VDL,0.6,-0.02,30,25,0.215 -VDL,0.6,-0.02,30,35,0.422 -VDL,0.6,-0.02,37.1,-15,0.719 -VDL,0.6,-0.02,37.1,-5,0.446 -VDL,0.6,-0.02,37.1,5,0.197 -VDL,0.6,-0.02,37.1,15,0.036 -VDL,0.6,-0.02,37.1,25,0.113 -VDL,0.6,-0.02,37.1,35,0.281 -VDL,0.6,-0.01,12.1,-15,3.611 -VDL,0.6,-0.01,12.1,-5,2.466 -VDL,0.6,-0.01,12.1,5,1.487 -VDL,0.6,-0.01,12.1,15,0.867 -VDL,0.6,-0.01,12.1,25,1.107 -VDL,0.6,-0.01,12.1,35,1.713 -VDL,0.6,-0.01,18,-15,2.472 -VDL,0.6,-0.01,18,-5,1.751 -VDL,0.6,-0.01,18,5,1.128 -VDL,0.6,-0.01,18,15,0.731 -VDL,0.6,-0.01,18,25,0.893 -VDL,0.6,-0.01,18,35,1.286 -VDL,0.6,-0.01,25.2,-15,1.655 -VDL,0.6,-0.01,25.2,-5,1.26 -VDL,0.6,-0.01,25.2,5,0.902 -VDL,0.6,-0.01,25.2,15,0.677 -VDL,0.6,-0.01,25.2,25,0.793 -VDL,0.6,-0.01,25.2,35,1.042 -VDL,0.6,-0.01,30,-15,1.409 -VDL,0.6,-0.01,30,-5,1.085 -VDL,0.6,-0.01,30,5,0.788 -VDL,0.6,-0.01,30,15,0.599 -VDL,0.6,-0.01,30,25,0.695 -VDL,0.6,-0.01,30,35,0.9 -VDL,0.6,-0.01,37.1,-15,1.218 -VDL,0.6,-0.01,37.1,-5,0.941 -VDL,0.6,-0.01,37.1,5,0.69 -VDL,0.6,-0.01,37.1,15,0.526 -VDL,0.6,-0.01,37.1,25,0.601 -VDL,0.6,-0.01,37.1,35,0.767 -VDL,0.6,0,12.1,-15,4.104 -VDL,0.6,0,12.1,-5,2.96 -VDL,0.6,0,12.1,5,1.981 -VDL,0.6,0,12.1,15,1.36 -VDL,0.6,0,12.1,25,1.601 -VDL,0.6,0,12.1,35,2.206 -VDL,0.6,0,18,-15,2.98 -VDL,0.6,0,18,-5,2.26 -VDL,0.6,0,18,5,1.637 -VDL,0.6,0,18,15,1.24 -VDL,0.6,0,18,25,1.401 -VDL,0.6,0,18,35,1.794 -VDL,0.6,0,25.2,-15,2.168 -VDL,0.6,0,25.2,-5,1.773 -VDL,0.6,0,25.2,5,1.415 -VDL,0.6,0,25.2,15,1.19 -VDL,0.6,0,25.2,25,1.306 -VDL,0.6,0,25.2,35,1.555 -VDL,0.6,0,30,-15,1.936 -VDL,0.6,0,30,-5,1.611 -VDL,0.6,0,30,5,1.314 -VDL,0.6,0,30,15,1.126 -VDL,0.6,0,30,25,1.222 -VDL,0.6,0,30,35,1.426 -VDL,0.6,0,37.1,-15,1.759 -VDL,0.6,0,37.1,-5,1.482 -VDL,0.6,0,37.1,5,1.231 -VDL,0.6,0,37.1,15,1.067 -VDL,0.6,0,37.1,25,1.141 -VDL,0.6,0,37.1,35,1.307 -VDL,0.6,0.01,12.1,-15,4.599 -VDL,0.6,0.01,12.1,-5,3.454 -VDL,0.6,0.01,12.1,5,2.476 -VDL,0.6,0.01,12.1,15,1.855 -VDL,0.6,0.01,12.1,25,2.096 -VDL,0.6,0.01,12.1,35,2.701 -VDL,0.6,0.01,18,-15,3.49 -VDL,0.6,0.01,18,-5,2.77 -VDL,0.6,0.01,18,5,2.146 -VDL,0.6,0.01,18,15,1.749 -VDL,0.6,0.01,18,25,1.911 -VDL,0.6,0.01,18,35,2.304 -VDL,0.6,0.01,25.2,-15,2.681 -VDL,0.6,0.01,25.2,-5,2.287 -VDL,0.6,0.01,25.2,5,1.928 -VDL,0.6,0.01,25.2,15,1.703 -VDL,0.6,0.01,25.2,25,1.819 -VDL,0.6,0.01,25.2,35,2.068 -VDL,0.6,0.01,30,-15,2.463 -VDL,0.6,0.01,30,-5,2.138 -VDL,0.6,0.01,30,5,1.841 -VDL,0.6,0.01,30,15,1.653 -VDL,0.6,0.01,30,25,1.748 -VDL,0.6,0.01,30,35,1.953 -VDL,0.6,0.01,37.1,-15,2.3 -VDL,0.6,0.01,37.1,-5,2.023 -VDL,0.6,0.01,37.1,5,1.772 -VDL,0.6,0.01,37.1,15,1.608 -VDL,0.6,0.01,37.1,25,1.683 -VDL,0.6,0.01,37.1,35,1.848 -VDL,0.6,0.02,12.1,-15,5.093 -VDL,0.6,0.02,12.1,-5,3.949 -VDL,0.6,0.02,12.1,5,2.97 -VDL,0.6,0.02,12.1,15,2.349 -VDL,0.6,0.02,12.1,25,2.59 -VDL,0.6,0.02,12.1,35,3.195 -VDL,0.6,0.02,18,-15,3.999 -VDL,0.6,0.02,18,-5,3.279 -VDL,0.6,0.02,18,5,2.656 -VDL,0.6,0.02,18,15,2.259 -VDL,0.6,0.02,18,25,2.42 -VDL,0.6,0.02,18,35,2.814 -VDL,0.6,0.02,25.2,-15,3.195 -VDL,0.6,0.02,25.2,-5,2.8 -VDL,0.6,0.02,25.2,5,2.442 -VDL,0.6,0.02,25.2,15,2.216 -VDL,0.6,0.02,25.2,25,2.333 -VDL,0.6,0.02,25.2,35,2.582 -VDL,0.6,0.02,30,-15,2.989 -VDL,0.6,0.02,30,-5,2.665 -VDL,0.6,0.02,30,5,2.368 -VDL,0.6,0.02,30,15,2.179 -VDL,0.6,0.02,30,25,2.275 -VDL,0.6,0.02,30,35,2.48 -VDL,0.6,0.02,37.1,-15,2.841 -VDL,0.6,0.02,37.1,-5,2.565 -VDL,0.6,0.02,37.1,5,2.313 -VDL,0.6,0.02,37.1,15,2.15 -VDL,0.6,0.02,37.1,25,2.224 -VDL,0.6,0.02,37.1,35,2.39 -VDL,0.6,0.03,12.1,-15,5.588 -VDL,0.6,0.03,12.1,-5,4.443 -VDL,0.6,0.03,12.1,5,3.464 -VDL,0.6,0.03,12.1,15,2.844 -VDL,0.6,0.03,12.1,25,3.084 -VDL,0.6,0.03,12.1,35,3.69 -VDL,0.6,0.03,18,-15,4.509 -VDL,0.6,0.03,18,-5,3.789 -VDL,0.6,0.03,18,5,3.165 -VDL,0.6,0.03,18,15,2.768 -VDL,0.6,0.03,18,25,2.93 -VDL,0.6,0.03,18,35,3.323 -VDL,0.6,0.03,25.2,-15,3.709 -VDL,0.6,0.03,25.2,-5,3.314 -VDL,0.6,0.03,25.2,5,2.956 -VDL,0.6,0.03,25.2,15,2.731 -VDL,0.6,0.03,25.2,25,2.847 -VDL,0.6,0.03,25.2,35,3.096 -VDL,0.6,0.03,30,-15,3.517 -VDL,0.6,0.03,30,-5,3.192 -VDL,0.6,0.03,30,5,2.895 -VDL,0.6,0.03,30,15,2.707 -VDL,0.6,0.03,30,25,2.802 -VDL,0.6,0.03,30,35,3.007 -VDL,0.6,0.03,37.1,-15,3.382 -VDL,0.6,0.03,37.1,-5,3.106 -VDL,0.6,0.03,37.1,5,2.855 -VDL,0.6,0.03,37.1,15,2.691 -VDL,0.6,0.03,37.1,25,2.765 -VDL,0.6,0.03,37.1,35,2.931 -VDL,0.6,0.04,12.1,-15,6.082 -VDL,0.6,0.04,12.1,-5,4.938 -VDL,0.6,0.04,12.1,5,3.959 -VDL,0.6,0.04,12.1,15,3.338 -VDL,0.6,0.04,12.1,25,3.579 -VDL,0.6,0.04,12.1,35,4.184 -VDL,0.6,0.04,18,-15,5.018 -VDL,0.6,0.04,18,-5,4.298 -VDL,0.6,0.04,18,5,3.675 -VDL,0.6,0.04,18,15,3.278 -VDL,0.6,0.04,18,25,3.439 -VDL,0.6,0.04,18,35,3.833 -VDL,0.6,0.04,25.2,-15,4.223 -VDL,0.6,0.04,25.2,-5,3.828 -VDL,0.6,0.04,25.2,5,3.47 -VDL,0.6,0.04,25.2,15,3.245 -VDL,0.6,0.04,25.2,25,3.361 -VDL,0.6,0.04,25.2,35,3.61 -VDL,0.6,0.04,30,-15,4.044 -VDL,0.6,0.04,30,-5,3.719 -VDL,0.6,0.04,30,5,3.423 -VDL,0.6,0.04,30,15,3.234 -VDL,0.6,0.04,30,25,3.33 -VDL,0.6,0.04,30,35,3.535 -VDL,0.6,0.04,37.1,-15,3.924 -VDL,0.6,0.04,37.1,-5,3.647 -VDL,0.6,0.04,37.1,5,3.396 -VDL,0.6,0.04,37.1,15,3.232 -VDL,0.6,0.04,37.1,25,3.307 -VDL,0.6,0.04,37.1,35,3.472 -VDL,0.9,-0.04,12.1,-15,2.01 -VDL,0.9,-0.04,12.1,-5,0.866 -VDL,0.9,-0.04,12.1,5,-0.112 -VDL,0.9,-0.04,12.1,15,-0.504 -VDL,0.9,-0.04,12.1,25,-0.168 -VDL,0.9,-0.04,12.1,35,0.493 -VDL,0.9,-0.04,18,-15,0.886 -VDL,0.9,-0.04,18,-5,0.167 -VDL,0.9,-0.04,18,5,-0.456 -VDL,0.9,-0.04,18,15,-0.694 -VDL,0.9,-0.04,18,25,-0.471 -VDL,0.9,-0.04,18,35,-0.04 -VDL,0.9,-0.04,25.2,-15,0.067 -VDL,0.9,-0.04,25.2,-5,-0.327 -VDL,0.9,-0.04,25.2,5,-0.684 -VDL,0.9,-0.04,25.2,15,-0.789 -VDL,0.9,-0.04,25.2,25,-0.635 -VDL,0.9,-0.04,25.2,35,-0.359 -VDL,0.9,-0.04,30,-15,-0.147 -VDL,0.9,-0.04,30,-5,-0.469 -VDL,0.9,-0.04,30,5,-0.764 -VDL,0.9,-0.04,30,15,-0.85 -VDL,0.9,-0.04,30,25,-0.723 -VDL,0.9,-0.04,30,35,-0.494 -VDL,0.9,-0.04,37.1,-15,-0.308 -VDL,0.9,-0.04,37.1,-5,-0.582 -VDL,0.9,-0.04,37.1,5,-0.83 -VDL,0.9,-0.04,37.1,15,-0.91 -VDL,0.9,-0.04,37.1,25,-0.809 -VDL,0.9,-0.04,37.1,35,-0.622 -VDL,0.9,-0.03,12.1,-15,2.48 -VDL,0.9,-0.03,12.1,-5,1.336 -VDL,0.9,-0.03,12.1,5,0.357 -VDL,0.9,-0.03,12.1,15,-0.034 -VDL,0.9,-0.03,12.1,25,0.301 -VDL,0.9,-0.03,12.1,35,0.963 -VDL,0.9,-0.03,18,-15,1.366 -VDL,0.9,-0.03,18,-5,0.647 -VDL,0.9,-0.03,18,5,0.024 -VDL,0.9,-0.03,18,15,-0.214 -VDL,0.9,-0.03,18,25,0.009 -VDL,0.9,-0.03,18,35,0.441 -VDL,0.9,-0.03,25.2,-15,0.56 -VDL,0.9,-0.03,25.2,-5,0.167 -VDL,0.9,-0.03,25.2,5,-0.19 -VDL,0.9,-0.03,25.2,15,-0.295 -VDL,0.9,-0.03,25.2,25,-0.141 -VDL,0.9,-0.03,25.2,35,0.135 -VDL,0.9,-0.03,30,-15,0.331 -VDL,0.9,-0.03,30,-5,0.008 -VDL,0.9,-0.03,30,5,-0.287 -VDL,0.9,-0.03,30,15,-0.373 -VDL,0.9,-0.03,30,25,-0.245 -VDL,0.9,-0.03,30,35,-0.016 -VDL,0.9,-0.03,37.1,-15,0.152 -VDL,0.9,-0.03,37.1,-5,-0.121 -VDL,0.9,-0.03,37.1,5,-0.37 -VDL,0.9,-0.03,37.1,15,-0.45 -VDL,0.9,-0.03,37.1,25,-0.348 -VDL,0.9,-0.03,37.1,35,-0.162 -VDL,0.9,-0.02,12.1,-15,2.949 -VDL,0.9,-0.02,12.1,-5,1.805 -VDL,0.9,-0.02,12.1,5,0.827 -VDL,0.9,-0.02,12.1,15,0.435 -VDL,0.9,-0.02,12.1,25,0.771 -VDL,0.9,-0.02,12.1,35,1.432 -VDL,0.9,-0.02,18,-15,1.846 -VDL,0.9,-0.02,18,-5,1.127 -VDL,0.9,-0.02,18,5,0.504 -VDL,0.9,-0.02,18,15,0.266 -VDL,0.9,-0.02,18,25,0.489 -VDL,0.9,-0.02,18,35,0.921 -VDL,0.9,-0.02,25.2,-15,1.055 -VDL,0.9,-0.02,25.2,-5,0.661 -VDL,0.9,-0.02,25.2,5,0.304 -VDL,0.9,-0.02,25.2,15,0.199 -VDL,0.9,-0.02,25.2,25,0.353 -VDL,0.9,-0.02,25.2,35,0.63 -VDL,0.9,-0.02,30,-15,0.809 -VDL,0.9,-0.02,30,-5,0.486 -VDL,0.9,-0.02,30,5,0.191 -VDL,0.9,-0.02,30,15,0.105 -VDL,0.9,-0.02,30,25,0.233 -VDL,0.9,-0.02,30,35,0.462 -VDL,0.9,-0.02,37.1,-15,0.613 -VDL,0.9,-0.02,37.1,-5,0.34 -VDL,0.9,-0.02,37.1,5,0.091 -VDL,0.9,-0.02,37.1,15,0.011 -VDL,0.9,-0.02,37.1,25,0.113 -VDL,0.9,-0.02,37.1,35,0.299 -VDL,0.9,-0.01,12.1,-15,3.431 -VDL,0.9,-0.01,12.1,-5,2.286 -VDL,0.9,-0.01,12.1,5,1.307 -VDL,0.9,-0.01,12.1,15,0.915 -VDL,0.9,-0.01,12.1,25,1.251 -VDL,0.9,-0.01,12.1,35,1.911 -VDL,0.9,-0.01,18,-15,2.356 -VDL,0.9,-0.01,18,-5,1.636 -VDL,0.9,-0.01,18,5,1.013 -VDL,0.9,-0.01,18,15,0.773 -VDL,0.9,-0.01,18,25,0.995 -VDL,0.9,-0.01,18,35,1.426 -VDL,0.9,-0.01,25.2,-15,1.582 -VDL,0.9,-0.01,25.2,-5,1.187 -VDL,0.9,-0.01,25.2,5,0.829 -VDL,0.9,-0.01,25.2,15,0.723 -VDL,0.9,-0.01,25.2,25,0.876 -VDL,0.9,-0.01,25.2,35,1.152 -VDL,0.9,-0.01,30,-15,1.343 -VDL,0.9,-0.01,30,-5,1.019 -VDL,0.9,-0.01,30,5,0.722 -VDL,0.9,-0.01,30,15,0.634 -VDL,0.9,-0.01,30,25,0.76 -VDL,0.9,-0.01,30,35,0.987 -VDL,0.9,-0.01,37.1,-15,1.158 -VDL,0.9,-0.01,37.1,-5,0.881 -VDL,0.9,-0.01,37.1,5,0.63 -VDL,0.9,-0.01,37.1,15,0.547 -VDL,0.9,-0.01,37.1,25,0.646 -VDL,0.9,-0.01,37.1,35,0.83 -VDL,0.9,0,12.1,-15,3.979 -VDL,0.9,0,12.1,-5,2.834 -VDL,0.9,0,12.1,5,1.855 -VDL,0.9,0,12.1,15,1.463 -VDL,0.9,0,12.1,25,1.798 -VDL,0.9,0,12.1,35,2.459 -VDL,0.9,0,18,-15,2.921 -VDL,0.9,0,18,-5,2.201 -VDL,0.9,0,18,5,1.577 -VDL,0.9,0,18,15,1.338 -VDL,0.9,0,18,25,1.56 -VDL,0.9,0,18,35,1.991 -VDL,0.9,0,25.2,-15,2.151 -VDL,0.9,0,25.2,-5,1.756 -VDL,0.9,0,25.2,5,1.398 -VDL,0.9,0,25.2,15,1.292 -VDL,0.9,0,25.2,25,1.445 -VDL,0.9,0,25.2,35,1.721 -VDL,0.9,0,30,-15,1.927 -VDL,0.9,0,30,-5,1.603 -VDL,0.9,0,30,5,1.306 -VDL,0.9,0,30,15,1.218 -VDL,0.9,0,30,25,1.344 -VDL,0.9,0,30,35,1.571 -VDL,0.9,0,37.1,-15,1.758 -VDL,0.9,0,37.1,-5,1.481 -VDL,0.9,0,37.1,5,1.23 -VDL,0.9,0,37.1,15,1.147 -VDL,0.9,0,37.1,25,1.246 -VDL,0.9,0,37.1,35,1.43 -VDL,0.9,0.01,12.1,-15,4.528 -VDL,0.9,0.01,12.1,-5,3.383 -VDL,0.9,0.01,12.1,5,2.404 -VDL,0.9,0.01,12.1,15,2.012 -VDL,0.9,0.01,12.1,25,2.347 -VDL,0.9,0.01,12.1,35,3.008 -VDL,0.9,0.01,18,-15,3.486 -VDL,0.9,0.01,18,-5,2.766 -VDL,0.9,0.01,18,5,2.143 -VDL,0.9,0.01,18,15,1.903 -VDL,0.9,0.01,18,25,2.125 -VDL,0.9,0.01,18,35,2.556 -VDL,0.9,0.01,25.2,-15,2.721 -VDL,0.9,0.01,25.2,-5,2.326 -VDL,0.9,0.01,25.2,5,1.968 -VDL,0.9,0.01,25.2,15,1.862 -VDL,0.9,0.01,25.2,25,2.015 -VDL,0.9,0.01,25.2,35,2.29 -VDL,0.9,0.01,30,-15,2.512 -VDL,0.9,0.01,30,-5,2.187 -VDL,0.9,0.01,30,5,1.891 -VDL,0.9,0.01,30,15,1.803 -VDL,0.9,0.01,30,25,1.928 -VDL,0.9,0.01,30,35,2.156 -VDL,0.9,0.01,37.1,-15,2.358 -VDL,0.9,0.01,37.1,-5,2.082 -VDL,0.9,0.01,37.1,5,1.83 -VDL,0.9,0.01,37.1,15,1.747 -VDL,0.9,0.01,37.1,25,1.847 -VDL,0.9,0.01,37.1,35,2.031 -VDL,0.9,0.02,12.1,-15,5.076 -VDL,0.9,0.02,12.1,-5,3.932 -VDL,0.9,0.02,12.1,5,2.953 -VDL,0.9,0.02,12.1,15,2.561 -VDL,0.9,0.02,12.1,25,2.896 -VDL,0.9,0.02,12.1,35,3.557 -VDL,0.9,0.02,18,-15,4.052 -VDL,0.9,0.02,18,-5,3.332 -VDL,0.9,0.02,18,5,2.708 -VDL,0.9,0.02,18,15,2.468 -VDL,0.9,0.02,18,25,2.691 -VDL,0.9,0.02,18,35,3.121 -VDL,0.9,0.02,25.2,-15,3.291 -VDL,0.9,0.02,25.2,-5,2.896 -VDL,0.9,0.02,25.2,5,2.538 -VDL,0.9,0.02,25.2,15,2.432 -VDL,0.9,0.02,25.2,25,2.584 -VDL,0.9,0.02,25.2,35,2.86 -VDL,0.9,0.02,30,-15,3.096 -VDL,0.9,0.02,30,-5,2.772 -VDL,0.9,0.02,30,5,2.475 -VDL,0.9,0.02,30,15,2.387 -VDL,0.9,0.02,30,25,2.513 -VDL,0.9,0.02,30,35,2.74 -VDL,0.9,0.02,37.1,-15,2.959 -VDL,0.9,0.02,37.1,-5,2.683 -VDL,0.9,0.02,37.1,5,2.431 -VDL,0.9,0.02,37.1,15,2.348 -VDL,0.9,0.02,37.1,25,2.447 -VDL,0.9,0.02,37.1,35,2.631 -VDL,0.9,0.03,12.1,-15,5.625 -VDL,0.9,0.03,12.1,-5,4.48 -VDL,0.9,0.03,12.1,5,3.501 -VDL,0.9,0.03,12.1,15,3.109 -VDL,0.9,0.03,12.1,25,3.444 -VDL,0.9,0.03,12.1,35,4.105 -VDL,0.9,0.03,18,-15,4.617 -VDL,0.9,0.03,18,-5,3.897 -VDL,0.9,0.03,18,5,3.273 -VDL,0.9,0.03,18,15,3.034 -VDL,0.9,0.03,18,25,3.256 -VDL,0.9,0.03,18,35,3.687 -VDL,0.9,0.03,25.2,-15,3.861 -VDL,0.9,0.03,25.2,-5,3.466 -VDL,0.9,0.03,25.2,5,3.108 -VDL,0.9,0.03,25.2,15,3.002 -VDL,0.9,0.03,25.2,25,3.155 -VDL,0.9,0.03,25.2,35,3.431 -VDL,0.9,0.03,30,-15,3.682 -VDL,0.9,0.03,30,-5,3.357 -VDL,0.9,0.03,30,5,3.06 -VDL,0.9,0.03,30,15,2.972 -VDL,0.9,0.03,30,25,3.098 -VDL,0.9,0.03,30,35,3.325 -VDL,0.9,0.03,37.1,-15,3.56 -VDL,0.9,0.03,37.1,-5,3.283 -VDL,0.9,0.03,37.1,5,3.032 -VDL,0.9,0.03,37.1,15,2.949 -VDL,0.9,0.03,37.1,25,3.048 -VDL,0.9,0.03,37.1,35,3.232 -VDL,0.9,0.04,12.1,-15,6.173 -VDL,0.9,0.04,12.1,-5,5.029 -VDL,0.9,0.04,12.1,5,4.05 -VDL,0.9,0.04,12.1,15,3.658 -VDL,0.9,0.04,12.1,25,3.993 -VDL,0.9,0.04,12.1,35,4.654 -VDL,0.9,0.04,18,-15,5.182 -VDL,0.9,0.04,18,-5,4.462 -VDL,0.9,0.04,18,5,3.839 -VDL,0.9,0.04,18,15,3.599 -VDL,0.9,0.04,18,25,3.821 -VDL,0.9,0.04,18,35,4.252 -VDL,0.9,0.04,25.2,-15,4.432 -VDL,0.9,0.04,25.2,-5,4.037 -VDL,0.9,0.04,25.2,5,3.679 -VDL,0.9,0.04,25.2,15,3.573 -VDL,0.9,0.04,25.2,25,3.725 -VDL,0.9,0.04,25.2,35,4.001 -VDL,0.9,0.04,30,-15,4.267 -VDL,0.9,0.04,30,-5,3.942 -VDL,0.9,0.04,30,5,3.645 -VDL,0.9,0.04,30,15,3.557 -VDL,0.9,0.04,30,25,3.683 -VDL,0.9,0.04,30,35,3.91 -VDL,0.9,0.04,37.1,-15,4.16 -VDL,0.9,0.04,37.1,-5,3.884 -VDL,0.9,0.04,37.1,5,3.632 -VDL,0.9,0.04,37.1,15,3.549 -VDL,0.9,0.04,37.1,25,3.649 -VDL,0.9,0.04,37.1,35,3.833 +SB,0,-0.04,12.1,-15,2.967 +SB,0,-0.04,12.1,-5,1.823 +SB,0,-0.04,12.1,5,0.844 +SB,0,-0.04,12.1,15,0.034 +SB,0,-0.04,12.1,25,-0.181 +SB,0,-0.04,12.1,35,0.314 +SB,0,-0.04,18,-15,1.658 +SB,0,-0.04,18,-5,0.939 +SB,0,-0.04,18,5,0.317 +SB,0,-0.04,18,15,-0.208 +SB,0,-0.04,18,25,-0.353 +SB,0,-0.04,18,35,-0.034 +SB,0,-0.04,25.2,-15,0.724 +SB,0,-0.04,25.2,-5,0.33 +SB,0,-0.04,25.2,5,-0.026 +SB,0,-0.04,25.2,15,-0.347 +SB,0,-0.04,25.2,25,-0.445 +SB,0,-0.04,25.2,35,-0.248 +SB,0,-0.04,30,-15,0.476 +SB,0,-0.04,30,-5,0.153 +SB,0,-0.04,30,5,-0.141 +SB,0,-0.04,30,15,-0.408 +SB,0,-0.04,30,25,-0.492 +SB,0,-0.04,30,35,-0.33 +SB,0,-0.04,37.1,-15,0.281 +SB,0,-0.04,37.1,-5,0.008 +SB,0,-0.04,37.1,5,-0.241 +SB,0,-0.04,37.1,15,-0.465 +SB,0,-0.04,37.1,25,-0.536 +SB,0,-0.04,37.1,35,-0.404 +SB,0,-0.03,12.1,-15,3.297 +SB,0,-0.03,12.1,-5,2.153 +SB,0,-0.03,12.1,5,1.175 +SB,0,-0.03,12.1,15,0.365 +SB,0,-0.03,12.1,25,0.149 +SB,0,-0.03,12.1,35,0.644 +SB,0,-0.03,18,-15,1.996 +SB,0,-0.03,18,-5,1.277 +SB,0,-0.03,18,5,0.654 +SB,0,-0.03,18,15,0.13 +SB,0,-0.03,18,25,-0.015 +SB,0,-0.03,18,35,0.304 +SB,0,-0.03,25.2,-15,1.072 +SB,0,-0.03,25.2,-5,0.678 +SB,0,-0.03,25.2,5,0.321 +SB,0,-0.03,25.2,15,0.001 +SB,0,-0.03,25.2,25,-0.097 +SB,0,-0.03,25.2,35,0.099 +SB,0,-0.03,30,-15,0.812 +SB,0,-0.03,30,-5,0.489 +SB,0,-0.03,30,5,0.195 +SB,0,-0.03,30,15,-0.072 +SB,0,-0.03,30,25,-0.156 +SB,0,-0.03,30,35,0.006 +SB,0,-0.03,37.1,-15,0.606 +SB,0,-0.03,37.1,-5,0.332 +SB,0,-0.03,37.1,5,0.084 +SB,0,-0.03,37.1,15,-0.14 +SB,0,-0.03,37.1,25,-0.212 +SB,0,-0.03,37.1,35,-0.08 +SB,0,-0.02,12.1,-15,3.628 +SB,0,-0.02,12.1,-5,2.484 +SB,0,-0.02,12.1,5,1.505 +SB,0,-0.02,12.1,15,0.695 +SB,0,-0.02,12.1,25,0.48 +SB,0,-0.02,12.1,35,0.974 +SB,0,-0.02,18,-15,2.334 +SB,0,-0.02,18,-5,1.615 +SB,0,-0.02,18,5,0.992 +SB,0,-0.02,18,15,0.467 +SB,0,-0.02,18,25,0.322 +SB,0,-0.02,18,35,0.642 +SB,0,-0.02,25.2,-15,1.42 +SB,0,-0.02,25.2,-5,1.026 +SB,0,-0.02,25.2,5,0.669 +SB,0,-0.02,25.2,15,0.349 +SB,0,-0.02,25.2,25,0.251 +SB,0,-0.02,25.2,35,0.447 +SB,0,-0.02,30,-15,1.148 +SB,0,-0.02,30,-5,0.826 +SB,0,-0.02,30,5,0.531 +SB,0,-0.02,30,15,0.264 +SB,0,-0.02,30,25,0.18 +SB,0,-0.02,30,35,0.342 +SB,0,-0.02,37.1,-15,0.93 +SB,0,-0.02,37.1,-5,0.657 +SB,0,-0.02,37.1,5,0.408 +SB,0,-0.02,37.1,15,0.184 +SB,0,-0.02,37.1,25,0.113 +SB,0,-0.02,37.1,35,0.245 +SB,0,-0.01,12.1,-15,3.97 +SB,0,-0.01,12.1,-5,2.826 +SB,0,-0.01,12.1,5,1.847 +SB,0,-0.01,12.1,15,1.036 +SB,0,-0.01,12.1,25,0.82 +SB,0,-0.01,12.1,35,1.315 +SB,0,-0.01,18,-15,2.702 +SB,0,-0.01,18,-5,1.982 +SB,0,-0.01,18,5,1.358 +SB,0,-0.01,18,15,0.833 +SB,0,-0.01,18,25,0.687 +SB,0,-0.01,18,35,1.005 +SB,0,-0.01,25.2,-15,1.8 +SB,0,-0.01,25.2,-5,1.406 +SB,0,-0.01,25.2,5,1.048 +SB,0,-0.01,25.2,15,0.726 +SB,0,-0.01,25.2,25,0.627 +SB,0,-0.01,25.2,35,0.823 +SB,0,-0.01,30,-15,1.541 +SB,0,-0.01,30,-5,1.217 +SB,0,-0.01,30,5,0.92 +SB,0,-0.01,30,15,0.651 +SB,0,-0.01,30,25,0.566 +SB,0,-0.01,30,35,0.726 +SB,0,-0.01,37.1,-15,1.338 +SB,0,-0.01,37.1,-5,1.062 +SB,0,-0.01,37.1,5,0.81 +SB,0,-0.01,37.1,15,0.583 +SB,0,-0.01,37.1,25,0.51 +SB,0,-0.01,37.1,35,0.639 +SB,0,0,12.1,-15,4.356 +SB,0,0,12.1,-5,3.211 +SB,0,0,12.1,5,2.232 +SB,0,0,12.1,15,1.422 +SB,0,0,12.1,25,1.206 +SB,0,0,12.1,35,1.7 +SB,0,0,18,-15,3.099 +SB,0,0,18,-5,2.379 +SB,0,0,18,5,1.756 +SB,0,0,18,15,1.23 +SB,0,0,18,25,1.084 +SB,0,0,18,35,1.402 +SB,0,0,25.2,-15,2.201 +SB,0,0,25.2,-5,1.806 +SB,0,0,25.2,5,1.448 +SB,0,0,25.2,15,1.127 +SB,0,0,25.2,25,1.028 +SB,0,0,25.2,35,1.223 +SB,0,0,30,-15,1.953 +SB,0,0,30,-5,1.628 +SB,0,0,30,5,1.331 +SB,0,0,30,15,1.062 +SB,0,0,30,25,0.977 +SB,0,0,30,35,1.137 +SB,0,0,37.1,-15,1.76 +SB,0,0,37.1,-5,1.484 +SB,0,0,37.1,5,1.232 +SB,0,0,37.1,15,1.006 +SB,0,0,37.1,25,0.932 +SB,0,0,37.1,35,1.062 +SB,0,0.01,12.1,-15,4.742 +SB,0,0.01,12.1,-5,3.597 +SB,0,0.01,12.1,5,2.618 +SB,0,0.01,12.1,15,1.808 +SB,0,0.01,12.1,25,1.592 +SB,0,0.01,12.1,35,2.087 +SB,0,0.01,18,-15,3.497 +SB,0,0.01,18,-5,2.777 +SB,0,0.01,18,5,2.154 +SB,0,0.01,18,15,1.628 +SB,0,0.01,18,25,1.482 +SB,0,0.01,18,35,1.8 +SB,0,0.01,25.2,-15,2.602 +SB,0,0.01,25.2,-5,2.207 +SB,0,0.01,25.2,5,1.849 +SB,0,0.01,25.2,15,1.528 +SB,0,0.01,25.2,25,1.429 +SB,0,0.01,25.2,35,1.624 +SB,0,0.01,30,-15,2.364 +SB,0,0.01,30,-5,2.039 +SB,0,0.01,30,5,1.743 +SB,0,0.01,30,15,1.474 +SB,0,0.01,30,25,1.388 +SB,0,0.01,30,35,1.548 +SB,0,0.01,37.1,-15,2.183 +SB,0,0.01,37.1,-5,1.907 +SB,0,0.01,37.1,5,1.655 +SB,0,0.01,37.1,15,1.428 +SB,0,0.01,37.1,25,1.354 +SB,0,0.01,37.1,35,1.484 +SB,0,0.02,12.1,-15,5.128 +SB,0,0.02,12.1,-5,3.983 +SB,0,0.02,12.1,5,3.005 +SB,0,0.02,12.1,15,2.194 +SB,0,0.02,12.1,25,1.978 +SB,0,0.02,12.1,35,2.473 +SB,0,0.02,18,-15,3.895 +SB,0,0.02,18,-5,3.175 +SB,0,0.02,18,5,2.551 +SB,0,0.02,18,15,2.026 +SB,0,0.02,18,25,1.88 +SB,0,0.02,18,35,2.198 +SB,0,0.02,25.2,-15,3.003 +SB,0,0.02,25.2,-5,2.608 +SB,0,0.02,25.2,5,2.25 +SB,0,0.02,25.2,15,1.928 +SB,0,0.02,25.2,25,1.83 +SB,0,0.02,25.2,35,2.025 +SB,0,0.02,30,-15,2.775 +SB,0,0.02,30,-5,2.451 +SB,0,0.02,30,5,2.154 +SB,0,0.02,30,15,1.885 +SB,0,0.02,30,25,1.8 +SB,0,0.02,30,35,1.96 +SB,0,0.02,37.1,-15,2.606 +SB,0,0.02,37.1,-5,2.329 +SB,0,0.02,37.1,5,2.078 +SB,0,0.02,37.1,15,1.851 +SB,0,0.02,37.1,25,1.777 +SB,0,0.02,37.1,35,1.907 +SB,0,0.03,12.1,-15,5.514 +SB,0,0.03,12.1,-5,4.37 +SB,0,0.03,12.1,5,3.391 +SB,0,0.03,12.1,15,2.58 +SB,0,0.03,12.1,25,2.364 +SB,0,0.03,12.1,35,2.859 +SB,0,0.03,18,-15,4.293 +SB,0,0.03,18,-5,3.573 +SB,0,0.03,18,5,2.949 +SB,0,0.03,18,15,2.424 +SB,0,0.03,18,25,2.278 +SB,0,0.03,18,35,2.596 +SB,0,0.03,25.2,-15,3.405 +SB,0,0.03,25.2,-5,3.01 +SB,0,0.03,25.2,5,2.652 +SB,0,0.03,25.2,15,2.33 +SB,0,0.03,25.2,25,2.231 +SB,0,0.03,25.2,35,2.427 +SB,0,0.03,30,-15,3.187 +SB,0,0.03,30,-5,2.862 +SB,0,0.03,30,5,2.566 +SB,0,0.03,30,15,2.297 +SB,0,0.03,30,25,2.211 +SB,0,0.03,30,35,2.371 +SB,0,0.03,37.1,-15,3.028 +SB,0,0.03,37.1,-5,2.752 +SB,0,0.03,37.1,5,2.5 +SB,0,0.03,37.1,15,2.274 +SB,0,0.03,37.1,25,2.2 +SB,0,0.03,37.1,35,2.329 +SB,0,0.04,12.1,-15,5.9 +SB,0,0.04,12.1,-5,4.756 +SB,0,0.04,12.1,5,3.777 +SB,0,0.04,12.1,15,2.966 +SB,0,0.04,12.1,25,2.75 +SB,0,0.04,12.1,35,3.245 +SB,0,0.04,18,-15,4.691 +SB,0,0.04,18,-5,3.971 +SB,0,0.04,18,5,3.347 +SB,0,0.04,18,15,2.821 +SB,0,0.04,18,25,2.676 +SB,0,0.04,18,35,2.994 +SB,0,0.04,25.2,-15,3.806 +SB,0,0.04,25.2,-5,3.411 +SB,0,0.04,25.2,5,3.053 +SB,0,0.04,25.2,15,2.732 +SB,0,0.04,25.2,25,2.633 +SB,0,0.04,25.2,35,2.828 +SB,0,0.04,30,-15,3.599 +SB,0,0.04,30,-5,3.274 +SB,0,0.04,30,5,2.977 +SB,0,0.04,30,15,2.709 +SB,0,0.04,30,25,2.623 +SB,0,0.04,30,35,2.783 +SB,0,0.04,37.1,-15,3.451 +SB,0,0.04,37.1,-5,3.175 +SB,0,0.04,37.1,5,2.923 +SB,0,0.04,37.1,15,2.696 +SB,0,0.04,37.1,25,2.623 +SB,0,0.04,37.1,35,2.752 +SB,0.3,-0.04,12.1,-15,2.648 +SB,0.3,-0.04,12.1,-5,1.504 +SB,0.3,-0.04,12.1,5,0.526 +SB,0.3,-0.04,12.1,15,-0.284 +SB,0.3,-0.04,12.1,25,-0.177 +SB,0.3,-0.04,12.1,35,0.373 +SB,0.3,-0.04,18,-15,1.4 +SB,0.3,-0.04,18,-5,0.682 +SB,0.3,-0.04,18,5,0.059 +SB,0.3,-0.04,18,15,-0.466 +SB,0.3,-0.04,18,25,-0.393 +SB,0.3,-0.04,18,35,-0.036 +SB,0.3,-0.04,25.2,-15,0.505 +SB,0.3,-0.04,25.2,-5,0.111 +SB,0.3,-0.04,25.2,5,-0.246 +SB,0.3,-0.04,25.2,15,-0.566 +SB,0.3,-0.04,25.2,25,-0.508 +SB,0.3,-0.04,25.2,35,-0.285 +SB,0.3,-0.04,30,-15,0.268 +SB,0.3,-0.04,30,-5,-0.054 +SB,0.3,-0.04,30,5,-0.349 +SB,0.3,-0.04,30,15,-0.616 +SB,0.3,-0.04,30,25,-0.569 +SB,0.3,-0.04,30,35,-0.385 +SB,0.3,-0.04,37.1,-15,0.085 +SB,0.3,-0.04,37.1,-5,-0.189 +SB,0.3,-0.04,37.1,5,-0.437 +SB,0.3,-0.04,37.1,15,-0.661 +SB,0.3,-0.04,37.1,25,-0.627 +SB,0.3,-0.04,37.1,35,-0.477 +SB,0.3,-0.03,12.1,-15,3.025 +SB,0.3,-0.03,12.1,-5,1.881 +SB,0.3,-0.03,12.1,5,0.902 +SB,0.3,-0.03,12.1,15,0.092 +SB,0.3,-0.03,12.1,25,0.2 +SB,0.3,-0.03,12.1,35,0.75 +SB,0.3,-0.03,18,-15,1.786 +SB,0.3,-0.03,18,-5,1.067 +SB,0.3,-0.03,18,5,0.444 +SB,0.3,-0.03,18,15,-0.08 +SB,0.3,-0.03,18,25,-0.007 +SB,0.3,-0.03,18,35,0.349 +SB,0.3,-0.03,25.2,-15,0.901 +SB,0.3,-0.03,25.2,-5,0.507 +SB,0.3,-0.03,25.2,5,0.151 +SB,0.3,-0.03,25.2,15,-0.17 +SB,0.3,-0.03,25.2,25,-0.112 +SB,0.3,-0.03,25.2,35,0.111 +SB,0.3,-0.03,30,-15,0.651 +SB,0.3,-0.03,30,-5,0.329 +SB,0.3,-0.03,30,5,0.034 +SB,0.3,-0.03,30,15,-0.233 +SB,0.3,-0.03,30,25,-0.186 +SB,0.3,-0.03,30,35,-0.002 +SB,0.3,-0.03,37.1,-15,0.455 +SB,0.3,-0.03,37.1,-5,0.181 +SB,0.3,-0.03,37.1,5,-0.067 +SB,0.3,-0.03,37.1,15,-0.292 +SB,0.3,-0.03,37.1,25,-0.257 +SB,0.3,-0.03,37.1,35,-0.107 +SB,0.3,-0.02,12.1,-15,3.402 +SB,0.3,-0.02,12.1,-5,2.257 +SB,0.3,-0.02,12.1,5,1.279 +SB,0.3,-0.02,12.1,15,0.469 +SB,0.3,-0.02,12.1,25,0.577 +SB,0.3,-0.02,12.1,35,1.127 +SB,0.3,-0.02,18,-15,2.171 +SB,0.3,-0.02,18,-5,1.452 +SB,0.3,-0.02,18,5,0.83 +SB,0.3,-0.02,18,15,0.305 +SB,0.3,-0.02,18,25,0.378 +SB,0.3,-0.02,18,35,0.735 +SB,0.3,-0.02,25.2,-15,1.298 +SB,0.3,-0.02,25.2,-5,0.904 +SB,0.3,-0.02,25.2,5,0.548 +SB,0.3,-0.02,25.2,15,0.227 +SB,0.3,-0.02,25.2,25,0.285 +SB,0.3,-0.02,25.2,35,0.508 +SB,0.3,-0.02,30,-15,1.035 +SB,0.3,-0.02,30,-5,0.713 +SB,0.3,-0.02,30,5,0.418 +SB,0.3,-0.02,30,15,0.151 +SB,0.3,-0.02,30,25,0.198 +SB,0.3,-0.02,30,35,0.382 +SB,0.3,-0.02,37.1,-15,0.825 +SB,0.3,-0.02,37.1,-5,0.551 +SB,0.3,-0.02,37.1,5,0.303 +SB,0.3,-0.02,37.1,15,0.078 +SB,0.3,-0.02,37.1,25,0.113 +SB,0.3,-0.02,37.1,35,0.263 +SB,0.3,-0.01,12.1,-15,3.79 +SB,0.3,-0.01,12.1,-5,2.646 +SB,0.3,-0.01,12.1,5,1.667 +SB,0.3,-0.01,12.1,15,0.856 +SB,0.3,-0.01,12.1,25,0.964 +SB,0.3,-0.01,12.1,35,1.514 +SB,0.3,-0.01,18,-15,2.587 +SB,0.3,-0.01,18,-5,1.867 +SB,0.3,-0.01,18,5,1.243 +SB,0.3,-0.01,18,15,0.717 +SB,0.3,-0.01,18,25,0.79 +SB,0.3,-0.01,18,35,1.145 +SB,0.3,-0.01,25.2,-15,1.728 +SB,0.3,-0.01,25.2,-5,1.333 +SB,0.3,-0.01,25.2,5,0.975 +SB,0.3,-0.01,25.2,15,0.653 +SB,0.3,-0.01,25.2,25,0.71 +SB,0.3,-0.01,25.2,35,0.932 +SB,0.3,-0.01,30,-15,1.475 +SB,0.3,-0.01,30,-5,1.151 +SB,0.3,-0.01,30,5,0.854 +SB,0.3,-0.01,30,15,0.585 +SB,0.3,-0.01,30,25,0.63 +SB,0.3,-0.01,30,35,0.813 +SB,0.3,-0.01,37.1,-15,1.278 +SB,0.3,-0.01,37.1,-5,1.002 +SB,0.3,-0.01,37.1,5,0.75 +SB,0.3,-0.01,37.1,15,0.523 +SB,0.3,-0.01,37.1,25,0.555 +SB,0.3,-0.01,37.1,35,0.703 +SB,0.3,0,12.1,-15,4.23 +SB,0.3,0,12.1,-5,3.086 +SB,0.3,0,12.1,5,2.107 +SB,0.3,0,12.1,15,1.296 +SB,0.3,0,12.1,25,1.404 +SB,0.3,0,12.1,35,1.953 +SB,0.3,0,18,-15,3.04 +SB,0.3,0,18,-5,2.32 +SB,0.3,0,18,5,1.696 +SB,0.3,0,18,15,1.17 +SB,0.3,0,18,25,1.243 +SB,0.3,0,18,35,1.598 +SB,0.3,0,25.2,-15,2.185 +SB,0.3,0,25.2,-5,1.79 +SB,0.3,0,25.2,5,1.432 +SB,0.3,0,25.2,15,1.11 +SB,0.3,0,25.2,25,1.167 +SB,0.3,0,25.2,35,1.389 +SB,0.3,0,30,-15,1.944 +SB,0.3,0,30,-5,1.619 +SB,0.3,0,30,5,1.323 +SB,0.3,0,30,15,1.054 +SB,0.3,0,30,25,1.099 +SB,0.3,0,30,35,1.282 +SB,0.3,0,37.1,-15,1.759 +SB,0.3,0,37.1,-5,1.483 +SB,0.3,0,37.1,5,1.232 +SB,0.3,0,37.1,15,1.005 +SB,0.3,0,37.1,25,1.037 +SB,0.3,0,37.1,35,1.184 +SB,0.3,0.01,12.1,-15,4.67 +SB,0.3,0.01,12.1,-5,3.526 +SB,0.3,0.01,12.1,5,2.547 +SB,0.3,0.01,12.1,15,1.737 +SB,0.3,0.01,12.1,25,1.844 +SB,0.3,0.01,12.1,35,2.394 +SB,0.3,0.01,18,-15,3.494 +SB,0.3,0.01,18,-5,2.773 +SB,0.3,0.01,18,5,2.15 +SB,0.3,0.01,18,15,1.624 +SB,0.3,0.01,18,25,1.696 +SB,0.3,0.01,18,35,2.052 +SB,0.3,0.01,25.2,-15,2.642 +SB,0.3,0.01,25.2,-5,2.247 +SB,0.3,0.01,25.2,5,1.889 +SB,0.3,0.01,25.2,15,1.567 +SB,0.3,0.01,25.2,25,1.624 +SB,0.3,0.01,25.2,35,1.846 +SB,0.3,0.01,30,-15,2.413 +SB,0.3,0.01,30,-5,2.089 +SB,0.3,0.01,30,5,1.792 +SB,0.3,0.01,30,15,1.523 +SB,0.3,0.01,30,25,1.568 +SB,0.3,0.01,30,35,1.751 +SB,0.3,0.01,37.1,-15,2.241 +SB,0.3,0.01,37.1,-5,1.965 +SB,0.3,0.01,37.1,5,1.713 +SB,0.3,0.01,37.1,15,1.487 +SB,0.3,0.01,37.1,25,1.518 +SB,0.3,0.01,37.1,35,1.666 +SB,0.3,0.02,12.1,-15,5.111 +SB,0.3,0.02,12.1,-5,3.966 +SB,0.3,0.02,12.1,5,2.987 +SB,0.3,0.02,12.1,15,2.177 +SB,0.3,0.02,12.1,25,2.284 +SB,0.3,0.02,12.1,35,2.834 +SB,0.3,0.02,18,-15,3.947 +SB,0.3,0.02,18,-5,3.227 +SB,0.3,0.02,18,5,2.604 +SB,0.3,0.02,18,15,2.078 +SB,0.3,0.02,18,25,2.15 +SB,0.3,0.02,18,35,2.506 +SB,0.3,0.02,25.2,-15,3.099 +SB,0.3,0.02,25.2,-5,2.704 +SB,0.3,0.02,25.2,5,2.346 +SB,0.3,0.02,25.2,15,2.024 +SB,0.3,0.02,25.2,25,2.081 +SB,0.3,0.02,25.2,35,2.303 +SB,0.3,0.02,30,-15,2.882 +SB,0.3,0.02,30,-5,2.558 +SB,0.3,0.02,30,5,2.261 +SB,0.3,0.02,30,15,1.992 +SB,0.3,0.02,30,25,2.037 +SB,0.3,0.02,30,35,2.22 +SB,0.3,0.02,37.1,-15,2.723 +SB,0.3,0.02,37.1,-5,2.447 +SB,0.3,0.02,37.1,5,2.195 +SB,0.3,0.02,37.1,15,1.969 +SB,0.3,0.02,37.1,25,2.001 +SB,0.3,0.02,37.1,35,2.148 +SB,0.3,0.03,12.1,-15,5.551 +SB,0.3,0.03,12.1,-5,4.406 +SB,0.3,0.03,12.1,5,3.428 +SB,0.3,0.03,12.1,15,2.617 +SB,0.3,0.03,12.1,25,2.724 +SB,0.3,0.03,12.1,35,3.274 +SB,0.3,0.03,18,-15,4.401 +SB,0.3,0.03,18,-5,3.681 +SB,0.3,0.03,18,5,3.057 +SB,0.3,0.03,18,15,2.532 +SB,0.3,0.03,18,25,2.604 +SB,0.3,0.03,18,35,2.96 +SB,0.3,0.03,25.2,-15,3.557 +SB,0.3,0.03,25.2,-5,3.162 +SB,0.3,0.03,25.2,5,2.804 +SB,0.3,0.03,25.2,15,2.482 +SB,0.3,0.03,25.2,25,2.539 +SB,0.3,0.03,25.2,35,2.761 +SB,0.3,0.03,30,-15,3.352 +SB,0.3,0.03,30,-5,3.027 +SB,0.3,0.03,30,5,2.73 +SB,0.3,0.03,30,15,2.462 +SB,0.3,0.03,30,25,2.507 +SB,0.3,0.03,30,35,2.689 +SB,0.3,0.03,37.1,-15,3.205 +SB,0.3,0.03,37.1,-5,2.929 +SB,0.3,0.03,37.1,5,2.677 +SB,0.3,0.03,37.1,15,2.451 +SB,0.3,0.03,37.1,25,2.483 +SB,0.3,0.03,37.1,35,2.63 +SB,0.3,0.04,12.1,-15,5.991 +SB,0.3,0.04,12.1,-5,4.847 +SB,0.3,0.04,12.1,5,3.868 +SB,0.3,0.04,12.1,15,3.057 +SB,0.3,0.04,12.1,25,3.165 +SB,0.3,0.04,12.1,35,3.714 +SB,0.3,0.04,18,-15,4.855 +SB,0.3,0.04,18,-5,4.135 +SB,0.3,0.04,18,5,3.511 +SB,0.3,0.04,18,15,2.985 +SB,0.3,0.04,18,25,3.057 +SB,0.3,0.04,18,35,3.413 +SB,0.3,0.04,25.2,-15,4.015 +SB,0.3,0.04,25.2,-5,3.62 +SB,0.3,0.04,25.2,5,3.262 +SB,0.3,0.04,25.2,15,2.94 +SB,0.3,0.04,25.2,25,2.997 +SB,0.3,0.04,25.2,35,3.219 +SB,0.3,0.04,30,-15,3.821 +SB,0.3,0.04,30,-5,3.497 +SB,0.3,0.04,30,5,3.2 +SB,0.3,0.04,30,15,2.931 +SB,0.3,0.04,30,25,2.977 +SB,0.3,0.04,30,35,3.159 +SB,0.3,0.04,37.1,-15,3.687 +SB,0.3,0.04,37.1,-5,3.411 +SB,0.3,0.04,37.1,5,3.159 +SB,0.3,0.04,37.1,15,2.933 +SB,0.3,0.04,37.1,25,2.965 +SB,0.3,0.04,37.1,35,3.112 +SB,0.6,-0.04,12.1,-15,2.329 +SB,0.6,-0.04,12.1,-5,1.185 +SB,0.6,-0.04,12.1,5,0.207 +SB,0.6,-0.04,12.1,15,-0.413 +SB,0.6,-0.04,12.1,25,-0.173 +SB,0.6,-0.04,12.1,35,0.433 +SB,0.6,-0.04,18,-15,1.143 +SB,0.6,-0.04,18,-5,0.424 +SB,0.6,-0.04,18,5,-0.198 +SB,0.6,-0.04,18,15,-0.594 +SB,0.6,-0.04,18,25,-0.432 +SB,0.6,-0.04,18,35,-0.038 +SB,0.6,-0.04,25.2,-15,0.286 +SB,0.6,-0.04,25.2,-5,-0.108 +SB,0.6,-0.04,25.2,5,-0.465 +SB,0.6,-0.04,25.2,15,-0.689 +SB,0.6,-0.04,25.2,25,-0.572 +SB,0.6,-0.04,25.2,35,-0.322 +SB,0.6,-0.04,30,-15,0.061 +SB,0.6,-0.04,30,-5,-0.262 +SB,0.6,-0.04,30,5,-0.556 +SB,0.6,-0.04,30,15,-0.743 +SB,0.6,-0.04,30,25,-0.646 +SB,0.6,-0.04,30,35,-0.439 +SB,0.6,-0.04,37.1,-15,-0.112 +SB,0.6,-0.04,37.1,-5,-0.385 +SB,0.6,-0.04,37.1,5,-0.634 +SB,0.6,-0.04,37.1,15,-0.795 +SB,0.6,-0.04,37.1,25,-0.718 +SB,0.6,-0.04,37.1,35,-0.55 +SB,0.6,-0.03,12.1,-15,2.752 +SB,0.6,-0.03,12.1,-5,1.608 +SB,0.6,-0.03,12.1,5,0.63 +SB,0.6,-0.03,12.1,15,0.01 +SB,0.6,-0.03,12.1,25,0.251 +SB,0.6,-0.03,12.1,35,0.856 +SB,0.6,-0.03,18,-15,1.576 +SB,0.6,-0.03,18,-5,0.857 +SB,0.6,-0.03,18,5,0.234 +SB,0.6,-0.03,18,15,-0.162 +SB,0.6,-0.03,18,25,0.001 +SB,0.6,-0.03,18,35,0.395 +SB,0.6,-0.03,25.2,-15,0.731 +SB,0.6,-0.03,25.2,-5,0.337 +SB,0.6,-0.03,25.2,5,-0.02 +SB,0.6,-0.03,25.2,15,-0.244 +SB,0.6,-0.03,25.2,25,-0.127 +SB,0.6,-0.03,25.2,35,0.123 +SB,0.6,-0.03,30,-15,0.491 +SB,0.6,-0.03,30,-5,0.168 +SB,0.6,-0.03,30,5,-0.126 +SB,0.6,-0.03,30,15,-0.313 +SB,0.6,-0.03,30,25,-0.216 +SB,0.6,-0.03,30,35,-0.009 +SB,0.6,-0.03,37.1,-15,0.303 +SB,0.6,-0.03,37.1,-5,0.03 +SB,0.6,-0.03,37.1,5,-0.218 +SB,0.6,-0.03,37.1,15,-0.379 +SB,0.6,-0.03,37.1,25,-0.303 +SB,0.6,-0.03,37.1,35,-0.134 +SB,0.6,-0.02,12.1,-15,3.175 +SB,0.6,-0.02,12.1,-5,2.031 +SB,0.6,-0.02,12.1,5,1.053 +SB,0.6,-0.02,12.1,15,0.433 +SB,0.6,-0.02,12.1,25,0.674 +SB,0.6,-0.02,12.1,35,1.279 +SB,0.6,-0.02,18,-15,2.008 +SB,0.6,-0.02,18,-5,1.29 +SB,0.6,-0.02,18,5,0.667 +SB,0.6,-0.02,18,15,0.271 +SB,0.6,-0.02,18,25,0.434 +SB,0.6,-0.02,18,35,0.828 +SB,0.6,-0.02,25.2,-15,1.176 +SB,0.6,-0.02,25.2,-5,0.783 +SB,0.6,-0.02,25.2,5,0.426 +SB,0.6,-0.02,25.2,15,0.202 +SB,0.6,-0.02,25.2,25,0.319 +SB,0.6,-0.02,25.2,35,0.569 +SB,0.6,-0.02,30,-15,0.922 +SB,0.6,-0.02,30,-5,0.599 +SB,0.6,-0.02,30,5,0.305 +SB,0.6,-0.02,30,15,0.118 +SB,0.6,-0.02,30,25,0.215 +SB,0.6,-0.02,30,35,0.422 +SB,0.6,-0.02,37.1,-15,0.719 +SB,0.6,-0.02,37.1,-5,0.446 +SB,0.6,-0.02,37.1,5,0.197 +SB,0.6,-0.02,37.1,15,0.036 +SB,0.6,-0.02,37.1,25,0.113 +SB,0.6,-0.02,37.1,35,0.281 +SB,0.6,-0.01,12.1,-15,3.611 +SB,0.6,-0.01,12.1,-5,2.466 +SB,0.6,-0.01,12.1,5,1.487 +SB,0.6,-0.01,12.1,15,0.867 +SB,0.6,-0.01,12.1,25,1.107 +SB,0.6,-0.01,12.1,35,1.713 +SB,0.6,-0.01,18,-15,2.472 +SB,0.6,-0.01,18,-5,1.751 +SB,0.6,-0.01,18,5,1.128 +SB,0.6,-0.01,18,15,0.731 +SB,0.6,-0.01,18,25,0.893 +SB,0.6,-0.01,18,35,1.286 +SB,0.6,-0.01,25.2,-15,1.655 +SB,0.6,-0.01,25.2,-5,1.26 +SB,0.6,-0.01,25.2,5,0.902 +SB,0.6,-0.01,25.2,15,0.677 +SB,0.6,-0.01,25.2,25,0.793 +SB,0.6,-0.01,25.2,35,1.042 +SB,0.6,-0.01,30,-15,1.409 +SB,0.6,-0.01,30,-5,1.085 +SB,0.6,-0.01,30,5,0.788 +SB,0.6,-0.01,30,15,0.599 +SB,0.6,-0.01,30,25,0.695 +SB,0.6,-0.01,30,35,0.9 +SB,0.6,-0.01,37.1,-15,1.218 +SB,0.6,-0.01,37.1,-5,0.941 +SB,0.6,-0.01,37.1,5,0.69 +SB,0.6,-0.01,37.1,15,0.526 +SB,0.6,-0.01,37.1,25,0.601 +SB,0.6,-0.01,37.1,35,0.767 +SB,0.6,0,12.1,-15,4.104 +SB,0.6,0,12.1,-5,2.96 +SB,0.6,0,12.1,5,1.981 +SB,0.6,0,12.1,15,1.36 +SB,0.6,0,12.1,25,1.601 +SB,0.6,0,12.1,35,2.206 +SB,0.6,0,18,-15,2.98 +SB,0.6,0,18,-5,2.26 +SB,0.6,0,18,5,1.637 +SB,0.6,0,18,15,1.24 +SB,0.6,0,18,25,1.401 +SB,0.6,0,18,35,1.794 +SB,0.6,0,25.2,-15,2.168 +SB,0.6,0,25.2,-5,1.773 +SB,0.6,0,25.2,5,1.415 +SB,0.6,0,25.2,15,1.19 +SB,0.6,0,25.2,25,1.306 +SB,0.6,0,25.2,35,1.555 +SB,0.6,0,30,-15,1.936 +SB,0.6,0,30,-5,1.611 +SB,0.6,0,30,5,1.314 +SB,0.6,0,30,15,1.126 +SB,0.6,0,30,25,1.222 +SB,0.6,0,30,35,1.426 +SB,0.6,0,37.1,-15,1.759 +SB,0.6,0,37.1,-5,1.482 +SB,0.6,0,37.1,5,1.231 +SB,0.6,0,37.1,15,1.067 +SB,0.6,0,37.1,25,1.141 +SB,0.6,0,37.1,35,1.307 +SB,0.6,0.01,12.1,-15,4.599 +SB,0.6,0.01,12.1,-5,3.454 +SB,0.6,0.01,12.1,5,2.476 +SB,0.6,0.01,12.1,15,1.855 +SB,0.6,0.01,12.1,25,2.096 +SB,0.6,0.01,12.1,35,2.701 +SB,0.6,0.01,18,-15,3.49 +SB,0.6,0.01,18,-5,2.77 +SB,0.6,0.01,18,5,2.146 +SB,0.6,0.01,18,15,1.749 +SB,0.6,0.01,18,25,1.911 +SB,0.6,0.01,18,35,2.304 +SB,0.6,0.01,25.2,-15,2.681 +SB,0.6,0.01,25.2,-5,2.287 +SB,0.6,0.01,25.2,5,1.928 +SB,0.6,0.01,25.2,15,1.703 +SB,0.6,0.01,25.2,25,1.819 +SB,0.6,0.01,25.2,35,2.068 +SB,0.6,0.01,30,-15,2.463 +SB,0.6,0.01,30,-5,2.138 +SB,0.6,0.01,30,5,1.841 +SB,0.6,0.01,30,15,1.653 +SB,0.6,0.01,30,25,1.748 +SB,0.6,0.01,30,35,1.953 +SB,0.6,0.01,37.1,-15,2.3 +SB,0.6,0.01,37.1,-5,2.023 +SB,0.6,0.01,37.1,5,1.772 +SB,0.6,0.01,37.1,15,1.608 +SB,0.6,0.01,37.1,25,1.683 +SB,0.6,0.01,37.1,35,1.848 +SB,0.6,0.02,12.1,-15,5.093 +SB,0.6,0.02,12.1,-5,3.949 +SB,0.6,0.02,12.1,5,2.97 +SB,0.6,0.02,12.1,15,2.349 +SB,0.6,0.02,12.1,25,2.59 +SB,0.6,0.02,12.1,35,3.195 +SB,0.6,0.02,18,-15,3.999 +SB,0.6,0.02,18,-5,3.279 +SB,0.6,0.02,18,5,2.656 +SB,0.6,0.02,18,15,2.259 +SB,0.6,0.02,18,25,2.42 +SB,0.6,0.02,18,35,2.814 +SB,0.6,0.02,25.2,-15,3.195 +SB,0.6,0.02,25.2,-5,2.8 +SB,0.6,0.02,25.2,5,2.442 +SB,0.6,0.02,25.2,15,2.216 +SB,0.6,0.02,25.2,25,2.333 +SB,0.6,0.02,25.2,35,2.582 +SB,0.6,0.02,30,-15,2.989 +SB,0.6,0.02,30,-5,2.665 +SB,0.6,0.02,30,5,2.368 +SB,0.6,0.02,30,15,2.179 +SB,0.6,0.02,30,25,2.275 +SB,0.6,0.02,30,35,2.48 +SB,0.6,0.02,37.1,-15,2.841 +SB,0.6,0.02,37.1,-5,2.565 +SB,0.6,0.02,37.1,5,2.313 +SB,0.6,0.02,37.1,15,2.15 +SB,0.6,0.02,37.1,25,2.224 +SB,0.6,0.02,37.1,35,2.39 +SB,0.6,0.03,12.1,-15,5.588 +SB,0.6,0.03,12.1,-5,4.443 +SB,0.6,0.03,12.1,5,3.464 +SB,0.6,0.03,12.1,15,2.844 +SB,0.6,0.03,12.1,25,3.084 +SB,0.6,0.03,12.1,35,3.69 +SB,0.6,0.03,18,-15,4.509 +SB,0.6,0.03,18,-5,3.789 +SB,0.6,0.03,18,5,3.165 +SB,0.6,0.03,18,15,2.768 +SB,0.6,0.03,18,25,2.93 +SB,0.6,0.03,18,35,3.323 +SB,0.6,0.03,25.2,-15,3.709 +SB,0.6,0.03,25.2,-5,3.314 +SB,0.6,0.03,25.2,5,2.956 +SB,0.6,0.03,25.2,15,2.731 +SB,0.6,0.03,25.2,25,2.847 +SB,0.6,0.03,25.2,35,3.096 +SB,0.6,0.03,30,-15,3.517 +SB,0.6,0.03,30,-5,3.192 +SB,0.6,0.03,30,5,2.895 +SB,0.6,0.03,30,15,2.707 +SB,0.6,0.03,30,25,2.802 +SB,0.6,0.03,30,35,3.007 +SB,0.6,0.03,37.1,-15,3.382 +SB,0.6,0.03,37.1,-5,3.106 +SB,0.6,0.03,37.1,5,2.855 +SB,0.6,0.03,37.1,15,2.691 +SB,0.6,0.03,37.1,25,2.765 +SB,0.6,0.03,37.1,35,2.931 +SB,0.6,0.04,12.1,-15,6.082 +SB,0.6,0.04,12.1,-5,4.938 +SB,0.6,0.04,12.1,5,3.959 +SB,0.6,0.04,12.1,15,3.338 +SB,0.6,0.04,12.1,25,3.579 +SB,0.6,0.04,12.1,35,4.184 +SB,0.6,0.04,18,-15,5.018 +SB,0.6,0.04,18,-5,4.298 +SB,0.6,0.04,18,5,3.675 +SB,0.6,0.04,18,15,3.278 +SB,0.6,0.04,18,25,3.439 +SB,0.6,0.04,18,35,3.833 +SB,0.6,0.04,25.2,-15,4.223 +SB,0.6,0.04,25.2,-5,3.828 +SB,0.6,0.04,25.2,5,3.47 +SB,0.6,0.04,25.2,15,3.245 +SB,0.6,0.04,25.2,25,3.361 +SB,0.6,0.04,25.2,35,3.61 +SB,0.6,0.04,30,-15,4.044 +SB,0.6,0.04,30,-5,3.719 +SB,0.6,0.04,30,5,3.423 +SB,0.6,0.04,30,15,3.234 +SB,0.6,0.04,30,25,3.33 +SB,0.6,0.04,30,35,3.535 +SB,0.6,0.04,37.1,-15,3.924 +SB,0.6,0.04,37.1,-5,3.647 +SB,0.6,0.04,37.1,5,3.396 +SB,0.6,0.04,37.1,15,3.232 +SB,0.6,0.04,37.1,25,3.307 +SB,0.6,0.04,37.1,35,3.472 +SB,0.9,-0.04,12.1,-15,2.01 +SB,0.9,-0.04,12.1,-5,0.866 +SB,0.9,-0.04,12.1,5,-0.112 +SB,0.9,-0.04,12.1,15,-0.504 +SB,0.9,-0.04,12.1,25,-0.168 +SB,0.9,-0.04,12.1,35,0.493 +SB,0.9,-0.04,18,-15,0.886 +SB,0.9,-0.04,18,-5,0.167 +SB,0.9,-0.04,18,5,-0.456 +SB,0.9,-0.04,18,15,-0.694 +SB,0.9,-0.04,18,25,-0.471 +SB,0.9,-0.04,18,35,-0.04 +SB,0.9,-0.04,25.2,-15,0.067 +SB,0.9,-0.04,25.2,-5,-0.327 +SB,0.9,-0.04,25.2,5,-0.684 +SB,0.9,-0.04,25.2,15,-0.789 +SB,0.9,-0.04,25.2,25,-0.635 +SB,0.9,-0.04,25.2,35,-0.359 +SB,0.9,-0.04,30,-15,-0.147 +SB,0.9,-0.04,30,-5,-0.469 +SB,0.9,-0.04,30,5,-0.764 +SB,0.9,-0.04,30,15,-0.85 +SB,0.9,-0.04,30,25,-0.723 +SB,0.9,-0.04,30,35,-0.494 +SB,0.9,-0.04,37.1,-15,-0.308 +SB,0.9,-0.04,37.1,-5,-0.582 +SB,0.9,-0.04,37.1,5,-0.83 +SB,0.9,-0.04,37.1,15,-0.91 +SB,0.9,-0.04,37.1,25,-0.809 +SB,0.9,-0.04,37.1,35,-0.622 +SB,0.9,-0.03,12.1,-15,2.48 +SB,0.9,-0.03,12.1,-5,1.336 +SB,0.9,-0.03,12.1,5,0.357 +SB,0.9,-0.03,12.1,15,-0.034 +SB,0.9,-0.03,12.1,25,0.301 +SB,0.9,-0.03,12.1,35,0.963 +SB,0.9,-0.03,18,-15,1.366 +SB,0.9,-0.03,18,-5,0.647 +SB,0.9,-0.03,18,5,0.024 +SB,0.9,-0.03,18,15,-0.214 +SB,0.9,-0.03,18,25,0.009 +SB,0.9,-0.03,18,35,0.441 +SB,0.9,-0.03,25.2,-15,0.56 +SB,0.9,-0.03,25.2,-5,0.167 +SB,0.9,-0.03,25.2,5,-0.19 +SB,0.9,-0.03,25.2,15,-0.295 +SB,0.9,-0.03,25.2,25,-0.141 +SB,0.9,-0.03,25.2,35,0.135 +SB,0.9,-0.03,30,-15,0.331 +SB,0.9,-0.03,30,-5,0.008 +SB,0.9,-0.03,30,5,-0.287 +SB,0.9,-0.03,30,15,-0.373 +SB,0.9,-0.03,30,25,-0.245 +SB,0.9,-0.03,30,35,-0.016 +SB,0.9,-0.03,37.1,-15,0.152 +SB,0.9,-0.03,37.1,-5,-0.121 +SB,0.9,-0.03,37.1,5,-0.37 +SB,0.9,-0.03,37.1,15,-0.45 +SB,0.9,-0.03,37.1,25,-0.348 +SB,0.9,-0.03,37.1,35,-0.162 +SB,0.9,-0.02,12.1,-15,2.949 +SB,0.9,-0.02,12.1,-5,1.805 +SB,0.9,-0.02,12.1,5,0.827 +SB,0.9,-0.02,12.1,15,0.435 +SB,0.9,-0.02,12.1,25,0.771 +SB,0.9,-0.02,12.1,35,1.432 +SB,0.9,-0.02,18,-15,1.846 +SB,0.9,-0.02,18,-5,1.127 +SB,0.9,-0.02,18,5,0.504 +SB,0.9,-0.02,18,15,0.266 +SB,0.9,-0.02,18,25,0.489 +SB,0.9,-0.02,18,35,0.921 +SB,0.9,-0.02,25.2,-15,1.055 +SB,0.9,-0.02,25.2,-5,0.661 +SB,0.9,-0.02,25.2,5,0.304 +SB,0.9,-0.02,25.2,15,0.199 +SB,0.9,-0.02,25.2,25,0.353 +SB,0.9,-0.02,25.2,35,0.63 +SB,0.9,-0.02,30,-15,0.809 +SB,0.9,-0.02,30,-5,0.486 +SB,0.9,-0.02,30,5,0.191 +SB,0.9,-0.02,30,15,0.105 +SB,0.9,-0.02,30,25,0.233 +SB,0.9,-0.02,30,35,0.462 +SB,0.9,-0.02,37.1,-15,0.613 +SB,0.9,-0.02,37.1,-5,0.34 +SB,0.9,-0.02,37.1,5,0.091 +SB,0.9,-0.02,37.1,15,0.011 +SB,0.9,-0.02,37.1,25,0.113 +SB,0.9,-0.02,37.1,35,0.299 +SB,0.9,-0.01,12.1,-15,3.431 +SB,0.9,-0.01,12.1,-5,2.286 +SB,0.9,-0.01,12.1,5,1.307 +SB,0.9,-0.01,12.1,15,0.915 +SB,0.9,-0.01,12.1,25,1.251 +SB,0.9,-0.01,12.1,35,1.911 +SB,0.9,-0.01,18,-15,2.356 +SB,0.9,-0.01,18,-5,1.636 +SB,0.9,-0.01,18,5,1.013 +SB,0.9,-0.01,18,15,0.773 +SB,0.9,-0.01,18,25,0.995 +SB,0.9,-0.01,18,35,1.426 +SB,0.9,-0.01,25.2,-15,1.582 +SB,0.9,-0.01,25.2,-5,1.187 +SB,0.9,-0.01,25.2,5,0.829 +SB,0.9,-0.01,25.2,15,0.723 +SB,0.9,-0.01,25.2,25,0.876 +SB,0.9,-0.01,25.2,35,1.152 +SB,0.9,-0.01,30,-15,1.343 +SB,0.9,-0.01,30,-5,1.019 +SB,0.9,-0.01,30,5,0.722 +SB,0.9,-0.01,30,15,0.634 +SB,0.9,-0.01,30,25,0.76 +SB,0.9,-0.01,30,35,0.987 +SB,0.9,-0.01,37.1,-15,1.158 +SB,0.9,-0.01,37.1,-5,0.881 +SB,0.9,-0.01,37.1,5,0.63 +SB,0.9,-0.01,37.1,15,0.547 +SB,0.9,-0.01,37.1,25,0.646 +SB,0.9,-0.01,37.1,35,0.83 +SB,0.9,0,12.1,-15,3.979 +SB,0.9,0,12.1,-5,2.834 +SB,0.9,0,12.1,5,1.855 +SB,0.9,0,12.1,15,1.463 +SB,0.9,0,12.1,25,1.798 +SB,0.9,0,12.1,35,2.459 +SB,0.9,0,18,-15,2.921 +SB,0.9,0,18,-5,2.201 +SB,0.9,0,18,5,1.577 +SB,0.9,0,18,15,1.338 +SB,0.9,0,18,25,1.56 +SB,0.9,0,18,35,1.991 +SB,0.9,0,25.2,-15,2.151 +SB,0.9,0,25.2,-5,1.756 +SB,0.9,0,25.2,5,1.398 +SB,0.9,0,25.2,15,1.292 +SB,0.9,0,25.2,25,1.445 +SB,0.9,0,25.2,35,1.721 +SB,0.9,0,30,-15,1.927 +SB,0.9,0,30,-5,1.603 +SB,0.9,0,30,5,1.306 +SB,0.9,0,30,15,1.218 +SB,0.9,0,30,25,1.344 +SB,0.9,0,30,35,1.571 +SB,0.9,0,37.1,-15,1.758 +SB,0.9,0,37.1,-5,1.481 +SB,0.9,0,37.1,5,1.23 +SB,0.9,0,37.1,15,1.147 +SB,0.9,0,37.1,25,1.246 +SB,0.9,0,37.1,35,1.43 +SB,0.9,0.01,12.1,-15,4.528 +SB,0.9,0.01,12.1,-5,3.383 +SB,0.9,0.01,12.1,5,2.404 +SB,0.9,0.01,12.1,15,2.012 +SB,0.9,0.01,12.1,25,2.347 +SB,0.9,0.01,12.1,35,3.008 +SB,0.9,0.01,18,-15,3.486 +SB,0.9,0.01,18,-5,2.766 +SB,0.9,0.01,18,5,2.143 +SB,0.9,0.01,18,15,1.903 +SB,0.9,0.01,18,25,2.125 +SB,0.9,0.01,18,35,2.556 +SB,0.9,0.01,25.2,-15,2.721 +SB,0.9,0.01,25.2,-5,2.326 +SB,0.9,0.01,25.2,5,1.968 +SB,0.9,0.01,25.2,15,1.862 +SB,0.9,0.01,25.2,25,2.015 +SB,0.9,0.01,25.2,35,2.29 +SB,0.9,0.01,30,-15,2.512 +SB,0.9,0.01,30,-5,2.187 +SB,0.9,0.01,30,5,1.891 +SB,0.9,0.01,30,15,1.803 +SB,0.9,0.01,30,25,1.928 +SB,0.9,0.01,30,35,2.156 +SB,0.9,0.01,37.1,-15,2.358 +SB,0.9,0.01,37.1,-5,2.082 +SB,0.9,0.01,37.1,5,1.83 +SB,0.9,0.01,37.1,15,1.747 +SB,0.9,0.01,37.1,25,1.847 +SB,0.9,0.01,37.1,35,2.031 +SB,0.9,0.02,12.1,-15,5.076 +SB,0.9,0.02,12.1,-5,3.932 +SB,0.9,0.02,12.1,5,2.953 +SB,0.9,0.02,12.1,15,2.561 +SB,0.9,0.02,12.1,25,2.896 +SB,0.9,0.02,12.1,35,3.557 +SB,0.9,0.02,18,-15,4.052 +SB,0.9,0.02,18,-5,3.332 +SB,0.9,0.02,18,5,2.708 +SB,0.9,0.02,18,15,2.468 +SB,0.9,0.02,18,25,2.691 +SB,0.9,0.02,18,35,3.121 +SB,0.9,0.02,25.2,-15,3.291 +SB,0.9,0.02,25.2,-5,2.896 +SB,0.9,0.02,25.2,5,2.538 +SB,0.9,0.02,25.2,15,2.432 +SB,0.9,0.02,25.2,25,2.584 +SB,0.9,0.02,25.2,35,2.86 +SB,0.9,0.02,30,-15,3.096 +SB,0.9,0.02,30,-5,2.772 +SB,0.9,0.02,30,5,2.475 +SB,0.9,0.02,30,15,2.387 +SB,0.9,0.02,30,25,2.513 +SB,0.9,0.02,30,35,2.74 +SB,0.9,0.02,37.1,-15,2.959 +SB,0.9,0.02,37.1,-5,2.683 +SB,0.9,0.02,37.1,5,2.431 +SB,0.9,0.02,37.1,15,2.348 +SB,0.9,0.02,37.1,25,2.447 +SB,0.9,0.02,37.1,35,2.631 +SB,0.9,0.03,12.1,-15,5.625 +SB,0.9,0.03,12.1,-5,4.48 +SB,0.9,0.03,12.1,5,3.501 +SB,0.9,0.03,12.1,15,3.109 +SB,0.9,0.03,12.1,25,3.444 +SB,0.9,0.03,12.1,35,4.105 +SB,0.9,0.03,18,-15,4.617 +SB,0.9,0.03,18,-5,3.897 +SB,0.9,0.03,18,5,3.273 +SB,0.9,0.03,18,15,3.034 +SB,0.9,0.03,18,25,3.256 +SB,0.9,0.03,18,35,3.687 +SB,0.9,0.03,25.2,-15,3.861 +SB,0.9,0.03,25.2,-5,3.466 +SB,0.9,0.03,25.2,5,3.108 +SB,0.9,0.03,25.2,15,3.002 +SB,0.9,0.03,25.2,25,3.155 +SB,0.9,0.03,25.2,35,3.431 +SB,0.9,0.03,30,-15,3.682 +SB,0.9,0.03,30,-5,3.357 +SB,0.9,0.03,30,5,3.06 +SB,0.9,0.03,30,15,2.972 +SB,0.9,0.03,30,25,3.098 +SB,0.9,0.03,30,35,3.325 +SB,0.9,0.03,37.1,-15,3.56 +SB,0.9,0.03,37.1,-5,3.283 +SB,0.9,0.03,37.1,5,3.032 +SB,0.9,0.03,37.1,15,2.949 +SB,0.9,0.03,37.1,25,3.048 +SB,0.9,0.03,37.1,35,3.232 +SB,0.9,0.04,12.1,-15,6.173 +SB,0.9,0.04,12.1,-5,5.029 +SB,0.9,0.04,12.1,5,4.05 +SB,0.9,0.04,12.1,15,3.658 +SB,0.9,0.04,12.1,25,3.993 +SB,0.9,0.04,12.1,35,4.654 +SB,0.9,0.04,18,-15,5.182 +SB,0.9,0.04,18,-5,4.462 +SB,0.9,0.04,18,5,3.839 +SB,0.9,0.04,18,15,3.599 +SB,0.9,0.04,18,25,3.821 +SB,0.9,0.04,18,35,4.252 +SB,0.9,0.04,25.2,-15,4.432 +SB,0.9,0.04,25.2,-5,4.037 +SB,0.9,0.04,25.2,5,3.679 +SB,0.9,0.04,25.2,15,3.573 +SB,0.9,0.04,25.2,25,3.725 +SB,0.9,0.04,25.2,35,4.001 +SB,0.9,0.04,30,-15,4.267 +SB,0.9,0.04,30,-5,3.942 +SB,0.9,0.04,30,5,3.645 +SB,0.9,0.04,30,15,3.557 +SB,0.9,0.04,30,25,3.683 +SB,0.9,0.04,30,35,3.91 +SB,0.9,0.04,37.1,-15,4.16 +SB,0.9,0.04,37.1,-5,3.884 +SB,0.9,0.04,37.1,5,3.632 +SB,0.9,0.04,37.1,15,3.549 +SB,0.9,0.04,37.1,25,3.649 +SB,0.9,0.04,37.1,35,3.833 AB,0,-0.04,12.1,-15,3.752 AB,0,-0.04,12.1,-5,2.322 AB,0,-0.04,12.1,5,1.069 diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 8e3a8ac6..64880ff2 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -19,29 +19,9 @@ "hc": "winter" } }, - "CKB": { + "SB": { "depb": { - "name": "articulated bus", - "capacity": 310, - "charging_curve": [[0, 250], [0.8, 250], [1, 250]], - "min_charging_power": 0, - "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" - }, - "oppb": { - "name": "articulated bus", - "capacity": 190, - "charging_curve": [[0, 190], [0.8, 190], [1, 190]], - "min_charging_power": 0, - "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" - } - }, - "VDL": { - "depb": { - "name": "solo bus", + "name": "solo bus - depot charging", "capacity": 250, "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, @@ -50,7 +30,7 @@ "hc": "winter" }, "oppb": { - "name": "solo bus", + "name": "solo bus - opportunity charging", "capacity": 250, "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, From bb2e7e71b021b50274850d9f0ecb993f787e116e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 25 Nov 2022 12:53:31 +0100 Subject: [PATCH 334/802] Fist clean commit of optimizer --- ebus_toolbox/optimizer.py | 307 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 ebus_toolbox/optimizer.py diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py new file mode 100644 index 00000000..16a6c8db --- /dev/null +++ b/ebus_toolbox/optimizer.py @@ -0,0 +1,307 @@ +""" Optimizer that evaluates inputs and outputs of every iteration, adapting scenario setup + to optimize for specified metrics. +""" +import datetime + +import src.scenario as scenario + + +import schedule +import rotation +import pickle +import matplotlib +import matplotlib.pyplot as plt +matplotlib.use("TkAgg") +import numpy as np + + +with open("args_only_depot.pickle", "rb") as f: args = pickle.load(f) +with open("scenario_only_depot.pickle", "rb") as f: scen = pickle.load(f) +with open("schedule_only_depot.pickle", "rb") as f: sched = pickle.load(f) +BATTERY_CAPACITY=400 +CHARGING_POWER=250 + +exclusions = ['BF B A', + 'BF C A', + 'BF I A', + 'BF L A', + 'BF M A', + 'BF SO A'] + +def get_buffer_time(search_time, args): + for window, buffer_time in args.default_buffer_time_opps.items(): + try: + start, end = window.split("-") + + if float(end)>search_time.hour>=float(start): + return datetime.timedelta(minutes=buffer_time) + except ValueError: + return datetime.timedelta(minutes=0) + + + +def main(): + # Find below zero soc events and stations which have charging capabilties + events = get_below_zero_soc_events(scen=scen, + rotations=sched.get_negative_rotations(scen), + sched=sched, + soc_upper_thresh=1, filter_standing_time=True) + + # Connect events with shared stations + + # First create simple list of station sets for single events + possible_stations = [{station for station in e["stations"]} for e + in events] + # If stations overlap join them + station_subsets = join_all_subsets(possible_stations) + + event_groups = [[] for __ in range(len(station_subsets))] + + # Group the events in the same manner as stations, so that the same amount of event group are + # created as station subsets + for e in events: + for i, subset in enumerate(station_subsets): + # Every station from an event must share the same station sub_set. Therefore its enough + # to check only the first element + if len(e["stations"])>0: + if next(iter(e["stations"])) in subset: + event_groups[i].append(e) + break + + groups = list(zip(event_groups, station_subsets)) + + # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an + # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by + # loading power, standing time at a station, soc at station, minimal soc of the event + + station_eval = dict() + for i, group in enumerate(groups): + event_group, station_subset = group + for e in event_group: + for ii, trip in enumerate(e["trip"]): + idx = get_index_by_time(trip.arrival_time) + soc = scen.vehicle_socs[e["vehicle_id"]][idx] + # ToDo define elsewhere + max_soc=1 + min_soc=0 + delta_E_pot = min(max_soc-soc, min_soc-e["min_soc"],max_soc-min_soc) + try: + standing_time = e["trip"][ii+1].departure_time - trip.arrival_time + except IndexError: + standing_time = datetime.timedelta(minutes=0) + standing_time -= get_buffer_time(trip.arrival_time, args) + standing_time_h = max(0,standing_time/datetime.timedelta(minutes=60)) + # ToDo get Vehicle Battery Capacity and charging power + capacity= BATTERY_CAPACITY + ch_power=CHARGING_POWER + delta_E_pot= min(delta_E_pot*capacity, standing_time_h*ch_power) + d = dict(E_pot=delta_E_pot, + standing_time=standing_time) + try: + station_eval[trip.arrival_name]["pot_list"].append(d) + except: + station_eval[trip.arrival_name]=dict(pot_list=[],pot_sum=0) + station_eval[trip.arrival_name]["pot_list"].append(d) + + time_list=[] + for station_name, stat_dict in station_eval.items(): + sum=0 + standing_time=datetime.timedelta(minutes=0) + for pot in stat_dict["pot_list"]: + sum +=pot["E_pot"] + standing_time += pot["standing_time"] + stat_dict["pot_sum"]=sum + time_list.append(standing_time/datetime.timedelta(minutes=1)) + + + # Sort by pot_sum + station_eval=dict(sorted(station_eval.items(), key=lambda x: x[1]["pot_sum"])) + + pot=[] + ids=[] + for stat_id, stat in station_eval.items(): + pot.append(stat["pot_sum"]) + ids.append(stat_id) + + table= np.array((pot,ids)) + + # Reverse order + table=table[:,::-1] + + fig, ax = plt.subplots() + ax.plot(table[0,:].astype(float), linewidth=2.0) + ax.set_title("sortierte pot. Ladeenergie in kWh nach Haltepunkt") + ax.set_ylabel("Pot. Ladeenergie in kWh") + ax.set_xlabel("Haltestellen") + + # fig, ax = plt.subplots() + # time_list=sorted(time_list) + # time_list.reverse() + # ax.plot(time_list, linewidth=2.0) + # ax.set_title("sortierte Standzeiten nach Haltestellen") + # ax.set_ylabel("kumulierte Standzeiten in min") + # ax.set_xlabel("Haltestellen") + + # event = dict(start_idx=start, end_idx=min_idx, + # min_soc=min_soc, stations=possible_stations, + # vehicle_id=rot.vehicle_id, trip=trips, + # rotation=rot) + + possible_stations_ = {station for e in events for station in e["stations"] if + station not in exclusions} + possible_stations = [{station for station in e["stations"] if station not in exclusions} for e + in events] + station_subsets = join_all_subsets(possible_stations) + + a = set() + for s in possible_stations: + a.update(s) + + a = sorted(events, key=lambda x: len(x["stations"])) + neg_rots = [sched.rotations[rot_id] for rot_id in sched.get_negative_rotations(scen)] + neg_arrivals = {t.arrival_name for rot in neg_rots for t in rot.trips} + neg_departure = {t.departure_name for rot in neg_rots for t in rot.trips} + neg_stops = neg_arrivals.union(neg_departure) + + +def no_optimization(): + return "converged" + + +def plot_(data): + fig, ax = plt.subplots() + ax.plot(data, linewidth=2.0) + +def join_all_subsets(subsets): + joined_subset = True + while joined_subset: + joined_subset, subsets = join_subsets(subsets) + return subsets + + +def join_subsets(subsets): + subsets = [s.copy() for s in subsets] + for i in range(len(subsets)): + for ii in range(len(subsets)): + if i == ii: continue + intersec = subsets[i].intersection(subsets[ii]) + if len(intersec) > 0: + subsets[i] = subsets[i].union(subsets[ii]) + subsets.remove(subsets[ii]) + return True, subsets + return False, subsets + + +def get_subsets(sched: schedule.Schedule, rotations): + # Betriebshöfe are exluced since they are depot and not opportunity. therefore they connect + # basically all stops + subsets = [{t.arrival_name for t in rot.trips if t.arrival_name not in exclusions} for rot in + rotations] + return join_all_subsets(subsets) + + +def get_index_by_time(search_time): + start_time_sched = datetime.datetime.fromisoformat(sched.scenario["scenario"]["start_time"]) + delta_time = datetime.timedelta(minutes=sched.scenario["scenario"]["interval"]) + idx = (search_time - start_time_sched) // delta_time + return idx + + +def get_time_by_index(idx): + start_time_sched = datetime.datetime.fromisoformat(sched.scenario["scenario"]["start_time"]) + delta_time = datetime.timedelta(minutes=sched.scenario["scenario"]["interval"]) + searched_time = start_time_sched + delta_time * idx + return searched_time + + +def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, sched: schedule.Schedule): + # return trips in a rotation from a start to an end index, if the arrival time is in between + # the start and end idx + start_time_event = get_time_by_index(start_idx) + end_time_event = get_time_by_index(end_idx) + + trips = [] + for i, trip in enumerate(rot.trips): + if end_time_event > trip.arrival_time > start_time_event: + # standing_time = 0 + # try: + # standing_time = trip.arrival_time - trips[i + 1].departure_time + # except IndexError: + # standing_time = 0 + trips.append(trip) + + return trips + + +def get_below_zero_soc_events(scen: scenario.Scenario, rotations, sched: schedule.Schedule, + soc_upper_thresh=0.9, filter_standing_time=True): + # Create list of events which describe trips which end in a soc below zero + # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 + # Properties before and after these points have no effect on the event itself, similar to + # an event horizon + events = [] + SOC_UPPER_THRESH = soc_upper_thresh + for rot_id in rotations: + rot = sched.rotations[rot_id] + rot_start_idx = get_index_by_time(rot.departure_time) + rot_end_idx = get_index_by_time(rot.arrival_time) + + soc = scen.vehicle_socs[rot.vehicle_id] + soc = [s if s is not None else 999 for s in soc] + idx = range(0, len(soc)) + + comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] + min_soc, min_idx = min(comb, key=lambda x: x[0]) + reduced_list = comb.copy() + if min_soc>=0: + print(rot_id,min_soc) + a=1 + while min_soc < 0: + i = min_idx + idx = [x[1] for x in reduced_list] + while soc[i] < SOC_UPPER_THRESH: + if i == rot_start_idx: break + i -= 1 + start = idx.index(i) + + i = min_idx + while soc[i] < SOC_UPPER_THRESH: + if i >= rot_end_idx - 1: break + i += 1 + end = idx.index(i) + + trips = get_trips(rot=rot, start_idx=start, end_idx=min_idx, sched=sched) + possible_stations=set() + if not filter_standing_time: + possible_stations = {t.arrival_name for t in trips} + else: + for ii,t in enumerate(trips): + try: + standing_time = trips[ii + 1].departure_time - t.arrival_time + if standing_time>get_buffer_time(t.arrival_time,args): + possible_stations.add(t.arrival_name) + except IndexError: + pass + + + all_stations = {t.arrival_name for t in rot.trips} + # print(all_stations.difference(possible_stations) , rot_id) + + event = dict(start_idx=start, end_idx=min_idx, + min_soc=min_soc, stations=possible_stations, + vehicle_id=rot.vehicle_id, trip=trips, + rotation=rot) + events.append(event) + copy_list = reduced_list.copy() + reduced_list = reduced_list[:start] + if end + 1 >= len(copy_list): + reduced_list.extend(copy_list[end + 1:]) + if len(reduced_list) > 0: + min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) + else: + break + return events + + +if __name__ == "__main__": + main() From 2bb4a2eeb5e95c639b2d5ff249e62f264b7e4c79 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 25 Nov 2022 13:05:01 +0100 Subject: [PATCH 335/802] check for min standing time before charging and for eval --- ebus_toolbox/optimizer.py | 1284 ++++++++++++++++++++++++++++++++----- 1 file changed, 1125 insertions(+), 159 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 16a6c8db..038b77bb 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -2,166 +2,722 @@ to optimize for specified metrics. """ import datetime +import json +import os +import sys +import warnings +from copy import copy, deepcopy +import time +import logging import src.scenario as scenario - - import schedule import rotation import pickle import matplotlib import matplotlib.pyplot as plt +from multiprocessing import Pool, freeze_support +from ebus_toolbox.consumption import Consumption +from ebus_toolbox.trip import Trip + matplotlib.use("TkAgg") import numpy as np +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + +formatter = logging.Formatter('%(message)s') + +file_handler = logging.FileHandler('optimizer.log') +file_handler.setLevel(logging.ERROR) +file_handler.setFormatter(formatter) + +stream_handler = logging.StreamHandler() +stream_handler.setFormatter(formatter) +stream_handler.setLevel(0) + +logger.addHandler(file_handler) +logger.addHandler(stream_handler) with open("args_only_depot.pickle", "rb") as f: args = pickle.load(f) -with open("scenario_only_depot.pickle", "rb") as f: scen = pickle.load(f) -with open("schedule_only_depot.pickle", "rb") as f: sched = pickle.load(f) -BATTERY_CAPACITY=400 -CHARGING_POWER=250 - -exclusions = ['BF B A', - 'BF C A', - 'BF I A', - 'BF L A', - 'BF M A', - 'BF SO A'] -def get_buffer_time(search_time, args): - for window, buffer_time in args.default_buffer_time_opps.items(): - try: - start, end = window.split("-") +with open("scen_minimal.pickle", "rb") as f: scen = pickle.load(f) +with open("sched_minimal.pickle", "rb") as f: sched = pickle.load(f) - if float(end)>search_time.hour>=float(start): - return datetime.timedelta(minutes=buffer_time) - except ValueError: - return datetime.timedelta(minutes=0) +# set battery and charging power +BATTERY_CAPACITY = 400 +CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +# CHARGING_CURVE = [[0, 450], [0.99, 20],[1,20]] +for type, vehicle in sched.vehicle_types.items(): + vehicle["capacity"] = BATTERY_CAPACITY + vehicle["charging_curve"] = CHARGING_CURVE + +CHARGING_POWER = 250 +timers = [0] * 10 + + +def run_optimization(schedule, scenario, args, + type="greedy", exclusion_rots=set(), inclusion_stations=set(), + exclusion_stations=set(), remove_impossible_rots=False, rebase_scenario=False, + **kwargs): + """ + Optimizes scenario by adding electrified stations sparingly + until scenario has no below 0 soc events. + + :param remove_impossible_rots: repeat optimization without impossible to electrify rotations + default=False + :type remove_impossible_rots: bool + + :param rebase_scenario: should the given scenario be simulated with the given boundries before + optimization or can schedule and scenario be used right away. rebasing can be time consuming + but can speed up optimization afterwards and increase optimization efficiency + default=False + :type rebase_scenario: bool + + :param schedule: Simulation schedule containing buses, rotations etc. + :type schedule: ebus_toolbox.Schedule + + :param scenario: Simulation scenario containing simulation results + including the SoC of all vehicles over time + :type scenario: spice_ev.Scenario + :param args: Simulation arguments for manipulation or generated outputs + :type args: object + :param type: Type of the following optimizations ["greedy"] + :type type: str + :param exclusion_rots: Rotations to be excluded from optimization + :type exclusion_rots: set(str) + :param inclusion_stations: Stations which have to be electrified + :type inclusion_stations: set(str) + :param exclusion_stations: Stations to be excluded from optimization, eg. cant be electrified + :type exclusion_stations: set(str) + + :return: (Schedule,Scenario) optimizied schedule and Scenario + :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) + """ + now = datetime.datetime.now() + new_ele_stations_path = "data/examples/optimized_stations_" + \ + now.strftime("%Y_%m_%d_%H_%M") + ".json" + not_possible_stations = inclusion_stations.union(exclusion_stations) + + s = time.time() + # Calculate base scenario + if rebase_scenario: + logger.debug(f"Spice EV Rebasing Scenario") + new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( + schedule, args, + inclusion_stations, + exclusion_rots=exclusion_rots, run_only_neg=True) + + logger.debug(f"Rebasing took {time.time() - s} sec") + else: + with open(args.electrified_stations, "r") as f: + ele_stations = json.load(f) + ele_station_set = set() + # Electrify inclusion stations + for stat in inclusion_stations: + electrify_station(stat, ele_stations, ele_station_set) + new_scen = scenario + new_sched = schedule + + # s = time.time() + # new_sched.generate_rotations_overview(new_scen, args) + # print(f"Base Calc took {time.time() - s} sec") + s = time.time() + i = 0 + while True and i < 2: + if type == "greedy": + logger.debug("Starting greedy optimization") + ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ + greedy_optimization(ele_stations, ele_station_set, new_scen, new_sched, + not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, + solver=kwargs.get("solver", "spiceev")) + i += 1 + if not remove_impossible_rots or len(could_not_be_electrified) == 0: + break + else: + logger.debug("Removing impossible rots, rebasing and restarting optimization") + exclusion_rots.update(could_not_be_electrified) + new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( + schedule, args, + inclusion_stations, + exclusion_rots=exclusion_rots, run_only_neg=False) + + global timer_for_calc + logger.debug(f"Non Spice Ev methods took {time.time() - s - timer_for_calc} sec") + logger.debug(f"Spice ev took {timer_for_calc} s") + logger.debug(f"Electrified Stations: {len(ele_station_set)}") + logger.debug(ele_station_set) + logger.debug(could_not_be_electrified) + new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), + new_scen.vehicle_socs, + new_scen, ele_station_set) + plot_(get_rotation_soc('7025440', new_sched, new_scen)[0]) + global timers + logger.debug(timers) + with open(new_ele_stations_path, "w") as f: + json.dump(ele_stations, f, indent=2) + + logger.debug(f"Spice EV is calculating optimized case as a complete scenario") + new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( + schedule, args, electrified_stations=ele_stations, run_only_neg=False, + electrified_station_set=ele_station_set) + print("Still negative rotations:", new_sched.get_negative_rotations(new_scen)) + print("Finished") + return new_sched, new_scen def main(): - # Find below zero soc events and stations which have charging capabilties - events = get_below_zero_soc_events(scen=scen, - rotations=sched.get_negative_rotations(scen), - sched=sched, - soc_upper_thresh=1, filter_standing_time=True) + # which rotations should be excluded? + # Teilmenge der 197 die nicht möglich ist, muss ignoriert werden + exclusion_rots = {'6891222', '6891224', '6891226', '6891228', '7194397', + # Linie 901 wird auch ignoriert + '6675617', '6675640', '6675626', + '6675645', '6675631', '6675648', + '6675636', '6675653', '6675661', '6675657' + } + + # Ignoieren von umöglichen Umläufen, die existieren ohne Ausschluss von Stationen + impossible_rots = {'6895194', '6895199', '6895223', '6895226', '6923844', '7049422', '7049423'} + + exclusion_rots.update(impossible_rots) + exclusion_rots = set() + + # which stations have to be electrified? + inclusion_stations = set() + # Keine Muss-Stationen + # inclusion_stations = {"AHGR01B", "AHGR04B", "MICH07B", "MGGW01B", + # "MGGW02B", "SBU02B", "SMZ07B", "SOSB01B", "SSWS16BA", "SSWS17BA", + # "SSS02B", "SULB01B", "SULS01B", "SWEL01B", "SABS01B", "STBH01B", + # "TSTR01B", "UAMD02B", "UAMD05BN", "UBER01B", "UDD04B", "UEWP04B", + # "UEWP05B", "UEWP02B", "UKDN06B", "UKRL03B", "UMM01B", "URUD08B", + # "WMAH01B", "WSTR01B", "ZFHF01B"} + + inclusion_stations = set() # {'SWEL01B'} #{'SMZ07B', 'SWEL01B', 'URUD08B'} + + # Alter stand an raus stationen vor dem 6.10 + # exclusion_stations = {'AMWT01B', 'AUBT04B', 'BFAE01B', 'BUKR03B', 'CMPB01B', 'ELTP01B', \ + # 'FOHA01B', 'HAWR01B', 'ZOOH01B', 'MAST04B', 'MAST06B', 'MEMH07B', \ + # 'MHDO01B', 'NOSS01B', 'PIET06BA', 'SAH06B', 'SAHF01B', 'SKD05B', \ + # 'SLIS02B', 'SPRA03B', 'SURZ23B', 'SUMM01B', 'UFI02B', 'UHPK01B', \ + # 'URUH07B', 'VOUL01B'} + + # exclusion_stations = set(["CMPB01B"]) + exclusion_stations = set() + t = time.time() + run_optimization(sched, scen, args, type="greedy", exclusion_rots=exclusion_rots, + inclusion_stations=inclusion_stations, exclusion_stations=exclusion_stations, + remove_impossible_rots=True, rebase_scenario=False, solver="quick") + print(f"Opt took {time.time() - t}") + + +timer_for_calc = 0 + + +def greedy_optimization(electrified_stations, electrified_station_set, new_scen, new_sched, + not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, **kwargs): + # Base stations for optimization, so inclusion of stations can be skipped + base_stations = electrified_stations.copy() + base_electrified_station_set = electrified_station_set.copy() # Connect events with shared stations + ######## + could_not_be_electrified = set() + base_scen = copy(new_scen) + base_sched = copy(new_sched) + + ########### + # Make sure no None values exists in SOCs. Fill later values with last value + # which was not None + for id, soc in base_scen.vehicle_socs.items(): + soc = np.array(soc) + if None in soc: + for ii in range(len(soc) - 1, -1, -1): + if soc[ii] is not None: + last_not_none = soc[ii] + break + soc[soc == np.array(None)] = last_not_none + base_scen.vehicle_socs[id] = soc + + # Get events where soc fell below 0. The events contain info about the problematic + # timespan, which includes stations which could provide a soc lift + events = get_below_zero_soc_events(this_scen=base_scen, + rotations=list(new_sched.rotations.keys()), + this_sched=base_sched, + soc_upper_thresh=0.95, filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=0) + + # Check if the events can be divided into subgroups which are independent + # this makes optimization in smaller groups possible + groups = get_groups_from_events(events, not_possible_stations) + + # Baseline greedy Optimization + list_greedy_sets = [set()] * len(groups) + decision_tree = dict() + + # Base line is created simply by not having a decision tree and not a pre optimized_set yet + for group_nr, group in enumerate(groups): + events, stations = group + linien = {lne for e in events for lne in e["rotation"].lines} + electrified_stations = base_stations.copy() + electrified_station_set = base_electrified_station_set.copy() + print(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") + logger.debug(linien) + print(len(events), "events") + solver = kwargs.get("solver", "spiceev") + if solver == "quick": + group_optimization_quick(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, not_possible_stations, + pre_optimzed_set=None, + decision_tree=decision_tree, brute=False, **kwargs) + else: + group_optimization(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, not_possible_stations, + pre_optimzed_set=None, + decision_tree=decision_tree, brute=False, **kwargs) + + list_greedy_sets[group_nr] = electrified_station_set.copy() + logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), + len(stations))) - # First create simple list of station sets for single events - possible_stations = [{station for station in e["stations"]} for e - in events] + for single_set in list_greedy_sets: + for stat in single_set: + electrify_station(stat, electrified_stations, electrified_station_set) + + return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets + + +# ######## +# # with open("dec_tree.pickle", "rb") as f: +# # decision_tree=pickle.load(f) +# # +# # with open("pre_opt.pickle", "rb") as f: +# # electrified_station_set =pickle.load(f) +# +# while True: +# print(len(decision_tree)) +# not_possible_stations = inclusion_stations.union(exclusion_stations) +# pre_optimized_set = electrified_station_set +# group = groups[19] +# electrified_stations = base_stations.copy() +# electrified_station_set = base_electrified_station_set.copy() +# +# group_optimization(group, base_scen, base_sched, +# electrified_stations, electrified_station_set, could_not_be_electrified +# , not_possible_stations, pre_optimzed_set=pre_optimized_set, +# decision_tree=decision_tree, brute=True) +# print("optimized with", len(electrified_station_set), " stations") +# sols.append(electrified_station_set) +# ######## +# +# # Save Optimization +# for s in list_greedy_sets: +# for stat in s: +# electrify_station(stat, electrified_stations, electrified_station_set) +# with open("400kWh_no_inc_new_raus_ohne_197_ohne_imp_ele_station.json", "w") as f: +# json.dump(electrified_stations, f, indent=2) +# +# electrified_stations = base_stations.copy() +# electrified_station_set = base_electrified_station_set +# # +# # list_opt_sets=[set()]*len(groups) +# # +# # for group_nr, group in enumerate(groups): +# min_length=float("inf") +# event_group, _ = group +# station_eval = list(evaluate(event_group, base_scen).items()) +# station_eval.reverse() +# +# # Expand greedy Tree from each node of greedy Optimization +# excl_options = list(list_greedy_sets[group_nr]) +# pre_optimzed_set =list_greedy_sets[group_nr] +# +# pack = (group, base_scen, base_sched, +# old_stations, old_electrified_station_set, +# could_not_be_electrified, pre_optimzed_set) +# with Pool(5) as p: +# # Outer optimization func, Repeating input,Stations to be excluded +# results = p.starmap(outer_group_optimzation,zip(repeat(pack), excl_options)) +# +# for res in results: +# if len(res)< min_length: +# min_length=len(res) +# list_opt_sets[group_nr]=res +# print(min_length) +# +# +# greedy_stations_count=sum([len(s) for s in list_greedy_sets]) +# list_opt_count = sum([len(s) for s in list_opt_sets]) +# print(f"Greedy Results in {greedy_stations_count} stations") +# print(f"Opt Results in {list_opt_count} stations") +# print(list_greedy_sets) +# print(list_opt_sets) + + +def outer_group_optimzation(pack, not_possible_stations): + group, base_scen, base_sched, old_stations, \ + old_electrified_station_set, could_not_be_electrified, pre_optimzed_set = pack + electrified_stations = old_stations.copy() + electrified_station_set = old_electrified_station_set.copy() + ele_set = group_optimization(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, + not_possible_stations, pre_optimzed_set=pre_optimzed_set) + return electrified_station_set.copy() + + +def get_groups_from_events(events, not_possible_stations=set(), could_not_be_electrified=set()): + # First create simple list of station sets for single events. + # Electrified and other not possible to electrify stations should not connect groups + possible_stations = [ + {station for station in e["stations"] if station not in not_possible_stations} + for e + in events] # If stations overlap join them station_subsets = join_all_subsets(possible_stations) - event_groups = [[] for __ in range(len(station_subsets))] - # Group the events in the same manner as stations, so that the same amount of event group are + # Group the events in the same manner as stations, so that the same amount of event groups are # created as station subsets for e in events: for i, subset in enumerate(station_subsets): # Every station from an event must share the same station sub_set. Therefore its enough # to check only the first element - if len(e["stations"])>0: + if len(e["stations"]) > 0: if next(iter(e["stations"])) in subset: event_groups[i].append(e) break + else: + logger.warning(f'Didnt find rotation {e["rotation"].id} in any subset' + f'of possible electrifiable stations') + # this event will no show up in an event_group. + # Therefor it needs to be put into this set + could_not_be_electrified.update([e["rotation"].id]) groups = list(zip(event_groups, station_subsets)) + return sorted(groups, key=lambda x: len(x[1])) - # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an - # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by - # loading power, standing time at a station, soc at station, minimal soc of the event - station_eval = dict() - for i, group in enumerate(groups): - event_group, station_subset = group - for e in event_group: - for ii, trip in enumerate(e["trip"]): - idx = get_index_by_time(trip.arrival_time) - soc = scen.vehicle_socs[e["vehicle_id"]][idx] - # ToDo define elsewhere - max_soc=1 - min_soc=0 - delta_E_pot = min(max_soc-soc, min_soc-e["min_soc"],max_soc-min_soc) - try: - standing_time = e["trip"][ii+1].departure_time - trip.arrival_time - except IndexError: - standing_time = datetime.timedelta(minutes=0) - standing_time -= get_buffer_time(trip.arrival_time, args) - standing_time_h = max(0,standing_time/datetime.timedelta(minutes=60)) - # ToDo get Vehicle Battery Capacity and charging power - capacity= BATTERY_CAPACITY - ch_power=CHARGING_POWER - delta_E_pot= min(delta_E_pot*capacity, standing_time_h*ch_power) - d = dict(E_pot=delta_E_pot, - standing_time=standing_time) - try: - station_eval[trip.arrival_name]["pot_list"].append(d) - except: - station_eval[trip.arrival_name]=dict(pot_list=[],pot_sum=0) - station_eval[trip.arrival_name]["pot_list"].append(d) - - time_list=[] - for station_name, stat_dict in station_eval.items(): - sum=0 - standing_time=datetime.timedelta(minutes=0) - for pot in stat_dict["pot_list"]: - sum +=pot["E_pot"] - standing_time += pot["standing_time"] - stat_dict["pot_sum"]=sum - time_list.append(standing_time/datetime.timedelta(minutes=1)) +def group_optimization_quick(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, + not_possible_stations, pre_optimzed_set=None, decision_tree=None, + brute=False, **kwargs): + event_group, _ = group + # Loading from pickle faster than deepcopy. Copy enough? + new_scen = copy(base_scen) + new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) - # Sort by pot_sum - station_eval=dict(sorted(station_eval.items(), key=lambda x: x[1]["pot_sum"])) + lifted_socs = kwargs.get("lifted_socs", None) + if lifted_socs is not None: + new_scen.vehicle_socs = lifted_socs + new_sched = copy(base_sched) - pot=[] - ids=[] - for stat_id, stat in station_eval.items(): - pot.append(stat["pot_sum"]) - ids.append(stat_id) + missing_soc = 0 + rotation_dict = dict() + for e in event_group: + rotation_dict[e["rotation"].id] = e["rotation"] + missing_soc += e["min_soc"] - table= np.array((pot,ids)) + if missing_soc >= 0: + logger.debug("Already electrified: Returning set") + return electrified_stations + missing_energy = missing_soc * BATTERY_CAPACITY - # Reverse order - table=table[:,::-1] + station_eval = evaluate(event_group, new_scen) + for id in station_eval: + print(id[0], id[1]["pot_sum"]) + logger.debug(missing_energy) - fig, ax = plt.subplots() - ax.plot(table[0,:].astype(float), linewidth=2.0) - ax.set_title("sortierte pot. Ladeenergie in kWh nach Haltepunkt") - ax.set_ylabel("Pot. Ladeenergie in kWh") - ax.set_xlabel("Haltestellen") - - # fig, ax = plt.subplots() - # time_list=sorted(time_list) - # time_list.reverse() - # ax.plot(time_list, linewidth=2.0) - # ax.set_title("sortierte Standzeiten nach Haltestellen") - # ax.set_ylabel("kumulierte Standzeiten in min") - # ax.set_xlabel("Haltestellen") - - # event = dict(start_idx=start, end_idx=min_idx, - # min_soc=min_soc, stations=possible_stations, - # vehicle_id=rot.vehicle_id, trip=trips, - # rotation=rot) - - possible_stations_ = {station for e in events for station in e["stations"] if - station not in exclusions} - possible_stations = [{station for station in e["stations"] if station not in exclusions} for e - in events] - station_subsets = join_all_subsets(possible_stations) + # + if brute: + best_station_ids = choose_station_brute(station_eval, electrified_station_set, + pre_optimzed_set, decision_tree, + missing_energy=missing_energy) + else: + best_station_ids = choose_station(station_eval, electrified_station_set, + pre_optimzed_set, decision_tree, + missing_energy=missing_energy) + + logger.debug(best_station_ids) + if best_station_ids is None: + logger.warning( + f"All stations with estimated potential electrified but still missing energy in {len(list(rotation_dict.keys()))} rotations") + if pre_optimzed_set is not None: + # Remove electrified stations in this run + c = electrified_station_set.copy() + for stat in c: + electrified_stations.pop(stat) + electrified_station_set.remove(stat) + # Overwrite with preoptimized set + for stat in pre_optimzed_set: + electrify_station(stat, electrified_stations, electrified_station_set) + else: + could_not_be_electrified.update(list(rotation_dict.keys())) + return electrified_stations + + # Electrify station + for id in best_station_ids: + electrify_station(id, electrified_stations, electrified_station_set) + + # pre_opt_sched.rotations = rotation_dict + + s = time.time() + event_rotations = {x["rotation"] for x in event_group} + new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) + new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, + new_scen.vehicle_socs, + new_scen, electrified_station_set) + lifted_socs = deepcopy(new_scen.vehicle_socs) + + # new_sched_2, new_scen_2 = run_schedule(pre_opt_sched, args, + # electrified_stations=electrified_stations) + + # soc_sum = 0 + # soc_sum_before =0 + # # logger.debug(rotation_dict.keys()) + # # for rot in rotation_dict: + # # soc1, st, end = get_rotation_soc(rot, new_sched,new_scen) + # # soc1 = np.array(soc1[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) + # # soc_sum += sum(soc1) + # # + # # soc, st, end = get_rotation_soc(rot, pre_opt_sched,pre_opt_scen) + # # soc = np.array(soc[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) + # # soc_sum_before += sum(soc) + # # + # # logger.debug(soc_sum_before) + # # logger.debug(soc_sum) + + global timer_for_calc + global timers + timer_for_calc += time.time() - s + timers[2] += time.time() - s + not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) + event_rotations = [event["rotation"].id for event in event_group] + new_events = get_below_zero_soc_events(new_scen, event_rotations, + new_sched, + soc_upper_thresh=1, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=0) + missing_soc = 0 + for e in new_events: + missing_soc += e["min_soc"] + delta_energy = missing_soc * BATTERY_CAPACITY + + logger.debug(delta_energy) + if decision_tree is not None: + try: + decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy + decision_tree[str(electrified_station_set)]["visit_counter"] += 1 + logger.debug("already visited") + except KeyError: + decision_tree[str(electrified_station_set)] = dict() + decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy + decision_tree[str(electrified_station_set)]["visit_counter"] = 1 + + # Everything electrified + if delta_energy >= 0: + return electrified_stations + else: + if brute: + return + + # Check if the events can be divided into subgroups which are independent + groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) + + for group in groups: + new_stations = group_optimization_quick(group, base_scen, base_sched, + electrified_stations, + electrified_station_set, + could_not_be_electrified, + not_possible_stations, + pre_optimzed_set, decision_tree, + lifted_socs=lifted_socs) + electrified_stations.update(new_stations) + + return electrified_stations + + +def group_optimization(group, base_scen, base_sched, + electrified_stations, electrified_station_set, could_not_be_electrified, + not_possible_stations, pre_optimzed_set=None, decision_tree=None, + brute=False, **kwargs): + event_group, _ = group + + # Loading from pickle faster than deepcopy. Copy enough? + pre_opt_scen = copy(base_scen) + pre_opt_scen.vehicle_socs = copy(base_scen.vehicle_socs) + pre_opt_sched = copy(base_sched) + missing_soc = 0 + rotation_dict = dict() + for e in event_group: + rotation_dict[e["rotation"].id] = e["rotation"] + missing_soc += e["min_soc"] + + if missing_soc >= 0: + logger.debug("Already electrified: Returning set") + return electrified_stations + + missing_energy = missing_soc * BATTERY_CAPACITY + + station_eval = evaluate(event_group, pre_opt_scen) + for id in station_eval: + logger.debug(id[0], id[1]["pot_sum"]) + logger.debug(missing_energy) + + # + if brute: + best_station_ids = choose_station_brute(station_eval, electrified_station_set, + pre_optimzed_set, decision_tree, + missing_energy=missing_energy) + else: + best_station_ids = choose_station(station_eval, electrified_station_set, + pre_optimzed_set, decision_tree, + missing_energy=missing_energy) + + logger.debug(best_station_ids, end=" ") + if best_station_ids is None: + print( + f"All stations with estimated potential electrified but still missing energy in {len(list(rotation_dict.keys()))} rotations") + if pre_optimzed_set is not None: + # Remove electrified stations in this run + c = electrified_station_set.copy() + for stat in c: + electrified_stations.pop(stat) + electrified_station_set.remove(stat) + # Overwrite with preoptimized set + for stat in pre_optimzed_set: + electrify_station(stat, electrified_stations, electrified_station_set) + else: + could_not_be_electrified.update(list(rotation_dict.keys())) + return electrified_stations + + # Electrify station + for id in best_station_ids: + electrify_station(id, electrified_stations, electrified_station_set) + pre_opt_sched.rotations = rotation_dict + + s = time.time() + + new_sched, new_scen = run_schedule(pre_opt_sched, args, + electrified_stations=electrified_stations) - a = set() - for s in possible_stations: - a.update(s) + # soc_sum = 0 + # soc_sum_before =0 + # print(rotation_dict.keys()) + # for rot in rotation_dict: + # soc1, st, end = get_rotation_soc(rot, new_sched,new_scen) + # soc1 = np.array(soc1[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) + # soc_sum += sum(soc1) + # soc, st, end = get_rotation_soc(rot, pre_opt_sched,pre_opt_scen) + # soc = np.array(soc[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) + # soc_sum_before += sum(soc) + # print(soc_sum_before) + # print(soc_sum) - a = sorted(events, key=lambda x: len(x["stations"])) - neg_rots = [sched.rotations[rot_id] for rot_id in sched.get_negative_rotations(scen)] - neg_arrivals = {t.arrival_name for rot in neg_rots for t in rot.trips} - neg_departure = {t.departure_name for rot in neg_rots for t in rot.trips} - neg_stops = neg_arrivals.union(neg_departure) + global timer_for_calc + timer_for_calc += time.time() - s + + not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) + new_events = get_below_zero_soc_events(new_scen, list(new_sched.rotations.keys()), + new_sched, + soc_upper_thresh=1, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=0) + missing_soc = 0 + for e in new_events: + missing_soc += e["min_soc"] + delta_energy = missing_soc * BATTERY_CAPACITY + + if decision_tree is not None: + try: + decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy + decision_tree[str(electrified_station_set)]["visit_counter"] += 1 + print("already visited") + except KeyError: + decision_tree[str(electrified_station_set)] = dict() + decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy + decision_tree[str(electrified_station_set)]["visit_counter"] = 1 + + # Everything electrified + if delta_energy >= 0: + return electrified_stations + else: + if brute: + return + + # Check if the events can be divided into subgroups which are independent + groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) + + for group in groups: + new_stations = group_optimization(group, new_scen, new_sched, + electrified_stations, + electrified_station_set, + could_not_be_electrified, + not_possible_stations, + pre_optimzed_set, decision_tree) + electrified_stations.update(new_stations) + + return electrified_stations + + +def preprocessing_scenario(this_sched, this_args, + inclusion_stations=set(), + electrified_stations=None, + electrified_station_set=set(), + exclusion_rots=set(), + run_only_neg=False): + if electrified_stations is None: + with open(this_args.electrified_stations, "r") as f: + electrified_stations = json.load(f) + + # Electrify inclusion stations + for stat in inclusion_stations: + electrify_station(stat, electrified_stations, electrified_station_set) + + # Calc new but only prev. negative rotations + if run_only_neg: + rots = this_sched.get_negative_rotations(scen) + rots = {r: this_sched.rotations[r] for r in rots if r not in exclusion_rots} + this_sched.rotations = rots + else: + rots = {r: this_sched.rotations[r] for r in this_sched.rotations if r not in exclusion_rots} + this_sched.rotations = rots + + new_sched, new_scen = run_schedule(this_sched, this_args, electrified_stations) + return new_sched, new_scen, electrified_station_set, electrified_stations + + +def combination_generator(iterable, amount: int, _pass_list=list(), _counter=0): + """ Generator which yields all possible combinations of choosing + an amount out of an iterable without putting them back and without caring about the + order of elements + :param iterable: Any collection which can be cast to a list + :param amount: Number of elements which should be drawn from iterable + :type amount: int + """ + iterable = list(iterable) + # Initialization of list with length of amount + if len(_pass_list) == 0: + _pass_list = [0] * amount + for i, item in enumerate(iterable): + # Recursive calling of generator with clock like behavior, e.g right-most item changes until + # end of list is reached. This leads to a change in the item left to it and so on. Elements + # on the right can only change to a subset of bigger indicies than their left counter-part. + # This is due to the ignoring of order, which reduces the amount of possibilities. + _pass_list[_counter] = item + if amount <= 1: + yield _pass_list + else: + for gen in combination_generator(iterable[i + 1:], amount - 1, _pass_list, + _counter=_counter + 1): + yield gen def no_optimization(): @@ -169,8 +725,11 @@ def no_optimization(): def plot_(data): + """ Simple plot of data without having to create subplots""" fig, ax = plt.subplots() ax.plot(data, linewidth=2.0) + return ax + def join_all_subsets(subsets): joined_subset = True @@ -179,6 +738,222 @@ def join_all_subsets(subsets): return subsets +# ToDo Further implement +def choose_station_brute(station_eval, electrified_station_set, + pre_optimzed_set=None, decision_tree=None, missing_energy=0): + station_ids = [x[0] for x in station_eval] + a = combination_generator(station_ids, len(pre_optimzed_set) - 1) + for comb in a: + if str(set(comb)) not in decision_tree: + return comb + else: + print("calculated all possibilities") + return None + + +def choose_station(station_eval, electrified_station_set, + pre_optimzed_set=None, decision_tree=None, missing_energy=0): + # Filter functions to stop simulating cases which have no hope of being optimal. + # If in optimization mode, optimization can break if station amount is superceded + # This filter is done better by the next + # if pre_optimzed_set is not None: + # if len(electrified_station_set)>len(pre_optimzed_set): + # return pre_optimzed_set + # Potentials have to be at least as promising as the pre-optimized case + if pre_optimzed_set is not None: + delta = len(pre_optimzed_set) - len(electrified_station_set) + pot = 0 + for i in range(0, min(delta, len(station_eval))): + pot += station_eval[i][1]["pot_sum"] + if pot <= -missing_energy: + print("Not enough potential after ", electrified_station_set) + return None + + min_count_visited = float('inf') + for station in station_eval: + # Create a station combination from already electrified stations and possible new station + check_stations = electrified_station_set.union([station[0]]) + + if decision_tree is not None: + if str(check_stations) in decision_tree.keys(): + min_count_visited = min(min_count_visited, + decision_tree[str(check_stations)]["visit_counter"]) + # If already checked skip to next one + continue + if station[0] not in electrified_station_set: + best_station_id = station[0] + return [best_station_id] + else: + # Every possible node from here was evaluated already + # to do what now? + # Simply visit the least visited node + for station in station_eval: + # Create a station combination from already electrified stations and possible new station + check_stations = electrified_station_set.union([station[0]]) + if decision_tree[str(check_stations)]["visit_counter"] == min_count_visited: + best_station_id = station[0] + return [best_station_id] + return None + + +# +# def timeseries_calc_folded_dep(station, events, soc_dict_folded, eval_scen): +# soc_dict_folded = copy(soc_dict_folded) +# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +# soc_over_time_curve = charging_curve_to_soc_over_time(charging_curve, BATTERY_CAPACITY) +# for e in events: +# if station in e["stations"]: +# for i, trip in enumerate(e["trip"]): +# if trip.arrival_name != station: +# continue +# try: +# idx = np.argwhere(soc_dict_folded[e["vehicle_id"]][:,0]==trip.arrival_time)[0][0] +# except: +# continue +# soc = soc_dict_folded[e["vehicle_id"]][:,2] +# try: +# standing_time = e["trip"][i + 1].departure_time - trip.arrival_time +# except IndexError: +# standing_time = datetime.timedelta(minutes=0) +# standing_time -= get_buffer_time(trip.arrival_time, args) +# standing_time = standing_time / datetime.timedelta(minutes=1) +# d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time) +# soc[idx:] += d_soc +# soc_max = np.max(soc) +# while soc_max > 1: +# desc = np.arange(len(soc), 0, -1) +# diff = np.hstack((np.diff(soc), -1)) +# # masking of socs >1 and negative gradient for local maximum +# idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) +# # Reducing everything after local maximum +# soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) +# # Capping everything before local maximum +# soc[:idc_loc_max][soc[:idc_loc_max]>1]=1 +# soc_max = np.max(soc) +# return soc_dict_folded + + +def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): + global timers + ele_stations = set([*ele_station_set, station]) + s2 = time.time() + soc_dict = copy(soc_dict) + soc_over_time_curve = charging_curve_to_soc_over_time(CHARGING_CURVE, BATTERY_CAPACITY, + CHARGING_POWER) + for rot in rotations: + soc = soc_dict[rot.vehicle_id] + for i, trip in enumerate(rot.trips): + s = time.time() + if trip.arrival_name not in ele_stations: + continue + idx = get_index_by_time(trip.arrival_time, eval_scen) + try: + standing_time = (rot.trips[i + 1].departure_time - (trip.arrival_time)) + except IndexError: + standing_time = datetime.timedelta(minutes=0) + + if args.min_charging_time < standing_time: + standing_time_min = 0 + else: + # ToDO Discuss. Arrival time +1 is start for charge + standing_time -= get_buffer_time(trip.arrival_time, args) + standing_time_min = max(0, standing_time / datetime.timedelta(minutes=1) - 1) + + d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min) + soc[idx + 1:] += d_soc + soc_max = np.max(soc) + timers[0] += time.time() - s + s = time.time() + while soc_max > 1: + desc = np.arange(len(soc), 0, -1) + diff = np.hstack((np.diff(soc), -1)) + # masking of socs >1 and negative gradient for local maximum + idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) + # Reducing everything after local maximum + soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) + # Capping everything before local maximum + soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 + soc_max = np.max(soc) + timers[1] += time.time() - s + soc_dict[rot.vehicle_id] = soc + timers[3] += (time.time() - s2) * 100 + return soc_dict + + +def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, + electrified_station_set=set(), decision_tree=None): + # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an + # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by + # loading power, standing time at a station, soc at station, minimal soc of the event + station_eval = dict() + soc_over_time_curve = charging_curve_to_soc_over_time(CHARGING_CURVE, BATTERY_CAPACITY, + CHARGING_POWER) + for e in events: + for i, trip in enumerate(e["trip"]): + # Station is only evaluated if station name is part of event stations + # Only these stations showed potential in electrification, e.g enough standing time + if trip.arrival_name not in e["stations"]: + continue + idx = get_index_by_time(trip.arrival_time, eval_scen) + soc = eval_scen.vehicle_socs[e["vehicle_id"]][idx] + # ToDo define elsewhere + max_soc = soc_upper_thresh + min_soc = soc_lower_thresh + # Potential is the minimal amount of + delta_soc_pot = min(max_soc - soc, + min_soc - e["min_soc"], + soc - e["min_soc"], + max_soc - min_soc) + try: + standing_time = e["trip"][i + 1].departure_time - trip.arrival_time + except IndexError: + standing_time = datetime.timedelta(minutes=0) + if args.min_charging_time < standing_time: + standing_time_min = 0 + else: + standing_time -= get_buffer_time(trip.arrival_time, args) + standing_time_min = max(0, standing_time / datetime.timedelta(minutes=1) - 1) + # ToDo get Vehicle Battery Capacity and charging power + capacity = BATTERY_CAPACITY + ch_power = CHARGING_POWER + # energy_charging_potential = standing_time_min *60 * ch_power + energy_charging_potential = get_delta_soc(soc_over_time_curve, soc, standing_time_min) \ + * capacity + + # Potential is at max the minimum between the useful delta soc * capacity or the + # energy provided by charging for the full standing time + delta_E_pot = min(delta_soc_pot * capacity, energy_charging_potential) + d = dict(E_pot=delta_E_pot, + standing_time=standing_time) + try: + station_eval[trip.arrival_name]["pot_list"].append(d) + except: + station_eval[trip.arrival_name] = dict(pot_list=[], pot_sum=0) + station_eval[trip.arrival_name]["pot_list"].append(d) + + # time_list = [] + for station_name, stat_dict in station_eval.items(): + if decision_tree is not None: + check_stations = electrified_station_set.union(station_name) + if check_stations in decision_tree.keys(): + stat_dict["pot_sum"] = decision_tree[str(check_stations)]["missing_energy"] - \ + decision_tree[str(electrified_station_set)]["missing_energy"] + # decision_tree[str(electrified_station_set)]["children"].append(check_stations) + continue + + sum = 0 + standing_time = datetime.timedelta(minutes=0) + for pot in stat_dict["pot_list"]: + sum += pot["E_pot"] + standing_time += pot["standing_time"] + stat_dict["pot_sum"] = sum + # time_list.append(standing_time / datetime.timedelta(minutes=1)) + # Sort by pot_sum + station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1]["pot_sum"])).items()) + station_eval.reverse() + return station_eval + + def join_subsets(subsets): subsets = [s.copy() for s in subsets] for i in range(len(subsets)): @@ -192,33 +967,31 @@ def join_subsets(subsets): return False, subsets -def get_subsets(sched: schedule.Schedule, rotations): - # Betriebshöfe are exluced since they are depot and not opportunity. therefore they connect - # basically all stops - subsets = [{t.arrival_name for t in rot.trips if t.arrival_name not in exclusions} for rot in - rotations] - return join_all_subsets(subsets) +# def get_subsets(sched: schedule.Schedule, rotations): +# subsets = [{t.arrival_name for t in rot.trips if t.arrival_name not in exclusions} for rot in +# rotations] +# return join_all_subsets(subsets) -def get_index_by_time(search_time): - start_time_sched = datetime.datetime.fromisoformat(sched.scenario["scenario"]["start_time"]) - delta_time = datetime.timedelta(minutes=sched.scenario["scenario"]["interval"]) - idx = (search_time - start_time_sched) // delta_time +def get_index_by_time(search_time, this_scen: scenario.Scenario): + start_time = this_scen.start_time + delta_time = datetime.timedelta(minutes=60 / this_scen.stepsPerHour) + idx = (search_time - start_time) // delta_time return idx -def get_time_by_index(idx): - start_time_sched = datetime.datetime.fromisoformat(sched.scenario["scenario"]["start_time"]) - delta_time = datetime.timedelta(minutes=sched.scenario["scenario"]["interval"]) - searched_time = start_time_sched + delta_time * idx +def get_time_by_index(idx, this_scen: scenario.Scenario): + start_time = this_scen.start_time + delta_time = datetime.timedelta(minutes=60 / this_scen.stepsPerHour) + searched_time = start_time + delta_time * idx return searched_time -def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, sched: schedule.Schedule): +def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, scen: scenario.Scenario): # return trips in a rotation from a start to an end index, if the arrival time is in between # the start and end idx - start_time_event = get_time_by_index(start_idx) - end_time_event = get_time_by_index(end_idx) + start_time_event = get_time_by_index(start_idx, scen) + end_time_event = get_time_by_index(end_idx, scen) trips = [] for i, trip in enumerate(rot.trips): @@ -233,75 +1006,268 @@ def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, sched: sched return trips -def get_below_zero_soc_events(scen: scenario.Scenario, rotations, sched: schedule.Schedule, - soc_upper_thresh=0.9, filter_standing_time=True): +def get_rotation_soc(rot_id, this_sched, this_scen): + rot = this_sched.rotations[rot_id] + rot_start_idx = get_index_by_time(rot.departure_time, this_scen) + rot_end_idx = get_index_by_time(rot.arrival_time, this_scen) + return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx + + +# +# def get_below_zero_soc_events_folded_(this_scen: scenario.Scenario, rotations, +# this_sched: schedule.Schedule, +# soc_upper_thresh=0.9, filter_standing_time=True, +# not_possible_stations=set(), soc_lower_thresh=0): +# # Create list of events which describe trips which end in a soc below zero +# # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 +# # Properties before and after these points have no effect on the event itself, similar to +# # an event horizon +# events = [] +# SOC_UPPER_THRESH = soc_upper_thresh +# count_electrified_rot = 0 +# for rot_id in rotations: +# rot = this_sched.rotations[rot_id] +# data = this_scen.vehicle_socs_folded[rot.vehicle_id] +# soc = data[:, 2][(data[:, 0] >= rot.departure_time) * (data[:, 0] <= rot.arrival_time)] +# +# # soc, rot_start_idx, rot_end_idx = get_rotation_soc(rot_id, this_sched, this_scen) +# # soc = [s if s is not None else 999 for s in soc] +# idx = range(0, len(soc)) +# +# comb = list(zip(soc, idx)) +# min_soc, min_idx = min(comb, key=lambda x: x[0]) +# reduced_list = comb.copy() +# +# if min_soc >= soc_lower_thresh: +# count_electrified_rot += 1 +# +# while min_soc < soc_lower_thresh: +# i = min_idx +# idx = [x[1] for x in reduced_list] +# while soc[i] < SOC_UPPER_THRESH: +# if i == 0: break +# i -= 1 +# start = idx.index(i) +# +# i = min_idx +# while soc[i] < SOC_UPPER_THRESH: +# if i >= len(soc) - 1: break +# i += 1 +# end = idx.index(i) +# +# possible_stations = set(data[start:min_idx, 1]) +# +# trips = set(data[start:min_idx, 3]) +# +# possible_stations = possible_stations.difference(not_possible_stations) +# event = dict(start_idx=start, end_idx=min_idx, +# min_soc=min_soc, stations=possible_stations, +# vehicle_id=rot.vehicle_id, trip=trips, +# rotation=rot) +# +# copy_list = reduced_list.copy() +# reduced_list = reduced_list[:start] +# if end + 1 >= len(copy_list): +# reduced_list.extend(copy_list[end + 1:]) +# if len(reduced_list) > 0: +# min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) +# else: +# break +# print(f"Last electrification electrified {count_electrified_rot} rotations") +# return events + + +def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, + this_sched: schedule.Schedule, + soc_upper_thresh=0.9, filter_standing_time=True, + not_possible_stations=set(), soc_lower_thresh=0): # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to # an event horizon events = [] SOC_UPPER_THRESH = soc_upper_thresh - for rot_id in rotations: - rot = sched.rotations[rot_id] - rot_start_idx = get_index_by_time(rot.departure_time) - rot_end_idx = get_index_by_time(rot.arrival_time) + count_electrified_rot = 0 + # pos_rots=pd.DataFrame(index=range(0,1549)) + # neg_rots=pd.DataFrame(index=range(0,1549)) - soc = scen.vehicle_socs[rot.vehicle_id] + for rot_id in rotations: + rot = this_sched.rotations[rot_id] + soc, rot_start_idx, rot_end_idx = get_rotation_soc(rot_id, this_sched, this_scen) soc = [s if s is not None else 999 for s in soc] idx = range(0, len(soc)) comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] min_soc, min_idx = min(comb, key=lambda x: x[0]) reduced_list = comb.copy() - if min_soc>=0: - print(rot_id,min_soc) - a=1 - while min_soc < 0: + + if min_soc >= soc_lower_thresh: + count_electrified_rot += 1 + # + # if min_soc= rot_end_idx - 1: break i += 1 - end = idx.index(i) - - trips = get_trips(rot=rot, start_idx=start, end_idx=min_idx, sched=sched) - possible_stations=set() + end_comb = idx.index(i) + trips = get_trips(rot=rot, start_idx=start, end_idx=min_idx, scen=this_scen) + possible_stations = set() + possible_stations_list = [] if not filter_standing_time: possible_stations = {t.arrival_name for t in trips} + possible_stations_list = [t.arrival_name for t in trips] else: - for ii,t in enumerate(trips): + for ii, t in enumerate(trips): try: standing_time = trips[ii + 1].departure_time - t.arrival_time - if standing_time>get_buffer_time(t.arrival_time,args): + if standing_time > get_buffer_time(t.arrival_time, args): possible_stations.add(t.arrival_name) + possible_stations_list.append(t.arrival_name) except IndexError: pass - - all_stations = {t.arrival_name for t in rot.trips} - # print(all_stations.difference(possible_stations) , rot_id) - + possible_stations = possible_stations.difference(not_possible_stations) event = dict(start_idx=start, end_idx=min_idx, min_soc=min_soc, stations=possible_stations, vehicle_id=rot.vehicle_id, trip=trips, - rotation=rot) + rotation=rot, stations_list=possible_stations_list) events.append(event) copy_list = reduced_list.copy() - reduced_list = reduced_list[:start] - if end + 1 >= len(copy_list): - reduced_list.extend(copy_list[end + 1:]) + reduced_list = reduced_list[:start_comb] + + # event_df = pd.DataFrame(soc[start:min_idx]) + # soc_df = pd.DataFrame(soc) + + if end_comb + 1 <= len(copy_list): + reduced_list.extend(copy_list[end_comb + 1:]) if len(reduced_list) > 0: min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) else: break + + # red_df = pd.DataFrame(reduced_list) + # event_df.plot() + # soc_df.plot() + # soc_df[rot_start_idx: rot_end_idx].plot() + # red_df.loc[:,0].plot() + # plt.show() + + print(f"Last electrification electrified {count_electrified_rot} rotations") + # neg_rots.plot() + # pos_rots.plot() + # plt.show() + return events +def preprocess_schedule(this_sched, this_args, electrified_stations=None): + Trip.consumption = Consumption(this_sched.vehicle_types) + # filter trips according to args + this_sched.filter_rotations() + this_sched.calculate_consumption() + this_sched.set_charging_type(preferred_ct=this_args.preferred_charging_type, args=this_args) + + # (re)calculate the change in SoC for every trip + # charging types may have changed which may impact battery capacity + # while mileage is assumed to stay constant + this_sched.delta_soc_all_trips() + # each rotation is assigned a vehicle ID + this_sched.assign_vehicles() + return this_sched, this_sched.generate_scenario(this_args, + electrified_stations=electrified_stations) + + +def run_schedule(this_sched, this_args, electrified_stations=None): + this_sched2 = copy(this_sched) + this_sched2.rotations = deepcopy(this_sched2.rotations) + this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, + electrified_stations=electrified_stations) + + # Dont print output from spice ev to reduce clutter + sys.stdout = open(os.devnull, 'w') + + print("Running Spice EV...") + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + new_scen.run('distributed', vars(this_args).copy()) + sys.stdout = sys.__stdout__ + return this_sched2, new_scen + + +def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_grid=float('inf')): + # Charging curve as nested list of SOC, Power[kW] and capacity in [kWh] + # Simple numeric creation of power over time --> to energy over time + normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) + timestep = 0.1 + soc = 0 + time = 0 + socs = [] + times = [] + while soc < 1: + times.append(time) + socs.append(soc) + power = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) + # print(time, power*capacity) + soc += timestep / 60 * power + time += timestep + # Fill the soc completely in last timestep + times.append(time) + socs.append(1) + return np.array((times, socs)).T + + +def get_delta_soc(soc_over_time_curve, soc, time_delta): + # Returns expected soc lift for a given start_soc and time_delta. + # Units for time_delta and time_curve are assumed to be the same, e.g. minutes + # First element which is bigger than current soc + if time_delta == 0: + return 0 + soc = max(soc, 0) + first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] + second_time = first_time + time_delta + # Catch out of bounds if time of charging end is bigger than table values + + if second_time >= soc_over_time_curve[-1, 0]: + end_soc = 1 + else: + end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] + + # Make sure to limit delta soc to 1 if negative socs are given. They are possible during + # the optimization process but will be continuously raised until they are >0. + return min(1, end_soc - start_soc) + + +def get_buffer_time(search_time, args): + for window, buffer_time in args.default_buffer_time_opps.items(): + try: + start, end = window.split("-") + + if float(end) > search_time.hour >= float(start): + return datetime.timedelta(minutes=buffer_time) + except ValueError: + return datetime.timedelta(minutes=0) + + +def electrify_station(stat, stations, electrified_set): + stations[stat] = {'type': 'opps', 'n_charging_stations': 200} + electrified_set.add(stat) + + if __name__ == "__main__": + freeze_support() main() From 00e6cee553e77e4378c31df782c7fa281b9a846c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 25 Nov 2022 13:15:17 +0100 Subject: [PATCH 336/802] Add bvg to vehicle types --- data/examples/vehicle_types.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 65d00bf4..ff855088 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -56,5 +56,25 @@ "mileage": "data/examples/energy_consumption_example.csv", "hc": "winter" } + }, + "BVG-GE": { + "depb": { + "name": "articulated", + "capacity": 400, + "charging_curve": [[0, 450], [0.8, 296], [0.9, 210], [1, 20]], + "min_charging_power": 0, + "v2g": false, + "mileage": 3, + "hc": "winter" + }, + "oppb": { + "name": "articulated", + "capacity": 400, + "charging_curve": [[0, 450], [0.8, 296], [0.9, 210], [1, 20]], + "min_charging_power": 0, + "v2g": false, + "mileage": 3, + "hc": "winter" + } } } \ No newline at end of file From 7cabddc1de5dec5e51b27080ef895985b5e18ede Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 25 Nov 2022 15:25:47 +0100 Subject: [PATCH 337/802] Make compativle with ebus dev --- data/examples/vehicle_types.json | 6 +-- ebus_toolbox/optimizer.py | 89 ++++++++++++++------------------ 2 files changed, 41 insertions(+), 54 deletions(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index ff855088..7ec6b658 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -57,9 +57,9 @@ "hc": "winter" } }, - "BVG-GE": { + "BVG-GE": { "depb": { - "name": "articulated", + "name": "articulated bus", "capacity": 400, "charging_curve": [[0, 450], [0.8, 296], [0.9, 210], [1, 20]], "min_charging_power": 0, @@ -68,7 +68,7 @@ "hc": "winter" }, "oppb": { - "name": "articulated", + "name": "articulated bus", "capacity": 400, "charging_curve": [[0, 450], [0.8, 296], [0.9, 210], [1, 20]], "min_charging_power": 0, diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 038b77bb..8a108cd0 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -34,29 +34,30 @@ stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) -stream_handler.setLevel(0) +stream_handler.setLevel(logging.DEBUG) logger.addHandler(file_handler) logger.addHandler(stream_handler) -with open("args_only_depot.pickle", "rb") as f: args = pickle.load(f) +with open("args_bvg_full_no_ele.pickle", "rb") as f: args = pickle.load(f) -with open("scen_minimal.pickle", "rb") as f: scen = pickle.load(f) -with open("sched_minimal.pickle", "rb") as f: sched = pickle.load(f) +with open("scen_bvg_test.pickle", "rb") as f: scen = pickle.load(f) +with open("sched_bvg_test.pickle", "rb") as f: sched = pickle.load(f) # set battery and charging power BATTERY_CAPACITY = 400 CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # CHARGING_CURVE = [[0, 450], [0.99, 20],[1,20]] -for type, vehicle in sched.vehicle_types.items(): - vehicle["capacity"] = BATTERY_CAPACITY - vehicle["charging_curve"] = CHARGING_CURVE +for name , type in sched.vehicle_types.items(): + for charge_type, vehicle in type.items(): + vehicle["capacity"] = BATTERY_CAPACITY + vehicle["charging_curve"] = CHARGING_CURVE CHARGING_POWER = 250 timers = [0] * 10 -def run_optimization(schedule, scenario, args, +def run_optimization(this_sched, this_scen, args, type="greedy", exclusion_rots=set(), inclusion_stations=set(), exclusion_stations=set(), remove_impossible_rots=False, rebase_scenario=False, **kwargs): @@ -74,12 +75,12 @@ def run_optimization(schedule, scenario, args, default=False :type rebase_scenario: bool - :param schedule: Simulation schedule containing buses, rotations etc. - :type schedule: ebus_toolbox.Schedule + :param this_sched: Simulation schedule containing buses, rotations etc. + :type this_sched: ebus_toolbox.Schedule - :param scenario: Simulation scenario containing simulation results + :param this_scen: Simulation scenario containing simulation results including the SoC of all vehicles over time - :type scenario: spice_ev.Scenario + :type this_scen: spice_ev.Scenario :param args: Simulation arguments for manipulation or generated outputs :type args: object :param type: Type of the following optimizations ["greedy"] @@ -102,12 +103,13 @@ def run_optimization(schedule, scenario, args, s = time.time() # Calculate base scenario + # this_sched.rotations = {id: rot for id, rot in this_sched.rotations.items() if id in rots} if rebase_scenario: logger.debug(f"Spice EV Rebasing Scenario") new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - schedule, args, + this_sched, args, inclusion_stations, - exclusion_rots=exclusion_rots, run_only_neg=True) + exclusion_rots=exclusion_rots, run_only_neg=False) logger.debug(f"Rebasing took {time.time() - s} sec") else: @@ -117,12 +119,9 @@ def run_optimization(schedule, scenario, args, # Electrify inclusion stations for stat in inclusion_stations: electrify_station(stat, ele_stations, ele_station_set) - new_scen = scenario - new_sched = schedule + new_scen = this_scen + new_sched = this_sched - # s = time.time() - # new_sched.generate_rotations_overview(new_scen, args) - # print(f"Base Calc took {time.time() - s} sec") s = time.time() i = 0 while True and i < 2: @@ -131,7 +130,7 @@ def run_optimization(schedule, scenario, args, ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ greedy_optimization(ele_stations, ele_station_set, new_scen, new_sched, not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - solver=kwargs.get("solver", "spiceev")) + solver=kwargs.get("solver", "quick")) i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: break @@ -139,7 +138,7 @@ def run_optimization(schedule, scenario, args, logger.debug("Removing impossible rots, rebasing and restarting optimization") exclusion_rots.update(could_not_be_electrified) new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - schedule, args, + this_sched, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=False) @@ -160,7 +159,7 @@ def run_optimization(schedule, scenario, args, logger.debug(f"Spice EV is calculating optimized case as a complete scenario") new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - schedule, args, electrified_stations=ele_stations, run_only_neg=False, + this_sched, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set) print("Still negative rotations:", new_sched.get_negative_rotations(new_scen)) print("Finished") @@ -184,25 +183,8 @@ def main(): exclusion_rots = set() # which stations have to be electrified? - inclusion_stations = set() - # Keine Muss-Stationen - # inclusion_stations = {"AHGR01B", "AHGR04B", "MICH07B", "MGGW01B", - # "MGGW02B", "SBU02B", "SMZ07B", "SOSB01B", "SSWS16BA", "SSWS17BA", - # "SSS02B", "SULB01B", "SULS01B", "SWEL01B", "SABS01B", "STBH01B", - # "TSTR01B", "UAMD02B", "UAMD05BN", "UBER01B", "UDD04B", "UEWP04B", - # "UEWP05B", "UEWP02B", "UKDN06B", "UKRL03B", "UMM01B", "URUD08B", - # "WMAH01B", "WSTR01B", "ZFHF01B"} - inclusion_stations = set() # {'SWEL01B'} #{'SMZ07B', 'SWEL01B', 'URUD08B'} - # Alter stand an raus stationen vor dem 6.10 - # exclusion_stations = {'AMWT01B', 'AUBT04B', 'BFAE01B', 'BUKR03B', 'CMPB01B', 'ELTP01B', \ - # 'FOHA01B', 'HAWR01B', 'ZOOH01B', 'MAST04B', 'MAST06B', 'MEMH07B', \ - # 'MHDO01B', 'NOSS01B', 'PIET06BA', 'SAH06B', 'SAHF01B', 'SKD05B', \ - # 'SLIS02B', 'SPRA03B', 'SURZ23B', 'SUMM01B', 'UFI02B', 'UHPK01B', \ - # 'URUH07B', 'VOUL01B'} - - # exclusion_stations = set(["CMPB01B"]) exclusion_stations = set() t = time.time() run_optimization(sched, scen, args, type="greedy", exclusion_rots=exclusion_rots, @@ -259,6 +241,7 @@ def greedy_optimization(electrified_stations, electrified_station_set, new_scen, # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups): events, stations = group + linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() @@ -852,7 +835,7 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): except IndexError: standing_time = datetime.timedelta(minutes=0) - if args.min_charging_time < standing_time: + if args.min_charging_time > standing_time/datetime.timedelta(minutes=1): standing_time_min = 0 else: # ToDO Discuss. Arrival time +1 is start for charge @@ -908,7 +891,7 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, standing_time = e["trip"][i + 1].departure_time - trip.arrival_time except IndexError: standing_time = datetime.timedelta(minutes=0) - if args.min_charging_time < standing_time: + if args.min_charging_time > standing_time/datetime.timedelta(minutes=1): standing_time_min = 0 else: standing_time -= get_buffer_time(trip.arrival_time, args) @@ -1175,25 +1158,29 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, def preprocess_schedule(this_sched, this_args, electrified_stations=None): - Trip.consumption = Consumption(this_sched.vehicle_types) + Trip.consumption = Consumption(this_sched.vehicle_types, + outside_temperatures=args.outside_temperature_over_day_path, + level_of_loading_over_day=args.level_of_loading_over_day_path) + this_sched.stations=electrified_stations # filter trips according to args - this_sched.filter_rotations() this_sched.calculate_consumption() - this_sched.set_charging_type(preferred_ct=this_args.preferred_charging_type, args=this_args) - - # (re)calculate the change in SoC for every trip - # charging types may have changed which may impact battery capacity - # while mileage is assumed to stay constant - this_sched.delta_soc_all_trips() + # this_sched.set_charging_type(this_args.preferred_charging_type) + # + # # (re)calculate the change in SoC for every trip + # # charging types may have changed which may impact battery capacity + # # while mileage is assumed to stay constant + # this_sched.delta_soc_all_trips() # each rotation is assigned a vehicle ID this_sched.assign_vehicles() - return this_sched, this_sched.generate_scenario(this_args, - electrified_stations=electrified_stations) + return this_sched, this_sched.generate_scenario(this_args) def run_schedule(this_sched, this_args, electrified_stations=None): this_sched2 = copy(this_sched) this_sched2.rotations = deepcopy(this_sched2.rotations) + this_sched2.stations=electrified_stations + this_sched2.assign_vehicles() + this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, electrified_stations=electrified_stations) From 74a919b3f13fa81e4ef71e3fd6d6ca8fc939696b Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 25 Nov 2022 15:35:21 +0100 Subject: [PATCH 338/802] create subfolders for chained mode reports --- ebus_toolbox/__main__.py | 22 ++++++++++------------ ebus_toolbox/report.py | 30 ++++++++++++++++++++++++++++-- ebus_toolbox/simulate.py | 2 +- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 6c1a1783..f83ee187 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,7 +1,9 @@ import argparse -from ebus_toolbox import simulate, util -from pathlib import Path from datetime import datetime +from pathlib import Path + +from ebus_toolbox import simulate, util + if __name__ == '__main__': parser = argparse.ArgumentParser( @@ -106,22 +108,18 @@ util.set_options_from_config(args, check=True, verbose=False) - args.output_directory = Path(args.output_directory) / \ - str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") - - # Create subfolder for specific sim results with timestamp. - # If folder doesnt exists, create folder. + # extend output directory path: new subfolder with current time # Needs to happen after set_options_from_config since # args.output_directory can be overwritten by config - args.output_directory.mkdir(parents=True, exist_ok=True) - - args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" - args.save_results = args.output_directory / "simulation_spiceEV.json" - args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" + args.output_directory = Path(args.output_directory).joinpath( + f"{datetime.now().strftime('%Y-%m-%d-%H-%M-%S')}_eBus_results") # rename special options args.timing = args.eta + if any([args.save_soc, args.save_results, args.save_timeseries]): + print("save_* options ignored for eBus-Toolbox reports naming") + if args.input_schedule is None: raise SystemExit("The following argument is required: input_schedule") diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 1d3338a7..0f5e07dd 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,8 +4,27 @@ import datetime import warnings +import src.report as spice_ev_report + def generate(schedule, scenario, args, prefix=""): + """ + Save report files in output directory + + :param schedule: toolbox schedule + :type schedule: dict + :param scenario: SpiceEV scenario + :type scenario: Scenario + :param args: command line options + :type args: Namespace + :param prefix: results subdirectory name + :type prefix: string + """ + + # create subfolder for output + results_directory = args.output_directory.joinpath(prefix) + results_directory.mkdir(parents=True, exist_ok=True) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) @@ -65,14 +84,21 @@ def generate(schedule, scenario, args, prefix=""): "Omit parameter to simulate entire schedule.", stacklevel=100) - with open(args.output_directory / (prefix + "rotation_socs.csv"), "w+", newline='') as f: + with open(results_directory / "rotation_socs.csv", "w", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(("time",) + tuple(rotation_socs.keys())) for i, row in enumerate(zip(*rotation_socs.values())): t = sim_start_time + i * scenario.interval csv_writer.writerow((t,) + row) - with open(args.output_directory / (prefix + "rotation_summary.csv"), "w+", newline='') as f: + with open(results_directory / "rotation_summary.csv", "w", newline='') as f: csv_writer = csv.DictWriter(f, list(rotation_infos[0].keys())) csv_writer.writeheader() csv_writer.writerows(rotation_infos) + + # save SpiceEV results + spice_ev_report.generate_reports(scenario, { + "save_soc": results_directory / "simulation_spiceEV.csv", + "save_results": results_directory / "simulation_spiceEV.json", + "save_timeseries": results_directory / "simulation_soc_spiceEV.csv", + }) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 2b106a97..f7993d79 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -97,7 +97,7 @@ def simulate(args): # create report based on all previous modes assert scenario is not None, "Can't report without simulation" report_name = '__'.join([m for m in args.mode[:i] if m not in ["report", "cost"]]) - report.generate(schedule, scenario, args, prefix=report_name + '_') + report.generate(schedule, scenario, args, prefix=report_name) elif mode == 'cost' and args.cost_params is not None: # calculate costs of iteration costs = calculate_costs(cost_params, schedule) From 5c3f555030db85a6b1934ec4d61b773ad821aca4 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 25 Nov 2022 16:19:54 +0100 Subject: [PATCH 339/802] batteries can be set in electrified_stations.json --- data/examples/electrified_stations.json | 10 ++++++++- ebus_toolbox/schedule.py | 28 ++++++------------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 182108fc..f91aa948 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -2,7 +2,15 @@ "Station-0": { "type": "deps", "n_charging_stations": null, - "distance_transformer": 150 + "distance_transformer": 150, + "battery": { + "charging_curve": [[0,50], [1,50]], # piecewise linear function that maps SoC to power, from 0 to 1, required + "capacity": 300, # kWh, assumed to be infinite if not given + "min_charging_power": 0, # kW, optional + "soc": 0, # initial state of charge [0-1], optional + "efficiency": 0.95, # optional + "discharge_curve": null # optional, same as charging curve + } }, "Station-3": { "type": "opps", diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5e05b3e1..cfb872a6 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -498,6 +498,12 @@ def generate_scenario(self, args): "cost": {"type": "fixed", "value": 0.3}, "number_cs": number_cs } + # check for stationary battery + battery = station.get("battery") + if battery is not None: + # add stationary battery at this station/GC + battery["parent"] = gc_name + batteries[gc_name] = battery # initial condition of vehicle if i == 0: @@ -639,28 +645,6 @@ def generate_scenario(self, args): if not price_csv_path.exists(): print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) - if args.battery: - for idx, bat in enumerate(args.battery, 1): - capacity, c_rate, gc = bat[:3] - if gc not in grid_connectors: - # no vehicle charges here - continue - if capacity > 0: - max_power = c_rate * capacity - else: - # unlimited battery: set power directly - max_power = c_rate - batteries[f"BAT{idx}"] = { - "parent": gc, - "capacity": capacity, - "charging_curve": [[0, max_power], [1, max_power]], - } - if len(bat) == 4: - # discharge curve can be passed as optional 4th param - batteries[f"BAT{idx}"].update({ - "discharge_curve": bat[3] - }) - # reformat vehicle types for spiceEV vehicle_types_spiceev = {f'{vehicle_type}_{charging_type}': body for vehicle_type, subtypes in self.vehicle_types.items() From 14ed247b198f227350e1b33544775543e35ca387 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 25 Nov 2022 17:00:33 +0100 Subject: [PATCH 340/802] Add new function generate_station_name_json csv #39 --- ebus_toolbox/report.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index c45a4755..9aa46676 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -3,8 +3,9 @@ import csv import datetime import warnings +import json -from src.report import aggregate_timeseries +from src.report import aggregate_timeseries, aggregate_local_results def generate_vehicle_socs(scenario, args): @@ -22,8 +23,8 @@ def generate_vehicle_socs(scenario, args): csv_writer.writerow((i, t,) + row) -def generate_station_name(scenario, args): - for gc in scenario.gcPowerSchedule: +def generate_station_name_csv(scenario, args): + for gc in scenario.constants.grid_connectors.keys(): gc_info = aggregate_timeseries(scenario, gc) with open(args.output_directory / f"simulation_spiceEV_{gc}.csv", "w+", newline='') as f: csv_writer = csv.writer(f) @@ -32,13 +33,21 @@ def generate_station_name(scenario, args): csv_writer.writerow(elem) +def generate_station_name_json(scenario, args): + for gc in scenario.constants.grid_connectors.keys(): + gc_info = aggregate_local_results(scenario, gc) + with open(args.output_directory / f"simulation_spiceEV_{gc}.json", 'w') as f: + json.dump(gc_info, f, indent=2) + + def generate(schedule, scenario, args): # create csv out of vehicle's socs generate_vehicle_socs(scenario, args) - # create csv for all stations - generate_station_name(scenario, args) + # create csv and json for all stations + generate_station_name_csv(scenario, args) + generate_station_name_json(scenario,args) rotation_infos = [] From e2e9c09373cafd68ebe5a0e20e5cee79a7332c7f Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 25 Nov 2022 18:58:30 +0100 Subject: [PATCH 341/802] Add new function generate_cs_power_overview #39 --- ebus_toolbox/report.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 9aa46676..99f38ca4 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -17,7 +17,7 @@ def generate_vehicle_socs(scenario, args): with open(args.output_directory / "vehicle_socs.csv", "w+", newline='') as f: csv_writer = csv.writer(f) - csv_writer.writerow(["timestep", "time",] + v_list) + csv_writer.writerow(["timestep", "time", ] + v_list) for i, row in enumerate(zip(*scenario.vehicle_socs.values())): t = sim_start_time + i * scenario.interval csv_writer.writerow((i, t,) + row) @@ -40,15 +40,39 @@ def generate_station_name_json(scenario, args): json.dump(gc_info, f, indent=2) +def generate_cs_power_overview(scenario, args): + sim_start_time = scenario.start_time + gc_list = [] + for gc in scenario.constants.grid_connectors.keys(): + gc_list.append(gc) + + with open(args.output_directory / "cs_power_overview.csv", "w+", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["timestep", "time"] + gc_list) + for i in range(scenario.n_intervals): + t = sim_start_time + i * scenario.interval + row = [] + for gc in gc_list: + gc_info = aggregate_timeseries(scenario, gc) + cs_power = gc_info['timeseries'] + sum_cs_power = cs_power[i][9] + row.append(sum_cs_power) + + csv_writer.writerow((i, t, ) + tuple(row)) + + def generate(schedule, scenario, args): - # create csv out of vehicle's socs + # generate csv out of vehicle's socs generate_vehicle_socs(scenario, args) - # create csv and json for all stations + # generate csv and json for all stations generate_station_name_csv(scenario, args) generate_station_name_json(scenario,args) + # generate cs power overview + generate_cs_power_overview(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From 438553a2437ac3b20a1c5fd4eaa6513fe66af1e5 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 28 Nov 2022 11:17:39 +0100 Subject: [PATCH 342/802] Fix flake8 Error #39 --- ebus_toolbox/report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 99f38ca4..17af5b48 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -68,7 +68,7 @@ def generate(schedule, scenario, args): # generate csv and json for all stations generate_station_name_csv(scenario, args) - generate_station_name_json(scenario,args) + generate_station_name_json(scenario, args) # generate cs power overview generate_cs_power_overview(scenario, args) From 7836a187f499ed8b0c8a9a4c8762045f4efdba32 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 28 Nov 2022 13:28:45 +0100 Subject: [PATCH 343/802] Make opt much faster by changing copy and remove differences between quick and sp ev --- data/examples/ebus_toolbox.cfg | 8 +- ebus_toolbox/costs.py | 1 + ebus_toolbox/optimizer.py | 148 +++++++++++++++++---------------- 3 files changed, 83 insertions(+), 74 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 75de69d7..e60e5456 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -3,7 +3,7 @@ ##### INPUT/OUTPUT FILES AND PATHS ##### # Input file containing trip information (required) -input_schedule = "./data/examples/trips_example.csv" +input_schedule = "./data/examples/trips_short.csv" # output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) output_directory = "./data/sim_outputs/" @@ -56,13 +56,13 @@ ignore_inconsistent_rotations = false # set minimum allowed state of charge when leaving # distinguish between depot and opportunity station desired_soc_deps = 1.0 -desired_soc_opps = 0.8 +desired_soc_opps = 1 # Preferred charging type. Options: depb, oppb (default: oppb) -preferred_charging_type = "depb" +preferred_charging_type = "oppb" # min charging time at depots and opp stations [minutes] (default: 2) -min_charging_time = 2 +min_charging_time = 1 # buffer time at opp station if no specific buffer time is provided # via the electrified_stations.json [minutes] (default: 1) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 25c7be52..578d357c 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -41,6 +41,7 @@ def calculate_costs(c_params, schedule): c_gcs = 0 c_gcs_annual = 0 gcs = schedule.scenario["constants"]["grid_connectors"] + c_transformer=0 for gcID, gc_keys in gcs.items(): try: distance_transformer = schedule.stations[gcID]["distance_transformer"] diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 8a108cd0..fce98a73 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -20,6 +20,8 @@ from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip +# Todo this implementation in c ase of changes in ebustoolbox +from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev matplotlib.use("TkAgg") import numpy as np @@ -27,7 +29,6 @@ logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(message)s') - file_handler = logging.FileHandler('optimizer.log') file_handler.setLevel(logging.ERROR) file_handler.setFormatter(formatter) @@ -43,7 +44,7 @@ with open("scen_bvg_test.pickle", "rb") as f: scen = pickle.load(f) with open("sched_bvg_test.pickle", "rb") as f: sched = pickle.load(f) - +ROT = '6813275' # set battery and charging power BATTERY_CAPACITY = 400 CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] @@ -55,7 +56,10 @@ CHARGING_POWER = 250 timers = [0] * 10 - +args.min_charging_time=0 +del args.save_soc +del args.save_timeseries +del args.save_results def run_optimization(this_sched, this_scen, args, type="greedy", exclusion_rots=set(), inclusion_stations=set(), @@ -124,6 +128,7 @@ def run_optimization(this_sched, this_scen, args, s = time.time() i = 0 + global timer_for_calc while True and i < 2: if type == "greedy": logger.debug("Starting greedy optimization") @@ -135,23 +140,34 @@ def run_optimization(this_sched, this_scen, args, if not remove_impossible_rots or len(could_not_be_electrified) == 0: break else: - logger.debug("Removing impossible rots, rebasing and restarting optimization") + logger.debug(f"Non Spice Ev methods took {time.time() - s - timer_for_calc} sec") + logger.debug(f"Spice ev took {timer_for_calc} s") + logger.debug(f"Electrified Stations: {len(ele_station_set)}") + logger.debug(ele_station_set) + logger.warning(f"These rotations could not be electrified" + f"\n {could_not_be_electrified}") + + + logger.warning("Removing impossible rots, rebasing and restarting optimization") exclusion_rots.update(could_not_be_electrified) new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( this_sched, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=False) - global timer_for_calc + + logger.debug(f"Non Spice Ev methods took {time.time() - s - timer_for_calc} sec") logger.debug(f"Spice ev took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") logger.debug(ele_station_set) logger.debug(could_not_be_electrified) + plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, ele_station_set) - plot_(get_rotation_soc('7025440', new_sched, new_scen)[0]) + plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) + q =get_rotation_soc(ROT, new_sched, new_scen)[0] global timers logger.debug(timers) with open(new_ele_stations_path, "w") as f: @@ -161,6 +177,8 @@ def run_optimization(this_sched, this_scen, args, new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( this_sched, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set) + ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) + ax.plot(q) print("Still negative rotations:", new_sched.get_negative_rotations(new_scen)) print("Finished") return new_sched, new_scen @@ -181,15 +199,17 @@ def main(): exclusion_rots.update(impossible_rots) exclusion_rots = set() - + exclusion_rots={'6891228', '7194397', '6891226', '6891222', '7049423', '7049422', '6891224'} # which stations have to be electrified? inclusion_stations = set() # {'SWEL01B'} #{'SMZ07B', 'SWEL01B', 'URUD08B'} + sched.rotations={ROT:sched.rotations[ROT]} + exclusion_stations = set() t = time.time() run_optimization(sched, scen, args, type="greedy", exclusion_rots=exclusion_rots, inclusion_stations=inclusion_stations, exclusion_stations=exclusion_stations, - remove_impossible_rots=True, rebase_scenario=False, solver="quick") + remove_impossible_rots=True, rebase_scenario=True, solver="quick") print(f"Opt took {time.time() - t}") @@ -457,24 +477,6 @@ def group_optimization_quick(group, base_scen, base_sched, new_scen, electrified_station_set) lifted_socs = deepcopy(new_scen.vehicle_socs) - # new_sched_2, new_scen_2 = run_schedule(pre_opt_sched, args, - # electrified_stations=electrified_stations) - - # soc_sum = 0 - # soc_sum_before =0 - # # logger.debug(rotation_dict.keys()) - # # for rot in rotation_dict: - # # soc1, st, end = get_rotation_soc(rot, new_sched,new_scen) - # # soc1 = np.array(soc1[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) - # # soc_sum += sum(soc1) - # # - # # soc, st, end = get_rotation_soc(rot, pre_opt_sched,pre_opt_scen) - # # soc = np.array(soc[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) - # # soc_sum_before += sum(soc) - # # - # # logger.debug(soc_sum_before) - # # logger.debug(soc_sum) - global timer_for_calc global timers timer_for_calc += time.time() - s @@ -550,7 +552,7 @@ def group_optimization(group, base_scen, base_sched, station_eval = evaluate(event_group, pre_opt_scen) for id in station_eval: - logger.debug(id[0], id[1]["pot_sum"]) + logger.debug("%s, %s", id[0], id[1]["pot_sum"]) logger.debug(missing_energy) # @@ -563,7 +565,7 @@ def group_optimization(group, base_scen, base_sched, pre_optimzed_set, decision_tree, missing_energy=missing_energy) - logger.debug(best_station_ids, end=" ") + logger.debug(best_station_ids) if best_station_ids is None: print( f"All stations with estimated potential electrified but still missing energy in {len(list(rotation_dict.keys()))} rotations") @@ -590,18 +592,6 @@ def group_optimization(group, base_scen, base_sched, new_sched, new_scen = run_schedule(pre_opt_sched, args, electrified_stations=electrified_stations) - # soc_sum = 0 - # soc_sum_before =0 - # print(rotation_dict.keys()) - # for rot in rotation_dict: - # soc1, st, end = get_rotation_soc(rot, new_sched,new_scen) - # soc1 = np.array(soc1[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) - # soc_sum += sum(soc1) - # soc, st, end = get_rotation_soc(rot, pre_opt_sched,pre_opt_scen) - # soc = np.array(soc[st:end])#-np.array(soc[st:end])*0+(1-soc[st]) - # soc_sum_before += sum(soc) - # print(soc_sum_before) - # print(soc_sum) global timer_for_calc timer_for_calc += time.time() - s @@ -831,19 +821,13 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): continue idx = get_index_by_time(trip.arrival_time, eval_scen) try: - standing_time = (rot.trips[i + 1].departure_time - (trip.arrival_time)) + standing_time_min=get_charging_time(trip,rot.trips[i + 1], args) except IndexError: - standing_time = datetime.timedelta(minutes=0) - - if args.min_charging_time > standing_time/datetime.timedelta(minutes=1): - standing_time_min = 0 - else: - # ToDO Discuss. Arrival time +1 is start for charge - standing_time -= get_buffer_time(trip.arrival_time, args) - standing_time_min = max(0, standing_time / datetime.timedelta(minutes=1) - 1) + standing_time_min =0 d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min) - soc[idx + 1:] += d_soc + buffer_idx = int((get_buffer_time(trip,args))/datetime.timedelta(minutes=1)) + soc[idx + 1+buffer_idx:] += d_soc soc_max = np.max(soc) timers[0] += time.time() - s s = time.time() @@ -887,18 +871,17 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, min_soc - e["min_soc"], soc - e["min_soc"], max_soc - min_soc) + + + try: - standing_time = e["trip"][i + 1].departure_time - trip.arrival_time + standing_time_min=get_charging_time(trip,e["trip"][i + 1], args) except IndexError: - standing_time = datetime.timedelta(minutes=0) - if args.min_charging_time > standing_time/datetime.timedelta(minutes=1): - standing_time_min = 0 - else: - standing_time -= get_buffer_time(trip.arrival_time, args) - standing_time_min = max(0, standing_time / datetime.timedelta(minutes=1) - 1) + standing_time_min =0 + # ToDo get Vehicle Battery Capacity and charging power capacity = BATTERY_CAPACITY - ch_power = CHARGING_POWER + # energy_charging_potential = standing_time_min *60 * ch_power energy_charging_potential = get_delta_soc(soc_over_time_curve, soc, standing_time_min) \ * capacity @@ -907,7 +890,7 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, # energy provided by charging for the full standing time delta_E_pot = min(delta_soc_pot * capacity, energy_charging_potential) d = dict(E_pot=delta_E_pot, - standing_time=standing_time) + standing_time=datetime.timedelta(minutes=standing_time_min)) try: station_eval[trip.arrival_name]["pot_list"].append(d) except: @@ -937,6 +920,20 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, return station_eval +def get_charging_time(trip1, trip2, args): + delay = 1 + standing_time_min = (trip2.departure_time - trip1.arrival_time) \ + / datetime.timedelta(minutes=1) + if args.min_charging_time > standing_time_min: + return 0 + # Todo trip1 or trip2 + buffer_time=(get_buffer_time(trip1,args)/ datetime.timedelta(minutes=1)) + if buffer_time >0: + standing_time_min -= buffer_time + else: + standing_time_min -=delay + return max(0, standing_time_min) + def join_subsets(subsets): subsets = [s.copy() for s in subsets] for i in range(len(subsets)): @@ -1114,12 +1111,15 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, possible_stations = {t.arrival_name for t in trips} possible_stations_list = [t.arrival_name for t in trips] else: - for ii, t in enumerate(trips): + for ii, trip in enumerate(trips): try: - standing_time = trips[ii + 1].departure_time - t.arrival_time - if standing_time > get_buffer_time(t.arrival_time, args): - possible_stations.add(t.arrival_name) - possible_stations_list.append(t.arrival_name) + try: + standing_time_min = get_charging_time(trip, trips[ii + 1], args) + except IndexError: + standing_time_min = 0 + if standing_time_min>0: + possible_stations.add(trip.arrival_name) + possible_stations_list.append(trip.arrival_name) except IndexError: pass @@ -1177,7 +1177,6 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): def run_schedule(this_sched, this_args, electrified_stations=None): this_sched2 = copy(this_sched) - this_sched2.rotations = deepcopy(this_sched2.rotations) this_sched2.stations=electrified_stations this_sched2.assign_vehicles() @@ -1185,21 +1184,24 @@ def run_schedule(this_sched, this_args, electrified_stations=None): electrified_stations=electrified_stations) # Dont print output from spice ev to reduce clutter + print(".", end="") sys.stdout = open(os.devnull, 'w') print("Running Spice EV...") with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) + new_scen.run('distributed', vars(this_args).copy()) + sys.stdout = sys.__stdout__ + print(".") return this_sched2, new_scen -def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_grid=float('inf')): +def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_grid=float('inf'), timestep=0.1): # Charging curve as nested list of SOC, Power[kW] and capacity in [kWh] # Simple numeric creation of power over time --> to energy over time normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) - timestep = 0.1 soc = 0 time = 0 socs = [] @@ -1207,9 +1209,12 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr while soc < 1: times.append(time) socs.append(soc) - power = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) + soc2 = soc +timestep / 60 * power1 + power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), max_charge_from_grid / capacity) - # print(time, power*capacity) + power = (power1+power2)/2 soc += timestep / 60 * power time += timestep # Fill the soc completely in last timestep @@ -1239,7 +1244,7 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta): return min(1, end_soc - start_soc) -def get_buffer_time(search_time, args): +def get_buffer_time_old(search_time, args): for window, buffer_time in args.default_buffer_time_opps.items(): try: start, end = window.split("-") @@ -1254,6 +1259,9 @@ def electrify_station(stat, stations, electrified_set): stations[stat] = {'type': 'opps', 'n_charging_stations': 200} electrified_set.add(stat) +def get_buffer_time(trip,args): + return get_buffer_time_old(trip.arrival_time, args) + # return datetime.timedelta(minutes=get_buffer_time_spice_ev(trip,)) if __name__ == "__main__": freeze_support() From cc6a6da7a2b793cc712de658a17b6763ff1d8053 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 28 Nov 2022 15:55:47 +0100 Subject: [PATCH 344/802] Add new function plot, basically copied from spiceEV #39 --- ebus_toolbox/report.py | 98 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 17af5b48..53c13d24 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,8 +4,9 @@ import datetime import warnings import json +import matplotlib.pyplot as plt -from src.report import aggregate_timeseries, aggregate_local_results +from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results def generate_vehicle_socs(scenario, args): @@ -61,6 +62,97 @@ def generate_cs_power_overview(scenario, args): csv_writer.writerow((i, t, ) + tuple(row)) +def plot(scenario, args): + print('Done. Create plots...') + + xlabels = [] + for r in scenario.results: + xlabels.append(r['current_time']) + + # batteries + if scenario.batteryLevels: + plots_top_row = 3 + ax = plt.subplot(2, plots_top_row, 3) + ax.set_title('Batteries') + ax.set(ylabel='Stored power in kWh') + for name, values in scenario.batteryLevels.items(): + ax.plot(xlabels, values, label=name) + ax.legend() + else: + plots_top_row = 2 + + # vehicles + ax = plt.subplot(2, plots_top_row, 1) + ax.set_title('Vehicles') + ax.set(ylabel='SoC') + lines = ax.plot(xlabels, scenario.socs) + # reset color cycle, so lines have same color + ax.set_prop_cycle(None) + + ax.plot(xlabels, scenario.disconnect, '--') + if len(scenario.constants.vehicles) <= 10: + ax.legend(lines, sorted(scenario.constants.vehicles.keys())) + + # charging stations + ax = plt.subplot(2, plots_top_row, 2) + ax.set_title('Charging Stations') + ax.set(ylabel='Power in kW') + lines = ax.step(xlabels, scenario.sum_cs, where='post') + if len(scenario.constants.charging_stations) <= 10: + ax.legend(lines, sorted(scenario.constants.charging_stations.keys())) + + # total power + ax = plt.subplot(2, 2, 3) + ax.step(xlabels, list([sum(cs) for cs in scenario.sum_cs]), label="CS", where='post') + gc_ids = scenario.constants.grid_connectors.keys() + for gcID in gc_ids: + for name, values in scenario.loads[gcID].items(): + ax.step(xlabels, values, label=name, where='post') + # draw schedule + if scenario.strat.uses_window: + for gcID, schedule in scenario.gcWindowSchedule.items(): + if all(s is not None for s in schedule): + # schedule exists + window_values = [v * int(max(scenario.totalLoad[gcID])) for v in schedule] + ax.step(xlabels, window_values, label="window {}".format(gcID), + linestyle='--', where='post') + if scenario.strat.uses_schedule: + for gcID, schedule in scenario.gcPowerSchedule.items(): + if any(s is not None for s in schedule): + ax.step(xlabels, schedule, label="Schedule {}".format(gcID), where='post') + + ax.step(xlabels, scenario.all_totalLoad, label="Total", where='post') + ax.set_title('Power') + ax.set(ylabel='Power in kW') + ax.legend() + ax.xaxis_date() # xaxis are datetime objects + + # price + ax = plt.subplot(2, 2, 4) + prices = list(zip(*scenario.prices.values())) + lines = ax.step(xlabels, prices, where='post') + ax.set_title('Price for 1 kWh') + ax.set(ylabel='€') + if len(gc_ids) <= 10: + ax.legend(lines, sorted(gc_ids)) + + # figure title + fig = plt.gcf() + fig.suptitle('Strategy: {}'.format(scenario.strat.description), fontweight='bold') + + # fig.autofmt_xdate() # rotate xaxis labels (dates) to fit + # autofmt removes some axis labels, so rotate by hand: + for ax in fig.get_axes(): + ax.set_xlim(scenario.start_time, scenario.stop_time) + plt.setp(ax.get_xticklabels(), rotation=30, ha='right') + + # set size of figure and save it + plt.gcf().set_size_inches(10, 10) + plt.savefig(args.output_directory / "run_overview.png") + plt.savefig(args.output_directory / "run_overview.pdf") + # plt.show() + + def generate(schedule, scenario, args): # generate csv out of vehicle's socs @@ -73,6 +165,10 @@ def generate(schedule, scenario, args): # generate cs power overview generate_cs_power_overview(scenario, args) + # save plots as png and pdf + aggregate_global_results(scenario) + plot(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From ae17f79c10a49710f1c22a1f629de370b3500cf2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 28 Nov 2022 17:12:12 +0100 Subject: [PATCH 345/802] Fix soc lookup and optimize logger --- data/examples/ebus_toolbox.cfg | 4 +- ebus_toolbox/optimizer.py | 207 ++++++++++----------------------- 2 files changed, 66 insertions(+), 145 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index e60e5456..7eb015fc 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -62,7 +62,7 @@ desired_soc_opps = 1 preferred_charging_type = "oppb" # min charging time at depots and opp stations [minutes] (default: 2) -min_charging_time = 1 +min_charging_time = 0 # buffer time at opp station if no specific buffer time is provided # via the electrified_stations.json [minutes] (default: 1) @@ -71,7 +71,7 @@ min_charging_time = 1 # The buffer time is deducted off of the planned standing time. # It may resemble things like delays and/or docking procedures # default_buffer_time_opps = 1 - +default_buffer_time_opps = 0 ##### PHYSICAL SETUP OF ENVIRONMENT ##### diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index fce98a73..0b5f4808 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -1,7 +1,7 @@ """ Optimizer that evaluates inputs and outputs of every iteration, adapting scenario setup to optimize for specified metrics. """ -import datetime +from datetime import datetime,timedelta import json import os import sys @@ -27,16 +27,13 @@ logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) - formatter = logging.Formatter('%(message)s') file_handler = logging.FileHandler('optimizer.log') -file_handler.setLevel(logging.ERROR) +file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(formatter) - stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) stream_handler.setLevel(logging.DEBUG) - logger.addHandler(file_handler) logger.addHandler(stream_handler) @@ -44,7 +41,7 @@ with open("scen_bvg_test.pickle", "rb") as f: scen = pickle.load(f) with open("sched_bvg_test.pickle", "rb") as f: sched = pickle.load(f) -ROT = '6813275' +ROT = '6808730' # set battery and charging power BATTERY_CAPACITY = 400 CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] @@ -54,9 +51,14 @@ vehicle["capacity"] = BATTERY_CAPACITY vehicle["charging_curve"] = CHARGING_CURVE +CHARGE_EFF=0.95 CHARGING_POWER = 250 + + timers = [0] * 10 args.min_charging_time=0 +args.default_buffer_time_opps = {"else":0} + del args.save_soc del args.save_timeseries del args.save_results @@ -99,7 +101,7 @@ def run_optimization(this_sched, this_scen, args, :return: (Schedule,Scenario) optimizied schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - now = datetime.datetime.now() + now = datetime.now() new_ele_stations_path = "data/examples/optimized_stations_" + \ now.strftime("%Y_%m_%d_%H_%M") + ".json" @@ -130,12 +132,19 @@ def run_optimization(this_sched, this_scen, args, i = 0 global timer_for_calc while True and i < 2: - if type == "greedy": + if type == "greedy" or type=="deep": logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ greedy_optimization(ele_stations, ele_station_set, new_scen, new_sched, not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, solver=kwargs.get("solver", "quick")) + elif type=="deep": + ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ + greedy_optimization(ele_stations, ele_station_set, new_scen, new_sched, + not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, + solver=kwargs.get("solver", "quick"), decision_tree=dict()) + pass + i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: break @@ -148,6 +157,7 @@ def run_optimization(this_sched, this_scen, args, f"\n {could_not_be_electrified}") + logger.warning("Removing impossible rots, rebasing and restarting optimization") exclusion_rots.update(could_not_be_electrified) new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( @@ -177,9 +187,10 @@ def run_optimization(this_sched, this_scen, args, new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( this_sched, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set) + ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) ax.plot(q) - print("Still negative rotations:", new_sched.get_negative_rotations(new_scen)) + logger.debug(f"Still negative rotations:{new_sched.get_negative_rotations(new_scen)}") print("Finished") return new_sched, new_scen @@ -203,13 +214,13 @@ def main(): # which stations have to be electrified? inclusion_stations = set() # {'SWEL01B'} #{'SMZ07B', 'SWEL01B', 'URUD08B'} - sched.rotations={ROT:sched.rotations[ROT]} + # sched.rotations={ROT:sched.rotations[ROT]} exclusion_stations = set() t = time.time() run_optimization(sched, scen, args, type="greedy", exclusion_rots=exclusion_rots, inclusion_stations=inclusion_stations, exclusion_stations=exclusion_stations, - remove_impossible_rots=True, rebase_scenario=True, solver="quick") + remove_impossible_rots=False, rebase_scenario=False, solver="quick") print(f"Opt took {time.time() - t}") @@ -217,7 +228,8 @@ def main(): def greedy_optimization(electrified_stations, electrified_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, **kwargs): + not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, + decision_tree = dict(),pre_optimzed_set=None, **kwargs): # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() base_electrified_station_set = electrified_station_set.copy() @@ -256,12 +268,12 @@ def greedy_optimization(electrified_stations, electrified_station_set, new_scen, # Baseline greedy Optimization list_greedy_sets = [set()] * len(groups) - decision_tree = dict() + # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups): events, stations = group - + group_rots={e["rotation"].id:e["rotation"] for e in events} linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() @@ -273,9 +285,10 @@ def greedy_optimization(electrified_stations, electrified_station_set, new_scen, group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, - pre_optimzed_set=None, + pre_optimzed_set=pre_optimzed_set, decision_tree=decision_tree, brute=False, **kwargs) else: + # use spiceev group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, @@ -769,50 +782,16 @@ def choose_station(station_eval, electrified_station_set, return None -# -# def timeseries_calc_folded_dep(station, events, soc_dict_folded, eval_scen): -# soc_dict_folded = copy(soc_dict_folded) -# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] -# soc_over_time_curve = charging_curve_to_soc_over_time(charging_curve, BATTERY_CAPACITY) -# for e in events: -# if station in e["stations"]: -# for i, trip in enumerate(e["trip"]): -# if trip.arrival_name != station: -# continue -# try: -# idx = np.argwhere(soc_dict_folded[e["vehicle_id"]][:,0]==trip.arrival_time)[0][0] -# except: -# continue -# soc = soc_dict_folded[e["vehicle_id"]][:,2] -# try: -# standing_time = e["trip"][i + 1].departure_time - trip.arrival_time -# except IndexError: -# standing_time = datetime.timedelta(minutes=0) -# standing_time -= get_buffer_time(trip.arrival_time, args) -# standing_time = standing_time / datetime.timedelta(minutes=1) -# d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time) -# soc[idx:] += d_soc -# soc_max = np.max(soc) -# while soc_max > 1: -# desc = np.arange(len(soc), 0, -1) -# diff = np.hstack((np.diff(soc), -1)) -# # masking of socs >1 and negative gradient for local maximum -# idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) -# # Reducing everything after local maximum -# soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) -# # Capping everything before local maximum -# soc[:idc_loc_max][soc[:idc_loc_max]>1]=1 -# soc_max = np.max(soc) -# return soc_dict_folded - - def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): global timers ele_stations = set([*ele_station_set, station]) s2 = time.time() soc_dict = copy(soc_dict) - soc_over_time_curve = charging_curve_to_soc_over_time(CHARGING_CURVE, BATTERY_CAPACITY, - CHARGING_POWER) + CHARGING_CURVE_EFF =[[soc,power] for soc, power in CHARGING_CURVE] + + soc_over_time_curve = charging_curve_to_soc_over_time(CHARGING_CURVE_EFF, BATTERY_CAPACITY, + CHARGING_POWER, efficiency=CHARGE_EFF, + timestep=0.1) for rot in rotations: soc = soc_dict[rot.vehicle_id] for i, trip in enumerate(rot.trips): @@ -826,8 +805,13 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): standing_time_min =0 d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min) - buffer_idx = int((get_buffer_time(trip,args))/datetime.timedelta(minutes=1)) - soc[idx + 1+buffer_idx:] += d_soc + buffer_idx = int((get_buffer_time(trip,args))/timedelta(minutes=1)) + delta_idx=int(standing_time_min)+1 + old_soc = soc[idx +buffer_idx:idx +buffer_idx+delta_idx].copy() + soc[idx +buffer_idx:] += d_soc + soc[idx + buffer_idx:idx + buffer_idx + delta_idx] = old_soc + soc[idx + buffer_idx:idx + buffer_idx + delta_idx] +=np.linspace(0, d_soc,delta_idx) + soc_max = np.max(soc) timers[0] += time.time() - s s = time.time() @@ -836,8 +820,11 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): diff = np.hstack((np.diff(soc), -1)) # masking of socs >1 and negative gradient for local maximum idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) + + soc_max= soc[idc_loc_max] # Reducing everything after local maximum soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) + # Capping everything before local maximum soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 soc_max = np.max(soc) @@ -890,7 +877,7 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, # energy provided by charging for the full standing time delta_E_pot = min(delta_soc_pot * capacity, energy_charging_potential) d = dict(E_pot=delta_E_pot, - standing_time=datetime.timedelta(minutes=standing_time_min)) + standing_time=timedelta(minutes=standing_time_min)) try: station_eval[trip.arrival_name]["pot_list"].append(d) except: @@ -908,12 +895,12 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, continue sum = 0 - standing_time = datetime.timedelta(minutes=0) + standing_time = timedelta(minutes=0) for pot in stat_dict["pot_list"]: sum += pot["E_pot"] standing_time += pot["standing_time"] stat_dict["pot_sum"] = sum - # time_list.append(standing_time / datetime.timedelta(minutes=1)) + # time_list.append(standing_time / timedelta(minutes=1)) # Sort by pot_sum station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1]["pot_sum"])).items()) station_eval.reverse() @@ -921,17 +908,17 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, def get_charging_time(trip1, trip2, args): - delay = 1 + delay = 0 standing_time_min = (trip2.departure_time - trip1.arrival_time) \ - / datetime.timedelta(minutes=1) + / timedelta(minutes=1) if args.min_charging_time > standing_time_min: return 0 # Todo trip1 or trip2 - buffer_time=(get_buffer_time(trip1,args)/ datetime.timedelta(minutes=1)) + buffer_time=(get_buffer_time(trip1,args)/ timedelta(minutes=1)) if buffer_time >0: standing_time_min -= buffer_time else: - standing_time_min -=delay + standing_time_min -= delay return max(0, standing_time_min) def join_subsets(subsets): @@ -947,22 +934,16 @@ def join_subsets(subsets): return False, subsets -# def get_subsets(sched: schedule.Schedule, rotations): -# subsets = [{t.arrival_name for t in rot.trips if t.arrival_name not in exclusions} for rot in -# rotations] -# return join_all_subsets(subsets) - - def get_index_by_time(search_time, this_scen: scenario.Scenario): start_time = this_scen.start_time - delta_time = datetime.timedelta(minutes=60 / this_scen.stepsPerHour) + delta_time = timedelta(minutes=60 / this_scen.stepsPerHour) idx = (search_time - start_time) // delta_time return idx def get_time_by_index(idx, this_scen: scenario.Scenario): start_time = this_scen.start_time - delta_time = datetime.timedelta(minutes=60 / this_scen.stepsPerHour) + delta_time = timedelta(minutes=60 / this_scen.stepsPerHour) searched_time = start_time + delta_time * idx return searched_time @@ -993,70 +974,6 @@ def get_rotation_soc(rot_id, this_sched, this_scen): return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx -# -# def get_below_zero_soc_events_folded_(this_scen: scenario.Scenario, rotations, -# this_sched: schedule.Schedule, -# soc_upper_thresh=0.9, filter_standing_time=True, -# not_possible_stations=set(), soc_lower_thresh=0): -# # Create list of events which describe trips which end in a soc below zero -# # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 -# # Properties before and after these points have no effect on the event itself, similar to -# # an event horizon -# events = [] -# SOC_UPPER_THRESH = soc_upper_thresh -# count_electrified_rot = 0 -# for rot_id in rotations: -# rot = this_sched.rotations[rot_id] -# data = this_scen.vehicle_socs_folded[rot.vehicle_id] -# soc = data[:, 2][(data[:, 0] >= rot.departure_time) * (data[:, 0] <= rot.arrival_time)] -# -# # soc, rot_start_idx, rot_end_idx = get_rotation_soc(rot_id, this_sched, this_scen) -# # soc = [s if s is not None else 999 for s in soc] -# idx = range(0, len(soc)) -# -# comb = list(zip(soc, idx)) -# min_soc, min_idx = min(comb, key=lambda x: x[0]) -# reduced_list = comb.copy() -# -# if min_soc >= soc_lower_thresh: -# count_electrified_rot += 1 -# -# while min_soc < soc_lower_thresh: -# i = min_idx -# idx = [x[1] for x in reduced_list] -# while soc[i] < SOC_UPPER_THRESH: -# if i == 0: break -# i -= 1 -# start = idx.index(i) -# -# i = min_idx -# while soc[i] < SOC_UPPER_THRESH: -# if i >= len(soc) - 1: break -# i += 1 -# end = idx.index(i) -# -# possible_stations = set(data[start:min_idx, 1]) -# -# trips = set(data[start:min_idx, 3]) -# -# possible_stations = possible_stations.difference(not_possible_stations) -# event = dict(start_idx=start, end_idx=min_idx, -# min_soc=min_soc, stations=possible_stations, -# vehicle_id=rot.vehicle_id, trip=trips, -# rotation=rot) -# -# copy_list = reduced_list.copy() -# reduced_list = reduced_list[:start] -# if end + 1 >= len(copy_list): -# reduced_list.extend(copy_list[end + 1:]) -# if len(reduced_list) > 0: -# min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) -# else: -# break -# print(f"Last electrification electrified {count_electrified_rot} rotations") -# return events - - def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, this_sched: schedule.Schedule, soc_upper_thresh=0.9, filter_standing_time=True, @@ -1080,8 +997,11 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] min_soc, min_idx = min(comb, key=lambda x: x[0]) reduced_list = comb.copy() - - if min_soc >= soc_lower_thresh: + start_soc = comb[0][0] + # if rotation gets a start soc below 1 this should change below 0 soc events since fixing + # the rotation before would lead to fixing this rotation + soc_lower_thresh_cur = min(start_soc,soc_upper_thresh)-(soc_upper_thresh-soc_lower_thresh) + if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 # # if min_soc to energy over time normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) @@ -1214,7 +1135,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr soc2 = soc +timestep / 60 * power1 power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), max_charge_from_grid / capacity) - power = (power1+power2)/2 + power = (power1+power2)/2*efficiency soc += timestep / 60 * power time += timestep # Fill the soc completely in last timestep @@ -1250,9 +1171,9 @@ def get_buffer_time_old(search_time, args): start, end = window.split("-") if float(end) > search_time.hour >= float(start): - return datetime.timedelta(minutes=buffer_time) + return timedelta(minutes=buffer_time) except ValueError: - return datetime.timedelta(minutes=0) + return timedelta(minutes=0) def electrify_station(stat, stations, electrified_set): @@ -1261,7 +1182,7 @@ def electrify_station(stat, stations, electrified_set): def get_buffer_time(trip,args): return get_buffer_time_old(trip.arrival_time, args) - # return datetime.timedelta(minutes=get_buffer_time_spice_ev(trip,)) + # return timedelta(minutes=get_buffer_time_spice_ev(trip,)) if __name__ == "__main__": freeze_support() From 12afa3b8ffda347a0d1438b4e0a8b47a4a2efc0c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 28 Nov 2022 19:24:59 +0100 Subject: [PATCH 346/802] First iterator over decision tree --- ebus_toolbox/optimizer.py | 201 +++++++++++++++++++++++--------------- 1 file changed, 121 insertions(+), 80 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 0b5f4808..6b04f071 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -1,7 +1,7 @@ """ Optimizer that evaluates inputs and outputs of every iteration, adapting scenario setup to optimize for specified metrics. """ -from datetime import datetime,timedelta +from datetime import datetime, timedelta import json import os import sys @@ -22,6 +22,7 @@ # Todo this implementation in c ase of changes in ebustoolbox from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev + matplotlib.use("TkAgg") import numpy as np @@ -46,25 +47,25 @@ BATTERY_CAPACITY = 400 CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # CHARGING_CURVE = [[0, 450], [0.99, 20],[1,20]] -for name , type in sched.vehicle_types.items(): +for name, type in sched.vehicle_types.items(): for charge_type, vehicle in type.items(): vehicle["capacity"] = BATTERY_CAPACITY vehicle["charging_curve"] = CHARGING_CURVE -CHARGE_EFF=0.95 +CHARGE_EFF = 0.95 CHARGING_POWER = 250 - timers = [0] * 10 -args.min_charging_time=0 -args.default_buffer_time_opps = {"else":0} +args.min_charging_time = 0 +args.default_buffer_time_opps = {"else": 0} del args.save_soc del args.save_timeseries del args.save_results + def run_optimization(this_sched, this_scen, args, - type="greedy", exclusion_rots=set(), inclusion_stations=set(), + opt_type="greedy", exclusion_rots=set(), inclusion_stations=set(), exclusion_stations=set(), remove_impossible_rots=False, rebase_scenario=False, **kwargs): """ @@ -89,8 +90,8 @@ def run_optimization(this_sched, this_scen, args, :type this_scen: spice_ev.Scenario :param args: Simulation arguments for manipulation or generated outputs :type args: object - :param type: Type of the following optimizations ["greedy"] - :type type: str + :param opt_type: Type of the following optimizations ["greedy"] + :type opt_type: str :param exclusion_rots: Rotations to be excluded from optimization :type exclusion_rots: set(str) :param inclusion_stations: Stations which have to be electrified @@ -132,18 +133,12 @@ def run_optimization(this_sched, this_scen, args, i = 0 global timer_for_calc while True and i < 2: - if type == "greedy" or type=="deep": + if opt_type == "greedy" or opt_type == "deep": logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ - greedy_optimization(ele_stations, ele_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - solver=kwargs.get("solver", "quick")) - elif type=="deep": - ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ - greedy_optimization(ele_stations, ele_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - solver=kwargs.get("solver", "quick"), decision_tree=dict()) - pass + optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, + not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, + solver=kwargs.get("solver", "quick"), opt_type=opt_type) i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: @@ -156,8 +151,6 @@ def run_optimization(this_sched, this_scen, args, logger.warning(f"These rotations could not be electrified" f"\n {could_not_be_electrified}") - - logger.warning("Removing impossible rots, rebasing and restarting optimization") exclusion_rots.update(could_not_be_electrified) new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( @@ -165,8 +158,6 @@ def run_optimization(this_sched, this_scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=False) - - logger.debug(f"Non Spice Ev methods took {time.time() - s - timer_for_calc} sec") logger.debug(f"Spice ev took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") @@ -177,7 +168,7 @@ def run_optimization(this_sched, this_scen, args, new_scen.vehicle_socs, new_scen, ele_station_set) plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) - q =get_rotation_soc(ROT, new_sched, new_scen)[0] + q = get_rotation_soc(ROT, new_sched, new_scen)[0] global timers logger.debug(timers) with open(new_ele_stations_path, "w") as f: @@ -210,7 +201,7 @@ def main(): exclusion_rots.update(impossible_rots) exclusion_rots = set() - exclusion_rots={'6891228', '7194397', '6891226', '6891222', '7049423', '7049422', '6891224'} + exclusion_rots = {'6891228', '7194397', '6891226', '6891222', '7049423', '7049422', '6891224'} # which stations have to be electrified? inclusion_stations = set() # {'SWEL01B'} #{'SMZ07B', 'SWEL01B', 'URUD08B'} @@ -218,7 +209,7 @@ def main(): exclusion_stations = set() t = time.time() - run_optimization(sched, scen, args, type="greedy", exclusion_rots=exclusion_rots, + run_optimization(sched, scen, args, opt_type="deep", exclusion_rots=exclusion_rots, inclusion_stations=inclusion_stations, exclusion_stations=exclusion_stations, remove_impossible_rots=False, rebase_scenario=False, solver="quick") print(f"Opt took {time.time() - t}") @@ -227,9 +218,9 @@ def main(): timer_for_calc = 0 -def greedy_optimization(electrified_stations, electrified_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - decision_tree = dict(),pre_optimzed_set=None, **kwargs): +def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, + not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, + decision_tree=dict(), pre_optimzed_set=None, opt_type="greedy", **kwargs): # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() base_electrified_station_set = electrified_station_set.copy() @@ -269,11 +260,11 @@ def greedy_optimization(electrified_stations, electrified_station_set, new_scen, # Baseline greedy Optimization list_greedy_sets = [set()] * len(groups) - # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups): events, stations = group - group_rots={e["rotation"].id:e["rotation"] for e in events} + group_rots = {e["rotation"].id: e["rotation"] for e in events} + group_socs = [e["min_soc"] for e in events] linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() @@ -286,7 +277,32 @@ def greedy_optimization(electrified_stations, electrified_station_set, new_scen, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, pre_optimzed_set=pre_optimzed_set, - decision_tree=decision_tree, brute=False, **kwargs) + decision_tree=decision_tree, brute=False, base_group=events, + **kwargs) + if solver == "quick": + if opt_type == "deep": + sols = [] + while True: + print(len(decision_tree)) + not_possible_stations = copy(not_possible_stations) + pre_optimized_set = copy(electrified_station_set) + + electrified_stations = base_stations.copy() + # electrified_station_set = base_electrified_station_set.copy() + new_electrified_set = set() + group_optimization_quick(group, base_scen, base_sched, + electrified_stations, new_electrified_set, + could_not_be_electrified + , not_possible_stations, + pre_optimzed_set=pre_optimized_set, + decision_tree=decision_tree, brute=False, + base_group=events) + + print("optimized with", len(new_electrified_set), " stations", + stations_hash(new_electrified_set)) + sols.append(new_electrified_set) + + else: # use spiceev group_optimization(group, base_scen, base_sched, @@ -483,7 +499,8 @@ def group_optimization_quick(group, base_scen, base_sched, # pre_opt_sched.rotations = rotation_dict s = time.time() - event_rotations = {x["rotation"] for x in event_group} + base_group = kwargs.get("base_group", []) + event_rotations = {x["rotation"] for x in base_group} new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, @@ -495,7 +512,7 @@ def group_optimization_quick(group, base_scen, base_sched, timer_for_calc += time.time() - s timers[2] += time.time() - s not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) - event_rotations = [event["rotation"].id for event in event_group] + event_rotations = {event["rotation"].id for event in event_group} new_events = get_below_zero_soc_events(new_scen, event_rotations, new_sched, soc_upper_thresh=1, @@ -507,23 +524,39 @@ def group_optimization_quick(group, base_scen, base_sched, missing_soc += e["min_soc"] delta_energy = missing_soc * BATTERY_CAPACITY + missing_base_soc = 0 + + event_rotations = {event["rotation"].id for event in base_group} + base_events = get_below_zero_soc_events(new_scen, event_rotations, + new_sched, + soc_upper_thresh=1, + filter_standing_time=True, + not_possible_stations=set(), + soc_lower_thresh=0) + for e in base_events: + if e["min_soc"] > 0: + print("!") + missing_base_soc += e["min_soc"] + delta_base_energy = missing_base_soc * BATTERY_CAPACITY + logger.debug(delta_energy) if decision_tree is not None: + node_name = stations_hash(electrified_station_set) try: - decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy - decision_tree[str(electrified_station_set)]["visit_counter"] += 1 + decision_tree[node_name]["missing_energy"] = delta_base_energy + decision_tree[node_name]["visit_counter"] += 1 logger.debug("already visited") except KeyError: - decision_tree[str(electrified_station_set)] = dict() - decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy - decision_tree[str(electrified_station_set)]["visit_counter"] = 1 + decision_tree[node_name] = dict() + decision_tree[node_name]["missing_energy"] = delta_base_energy + decision_tree[node_name]["visit_counter"] = 1 # Everything electrified if delta_energy >= 0: return electrified_stations - else: - if brute: - return + # else: + # if brute: + # return # Check if the events can be divided into subgroups which are independent groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) @@ -535,7 +568,7 @@ def group_optimization_quick(group, base_scen, base_sched, could_not_be_electrified, not_possible_stations, pre_optimzed_set, decision_tree, - lifted_socs=lifted_socs) + lifted_socs=lifted_socs, base_group=base_group) electrified_stations.update(new_stations) return electrified_stations @@ -605,7 +638,6 @@ def group_optimization(group, base_scen, base_sched, new_sched, new_scen = run_schedule(pre_opt_sched, args, electrified_stations=electrified_stations) - global timer_for_calc timer_for_calc += time.time() - s @@ -622,14 +654,15 @@ def group_optimization(group, base_scen, base_sched, delta_energy = missing_soc * BATTERY_CAPACITY if decision_tree is not None: + node_name = str(sorted(list(electrified_station_set))) try: - decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy - decision_tree[str(electrified_station_set)]["visit_counter"] += 1 + decision_tree[node_name]["missing_energy"] = delta_energy + decision_tree[node_name]["visit_counter"] += 1 print("already visited") except KeyError: - decision_tree[str(electrified_station_set)] = dict() - decision_tree[str(electrified_station_set)]["missing_energy"] = delta_energy - decision_tree[str(electrified_station_set)]["visit_counter"] = 1 + decision_tree[node_name] = dict() + decision_tree[node_name]["missing_energy"] = delta_energy + decision_tree[node_name]["visit_counter"] = 1 # Everything electrified if delta_energy >= 0: @@ -752,7 +785,7 @@ def choose_station(station_eval, electrified_station_set, for i in range(0, min(delta, len(station_eval))): pot += station_eval[i][1]["pot_sum"] if pot <= -missing_energy: - print("Not enough potential after ", electrified_station_set) + print("Not enough potential after ", stations_hash(electrified_station_set)) return None min_count_visited = float('inf') @@ -761,9 +794,10 @@ def choose_station(station_eval, electrified_station_set, check_stations = electrified_station_set.union([station[0]]) if decision_tree is not None: - if str(check_stations) in decision_tree.keys(): + node_name = stations_hash(check_stations) + if node_name in decision_tree.keys(): min_count_visited = min(min_count_visited, - decision_tree[str(check_stations)]["visit_counter"]) + decision_tree[node_name]["visit_counter"]) # If already checked skip to next one continue if station[0] not in electrified_station_set: @@ -776,18 +810,22 @@ def choose_station(station_eval, electrified_station_set, for station in station_eval: # Create a station combination from already electrified stations and possible new station check_stations = electrified_station_set.union([station[0]]) - if decision_tree[str(check_stations)]["visit_counter"] == min_count_visited: + if decision_tree[stations_hash(check_stations)]["visit_counter"] == min_count_visited: best_station_id = station[0] return [best_station_id] return None +def stations_hash(stations_set): + return str(sorted(list(stations_set))) + + def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): global timers ele_stations = set([*ele_station_set, station]) s2 = time.time() soc_dict = copy(soc_dict) - CHARGING_CURVE_EFF =[[soc,power] for soc, power in CHARGING_CURVE] + CHARGING_CURVE_EFF = [[soc, power] for soc, power in CHARGING_CURVE] soc_over_time_curve = charging_curve_to_soc_over_time(CHARGING_CURVE_EFF, BATTERY_CAPACITY, CHARGING_POWER, efficiency=CHARGE_EFF, @@ -800,17 +838,17 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): continue idx = get_index_by_time(trip.arrival_time, eval_scen) try: - standing_time_min=get_charging_time(trip,rot.trips[i + 1], args) + standing_time_min = get_charging_time(trip, rot.trips[i + 1], args) except IndexError: - standing_time_min =0 + standing_time_min = 0 d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min) - buffer_idx = int((get_buffer_time(trip,args))/timedelta(minutes=1)) - delta_idx=int(standing_time_min)+1 - old_soc = soc[idx +buffer_idx:idx +buffer_idx+delta_idx].copy() - soc[idx +buffer_idx:] += d_soc - soc[idx + buffer_idx:idx + buffer_idx + delta_idx] = old_soc - soc[idx + buffer_idx:idx + buffer_idx + delta_idx] +=np.linspace(0, d_soc,delta_idx) + buffer_idx = int((get_buffer_time(trip, args)) / timedelta(minutes=1)) + delta_idx = int(standing_time_min) + 1 + old_soc = soc[idx + buffer_idx:idx + buffer_idx + delta_idx].copy() + soc[idx + buffer_idx:] += d_soc + soc[idx + buffer_idx:idx + buffer_idx + delta_idx] = old_soc + soc[idx + buffer_idx:idx + buffer_idx + delta_idx] += np.linspace(0, d_soc, delta_idx) soc_max = np.max(soc) timers[0] += time.time() - s @@ -821,7 +859,7 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): # masking of socs >1 and negative gradient for local maximum idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) - soc_max= soc[idc_loc_max] + soc_max = soc[idc_loc_max] # Reducing everything after local maximum soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) @@ -859,12 +897,10 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, soc - e["min_soc"], max_soc - min_soc) - - try: - standing_time_min=get_charging_time(trip,e["trip"][i + 1], args) + standing_time_min = get_charging_time(trip, e["trip"][i + 1], args) except IndexError: - standing_time_min =0 + standing_time_min = 0 # ToDo get Vehicle Battery Capacity and charging power capacity = BATTERY_CAPACITY @@ -914,13 +950,14 @@ def get_charging_time(trip1, trip2, args): if args.min_charging_time > standing_time_min: return 0 # Todo trip1 or trip2 - buffer_time=(get_buffer_time(trip1,args)/ timedelta(minutes=1)) - if buffer_time >0: - standing_time_min -= buffer_time + buffer_time = (get_buffer_time(trip1, args) / timedelta(minutes=1)) + if buffer_time > 0: + standing_time_min -= buffer_time else: standing_time_min -= delay return max(0, standing_time_min) + def join_subsets(subsets): subsets = [s.copy() for s in subsets] for i in range(len(subsets)): @@ -1000,7 +1037,9 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, start_soc = comb[0][0] # if rotation gets a start soc below 1 this should change below 0 soc events since fixing # the rotation before would lead to fixing this rotation - soc_lower_thresh_cur = min(start_soc,soc_upper_thresh)-(soc_upper_thresh-soc_lower_thresh) + # soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( + # soc_upper_thresh - soc_lower_thresh) + soc_lower_thresh_cur=soc_lower_thresh if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 # @@ -1037,7 +1076,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, standing_time_min = get_charging_time(trip, trips[ii + 1], args) except IndexError: standing_time_min = 0 - if standing_time_min>0: + if standing_time_min > 0: possible_stations.add(trip.arrival_name) possible_stations_list.append(trip.arrival_name) except IndexError: @@ -1081,7 +1120,7 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): Trip.consumption = Consumption(this_sched.vehicle_types, outside_temperatures=args.outside_temperature_over_day_path, level_of_loading_over_day=args.level_of_loading_over_day_path) - this_sched.stations=electrified_stations + this_sched.stations = electrified_stations # filter trips according to args this_sched.calculate_consumption() # this_sched.set_charging_type(this_args.preferred_charging_type) @@ -1097,7 +1136,7 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): def run_schedule(this_sched, this_args, electrified_stations=None): this_sched2 = copy(this_sched) - this_sched2.stations=electrified_stations + this_sched2.stations = electrified_stations this_sched2.assign_vehicles() this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, @@ -1119,7 +1158,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None): def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_grid=float('inf'), - timestep=0.1, efficiency = 1): + timestep=0.1, efficiency=1): # Charging curve as nested list of SOC, Power[kW] and capacity in [kWh] # Simple numeric creation of power over time --> to energy over time normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) @@ -1131,11 +1170,11 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr times.append(time) socs.append(soc) power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) - soc2 = soc +timestep / 60 * power1 + max_charge_from_grid / capacity) + soc2 = soc + timestep / 60 * power1 power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) - power = (power1+power2)/2*efficiency + max_charge_from_grid / capacity) + power = (power1 + power2) / 2 * efficiency soc += timestep / 60 * power time += timestep # Fill the soc completely in last timestep @@ -1180,10 +1219,12 @@ def electrify_station(stat, stations, electrified_set): stations[stat] = {'type': 'opps', 'n_charging_stations': 200} electrified_set.add(stat) -def get_buffer_time(trip,args): + +def get_buffer_time(trip, args): return get_buffer_time_old(trip.arrival_time, args) # return timedelta(minutes=get_buffer_time_spice_ev(trip,)) + if __name__ == "__main__": freeze_support() main() From ac3f90d15f2f3e875da99805d03e331cf76ae32e Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 28 Nov 2022 20:42:49 +0100 Subject: [PATCH 347/802] try different comment char in json --- data/examples/electrified_stations.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index f91aa948..2063e2ca 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -4,12 +4,12 @@ "n_charging_stations": null, "distance_transformer": 150, "battery": { - "charging_curve": [[0,50], [1,50]], # piecewise linear function that maps SoC to power, from 0 to 1, required - "capacity": 300, # kWh, assumed to be infinite if not given - "min_charging_power": 0, # kW, optional - "soc": 0, # initial state of charge [0-1], optional - "efficiency": 0.95, # optional - "discharge_curve": null # optional, same as charging curve + "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required + "capacity": 300, // kWh, assumed to be infinite if not given + "min_charging_power": 0, // kW, optional + "soc": 0, // initial state of charge [0-1], optional + "efficiency": 0.95, // optional + "discharge_curve": null // optional, same as charging curve } }, "Station-3": { From 277f532b50053025451dc12de11b2ef5fd44fe3d Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 28 Nov 2022 21:10:21 +0100 Subject: [PATCH 348/802] reflect change of json comment delimiter in function uncomment_json_file --- ebus_toolbox/util.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 3741874a..a9530c09 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -107,7 +107,7 @@ def get_buffer_time(trip, default=0): return buffer_time -def uncomment_json_file(f, char='#'): +def uncomment_json_file(f, delim='//'): """ Remove comments from JSON file. @@ -115,19 +115,19 @@ def uncomment_json_file(f, char='#'): Both full-line comments and trailing lines are supported. :param f: file to read :type f: JSON file handle - :param char: char used for commenting, defaults to # - :type char: char + :param delim: char or string used for commenting, defaults to '//' + :type delim: string :return: JSON file content :rtype: dict """ uncommented_data = "" for line in f: - try: - comment_idx = line.index(char) - uncommented_data += line[:comment_idx] - except ValueError: - # no comment in line - uncommented_data += line + comment_idx = line.find(delim) + if comment_idx == -1: + # no comment in line + uncommented_data += line + else: + uncommented_data += line[:comment_idx] + "\n" return json.loads(uncommented_data) From cb114514bda88dace5d9b8999d1867b7232d398c Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 28 Nov 2022 21:12:46 +0100 Subject: [PATCH 349/802] make flake8 happy --- ebus_toolbox/util.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index a9530c09..8ac224de 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -122,12 +122,12 @@ def uncomment_json_file(f, delim='//'): """ uncommented_data = "" for line in f: - comment_idx = line.find(delim) - if comment_idx == -1: - # no comment in line - uncommented_data += line - else: - uncommented_data += line[:comment_idx] + "\n" + comment_idx = line.find(delim) + if comment_idx == -1: + # no comment in line + uncommented_data += line + else: + uncommented_data += line[:comment_idx] + "\n" return json.loads(uncommented_data) From 8c268ef8399d802b7ef18a8e0e0fd7d0df168375 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 28 Nov 2022 21:30:49 +0100 Subject: [PATCH 350/802] remove old definition of stationary battery from config --- data/examples/ebus_toolbox.cfg | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 75de69d7..71c190b2 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -93,17 +93,6 @@ cs_power_deps_oppb = 150 # define hours of traffic_jam (options are "stop&go" and "dense") #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} -# set stationary batteries [capacity, C-Rate] -# battery with capacity = 75 kWh and C-Rate = 0.5 -#battery = [[50, 1]] - -# 2 batteries with capacity = 50 kWh, C-Rate = 1, grid_connector = "Betriebshof A") -#battery = [[50, 1, "Station-0"]] - -# unlimited battery capacity with constant (dis)charge of 50 kWh -#battery = [[-1, 50]] - - ##### TIMESERIES ##### # list of external load timeseries (in this example in same directory as resulting json) and From e1d33743d311028dc105f134f70a7939f03485b3 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 28 Nov 2022 22:04:44 +0100 Subject: [PATCH 351/802] make error obvious if only constant consumption --- data/examples/ebus_toolbox.cfg | 3 ++- data/examples/vehicle_types.json | 18 ++++++++---------- ebus_toolbox/simulate.py | 1 + 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 75de69d7..2034c800 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -21,7 +21,8 @@ cost_params = "./data/examples/cost_params.json" station_data_path = "data/examples/all_stations.csv" # Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours -outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" +# todo: this should be optional +# outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 65d00bf4..2c9fe8f2 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -6,7 +6,8 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "v2g_power_factor": 0.5 + "v2g_power_factor": 0.5, + "mileage": 1 }, "oppb": { "name": "articulated bus - opportunity charging", @@ -14,7 +15,8 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "v2g_power_factor": 0.5 + "v2g_power_factor": 0.5, + "mileage": 1 } }, "CKB": { @@ -24,8 +26,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": 1 }, "oppb": { "name": "articulated bus", @@ -33,8 +34,7 @@ "charging_curve": [[0, 190], [0.8, 190], [1, 190]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": 1 } }, "VDL": { @@ -44,8 +44,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": 1 }, "oppb": { "name": "solo bus", @@ -53,8 +52,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": 1 } } } \ No newline at end of file diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 5776ef52..edda55c0 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -52,6 +52,7 @@ def simulate(args): setattr(args, opt_key, opt_val) # setup consumption calculator that can be accessed by all trips + # todo: This should only be accessed if not all vehicles have constant consumption Trip.consumption = Consumption(vehicle_types, outside_temperatures=args.outside_temperature_over_day_path, level_of_loading_over_day=args.level_of_loading_over_day_path) From c32115ccb7d47db1c4d94948c0f3307f4ea5a146 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 28 Nov 2022 22:09:54 +0100 Subject: [PATCH 352/802] make second error obvious if only constant consumption --- data/examples/ebus_toolbox.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 2034c800..9fa80660 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -25,7 +25,8 @@ station_data_path = "data/examples/all_stations.csv" # outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours -level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" +# todo: this should be optional +# level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" ##### SIMULATION HYPERPARAMETERS ##### From 30092c8aac935a93435040c550b14e33e00caaac Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 29 Nov 2022 10:39:03 +0100 Subject: [PATCH 353/802] Make lol and temp completly optional and add error messages --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/__main__.py | 6 ++-- ebus_toolbox/consumption.py | 56 ++++++++++++++++++++++++---------- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 9fa80660..a4abdb84 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -22,7 +22,7 @@ station_data_path = "data/examples/all_stations.csv" # Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours # todo: this should be optional -# outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" +#outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours # todo: this should be optional diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index b258a21a..5caed3cb 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -105,12 +105,14 @@ parser.add_argument('--station_data_path', help='Use station data to back calculation \ of consumption with height information of \ stations') - parser.add_argument('--outside_temperature_over_day_path', help="Use csv. data with 'hour' and \ + parser.add_argument('--outside_temperature_over_day_path', default=None, + help="Use csv. data with 'hour' and \ 'temperature' columns to set \ temperatures in case they are not \ in trips.csv") - parser.add_argument('--level_of_loading_over_day_path', help="Use csv. data with 'hour' and \ + parser.add_argument('--level_of_loading_over_day_path', default=None, + help="Use csv. data with 'hour' and \ 'level_of_loading' columns to set \ level of loading in case they are \ not in trips.csv") diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 84a5b730..c030500d 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -8,22 +8,24 @@ def __init__(self, vehicle_types, **kwargs) -> None: # load temperature of the day, now dummy winter day self.temperatures_by_hour = {} - temperature_file_path = kwargs.get("outside_temperatures") + temperature_file_path = kwargs.get("outside_temperatures", None) # parsing the Temperature to a dict - with open(temperature_file_path) as f: - delim = util.get_csv_delim(temperature_file_path) - reader = csv.DictReader(f, delimiter=delim) - for row in reader: - self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) - - lol_file_path = kwargs.get("level_of_loading_over_day") + if temperature_file_path is not None: + with open(temperature_file_path) as f: + delim = util.get_csv_delim(temperature_file_path) + reader = csv.DictReader(f, delimiter=delim) + for row in reader: + self.temperatures_by_hour.update({int(row['hour']): float(row['temperature'])}) + + lol_file_path = kwargs.get("level_of_loading_over_day", None) # parsing the level of loading to a dict - with open(lol_file_path) as f: - delim = util.get_csv_delim(lol_file_path) - reader = csv.DictReader(f, delimiter=delim) - self.lol_by_hour = {} - for row in reader: - self.lol_by_hour.update({int(row['hour']): float(row['level_of_loading'])}) + if lol_file_path is not None: + with open(lol_file_path) as f: + delim = util.get_csv_delim(lol_file_path) + reader = csv.DictReader(f, delimiter=delim) + self.lol_by_hour = {} + for row in reader: + self.lol_by_hour.update({int(row['hour']): float(row['level_of_loading'])}) self.consumption_files = {} self.vehicle_types = vehicle_types @@ -67,11 +69,33 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem # if no specific Temperature is given, lookup temperature if temp is None: - temp = self.temperatures_by_hour[time.hour] + try: + temp = self.temperatures_by_hour[time.hour] + except AttributeError: + print("Neither of these conditions is met:\n" + "1. Temperature data is available for every trip through the trips file " + "or a temperature over day file.\n" + f"2. A constant mileage for the vehicle " + f"{vehicle_info['mileage']} is provided.") + raise + except IndexError: + print(f"No temperature data for the hour {time.hour} is provided") + raise # if no specific LoL is given, lookup temperature if level_of_loading is None: - level_of_loading = self.lol_by_hour[time.hour] + try: + level_of_loading = self.lol_by_hour[time.hour] + except AttributeError: + print("Neither of these conditions is met:\n" + "1. Level of loading data is available for every trip through the trips file " + "or a level of loading over day file.\n" + f"2. A constant mileage for the vehicle " + f"{vehicle_info['mileage']} is provided.") + raise + except IndexError: + print(f"No level of loading data for the hour {time.hour} is provided") + raise # load consumption csv consumption_path = vehicle_info["mileage"] From b0e76b3ce25f0465e5d9e3cbf3b03dab65cdd6f6 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 29 Nov 2022 10:41:15 +0100 Subject: [PATCH 354/802] Make flake8 happy --- ebus_toolbox/__main__.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 5caed3cb..3831a7a8 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -106,16 +106,12 @@ of consumption with height information of \ stations') parser.add_argument('--outside_temperature_over_day_path', default=None, - help="Use csv. data with 'hour' and \ - 'temperature' columns to set \ - temperatures in case they are not \ - in trips.csv") + help="Use csv. data with 'hour' and temperature' columns to set \ + temperatures in case they are not in trips.csv") parser.add_argument('--level_of_loading_over_day_path', default=None, - help="Use csv. data with 'hour' and \ - 'level_of_loading' columns to set \ - level of loading in case they are \ - not in trips.csv") + help="Use csv. data with 'hour' and level_of_loading' columns to set \ + level of loading in case they are not in trips.csv") args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config From 865b631a03c9383f17533ea87aac27a34341549f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 29 Nov 2022 10:48:56 +0100 Subject: [PATCH 355/802] Add raises to docstring --- ebus_toolbox/consumption.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index c030500d..92fa644b 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -54,6 +54,9 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :type mean_speed: float :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) + + :raises IndexError: if there is missing data for temperature or lol data + :raises NameError: if there is no path to temperature or lol data provided """ assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ @@ -77,10 +80,10 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem "or a temperature over day file.\n" f"2. A constant mileage for the vehicle " f"{vehicle_info['mileage']} is provided.") - raise + raise AttributeError except IndexError: print(f"No temperature data for the hour {time.hour} is provided") - raise + raise IndexError # if no specific LoL is given, lookup temperature if level_of_loading is None: @@ -92,10 +95,10 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem "or a level of loading over day file.\n" f"2. A constant mileage for the vehicle " f"{vehicle_info['mileage']} is provided.") - raise + raise AttributeError except IndexError: print(f"No level of loading data for the hour {time.hour} is provided") - raise + raise IndexError # load consumption csv consumption_path = vehicle_info["mileage"] From c4e093fd1888eaf23ed8121f6fb660f693c7782b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 29 Nov 2022 10:51:49 +0100 Subject: [PATCH 356/802] Change raises in docstring to AttributeError --- ebus_toolbox/consumption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 92fa644b..8e0e98ca 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -56,7 +56,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :rtype: (float, float) :raises IndexError: if there is missing data for temperature or lol data - :raises NameError: if there is no path to temperature or lol data provided + :raises AttributeError: if there is no path to temperature or lol data provided """ assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ From 749d6154cb10793de486c44c6c0fa3ed475ec6d6 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 29 Nov 2022 11:06:22 +0100 Subject: [PATCH 357/802] add get missing energy func --- ebus_toolbox/optimizer.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 6b04f071..1f500743 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -519,12 +519,8 @@ def group_optimization_quick(group, base_scen, base_sched, filter_standing_time=True, not_possible_stations=not_possible_stations, soc_lower_thresh=0) - missing_soc = 0 - for e in new_events: - missing_soc += e["min_soc"] - delta_energy = missing_soc * BATTERY_CAPACITY - missing_base_soc = 0 + delta_energy=get_missing_energy(new_events, BATTERY_CAPACITY) event_rotations = {event["rotation"].id for event in base_group} base_events = get_below_zero_soc_events(new_scen, event_rotations, @@ -533,11 +529,8 @@ def group_optimization_quick(group, base_scen, base_sched, filter_standing_time=True, not_possible_stations=set(), soc_lower_thresh=0) - for e in base_events: - if e["min_soc"] > 0: - print("!") - missing_base_soc += e["min_soc"] - delta_base_energy = missing_base_soc * BATTERY_CAPACITY + + delta_base_energy=get_missing_energy(base_events, BATTERY_CAPACITY) logger.debug(delta_energy) if decision_tree is not None: @@ -574,6 +567,13 @@ def group_optimization_quick(group, base_scen, base_sched, return electrified_stations +def get_missing_energy(events, cap): + missing_soc = 0 + for e in events: + missing_soc += e["min_soc"] + return missing_soc * cap + + def group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, pre_optimzed_set=None, decision_tree=None, From e2d88f9dc026f568588ccb7bca0f296e8c98e988 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 29 Nov 2022 11:32:27 +0100 Subject: [PATCH 358/802] restore example and remove solved todo comments --- data/examples/ebus_toolbox.cfg | 18 ++++++++---------- data/examples/vehicle_types.json | 18 ++++++++++-------- ebus_toolbox/__main__.py | 4 ++-- ebus_toolbox/simulate.py | 1 - 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index a4abdb84..ad2cf864 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -20,13 +20,11 @@ cost_params = "./data/examples/cost_params.json" # Path to station data with stations heights and possibly more information station_data_path = "data/examples/all_stations.csv" -# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours -# todo: this should be optional -#outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" +# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) +outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" -# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours -# todo: this should be optional -# level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" +# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) +level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" ##### SIMULATION HYPERPARAMETERS ##### @@ -63,16 +61,16 @@ desired_soc_opps = 0.8 # Preferred charging type. Options: depb, oppb (default: oppb) preferred_charging_type = "depb" -# min charging time at depots and opp stations [minutes] (default: 2) -min_charging_time = 2 +# min charging time at depots and opp stations [minutes] (default: 0) +min_charging_time = 0 # buffer time at opp station if no specific buffer time is provided -# via the electrified_stations.json [minutes] (default: 1) +# via the electrified_stations.json [minutes] (default: 0) # Time specific buffer times can be set via a dict like: # {"10-22": 5, "else": 2} NOTE: else clause is a MUST! # The buffer time is deducted off of the planned standing time. # It may resemble things like delays and/or docking procedures -# default_buffer_time_opps = 1 +default_buffer_time_opps = 0 ##### PHYSICAL SETUP OF ENVIRONMENT ##### diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 2c9fe8f2..65d00bf4 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -6,8 +6,7 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 1 + "v2g_power_factor": 0.5 }, "oppb": { "name": "articulated bus - opportunity charging", @@ -15,8 +14,7 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 1 + "v2g_power_factor": 0.5 } }, "CKB": { @@ -26,7 +24,8 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": 1 + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" }, "oppb": { "name": "articulated bus", @@ -34,7 +33,8 @@ "charging_curve": [[0, 190], [0.8, 190], [1, 190]], "min_charging_power": 0, "v2g": false, - "mileage": 1 + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" } }, "VDL": { @@ -44,7 +44,8 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": 1 + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" }, "oppb": { "name": "solo bus", @@ -52,7 +53,8 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": 1 + "mileage": "data/examples/energy_consumption_example.csv", + "hc": "winter" } } } \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 3831a7a8..177814d6 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -77,9 +77,9 @@ parser.add_argument('--cost-params', help='include cost_params json', default=None) parser.add_argument('--min-charging-time', help='define minimum time of charging', - default=2) + default=0) parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' - 'at opp station to simulate docking procedure.', default=1) + 'at opp station to simulate docking procedure.', default=0) parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' 'start time of a vehicle event im min.', default=10) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index edda55c0..5776ef52 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -52,7 +52,6 @@ def simulate(args): setattr(args, opt_key, opt_val) # setup consumption calculator that can be accessed by all trips - # todo: This should only be accessed if not all vehicles have constant consumption Trip.consumption = Consumption(vehicle_types, outside_temperatures=args.outside_temperature_over_day_path, level_of_loading_over_day=args.level_of_loading_over_day_path) From cf899e8d0b71f0307561ac23639782660479d726 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 29 Nov 2022 11:45:14 +0100 Subject: [PATCH 359/802] Overload choice function with brute or step by step --- ebus_toolbox/optimizer.py | 85 ++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 1f500743..e771a325 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -67,6 +67,7 @@ def run_optimization(this_sched, this_scen, args, opt_type="greedy", exclusion_rots=set(), inclusion_stations=set(), exclusion_stations=set(), remove_impossible_rots=False, rebase_scenario=False, + node_choice="step-by-step", **kwargs): """ Optimizes scenario by adding electrified stations sparingly @@ -138,7 +139,7 @@ def run_optimization(this_sched, this_scen, args, ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - solver=kwargs.get("solver", "quick"), opt_type=opt_type) + solver=kwargs.get("solver", "quick"), opt_type=opt_type, node_choice=node_choice) i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: @@ -211,7 +212,8 @@ def main(): t = time.time() run_optimization(sched, scen, args, opt_type="deep", exclusion_rots=exclusion_rots, inclusion_stations=inclusion_stations, exclusion_stations=exclusion_stations, - remove_impossible_rots=False, rebase_scenario=False, solver="quick") + remove_impossible_rots=False, rebase_scenario=False, solver="quick", + node_choice="brute") print(f"Opt took {time.time() - t}") @@ -272,12 +274,20 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n logger.debug(linien) print(len(events), "events") solver = kwargs.get("solver", "spiceev") + node_choice = kwargs.get("node_choice", "step-by-step") + if node_choice == "brute": + choice_func = choose_station_brute + else: + choice_func = choose_station_step_by_step + if solver == "quick": + # first run is always step by step group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, + choose_station_step_by_step, pre_optimzed_set=pre_optimzed_set, - decision_tree=decision_tree, brute=False, base_group=events, + decision_tree=decision_tree, base_group=events, **kwargs) if solver == "quick": if opt_type == "deep": @@ -294,8 +304,9 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n electrified_stations, new_electrified_set, could_not_be_electrified , not_possible_stations, + choice_func, pre_optimzed_set=pre_optimized_set, - decision_tree=decision_tree, brute=False, + decision_tree=decision_tree, base_group=events) print("optimized with", len(new_electrified_set), " stations", @@ -322,6 +333,8 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets + + # ######## # # with open("dec_tree.pickle", "rb") as f: # # decision_tree=pickle.load(f) @@ -436,7 +449,8 @@ def get_groups_from_events(events, not_possible_stations=set(), could_not_be_ele def group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, pre_optimzed_set=None, decision_tree=None, + not_possible_stations, choose_station_function, + pre_optimzed_set=None, decision_tree=None, brute=False, **kwargs): event_group, _ = group @@ -464,16 +478,9 @@ def group_optimization_quick(group, base_scen, base_sched, for id in station_eval: print(id[0], id[1]["pot_sum"]) logger.debug(missing_energy) - - # - if brute: - best_station_ids = choose_station_brute(station_eval, electrified_station_set, - pre_optimzed_set, decision_tree, - missing_energy=missing_energy) - else: - best_station_ids = choose_station(station_eval, electrified_station_set, - pre_optimzed_set, decision_tree, - missing_energy=missing_energy) + best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, + pre_optimzed_set, decision_tree, + missing_energy=missing_energy) logger.debug(best_station_ids) if best_station_ids is None: @@ -499,8 +506,13 @@ def group_optimization_quick(group, base_scen, base_sched, # pre_opt_sched.rotations = rotation_dict s = time.time() + + # Using the base_group for timeseries calculation is a little slower than using the current + # (smaller) event group which is getting optimized. But it allows for looking at the current + # base group missing energy see "delta_base_energy" which is put into base_group = kwargs.get("base_group", []) event_rotations = {x["rotation"] for x in base_group} + new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, @@ -520,7 +532,7 @@ def group_optimization_quick(group, base_scen, base_sched, not_possible_stations=not_possible_stations, soc_lower_thresh=0) - delta_energy=get_missing_energy(new_events, BATTERY_CAPACITY) + delta_energy = get_missing_energy(new_events, BATTERY_CAPACITY) event_rotations = {event["rotation"].id for event in base_group} base_events = get_below_zero_soc_events(new_scen, event_rotations, @@ -530,7 +542,7 @@ def group_optimization_quick(group, base_scen, base_sched, not_possible_stations=set(), soc_lower_thresh=0) - delta_base_energy=get_missing_energy(base_events, BATTERY_CAPACITY) + delta_base_energy = get_missing_energy(base_events, BATTERY_CAPACITY) logger.debug(delta_energy) if decision_tree is not None: @@ -547,9 +559,13 @@ def group_optimization_quick(group, base_scen, base_sched, # Everything electrified if delta_energy >= 0: return electrified_stations - # else: - # if brute: - # return + + # Some choice functions might not need a recursive call, they return here. recursive is set + # by the choose_station_function + if not recursive: + return + + # Check if the events can be divided into subgroups which are independent groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) @@ -559,7 +575,7 @@ def group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, + not_possible_stations, choose_station_function, pre_optimzed_set, decision_tree, lifted_socs=lifted_socs, base_group=base_group) electrified_stations.update(new_stations) @@ -601,15 +617,17 @@ def group_optimization(group, base_scen, base_sched, logger.debug("%s, %s", id[0], id[1]["pot_sum"]) logger.debug(missing_energy) - # + # best_station_ids = choose_stations_function(station_eval, electrified_station_set, + # pre_optimzed_set, decision_tree, + # missing_energy=missing_energy) if brute: best_station_ids = choose_station_brute(station_eval, electrified_station_set, pre_optimzed_set, decision_tree, missing_energy=missing_energy) else: - best_station_ids = choose_station(station_eval, electrified_station_set, - pre_optimzed_set, decision_tree, - missing_energy=missing_energy) + best_station_ids = choose_station_step_by_step(station_eval, electrified_station_set, + pre_optimzed_set, decision_tree, + missing_energy=missing_energy) logger.debug(best_station_ids) if best_station_ids is None: @@ -763,15 +781,16 @@ def choose_station_brute(station_eval, electrified_station_set, station_ids = [x[0] for x in station_eval] a = combination_generator(station_ids, len(pre_optimzed_set) - 1) for comb in a: - if str(set(comb)) not in decision_tree: - return comb + node_name=stations_hash(comb) + if node_name not in decision_tree: + return comb, False else: print("calculated all possibilities") - return None + return None, False -def choose_station(station_eval, electrified_station_set, - pre_optimzed_set=None, decision_tree=None, missing_energy=0): +def choose_station_step_by_step(station_eval, electrified_station_set, + pre_optimzed_set=None, decision_tree=None, missing_energy=0): # Filter functions to stop simulating cases which have no hope of being optimal. # If in optimization mode, optimization can break if station amount is superceded # This filter is done better by the next @@ -786,7 +805,7 @@ def choose_station(station_eval, electrified_station_set, pot += station_eval[i][1]["pot_sum"] if pot <= -missing_energy: print("Not enough potential after ", stations_hash(electrified_station_set)) - return None + return None, False min_count_visited = float('inf') for station in station_eval: @@ -802,7 +821,7 @@ def choose_station(station_eval, electrified_station_set, continue if station[0] not in electrified_station_set: best_station_id = station[0] - return [best_station_id] + return [best_station_id], True else: # Every possible node from here was evaluated already # to do what now? @@ -1039,7 +1058,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, # the rotation before would lead to fixing this rotation # soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( # soc_upper_thresh - soc_lower_thresh) - soc_lower_thresh_cur=soc_lower_thresh + soc_lower_thresh_cur = soc_lower_thresh if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 # From d256c1806bb539735c9bdac049bd96e9c9e1e0e3 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 29 Nov 2022 12:39:52 +0100 Subject: [PATCH 360/802] adapt print function of costs --- ebus_toolbox/costs.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index b8f2302c..30abfb3e 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -9,9 +9,9 @@ def calculate_costs(c_params, scenario, schedule, args): :param c_params: Cost of various infrastructure components. :type c_params: dict :param scenario: Information about the simulated scenario and all used parameters. - :type scenario: object + :type scenario: Scenario :param schedule: Information about the whole bus schedule and all used parameters. - :type schedule: object + :type schedule: Schedule :param args: Configuration arguments specified in config files contained in configs directory. :type args: argparse.Namespace """ @@ -143,11 +143,11 @@ def calculate_costs(c_params, scenario, schedule, args): for key, v in costs.items(): costs[key] = round(v, 2) - print(f"\n" - f"Total costs: \n" - f"Investment cost: {costs['c_invest']} €. " - f"Annual investment costs: {costs['c_invest_annual']} €/a. " - f"Annual maintenance costs: {costs['c_maint_annual']} €/a. " - f"Annual costs for electricity: {costs['c_el_annual']} €/a.") + print("\n" + "Total costs: \n" + f"Investment cost: {costs['c_invest']} €. \n" + f"Annual investment costs: {costs['c_invest_annual']} €/a. \n" + f"Annual maintenance costs: {costs['c_maint_annual']} €/a. \n" + f"Annual costs for electricity: {costs['c_el_annual']} €/a.\n") setattr(scenario, "costs", costs) From d818ab22239855372ca36a503fbbf01f3b614da1 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 29 Nov 2022 12:58:18 +0100 Subject: [PATCH 361/802] #44 revisited. set default json comment to //, add tests --- ebus_toolbox/util.py | 6 +++--- tests/test_util.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 tests/test_util.py diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 3741874a..23ef9d67 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -107,7 +107,7 @@ def get_buffer_time(trip, default=0): return buffer_time -def uncomment_json_file(f, char='#'): +def uncomment_json_file(f, char='//'): """ Remove comments from JSON file. @@ -115,8 +115,8 @@ def uncomment_json_file(f, char='#'): Both full-line comments and trailing lines are supported. :param f: file to read :type f: JSON file handle - :param char: char used for commenting, defaults to # - :type char: char + :param char: char sequence used for commenting, defaults to '//' + :type char: string :return: JSON file content :rtype: dict """ diff --git a/tests/test_util.py b/tests/test_util.py new file mode 100644 index 00000000..60596469 --- /dev/null +++ b/tests/test_util.py @@ -0,0 +1,35 @@ +import json +from ebus_toolbox import util + + +def test_uncomment_json_file(tmp_path): + p = tmp_path / "test.json" + with open(p, 'w+') as f: + # no comment + json.dump({"test1": 1}, f) + f.seek(0) + assert util.uncomment_json_file(f)["test1"] == 1 + + with open(p, 'w+') as f: + # single char comment in single line + f.write('# this is a comment\n{"test2": 2}\n#and another comment') + f.seek(0) + assert util.uncomment_json_file(f, '#')["test2"] == 2 + + with open(p, 'w+') as f: + # single char comment at end of line + f.write('{"test3": 3} % this is a comment') + f.seek(0) + assert util.uncomment_json_file(f, '%')["test3"] == 3 + + with open(p, 'w+') as f: + # multi-char comment in own line + f.write('// {"test4": "comment"}\n{"test4": 4}') + f.seek(0) + assert util.uncomment_json_file(f, '//')["test4"] == 4 + + with open(p, 'w+') as f: + # multi-char comment at end of line + f.write('{"test5": 5} """ {test5: "comment"} """') + f.seek(0) + assert util.uncomment_json_file(f, '"""')["test5"] == 5 From 5f49861de0067e6decd18a9c18f09d80bc3e1786 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 29 Nov 2022 13:32:44 +0100 Subject: [PATCH 362/802] comment in json: add comment, remove newlines, extend test --- ebus_toolbox/util.py | 3 ++- tests/test_util.py | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index d42d97e3..481bc4d1 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -127,7 +127,8 @@ def uncomment_json_file(f, char='//'): # no comment in line uncommented_data += line else: - uncommented_data += line[:comment_idx] + "\n" + # remove comment from line + uncommented_data += line[:comment_idx] return json.loads(uncommented_data) diff --git a/tests/test_util.py b/tests/test_util.py index 60596469..091cbe0d 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -10,6 +10,13 @@ def test_uncomment_json_file(tmp_path): f.seek(0) assert util.uncomment_json_file(f)["test1"] == 1 + with open(p, 'w+') as f: + # multiline, no comment + f.seek(0) + f.write('{\n"test1.1": 1.1,\n"test1.2": 1.2\n}') + f.seek(0) + assert sum(util.uncomment_json_file(f).values()) == 2.3 + with open(p, 'w+') as f: # single char comment in single line f.write('# this is a comment\n{"test2": 2}\n#and another comment') From 36a9bd3ade031f97ea8eb2a108b9058c108b96b3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 30 Nov 2022 14:30:52 +0100 Subject: [PATCH 363/802] Add config and config parser --- data/examples/optimizer.cfg | 26 +++ ebus_toolbox/optimizer.py | 386 +++++++++++++++++------------------- 2 files changed, 206 insertions(+), 206 deletions(-) create mode 100644 data/examples/optimizer.cfg diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg new file mode 100644 index 00000000..d23fe097 --- /dev/null +++ b/data/examples/optimizer.cfg @@ -0,0 +1,26 @@ +# Configs for the eBus Toolbox Optimizer +[SCENARIO] +exclusion_rots = [1,2,3] +exclusion_stations= [1,2,3] +inclusion_stations= [1,2,3] + + +[VEHICLE] +charge_eff = 0.95 +battery_capacity = 400 +charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +charging_power = 250 + +[optimizer] +rebase_scenario = False +# "greedy" or "deep" without "" +opt_type = greedy +remove_impossible_rots=False +# "step-by-step" or "brute" without "" +node_choice=step-by-step +max_brute_loop=200 + +[Special] +single_rot = FALSE +rot = '6813275' + diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index e771a325..5a46795a 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -7,7 +7,7 @@ import sys import warnings from copy import copy, deepcopy -import time +from time import time import logging import src.scenario as scenario @@ -30,7 +30,8 @@ logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(message)s') file_handler = logging.FileHandler('optimizer.log') -file_handler.setLevel(logging.DEBUG) + +file_handler.setLevel(logging.INFO) file_handler.setFormatter(formatter) stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) @@ -42,10 +43,13 @@ with open("scen_bvg_test.pickle", "rb") as f: scen = pickle.load(f) with open("sched_bvg_test.pickle", "rb") as f: sched = pickle.load(f) -ROT = '6808730' + +ROT = '6813275' # set battery and charging power + BATTERY_CAPACITY = 400 CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] + # CHARGING_CURVE = [[0, 450], [0.99, 20],[1,20]] for name, type in sched.vehicle_types.items(): for charge_type, vehicle in type.items(): @@ -109,7 +113,7 @@ def run_optimization(this_sched, this_scen, args, not_possible_stations = inclusion_stations.union(exclusion_stations) - s = time.time() + s = time() # Calculate base scenario # this_sched.rotations = {id: rot for id, rot in this_sched.rotations.items() if id in rots} if rebase_scenario: @@ -119,7 +123,7 @@ def run_optimization(this_sched, this_scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=False) - logger.debug(f"Rebasing took {time.time() - s} sec") + logger.debug(f"Rebasing took {time() - s} sec") else: with open(args.electrified_stations, "r") as f: ele_stations = json.load(f) @@ -130,7 +134,7 @@ def run_optimization(this_sched, this_scen, args, new_scen = this_scen new_sched = this_sched - s = time.time() + s = time() i = 0 global timer_for_calc while True and i < 2: @@ -139,13 +143,14 @@ def run_optimization(this_sched, this_scen, args, ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - solver=kwargs.get("solver", "quick"), opt_type=opt_type, node_choice=node_choice) + solver=kwargs.get("solver", "quick"), opt_type=opt_type, + node_choice=node_choice) i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: break else: - logger.debug(f"Non Spice Ev methods took {time.time() - s - timer_for_calc} sec") + logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") logger.debug(f"Spice ev took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") logger.debug(ele_station_set) @@ -159,7 +164,7 @@ def run_optimization(this_sched, this_scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=False) - logger.debug(f"Non Spice Ev methods took {time.time() - s - timer_for_calc} sec") + logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") logger.debug(f"Spice ev took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") logger.debug(ele_station_set) @@ -206,15 +211,15 @@ def main(): # which stations have to be electrified? inclusion_stations = set() # {'SWEL01B'} #{'SMZ07B', 'SWEL01B', 'URUD08B'} - # sched.rotations={ROT:sched.rotations[ROT]} + sched.rotations={ROT:sched.rotations[ROT]} exclusion_stations = set() - t = time.time() - run_optimization(sched, scen, args, opt_type="deep", exclusion_rots=exclusion_rots, + t = time() + run_optimization(sched, scen, args, opt_type="greedy", exclusion_rots=exclusion_rots, inclusion_stations=inclusion_stations, exclusion_stations=exclusion_stations, remove_impossible_rots=False, rebase_scenario=False, solver="quick", node_choice="brute") - print(f"Opt took {time.time() - t}") + print(f"Opt took {time() - t}") timer_for_calc = 0 @@ -222,7 +227,7 @@ def main(): def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - decision_tree=dict(), pre_optimzed_set=None, opt_type="greedy", **kwargs): + decision_tree=dict(), pre_optimized_set=None, opt_type="greedy", **kwargs): # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() base_electrified_station_set = electrified_station_set.copy() @@ -253,7 +258,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n this_sched=base_sched, soc_upper_thresh=0.95, filter_standing_time=True, not_possible_stations=not_possible_stations, - soc_lower_thresh=0) + soc_lower_thresh=0, relative_soc=False) # Check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible @@ -286,32 +291,48 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_step_by_step, - pre_optimzed_set=pre_optimzed_set, + pre_optimized_set=pre_optimized_set, decision_tree=decision_tree, base_group=events, **kwargs) if solver == "quick": if opt_type == "deep": sols = [] - while True: - print(len(decision_tree)) + i = 0 + cont_loop = True + t = time() + print("Greedy Result ++++++++") + print(electrified_station_set) + print( + f"There are {len(list(combination_generator(stations, len(electrified_station_set))))} combination") + while i < 200 and cont_loop: + i += 1 + if i % 10 == 0: + print(time() - t) + t = time() + print(len(decision_tree)) not_possible_stations = copy(not_possible_stations) pre_optimized_set = copy(electrified_station_set) - + could_not_be_electrified_copy = could_not_be_electrified.copy() electrified_stations = base_stations.copy() # electrified_station_set = base_electrified_station_set.copy() new_electrified_set = set() - group_optimization_quick(group, base_scen, base_sched, - electrified_stations, new_electrified_set, - could_not_be_electrified - , not_possible_stations, - choice_func, - pre_optimzed_set=pre_optimized_set, - decision_tree=decision_tree, - base_group=events) - - print("optimized with", len(new_electrified_set), " stations", - stations_hash(new_electrified_set)) - sols.append(new_electrified_set) + new_stations, cont_loop = \ + group_optimization_quick(group, base_scen, base_sched, + electrified_stations, new_electrified_set, + could_not_be_electrified_copy + , not_possible_stations, + choice_func, + pre_optimized_set=pre_optimized_set, + decision_tree=decision_tree, + base_group=events) + # if a new set was found, print it and save it in sols + + if new_electrified_set != pre_optimized_set and new_stations is not None: + print("Optimized with", len(new_electrified_set), " stations", str(["#"]*20), + stations_hash(new_electrified_set)) + sols.append(new_electrified_set) + else: + print(f"{new_electrified_set} is not viable") else: @@ -319,7 +340,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, - pre_optimzed_set=None, + pre_optimized_set=None, decision_tree=decision_tree, brute=False, **kwargs) list_greedy_sets[group_nr] = electrified_station_set.copy() @@ -333,84 +354,15 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets - - -# ######## -# # with open("dec_tree.pickle", "rb") as f: -# # decision_tree=pickle.load(f) -# # -# # with open("pre_opt.pickle", "rb") as f: -# # electrified_station_set =pickle.load(f) -# -# while True: -# print(len(decision_tree)) -# not_possible_stations = inclusion_stations.union(exclusion_stations) -# pre_optimized_set = electrified_station_set -# group = groups[19] -# electrified_stations = base_stations.copy() -# electrified_station_set = base_electrified_station_set.copy() -# -# group_optimization(group, base_scen, base_sched, -# electrified_stations, electrified_station_set, could_not_be_electrified -# , not_possible_stations, pre_optimzed_set=pre_optimized_set, -# decision_tree=decision_tree, brute=True) -# print("optimized with", len(electrified_station_set), " stations") -# sols.append(electrified_station_set) -# ######## -# -# # Save Optimization -# for s in list_greedy_sets: -# for stat in s: -# electrify_station(stat, electrified_stations, electrified_station_set) -# with open("400kWh_no_inc_new_raus_ohne_197_ohne_imp_ele_station.json", "w") as f: -# json.dump(electrified_stations, f, indent=2) -# -# electrified_stations = base_stations.copy() -# electrified_station_set = base_electrified_station_set -# # -# # list_opt_sets=[set()]*len(groups) -# # -# # for group_nr, group in enumerate(groups): -# min_length=float("inf") -# event_group, _ = group -# station_eval = list(evaluate(event_group, base_scen).items()) -# station_eval.reverse() -# -# # Expand greedy Tree from each node of greedy Optimization -# excl_options = list(list_greedy_sets[group_nr]) -# pre_optimzed_set =list_greedy_sets[group_nr] -# -# pack = (group, base_scen, base_sched, -# old_stations, old_electrified_station_set, -# could_not_be_electrified, pre_optimzed_set) -# with Pool(5) as p: -# # Outer optimization func, Repeating input,Stations to be excluded -# results = p.starmap(outer_group_optimzation,zip(repeat(pack), excl_options)) -# -# for res in results: -# if len(res)< min_length: -# min_length=len(res) -# list_opt_sets[group_nr]=res -# print(min_length) -# -# -# greedy_stations_count=sum([len(s) for s in list_greedy_sets]) -# list_opt_count = sum([len(s) for s in list_opt_sets]) -# print(f"Greedy Results in {greedy_stations_count} stations") -# print(f"Opt Results in {list_opt_count} stations") -# print(list_greedy_sets) -# print(list_opt_sets) - - def outer_group_optimzation(pack, not_possible_stations): group, base_scen, base_sched, old_stations, \ - old_electrified_station_set, could_not_be_electrified, pre_optimzed_set = pack + old_electrified_station_set, could_not_be_electrified, pre_optimized_set = pack electrified_stations = old_stations.copy() electrified_station_set = old_electrified_station_set.copy() ele_set = group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, pre_optimzed_set=pre_optimzed_set) + not_possible_stations, pre_optimized_set=pre_optimized_set) return electrified_station_set.copy() @@ -450,9 +402,8 @@ def group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_function, - pre_optimzed_set=None, decision_tree=None, - brute=False, **kwargs): - event_group, _ = group + pre_optimized_set=None, decision_tree=None, **kwargs): + event_group, possible_stations = group # Loading from pickle faster than deepcopy. Copy enough? new_scen = copy(base_scen) @@ -463,41 +414,39 @@ def group_optimization_quick(group, base_scen, base_sched, new_scen.vehicle_socs = lifted_socs new_sched = copy(base_sched) - missing_soc = 0 - rotation_dict = dict() - for e in event_group: - rotation_dict[e["rotation"].id] = e["rotation"] - missing_soc += e["min_soc"] + rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} + missing_energy = get_missing_energy(event_group, BATTERY_CAPACITY) - if missing_soc >= 0: + if missing_energy >= 0: logger.debug("Already electrified: Returning set") - return electrified_stations - missing_energy = missing_soc * BATTERY_CAPACITY + return electrified_stations, True station_eval = evaluate(event_group, new_scen) for id in station_eval: - print(id[0], id[1]["pot_sum"]) + logger.debug("%s , %s", id[0], id[1]["pot_sum"]) + logger.debug(missing_energy) best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, - pre_optimzed_set, decision_tree, - missing_energy=missing_energy) + pre_optimized_set, decision_tree, + missing_energy=missing_energy) logger.debug(best_station_ids) if best_station_ids is None: logger.warning( - f"All stations with estimated potential electrified but still missing energy in {len(list(rotation_dict.keys()))} rotations") - if pre_optimzed_set is not None: + f"All stations with estimated potential electrified but still missing energy in " + f"{len(list(rotation_dict.keys()))} rotations") + if pre_optimized_set is not None: # Remove electrified stations in this run c = electrified_station_set.copy() for stat in c: electrified_stations.pop(stat) electrified_station_set.remove(stat) # Overwrite with preoptimized set - for stat in pre_optimzed_set: + for stat in pre_optimized_set: electrify_station(stat, electrified_stations, electrified_station_set) else: could_not_be_electrified.update(list(rotation_dict.keys())) - return electrified_stations + return None, False # Electrify station for id in best_station_ids: @@ -505,7 +454,7 @@ def group_optimization_quick(group, base_scen, base_sched, # pre_opt_sched.rotations = rotation_dict - s = time.time() + s = time() # Using the base_group for timeseries calculation is a little slower than using the current # (smaller) event group which is getting optimized. But it allows for looking at the current @@ -521,8 +470,8 @@ def group_optimization_quick(group, base_scen, base_sched, global timer_for_calc global timers - timer_for_calc += time.time() - s - timers[2] += time.time() - s + timer_for_calc += time() - s + timers[2] += time() - s not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) event_rotations = {event["rotation"].id for event in event_group} new_events = get_below_zero_soc_events(new_scen, event_rotations, @@ -530,7 +479,7 @@ def group_optimization_quick(group, base_scen, base_sched, soc_upper_thresh=1, filter_standing_time=True, not_possible_stations=not_possible_stations, - soc_lower_thresh=0) + soc_lower_thresh=0, relative_soc=True) delta_energy = get_missing_energy(new_events, BATTERY_CAPACITY) @@ -540,7 +489,7 @@ def group_optimization_quick(group, base_scen, base_sched, soc_upper_thresh=1, filter_standing_time=True, not_possible_stations=set(), - soc_lower_thresh=0) + soc_lower_thresh=0, relative_soc=True) delta_base_energy = get_missing_energy(base_events, BATTERY_CAPACITY) @@ -558,29 +507,26 @@ def group_optimization_quick(group, base_scen, base_sched, # Everything electrified if delta_energy >= 0: - return electrified_stations - + return electrified_stations, True # Some choice functions might not need a recursive call, they return here. recursive is set # by the choose_station_function - if not recursive: - return - - + elif not recursive: + return None, True # Check if the events can be divided into subgroups which are independent groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) for group in groups: - new_stations = group_optimization_quick(group, base_scen, base_sched, - electrified_stations, - electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, - pre_optimzed_set, decision_tree, - lifted_socs=lifted_socs, base_group=base_group) + new_stations, _ = group_optimization_quick(group, base_scen, base_sched, + electrified_stations, + electrified_station_set, + could_not_be_electrified, + not_possible_stations, choose_station_function, + pre_optimized_set, decision_tree, + lifted_socs=lifted_socs, base_group=base_group) electrified_stations.update(new_stations) - return electrified_stations + return electrified_stations, True def get_missing_energy(events, cap): @@ -592,7 +538,7 @@ def get_missing_energy(events, cap): def group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, pre_optimzed_set=None, decision_tree=None, + not_possible_stations, pre_optimized_set=None, decision_tree=None, brute=False, **kwargs): event_group, _ = group @@ -618,29 +564,29 @@ def group_optimization(group, base_scen, base_sched, logger.debug(missing_energy) # best_station_ids = choose_stations_function(station_eval, electrified_station_set, - # pre_optimzed_set, decision_tree, + # pre_optimized_set, decision_tree, # missing_energy=missing_energy) if brute: - best_station_ids = choose_station_brute(station_eval, electrified_station_set, - pre_optimzed_set, decision_tree, + best_station_ids, _ = choose_station_brute(station_eval, electrified_station_set, + pre_optimized_set, decision_tree, missing_energy=missing_energy) else: - best_station_ids = choose_station_step_by_step(station_eval, electrified_station_set, - pre_optimzed_set, decision_tree, + best_station_ids, _ = choose_station_step_by_step(station_eval, electrified_station_set, + pre_optimized_set, decision_tree, missing_energy=missing_energy) logger.debug(best_station_ids) if best_station_ids is None: print( f"All stations with estimated potential electrified but still missing energy in {len(list(rotation_dict.keys()))} rotations") - if pre_optimzed_set is not None: + if pre_optimized_set is not None: # Remove electrified stations in this run c = electrified_station_set.copy() for stat in c: electrified_stations.pop(stat) electrified_station_set.remove(stat) # Overwrite with preoptimized set - for stat in pre_optimzed_set: + for stat in pre_optimized_set: electrify_station(stat, electrified_stations, electrified_station_set) else: could_not_be_electrified.update(list(rotation_dict.keys())) @@ -651,13 +597,13 @@ def group_optimization(group, base_scen, base_sched, electrify_station(id, electrified_stations, electrified_station_set) pre_opt_sched.rotations = rotation_dict - s = time.time() + s = time() new_sched, new_scen = run_schedule(pre_opt_sched, args, electrified_stations=electrified_stations) global timer_for_calc - timer_for_calc += time.time() - s + timer_for_calc += time() - s not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) new_events = get_below_zero_soc_events(new_scen, list(new_sched.rotations.keys()), @@ -665,7 +611,7 @@ def group_optimization(group, base_scen, base_sched, soc_upper_thresh=1, filter_standing_time=True, not_possible_stations=not_possible_stations, - soc_lower_thresh=0) + soc_lower_thresh=0, relative_soc=True) missing_soc = 0 for e in new_events: missing_soc += e["min_soc"] @@ -698,7 +644,7 @@ def group_optimization(group, base_scen, base_sched, electrified_station_set, could_not_be_electrified, not_possible_stations, - pre_optimzed_set, decision_tree) + pre_optimized_set, decision_tree) electrified_stations.update(new_stations) return electrified_stations @@ -731,7 +677,7 @@ def preprocessing_scenario(this_sched, this_args, return new_sched, new_scen, electrified_station_set, electrified_stations -def combination_generator(iterable, amount: int, _pass_list=list(), _counter=0): +def combination_generator(iterable, amount: int): """ Generator which yields all possible combinations of choosing an amount out of an iterable without putting them back and without caring about the order of elements @@ -740,21 +686,17 @@ def combination_generator(iterable, amount: int, _pass_list=list(), _counter=0): :type amount: int """ iterable = list(iterable) - # Initialization of list with length of amount - if len(_pass_list) == 0: - _pass_list = [0] * amount + for i, item in enumerate(iterable): # Recursive calling of generator with clock like behavior, e.g right-most item changes until # end of list is reached. This leads to a change in the item left to it and so on. Elements # on the right can only change to a subset of bigger indicies than their left counter-part. # This is due to the ignoring of order, which reduces the amount of possibilities. - _pass_list[_counter] = item if amount <= 1: - yield _pass_list + yield [item] else: - for gen in combination_generator(iterable[i + 1:], amount - 1, _pass_list, - _counter=_counter + 1): - yield gen + for gen in combination_generator(iterable[i + 1:], amount - 1): + yield [item] + gen def no_optimization(): @@ -775,31 +717,40 @@ def join_all_subsets(subsets): return subsets + # ToDo Further implement def choose_station_brute(station_eval, electrified_station_set, - pre_optimzed_set=None, decision_tree=None, missing_energy=0): + pre_optimized_set=None, decision_tree=None, missing_energy=0): station_ids = [x[0] for x in station_eval] - a = combination_generator(station_ids, len(pre_optimzed_set) - 1) + a = combination_generator(station_ids, len(pre_optimized_set)) + station_eval_dict = {stat[0]: stat[1] for stat in station_eval} for comb in a: - node_name=stations_hash(comb) + node_name = stations_hash(comb) if node_name not in decision_tree: - return comb, False + # Only check the brute force station if they have the remote chance of fullfilling + # the missing energy + # Potential>missing energy * 80% + potential=sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) + if potential>-missing_energy*0.8: + return comb, False + else: + print(f"skipped {comb} since potential is too low {round(potential/-missing_energy*100,0)}%") else: - print("calculated all possibilities") + print("calculated all viable possibilities") return None, False def choose_station_step_by_step(station_eval, electrified_station_set, - pre_optimzed_set=None, decision_tree=None, missing_energy=0): + pre_optimized_set=None, decision_tree=None, missing_energy=0): # Filter functions to stop simulating cases which have no hope of being optimal. # If in optimization mode, optimization can break if station amount is superceded # This filter is done better by the next - # if pre_optimzed_set is not None: - # if len(electrified_station_set)>len(pre_optimzed_set): - # return pre_optimzed_set + # if pre_optimized_set is not None: + # if len(electrified_station_set)>len(pre_optimized_set): + # return pre_optimized_set # Potentials have to be at least as promising as the pre-optimized case - if pre_optimzed_set is not None: - delta = len(pre_optimzed_set) - len(electrified_station_set) + if pre_optimized_set is not None: + delta = len(pre_optimized_set) - len(electrified_station_set) pot = 0 for i in range(0, min(delta, len(station_eval))): pot += station_eval[i][1]["pot_sum"] @@ -842,7 +793,7 @@ def stations_hash(stations_set): def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): global timers ele_stations = set([*ele_station_set, station]) - s2 = time.time() + s2 = time() soc_dict = copy(soc_dict) CHARGING_CURVE_EFF = [[soc, power] for soc, power in CHARGING_CURVE] @@ -852,7 +803,7 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): for rot in rotations: soc = soc_dict[rot.vehicle_id] for i, trip in enumerate(rot.trips): - s = time.time() + s = time() if trip.arrival_name not in ele_stations: continue idx = get_index_by_time(trip.arrival_time, eval_scen) @@ -870,8 +821,8 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): soc[idx + buffer_idx:idx + buffer_idx + delta_idx] += np.linspace(0, d_soc, delta_idx) soc_max = np.max(soc) - timers[0] += time.time() - s - s = time.time() + timers[0] += time() - s + s = time() while soc_max > 1: desc = np.arange(len(soc), 0, -1) diff = np.hstack((np.diff(soc), -1)) @@ -885,9 +836,9 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): # Capping everything before local maximum soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 soc_max = np.max(soc) - timers[1] += time.time() - s + timers[1] += time() - s soc_dict[rot.vehicle_id] = soc - timers[3] += (time.time() - s2) * 100 + timers[3] += (time() - s2) * 100 return soc_dict @@ -1033,7 +984,7 @@ def get_rotation_soc(rot_id, this_sched, this_scen): def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, this_sched: schedule.Schedule, soc_upper_thresh=0.9, filter_standing_time=True, - not_possible_stations=set(), soc_lower_thresh=0): + not_possible_stations=set(), soc_lower_thresh=0, relative_soc=False): # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to @@ -1041,8 +992,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, events = [] SOC_UPPER_THRESH = soc_upper_thresh count_electrified_rot = 0 - # pos_rots=pd.DataFrame(index=range(0,1549)) - # neg_rots=pd.DataFrame(index=range(0,1549)) + for rot_id in rotations: rot = this_sched.rotations[rot_id] @@ -1053,22 +1003,18 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] min_soc, min_idx = min(comb, key=lambda x: x[0]) reduced_list = comb.copy() - start_soc = comb[0][0] + soc_lower_thresh_cur = soc_lower_thresh # if rotation gets a start soc below 1 this should change below 0 soc events since fixing # the rotation before would lead to fixing this rotation - # soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( - # soc_upper_thresh - soc_lower_thresh) - soc_lower_thresh_cur = soc_lower_thresh + + # ToDo if using relative SOC, SOC lookup has to be adjusted + if relative_soc: + start_soc = comb[0][0] + soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( + soc_upper_thresh - soc_lower_thresh) + SOC_UPPER_THRESH = soc_lower_thresh_cur+soc_upper_thresh if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 - # - # if min_soc Date: Wed, 30 Nov 2022 17:42:38 +0100 Subject: [PATCH 364/802] Make config runable and some refactoring, clean property calls of vehicle data --- data/examples/optimizer.cfg | 44 ++++- ebus_toolbox/optimizer.py | 372 ++++++++++++++++++------------------ 2 files changed, 222 insertions(+), 194 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index d23fe097..bee4476f 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -1,9 +1,12 @@ # Configs for the eBus Toolbox Optimizer -[SCENARIO] -exclusion_rots = [1,2,3] -exclusion_stations= [1,2,3] -inclusion_stations= [1,2,3] +[DEFAULT] +debug_level=0 +[SCENARIO] +# Use "" for ids and not '' +exclusion_rots = [] +exclusion_stations= [] +inclusion_stations= [] [VEHICLE] charge_eff = 0.95 @@ -11,7 +14,9 @@ battery_capacity = 400 charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] charging_power = 250 -[optimizer] +[OPTIMIZER] +# "quick" or "spiceev" +solver = quick rebase_scenario = False # "greedy" or "deep" without "" opt_type = greedy @@ -20,7 +25,30 @@ remove_impossible_rots=False node_choice=step-by-step max_brute_loop=200 -[Special] -single_rot = FALSE -rot = '6813275' +[SPECIAL] +reduce_rots = False +# Use "" for ids and not '' +rots = ["6813275","6813275"] + + +# add later as description +# :param remove_impossible_rots: repeat optimization without impossible to electrify rotations +# default=False +# :type remove_impossible_rots: bool +# +# :param rebase_scenario: should the given scenario be simulated with the given boundries before +# optimization or can schedule and scenario be used right away. rebasing can be time consuming +# but can speed up optimization afterwards and increase optimization efficiency +# default=False +# :type rebase_scenario: bool +# +# +# :param opt_type: Type of the following optimizations ["greedy"] +# :type opt_type: str +# :param exclusion_rots: Rotations to be excluded from optimization +# :type exclusion_rots: set(str) +# :param inclusion_stations: Stations which have to be electrified +# :type inclusion_stations: set(str) +# :param exclusion_stations: Stations to be excluded from optimization, eg. cant be electrified +# :type exclusion_stations: set(str) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 5a46795a..0f249e69 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -26,39 +26,45 @@ matplotlib.use("TkAgg") import numpy as np -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -formatter = logging.Formatter('%(message)s') -file_handler = logging.FileHandler('optimizer.log') - -file_handler.setLevel(logging.INFO) -file_handler.setFormatter(formatter) -stream_handler = logging.StreamHandler() -stream_handler.setFormatter(formatter) -stream_handler.setLevel(logging.DEBUG) -logger.addHandler(file_handler) -logger.addHandler(stream_handler) +global logger + + +def setup_logger(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + formatter = logging.Formatter('%(message)s') + file_handler = logging.FileHandler('optimizer.log') + + file_handler.setLevel(logging.DEBUG) + file_handler.setFormatter(formatter) + stream_handler = logging.StreamHandler() + stream_handler.setFormatter(formatter) + stream_handler.setLevel(config.debug_level) + logger.addHandler(file_handler) + logger.addHandler(stream_handler) + return logger + with open("args_bvg_full_no_ele.pickle", "rb") as f: args = pickle.load(f) with open("scen_bvg_test.pickle", "rb") as f: scen = pickle.load(f) with open("sched_bvg_test.pickle", "rb") as f: sched = pickle.load(f) -ROT = '6813275' -# set battery and charging power - -BATTERY_CAPACITY = 400 -CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +# # set battery and charging power +# BATTERY_CAPACITY = 400 +# CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # CHARGING_CURVE = [[0, 450], [0.99, 20],[1,20]] -for name, type in sched.vehicle_types.items(): - for charge_type, vehicle in type.items(): - vehicle["capacity"] = BATTERY_CAPACITY - vehicle["charging_curve"] = CHARGING_CURVE +# for name, type in sched.vehicle_types.items(): +# for charge_type, vehicle in type.items(): +# vehicle["capacity"] = BATTERY_CAPACITY +# vehicle["charging_curve"] = CHARGING_CURVE -CHARGE_EFF = 0.95 -CHARGING_POWER = 250 +# CHARGE_EFF = 0.95 +# CHARGING_POWER = 250 +config = None +ROT = None timers = [0] * 10 args.min_charging_time = 0 args.default_buffer_time_opps = {"else": 0} @@ -68,25 +74,11 @@ del args.save_results -def run_optimization(this_sched, this_scen, args, - opt_type="greedy", exclusion_rots=set(), inclusion_stations=set(), - exclusion_stations=set(), remove_impossible_rots=False, rebase_scenario=False, - node_choice="step-by-step", - **kwargs): - """ - Optimizes scenario by adding electrified stations sparingly +def main(): + # run_optimization(sched, scen, args, config_path) + """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. - :param remove_impossible_rots: repeat optimization without impossible to electrify rotations - default=False - :type remove_impossible_rots: bool - - :param rebase_scenario: should the given scenario be simulated with the given boundries before - optimization or can schedule and scenario be used right away. rebasing can be time consuming - but can speed up optimization afterwards and increase optimization efficiency - default=False - :type rebase_scenario: bool - :param this_sched: Simulation schedule containing buses, rotations etc. :type this_sched: ebus_toolbox.Schedule @@ -95,34 +87,57 @@ def run_optimization(this_sched, this_scen, args, :type this_scen: spice_ev.Scenario :param args: Simulation arguments for manipulation or generated outputs :type args: object - :param opt_type: Type of the following optimizations ["greedy"] - :type opt_type: str - :param exclusion_rots: Rotations to be excluded from optimization - :type exclusion_rots: set(str) - :param inclusion_stations: Stations which have to be electrified - :type inclusion_stations: set(str) - :param exclusion_stations: Stations to be excluded from optimization, eg. cant be electrified - :type exclusion_stations: set(str) :return: (Schedule,Scenario) optimizied schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ + global logger + global config + + config = read_config("data\examples\optimizer.cfg") + logger = setup_logger() + + # which rotations should be excluded? + exclusion_rots = config.exclusion_rots + + # which stations has to be electrified + inclusion_stations = config.inclusion_stations + + # which station can not be electrified + exclusion_stations = config.exclusion_stations + global ROT + + ROT = config.rots[0] + if config.reduce_rots: + sched.rotations = {rot: sched.rotations[rot] for rot in config.rots} + + opt_type = config.opt_type + solver = config.solver + remove_impossible_rots = config.remove_impossible_rots + rebase_scenario = config.rebase_scenario + node_choice = config.node_choice + + t = time() + this_sched = sched + this_scen = scen + + for name, type in sched.vehicle_types.items(): + for charge_type, vehicle in type.items(): + vehicle["capacity"] = config.battery_capacity + vehicle["charging_curve"] = config.charging_curve + now = datetime.now() new_ele_stations_path = "data/examples/optimized_stations_" + \ now.strftime("%Y_%m_%d_%H_%M") + ".json" - not_possible_stations = inclusion_stations.union(exclusion_stations) - s = time() - # Calculate base scenario - # this_sched.rotations = {id: rot for id, rot in this_sched.rotations.items() if id in rots} + if rebase_scenario: logger.debug(f"Spice EV Rebasing Scenario") new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( this_sched, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=False) - logger.debug(f"Rebasing took {time() - s} sec") else: with open(args.electrified_stations, "r") as f: @@ -137,21 +152,31 @@ def run_optimization(this_sched, this_scen, args, s = time() i = 0 global timer_for_calc + + soc_charge_curve_dict = dict() + for v_type_name in sched.vehicle_types: + soc_charge_curve_dict[v_type_name] = dict() + for name, v_type in sched.vehicle_types.items(): + for ch_type, data in v_type.items(): + soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time(data["charging_curve"], data["capacity"], + sched.cs_power_opps, efficiency=config.charge_eff, + timestep=0.1) + while True and i < 2: if opt_type == "greedy" or opt_type == "deep": logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, - solver=kwargs.get("solver", "quick"), opt_type=opt_type, - node_choice=node_choice) + solver=solver, opt_type=opt_type, + node_choice=node_choice, soc_charge_curve_dict=soc_charge_curve_dict) i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: break else: logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") - logger.debug(f"Spice ev took {timer_for_calc} s") + logger.debug(f"Solver: {solver} took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") logger.debug(ele_station_set) logger.warning(f"These rotations could not be electrified" @@ -165,14 +190,14 @@ def run_optimization(this_sched, this_scen, args, exclusion_rots=exclusion_rots, run_only_neg=False) logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") - logger.debug(f"Spice ev took {timer_for_calc} s") + logger.debug(f"Solver: {solver} took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") logger.debug(ele_station_set) logger.debug(could_not_be_electrified) plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, - new_scen, ele_station_set) + new_scen, ele_station_set, soc_charge_curve_dict=soc_charge_curve_dict) plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) q = get_rotation_soc(ROT, new_sched, new_scen)[0] global timers @@ -189,44 +214,16 @@ def run_optimization(this_sched, this_scen, args, ax.plot(q) logger.debug(f"Still negative rotations:{new_sched.get_negative_rotations(new_scen)}") print("Finished") - return new_sched, new_scen - - -def main(): - # which rotations should be excluded? - # Teilmenge der 197 die nicht möglich ist, muss ignoriert werden - exclusion_rots = {'6891222', '6891224', '6891226', '6891228', '7194397', - # Linie 901 wird auch ignoriert - '6675617', '6675640', '6675626', - '6675645', '6675631', '6675648', - '6675636', '6675653', '6675661', '6675657' - } - - # Ignoieren von umöglichen Umläufen, die existieren ohne Ausschluss von Stationen - impossible_rots = {'6895194', '6895199', '6895223', '6895226', '6923844', '7049422', '7049423'} - - exclusion_rots.update(impossible_rots) - exclusion_rots = set() - exclusion_rots = {'6891228', '7194397', '6891226', '6891222', '7049423', '7049422', '6891224'} - # which stations have to be electrified? - inclusion_stations = set() # {'SWEL01B'} #{'SMZ07B', 'SWEL01B', 'URUD08B'} - - sched.rotations={ROT:sched.rotations[ROT]} - - exclusion_stations = set() - t = time() - run_optimization(sched, scen, args, opt_type="greedy", exclusion_rots=exclusion_rots, - inclusion_stations=inclusion_stations, exclusion_stations=exclusion_stations, - remove_impossible_rots=False, rebase_scenario=False, solver="quick", - node_choice="brute") print(f"Opt took {time() - t}") + return new_sched, new_scen + timer_for_calc = 0 def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, + not_possible_stations,soc_charge_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, decision_tree=dict(), pre_optimized_set=None, opt_type="greedy", **kwargs): # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() @@ -290,7 +287,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, - choose_station_step_by_step, + choose_station_step_by_step, soc_charge_curve_dict, pre_optimized_set=pre_optimized_set, decision_tree=decision_tree, base_group=events, **kwargs) @@ -304,7 +301,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n print(electrified_station_set) print( f"There are {len(list(combination_generator(stations, len(electrified_station_set))))} combination") - while i < 200 and cont_loop: + while i < config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: print(time() - t) @@ -321,14 +318,15 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n electrified_stations, new_electrified_set, could_not_be_electrified_copy , not_possible_stations, - choice_func, + choice_func,soc_charge_curve_dict, pre_optimized_set=pre_optimized_set, decision_tree=decision_tree, base_group=events) # if a new set was found, print it and save it in sols if new_electrified_set != pre_optimized_set and new_stations is not None: - print("Optimized with", len(new_electrified_set), " stations", str(["#"]*20), + print("Optimized with", len(new_electrified_set), " stations", + str(["#"] * 20), stations_hash(new_electrified_set)) sols.append(new_electrified_set) else: @@ -339,7 +337,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # use spiceev group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations, + could_not_be_electrified, not_possible_stations,soc_charge_curve_dict, pre_optimized_set=None, decision_tree=decision_tree, brute=False, **kwargs) @@ -354,16 +352,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets -def outer_group_optimzation(pack, not_possible_stations): - group, base_scen, base_sched, old_stations, \ - old_electrified_station_set, could_not_be_electrified, pre_optimized_set = pack - electrified_stations = old_stations.copy() - electrified_station_set = old_electrified_station_set.copy() - ele_set = group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, - not_possible_stations, pre_optimized_set=pre_optimized_set) - return electrified_station_set.copy() + def get_groups_from_events(events, not_possible_stations=set(), could_not_be_electrified=set()): @@ -401,7 +390,7 @@ def get_groups_from_events(events, not_possible_stations=set(), could_not_be_ele def group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, choose_station_function, + not_possible_stations, choose_station_function, soc_curve_dict, pre_optimized_set=None, decision_tree=None, **kwargs): event_group, possible_stations = group @@ -415,17 +404,19 @@ def group_optimization_quick(group, base_scen, base_sched, new_sched = copy(base_sched) rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} - missing_energy = get_missing_energy(event_group, BATTERY_CAPACITY) + missing_energy = get_missing_energy(event_group) if missing_energy >= 0: logger.debug("Already electrified: Returning set") return electrified_stations, True - station_eval = evaluate(event_group, new_scen) - for id in station_eval: - logger.debug("%s , %s", id[0], id[1]["pot_sum"]) + station_eval = evaluate(event_group, new_scen,soc_curve_dict) + + logger.debug("Missing energy: %s", missing_energy) + if logger.getEffectiveLevel() > logging.DEBUG: + for stat_id in station_eval: + logger.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) - logger.debug(missing_energy) best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, pre_optimized_set, decision_tree, missing_energy=missing_energy) @@ -449,10 +440,8 @@ def group_optimization_quick(group, base_scen, base_sched, return None, False # Electrify station - for id in best_station_ids: - electrify_station(id, electrified_stations, electrified_station_set) - - # pre_opt_sched.rotations = rotation_dict + for stat_id in best_station_ids: + electrify_station(stat_id, electrified_stations, electrified_station_set) s = time() @@ -465,7 +454,7 @@ def group_optimization_quick(group, base_scen, base_sched, new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, - new_scen, electrified_station_set) + new_scen, electrified_station_set,soc_curve_dict) lifted_socs = deepcopy(new_scen.vehicle_socs) global timer_for_calc @@ -481,7 +470,7 @@ def group_optimization_quick(group, base_scen, base_sched, not_possible_stations=not_possible_stations, soc_lower_thresh=0, relative_soc=True) - delta_energy = get_missing_energy(new_events, BATTERY_CAPACITY) + delta_energy = get_missing_energy(new_events) event_rotations = {event["rotation"].id for event in base_group} base_events = get_below_zero_soc_events(new_scen, event_rotations, @@ -490,10 +479,12 @@ def group_optimization_quick(group, base_scen, base_sched, filter_standing_time=True, not_possible_stations=set(), soc_lower_thresh=0, relative_soc=True) + logger.debug("Last electrification electrified %s/%s" + " and a %s/%s in the base group.", + len(event_group)-len(new_events), len(event_group), len(base_group)-len(base_events), len(base_group)) - delta_base_energy = get_missing_energy(base_events, BATTERY_CAPACITY) + delta_base_energy = get_missing_energy(base_events) - logger.debug(delta_energy) if decision_tree is not None: node_name = stations_hash(electrified_station_set) try: @@ -522,6 +513,7 @@ def group_optimization_quick(group, base_scen, base_sched, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_function, + soc_curve_dict, pre_optimized_set, decision_tree, lifted_socs=lifted_socs, base_group=base_group) electrified_stations.update(new_stations) @@ -529,16 +521,17 @@ def group_optimization_quick(group, base_scen, base_sched, return electrified_stations, True -def get_missing_energy(events, cap): - missing_soc = 0 +def get_missing_energy(events): + missing_energy = 0 for e in events: - missing_soc += e["min_soc"] - return missing_soc * cap + missing_energy += e["min_soc"] * e["capacity"] + return missing_energy def group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, pre_optimized_set=None, decision_tree=None, + not_possible_stations, soc_curve_dict, pre_optimized_set=None, + decision_tree=None, brute=False, **kwargs): event_group, _ = group @@ -546,19 +539,17 @@ def group_optimization(group, base_scen, base_sched, pre_opt_scen = copy(base_scen) pre_opt_scen.vehicle_socs = copy(base_scen.vehicle_socs) pre_opt_sched = copy(base_sched) - missing_soc = 0 rotation_dict = dict() for e in event_group: rotation_dict[e["rotation"].id] = e["rotation"] - missing_soc += e["min_soc"] - if missing_soc >= 0: + missing_energy = get_missing_energy(event_group) + + if missing_energy >= 0: logger.debug("Already electrified: Returning set") return electrified_stations - missing_energy = missing_soc * BATTERY_CAPACITY - - station_eval = evaluate(event_group, pre_opt_scen) + station_eval = evaluate(event_group, pre_opt_scen,soc_curve_dict) for id in station_eval: logger.debug("%s, %s", id[0], id[1]["pot_sum"]) logger.debug(missing_energy) @@ -568,12 +559,12 @@ def group_optimization(group, base_scen, base_sched, # missing_energy=missing_energy) if brute: best_station_ids, _ = choose_station_brute(station_eval, electrified_station_set, - pre_optimized_set, decision_tree, - missing_energy=missing_energy) + pre_optimized_set, decision_tree, + missing_energy=missing_energy) else: best_station_ids, _ = choose_station_step_by_step(station_eval, electrified_station_set, - pre_optimized_set, decision_tree, - missing_energy=missing_energy) + pre_optimized_set, decision_tree, + missing_energy=missing_energy) logger.debug(best_station_ids) if best_station_ids is None: @@ -612,10 +603,8 @@ def group_optimization(group, base_scen, base_sched, filter_standing_time=True, not_possible_stations=not_possible_stations, soc_lower_thresh=0, relative_soc=True) - missing_soc = 0 - for e in new_events: - missing_soc += e["min_soc"] - delta_energy = missing_soc * BATTERY_CAPACITY + + delta_energy = get_missing_energy(new_events) if decision_tree is not None: node_name = str(sorted(list(electrified_station_set))) @@ -643,7 +632,7 @@ def group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, + not_possible_stations, soc_curve_dict, pre_optimized_set, decision_tree) electrified_stations.update(new_stations) @@ -717,7 +706,6 @@ def join_all_subsets(subsets): return subsets - # ToDo Further implement def choose_station_brute(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): @@ -730,11 +718,12 @@ def choose_station_brute(station_eval, electrified_station_set, # Only check the brute force station if they have the remote chance of fullfilling # the missing energy # Potential>missing energy * 80% - potential=sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) - if potential>-missing_energy*0.8: + potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) + if potential > -missing_energy * 0.8: return comb, False else: - print(f"skipped {comb} since potential is too low {round(potential/-missing_energy*100,0)}%") + print( + f"skipped {comb} since potential is too low {round(potential / -missing_energy * 100, 0)}%") else: print("calculated all viable possibilities") return None, False @@ -790,17 +779,17 @@ def stations_hash(stations_set): return str(sorted(list(stations_set))) -def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): +def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, + soc_charge_curve_dict): global timers ele_stations = set([*ele_station_set, station]) s2 = time() soc_dict = copy(soc_dict) - CHARGING_CURVE_EFF = [[soc, power] for soc, power in CHARGING_CURVE] - soc_over_time_curve = charging_curve_to_soc_over_time(CHARGING_CURVE_EFF, BATTERY_CAPACITY, - CHARGING_POWER, efficiency=CHARGE_EFF, - timestep=0.1) for rot in rotations: + ch_type = (rot.vehicle_id.find("oppb") > 0) * "oppb" + (rot.vehicle_id.find("depb") > 0) * "depb" + v_type = rot.vehicle_id.split("_" + ch_type)[0] + soc_over_time_curve = soc_charge_curve_dict[v_type][ch_type] soc = soc_dict[rot.vehicle_id] for i, trip in enumerate(rot.trips): s = time() @@ -842,15 +831,14 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set): return soc_dict -def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, +def evaluate(events, eval_scen,soc_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, electrified_station_set=set(), decision_tree=None): # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by # loading power, standing time at a station, soc at station, minimal soc of the event station_eval = dict() - soc_over_time_curve = charging_curve_to_soc_over_time(CHARGING_CURVE, BATTERY_CAPACITY, - CHARGING_POWER) for e in events: + soc_over_time_curve = soc_curve_dict[e["v_type"]][e["ch_type"]] for i, trip in enumerate(e["trip"]): # Station is only evaluated if station name is part of event stations # Only these stations showed potential in electrification, e.g enough standing time @@ -872,16 +860,13 @@ def evaluate(events, eval_scen, soc_upper_thresh=1, soc_lower_thresh=0, except IndexError: standing_time_min = 0 - # ToDo get Vehicle Battery Capacity and charging power - capacity = BATTERY_CAPACITY - # energy_charging_potential = standing_time_min *60 * ch_power energy_charging_potential = get_delta_soc(soc_over_time_curve, soc, standing_time_min) \ - * capacity + * e["capacity"] # Potential is at max the minimum between the useful delta soc * capacity or the # energy provided by charging for the full standing time - delta_E_pot = min(delta_soc_pot * capacity, energy_charging_potential) + delta_E_pot = min(delta_soc_pot * e["capacity"], energy_charging_potential) d = dict(E_pot=delta_E_pot, standing_time=timedelta(minutes=standing_time_min)) try: @@ -993,7 +978,6 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, SOC_UPPER_THRESH = soc_upper_thresh count_electrified_rot = 0 - for rot_id in rotations: rot = this_sched.rotations[rot_id] soc, rot_start_idx, rot_end_idx = get_rotation_soc(rot_id, this_sched, this_scen) @@ -1012,7 +996,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, start_soc = comb[0][0] soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( soc_upper_thresh - soc_lower_thresh) - SOC_UPPER_THRESH = soc_lower_thresh_cur+soc_upper_thresh + SOC_UPPER_THRESH = soc_lower_thresh_cur + soc_upper_thresh if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 while min_soc < soc_lower_thresh_cur: @@ -1048,10 +1032,16 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, pass possible_stations = possible_stations.difference(not_possible_stations) + cht = rot.vehicle_id.find("depb") + ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" + type = rot.vehicle_id.split("_" + ch_type)[0] event = dict(start_idx=start, end_idx=min_idx, min_soc=min_soc, stations=possible_stations, vehicle_id=rot.vehicle_id, trip=trips, - rotation=rot, stations_list=possible_stations_list) + rotation=rot, stations_list=possible_stations_list, + capacity=sched.vehicle_types[type][ch_type]['capacity'], + v_type=type, ch_type=ch_type) + events.append(event) copy_list = reduced_list.copy() reduced_list = reduced_list[:start_comb] @@ -1065,7 +1055,6 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) else: break - logger.debug("Last electrification electrified %s rotations", count_electrified_rot) return events @@ -1181,7 +1170,7 @@ def get_buffer_time(trip, args): def read_config(config_path): import configparser import json - config_path=("data\examples\optimizer.cfg") + config_path = config_path config_parser = configparser.ConfigParser() config_parser.sections() config_parser.read(config_path) @@ -1190,33 +1179,44 @@ class Config(): def __init__(self): pass - config=Config() - scenario=config_parser["SCENARIO"] - config.exclusion_rots=set(json.loads(scenario.get("exclusion_rots" , "[]"))) - config.exclusion_stations=set(json.loads(scenario.get("exclusion_stations" , "[]"))) - config.inclusion_stations=set(json.loads(scenario.get("inclusion_stations" , "[]"))) - - vehicle=config_parser["VEHICLE"] - config.charge_eff=float(vehicle.get("charge_eff", 0.95)) - config.battery_capacity=float(vehicle.get("battery_capacity", 0)) - config.charging_curve=json.loads(vehicle.get("charging_curve" , "[]")) - config.charging_power=float(vehicle.get("charging_power", 0.95)) - - optimizer=config_parser["optimizer"] - config.rebase_scenario =optimizer.getboolean("REBASE_SCENARIO", True) - config.opt_type =optimizer.get("opt_type", "greedy") - config.remove_impossible_rots =optimizer.getboolean("remove_impossible_rots", False) - config.node_choice =optimizer.get("node_choice", "step") - config.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) - - config.single_rot = optimizer.getboolean("single_rot", False) - config.rot = optimizer.get("rot") - return config - - -read_config("data\examples\optimizer.cfg") - + conf = Config() + default = config_parser["DEFAULT"] + conf.debug_level = int(default.get("debug_level", 0)) + scenario = config_parser["SCENARIO"] + conf.exclusion_rots = set(json.loads(scenario.get("exclusion_rots", "[]"))) + conf.exclusion_stations = set(json.loads(scenario.get("exclusion_stations", "[]"))) + conf.inclusion_stations = set(json.loads(scenario.get("inclusion_stations", "[]"))) + + vehicle = config_parser["VEHICLE"] + conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) + conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) + conf.charging_curve = json.loads(vehicle.get("charging_curve", [])) + conf.charging_power = float(vehicle.get("charging_power", 0.95)) + + optimizer = config_parser["OPTIMIZER"] + conf.solver = optimizer.get("solver", "spiceev") + conf.rebase_scenario = optimizer.getboolean("REBASE_SCENARIO", True) + conf.opt_type = optimizer.get("opt_type", "greedy") + conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) + conf.node_choice = optimizer.get("node_choice", "step") + conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) + + special = config_parser["SPECIAL"] + conf.reduce_rots = special.getboolean("reduce_rots", False) + conf.rots = json.loads(special.get("rots", [])) + + return conf +def outer_group_optimzation(pack, not_possible_stations): + group, base_scen, base_sched, old_stations, \ + old_electrified_station_set, could_not_be_electrified, pre_optimized_set = pack + electrified_stations = old_stations.copy() + electrified_station_set = old_electrified_station_set.copy() + ele_set = group_optimization(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, + not_possible_stations, pre_optimized_set=pre_optimized_set) + return electrified_station_set.copy() if __name__ == "__main__": freeze_support() From fdf0082b72a7cfa98aa22b067d21fd241f68e573 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 1 Dec 2022 10:33:31 +0100 Subject: [PATCH 365/802] Change debugger and add exit conditions to loops --- data/examples/optimizer.cfg | 6 +++--- ebus_toolbox/optimizer.py | 38 +++++++++++++++---------------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index bee4476f..05b70ff3 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -1,6 +1,6 @@ # Configs for the eBus Toolbox Optimizer [DEFAULT] -debug_level=0 +debug_level=11 [SCENARIO] # Use "" for ids and not '' @@ -19,11 +19,11 @@ charging_power = 250 solver = quick rebase_scenario = False # "greedy" or "deep" without "" -opt_type = greedy +opt_type = deep remove_impossible_rots=False # "step-by-step" or "brute" without "" node_choice=step-by-step -max_brute_loop=200 +max_brute_loop=20 [SPECIAL] reduce_rots = False diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 0f249e69..0da1571e 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -32,11 +32,14 @@ def setup_logger(): logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) - formatter = logging.Formatter('%(message)s') - file_handler = logging.FileHandler('optimizer.log') - file_handler.setLevel(logging.DEBUG) + + file_handler = logging.FileHandler('optimizer.log') + file_handler.setLevel(0) + formatter = logging.Formatter('%(asctime)s:%(message)s') file_handler.setFormatter(formatter) + + formatter = logging.Formatter('%(message)s') stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) stream_handler.setLevel(config.debug_level) @@ -50,19 +53,6 @@ def setup_logger(): with open("scen_bvg_test.pickle", "rb") as f: scen = pickle.load(f) with open("sched_bvg_test.pickle", "rb") as f: sched = pickle.load(f) -# # set battery and charging power -# BATTERY_CAPACITY = 400 -# CHARGING_CURVE = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] - -# CHARGING_CURVE = [[0, 450], [0.99, 20],[1,20]] -# for name, type in sched.vehicle_types.items(): -# for charge_type, vehicle in type.items(): -# vehicle["capacity"] = BATTERY_CAPACITY -# vehicle["charging_curve"] = CHARGING_CURVE - -# CHARGE_EFF = 0.95 -# CHARGING_POWER = 250 - config = None ROT = None timers = [0] * 10 @@ -300,7 +290,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n print("Greedy Result ++++++++") print(electrified_station_set) print( - f"There are {len(list(combination_generator(stations, len(electrified_station_set))))} combination") + f"There are {len(list(combination_generator(stations, len(electrified_station_set))))} combinations") while i < config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: @@ -332,7 +322,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n else: print(f"{new_electrified_set} is not viable") - + print(sols) else: # use spiceev group_optimization(group, base_scen, base_sched, @@ -516,7 +506,10 @@ def group_optimization_quick(group, base_scen, base_sched, soc_curve_dict, pre_optimized_set, decision_tree, lifted_socs=lifted_socs, base_group=base_group) - electrified_stations.update(new_stations) + if new_stations is not None: + electrified_stations.update(new_stations) + else: + return None, True return electrified_stations, True @@ -722,8 +715,7 @@ def choose_station_brute(station_eval, electrified_station_set, if potential > -missing_energy * 0.8: return comb, False else: - print( - f"skipped {comb} since potential is too low {round(potential / -missing_energy * 100, 0)}%") + logger.debug("skipped %s since potential is too low %s %%", comb,round(potential /-missing_energy * 100, 0)) else: print("calculated all viable possibilities") return None, False @@ -771,8 +763,8 @@ def choose_station_step_by_step(station_eval, electrified_station_set, check_stations = electrified_station_set.union([station[0]]) if decision_tree[stations_hash(check_stations)]["visit_counter"] == min_count_visited: best_station_id = station[0] - return [best_station_id] - return None + return [best_station_id], True + return None, True def stations_hash(stations_set): From fe8478078cd25472118a3657c6416c52d989c3a4 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer <49757031+jakobgemassmer@users.noreply.github.com> Date: Thu, 1 Dec 2022 15:21:39 +0100 Subject: [PATCH 366/802] Update simulate.py filter neg_rot by checking if oppb-version of vehicle_type exists --- ebus_toolbox/simulate.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index c5f07e16..c3225a5d 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -72,8 +72,9 @@ def simulate(args): if args.mode == "neg_depb_to_oppb": # simple optimization: change charging type from depot to opportunity, simulate again neg_rot = schedule.get_negative_rotations(scenario) - # only depot rotations relevant - neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == "depb"] + # only depot rotations relevant and check if oppb-version of vehicle_type exists + neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == "depb" + if "oppb" in vehicle_types[schedule.rotations[r].vehicle_type]] if neg_rot: print("Changing charging type from depb to oppb for rotations " + ', '.join(neg_rot)) schedule.set_charging_type("oppb", neg_rot) From cc3a3d098fb008f433b1550e7ed1325f6e26d30a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 1 Dec 2022 17:00:23 +0100 Subject: [PATCH 367/802] Minor stuff --- data/examples/optimizer.cfg | 9 +-- ebus_toolbox/optimizer.py | 138 ++++++++++++++++++++++++------------ 2 files changed, 97 insertions(+), 50 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 05b70ff3..e8e64e09 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -1,12 +1,12 @@ # Configs for the eBus Toolbox Optimizer [DEFAULT] debug_level=11 - +['1000097', '6899905', '7074180', '1000372', '6782063', '1000394', '6943812', '7049423', '6943605', '6662367', '7143882', '1000371', '1000288', '6943610', '6680572', '1000287', '1000000', '6680062', '1000186', '1000049', '1000415', '6943824', '6943595', '1000145', '6794347', '6794309', '6794346', '6662417', '7049424', '6680053', '1000381', '7077964', '1000404', '6970253', '1000144', '6703041', '1000202', '6899902', '6719042', '1000098', '6794345', '6652322', '6794349', '1000392', '1000382', '1000201', '6975640', '1000161', '6662973', '6794338', '1000204', '7131593', '6975649', '6681020', '6943593', '6943803', '7049425', '6943609', '1000121', '1000378', '6891229', '6975647', '7042548', '6943604', '1000003', '6984405', '6703043', '6966238', '1000019', '6899866', '7025511', '6975642', '6899871', '6899903', '6652345', '1000380', '6899898', '1000416', '1000119', '6808656', '6931154', '1000578', '7106528', '6899900', '6984397', '6975643', '6634342', '1000006', '6794341', '1000137', '6782064', '6681761', '6782062', '6680585', '1000276', '1000373', '6975645', '6899896', '7195344', '1000185', '1000005', '7077969', '1000020', '6680057', '6662998', '6975641', '1000081', '1000135', '1000171', '1000270', '6943826', '1000022', '1000203', '7049421', '1000278', '6634302', '6782065', '6984399', '6984403', '1000051', '7143880', '1000148', '1000212', '1000001', '6985441', '6899904', '6975638', '6975644', '6984401'] [SCENARIO] # Use "" for ids and not '' -exclusion_rots = [] +exclusion_rots = ["6650837", "1000579", "7042547", "6940321", "6975646", "6637000", "7042546", "7007025", "6986504", "6940341", "7194150", "6680580", "6891224", "6923844", "6680514", "6986519", "6985436", "1000269", "6985446", "1000184", "6975639", "6680530", "6986499", "7194046", "6985589", "6985431", "6938337", "6938332", "6986494", "6891223", "7042545", "6895223", "6891228", "6680523", "7049422", "6891226", "1000106", "6891222", "6986524", "6986509", "7194145", "6975648", "7007023", "6653824", "6975637", "6895194", "6895226", "6997330", "6986514", "7007024", "6680501", "7007022", "6650848", "7194155"] exclusion_stations= [] -inclusion_stations= [] +inclusion_stations= ["SIRI01B", "KLNG01B", "SUJH01B", "FLKP01B", "SERZ01B", "UKRL03B", "SDKI03B", "SUSP01B", "UBRS01B", "BER102B", "BUSS01B", "GALS01B", "ALTG02B", "MGGW02B", "SGD02B", "LINH02B", "SURZ23B", "DAHV03B", "BFAE01B", "NOSS01B", "ZIRI03BS", "MAWI01B", "KDSG01B", "ZFHF01B", "SWEL01B", "UEWP02B", "MKZE02B", "UTM07B", "REIM01B", "MEBR01B", "UMOH01B", "UKSP02B", "LUTH01B", "UOSL04B", "FKB03BS", "SLIS02B", "VOUL01B", "MAST04B", "SHDF03B", "SLR07BA", "WFDA01B", "STAS01B", "UHP04BN", "SELS01B", "WERS01B", "SNP01B", "STUT04B", "UMM01B", "BER105B", "ANDZ01B", "UHPU02B", "SUTF01B", "MHDO02B", "SHEN01B", "HAWR01B", "NRPP01B", "SMF03B", "HBF11B", "NAHM04B", "SULB01B", "HOTT01B", "UEWP05B", "UVIN14B", "TITI01B", "AUBT01B", "UDD04B", "MABA02B", "ULEO01B", "SGD01B", "SFOH01B", "NAHM05B", "TEWA03B", "GUTS01B", "UAMD01B", "WOSM01B", "UEWP04B", "HNBG01B", "ALTL01B", "SKD05B", "SUHM04B", "ADMH01B", "KDFS01B", "UTRE01B", "SURZ04B", "PRPL11B", "SBU02B", "AHGR01B", "HENH01B", "JOST01B", "GOST01B", "UFI02B", "PIET06BA", "SIW501B", "SNIK01B", "KOET01B", "ALHS01B", "HBF01B", "SABS01B", "RSNE01B", "SMDF12B", "SMZ07B", "UHPK01B", "SKA01B", "ZOOH01B", "MKZE03B", "SAF01B", "AUBT04B", "AHGR02B", "BER508B", "SSWS17BA", "KHDW01B", "RIGT06BS", "UHAS05B", "USTM09B", "AMOM04B", "TSTR01B", "SUHM09B", "SMNO01B", "UPBA03B", "SULB10B", "MAST06B", "PSDG11BA", "URUD17B", "UMED03B", "SLIS01B", "UAMD06B", "SBAW04B", "UHAS03B", "URUH07B", "FKB01B", "WIDA01B", "ALKL02B", "HBPL01B", "PPAS02B", "OTFR01B", "UFWP01B", "SLBN01B", "UJTC04B", "TORT01B", "INVA01B", "BRIX01B", "SLR09BA", "APPZ03B", "SEYD02B", "URUD04B", "MGGW01B", "SUSP04B", "CMPB01B", "SOSB04B", "ZITT02B", "HAST01B", "SLIS06B", "ISSZ01B", "NEHM03B", "NHRY01B", "HADL01B", "STBH01B", "UBER01B", "TERB04B", "SZEP01B", "GEZE01B", "APPZ07B", "UOHH09B", "FDDM01B", "WKHS03B", "HOTT02B", "SWS03B", "EIPU01B", "SGA02B", "GUTS04B", "SSWS16BA", "SOSB01B", "BER506B", "BFI10BS", "RCHT01B", "UAMD02B", "UKDN06B", "KLCL02B", "ODNH01B", "WKHS02B", "MADF02B", "UWSC01B", "DILL01B", "AMRH04BA", "FOHA01B", "WWSP01B", "FEZ07BS", "SGA08B", "UHP06B", "UWSP03B", "KRNB01B", "QUIB01B", "WIDA02B", "SWS01B", "PCJS02B", "BER505B"] [VEHICLE] charge_eff = 0.95 @@ -19,7 +19,8 @@ charging_power = 250 solver = quick rebase_scenario = False # "greedy" or "deep" without "" -opt_type = deep +opt_type = greedy +run_only_neg=True remove_impossible_rots=False # "step-by-step" or "brute" without "" node_choice=step-by-step diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 0da1571e..a176c8bc 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -36,7 +36,8 @@ def setup_logger(): file_handler = logging.FileHandler('optimizer.log') file_handler.setLevel(0) - formatter = logging.Formatter('%(asctime)s:%(message)s') + formatter = logging.Formatter('%(asctime)s:%(message)s', + "%m%d %H%M%S") file_handler.setFormatter(formatter) formatter = logging.Formatter('%(message)s') @@ -48,20 +49,21 @@ def setup_logger(): return logger -with open("args_bvg_full_no_ele.pickle", "rb") as f: args = pickle.load(f) +with open("args_rebased.pickle", "rb") as f: args = pickle.load(f) -with open("scen_bvg_test.pickle", "rb") as f: scen = pickle.load(f) -with open("sched_bvg_test.pickle", "rb") as f: sched = pickle.load(f) +with open("scenario_rebased.pickle", "rb") as f: scen = pickle.load(f) +with open("schedule_rebased.pickle", "rb") as f: sched = pickle.load(f) +args.desired_soc_opps=1.0 config = None ROT = None timers = [0] * 10 -args.min_charging_time = 0 -args.default_buffer_time_opps = {"else": 0} +# args.min_charging_time = 0 +# args.default_buffer_time_opps = 0 -del args.save_soc -del args.save_timeseries -del args.save_results +# del args.save_soc +# del args.save_timeseries +# del args.save_results def main(): @@ -127,8 +129,14 @@ def main(): new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( this_sched, args, inclusion_stations, - exclusion_rots=exclusion_rots, run_only_neg=False) + exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing took {time() - s} sec") + with open("schedule_rebased.pickle", "wb") as f: + pickle.dump(new_sched, f) + with open("scenario_rebased.pickle", "wb") as f: + pickle.dump(new_scen, f) + with open("args__rebased", "wb") as f: + pickle.dump(args, f) else: with open(args.electrified_stations, "r") as f: ele_stations = json.load(f) @@ -138,6 +146,8 @@ def main(): electrify_station(stat, ele_stations, ele_station_set) new_scen = this_scen new_sched = this_sched + rots = {r: new_sched.rotations[r] for r in new_sched.rotations if r not in exclusion_rots} + this_sched.rotations = rots s = time() i = 0 @@ -152,6 +162,8 @@ def main(): sched.cs_power_opps, efficiency=config.charge_eff, timestep=0.1) + + while True and i < 2: if opt_type == "greedy" or opt_type == "deep": logger.debug("Starting greedy optimization") @@ -184,12 +196,20 @@ def main(): logger.debug(f"Electrified Stations: {len(ele_station_set)}") logger.debug(ele_station_set) logger.debug(could_not_be_electrified) - plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) + # plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, ele_station_set, soc_charge_curve_dict=soc_charge_curve_dict) - plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) - q = get_rotation_soc(ROT, new_sched, new_scen)[0] + new_events=get_below_zero_soc_events(new_scen,new_sched.rotations, new_sched) + # plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) + # q = get_rotation_soc(ROT, new_sched, new_scen)[0] + + logger.debug("Still not electrified with fast calc") + for event in new_events: + logger.debug(event["rotation"].id) + logger.debug("###") + + global timers logger.debug(timers) with open(new_ele_stations_path, "w") as f: @@ -200,8 +220,8 @@ def main(): this_sched, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set) - ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) - ax.plot(q) + # ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) + # ax.plot(q) logger.debug(f"Still negative rotations:{new_sched.get_negative_rotations(new_scen)}") print("Finished") print(f"Opt took {time() - t}") @@ -254,6 +274,30 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # Baseline greedy Optimization list_greedy_sets = [set()] * len(groups) + new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), + new_scen.vehicle_socs, + new_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict) + new_events=get_below_zero_soc_events(new_scen,new_sched.rotations, new_sched) + + ################ + # rot='1000097' + # + # + # rots = ['1000097','6899905', '7074180', '1000372', '6782063', '1000394', '6943812', '7049423', '6943605', '6662367', '7143882', '1000371', '1000288', '6943610', '6680572', '1000287', '1000000', '6680062', '1000186', '1000049', '1000415', '6943824', '6943595', '1000145', '6794347', '6794309', '6794346', '6662417', '7049424', '6680053', '1000381', '7077964', '1000404', '6970253', '1000144', '6703041', '1000202', '6899902', '6719042', '1000098', '6794345', '6652322', '6794349', '1000392', '1000382', '1000201', '6975640', '1000161', '6662973', '6794338', '1000204', '7131593', '6975649', '6681020', '6943593', '6943803', '7049425', '6943609', '1000121', '1000378', '6891229', '6975647', '7042548', '6943604', '1000003', '6984405', '6703043', '6966238', '1000019', '6899866', '7025511', '6975642', '6899871', '6899903', '6652345', '1000380', '6899898', '1000416', '1000119', '6808656', '6931154', '1000578', '7106528', '6899900', '6984397', '6975643', '6634342', '1000006', '6794341', '1000137', '6782064', '6681761', '6782062', '6680585', '1000276', '1000373', '6975645', '6899896', '7195344', '1000185', '1000005', '7077969', '1000020', '6680057', '6662998', '6975641', '1000081', '1000135', '1000171', '1000270', '6943826', '1000022', '1000203', '7049421', '1000278', '6634302', '6782065', '6984399', '6984403', '1000051', '7143880', '1000148', '1000212', '1000001', '6985441', '6899904', '6975638', '6975644', '6984401'] + # + # ev_sched=deepcopy(new_sched) + # ev_sched.rotations={rot:new_sched.rotations[rot] for rot in new_sched.rotations} + # ev_sched, ev_scen, ele_station_set, ele_stations = preprocessing_scenario( + # ev_sched, args, + # inclusion_stations=electrified_station_set, run_only_neg=False) + # + # q,a,b = get_rotation_soc(rots[0], ev_sched, ev_scen) + # ax = plot_(q[a:b]) + # + # t,c,d = get_rotation_soc(rots[0], new_sched, new_scen) + # ax.plot(t[c:d]) + ############# + # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups): events, stations = group @@ -410,8 +454,8 @@ def group_optimization_quick(group, base_scen, base_sched, best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, pre_optimized_set, decision_tree, missing_energy=missing_energy) - - logger.debug(best_station_ids) + stat_eval_dict={stat_id[0]:stat_id[1]["pot_sum"] for stat_id in station_eval} + logger.debug("%s, with first pot of %s" , best_station_ids,stat_eval_dict[best_station_ids[0]]) if best_station_ids is None: logger.warning( f"All stations with estimated potential electrified but still missing energy in " @@ -439,7 +483,9 @@ def group_optimization_quick(group, base_scen, base_sched, # (smaller) event group which is getting optimized. But it allows for looking at the current # base group missing energy see "delta_base_energy" which is put into base_group = kwargs.get("base_group", []) - event_rotations = {x["rotation"] for x in base_group} + + # todo event_group or base_group? Base group much slower? + event_rotations = {x["rotation"] for x in event_group} new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, @@ -462,18 +508,18 @@ def group_optimization_quick(group, base_scen, base_sched, delta_energy = get_missing_energy(new_events) - event_rotations = {event["rotation"].id for event in base_group} - base_events = get_below_zero_soc_events(new_scen, event_rotations, - new_sched, - soc_upper_thresh=1, - filter_standing_time=True, - not_possible_stations=set(), - soc_lower_thresh=0, relative_soc=True) + # event_rotations = {event["rotation"].id for event in base_group} + # base_events = get_below_zero_soc_events(new_scen, event_rotations, + # new_sched, + # soc_upper_thresh=1, + # filter_standing_time=True, + # not_possible_stations=set(), + # soc_lower_thresh=0, relative_soc=True) logger.debug("Last electrification electrified %s/%s" " and a %s/%s in the base group.", - len(event_group)-len(new_events), len(event_group), len(base_group)-len(base_events), len(base_group)) - - delta_base_energy = get_missing_energy(base_events) + len(event_group)-len(new_events), len(event_group), 1,1)#len(base_group)-len(base_events), len(base_group)) + # todo + delta_base_energy = delta_energy #get_missing_energy(base_events) if decision_tree is not None: node_name = stations_hash(electrified_station_set) @@ -891,17 +937,13 @@ def evaluate(events, eval_scen,soc_curve_dict, soc_upper_thresh=1, soc_lower_thr def get_charging_time(trip1, trip2, args): - delay = 0 standing_time_min = (trip2.departure_time - trip1.arrival_time) \ / timedelta(minutes=1) + buffer_time = (get_buffer_time(trip1, args) / timedelta(minutes=1)) + standing_time_min -= buffer_time + if args.min_charging_time > standing_time_min: return 0 - # Todo trip1 or trip2 - buffer_time = (get_buffer_time(trip1, args) / timedelta(minutes=1)) - if buffer_time > 0: - standing_time_min -= buffer_time - else: - standing_time_min -= delay return max(0, standing_time_min) @@ -1139,14 +1181,16 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta): def get_buffer_time_old(search_time, args): - for window, buffer_time in args.default_buffer_time_opps.items(): - try: - start, end = window.split("-") - - if float(end) > search_time.hour >= float(start): - return timedelta(minutes=buffer_time) - except ValueError: - return timedelta(minutes=0) + try: + return timedelta(minutes=float(args.default_buffer_time_opps)) + except TypeError: + for window, buffer_time in args.default_buffer_time_opps.items(): + try: + start, end = window.split("-") + if float(end) > search_time.hour >= float(start): + return timedelta(minutes=buffer_time) + except ValueError: + return timedelta(minutes=0) def electrify_station(stat, stations, electrified_set): @@ -1155,8 +1199,9 @@ def electrify_station(stat, stations, electrified_set): def get_buffer_time(trip, args): - return get_buffer_time_old(trip.arrival_time, args) - # return timedelta(minutes=get_buffer_time_spice_ev(trip,)) + # a= get_buffer_time_old(trip.arrival_time, args) + b=timedelta(minutes=get_buffer_time_spice_ev(trip, args.default_buffer_time_opps)) + return b def read_config(config_path): @@ -1187,11 +1232,12 @@ def __init__(self): optimizer = config_parser["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") - conf.rebase_scenario = optimizer.getboolean("REBASE_SCENARIO", True) + conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) conf.opt_type = optimizer.get("opt_type", "greedy") conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) conf.node_choice = optimizer.get("node_choice", "step") conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) + conf.run_only_neg = optimizer.getboolean("run_only_neg", False) special = config_parser["SPECIAL"] conf.reduce_rots = special.getboolean("reduce_rots", False) From c1d5f51157d97cb5a3e73fe715ada57499c42d62 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 6 Dec 2022 16:27:41 +0100 Subject: [PATCH 368/802] ext. load and feed-in CSV for electrified stations --- data/examples/ebus_toolbox.cfg | 32 --------- data/examples/electrified_stations.json | 15 ++-- ebus_toolbox/__main__.py | 13 ---- ebus_toolbox/costs.py | 2 +- ebus_toolbox/schedule.py | 93 ++++++++++--------------- 5 files changed, 45 insertions(+), 110 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 2859da85..423245f5 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -29,8 +29,6 @@ level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_d cost_calculation = true # cost parameters (Calculation of costs is optional, defaults to None) cost_parameters_file = "./data/examples/cost_params.json" -# set nominal power of PV plant in kW (necessary for feed-in remuneration - set for all GCs) -pv_power = 0 ##### SIMULATION HYPERPARAMETERS ##### @@ -99,36 +97,6 @@ cs_power_deps_oppb = 150 # define hours of traffic_jam (options are "stop&go" and "dense") #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} -##### TIMESERIES ##### - -# list of external load timeseries (in this example in same directory as resulting json) and -# grid connector at which the timeseries shall be applied -# e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] -#include_ext_load_csv = [["Building-20210705-20210719.csv", "Betriebshof A"]] - -# options for external load CSV (options are used for all files specified above): -# set CSV column name, timestep duration in sec. (example: 10 min) and factor (example: input in Watt) -#include_ext_csv_option = [["column", "value"], ["step_duration_s", 600], ["factor", 0.001]] - -# local feed in timeseries (in this example in subdirectory "timeseries" - relative to resulting json) and -# grid connector at which the timeseries shall be applied -# e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] -#include_feed_in_csv = [["timeseries/feed_in.csv", "Betriebshof A"]] - -# options for feed in CSV (options are used for all files specified above): -# set CSV column name, timestep duration in sec. (example: 1 hour) and factor (example: input in Watt) -#include_feed_in_csv_option = [["column", "value"], ["step_duration_s", 3600], ["factor", 1]] - -# energy price timeseries in EUR/kWh (in this example in parent directory - relative to resulting json) and -# grid connector at which the timeseries shall be applied -# e.g. [["timeseries_1_path", "gc_name_1"], ["timeseries_2_path", "gc_name_2"]] -#include_price_csv = [["../energy_price.csv", "Betriebshof A"]] - -# options for price CSV (options are used for all files specified above): -# set CSV column name and timestep duration in sec. (example: 6 hours) -#include_price_csv_option = [["column", "value"], ["step_duration_s", 21600]] -# for more options, see https://github.com/rl-institut/spice_ev/wiki/Command-line-options#csv-file-options - ########### SPICE_EV SIMULATE PARAMETERS ############### diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 033e22bc..cfafb652 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -4,12 +4,14 @@ "n_charging_stations": null, "distance_transformer": 150, "energy_feed_in": { - "csv_file": "example_pv_feedin.csv", - "start_time": "2018-01-01T00:00:00+02:00", + "csv_file": "data/examples/example_pv_feedin.csv", + "start_time": "2022-03-07T00:00:00", "step_duration_s": 3600, "column": "Feed-in Total (kW)", - "factor": 10 + "nominal_power": 10, + "factor": 1 }, + "external_load": null, // optional "voltage_level" : "MV", "battery": { "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required @@ -25,11 +27,12 @@ "n_charging_stations": 3, "voltage_level" : "MV", "energy_feed_in": { - "csv_file": "example_pv_feedin.csv", - "start_time": "2018-01-01T00:00:00+02:00", + "csv_file": "data/examples/example_pv_feedin.csv", + "start_time": "2022-03-08T00:00:00", "step_duration_s": 3600, "column": "Feed-in Total (kW)", - "factor": 2 + "nominal_power": 2, + "factor": 0.5 } }, "Station-10": { diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 89e25b74..4f580e3d 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -52,17 +52,6 @@ (-1 for variable capacity, second argument is fixed power))') parser.add_argument('--seed', default=None, type=int, help='set random seed') parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') - parser.add_argument('--include-ext-load-csv', - help='include CSV for external load. \ - You may define custom options with --include-ext-csv-option') - parser.add_argument('--include-ext-csv-option', '-eo', metavar=('KEY', 'VALUE'), - nargs=2, action='append', - help='append additional argument to external load') - parser.add_argument('--include-feed-in-csv', - help='include CSV for energy feed-in, e.g., local PV. \ - You may define custom options with --include-feed-in-csv-option') - parser.add_argument('--include-feed-in-csv-option', '-fo', metavar=('KEY', 'VALUE'), - nargs=2, action='append', help='append additional argument to feed-in load') parser.add_argument('--include-price-csv', help='include CSV for energy price. \ You may define custom options with --include-price-csv-option') @@ -77,8 +66,6 @@ parser.add_argument('--cost-calculation', '-cc', action='store_true', help='Calculate costs') parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) - parser.add_argument('--pv-power', type=int, default=0, help='set nominal power for local ' - 'photovoltaic power plant in kWp') parser.add_argument('--min-charging-time', help='define minimum time of charging', default=0) parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 30abfb3e..cfd3538c 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,6 +1,6 @@ import warnings -from calculate_costs import calculate_costs as calc_costs_spice_ev +from spice_ev.calculate_costs import calculate_costs as calc_costs_spice_ev def calculate_costs(c_params, scenario, schedule, args): diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 3ca32b19..548eb9b2 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -475,8 +475,7 @@ def generate_scenario(self, args): # vehicle connects to charging station connected_charging_station = f"{cs_name}_{station_type}" # create charging station and grid connector if necessary - if cs_name not in charging_stations or gc_name not in grid_connectors: - number_cs = station["n_charging_stations"] + if cs_name not in charging_stations: if station_type == "deps": cs_power = args.cs_power_deps_oppb \ if trip.rotation.charging_type == 'oppb' \ @@ -493,12 +492,13 @@ def generate_scenario(self, args): "min_power": 0.1 * cs_power, "parent": gc_name } + if gc_name not in grid_connectors: # add one grid connector for each bus station grid_connectors[gc_name] = { "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, - "number_cs": number_cs, - "voltage_level": self.stations[gc_name]["voltage_level"] + "number_cs": station["n_charging_stations"], + "voltage_level": station.get("voltage_level") } # check for stationary battery battery = station.get("battery") @@ -508,16 +508,31 @@ def generate_scenario(self, args): batteries[gc_name] = battery # add feed-in name and power at grid connector if exists - if args.include_feed_in_csv: - if gc_name == args.include_feed_in_csv[0][1]: - # ToDo: Make universal! Adjust how to include feed-in timeseries? - # also in SpiceEV? - photovoltaics[gc_name] = { - "parent": gc_name, - "nominal_power": vars(args).get("pv_power", 0) - # ToDo: Allow to set pv_power for specific GC - # (include in include_feed_in_csv as third argument?) - } + feed_in = station.get("energy_feed_in") + if feed_in: + feed_in_path = Path(feed_in["csv_file"]) + if not feed_in_path.exists(): + warnings.warn("feed-in csv file '{}' does not exist".format( + feed_in_path)) + feed_in["grid_connector_id"] = gc_name + feed_in["csv_file"] = feed_in_path + events["energy_feed_in"][gc_name + " feed-in"] = feed_in + # add PV component + photovoltaics[gc_name] = { + "parent": gc_name, + "nominal_power": feed_in.get("pv_power", 0) + } + + # add external load if exists + ext_load = station.get("external_load") + if ext_load: + ext_load_path = Path(ext_load["csv_file"]) + if not ext_load_path.exists(): + warnings.warn("external load csv file '{}' does not exist".format( + ext_load_path)) + ext_load["grid_connector_id"] = gc_name + ext_load["csv_file"] = ext_load_path + events["external_load"][gc_name + " ext. load"] = ext_load # initial condition of vehicle if i == 0: @@ -601,46 +616,6 @@ def generate_scenario(self, args): # add timeseries from csv # save path and options for CSV timeseries - - if args.include_ext_load_csv: - for filename, gc_name in args.include_ext_load_csv: - options = { - "csv_file": filename, - "start_time": start_simulation.isoformat(), - "step_duration_s": 900, # 15 minutes - "grid_connector_id": gc_name, - "column": "energy" - } - if args.include_ext_csv_option: - for key, value in args.include_ext_csv_option: - if key == "step_duration_s": - value = int(value) - options[key] = value - events['external_load'][Path(filename).stem] = options - # check if CSV file exists - ext_csv_path = args.output_directory / filename - if not ext_csv_path.exists(): - print("Warning: external csv file '{}' does not exist yet".format(ext_csv_path)) - - if args.include_feed_in_csv: - for filename, gc_name in args.include_feed_in_csv: - options = { - "csv_file": filename, - "start_time": start_simulation.isoformat(), - "step_duration_s": 3600, # 60 minutes - "grid_connector_id": gc_name, - "column": "energy" - } - if args.include_feed_in_csv_option: - for key, value in args.include_feed_in_csv_option: - if key == "step_duration_s": - value = int(value) - options[key] = value - events['energy_feed_in'][Path(filename).stem] = options - feed_in_path = args.output_directory / filename - if not feed_in_path.exists(): - print("Warning: feed-in csv file '{}' does not exist yet".format(feed_in_path)) - if args.include_price_csv: for filename, gc_name in args.include_price_csv: options = { @@ -660,9 +635,11 @@ def generate_scenario(self, args): print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) # reformat vehicle types for spiceEV - vehicle_types_spiceev = {f'{vehicle_type}_{charging_type}': body - for vehicle_type, subtypes in self.vehicle_types.items() - for charging_type, body in subtypes.items()} + vehicle_types_spiceev = { + f'{vehicle_type}_{charging_type}': body + for vehicle_type, subtypes in self.vehicle_types.items() + for charging_type, body in subtypes.items() + } # create final dict self.scenario = { @@ -682,4 +659,4 @@ def generate_scenario(self, args): "events": events } - return Scenario(self.scenario, args.output_directory) + return Scenario(self.scenario, Path()) From 154808a43da69492d27aadd7c1c119eb5fefa680 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 7 Dec 2022 10:55:08 +0100 Subject: [PATCH 369/802] Add min soc in config and tree position --- data/examples/optimizer.cfg | 27 +++- ebus_toolbox/optimizer.py | 302 +++++++++++++++++++++++------------- ebus_toolbox/simulate.py | 10 ++ 3 files changed, 228 insertions(+), 111 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index e8e64e09..214d5fb7 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -1,32 +1,45 @@ # Configs for the eBus Toolbox Optimizer [DEFAULT] -debug_level=11 -['1000097', '6899905', '7074180', '1000372', '6782063', '1000394', '6943812', '7049423', '6943605', '6662367', '7143882', '1000371', '1000288', '6943610', '6680572', '1000287', '1000000', '6680062', '1000186', '1000049', '1000415', '6943824', '6943595', '1000145', '6794347', '6794309', '6794346', '6662417', '7049424', '6680053', '1000381', '7077964', '1000404', '6970253', '1000144', '6703041', '1000202', '6899902', '6719042', '1000098', '6794345', '6652322', '6794349', '1000392', '1000382', '1000201', '6975640', '1000161', '6662973', '6794338', '1000204', '7131593', '6975649', '6681020', '6943593', '6943803', '7049425', '6943609', '1000121', '1000378', '6891229', '6975647', '7042548', '6943604', '1000003', '6984405', '6703043', '6966238', '1000019', '6899866', '7025511', '6975642', '6899871', '6899903', '6652345', '1000380', '6899898', '1000416', '1000119', '6808656', '6931154', '1000578', '7106528', '6899900', '6984397', '6975643', '6634342', '1000006', '6794341', '1000137', '6782064', '6681761', '6782062', '6680585', '1000276', '1000373', '6975645', '6899896', '7195344', '1000185', '1000005', '7077969', '1000020', '6680057', '6662998', '6975641', '1000081', '1000135', '1000171', '1000270', '6943826', '1000022', '1000203', '7049421', '1000278', '6634302', '6782065', '6984399', '6984403', '1000051', '7143880', '1000148', '1000212', '1000001', '6985441', '6899904', '6975638', '6975644', '6984401'] +debug_level=0 + [SCENARIO] # Use "" for ids and not '' -exclusion_rots = ["6650837", "1000579", "7042547", "6940321", "6975646", "6637000", "7042546", "7007025", "6986504", "6940341", "7194150", "6680580", "6891224", "6923844", "6680514", "6986519", "6985436", "1000269", "6985446", "1000184", "6975639", "6680530", "6986499", "7194046", "6985589", "6985431", "6938337", "6938332", "6986494", "6891223", "7042545", "6895223", "6891228", "6680523", "7049422", "6891226", "1000106", "6891222", "6986524", "6986509", "7194145", "6975648", "7007023", "6653824", "6975637", "6895194", "6895226", "6997330", "6986514", "7007024", "6680501", "7007022", "6650848", "7194155"] +exclusion_rots = ["6891228", "6891223", "6895194", "7049422", "1000269", "6891224", "7049423", "6891226", "6895223", "1000278", "6891222", "6923844", "1000276", "1000106", "1000144", "1000184", "6895226"] exclusion_stations= [] -inclusion_stations= ["SIRI01B", "KLNG01B", "SUJH01B", "FLKP01B", "SERZ01B", "UKRL03B", "SDKI03B", "SUSP01B", "UBRS01B", "BER102B", "BUSS01B", "GALS01B", "ALTG02B", "MGGW02B", "SGD02B", "LINH02B", "SURZ23B", "DAHV03B", "BFAE01B", "NOSS01B", "ZIRI03BS", "MAWI01B", "KDSG01B", "ZFHF01B", "SWEL01B", "UEWP02B", "MKZE02B", "UTM07B", "REIM01B", "MEBR01B", "UMOH01B", "UKSP02B", "LUTH01B", "UOSL04B", "FKB03BS", "SLIS02B", "VOUL01B", "MAST04B", "SHDF03B", "SLR07BA", "WFDA01B", "STAS01B", "UHP04BN", "SELS01B", "WERS01B", "SNP01B", "STUT04B", "UMM01B", "BER105B", "ANDZ01B", "UHPU02B", "SUTF01B", "MHDO02B", "SHEN01B", "HAWR01B", "NRPP01B", "SMF03B", "HBF11B", "NAHM04B", "SULB01B", "HOTT01B", "UEWP05B", "UVIN14B", "TITI01B", "AUBT01B", "UDD04B", "MABA02B", "ULEO01B", "SGD01B", "SFOH01B", "NAHM05B", "TEWA03B", "GUTS01B", "UAMD01B", "WOSM01B", "UEWP04B", "HNBG01B", "ALTL01B", "SKD05B", "SUHM04B", "ADMH01B", "KDFS01B", "UTRE01B", "SURZ04B", "PRPL11B", "SBU02B", "AHGR01B", "HENH01B", "JOST01B", "GOST01B", "UFI02B", "PIET06BA", "SIW501B", "SNIK01B", "KOET01B", "ALHS01B", "HBF01B", "SABS01B", "RSNE01B", "SMDF12B", "SMZ07B", "UHPK01B", "SKA01B", "ZOOH01B", "MKZE03B", "SAF01B", "AUBT04B", "AHGR02B", "BER508B", "SSWS17BA", "KHDW01B", "RIGT06BS", "UHAS05B", "USTM09B", "AMOM04B", "TSTR01B", "SUHM09B", "SMNO01B", "UPBA03B", "SULB10B", "MAST06B", "PSDG11BA", "URUD17B", "UMED03B", "SLIS01B", "UAMD06B", "SBAW04B", "UHAS03B", "URUH07B", "FKB01B", "WIDA01B", "ALKL02B", "HBPL01B", "PPAS02B", "OTFR01B", "UFWP01B", "SLBN01B", "UJTC04B", "TORT01B", "INVA01B", "BRIX01B", "SLR09BA", "APPZ03B", "SEYD02B", "URUD04B", "MGGW01B", "SUSP04B", "CMPB01B", "SOSB04B", "ZITT02B", "HAST01B", "SLIS06B", "ISSZ01B", "NEHM03B", "NHRY01B", "HADL01B", "STBH01B", "UBER01B", "TERB04B", "SZEP01B", "GEZE01B", "APPZ07B", "UOHH09B", "FDDM01B", "WKHS03B", "HOTT02B", "SWS03B", "EIPU01B", "SGA02B", "GUTS04B", "SSWS16BA", "SOSB01B", "BER506B", "BFI10BS", "RCHT01B", "UAMD02B", "UKDN06B", "KLCL02B", "ODNH01B", "WKHS02B", "MADF02B", "UWSC01B", "DILL01B", "AMRH04BA", "FOHA01B", "WWSP01B", "FEZ07BS", "SGA08B", "UHP06B", "UWSP03B", "KRNB01B", "QUIB01B", "WIDA02B", "SWS01B", "PCJS02B", "BER505B"] +inclusion_stations= [] +#["6650837", "1000579", "7042547", "6940321", "6975646", "6637000", "7042546", "7007025", "6986504", "6940341", "7194150", "6680580", "6891224", "6923844", "6680514", "6986519", "6985436", "1000269", "6985446", "1000184", "6975639", "6680530", "6986499", "7194046", "6985589", "6985431", "6938337", "6938332", "6986494", "6891223", "7042545", "6895223", "6891228", "6680523", "7049422", "6891226", "1000106", "6891222", "6986524", "6986509", "7194145", "6975648", "7007023", "6653824", "6975637", "6895194", "6895226", "6997330", "6986514", "7007024", "6680501", "7007022", "6650848", "7194155"] +#["SIRI01B", "KLNG01B", "SUJH01B", "FLKP01B", "SERZ01B", "UKRL03B", "SDKI03B", "SUSP01B", "UBRS01B", "BER102B", "BUSS01B", "GALS01B", "ALTG02B", "MGGW02B", "SGD02B", "LINH02B", "SURZ23B", "DAHV03B", "BFAE01B", "NOSS01B", "ZIRI03BS", "MAWI01B", "KDSG01B", "ZFHF01B", "SWEL01B", "UEWP02B", "MKZE02B", "UTM07B", "REIM01B", "MEBR01B", "UMOH01B", "UKSP02B", "LUTH01B", "UOSL04B", "FKB03BS", "SLIS02B", "VOUL01B", "MAST04B", "SHDF03B", "SLR07BA", "WFDA01B", "STAS01B", "UHP04BN", "SELS01B", "WERS01B", "SNP01B", "STUT04B", "UMM01B", "BER105B", "ANDZ01B", "UHPU02B", "SUTF01B", "MHDO02B", "SHEN01B", "HAWR01B", "NRPP01B", "SMF03B", "HBF11B", "NAHM04B", "SULB01B", "HOTT01B", "UEWP05B", "UVIN14B", "TITI01B", "AUBT01B", "UDD04B", "MABA02B", "ULEO01B", "SGD01B", "SFOH01B", "NAHM05B", "TEWA03B", "GUTS01B", "UAMD01B", "WOSM01B", "UEWP04B", "HNBG01B", "ALTL01B", "SKD05B", "SUHM04B", "ADMH01B", "KDFS01B", "UTRE01B", "SURZ04B", "PRPL11B", "SBU02B", "AHGR01B", "HENH01B", "JOST01B", "GOST01B", "UFI02B", "PIET06BA", "SIW501B", "SNIK01B", "KOET01B", "ALHS01B", "HBF01B", "SABS01B", "RSNE01B", "SMDF12B", "SMZ07B", "UHPK01B", "SKA01B", "ZOOH01B", "MKZE03B", "SAF01B", "AUBT04B", "AHGR02B", "BER508B", "SSWS17BA", "KHDW01B", "RIGT06BS", "UHAS05B", "USTM09B", "AMOM04B", "TSTR01B", "SUHM09B", "SMNO01B", "UPBA03B", "SULB10B", "MAST06B", "PSDG11BA", "URUD17B", "UMED03B", "SLIS01B", "UAMD06B", "SBAW04B", "UHAS03B", "URUH07B", "FKB01B", "WIDA01B", "ALKL02B", "HBPL01B", "PPAS02B", "OTFR01B", "UFWP01B", "SLBN01B", "UJTC04B", "TORT01B", "INVA01B", "BRIX01B", "SLR09BA", "APPZ03B", "SEYD02B", "URUD04B", "MGGW01B", "SUSP04B", "CMPB01B", "SOSB04B", "ZITT02B", "HAST01B", "SLIS06B", "ISSZ01B", "NEHM03B", "NHRY01B", "HADL01B", "STBH01B", "UBER01B", "TERB04B", "SZEP01B", "GEZE01B", "APPZ07B", "UOHH09B", "FDDM01B", "WKHS03B", "HOTT02B", "SWS03B", "EIPU01B", "SGA02B", "GUTS04B", "SSWS16BA", "SOSB01B", "BER506B", "BFI10BS", "RCHT01B", "UAMD02B", "UKDN06B", "KLCL02B", "ODNH01B", "WKHS02B", "MADF02B", "UWSC01B", "DILL01B", "AMRH04BA", "FOHA01B", "WWSP01B", "FEZ07BS", "SGA08B", "UHP06B", "UWSP03B", "KRNB01B", "QUIB01B", "WIDA02B", "SWS01B", "PCJS02B", "BER505B"] +# 1202 142636:Optimized with 66 stations #################### ['AHGR02B', 'APPZ07B', 'AUBT04B', 'BER102B', 'BER506B', 'BER508B', 'BFAE01B', 'BRIX01B', 'BUSS01B', 'CMPB01B', 'GEZE01B', 'HADL01B', 'HAWR01B', 'HBF01B', 'HBF11B', 'KDFS01B', 'KOET01B', 'MAST04B', 'MGGW01B', 'MGGW02B', 'MHDO02B', 'NOSS01B', 'ODNH01B', 'PIET06BA', 'PPAS02B', 'PRPL11B', 'RSNE01B', 'SABS01B', 'SBU02B', 'SKA01B', 'SKD05B', 'SLIS02B', 'SLR07BA', 'SMDF12B', 'SMZ07B', 'SSS02B', 'SSWS16BA', 'SSWS17BA', 'STUT04B', 'SUHM04B', 'SUJH01B', 'SULB01B', 'SULB10B', 'SURZ23B', 'SWEL01B', 'TSTR01B', 'UBER01B', 'UBRS01B', 'UDD04B', 'UEWP02B', 'UEWP04B', 'UEWP05B', 'UHP04BN', 'UHP06B', 'UHPU02B', 'UKDN06B', 'UKRL03B', 'UMM01B', 'UMOH01B', 'UOSL04B', 'USTM09B', 'UWSP03B', 'VOUL01B', 'WKHS03B', 'WSTR01B', 'ZOOH01B'] +# 1202 142745:Optimized with 66 stations #################### ['AHGR02B', 'APPZ07B', 'AUBT04B', 'BER102B', 'BER506B', 'BER508B', 'BFAE01B', 'BRIX01B', 'BUSS01B', 'CMPB01B', 'EIPU01B', 'GEZE01B', 'HADL01B', 'HAWR01B', 'HBF01B', 'HBF11B', 'KDFS01B', 'KOET01B', 'MAST04B', 'MGGW01B', 'MGGW02B', 'MHDO02B', 'NOSS01B', 'ODNH01B', 'PIET06BA', 'PPAS02B', 'PRPL11B', 'RSNE01B', 'SABS01B', 'SBU02B', 'SKA01B', 'SKD05B', 'SLIS02B', 'SLR07BA', 'SMDF12B', 'SMZ07B', 'SSS02B', 'SSWS16BA', 'SSWS17BA', 'STUT04B', 'SUHM04B', 'SUJH01B', 'SULB01B', 'SULB10B', 'SURZ23B', 'SWEL01B', 'TSTR01B', 'UBER01B', 'UBRS01B', 'UDD04B', 'UEWP02B', 'UEWP04B', 'UEWP05B', 'UHP04BN', 'UHP06B', 'UHPU02B', 'UKDN06B', 'UKRL03B', 'UMM01B', 'UMOH01B', 'UOSL04B', 'USTM09B', 'UWSP03B', 'VOUL01B', 'WKHS03B', 'ZOOH01B'] +# 1202 142758:Optimized with 66 stations #################### ['AHGR02B', 'ALXM11BA', 'APPZ07B', 'AUBT04B', 'BER506B', 'BER508B', 'BFAE01B', 'BRIX01B', 'BUSS01B', 'CMPB01B', 'EIPU01B', 'GEZE01B', 'HADL01B', 'HAWR01B', 'HBF01B', 'HBF11B', 'KDFS01B', 'KOET01B', 'MAST04B', 'MGGW01B', 'MGGW02B', 'MHDO02B', 'NOSS01B', 'ODNH01B', 'PIET06BA', 'PPAS02B', 'PRPL11B', 'RSNE01B', 'SABS01B', 'SBU02B', 'SKA01B', 'SKD05B', 'SLIS02B', 'SLR07BA', 'SMDF12B', 'SMZ07B', 'SSS02B', 'SSWS16BA', 'SSWS17BA', 'STUT04B', 'SUHM04B', 'SUJH01B', 'SULB01B', 'SULB10B', 'SURZ23B', 'SWEL01B', 'TSTR01B', 'UBER01B', 'UBRS01B', 'UDD04B', 'UEWP02B', 'UEWP04B', 'UEWP05B', 'UHP04BN', 'UHP06B', 'UHPU02B', 'UKDN06B', 'UKRL03B', 'UMM01B', 'UMOH01B', 'UOSL04B', 'USTM09B', 'UWSP03B', 'VOUL01B', 'WKHS03B', 'ZOOH01B'] + + [VEHICLE] charge_eff = 0.95 battery_capacity = 400 charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] charging_power = 250 +min_soc=0.05 [OPTIMIZER] # "quick" or "spiceev" solver = quick rebase_scenario = False -# "greedy" or "deep" without "" -opt_type = greedy run_only_neg=True remove_impossible_rots=False +# "greedy" or "deep" without "" +opt_type = greedy # "step-by-step" or "brute" without "" node_choice=step-by-step -max_brute_loop=20 +max_brute_loop=5 +estimation_threshold = 0.80 + + [SPECIAL] +decision_tree_path = "" +save_decision_tree = False reduce_rots = False # Use "" for ids and not '' rots = ["6813275","6813275"] diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index a176c8bc..fe79dda9 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -7,9 +7,12 @@ import sys import warnings from copy import copy, deepcopy +from pathlib import Path from time import time import logging - +import math +import shutil +import report import src.scenario as scenario import schedule import rotation @@ -33,11 +36,10 @@ def setup_logger(): logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) - file_handler = logging.FileHandler('optimizer.log') - file_handler.setLevel(0) + file_handler.setLevel(config.debug_level) formatter = logging.Formatter('%(asctime)s:%(message)s', - "%m%d %H%M%S") + "%m%d %H%M%S") file_handler.setFormatter(formatter) formatter = logging.Formatter('%(message)s') @@ -53,17 +55,19 @@ def setup_logger(): with open("scenario_rebased.pickle", "rb") as f: scen = pickle.load(f) with open("schedule_rebased.pickle", "rb") as f: sched = pickle.load(f) -args.desired_soc_opps=1.0 +args.desired_soc_opps = 1.0 config = None ROT = None timers = [0] * 10 + + # args.min_charging_time = 0 # args.default_buffer_time_opps = 0 # del args.save_soc -# del args.save_timeseries -# del args.save_results +del args.save_timeseries +del args.save_results def main(): @@ -85,8 +89,8 @@ def main(): """ global logger global config - - config = read_config("data\examples\optimizer.cfg") + config_path=".\data\examples\optimizer.cfg" + config = read_config(config_path) logger = setup_logger() # which rotations should be excluded? @@ -117,10 +121,32 @@ def main(): for charge_type, vehicle in type.items(): vehicle["capacity"] = config.battery_capacity vehicle["charging_curve"] = config.charging_curve + decision_tree_path = config.decision_tree_path + if decision_tree_path is not None: + with open(decision_tree_path, "rb") as file: + decision_tree = pickle.load(file) + else: + decision_tree = dict() now = datetime.now() - new_ele_stations_path = "data/examples/optimized_stations_" + \ - now.strftime("%Y_%m_%d_%H_%M") + ".json" + + args.output_directory = Path(".\data\sim_outputs") / \ + str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + # create subfolder for specific sim results with timestamp. + # if folder doesnt exists, create folder. + # needs to happen after set_options_from_config since + # args.output_directory can be overwritten by config + args.output_directory.mkdir(parents=True, exist_ok=True) + + c = Path(config_path) + o = args.output_directory / Path("optimizer_config.cfg") + shutil.copy(c, o) + + if args.save_soc: + args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" + + new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") + not_possible_stations = inclusion_stations.union(exclusion_stations) s = time() @@ -131,15 +157,15 @@ def main(): inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing took {time() - s} sec") - with open("schedule_rebased.pickle", "wb") as f: - pickle.dump(new_sched, f) - with open("scenario_rebased.pickle", "wb") as f: - pickle.dump(new_scen, f) - with open("args__rebased", "wb") as f: - pickle.dump(args, f) + # with open("schedule_rebased.pickle", "wb") as file: + # pickle.dump(new_sched, file) + # with open("scenario_rebased.pickle", "wb") as file: + # pickle.dump(new_scen, file) + # with open("args_rebased.pickle", "wb") as file: + # pickle.dump(args, file) else: - with open(args.electrified_stations, "r") as f: - ele_stations = json.load(f) + with open(args.electrified_stations, "r") as file: + ele_stations = json.load(file) ele_station_set = set() # Electrify inclusion stations for stat in inclusion_stations: @@ -158,20 +184,20 @@ def main(): soc_charge_curve_dict[v_type_name] = dict() for name, v_type in sched.vehicle_types.items(): for ch_type, data in v_type.items(): - soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time(data["charging_curve"], data["capacity"], - sched.cs_power_opps, efficiency=config.charge_eff, - timestep=0.1) - - + soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( + data["charging_curve"], data["capacity"], + sched.cs_power_opps, efficiency=config.charge_eff, + timestep=0.1) while True and i < 2: if opt_type == "greedy" or opt_type == "deep": logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=0, + not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=config.min_soc, solver=solver, opt_type=opt_type, - node_choice=node_choice, soc_charge_curve_dict=soc_charge_curve_dict) + node_choice=node_choice, + soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: @@ -199,8 +225,9 @@ def main(): # plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, - new_scen, ele_station_set, soc_charge_curve_dict=soc_charge_curve_dict) - new_events=get_below_zero_soc_events(new_scen,new_sched.rotations, new_sched) + new_scen, ele_station_set, + soc_charge_curve_dict=soc_charge_curve_dict) + new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, new_sched, soc_lower_thresh=config.min_soc) # plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) # q = get_rotation_soc(ROT, new_sched, new_scen)[0] @@ -209,11 +236,10 @@ def main(): logger.debug(event["rotation"].id) logger.debug("###") - global timers logger.debug(timers) - with open(new_ele_stations_path, "w") as f: - json.dump(ele_stations, f, indent=2) + with open(new_ele_stations_path, "w") as file: + json.dump(ele_stations, file, indent=2) logger.debug(f"Spice EV is calculating optimized case as a complete scenario") new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( @@ -222,7 +248,7 @@ def main(): # ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) # ax.plot(q) - logger.debug(f"Still negative rotations:{new_sched.get_negative_rotations(new_scen)}") + logger.warning(f"Still negative rotations:{new_sched.get_negative_rotations(new_scen)}") print("Finished") print(f"Opt took {time() - t}") @@ -233,7 +259,8 @@ def main(): def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, - not_possible_stations,soc_charge_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, + not_possible_stations, soc_charge_curve_dict, soc_upper_thresh=1, + soc_lower_thresh=0, decision_tree=dict(), pre_optimized_set=None, opt_type="greedy", **kwargs): # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() @@ -265,7 +292,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n this_sched=base_sched, soc_upper_thresh=0.95, filter_standing_time=True, not_possible_stations=not_possible_stations, - soc_lower_thresh=0, relative_soc=False) + soc_lower_thresh=soc_lower_thresh, relative_soc=False) # Check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible @@ -276,30 +303,33 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, - new_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict) - new_events=get_below_zero_soc_events(new_scen,new_sched.rotations, new_sched) + new_scen, electrified_station_set, + soc_charge_curve_dict=soc_charge_curve_dict) + new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, new_sched,soc_lower_thresh=soc_lower_thresh) - ################ + ############### # rot='1000097' # # # rots = ['1000097','6899905', '7074180', '1000372', '6782063', '1000394', '6943812', '7049423', '6943605', '6662367', '7143882', '1000371', '1000288', '6943610', '6680572', '1000287', '1000000', '6680062', '1000186', '1000049', '1000415', '6943824', '6943595', '1000145', '6794347', '6794309', '6794346', '6662417', '7049424', '6680053', '1000381', '7077964', '1000404', '6970253', '1000144', '6703041', '1000202', '6899902', '6719042', '1000098', '6794345', '6652322', '6794349', '1000392', '1000382', '1000201', '6975640', '1000161', '6662973', '6794338', '1000204', '7131593', '6975649', '6681020', '6943593', '6943803', '7049425', '6943609', '1000121', '1000378', '6891229', '6975647', '7042548', '6943604', '1000003', '6984405', '6703043', '6966238', '1000019', '6899866', '7025511', '6975642', '6899871', '6899903', '6652345', '1000380', '6899898', '1000416', '1000119', '6808656', '6931154', '1000578', '7106528', '6899900', '6984397', '6975643', '6634342', '1000006', '6794341', '1000137', '6782064', '6681761', '6782062', '6680585', '1000276', '1000373', '6975645', '6899896', '7195344', '1000185', '1000005', '7077969', '1000020', '6680057', '6662998', '6975641', '1000081', '1000135', '1000171', '1000270', '6943826', '1000022', '1000203', '7049421', '1000278', '6634302', '6782065', '6984399', '6984403', '1000051', '7143880', '1000148', '1000212', '1000001', '6985441', '6899904', '6975638', '6975644', '6984401'] - # + # rots = ['1000047'] + # stats= {stat for group in groups for stat in group[1]} # ev_sched=deepcopy(new_sched) - # ev_sched.rotations={rot:new_sched.rotations[rot] for rot in new_sched.rotations} + # electrified_station_set=stats.copy() + # # ev_sched.rotations={rot:new_sched.rotations[rot] for rot in rots} # ev_sched, ev_scen, ele_station_set, ele_stations = preprocessing_scenario( # ev_sched, args, # inclusion_stations=electrified_station_set, run_only_neg=False) # - # q,a,b = get_rotation_soc(rots[0], ev_sched, ev_scen) + # q,a,b = get_rotation_soc(rots[1], ev_sched, ev_scen) # ax = plot_(q[a:b]) - # - # t,c,d = get_rotation_soc(rots[0], new_sched, new_scen) + # t,c,d = get_rotation_soc(rots[1], new_sched, new_scen) # ax.plot(t[c:d]) - ############# + + ############ # Base line is created simply by not having a decision tree and not a pre optimized_set yet - for group_nr, group in enumerate(groups): + for group_nr, group in enumerate(groups[:]): events, stations = group group_rots = {e["rotation"].id: e["rotation"] for e in events} group_socs = [e["min_soc"] for e in events] @@ -307,10 +337,10 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() print(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") - logger.debug(linien) + logger.warning(linien) print(len(events), "events") solver = kwargs.get("solver", "spiceev") - node_choice = kwargs.get("node_choice", "step-by-step") + node_choice = kwargs.get("stationsnode_choice", "step-by-step") if node_choice == "brute": choice_func = choose_station_brute else: @@ -322,25 +352,33 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_step_by_step, soc_charge_curve_dict, - pre_optimized_set=pre_optimized_set, - decision_tree=decision_tree, base_group=events, + pre_optimized_set=None, + decision_tree=decision_tree,soc_lower_thresh=soc_lower_thresh, events_remaining=[len(events)], **kwargs) + + logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set) , len(stations)) + logger.warning(electrified_station_set) + if solver == "quick": if opt_type == "deep": sols = [] i = 0 cont_loop = True t = time() - print("Greedy Result ++++++++") - print(electrified_station_set) - print( - f"There are {len(list(combination_generator(stations, len(electrified_station_set))))} combinations") + + + combinations = combs_unordered_no_putting_back(len(stations), + len(electrified_station_set)) + + print(f"There are {combinations} combinations") + while i < config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: print(time() - t) t = time() - print(len(decision_tree)) + print(len(decision_tree), " Knotenpunkte durchwandert") + print(f"Optimal solution has length {len(electrified_station_set)}") not_possible_stations = copy(not_possible_stations) pre_optimized_set = copy(electrified_station_set) could_not_be_electrified_copy = could_not_be_electrified.copy() @@ -352,33 +390,38 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n electrified_stations, new_electrified_set, could_not_be_electrified_copy , not_possible_stations, - choice_func,soc_charge_curve_dict, + choice_func, soc_charge_curve_dict, pre_optimized_set=pre_optimized_set, decision_tree=decision_tree, - base_group=events) + events_remaining=[len(events)],soc_lower_thresh=soc_lower_thresh) # if a new set was found, print it and save it in sols if new_electrified_set != pre_optimized_set and new_stations is not None: - print("Optimized with", len(new_electrified_set), " stations", - str(["#"] * 20), - stations_hash(new_electrified_set)) + logger.warning( + f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ + {stations_hash(new_electrified_set)}") sols.append(new_electrified_set) - else: - print(f"{new_electrified_set} is not viable") + if len(new_electrified_set) < len(pre_optimized_set): + electrified_station_set = new_electrified_set + # else: + # print(f"{new_electrified_set} is not viable") - print(sols) + logger.debug(sols) else: # use spiceev group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations,soc_charge_curve_dict, + could_not_be_electrified, not_possible_stations, + soc_charge_curve_dict, pre_optimized_set=None, decision_tree=decision_tree, brute=False, **kwargs) list_greedy_sets[group_nr] = electrified_station_set.copy() logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), len(stations))) - + if config.save_decision_tree: + with open (args.output_directory / Path("decision_tree.pickle") , "wb") as file: + pickle.dump(decision_tree,file) for single_set in list_greedy_sets: for stat in single_set: electrify_station(stat, electrified_stations, electrified_station_set) @@ -386,9 +429,6 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets - - - def get_groups_from_events(events, not_possible_stations=set(), could_not_be_electrified=set()): # First create simple list of station sets for single events. # Electrified and other not possible to electrify stations should not connect groups @@ -425,9 +465,11 @@ def group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_function, soc_curve_dict, - pre_optimized_set=None, decision_tree=None, **kwargs): - event_group, possible_stations = group + pre_optimized_set=None, decision_tree=None,soc_lower_thresh=0, tree_position=[],**kwargs): + logger.debug("%s with length of %s", tree_position, len(tree_position)) + event_group, possible_stations = group + events_remaining = kwargs.get("events_remaining", [99999]) # Loading from pickle faster than deepcopy. Copy enough? new_scen = copy(base_scen) new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) @@ -444,7 +486,7 @@ def group_optimization_quick(group, base_scen, base_sched, logger.debug("Already electrified: Returning set") return electrified_stations, True - station_eval = evaluate(event_group, new_scen,soc_curve_dict) + station_eval = evaluate(event_group, new_scen, soc_curve_dict, soc_lower_thresh=soc_lower_thresh) logger.debug("Missing energy: %s", missing_energy) if logger.getEffectiveLevel() > logging.DEBUG: @@ -454,12 +496,13 @@ def group_optimization_quick(group, base_scen, base_sched, best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, pre_optimized_set, decision_tree, missing_energy=missing_energy) - stat_eval_dict={stat_id[0]:stat_id[1]["pot_sum"] for stat_id in station_eval} - logger.debug("%s, with first pot of %s" , best_station_ids,stat_eval_dict[best_station_ids[0]]) + stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} if best_station_ids is None: logger.warning( - f"All stations with estimated potential electrified but still missing energy in " - f"{len(list(rotation_dict.keys()))} rotations") + f"No useful station found with " + f"{events_remaining} rotations not electrified yet. " + f" Stopped after electrifying {len(electrified_station_set)}") + if pre_optimized_set is not None: # Remove electrified stations in this run c = electrified_station_set.copy() @@ -472,6 +515,7 @@ def group_optimization_quick(group, base_scen, base_sched, else: could_not_be_electrified.update(list(rotation_dict.keys())) return None, False + logger.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) # Electrify station for stat_id in best_station_ids: @@ -482,7 +526,6 @@ def group_optimization_quick(group, base_scen, base_sched, # Using the base_group for timeseries calculation is a little slower than using the current # (smaller) event group which is getting optimized. But it allows for looking at the current # base group missing energy see "delta_base_energy" which is put into - base_group = kwargs.get("base_group", []) # todo event_group or base_group? Base group much slower? event_rotations = {x["rotation"] for x in event_group} @@ -490,7 +533,7 @@ def group_optimization_quick(group, base_scen, base_sched, new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, - new_scen, electrified_station_set,soc_curve_dict) + new_scen, electrified_station_set, soc_curve_dict) lifted_socs = deepcopy(new_scen.vehicle_socs) global timer_for_calc @@ -498,34 +541,29 @@ def group_optimization_quick(group, base_scen, base_sched, timer_for_calc += time() - s timers[2] += time() - s not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) - event_rotations = {event["rotation"].id for event in event_group} - new_events = get_below_zero_soc_events(new_scen, event_rotations, + event_rotations_id = {event["rotation"].id for event in event_group} + new_events = get_below_zero_soc_events(new_scen, event_rotations_id, new_sched, soc_upper_thresh=1, filter_standing_time=True, not_possible_stations=not_possible_stations, - soc_lower_thresh=0, relative_soc=True) + soc_lower_thresh=soc_lower_thresh, relative_soc=True) delta_energy = get_missing_energy(new_events) - # event_rotations = {event["rotation"].id for event in base_group} - # base_events = get_below_zero_soc_events(new_scen, event_rotations, - # new_sched, - # soc_upper_thresh=1, - # filter_standing_time=True, - # not_possible_stations=set(), - # soc_lower_thresh=0, relative_soc=True) - logger.debug("Last electrification electrified %s/%s" - " and a %s/%s in the base group.", - len(event_group)-len(new_events), len(event_group), 1,1)#len(base_group)-len(base_events), len(base_group)) + events_remaining[0] -= len(event_group) - len(new_events) + logger.debug("Last electrification electrified %s/%s." + " %s remaining events in the base group.", + len(event_group) - len(new_events), len(event_group), events_remaining[0]) # todo - delta_base_energy = delta_energy #get_missing_energy(base_events) + delta_base_energy = delta_energy # get_missing_energy(base_events) if decision_tree is not None: node_name = stations_hash(electrified_station_set) try: decision_tree[node_name]["missing_energy"] = delta_base_energy decision_tree[node_name]["visit_counter"] += 1 + # todo add is_viable logger.debug("already visited") except KeyError: decision_tree[node_name] = dict() @@ -543,7 +581,9 @@ def group_optimization_quick(group, base_scen, base_sched, # Check if the events can be divided into subgroups which are independent groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) - for group in groups: + for k,group in enumerate(groups): + this_tree=tree_position.copy() + this_tree.append(k) new_stations, _ = group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, @@ -551,12 +591,41 @@ def group_optimization_quick(group, base_scen, base_sched, not_possible_stations, choose_station_function, soc_curve_dict, pre_optimized_set, decision_tree, - lifted_socs=lifted_socs, base_group=base_group) + lifted_socs=lifted_socs, + events_remaining=events_remaining,soc_lower_thresh=soc_lower_thresh, + tree_position=this_tree) + if new_stations is not None: electrified_stations.update(new_stations) else: return None, True + # Evaluate if following this branch makes sense + if pre_optimized_set is not None: + if len(pre_optimized_set) - len(electrified_station_set) < 10: + new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, + new_scen.vehicle_socs, + new_scen, electrified_station_set, + soc_curve_dict) + + prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, + new_sched, + soc_upper_thresh=1, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=soc_lower_thresh, + relative_soc=True) + + station_eval = evaluate(prune_events, new_scen, soc_curve_dict, + soc_lower_thresh=soc_lower_thresh) + prune_missing_energy = get_missing_energy(prune_events) + if not is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, prune_missing_energy): + print("Branch pruned early") + is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, missing_energy) + return None, True + return electrified_stations, True @@ -588,7 +657,7 @@ def group_optimization(group, base_scen, base_sched, logger.debug("Already electrified: Returning set") return electrified_stations - station_eval = evaluate(event_group, pre_opt_scen,soc_curve_dict) + station_eval = evaluate(event_group, pre_opt_scen, soc_curve_dict, soc_lower_thresh=soc_lower_thresh) for id in station_eval: logger.debug("%s, %s", id[0], id[1]["pot_sum"]) logger.debug(missing_energy) @@ -641,7 +710,7 @@ def group_optimization(group, base_scen, base_sched, soc_upper_thresh=1, filter_standing_time=True, not_possible_stations=not_possible_stations, - soc_lower_thresh=0, relative_soc=True) + soc_lower_thresh=soc_lower_thresh, relative_soc=True) delta_energy = get_missing_energy(new_events) @@ -702,6 +771,8 @@ def preprocessing_scenario(this_sched, this_args, this_sched.rotations = rots new_sched, new_scen = run_schedule(this_sched, this_args, electrified_stations) + report.generate(new_sched, new_scen, args) + return new_sched, new_scen, electrified_station_set, electrified_stations @@ -758,15 +829,29 @@ def choose_station_brute(station_eval, electrified_station_set, # the missing energy # Potential>missing energy * 80% potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) - if potential > -missing_energy * 0.8: + if potential > -missing_energy * config.estimation_threshold: return comb, False else: - logger.debug("skipped %s since potential is too low %s %%", comb,round(potential /-missing_energy * 100, 0)) + logger.debug("skipped %s since potential is too low %s %%", comb, + round(potential / -missing_energy * 100, 0)) else: print("calculated all viable possibilities") return None, False +def is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, missing_energy): + delta = len(pre_optimized_set) - len(electrified_station_set) + pot = 0 + for i in range(0, min(delta, len(station_eval))): + pot += station_eval[i][1]["pot_sum"] + if pot < -missing_energy * config.estimation_threshold: + print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", + stations_hash(electrified_station_set)) + return False + return True + + def choose_station_step_by_step(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): # Filter functions to stop simulating cases which have no hope of being optimal. @@ -777,12 +862,9 @@ def choose_station_step_by_step(station_eval, electrified_station_set, # return pre_optimized_set # Potentials have to be at least as promising as the pre-optimized case if pre_optimized_set is not None: - delta = len(pre_optimized_set) - len(electrified_station_set) - pot = 0 - for i in range(0, min(delta, len(station_eval))): - pot += station_eval[i][1]["pot_sum"] - if pot <= -missing_energy: - print("Not enough potential after ", stations_hash(electrified_station_set)) + if not is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, missing_energy): + # Best station id is none and dont go deeper in recursion return None, False min_count_visited = float('inf') @@ -825,7 +907,8 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc_dict = copy(soc_dict) for rot in rotations: - ch_type = (rot.vehicle_id.find("oppb") > 0) * "oppb" + (rot.vehicle_id.find("depb") > 0) * "depb" + ch_type = (rot.vehicle_id.find("oppb") > 0) * "oppb" + ( + rot.vehicle_id.find("depb") > 0) * "depb" v_type = rot.vehicle_id.split("_" + ch_type)[0] soc_over_time_curve = soc_charge_curve_dict[v_type][ch_type] soc = soc_dict[rot.vehicle_id] @@ -869,7 +952,7 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, return soc_dict -def evaluate(events, eval_scen,soc_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, +def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, electrified_station_set=set(), decision_tree=None): # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by @@ -1200,7 +1283,7 @@ def electrify_station(stat, stations, electrified_set): def get_buffer_time(trip, args): # a= get_buffer_time_old(trip.arrival_time, args) - b=timedelta(minutes=get_buffer_time_spice_ev(trip, args.default_buffer_time_opps)) + b = timedelta(minutes=get_buffer_time_spice_ev(trip, args.default_buffer_time_opps)) return b @@ -1229,6 +1312,7 @@ def __init__(self): conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) conf.charging_curve = json.loads(vehicle.get("charging_curve", [])) conf.charging_power = float(vehicle.get("charging_power", 0.95)) + conf.min_soc = float(vehicle.get("min_soc", 0.0)) optimizer = config_parser["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") @@ -1238,13 +1322,22 @@ def __init__(self): conf.node_choice = optimizer.get("node_choice", "step") conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) conf.run_only_neg = optimizer.getboolean("run_only_neg", False) + conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) special = config_parser["SPECIAL"] + conf.decision_tree_path = special.get("decision_tree_path", None) + if conf.decision_tree_path in ["", '""', "''"] : + conf.decision_tree_path=None + conf.save_decision_tree = special.getboolean("save_decision_tree", False) conf.reduce_rots = special.getboolean("reduce_rots", False) conf.rots = json.loads(special.get("rots", [])) return conf + +def combs_unordered_no_putting_back(n, k): + return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) + def outer_group_optimzation(pack, not_possible_stations): group, base_scen, base_sched, old_stations, \ old_electrified_station_set, could_not_be_electrified, pre_optimized_set = pack @@ -1256,6 +1349,7 @@ def outer_group_optimzation(pack, not_possible_stations): not_possible_stations, pre_optimized_set=pre_optimized_set) return electrified_station_set.copy() + if __name__ == "__main__": freeze_support() main() diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 5776ef52..ab4c37bb 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -91,5 +91,15 @@ def simulate(args): cost_annual = costs["c_invest_annual"] + costs["c_maintenance_annual"] + opex_energy_annual print(f"Investment cost: {cost_invest} €. Total annual cost: {cost_annual} €.") + import pickle + with open("schedule_rebased.pickle", "wb") as f: + pickle.dump(schedule, f) + with open("scenario_rebased.pickle", "wb") as f: + pickle.dump(scenario, f) + with open("args_rebased.pickle", "wb") as f: + pickle.dump(args, f) + + print("pickled") + # create report report.generate(schedule, scenario, args) From cb952a79f741e864091f20c90996bd8cc3a8e32d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 8 Dec 2022 11:24:25 +0100 Subject: [PATCH 370/802] Add desired_opps_soc to config and include as uppersoc thresh --- data/examples/optimizer.cfg | 13 +++--- ebus_toolbox/optimizer.py | 86 +++++++++++++++++++++---------------- ebus_toolbox/simulate.py | 6 +-- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 214d5fb7..9fc63ab4 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -4,7 +4,10 @@ debug_level=0 [SCENARIO] # Use "" for ids and not '' -exclusion_rots = ["6891228", "6891223", "6895194", "7049422", "1000269", "6891224", "7049423", "6891226", "6895223", "1000278", "6891222", "6923844", "1000276", "1000106", "1000144", "1000184", "6895226"] +exclusion_rots = [] +#["1000031","6891224", "6891223", "6891222", "6891228", "6891226"] +#,"1000067","7025440","6891222","6891223","6891224","6891226","6891228"] +#["6891228", "6891223", "6895194", "7049422", "1000269", "6891224", "7049423", "6891226", "6895223", "1000278", "6891222", "6923844", "1000276", "1000106", "1000144", "1000184", "6895226"] exclusion_stations= [] inclusion_stations= [] #["6650837", "1000579", "7042547", "6940321", "6975646", "6637000", "7042546", "7007025", "6986504", "6940341", "7194150", "6680580", "6891224", "6923844", "6680514", "6986519", "6985436", "1000269", "6985446", "1000184", "6975639", "6680530", "6986499", "7194046", "6985589", "6985431", "6938337", "6938332", "6986494", "6891223", "7042545", "6895223", "6891228", "6680523", "7049422", "6891226", "1000106", "6891222", "6986524", "6986509", "7194145", "6975648", "7007023", "6653824", "6975637", "6895194", "6895226", "6997330", "6986514", "7007024", "6680501", "7007022", "6650848", "7194155"] @@ -17,10 +20,10 @@ inclusion_stations= [] [VEHICLE] charge_eff = 0.95 -battery_capacity = 400 -charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] -charging_power = 250 -min_soc=0.05 +#battery_capacity = 400 +#charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +#charging_power = 300 +min_soc=0.00 [OPTIMIZER] # "quick" or "spiceev" diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index fe79dda9..9bfd659c 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -50,22 +50,15 @@ def setup_logger(): logger.addHandler(stream_handler) return logger - -with open("args_rebased.pickle", "rb") as f: args = pickle.load(f) - -with open("scenario_rebased.pickle", "rb") as f: scen = pickle.load(f) -with open("schedule_rebased.pickle", "rb") as f: sched = pickle.load(f) -args.desired_soc_opps = 1.0 +with open("args_buffered.pickle", "rb") as f: args = pickle.load(f) +with open("scenario_buffered_electrified.pickle", "rb") as f: scen = pickle.load(f) +with open("schedule_buffered_electrified.pickle", "rb") as f: sched = pickle.load(f) config = None ROT = None timers = [0] * 10 -# args.min_charging_time = 0 -# args.default_buffer_time_opps = 0 - -# del args.save_soc del args.save_timeseries del args.save_results @@ -119,8 +112,10 @@ def main(): for name, type in sched.vehicle_types.items(): for charge_type, vehicle in type.items(): - vehicle["capacity"] = config.battery_capacity - vehicle["charging_curve"] = config.charging_curve + if config.battery_capacity is not None: + vehicle["capacity"] = config.battery_capacity + if config.charging_curve is not None: + vehicle["charging_curve"] = config.charging_curve decision_tree_path = config.decision_tree_path if decision_tree_path is not None: with open(decision_tree_path, "rb") as file: @@ -157,12 +152,12 @@ def main(): inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing took {time() - s} sec") - # with open("schedule_rebased.pickle", "wb") as file: - # pickle.dump(new_sched, file) - # with open("scenario_rebased.pickle", "wb") as file: - # pickle.dump(new_scen, file) - # with open("args_rebased.pickle", "wb") as file: - # pickle.dump(args, file) + with open("schedule_rebased_buffered.pickle", "wb") as file: + pickle.dump(new_sched, file) + with open("scenario_rebased_buffered.pickle", "wb") as file: + pickle.dump(new_scen, file) + with open("args_rebased_buffered.pickle", "wb") as file: + pickle.dump(args, file) else: with open(args.electrified_stations, "r") as file: ele_stations = json.load(file) @@ -194,7 +189,7 @@ def main(): logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=1, soc_lower_thresh=config.min_soc, + not_possible_stations, soc_upper_thresh=config.desired_soc_opps, soc_lower_thresh=config.min_soc, solver=solver, opt_type=opt_type, node_choice=node_choice, soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) @@ -290,7 +285,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n events = get_below_zero_soc_events(this_scen=base_scen, rotations=list(new_sched.rotations.keys()), this_sched=base_sched, - soc_upper_thresh=0.95, filter_standing_time=True, + soc_upper_thresh=soc_upper_thresh, filter_standing_time=True, not_possible_stations=not_possible_stations, soc_lower_thresh=soc_lower_thresh, relative_soc=False) @@ -353,7 +348,9 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n could_not_be_electrified, not_possible_stations, choose_station_step_by_step, soc_charge_curve_dict, pre_optimized_set=None, - decision_tree=decision_tree,soc_lower_thresh=soc_lower_thresh, events_remaining=[len(events)], + decision_tree=decision_tree,soc_lower_thresh=soc_lower_thresh, + soc_upper_thresh=soc_upper_thresh, + events_remaining=[len(events)], **kwargs) logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set) , len(stations)) @@ -393,7 +390,8 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n choice_func, soc_charge_curve_dict, pre_optimized_set=pre_optimized_set, decision_tree=decision_tree, - events_remaining=[len(events)],soc_lower_thresh=soc_lower_thresh) + events_remaining=[len(events)], + soc_upper_thresh=soc_upper_thresh,soc_lower_thresh=soc_lower_thresh) # if a new set was found, print it and save it in sols if new_electrified_set != pre_optimized_set and new_stations is not None: @@ -465,7 +463,9 @@ def group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_function, soc_curve_dict, - pre_optimized_set=None, decision_tree=None,soc_lower_thresh=0, tree_position=[],**kwargs): + pre_optimized_set=None, decision_tree=None, + soc_lower_thresh=0,soc_upper_thresh=1, + tree_position=[],**kwargs): logger.debug("%s with length of %s", tree_position, len(tree_position)) event_group, possible_stations = group @@ -486,7 +486,8 @@ def group_optimization_quick(group, base_scen, base_sched, logger.debug("Already electrified: Returning set") return electrified_stations, True - station_eval = evaluate(event_group, new_scen, soc_curve_dict, soc_lower_thresh=soc_lower_thresh) + station_eval = evaluate(event_group, new_scen, soc_curve_dict, + soc_upper_thresh=soc_upper_thresh, soc_lower_thresh=soc_lower_thresh) logger.debug("Missing energy: %s", missing_energy) if logger.getEffectiveLevel() > logging.DEBUG: @@ -544,7 +545,7 @@ def group_optimization_quick(group, base_scen, base_sched, event_rotations_id = {event["rotation"].id for event in event_group} new_events = get_below_zero_soc_events(new_scen, event_rotations_id, new_sched, - soc_upper_thresh=1, + soc_upper_thresh=soc_upper_thresh, filter_standing_time=True, not_possible_stations=not_possible_stations, soc_lower_thresh=soc_lower_thresh, relative_soc=True) @@ -592,7 +593,9 @@ def group_optimization_quick(group, base_scen, base_sched, soc_curve_dict, pre_optimized_set, decision_tree, lifted_socs=lifted_socs, - events_remaining=events_remaining,soc_lower_thresh=soc_lower_thresh, + events_remaining=events_remaining, + soc_lower_thresh=soc_lower_thresh, + soc_upper_thresh=soc_upper_thresh, tree_position=this_tree) if new_stations is not None: @@ -610,14 +613,14 @@ def group_optimization_quick(group, base_scen, base_sched, prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, new_sched, - soc_upper_thresh=1, + soc_upper_thresh=soc_upper_thresh, filter_standing_time=True, not_possible_stations=not_possible_stations, soc_lower_thresh=soc_lower_thresh, relative_soc=True) station_eval = evaluate(prune_events, new_scen, soc_curve_dict, - soc_lower_thresh=soc_lower_thresh) + soc_upper_thresh=soc_upper_thresh,soc_lower_thresh=soc_lower_thresh) prune_missing_energy = get_missing_energy(prune_events) if not is_branch_promising(station_eval, electrified_station_set, pre_optimized_set, prune_missing_energy): @@ -657,7 +660,7 @@ def group_optimization(group, base_scen, base_sched, logger.debug("Already electrified: Returning set") return electrified_stations - station_eval = evaluate(event_group, pre_opt_scen, soc_curve_dict, soc_lower_thresh=soc_lower_thresh) + station_eval = evaluate(event_group, pre_opt_scen, soc_curve_dict,soc_upper_thresh=soc_upper_thresh, soc_lower_thresh=soc_lower_thresh) for id in station_eval: logger.debug("%s, %s", id[0], id[1]["pot_sum"]) logger.debug(missing_energy) @@ -1225,7 +1228,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr time = 0 socs = [] times = [] - while soc < 1: + while soc < config.desired_soc_opps: times.append(time) socs.append(soc) power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), @@ -1238,7 +1241,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr time += timestep # Fill the soc completely in last timestep times.append(time) - socs.append(1) + socs.append(config.desired_soc_opps) return np.array((times, socs)).T @@ -1248,19 +1251,19 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta): # First element which is bigger than current soc if time_delta == 0: return 0 - soc = max(soc, 0) + soc = max(min(config.desired_soc_opps,soc), 0) first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] second_time = first_time + time_delta # Catch out of bounds if time of charging end is bigger than table values if second_time >= soc_over_time_curve[-1, 0]: - end_soc = 1 + end_soc = config.desired_soc_opps else: end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] # Make sure to limit delta soc to 1 if negative socs are given. They are possible during # the optimization process but will be continuously raised until they are >0. - return min(1, end_soc - start_soc) + return min(config.desired_soc_opps, end_soc - start_soc) def get_buffer_time_old(search_time, args): @@ -1310,9 +1313,20 @@ def __init__(self): vehicle = config_parser["VEHICLE"] conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) - conf.charging_curve = json.loads(vehicle.get("charging_curve", [])) - conf.charging_power = float(vehicle.get("charging_power", 0.95)) + if conf.battery_capacity==0: + conf.battery_capacity=None + conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) + if conf.charging_curve==[]: + conf.charging_curve=None + conf.charging_power = float(vehicle.get("charging_power", 0)) + if conf.charging_power==0: + conf.charging_power=None conf.min_soc = float(vehicle.get("min_soc", 0.0)) + try: + conf.desired_soc_opps=args.desired_soc_opps + except: + conf.desired_soc_opps=1 + optimizer = config_parser["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index ab4c37bb..710983ea 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -92,11 +92,11 @@ def simulate(args): print(f"Investment cost: {cost_invest} €. Total annual cost: {cost_annual} €.") import pickle - with open("schedule_rebased.pickle", "wb") as f: + with open("schedule_buffered_depots.pickle", "wb") as f: pickle.dump(schedule, f) - with open("scenario_rebased.pickle", "wb") as f: + with open("scenario_buffered_depots.pickle", "wb") as f: pickle.dump(scenario, f) - with open("args_rebased.pickle", "wb") as f: + with open("args_buffered.pickle", "wb") as f: pickle.dump(args, f) print("pickled") From 6f2a348524454a79b3a654c9e20a9957cd65832c Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 8 Dec 2022 22:08:10 +0100 Subject: [PATCH 371/802] aesthetic adjustments to example --- data/examples/all_stations.csv | 30 +++++++++++++++--------------- data/examples/ebus_toolbox.cfg | 2 +- data/examples/vehicle_types.json | 12 ++++-------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/data/examples/all_stations.csv b/data/examples/all_stations.csv index b2903b89..757fae3c 100644 --- a/data/examples/all_stations.csv +++ b/data/examples/all_stations.csv @@ -1,15 +1,15 @@ -Endhaltestelle,ID,geo_lat,geo_long,elevation,pv_area,pv_type,pv_kwp -Station-0,,,,0,,, -Station-1,,,,0,,, -Station-2,,,,0,,, -Station-3,,,,0,,, -Station-4,,,,0,,, -Station-5,,,,0,,, -Station-6,,,,0,,, -Station-7,,,,0,,, -Station-8,,,,0,,, -Station-9,,,,0,,, -Station-10,,,,0,,, -Station-11,,,,0,,, -Station-12,,,,0,,, -Station-13,,,,0,,, +Endhaltestelle,elevation +Station-0,0 +Station-1,0 +Station-2,0 +Station-3,0 +Station-4,0 +Station-5,0 +Station-6,0 +Station-7,0 +Station-8,0 +Station-9,0 +Station-10,0 +Station-11,0 +Station-12,0 +Station-13,0 diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 2859da85..30e37229 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -14,7 +14,7 @@ electrified_stations = "data/examples/electrified_stations.json" # vehicle types (defaults to: ./data/examples/vehicle_types.json) vehicle_types = "./data/examples/vehicle_types.json" -# Path to station data with stations heights and possibly more information +# Path to station data with stations heights station_data_path = "data/examples/all_stations.csv" # Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 64880ff2..dd1c0944 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -6,8 +6,7 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": "data/examples/energy_consumption_example.csv" }, "oppb": { "name": "articulated bus - opportunity charging", @@ -15,8 +14,7 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 150]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": "data/examples/energy_consumption_example.csv" } }, "SB": { @@ -26,8 +24,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": "data/examples/energy_consumption_example.csv" }, "oppb": { "name": "solo bus - opportunity charging", @@ -35,8 +32,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 250]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", - "hc": "winter" + "mileage": "data/examples/energy_consumption_example.csv" } } } \ No newline at end of file From 37459695f6fc205ee80f3d5fddb751bf1f9a03e7 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 9 Dec 2022 13:29:04 +0100 Subject: [PATCH 372/802] include utf-8 as encoding everywhere --- ebus_toolbox/consumption.py | 4 ++-- ebus_toolbox/simulate.py | 6 +++--- ebus_toolbox/util.py | 6 +++--- tests/helpers.py | 2 +- tests/test_util.py | 12 ++++++------ 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 8e0e98ca..7857abf0 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -11,7 +11,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: temperature_file_path = kwargs.get("outside_temperatures", None) # parsing the Temperature to a dict if temperature_file_path is not None: - with open(temperature_file_path) as f: + with open(temperature_file_path, encoding='utf-8') as f: delim = util.get_csv_delim(temperature_file_path) reader = csv.DictReader(f, delimiter=delim) for row in reader: @@ -20,7 +20,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: lol_file_path = kwargs.get("level_of_loading_over_day", None) # parsing the level of loading to a dict if lol_file_path is not None: - with open(lol_file_path) as f: + with open(lol_file_path, encoding='utf-8') as f: delim = util.get_csv_delim(lol_file_path) reader = csv.DictReader(f, delimiter=delim) self.lol_by_hour = {} diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index c3225a5d..19540f68 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -16,7 +16,7 @@ def simulate(args): """ # load vehicle types try: - with open(args.vehicle_types) as f: + with open(args.vehicle_types, encoding='utf-8') as f: vehicle_types = util.uncomment_json_file(f) del args.vehicle_types except FileNotFoundError: @@ -25,7 +25,7 @@ def simulate(args): # load stations file try: - with open(args.electrified_stations) as f: + with open(args.electrified_stations, encoding='utf-8') as f: stations = util.uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to electrified stations ({args.electrified_stations}) " @@ -34,7 +34,7 @@ def simulate(args): # load cost parameters if args.cost_parameters_file is not None: try: - with open(args.cost_parameters_file) as f: + with open(args.cost_parameters_file, encoding='utf-8') as f: cost_parameters_file = util.uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to cost parameters ({args.cost_parameters_file}) " diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 481bc4d1..7771ab9e 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -8,7 +8,7 @@ def get_git_revision_hash() -> str: def save_version(file_path): - with open(file_path, "w") as f: + with open(file_path, "w", encoding='utf-8') as f: f.write("Git Hash eBus-Toolbox:" + get_git_revision_hash()) @@ -28,7 +28,7 @@ def set_options_from_config(args, check=False, verbose=True): if "config" in args and args.config is not None: # read options from config file - with open(args.config, 'r') as f: + with open(args.config, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if line.startswith('#'): @@ -150,7 +150,7 @@ def get_csv_delim(path, other_delims=set()): possible_delims = {",", ";", "\t"}.union(other_delims) # create a dict which counts the occurrences of the delimiter per row - with open(path, "r") as f: + with open(path, "r", encoding='utf-8') as f: # count delimiters in first line line = f.readline() counters = {d: line.count(d) for d in possible_delims if line.count(d) > 0} diff --git a/tests/helpers.py b/tests/helpers.py index b5107280..e12fc304 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -9,7 +9,7 @@ def generate_basic_schedule(): station_path = 'tests/test_input_files/electrified_stations.json' temperature_path = 'tests/test_input_files/default_temp_winter.csv' lol_path = 'tests/test_input_files/default_level_of_loading_over_day.csv' - with open("tests/test_input_files/vehicle_types.json", 'r') as f: + with open("tests/test_input_files/vehicle_types.json", 'r', encoding='utf-8') as f: vehicle_types = json.load(f) trip.Trip.consumption = consumption.Consumption(vehicle_types, outside_temperatures=temperature_path, diff --git a/tests/test_util.py b/tests/test_util.py index 091cbe0d..054f134d 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -4,38 +4,38 @@ def test_uncomment_json_file(tmp_path): p = tmp_path / "test.json" - with open(p, 'w+') as f: + with open(p, 'w+', encoding='utf-8') as f: # no comment json.dump({"test1": 1}, f) f.seek(0) assert util.uncomment_json_file(f)["test1"] == 1 - with open(p, 'w+') as f: + with open(p, 'w+', encoding='utf-8') as f: # multiline, no comment f.seek(0) f.write('{\n"test1.1": 1.1,\n"test1.2": 1.2\n}') f.seek(0) assert sum(util.uncomment_json_file(f).values()) == 2.3 - with open(p, 'w+') as f: + with open(p, 'w+', encoding='utf-8') as f: # single char comment in single line f.write('# this is a comment\n{"test2": 2}\n#and another comment') f.seek(0) assert util.uncomment_json_file(f, '#')["test2"] == 2 - with open(p, 'w+') as f: + with open(p, 'w+', encoding='utf-8') as f: # single char comment at end of line f.write('{"test3": 3} % this is a comment') f.seek(0) assert util.uncomment_json_file(f, '%')["test3"] == 3 - with open(p, 'w+') as f: + with open(p, 'w+', encoding='utf-8') as f: # multi-char comment in own line f.write('// {"test4": "comment"}\n{"test4": 4}') f.seek(0) assert util.uncomment_json_file(f, '//')["test4"] == 4 - with open(p, 'w+') as f: + with open(p, 'w+', encoding='utf-8') as f: # multi-char comment at end of line f.write('{"test5": 5} """ {test5: "comment"} """') f.seek(0) From 8646cd0c19f17f67d78bd83f5e5c60c12e7c584b Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 9 Dec 2022 19:39:58 +0100 Subject: [PATCH 373/802] Add function sanitize, resolving code review issues, docstrings #39 --- ebus_toolbox/report.py | 207 +++++++++++++++++------------------------ 1 file changed, 87 insertions(+), 120 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 53c13d24..2318973d 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -6,28 +6,58 @@ import json import matplotlib.pyplot as plt -from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results +from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results, plot + + +def sanitize(s, chars=''): + """ + Removes special characters from string. + + Used to make strings safe for file paths. + :param s: input to be sanitized + :type s: string + :param chars: characters to replace + :type chars: string + :return: input without special characters in chars + :rtype: string + """ + if not chars: + chars = ':"?*' + return s.translate({ord(c): "" for c in chars}) def generate_vehicle_socs(scenario, args): + """Generates a csv file from the vehicle's socs in the specified simulation time. - sim_start_time = scenario.start_time - v_list = [] - for v in scenario.vehicle_socs: - v_list.append(v) + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ - with open(args.output_directory / "vehicle_socs.csv", "w+", newline='') as f: + sim_start_time = scenario.start_time + v_list = list(scenario.vehicle_socs.keys()) + with open(args.output_directory / "vehicle_socs.csv", "w", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(["timestep", "time", ] + v_list) for i, row in enumerate(zip(*scenario.vehicle_socs.values())): - t = sim_start_time + i * scenario.interval - csv_writer.writerow((i, t,) + row) + t = (sim_start_time + i * scenario.interval).isoformat() + csv_writer.writerow([i, t] + list(row)) def generate_station_name_csv(scenario, args): + """Generates a csv file from the grid connectors and their header information in the specified simulation time. + + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + for gc in scenario.constants.grid_connectors.keys(): gc_info = aggregate_timeseries(scenario, gc) - with open(args.output_directory / f"simulation_spiceEV_{gc}.csv", "w+", newline='') as f: + file_name = f"simulation_{sanitize(gc)}.csv" + with open(args.output_directory / file_name, "w", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(gc_info["header"]) for elem in gc_info["timeseries"]: @@ -35,125 +65,57 @@ def generate_station_name_csv(scenario, args): def generate_station_name_json(scenario, args): + """Generates a json file from the grid connectors and their header information in the specified simulation time. + + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + + file_name_prefix = "simulation" for gc in scenario.constants.grid_connectors.keys(): gc_info = aggregate_local_results(scenario, gc) - with open(args.output_directory / f"simulation_spiceEV_{gc}.json", 'w') as f: + file_name = f"{file_name_prefix}_{sanitize(gc)}.json" + with open(args.output_directory / file_name, 'w') as f: json.dump(gc_info, f, indent=2) -def generate_cs_power_overview(scenario, args): - sim_start_time = scenario.start_time - gc_list = [] - for gc in scenario.constants.grid_connectors.keys(): - gc_list.append(gc) +def generate_gc_power_overview(scenario, args): + """Generates a csv file from each grid connectors summed up charging station power in the specified simulation time. - with open(args.output_directory / "cs_power_overview.csv", "w+", newline='') as f: + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + + gc_list = list(scenario.constants.grid_connectors.keys()) + + with open(args.output_directory / "gc_power_overview_timeseries.csv", "w", newline='') as f: csv_writer = csv.writer(f) - csv_writer.writerow(["timestep", "time"] + gc_list) - for i in range(scenario.n_intervals): - t = sim_start_time + i * scenario.interval - row = [] - for gc in gc_list: - gc_info = aggregate_timeseries(scenario, gc) - cs_power = gc_info['timeseries'] - sum_cs_power = cs_power[i][9] - row.append(sum_cs_power) - - csv_writer.writerow((i, t, ) + tuple(row)) - - -def plot(scenario, args): - print('Done. Create plots...') - - xlabels = [] - for r in scenario.results: - xlabels.append(r['current_time']) - - # batteries - if scenario.batteryLevels: - plots_top_row = 3 - ax = plt.subplot(2, plots_top_row, 3) - ax.set_title('Batteries') - ax.set(ylabel='Stored power in kWh') - for name, values in scenario.batteryLevels.items(): - ax.plot(xlabels, values, label=name) - ax.legend() - else: - plots_top_row = 2 - - # vehicles - ax = plt.subplot(2, plots_top_row, 1) - ax.set_title('Vehicles') - ax.set(ylabel='SoC') - lines = ax.plot(xlabels, scenario.socs) - # reset color cycle, so lines have same color - ax.set_prop_cycle(None) - - ax.plot(xlabels, scenario.disconnect, '--') - if len(scenario.constants.vehicles) <= 10: - ax.legend(lines, sorted(scenario.constants.vehicles.keys())) - - # charging stations - ax = plt.subplot(2, plots_top_row, 2) - ax.set_title('Charging Stations') - ax.set(ylabel='Power in kW') - lines = ax.step(xlabels, scenario.sum_cs, where='post') - if len(scenario.constants.charging_stations) <= 10: - ax.legend(lines, sorted(scenario.constants.charging_stations.keys())) - - # total power - ax = plt.subplot(2, 2, 3) - ax.step(xlabels, list([sum(cs) for cs in scenario.sum_cs]), label="CS", where='post') - gc_ids = scenario.constants.grid_connectors.keys() - for gcID in gc_ids: - for name, values in scenario.loads[gcID].items(): - ax.step(xlabels, values, label=name, where='post') - # draw schedule - if scenario.strat.uses_window: - for gcID, schedule in scenario.gcWindowSchedule.items(): - if all(s is not None for s in schedule): - # schedule exists - window_values = [v * int(max(scenario.totalLoad[gcID])) for v in schedule] - ax.step(xlabels, window_values, label="window {}".format(gcID), - linestyle='--', where='post') - if scenario.strat.uses_schedule: - for gcID, schedule in scenario.gcPowerSchedule.items(): - if any(s is not None for s in schedule): - ax.step(xlabels, schedule, label="Schedule {}".format(gcID), where='post') - - ax.step(xlabels, scenario.all_totalLoad, label="Total", where='post') - ax.set_title('Power') - ax.set(ylabel='Power in kW') - ax.legend() - ax.xaxis_date() # xaxis are datetime objects - - # price - ax = plt.subplot(2, 2, 4) - prices = list(zip(*scenario.prices.values())) - lines = ax.step(xlabels, prices, where='post') - ax.set_title('Price for 1 kWh') - ax.set(ylabel='€') - if len(gc_ids) <= 10: - ax.legend(lines, sorted(gc_ids)) - - # figure title - fig = plt.gcf() - fig.suptitle('Strategy: {}'.format(scenario.strat.description), fontweight='bold') - - # fig.autofmt_xdate() # rotate xaxis labels (dates) to fit - # autofmt removes some axis labels, so rotate by hand: - for ax in fig.get_axes(): - ax.set_xlim(scenario.start_time, scenario.stop_time) - plt.setp(ax.get_xticklabels(), rotation=30, ha='right') - - # set size of figure and save it - plt.gcf().set_size_inches(10, 10) - plt.savefig(args.output_directory / "run_overview.png") - plt.savefig(args.output_directory / "run_overview.pdf") - # plt.show() + csv_writer.writerow(["time", ] + gc_list) + stations = [] + time_col = getattr(scenario, f"{gc_list[0]}_timeseries")["time"] + for i in range(len(time_col)): + time_col[i] = time_col[i].isoformat() + stations.append(time_col) + for gc in gc_list: + stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid power [kW]"]]) + gc_power_overview = list(map(list, zip(*stations))) + csv_writer.writerows(gc_power_overview) def generate(schedule, scenario, args): + """Generates all output files/ plots and saves them in the output directory. + + :param schedule: Driving schedule for the simulation. + :type schedule: eBus-Toolbox.Schedule + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ # generate csv out of vehicle's socs generate_vehicle_socs(scenario, args) @@ -163,11 +125,16 @@ def generate(schedule, scenario, args): generate_station_name_json(scenario, args) # generate cs power overview - generate_cs_power_overview(scenario, args) + generate_gc_power_overview(scenario, args) # save plots as png and pdf aggregate_global_results(scenario) - plot(scenario, args) + with plt.ion(): # make plotting temporarily interactive, so plt.show does not block + plot(scenario) + plt.gcf().set_size_inches(10, 10) + plt.savefig(args.output_directory / "run_overview.png") + plt.savefig(args.output_directory / "run_overview.pdf") + plt.close() rotation_infos = [] From 90cad287a4d0f2a2930042f4ad1d50412a3862d2 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 9 Dec 2022 19:43:18 +0100 Subject: [PATCH 374/802] Correct flake8 warnings #39 --- ebus_toolbox/report.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 2318973d..3eed0d30 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -46,7 +46,8 @@ def generate_vehicle_socs(scenario, args): def generate_station_name_csv(scenario, args): - """Generates a csv file from the grid connectors and their header information in the specified simulation time. + """Generates a csv file from the grid connectors + and their header information in the specified simulation time. :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario @@ -65,7 +66,8 @@ def generate_station_name_csv(scenario, args): def generate_station_name_json(scenario, args): - """Generates a json file from the grid connectors and their header information in the specified simulation time. + """Generates a json file from the grid connectors + and their header information in the specified simulation time. :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario @@ -82,7 +84,8 @@ def generate_station_name_json(scenario, args): def generate_gc_power_overview(scenario, args): - """Generates a csv file from each grid connectors summed up charging station power in the specified simulation time. + """Generates a csv file from each grid connectors summed up + charging station power in the specified simulation time. :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario From 0b6819aa45be452d9f590ef8200dc1cf822ef697 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Sat, 10 Dec 2022 10:07:33 +0100 Subject: [PATCH 375/802] Add new function generate_gc_overview #39 --- ebus_toolbox/report.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 3eed0d30..9a1abfa0 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -83,7 +83,7 @@ def generate_station_name_json(scenario, args): json.dump(gc_info, f, indent=2) -def generate_gc_power_overview(scenario, args): +def generate_gc_power_overview_timeseries(scenario, args): """Generates a csv file from each grid connectors summed up charging station power in the specified simulation time. @@ -109,6 +109,36 @@ def generate_gc_power_overview(scenario, args): csv_writer.writerows(gc_power_overview) +def generate_gc_overview(schedule, scenario, args): + """Generates a csv file where each line an electrified station's maximum power + and maximum number of charging stations is shown. + + :param schedule: Driving schedule for the simulation. + :type schedule: eBus-Toolbox.Schedule + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + + all_gc_list = list(schedule.stations.keys()) + used_gc_list = list(scenario.constants.grid_connectors.keys()) + + with open(args.output_directory / "gc_overview.csv", "w", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["Maximum power", "Maximum Nr charging stations"]) + for gc in all_gc_list: + if gc in used_gc_list: + station_name = f"{gc}_timeseries" + ts = getattr(scenario, station_name) + max_gc_power = -min(ts["grid power [kW]"]) + max_nr_cs = max(ts["# occupied CS"]) + else: + max_gc_power = 0 + max_nr_cs = 0 + csv_writer.writerow([max_gc_power, max_nr_cs]) + + def generate(schedule, scenario, args): """Generates all output files/ plots and saves them in the output directory. @@ -127,8 +157,11 @@ def generate(schedule, scenario, args): generate_station_name_csv(scenario, args) generate_station_name_json(scenario, args) - # generate cs power overview - generate_gc_power_overview(scenario, args) + # generate gc power overview + generate_gc_power_overview_timeseries(scenario, args) + + # generate gc overview + generate_gc_overview(schedule, scenario, args) # save plots as png and pdf aggregate_global_results(scenario) From eaeb928927ceeb666da7143a5a410655967c58a1 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Sat, 10 Dec 2022 11:05:21 +0100 Subject: [PATCH 376/802] added option neg_oppb_to_depb --- data/examples/ebus_toolbox.cfg | 3 ++- ebus_toolbox/simulate.py | 20 ++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 30e37229..7952778c 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -40,8 +40,9 @@ seed = 1 # Specify what you want to do. Options: sim, neg_depb_to_oppb, service_optimization. Default: sim # sim runs a single simulation with the given inputs. # neg_depb_to_oppb changes negative depb-rotations to oppb charging. +# neg_oppb_to_depb changes negative oppb-rotations to depb charging. # service optimization finds the largest set of electrified rotations. -#mode = sim +mode = sim # set length of timestep in minutes (default: 15 minute intervals) interval = 1 diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index c3225a5d..6d93a238 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -65,19 +65,23 @@ def simulate(args): # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] - elif args.mode in ["sim", "neg_depb_to_oppb"]: + elif args.mode in ["sim", "neg_depb_to_oppb", "neg_oppb_to_depb"]: # DEFAULT if mode argument is not specified by user # Scenario simulated once scenario = schedule.run(args) - if args.mode == "neg_depb_to_oppb": - # simple optimization: change charging type from depot to opportunity, simulate again + if args.mode in ["neg_depb_to_oppb", "neg_oppb_to_depb"]: + # simple optimization: change charging type, simulate again + change_from = args.mode[4:8] + change_to = args.mode[-4:] + # get negative rotations neg_rot = schedule.get_negative_rotations(scenario) - # only depot rotations relevant and check if oppb-version of vehicle_type exists - neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == "depb" - if "oppb" in vehicle_types[schedule.rotations[r].vehicle_type]] + # check which are rotations relevant and if new other vehicle type exists + neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from + if change_to in vehicle_types[schedule.rotations[r].vehicle_type]] if neg_rot: - print("Changing charging type from depb to oppb for rotations " + ', '.join(neg_rot)) - schedule.set_charging_type("oppb", neg_rot) + print(f"Changing charging type from {change_from} to {change_to} for rotations " + f"" + ', '.join(neg_rot)) + schedule.set_charging_type(change_to, neg_rot) # simulate again scenario = schedule.run(args) neg_rot = schedule.get_negative_rotations(scenario) From 785df5b6fb67bfef027cc2c90c8fbd58397cf494 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 23 Nov 2022 14:35:38 +0100 Subject: [PATCH 377/802] Add new function generate_vehicle_socs #39 --- ebus_toolbox/report.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index b71ec2f0..d96ac194 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -5,7 +5,26 @@ import warnings +def generate_vehicle_socs(scenario, args): + + sim_start_time = scenario.start_time + v_list = [] + for v in scenario.vehicle_socs: + v_list.append(v) + + with open(args.output_directory / "vehicle_socs.csv", "w+", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["timestep", "time",] + v_list) + for i, row in enumerate(zip(*scenario.vehicle_socs.values())): + t = sim_start_time + i * scenario.interval + csv_writer.writerow((i, t,) + row) + + def generate(schedule, scenario, args): + + # create csv out of vehicle's socs + generate_vehicle_socs(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From 21f366c55117e70ab5e7b246e26c660757c3d2f9 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 23 Nov 2022 17:52:49 +0100 Subject: [PATCH 378/802] Add new function generate_station_name csv #39 --- ebus_toolbox/report.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index d96ac194..b0932231 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,6 +4,8 @@ import datetime import warnings +from src.report import aggregate_timeseries + def generate_vehicle_socs(scenario, args): @@ -20,11 +22,24 @@ def generate_vehicle_socs(scenario, args): csv_writer.writerow((i, t,) + row) +def generate_station_name(scenario, args): + for gc in scenario.gcPowerSchedule: + gc_info = aggregate_timeseries(scenario, gc) + with open(args.output_directory / f"simulation_spiceEV_{gc}.csv", "w+", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(gc_info["header"]) + for elem in gc_info["timeseries"]: + csv_writer.writerow(elem) + + def generate(schedule, scenario, args): # create csv out of vehicle's socs generate_vehicle_socs(scenario, args) + # create csv for all stations + generate_station_name(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From b16596fbc85163bc42de62c702cddf79d4b95fa0 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 25 Nov 2022 17:00:33 +0100 Subject: [PATCH 379/802] Add new function generate_station_name_json csv #39 --- ebus_toolbox/report.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index b0932231..4b196ac5 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -3,8 +3,9 @@ import csv import datetime import warnings +import json -from src.report import aggregate_timeseries +from src.report import aggregate_timeseries, aggregate_local_results def generate_vehicle_socs(scenario, args): @@ -22,8 +23,8 @@ def generate_vehicle_socs(scenario, args): csv_writer.writerow((i, t,) + row) -def generate_station_name(scenario, args): - for gc in scenario.gcPowerSchedule: +def generate_station_name_csv(scenario, args): + for gc in scenario.constants.grid_connectors.keys(): gc_info = aggregate_timeseries(scenario, gc) with open(args.output_directory / f"simulation_spiceEV_{gc}.csv", "w+", newline='') as f: csv_writer = csv.writer(f) @@ -32,13 +33,21 @@ def generate_station_name(scenario, args): csv_writer.writerow(elem) +def generate_station_name_json(scenario, args): + for gc in scenario.constants.grid_connectors.keys(): + gc_info = aggregate_local_results(scenario, gc) + with open(args.output_directory / f"simulation_spiceEV_{gc}.json", 'w') as f: + json.dump(gc_info, f, indent=2) + + def generate(schedule, scenario, args): # create csv out of vehicle's socs generate_vehicle_socs(scenario, args) - # create csv for all stations - generate_station_name(scenario, args) + # create csv and json for all stations + generate_station_name_csv(scenario, args) + generate_station_name_json(scenario,args) rotation_infos = [] From c34b7ce4940d209b5a615cf8c853ba7e316ec630 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 25 Nov 2022 18:58:30 +0100 Subject: [PATCH 380/802] Add new function generate_cs_power_overview #39 --- ebus_toolbox/report.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 4b196ac5..849298a3 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -17,7 +17,7 @@ def generate_vehicle_socs(scenario, args): with open(args.output_directory / "vehicle_socs.csv", "w+", newline='') as f: csv_writer = csv.writer(f) - csv_writer.writerow(["timestep", "time",] + v_list) + csv_writer.writerow(["timestep", "time", ] + v_list) for i, row in enumerate(zip(*scenario.vehicle_socs.values())): t = sim_start_time + i * scenario.interval csv_writer.writerow((i, t,) + row) @@ -40,15 +40,39 @@ def generate_station_name_json(scenario, args): json.dump(gc_info, f, indent=2) +def generate_cs_power_overview(scenario, args): + sim_start_time = scenario.start_time + gc_list = [] + for gc in scenario.constants.grid_connectors.keys(): + gc_list.append(gc) + + with open(args.output_directory / "cs_power_overview.csv", "w+", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["timestep", "time"] + gc_list) + for i in range(scenario.n_intervals): + t = sim_start_time + i * scenario.interval + row = [] + for gc in gc_list: + gc_info = aggregate_timeseries(scenario, gc) + cs_power = gc_info['timeseries'] + sum_cs_power = cs_power[i][9] + row.append(sum_cs_power) + + csv_writer.writerow((i, t, ) + tuple(row)) + + def generate(schedule, scenario, args): - # create csv out of vehicle's socs + # generate csv out of vehicle's socs generate_vehicle_socs(scenario, args) - # create csv and json for all stations + # generate csv and json for all stations generate_station_name_csv(scenario, args) generate_station_name_json(scenario,args) + # generate cs power overview + generate_cs_power_overview(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From 6deca221741bceffa8dc7b9e8a49e3498bbecd61 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 28 Nov 2022 11:17:39 +0100 Subject: [PATCH 381/802] Fix flake8 Error #39 --- ebus_toolbox/report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 849298a3..1caeee93 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -68,7 +68,7 @@ def generate(schedule, scenario, args): # generate csv and json for all stations generate_station_name_csv(scenario, args) - generate_station_name_json(scenario,args) + generate_station_name_json(scenario, args) # generate cs power overview generate_cs_power_overview(scenario, args) From e099244a1a9d3e40d66a5ad9d010dc656aff84b2 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 28 Nov 2022 15:55:47 +0100 Subject: [PATCH 382/802] Add new function plot, basically copied from spiceEV #39 --- ebus_toolbox/report.py | 98 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 1caeee93..24bcd602 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,8 +4,9 @@ import datetime import warnings import json +import matplotlib.pyplot as plt -from src.report import aggregate_timeseries, aggregate_local_results +from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results def generate_vehicle_socs(scenario, args): @@ -61,6 +62,97 @@ def generate_cs_power_overview(scenario, args): csv_writer.writerow((i, t, ) + tuple(row)) +def plot(scenario, args): + print('Done. Create plots...') + + xlabels = [] + for r in scenario.results: + xlabels.append(r['current_time']) + + # batteries + if scenario.batteryLevels: + plots_top_row = 3 + ax = plt.subplot(2, plots_top_row, 3) + ax.set_title('Batteries') + ax.set(ylabel='Stored power in kWh') + for name, values in scenario.batteryLevels.items(): + ax.plot(xlabels, values, label=name) + ax.legend() + else: + plots_top_row = 2 + + # vehicles + ax = plt.subplot(2, plots_top_row, 1) + ax.set_title('Vehicles') + ax.set(ylabel='SoC') + lines = ax.plot(xlabels, scenario.socs) + # reset color cycle, so lines have same color + ax.set_prop_cycle(None) + + ax.plot(xlabels, scenario.disconnect, '--') + if len(scenario.constants.vehicles) <= 10: + ax.legend(lines, sorted(scenario.constants.vehicles.keys())) + + # charging stations + ax = plt.subplot(2, plots_top_row, 2) + ax.set_title('Charging Stations') + ax.set(ylabel='Power in kW') + lines = ax.step(xlabels, scenario.sum_cs, where='post') + if len(scenario.constants.charging_stations) <= 10: + ax.legend(lines, sorted(scenario.constants.charging_stations.keys())) + + # total power + ax = plt.subplot(2, 2, 3) + ax.step(xlabels, list([sum(cs) for cs in scenario.sum_cs]), label="CS", where='post') + gc_ids = scenario.constants.grid_connectors.keys() + for gcID in gc_ids: + for name, values in scenario.loads[gcID].items(): + ax.step(xlabels, values, label=name, where='post') + # draw schedule + if scenario.strat.uses_window: + for gcID, schedule in scenario.gcWindowSchedule.items(): + if all(s is not None for s in schedule): + # schedule exists + window_values = [v * int(max(scenario.totalLoad[gcID])) for v in schedule] + ax.step(xlabels, window_values, label="window {}".format(gcID), + linestyle='--', where='post') + if scenario.strat.uses_schedule: + for gcID, schedule in scenario.gcPowerSchedule.items(): + if any(s is not None for s in schedule): + ax.step(xlabels, schedule, label="Schedule {}".format(gcID), where='post') + + ax.step(xlabels, scenario.all_totalLoad, label="Total", where='post') + ax.set_title('Power') + ax.set(ylabel='Power in kW') + ax.legend() + ax.xaxis_date() # xaxis are datetime objects + + # price + ax = plt.subplot(2, 2, 4) + prices = list(zip(*scenario.prices.values())) + lines = ax.step(xlabels, prices, where='post') + ax.set_title('Price for 1 kWh') + ax.set(ylabel='€') + if len(gc_ids) <= 10: + ax.legend(lines, sorted(gc_ids)) + + # figure title + fig = plt.gcf() + fig.suptitle('Strategy: {}'.format(scenario.strat.description), fontweight='bold') + + # fig.autofmt_xdate() # rotate xaxis labels (dates) to fit + # autofmt removes some axis labels, so rotate by hand: + for ax in fig.get_axes(): + ax.set_xlim(scenario.start_time, scenario.stop_time) + plt.setp(ax.get_xticklabels(), rotation=30, ha='right') + + # set size of figure and save it + plt.gcf().set_size_inches(10, 10) + plt.savefig(args.output_directory / "run_overview.png") + plt.savefig(args.output_directory / "run_overview.pdf") + # plt.show() + + def generate(schedule, scenario, args): # generate csv out of vehicle's socs @@ -73,6 +165,10 @@ def generate(schedule, scenario, args): # generate cs power overview generate_cs_power_overview(scenario, args) + # save plots as png and pdf + aggregate_global_results(scenario) + plot(scenario, args) + rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) From 72f387410a1abf9f4cf1849910807e0805c2737b Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 9 Dec 2022 19:39:58 +0100 Subject: [PATCH 383/802] Add function sanitize, resolving code review issues, docstrings #39 --- ebus_toolbox/report.py | 207 +++++++++++++++++------------------------ 1 file changed, 87 insertions(+), 120 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 24bcd602..2fc54a7b 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -6,28 +6,58 @@ import json import matplotlib.pyplot as plt -from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results +from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results, plot + + +def sanitize(s, chars=''): + """ + Removes special characters from string. + + Used to make strings safe for file paths. + :param s: input to be sanitized + :type s: string + :param chars: characters to replace + :type chars: string + :return: input without special characters in chars + :rtype: string + """ + if not chars: + chars = ':"?*' + return s.translate({ord(c): "" for c in chars}) def generate_vehicle_socs(scenario, args): + """Generates a csv file from the vehicle's socs in the specified simulation time. - sim_start_time = scenario.start_time - v_list = [] - for v in scenario.vehicle_socs: - v_list.append(v) + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ - with open(args.output_directory / "vehicle_socs.csv", "w+", newline='') as f: + sim_start_time = scenario.start_time + v_list = list(scenario.vehicle_socs.keys()) + with open(args.output_directory / "vehicle_socs.csv", "w", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(["timestep", "time", ] + v_list) for i, row in enumerate(zip(*scenario.vehicle_socs.values())): - t = sim_start_time + i * scenario.interval - csv_writer.writerow((i, t,) + row) + t = (sim_start_time + i * scenario.interval).isoformat() + csv_writer.writerow([i, t] + list(row)) def generate_station_name_csv(scenario, args): + """Generates a csv file from the grid connectors and their header information in the specified simulation time. + + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + for gc in scenario.constants.grid_connectors.keys(): gc_info = aggregate_timeseries(scenario, gc) - with open(args.output_directory / f"simulation_spiceEV_{gc}.csv", "w+", newline='') as f: + file_name = f"simulation_{sanitize(gc)}.csv" + with open(args.output_directory / file_name, "w", newline='') as f: csv_writer = csv.writer(f) csv_writer.writerow(gc_info["header"]) for elem in gc_info["timeseries"]: @@ -35,125 +65,57 @@ def generate_station_name_csv(scenario, args): def generate_station_name_json(scenario, args): + """Generates a json file from the grid connectors and their header information in the specified simulation time. + + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + + file_name_prefix = "simulation" for gc in scenario.constants.grid_connectors.keys(): gc_info = aggregate_local_results(scenario, gc) - with open(args.output_directory / f"simulation_spiceEV_{gc}.json", 'w') as f: + file_name = f"{file_name_prefix}_{sanitize(gc)}.json" + with open(args.output_directory / file_name, 'w') as f: json.dump(gc_info, f, indent=2) -def generate_cs_power_overview(scenario, args): - sim_start_time = scenario.start_time - gc_list = [] - for gc in scenario.constants.grid_connectors.keys(): - gc_list.append(gc) +def generate_gc_power_overview(scenario, args): + """Generates a csv file from each grid connectors summed up charging station power in the specified simulation time. - with open(args.output_directory / "cs_power_overview.csv", "w+", newline='') as f: + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + + gc_list = list(scenario.constants.grid_connectors.keys()) + + with open(args.output_directory / "gc_power_overview_timeseries.csv", "w", newline='') as f: csv_writer = csv.writer(f) - csv_writer.writerow(["timestep", "time"] + gc_list) - for i in range(scenario.n_intervals): - t = sim_start_time + i * scenario.interval - row = [] - for gc in gc_list: - gc_info = aggregate_timeseries(scenario, gc) - cs_power = gc_info['timeseries'] - sum_cs_power = cs_power[i][9] - row.append(sum_cs_power) - - csv_writer.writerow((i, t, ) + tuple(row)) - - -def plot(scenario, args): - print('Done. Create plots...') - - xlabels = [] - for r in scenario.results: - xlabels.append(r['current_time']) - - # batteries - if scenario.batteryLevels: - plots_top_row = 3 - ax = plt.subplot(2, plots_top_row, 3) - ax.set_title('Batteries') - ax.set(ylabel='Stored power in kWh') - for name, values in scenario.batteryLevels.items(): - ax.plot(xlabels, values, label=name) - ax.legend() - else: - plots_top_row = 2 - - # vehicles - ax = plt.subplot(2, plots_top_row, 1) - ax.set_title('Vehicles') - ax.set(ylabel='SoC') - lines = ax.plot(xlabels, scenario.socs) - # reset color cycle, so lines have same color - ax.set_prop_cycle(None) - - ax.plot(xlabels, scenario.disconnect, '--') - if len(scenario.constants.vehicles) <= 10: - ax.legend(lines, sorted(scenario.constants.vehicles.keys())) - - # charging stations - ax = plt.subplot(2, plots_top_row, 2) - ax.set_title('Charging Stations') - ax.set(ylabel='Power in kW') - lines = ax.step(xlabels, scenario.sum_cs, where='post') - if len(scenario.constants.charging_stations) <= 10: - ax.legend(lines, sorted(scenario.constants.charging_stations.keys())) - - # total power - ax = plt.subplot(2, 2, 3) - ax.step(xlabels, list([sum(cs) for cs in scenario.sum_cs]), label="CS", where='post') - gc_ids = scenario.constants.grid_connectors.keys() - for gcID in gc_ids: - for name, values in scenario.loads[gcID].items(): - ax.step(xlabels, values, label=name, where='post') - # draw schedule - if scenario.strat.uses_window: - for gcID, schedule in scenario.gcWindowSchedule.items(): - if all(s is not None for s in schedule): - # schedule exists - window_values = [v * int(max(scenario.totalLoad[gcID])) for v in schedule] - ax.step(xlabels, window_values, label="window {}".format(gcID), - linestyle='--', where='post') - if scenario.strat.uses_schedule: - for gcID, schedule in scenario.gcPowerSchedule.items(): - if any(s is not None for s in schedule): - ax.step(xlabels, schedule, label="Schedule {}".format(gcID), where='post') - - ax.step(xlabels, scenario.all_totalLoad, label="Total", where='post') - ax.set_title('Power') - ax.set(ylabel='Power in kW') - ax.legend() - ax.xaxis_date() # xaxis are datetime objects - - # price - ax = plt.subplot(2, 2, 4) - prices = list(zip(*scenario.prices.values())) - lines = ax.step(xlabels, prices, where='post') - ax.set_title('Price for 1 kWh') - ax.set(ylabel='€') - if len(gc_ids) <= 10: - ax.legend(lines, sorted(gc_ids)) - - # figure title - fig = plt.gcf() - fig.suptitle('Strategy: {}'.format(scenario.strat.description), fontweight='bold') - - # fig.autofmt_xdate() # rotate xaxis labels (dates) to fit - # autofmt removes some axis labels, so rotate by hand: - for ax in fig.get_axes(): - ax.set_xlim(scenario.start_time, scenario.stop_time) - plt.setp(ax.get_xticklabels(), rotation=30, ha='right') - - # set size of figure and save it - plt.gcf().set_size_inches(10, 10) - plt.savefig(args.output_directory / "run_overview.png") - plt.savefig(args.output_directory / "run_overview.pdf") - # plt.show() + csv_writer.writerow(["time", ] + gc_list) + stations = [] + time_col = getattr(scenario, f"{gc_list[0]}_timeseries")["time"] + for i in range(len(time_col)): + time_col[i] = time_col[i].isoformat() + stations.append(time_col) + for gc in gc_list: + stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid power [kW]"]]) + gc_power_overview = list(map(list, zip(*stations))) + csv_writer.writerows(gc_power_overview) def generate(schedule, scenario, args): + """Generates all output files/ plots and saves them in the output directory. + + :param schedule: Driving schedule for the simulation. + :type schedule: eBus-Toolbox.Schedule + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ # generate csv out of vehicle's socs generate_vehicle_socs(scenario, args) @@ -163,11 +125,16 @@ def generate(schedule, scenario, args): generate_station_name_json(scenario, args) # generate cs power overview - generate_cs_power_overview(scenario, args) + generate_gc_power_overview(scenario, args) # save plots as png and pdf aggregate_global_results(scenario) - plot(scenario, args) + with plt.ion(): # make plotting temporarily interactive, so plt.show does not block + plot(scenario) + plt.gcf().set_size_inches(10, 10) + plt.savefig(args.output_directory / "run_overview.png") + plt.savefig(args.output_directory / "run_overview.pdf") + plt.close() rotation_infos = [] From 58e81e4ede47061a052ebf7381c46374fdbb0c7c Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 9 Dec 2022 19:43:18 +0100 Subject: [PATCH 384/802] Correct flake8 warnings #39 --- ebus_toolbox/report.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 2fc54a7b..45254f73 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -46,7 +46,8 @@ def generate_vehicle_socs(scenario, args): def generate_station_name_csv(scenario, args): - """Generates a csv file from the grid connectors and their header information in the specified simulation time. + """Generates a csv file from the grid connectors + and their header information in the specified simulation time. :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario @@ -65,7 +66,8 @@ def generate_station_name_csv(scenario, args): def generate_station_name_json(scenario, args): - """Generates a json file from the grid connectors and their header information in the specified simulation time. + """Generates a json file from the grid connectors + and their header information in the specified simulation time. :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario @@ -82,7 +84,8 @@ def generate_station_name_json(scenario, args): def generate_gc_power_overview(scenario, args): - """Generates a csv file from each grid connectors summed up charging station power in the specified simulation time. + """Generates a csv file from each grid connectors summed up + charging station power in the specified simulation time. :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario From b762f605462367237c2f424d747f3d45f7384b1e Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Sat, 10 Dec 2022 10:07:33 +0100 Subject: [PATCH 385/802] Add new function generate_gc_overview #39 --- ebus_toolbox/report.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 45254f73..9e92daec 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -83,7 +83,7 @@ def generate_station_name_json(scenario, args): json.dump(gc_info, f, indent=2) -def generate_gc_power_overview(scenario, args): +def generate_gc_power_overview_timeseries(scenario, args): """Generates a csv file from each grid connectors summed up charging station power in the specified simulation time. @@ -109,6 +109,36 @@ def generate_gc_power_overview(scenario, args): csv_writer.writerows(gc_power_overview) +def generate_gc_overview(schedule, scenario, args): + """Generates a csv file where each line an electrified station's maximum power + and maximum number of charging stations is shown. + + :param schedule: Driving schedule for the simulation. + :type schedule: eBus-Toolbox.Schedule + :param scenario: Scenario for with to generate timeseries. + :type scenario: spice_ev.Scenario + :param args: Configuration arguments specified in config files contained in configs directory. + :type args: argparse.Namespace + """ + + all_gc_list = list(schedule.stations.keys()) + used_gc_list = list(scenario.constants.grid_connectors.keys()) + + with open(args.output_directory / "gc_overview.csv", "w", newline='') as f: + csv_writer = csv.writer(f) + csv_writer.writerow(["Maximum power", "Maximum Nr charging stations"]) + for gc in all_gc_list: + if gc in used_gc_list: + station_name = f"{gc}_timeseries" + ts = getattr(scenario, station_name) + max_gc_power = -min(ts["grid power [kW]"]) + max_nr_cs = max(ts["# occupied CS"]) + else: + max_gc_power = 0 + max_nr_cs = 0 + csv_writer.writerow([max_gc_power, max_nr_cs]) + + def generate(schedule, scenario, args): """Generates all output files/ plots and saves them in the output directory. @@ -127,8 +157,11 @@ def generate(schedule, scenario, args): generate_station_name_csv(scenario, args) generate_station_name_json(scenario, args) - # generate cs power overview - generate_gc_power_overview(scenario, args) + # generate gc power overview + generate_gc_power_overview_timeseries(scenario, args) + + # generate gc overview + generate_gc_overview(schedule, scenario, args) # save plots as png and pdf aggregate_global_results(scenario) From c7508834e0eb891279d9bd5b2664c4174ce51be3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 12 Dec 2022 15:53:30 +0100 Subject: [PATCH 386/802] Add schedule and scenario to config, pass through upper and lower thresholds --- data/examples/optimizer.cfg | 29 +++--- ebus_toolbox/optimizer.py | 170 +++++++++++++++++++++++------------- ebus_toolbox/simulate.py | 8 +- 3 files changed, 129 insertions(+), 78 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 9fc63ab4..e2696d03 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -5,31 +5,34 @@ debug_level=0 [SCENARIO] # Use "" for ids and not '' exclusion_rots = [] -#["1000031","6891224", "6891223", "6891222", "6891228", "6891226"] -#,"1000067","7025440","6891222","6891223","6891224","6891226","6891228"] -#["6891228", "6891223", "6895194", "7049422", "1000269", "6891224", "7049423", "6891226", "6895223", "1000278", "6891222", "6923844", "1000276", "1000106", "1000144", "1000184", "6895226"] exclusion_stations= [] inclusion_stations= [] -#["6650837", "1000579", "7042547", "6940321", "6975646", "6637000", "7042546", "7007025", "6986504", "6940341", "7194150", "6680580", "6891224", "6923844", "6680514", "6986519", "6985436", "1000269", "6985446", "1000184", "6975639", "6680530", "6986499", "7194046", "6985589", "6985431", "6938337", "6938332", "6986494", "6891223", "7042545", "6895223", "6891228", "6680523", "7049422", "6891226", "1000106", "6891222", "6986524", "6986509", "7194145", "6975648", "7007023", "6653824", "6975637", "6895194", "6895226", "6997330", "6986514", "7007024", "6680501", "7007022", "6650848", "7194155"] -#["SIRI01B", "KLNG01B", "SUJH01B", "FLKP01B", "SERZ01B", "UKRL03B", "SDKI03B", "SUSP01B", "UBRS01B", "BER102B", "BUSS01B", "GALS01B", "ALTG02B", "MGGW02B", "SGD02B", "LINH02B", "SURZ23B", "DAHV03B", "BFAE01B", "NOSS01B", "ZIRI03BS", "MAWI01B", "KDSG01B", "ZFHF01B", "SWEL01B", "UEWP02B", "MKZE02B", "UTM07B", "REIM01B", "MEBR01B", "UMOH01B", "UKSP02B", "LUTH01B", "UOSL04B", "FKB03BS", "SLIS02B", "VOUL01B", "MAST04B", "SHDF03B", "SLR07BA", "WFDA01B", "STAS01B", "UHP04BN", "SELS01B", "WERS01B", "SNP01B", "STUT04B", "UMM01B", "BER105B", "ANDZ01B", "UHPU02B", "SUTF01B", "MHDO02B", "SHEN01B", "HAWR01B", "NRPP01B", "SMF03B", "HBF11B", "NAHM04B", "SULB01B", "HOTT01B", "UEWP05B", "UVIN14B", "TITI01B", "AUBT01B", "UDD04B", "MABA02B", "ULEO01B", "SGD01B", "SFOH01B", "NAHM05B", "TEWA03B", "GUTS01B", "UAMD01B", "WOSM01B", "UEWP04B", "HNBG01B", "ALTL01B", "SKD05B", "SUHM04B", "ADMH01B", "KDFS01B", "UTRE01B", "SURZ04B", "PRPL11B", "SBU02B", "AHGR01B", "HENH01B", "JOST01B", "GOST01B", "UFI02B", "PIET06BA", "SIW501B", "SNIK01B", "KOET01B", "ALHS01B", "HBF01B", "SABS01B", "RSNE01B", "SMDF12B", "SMZ07B", "UHPK01B", "SKA01B", "ZOOH01B", "MKZE03B", "SAF01B", "AUBT04B", "AHGR02B", "BER508B", "SSWS17BA", "KHDW01B", "RIGT06BS", "UHAS05B", "USTM09B", "AMOM04B", "TSTR01B", "SUHM09B", "SMNO01B", "UPBA03B", "SULB10B", "MAST06B", "PSDG11BA", "URUD17B", "UMED03B", "SLIS01B", "UAMD06B", "SBAW04B", "UHAS03B", "URUH07B", "FKB01B", "WIDA01B", "ALKL02B", "HBPL01B", "PPAS02B", "OTFR01B", "UFWP01B", "SLBN01B", "UJTC04B", "TORT01B", "INVA01B", "BRIX01B", "SLR09BA", "APPZ03B", "SEYD02B", "URUD04B", "MGGW01B", "SUSP04B", "CMPB01B", "SOSB04B", "ZITT02B", "HAST01B", "SLIS06B", "ISSZ01B", "NEHM03B", "NHRY01B", "HADL01B", "STBH01B", "UBER01B", "TERB04B", "SZEP01B", "GEZE01B", "APPZ07B", "UOHH09B", "FDDM01B", "WKHS03B", "HOTT02B", "SWS03B", "EIPU01B", "SGA02B", "GUTS04B", "SSWS16BA", "SOSB01B", "BER506B", "BFI10BS", "RCHT01B", "UAMD02B", "UKDN06B", "KLCL02B", "ODNH01B", "WKHS02B", "MADF02B", "UWSC01B", "DILL01B", "AMRH04BA", "FOHA01B", "WWSP01B", "FEZ07BS", "SGA08B", "UHP06B", "UWSP03B", "KRNB01B", "QUIB01B", "WIDA02B", "SWS01B", "PCJS02B", "BER505B"] -# 1202 142636:Optimized with 66 stations #################### ['AHGR02B', 'APPZ07B', 'AUBT04B', 'BER102B', 'BER506B', 'BER508B', 'BFAE01B', 'BRIX01B', 'BUSS01B', 'CMPB01B', 'GEZE01B', 'HADL01B', 'HAWR01B', 'HBF01B', 'HBF11B', 'KDFS01B', 'KOET01B', 'MAST04B', 'MGGW01B', 'MGGW02B', 'MHDO02B', 'NOSS01B', 'ODNH01B', 'PIET06BA', 'PPAS02B', 'PRPL11B', 'RSNE01B', 'SABS01B', 'SBU02B', 'SKA01B', 'SKD05B', 'SLIS02B', 'SLR07BA', 'SMDF12B', 'SMZ07B', 'SSS02B', 'SSWS16BA', 'SSWS17BA', 'STUT04B', 'SUHM04B', 'SUJH01B', 'SULB01B', 'SULB10B', 'SURZ23B', 'SWEL01B', 'TSTR01B', 'UBER01B', 'UBRS01B', 'UDD04B', 'UEWP02B', 'UEWP04B', 'UEWP05B', 'UHP04BN', 'UHP06B', 'UHPU02B', 'UKDN06B', 'UKRL03B', 'UMM01B', 'UMOH01B', 'UOSL04B', 'USTM09B', 'UWSP03B', 'VOUL01B', 'WKHS03B', 'WSTR01B', 'ZOOH01B'] -# 1202 142745:Optimized with 66 stations #################### ['AHGR02B', 'APPZ07B', 'AUBT04B', 'BER102B', 'BER506B', 'BER508B', 'BFAE01B', 'BRIX01B', 'BUSS01B', 'CMPB01B', 'EIPU01B', 'GEZE01B', 'HADL01B', 'HAWR01B', 'HBF01B', 'HBF11B', 'KDFS01B', 'KOET01B', 'MAST04B', 'MGGW01B', 'MGGW02B', 'MHDO02B', 'NOSS01B', 'ODNH01B', 'PIET06BA', 'PPAS02B', 'PRPL11B', 'RSNE01B', 'SABS01B', 'SBU02B', 'SKA01B', 'SKD05B', 'SLIS02B', 'SLR07BA', 'SMDF12B', 'SMZ07B', 'SSS02B', 'SSWS16BA', 'SSWS17BA', 'STUT04B', 'SUHM04B', 'SUJH01B', 'SULB01B', 'SULB10B', 'SURZ23B', 'SWEL01B', 'TSTR01B', 'UBER01B', 'UBRS01B', 'UDD04B', 'UEWP02B', 'UEWP04B', 'UEWP05B', 'UHP04BN', 'UHP06B', 'UHPU02B', 'UKDN06B', 'UKRL03B', 'UMM01B', 'UMOH01B', 'UOSL04B', 'USTM09B', 'UWSP03B', 'VOUL01B', 'WKHS03B', 'ZOOH01B'] -# 1202 142758:Optimized with 66 stations #################### ['AHGR02B', 'ALXM11BA', 'APPZ07B', 'AUBT04B', 'BER506B', 'BER508B', 'BFAE01B', 'BRIX01B', 'BUSS01B', 'CMPB01B', 'EIPU01B', 'GEZE01B', 'HADL01B', 'HAWR01B', 'HBF01B', 'HBF11B', 'KDFS01B', 'KOET01B', 'MAST04B', 'MGGW01B', 'MGGW02B', 'MHDO02B', 'NOSS01B', 'ODNH01B', 'PIET06BA', 'PPAS02B', 'PRPL11B', 'RSNE01B', 'SABS01B', 'SBU02B', 'SKA01B', 'SKD05B', 'SLIS02B', 'SLR07BA', 'SMDF12B', 'SMZ07B', 'SSS02B', 'SSWS16BA', 'SSWS17BA', 'STUT04B', 'SUHM04B', 'SUJH01B', 'SULB01B', 'SULB10B', 'SURZ23B', 'SWEL01B', 'TSTR01B', 'UBER01B', 'UBRS01B', 'UDD04B', 'UEWP02B', 'UEWP04B', 'UEWP05B', 'UHP04BN', 'UHP06B', 'UHPU02B', 'UKDN06B', 'UKRL03B', 'UMM01B', 'UMOH01B', 'UOSL04B', 'USTM09B', 'UWSP03B', 'VOUL01B', 'WKHS03B', 'ZOOH01B'] +standard_opp_station={"type": "opps", "n_charging_stations": 200} +#Buffered +#["0310a_2", "0310a_3", "0310a_4", "0310a_5", "0413_3", "6310b_6"] +#Spice Ev +#['0717_2', '0310a_5', '7003_7', '0413_3', '0310a_2', '0413_4', '0717_4', '7310a_7', '0310a_3', '0717_5', '6003_6', '0310a_4', '6310b_6', '0413_5', '0717_3'] +# BVG +#["1000031","6891224", "6891223", "6891222", "6891228", "689126"] +[PICKLE] +schedule=schedule_buffered_depots_utf.pickle +scenario=scenario_buffered_depots_utf.pickle +args=args_buffered_utf.pickle [VEHICLE] charge_eff = 0.95 -#battery_capacity = 400 -#charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] -#charging_power = 300 -min_soc=0.00 +# battery_capacity = 400 +# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +# charging_power = 250 +# min_soc=0.05 [OPTIMIZER] # "quick" or "spiceev" solver = quick rebase_scenario = False -run_only_neg=True +run_only_neg=False remove_impossible_rots=False # "greedy" or "deep" without "" opt_type = greedy diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 9bfd659c..7e93a080 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -50,18 +50,15 @@ def setup_logger(): logger.addHandler(stream_handler) return logger -with open("args_buffered.pickle", "rb") as f: args = pickle.load(f) -with open("scenario_buffered_electrified.pickle", "rb") as f: scen = pickle.load(f) -with open("schedule_buffered_electrified.pickle", "rb") as f: sched = pickle.load(f) +args = None +scen = None +sched = None config = None ROT = None timers = [0] * 10 -del args.save_timeseries -del args.save_results - def main(): # run_optimization(sched, scen, args, config_path) @@ -86,6 +83,24 @@ def main(): config = read_config(config_path) logger = setup_logger() + # Load pickle files + + with open(config.args, "rb") as f: + global args + args = pickle.load(f) + with open(config.scenario, "rb") as f: + global scen + scen = pickle.load(f) + with open(config.schedule, "rb") as f: + global sched + sched = pickle.load(f) + + # Dont create these results, since they are not used + del args.save_timeseries + del args.save_results + + args.desired_soc_deps = 1 + # which rotations should be excluded? exclusion_rots = config.exclusion_rots @@ -139,7 +154,6 @@ def main(): if args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") not_possible_stations = inclusion_stations.union(exclusion_stations) @@ -148,18 +162,18 @@ def main(): if rebase_scenario: logger.debug(f"Spice EV Rebasing Scenario") new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - this_sched, args, + this_sched, this_scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing took {time() - s} sec") - with open("schedule_rebased_buffered.pickle", "wb") as file: - pickle.dump(new_sched, file) - with open("scenario_rebased_buffered.pickle", "wb") as file: - pickle.dump(new_scen, file) - with open("args_rebased_buffered.pickle", "wb") as file: - pickle.dump(args, file) + # with open("schedule_rebased_buffered.pickle", "wb") as file: + # pickle.dump(new_sched, file) + # with open("scenario_rebased_buffered.pickle", "wb") as file: + # pickle.dump(new_scen, file) + # with open("args_rebased_buffered.pickle", "wb") as file: + # pickle.dump(args, file) else: - with open(args.electrified_stations, "r") as file: + with open(args.electrified_stations, "r", encoding="utf-8",) as file: ele_stations = json.load(file) ele_station_set = set() # Electrify inclusion stations @@ -189,7 +203,7 @@ def main(): logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=config.desired_soc_opps, soc_lower_thresh=config.min_soc, + not_possible_stations, soc_upper_thresh=args.desired_soc_opps, soc_lower_thresh=config.min_soc, solver=solver, opt_type=opt_type, node_choice=node_choice, soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) @@ -208,7 +222,7 @@ def main(): logger.warning("Removing impossible rots, rebasing and restarting optimization") exclusion_rots.update(could_not_be_electrified) new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - this_sched, args, + this_sched, this_scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=False) @@ -221,7 +235,7 @@ def main(): new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, ele_station_set, - soc_charge_curve_dict=soc_charge_curve_dict) + soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, new_sched, soc_lower_thresh=config.min_soc) # plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) # q = get_rotation_soc(ROT, new_sched, new_scen)[0] @@ -233,21 +247,21 @@ def main(): global timers logger.debug(timers) - with open(new_ele_stations_path, "w") as file: + with open(new_ele_stations_path, "w", encoding="utf-8",) as file: json.dump(ele_stations, file, indent=2) logger.debug(f"Spice EV is calculating optimized case as a complete scenario") - new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - this_sched, args, electrified_stations=ele_stations, run_only_neg=False, + final_sched, final_scen, ele_station_set, ele_stations = preprocessing_scenario( + this_sched, this_scen, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set) # ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) # ax.plot(q) - logger.warning(f"Still negative rotations:{new_sched.get_negative_rotations(new_scen)}") + logger.warning(f"Still negative rotations:{final_sched.get_negative_rotations(final_scen)}") print("Finished") print(f"Opt took {time() - t}") - return new_sched, new_scen + return final_sched, final_scen timer_for_calc = 0 @@ -268,21 +282,12 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n base_sched = copy(new_sched) ########### - # Make sure no None values exists in SOCs. Fill later values with last value - # which was not None - for id, soc in base_scen.vehicle_socs.items(): - soc = np.array(soc) - if None in soc: - for ii in range(len(soc) - 1, -1, -1): - if soc[ii] is not None: - last_not_none = soc[ii] - break - soc[soc == np.array(None)] = last_not_none - base_scen.vehicle_socs[id] = soc + # Remove none Values from socs in the vehicle_socs an + remove_none_socs(base_scen) # Get events where soc fell below 0. The events contain info about the problematic # timespan, which includes stations which could provide a soc lift - events = get_below_zero_soc_events(this_scen=base_scen, + base_events = get_below_zero_soc_events(this_scen=base_scen, rotations=list(new_sched.rotations.keys()), this_sched=base_sched, soc_upper_thresh=soc_upper_thresh, filter_standing_time=True, @@ -291,16 +296,18 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # Check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible - groups = get_groups_from_events(events, not_possible_stations) + groups = get_groups_from_events(base_events, not_possible_stations) # Baseline greedy Optimization list_greedy_sets = [set()] * len(groups) - new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, electrified_station_set, - soc_charge_curve_dict=soc_charge_curve_dict) - new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, new_sched,soc_lower_thresh=soc_lower_thresh) + soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) + + + new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, + new_sched,soc_lower_thresh=soc_lower_thresh) ############### # rot='1000097' @@ -534,7 +541,7 @@ def group_optimization_quick(group, base_scen, base_sched, new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, - new_scen, electrified_station_set, soc_curve_dict) + new_scen, electrified_station_set, soc_curve_dict, soc_upper_thresh=args.desired_soc_deps) lifted_socs = deepcopy(new_scen.vehicle_socs) global timer_for_calc @@ -609,7 +616,7 @@ def group_optimization_quick(group, base_scen, base_sched, new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, new_scen, electrified_station_set, - soc_curve_dict) + soc_curve_dict, soc_upper_thresh=args.desired_soc_deps) prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, new_sched, @@ -750,14 +757,14 @@ def group_optimization(group, base_scen, base_sched, return electrified_stations -def preprocessing_scenario(this_sched, this_args, +def preprocessing_scenario(this_sched, this_scen, this_args, inclusion_stations=set(), electrified_stations=None, electrified_station_set=set(), exclusion_rots=set(), run_only_neg=False): if electrified_stations is None: - with open(this_args.electrified_stations, "r") as f: + with open(this_args.electrified_stations, "r", encoding="utf-8",) as f: electrified_stations = json.load(f) # Electrify inclusion stations @@ -766,7 +773,7 @@ def preprocessing_scenario(this_sched, this_args, # Calc new but only prev. negative rotations if run_only_neg: - rots = this_sched.get_negative_rotations(scen) + rots = this_sched.get_negative_rotations(this_scen) rots = {r: this_sched.rotations[r] for r in rots if r not in exclusion_rots} this_sched.rotations = rots else: @@ -811,6 +818,21 @@ def plot_(data): ax.plot(data, linewidth=2.0) return ax +def plot_rot(id,this_sched,this_scen, ax=None, rot_only=True): + """ Simple plot of data without having to create subplots""" + a,b,c=get_rotation_soc(id,this_sched,this_scen) + if not rot_only: + b=0 + c=-1 + if ax==None: + fig, ax = plt.subplots() + ax.plot(a[b:c], linewidth=2.0) + return ax + else: + ax.plot(a[b:c], linewidth=2.0) + return ax + + def join_all_subsets(subsets): joined_subset = True @@ -901,9 +923,8 @@ def choose_station_step_by_step(station_eval, electrified_station_set, def stations_hash(stations_set): return str(sorted(list(stations_set))) - def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, - soc_charge_curve_dict): + soc_charge_curve_dict, soc_upper_thresh=1): global timers ele_stations = set([*ele_station_set, station]) s2 = time() @@ -933,10 +954,13 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc[idx + buffer_idx:idx + buffer_idx + delta_idx] = old_soc soc[idx + buffer_idx:idx + buffer_idx + delta_idx] += np.linspace(0, d_soc, delta_idx) + + soc_pre=soc[:idx] + soc=soc[idx:] soc_max = np.max(soc) timers[0] += time() - s s = time() - while soc_max > 1: + while soc_max > soc_upper_thresh: desc = np.arange(len(soc), 0, -1) diff = np.hstack((np.diff(soc), -1)) # masking of socs >1 and negative gradient for local maximum @@ -949,6 +973,7 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, # Capping everything before local maximum soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 soc_max = np.max(soc) + soc = np.hstack((soc_pre, soc)) timers[1] += time() - s soc_dict[rot.vehicle_id] = soc timers[3] += (time() - s2) * 100 @@ -1228,7 +1253,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr time = 0 socs = [] times = [] - while soc < config.desired_soc_opps: + while soc < args.desired_soc_opps: times.append(time) socs.append(soc) power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), @@ -1241,7 +1266,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr time += timestep # Fill the soc completely in last timestep times.append(time) - socs.append(config.desired_soc_opps) + socs.append(args.desired_soc_opps) return np.array((times, socs)).T @@ -1251,19 +1276,19 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta): # First element which is bigger than current soc if time_delta == 0: return 0 - soc = max(min(config.desired_soc_opps,soc), 0) + soc = max(min(args.desired_soc_opps,soc), 0) first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] second_time = first_time + time_delta # Catch out of bounds if time of charging end is bigger than table values if second_time >= soc_over_time_curve[-1, 0]: - end_soc = config.desired_soc_opps + end_soc = args.desired_soc_opps else: end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] # Make sure to limit delta soc to 1 if negative socs are given. They are possible during # the optimization process but will be continuously raised until they are >0. - return min(config.desired_soc_opps, end_soc - start_soc) + return min(args.desired_soc_opps, end_soc - start_soc) def get_buffer_time_old(search_time, args): @@ -1280,7 +1305,7 @@ def get_buffer_time_old(search_time, args): def electrify_station(stat, stations, electrified_set): - stations[stat] = {'type': 'opps', 'n_charging_stations': 200} + stations[stat] = config.standard_opp_station electrified_set.add(stat) @@ -1305,10 +1330,17 @@ def __init__(self): conf = Config() default = config_parser["DEFAULT"] conf.debug_level = int(default.get("debug_level", 0)) - scenario = config_parser["SCENARIO"] - conf.exclusion_rots = set(json.loads(scenario.get("exclusion_rots", "[]"))) - conf.exclusion_stations = set(json.loads(scenario.get("exclusion_stations", "[]"))) - conf.inclusion_stations = set(json.loads(scenario.get("inclusion_stations", "[]"))) + sce = config_parser["SCENARIO"] + conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) + conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) + conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) + conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) + + pi = config_parser["PICKLE"] + + conf.schedule = pi.get("schedule", "") + conf.scenario = pi.get("scenario", "") + conf.args = pi.get("args", "") vehicle = config_parser["VEHICLE"] conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) @@ -1322,10 +1354,7 @@ def __init__(self): if conf.charging_power==0: conf.charging_power=None conf.min_soc = float(vehicle.get("min_soc", 0.0)) - try: - conf.desired_soc_opps=args.desired_soc_opps - except: - conf.desired_soc_opps=1 + optimizer = config_parser["OPTIMIZER"] @@ -1363,6 +1392,25 @@ def outer_group_optimzation(pack, not_possible_stations): not_possible_stations, pre_optimized_set=pre_optimized_set) return electrified_station_set.copy() +def remove_none_socs(base_scen): + # Make sure no None values exists in SOCs. Fill later values with last value + # which was not None + for id, soc in base_scen.vehicle_socs.items(): + soc = np.array(soc) + if None in soc: + for ii in range(len(soc) - 1, -1, -1): + if soc[ii] is not None: + last_not_none = soc[ii] + break + soc[soc == np.array(None)] = last_not_none + base_scen.vehicle_socs[id] = soc + +def get_vehicle(id, sched): + return sched.rotations[id].vehicle_id + +def get_vehicle_rots(id, sched): + return [rot for rot in sched.rotations if id == get_vehicle(rot, sched)] + if __name__ == "__main__": freeze_support() diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 710983ea..cc0e01da 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -25,7 +25,7 @@ def simulate(args): # load stations file try: - with open(args.electrified_stations) as f: + with open(args.electrified_stations, encoding='UTF-8') as f: stations = util.uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to electrified stations ({args.electrified_stations}) " @@ -92,11 +92,11 @@ def simulate(args): print(f"Investment cost: {cost_invest} €. Total annual cost: {cost_annual} €.") import pickle - with open("schedule_buffered_depots.pickle", "wb") as f: + with open("schedule_buffered_depots_short_utf.pickle", "wb") as f: pickle.dump(schedule, f) - with open("scenario_buffered_depots.pickle", "wb") as f: + with open("scenario_buffered_depots_short_utf.pickle", "wb") as f: pickle.dump(scenario, f) - with open("args_buffered.pickle", "wb") as f: + with open("args_buffered_short_utf.pickle", "wb") as f: pickle.dump(args, f) print("pickled") From bd611c7799a8c15db3498ce17e254f620b7217df Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 12 Dec 2022 15:54:29 +0100 Subject: [PATCH 387/802] remove no optimization func --- ebus_toolbox/optimizer.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 7e93a080..7c06992f 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -808,10 +808,6 @@ def combination_generator(iterable, amount: int): yield [item] + gen -def no_optimization(): - return "converged" - - def plot_(data): """ Simple plot of data without having to create subplots""" fig, ax = plt.subplots() From 120618824505935605d6fd4a81543004457d45a4 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 12 Dec 2022 23:12:16 +0100 Subject: [PATCH 388/802] Add exclude rotation filter functionality #30 --- ebus_toolbox/__main__.py | 3 +++ ebus_toolbox/simulate.py | 31 +++++++++++++++++++++++++++++++ ebus_toolbox/util.py | 10 ++++++++++ 3 files changed, 44 insertions(+) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 89e25b74..f9334d3c 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -121,6 +121,9 @@ args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True + args.rotation_filter_variable = "" + args.rotation_filter = "" + util.set_options_from_config(args, check=True, verbose=False) args.output_directory = Path(args.output_directory) / \ diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 19540f68..d14d27f9 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,6 +62,37 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() + + # read filter rotation file + if args.rotation_filter_variable: + try: + with open(args.rotation_filter, encoding='utf-8') as f: + # TODO: file zu dict umwandeln + rotation_filter = util.file_wrapper_to_dict(f) + print(rotation_filter) + except FileNotFoundError: + print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") + + # TODO: filter rotations + if args.rotation_filter_variable == "exclude_rotation": + excluding_rotations = rotation_filter + for rotation in rotation_filter: + if rotation in rotation_filter: + try: + schedule.rotations.pop(rotation['rotation_id']) + except KeyError: + print(f"Key of rotation {rotation['rotation_id']} does not exist in schedule.") + elif args.rotation_filter_variable == "include_rotation": + included_rotations = rotation_filter + staying_rotations = dict() + for rot_filter in rotation_filter: + for rot_schedule in schedule.rotations: + if rot_filter == rot_schedule: + staying_rotations.update(rot_schedule) + + + + # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 7771ab9e..e6748a8e 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -3,6 +3,16 @@ import subprocess +def file_wrapper_to_dict(f): + line = f.readline() + header = line.split(",") + return_dict = {} + line = f.readline().split(",") + for key, value in zip(header, line): + return_dict[key] = value + return [return_dict] + + def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() From 2a70ebf415a443dd5f4586d657f8232049007b64 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 12 Dec 2022 23:14:52 +0100 Subject: [PATCH 389/802] Correct flake8 warnings #30 --- ebus_toolbox/simulate.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index d14d27f9..37b60cc1 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,7 +62,6 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() - # read filter rotation file if args.rotation_filter_variable: try: @@ -75,24 +74,20 @@ def simulate(args): # TODO: filter rotations if args.rotation_filter_variable == "exclude_rotation": - excluding_rotations = rotation_filter for rotation in rotation_filter: if rotation in rotation_filter: try: schedule.rotations.pop(rotation['rotation_id']) except KeyError: - print(f"Key of rotation {rotation['rotation_id']} does not exist in schedule.") + print(f"Key of rotation {rotation['rotation_id']} " + f"does not exist in schedule.") elif args.rotation_filter_variable == "include_rotation": - included_rotations = rotation_filter staying_rotations = dict() for rot_filter in rotation_filter: for rot_schedule in schedule.rotations: if rot_filter == rot_schedule: staying_rotations.update(rot_schedule) - - - # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] From 6de525b19644114f6102e0257a15f9bf27bcc1c1 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Dec 2022 13:41:23 +0100 Subject: [PATCH 390/802] Merge group optimization ev and quick and add gogs dir to gitignore --- .gitignore | 2 + data/examples/optimizer.cfg | 5 +- ebus_toolbox/optimizer.py | 294 +++++++++++++++++++++++++++++++----- 3 files changed, 261 insertions(+), 40 deletions(-) diff --git a/.gitignore b/.gitignore index 22889a19..14310888 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,7 @@ docs/source/temp data/private_examples data/sim_outputs data/preprocessing_scripts +data/gogs_buffered + src/ *.bak \ No newline at end of file diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index e2696d03..2c2c297a 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -6,7 +6,7 @@ debug_level=0 # Use "" for ids and not '' exclusion_rots = [] exclusion_stations= [] -inclusion_stations= [] +inclusion_stations= ["Bensheim Bahnhof/ ZOB","Heppenheim Bahnhof"] standard_opp_station={"type": "opps", "n_charging_stations": 200} #Buffered #["0310a_2", "0310a_3", "0310a_4", "0310a_5", "0413_3", "6310b_6"] @@ -32,6 +32,8 @@ charge_eff = 0.95 # "quick" or "spiceev" solver = quick rebase_scenario = False +pickle_rebased= False +pickle_rebased_name=buffered_rebase_12_12 run_only_neg=False remove_impossible_rots=False # "greedy" or "deep" without "" @@ -43,6 +45,7 @@ estimation_threshold = 0.80 + [SPECIAL] decision_tree_path = "" save_decision_tree = False diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 7c06992f..9e12cbc1 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -85,20 +85,16 @@ def main(): # Load pickle files - with open(config.args, "rb") as f: - global args - args = pickle.load(f) - with open(config.scenario, "rb") as f: - global scen - scen = pickle.load(f) - with open(config.schedule, "rb") as f: - global sched - sched = pickle.load(f) + global args + global scen + global sched + sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario,config.args ) # Dont create these results, since they are not used del args.save_timeseries del args.save_results + # TodO implement in fast calc args.desired_soc_deps = 1 # which rotations should be excluded? @@ -166,12 +162,8 @@ def main(): inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing took {time() - s} sec") - # with open("schedule_rebased_buffered.pickle", "wb") as file: - # pickle.dump(new_sched, file) - # with open("scenario_rebased_buffered.pickle", "wb") as file: - # pickle.dump(new_scen, file) - # with open("args_rebased_buffered.pickle", "wb") as file: - # pickle.dump(args, file) + if config.pickle_rebased: + toolbox_to_pickle(config.pickle_reabses_name, new_sched,new_scen, args) else: with open(args.electrified_stations, "r", encoding="utf-8",) as file: ele_stations = json.load(file) @@ -338,9 +330,9 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() - print(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") + logger.warning(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") logger.warning(linien) - print(len(events), "events") + logger.warning("%s events", (len(events))) solver = kwargs.get("solver", "spiceev") node_choice = kwargs.get("stationsnode_choice", "step-by-step") if node_choice == "brute": @@ -350,7 +342,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n if solver == "quick": # first run is always step by step - group_optimization_quick(group, base_scen, base_sched, + group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_step_by_step, soc_charge_curve_dict, @@ -414,12 +406,12 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n logger.debug(sols) else: # use spiceev - group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations, - soc_charge_curve_dict, - pre_optimized_set=None, - decision_tree=decision_tree, brute=False, **kwargs) + group_optimization_ev(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, not_possible_stations, + soc_charge_curve_dict, + pre_optimized_set=None, + decision_tree=decision_tree, brute=False, **kwargs) list_greedy_sets[group_nr] = electrified_station_set.copy() logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), @@ -465,6 +457,182 @@ def get_groups_from_events(events, not_possible_stations=set(), could_not_be_ele groups = list(zip(event_groups, station_subsets)) return sorted(groups, key=lambda x: len(x[1])) +def group_optimization(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, + not_possible_stations, choose_station_function, soc_curve_dict, + pre_optimized_set=None, decision_tree=None, + soc_lower_thresh=0,soc_upper_thresh=1, + tree_position=[],type="spiceev", **kwargs): + # Give treeposition + logger.debug("%s with length of %s", tree_position, len(tree_position)) + + # Unpack events and possible stations + event_group, possible_stations = group + + # Get the events which are still negative + events_remaining = kwargs.get("events_remaining", [99999]) + + # Copy Scen and sched and deepcopy vehicle socs so upper levels are not changed by the following + # optimization + new_scen = copy(base_scen) + new_sched = copy(base_sched) + # Copy stuff so base sched rotations are not touched + new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) + + # If the upper level lifted socs put them in the new scen. + lifted_socs = kwargs.get("lifted_socs", None) + if lifted_socs is not None: + new_scen.vehicle_socs = lifted_socs + + # Get rotations from event dict and calculate the missing energy + rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} + missing_energy = get_missing_energy(event_group) + + if missing_energy >= 0: + logger.debug("Already electrified: Returning set") + return electrified_stations, True + + station_eval = evaluate(event_group, new_scen, soc_curve_dict, + soc_upper_thresh=soc_upper_thresh, soc_lower_thresh=soc_lower_thresh) + + # Debug.Log the missing energy and station evaluation + station_eval_to_logger(missing_energy, station_eval) + + # Get the best stations, brute or step_by_step + best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, + pre_optimized_set, decision_tree, + missing_energy=missing_energy) + stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} + if best_station_ids is None: + logger.warning( + f"No useful station found with " + f"{events_remaining} rotations not electrified yet. " + f" Stopped after electrifying {len(electrified_station_set)}") + + if pre_optimized_set is not None: + # Remove electrified stations in this run + c = electrified_station_set.copy() + for stat in c: + electrified_stations.pop(stat) + electrified_station_set.remove(stat) + # Overwrite with preoptimized set + for stat in pre_optimized_set: + electrify_station(stat, electrified_stations, electrified_station_set) + else: + could_not_be_electrified.update(list(rotation_dict.keys())) + return None, False + logger.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) + + # Electrify station(s) + for stat_id in best_station_ids: + electrify_station(stat_id, electrified_stations, electrified_station_set) + + s = time() + + event_rotations = {x["rotation"] for x in event_group} + new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) + if type=="quick": + new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, + new_scen.vehicle_socs, + new_scen, electrified_station_set, soc_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + lifted_socs = deepcopy(new_scen.vehicle_socs) + else: + new_sched.rotations = rotation_dict + new_sched, new_scen = run_schedule(new_sched, args, + electrified_stations=electrified_stations) + lifted_socs=None + + + + global timer_for_calc + global timers + timer_for_calc += time() - s + timers[2] += time() - s + not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) + event_rotations_id = {event["rotation"].id for event in event_group} + new_events = get_below_zero_soc_events(new_scen, event_rotations_id, + new_sched, + soc_upper_thresh=soc_upper_thresh, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=soc_lower_thresh, relative_soc=True) + + delta_energy = get_missing_energy(new_events) + + events_remaining[0] -= len(event_group) - len(new_events) + logger.debug("Last electrification electrified %s/%s." + " %s remaining events in the base group.", + len(event_group) - len(new_events), len(event_group), events_remaining[0]) + # todo + delta_base_energy = delta_energy # get_missing_energy(base_events) + + # Put this node intro the decision tree including the missing energy + if decision_tree is not None: + decision_tree = node_to_tree(decision_tree,electrified_station_set, delta_base_energy) + + # Everything electrified + if delta_energy >= 0: + return electrified_stations, True + # Some choice functions might not need a recursive call, they return here. recursive is set + # by the choose_station_function + elif not recursive: + return None, True + + # Check if the events can be divided into subgroups which are independent + groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) + + for k, group in enumerate(groups): + this_tree = tree_position.copy() + this_tree.append(k) + new_stations, _ = group_optimization(group, base_scen, base_sched, + electrified_stations, + electrified_station_set, + could_not_be_electrified, + not_possible_stations, choose_station_function, + soc_curve_dict, + pre_optimized_set, decision_tree, + lifted_socs=lifted_socs, + events_remaining=events_remaining, + soc_lower_thresh=soc_lower_thresh, + soc_upper_thresh=soc_upper_thresh, + tree_position=this_tree, type=type) + + if new_stations is not None: + electrified_stations.update(new_stations) + else: + return None, True + + # Evaluate if following this branch makes sense + if pre_optimized_set is not None: + if len(pre_optimized_set) - len(electrified_station_set) < 10: + new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, + new_scen.vehicle_socs, + new_scen, electrified_station_set, + soc_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + + prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, + new_sched, + soc_upper_thresh=soc_upper_thresh, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=soc_lower_thresh, + relative_soc=True) + + station_eval = evaluate(prune_events, new_scen, soc_curve_dict, + soc_upper_thresh=soc_upper_thresh, + soc_lower_thresh=soc_lower_thresh) + prune_missing_energy = get_missing_energy(prune_events) + if not is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, prune_missing_energy): + print("Branch pruned early") + is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, missing_energy) + return None, True + + return electrified_stations, True def group_optimization_quick(group, base_scen, base_sched, electrified_stations, electrified_station_set, @@ -646,11 +814,25 @@ def get_missing_energy(events): return missing_energy -def group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, soc_curve_dict, pre_optimized_set=None, - decision_tree=None, - brute=False, **kwargs): +def node_to_tree(decision_tree,electrified_station_set, delta_base_energy): + node_name = stations_hash(electrified_station_set) + try: + decision_tree[node_name]["missing_energy"] = delta_base_energy + decision_tree[node_name]["visit_counter"] += 1 + # todo add is_viable + logger.debug("already visited") + except KeyError: + decision_tree[node_name] = dict() + decision_tree[node_name]["missing_energy"] = delta_base_energy + decision_tree[node_name]["visit_counter"] = 1 + + return decision_tree + +def group_optimization_ev(group, base_scen, base_sched, + electrified_stations, electrified_station_set, could_not_be_electrified, + not_possible_stations, soc_curve_dict, pre_optimized_set=None, + decision_tree=None, + brute=False, **kwargs): event_group, _ = group # Loading from pickle faster than deepcopy. Copy enough? @@ -746,12 +928,12 @@ def group_optimization(group, base_scen, base_sched, groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) for group in groups: - new_stations = group_optimization(group, new_scen, new_sched, - electrified_stations, - electrified_station_set, - could_not_be_electrified, - not_possible_stations, soc_curve_dict, - pre_optimized_set, decision_tree) + new_stations = group_optimization_ev(group, new_scen, new_sched, + electrified_stations, + electrified_station_set, + could_not_be_electrified, + not_possible_stations, soc_curve_dict, + pre_optimized_set, decision_tree) electrified_stations.update(new_stations) return electrified_stations @@ -1227,6 +1409,9 @@ def run_schedule(this_sched, this_args, electrified_stations=None): # Dont print output from spice ev to reduce clutter print(".", end="") + print("Running Spice EV... with %s rotations and %s vehicles", this_sched2.rotations, + len(new_scen.vehicle_socs)) + sys.stdout = open(os.devnull, 'w') print("Running Spice EV...") @@ -1356,6 +1541,9 @@ def __init__(self): optimizer = config_parser["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) + conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) + conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", + "rebased_" +str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) conf.opt_type = optimizer.get("opt_type", "greedy") conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) conf.node_choice = optimizer.get("node_choice", "step") @@ -1382,10 +1570,10 @@ def outer_group_optimzation(pack, not_possible_stations): old_electrified_station_set, could_not_be_electrified, pre_optimized_set = pack electrified_stations = old_stations.copy() electrified_station_set = old_electrified_station_set.copy() - ele_set = group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, - not_possible_stations, pre_optimized_set=pre_optimized_set) + ele_set = group_optimization_ev(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, + not_possible_stations, pre_optimized_set=pre_optimized_set) return electrified_station_set.copy() def remove_none_socs(base_scen): @@ -1407,6 +1595,34 @@ def get_vehicle(id, sched): def get_vehicle_rots(id, sched): return [rot for rot in sched.rotations if id == get_vehicle(rot, sched)] +def station_eval_to_logger(missing_energy, station_eval): + logger.debug("Missing energy: %s", missing_energy) + if logger.getEffectiveLevel() > logging.DEBUG: + for stat_id in station_eval: + logger.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) + +def toolbox_from_pickle(sched_name, scen_name, args_name): + with open(args_name, "rb") as f: + args = pickle.load(f) + with open(scen_name, "rb") as f: + scen = pickle.load(f) + with open(sched_name, "rb") as f: + sched = pickle.load(f) + return sched, scen, args + +def toolbox_to_pickle(name, sched, scen, args): + args_name="args_"+name+".pickle" + with open(args_name, "wb") as f: + pickle.dump(args,f) + scen_name="scenario_"+name+".pickle" + with open(scen_name, "wb") as f: + pickle.dump(scen,f) + sched_name="schedule_"+name+".pickle" + with open(sched_name, "wb") as f: + pickle.dump(sched,f) + return sched_name, scen_name, args_name + + if __name__ == "__main__": freeze_support() From 2c9ed7878a78d45a04b2aa07c184fd11c6604c05 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 13 Dec 2022 14:33:06 +0100 Subject: [PATCH 391/802] local energy source: minor fixes --- data/examples/electrified_stations.json | 2 +- ebus_toolbox/costs.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index cfafb652..e853db2c 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -5,7 +5,7 @@ "distance_transformer": 150, "energy_feed_in": { "csv_file": "data/examples/example_pv_feedin.csv", - "start_time": "2022-03-07T00:00:00", + "start_time": "2022-03-08T00:00:00", "step_duration_s": 3600, "column": "Feed-in Total (kW)", "nominal_power": 10, diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index cfd3538c..30abfb3e 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,6 +1,6 @@ import warnings -from spice_ev.calculate_costs import calculate_costs as calc_costs_spice_ev +from calculate_costs import calculate_costs as calc_costs_spice_ev def calculate_costs(c_params, scenario, schedule, args): From 59561fdba4cc576ae00d865c4e7f2c2df82c9a8c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 13 Dec 2022 14:33:47 +0100 Subject: [PATCH 392/802] Remove the old group optimization quick and ev --- data/examples/optimizer.cfg | 13 +- ebus_toolbox/optimizer.py | 445 +++++++----------------------------- 2 files changed, 86 insertions(+), 372 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 2c2c297a..34c5b8ae 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -6,7 +6,7 @@ debug_level=0 # Use "" for ids and not '' exclusion_rots = [] exclusion_stations= [] -inclusion_stations= ["Bensheim Bahnhof/ ZOB","Heppenheim Bahnhof"] +inclusion_stations= [] standard_opp_station={"type": "opps", "n_charging_stations": 200} #Buffered #["0310a_2", "0310a_3", "0310a_4", "0310a_5", "0413_3", "6310b_6"] @@ -16,9 +16,12 @@ standard_opp_station={"type": "opps", "n_charging_stations": 200} # BVG #["1000031","6891224", "6891223", "6891222", "6891228", "689126"] [PICKLE] -schedule=schedule_buffered_depots_utf.pickle -scenario=scenario_buffered_depots_utf.pickle -args=args_buffered_utf.pickle +schedule=schedule_rebased_BVG_BFI.pickle +scenario=scenario_rebased_BVG_BFI.pickle +args=args_rebased_BVG_BFI.pickle +# schedule=schedule_buffered_depots_utf.pickle +# scenario=scenario_buffered_depots_utf.pickle +# args=args_buffered_utf.pickle [VEHICLE] @@ -30,7 +33,7 @@ charge_eff = 0.95 [OPTIMIZER] # "quick" or "spiceev" -solver = quick +solver = spiceev rebase_scenario = False pickle_rebased= False pickle_rebased_name=buffered_rebase_12_12 diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 9e12cbc1..3f1bd361 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -340,79 +340,66 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n else: choice_func = choose_station_step_by_step - if solver == "quick": - # first run is always step by step - group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations, - choose_station_step_by_step, soc_charge_curve_dict, - pre_optimized_set=None, - decision_tree=decision_tree,soc_lower_thresh=soc_lower_thresh, - soc_upper_thresh=soc_upper_thresh, - events_remaining=[len(events)], - **kwargs) - - logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set) , len(stations)) - logger.warning(electrified_station_set) - - if solver == "quick": - if opt_type == "deep": - sols = [] - i = 0 - cont_loop = True - t = time() - - - combinations = combs_unordered_no_putting_back(len(stations), - len(electrified_station_set)) - - print(f"There are {combinations} combinations") - - while i < config.max_brute_loop and cont_loop: - i += 1 - if i % 10 == 0: - print(time() - t) - t = time() - print(len(decision_tree), " Knotenpunkte durchwandert") - print(f"Optimal solution has length {len(electrified_station_set)}") - not_possible_stations = copy(not_possible_stations) - pre_optimized_set = copy(electrified_station_set) - could_not_be_electrified_copy = could_not_be_electrified.copy() - electrified_stations = base_stations.copy() - # electrified_station_set = base_electrified_station_set.copy() - new_electrified_set = set() - new_stations, cont_loop = \ - group_optimization_quick(group, base_scen, base_sched, - electrified_stations, new_electrified_set, - could_not_be_electrified_copy - , not_possible_stations, - choice_func, soc_charge_curve_dict, - pre_optimized_set=pre_optimized_set, - decision_tree=decision_tree, - events_remaining=[len(events)], - soc_upper_thresh=soc_upper_thresh,soc_lower_thresh=soc_lower_thresh) - # if a new set was found, print it and save it in sols - - if new_electrified_set != pre_optimized_set and new_stations is not None: - logger.warning( - f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ - {stations_hash(new_electrified_set)}") - sols.append(new_electrified_set) - if len(new_electrified_set) < len(pre_optimized_set): - electrified_station_set = new_electrified_set - # else: - # print(f"{new_electrified_set} is not viable") - - logger.debug(sols) - else: - # use spiceev - group_optimization_ev(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations, - soc_charge_curve_dict, - pre_optimized_set=None, - decision_tree=decision_tree, brute=False, **kwargs) - + # first run is always step by step + group_optimization(group, base_scen, base_sched, + electrified_stations, electrified_station_set, + could_not_be_electrified, not_possible_stations, + choose_station_step_by_step, soc_charge_curve_dict, + pre_optimized_set=None, + decision_tree=decision_tree,soc_lower_thresh=soc_lower_thresh, + soc_upper_thresh=soc_upper_thresh, + events_remaining=[len(events)], type=solver, + **kwargs) + + logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set) , len(stations)) + logger.warning(electrified_station_set) + + if opt_type == "deep": + sols = [] + i = 0 + cont_loop = True + t = time() + combinations = combs_unordered_no_putting_back(len(stations), + len(electrified_station_set)) + + print(f"There are {combinations} combinations") + + while i < config.max_brute_loop and cont_loop: + i += 1 + if i % 10 == 0: + print(time() - t) + t = time() + print(len(decision_tree), " Knotenpunkte durchwandert") + print(f"Optimal solution has length {len(electrified_station_set)}") + not_possible_stations = copy(not_possible_stations) + pre_optimized_set = copy(electrified_station_set) + could_not_be_electrified_copy = could_not_be_electrified.copy() + electrified_stations = base_stations.copy() + # electrified_station_set = base_electrified_station_set.copy() + new_electrified_set = set() + new_stations, cont_loop = \ + group_optimization_quick(group, base_scen, base_sched, + electrified_stations, new_electrified_set, + could_not_be_electrified_copy + , not_possible_stations, + choice_func, soc_charge_curve_dict, + pre_optimized_set=pre_optimized_set, + decision_tree=decision_tree, + events_remaining=[len(events)], + soc_upper_thresh=soc_upper_thresh,soc_lower_thresh=soc_lower_thresh) + # if a new set was found, print it and save it in sols + + if new_electrified_set != pre_optimized_set and new_stations is not None: + logger.warning( + f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ + {stations_hash(new_electrified_set)}") + sols.append(new_electrified_set) + if len(new_electrified_set) < len(pre_optimized_set): + electrified_station_set = new_electrified_set + # else: + # print(f"{new_electrified_set} is not viable") + + logger.debug(sols) list_greedy_sets[group_nr] = electrified_station_set.copy() logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), len(stations))) @@ -464,6 +451,14 @@ def group_optimization(group, base_scen, base_sched, pre_optimized_set=None, decision_tree=None, soc_lower_thresh=0,soc_upper_thresh=1, tree_position=[],type="spiceev", **kwargs): + #Base socs are the socs without electrification, they get passed through the stacks + # so the quick calculation can mutate them since quick calculation cant take place iteratly + if kwargs.get("base_socs"): + base_socs=kwargs.get("base_socs") + else: + base_socs={id:soc for id, soc in base_scen.vehicle_socs.items()} + + # Give treeposition logger.debug("%s with length of %s", tree_position, len(tree_position)) @@ -477,13 +472,7 @@ def group_optimization(group, base_scen, base_sched, # optimization new_scen = copy(base_scen) new_sched = copy(base_sched) - # Copy stuff so base sched rotations are not touched - new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) - # If the upper level lifted socs put them in the new scen. - lifted_socs = kwargs.get("lifted_socs", None) - if lifted_socs is not None: - new_scen.vehicle_socs = lifted_socs # Get rotations from event dict and calculate the missing energy rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} @@ -531,8 +520,9 @@ def group_optimization(group, base_scen, base_sched, s = time() event_rotations = {x["rotation"] for x in event_group} - new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) if type=="quick": + # Quick calculation has to electrify everything in one step, or the lifting of socs is not correct + new_scen.vehicle_socs = deepcopy(base_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, new_scen, electrified_station_set, soc_curve_dict, @@ -586,7 +576,7 @@ def group_optimization(group, base_scen, base_sched, for k, group in enumerate(groups): this_tree = tree_position.copy() this_tree.append(k) - new_stations, _ = group_optimization(group, base_scen, base_sched, + new_stations, _ = group_optimization(group, new_scen, new_sched, electrified_stations, electrified_station_set, could_not_be_electrified, @@ -597,7 +587,9 @@ def group_optimization(group, base_scen, base_sched, events_remaining=events_remaining, soc_lower_thresh=soc_lower_thresh, soc_upper_thresh=soc_upper_thresh, - tree_position=this_tree, type=type) + tree_position=this_tree, type=type, + base_socs = base_socs + ) if new_stations is not None: electrified_stations.update(new_stations) @@ -634,179 +626,6 @@ def group_optimization(group, base_scen, base_sched, return electrified_stations, True -def group_optimization_quick(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, soc_curve_dict, - pre_optimized_set=None, decision_tree=None, - soc_lower_thresh=0,soc_upper_thresh=1, - tree_position=[],**kwargs): - - logger.debug("%s with length of %s", tree_position, len(tree_position)) - event_group, possible_stations = group - events_remaining = kwargs.get("events_remaining", [99999]) - # Loading from pickle faster than deepcopy. Copy enough? - new_scen = copy(base_scen) - new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) - - lifted_socs = kwargs.get("lifted_socs", None) - if lifted_socs is not None: - new_scen.vehicle_socs = lifted_socs - new_sched = copy(base_sched) - - rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} - missing_energy = get_missing_energy(event_group) - - if missing_energy >= 0: - logger.debug("Already electrified: Returning set") - return electrified_stations, True - - station_eval = evaluate(event_group, new_scen, soc_curve_dict, - soc_upper_thresh=soc_upper_thresh, soc_lower_thresh=soc_lower_thresh) - - logger.debug("Missing energy: %s", missing_energy) - if logger.getEffectiveLevel() > logging.DEBUG: - for stat_id in station_eval: - logger.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) - - best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, - pre_optimized_set, decision_tree, - missing_energy=missing_energy) - stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} - if best_station_ids is None: - logger.warning( - f"No useful station found with " - f"{events_remaining} rotations not electrified yet. " - f" Stopped after electrifying {len(electrified_station_set)}") - - if pre_optimized_set is not None: - # Remove electrified stations in this run - c = electrified_station_set.copy() - for stat in c: - electrified_stations.pop(stat) - electrified_station_set.remove(stat) - # Overwrite with preoptimized set - for stat in pre_optimized_set: - electrify_station(stat, electrified_stations, electrified_station_set) - else: - could_not_be_electrified.update(list(rotation_dict.keys())) - return None, False - logger.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) - - # Electrify station - for stat_id in best_station_ids: - electrify_station(stat_id, electrified_stations, electrified_station_set) - - s = time() - - # Using the base_group for timeseries calculation is a little slower than using the current - # (smaller) event group which is getting optimized. But it allows for looking at the current - # base group missing energy see "delta_base_energy" which is put into - - # todo event_group or base_group? Base group much slower? - event_rotations = {x["rotation"] for x in event_group} - - new_scen.vehicle_socs = deepcopy(base_scen.vehicle_socs) - new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, - new_scen.vehicle_socs, - new_scen, electrified_station_set, soc_curve_dict, soc_upper_thresh=args.desired_soc_deps) - lifted_socs = deepcopy(new_scen.vehicle_socs) - - global timer_for_calc - global timers - timer_for_calc += time() - s - timers[2] += time() - s - not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) - event_rotations_id = {event["rotation"].id for event in event_group} - new_events = get_below_zero_soc_events(new_scen, event_rotations_id, - new_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, relative_soc=True) - - delta_energy = get_missing_energy(new_events) - - events_remaining[0] -= len(event_group) - len(new_events) - logger.debug("Last electrification electrified %s/%s." - " %s remaining events in the base group.", - len(event_group) - len(new_events), len(event_group), events_remaining[0]) - # todo - delta_base_energy = delta_energy # get_missing_energy(base_events) - - if decision_tree is not None: - node_name = stations_hash(electrified_station_set) - try: - decision_tree[node_name]["missing_energy"] = delta_base_energy - decision_tree[node_name]["visit_counter"] += 1 - # todo add is_viable - logger.debug("already visited") - except KeyError: - decision_tree[node_name] = dict() - decision_tree[node_name]["missing_energy"] = delta_base_energy - decision_tree[node_name]["visit_counter"] = 1 - - # Everything electrified - if delta_energy >= 0: - return electrified_stations, True - # Some choice functions might not need a recursive call, they return here. recursive is set - # by the choose_station_function - elif not recursive: - return None, True - - # Check if the events can be divided into subgroups which are independent - groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) - - for k,group in enumerate(groups): - this_tree=tree_position.copy() - this_tree.append(k) - new_stations, _ = group_optimization_quick(group, base_scen, base_sched, - electrified_stations, - electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, - soc_curve_dict, - pre_optimized_set, decision_tree, - lifted_socs=lifted_socs, - events_remaining=events_remaining, - soc_lower_thresh=soc_lower_thresh, - soc_upper_thresh=soc_upper_thresh, - tree_position=this_tree) - - if new_stations is not None: - electrified_stations.update(new_stations) - else: - return None, True - - # Evaluate if following this branch makes sense - if pre_optimized_set is not None: - if len(pre_optimized_set) - len(electrified_station_set) < 10: - new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, - new_scen.vehicle_socs, - new_scen, electrified_station_set, - soc_curve_dict, soc_upper_thresh=args.desired_soc_deps) - - prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, - new_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, - relative_soc=True) - - station_eval = evaluate(prune_events, new_scen, soc_curve_dict, - soc_upper_thresh=soc_upper_thresh,soc_lower_thresh=soc_lower_thresh) - prune_missing_energy = get_missing_energy(prune_events) - if not is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, prune_missing_energy): - print("Branch pruned early") - is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, missing_energy) - return None, True - - return electrified_stations, True - - def get_missing_energy(events): missing_energy = 0 for e in events: @@ -828,116 +647,6 @@ def node_to_tree(decision_tree,electrified_station_set, delta_base_energy): return decision_tree -def group_optimization_ev(group, base_scen, base_sched, - electrified_stations, electrified_station_set, could_not_be_electrified, - not_possible_stations, soc_curve_dict, pre_optimized_set=None, - decision_tree=None, - brute=False, **kwargs): - event_group, _ = group - - # Loading from pickle faster than deepcopy. Copy enough? - pre_opt_scen = copy(base_scen) - pre_opt_scen.vehicle_socs = copy(base_scen.vehicle_socs) - pre_opt_sched = copy(base_sched) - rotation_dict = dict() - for e in event_group: - rotation_dict[e["rotation"].id] = e["rotation"] - - missing_energy = get_missing_energy(event_group) - - if missing_energy >= 0: - logger.debug("Already electrified: Returning set") - return electrified_stations - - station_eval = evaluate(event_group, pre_opt_scen, soc_curve_dict,soc_upper_thresh=soc_upper_thresh, soc_lower_thresh=soc_lower_thresh) - for id in station_eval: - logger.debug("%s, %s", id[0], id[1]["pot_sum"]) - logger.debug(missing_energy) - - # best_station_ids = choose_stations_function(station_eval, electrified_station_set, - # pre_optimized_set, decision_tree, - # missing_energy=missing_energy) - if brute: - best_station_ids, _ = choose_station_brute(station_eval, electrified_station_set, - pre_optimized_set, decision_tree, - missing_energy=missing_energy) - else: - best_station_ids, _ = choose_station_step_by_step(station_eval, electrified_station_set, - pre_optimized_set, decision_tree, - missing_energy=missing_energy) - - logger.debug(best_station_ids) - if best_station_ids is None: - print( - f"All stations with estimated potential electrified but still missing energy in {len(list(rotation_dict.keys()))} rotations") - if pre_optimized_set is not None: - # Remove electrified stations in this run - c = electrified_station_set.copy() - for stat in c: - electrified_stations.pop(stat) - electrified_station_set.remove(stat) - # Overwrite with preoptimized set - for stat in pre_optimized_set: - electrify_station(stat, electrified_stations, electrified_station_set) - else: - could_not_be_electrified.update(list(rotation_dict.keys())) - return electrified_stations - - # Electrify station - for id in best_station_ids: - electrify_station(id, electrified_stations, electrified_station_set) - pre_opt_sched.rotations = rotation_dict - - s = time() - - new_sched, new_scen = run_schedule(pre_opt_sched, args, - electrified_stations=electrified_stations) - - global timer_for_calc - timer_for_calc += time() - s - - not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) - new_events = get_below_zero_soc_events(new_scen, list(new_sched.rotations.keys()), - new_sched, - soc_upper_thresh=1, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, relative_soc=True) - - delta_energy = get_missing_energy(new_events) - - if decision_tree is not None: - node_name = str(sorted(list(electrified_station_set))) - try: - decision_tree[node_name]["missing_energy"] = delta_energy - decision_tree[node_name]["visit_counter"] += 1 - print("already visited") - except KeyError: - decision_tree[node_name] = dict() - decision_tree[node_name]["missing_energy"] = delta_energy - decision_tree[node_name]["visit_counter"] = 1 - - # Everything electrified - if delta_energy >= 0: - return electrified_stations - else: - if brute: - return - - # Check if the events can be divided into subgroups which are independent - groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) - - for group in groups: - new_stations = group_optimization_ev(group, new_scen, new_sched, - electrified_stations, - electrified_station_set, - could_not_be_electrified, - not_possible_stations, soc_curve_dict, - pre_optimized_set, decision_tree) - electrified_stations.update(new_stations) - - return electrified_stations - def preprocessing_scenario(this_sched, this_scen, this_args, inclusion_stations=set(), @@ -1409,8 +1118,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None): # Dont print output from spice ev to reduce clutter print(".", end="") - print("Running Spice EV... with %s rotations and %s vehicles", this_sched2.rotations, - len(new_scen.vehicle_socs)) + print("Running Spice EV..." ,end="") sys.stdout = open(os.devnull, 'w') @@ -1420,6 +1128,9 @@ def run_schedule(this_sched, this_args, electrified_stations=None): new_scen.run('distributed', vars(this_args).copy()) + print(" with % s rotations and % s vehicles", this_sched2.rotations, + len(new_scen.vehicle_socs)) + sys.stdout = sys.__stdout__ print(".") return this_sched2, new_scen From e8498b13bee5ee3728f6858c34f77c44efddcfea Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 13 Dec 2022 14:49:02 +0100 Subject: [PATCH 393/802] local energy source: add ext. load csv, change to oppb --- data/examples/ebus_toolbox.cfg | 2 +- data/examples/electrified_stations.json | 8 +- data/examples/example_external_load.csv | 169 ++++++++++++++++++++++++ 3 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 data/examples/example_external_load.csv diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 423245f5..b5d98037 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -63,7 +63,7 @@ desired_soc_deps = 1.0 desired_soc_opps = 0.8 # Preferred charging type. Options: depb, oppb (default: oppb) -preferred_charging_type = "depb" +preferred_charging_type = "oppb" # min charging time at depots and opp stations [minutes] (default: 0) min_charging_time = 0 diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index e853db2c..1dfb7263 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -11,7 +11,13 @@ "nominal_power": 10, "factor": 1 }, - "external_load": null, // optional + "external_load": { + "csv_file": "data/examples/example_external_load.csv", + "start_time": "2022-03-07T20:25:00", + "step_duration_s": 900, + "column": "External Load (kW)", + "factor": 2 + }, "voltage_level" : "MV", "battery": { "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required diff --git a/data/examples/example_external_load.csv b/data/examples/example_external_load.csv new file mode 100644 index 00000000..7aca3054 --- /dev/null +++ b/data/examples/example_external_load.csv @@ -0,0 +1,169 @@ +time,External Load (kW) +2018-01-01 00:30:00+01:00,5.16 +2018-01-01 01:30:00+01:00,35.48 +2018-01-01 02:30:00+01:00,6.00 +2018-01-01 03:30:00+01:00,4.11 +2018-01-01 04:30:00+01:00,33.82 +2018-01-01 05:30:00+01:00,15.24 +2018-01-01 06:30:00+01:00,8.14 +2018-01-01 07:30:00+01:00,14.29 +2018-01-01 08:30:00+01:00,28.21 +2018-01-01 09:30:00+01:00,11.47 +2018-01-01 10:30:00+01:00,10.48 +2018-01-01 11:30:00+01:00,18.22 +2018-01-01 12:30:00+01:00,37.40 +2018-01-01 13:30:00+01:00,34.82 +2018-01-01 14:30:00+01:00,4.60 +2018-01-01 15:30:00+01:00,31.82 +2018-01-01 16:30:00+01:00,29.10 +2018-01-01 17:30:00+01:00,22.37 +2018-01-01 18:30:00+01:00,15.62 +2018-01-01 19:30:00+01:00,8.29 +2018-01-01 20:30:00+01:00,33.94 +2018-01-01 21:30:00+01:00,3.23 +2018-01-01 22:30:00+01:00,23.44 +2018-01-01 23:30:00+01:00,17.28 +2018-01-02 00:30:00+01:00,10.01 +2018-01-02 01:30:00+01:00,32.82 +2018-01-02 02:30:00+01:00,12.49 +2018-01-02 03:30:00+01:00,7.27 +2018-01-02 04:30:00+01:00,37.27 +2018-01-02 05:30:00+01:00,34.28 +2018-01-02 06:30:00+01:00,25.58 +2018-01-02 07:30:00+01:00,18.00 +2018-01-02 08:30:00+01:00,7.90 +2018-01-02 09:30:00+01:00,1.88 +2018-01-02 10:30:00+01:00,19.48 +2018-01-02 11:30:00+01:00,21.86 +2018-01-02 12:30:00+01:00,0.67 +2018-01-02 13:30:00+01:00,3.62 +2018-01-02 14:30:00+01:00,4.61 +2018-01-02 15:30:00+01:00,17.42 +2018-01-02 16:30:00+01:00,39.72 +2018-01-02 17:30:00+01:00,26.93 +2018-01-02 18:30:00+01:00,7.25 +2018-01-02 19:30:00+01:00,6.29 +2018-01-02 20:30:00+01:00,15.48 +2018-01-02 21:30:00+01:00,1.89 +2018-01-02 22:30:00+01:00,38.54 +2018-01-02 23:30:00+01:00,36.71 +2018-01-03 00:30:00+01:00,0.63 +2018-01-03 01:30:00+01:00,15.72 +2018-01-03 02:30:00+01:00,14.13 +2018-01-03 03:30:00+01:00,6.39 +2018-01-03 04:30:00+01:00,11.81 +2018-01-03 05:30:00+01:00,30.54 +2018-01-03 06:30:00+01:00,1.67 +2018-01-03 07:30:00+01:00,10.25 +2018-01-03 08:30:00+01:00,19.56 +2018-01-03 09:30:00+01:00,28.35 +2018-01-03 10:30:00+01:00,30.06 +2018-01-03 11:30:00+01:00,12.46 +2018-01-03 12:30:00+01:00,21.00 +2018-01-03 13:30:00+01:00,16.93 +2018-01-03 14:30:00+01:00,26.33 +2018-01-03 15:30:00+01:00,11.79 +2018-01-03 16:30:00+01:00,31.70 +2018-01-03 17:30:00+01:00,33.23 +2018-01-03 18:30:00+01:00,15.07 +2018-01-03 19:30:00+01:00,6.85 +2018-01-03 20:30:00+01:00,18.43 +2018-01-03 21:30:00+01:00,15.52 +2018-01-03 22:30:00+01:00,3.19 +2018-01-03 23:30:00+01:00,1.38 +2018-01-04 00:30:00+01:00,38.34 +2018-01-04 01:30:00+01:00,22.72 +2018-01-04 02:30:00+01:00,6.04 +2018-01-04 03:30:00+01:00,5.20 +2018-01-04 04:30:00+01:00,13.89 +2018-01-04 05:30:00+01:00,1.95 +2018-01-04 06:30:00+01:00,17.37 +2018-01-04 07:30:00+01:00,10.18 +2018-01-04 08:30:00+01:00,31.57 +2018-01-04 09:30:00+01:00,1.85 +2018-01-04 10:30:00+01:00,27.54 +2018-01-04 11:30:00+01:00,15.15 +2018-01-04 12:30:00+01:00,27.39 +2018-01-04 13:30:00+01:00,1.07 +2018-01-04 14:30:00+01:00,15.87 +2018-01-04 15:30:00+01:00,8.68 +2018-01-04 16:30:00+01:00,11.23 +2018-01-04 17:30:00+01:00,32.89 +2018-01-04 18:30:00+01:00,36.06 +2018-01-04 19:30:00+01:00,17.42 +2018-01-04 20:30:00+01:00,26.70 +2018-01-04 21:30:00+01:00,32.41 +2018-01-04 22:30:00+01:00,27.35 +2018-01-04 23:30:00+01:00,2.69 +2018-01-05 00:30:00+01:00,36.49 +2018-01-05 01:30:00+01:00,36.07 +2018-01-05 02:30:00+01:00,28.91 +2018-01-05 03:30:00+01:00,29.32 +2018-01-05 04:30:00+01:00,39.44 +2018-01-05 05:30:00+01:00,7.89 +2018-01-05 06:30:00+01:00,8.04 +2018-01-05 07:30:00+01:00,33.84 +2018-01-05 08:30:00+01:00,26.80 +2018-01-05 09:30:00+01:00,38.52 +2018-01-05 10:30:00+01:00,33.08 +2018-01-05 11:30:00+01:00,11.39 +2018-01-05 12:30:00+01:00,39.39 +2018-01-05 13:30:00+01:00,29.03 +2018-01-05 14:30:00+01:00,12.59 +2018-01-05 15:30:00+01:00,30.77 +2018-01-05 16:30:00+01:00,37.99 +2018-01-05 17:30:00+01:00,27.89 +2018-01-05 18:30:00+01:00,0.32 +2018-01-05 19:30:00+01:00,22.43 +2018-01-05 20:30:00+01:00,0.25 +2018-01-05 21:30:00+01:00,25.04 +2018-01-05 22:30:00+01:00,11.68 +2018-01-05 23:30:00+01:00,6.74 +2018-01-06 00:30:00+01:00,36.65 +2018-01-06 01:30:00+01:00,17.65 +2018-01-06 02:30:00+01:00,9.48 +2018-01-06 03:30:00+01:00,27.64 +2018-01-06 04:30:00+01:00,22.12 +2018-01-06 05:30:00+01:00,17.45 +2018-01-06 06:30:00+01:00,11.22 +2018-01-06 07:30:00+01:00,9.37 +2018-01-06 08:30:00+01:00,35.61 +2018-01-06 09:30:00+01:00,8.27 +2018-01-06 10:30:00+01:00,11.68 +2018-01-06 11:30:00+01:00,33.98 +2018-01-06 12:30:00+01:00,36.31 +2018-01-06 13:30:00+01:00,33.21 +2018-01-06 14:30:00+01:00,37.04 +2018-01-06 15:30:00+01:00,8.37 +2018-01-06 16:30:00+01:00,4.22 +2018-01-06 17:30:00+01:00,12.98 +2018-01-06 18:30:00+01:00,14.96 +2018-01-06 19:30:00+01:00,19.94 +2018-01-06 20:30:00+01:00,5.09 +2018-01-06 21:30:00+01:00,37.47 +2018-01-06 22:30:00+01:00,16.43 +2018-01-06 23:30:00+01:00,31.26 +2018-01-07 00:30:00+01:00,10.79 +2018-01-07 01:30:00+01:00,7.06 +2018-01-07 02:30:00+01:00,39.06 +2018-01-07 03:30:00+01:00,12.52 +2018-01-07 04:30:00+01:00,34.01 +2018-01-07 05:30:00+01:00,9.36 +2018-01-07 06:30:00+01:00,22.25 +2018-01-07 07:30:00+01:00,31.88 +2018-01-07 08:30:00+01:00,27.65 +2018-01-07 09:30:00+01:00,5.76 +2018-01-07 10:30:00+01:00,38.97 +2018-01-07 11:30:00+01:00,22.58 +2018-01-07 12:30:00+01:00,18.30 +2018-01-07 13:30:00+01:00,8.78 +2018-01-07 14:30:00+01:00,37.14 +2018-01-07 15:30:00+01:00,9.10 +2018-01-07 16:30:00+01:00,38.67 +2018-01-07 17:30:00+01:00,36.16 +2018-01-07 18:30:00+01:00,4.79 +2018-01-07 19:30:00+01:00,12.90 +2018-01-07 20:30:00+01:00,28.39 +2018-01-07 21:30:00+01:00,20.73 +2018-01-07 22:30:00+01:00,39.39 +2018-01-07 23:30:00+01:00,23.12 From a02d9092c50a8afe225ee049c0e2851bad5d642a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 14 Dec 2022 10:20:15 +0100 Subject: [PATCH 394/802] Put config in extra file --- data/examples/optimizer.cfg | 28 ++- ebus_toolbox/optimizer.py | 408 +++++++++++++++---------------- ebus_toolbox/optimizer_config.py | 67 +++++ ebus_toolbox/simulate.py | 6 +- 4 files changed, 283 insertions(+), 226 deletions(-) create mode 100644 ebus_toolbox/optimizer_config.py diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 34c5b8ae..df949e71 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -6,8 +6,9 @@ debug_level=0 # Use "" for ids and not '' exclusion_rots = [] exclusion_stations= [] -inclusion_stations= [] -standard_opp_station={"type": "opps", "n_charging_stations": 200} +inclusion_stations= ["Bürstadt Bahnhof", "Weinheim Hauptbahnhof", "Erbach Gesundheiszentrum", "Hirschhorn Bahnhof", "Mörlenbach Bahnhof", "Wald-Michelbach Polizei", "Heppenheim Starkenburg-Gymnasium", "Wald-Michelbach Schulzentrum", "Reisen Bahnhof", "Heppenheim Kreiskrankenhaus", "Birkenau Schloss", "Zotzenbach Schule", "Wahlen Grundschule", "Rimbach Bahnhof", "Heppenheim Gießener Straße", "Erbach Post", "Alsbach Am Hinkelstein", "Nieder-Liebersbach Rathaus", "Geisenbach Ort", "Fürth Bahnhof", "Wald-Michelbach ZOB", "Worms Hauptbahnhof", "Rimbach Kirche", "Heppenheim Vogelsbergstraße", "Auerbach Schillerschule", "Siedelsbrunn Buddhas Weg", "Grasellenbach Im Erzfeld", "Wald-Michelbach Alter Bahnhof", "Bürstadt Lampertheimer Straße", "Bensheim H.-Metzendorf-Schule", "Bensheim Bahnhof/ ZOB", "Gronau Am Mühlkandel", "Bensheim Geschw.-Scholl-Schule", "Großsachsen Rose", "Siedelsbrunn Tannenberg/Morgenstern", "Bensheim G.-Sch.-S./Berl.Ring", "Hirschhorn Grundschule", "Heppenheim Bahnhof", "Birkenau Bahnhof", "Winterkasten Eleonoren-Klinik", "Mörlenbach Grundschule", "Oberflockenbach Rose", "Seidenbach Ort", "Viernheim Bahnhof", "Hornbach Herrenwiese", "Mörlenbach Schulzentrum", "Neunkirchen Heilquelle", "Birkenau Grundschule", "Reichelsheim Schwimmbad", "Gadern Dorfplatz", "Fürth Grundschule", "Einhausen Almenstraße", "Lindenfels Poststraße", "Heppenheim Graben"}] +standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, + "voltage_level": "MV"} #Buffered #["0310a_2", "0310a_3", "0310a_4", "0310a_5", "0413_3", "6310b_6"] #Spice Ev @@ -16,9 +17,9 @@ standard_opp_station={"type": "opps", "n_charging_stations": 200} # BVG #["1000031","6891224", "6891223", "6891222", "6891228", "689126"] [PICKLE] -schedule=schedule_rebased_BVG_BFI.pickle -scenario=scenario_rebased_BVG_BFI.pickle -args=args_rebased_BVG_BFI.pickle +schedule=schedule_buffered_all_oppb.pickle +scenario=scenario_buffered_all_oppb.pickle +args=args_buffered_all_oppb.pickle # schedule=schedule_buffered_depots_utf.pickle # scenario=scenario_buffered_depots_utf.pickle # args=args_buffered_utf.pickle @@ -32,11 +33,13 @@ charge_eff = 0.95 # min_soc=0.05 [OPTIMIZER] +# Not optional path to outputs of optimizer +output_path=.data/buffered/optimization_output # "quick" or "spiceev" -solver = spiceev -rebase_scenario = False -pickle_rebased= False -pickle_rebased_name=buffered_rebase_12_12 +solver = quick +rebase_scenario = True +pickle_rebased= True +pickle_rebased_name=buffered_rebase_all_electrified run_only_neg=False remove_impossible_rots=False # "greedy" or "deep" without "" @@ -48,13 +51,14 @@ estimation_threshold = 0.80 - [SPECIAL] decision_tree_path = "" save_decision_tree = False -reduce_rots = False +reduce_rots = True # Use "" for ids and not '' -rots = ["6813275","6813275"] +# Negative Rots in all deps +rots = ["0310b_3", "0317_3", "0308_3", "0301b_5", "0404b_4", "0301b_2", "0802b_5", "0401b_4", "7401_7", "0702b_3", "0307a_3", "0307a_1", "0404a_3", "0711_3", "0817_2", "6002a_6", "6302_6", "6306b_6", "0302a_1", "0308_2", "0811_4", "0307b_5", "0705_5", "0801a_4", "0711_4", "0303_3", "0705_3", "0402_5", "0304_2", "0304_3", "0801a_1", "0314_4", "0002_1", "7310a_7", "0811_3", "6711_6", "0301a_5", "0301b_1", "0403_4", "0310b_4", "0701a_2", "0303_1", "0311a_3", "0711_1", "0317_1", "0318_5", "0305_2", "0402_4", "0002_4", "0403_5", "0801a_3", "0310a_2", "0803b_2", "0314_5", "0702b_5", "0701a_1", "0401b_5", "0005a_5", "0801b_5", "0310a_4", "0311a_5", "0311a_4", "0404b_1", "0014b_2", "0803b_5", "0306a_4", "0726_5", "0318_1", "0005a_2", "0303_5", "0308_4", "0002_3", "0306a_3", "0307a_4", "0701a_4", "0401a_4", "6403_6", "0404a_2", "6309a_6", "0314_3", "0317_4", "0401a_2", "0705_1", "0310b_1", "0701a_5", "0310a_1", "0404a_1", "0302a_5", "6305a_6", "0817_4", "0312a_1", "0301a_2", "0705_4", "0305_1", "0312a_4", "0702b_2", "0302b_5", "0005a_4", "6001a_6", "0003b_1", "0301b_4", "0310a_3", "6003_6", "0302a_2", "0817_3", "0404b_5", "0403_2", "0317_5", "0817_1", "0401b_3", "0003b_3", "0726_1", "0701a_3", "7005_7", "0311a_2", "0307b_3", "0301b_3", "0314_2", "6310b_6", "0803b_3", "0014b_1", "0401a_3", "0306a_1", "0305_5", "6303a_6", "6401_6", "0303_2", "6301_6", "0005a_3", "0404a_4", "0312a_2", "0302a_4", "7402_7", "0401b_2", "0301a_1", "0402_2", "0014b_3", "0307b_1", "0803b_1", "6002b_6", "0303_4", "6310a_6", "0302a_3", "0318_4", "7811_7", "0306a_2", "0312a_3", "0308_5", "0014b_4", "0310a_5", "0319_1", "0310b_5", "0705_2", "0002_2", "7702b_7", "7711_7", "0811_2", "0403_1", "0319_3", "0317_2", "0726_3", "0404a_5", "0726_4", "0307b_2", "6901_6", "0319_4", "0005b_5", "0305_4", "6702b_6", "7002b_7", "0304_5", "0305_3", "0003b_2", "0401b_1", "0801a_5", "0301a_3", "0402_1", "0005a_1", "0319_5", "6306a_6", "0319_2", "0311a_1", "0401a_5", "0003b_5", "0307a_5", "0307a_2", "0301a_4", "0318_3", "0308_1", "0726_2", "0803b_4", "6001b_6", "0401a_1", "0312a_5", "6703b_6", "0711_2", "0811_1", "0702b_1", "0314_1", "0014b_5", "0310b_2", "0404b_2", "0003b_4", "0307b_4", "0304_1", "0306a_5", "0811_5", "0403_3", "0318_2", "0402_3", "0817_5", "0404b_3", "0702b_4", "0711_5", "7003_7", "0002_5", "0304_4", "0801a_2"] + # add later as description diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index f3672e9f..4a650c02 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -11,6 +11,7 @@ from time import time import logging import math +import util import shutil import report import src.scenario as scenario @@ -19,47 +20,56 @@ import pickle import matplotlib import matplotlib.pyplot as plt -from multiprocessing import Pool, freeze_support from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip - +from ebus_toolbox.costs import calculate_costs # Todo this implementation in case of changes in ebustoolbox from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev +from optimizer_config import read_config, OptimizerConfig +import numpy as np matplotlib.use("TkAgg") -import numpy as np global logger def setup_logger(): - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) + this_logger = logging.getLogger(__name__) + this_logger.setLevel(logging.DEBUG) + + # Logging to one file which keeps track of optimization over many runs + file_handler_all_opts = logging.FileHandler('optimizer.log') + file_handler_all_opts.setLevel(config.debug_level) + + # And logging to a file which is put in the folder with the other optimizer results + file_handler_this_opt = logging.FileHandler(Path(config.output_path) / Path('optimizer.log')) + file_handler_this_opt.setLevel(config.debug_level) - file_handler = logging.FileHandler('optimizer.log') - file_handler.setLevel(config.debug_level) formatter = logging.Formatter('%(asctime)s:%(message)s', "%m%d %H%M%S") - file_handler.setFormatter(formatter) + + file_handler_all_opts.setFormatter(formatter) + file_handler_this_opt.setFormatter(formatter) formatter = logging.Formatter('%(message)s') stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) stream_handler.setLevel(config.debug_level) - logger.addHandler(file_handler) - logger.addHandler(stream_handler) - return logger + this_logger.addHandler(file_handler_this_opt) + this_logger.addHandler(file_handler_all_opts) + this_logger.addHandler(stream_handler) + return this_logger args = None scen = None sched = None -config = None +config = OptimizerConfig() ROT = None +# Global list to be able to keep track of runtimes for optimizing components which are slow timers = [0] * 10 - def main(): # run_optimization(sched, scen, args, config_path) """ Optimizes scenario by adding electrified stations sparingly @@ -79,8 +89,26 @@ def main(): """ global logger global config - config_path=".\data\examples\optimizer.cfg" + config_path = ".\data\examples\optimizer.cfg" config = read_config(config_path) + + # Prepare Filesystem with folders and paths + args.output_directory = Path(config.output_path) / \ + str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_optimizer") + # create subfolder for specific sim results with timestamp. + # if folder doesnt exists, create folder. + # needs to happen after set_options_from_config since + # args.output_directory can be overwritten by config + args.output_directory.mkdir(parents=True, exist_ok=True) + + c = Path(config_path) + o = args.output_directory / Path("optimizer_config.cfg") + shutil.copy(c, o) + + if args.save_soc: + args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" + + new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") logger = setup_logger() # Load pickle files @@ -89,11 +117,12 @@ def main(): global scen global sched - sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario,config.args ) - # Dont create these results, since they are not used + sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario, config.args) + + # Remove those args, since they lead to file creation, which is not + # needed. del args.save_timeseries del args.save_results - # TodO implement in fast calc args.desired_soc_deps = 1 @@ -128,29 +157,13 @@ def main(): if config.charging_curve is not None: vehicle["charging_curve"] = config.charging_curve decision_tree_path = config.decision_tree_path + if decision_tree_path is not None: with open(decision_tree_path, "rb") as file: decision_tree = pickle.load(file) else: decision_tree = dict() - now = datetime.now() - - args.output_directory = Path(".\data\sim_outputs") / \ - str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") - # create subfolder for specific sim results with timestamp. - # if folder doesnt exists, create folder. - # needs to happen after set_options_from_config since - # args.output_directory can be overwritten by config - args.output_directory.mkdir(parents=True, exist_ok=True) - - c = Path(config_path) - o = args.output_directory / Path("optimizer_config.cfg") - shutil.copy(c, o) - - if args.save_soc: - args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") not_possible_stations = inclusion_stations.union(exclusion_stations) s = time() @@ -163,9 +176,10 @@ def main(): exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing took {time() - s} sec") if config.pickle_rebased: - toolbox_to_pickle(config.pickle_reabses_name, new_sched,new_scen, args) + toolbox_to_pickle(config.pickle_rebased_name, new_sched, new_scen, args) + logger.debug(f"Rebased scenario pickled as {config.pickle_rebased_name}") else: - with open(args.electrified_stations, "r", encoding="utf-8",) as file: + with open(args.electrified_stations, "r", encoding="utf-8", ) as file: ele_stations = json.load(file) ele_station_set = set() # Electrify inclusion stations @@ -195,10 +209,12 @@ def main(): logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=args.desired_soc_opps, soc_lower_thresh=config.min_soc, + not_possible_stations, soc_upper_thresh=args.desired_soc_opps, + soc_lower_thresh=config.min_soc, solver=solver, opt_type=opt_type, node_choice=node_choice, - soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) + soc_charge_curve_dict=soc_charge_curve_dict, + decision_tree=decision_tree) i += 1 if not remove_impossible_rots or len(could_not_be_electrified) == 0: @@ -227,10 +243,10 @@ def main(): new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, ele_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) - new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, new_sched, soc_lower_thresh=config.min_soc) - # plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) - # q = get_rotation_soc(ROT, new_sched, new_scen)[0] + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, new_sched, + soc_lower_thresh=config.min_soc) logger.debug("Still not electrified with fast calc") for event in new_events: @@ -239,13 +255,13 @@ def main(): global timers logger.debug(timers) - with open(new_ele_stations_path, "w", encoding="utf-8",) as file: + with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) logger.debug(f"Spice EV is calculating optimized case as a complete scenario") final_sched, final_scen, ele_station_set, ele_stations = preprocessing_scenario( this_sched, this_scen, args, electrified_stations=ele_stations, run_only_neg=False, - electrified_station_set=ele_station_set) + electrified_station_set=ele_station_set, cost_calc=True) # ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) # ax.plot(q) @@ -255,6 +271,7 @@ def main(): return final_sched, final_scen + timer_for_calc = 0 @@ -279,11 +296,12 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # Get events where soc fell below 0. The events contain info about the problematic # timespan, which includes stations which could provide a soc lift base_events = get_below_zero_soc_events(this_scen=base_scen, - rotations=list(new_sched.rotations.keys()), - this_sched=base_sched, - soc_upper_thresh=soc_upper_thresh, filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, relative_soc=False) + rotations=list(new_sched.rotations.keys()), + this_sched=base_sched, + soc_upper_thresh=soc_upper_thresh, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=soc_lower_thresh, relative_soc=False) # Check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible @@ -291,20 +309,24 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # Baseline greedy Optimization list_greedy_sets = [set()] * len(groups) + + # get_negative_rotations_all_electrified(base_scen, base_sched, soc_upper_thresh, soc_charge_curve_dict, + # not_possible_stations=not_possible_stations, + # soc_lower_thresh=soc_lower_thresh, relative_soc=False) + + new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, electrified_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) - - new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, - new_sched,soc_lower_thresh=soc_lower_thresh) + # new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, + # new_sched, soc_lower_thresh=soc_lower_thresh) # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups[:]): events, stations = group - group_rots = {e["rotation"].id: e["rotation"] for e in events} - group_socs = [e["min_soc"] for e in events] linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() @@ -320,16 +342,17 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # first run is always step by step group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations, - choose_station_step_by_step, soc_charge_curve_dict, - pre_optimized_set=None, - decision_tree=decision_tree,soc_lower_thresh=soc_lower_thresh, - soc_upper_thresh=soc_upper_thresh, - events_remaining=[len(events)], type=solver, - **kwargs) - - logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set) , len(stations)) + electrified_stations, electrified_station_set, + could_not_be_electrified, not_possible_stations, + choose_station_step_by_step, soc_charge_curve_dict, + pre_optimized_set=None, + decision_tree=decision_tree, soc_lower_thresh=soc_lower_thresh, + soc_upper_thresh=soc_upper_thresh, + events_remaining=[len(events)], type=solver, + **kwargs) + + logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), + len(stations)) logger.warning(electrified_station_set) if opt_type == "deep": @@ -356,15 +379,16 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # electrified_station_set = base_electrified_station_set.copy() new_electrified_set = set() new_stations, cont_loop = \ - group_optimization_quick(group, base_scen, base_sched, - electrified_stations, new_electrified_set, - could_not_be_electrified_copy - , not_possible_stations, - choice_func, soc_charge_curve_dict, - pre_optimized_set=pre_optimized_set, - decision_tree=decision_tree, - events_remaining=[len(events)], - soc_upper_thresh=soc_upper_thresh,soc_lower_thresh=soc_lower_thresh) + group_optimization(group, base_scen, base_sched, + electrified_stations, new_electrified_set, + could_not_be_electrified_copy + , not_possible_stations, + choice_func, soc_charge_curve_dict, + pre_optimized_set=pre_optimized_set, + decision_tree=decision_tree, + events_remaining=[len(events)], + soc_upper_thresh=soc_upper_thresh, + soc_lower_thresh=soc_lower_thresh, type=solver) # if a new set was found, print it and save it in sols if new_electrified_set != pre_optimized_set and new_stations is not None: @@ -374,16 +398,14 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n sols.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): electrified_station_set = new_electrified_set - # else: - # print(f"{new_electrified_set} is not viable") logger.debug(sols) list_greedy_sets[group_nr] = electrified_station_set.copy() logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), len(stations))) if config.save_decision_tree: - with open (args.output_directory / Path("decision_tree.pickle") , "wb") as file: - pickle.dump(decision_tree,file) + with open(args.output_directory / Path("decision_tree.pickle"), "wb") as file: + pickle.dump(decision_tree, file) for single_set in list_greedy_sets: for stat in single_set: electrify_station(stat, electrified_stations, electrified_station_set) @@ -422,20 +444,20 @@ def get_groups_from_events(events, not_possible_stations=set(), could_not_be_ele groups = list(zip(event_groups, station_subsets)) return sorted(groups, key=lambda x: len(x[1])) + def group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, soc_curve_dict, - pre_optimized_set=None, decision_tree=None, - soc_lower_thresh=0,soc_upper_thresh=1, - tree_position=[],type="spiceev", **kwargs): - #Base socs are the socs without electrification, they get passed through the stacks + electrified_stations, electrified_station_set, + could_not_be_electrified, + not_possible_stations, choose_station_function, soc_curve_dict, + pre_optimized_set=None, decision_tree=None, + soc_lower_thresh=0, soc_upper_thresh=1, + tree_position=[], type="spiceev", **kwargs): + # Base socs are the socs without electrification, they get passed through the stacks # so the quick calculation can mutate them since quick calculation cant take place iteratly if kwargs.get("base_socs"): - base_socs=kwargs.get("base_socs") + base_socs = kwargs.get("base_socs") else: - base_socs={id:soc for id, soc in base_scen.vehicle_socs.items()} - + base_socs = {id: soc for id, soc in base_scen.vehicle_socs.items()} # Give treeposition logger.debug("%s with length of %s", tree_position, len(tree_position)) @@ -451,7 +473,6 @@ def group_optimization(group, base_scen, base_sched, new_scen = copy(base_scen) new_sched = copy(base_sched) - # Get rotations from event dict and calculate the missing energy rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} missing_energy = get_missing_energy(event_group) @@ -498,7 +519,7 @@ def group_optimization(group, base_scen, base_sched, s = time() event_rotations = {x["rotation"] for x in event_group} - if type=="quick": + if type == "quick": # Quick calculation has to electrify everything in one step, or the lifting of socs is not correct new_scen.vehicle_socs = deepcopy(base_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, @@ -510,9 +531,7 @@ def group_optimization(group, base_scen, base_sched, new_sched.rotations = rotation_dict new_sched, new_scen = run_schedule(new_sched, args, electrified_stations=electrified_stations) - lifted_socs=None - - + lifted_socs = None global timer_for_calc global timers @@ -538,7 +557,7 @@ def group_optimization(group, base_scen, base_sched, # Put this node intro the decision tree including the missing energy if decision_tree is not None: - decision_tree = node_to_tree(decision_tree,electrified_station_set, delta_base_energy) + decision_tree = node_to_tree(decision_tree, electrified_station_set, delta_base_energy) # Everything electrified if delta_energy >= 0: @@ -555,19 +574,19 @@ def group_optimization(group, base_scen, base_sched, this_tree = tree_position.copy() this_tree.append(k) new_stations, _ = group_optimization(group, new_scen, new_sched, - electrified_stations, - electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, - soc_curve_dict, - pre_optimized_set, decision_tree, - lifted_socs=lifted_socs, - events_remaining=events_remaining, - soc_lower_thresh=soc_lower_thresh, - soc_upper_thresh=soc_upper_thresh, - tree_position=this_tree, type=type, - base_socs = base_socs - ) + electrified_stations, + electrified_station_set, + could_not_be_electrified, + not_possible_stations, choose_station_function, + soc_curve_dict, + pre_optimized_set, decision_tree, + lifted_socs=lifted_socs, + events_remaining=events_remaining, + soc_lower_thresh=soc_lower_thresh, + soc_upper_thresh=soc_upper_thresh, + tree_position=this_tree, type=type, + base_socs=base_socs + ) if new_stations is not None: electrified_stations.update(new_stations) @@ -604,6 +623,7 @@ def group_optimization(group, base_scen, base_sched, return electrified_stations, True + def get_missing_energy(events): missing_energy = 0 for e in events: @@ -611,7 +631,7 @@ def get_missing_energy(events): return missing_energy -def node_to_tree(decision_tree,electrified_station_set, delta_base_energy): +def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): node_name = stations_hash(electrified_station_set) try: decision_tree[node_name]["missing_energy"] = delta_base_energy @@ -631,9 +651,10 @@ def preprocessing_scenario(this_sched, this_scen, this_args, electrified_stations=None, electrified_station_set=set(), exclusion_rots=set(), - run_only_neg=False): + run_only_neg=False, + cost_calc=False): if electrified_stations is None: - with open(this_args.electrified_stations, "r", encoding="utf-8",) as f: + with open(this_args.electrified_stations, "r", encoding="utf-8", ) as f: electrified_stations = json.load(f) # Electrify inclusion stations @@ -649,7 +670,8 @@ def preprocessing_scenario(this_sched, this_scen, this_args, rots = {r: this_sched.rotations[r] for r in this_sched.rotations if r not in exclusion_rots} this_sched.rotations = rots - new_sched, new_scen = run_schedule(this_sched, this_args, electrified_stations) + new_sched, new_scen = run_schedule(this_sched, this_args, electrified_stations, + cost_calc=cost_calc) report.generate(new_sched, new_scen, args) return new_sched, new_scen, electrified_station_set, electrified_stations @@ -683,13 +705,14 @@ def plot_(data): ax.plot(data, linewidth=2.0) return ax -def plot_rot(id,this_sched,this_scen, ax=None, rot_only=True): + +def plot_rot(id, this_sched, this_scen, ax=None, rot_only=True): """ Simple plot of data without having to create subplots""" - a,b,c=get_rotation_soc(id,this_sched,this_scen) + a, b, c = get_rotation_soc(id, this_sched, this_scen) if not rot_only: - b=0 - c=-1 - if ax==None: + b = 0 + c = -1 + if ax == None: fig, ax = plt.subplots() ax.plot(a[b:c], linewidth=2.0) return ax @@ -698,7 +721,6 @@ def plot_rot(id,this_sched,this_scen, ax=None, rot_only=True): return ax - def join_all_subsets(subsets): joined_subset = True while joined_subset: @@ -788,6 +810,7 @@ def choose_station_step_by_step(station_eval, electrified_station_set, def stations_hash(stations_set): return str(sorted(list(stations_set))) + def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc_charge_curve_dict, soc_upper_thresh=1): global timers @@ -819,9 +842,8 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc[idx + buffer_idx:idx + buffer_idx + delta_idx] = old_soc soc[idx + buffer_idx:idx + buffer_idx + delta_idx] += np.linspace(0, d_soc, delta_idx) - - soc_pre=soc[:idx] - soc=soc[idx:] + soc_pre = soc[:idx] + soc = soc[idx:] soc_max = np.max(soc) timers[0] += time() - s s = time() @@ -969,17 +991,20 @@ def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, scen: scenar return trips -def get_rotation_soc(rot_id, this_sched, this_scen): +def get_rotation_soc(rot_id, this_sched, this_scen, soc_data:dict=dict()): rot = this_sched.rotations[rot_id] rot_start_idx = get_index_by_time(rot.departure_time, this_scen) rot_end_idx = get_index_by_time(rot.arrival_time, this_scen) + if len(soc_data) !=0: + return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, this_sched: schedule.Schedule, soc_upper_thresh=0.9, filter_standing_time=True, - not_possible_stations=set(), soc_lower_thresh=0, relative_soc=False): + not_possible_stations=set(), soc_lower_thresh=0, relative_soc=False, + soc_data=dict()): # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to @@ -990,7 +1015,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, for rot_id in rotations: rot = this_sched.rotations[rot_id] - soc, rot_start_idx, rot_end_idx = get_rotation_soc(rot_id, this_sched, this_scen) + soc, rot_start_idx, rot_end_idx = get_rotation_soc(rot_id, this_sched, this_scen, soc_data) soc = [s if s is not None else 999 for s in soc] idx = range(0, len(soc)) @@ -1083,10 +1108,11 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): # this_sched.delta_soc_all_trips() # each rotation is assigned a vehicle ID this_sched.assign_vehicles() + return this_sched, this_sched.generate_scenario(this_args) -def run_schedule(this_sched, this_args, electrified_stations=None): +def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations this_sched2.assign_vehicles() @@ -1096,7 +1122,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None): # Dont print output from spice ev to reduce clutter print(".", end="") - print("Running Spice EV..." ,end="") + print("Running Spice EV...", end="") sys.stdout = open(os.devnull, 'w') @@ -1107,10 +1133,20 @@ def run_schedule(this_sched, this_args, electrified_stations=None): new_scen.run('distributed', vars(this_args).copy()) print(" with % s rotations and % s vehicles", this_sched2.rotations, - len(new_scen.vehicle_socs)) - + len(new_scen.vehicle_socs)) sys.stdout = sys.__stdout__ + + if args.cost_calculation and cost_calc: + # cost calculation following directly after simulation + try: + with open(args.cost_parameters_file, encoding='utf-8') as f: + cost_parameters_file = util.uncomment_json_file(f) + except FileNotFoundError: + raise SystemExit(f"Path to cost parameters ({args.cost_parameters_file}) " + "does not exist. Exiting...") + calculate_costs(cost_parameters_file, new_scen, this_sched2, args) print(".") + return this_sched2, new_scen @@ -1146,7 +1182,7 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta): # First element which is bigger than current soc if time_delta == 0: return 0 - soc = max(min(args.desired_soc_opps,soc), 0) + soc = max(min(args.desired_soc_opps, soc), 0) first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] second_time = first_time + time_delta # Catch out of bounds if time of charging end is bigger than table values @@ -1185,85 +1221,9 @@ def get_buffer_time(trip, args): return b -def read_config(config_path): - import configparser - import json - config_path = config_path - config_parser = configparser.ConfigParser() - config_parser.sections() - config_parser.read(config_path) - - class Config(): - def __init__(self): - pass - - conf = Config() - default = config_parser["DEFAULT"] - conf.debug_level = int(default.get("debug_level", 0)) - sce = config_parser["SCENARIO"] - conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) - conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) - conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) - conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) - - pi = config_parser["PICKLE"] - - conf.schedule = pi.get("schedule", "") - conf.scenario = pi.get("scenario", "") - conf.args = pi.get("args", "") - - vehicle = config_parser["VEHICLE"] - conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) - conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) - if conf.battery_capacity==0: - conf.battery_capacity=None - conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) - if conf.charging_curve==[]: - conf.charging_curve=None - conf.charging_power = float(vehicle.get("charging_power", 0)) - if conf.charging_power==0: - conf.charging_power=None - conf.min_soc = float(vehicle.get("min_soc", 0.0)) - - - - optimizer = config_parser["OPTIMIZER"] - conf.solver = optimizer.get("solver", "spiceev") - conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) - conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) - conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", - "rebased_" +str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) - conf.opt_type = optimizer.get("opt_type", "greedy") - conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) - conf.node_choice = optimizer.get("node_choice", "step") - conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) - conf.run_only_neg = optimizer.getboolean("run_only_neg", False) - conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) - - special = config_parser["SPECIAL"] - conf.decision_tree_path = special.get("decision_tree_path", None) - if conf.decision_tree_path in ["", '""', "''"] : - conf.decision_tree_path=None - conf.save_decision_tree = special.getboolean("save_decision_tree", False) - conf.reduce_rots = special.getboolean("reduce_rots", False) - conf.rots = json.loads(special.get("rots", [])) - - return conf - - def combs_unordered_no_putting_back(n, k): return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) -def outer_group_optimzation(pack, not_possible_stations): - group, base_scen, base_sched, old_stations, \ - old_electrified_station_set, could_not_be_electrified, pre_optimized_set = pack - electrified_stations = old_stations.copy() - electrified_station_set = old_electrified_station_set.copy() - ele_set = group_optimization_ev(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, - not_possible_stations, pre_optimized_set=pre_optimized_set) - return electrified_station_set.copy() def remove_none_socs(base_scen): # Make sure no None values exists in SOCs. Fill later values with last value @@ -1278,18 +1238,22 @@ def remove_none_socs(base_scen): soc[soc == np.array(None)] = last_not_none base_scen.vehicle_socs[id] = soc + def get_vehicle(id, sched): return sched.rotations[id].vehicle_id + def get_vehicle_rots(id, sched): return [rot for rot in sched.rotations if id == get_vehicle(rot, sched)] + def station_eval_to_logger(missing_energy, station_eval): logger.debug("Missing energy: %s", missing_energy) if logger.getEffectiveLevel() > logging.DEBUG: for stat_id in station_eval: logger.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) + def toolbox_from_pickle(sched_name, scen_name, args_name): with open(args_name, "rb") as f: args = pickle.load(f) @@ -1299,20 +1263,42 @@ def toolbox_from_pickle(sched_name, scen_name, args_name): sched = pickle.load(f) return sched, scen, args + def toolbox_to_pickle(name, sched, scen, args): - args_name="args_"+name+".pickle" + args_name = "args_" + name + ".pickle" with open(args_name, "wb") as f: - pickle.dump(args,f) - scen_name="scenario_"+name+".pickle" + pickle.dump(args, f) + scen_name = "scenario_" + name + ".pickle" with open(scen_name, "wb") as f: - pickle.dump(scen,f) - sched_name="schedule_"+name+".pickle" + pickle.dump(scen, f) + sched_name = "schedule_" + name + ".pickle" with open(sched_name, "wb") as f: - pickle.dump(sched,f) + pickle.dump(sched, f) return sched_name, scen_name, args_name +def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, + not_possible_stations=set(), + soc_lower_thresh=0, relative_soc=False): + events = get_below_zero_soc_events(this_scen=this_scen, + rotations=this_sched.rotations.keys(), + this_sched=this_sched, + soc_upper_thresh=soc_upper_thresh, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=soc_lower_thresh, relative_soc=relative_soc) + + stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} + electrified_station_set = set(stats) + vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), + this_scen.vehicle_socs, + this_scen, electrified_station_set, + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + new_events = get_below_zero_soc_events(this_scen, this_sched.rotations, + this_sched, soc_lower_thresh=soc_lower_thresh, soc_data=vehicle_socs) + return [e["roation"].id for e in new_events] + if __name__ == "__main__": - freeze_support() main() diff --git a/ebus_toolbox/optimizer_config.py b/ebus_toolbox/optimizer_config.py new file mode 100644 index 00000000..f0dba904 --- /dev/null +++ b/ebus_toolbox/optimizer_config.py @@ -0,0 +1,67 @@ +import datetime + +class OptimizerConfig(): + def __init__(self): + pass + +def read_config(config_path): + import configparser + import json + config_path = config_path + config_parser = configparser.ConfigParser() + config_parser.sections() + config_parser.read(config_path) + + conf = OptimizerConfig() + default = config_parser["DEFAULT"] + conf.debug_level = int(default.get("debug_level", 0)) + sce = config_parser["SCENARIO"] + conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) + conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) + conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) + conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) + + pi = config_parser["PICKLE"] + + conf.schedule = pi.get("schedule", "") + conf.scenario = pi.get("scenario", "") + conf.args = pi.get("args", "") + + vehicle = config_parser["VEHICLE"] + conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) + conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) + if conf.battery_capacity==0: + conf.battery_capacity=None + conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) + if conf.charging_curve==[]: + conf.charging_curve=None + conf.charging_power = float(vehicle.get("charging_power", 0)) + if conf.charging_power==0: + conf.charging_power=None + conf.min_soc = float(vehicle.get("min_soc", 0.0)) + + + + optimizer = config_parser["OPTIMIZER"] + conf.solver = optimizer.get("solver", "spiceev") + conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) + conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) + conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", + "rebased_" +str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) + conf.opt_type = optimizer.get("opt_type", "greedy") + conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) + conf.node_choice = optimizer.get("node_choice", "step") + conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) + conf.run_only_neg = optimizer.getboolean("run_only_neg", False) + conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) + conf.output_path= optimizer.get("output_path") + + special = config_parser["SPECIAL"] + conf.decision_tree_path = special.get("decision_tree_path", None) + if conf.decision_tree_path in ["", '""', "''"] : + conf.decision_tree_path=None + conf.save_decision_tree = special.getboolean("save_decision_tree", False) + conf.reduce_rots = special.getboolean("reduce_rots", False) + conf.rots = json.loads(special.get("rots", [])) + + return conf \ No newline at end of file diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 6ea26703..c72402b9 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -89,11 +89,11 @@ def simulate(args): calculate_costs(cost_parameters_file, scenario, schedule, args) import pickle - with open("schedule_buffered_depots_short_utf.pickle", "wb") as f: + with open("schedule_buffered_all_oppb.pickle", "wb") as f: pickle.dump(schedule, f) - with open("scenario_buffered_depots_short_utf.pickle", "wb") as f: + with open("scenario_buffered_all_oppb.pickle", "wb") as f: pickle.dump(scenario, f) - with open("args_buffered_short_utf.pickle", "wb") as f: + with open("args_buffered_all_oppb.pickle", "wb") as f: pickle.dump(args, f) print("pickled") From 3360328a33104ce96945def934ca468448258800 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 14 Dec 2022 13:23:32 +0100 Subject: [PATCH 395/802] Remove loop with removing impossible rots --- data/examples/optimizer.cfg | 18 ++-- ebus_toolbox/optimizer.py | 161 ++++++++++++++++++------------- ebus_toolbox/optimizer_config.py | 3 +- 3 files changed, 105 insertions(+), 77 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index df949e71..4ab2c444 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -4,9 +4,10 @@ debug_level=0 [SCENARIO] # Use "" for ids and not '' -exclusion_rots = [] +exclusion_rots = ["7003_7", "0817_3", "0817_2", "6003_6", "0817_1", "0306a_3", "0817_4", "0306a_2", "0306a_4", "0306a_5", "0306a_1", "0817_5"] exclusion_stations= [] -inclusion_stations= ["Bürstadt Bahnhof", "Weinheim Hauptbahnhof", "Erbach Gesundheiszentrum", "Hirschhorn Bahnhof", "Mörlenbach Bahnhof", "Wald-Michelbach Polizei", "Heppenheim Starkenburg-Gymnasium", "Wald-Michelbach Schulzentrum", "Reisen Bahnhof", "Heppenheim Kreiskrankenhaus", "Birkenau Schloss", "Zotzenbach Schule", "Wahlen Grundschule", "Rimbach Bahnhof", "Heppenheim Gießener Straße", "Erbach Post", "Alsbach Am Hinkelstein", "Nieder-Liebersbach Rathaus", "Geisenbach Ort", "Fürth Bahnhof", "Wald-Michelbach ZOB", "Worms Hauptbahnhof", "Rimbach Kirche", "Heppenheim Vogelsbergstraße", "Auerbach Schillerschule", "Siedelsbrunn Buddhas Weg", "Grasellenbach Im Erzfeld", "Wald-Michelbach Alter Bahnhof", "Bürstadt Lampertheimer Straße", "Bensheim H.-Metzendorf-Schule", "Bensheim Bahnhof/ ZOB", "Gronau Am Mühlkandel", "Bensheim Geschw.-Scholl-Schule", "Großsachsen Rose", "Siedelsbrunn Tannenberg/Morgenstern", "Bensheim G.-Sch.-S./Berl.Ring", "Hirschhorn Grundschule", "Heppenheim Bahnhof", "Birkenau Bahnhof", "Winterkasten Eleonoren-Klinik", "Mörlenbach Grundschule", "Oberflockenbach Rose", "Seidenbach Ort", "Viernheim Bahnhof", "Hornbach Herrenwiese", "Mörlenbach Schulzentrum", "Neunkirchen Heilquelle", "Birkenau Grundschule", "Reichelsheim Schwimmbad", "Gadern Dorfplatz", "Fürth Grundschule", "Einhausen Almenstraße", "Lindenfels Poststraße", "Heppenheim Graben"}] +# If using inclusion stations, scenario should be rebased +inclusion_stations= [] standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, "voltage_level": "MV"} #Buffered @@ -34,20 +35,21 @@ charge_eff = 0.95 [OPTIMIZER] # Not optional path to outputs of optimizer -output_path=.data/buffered/optimization_output +output_path=data/private_examples/332_Buffered/optimization # "quick" or "spiceev" solver = quick -rebase_scenario = True -pickle_rebased= True +rebase_scenario = False +pickle_rebased= False pickle_rebased_name=buffered_rebase_all_electrified run_only_neg=False remove_impossible_rots=False # "greedy" or "deep" without "" -opt_type = greedy +opt_type = deep # "step-by-step" or "brute" without "" -node_choice=step-by-step -max_brute_loop=5 +node_choice=brute +max_brute_loop=250 estimation_threshold = 0.80 +check_for_must_stations=True diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 4a650c02..c96342b7 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -31,6 +31,11 @@ matplotlib.use("TkAgg") global logger +global args +config = OptimizerConfig() +ROT = None +# Global list to be able to keep track of runtimes for optimizing components which are slow +timers = [0] * 10 def setup_logger(): @@ -42,7 +47,7 @@ def setup_logger(): file_handler_all_opts.setLevel(config.debug_level) # And logging to a file which is put in the folder with the other optimizer results - file_handler_this_opt = logging.FileHandler(Path(config.output_path) / Path('optimizer.log')) + file_handler_this_opt = logging.FileHandler(Path(args.output_directory) / Path('optimizer.log')) file_handler_this_opt.setLevel(config.debug_level) formatter = logging.Formatter('%(asctime)s:%(message)s', @@ -61,15 +66,6 @@ def setup_logger(): return this_logger -args = None -scen = None -sched = None -config = OptimizerConfig() -ROT = None -# Global list to be able to keep track of runtimes for optimizing components which are slow -timers = [0] * 10 - - def main(): # run_optimization(sched, scen, args, config_path) """ Optimizes scenario by adding electrified stations sparingly @@ -92,6 +88,10 @@ def main(): config_path = ".\data\examples\optimizer.cfg" config = read_config(config_path) + # Load pickle files + global args + sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario, config.args) + # Prepare Filesystem with folders and paths args.output_directory = Path(config.output_path) / \ str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_optimizer") @@ -111,14 +111,6 @@ def main(): new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") logger = setup_logger() - # Load pickle files - - global args - global scen - global sched - - sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario, config.args) - # Remove those args, since they lead to file creation, which is not # needed. del args.save_timeseries @@ -164,7 +156,6 @@ def main(): else: decision_tree = dict() - not_possible_stations = inclusion_stations.union(exclusion_stations) s = time() @@ -183,17 +174,19 @@ def main(): ele_stations = json.load(file) ele_station_set = set() # Electrify inclusion stations + for stat in inclusion_stations: electrify_station(stat, ele_stations, ele_station_set) new_scen = this_scen new_sched = this_sched rots = {r: new_sched.rotations[r] for r in new_sched.rotations if r not in exclusion_rots} - this_sched.rotations = rots + new_sched.rotations = rots s = time() i = 0 global timer_for_calc + # Create Charging dicts soc_charge_curve_dict = dict() for v_type_name in sched.vehicle_types: soc_charge_curve_dict[v_type_name] = dict() @@ -204,36 +197,41 @@ def main(): sched.cs_power_opps, efficiency=config.charge_eff, timestep=0.1) - while True and i < 2: - if opt_type == "greedy" or opt_type == "deep": - logger.debug("Starting greedy optimization") - ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ - optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, - not_possible_stations, soc_upper_thresh=args.desired_soc_opps, - soc_lower_thresh=config.min_soc, - solver=solver, opt_type=opt_type, - node_choice=node_choice, - soc_charge_curve_dict=soc_charge_curve_dict, - decision_tree=decision_tree) - - i += 1 - if not remove_impossible_rots or len(could_not_be_electrified) == 0: - break - else: - logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") - logger.debug(f"Solver: {solver} took {timer_for_calc} s") - logger.debug(f"Electrified Stations: {len(ele_station_set)}") - logger.debug(ele_station_set) - logger.warning(f"These rotations could not be electrified" - f"\n {could_not_be_electrified}") - - logger.warning("Removing impossible rots, rebasing and restarting optimization") - exclusion_rots.update(could_not_be_electrified) - new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - this_sched, this_scen, args, - inclusion_stations, - exclusion_rots=exclusion_rots, run_only_neg=False) - + ########### + # Remove none Values from socs in the vehicle_socs an + remove_none_socs(new_scen) + + if config.check_for_must_stations: + must_stations = get_must_stations(new_scen, new_sched, args.desired_soc_opps, + soc_charge_curve_dict, + not_possible_stations=not_possible_stations, + soc_lower_thresh=config.min_soc, relative_soc=False) + logger.warning("%s must stations %s", len(must_stations), must_stations) + not_possible_stations = not_possible_stations.union(must_stations) + must_include_set=set() + for stat in must_stations: + # dont put must stations in electrified set --> therefore create trash set + electrify_station(stat, ele_stations, must_include_set) + new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), + new_scen.vehicle_socs, + new_scen, must_stations, + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + + + + logger.debug("Starting greedy optimization") + ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ + optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, + not_possible_stations, soc_upper_thresh=args.desired_soc_opps, + soc_lower_thresh=config.min_soc, + solver=solver, opt_type=opt_type, + node_choice=node_choice, + soc_charge_curve_dict=soc_charge_curve_dict, + decision_tree=decision_tree) + + + ele_station_set=ele_station_set.union(must_include_set) logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") logger.debug(f"Solver: {solver} took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") @@ -289,10 +287,6 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n base_scen = copy(new_scen) base_sched = copy(new_sched) - ########### - # Remove none Values from socs in the vehicle_socs an - remove_none_socs(base_scen) - # Get events where soc fell below 0. The events contain info about the problematic # timespan, which includes stations which could provide a soc lift base_events = get_below_zero_soc_events(this_scen=base_scen, @@ -314,16 +308,12 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # not_possible_stations=not_possible_stations, # soc_lower_thresh=soc_lower_thresh, relative_soc=False) - new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) - # new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, - # new_sched, soc_lower_thresh=soc_lower_thresh) - # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups[:]): events, stations = group @@ -364,7 +354,6 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n len(electrified_station_set)) print(f"There are {combinations} combinations") - while i < config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: @@ -991,11 +980,11 @@ def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, scen: scenar return trips -def get_rotation_soc(rot_id, this_sched, this_scen, soc_data:dict=dict()): +def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = dict()): rot = this_sched.rotations[rot_id] rot_start_idx = get_index_by_time(rot.departure_time, this_scen) rot_end_idx = get_index_by_time(rot.arrival_time, this_scen) - if len(soc_data) !=0: + if len(soc_data) != 0: return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx @@ -1074,7 +1063,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, min_soc=min_soc, stations=possible_stations, vehicle_id=rot.vehicle_id, trip=trips, rotation=rot, stations_list=possible_stations_list, - capacity=sched.vehicle_types[type][ch_type]['capacity'], + capacity=this_sched.vehicle_types[type][ch_type]['capacity'], v_type=type, ch_type=ch_type) events.append(event) @@ -1277,7 +1266,8 @@ def toolbox_to_pickle(name, sched, scen, args): return sched_name, scen_name, args_name -def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, +def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, + soc_charge_curve_dict, not_possible_stations=set(), soc_lower_thresh=0, relative_soc=False): events = get_below_zero_soc_events(this_scen=this_scen, @@ -1291,14 +1281,49 @@ def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thre stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} electrified_station_set = set(stats) vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), - this_scen.vehicle_socs, - this_scen, electrified_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) + this_scen.vehicle_socs, + this_scen, electrified_station_set, + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) new_events = get_below_zero_soc_events(this_scen, this_sched.rotations, - this_sched, soc_lower_thresh=soc_lower_thresh, soc_data=vehicle_socs) + this_sched, soc_lower_thresh=soc_lower_thresh, + soc_data=vehicle_socs) return [e["roation"].id for e in new_events] +# Electrify everything minus 1 station. If without the stations there are below zero events +# it is a must have station +def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, + not_possible_stations=set(), + soc_lower_thresh=0, relative_soc=False): + events = get_below_zero_soc_events(this_scen=this_scen, + rotations=this_sched.rotations.keys(), + this_sched=this_sched, + soc_upper_thresh=soc_upper_thresh, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=soc_lower_thresh, relative_soc=relative_soc) + stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} + electrified_station_set_all = set(stats) + + must_stations = set() + # for s in electrified_station_set_all: + # print(".", end="") + # electrified_station_set = electrified_station_set_all.difference([s]) + # vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), + # this_scen.vehicle_socs, + # this_scen, electrified_station_set, + # soc_charge_curve_dict=soc_charge_curve_dict, + # soc_upper_thresh=args.desired_soc_deps) + # + # new_events = get_below_zero_soc_events(this_scen, this_sched.rotations, + # this_sched, soc_lower_thresh=soc_lower_thresh, + # soc_data=vehicle_socs) + # if len(new_events) > 0: + # must_stations.add(s) + return {'Zotzenbach Schule', 'Heppenheim Vogelsbergstraße', 'Heppenheim Starkenburg-Gymnasium', 'Rimbach Kirche', 'Erbach Post', 'Viernheim Bahnhof', 'Heppenheim Graben', 'Hirschhorn Grundschule', 'Weinheim Hauptbahnhof', 'Lindenfels Poststraße', 'Wahlen Grundschule', 'Wald-Michelbach Alter Bahnhof', 'Wald-Michelbach ZOB', 'Bensheim Bahnhof/ ZOB', 'Bensheim Geschw.-Scholl-Schule', 'Bürstadt Lampertheimer Straße', 'Heppenheim Bahnhof', 'Heppenheim Kreiskrankenhaus', 'Heppenheim Gießener Straße', 'Erbach Gesundheiszentrum'} + return must_stations + + if __name__ == "__main__": main() diff --git a/ebus_toolbox/optimizer_config.py b/ebus_toolbox/optimizer_config.py index f0dba904..2e1284a3 100644 --- a/ebus_toolbox/optimizer_config.py +++ b/ebus_toolbox/optimizer_config.py @@ -1,4 +1,4 @@ -import datetime +from datetime import datetime class OptimizerConfig(): def __init__(self): @@ -55,6 +55,7 @@ def read_config(config_path): conf.run_only_neg = optimizer.getboolean("run_only_neg", False) conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) conf.output_path= optimizer.get("output_path") + conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) special = config_parser["SPECIAL"] conf.decision_tree_path = special.get("decision_tree_path", None) From c42b42ce0006bd47c563bfba6162b68be07f823f Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Wed, 14 Dec 2022 14:57:36 +0100 Subject: [PATCH 396/802] Print info about collecting neg rotations --- ebus_toolbox/simulate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 6d93a238..6bd2a099 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -74,6 +74,7 @@ def simulate(args): change_from = args.mode[4:8] change_to = args.mode[-4:] # get negative rotations + print("Collecting negative rotations from schedule.") neg_rot = schedule.get_negative_rotations(scenario) # check which are rotations relevant and if new other vehicle type exists neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from From 7e84ab461badeb7bbd61b42f7c9ef13bc6aa48a4 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Wed, 14 Dec 2022 15:28:59 +0100 Subject: [PATCH 397/802] fixed calculation for gcs and charging stations --- ebus_toolbox/costs.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 30abfb3e..7ab5b50c 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -50,16 +50,20 @@ def calculate_costs(c_params, scenario, schedule, args): # GRID CONNECTION POINTS gcs = schedule.scenario["constants"]["grid_connectors"] - for gcID, gc_keys in gcs.items(): + for gcID in gcs.keys(): + # get max. power of grid connector + gc = getattr(scenario, f"{gcID}_timeseries") + gc_max_power = -min(gc["grid power [kW]"]) + # get distance of transformer to gc try: distance_transformer = schedule.stations[gcID]["distance_transformer"] except KeyError: distance_transformer = c_params["gc"]["default_distance"] - c_gc = (c_params["gc"]["building_cost_subsidy_per_kW"] * gc_keys["max_power"] + + c_gc = (c_params["gc"]["building_cost_subsidy_per_kW"] * gc_max_power + c_params["gc"]["capex_gc_fix"] + c_params["gc"]["capex_gc_per_meter"] * distance_transformer) c_transformer = (c_params["gc"]["capex_transformer_fix"] + - c_params["gc"]["capex_transformer_per_kW"] * gc_keys["max_power"]) + c_params["gc"]["capex_transformer_per_kW"] * gc_max_power) costs["c_gcs"] += c_gc + c_transformer # calculate annual costs of grid connectors, depending the lifetime of gc and transformer costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + @@ -67,11 +71,17 @@ def calculate_costs(c_params, scenario, schedule, args): # CHARGING INFRASTRUCTURE cs = schedule.scenario["constants"]["charging_stations"] + # depot charging stations for csID in cs.values(): if csID["type"] == "deps": costs["c_cs"] += c_params["cs"]["capex_deps_per_kW"] * csID["max_power"] - elif csID["type"] == "opps": - costs["c_cs"] += c_params["cs"]["capex_opps_per_kW"] * csID["max_power"] + # opportunity charging stations + for gcID, gc_keys in gcs.items(): + # get max. power of opps grid connector + gc = getattr(scenario, f"{gcID}_timeseries") + if schedule.stations[gcID]["type"] == "opps": + costs["c_cs"] += c_params["cs"]["capex_opps_per_kW"] * vars(args)["cs_power_opps"] \ + * max(gc["# occupied CS"]) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] From 0c92106eefa8429b4c9257237f6ee0b693cca90b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 14 Dec 2022 15:39:32 +0100 Subject: [PATCH 398/802] Some refractoring --- data/examples/optimizer.cfg | 13 ++- ebus_toolbox/optimizer.py | 132 ++++++++++++++++--------------- ebus_toolbox/optimizer_config.py | 2 +- 3 files changed, 83 insertions(+), 64 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 4ab2c444..18b67cc7 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -42,14 +42,25 @@ rebase_scenario = False pickle_rebased= False pickle_rebased_name=buffered_rebase_all_electrified run_only_neg=False -remove_impossible_rots=False + # "greedy" or "deep" without "" opt_type = deep # "step-by-step" or "brute" without "" node_choice=brute max_brute_loop=250 estimation_threshold = 0.80 + +# Preferring deps leads to a spice_ev simulation with preferred charging type depots +# Afterwards all negative rotations are swapped to opportunity chargers and optimized +prefer_deps=True + +# Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible +# If they are deemed as impossible, they are not optimized but discarded +remove_impossible_rots=True + + check_for_must_stations=True +include_must_stations = True diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index c96342b7..6996175c 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -33,8 +33,7 @@ global logger global args config = OptimizerConfig() -ROT = None -# Global list to be able to keep track of runtimes for optimizing components which are slow +# global list to be able to keep track of runtimes for optimizing components which are slow timers = [0] * 10 @@ -42,11 +41,11 @@ def setup_logger(): this_logger = logging.getLogger(__name__) this_logger.setLevel(logging.DEBUG) - # Logging to one file which keeps track of optimization over many runs + # logging to one file which keeps track of optimization over many runs file_handler_all_opts = logging.FileHandler('optimizer.log') file_handler_all_opts.setLevel(config.debug_level) - # And logging to a file which is put in the folder with the other optimizer results + # and logging to a file which is put in the folder with the other optimizer results file_handler_this_opt = logging.FileHandler(Path(args.output_directory) / Path('optimizer.log')) file_handler_this_opt.setLevel(config.debug_level) @@ -67,32 +66,41 @@ def setup_logger(): def main(): - # run_optimization(sched, scen, args, config_path) + config_path = ".\data\examples\optimizer.cfg" + run_optimization(config_path) + pass + + +def run_optimization(config_path, sched=None, scen=None, this_args=None): """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. - :param this_sched: Simulation schedule containing buses, rotations etc. - :type this_sched: ebus_toolbox.Schedule + :param sched: Simulation schedule containing buses, rotations etc. + :type sched: ebus_toolbox.Schedule - :param this_scen: Simulation scenario containing simulation results + :param scen: Simulation scenario containing simulation results including the SoC of all vehicles over time - :type this_scen: spice_ev.Scenario + :type scen: spice_ev.Scenario :param args: Simulation arguments for manipulation or generated outputs :type args: object :return: (Schedule,Scenario) optimizied schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - global logger global config - config_path = ".\data\examples\optimizer.cfg" + global logger config = read_config(config_path) - # Load pickle files + # load pickle files + if sched is None or scen is None or this_args is None: + # if no schedule was given as argument, make sure no scenario and args input was given as well. + assert sched == scen == this_args is None + sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario, config.args) + global args - sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario, config.args) + args = this_args - # Prepare Filesystem with folders and paths + # prepare Filesystem with folders and paths args.output_directory = Path(config.output_path) / \ str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_optimizer") # create subfolder for specific sim results with timestamp. @@ -101,17 +109,17 @@ def main(): # args.output_directory can be overwritten by config args.output_directory.mkdir(parents=True, exist_ok=True) + # copy paste the config file c = Path(config_path) o = args.output_directory / Path("optimizer_config.cfg") shutil.copy(c, o) if args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") logger = setup_logger() - # Remove those args, since they lead to file creation, which is not + # remove those args, since they lead to file creation, which is not # needed. del args.save_timeseries del args.save_results @@ -126,9 +134,7 @@ def main(): # which station can not be electrified exclusion_stations = config.exclusion_stations - global ROT - ROT = config.rots[0] if config.reduce_rots: sched.rotations = {rot: sched.rotations[rot] for rot in config.rots} @@ -139,53 +145,55 @@ def main(): node_choice = config.node_choice t = time() - this_sched = sched - this_scen = scen - + # set battery and charging curves through config file if wished for for name, type in sched.vehicle_types.items(): for charge_type, vehicle in type.items(): if config.battery_capacity is not None: vehicle["capacity"] = config.battery_capacity if config.charging_curve is not None: vehicle["charging_curve"] = config.charging_curve - decision_tree_path = config.decision_tree_path + # create a decision tree or load one from a previous run + decision_tree_path = config.decision_tree_path if decision_tree_path is not None: with open(decision_tree_path, "rb") as file: decision_tree = pickle.load(file) else: decision_tree = dict() + # stations which are included can not be included again. Therefore they get into + # the set of not possible stations not_possible_stations = inclusion_stations.union(exclusion_stations) s = time() + # if stations have to be included they are stored in this set + must_include_set = set() + + # rebasing the scenario meaning simulating it again with the given conditions of + # included and excluded stations and rotations if rebase_scenario: logger.debug(f"Spice EV Rebasing Scenario") - new_sched, new_scen, ele_station_set, ele_stations = preprocessing_scenario( - this_sched, this_scen, args, + sched, scen, must_include_set, ele_stations = preprocessing_scenario( + sched, scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing took {time() - s} sec") if config.pickle_rebased: - toolbox_to_pickle(config.pickle_rebased_name, new_sched, new_scen, args) + toolbox_to_pickle(config.pickle_rebased_name, sched, scen, args) logger.debug(f"Rebased scenario pickled as {config.pickle_rebased_name}") else: with open(args.electrified_stations, "r", encoding="utf-8", ) as file: ele_stations = json.load(file) ele_station_set = set() # Electrify inclusion stations - for stat in inclusion_stations: - electrify_station(stat, ele_stations, ele_station_set) - new_scen = this_scen - new_sched = this_sched - rots = {r: new_sched.rotations[r] for r in new_sched.rotations if r not in exclusion_rots} - new_sched.rotations = rots + electrify_station(stat, ele_stations, must_include_set) + rots = {r: sched.rotations[r] for r in sched.rotations if r not in exclusion_rots} + sched.rotations = rots s = time() - i = 0 - global timer_for_calc + global timer_for_calc # Create Charging dicts soc_charge_curve_dict = dict() for v_type_name in sched.vehicle_types: @@ -199,30 +207,27 @@ def main(): ########### # Remove none Values from socs in the vehicle_socs an - remove_none_socs(new_scen) + remove_none_socs(scen) if config.check_for_must_stations: - must_stations = get_must_stations(new_scen, new_sched, args.desired_soc_opps, + must_stations = get_must_stations(scen, sched, args.desired_soc_opps, soc_charge_curve_dict, not_possible_stations=not_possible_stations, soc_lower_thresh=config.min_soc, relative_soc=False) logger.warning("%s must stations %s", len(must_stations), must_stations) not_possible_stations = not_possible_stations.union(must_stations) - must_include_set=set() for stat in must_stations: # dont put must stations in electrified set --> therefore create trash set electrify_station(stat, ele_stations, must_include_set) - new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), - new_scen.vehicle_socs, - new_scen, must_stations, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) - - + scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), + scen.vehicle_socs, + scen, must_stations, + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) logger.debug("Starting greedy optimization") ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ - optimization_loop(ele_stations, ele_station_set, new_scen, new_sched, + optimization_loop(ele_stations, ele_station_set, scen, sched, not_possible_stations, soc_upper_thresh=args.desired_soc_opps, soc_lower_thresh=config.min_soc, solver=solver, opt_type=opt_type, @@ -230,20 +235,18 @@ def main(): soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) - - ele_station_set=ele_station_set.union(must_include_set) + ele_station_set = ele_station_set.union(must_include_set) logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") logger.debug(f"Solver: {solver} took {timer_for_calc} s") logger.debug(f"Electrified Stations: {len(ele_station_set)}") logger.debug(ele_station_set) logger.debug(could_not_be_electrified) - # plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) - new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), - new_scen.vehicle_socs, - new_scen, ele_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) - new_events = get_below_zero_soc_events(new_scen, new_sched.rotations, new_sched, + scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), + scen.vehicle_socs, + scen, ele_station_set, + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + new_events = get_below_zero_soc_events(scen, sched.rotations, sched, soc_lower_thresh=config.min_soc) logger.debug("Still not electrified with fast calc") @@ -258,11 +261,9 @@ def main(): logger.debug(f"Spice EV is calculating optimized case as a complete scenario") final_sched, final_scen, ele_station_set, ele_stations = preprocessing_scenario( - this_sched, this_scen, args, electrified_stations=ele_stations, run_only_neg=False, + sched, scen, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set, cost_calc=True) - # ax = plot_(get_rotation_soc(ROT, new_sched, new_scen)[0]) - # ax.plot(q) logger.warning(f"Still negative rotations:{final_sched.get_negative_rotations(final_scen)}") print("Finished") print(f"Opt took {time() - t}") @@ -276,7 +277,9 @@ def main(): def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, not_possible_stations, soc_charge_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, - decision_tree=dict(), pre_optimized_set=None, opt_type="greedy", **kwargs): + decision_tree=dict(), pre_optimized_set=None, opt_type="greedy", + node_choice="step-by-step", + **kwargs): # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() base_electrified_station_set = electrified_station_set.copy() @@ -324,7 +327,6 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n logger.warning(linien) logger.warning("%s events", (len(events))) solver = kwargs.get("solver", "spiceev") - node_choice = kwargs.get("stationsnode_choice", "step-by-step") if node_choice == "brute": choice_func = choose_station_brute else: @@ -353,7 +355,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n combinations = combs_unordered_no_putting_back(len(stations), len(electrified_station_set)) - print(f"There are {combinations} combinations") + logger.debug(f"There are {combinations} combinations") while i < config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: @@ -721,7 +723,7 @@ def join_all_subsets(subsets): def choose_station_brute(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): station_ids = [x[0] for x in station_eval] - a = combination_generator(station_ids, len(pre_optimized_set)) + a = combination_generator(station_ids, len(pre_optimized_set) - 1) station_eval_dict = {stat[0]: stat[1] for stat in station_eval} for comb in a: node_name = stations_hash(comb) @@ -736,7 +738,7 @@ def choose_station_brute(station_eval, electrified_station_set, logger.debug("skipped %s since potential is too low %s %%", comb, round(potential / -missing_energy * 100, 0)) else: - print("calculated all viable possibilities") + logger.debug("calculated all viable possibilities") return None, False @@ -1321,7 +1323,13 @@ def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_ # soc_data=vehicle_socs) # if len(new_events) > 0: # must_stations.add(s) - return {'Zotzenbach Schule', 'Heppenheim Vogelsbergstraße', 'Heppenheim Starkenburg-Gymnasium', 'Rimbach Kirche', 'Erbach Post', 'Viernheim Bahnhof', 'Heppenheim Graben', 'Hirschhorn Grundschule', 'Weinheim Hauptbahnhof', 'Lindenfels Poststraße', 'Wahlen Grundschule', 'Wald-Michelbach Alter Bahnhof', 'Wald-Michelbach ZOB', 'Bensheim Bahnhof/ ZOB', 'Bensheim Geschw.-Scholl-Schule', 'Bürstadt Lampertheimer Straße', 'Heppenheim Bahnhof', 'Heppenheim Kreiskrankenhaus', 'Heppenheim Gießener Straße', 'Erbach Gesundheiszentrum'} + return {'Zotzenbach Schule', 'Heppenheim Vogelsbergstraße', 'Heppenheim Starkenburg-Gymnasium', + 'Rimbach Kirche', 'Erbach Post', 'Viernheim Bahnhof', 'Heppenheim Graben', + 'Hirschhorn Grundschule', 'Weinheim Hauptbahnhof', 'Lindenfels Poststraße', + 'Wahlen Grundschule', 'Wald-Michelbach Alter Bahnhof', 'Wald-Michelbach ZOB', + 'Bensheim Bahnhof/ ZOB', 'Bensheim Geschw.-Scholl-Schule', + 'Bürstadt Lampertheimer Straße', 'Heppenheim Bahnhof', 'Heppenheim Kreiskrankenhaus', + 'Heppenheim Gießener Straße', 'Erbach Gesundheiszentrum'} return must_stations diff --git a/ebus_toolbox/optimizer_config.py b/ebus_toolbox/optimizer_config.py index 2e1284a3..47081704 100644 --- a/ebus_toolbox/optimizer_config.py +++ b/ebus_toolbox/optimizer_config.py @@ -50,7 +50,7 @@ def read_config(config_path): "rebased_" +str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) conf.opt_type = optimizer.get("opt_type", "greedy") conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) - conf.node_choice = optimizer.get("node_choice", "step") + conf.node_choice = optimizer.get("node_choice", "step-by-step") conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) conf.run_only_neg = optimizer.getboolean("run_only_neg", False) conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) From 02b5780ceda27ccfe58133f107852baf8870d131 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 14 Dec 2022 17:36:42 +0100 Subject: [PATCH 399/802] Some refractoring --- ebus_toolbox/optimizer.py | 107 +++++++++++++++++++------------ ebus_toolbox/optimizer_config.py | 56 ++++++++++++---- 2 files changed, 109 insertions(+), 54 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 6996175c..3904fdf1 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -75,14 +75,17 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. + :param config_path: path to optimizer.cfg file. + :type config_path: str + :param sched: Simulation schedule containing buses, rotations etc. :type sched: ebus_toolbox.Schedule :param scen: Simulation scenario containing simulation results including the SoC of all vehicles over time :type scen: spice_ev.Scenario - :param args: Simulation arguments for manipulation or generated outputs - :type args: object + :param this_args: Simulation arguments for manipulation or generated outputs + :type this_args: object :return: (Schedule,Scenario) optimizied schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) @@ -184,7 +187,6 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): else: with open(args.electrified_stations, "r", encoding="utf-8", ) as file: ele_stations = json.load(file) - ele_station_set = set() # Electrify inclusion stations for stat in inclusion_stations: electrify_station(stat, ele_stations, must_include_set) @@ -194,7 +196,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): s = time() global timer_for_calc - # Create Charging dicts + # create charging dicts which contain energy over time, which is numerically created soc_charge_curve_dict = dict() for v_type_name in sched.vehicle_types: soc_charge_curve_dict[v_type_name] = dict() @@ -226,6 +228,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): soc_upper_thresh=args.desired_soc_deps) logger.debug("Starting greedy optimization") + ele_station_set = set() ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, scen, sched, not_possible_stations, soc_upper_thresh=args.desired_soc_opps, @@ -277,7 +280,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, not_possible_stations, soc_charge_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, - decision_tree=dict(), pre_optimized_set=None, opt_type="greedy", + decision_tree=None, pre_optimized_set=None, opt_type="greedy", node_choice="step-by-step", **kwargs): # Base stations for optimization, so inclusion of stations can be skipped @@ -404,9 +407,17 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets -def get_groups_from_events(events, not_possible_stations=set(), could_not_be_electrified=set()): +def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None): # First create simple list of station sets for single events. # Electrified and other not possible to electrify stations should not connect groups + + # Making sure default arguments are none and not mutable + if not not_possible_stations: + not_possible_stations = set() + + if not could_not_be_electrified: + could_not_be_electrified = set() + possible_stations = [ {station for station in e["stations"] if station not in not_possible_stations} for e @@ -429,7 +440,7 @@ def get_groups_from_events(events, not_possible_stations=set(), could_not_be_ele logger.warning(f'Didnt find rotation {e["rotation"].id} in any subset' f'of possible electrifiable stations') # this event will no show up in an event_group. - # Therefor it needs to be put into this set + # therefore it needs to be put into this set could_not_be_electrified.update([e["rotation"].id]) groups = list(zip(event_groups, station_subsets)) @@ -442,7 +453,10 @@ def group_optimization(group, base_scen, base_sched, not_possible_stations, choose_station_function, soc_curve_dict, pre_optimized_set=None, decision_tree=None, soc_lower_thresh=0, soc_upper_thresh=1, - tree_position=[], type="spiceev", **kwargs): + tree_position=None, type="spiceev", **kwargs): + if not tree_position: + tree_position = [] + # Base socs are the socs without electrification, they get passed through the stacks # so the quick calculation can mutate them since quick calculation cant take place iteratly if kwargs.get("base_socs"): @@ -450,7 +464,7 @@ def group_optimization(group, base_scen, base_sched, else: base_socs = {id: soc for id, soc in base_scen.vehicle_socs.items()} - # Give treeposition + # give tree position logger.debug("%s with length of %s", tree_position, len(tree_position)) # Unpack events and possible stations @@ -638,12 +652,21 @@ def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): def preprocessing_scenario(this_sched, this_scen, this_args, - inclusion_stations=set(), + inclusion_stations=None, electrified_stations=None, - electrified_station_set=set(), - exclusion_rots=set(), + electrified_station_set=None, + exclusion_rots=None, run_only_neg=False, cost_calc=False): + if not inclusion_stations: + inclusion_stations = set() + + if not electrified_station_set: + electrified_station_set = set() + + if not exclusion_rots: + exclusion_rots = set() + if electrified_stations is None: with open(this_args.electrified_stations, "r", encoding="utf-8", ) as f: electrified_stations = json.load(f) @@ -758,7 +781,7 @@ def is_branch_promising(station_eval, electrified_station_set, def choose_station_step_by_step(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): # Filter functions to stop simulating cases which have no hope of being optimal. - # If in optimization mode, optimization can break if station amount is superceded + # If in optimization mode, optimization can break if station amount is superseded # This filter is done better by the next # if pre_optimized_set is not None: # if len(electrified_station_set)>len(pre_optimized_set): @@ -805,7 +828,7 @@ def stations_hash(stations_set): def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc_charge_curve_dict, soc_upper_thresh=1): global timers - ele_stations = set([*ele_station_set, station]) + ele_stations = {*ele_station_set, station} s2 = time() soc_dict = copy(soc_dict) @@ -859,10 +882,13 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, - electrified_station_set=set(), decision_tree=None): + electrified_station_set=None, decision_tree=None): # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by # loading power, standing time at a station, soc at station, minimal soc of the event + if not electrified_station_set: + electrified_station_set = set() + station_eval = dict() for e in events: soc_over_time_curve = soc_curve_dict[e["v_type"]][e["ch_type"]] @@ -982,11 +1008,11 @@ def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, scen: scenar return trips -def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = dict()): +def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): rot = this_sched.rotations[rot_id] rot_start_idx = get_index_by_time(rot.departure_time, this_scen) rot_end_idx = get_index_by_time(rot.arrival_time, this_scen) - if len(soc_data) != 0: + if soc_data: return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx @@ -994,8 +1020,11 @@ def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = dict()): def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, this_sched: schedule.Schedule, soc_upper_thresh=0.9, filter_standing_time=True, - not_possible_stations=set(), soc_lower_thresh=0, relative_soc=False, - soc_data=dict()): + not_possible_stations=None, soc_lower_thresh=0, relative_soc=False, + soc_data=None): + + if not not_possible_stations: + not_possible_stations=set() # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to @@ -1270,8 +1299,11 @@ def toolbox_to_pickle(name, sched, scen, args): def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, - not_possible_stations=set(), + not_possible_stations=None, soc_lower_thresh=0, relative_soc=False): + if not not_possible_stations: + not_possible_stations=set() + events = get_below_zero_soc_events(this_scen=this_scen, rotations=this_sched.rotations.keys(), this_sched=this_sched, @@ -1309,27 +1341,20 @@ def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_ electrified_station_set_all = set(stats) must_stations = set() - # for s in electrified_station_set_all: - # print(".", end="") - # electrified_station_set = electrified_station_set_all.difference([s]) - # vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), - # this_scen.vehicle_socs, - # this_scen, electrified_station_set, - # soc_charge_curve_dict=soc_charge_curve_dict, - # soc_upper_thresh=args.desired_soc_deps) - # - # new_events = get_below_zero_soc_events(this_scen, this_sched.rotations, - # this_sched, soc_lower_thresh=soc_lower_thresh, - # soc_data=vehicle_socs) - # if len(new_events) > 0: - # must_stations.add(s) - return {'Zotzenbach Schule', 'Heppenheim Vogelsbergstraße', 'Heppenheim Starkenburg-Gymnasium', - 'Rimbach Kirche', 'Erbach Post', 'Viernheim Bahnhof', 'Heppenheim Graben', - 'Hirschhorn Grundschule', 'Weinheim Hauptbahnhof', 'Lindenfels Poststraße', - 'Wahlen Grundschule', 'Wald-Michelbach Alter Bahnhof', 'Wald-Michelbach ZOB', - 'Bensheim Bahnhof/ ZOB', 'Bensheim Geschw.-Scholl-Schule', - 'Bürstadt Lampertheimer Straße', 'Heppenheim Bahnhof', 'Heppenheim Kreiskrankenhaus', - 'Heppenheim Gießener Straße', 'Erbach Gesundheiszentrum'} + for s in electrified_station_set_all: + print(".", end="") + electrified_station_set = electrified_station_set_all.difference([s]) + vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), + this_scen.vehicle_socs, + this_scen, electrified_station_set, + soc_charge_curve_dict=soc_charge_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + + new_events = get_below_zero_soc_events(this_scen, this_sched.rotations, + this_sched, soc_lower_thresh=soc_lower_thresh, + soc_data=vehicle_socs) + if len(new_events) > 0: + must_stations.add(s) return must_stations diff --git a/ebus_toolbox/optimizer_config.py b/ebus_toolbox/optimizer_config.py index 47081704..ffa73e56 100644 --- a/ebus_toolbox/optimizer_config.py +++ b/ebus_toolbox/optimizer_config.py @@ -1,9 +1,40 @@ from datetime import datetime + class OptimizerConfig(): def __init__(self): + self.debug_level = None + self.exclusion_rots = None + self.exclusion_stations = None + self.inclusion_stations = None + self.standard_opp_station = None + self.schedule = None + self.scenario = None + self.args = None + self.charge_eff = None + self.battery_capacity = None + self.charging_curve = None + self.charging_power = None + self.min_soc = None + self.solver = None + self.rebase_scenario = None + self.pickle_rebased = None + self.pickle_rebased_name = None + self.opt_type = None + self.remove_impossible_rots = None + self.node_choice = None + self.max_brute_loop = None + self.run_only_neg = None + self.estimation_threshold = None + self.output_path = None + self.check_for_must_stations = None + self.decision_tree_path = None + self.save_decision_tree = None + self.reduce_rots = None + self.rots = None pass + def read_config(config_path): import configparser import json @@ -30,39 +61,38 @@ def read_config(config_path): vehicle = config_parser["VEHICLE"] conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) - if conf.battery_capacity==0: - conf.battery_capacity=None + if conf.battery_capacity == 0: + conf.battery_capacity = None conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) - if conf.charging_curve==[]: - conf.charging_curve=None + if conf.charging_curve == []: + conf.charging_curve = None conf.charging_power = float(vehicle.get("charging_power", 0)) - if conf.charging_power==0: - conf.charging_power=None + if conf.charging_power == 0: + conf.charging_power = None conf.min_soc = float(vehicle.get("min_soc", 0.0)) - - optimizer = config_parser["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", - "rebased_" +str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) + "rebased_" + str( + datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) conf.opt_type = optimizer.get("opt_type", "greedy") conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) conf.node_choice = optimizer.get("node_choice", "step-by-step") conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) conf.run_only_neg = optimizer.getboolean("run_only_neg", False) conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) - conf.output_path= optimizer.get("output_path") + conf.output_path = optimizer.get("output_path") conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) special = config_parser["SPECIAL"] conf.decision_tree_path = special.get("decision_tree_path", None) - if conf.decision_tree_path in ["", '""', "''"] : - conf.decision_tree_path=None + if conf.decision_tree_path in ["", '""', "''"]: + conf.decision_tree_path = None conf.save_decision_tree = special.getboolean("save_decision_tree", False) conf.reduce_rots = special.getboolean("reduce_rots", False) conf.rots = json.loads(special.get("rots", [])) - return conf \ No newline at end of file + return conf From 406f263b0fb8b8fd6701f4104271bcdd973b848e Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 14 Dec 2022 23:47:56 +0100 Subject: [PATCH 400/802] Add more functionality to generate_gc_overview, move function sanitize from report.py to until.py #30 --- ebus_toolbox/report.py | 56 +++++++++++++++++++++++++----------------- ebus_toolbox/util.py | 17 +++++++++++++ 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 9a1abfa0..eff63c90 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -5,27 +5,10 @@ import warnings import json import matplotlib.pyplot as plt - +from ebus_toolbox.util import sanitize from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results, plot -def sanitize(s, chars=''): - """ - Removes special characters from string. - - Used to make strings safe for file paths. - :param s: input to be sanitized - :type s: string - :param chars: characters to replace - :type chars: string - :return: input without special characters in chars - :rtype: string - """ - if not chars: - chars = ':"?*' - return s.translate({ord(c): "" for c in chars}) - - def generate_vehicle_socs(scenario, args): """Generates a csv file from the vehicle's socs in the specified simulation time. @@ -123,20 +106,49 @@ def generate_gc_overview(schedule, scenario, args): all_gc_list = list(schedule.stations.keys()) used_gc_list = list(scenario.constants.grid_connectors.keys()) + stations = getattr(schedule, "stations") with open(args.output_directory / "gc_overview.csv", "w", newline='') as f: csv_writer = csv.writer(f) - csv_writer.writerow(["Maximum power", "Maximum Nr charging stations"]) + csv_writer.writerow(["station_name", + "station_type", + "maximum_power", + "maximum Nr charging stations", + "sum of CS energy", + "use factor least CS", + "use factor 2nd least CS", + "use factor 3rd least CS"]) for gc in all_gc_list: if gc in used_gc_list: - station_name = f"{gc}_timeseries" - ts = getattr(scenario, station_name) + ts = getattr(scenario, f"{gc}_timeseries") max_gc_power = -min(ts["grid power [kW]"]) max_nr_cs = max(ts["# occupied CS"]) + sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 + + # find the smallest use factors + use_factor_list = [0] * (max(ts["# occupied CS"]) + 1) + for v in ts["# occupied CS"]: + use_factor_list[v] += 1 + use_factors = [] + for _ in range(3): + minimum = min(use_factor_list) + for i, v in enumerate(use_factor_list): + if minimum == v: + use_factors.append(i) + use_factor_list[i] = float('inf') + break else: max_gc_power = 0 max_nr_cs = 0 - csv_writer.writerow([max_gc_power, max_nr_cs]) + sum_of_cs_energy = 0 + use_factors = [0, 0, 0] + station_type = stations[gc]["type"] + csv_writer.writerow([gc, + station_type, + max_gc_power, + max_nr_cs, + sum_of_cs_energy, + *use_factors]) def generate(schedule, scenario, args): diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 3741874a..c808d838 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -3,6 +3,23 @@ import subprocess +def sanitize(s, chars=''): + """ + Removes special characters from string. + + Used to make strings safe for file paths. + :param s: input to be sanitized + :type s: string + :param chars: characters to replace + :type chars: string + :return: input without special characters in chars + :rtype: string + """ + if not chars: + chars = ':"?*' + return s.translate({ord(c): "" for c in chars}) + + def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() From 5ccc7154fcd22b9ff3752ad50b050eaf6f8ebd25 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Thu, 15 Dec 2022 08:41:17 +0100 Subject: [PATCH 401/802] reverse unwanted changes, adjust comments --- .gitmodules | 3 +++ data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/simulate.py | 5 ++--- 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..bdebebcb --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "data/private_examples/332_Buffered"] + path = data/private_examples/332_Buffered + url = http://192.168.11.220:82/JulianB/332_Buffered.git diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 7952778c..d86c4d3d 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -42,7 +42,7 @@ seed = 1 # neg_depb_to_oppb changes negative depb-rotations to oppb charging. # neg_oppb_to_depb changes negative oppb-rotations to depb charging. # service optimization finds the largest set of electrified rotations. -mode = sim +#mode = sim # set length of timestep in minutes (default: 15 minute intervals) interval = 1 diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 6bd2a099..f65b43e3 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -74,14 +74,13 @@ def simulate(args): change_from = args.mode[4:8] change_to = args.mode[-4:] # get negative rotations - print("Collecting negative rotations from schedule.") neg_rot = schedule.get_negative_rotations(scenario) - # check which are rotations relevant and if new other vehicle type exists + # check which rotations are relevant and if vehicle with other charging type exists neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from if change_to in vehicle_types[schedule.rotations[r].vehicle_type]] if neg_rot: print(f"Changing charging type from {change_from} to {change_to} for rotations " - f"" + ', '.join(neg_rot)) + + ', '.join(neg_rot)) schedule.set_charging_type(change_to, neg_rot) # simulate again scenario = schedule.run(args) From 35076b17b6f804d721e8063aec5b6bea5f1e1781 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 15 Dec 2022 10:47:51 +0100 Subject: [PATCH 402/802] Make flake8 happy --- ebus_toolbox/optimizer.py | 236 ++++++++++++++++++++------------------ 1 file changed, 123 insertions(+), 113 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 3904fdf1..37163d0b 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -11,10 +11,10 @@ from time import time import logging import math -import util import shutil import report -import src.scenario as scenario +# spice_ev scenario +from src import scenario import schedule import rotation import pickle @@ -23,14 +23,13 @@ from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip from ebus_toolbox.costs import calculate_costs -# Todo this implementation in case of changes in ebustoolbox -from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev +from ebus_toolbox.util import uncomment_json_file, get_buffer_time as get_buffer_time_spice_ev from optimizer_config import read_config, OptimizerConfig import numpy as np matplotlib.use("TkAgg") -global logger +global LOGGER global args config = OptimizerConfig() # global list to be able to keep track of runtimes for optimizing components which are slow @@ -66,7 +65,7 @@ def setup_logger(): def main(): - config_path = ".\data\examples\optimizer.cfg" + config_path = "./data/examples/optimizer.cfg" run_optimization(config_path) pass @@ -91,12 +90,13 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ global config - global logger + global LOGGER config = read_config(config_path) # load pickle files if sched is None or scen is None or this_args is None: - # if no schedule was given as argument, make sure no scenario and args input was given as well. + # if no schedule was given as argument, make sure no scenario + # and args input was given as well. assert sched == scen == this_args is None sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario, config.args) @@ -104,8 +104,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): args = this_args # prepare Filesystem with folders and paths - args.output_directory = Path(config.output_path) / \ - str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_optimizer") + now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + args.output_directory = Path(config.output_path) / str(now + "_optimizer") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. # needs to happen after set_options_from_config since @@ -120,14 +120,14 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): if args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") - logger = setup_logger() + LOGGER = setup_logger() # remove those args, since they lead to file creation, which is not # needed. del args.save_timeseries del args.save_results - # TodO implement in fast calc - args.desired_soc_deps = 1 + if args.desired_soc_deps != 1: + LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") # which rotations should be excluded? exclusion_rots = config.exclusion_rots @@ -149,8 +149,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): t = time() # set battery and charging curves through config file if wished for - for name, type in sched.vehicle_types.items(): - for charge_type, vehicle in type.items(): + for name, v_type in sched.vehicle_types.items(): + for charge_type, vehicle in v_type.items(): if config.battery_capacity is not None: vehicle["capacity"] = config.battery_capacity if config.charging_curve is not None: @@ -175,15 +175,15 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations if rebase_scenario: - logger.debug(f"Spice EV Rebasing Scenario") + LOGGER.debug("Spice EV Rebasing Scenario") sched, scen, must_include_set, ele_stations = preprocessing_scenario( sched, scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) - logger.debug(f"Rebasing took {time() - s} sec") + LOGGER.debug(f"Rebasing took {time() - s} sec") if config.pickle_rebased: toolbox_to_pickle(config.pickle_rebased_name, sched, scen, args) - logger.debug(f"Rebased scenario pickled as {config.pickle_rebased_name}") + LOGGER.debug(f"Rebased scenario pickled as {config.pickle_rebased_name}") else: with open(args.electrified_stations, "r", encoding="utf-8", ) as file: ele_stations = json.load(file) @@ -216,7 +216,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): soc_charge_curve_dict, not_possible_stations=not_possible_stations, soc_lower_thresh=config.min_soc, relative_soc=False) - logger.warning("%s must stations %s", len(must_stations), must_stations) + LOGGER.warning("%s must stations %s", len(must_stations), must_stations) not_possible_stations = not_possible_stations.union(must_stations) for stat in must_stations: # dont put must stations in electrified set --> therefore create trash set @@ -227,7 +227,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) - logger.debug("Starting greedy optimization") + LOGGER.debug("Starting greedy optimization") ele_station_set = set() ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, scen, sched, @@ -239,11 +239,11 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): decision_tree=decision_tree) ele_station_set = ele_station_set.union(must_include_set) - logger.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") - logger.debug(f"Solver: {solver} took {timer_for_calc} s") - logger.debug(f"Electrified Stations: {len(ele_station_set)}") - logger.debug(ele_station_set) - logger.debug(could_not_be_electrified) + LOGGER.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") + LOGGER.debug(f"Solver: {solver} took {timer_for_calc} s") + LOGGER.debug(f"Electrified Stations: {len(ele_station_set)}") + LOGGER.debug(ele_station_set) + LOGGER.debug(could_not_be_electrified) scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), scen.vehicle_socs, scen, ele_station_set, @@ -252,22 +252,22 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): new_events = get_below_zero_soc_events(scen, sched.rotations, sched, soc_lower_thresh=config.min_soc) - logger.debug("Still not electrified with fast calc") + LOGGER.debug("Still not electrified with fast calc") for event in new_events: - logger.debug(event["rotation"].id) - logger.debug("###") + LOGGER.debug(event["rotation"].id) + LOGGER.debug("###") global timers - logger.debug(timers) + LOGGER.debug(timers) with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) - logger.debug(f"Spice EV is calculating optimized case as a complete scenario") + LOGGER.debug("Spice EV is calculating optimized case as a complete scenario") final_sched, final_scen, ele_station_set, ele_stations = preprocessing_scenario( sched, scen, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set, cost_calc=True) - logger.warning(f"Still negative rotations:{final_sched.get_negative_rotations(final_scen)}") + LOGGER.warning(f"Still negative rotations:{final_sched.get_negative_rotations(final_scen)}") print("Finished") print(f"Opt took {time() - t}") @@ -326,9 +326,9 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() - logger.warning(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") - logger.warning(linien) - logger.warning("%s events", (len(events))) + LOGGER.warning(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") + LOGGER.warning(linien) + LOGGER.warning("%s events", (len(events))) solver = kwargs.get("solver", "spiceev") if node_choice == "brute": choice_func = choose_station_brute @@ -346,9 +346,9 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n events_remaining=[len(events)], type=solver, **kwargs) - logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), + LOGGER.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), len(stations)) - logger.warning(electrified_station_set) + LOGGER.warning(electrified_station_set) if opt_type == "deep": sols = [] @@ -358,7 +358,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n combinations = combs_unordered_no_putting_back(len(stations), len(electrified_station_set)) - logger.debug(f"There are {combinations} combinations") + LOGGER.debug(f"There are {combinations} combinations") while i < config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: @@ -375,8 +375,8 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n new_stations, cont_loop = \ group_optimization(group, base_scen, base_sched, electrified_stations, new_electrified_set, - could_not_be_electrified_copy - , not_possible_stations, + could_not_be_electrified_copy, + not_possible_stations, choice_func, soc_charge_curve_dict, pre_optimized_set=pre_optimized_set, decision_tree=decision_tree, @@ -386,16 +386,16 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # if a new set was found, print it and save it in sols if new_electrified_set != pre_optimized_set and new_stations is not None: - logger.warning( + LOGGER.warning( f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ {stations_hash(new_electrified_set)}") sols.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): electrified_station_set = new_electrified_set - logger.debug(sols) + LOGGER.debug(sols) list_greedy_sets[group_nr] = electrified_station_set.copy() - logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), + LOGGER.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), len(stations))) if config.save_decision_tree: with open(args.output_directory / Path("decision_tree.pickle"), "wb") as file: @@ -437,7 +437,7 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec event_groups[i].append(e) break else: - logger.warning(f'Didnt find rotation {e["rotation"].id} in any subset' + LOGGER.warning(f'Didnt find rotation {e["rotation"].id} in any subset' f'of possible electrifiable stations') # this event will no show up in an event_group. # therefore it needs to be put into this set @@ -465,7 +465,7 @@ def group_optimization(group, base_scen, base_sched, base_socs = {id: soc for id, soc in base_scen.vehicle_socs.items()} # give tree position - logger.debug("%s with length of %s", tree_position, len(tree_position)) + LOGGER.debug("%s with length of %s", tree_position, len(tree_position)) # Unpack events and possible stations event_group, possible_stations = group @@ -483,7 +483,7 @@ def group_optimization(group, base_scen, base_sched, missing_energy = get_missing_energy(event_group) if missing_energy >= 0: - logger.debug("Already electrified: Returning set") + LOGGER.debug("Already electrified: Returning set") return electrified_stations, True station_eval = evaluate(event_group, new_scen, soc_curve_dict, @@ -498,7 +498,7 @@ def group_optimization(group, base_scen, base_sched, missing_energy=missing_energy) stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} if best_station_ids is None: - logger.warning( + LOGGER.warning( f"No useful station found with " f"{events_remaining} rotations not electrified yet. " f" Stopped after electrifying {len(electrified_station_set)}") @@ -515,7 +515,7 @@ def group_optimization(group, base_scen, base_sched, else: could_not_be_electrified.update(list(rotation_dict.keys())) return None, False - logger.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) + LOGGER.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) # Electrify station(s) for stat_id in best_station_ids: @@ -525,7 +525,8 @@ def group_optimization(group, base_scen, base_sched, event_rotations = {x["rotation"] for x in event_group} if type == "quick": - # Quick calculation has to electrify everything in one step, or the lifting of socs is not correct + # Quick calculation has to electrify everything in one step, + # or the lifting of socs is not correct new_scen.vehicle_socs = deepcopy(base_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, @@ -554,10 +555,9 @@ def group_optimization(group, base_scen, base_sched, delta_energy = get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) - logger.debug("Last electrification electrified %s/%s." + LOGGER.debug("Last electrification electrified %s/%s." " %s remaining events in the base group.", len(event_group) - len(new_events), len(event_group), events_remaining[0]) - # todo delta_base_energy = delta_energy # get_missing_energy(base_events) # Put this node intro the decision tree including the missing energy @@ -598,35 +598,37 @@ def group_optimization(group, base_scen, base_sched, else: return None, True - # Evaluate if following this branch makes sense - if pre_optimized_set is not None: - if len(pre_optimized_set) - len(electrified_station_set) < 10: - new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, - new_scen.vehicle_socs, - new_scen, electrified_station_set, - soc_curve_dict, - soc_upper_thresh=args.desired_soc_deps) - - prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, - new_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, - relative_soc=True) - - station_eval = evaluate(prune_events, new_scen, soc_curve_dict, - soc_upper_thresh=soc_upper_thresh, - soc_lower_thresh=soc_lower_thresh) - prune_missing_energy = get_missing_energy(prune_events) - if not is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, prune_missing_energy): - print("Branch pruned early") - is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, missing_energy) - return None, True - - return electrified_stations, True + # If there is no pre optimized set function can return + if pre_optimized_set is None: + return electrified_stations, True + + # If there is a preoptimized set check if the preoptimized set leads to pruning + # i.e. if if following branch makes sense + if len(pre_optimized_set) - len(electrified_station_set) < 10: + new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, + new_scen.vehicle_socs, + new_scen, electrified_station_set, + soc_curve_dict, + soc_upper_thresh=args.desired_soc_deps) + + prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, + new_sched, + soc_upper_thresh=soc_upper_thresh, + filter_standing_time=True, + not_possible_stations=not_possible_stations, + soc_lower_thresh=soc_lower_thresh, + relative_soc=True) + + station_eval = evaluate(prune_events, new_scen, soc_curve_dict, + soc_upper_thresh=soc_upper_thresh, + soc_lower_thresh=soc_lower_thresh) + prune_missing_energy = get_missing_energy(prune_events) + if not is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, prune_missing_energy): + print("Branch pruned early") + is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, missing_energy) + return None, True def get_missing_energy(events): @@ -642,7 +644,7 @@ def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): decision_tree[node_name]["missing_energy"] = delta_base_energy decision_tree[node_name]["visit_counter"] += 1 # todo add is_viable - logger.debug("already visited") + LOGGER.debug("already visited") except KeyError: decision_tree[node_name] = dict() decision_tree[node_name]["missing_energy"] = delta_base_energy @@ -726,7 +728,7 @@ def plot_rot(id, this_sched, this_scen, ax=None, rot_only=True): if not rot_only: b = 0 c = -1 - if ax == None: + if ax is None: fig, ax = plt.subplots() ax.plot(a[b:c], linewidth=2.0) return ax @@ -742,7 +744,6 @@ def join_all_subsets(subsets): return subsets -# ToDo Further implement def choose_station_brute(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): station_ids = [x[0] for x in station_eval] @@ -758,10 +759,10 @@ def choose_station_brute(station_eval, electrified_station_set, if potential > -missing_energy * config.estimation_threshold: return comb, False else: - logger.debug("skipped %s since potential is too low %s %%", comb, + LOGGER.debug("skipped %s since potential is too low %s %%", comb, round(potential / -missing_energy * 100, 0)) else: - logger.debug("calculated all viable possibilities") + LOGGER.debug("calculated all viable possibilities") return None, False @@ -813,7 +814,8 @@ def choose_station_step_by_step(station_eval, electrified_station_set, # to do what now? # Simply visit the least visited node for station in station_eval: - # Create a station combination from already electrified stations and possible new station + # Create a station combination from already electrified stations + # and possible new station check_stations = electrified_station_set.union([station[0]]) if decision_tree[stations_hash(check_stations)]["visit_counter"] == min_count_visited: best_station_id = station[0] @@ -891,7 +893,7 @@ def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_th station_eval = dict() for e in events: - soc_over_time_curve = soc_curve_dict[e["v_type"]][e["ch_type"]] + soc_over_time = soc_curve_dict[e["v_type"]][e["ch_type"]] for i, trip in enumerate(e["trip"]): # Station is only evaluated if station name is part of event stations # Only these stations showed potential in electrification, e.g enough standing time @@ -899,7 +901,7 @@ def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_th continue idx = get_index_by_time(trip.arrival_time, eval_scen) soc = eval_scen.vehicle_socs[e["vehicle_id"]][idx] - # ToDo define elsewhere + max_soc = soc_upper_thresh min_soc = soc_lower_thresh # Potential is the minimal amount of @@ -914,17 +916,16 @@ def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_th standing_time_min = 0 # energy_charging_potential = standing_time_min *60 * ch_power - energy_charging_potential = get_delta_soc(soc_over_time_curve, soc, standing_time_min) \ - * e["capacity"] + e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min) * e["capacity"] # Potential is at max the minimum between the useful delta soc * capacity or the # energy provided by charging for the full standing time - delta_E_pot = min(delta_soc_pot * e["capacity"], energy_charging_potential) + delta_E_pot = min(delta_soc_pot * e["capacity"], e_charging_pot) d = dict(E_pot=delta_E_pot, standing_time=timedelta(minutes=standing_time_min)) try: station_eval[trip.arrival_name]["pot_list"].append(d) - except: + except KeyError: station_eval[trip.arrival_name] = dict(pot_list=[], pot_sum=0) station_eval[trip.arrival_name]["pot_list"].append(d) @@ -966,7 +967,8 @@ def join_subsets(subsets): subsets = [s.copy() for s in subsets] for i in range(len(subsets)): for ii in range(len(subsets)): - if i == ii: continue + if i == ii: + continue intersec = subsets[i].intersection(subsets[ii]) if len(intersec) > 0: subsets[i] = subsets[i].union(subsets[ii]) @@ -1022,9 +1024,8 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, soc_upper_thresh=0.9, filter_standing_time=True, not_possible_stations=None, soc_lower_thresh=0, relative_soc=False, soc_data=None): - if not not_possible_stations: - not_possible_stations=set() + not_possible_stations = set() # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to @@ -1046,7 +1047,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, # if rotation gets a start soc below 1 this should change below 0 soc events since fixing # the rotation before would lead to fixing this rotation - # ToDo if using relative SOC, SOC lookup has to be adjusted + # if using relative SOC, SOC lookup has to be adjusted if relative_soc: start_soc = comb[0][0] soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( @@ -1058,13 +1059,15 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, i = min_idx idx = [x[1] for x in reduced_list] while soc[i] < SOC_UPPER_THRESH: - if i == rot_start_idx: break + if i == rot_start_idx: + break i -= 1 start_comb = idx.index(i) start = i i = min_idx while soc[i] < SOC_UPPER_THRESH: - if i >= rot_end_idx - 1: break + if i >= rot_end_idx - 1: + break i += 1 end_comb = idx.index(i) trips = get_trips(rot=rot, start_idx=start, end_idx=min_idx, scen=this_scen) @@ -1160,7 +1163,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal # cost calculation following directly after simulation try: with open(args.cost_parameters_file, encoding='utf-8') as f: - cost_parameters_file = util.uncomment_json_file(f) + cost_parameters_file = uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to cost parameters ({args.cost_parameters_file}) " "does not exist. Exiting...") @@ -1241,37 +1244,42 @@ def get_buffer_time(trip, args): return b -def combs_unordered_no_putting_back(n, k): - return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) +def combs_unordered_no_putting_back(n: int, k: int): + try: + return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) + except ValueError: + LOGGER.warning("Value Error") + return 0 -def remove_none_socs(base_scen): +def remove_none_socs(this_scen): # Make sure no None values exists in SOCs. Fill later values with last value - # which was not None - for id, soc in base_scen.vehicle_socs.items(): + # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] + for id, soc in this_scen.vehicle_socs.items(): soc = np.array(soc) + last_not_none = "not found" if None in soc: for ii in range(len(soc) - 1, -1, -1): if soc[ii] is not None: last_not_none = soc[ii] break soc[soc == np.array(None)] = last_not_none - base_scen.vehicle_socs[id] = soc + this_scen.vehicle_socs[id] = soc -def get_vehicle(id, sched): - return sched.rotations[id].vehicle_id +def get_vehicle(rot_id, this_sched): + return this_sched.rotations[rot_id].vehicle_id -def get_vehicle_rots(id, sched): - return [rot for rot in sched.rotations if id == get_vehicle(rot, sched)] +def get_vehicle_rots(rot_id, this_sched): + return [rot for rot in this_sched.rotations if rot_id == get_vehicle(rot, this_sched)] def station_eval_to_logger(missing_energy, station_eval): - logger.debug("Missing energy: %s", missing_energy) - if logger.getEffectiveLevel() > logging.DEBUG: + LOGGER.debug("Missing energy: %s", missing_energy) + if LOGGER.getEffectiveLevel() > logging.DEBUG: for stat_id in station_eval: - logger.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) + LOGGER.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) def toolbox_from_pickle(sched_name, scen_name, args_name): @@ -1302,7 +1310,7 @@ def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thre not_possible_stations=None, soc_lower_thresh=0, relative_soc=False): if not not_possible_stations: - not_possible_stations=set() + not_possible_stations = set() events = get_below_zero_soc_events(this_scen=this_scen, rotations=this_sched.rotations.keys(), @@ -1328,7 +1336,7 @@ def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thre # Electrify everything minus 1 station. If without the stations there are below zero events # it is a must have station def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, - not_possible_stations=set(), + not_possible_stations=None, soc_lower_thresh=0, relative_soc=False): events = get_below_zero_soc_events(this_scen=this_scen, rotations=this_sched.rotations.keys(), @@ -1337,6 +1345,8 @@ def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_ filter_standing_time=True, not_possible_stations=not_possible_stations, soc_lower_thresh=soc_lower_thresh, relative_soc=relative_soc) + if not not_possible_stations: + not_possible_stations = set() stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} electrified_station_set_all = set(stats) From 2353c3f6cbaf7aef797fa038e559d3732fd0f332 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 15 Dec 2022 13:25:47 +0100 Subject: [PATCH 403/802] adapt times for example csv files --- data/examples/electrified_stations.json | 4 +- data/examples/example_external_load.csv | 336 ++++++++++++------------ data/examples/example_pv_feedin.csv | 336 ++++++++++++------------ 3 files changed, 338 insertions(+), 338 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 1dfb7263..b1a068ae 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -5,7 +5,7 @@ "distance_transformer": 150, "energy_feed_in": { "csv_file": "data/examples/example_pv_feedin.csv", - "start_time": "2022-03-08T00:00:00", + "start_time": "2022-03-07T00:00:00", "step_duration_s": 3600, "column": "Feed-in Total (kW)", "nominal_power": 10, @@ -13,7 +13,7 @@ }, "external_load": { "csv_file": "data/examples/example_external_load.csv", - "start_time": "2022-03-07T20:25:00", + "start_time": "2022-03-07T00:00:00", "step_duration_s": 900, "column": "External Load (kW)", "factor": 2 diff --git a/data/examples/example_external_load.csv b/data/examples/example_external_load.csv index 7aca3054..67939e4a 100644 --- a/data/examples/example_external_load.csv +++ b/data/examples/example_external_load.csv @@ -1,169 +1,169 @@ time,External Load (kW) -2018-01-01 00:30:00+01:00,5.16 -2018-01-01 01:30:00+01:00,35.48 -2018-01-01 02:30:00+01:00,6.00 -2018-01-01 03:30:00+01:00,4.11 -2018-01-01 04:30:00+01:00,33.82 -2018-01-01 05:30:00+01:00,15.24 -2018-01-01 06:30:00+01:00,8.14 -2018-01-01 07:30:00+01:00,14.29 -2018-01-01 08:30:00+01:00,28.21 -2018-01-01 09:30:00+01:00,11.47 -2018-01-01 10:30:00+01:00,10.48 -2018-01-01 11:30:00+01:00,18.22 -2018-01-01 12:30:00+01:00,37.40 -2018-01-01 13:30:00+01:00,34.82 -2018-01-01 14:30:00+01:00,4.60 -2018-01-01 15:30:00+01:00,31.82 -2018-01-01 16:30:00+01:00,29.10 -2018-01-01 17:30:00+01:00,22.37 -2018-01-01 18:30:00+01:00,15.62 -2018-01-01 19:30:00+01:00,8.29 -2018-01-01 20:30:00+01:00,33.94 -2018-01-01 21:30:00+01:00,3.23 -2018-01-01 22:30:00+01:00,23.44 -2018-01-01 23:30:00+01:00,17.28 -2018-01-02 00:30:00+01:00,10.01 -2018-01-02 01:30:00+01:00,32.82 -2018-01-02 02:30:00+01:00,12.49 -2018-01-02 03:30:00+01:00,7.27 -2018-01-02 04:30:00+01:00,37.27 -2018-01-02 05:30:00+01:00,34.28 -2018-01-02 06:30:00+01:00,25.58 -2018-01-02 07:30:00+01:00,18.00 -2018-01-02 08:30:00+01:00,7.90 -2018-01-02 09:30:00+01:00,1.88 -2018-01-02 10:30:00+01:00,19.48 -2018-01-02 11:30:00+01:00,21.86 -2018-01-02 12:30:00+01:00,0.67 -2018-01-02 13:30:00+01:00,3.62 -2018-01-02 14:30:00+01:00,4.61 -2018-01-02 15:30:00+01:00,17.42 -2018-01-02 16:30:00+01:00,39.72 -2018-01-02 17:30:00+01:00,26.93 -2018-01-02 18:30:00+01:00,7.25 -2018-01-02 19:30:00+01:00,6.29 -2018-01-02 20:30:00+01:00,15.48 -2018-01-02 21:30:00+01:00,1.89 -2018-01-02 22:30:00+01:00,38.54 -2018-01-02 23:30:00+01:00,36.71 -2018-01-03 00:30:00+01:00,0.63 -2018-01-03 01:30:00+01:00,15.72 -2018-01-03 02:30:00+01:00,14.13 -2018-01-03 03:30:00+01:00,6.39 -2018-01-03 04:30:00+01:00,11.81 -2018-01-03 05:30:00+01:00,30.54 -2018-01-03 06:30:00+01:00,1.67 -2018-01-03 07:30:00+01:00,10.25 -2018-01-03 08:30:00+01:00,19.56 -2018-01-03 09:30:00+01:00,28.35 -2018-01-03 10:30:00+01:00,30.06 -2018-01-03 11:30:00+01:00,12.46 -2018-01-03 12:30:00+01:00,21.00 -2018-01-03 13:30:00+01:00,16.93 -2018-01-03 14:30:00+01:00,26.33 -2018-01-03 15:30:00+01:00,11.79 -2018-01-03 16:30:00+01:00,31.70 -2018-01-03 17:30:00+01:00,33.23 -2018-01-03 18:30:00+01:00,15.07 -2018-01-03 19:30:00+01:00,6.85 -2018-01-03 20:30:00+01:00,18.43 -2018-01-03 21:30:00+01:00,15.52 -2018-01-03 22:30:00+01:00,3.19 -2018-01-03 23:30:00+01:00,1.38 -2018-01-04 00:30:00+01:00,38.34 -2018-01-04 01:30:00+01:00,22.72 -2018-01-04 02:30:00+01:00,6.04 -2018-01-04 03:30:00+01:00,5.20 -2018-01-04 04:30:00+01:00,13.89 -2018-01-04 05:30:00+01:00,1.95 -2018-01-04 06:30:00+01:00,17.37 -2018-01-04 07:30:00+01:00,10.18 -2018-01-04 08:30:00+01:00,31.57 -2018-01-04 09:30:00+01:00,1.85 -2018-01-04 10:30:00+01:00,27.54 -2018-01-04 11:30:00+01:00,15.15 -2018-01-04 12:30:00+01:00,27.39 -2018-01-04 13:30:00+01:00,1.07 -2018-01-04 14:30:00+01:00,15.87 -2018-01-04 15:30:00+01:00,8.68 -2018-01-04 16:30:00+01:00,11.23 -2018-01-04 17:30:00+01:00,32.89 -2018-01-04 18:30:00+01:00,36.06 -2018-01-04 19:30:00+01:00,17.42 -2018-01-04 20:30:00+01:00,26.70 -2018-01-04 21:30:00+01:00,32.41 -2018-01-04 22:30:00+01:00,27.35 -2018-01-04 23:30:00+01:00,2.69 -2018-01-05 00:30:00+01:00,36.49 -2018-01-05 01:30:00+01:00,36.07 -2018-01-05 02:30:00+01:00,28.91 -2018-01-05 03:30:00+01:00,29.32 -2018-01-05 04:30:00+01:00,39.44 -2018-01-05 05:30:00+01:00,7.89 -2018-01-05 06:30:00+01:00,8.04 -2018-01-05 07:30:00+01:00,33.84 -2018-01-05 08:30:00+01:00,26.80 -2018-01-05 09:30:00+01:00,38.52 -2018-01-05 10:30:00+01:00,33.08 -2018-01-05 11:30:00+01:00,11.39 -2018-01-05 12:30:00+01:00,39.39 -2018-01-05 13:30:00+01:00,29.03 -2018-01-05 14:30:00+01:00,12.59 -2018-01-05 15:30:00+01:00,30.77 -2018-01-05 16:30:00+01:00,37.99 -2018-01-05 17:30:00+01:00,27.89 -2018-01-05 18:30:00+01:00,0.32 -2018-01-05 19:30:00+01:00,22.43 -2018-01-05 20:30:00+01:00,0.25 -2018-01-05 21:30:00+01:00,25.04 -2018-01-05 22:30:00+01:00,11.68 -2018-01-05 23:30:00+01:00,6.74 -2018-01-06 00:30:00+01:00,36.65 -2018-01-06 01:30:00+01:00,17.65 -2018-01-06 02:30:00+01:00,9.48 -2018-01-06 03:30:00+01:00,27.64 -2018-01-06 04:30:00+01:00,22.12 -2018-01-06 05:30:00+01:00,17.45 -2018-01-06 06:30:00+01:00,11.22 -2018-01-06 07:30:00+01:00,9.37 -2018-01-06 08:30:00+01:00,35.61 -2018-01-06 09:30:00+01:00,8.27 -2018-01-06 10:30:00+01:00,11.68 -2018-01-06 11:30:00+01:00,33.98 -2018-01-06 12:30:00+01:00,36.31 -2018-01-06 13:30:00+01:00,33.21 -2018-01-06 14:30:00+01:00,37.04 -2018-01-06 15:30:00+01:00,8.37 -2018-01-06 16:30:00+01:00,4.22 -2018-01-06 17:30:00+01:00,12.98 -2018-01-06 18:30:00+01:00,14.96 -2018-01-06 19:30:00+01:00,19.94 -2018-01-06 20:30:00+01:00,5.09 -2018-01-06 21:30:00+01:00,37.47 -2018-01-06 22:30:00+01:00,16.43 -2018-01-06 23:30:00+01:00,31.26 -2018-01-07 00:30:00+01:00,10.79 -2018-01-07 01:30:00+01:00,7.06 -2018-01-07 02:30:00+01:00,39.06 -2018-01-07 03:30:00+01:00,12.52 -2018-01-07 04:30:00+01:00,34.01 -2018-01-07 05:30:00+01:00,9.36 -2018-01-07 06:30:00+01:00,22.25 -2018-01-07 07:30:00+01:00,31.88 -2018-01-07 08:30:00+01:00,27.65 -2018-01-07 09:30:00+01:00,5.76 -2018-01-07 10:30:00+01:00,38.97 -2018-01-07 11:30:00+01:00,22.58 -2018-01-07 12:30:00+01:00,18.30 -2018-01-07 13:30:00+01:00,8.78 -2018-01-07 14:30:00+01:00,37.14 -2018-01-07 15:30:00+01:00,9.10 -2018-01-07 16:30:00+01:00,38.67 -2018-01-07 17:30:00+01:00,36.16 -2018-01-07 18:30:00+01:00,4.79 -2018-01-07 19:30:00+01:00,12.90 -2018-01-07 20:30:00+01:00,28.39 -2018-01-07 21:30:00+01:00,20.73 -2018-01-07 22:30:00+01:00,39.39 -2018-01-07 23:30:00+01:00,23.12 +2018-01-01 00:00:00+01:00,5.16 +2018-01-01 01:00:00+01:00,35.48 +2018-01-01 02:00:00+01:00,6.00 +2018-01-01 03:00:00+01:00,4.11 +2018-01-01 04:00:00+01:00,33.82 +2018-01-01 05:00:00+01:00,15.24 +2018-01-01 06:00:00+01:00,8.14 +2018-01-01 07:00:00+01:00,14.29 +2018-01-01 08:00:00+01:00,28.21 +2018-01-01 09:00:00+01:00,11.47 +2018-01-01 10:00:00+01:00,10.48 +2018-01-01 11:00:00+01:00,18.22 +2018-01-01 12:00:00+01:00,37.40 +2018-01-01 13:00:00+01:00,34.82 +2018-01-01 14:00:00+01:00,4.60 +2018-01-01 15:00:00+01:00,31.82 +2018-01-01 16:00:00+01:00,29.10 +2018-01-01 17:00:00+01:00,22.37 +2018-01-01 18:00:00+01:00,15.62 +2018-01-01 19:00:00+01:00,8.29 +2018-01-01 20:00:00+01:00,33.94 +2018-01-01 21:00:00+01:00,3.23 +2018-01-01 22:00:00+01:00,23.44 +2018-01-01 23:00:00+01:00,17.28 +2018-01-02 00:00:00+01:00,10.01 +2018-01-02 01:00:00+01:00,32.82 +2018-01-02 02:00:00+01:00,12.49 +2018-01-02 03:00:00+01:00,7.27 +2018-01-02 04:00:00+01:00,37.27 +2018-01-02 05:00:00+01:00,34.28 +2018-01-02 06:00:00+01:00,25.58 +2018-01-02 07:00:00+01:00,18.00 +2018-01-02 08:00:00+01:00,7.90 +2018-01-02 09:00:00+01:00,1.88 +2018-01-02 10:00:00+01:00,19.48 +2018-01-02 11:00:00+01:00,21.86 +2018-01-02 12:00:00+01:00,0.67 +2018-01-02 13:00:00+01:00,3.62 +2018-01-02 14:00:00+01:00,4.61 +2018-01-02 15:00:00+01:00,17.42 +2018-01-02 16:00:00+01:00,39.72 +2018-01-02 17:00:00+01:00,26.93 +2018-01-02 18:00:00+01:00,7.25 +2018-01-02 19:00:00+01:00,6.29 +2018-01-02 20:00:00+01:00,15.48 +2018-01-02 21:00:00+01:00,1.89 +2018-01-02 22:00:00+01:00,38.54 +2018-01-02 23:00:00+01:00,36.71 +2018-01-03 00:00:00+01:00,0.63 +2018-01-03 01:00:00+01:00,15.72 +2018-01-03 02:00:00+01:00,14.13 +2018-01-03 03:00:00+01:00,6.39 +2018-01-03 04:00:00+01:00,11.81 +2018-01-03 05:00:00+01:00,30.54 +2018-01-03 06:00:00+01:00,1.67 +2018-01-03 07:00:00+01:00,10.25 +2018-01-03 08:00:00+01:00,19.56 +2018-01-03 09:00:00+01:00,28.35 +2018-01-03 10:00:00+01:00,30.06 +2018-01-03 11:00:00+01:00,12.46 +2018-01-03 12:00:00+01:00,21.00 +2018-01-03 13:00:00+01:00,16.93 +2018-01-03 14:00:00+01:00,26.33 +2018-01-03 15:00:00+01:00,11.79 +2018-01-03 16:00:00+01:00,31.70 +2018-01-03 17:00:00+01:00,33.23 +2018-01-03 18:00:00+01:00,15.07 +2018-01-03 19:00:00+01:00,6.85 +2018-01-03 20:00:00+01:00,18.43 +2018-01-03 21:00:00+01:00,15.52 +2018-01-03 22:00:00+01:00,3.19 +2018-01-03 23:00:00+01:00,1.38 +2018-01-04 00:00:00+01:00,38.34 +2018-01-04 01:00:00+01:00,22.72 +2018-01-04 02:00:00+01:00,6.04 +2018-01-04 03:00:00+01:00,5.20 +2018-01-04 04:00:00+01:00,13.89 +2018-01-04 05:00:00+01:00,1.95 +2018-01-04 06:00:00+01:00,17.37 +2018-01-04 07:00:00+01:00,10.18 +2018-01-04 08:00:00+01:00,31.57 +2018-01-04 09:00:00+01:00,1.85 +2018-01-04 10:00:00+01:00,27.54 +2018-01-04 11:00:00+01:00,15.15 +2018-01-04 12:00:00+01:00,27.39 +2018-01-04 13:00:00+01:00,1.07 +2018-01-04 14:00:00+01:00,15.87 +2018-01-04 15:00:00+01:00,8.68 +2018-01-04 16:00:00+01:00,11.23 +2018-01-04 17:00:00+01:00,32.89 +2018-01-04 18:00:00+01:00,36.06 +2018-01-04 19:00:00+01:00,17.42 +2018-01-04 20:00:00+01:00,26.70 +2018-01-04 21:00:00+01:00,32.41 +2018-01-04 22:00:00+01:00,27.35 +2018-01-04 23:00:00+01:00,2.69 +2018-01-05 00:00:00+01:00,36.49 +2018-01-05 01:00:00+01:00,36.07 +2018-01-05 02:00:00+01:00,28.91 +2018-01-05 03:00:00+01:00,29.32 +2018-01-05 04:00:00+01:00,39.44 +2018-01-05 05:00:00+01:00,7.89 +2018-01-05 06:00:00+01:00,8.04 +2018-01-05 07:00:00+01:00,33.84 +2018-01-05 08:00:00+01:00,26.80 +2018-01-05 09:00:00+01:00,38.52 +2018-01-05 10:00:00+01:00,33.08 +2018-01-05 11:00:00+01:00,11.39 +2018-01-05 12:00:00+01:00,39.39 +2018-01-05 13:00:00+01:00,29.03 +2018-01-05 14:00:00+01:00,12.59 +2018-01-05 15:00:00+01:00,30.77 +2018-01-05 16:00:00+01:00,37.99 +2018-01-05 17:00:00+01:00,27.89 +2018-01-05 18:00:00+01:00,0.32 +2018-01-05 19:00:00+01:00,22.43 +2018-01-05 20:00:00+01:00,0.25 +2018-01-05 21:00:00+01:00,25.04 +2018-01-05 22:00:00+01:00,11.68 +2018-01-05 23:00:00+01:00,6.74 +2018-01-06 00:00:00+01:00,36.65 +2018-01-06 01:00:00+01:00,17.65 +2018-01-06 02:00:00+01:00,9.48 +2018-01-06 03:00:00+01:00,27.64 +2018-01-06 04:00:00+01:00,22.12 +2018-01-06 05:00:00+01:00,17.45 +2018-01-06 06:00:00+01:00,11.22 +2018-01-06 07:00:00+01:00,9.37 +2018-01-06 08:00:00+01:00,35.61 +2018-01-06 09:00:00+01:00,8.27 +2018-01-06 10:00:00+01:00,11.68 +2018-01-06 11:00:00+01:00,33.98 +2018-01-06 12:00:00+01:00,36.31 +2018-01-06 13:00:00+01:00,33.21 +2018-01-06 14:00:00+01:00,37.04 +2018-01-06 15:00:00+01:00,8.37 +2018-01-06 16:00:00+01:00,4.22 +2018-01-06 17:00:00+01:00,12.98 +2018-01-06 18:00:00+01:00,14.96 +2018-01-06 19:00:00+01:00,19.94 +2018-01-06 20:00:00+01:00,5.09 +2018-01-06 21:00:00+01:00,37.47 +2018-01-06 22:00:00+01:00,16.43 +2018-01-06 23:00:00+01:00,31.26 +2018-01-07 00:00:00+01:00,10.79 +2018-01-07 01:00:00+01:00,7.06 +2018-01-07 02:00:00+01:00,39.06 +2018-01-07 03:00:00+01:00,12.52 +2018-01-07 04:00:00+01:00,34.01 +2018-01-07 05:00:00+01:00,9.36 +2018-01-07 06:00:00+01:00,22.25 +2018-01-07 07:00:00+01:00,31.88 +2018-01-07 08:00:00+01:00,27.65 +2018-01-07 09:00:00+01:00,5.76 +2018-01-07 10:00:00+01:00,38.97 +2018-01-07 11:00:00+01:00,22.58 +2018-01-07 12:00:00+01:00,18.30 +2018-01-07 13:00:00+01:00,8.78 +2018-01-07 14:00:00+01:00,37.14 +2018-01-07 15:00:00+01:00,9.10 +2018-01-07 16:00:00+01:00,38.67 +2018-01-07 17:00:00+01:00,36.16 +2018-01-07 18:00:00+01:00,4.79 +2018-01-07 19:00:00+01:00,12.90 +2018-01-07 20:00:00+01:00,28.39 +2018-01-07 21:00:00+01:00,20.73 +2018-01-07 22:00:00+01:00,39.39 +2018-01-07 23:00:00+01:00,23.12 diff --git a/data/examples/example_pv_feedin.csv b/data/examples/example_pv_feedin.csv index c2a28c8f..7725d8cc 100644 --- a/data/examples/example_pv_feedin.csv +++ b/data/examples/example_pv_feedin.csv @@ -1,169 +1,169 @@ time,Feed-in Total (kW) -2018-01-01 00:30:00+01:00,0.0 -2018-01-01 01:30:00+01:00,0.0 -2018-01-01 02:30:00+01:00,0.0 -2018-01-01 03:30:00+01:00,0.0 -2018-01-01 04:30:00+01:00,0.0 -2018-01-01 05:30:00+01:00,0.0 -2018-01-01 06:30:00+01:00,0.0 -2018-01-01 07:30:00+01:00,0.0 -2018-01-01 08:30:00+01:00,0.0 -2018-01-01 09:30:00+01:00,20.59949737304199 -2018-01-01 10:30:00+01:00,57.44536767395442 -2018-01-01 11:30:00+01:00,87.80795648835002 -2018-01-01 12:30:00+01:00,82.4312872827236 -2018-01-01 13:30:00+01:00,60.73295277209872 -2018-01-01 14:30:00+01:00,38.57275076938971 -2018-01-01 15:30:00+01:00,0.0 -2018-01-01 16:30:00+01:00,0.0 -2018-01-01 17:30:00+01:00,0.0 -2018-01-01 18:30:00+01:00,0.0 -2018-01-01 19:30:00+01:00,0.0 -2018-01-01 20:30:00+01:00,0.0 -2018-01-01 21:30:00+01:00,0.0 -2018-01-01 22:30:00+01:00,0.0 -2018-01-01 23:30:00+01:00,0.0 -2018-01-02 00:30:00+01:00,0.0 -2018-01-02 01:30:00+01:00,0.0 -2018-01-02 02:30:00+01:00,0.0 -2018-01-02 03:30:00+01:00,0.0 -2018-01-02 04:30:00+01:00,0.0 -2018-01-02 05:30:00+01:00,0.0 -2018-01-02 06:30:00+01:00,0.0 -2018-01-02 07:30:00+01:00,0.0 -2018-01-02 08:30:00+01:00,0.0 -2018-01-02 09:30:00+01:00,0.9282483231458806 -2018-01-02 10:30:00+01:00,6.522839084117224 -2018-01-02 11:30:00+01:00,18.113391973670502 -2018-01-02 12:30:00+01:00,23.93442006207004 -2018-01-02 13:30:00+01:00,19.02198413802917 -2018-01-02 14:30:00+01:00,3.7944513234994064 -2018-01-02 15:30:00+01:00,0.0 -2018-01-02 16:30:00+01:00,0.0 -2018-01-02 17:30:00+01:00,0.0 -2018-01-02 18:30:00+01:00,0.0 -2018-01-02 19:30:00+01:00,0.0 -2018-01-02 20:30:00+01:00,0.0 -2018-01-02 21:30:00+01:00,0.0 -2018-01-02 22:30:00+01:00,0.0 -2018-01-02 23:30:00+01:00,0.0 -2018-01-03 00:30:00+01:00,0.0 -2018-01-03 01:30:00+01:00,0.0 -2018-01-03 02:30:00+01:00,0.0 -2018-01-03 03:30:00+01:00,0.0 -2018-01-03 04:30:00+01:00,0.0 -2018-01-03 05:30:00+01:00,0.0 -2018-01-03 06:30:00+01:00,0.0 -2018-01-03 07:30:00+01:00,0.0 -2018-01-03 08:30:00+01:00,0.0 -2018-01-03 09:30:00+01:00,0.0 -2018-01-03 10:30:00+01:00,0.0 -2018-01-03 11:30:00+01:00,3.1043054608116027 -2018-01-03 12:30:00+01:00,44.500155163804976 -2018-01-03 13:30:00+01:00,48.60707644284791 -2018-01-03 14:30:00+01:00,5.352609987933698 -2018-01-03 15:30:00+01:00,0.0 -2018-01-03 16:30:00+01:00,0.0 -2018-01-03 17:30:00+01:00,0.0 -2018-01-03 18:30:00+01:00,0.0 -2018-01-03 19:30:00+01:00,0.0 -2018-01-03 20:30:00+01:00,0.0 -2018-01-03 21:30:00+01:00,0.0 -2018-01-03 22:30:00+01:00,0.0 -2018-01-03 23:30:00+01:00,0.0 -2018-01-04 00:30:00+01:00,0.0 -2018-01-04 01:30:00+01:00,0.0 -2018-01-04 02:30:00+01:00,0.0 -2018-01-04 03:30:00+01:00,0.0 -2018-01-04 04:30:00+01:00,0.0 -2018-01-04 05:30:00+01:00,0.0 -2018-01-04 06:30:00+01:00,0.0 -2018-01-04 07:30:00+01:00,0.0 -2018-01-04 08:30:00+01:00,0.0 -2018-01-04 09:30:00+01:00,2.412911528138851 -2018-01-04 10:30:00+01:00,7.735581619871407 -2018-01-04 11:30:00+01:00,21.291168270279613 -2018-01-04 12:30:00+01:00,40.94436918414178 -2018-01-04 13:30:00+01:00,42.373288765911056 -2018-01-04 14:30:00+01:00,29.225648212630627 -2018-01-04 15:30:00+01:00,0.0 -2018-01-04 16:30:00+01:00,0.0 -2018-01-04 17:30:00+01:00,0.0 -2018-01-04 18:30:00+01:00,0.0 -2018-01-04 19:30:00+01:00,0.0 -2018-01-04 20:30:00+01:00,0.0 -2018-01-04 21:30:00+01:00,0.0 -2018-01-04 22:30:00+01:00,0.0 -2018-01-04 23:30:00+01:00,0.0 -2018-01-05 00:30:00+01:00,0.0 -2018-01-05 01:30:00+01:00,0.0 -2018-01-05 02:30:00+01:00,0.0 -2018-01-05 03:30:00+01:00,0.0 -2018-01-05 04:30:00+01:00,0.0 -2018-01-05 05:30:00+01:00,0.0 -2018-01-05 06:30:00+01:00,0.0 -2018-01-05 07:30:00+01:00,0.0 -2018-01-05 08:30:00+01:00,0.0 -2018-01-05 09:30:00+01:00,19.40043544618326 -2018-01-05 10:30:00+01:00,17.78003649979294 -2018-01-05 11:30:00+01:00,19.1828395051374 -2018-01-05 12:30:00+01:00,17.28758152431003 -2018-01-05 13:30:00+01:00,37.19451480924751 -2018-01-05 14:30:00+01:00,26.347029652712724 -2018-01-05 15:30:00+01:00,0.0 -2018-01-05 16:30:00+01:00,0.0 -2018-01-05 17:30:00+01:00,0.0 -2018-01-05 18:30:00+01:00,0.0 -2018-01-05 19:30:00+01:00,0.0 -2018-01-05 20:30:00+01:00,0.0 -2018-01-05 21:30:00+01:00,0.0 -2018-01-05 22:30:00+01:00,0.0 -2018-01-05 23:30:00+01:00,0.0 -2018-01-06 00:30:00+01:00,0.0 -2018-01-06 01:30:00+01:00,0.0 -2018-01-06 02:30:00+01:00,0.0 -2018-01-06 03:30:00+01:00,0.0 -2018-01-06 04:30:00+01:00,0.0 -2018-01-06 05:30:00+01:00,0.0 -2018-01-06 06:30:00+01:00,0.0 -2018-01-06 07:30:00+01:00,0.0 -2018-01-06 08:30:00+01:00,0.0 -2018-01-06 09:30:00+01:00,24.258760014041247 -2018-01-06 10:30:00+01:00,54.91375116003941 -2018-01-06 11:30:00+01:00,85.00597424688478 -2018-01-06 12:30:00+01:00,85.90006197264941 -2018-01-06 13:30:00+01:00,67.37653052865542 -2018-01-06 14:30:00+01:00,31.174064306596133 -2018-01-06 15:30:00+01:00,0.0 -2018-01-06 16:30:00+01:00,0.0 -2018-01-06 17:30:00+01:00,0.0 -2018-01-06 18:30:00+01:00,0.0 -2018-01-06 19:30:00+01:00,0.0 -2018-01-06 20:30:00+01:00,0.0 -2018-01-06 21:30:00+01:00,0.0 -2018-01-06 22:30:00+01:00,0.0 -2018-01-06 23:30:00+01:00,0.0 -2018-01-07 00:30:00+01:00,0.0 -2018-01-07 01:30:00+01:00,0.0 -2018-01-07 02:30:00+01:00,0.0 -2018-01-07 03:30:00+01:00,0.0 -2018-01-07 04:30:00+01:00,0.0 -2018-01-07 05:30:00+01:00,0.0 -2018-01-07 06:30:00+01:00,0.0 -2018-01-07 07:30:00+01:00,0.0 -2018-01-07 08:30:00+01:00,0.0 -2018-01-07 09:30:00+01:00,8.361867062873221 -2018-01-07 10:30:00+01:00,26.028288674715704 -2018-01-07 11:30:00+01:00,43.634635884057296 -2018-01-07 12:30:00+01:00,34.49380141729803 -2018-01-07 13:30:00+01:00,36.91816671510759 -2018-01-07 14:30:00+01:00,33.35423932538908 -2018-01-07 15:30:00+01:00,0.652259558172688 -2018-01-07 16:30:00+01:00,0.0 -2018-01-07 17:30:00+01:00,0.0 -2018-01-07 18:30:00+01:00,0.0 -2018-01-07 19:30:00+01:00,0.0 -2018-01-07 20:30:00+01:00,0.0 -2018-01-07 21:30:00+01:00,0.0 -2018-01-07 22:30:00+01:00,0.0 -2018-01-07 23:30:00+01:00,0.0 +2018-01-01 00:00:00+01:00,0.0 +2018-01-01 01:00:00+01:00,0.0 +2018-01-01 02:00:00+01:00,0.0 +2018-01-01 03:00:00+01:00,0.0 +2018-01-01 04:00:00+01:00,0.0 +2018-01-01 05:00:00+01:00,0.0 +2018-01-01 06:00:00+01:00,0.0 +2018-01-01 07:00:00+01:00,0.0 +2018-01-01 08:00:00+01:00,0.0 +2018-01-01 09:00:00+01:00,20.59949737304199 +2018-01-01 10:00:00+01:00,57.44536767395442 +2018-01-01 11:00:00+01:00,87.80795648835002 +2018-01-01 12:00:00+01:00,82.4312872827236 +2018-01-01 13:00:00+01:00,60.73295277209872 +2018-01-01 14:00:00+01:00,38.57275076938971 +2018-01-01 15:00:00+01:00,0.0 +2018-01-01 16:00:00+01:00,0.0 +2018-01-01 17:00:00+01:00,0.0 +2018-01-01 18:00:00+01:00,0.0 +2018-01-01 19:00:00+01:00,0.0 +2018-01-01 20:00:00+01:00,0.0 +2018-01-01 21:00:00+01:00,0.0 +2018-01-01 22:00:00+01:00,0.0 +2018-01-01 23:00:00+01:00,0.0 +2018-01-02 00:00:00+01:00,0.0 +2018-01-02 01:00:00+01:00,0.0 +2018-01-02 02:00:00+01:00,0.0 +2018-01-02 03:00:00+01:00,0.0 +2018-01-02 04:00:00+01:00,0.0 +2018-01-02 05:00:00+01:00,0.0 +2018-01-02 06:00:00+01:00,0.0 +2018-01-02 07:00:00+01:00,0.0 +2018-01-02 08:00:00+01:00,0.0 +2018-01-02 09:00:00+01:00,0.9282483231458806 +2018-01-02 10:00:00+01:00,6.522839084117224 +2018-01-02 11:00:00+01:00,18.113391973670502 +2018-01-02 12:00:00+01:00,23.93442006207004 +2018-01-02 13:00:00+01:00,19.02198413802917 +2018-01-02 14:00:00+01:00,3.7944513234994064 +2018-01-02 15:00:00+01:00,0.0 +2018-01-02 16:00:00+01:00,0.0 +2018-01-02 17:00:00+01:00,0.0 +2018-01-02 18:00:00+01:00,0.0 +2018-01-02 19:00:00+01:00,0.0 +2018-01-02 20:00:00+01:00,0.0 +2018-01-02 21:00:00+01:00,0.0 +2018-01-02 22:00:00+01:00,0.0 +2018-01-02 23:00:00+01:00,0.0 +2018-01-03 00:00:00+01:00,0.0 +2018-01-03 01:00:00+01:00,0.0 +2018-01-03 02:00:00+01:00,0.0 +2018-01-03 03:00:00+01:00,0.0 +2018-01-03 04:00:00+01:00,0.0 +2018-01-03 05:00:00+01:00,0.0 +2018-01-03 06:00:00+01:00,0.0 +2018-01-03 07:00:00+01:00,0.0 +2018-01-03 08:00:00+01:00,0.0 +2018-01-03 09:00:00+01:00,0.0 +2018-01-03 10:00:00+01:00,0.0 +2018-01-03 11:00:00+01:00,3.1043054608116027 +2018-01-03 12:00:00+01:00,44.500155163804976 +2018-01-03 13:00:00+01:00,48.60707644284791 +2018-01-03 14:00:00+01:00,5.352609987933698 +2018-01-03 15:00:00+01:00,0.0 +2018-01-03 16:00:00+01:00,0.0 +2018-01-03 17:00:00+01:00,0.0 +2018-01-03 18:00:00+01:00,0.0 +2018-01-03 19:00:00+01:00,0.0 +2018-01-03 20:00:00+01:00,0.0 +2018-01-03 21:00:00+01:00,0.0 +2018-01-03 22:00:00+01:00,0.0 +2018-01-03 23:00:00+01:00,0.0 +2018-01-04 00:00:00+01:00,0.0 +2018-01-04 01:00:00+01:00,0.0 +2018-01-04 02:00:00+01:00,0.0 +2018-01-04 03:00:00+01:00,0.0 +2018-01-04 04:00:00+01:00,0.0 +2018-01-04 05:00:00+01:00,0.0 +2018-01-04 06:00:00+01:00,0.0 +2018-01-04 07:00:00+01:00,0.0 +2018-01-04 08:00:00+01:00,0.0 +2018-01-04 09:00:00+01:00,2.412911528138851 +2018-01-04 10:00:00+01:00,7.735581619871407 +2018-01-04 11:00:00+01:00,21.291168270279613 +2018-01-04 12:00:00+01:00,40.94436918414178 +2018-01-04 13:00:00+01:00,42.373288765911056 +2018-01-04 14:00:00+01:00,29.225648212630627 +2018-01-04 15:00:00+01:00,0.0 +2018-01-04 16:00:00+01:00,0.0 +2018-01-04 17:00:00+01:00,0.0 +2018-01-04 18:00:00+01:00,0.0 +2018-01-04 19:00:00+01:00,0.0 +2018-01-04 20:00:00+01:00,0.0 +2018-01-04 21:00:00+01:00,0.0 +2018-01-04 22:00:00+01:00,0.0 +2018-01-04 23:00:00+01:00,0.0 +2018-01-05 00:00:00+01:00,0.0 +2018-01-05 01:00:00+01:00,0.0 +2018-01-05 02:00:00+01:00,0.0 +2018-01-05 03:00:00+01:00,0.0 +2018-01-05 04:00:00+01:00,0.0 +2018-01-05 05:00:00+01:00,0.0 +2018-01-05 06:00:00+01:00,0.0 +2018-01-05 07:00:00+01:00,0.0 +2018-01-05 08:00:00+01:00,0.0 +2018-01-05 09:00:00+01:00,19.40043544618326 +2018-01-05 10:00:00+01:00,17.78003649979294 +2018-01-05 11:00:00+01:00,19.1828395051374 +2018-01-05 12:00:00+01:00,17.28758152431003 +2018-01-05 13:00:00+01:00,37.19451480924751 +2018-01-05 14:00:00+01:00,26.347029652712724 +2018-01-05 15:00:00+01:00,0.0 +2018-01-05 16:00:00+01:00,0.0 +2018-01-05 17:00:00+01:00,0.0 +2018-01-05 18:00:00+01:00,0.0 +2018-01-05 19:00:00+01:00,0.0 +2018-01-05 20:00:00+01:00,0.0 +2018-01-05 21:00:00+01:00,0.0 +2018-01-05 22:00:00+01:00,0.0 +2018-01-05 23:00:00+01:00,0.0 +2018-01-06 00:00:00+01:00,0.0 +2018-01-06 01:00:00+01:00,0.0 +2018-01-06 02:00:00+01:00,0.0 +2018-01-06 03:00:00+01:00,0.0 +2018-01-06 04:00:00+01:00,0.0 +2018-01-06 05:00:00+01:00,0.0 +2018-01-06 06:00:00+01:00,0.0 +2018-01-06 07:00:00+01:00,0.0 +2018-01-06 08:00:00+01:00,0.0 +2018-01-06 09:00:00+01:00,24.258760014041247 +2018-01-06 10:00:00+01:00,54.91375116003941 +2018-01-06 11:00:00+01:00,85.00597424688478 +2018-01-06 12:00:00+01:00,85.90006197264941 +2018-01-06 13:00:00+01:00,67.37653052865542 +2018-01-06 14:00:00+01:00,31.174064306596133 +2018-01-06 15:00:00+01:00,0.0 +2018-01-06 16:00:00+01:00,0.0 +2018-01-06 17:00:00+01:00,0.0 +2018-01-06 18:00:00+01:00,0.0 +2018-01-06 19:00:00+01:00,0.0 +2018-01-06 20:00:00+01:00,0.0 +2018-01-06 21:00:00+01:00,0.0 +2018-01-06 22:00:00+01:00,0.0 +2018-01-06 23:00:00+01:00,0.0 +2018-01-07 00:00:00+01:00,0.0 +2018-01-07 01:00:00+01:00,0.0 +2018-01-07 02:00:00+01:00,0.0 +2018-01-07 03:00:00+01:00,0.0 +2018-01-07 04:00:00+01:00,0.0 +2018-01-07 05:00:00+01:00,0.0 +2018-01-07 06:00:00+01:00,0.0 +2018-01-07 07:00:00+01:00,0.0 +2018-01-07 08:00:00+01:00,0.0 +2018-01-07 09:00:00+01:00,8.361867062873221 +2018-01-07 10:00:00+01:00,26.028288674715704 +2018-01-07 11:00:00+01:00,43.634635884057296 +2018-01-07 12:00:00+01:00,34.49380141729803 +2018-01-07 13:00:00+01:00,36.91816671510759 +2018-01-07 14:00:00+01:00,33.35423932538908 +2018-01-07 15:00:00+01:00,0.652259558172688 +2018-01-07 16:00:00+01:00,0.0 +2018-01-07 17:00:00+01:00,0.0 +2018-01-07 18:00:00+01:00,0.0 +2018-01-07 19:00:00+01:00,0.0 +2018-01-07 20:00:00+01:00,0.0 +2018-01-07 21:00:00+01:00,0.0 +2018-01-07 22:00:00+01:00,0.0 +2018-01-07 23:00:00+01:00,0.0 From 0065a52e7cde6f4df70ade56a3c3f7c4d8410b3d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 15 Dec 2022 13:37:54 +0100 Subject: [PATCH 404/802] Add time it decorator and speed up must stations --- ebus_toolbox/optimizer.py | 223 ++++++++++++++++++++++---------------- 1 file changed, 130 insertions(+), 93 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 37163d0b..bc22dbfb 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -12,28 +12,52 @@ import logging import math import shutil +import numpy as np +import pickle +import matplotlib +import matplotlib.pyplot as plt + import report # spice_ev scenario from src import scenario import schedule import rotation -import pickle -import matplotlib -import matplotlib.pyplot as plt from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip from ebus_toolbox.costs import calculate_costs from ebus_toolbox.util import uncomment_json_file, get_buffer_time as get_buffer_time_spice_ev from optimizer_config import read_config, OptimizerConfig -import numpy as np -matplotlib.use("TkAgg") +logger = None +args = None +config = None -global LOGGER -global args +matplotlib.use("TkAgg") config = OptimizerConfig() # global list to be able to keep track of runtimes for optimizing components which are slow -timers = [0] * 10 + + +def time_it(fn, TIMERS=dict() ): + if fn: + def decorated_function(*args, **kwargs): + key = fn.__name__ + start_time = time() + return_value = fn(*args, **kwargs) + delta_time = time() - start_time + try: + TIMERS[key]["time"] += delta_time + TIMERS[key]["calls"] += 1 + except KeyError: + TIMERS[key]=dict(time=0, calls=1) + TIMERS[key]["time"] += delta_time + return return_value + return decorated_function + else: + sorted_TIMER = dict(sorted(TIMERS.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) + return sorted_TIMER + + + def setup_logger(): @@ -66,10 +90,15 @@ def setup_logger(): def main(): config_path = "./data/examples/optimizer.cfg" + print_time() run_optimization(config_path) + logger.debug(time_it(None)) pass - +@time_it +def foo(): + print(2) +@time_it def run_optimization(config_path, sched=None, scen=None, this_args=None): """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. @@ -90,7 +119,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ global config - global LOGGER + global logger + global args config = read_config(config_path) # load pickle files @@ -98,9 +128,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # if no schedule was given as argument, make sure no scenario # and args input was given as well. assert sched == scen == this_args is None - sched, scen, args = toolbox_from_pickle(config.schedule, config.scenario, config.args) + sched, scen, this_args = toolbox_from_pickle(config.schedule, config.scenario, config.args) - global args args = this_args # prepare Filesystem with folders and paths @@ -113,21 +142,21 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): args.output_directory.mkdir(parents=True, exist_ok=True) # copy paste the config file - c = Path(config_path) - o = args.output_directory / Path("optimizer_config.cfg") - shutil.copy(c, o) + copy_file = Path(config_path) + destination = args.output_directory / Path("optimizer_config.cfg") + shutil.copy(copy_file, destination) if args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") - LOGGER = setup_logger() + logger = setup_logger() # remove those args, since they lead to file creation, which is not # needed. del args.save_timeseries del args.save_results if args.desired_soc_deps != 1: - LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") + logger.error("Fast calc is not yet optimized for desired socs unequal to 1") # which rotations should be excluded? exclusion_rots = config.exclusion_rots @@ -147,7 +176,6 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): rebase_scenario = config.rebase_scenario node_choice = config.node_choice - t = time() # set battery and charging curves through config file if wished for for name, v_type in sched.vehicle_types.items(): for charge_type, vehicle in v_type.items(): @@ -167,7 +195,6 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # stations which are included can not be included again. Therefore they get into # the set of not possible stations not_possible_stations = inclusion_stations.union(exclusion_stations) - s = time() # if stations have to be included they are stored in this set must_include_set = set() @@ -175,15 +202,16 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations if rebase_scenario: - LOGGER.debug("Spice EV Rebasing Scenario") + logger.debug("Spice EV Rebasing Scenario") sched, scen, must_include_set, ele_stations = preprocessing_scenario( sched, scen, args, inclusion_stations, exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) - LOGGER.debug(f"Rebasing took {time() - s} sec") + logger.debug(f"Rebasing finished") + print_time() if config.pickle_rebased: toolbox_to_pickle(config.pickle_rebased_name, sched, scen, args) - LOGGER.debug(f"Rebased scenario pickled as {config.pickle_rebased_name}") + logger.debug(f"Rebased scenario pickled as {config.pickle_rebased_name}") else: with open(args.electrified_stations, "r", encoding="utf-8", ) as file: ele_stations = json.load(file) @@ -193,9 +221,6 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): rots = {r: sched.rotations[r] for r in sched.rotations if r not in exclusion_rots} sched.rotations = rots - s = time() - - global timer_for_calc # create charging dicts which contain energy over time, which is numerically created soc_charge_curve_dict = dict() for v_type_name in sched.vehicle_types: @@ -216,7 +241,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): soc_charge_curve_dict, not_possible_stations=not_possible_stations, soc_lower_thresh=config.min_soc, relative_soc=False) - LOGGER.warning("%s must stations %s", len(must_stations), must_stations) + logger.warning("%s must stations %s", len(must_stations), must_stations) not_possible_stations = not_possible_stations.union(must_stations) for stat in must_stations: # dont put must stations in electrified set --> therefore create trash set @@ -227,8 +252,9 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) - LOGGER.debug("Starting greedy optimization") + logger.debug("Starting greedy optimization") ele_station_set = set() + print_time() ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, scen, sched, not_possible_stations, soc_upper_thresh=args.desired_soc_opps, @@ -237,13 +263,11 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): node_choice=node_choice, soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) - + print_time() ele_station_set = ele_station_set.union(must_include_set) - LOGGER.debug(f"Non Spice Ev methods took {time() - s - timer_for_calc} sec") - LOGGER.debug(f"Solver: {solver} took {timer_for_calc} s") - LOGGER.debug(f"Electrified Stations: {len(ele_station_set)}") - LOGGER.debug(ele_station_set) - LOGGER.debug(could_not_be_electrified) + logger.debug("Functions took these times in seconds") + logger.debug(len(ele_station_set), ele_station_set) + logger.debug(could_not_be_electrified) scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), scen.vehicle_socs, scen, ele_station_set, @@ -252,31 +276,25 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): new_events = get_below_zero_soc_events(scen, sched.rotations, sched, soc_lower_thresh=config.min_soc) - LOGGER.debug("Still not electrified with fast calc") + logger.debug("Still not electrified with fast calc") for event in new_events: - LOGGER.debug(event["rotation"].id) - LOGGER.debug("###") + logger.debug(event["rotation"].id) + logger.debug("###") - global timers - LOGGER.debug(timers) with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) - LOGGER.debug("Spice EV is calculating optimized case as a complete scenario") + logger.debug("Spice EV is calculating optimized case as a complete scenario") final_sched, final_scen, ele_station_set, ele_stations = preprocessing_scenario( sched, scen, args, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set, cost_calc=True) - LOGGER.warning(f"Still negative rotations:{final_sched.get_negative_rotations(final_scen)}") + logger.warning(f"Still negative rotations:{final_sched.get_negative_rotations(final_scen)}") print("Finished") - print(f"Opt took {time() - t}") - return final_sched, final_scen -timer_for_calc = 0 - - +@time_it def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, not_possible_stations, soc_charge_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, @@ -326,9 +344,9 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() - LOGGER.warning(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") - LOGGER.warning(linien) - LOGGER.warning("%s events", (len(events))) + logger.warning(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") + logger.warning(linien) + logger.warning("%s events", (len(events))) solver = kwargs.get("solver", "spiceev") if node_choice == "brute": choice_func = choose_station_brute @@ -346,24 +364,21 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n events_remaining=[len(events)], type=solver, **kwargs) - LOGGER.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), + logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), len(stations)) - LOGGER.warning(electrified_station_set) + logger.warning(electrified_station_set) if opt_type == "deep": sols = [] i = 0 cont_loop = True - t = time() combinations = combs_unordered_no_putting_back(len(stations), len(electrified_station_set)) - LOGGER.debug(f"There are {combinations} combinations") + logger.debug(f"There are {combinations} combinations") while i < config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: - print(time() - t) - t = time() print(len(decision_tree), " Knotenpunkte durchwandert") print(f"Optimal solution has length {len(electrified_station_set)}") not_possible_stations = copy(not_possible_stations) @@ -386,16 +401,16 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # if a new set was found, print it and save it in sols if new_electrified_set != pre_optimized_set and new_stations is not None: - LOGGER.warning( + logger.warning( f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ {stations_hash(new_electrified_set)}") sols.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): electrified_station_set = new_electrified_set - LOGGER.debug(sols) + logger.debug(sols) list_greedy_sets[group_nr] = electrified_station_set.copy() - LOGGER.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), + logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), len(stations))) if config.save_decision_tree: with open(args.output_directory / Path("decision_tree.pickle"), "wb") as file: @@ -407,6 +422,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets +@time_it def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None): # First create simple list of station sets for single events. # Electrified and other not possible to electrify stations should not connect groups @@ -437,7 +453,7 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec event_groups[i].append(e) break else: - LOGGER.warning(f'Didnt find rotation {e["rotation"].id} in any subset' + logger.warning(f'Didnt find rotation {e["rotation"].id} in any subset' f'of possible electrifiable stations') # this event will no show up in an event_group. # therefore it needs to be put into this set @@ -447,6 +463,7 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec return sorted(groups, key=lambda x: len(x[1])) +@time_it def group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, could_not_be_electrified, @@ -465,7 +482,7 @@ def group_optimization(group, base_scen, base_sched, base_socs = {id: soc for id, soc in base_scen.vehicle_socs.items()} # give tree position - LOGGER.debug("%s with length of %s", tree_position, len(tree_position)) + logger.debug("%s with length of %s", tree_position, len(tree_position)) # Unpack events and possible stations event_group, possible_stations = group @@ -483,7 +500,7 @@ def group_optimization(group, base_scen, base_sched, missing_energy = get_missing_energy(event_group) if missing_energy >= 0: - LOGGER.debug("Already electrified: Returning set") + logger.debug("Already electrified: Returning set") return electrified_stations, True station_eval = evaluate(event_group, new_scen, soc_curve_dict, @@ -498,7 +515,7 @@ def group_optimization(group, base_scen, base_sched, missing_energy=missing_energy) stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} if best_station_ids is None: - LOGGER.warning( + logger.warning( f"No useful station found with " f"{events_remaining} rotations not electrified yet. " f" Stopped after electrifying {len(electrified_station_set)}") @@ -515,14 +532,12 @@ def group_optimization(group, base_scen, base_sched, else: could_not_be_electrified.update(list(rotation_dict.keys())) return None, False - LOGGER.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) + logger.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) # Electrify station(s) for stat_id in best_station_ids: electrify_station(stat_id, electrified_stations, electrified_station_set) - s = time() - event_rotations = {x["rotation"] for x in event_group} if type == "quick": # Quick calculation has to electrify everything in one step, @@ -539,10 +554,7 @@ def group_optimization(group, base_scen, base_sched, electrified_stations=electrified_stations) lifted_socs = None - global timer_for_calc - global timers - timer_for_calc += time() - s - timers[2] += time() - s + not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) event_rotations_id = {event["rotation"].id for event in event_group} new_events = get_below_zero_soc_events(new_scen, event_rotations_id, @@ -555,7 +567,7 @@ def group_optimization(group, base_scen, base_sched, delta_energy = get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) - LOGGER.debug("Last electrification electrified %s/%s." + logger.debug("Last electrification electrified %s/%s." " %s remaining events in the base group.", len(event_group) - len(new_events), len(event_group), events_remaining[0]) delta_base_energy = delta_energy # get_missing_energy(base_events) @@ -631,20 +643,26 @@ def group_optimization(group, base_scen, base_sched, return None, True +@time_it def get_missing_energy(events): missing_energy = 0 for e in events: missing_energy += e["min_soc"] * e["capacity"] return missing_energy +def print_time(start=[]): + if not start: + start.append(time()) + print(round(time()-start[0],2), " seconds till start") +@time_it def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): node_name = stations_hash(electrified_station_set) try: decision_tree[node_name]["missing_energy"] = delta_base_energy decision_tree[node_name]["visit_counter"] += 1 # todo add is_viable - LOGGER.debug("already visited") + logger.debug("already visited") except KeyError: decision_tree[node_name] = dict() decision_tree[node_name]["missing_energy"] = delta_base_energy @@ -653,6 +671,7 @@ def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): return decision_tree +@time_it def preprocessing_scenario(this_sched, this_scen, this_args, inclusion_stations=None, electrified_stations=None, @@ -693,6 +712,7 @@ def preprocessing_scenario(this_sched, this_scen, this_args, return new_sched, new_scen, electrified_station_set, electrified_stations +@time_it def combination_generator(iterable, amount: int): """ Generator which yields all possible combinations of choosing an amount out of an iterable without putting them back and without caring about the @@ -744,6 +764,7 @@ def join_all_subsets(subsets): return subsets +@time_it def choose_station_brute(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): station_ids = [x[0] for x in station_eval] @@ -759,13 +780,14 @@ def choose_station_brute(station_eval, electrified_station_set, if potential > -missing_energy * config.estimation_threshold: return comb, False else: - LOGGER.debug("skipped %s since potential is too low %s %%", comb, + logger.debug("skipped %s since potential is too low %s %%", comb, round(potential / -missing_energy * 100, 0)) else: - LOGGER.debug("calculated all viable possibilities") + logger.debug("calculated all viable possibilities") return None, False +@time_it def is_branch_promising(station_eval, electrified_station_set, pre_optimized_set, missing_energy): delta = len(pre_optimized_set) - len(electrified_station_set) @@ -779,6 +801,7 @@ def is_branch_promising(station_eval, electrified_station_set, return True +@time_it def choose_station_step_by_step(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): # Filter functions to stop simulating cases which have no hope of being optimal. @@ -823,15 +846,15 @@ def choose_station_step_by_step(station_eval, electrified_station_set, return None, True +@time_it def stations_hash(stations_set): return str(sorted(list(stations_set))) +@time_it def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc_charge_curve_dict, soc_upper_thresh=1): - global timers ele_stations = {*ele_station_set, station} - s2 = time() soc_dict = copy(soc_dict) for rot in rotations: @@ -841,7 +864,6 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc_over_time_curve = soc_charge_curve_dict[v_type][ch_type] soc = soc_dict[rot.vehicle_id] for i, trip in enumerate(rot.trips): - s = time() if trip.arrival_name not in ele_stations: continue idx = get_index_by_time(trip.arrival_time, eval_scen) @@ -861,8 +883,6 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc_pre = soc[:idx] soc = soc[idx:] soc_max = np.max(soc) - timers[0] += time() - s - s = time() while soc_max > soc_upper_thresh: desc = np.arange(len(soc), 0, -1) diff = np.hstack((np.diff(soc), -1)) @@ -877,12 +897,11 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 soc_max = np.max(soc) soc = np.hstack((soc_pre, soc)) - timers[1] += time() - s soc_dict[rot.vehicle_id] = soc - timers[3] += (time() - s2) * 100 return soc_dict +@time_it def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, electrified_station_set=None, decision_tree=None): # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an @@ -952,6 +971,7 @@ def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_th return station_eval +@time_it def get_charging_time(trip1, trip2, args): standing_time_min = (trip2.departure_time - trip1.arrival_time) \ / timedelta(minutes=1) @@ -963,6 +983,7 @@ def get_charging_time(trip1, trip2, args): return max(0, standing_time_min) +@time_it def join_subsets(subsets): subsets = [s.copy() for s in subsets] for i in range(len(subsets)): @@ -977,6 +998,7 @@ def join_subsets(subsets): return False, subsets +@time_it def get_index_by_time(search_time, this_scen: scenario.Scenario): start_time = this_scen.start_time delta_time = timedelta(minutes=60 / this_scen.stepsPerHour) @@ -984,6 +1006,7 @@ def get_index_by_time(search_time, this_scen: scenario.Scenario): return idx +@time_it def get_time_by_index(idx, this_scen: scenario.Scenario): start_time = this_scen.start_time delta_time = timedelta(minutes=60 / this_scen.stepsPerHour) @@ -991,6 +1014,7 @@ def get_time_by_index(idx, this_scen: scenario.Scenario): return searched_time +@time_it def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, scen: scenario.Scenario): # return trips in a rotation from a start to an end index, if the arrival time is in between # the start and end idx @@ -1000,16 +1024,12 @@ def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, scen: scenar trips = [] for i, trip in enumerate(rot.trips): if end_time_event > trip.arrival_time > start_time_event: - # standing_time = 0 - # try: - # standing_time = trip.arrival_time - trips[i + 1].departure_time - # except IndexError: - # standing_time = 0 trips.append(trip) return trips +@time_it def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): rot = this_sched.rotations[rot_id] rot_start_idx = get_index_by_time(rot.departure_time, this_scen) @@ -1019,6 +1039,7 @@ def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx +@time_it def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, this_sched: schedule.Schedule, soc_upper_thresh=0.9, filter_standing_time=True, @@ -1116,6 +1137,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, return events +@time_it def preprocess_schedule(this_sched, this_args, electrified_stations=None): Trip.consumption = Consumption(this_sched.vehicle_types, outside_temperatures=args.outside_temperature_over_day_path, @@ -1135,6 +1157,7 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): return this_sched, this_sched.generate_scenario(this_args) +@time_it def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations @@ -1173,6 +1196,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal return this_sched2, new_scen +@time_it def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_grid=float('inf'), timestep=0.1, efficiency=1): # Charging curve as nested list of SOC, Power[kW] and capacity in [kWh] @@ -1199,6 +1223,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr return np.array((times, socs)).T +@time_it def get_delta_soc(soc_over_time_curve, soc, time_delta): # Returns expected soc lift for a given start_soc and time_delta. # Units for time_delta and time_curve are assumed to be the same, e.g. minutes @@ -1220,6 +1245,7 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta): return min(args.desired_soc_opps, end_soc - start_soc) +@time_it def get_buffer_time_old(search_time, args): try: return timedelta(minutes=float(args.default_buffer_time_opps)) @@ -1233,25 +1259,29 @@ def get_buffer_time_old(search_time, args): return timedelta(minutes=0) +@time_it def electrify_station(stat, stations, electrified_set): stations[stat] = config.standard_opp_station electrified_set.add(stat) +@time_it def get_buffer_time(trip, args): # a= get_buffer_time_old(trip.arrival_time, args) b = timedelta(minutes=get_buffer_time_spice_ev(trip, args.default_buffer_time_opps)) return b +@time_it def combs_unordered_no_putting_back(n: int, k: int): try: return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) except ValueError: - LOGGER.warning("Value Error") + logger.warning("Value Error") return 0 +@time_it def remove_none_socs(this_scen): # Make sure no None values exists in SOCs. Fill later values with last value # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] @@ -1267,6 +1297,7 @@ def remove_none_socs(this_scen): this_scen.vehicle_socs[id] = soc + def get_vehicle(rot_id, this_sched): return this_sched.rotations[rot_id].vehicle_id @@ -1275,13 +1306,15 @@ def get_vehicle_rots(rot_id, this_sched): return [rot for rot in this_sched.rotations if rot_id == get_vehicle(rot, this_sched)] +@time_it def station_eval_to_logger(missing_energy, station_eval): - LOGGER.debug("Missing energy: %s", missing_energy) - if LOGGER.getEffectiveLevel() > logging.DEBUG: + logger.debug("Missing energy: %s", missing_energy) + if logger.getEffectiveLevel() > logging.DEBUG: for stat_id in station_eval: - LOGGER.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) + logger.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) +@time_it def toolbox_from_pickle(sched_name, scen_name, args_name): with open(args_name, "rb") as f: args = pickle.load(f) @@ -1292,6 +1325,7 @@ def toolbox_from_pickle(sched_name, scen_name, args_name): return sched, scen, args +@time_it def toolbox_to_pickle(name, sched, scen, args): args_name = "args_" + name + ".pickle" with open(args_name, "wb") as f: @@ -1305,6 +1339,7 @@ def toolbox_to_pickle(name, sched, scen, args): return sched_name, scen_name, args_name +@time_it def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, not_possible_stations=None, @@ -1335,6 +1370,7 @@ def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thre # Electrify everything minus 1 station. If without the stations there are below zero events # it is a must have station +@time_it def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, not_possible_stations=None, soc_lower_thresh=0, relative_soc=False): @@ -1360,11 +1396,12 @@ def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_ soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=args.desired_soc_deps) - new_events = get_below_zero_soc_events(this_scen, this_sched.rotations, - this_sched, soc_lower_thresh=soc_lower_thresh, - soc_data=vehicle_socs) - if len(new_events) > 0: - must_stations.add(s) + for rot in this_sched.rotations: + soc, a,b = get_rotation_soc(rot,this_sched,this_scen,vehicle_socs) + if np.min(soc[a:b]) Date: Thu, 15 Dec 2022 14:24:46 +0100 Subject: [PATCH 405/802] Fix some Pylint --- ebus_toolbox/optimizer.py | 239 ++++++++++++++++--------------- ebus_toolbox/optimizer_config.py | 5 +- 2 files changed, 127 insertions(+), 117 deletions(-) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index bc22dbfb..d0e0bb6f 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -34,33 +34,33 @@ matplotlib.use("TkAgg") config = OptimizerConfig() -# global list to be able to keep track of runtimes for optimizing components which are slow -def time_it(fn, TIMERS=dict() ): - if fn: - def decorated_function(*args, **kwargs): - key = fn.__name__ +def time_it(function, timers={}): + if function: + def decorated_function(*this_args, **kwargs): + key = function.__name__ start_time = time() - return_value = fn(*args, **kwargs) + return_value = function(*this_args, **kwargs) delta_time = time() - start_time try: - TIMERS[key]["time"] += delta_time - TIMERS[key]["calls"] += 1 + timers[key]["time"] += delta_time + timers[key]["calls"] += 1 except KeyError: - TIMERS[key]=dict(time=0, calls=1) - TIMERS[key]["time"] += delta_time + timers[key] = dict(time=0, calls=1) + timers[key]["time"] += delta_time return return_value - return decorated_function - else: - sorted_TIMER = dict(sorted(TIMERS.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) - return sorted_TIMER - - + return decorated_function + sorted_timer = dict(sorted(timers.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) + return sorted_timer def setup_logger(): + """ setup file and stream logging by config and args arguments + :return: logger + :rtype: Logger + """ this_logger = logging.getLogger(__name__) this_logger.setLevel(logging.DEBUG) @@ -90,19 +90,32 @@ def setup_logger(): def main(): config_path = "./data/examples/optimizer.cfg" - print_time() run_optimization(config_path) logger.debug(time_it(None)) - pass -@time_it -def foo(): - print(2) + +def prepare_filesystem(): + now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + args.output_directory = Path(config.output_path) / str(now + "_optimizer") + # create subfolder for specific sim results with timestamp. + # if folder doesnt exists, create folder. + # needs to happen after set_options_from_config since + # args.output_directory can be overwritten by config + args.output_directory.mkdir(parents=True, exist_ok=True) + + # copy paste the config file + copy_file = Path(config.path) + destination = args.output_directory / Path("optimizer_config.cfg") + shutil.copy(copy_file, destination) + + @time_it def run_optimization(config_path, sched=None, scen=None, this_args=None): """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. + The optimizer config file is used for setting the optimization up. + :param config_path: path to optimizer.cfg file. :type config_path: str @@ -132,19 +145,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): args = this_args - # prepare Filesystem with folders and paths - now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - args.output_directory = Path(config.output_path) / str(now + "_optimizer") - # create subfolder for specific sim results with timestamp. - # if folder doesnt exists, create folder. - # needs to happen after set_options_from_config since - # args.output_directory can be overwritten by config - args.output_directory.mkdir(parents=True, exist_ok=True) - - # copy paste the config file - copy_file = Path(config_path) - destination = args.output_directory / Path("optimizer_config.cfg") - shutil.copy(copy_file, destination) + # prepare Filesystem with folders and paths and copy config + prepare_filesystem() if args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" @@ -159,22 +161,19 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger.error("Fast calc is not yet optimized for desired socs unequal to 1") # which rotations should be excluded? - exclusion_rots = config.exclusion_rots + excl_rots = config.exclusion_rots # which stations has to be electrified - inclusion_stations = config.inclusion_stations + incl_stats = config.inclusion_stations # which station can not be electrified - exclusion_stations = config.exclusion_stations + excl_stats = config.exclusion_stations + # if given reduce the rotations to the rotations given in the config file if config.reduce_rots: sched.rotations = {rot: sched.rotations[rot] for rot in config.rots} - opt_type = config.opt_type - solver = config.solver remove_impossible_rots = config.remove_impossible_rots - rebase_scenario = config.rebase_scenario - node_choice = config.node_choice # set battery and charging curves through config file if wished for for name, v_type in sched.vehicle_types.items(): @@ -185,28 +184,27 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): vehicle["charging_curve"] = config.charging_curve # create a decision tree or load one from a previous run - decision_tree_path = config.decision_tree_path - if decision_tree_path is not None: - with open(decision_tree_path, "rb") as file: + if config.decision_tree_path is not None: + with open(config.decision_tree_path, "rb") as file: decision_tree = pickle.load(file) else: decision_tree = dict() # stations which are included can not be included again. Therefore they get into # the set of not possible stations - not_possible_stations = inclusion_stations.union(exclusion_stations) + not_possible_stations = incl_stats.union(excl_stats) # if stations have to be included they are stored in this set must_include_set = set() # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations - if rebase_scenario: + if config.rebase_scenario: logger.debug("Spice EV Rebasing Scenario") sched, scen, must_include_set, ele_stations = preprocessing_scenario( sched, scen, args, - inclusion_stations, - exclusion_rots=exclusion_rots, run_only_neg=config.run_only_neg) + incl_stats, + exclusion_rots=excl_rots, run_only_neg=config.run_only_neg) logger.debug(f"Rebasing finished") print_time() if config.pickle_rebased: @@ -216,23 +214,14 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): with open(args.electrified_stations, "r", encoding="utf-8", ) as file: ele_stations = json.load(file) # Electrify inclusion stations - for stat in inclusion_stations: + for stat in incl_stats: electrify_station(stat, ele_stations, must_include_set) - rots = {r: sched.rotations[r] for r in sched.rotations if r not in exclusion_rots} - sched.rotations = rots + sched.rotations = {r: sched.rotations[r] for r in sched.rotations if + r not in excl_rots} - # create charging dicts which contain energy over time, which is numerically created - soc_charge_curve_dict = dict() - for v_type_name in sched.vehicle_types: - soc_charge_curve_dict[v_type_name] = dict() - for name, v_type in sched.vehicle_types.items(): - for ch_type, data in v_type.items(): - soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( - data["charging_curve"], data["capacity"], - sched.cs_power_opps, efficiency=config.charge_eff, - timestep=0.1) + # create charging dicts which contain energy over time, which is numerically calculated + soc_charge_curve_dict = create_charging_curves(sched) - ########### # Remove none Values from socs in the vehicle_socs an remove_none_socs(scen) @@ -259,14 +248,14 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): optimization_loop(ele_stations, ele_station_set, scen, sched, not_possible_stations, soc_upper_thresh=args.desired_soc_opps, soc_lower_thresh=config.min_soc, - solver=solver, opt_type=opt_type, - node_choice=node_choice, + solver=config.solver, opt_type=config.opt_type, + node_choice=config.node_choice, soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) print_time() ele_station_set = ele_station_set.union(must_include_set) logger.debug("Functions took these times in seconds") - logger.debug(len(ele_station_set), ele_station_set) + logger.debug("%s Stations : %s", len(ele_station_set), ele_station_set) logger.debug(could_not_be_electrified) scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), scen.vehicle_socs, @@ -275,11 +264,11 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): soc_upper_thresh=args.desired_soc_deps) new_events = get_below_zero_soc_events(scen, sched.rotations, sched, soc_lower_thresh=config.min_soc) - - logger.debug("Still not electrified with fast calc") - for event in new_events: - logger.debug(event["rotation"].id) - logger.debug("###") + if len(new_events) > 0: + logger.debug("Still not electrified with fast calc") + for event in new_events: + logger.debug(event["rotation"].id) + logger.debug("#####") with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) @@ -301,6 +290,7 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n decision_tree=None, pre_optimized_set=None, opt_type="greedy", node_choice="step-by-step", **kwargs): + """ """ # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() base_electrified_station_set = electrified_station_set.copy() @@ -368,50 +358,56 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n len(stations)) logger.warning(electrified_station_set) - if opt_type == "deep": - sols = [] - i = 0 - cont_loop = True - combinations = combs_unordered_no_putting_back(len(stations), - len(electrified_station_set)) - - logger.debug(f"There are {combinations} combinations") - while i < config.max_brute_loop and cont_loop: - i += 1 - if i % 10 == 0: - print(len(decision_tree), " Knotenpunkte durchwandert") - print(f"Optimal solution has length {len(electrified_station_set)}") - not_possible_stations = copy(not_possible_stations) - pre_optimized_set = copy(electrified_station_set) - could_not_be_electrified_copy = could_not_be_electrified.copy() - electrified_stations = base_stations.copy() - # electrified_station_set = base_electrified_station_set.copy() - new_electrified_set = set() - new_stations, cont_loop = \ - group_optimization(group, base_scen, base_sched, - electrified_stations, new_electrified_set, - could_not_be_electrified_copy, - not_possible_stations, - choice_func, soc_charge_curve_dict, - pre_optimized_set=pre_optimized_set, - decision_tree=decision_tree, - events_remaining=[len(events)], - soc_upper_thresh=soc_upper_thresh, - soc_lower_thresh=soc_lower_thresh, type=solver) - # if a new set was found, print it and save it in sols - - if new_electrified_set != pre_optimized_set and new_stations is not None: - logger.warning( - f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ - {stations_hash(new_electrified_set)}") - sols.append(new_electrified_set) - if len(new_electrified_set) < len(pre_optimized_set): - electrified_station_set = new_electrified_set - - logger.debug(sols) + # if no deep analysis is needed, loop can continue can return here + if opt_type != "deep": + list_greedy_sets[group_nr] = electrified_station_set.copy() + logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), + len(stations))) + continue + + # From here on only for deep analysis + sols = [] + i = 0 + cont_loop = True + combinations = combs_unordered_no_putting_back(len(stations), + len(electrified_station_set)) + logger.debug(f"There are {combinations} combinations") + while i < config.max_brute_loop and cont_loop: + i += 1 + if i % 10 == 0: + print(len(decision_tree), " Knotenpunkte durchwandert") + print(f"Optimal solution has length {len(electrified_station_set)}") + # not_possible_stations = copy(not_possible_stations) + pre_optimized_set = copy(electrified_station_set) + could_not_be_electrified_copy = could_not_be_electrified.copy() + electrified_stations = base_stations.copy() + new_electrified_set = set() + new_stations, cont_loop = \ + group_optimization(group, base_scen, base_sched, + electrified_stations, new_electrified_set, + could_not_be_electrified_copy, + not_possible_stations, + choice_func, soc_charge_curve_dict, + pre_optimized_set=pre_optimized_set, + decision_tree=decision_tree, + events_remaining=[len(events)], + soc_upper_thresh=soc_upper_thresh, + soc_lower_thresh=soc_lower_thresh, type=solver) + + # if a new set was found, print it and save it in sols + if new_electrified_set != pre_optimized_set and new_stations is not None: + logger.warning( + f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ + {stations_hash(new_electrified_set)}") + sols.append(new_electrified_set) + if len(new_electrified_set) < len(pre_optimized_set): + electrified_station_set = new_electrified_set + + logger.debug("All solutions for this group: %s", sols) list_greedy_sets[group_nr] = electrified_station_set.copy() logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), len(stations))) + # Saving config file only in case of deep analysis if config.save_decision_tree: with open(args.output_directory / Path("decision_tree.pickle"), "wb") as file: pickle.dump(decision_tree, file) @@ -554,7 +550,6 @@ def group_optimization(group, base_scen, base_sched, electrified_stations=electrified_stations) lifted_socs = None - not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) event_rotations_id = {event["rotation"].id for event in event_group} new_events = get_below_zero_soc_events(new_scen, event_rotations_id, @@ -650,10 +645,12 @@ def get_missing_energy(events): missing_energy += e["min_soc"] * e["capacity"] return missing_energy + def print_time(start=[]): if not start: start.append(time()) - print(round(time()-start[0],2), " seconds till start") + print(round(time() - start[0], 2), " seconds till start") + @time_it def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): @@ -1297,7 +1294,6 @@ def remove_none_socs(this_scen): this_scen.vehicle_socs[id] = soc - def get_vehicle(rot_id, this_sched): return this_sched.rotations[rot_id].vehicle_id @@ -1367,6 +1363,17 @@ def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thre soc_data=vehicle_socs) return [e["roation"].id for e in new_events] +def create_charging_curves(this_sched): + soc_charge_curve_dict = dict() + for v_type_name in this_sched.vehicle_types: + soc_charge_curve_dict[v_type_name] = dict() + for name, v_type in this_sched.vehicle_types.items(): + for ch_type, data in v_type.items(): + soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( + data["charging_curve"], data["capacity"], + this_sched.cs_power_opps, efficiency=config.charge_eff, + timestep=0.1) + return soc_charge_curve_dict # Electrify everything minus 1 station. If without the stations there are below zero events # it is a must have station @@ -1397,8 +1404,8 @@ def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_ soc_upper_thresh=args.desired_soc_deps) for rot in this_sched.rotations: - soc, a,b = get_rotation_soc(rot,this_sched,this_scen,vehicle_socs) - if np.min(soc[a:b]) Date: Thu, 15 Dec 2022 15:37:10 +0100 Subject: [PATCH 406/802] Add spiceEV abortion handling to toolbox --- ebus_toolbox/schedule.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 548eb9b2..0f3e6502 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -183,7 +183,8 @@ def run(self, args): with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) scenario.run('distributed', vars(args).copy()) - + assert scenario.step_i == scenario.n_intervals - 1, \ + 'spiceEV simulation aborted, see above for details' return scenario def set_charging_type(self, ct, rotation_ids=None): From 43cbd0991eb84861e100062c3df72dba84ca4722 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 16 Dec 2022 16:31:12 +0100 Subject: [PATCH 407/802] Refractoring --- ebus_toolbox/__main__.py | 42 +-- ebus_toolbox/optimizer.py | 608 ++++++++++++++++++-------------------- 2 files changed, 316 insertions(+), 334 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 89e25b74..42e61005 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -116,44 +116,44 @@ help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") - args = parser.parse_args() + ARGS = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config - args.ALLOW_NEGATIVE_SOC = True - args.attach_vehicle_soc = True + ARGS.ALLOW_NEGATIVE_SOC = True + ARGS.attach_vehicle_soc = True - util.set_options_from_config(args, check=True, verbose=False) + util.set_options_from_config(ARGS, check=True, verbose=False) - args.output_directory = Path(args.output_directory) / \ - str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + ARGS.output_directory = Path(ARGS.output_directory) / \ + str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. # needs to happen after set_options_from_config since # args.output_directory can be overwritten by config - args.output_directory.mkdir(parents=True, exist_ok=True) + ARGS.output_directory.mkdir(parents=True, exist_ok=True) - if not args.save_timeseries: - args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" - if not args.save_results: - args.save_results = args.output_directory / "simulation_spiceEV.json" - if not args.save_soc: - args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" + if not ARGS.save_timeseries: + ARGS.save_timeseries = ARGS.output_directory / "simulation_spiceEV.csv" + if not ARGS.save_results: + ARGS.save_results = ARGS.output_directory / "simulation_spiceEV.json" + if not ARGS.save_soc: + ARGS.save_soc = ARGS.output_directory / "simulation_soc_spiceEV.csv" # copy input files to output to ensure reproducibility - copy_list = [args.config, args.electrified_stations, args.vehicle_types] + copy_list = [ARGS.config, ARGS.electrified_stations, ARGS.vehicle_types] # only copy cost params if they exist - if args.cost_parameters_file is not None: - copy_list.append(args.cost_parameters_file) + if ARGS.cost_parameters_file is not None: + copy_list.append(ARGS.cost_parameters_file) for c_file in copy_list: - shutil.copy(str(c_file), str(args.output_directory / Path(c_file).name)) + shutil.copy(str(c_file), str(ARGS.output_directory / Path(c_file).name)) - util.save_version(Path(args.output_directory / "program_version.txt")) + util.save_version(Path(ARGS.output_directory / "program_version.txt")) # rename special options - args.timing = args.eta + ARGS.timing = ARGS.eta - if args.input_schedule is None: + if ARGS.input_schedule is None: raise SystemExit("The following argument is required: input_schedule") - simulate.simulate(args) + simulate.simulate(ARGS) diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index d0e0bb6f..f6cc0fa3 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -6,6 +6,7 @@ import os import sys import warnings +import pickle from copy import copy, deepcopy from pathlib import Path from time import time @@ -13,12 +14,9 @@ import math import shutil import numpy as np -import pickle import matplotlib import matplotlib.pyplot as plt - import report -# spice_ev scenario from src import scenario import schedule import rotation @@ -28,15 +26,13 @@ from ebus_toolbox.util import uncomment_json_file, get_buffer_time as get_buffer_time_spice_ev from optimizer_config import read_config, OptimizerConfig -logger = None -args = None -config = None - +CONFIG = OptimizerConfig() matplotlib.use("TkAgg") -config = OptimizerConfig() def time_it(function, timers={}): + """decorator function to time the duration function calls + take and count how often they happen""" if function: def decorated_function(*this_args, **kwargs): key = function.__name__ @@ -66,11 +62,11 @@ def setup_logger(): # logging to one file which keeps track of optimization over many runs file_handler_all_opts = logging.FileHandler('optimizer.log') - file_handler_all_opts.setLevel(config.debug_level) + file_handler_all_opts.setLevel(CONFIG.debug_level) # and logging to a file which is put in the folder with the other optimizer results - file_handler_this_opt = logging.FileHandler(Path(args.output_directory) / Path('optimizer.log')) - file_handler_this_opt.setLevel(config.debug_level) + file_handler_this_opt = logging.FileHandler(Path(ARGS.output_directory) / Path('optimizer.log')) + file_handler_this_opt.setLevel(CONFIG.debug_level) formatter = logging.Formatter('%(asctime)s:%(message)s', "%m%d %H%M%S") @@ -81,7 +77,7 @@ def setup_logger(): formatter = logging.Formatter('%(message)s') stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) - stream_handler.setLevel(config.debug_level) + stream_handler.setLevel(CONFIG.debug_level) this_logger.addHandler(file_handler_this_opt) this_logger.addHandler(file_handler_all_opts) this_logger.addHandler(stream_handler) @@ -89,23 +85,23 @@ def setup_logger(): def main(): + """ main call""" config_path = "./data/examples/optimizer.cfg" run_optimization(config_path) - logger.debug(time_it(None)) + LOGGER.debug(time_it(None)) def prepare_filesystem(): + """ Prepare files and folders in the optimization results folder""" now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - args.output_directory = Path(config.output_path) / str(now + "_optimizer") + ARGS.output_directory = Path(CONFIG.output_path) / str(now + "_optimizer") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. - # needs to happen after set_options_from_config since - # args.output_directory can be overwritten by config - args.output_directory.mkdir(parents=True, exist_ok=True) + ARGS.output_directory.mkdir(parents=True, exist_ok=True) # copy paste the config file - copy_file = Path(config.path) - destination = args.output_directory / Path("optimizer_config.cfg") + copy_file = Path(CONFIG.path) + destination = ARGS.output_directory / Path("optimizer_config.cfg") shutil.copy(copy_file, destination) @@ -131,64 +127,64 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): :return: (Schedule,Scenario) optimizied schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - global config - global logger - global args - config = read_config(config_path) + global CONFIG + global LOGGER + global ARGS + CONFIG = read_config(config_path) # load pickle files if sched is None or scen is None or this_args is None: # if no schedule was given as argument, make sure no scenario # and args input was given as well. assert sched == scen == this_args is None - sched, scen, this_args = toolbox_from_pickle(config.schedule, config.scenario, config.args) - - args = this_args + sched, scen, this_args = toolbox_from_pickle(CONFIG.schedule, CONFIG.scenario, CONFIG.args) + ARGS = this_args # prepare Filesystem with folders and paths and copy config prepare_filesystem() - if args.save_soc: - args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") - logger = setup_logger() + if ARGS.save_soc: + ARGS.save_soc = ARGS.output_directory / "simulation_soc_spiceEV.csv" + new_ele_stations_path = ARGS.output_directory / Path("optimized_stations" + ".json") + + LOGGER = setup_logger() # remove those args, since they lead to file creation, which is not # needed. - del args.save_timeseries - del args.save_results - if args.desired_soc_deps != 1: - logger.error("Fast calc is not yet optimized for desired socs unequal to 1") + del ARGS.save_timeseries + del ARGS.save_results + if ARGS.desired_soc_deps != 1: + LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") # which rotations should be excluded? - excl_rots = config.exclusion_rots + excl_rots = CONFIG.exclusion_rots # which stations has to be electrified - incl_stats = config.inclusion_stations + incl_stats = CONFIG.inclusion_stations # which station can not be electrified - excl_stats = config.exclusion_stations + excl_stats = CONFIG.exclusion_stations - # if given reduce the rotations to the rotations given in the config file - if config.reduce_rots: - sched.rotations = {rot: sched.rotations[rot] for rot in config.rots} + # if given, reduce the rotations to the rotations given in the config file + if CONFIG.reduce_rots: + sched.rotations = {rot: sched.rotations[rot] for rot in CONFIG.rots} - remove_impossible_rots = config.remove_impossible_rots + remove_impossible_rots = CONFIG.remove_impossible_rots # set battery and charging curves through config file if wished for - for name, v_type in sched.vehicle_types.items(): - for charge_type, vehicle in v_type.items(): - if config.battery_capacity is not None: - vehicle["capacity"] = config.battery_capacity - if config.charging_curve is not None: - vehicle["charging_curve"] = config.charging_curve + for v_type in sched.vehicle_types.values(): + for vehicle in v_type.values(): + if CONFIG.battery_capacity is not None: + vehicle["capacity"] = CONFIG.battery_capacity + if CONFIG.charging_curve is not None: + vehicle["charging_curve"] = CONFIG.charging_curve # create a decision tree or load one from a previous run - if config.decision_tree_path is not None: - with open(config.decision_tree_path, "rb") as file: + if CONFIG.decision_tree_path is not None: + with open(CONFIG.decision_tree_path, "rb") as file: decision_tree = pickle.load(file) else: - decision_tree = dict() + decision_tree = {} # stations which are included can not be included again. Therefore they get into # the set of not possible stations @@ -199,19 +195,19 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations - if config.rebase_scenario: - logger.debug("Spice EV Rebasing Scenario") + if CONFIG.rebase_scenario: + LOGGER.debug("Spice EV Rebasing Scenario") sched, scen, must_include_set, ele_stations = preprocessing_scenario( - sched, scen, args, + sched, scen, ARGS, incl_stats, - exclusion_rots=excl_rots, run_only_neg=config.run_only_neg) - logger.debug(f"Rebasing finished") + exclusion_rots=excl_rots, run_only_neg=CONFIG.run_only_neg) + LOGGER.debug("Rebasing finished") print_time() - if config.pickle_rebased: - toolbox_to_pickle(config.pickle_rebased_name, sched, scen, args) - logger.debug(f"Rebased scenario pickled as {config.pickle_rebased_name}") + if CONFIG.pickle_rebased: + toolbox_to_pickle(CONFIG.pickle_rebased_name, sched, scen, ARGS) + LOGGER.debug("Rebased scenario pickled as %s", CONFIG.pickle_rebased_name) else: - with open(args.electrified_stations, "r", encoding="utf-8", ) as file: + with open(ARGS.electrified_stations, "r", encoding="utf-8", ) as file: ele_stations = json.load(file) # Electrify inclusion stations for stat in incl_stats: @@ -219,66 +215,65 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): sched.rotations = {r: sched.rotations[r] for r in sched.rotations if r not in excl_rots} - # create charging dicts which contain energy over time, which is numerically calculated + # create charging dicts which contain soc over time, which is numerically calculated soc_charge_curve_dict = create_charging_curves(sched) # Remove none Values from socs in the vehicle_socs an remove_none_socs(scen) - if config.check_for_must_stations: - must_stations = get_must_stations(scen, sched, args.desired_soc_opps, + if CONFIG.check_for_must_stations: + must_stations = get_must_stations(scen, sched, ARGS.desired_soc_opps, soc_charge_curve_dict, not_possible_stations=not_possible_stations, - soc_lower_thresh=config.min_soc, relative_soc=False) - logger.warning("%s must stations %s", len(must_stations), must_stations) + soc_lower_thresh=CONFIG.min_soc, relative_soc=False) + LOGGER.warning("%s must stations %s", len(must_stations), must_stations) not_possible_stations = not_possible_stations.union(must_stations) for stat in must_stations: - # dont put must stations in electrified set --> therefore create trash set + # dont put must stations in electrified set, but in extra set must_include_set electrify_station(stat, ele_stations, must_include_set) scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), scen.vehicle_socs, scen, must_stations, soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) + soc_upper_thresh=ARGS.desired_soc_deps) - logger.debug("Starting greedy optimization") + LOGGER.debug("Starting greedy optimization") ele_station_set = set() print_time() ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ optimization_loop(ele_stations, ele_station_set, scen, sched, - not_possible_stations, soc_upper_thresh=args.desired_soc_opps, - soc_lower_thresh=config.min_soc, - solver=config.solver, opt_type=config.opt_type, - node_choice=config.node_choice, + not_possible_stations, soc_upper_thresh=ARGS.desired_soc_opps, + soc_lower_thresh=CONFIG.min_soc, + solver=CONFIG.solver, opt_type=CONFIG.opt_type, + node_choice=CONFIG.node_choice, soc_charge_curve_dict=soc_charge_curve_dict, decision_tree=decision_tree) print_time() ele_station_set = ele_station_set.union(must_include_set) - logger.debug("Functions took these times in seconds") - logger.debug("%s Stations : %s", len(ele_station_set), ele_station_set) - logger.debug(could_not_be_electrified) + LOGGER.debug("Functions took these times in seconds") + LOGGER.debug("%s Stations : %s", len(ele_station_set), ele_station_set) + LOGGER.debug(could_not_be_electrified) scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), scen.vehicle_socs, scen, ele_station_set, soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) - new_events = get_below_zero_soc_events(scen, sched.rotations, sched, - soc_lower_thresh=config.min_soc) + soc_upper_thresh=ARGS.desired_soc_deps) + new_events = get_low_soc_events(scen, sched) if len(new_events) > 0: - logger.debug("Still not electrified with fast calc") + LOGGER.debug("Still not electrified with fast calc") for event in new_events: - logger.debug(event["rotation"].id) - logger.debug("#####") + LOGGER.debug(event["rotation"].id) + LOGGER.debug("#####") with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) - logger.debug("Spice EV is calculating optimized case as a complete scenario") + LOGGER.debug("Spice EV is calculating optimized case as a complete scenario") final_sched, final_scen, ele_station_set, ele_stations = preprocessing_scenario( - sched, scen, args, electrified_stations=ele_stations, run_only_neg=False, + sched, scen, ARGS, electrified_stations=ele_stations, run_only_neg=False, electrified_station_set=ele_station_set, cost_calc=True) - logger.warning(f"Still negative rotations:{final_sched.get_negative_rotations(final_scen)}") + LOGGER.warning("Still negative rotations: %s", final_sched.get_negative_rotations(final_scen)) print("Finished") return final_sched, final_scen @@ -287,10 +282,11 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, not_possible_stations, soc_charge_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, - decision_tree=None, pre_optimized_set=None, opt_type="greedy", + decision_tree=None, opt_type="greedy", node_choice="step-by-step", **kwargs): - """ """ + """Loops over every base group with the core of group optimization and handles deep or + greedy arguments""" # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() base_electrified_station_set = electrified_station_set.copy() @@ -303,13 +299,10 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # Get events where soc fell below 0. The events contain info about the problematic # timespan, which includes stations which could provide a soc lift - base_events = get_below_zero_soc_events(this_scen=base_scen, - rotations=list(new_sched.rotations.keys()), - this_sched=base_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, relative_soc=False) + base_events = get_low_soc_events(this_scen=base_scen, + this_sched=base_sched, + soc_upper_thresh=soc_upper_thresh, + not_possible_stations=not_possible_stations, rel_soc=False) # Check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible @@ -320,13 +313,13 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n # get_negative_rotations_all_electrified(base_scen, base_sched, soc_upper_thresh, soc_charge_curve_dict, # not_possible_stations=not_possible_stations, - # soc_lower_thresh=soc_lower_thresh, relative_soc=False) + # rel_soc=False) new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), new_scen.vehicle_socs, new_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) + soc_upper_thresh=ARGS.desired_soc_deps) # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups[:]): @@ -334,10 +327,10 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n linien = {lne for e in events for lne in e["rotation"].lines} electrified_stations = base_stations.copy() electrified_station_set = base_electrified_station_set.copy() - logger.warning(f"Optimizing {group_nr + 1} out of {len(groups)}. This includes these Lines") - logger.warning(linien) - logger.warning("%s events", (len(events))) - solver = kwargs.get("solver", "spiceev") + LOGGER.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, + len(groups)) + LOGGER.warning(linien) + LOGGER.warning("%s events", (len(events))) if node_choice == "brute": choice_func = choose_station_brute else: @@ -351,18 +344,18 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n pre_optimized_set=None, decision_tree=decision_tree, soc_lower_thresh=soc_lower_thresh, soc_upper_thresh=soc_upper_thresh, - events_remaining=[len(events)], type=solver, + events_remaining=[len(events)], **kwargs) - logger.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), + LOGGER.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), len(stations)) - logger.warning(electrified_station_set) + LOGGER.warning(electrified_station_set) # if no deep analysis is needed, loop can continue can return here if opt_type != "deep": list_greedy_sets[group_nr] = electrified_station_set.copy() - logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), - len(stations))) + LOGGER.debug("Optimized with %s stations out of %s", len(electrified_station_set), + len(stations)) continue # From here on only for deep analysis @@ -371,8 +364,8 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n cont_loop = True combinations = combs_unordered_no_putting_back(len(stations), len(electrified_station_set)) - logger.debug(f"There are {combinations} combinations") - while i < config.max_brute_loop and cont_loop: + LOGGER.debug("There are %s combinations", combinations) + while i < CONFIG.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: print(len(decision_tree), " Knotenpunkte durchwandert") @@ -392,24 +385,25 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n decision_tree=decision_tree, events_remaining=[len(events)], soc_upper_thresh=soc_upper_thresh, - soc_lower_thresh=soc_lower_thresh, type=solver) + soc_lower_thresh=soc_lower_thresh, **kwargs) # if a new set was found, print it and save it in sols if new_electrified_set != pre_optimized_set and new_stations is not None: - logger.warning( - f"Optimized with {len(new_electrified_set)} stations {str('#' * 20)} \ - {stations_hash(new_electrified_set)}") + LOGGER.warning("Optimized with %s stations %s %s", + len(new_electrified_set), str('#' * 20), + stations_hash(new_electrified_set)) sols.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): electrified_station_set = new_electrified_set - logger.debug("All solutions for this group: %s", sols) + LOGGER.debug("All solutions for this group: %s", sols) list_greedy_sets[group_nr] = electrified_station_set.copy() - logger.debug("Optimized with {} stations out of {}".format(len(electrified_station_set), - len(stations))) + LOGGER.debug("Optimized with %s stations out of %s", len(electrified_station_set), + len(stations)) + # Saving config file only in case of deep analysis - if config.save_decision_tree: - with open(args.output_directory / Path("decision_tree.pickle"), "wb") as file: + if CONFIG.save_decision_tree: + with open(ARGS.output_directory / Path("decision_tree.pickle"), "wb") as file: pickle.dump(decision_tree, file) for single_set in list_greedy_sets: for stat in single_set: @@ -420,8 +414,8 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n @time_it def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None): - # First create simple list of station sets for single events. - # Electrified and other not possible to electrify stations should not connect groups + """ First create simple list of station sets for single events. + #Electrified and other not possible to electrify stations should not connect groups""" # Making sure default arguments are none and not mutable if not not_possible_stations: @@ -431,8 +425,8 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec could_not_be_electrified = set() possible_stations = [ - {station for station in e["stations"] if station not in not_possible_stations} - for e + {station for station in event["stations"] if station not in not_possible_stations} + for event in events] # If stations overlap join them station_subsets = join_all_subsets(possible_stations) @@ -440,45 +434,51 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec # Group the events in the same manner as stations, so that the same amount of event groups are # created as station subsets - for e in events: + for event in events: for i, subset in enumerate(station_subsets): # Every station from an event must share the same station sub_set. Therefore its enough # to check only the first element - if len(e["stations"]) > 0: - if next(iter(e["stations"])) in subset: - event_groups[i].append(e) + if len(event["stations"]) > 0: + if next(iter(event["stations"])) in subset: + event_groups[i].append(event) break else: - logger.warning(f'Didnt find rotation {e["rotation"].id} in any subset' - f'of possible electrifiable stations') + LOGGER.warning('Didnt find rotation %sin any subset' + 'of possible electrifiable stations', event["rotation"].id) # this event will no show up in an event_group. # therefore it needs to be put into this set - could_not_be_electrified.update([e["rotation"].id]) + could_not_be_electrified.update([event["rotation"].id]) groups = list(zip(event_groups, station_subsets)) return sorted(groups, key=lambda x: len(x[1])) @time_it -def group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, soc_curve_dict, - pre_optimized_set=None, decision_tree=None, - soc_lower_thresh=0, soc_upper_thresh=1, - tree_position=None, type="spiceev", **kwargs): +def group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, + could_not_be_electrified, not_possible_stations, choose_station_function, + soc_curve_dict, pre_optimized_set=None, decision_tree=None, + tree_position=None, **kwargs): + + """ Optimize a single group events + :return (electrified_stations if optimization continues, None if no further recursive calls + should happen, bool if further deep analysis should take place) + :rtype (dict() or None, bool) + """ + + solver = kwargs.get("solver", "spiceev") + if not tree_position: tree_position = [] # Base socs are the socs without electrification, they get passed through the stacks - # so the quick calculation can mutate them since quick calculation cant take place iteratly + # so the quick calculation can mutate them since quick calculation cant take place iteratively if kwargs.get("base_socs"): base_socs = kwargs.get("base_socs") else: - base_socs = {id: soc for id, soc in base_scen.vehicle_socs.items()} + base_socs = dict(base_scen.vehicle_socs.items()) # give tree position - logger.debug("%s with length of %s", tree_position, len(tree_position)) + LOGGER.debug("%s with length of %s", tree_position, len(tree_position)) # Unpack events and possible stations event_group, possible_stations = group @@ -486,21 +486,19 @@ def group_optimization(group, base_scen, base_sched, # Get the events which are still negative events_remaining = kwargs.get("events_remaining", [99999]) - # Copy Scen and sched and deepcopy vehicle socs so upper levels are not changed by the following - # optimization + # Copy Scen and sched new_scen = copy(base_scen) new_sched = copy(base_sched) # Get rotations from event dict and calculate the missing energy rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} missing_energy = get_missing_energy(event_group) - if missing_energy >= 0: - logger.debug("Already electrified: Returning set") + LOGGER.debug("Already electrified: Returning") return electrified_stations, True station_eval = evaluate(event_group, new_scen, soc_curve_dict, - soc_upper_thresh=soc_upper_thresh, soc_lower_thresh=soc_lower_thresh) + kwargs) # Debug.Log the missing energy and station evaluation station_eval_to_logger(missing_energy, station_eval) @@ -511,58 +509,54 @@ def group_optimization(group, base_scen, base_sched, missing_energy=missing_energy) stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} if best_station_ids is None: - logger.warning( - f"No useful station found with " - f"{events_remaining} rotations not electrified yet. " - f" Stopped after electrifying {len(electrified_station_set)}") - - if pre_optimized_set is not None: - # Remove electrified stations in this run - c = electrified_station_set.copy() - for stat in c: - electrified_stations.pop(stat) - electrified_station_set.remove(stat) - # Overwrite with preoptimized set - for stat in pre_optimized_set: - electrify_station(stat, electrified_stations, electrified_station_set) - else: + LOGGER.warning("No useful station found with %s rotations not electrified yet. " + "Stopped after electrifying %s", events_remaining, len(electrified_station_set)) + + if pre_optimized_set is None: could_not_be_electrified.update(list(rotation_dict.keys())) + return None, False + + # Remove electrified stations in this run + copied_set = electrified_station_set.copy() + for stat in copied_set: + electrified_stations.pop(stat) + electrified_station_set.remove(stat) + # Overwrite with preoptimized set + for stat in pre_optimized_set: + electrify_station(stat, electrified_stations, electrified_station_set) return None, False - logger.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) + + LOGGER.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) # Electrify station(s) for stat_id in best_station_ids: electrify_station(stat_id, electrified_stations, electrified_station_set) event_rotations = {x["rotation"] for x in event_group} - if type == "quick": + if solver == "quick": # Quick calculation has to electrify everything in one step, # or the lifting of socs is not correct new_scen.vehicle_socs = deepcopy(base_socs) new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, new_scen.vehicle_socs, new_scen, electrified_station_set, soc_curve_dict, - soc_upper_thresh=args.desired_soc_deps) - lifted_socs = deepcopy(new_scen.vehicle_socs) + soc_upper_thresh=ARGS.desired_soc_deps) else: new_sched.rotations = rotation_dict - new_sched, new_scen = run_schedule(new_sched, args, + new_sched, new_scen = run_schedule(new_sched, ARGS, electrified_stations=electrified_stations) - lifted_socs = None not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) - event_rotations_id = {event["rotation"].id for event in event_group} - new_events = get_below_zero_soc_events(new_scen, event_rotations_id, - new_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, relative_soc=True) + event_rotations_ids = {event["rotation"].id for event in event_group} + new_events = get_low_soc_events(new_scen, + new_sched, rotations=event_rotations_ids, + not_possible_stations=not_possible_stations, rel_soc=True , + **kwargs) delta_energy = get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) - logger.debug("Last electrification electrified %s/%s." + LOGGER.debug("Last electrification electrified %s/%s." " %s remaining events in the base group.", len(event_group) - len(new_events), len(event_group), events_remaining[0]) delta_base_energy = delta_energy # get_missing_energy(base_events) @@ -576,29 +570,25 @@ def group_optimization(group, base_scen, base_sched, return electrified_stations, True # Some choice functions might not need a recursive call, they return here. recursive is set # by the choose_station_function - elif not recursive: + if not recursive: return None, True # Check if the events can be divided into subgroups which are independent groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) - for k, group in enumerate(groups): + for k, this_group in enumerate(groups): this_tree = tree_position.copy() this_tree.append(k) - new_stations, _ = group_optimization(group, new_scen, new_sched, + new_stations, _ = group_optimization(this_group, new_scen, new_sched, electrified_stations, electrified_station_set, could_not_be_electrified, not_possible_stations, choose_station_function, soc_curve_dict, pre_optimized_set, decision_tree, - lifted_socs=lifted_socs, events_remaining=events_remaining, - soc_lower_thresh=soc_lower_thresh, - soc_upper_thresh=soc_upper_thresh, - tree_position=this_tree, type=type, - base_socs=base_socs - ) + tree_position=this_tree, solver=solver, + base_socs=base_socs, **kwargs) if new_stations is not None: electrified_stations.update(new_stations) @@ -616,19 +606,14 @@ def group_optimization(group, base_scen, base_sched, new_scen.vehicle_socs, new_scen, electrified_station_set, soc_curve_dict, - soc_upper_thresh=args.desired_soc_deps) - - prune_events = get_below_zero_soc_events(new_scen, event_rotations_id, - new_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, - relative_soc=True) - - station_eval = evaluate(prune_events, new_scen, soc_curve_dict, - soc_upper_thresh=soc_upper_thresh, - soc_lower_thresh=soc_lower_thresh) + soc_upper_thresh=ARGS.desired_soc_deps) + + prune_events = get_low_soc_events(new_scen, new_sched, + rotations=event_rotations_ids, + not_possible_stations=not_possible_stations, + rel_soc=True, **kwargs) + + station_eval = evaluate(prune_events, new_scen, soc_curve_dict) prune_missing_energy = get_missing_energy(prune_events) if not is_branch_promising(station_eval, electrified_station_set, pre_optimized_set, prune_missing_energy): @@ -640,13 +625,16 @@ def group_optimization(group, base_scen, base_sched, @time_it def get_missing_energy(events): + """ Sum up all the missing energies of the given events""" missing_energy = 0 - for e in events: - missing_energy += e["min_soc"] * e["capacity"] + for event in events: + missing_energy += event["min_soc"] * event["capacity"] return missing_energy def print_time(start=[]): + """ Print the time and automatically set start time to the first time the function getting + called""" if not start: start.append(time()) print(round(time() - start[0], 2), " seconds till start") @@ -654,14 +642,18 @@ def print_time(start=[]): @time_it def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): + """ Fill decision tree with the given info + :return decision tree + :rtype dict() + """ node_name = stations_hash(electrified_station_set) try: decision_tree[node_name]["missing_energy"] = delta_base_energy decision_tree[node_name]["visit_counter"] += 1 # todo add is_viable - logger.debug("already visited") + LOGGER.debug("already visited") except KeyError: - decision_tree[node_name] = dict() + decision_tree[node_name] = {} decision_tree[node_name]["missing_energy"] = delta_base_energy decision_tree[node_name]["visit_counter"] = 1 @@ -669,13 +661,14 @@ def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): @time_it -def preprocessing_scenario(this_sched, this_scen, this_args, - inclusion_stations=None, - electrified_stations=None, - electrified_station_set=None, - exclusion_rots=None, - run_only_neg=False, - cost_calc=False): +def preprocessing_scenario(this_sched, this_scen, this_args,inclusion_stations=None, + electrified_stations=None, electrified_station_set=None, + exclusion_rots=None, run_only_neg=False, cost_calc=False): + """ Prepare scenario and run schedule + :return schedule, scenario, electrified_station_set, electrified_stations + :rtype (schedule.Schedule(), scenario.Scneario(), set(), dict()) + """ + if not inclusion_stations: inclusion_stations = set() @@ -704,7 +697,7 @@ def preprocessing_scenario(this_sched, this_scen, this_args, new_sched, new_scen = run_schedule(this_sched, this_args, electrified_stations, cost_calc=cost_calc) - report.generate(new_sched, new_scen, args) + report.generate(new_sched, new_scen, ARGS) return new_sched, new_scen, electrified_station_set, electrified_stations @@ -739,19 +732,18 @@ def plot_(data): return ax -def plot_rot(id, this_sched, this_scen, ax=None, rot_only=True): +def plot_rot(rot_id, this_sched, this_scen, ax=None, rot_only=True): """ Simple plot of data without having to create subplots""" - a, b, c = get_rotation_soc(id, this_sched, this_scen) + soc, start, end = get_rotation_soc(rot_id, this_sched, this_scen) if not rot_only: - b = 0 - c = -1 + start = 0 + end = -1 if ax is None: fig, ax = plt.subplots() - ax.plot(a[b:c], linewidth=2.0) - return ax - else: - ax.plot(a[b:c], linewidth=2.0) + ax.plot(soc[start:end], linewidth=2.0) return ax + ax.plot(soc[start:end], linewidth=2.0) + return ax def join_all_subsets(subsets): @@ -774,13 +766,13 @@ def choose_station_brute(station_eval, electrified_station_set, # the missing energy # Potential>missing energy * 80% potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) - if potential > -missing_energy * config.estimation_threshold: + if potential > -missing_energy * CONFIG.estimation_threshold: return comb, False else: - logger.debug("skipped %s since potential is too low %s %%", comb, + LOGGER.debug("skipped %s since potential is too low %s %%", comb, round(potential / -missing_energy * 100, 0)) else: - logger.debug("calculated all viable possibilities") + LOGGER.debug("calculated all viable possibilities") return None, False @@ -791,7 +783,7 @@ def is_branch_promising(station_eval, electrified_station_set, pot = 0 for i in range(0, min(delta, len(station_eval))): pot += station_eval[i][1]["pot_sum"] - if pot < -missing_energy * config.estimation_threshold: + if pot < -missing_energy * CONFIG.estimation_threshold: print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", stations_hash(electrified_station_set)) return False @@ -865,12 +857,12 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, continue idx = get_index_by_time(trip.arrival_time, eval_scen) try: - standing_time_min = get_charging_time(trip, rot.trips[i + 1], args) + standing_time_min = get_charging_time(trip, rot.trips[i + 1], ARGS) except IndexError: standing_time_min = 0 d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min) - buffer_idx = int((get_buffer_time(trip, args)) / timedelta(minutes=1)) + buffer_idx = int((get_buffer_time(trip)) / timedelta(minutes=1)) delta_idx = int(standing_time_min) + 1 old_soc = soc[idx + buffer_idx:idx + buffer_idx + delta_idx].copy() soc[idx + buffer_idx:] += d_soc @@ -899,11 +891,15 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, @time_it -def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_thresh=0, - electrified_station_set=None, decision_tree=None): +def evaluate(events, eval_scen, soc_curve_dict, + electrified_station_set=None, decision_tree=None, **kwargs): # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by # loading power, standing time at a station, soc at station, minimal soc of the event + + soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) + soc_upper_thresh = kwargs.get("soc_upper_thresh", ARGS.desired_soc_deps) + if not electrified_station_set: electrified_station_set = set() @@ -927,7 +923,7 @@ def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_th max_soc - min_soc) try: - standing_time_min = get_charging_time(trip, e["trip"][i + 1], args) + standing_time_min = get_charging_time(trip, e["trip"][i + 1], ARGS) except IndexError: standing_time_min = 0 @@ -972,7 +968,7 @@ def evaluate(events, eval_scen, soc_curve_dict, soc_upper_thresh=1, soc_lower_th def get_charging_time(trip1, trip2, args): standing_time_min = (trip2.departure_time - trip1.arrival_time) \ / timedelta(minutes=1) - buffer_time = (get_buffer_time(trip1, args) / timedelta(minutes=1)) + buffer_time = (get_buffer_time(trip1) / timedelta(minutes=1)) standing_time_min -= buffer_time if args.min_charging_time > standing_time_min: @@ -1037,19 +1033,26 @@ def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): @time_it -def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, - this_sched: schedule.Schedule, - soc_upper_thresh=0.9, filter_standing_time=True, - not_possible_stations=None, soc_lower_thresh=0, relative_soc=False, - soc_data=None): +def get_low_soc_events(this_scen: scenario.Scenario,this_sched: schedule.Schedule, + rotations=None, filter_standing_time=True, not_possible_stations=None, + rel_soc=False, soc_data=None, **kwargs): + + if not not_possible_stations: not_possible_stations = set() + + if not rotations: + rotations = this_sched.rotations + + soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) + soc_upper_thresh = kwargs.get("soc_upper_thresh", ARGS.desired_soc_deps) + + # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to # an event horizon events = [] - SOC_UPPER_THRESH = soc_upper_thresh count_electrified_rot = 0 for rot_id in rotations: @@ -1066,24 +1069,24 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, # the rotation before would lead to fixing this rotation # if using relative SOC, SOC lookup has to be adjusted - if relative_soc: + if rel_soc: start_soc = comb[0][0] soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( soc_upper_thresh - soc_lower_thresh) - SOC_UPPER_THRESH = soc_lower_thresh_cur + soc_upper_thresh + soc_upper_thresh = soc_lower_thresh_cur + soc_upper_thresh if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 while min_soc < soc_lower_thresh_cur: i = min_idx idx = [x[1] for x in reduced_list] - while soc[i] < SOC_UPPER_THRESH: + while soc[i] < soc_upper_thresh: if i == rot_start_idx: break i -= 1 start_comb = idx.index(i) start = i i = min_idx - while soc[i] < SOC_UPPER_THRESH: + while soc[i] < soc_upper_thresh: if i >= rot_end_idx - 1: break i += 1 @@ -1098,7 +1101,7 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, for ii, trip in enumerate(trips): try: try: - standing_time_min = get_charging_time(trip, trips[ii + 1], args) + standing_time_min = get_charging_time(trip, trips[ii + 1], ARGS) except IndexError: standing_time_min = 0 if standing_time_min > 0: @@ -1137,8 +1140,8 @@ def get_below_zero_soc_events(this_scen: scenario.Scenario, rotations, @time_it def preprocess_schedule(this_sched, this_args, electrified_stations=None): Trip.consumption = Consumption(this_sched.vehicle_types, - outside_temperatures=args.outside_temperature_over_day_path, - level_of_loading_over_day=args.level_of_loading_over_day_path) + outside_temperatures=ARGS.outside_temperature_over_day_path, + level_of_loading_over_day=ARGS.level_of_loading_over_day_path) this_sched.stations = electrified_stations # filter trips according to args this_sched.calculate_consumption() @@ -1164,32 +1167,22 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal electrified_stations=electrified_stations) # Dont print output from spice ev to reduce clutter - print(".", end="") - print("Running Spice EV...", end="") - sys.stdout = open(os.devnull, 'w') - - print("Running Spice EV...") with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) new_scen.run('distributed', vars(this_args).copy()) - - print(" with % s rotations and % s vehicles", this_sched2.rotations, - len(new_scen.vehicle_socs)) sys.stdout = sys.__stdout__ - if args.cost_calculation and cost_calc: + if ARGS.cost_calculation and cost_calc: # cost calculation following directly after simulation try: - with open(args.cost_parameters_file, encoding='utf-8') as f: + with open(ARGS.cost_parameters_file, encoding='utf-8') as f: cost_parameters_file = uncomment_json_file(f) except FileNotFoundError: - raise SystemExit(f"Path to cost parameters ({args.cost_parameters_file}) " + raise SystemExit(f"Path to cost parameters ({ARGS.cost_parameters_file}) " "does not exist. Exiting...") - calculate_costs(cost_parameters_file, new_scen, this_sched2, args) - print(".") - + calculate_costs(cost_parameters_file, new_scen, this_sched2, ARGS) return this_sched2, new_scen @@ -1203,7 +1196,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr time = 0 socs = [] times = [] - while soc < args.desired_soc_opps: + while soc < ARGS.desired_soc_opps: times.append(time) socs.append(soc) power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), @@ -1216,7 +1209,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr time += timestep # Fill the soc completely in last timestep times.append(time) - socs.append(args.desired_soc_opps) + socs.append(ARGS.desired_soc_opps) return np.array((times, socs)).T @@ -1227,62 +1220,59 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta): # First element which is bigger than current soc if time_delta == 0: return 0 - soc = max(min(args.desired_soc_opps, soc), 0) + soc = max(min(ARGS.desired_soc_opps, soc), 0) first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] second_time = first_time + time_delta # Catch out of bounds if time of charging end is bigger than table values if second_time >= soc_over_time_curve[-1, 0]: - end_soc = args.desired_soc_opps + end_soc = soc_over_time_curve[-1, 1] else: end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] # Make sure to limit delta soc to 1 if negative socs are given. They are possible during # the optimization process but will be continuously raised until they are >0. - return min(args.desired_soc_opps, end_soc - start_soc) - - -@time_it -def get_buffer_time_old(search_time, args): - try: - return timedelta(minutes=float(args.default_buffer_time_opps)) - except TypeError: - for window, buffer_time in args.default_buffer_time_opps.items(): - try: - start, end = window.split("-") - if float(end) > search_time.hour >= float(start): - return timedelta(minutes=buffer_time) - except ValueError: - return timedelta(minutes=0) + return min(ARGS.desired_soc_opps, end_soc - start_soc) @time_it def electrify_station(stat, stations, electrified_set): - stations[stat] = config.standard_opp_station + stations[stat] = CONFIG.standard_opp_station electrified_set.add(stat) @time_it -def get_buffer_time(trip, args): - # a= get_buffer_time_old(trip.arrival_time, args) - b = timedelta(minutes=get_buffer_time_spice_ev(trip, args.default_buffer_time_opps)) - return b +def get_buffer_time(trip): + return timedelta(minutes=get_buffer_time_spice_ev(trip, ARGS.default_buffer_time_opps)) @time_it def combs_unordered_no_putting_back(n: int, k: int): + """ Returns amount of combinations for pulling k elements out of n, without putting elements + back or looking at the order. this is equal to n over k + :param n: number of elements in the base group + :type n: int + :param k: number of elements in the sub group of picked elements + :type k: int + :return: number of combinations + :rtype: int + """ try: return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) except ValueError: - logger.warning("Value Error") + LOGGER.warning("Value Error") return 0 @time_it def remove_none_socs(this_scen): + """ Removes soc values of None by filling them with the last value which is not None + :param this_scen: scenario from which the None socs should be removed + :type this_scen: scenario.Scenario() + """ # Make sure no None values exists in SOCs. Fill later values with last value # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] - for id, soc in this_scen.vehicle_socs.items(): + for v_id, soc in this_scen.vehicle_socs.items(): soc = np.array(soc) last_not_none = "not found" if None in soc: @@ -1291,7 +1281,7 @@ def remove_none_socs(this_scen): last_not_none = soc[ii] break soc[soc == np.array(None)] = last_not_none - this_scen.vehicle_socs[id] = soc + this_scen.vehicle_socs[v_id] = soc def get_vehicle(rot_id, this_sched): @@ -1304,28 +1294,28 @@ def get_vehicle_rots(rot_id, this_sched): @time_it def station_eval_to_logger(missing_energy, station_eval): - logger.debug("Missing energy: %s", missing_energy) - if logger.getEffectiveLevel() > logging.DEBUG: + LOGGER.debug("Missing energy: %s", missing_energy) + if LOGGER.getEffectiveLevel() > logging.DEBUG: for stat_id in station_eval: - logger.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) + LOGGER.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) @time_it def toolbox_from_pickle(sched_name, scen_name, args_name): with open(args_name, "rb") as f: - args = pickle.load(f) + this_args = pickle.load(f) with open(scen_name, "rb") as f: scen = pickle.load(f) with open(sched_name, "rb") as f: sched = pickle.load(f) - return sched, scen, args + return sched, scen, this_args @time_it -def toolbox_to_pickle(name, sched, scen, args): +def toolbox_to_pickle(name, sched, scen, this_args): args_name = "args_" + name + ".pickle" with open(args_name, "wb") as f: - pickle.dump(args, f) + pickle.dump(this_args, f) scen_name = "scenario_" + name + ".pickle" with open(scen_name, "wb") as f: pickle.dump(scen, f) @@ -1338,32 +1328,27 @@ def toolbox_to_pickle(name, sched, scen, args): @time_it def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, - not_possible_stations=None, - soc_lower_thresh=0, relative_soc=False): + not_possible_stations=None, rel_soc=False): if not not_possible_stations: not_possible_stations = set() - events = get_below_zero_soc_events(this_scen=this_scen, - rotations=this_sched.rotations.keys(), - this_sched=this_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, relative_soc=relative_soc) + events = get_low_soc_events(this_scen=this_scen, this_sched=this_sched, + soc_upper_thresh=soc_upper_thresh, + not_possible_stations=not_possible_stations, rel_soc=rel_soc) stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} electrified_station_set = set(stats) vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), - this_scen.vehicle_socs, - this_scen, electrified_station_set, + this_scen.vehicle_socs, this_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) - new_events = get_below_zero_soc_events(this_scen, this_sched.rotations, - this_sched, soc_lower_thresh=soc_lower_thresh, - soc_data=vehicle_socs) + soc_upper_thresh=ARGS.desired_soc_deps) + new_events = get_low_soc_events(this_scen,this_sched, soc_data=vehicle_socs) return [e["roation"].id for e in new_events] + def create_charging_curves(this_sched): + """ Cycle through vehicles and create numerically created charging curves with energy supplied + over time""" soc_charge_curve_dict = dict() for v_type_name in this_sched.vehicle_types: soc_charge_curve_dict[v_type_name] = dict() @@ -1371,42 +1356,39 @@ def create_charging_curves(this_sched): for ch_type, data in v_type.items(): soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( data["charging_curve"], data["capacity"], - this_sched.cs_power_opps, efficiency=config.charge_eff, + this_sched.cs_power_opps, efficiency=CONFIG.charge_eff, timestep=0.1) return soc_charge_curve_dict -# Electrify everything minus 1 station. If without the stations there are below zero events -# it is a must have station + + @time_it def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, not_possible_stations=None, soc_lower_thresh=0, relative_soc=False): - events = get_below_zero_soc_events(this_scen=this_scen, - rotations=this_sched.rotations.keys(), - this_sched=this_sched, - soc_upper_thresh=soc_upper_thresh, - filter_standing_time=True, - not_possible_stations=not_possible_stations, - soc_lower_thresh=soc_lower_thresh, relative_soc=relative_soc) + """Electrify everything minus 1 station. If without the stations there are below zero events + it is a must have station""" + events = get_low_soc_events(this_scen=this_scen, this_sched=this_sched, + not_possible_stations=not_possible_stations, rel_soc=relative_soc) if not not_possible_stations: not_possible_stations = set() stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} electrified_station_set_all = set(stats) must_stations = set() - for s in electrified_station_set_all: + for station in electrified_station_set_all: print(".", end="") - electrified_station_set = electrified_station_set_all.difference([s]) + electrified_station_set = electrified_station_set_all.difference([station]) vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), this_scen.vehicle_socs, this_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=args.desired_soc_deps) + soc_upper_thresh=ARGS.desired_soc_deps) for rot in this_sched.rotations: - soc, a, b = get_rotation_soc(rot, this_sched, this_scen, vehicle_socs) - if np.min(soc[a:b]) < soc_lower_thresh: - must_stations.add(s) + soc, start, end = get_rotation_soc(rot, this_sched, this_scen, vehicle_socs) + if np.min(soc[start:end]) < soc_lower_thresh: + must_stations.add(station) break return must_stations From e996414c9aa90481ad1fa019b35196316cc3f4cc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 19 Dec 2022 11:20:32 +0100 Subject: [PATCH 408/802] Refractoring start with optimizer object --- data/examples/optimizer.cfg | 2 +- ebus_toolbox/optimizer.py | 201 +++++++++++++++++------------ ebus_toolbox/schedule_optimizer.py | 15 +++ 3 files changed, 137 insertions(+), 81 deletions(-) create mode 100644 ebus_toolbox/schedule_optimizer.py diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 18b67cc7..324188c5 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -38,7 +38,7 @@ charge_eff = 0.95 output_path=data/private_examples/332_Buffered/optimization # "quick" or "spiceev" solver = quick -rebase_scenario = False +rebase_scenario = True pickle_rebased= False pickle_rebased_name=buffered_rebase_all_electrified run_only_neg=False diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index f6cc0fa3..1dd997c5 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -17,9 +17,11 @@ import matplotlib import matplotlib.pyplot as plt import report +from ebus_toolbox.schedule_optimizer import ScheduleOptimizer from src import scenario import schedule import rotation +from optimizer_config import read_config, OptimizerConfig from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip from ebus_toolbox.costs import calculate_costs @@ -32,7 +34,17 @@ def time_it(function, timers={}): """decorator function to time the duration function calls - take and count how often they happen""" + take and count how often they happen + :param function: function do be decorated + :type function: function + :param timers: storage for cumlulated time and call number + :type timers: dict + :return decorated function or timer if given function is None + :rtype function or dict + + + """ + if function: def decorated_function(*this_args, **kwargs): key = function.__name__ @@ -51,7 +63,6 @@ def decorated_function(*this_args, **kwargs): sorted_timer = dict(sorted(timers.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) return sorted_timer - def setup_logger(): """ setup file and stream logging by config and args arguments :return: logger @@ -124,7 +135,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): :param this_args: Simulation arguments for manipulation or generated outputs :type this_args: object - :return: (Schedule,Scenario) optimizied schedule and Scenario + :return: (Schedule,Scenario) optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ global CONFIG @@ -153,9 +164,11 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # needed. del ARGS.save_timeseries del ARGS.save_results - if ARGS.desired_soc_deps != 1: + if ARGS.desired_soc_deps != 1 and CONFIG.opt_type=="quick": LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") + optimizer=ScheduleOptimizer (sched, scen, ARGS, CONFIG, LOGGER) + # which rotations should be excluded? excl_rots = CONFIG.exclusion_rots @@ -222,10 +235,9 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): remove_none_socs(scen) if CONFIG.check_for_must_stations: - must_stations = get_must_stations(scen, sched, ARGS.desired_soc_opps, - soc_charge_curve_dict, + must_stations = get_must_stations(scen, sched, soc_charge_curve_dict, not_possible_stations=not_possible_stations, - soc_lower_thresh=CONFIG.min_soc, relative_soc=False) + relative_soc=False) LOGGER.warning("%s must stations %s", len(must_stations), must_stations) not_possible_stations = not_possible_stations.union(must_stations) for stat in must_stations: @@ -286,7 +298,22 @@ def optimization_loop(electrified_stations, electrified_station_set, new_scen, n node_choice="step-by-step", **kwargs): """Loops over every base group with the core of group optimization and handles deep or - greedy arguments""" + greedy arguments + :param + :type + :param + :type + :param + :type + :param + :type + :param + :type + :param + :type + :return + :rtype""" + # Base stations for optimization, so inclusion of stations can be skipped base_stations = electrified_stations.copy() base_electrified_station_set = electrified_station_set.copy() @@ -458,7 +485,6 @@ def group_optimization(group, base_scen, base_sched, electrified_stations, elect could_not_be_electrified, not_possible_stations, choose_station_function, soc_curve_dict, pre_optimized_set=None, decision_tree=None, tree_position=None, **kwargs): - """ Optimize a single group events :return (electrified_stations if optimization continues, None if no further recursive calls should happen, bool if further deep analysis should take place) @@ -476,6 +502,8 @@ def group_optimization(group, base_scen, base_sched, electrified_stations, elect base_socs = kwargs.get("base_socs") else: base_socs = dict(base_scen.vehicle_socs.items()) + kwargs["base_socs"] = base_socs + print(sum([sum(soc) for soc in base_scen.vehicle_socs.values()])) # give tree position LOGGER.debug("%s with length of %s", tree_position, len(tree_position)) @@ -510,7 +538,8 @@ def group_optimization(group, base_scen, base_sched, electrified_stations, elect stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} if best_station_ids is None: LOGGER.warning("No useful station found with %s rotations not electrified yet. " - "Stopped after electrifying %s", events_remaining, len(electrified_station_set)) + "Stopped after electrifying %s", events_remaining, + len(electrified_station_set)) if pre_optimized_set is None: could_not_be_electrified.update(list(rotation_dict.keys())) @@ -550,7 +579,7 @@ def group_optimization(group, base_scen, base_sched, electrified_stations, elect event_rotations_ids = {event["rotation"].id for event in event_group} new_events = get_low_soc_events(new_scen, new_sched, rotations=event_rotations_ids, - not_possible_stations=not_possible_stations, rel_soc=True , + not_possible_stations=not_possible_stations, rel_soc=True, **kwargs) delta_energy = get_missing_energy(new_events) @@ -586,9 +615,8 @@ def group_optimization(group, base_scen, base_sched, electrified_stations, elect not_possible_stations, choose_station_function, soc_curve_dict, pre_optimized_set, decision_tree, - events_remaining=events_remaining, - tree_position=this_tree, solver=solver, - base_socs=base_socs, **kwargs) + tree_position=this_tree, + **kwargs) if new_stations is not None: electrified_stations.update(new_stations) @@ -661,7 +689,7 @@ def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): @time_it -def preprocessing_scenario(this_sched, this_scen, this_args,inclusion_stations=None, +def preprocessing_scenario(this_sched, this_scen, this_args, inclusion_stations=None, electrified_stations=None, electrified_station_set=None, exclusion_rots=None, run_only_neg=False, cost_calc=False): """ Prepare scenario and run schedule @@ -747,6 +775,7 @@ def plot_rot(rot_id, this_sched, this_scen, ax=None, rot_only=True): def join_all_subsets(subsets): + """ join sets for as long as needed until no elements share any intersections""" joined_subset = True while joined_subset: joined_subset, subsets = join_subsets(subsets) @@ -755,30 +784,40 @@ def join_all_subsets(subsets): @time_it def choose_station_brute(station_eval, electrified_station_set, - pre_optimized_set=None, decision_tree=None, missing_energy=0): + pre_optimized_set=None, decision_tree=None, missing_energy=0, gens=dict()): + """ Gives back a possible set of Stations to electrify which shows potential and hasnt been + tried yet. The set of stations is smaller than the best optimized set so far.""" + station_ids = [x[0] for x in station_eval] - a = combination_generator(station_ids, len(pre_optimized_set) - 1) + try: + generator = gens[str(station_ids) + str(len(pre_optimized_set) - 1)] + except KeyError: + generator = combination_generator(station_ids, len(pre_optimized_set) - 1) + gens[str(station_ids) + str(len(pre_optimized_set) - 1)] = generator station_eval_dict = {stat[0]: stat[1] for stat in station_eval} - for comb in a: + for comb in generator: node_name = stations_hash(comb) if node_name not in decision_tree: - # Only check the brute force station if they have the remote chance of fullfilling + # only check the brute force station if they have the remote chance of fulfilling # the missing energy - # Potential>missing energy * 80% + # potential>missing energy * 80% potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) if potential > -missing_energy * CONFIG.estimation_threshold: return comb, False else: LOGGER.debug("skipped %s since potential is too low %s %%", comb, round(potential / -missing_energy * 100, 0)) - else: - LOGGER.debug("calculated all viable possibilities") - return None, False + LOGGER.debug("calculated all viable possibilities") + return None, False @time_it def is_branch_promising(station_eval, electrified_station_set, pre_optimized_set, missing_energy): + """ quickly evaluates if following a branch is promising by summing up estimated potentials + :return is the branch promising + :rtype bool""" + delta = len(pre_optimized_set) - len(electrified_station_set) pot = 0 for i in range(0, min(delta, len(station_eval))): @@ -793,6 +832,9 @@ def is_branch_promising(station_eval, electrified_station_set, @time_it def choose_station_step_by_step(station_eval, electrified_station_set, pre_optimized_set=None, decision_tree=None, missing_energy=0): + """ Gives back a station of possible stations to electrify which shows the biggest potential + and hasnt been picked before.""" + # Filter functions to stop simulating cases which have no hope of being optimal. # If in optimization mode, optimization can break if station amount is superseded # This filter is done better by the next @@ -837,12 +879,18 @@ def choose_station_step_by_step(station_eval, electrified_station_set, @time_it def stations_hash(stations_set): + """ Create a simple str as hash for a set of stations""" return str(sorted(list(stations_set))) @time_it def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, soc_charge_curve_dict, soc_upper_thresh=1): + """ A quick estimation of socs by mutating the soc data accordingly + :return soc dict + :rtype dict() + """ + ele_stations = {*ele_station_set, station} soc_dict = copy(soc_dict) @@ -893,9 +941,9 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, @time_it def evaluate(events, eval_scen, soc_curve_dict, electrified_station_set=None, decision_tree=None, **kwargs): - # Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an - # event is raised up to a minimal soc (probably zero). The supplied energy is approximated by - # loading power, standing time at a station, soc at station, minimal soc of the event + """Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an + event is raised up to a minimal soc (probably zero). The supplied energy is approximated by + loading power, standing time at a station, soc at station, minimal soc of the event""" soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", ARGS.desired_soc_deps) @@ -903,36 +951,36 @@ def evaluate(events, eval_scen, soc_curve_dict, if not electrified_station_set: electrified_station_set = set() - station_eval = dict() - for e in events: - soc_over_time = soc_curve_dict[e["v_type"]][e["ch_type"]] - for i, trip in enumerate(e["trip"]): + station_eval = {} + for event in events: + soc_over_time = soc_curve_dict[event["v_type"]][event["ch_type"]] + for i, trip in enumerate(event["trip"]): # Station is only evaluated if station name is part of event stations # Only these stations showed potential in electrification, e.g enough standing time - if trip.arrival_name not in e["stations"]: + if trip.arrival_name not in event["stations"]: continue idx = get_index_by_time(trip.arrival_time, eval_scen) - soc = eval_scen.vehicle_socs[e["vehicle_id"]][idx] + soc = eval_scen.vehicle_socs[event["vehicle_id"]][idx] max_soc = soc_upper_thresh min_soc = soc_lower_thresh # Potential is the minimal amount of delta_soc_pot = min(max_soc - soc, - min_soc - e["min_soc"], - soc - e["min_soc"], + min_soc - event["min_soc"], + soc - event["min_soc"], max_soc - min_soc) try: - standing_time_min = get_charging_time(trip, e["trip"][i + 1], ARGS) + standing_time_min = get_charging_time(trip, event["trip"][i + 1], ARGS) except IndexError: standing_time_min = 0 # energy_charging_potential = standing_time_min *60 * ch_power - e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min) * e["capacity"] + e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min) * event["capacity"] # Potential is at max the minimum between the useful delta soc * capacity or the # energy provided by charging for the full standing time - delta_E_pot = min(delta_soc_pot * e["capacity"], e_charging_pot) + delta_E_pot = min(delta_soc_pot * event["capacity"], e_charging_pot) d = dict(E_pot=delta_E_pot, standing_time=timedelta(minutes=standing_time_min)) try: @@ -951,12 +999,12 @@ def evaluate(events, eval_scen, soc_curve_dict, # decision_tree[str(electrified_station_set)]["children"].append(check_stations) continue - sum = 0 + sum_pot = 0 standing_time = timedelta(minutes=0) for pot in stat_dict["pot_list"]: - sum += pot["E_pot"] + sum_pot += pot["E_pot"] standing_time += pot["standing_time"] - stat_dict["pot_sum"] = sum + stat_dict["pot_sum"] = sum_pot # time_list.append(standing_time / timedelta(minutes=1)) # Sort by pot_sum station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1]["pot_sum"])).items()) @@ -1033,11 +1081,9 @@ def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): @time_it -def get_low_soc_events(this_scen: scenario.Scenario,this_sched: schedule.Schedule, +def get_low_soc_events(this_scen: scenario.Scenario, this_sched: schedule.Schedule, rotations=None, filter_standing_time=True, not_possible_stations=None, rel_soc=False, soc_data=None, **kwargs): - - if not not_possible_stations: not_possible_stations = set() @@ -1047,7 +1093,6 @@ def get_low_soc_events(this_scen: scenario.Scenario,this_sched: schedule.Schedul soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", ARGS.desired_soc_deps) - # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to @@ -1124,10 +1169,6 @@ def get_low_soc_events(this_scen: scenario.Scenario,this_sched: schedule.Schedul events.append(event) copy_list = reduced_list.copy() reduced_list = reduced_list[:start_comb] - - # event_df = pd.DataFrame(soc[start:min_idx]) - # soc_df = pd.DataFrame(soc) - if end_comb + 1 <= len(copy_list): reduced_list.extend(copy_list[end_comb + 1:]) if len(reduced_list) > 0: @@ -1139,19 +1180,13 @@ def get_low_soc_events(this_scen: scenario.Scenario,this_sched: schedule.Schedul @time_it def preprocess_schedule(this_sched, this_args, electrified_stations=None): + Trip.consumption = Consumption(this_sched.vehicle_types, outside_temperatures=ARGS.outside_temperature_over_day_path, level_of_loading_over_day=ARGS.level_of_loading_over_day_path) + this_sched.stations = electrified_stations - # filter trips according to args this_sched.calculate_consumption() - # this_sched.set_charging_type(this_args.preferred_charging_type) - # - # # (re)calculate the change in SoC for every trip - # # charging types may have changed which may impact battery capacity - # # while mileage is assumed to stay constant - # this_sched.delta_soc_all_trips() - # each rotation is assigned a vehicle ID this_sched.assign_vehicles() return this_sched, this_sched.generate_scenario(this_args) @@ -1159,21 +1194,18 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): @time_it def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): + """Run a given schedule and electrify stations if need be""" this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations - this_sched2.assign_vehicles() - this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, electrified_stations=electrified_stations) - # Dont print output from spice ev to reduce clutter sys.stdout = open(os.devnull, 'w') + with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) - new_scen.run('distributed', vars(this_args).copy()) sys.stdout = sys.__stdout__ - if ARGS.cost_calculation and cost_calc: # cost calculation following directly after simulation try: @@ -1188,9 +1220,9 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal @time_it def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_grid=float('inf'), - timestep=0.1, efficiency=1): - # Charging curve as nested list of SOC, Power[kW] and capacity in [kWh] - # Simple numeric creation of power over time --> to energy over time + time_step=0.1, efficiency=1): + """create charging curve as nested list of SOC, Power[kW] and capacity in [kWh]""" + # simple numeric creation of power over time --> to energy over time normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) soc = 0 time = 0 @@ -1201,12 +1233,12 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr socs.append(soc) power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), max_charge_from_grid / capacity) - soc2 = soc + timestep / 60 * power1 + soc2 = soc + time_step / 60 * power1 power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), max_charge_from_grid / capacity) power = (power1 + power2) / 2 * efficiency - soc += timestep / 60 * power - time += timestep + soc += time_step / 60 * power + time += time_step # Fill the soc completely in last timestep times.append(time) socs.append(ARGS.desired_soc_opps) @@ -1215,34 +1247,36 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr @time_it def get_delta_soc(soc_over_time_curve, soc, time_delta): - # Returns expected soc lift for a given start_soc and time_delta. - # Units for time_delta and time_curve are assumed to be the same, e.g. minutes - # First element which is bigger than current soc + """ get expected soc lift for a given start_soc and time_delta.""" + # units for time_delta and time_curve are assumed to be the same, e.g. minutes + # first element which is bigger than current soc if time_delta == 0: return 0 soc = max(min(ARGS.desired_soc_opps, soc), 0) first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] second_time = first_time + time_delta - # Catch out of bounds if time of charging end is bigger than table values + # catch out of bounds if time of charging end is bigger than table values if second_time >= soc_over_time_curve[-1, 0]: end_soc = soc_over_time_curve[-1, 1] else: end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] - # Make sure to limit delta soc to 1 if negative socs are given. They are possible during + # make sure to limit delta soc to 1 if negative socs are given. They are possible during # the optimization process but will be continuously raised until they are >0. return min(ARGS.desired_soc_opps, end_soc - start_soc) @time_it def electrify_station(stat, stations, electrified_set): + """electrify a station and keep track of it in the electrified set file""" stations[stat] = CONFIG.standard_opp_station electrified_set.add(stat) @time_it def get_buffer_time(trip): + """ Return the buffer time as timedelta object""" return timedelta(minutes=get_buffer_time_spice_ev(trip, ARGS.default_buffer_time_opps)) @@ -1270,7 +1304,7 @@ def remove_none_socs(this_scen): :param this_scen: scenario from which the None socs should be removed :type this_scen: scenario.Scenario() """ - # Make sure no None values exists in SOCs. Fill later values with last value + # make sure no None values exists in SOCs. Fill later values with last value # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] for v_id, soc in this_scen.vehicle_socs.items(): soc = np.array(soc) @@ -1302,6 +1336,7 @@ def station_eval_to_logger(missing_energy, station_eval): @time_it def toolbox_from_pickle(sched_name, scen_name, args_name): + """ Load the 3 files from pickle""" with open(args_name, "rb") as f: this_args = pickle.load(f) with open(scen_name, "rb") as f: @@ -1313,6 +1348,7 @@ def toolbox_from_pickle(sched_name, scen_name, args_name): @time_it def toolbox_to_pickle(name, sched, scen, this_args): + """ Dump the 3 files to pickle files""" args_name = "args_" + name + ".pickle" with open(args_name, "wb") as f: pickle.dump(this_args, f) @@ -1329,6 +1365,8 @@ def toolbox_to_pickle(name, sched, scen, this_args): def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, not_possible_stations=None, rel_soc=False): + """Get the rotation ids for the rotations which show negative socs, even when everything + is electrified""" if not not_possible_stations: not_possible_stations = set() @@ -1342,12 +1380,12 @@ def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thre this_scen.vehicle_socs, this_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=ARGS.desired_soc_deps) - new_events = get_low_soc_events(this_scen,this_sched, soc_data=vehicle_socs) - return [e["roation"].id for e in new_events] + new_events = get_low_soc_events(this_scen, this_sched, soc_data=vehicle_socs) + return [e["rotation"].id for e in new_events] def create_charging_curves(this_sched): - """ Cycle through vehicles and create numerically created charging curves with energy supplied + """Cycle through vehicles and create numerically created charging curves with energy supplied over time""" soc_charge_curve_dict = dict() for v_type_name in this_sched.vehicle_types: @@ -1357,19 +1395,21 @@ def create_charging_curves(this_sched): soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( data["charging_curve"], data["capacity"], this_sched.cs_power_opps, efficiency=CONFIG.charge_eff, - timestep=0.1) + time_step=0.1) return soc_charge_curve_dict - @time_it -def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_dict, +def get_must_stations(this_scen, this_sched, soc_charge_curve_dict, not_possible_stations=None, - soc_lower_thresh=0, relative_soc=False): + relative_soc=False, **kwargs): """Electrify everything minus 1 station. If without the stations there are below zero events it is a must have station""" + + soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) events = get_low_soc_events(this_scen=this_scen, this_sched=this_sched, not_possible_stations=not_possible_stations, rel_soc=relative_soc) + if not not_possible_stations: not_possible_stations = set() stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} @@ -1388,6 +1428,7 @@ def get_must_stations(this_scen, this_sched, soc_upper_thresh, soc_charge_curve_ for rot in this_sched.rotations: soc, start, end = get_rotation_soc(rot, this_sched, this_scen, vehicle_socs) if np.min(soc[start:end]) < soc_lower_thresh: + LOGGER.debug("%s , with min soc: %s", station, np.min(soc[start:end])) must_stations.add(station) break diff --git a/ebus_toolbox/schedule_optimizer.py b/ebus_toolbox/schedule_optimizer.py new file mode 100644 index 00000000..6ba2b492 --- /dev/null +++ b/ebus_toolbox/schedule_optimizer.py @@ -0,0 +1,15 @@ +import schedule +from src import scenario +from optimizer_config import read_config, OptimizerConfig + +class ScheduleOptimizer: + def __init__(self, sched:schedule.Schedule(), scen:scenario.Scenario(), args, + config:OptimizerConfig(), **kwargs): + self.schedule = sched + self.scenario = scen + self.args = args + self.config = config + self.logger = kwargs.get("logger", None) + + if config.reduce_rots: + self.sched.rotations = {rot: sched.rotations[rot] for rot in config.rots} From 5eb2378c0dbe81385f27cb9539f4285570a7257d Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Tue, 20 Dec 2022 09:50:59 +0100 Subject: [PATCH 409/802] adjusted comments --- ebus_toolbox/costs.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 7ab5b50c..1116b0a2 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -43,7 +43,7 @@ def calculate_costs(c_params, scenario, schedule, args): c_vehicles_vt = (schedule.vehicle_type_counts[v_type] * (costs_vehicle + (c_params["vehicles"][v_type]["lifetime"] // c_params["batteries"]["lifetime_battery"]) * - v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"])) + v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"])) costs["c_vehicles"] += c_vehicles_vt # calculate annual cost of vehicles of this type, depending on their lifetime costs["c_vehicles_annual"] += c_vehicles_vt / c_params["vehicles"][v_type]["lifetime"] @@ -71,17 +71,17 @@ def calculate_costs(c_params, scenario, schedule, args): # CHARGING INFRASTRUCTURE cs = schedule.scenario["constants"]["charging_stations"] - # depot charging stations + # depot charging stations - each charging bus generates one CS for csID in cs.values(): if csID["type"] == "deps": costs["c_cs"] += c_params["cs"]["capex_deps_per_kW"] * csID["max_power"] - # opportunity charging stations + # opportunity charging stations - nr of CS depend on max nr of simultaneously occupied CS for gcID, gc_keys in gcs.items(): - # get max. power of opps grid connector - gc = getattr(scenario, f"{gcID}_timeseries") if schedule.stations[gcID]["type"] == "opps": - costs["c_cs"] += c_params["cs"]["capex_opps_per_kW"] * vars(args)["cs_power_opps"] \ - * max(gc["# occupied CS"]) + # get max. nr of occupied CS per grid connector + gc = getattr(scenario, f"{gcID}_timeseries") + costs["c_cs"] += (c_params["cs"]["capex_opps_per_kW"] * vars(args)["cs_power_opps"] * + max(gc["# occupied CS"])) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] From 1e0c2a69462d4b0447413d02bf4be6e33517b118 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Tue, 20 Dec 2022 09:59:51 +0100 Subject: [PATCH 410/802] deleted unwanted files --- .gitmodules | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index bdebebcb..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "data/private_examples/332_Buffered"] - path = data/private_examples/332_Buffered - url = http://192.168.11.220:82/JulianB/332_Buffered.git From 779341a95a8fb81e4f5fc06ddf9f4d67f6b2946f Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Tue, 20 Dec 2022 10:50:15 +0100 Subject: [PATCH 411/802] adjusted example cfg --- data/examples/ebus_toolbox.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index d86c4d3d..7109235c 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -37,12 +37,12 @@ pv_power = 0 # set random seed (for always random: set seed = null) seed = 1 -# Specify what you want to do. Options: sim, neg_depb_to_oppb, service_optimization. Default: sim +# Options: sim, neg_depb_to_oppb, neg_oppb_to_depb, service_optimization. Default: sim # sim runs a single simulation with the given inputs. # neg_depb_to_oppb changes negative depb-rotations to oppb charging. # neg_oppb_to_depb changes negative oppb-rotations to depb charging. # service optimization finds the largest set of electrified rotations. -#mode = sim +mode = sim # set length of timestep in minutes (default: 15 minute intervals) interval = 1 From 502f13d259618569f8444409e724621f374309e0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 20 Dec 2022 11:20:53 +0100 Subject: [PATCH 412/802] Refactoring with optimizer and event class --- ebus_toolbox/low_soc_events.py | 219 ++++++++ ebus_toolbox/optimizer.py | 791 +---------------------------- ebus_toolbox/schedule_optimizer.py | 662 +++++++++++++++++++++++- 3 files changed, 898 insertions(+), 774 deletions(-) create mode 100644 ebus_toolbox/low_soc_events.py diff --git a/ebus_toolbox/low_soc_events.py b/ebus_toolbox/low_soc_events.py new file mode 100644 index 00000000..54dc3b66 --- /dev/null +++ b/ebus_toolbox/low_soc_events.py @@ -0,0 +1,219 @@ +import typing +from datetime import timedelta + +from ebus_toolbox.util import uncomment_json_file, get_buffer_time as get_buffer_time_spice_ev + +from ebus_toolbox.schedule_optimizer import ScheduleOptimizer + + +class LowSocEvent: + def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rotation, + stations_list, + capacity, v_type, ch_type): + self.start_idx = start_idx + self.end_idx = end_idx + self.min_soc = min_soc + self.stations = stations + self.vehicle_id = vehicle_id + self.trip = trip + self.rotation = rotation + self.stations_list = stations_list + self.capacity = capacity + self.v_type = v_type + self.ch_type = ch_type + + +def get_low_soc_events(optimizer: ScheduleOptimizer, rotations=None, filter_standing_time=True, + rel_soc=False, soc_data=None, **kwargs): + if not rotations: + rotations = optimizer.schedule.rotations + + soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) + soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) + + # Create list of events which describe trips which end in a soc below zero + # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 + # Properties before and after these points have no effect on the event itself, similar to + # an event horizon + events = [] + count_electrified_rot = 0 + + for rot_id in rotations: + rot = optimizer.schedule.rotations[rot_id] + soc, rot_start_idx, rot_end_idx = optimizer.get_rotation_soc(rot_id, soc_data) + idx = range(0, len(soc)) + comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] + min_soc, min_idx = min(comb, key=lambda x: x[0]) + reduced_list = comb.copy() + soc_lower_thresh_cur = soc_lower_thresh + # if rotation gets a start soc below 1 this should change below 0 soc events since fixing + # the rotation before would lead to fixing this rotation + + # if using relative SOC, SOC lookup has to be adjusted + if rel_soc: + start_soc = comb[0][0] + soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( + soc_upper_thresh - soc_lower_thresh) + soc_upper_thresh = soc_lower_thresh_cur + soc_upper_thresh + if min_soc >= soc_lower_thresh_cur: + count_electrified_rot += 1 + while min_soc < soc_lower_thresh_cur: + i = min_idx + idx = [x[1] for x in reduced_list] + while soc[i] < soc_upper_thresh: + if i == rot_start_idx: + break + i -= 1 + start_comb = idx.index(i) + start = i + i = min_idx + while soc[i] < soc_upper_thresh: + if i >= rot_end_idx - 1: + break + i += 1 + end_comb = idx.index(i) + trips = optimizer.get_trips(rot=rot, start_idx=start, end_idx=min_idx) + possible_stations = set() + possible_stations_list = [] + if not filter_standing_time: + possible_stations = {t.arrival_name for t in trips} + possible_stations_list = [t.arrival_name for t in trips] + else: + for ii, trip in enumerate(trips): + try: + standing_time_min = get_charging_time(trip, trips[ii + 1], optimizer.args) + except IndexError: + standing_time_min = 0 + if standing_time_min > 0: + possible_stations.add(trip.arrival_name) + possible_stations_list.append(trip.arrival_name) + + possible_stations = possible_stations.difference(optimizer.not_possible_stations) + cht = rot.vehicle_id.find("depb") + ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" + v_type = rot.vehicle_id.split("_" + ch_type)[0] + event = LowSocEvent(start_idx=start, end_idx=min_idx, + min_soc=min_soc, stations=possible_stations, + vehicle_id=rot.vehicle_id, trip=trips, + rotation=rot, stations_list=possible_stations_list, + capacity=optimizer.schedule.vehicle_types[v_type][ch_type][ + 'capacity'], + v_type=v_type, ch_type=ch_type) + + events.append(event) + copy_list = reduced_list.copy() + reduced_list = reduced_list[:start_comb] + if end_comb + 1 <= len(copy_list): + reduced_list.extend(copy_list[end_comb + 1:]) + if len(reduced_list) > 0: + min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) + else: + break + return events + + +def get_charging_time(trip1, trip2, args): + standing_time_min = (trip2.departure_time - trip1.arrival_time) \ + / timedelta(minutes=1) + buffer_time = (get_buffer_time(trip1, args.default_buffer_time_opps) / timedelta(minutes=1)) + standing_time_min -= buffer_time + + if args.min_charging_time > standing_time_min: + return 0 + return max(0, standing_time_min) + + +def get_buffer_time(trip, default_buffer_time_opps): + """ Return the buffer time as timedelta object""" + return timedelta(minutes=get_buffer_time_spice_ev(trip, default_buffer_time_opps)) + + +def get_index_by_time(scenario, search_time): + start_time = scenario.start_time + delta_time = timedelta(minutes=60 / scenario.stepsPerHour) + idx = (search_time - start_time) // delta_time + return idx + + +def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer:ScheduleOptimizer): + """ get expected soc lift for a given start_soc and time_delta.""" + # units for time_delta and time_curve are assumed to be the same, e.g. minutes + # first element which is bigger than current soc + if time_delta == 0: + return 0 + soc = max(min(optimizer.args.desired_soc_opps, soc), 0) + first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] + second_time = first_time + time_delta + # catch out of bounds if time of charging end is bigger than table values + + if second_time >= soc_over_time_curve[-1, 0]: + end_soc = soc_over_time_curve[-1, 1] + else: + end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] + + # make sure to limit delta soc to 1 if negative socs are given. They are possible during + # the optimization process but will be continuously raised until they are >0. + return min(optimizer.args.desired_soc_opps, end_soc - start_soc) + + +def evaluate(events: typing.Iterable[LowSocEvent], optimizer: ScheduleOptimizer, **kwargs): + """Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an + event is raised up to a minimal soc (probably zero). The supplied energy is approximated by + loading power, standing time at a station, soc at station, minimal soc of the event""" + + soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) + soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) + + # electrified_station_set = kwargs.get("electrified_station_set", set()) + + station_eval = {} + for event in events: + soc_over_time = optimizer.soc_charge_curve_dict[event.v_type][event.ch_type] + for i, trip in enumerate(event.trip): + # Station is only evaluated if station name is part of event stations + # Only these stations showed potential in electrification, e.g enough standing time + if trip.arrival_name not in event["stations"]: + continue + idx = get_index_by_time(optimizer.scenario, trip.arrival_time, ) + soc = optimizer.scenario.vehicle_socs[event.vehicle_id][idx] + + # Potential is the minimal amount of + delta_soc_pot = min(soc_upper_thresh - soc, + soc_lower_thresh - event.min_soc, + soc - event.min_soc, + soc_upper_thresh - soc_lower_thresh) + + try: + standing_time_min = get_charging_time(trip, event.trip[i + 1], optimizer.args) + except IndexError: + standing_time_min = 0 + + # energy_charging_potential = standing_time_min *60 * ch_power + e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min, optimizer)\ + * event.capacity + + # Potential is at max the minimum between the useful delta soc * capacity or the + # energy provided by charging for the full standing time + delta_e_pot = min(delta_soc_pot * event.capacity, e_charging_pot) + try: + station_eval[trip.arrival_name] += delta_e_pot + except KeyError: + station_eval[trip.arrival_name] + station_eval[trip.arrival_name] = delta_e_pot + + # ToDo can get true potential from decision tree but is it necessary? + # # time_list = [] + # for station_name, stat_dict in station_eval.items(): + # if decision_tree is not None: + # check_stations = electrified_station_set.union(station_name) + # if check_stations in decision_tree.keys(): + # stat_dict["pot_sum"] = decision_tree[str(check_stations)]["missing_energy"] - \ + # decision_tree[str(electrified_station_set)]["missing_energy"] + # # decision_tree[str(electrified_station_set)]["children"].append(check_stations) + # continue + + # time_list.append(standing_time / timedelta(minutes=1)) + # Sort by pot_sum + station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1])).items()) + station_eval.reverse() + return station_eval diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/optimizer.py index 1dd997c5..a91387b5 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/optimizer.py @@ -44,7 +44,6 @@ def time_it(function, timers={}): """ - if function: def decorated_function(*this_args, **kwargs): key = function.__name__ @@ -167,92 +166,39 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): if ARGS.desired_soc_deps != 1 and CONFIG.opt_type=="quick": LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") - optimizer=ScheduleOptimizer (sched, scen, ARGS, CONFIG, LOGGER) - - # which rotations should be excluded? - excl_rots = CONFIG.exclusion_rots - - # which stations has to be electrified - incl_stats = CONFIG.inclusion_stations - - # which station can not be electrified - excl_stats = CONFIG.exclusion_stations - - # if given, reduce the rotations to the rotations given in the config file - if CONFIG.reduce_rots: - sched.rotations = {rot: sched.rotations[rot] for rot in CONFIG.rots} + optimizer = ScheduleOptimizer(sched, scen, ARGS, CONFIG, LOGGER) remove_impossible_rots = CONFIG.remove_impossible_rots # set battery and charging curves through config file if wished for - for v_type in sched.vehicle_types.values(): - for vehicle in v_type.values(): - if CONFIG.battery_capacity is not None: - vehicle["capacity"] = CONFIG.battery_capacity - if CONFIG.charging_curve is not None: - vehicle["charging_curve"] = CONFIG.charging_curve + optimizer.set_battery_and_charging_curves() # create a decision tree or load one from a previous run - if CONFIG.decision_tree_path is not None: - with open(CONFIG.decision_tree_path, "rb") as file: - decision_tree = pickle.load(file) - else: - decision_tree = {} + optimizer.set_up_decision_tree() - # stations which are included can not be included again. Therefore they get into - # the set of not possible stations - not_possible_stations = incl_stats.union(excl_stats) - - # if stations have to be included they are stored in this set - must_include_set = set() # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations if CONFIG.rebase_scenario: - LOGGER.debug("Spice EV Rebasing Scenario") - sched, scen, must_include_set, ele_stations = preprocessing_scenario( - sched, scen, ARGS, - incl_stats, - exclusion_rots=excl_rots, run_only_neg=CONFIG.run_only_neg) - LOGGER.debug("Rebasing finished") - print_time() - if CONFIG.pickle_rebased: - toolbox_to_pickle(CONFIG.pickle_rebased_name, sched, scen, ARGS) - LOGGER.debug("Rebased scenario pickled as %s", CONFIG.pickle_rebased_name) + must_include_set, ele_stations = optimizer.rebase_spice_ev() else: - with open(ARGS.electrified_stations, "r", encoding="utf-8", ) as file: - ele_stations = json.load(file) - # Electrify inclusion stations - for stat in incl_stats: - electrify_station(stat, ele_stations, must_include_set) - sched.rotations = {r: sched.rotations[r] for r in sched.rotations if - r not in excl_rots} - + must_include_set, ele_stations = optimizer.rebase_simple() # create charging dicts which contain soc over time, which is numerically calculated - soc_charge_curve_dict = create_charging_curves(sched) + + soc_charge_curve_dict = optimizer.create_charging_curves(sched) # Remove none Values from socs in the vehicle_socs an - remove_none_socs(scen) + optimizer.remove_none_socs() if CONFIG.check_for_must_stations: - must_stations = get_must_stations(scen, sched, soc_charge_curve_dict, - not_possible_stations=not_possible_stations, - relative_soc=False) + must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) LOGGER.warning("%s must stations %s", len(must_stations), must_stations) - not_possible_stations = not_possible_stations.union(must_stations) - for stat in must_stations: - # dont put must stations in electrified set, but in extra set must_include_set - electrify_station(stat, ele_stations, must_include_set) - scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), - scen.vehicle_socs, - scen, must_stations, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps) LOGGER.debug("Starting greedy optimization") ele_station_set = set() print_time() - ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets = \ + ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets =\ + \ optimization_loop(ele_stations, ele_station_set, scen, sched, not_possible_stations, soc_upper_thresh=ARGS.desired_soc_opps, soc_lower_thresh=CONFIG.min_soc, @@ -265,7 +211,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): LOGGER.debug("Functions took these times in seconds") LOGGER.debug("%s Stations : %s", len(ele_station_set), ele_station_set) LOGGER.debug(could_not_be_electrified) - scen.vehicle_socs = timeseries_calc('best_station_ids[0]', sched.rotations.values(), + scen.vehicle_socs = timeseries_calc(sched.rotations.values(), scen.vehicle_socs, scen, ele_station_set, soc_charge_curve_dict=soc_charge_curve_dict, @@ -290,153 +236,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): return final_sched, final_scen -@time_it -def optimization_loop(electrified_stations, electrified_station_set, new_scen, new_sched, - not_possible_stations, soc_charge_curve_dict, soc_upper_thresh=1, - soc_lower_thresh=0, - decision_tree=None, opt_type="greedy", - node_choice="step-by-step", - **kwargs): - """Loops over every base group with the core of group optimization and handles deep or - greedy arguments - :param - :type - :param - :type - :param - :type - :param - :type - :param - :type - :param - :type - :return - :rtype""" - - # Base stations for optimization, so inclusion of stations can be skipped - base_stations = electrified_stations.copy() - base_electrified_station_set = electrified_station_set.copy() - - # Connect events with shared stations - ######## - could_not_be_electrified = set() - base_scen = copy(new_scen) - base_sched = copy(new_sched) - - # Get events where soc fell below 0. The events contain info about the problematic - # timespan, which includes stations which could provide a soc lift - base_events = get_low_soc_events(this_scen=base_scen, - this_sched=base_sched, - soc_upper_thresh=soc_upper_thresh, - not_possible_stations=not_possible_stations, rel_soc=False) - - # Check if the events can be divided into subgroups which are independent - # this makes optimization in smaller groups possible - groups = get_groups_from_events(base_events, not_possible_stations) - - # Baseline greedy Optimization - list_greedy_sets = [set()] * len(groups) - - # get_negative_rotations_all_electrified(base_scen, base_sched, soc_upper_thresh, soc_charge_curve_dict, - # not_possible_stations=not_possible_stations, - # rel_soc=False) - - new_scen.vehicle_socs = timeseries_calc('best_station_ids[0]', new_sched.rotations.values(), - new_scen.vehicle_socs, - new_scen, electrified_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps) - - # Base line is created simply by not having a decision tree and not a pre optimized_set yet - for group_nr, group in enumerate(groups[:]): - events, stations = group - linien = {lne for e in events for lne in e["rotation"].lines} - electrified_stations = base_stations.copy() - electrified_station_set = base_electrified_station_set.copy() - LOGGER.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, - len(groups)) - LOGGER.warning(linien) - LOGGER.warning("%s events", (len(events))) - if node_choice == "brute": - choice_func = choose_station_brute - else: - choice_func = choose_station_step_by_step - - # first run is always step by step - group_optimization(group, base_scen, base_sched, - electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations, - choose_station_step_by_step, soc_charge_curve_dict, - pre_optimized_set=None, - decision_tree=decision_tree, soc_lower_thresh=soc_lower_thresh, - soc_upper_thresh=soc_upper_thresh, - events_remaining=[len(events)], - **kwargs) - - LOGGER.warning("Greedy Result ++++++++ %s stations out of %s", len(electrified_station_set), - len(stations)) - LOGGER.warning(electrified_station_set) - - # if no deep analysis is needed, loop can continue can return here - if opt_type != "deep": - list_greedy_sets[group_nr] = electrified_station_set.copy() - LOGGER.debug("Optimized with %s stations out of %s", len(electrified_station_set), - len(stations)) - continue - - # From here on only for deep analysis - sols = [] - i = 0 - cont_loop = True - combinations = combs_unordered_no_putting_back(len(stations), - len(electrified_station_set)) - LOGGER.debug("There are %s combinations", combinations) - while i < CONFIG.max_brute_loop and cont_loop: - i += 1 - if i % 10 == 0: - print(len(decision_tree), " Knotenpunkte durchwandert") - print(f"Optimal solution has length {len(electrified_station_set)}") - # not_possible_stations = copy(not_possible_stations) - pre_optimized_set = copy(electrified_station_set) - could_not_be_electrified_copy = could_not_be_electrified.copy() - electrified_stations = base_stations.copy() - new_electrified_set = set() - new_stations, cont_loop = \ - group_optimization(group, base_scen, base_sched, - electrified_stations, new_electrified_set, - could_not_be_electrified_copy, - not_possible_stations, - choice_func, soc_charge_curve_dict, - pre_optimized_set=pre_optimized_set, - decision_tree=decision_tree, - events_remaining=[len(events)], - soc_upper_thresh=soc_upper_thresh, - soc_lower_thresh=soc_lower_thresh, **kwargs) - - # if a new set was found, print it and save it in sols - if new_electrified_set != pre_optimized_set and new_stations is not None: - LOGGER.warning("Optimized with %s stations %s %s", - len(new_electrified_set), str('#' * 20), - stations_hash(new_electrified_set)) - sols.append(new_electrified_set) - if len(new_electrified_set) < len(pre_optimized_set): - electrified_station_set = new_electrified_set - - LOGGER.debug("All solutions for this group: %s", sols) - list_greedy_sets[group_nr] = electrified_station_set.copy() - LOGGER.debug("Optimized with %s stations out of %s", len(electrified_station_set), - len(stations)) - - # Saving config file only in case of deep analysis - if CONFIG.save_decision_tree: - with open(ARGS.output_directory / Path("decision_tree.pickle"), "wb") as file: - pickle.dump(decision_tree, file) - for single_set in list_greedy_sets: - for stat in single_set: - electrify_station(stat, electrified_stations, electrified_station_set) - - return electrified_stations, electrified_station_set, could_not_be_electrified, list_greedy_sets + @time_it @@ -481,183 +281,9 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec @time_it -def group_optimization(group, base_scen, base_sched, electrified_stations, electrified_station_set, - could_not_be_electrified, not_possible_stations, choose_station_function, - soc_curve_dict, pre_optimized_set=None, decision_tree=None, - tree_position=None, **kwargs): - """ Optimize a single group events - :return (electrified_stations if optimization continues, None if no further recursive calls - should happen, bool if further deep analysis should take place) - :rtype (dict() or None, bool) - """ - - solver = kwargs.get("solver", "spiceev") - - if not tree_position: - tree_position = [] - # Base socs are the socs without electrification, they get passed through the stacks - # so the quick calculation can mutate them since quick calculation cant take place iteratively - if kwargs.get("base_socs"): - base_socs = kwargs.get("base_socs") - else: - base_socs = dict(base_scen.vehicle_socs.items()) - kwargs["base_socs"] = base_socs - print(sum([sum(soc) for soc in base_scen.vehicle_socs.values()])) - - # give tree position - LOGGER.debug("%s with length of %s", tree_position, len(tree_position)) - - # Unpack events and possible stations - event_group, possible_stations = group - - # Get the events which are still negative - events_remaining = kwargs.get("events_remaining", [99999]) - - # Copy Scen and sched - new_scen = copy(base_scen) - new_sched = copy(base_sched) - - # Get rotations from event dict and calculate the missing energy - rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} - missing_energy = get_missing_energy(event_group) - if missing_energy >= 0: - LOGGER.debug("Already electrified: Returning") - return electrified_stations, True - - station_eval = evaluate(event_group, new_scen, soc_curve_dict, - kwargs) - - # Debug.Log the missing energy and station evaluation - station_eval_to_logger(missing_energy, station_eval) - - # Get the best stations, brute or step_by_step - best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, - pre_optimized_set, decision_tree, - missing_energy=missing_energy) - stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} - if best_station_ids is None: - LOGGER.warning("No useful station found with %s rotations not electrified yet. " - "Stopped after electrifying %s", events_remaining, - len(electrified_station_set)) - - if pre_optimized_set is None: - could_not_be_electrified.update(list(rotation_dict.keys())) - return None, False - - # Remove electrified stations in this run - copied_set = electrified_station_set.copy() - for stat in copied_set: - electrified_stations.pop(stat) - electrified_station_set.remove(stat) - # Overwrite with preoptimized set - for stat in pre_optimized_set: - electrify_station(stat, electrified_stations, electrified_station_set) - return None, False - - LOGGER.debug("%s, with first pot of %s", best_station_ids, stat_eval_dict[best_station_ids[0]]) - - # Electrify station(s) - for stat_id in best_station_ids: - electrify_station(stat_id, electrified_stations, electrified_station_set) - - event_rotations = {x["rotation"] for x in event_group} - if solver == "quick": - # Quick calculation has to electrify everything in one step, - # or the lifting of socs is not correct - new_scen.vehicle_socs = deepcopy(base_socs) - new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, - new_scen.vehicle_socs, - new_scen, electrified_station_set, soc_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps) - else: - new_sched.rotations = rotation_dict - new_sched, new_scen = run_schedule(new_sched, ARGS, - electrified_stations=electrified_stations) - - not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) - event_rotations_ids = {event["rotation"].id for event in event_group} - new_events = get_low_soc_events(new_scen, - new_sched, rotations=event_rotations_ids, - not_possible_stations=not_possible_stations, rel_soc=True, - **kwargs) - - delta_energy = get_missing_energy(new_events) - - events_remaining[0] -= len(event_group) - len(new_events) - LOGGER.debug("Last electrification electrified %s/%s." - " %s remaining events in the base group.", - len(event_group) - len(new_events), len(event_group), events_remaining[0]) - delta_base_energy = delta_energy # get_missing_energy(base_events) - - # Put this node intro the decision tree including the missing energy - if decision_tree is not None: - decision_tree = node_to_tree(decision_tree, electrified_station_set, delta_base_energy) - - # Everything electrified - if delta_energy >= 0: - return electrified_stations, True - # Some choice functions might not need a recursive call, they return here. recursive is set - # by the choose_station_function - if not recursive: - return None, True - - # Check if the events can be divided into subgroups which are independent - groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) - - for k, this_group in enumerate(groups): - this_tree = tree_position.copy() - this_tree.append(k) - new_stations, _ = group_optimization(this_group, new_scen, new_sched, - electrified_stations, - electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, - soc_curve_dict, - pre_optimized_set, decision_tree, - tree_position=this_tree, - **kwargs) - - if new_stations is not None: - electrified_stations.update(new_stations) - else: - return None, True - - # If there is no pre optimized set function can return - if pre_optimized_set is None: - return electrified_stations, True - - # If there is a preoptimized set check if the preoptimized set leads to pruning - # i.e. if if following branch makes sense - if len(pre_optimized_set) - len(electrified_station_set) < 10: - new_scen.vehicle_socs = timeseries_calc(best_station_ids[0], event_rotations, - new_scen.vehicle_socs, - new_scen, electrified_station_set, - soc_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps) - - prune_events = get_low_soc_events(new_scen, new_sched, - rotations=event_rotations_ids, - not_possible_stations=not_possible_stations, - rel_soc=True, **kwargs) - - station_eval = evaluate(prune_events, new_scen, soc_curve_dict) - prune_missing_energy = get_missing_energy(prune_events) - if not is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, prune_missing_energy): - print("Branch pruned early") - is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, missing_energy) - return None, True -@time_it -def get_missing_energy(events): - """ Sum up all the missing energies of the given events""" - missing_energy = 0 - for event in events: - missing_energy += event["min_soc"] * event["capacity"] - return missing_energy def print_time(start=[]): @@ -689,45 +315,7 @@ def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): @time_it -def preprocessing_scenario(this_sched, this_scen, this_args, inclusion_stations=None, - electrified_stations=None, electrified_station_set=None, - exclusion_rots=None, run_only_neg=False, cost_calc=False): - """ Prepare scenario and run schedule - :return schedule, scenario, electrified_station_set, electrified_stations - :rtype (schedule.Schedule(), scenario.Scneario(), set(), dict()) - """ - - if not inclusion_stations: - inclusion_stations = set() - - if not electrified_station_set: - electrified_station_set = set() - - if not exclusion_rots: - exclusion_rots = set() - if electrified_stations is None: - with open(this_args.electrified_stations, "r", encoding="utf-8", ) as f: - electrified_stations = json.load(f) - - # Electrify inclusion stations - for stat in inclusion_stations: - electrify_station(stat, electrified_stations, electrified_station_set) - - # Calc new but only prev. negative rotations - if run_only_neg: - rots = this_sched.get_negative_rotations(this_scen) - rots = {r: this_sched.rotations[r] for r in rots if r not in exclusion_rots} - this_sched.rotations = rots - else: - rots = {r: this_sched.rotations[r] for r in this_sched.rotations if r not in exclusion_rots} - this_sched.rotations = rots - - new_sched, new_scen = run_schedule(this_sched, this_args, electrified_stations, - cost_calc=cost_calc) - report.generate(new_sched, new_scen, ARGS) - - return new_sched, new_scen, electrified_station_set, electrified_stations @time_it @@ -782,116 +370,18 @@ def join_all_subsets(subsets): return subsets -@time_it -def choose_station_brute(station_eval, electrified_station_set, - pre_optimized_set=None, decision_tree=None, missing_energy=0, gens=dict()): - """ Gives back a possible set of Stations to electrify which shows potential and hasnt been - tried yet. The set of stations is smaller than the best optimized set so far.""" - - station_ids = [x[0] for x in station_eval] - try: - generator = gens[str(station_ids) + str(len(pre_optimized_set) - 1)] - except KeyError: - generator = combination_generator(station_ids, len(pre_optimized_set) - 1) - gens[str(station_ids) + str(len(pre_optimized_set) - 1)] = generator - station_eval_dict = {stat[0]: stat[1] for stat in station_eval} - for comb in generator: - node_name = stations_hash(comb) - if node_name not in decision_tree: - # only check the brute force station if they have the remote chance of fulfilling - # the missing energy - # potential>missing energy * 80% - potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) - if potential > -missing_energy * CONFIG.estimation_threshold: - return comb, False - else: - LOGGER.debug("skipped %s since potential is too low %s %%", comb, - round(potential / -missing_energy * 100, 0)) - LOGGER.debug("calculated all viable possibilities") - return None, False - - -@time_it -def is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, missing_energy): - """ quickly evaluates if following a branch is promising by summing up estimated potentials - :return is the branch promising - :rtype bool""" - - delta = len(pre_optimized_set) - len(electrified_station_set) - pot = 0 - for i in range(0, min(delta, len(station_eval))): - pot += station_eval[i][1]["pot_sum"] - if pot < -missing_energy * CONFIG.estimation_threshold: - print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", - stations_hash(electrified_station_set)) - return False - return True @time_it -def choose_station_step_by_step(station_eval, electrified_station_set, - pre_optimized_set=None, decision_tree=None, missing_energy=0): - """ Gives back a station of possible stations to electrify which shows the biggest potential - and hasnt been picked before.""" - - # Filter functions to stop simulating cases which have no hope of being optimal. - # If in optimization mode, optimization can break if station amount is superseded - # This filter is done better by the next - # if pre_optimized_set is not None: - # if len(electrified_station_set)>len(pre_optimized_set): - # return pre_optimized_set - # Potentials have to be at least as promising as the pre-optimized case - if pre_optimized_set is not None: - if not is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, missing_energy): - # Best station id is none and dont go deeper in recursion - return None, False - - min_count_visited = float('inf') - for station in station_eval: - # Create a station combination from already electrified stations and possible new station - check_stations = electrified_station_set.union([station[0]]) - - if decision_tree is not None: - node_name = stations_hash(check_stations) - if node_name in decision_tree.keys(): - min_count_visited = min(min_count_visited, - decision_tree[node_name]["visit_counter"]) - # If already checked skip to next one - continue - if station[0] not in electrified_station_set: - best_station_id = station[0] - return [best_station_id], True - else: - # Every possible node from here was evaluated already - # to do what now? - # Simply visit the least visited node - for station in station_eval: - # Create a station combination from already electrified stations - # and possible new station - check_stations = electrified_station_set.union([station[0]]) - if decision_tree[stations_hash(check_stations)]["visit_counter"] == min_count_visited: - best_station_id = station[0] - return [best_station_id], True - return None, True - - -@time_it -def stations_hash(stations_set): - """ Create a simple str as hash for a set of stations""" - return str(sorted(list(stations_set))) - - -@time_it -def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, - soc_charge_curve_dict, soc_upper_thresh=1): +def timeseries_calc(rotations, soc_dict, eval_scen, ele_station_set, + soc_charge_curve_dict, soc_upper_thresh=1, electrify_stations=None): """ A quick estimation of socs by mutating the soc data accordingly :return soc dict :rtype dict() """ - - ele_stations = {*ele_station_set, station} + if not electrify_stations: + electrify_stations=set() + ele_stations = {*ele_station_set, electrify_stations} soc_dict = copy(soc_dict) for rot in rotations: @@ -939,78 +429,6 @@ def timeseries_calc(station, rotations, soc_dict, eval_scen, ele_station_set, @time_it -def evaluate(events, eval_scen, soc_curve_dict, - electrified_station_set=None, decision_tree=None, **kwargs): - """Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an - event is raised up to a minimal soc (probably zero). The supplied energy is approximated by - loading power, standing time at a station, soc at station, minimal soc of the event""" - - soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) - soc_upper_thresh = kwargs.get("soc_upper_thresh", ARGS.desired_soc_deps) - - if not electrified_station_set: - electrified_station_set = set() - - station_eval = {} - for event in events: - soc_over_time = soc_curve_dict[event["v_type"]][event["ch_type"]] - for i, trip in enumerate(event["trip"]): - # Station is only evaluated if station name is part of event stations - # Only these stations showed potential in electrification, e.g enough standing time - if trip.arrival_name not in event["stations"]: - continue - idx = get_index_by_time(trip.arrival_time, eval_scen) - soc = eval_scen.vehicle_socs[event["vehicle_id"]][idx] - - max_soc = soc_upper_thresh - min_soc = soc_lower_thresh - # Potential is the minimal amount of - delta_soc_pot = min(max_soc - soc, - min_soc - event["min_soc"], - soc - event["min_soc"], - max_soc - min_soc) - - try: - standing_time_min = get_charging_time(trip, event["trip"][i + 1], ARGS) - except IndexError: - standing_time_min = 0 - - # energy_charging_potential = standing_time_min *60 * ch_power - e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min) * event["capacity"] - - # Potential is at max the minimum between the useful delta soc * capacity or the - # energy provided by charging for the full standing time - delta_E_pot = min(delta_soc_pot * event["capacity"], e_charging_pot) - d = dict(E_pot=delta_E_pot, - standing_time=timedelta(minutes=standing_time_min)) - try: - station_eval[trip.arrival_name]["pot_list"].append(d) - except KeyError: - station_eval[trip.arrival_name] = dict(pot_list=[], pot_sum=0) - station_eval[trip.arrival_name]["pot_list"].append(d) - - # time_list = [] - for station_name, stat_dict in station_eval.items(): - if decision_tree is not None: - check_stations = electrified_station_set.union(station_name) - if check_stations in decision_tree.keys(): - stat_dict["pot_sum"] = decision_tree[str(check_stations)]["missing_energy"] - \ - decision_tree[str(electrified_station_set)]["missing_energy"] - # decision_tree[str(electrified_station_set)]["children"].append(check_stations) - continue - - sum_pot = 0 - standing_time = timedelta(minutes=0) - for pot in stat_dict["pot_list"]: - sum_pot += pot["E_pot"] - standing_time += pot["standing_time"] - stat_dict["pot_sum"] = sum_pot - # time_list.append(standing_time / timedelta(minutes=1)) - # Sort by pot_sum - station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1]["pot_sum"])).items()) - station_eval.reverse() - return station_eval - @time_it def get_charging_time(trip1, trip2, args): @@ -1047,28 +465,6 @@ def get_index_by_time(search_time, this_scen: scenario.Scenario): return idx -@time_it -def get_time_by_index(idx, this_scen: scenario.Scenario): - start_time = this_scen.start_time - delta_time = timedelta(minutes=60 / this_scen.stepsPerHour) - searched_time = start_time + delta_time * idx - return searched_time - - -@time_it -def get_trips(rot: rotation.Rotation, start_idx: int, end_idx: int, scen: scenario.Scenario): - # return trips in a rotation from a start to an end index, if the arrival time is in between - # the start and end idx - start_time_event = get_time_by_index(start_idx, scen) - end_time_event = get_time_by_index(end_idx, scen) - - trips = [] - for i, trip in enumerate(rot.trips): - if end_time_event > trip.arrival_time > start_time_event: - trips.append(trip) - - return trips - @time_it def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): @@ -1080,104 +476,6 @@ def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx -@time_it -def get_low_soc_events(this_scen: scenario.Scenario, this_sched: schedule.Schedule, - rotations=None, filter_standing_time=True, not_possible_stations=None, - rel_soc=False, soc_data=None, **kwargs): - if not not_possible_stations: - not_possible_stations = set() - - if not rotations: - rotations = this_sched.rotations - - soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) - soc_upper_thresh = kwargs.get("soc_upper_thresh", ARGS.desired_soc_deps) - - # Create list of events which describe trips which end in a soc below zero - # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 - # Properties before and after these points have no effect on the event itself, similar to - # an event horizon - events = [] - count_electrified_rot = 0 - - for rot_id in rotations: - rot = this_sched.rotations[rot_id] - soc, rot_start_idx, rot_end_idx = get_rotation_soc(rot_id, this_sched, this_scen, soc_data) - soc = [s if s is not None else 999 for s in soc] - idx = range(0, len(soc)) - - comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] - min_soc, min_idx = min(comb, key=lambda x: x[0]) - reduced_list = comb.copy() - soc_lower_thresh_cur = soc_lower_thresh - # if rotation gets a start soc below 1 this should change below 0 soc events since fixing - # the rotation before would lead to fixing this rotation - - # if using relative SOC, SOC lookup has to be adjusted - if rel_soc: - start_soc = comb[0][0] - soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( - soc_upper_thresh - soc_lower_thresh) - soc_upper_thresh = soc_lower_thresh_cur + soc_upper_thresh - if min_soc >= soc_lower_thresh_cur: - count_electrified_rot += 1 - while min_soc < soc_lower_thresh_cur: - i = min_idx - idx = [x[1] for x in reduced_list] - while soc[i] < soc_upper_thresh: - if i == rot_start_idx: - break - i -= 1 - start_comb = idx.index(i) - start = i - i = min_idx - while soc[i] < soc_upper_thresh: - if i >= rot_end_idx - 1: - break - i += 1 - end_comb = idx.index(i) - trips = get_trips(rot=rot, start_idx=start, end_idx=min_idx, scen=this_scen) - possible_stations = set() - possible_stations_list = [] - if not filter_standing_time: - possible_stations = {t.arrival_name for t in trips} - possible_stations_list = [t.arrival_name for t in trips] - else: - for ii, trip in enumerate(trips): - try: - try: - standing_time_min = get_charging_time(trip, trips[ii + 1], ARGS) - except IndexError: - standing_time_min = 0 - if standing_time_min > 0: - possible_stations.add(trip.arrival_name) - possible_stations_list.append(trip.arrival_name) - except IndexError: - pass - - possible_stations = possible_stations.difference(not_possible_stations) - cht = rot.vehicle_id.find("depb") - ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" - type = rot.vehicle_id.split("_" + ch_type)[0] - event = dict(start_idx=start, end_idx=min_idx, - min_soc=min_soc, stations=possible_stations, - vehicle_id=rot.vehicle_id, trip=trips, - rotation=rot, stations_list=possible_stations_list, - capacity=this_sched.vehicle_types[type][ch_type]['capacity'], - v_type=type, ch_type=ch_type) - - events.append(event) - copy_list = reduced_list.copy() - reduced_list = reduced_list[:start_comb] - if end_comb + 1 <= len(copy_list): - reduced_list.extend(copy_list[end_comb + 1:]) - if len(reduced_list) > 0: - min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) - else: - break - return events - - @time_it def preprocess_schedule(this_sched, this_args, electrified_stations=None): @@ -1246,32 +544,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr @time_it -def get_delta_soc(soc_over_time_curve, soc, time_delta): - """ get expected soc lift for a given start_soc and time_delta.""" - # units for time_delta and time_curve are assumed to be the same, e.g. minutes - # first element which is bigger than current soc - if time_delta == 0: - return 0 - soc = max(min(ARGS.desired_soc_opps, soc), 0) - first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] - second_time = first_time + time_delta - # catch out of bounds if time of charging end is bigger than table values - - if second_time >= soc_over_time_curve[-1, 0]: - end_soc = soc_over_time_curve[-1, 1] - else: - end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] - # make sure to limit delta soc to 1 if negative socs are given. They are possible during - # the optimization process but will be continuously raised until they are >0. - return min(ARGS.desired_soc_opps, end_soc - start_soc) - - -@time_it -def electrify_station(stat, stations, electrified_set): - """electrify a station and keep track of it in the electrified set file""" - stations[stat] = CONFIG.standard_opp_station - electrified_set.add(stat) @time_it @@ -1299,23 +572,6 @@ def combs_unordered_no_putting_back(n: int, k: int): @time_it -def remove_none_socs(this_scen): - """ Removes soc values of None by filling them with the last value which is not None - :param this_scen: scenario from which the None socs should be removed - :type this_scen: scenario.Scenario() - """ - # make sure no None values exists in SOCs. Fill later values with last value - # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] - for v_id, soc in this_scen.vehicle_socs.items(): - soc = np.array(soc) - last_not_none = "not found" - if None in soc: - for ii in range(len(soc) - 1, -1, -1): - if soc[ii] is not None: - last_not_none = soc[ii] - break - soc[soc == np.array(None)] = last_not_none - this_scen.vehicle_socs[v_id] = soc def get_vehicle(rot_id, this_sched): @@ -1326,12 +582,7 @@ def get_vehicle_rots(rot_id, this_sched): return [rot for rot in this_sched.rotations if rot_id == get_vehicle(rot, this_sched)] -@time_it -def station_eval_to_logger(missing_energy, station_eval): - LOGGER.debug("Missing energy: %s", missing_energy) - if LOGGER.getEffectiveLevel() > logging.DEBUG: - for stat_id in station_eval: - LOGGER.debug("%s , %s", stat_id[0], stat_id[1]["pot_sum"]) + @time_it @@ -1376,7 +627,7 @@ def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thre stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} electrified_station_set = set(stats) - vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), + vehicle_socs = timeseries_calc(this_sched.rotations.values(), this_scen.vehicle_socs, this_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict, soc_upper_thresh=ARGS.desired_soc_deps) @@ -1419,7 +670,7 @@ def get_must_stations(this_scen, this_sched, soc_charge_curve_dict, for station in electrified_station_set_all: print(".", end="") electrified_station_set = electrified_station_set_all.difference([station]) - vehicle_socs = timeseries_calc('best_station_ids[0]', this_sched.rotations.values(), + vehicle_socs = timeseries_calc(this_sched.rotations.values(), this_scen.vehicle_socs, this_scen, electrified_station_set, soc_charge_curve_dict=soc_charge_curve_dict, diff --git a/ebus_toolbox/schedule_optimizer.py b/ebus_toolbox/schedule_optimizer.py index 6ba2b492..bcc2f3b8 100644 --- a/ebus_toolbox/schedule_optimizer.py +++ b/ebus_toolbox/schedule_optimizer.py @@ -1,15 +1,669 @@ +""" Optimizer class which implements the optimizer object and methods needed""" +import json +from copy import copy +from datetime import timedelta +import pickle +from pathlib import Path + +import numpy as np import schedule + +from ebus_toolbox import report, rotation from src import scenario from optimizer_config import read_config, OptimizerConfig +import logging +import optimizer + + class ScheduleOptimizer: - def __init__(self, sched:schedule.Schedule(), scen:scenario.Scenario(), args, - config:OptimizerConfig(), **kwargs): + def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, + config: OptimizerConfig(), logger: logging.Logger, **kwargs): + self.could_not_be_electrified = set() + self.must_include_set = set() + self.soc_charge_curve_dict = {} + self.decision_tree = {} self.schedule = sched self.scenario = scen + self.base_schedule = self.schedule + self.base_scenario = self.scenario self.args = args + self.logger = logger self.config = config - self.logger = kwargs.get("logger", None) + self.electrified_station_set = set() + with open(self.args.electrified_stations, "r", encoding="utf-8", ) as file: + self.electrified_stations = json.load(file) + self.base_stations = self.electrified_stations.copy() + self.base_electrified_station_set = self.electrified_station_set.copy() + + # stations which are included can not be included again. Therefore they get into + # the set of not possible stations together with excluded stations + self.not_possible_stations = config.inclusion_stations.union(config.exclusion_stations) if config.reduce_rots: - self.sched.rotations = {rot: sched.rotations[rot] for rot in config.rots} + self.schedule.rotations = {rot: sched.rotations[rot] for rot in config.rots} + + def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): + # Loops over every base group with the core of group optimization and handles deep or + # greedy arguments + + # base stations for optimization, so inclusion of stations can be skipped + base_stations = self.base_stations.copy() + base_electrified_station_set = self.base_electrified_station_set.copy() + + self.base_scenario = copy(self.scenario) + self.base_schedule = copy(self.schedule) + + # get events where soc fell below 0. The events contain info about the problematic + # time span, which includes stations which could provide a soc lift + base_events = self.get_low_soc_events(rel_soc=False, + soc_data=self.base_scenario.vehicle_socs) + + # check if the events can be divided into subgroups which are independent + # this makes optimization in smaller groups possible + groups = optimizer.get_groups_from_events(base_events, self.not_possible_stations) + + # Baseline greedy Optimization + list_greedy_sets = [set()] * len(groups) + + # get_negative_rotations_all_electrified(base_scen, base_sched, soc_upper_thresh, soc_charge_curve_dict, + # not_possible_stations=not_possible_stations, + # rel_soc=False) + + # new_scen.vehicle_socs = timeseries_calc(new_sched.rotations.values(), + # new_scen.vehicle_socs, + # new_scen, electrified_station_set, + # soc_charge_curve_dict=soc_charge_curve_dict, + # soc_upper_thresh=ARGS.desired_soc_deps) + + # Base line is created simply by not having a decision tree and not a pre optimized_set yet + for group_nr, group in enumerate(groups[:]): + events, stations = group + linien = {lne for e in events for lne in e["rotation"].lines} + self.electrified_stations = self.base_stations.copy() + self.electrified_station_set = self.base_electrified_station_set.copy() + self.logger.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, + len(groups)) + self.logger.warning(linien) + self.logger.warning("%s events", (len(events))) + + # first run is always step by step + self.group_optimization(group, self.choose_station_step_by_step, **kwargs) + + self.logger.warning("Greedy Result ++++++++ %s stations out of %s", + len(self.electrified_station_set), + len(stations)) + self.logger.warning(self.electrified_station_set) + + list_greedy_sets[group_nr] = self.electrified_station_set.copy() + + # if no deep analysis is needed, loop can continue and part further down is skipped + if opt_type != "deep": + for single_set in list_greedy_sets: + for stat in single_set: + self.electrify_station(stat, self.electrified_station_set) + return self.electrified_stations, self.electrified_station_set + + # from here on only for deep analysis + for group_nr, group in enumerate(groups[:]): + events, stations = group + sols = [] + i = 0 + cont_loop = True + combinations = optimizer.combs_unordered_no_putting_back(len(stations), + len(list_greedy_sets[ + group_nr])) + if node_choice == "brute": + choice_func = self.choose_station_brute + else: + choice_func = self.choose_station_step_by_step + self.logger.debug("There are %s combinations", combinations) + pre_optimized_set = list_greedy_sets[group_nr] + + while i < self.config.max_brute_loop and cont_loop: + i += 1 + if i % 10 == 0: + print(len(self.decision_tree), " Knotenpunkte durchwandert") + print(f"Optimal solution has length {len(self.electrified_station_set)}") + # not_possible_stations = copy(not_possible_stations) + self.electrified_stations = self.base_stations.copy() + new_electrified_set = set() + + new_stations, cont_loop = self.group_optimization(group, choice_func, + track_not_possible_rots=False, + **kwargs) + # if a new set was found, print it and save it in sols + if new_electrified_set != pre_optimized_set and new_stations is not None: + self.logger.warning("Optimized with %s stations %s %s", + len(new_electrified_set), str('#' * 20), + stations_hash(new_electrified_set)) + sols.append(new_electrified_set) + if len(new_electrified_set) < len(pre_optimized_set): + electrified_station_set = new_electrified_set + + self.logger.debug("All solutions for this group: %s", sols) + list_greedy_sets[group_nr] = electrified_station_set.copy() + self.logger.debug("Optimized with %s stations out of %s", len(electrified_station_set), + len(stations)) + + # Saving decision tree only in case of deep analysis + if self.config.save_decision_tree: + with open(self.args.output_directory / Path("decision_tree.pickle"), "wb") as file: + pickle.dump(self.decision_tree, file) + + for single_set in list_greedy_sets: + for stat in single_set: + self.electrify_station(stat, self.electrified_station_set) + + return self.electrified_stations, self.electrified_station_set + + def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, + tree_position=None, **kwargs): + """ Optimize a single group events + :return (electrified_stations if optimization continues, None if no further recursive calls + should happen, bool if further deep analysis should take place) + :rtype (dict() or None, bool) + """ + could_not_be_electrified = self.could_not_be_electrified + + # in deep analysis not all nodes are visited if they are suboptimal. + # therefore could not be electrified is only important in the first run, where every station + # is possible + if not track_not_possible_rots: + could_not_be_electrified = set() + + solver = kwargs.get("solver", "spiceev") + + if not tree_position: + tree_position = [] + + # give tree position + self.logger.debug("%s with length of %s", tree_position, len(tree_position)) + + # Unpack events and possible stations + event_group, _ = group + + # Get the events which are still negative + events_remaining = kwargs.get("events_remaining", [99999]) + + # Copy Scen and sched + new_scen = copy(self.base_scenario) + new_sched = copy(self.base_schedule) + + # Get rotations from event dict and calculate the missing energy + rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} + missing_energy = get_missing_energy(event_group) + if missing_energy >= 0: + self.logger.debug("Already electrified: Returning") + return self.electrified_stations, True + + station_eval = evaluate(event_group, new_scen, soc_curve_dict, + kwargs) + + + # Get the best stations, brute or step_by_step + best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, + pre_optimized_set, decision_tree, + missing_energy=missing_energy) + stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} + if best_station_ids is None: + LOGGER.warning("No useful station found with %s rotations not electrified yet. " + "Stopped after electrifying %s", events_remaining, + len(electrified_station_set)) + + if pre_optimized_set is None: + could_not_be_electrified.update(list(rotation_dict.keys())) + return None, False + + # Remove electrified stations in this run + copied_set = electrified_station_set.copy() + for stat in copied_set: + electrified_stations.pop(stat) + electrified_station_set.remove(stat) + # Overwrite with preoptimized set + for stat in pre_optimized_set: + self.electrify_station(stat, self.electrified_station_set) + return None, False + + LOGGER.debug("%s, with first pot of %s", best_station_ids, + stat_eval_dict[best_station_ids[0]]) + + # Electrify station(s) + for stat_id in best_station_ids: + self.electrify_station(stat_id, self.electrified_station_set) + + event_rotations = {x["rotation"] for x in event_group} + if solver == "quick": + # Quick calculation has to electrify everything in one step, + # or the lifting of socs is not correct + new_scen.vehicle_socs = deepcopy(base_socs) + new_scen.vehicle_socs = timeseries_calc(event_rotations, + new_scen.vehicle_socs, + new_scen, electrified_station_set, + soc_curve_dict, + soc_upper_thresh=ARGS.desired_soc_deps, + electrify_stations=best_station_ids[0]) + else: + new_sched.rotations = rotation_dict + new_sched, new_scen = run_schedule(new_sched, ARGS, + electrified_stations=electrified_stations) + + not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) + event_rotations_ids = {event["rotation"].id for event in event_group} + new_events = get_low_soc_events(new_scen, + new_sched, rotations=event_rotations_ids, + not_possible_stations=not_possible_stations, rel_soc=True, + **kwargs) + + delta_energy = get_missing_energy(new_events) + + events_remaining[0] -= len(event_group) - len(new_events) + LOGGER.debug("Last electrification electrified %s/%s." + " %s remaining events in the base group.", + len(event_group) - len(new_events), len(event_group), events_remaining[0]) + delta_base_energy = delta_energy # get_missing_energy(base_events) + + # Put this node intro the decision tree including the missing energy + if decision_tree is not None: + decision_tree = node_to_tree(decision_tree, electrified_station_set, delta_base_energy) + + # Everything electrified + if delta_energy >= 0: + return electrified_stations, True + # Some choice functions might not need a recursive call, they return here. recursive is set + # by the choose_station_function + if not recursive: + return None, True + + # Check if the events can be divided into subgroups which are independent + groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) + + for k, this_group in enumerate(groups): + this_tree = tree_position.copy() + this_tree.append(k) + new_stations, _ = group_optimization(this_group, new_scen, new_sched, + electrified_stations, + electrified_station_set, + could_not_be_electrified, + not_possible_stations, choose_station_function, + soc_curve_dict, + pre_optimized_set, decision_tree, + tree_position=this_tree, + **kwargs) + + if new_stations is not None: + electrified_stations.update(new_stations) + else: + return None, True + + # If there is no pre optimized set function can return + if pre_optimized_set is None: + return electrified_stations, True + + # If there is a preoptimized set check if the preoptimized set leads to pruning + # i.e. if if following branch makes sense + if len(pre_optimized_set) - len(electrified_station_set) < 10: + new_scen.vehicle_socs = timeseries_calc(event_rotations, + new_scen.vehicle_socs, + new_scen, electrified_station_set, + soc_curve_dict, + soc_upper_thresh=ARGS.desired_soc_deps, + electrify_stations=best_station_ids[0]) + + prune_events = get_low_soc_events(new_scen, new_sched, + rotations=event_rotations_ids, + not_possible_stations=not_possible_stations, + rel_soc=True, **kwargs) + + station_eval = evaluate(prune_events, new_scen, soc_curve_dict) + prune_missing_energy = get_missing_energy(prune_events) + if not is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, prune_missing_energy): + print("Branch pruned early") + is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, missing_energy) + return None, True + + + def is_branch_promising(self, station_eval, electrified_station_set, + pre_optimized_set, missing_energy): + """ quickly evaluates if following a branch is promising by summing up estimated potentials + :return is the branch promising + :rtype bool""" + + delta = len(pre_optimized_set) - len(electrified_station_set) + pot = 0 + for i in range(0, min(delta, len(station_eval))): + pot += station_eval[i][1]["pot_sum"] + if pot < -missing_energy * self.config.estimation_threshold: + print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", + stations_hash(electrified_station_set)) + return False + return True + + def choose_station_brute(self, station_eval, electrified_station_set, + pre_optimized_set=None, decision_tree=None, missing_energy=0, + gens=dict()): + """ Gives back a possible set of Stations to electrify which shows potential and hasnt been + tried yet. The set of stations is smaller than the best optimized set so far.""" + + station_ids = [x[0] for x in station_eval] + try: + generator = gens[str(station_ids) + str(len(pre_optimized_set) - 1)] + except KeyError: + generator = combination_generator(station_ids, len(pre_optimized_set) - 1) + gens[str(station_ids) + str(len(pre_optimized_set) - 1)] = generator + station_eval_dict = {stat[0]: stat[1] for stat in station_eval} + for comb in generator: + node_name = stations_hash(comb) + if node_name not in decision_tree: + # only check the brute force station if they have the remote chance of fulfilling + # the missing energy + # potential>missing energy * 80% + potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) + if potential > -missing_energy * CONFIG.estimation_threshold: + return comb, False + else: + LOGGER.debug("skipped %s since potential is too low %s %%", comb, + round(potential / -missing_energy * 100, 0)) + LOGGER.debug("calculated all viable possibilities") + return None, False + + def choose_station_step_by_step(self, station_eval, + pre_optimized_set=None, missing_energy=0): + """ Gives back a station of possible stations to electrify which shows the biggest potential + and hasnt been picked before.""" + + # Filter functions to stop simulating cases which have no hope of being optimal. + # If in optimization mode, optimization can break if station amount is superseded + # This filter is done better by the next + # if pre_optimized_set is not None: + # if len(electrified_station_set)>len(pre_optimized_set): + # return pre_optimized_set + # Potentials have to be at least as promising as the pre-optimized case + if pre_optimized_set is not None: + if not is_branch_promising(station_eval, electrified_station_set, + pre_optimized_set, missing_energy): + # Best station id is none and dont go deeper in recursion + return None, False + + min_count_visited = float('inf') + for station in station_eval: + # Create a station combination from already electrified stations and possible new station + check_stations = electrified_station_set.union([station[0]]) + + if decision_tree is not None: + node_name = stations_hash(check_stations) + if node_name in decision_tree.keys(): + min_count_visited = min(min_count_visited, + decision_tree[node_name]["visit_counter"]) + # If already checked skip to next one + continue + if station[0] not in electrified_station_set: + best_station_id = station[0] + return [best_station_id], True + else: + # Every possible node from here was evaluated already + # to do what now? + # Simply visit the least visited node + for station in station_eval: + # Create a station combination from already electrified stations + # and possible new station + check_stations = electrified_station_set.union([station[0]]) + if decision_tree[stations_hash(check_stations)][ + "visit_counter"] == min_count_visited: + best_station_id = station[0] + return [best_station_id], True + return None, True + + def set_battery_and_charging_curves(self): + for v_type in self.schedule.vehicle_types.values(): + for vehicle in v_type.values(): + if self.config.battery_capacity is not None: + vehicle["capacity"] = self.config.battery_capacity + if self.config.charging_curve is not None: + vehicle["charging_curve"] = self.config.charging_curve + + def set_up_decision_tree(self): + if self.config.decision_tree_path is not None: + with open(self.config.decision_tree_path, "rb") as file: + self.decision_tree = self.config.load(file) + + def rebase_spice_ev(self): + self.logger.debug("Spice EV Rebasing Scenario") + must_include_set, ele_stations = self.preprocessing_scenario( + run_only_neg=self.config.run_only_neg) + self.logger.debug("Rebasing finished") + if self.config.pickle_rebased: + toolbox_to_pickle(self.config.pickle_rebased_name, self.schedule, self.scenario, + self.args) + self.logger.debug("Rebased scenario pickled as %s", self.config.pickle_rebased_name) + + self.must_include_set = must_include_set + self.base_stations = self.electrified_stations.copy() + return must_include_set, ele_stations + + def rebase_simple(self): + must_include_set = set() + # Electrify inclusion stations + for stat in self.config.inclusion_stations: + self.electrify_station(stat, must_include_set) + self.schedule.rotations = {r: self.schedule.rotations[r] for r in self.schedule.rotations if + r not in self.config.exclusion_rots} + self.must_include_set = must_include_set + self.base_stations = self.electrified_stations.copy() + return must_include_set, self.electrified_stations + + def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, + cost_calc=False): + """ Prepare scenario and run schedule + :return schedule, scenario, electrified_station_set, electrified_stations + :rtype (schedule.Schedule(), scenario.Scneario(), set(), dict()) + """ + must_include_set = set() + # Electrify inclusion stations + for stat in self.config.inclusion_stations: + self.electrify_station(stat, must_include_set) + + # Calc new but only prev. negative rotations + if run_only_neg: + rots = self.schedule.get_negative_rotations(self.scenario) + rots = {r: self.schedule.rotations[r] for r in rots if r not in + self.config.exclusion_rots} + self.schedule.rotations = rots + else: + rots = {r: self.schedule.rotations[r] for r in self.schedule.rotations if + r not in self.config.exclusion_rots} + self.schedule.rotations = rots + + new_sched, new_scen = optimizer.run_schedule(self.schedule, self.args, + self.electrified_stations, + cost_calc=cost_calc) + report.generate(new_sched, new_scen, self.args) + self.schedule = new_sched + self.scenario = new_scen + self.must_include_set = must_include_set + return must_include_set, electrified_stations + + def electrify_station(self, stat, electrified_set): + """electrify a station and keep track of it in the electrified set file""" + self.electrified_stations[stat] = self.config.standard_opp_station + electrified_set.add(stat) + + def create_charging_curves(self): + """Cycle through vehicles and create numerically created charging curves with energy supplied + over time""" + soc_charge_curve_dict = {} + for v_type_name in self.schedule.vehicle_types: + soc_charge_curve_dict[v_type_name] = {} + for name, v_type in self.schedule.vehicle_types.items(): + for ch_type, data in v_type.items(): + soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( + data["charging_curve"], data["capacity"], self.args, + self.schedule.cs_power_opps, efficiency=self.config.charge_eff, + time_step=0.1) + self.soc_charge_curve_dict = soc_charge_curve_dict + + def get_must_stations_and_rebase(self, relative_soc=False): + """Electrify everything minus 1 station. If without the stations there are below zero events + it is a must have station""" + + events = self.get_low_soc_events(rel_soc=relative_soc) + + stats = {station for event in events for station in event["stations_list"] + if station not in self.not_possible_stations} + + electrified_station_set_all = set(stats) + must_stations = set() + for station in electrified_station_set_all: + self.logger.debug(".", end="") + electrified_station_set = electrified_station_set_all.difference([station]) + vehicle_socs = optimizer. \ + timeseries_calc(self.schedule.rotations.values(), + self.scenario.vehicle_socs, + self.scenario, electrified_station_set, + soc_charge_curve_dict=self.soc_charge_curve_dict, + soc_upper_thresh=self.args.desired_soc_deps) + + for rot in self.schedule.rotations: + soc, start, end = self.get_rotation_soc(rot, vehicle_socs) + if np.min(soc[start:end]) < self.config.min_soc: + self.logger.debug("%s , with min soc: %s", station, np.min(soc[start:end])) + must_stations.add(station) + break + self.not_possible_stations = self.not_possible_stations.union(must_stations) + + # rebasing + for stat in must_stations: + # dont put must stations in electrified set, but in extra set must_include_set + self.electrify_station(stat, self.must_include_set) + self.scenario.vehicle_socs = optimizer. \ + timeseries_calc(self.schedule.rotations.values(), + self.scenario.vehicle_socs, + self.scenario, must_stations, + soc_charge_curve_dict=self.soc_charge_curve_dict, + soc_upper_thresh=self.args.desired_soc_deps) + return must_stations + + def remove_none_socs(self): + """ Removes soc values of None by filling them with the last value which is not None + :param this_scen: scenario from which the None socs should be removed + :type this_scen: scenario.Scenario() + """ + # make sure no None values exists in SOCs. Fill later values with last value + # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] + for v_id, soc in self.scenario.vehicle_socs.items(): + soc = np.array(soc) + last_not_none = "not found" + if None in soc: + for ii in range(len(soc) - 1, -1, -1): + if soc[ii] is not None: + last_not_none = soc[ii] + break + soc[soc == np.array(None)] = last_not_none + self.scenario.vehicle_socs[v_id] = soc + + + def get_rotation_soc(self, rot_id, soc_data: dict = None): + rot = self.schedule.rotations[rot_id] + rot_start_idx = self.get_index_by_time(rot.departure_time) + rot_end_idx = self.get_index_by_time(rot.arrival_time) + if soc_data: + return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx + return self.scenario.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx + + def get_index_by_time(self, search_time): + start_time = self.scenario.start_time + delta_time = timedelta(minutes=60 / self.scenarioc.stepsPerHour) + idx = (search_time - start_time) // delta_time + return idx + + def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): + # return trips in a rotation from a start to an end index, if the arrival time is in between + # the start and end idx + start_time_event = self.get_time_by_index(start_idx, self.scenario) + end_time_event = self.get_time_by_index(end_idx, self.scenario) + + trips = [] + for i, trip in enumerate(rot.trips): + if end_time_event > trip.arrival_time > start_time_event: + trips.append(trip) + + return trips + + def get_time_by_index(self, idx): + start_time = self.scenario.start_time + delta_time = timedelta(minutes=60 / self.scenario.stepsPerHour) + searched_time = start_time + delta_time * idx + return searched_time + + + + + + + + +def toolbox_from_pickle(sched_name, scen_name, args_name): + """ Load the 3 files from pickle""" + with open(args_name, "rb") as f: + this_args = pickle.load(f) + with open(scen_name, "rb") as f: + scen = pickle.load(f) + with open(sched_name, "rb") as f: + sched = pickle.load(f) + return sched, scen, this_args + + +def toolbox_to_pickle(name, sched, scen, this_args): + """ Dump the 3 files to pickle files""" + args_name = "args_" + name + ".pickle" + with open(args_name, "wb") as f: + pickle.dump(this_args, f) + scen_name = "scenario_" + name + ".pickle" + with open(scen_name, "wb") as f: + pickle.dump(scen, f) + sched_name = "schedule_" + name + ".pickle" + with open(sched_name, "wb") as f: + pickle.dump(sched, f) + return sched_name, scen_name, args_name + + +def charging_curve_to_soc_over_time(charging_curve, capacity, args, + max_charge_from_grid=float('inf'), + time_step=0.1, efficiency=1): + """create charging curve as nested list of SOC, Power[kW] and capacity in [kWh]""" + # simple numeric creation of power over time --> to energy over time + normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) + soc = 0 + time = 0 + socs = [] + times = [] + while soc < args.desired_soc_opps: + times.append(time) + socs.append(soc) + power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) + soc2 = soc + time_step / 60 * power1 + power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) + power = (power1 + power2) / 2 * efficiency + soc += time_step / 60 * power + time += time_step + # Fill the soc completely in last timestep + times.append(time) + socs.append(args.desired_soc_opps) + return np.array((times, socs)).T + + +def get_missing_energy(events): + """ Sum up all the missing energies of the given events""" + missing_energy = 0 + for event in events: + missing_energy += event["min_soc"] * event["capacity"] + return missing_energy + + +def stations_hash(stations_set): + """ Create a simple str as hash for a set of stations""" + return str(sorted(list(stations_set))) From 854ab701e69989c62953f63366147075c24213cd Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 20 Dec 2022 13:06:06 +0100 Subject: [PATCH 413/802] restructure output functions to only execute when called in simulate --- data/examples/ebus_toolbox.cfg | 5 +++-- ebus_toolbox/__main__.py | 18 +++++++----------- ebus_toolbox/report.py | 21 +++++++++++++-------- ebus_toolbox/simulate.py | 11 ++++++++++- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 4df92def..23e215f7 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -105,8 +105,9 @@ strategy = distributed # options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] -# show plots after simulation -visual = false +# generate report and plots, default: false +# TODO: remove efter implementation of chaned mods. Then report becomes a mod +generate_report = true # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 4f580e3d..d8ada032 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -73,13 +73,16 @@ parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' 'start time of a vehicle event im min.', default=10) - parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results') + parser.add_argument('--visual', '-v', action='store_true', + help='Show plots of the results- not apllicable', default=False) + parser.add_argument('--generate-report', '-r', help='generates and stores plots and results', + default=False) parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') - parser.add_argument('--save-timeseries', help='Write timesteps to file') - parser.add_argument('--save-results', help='Write general info to file') - parser.add_argument('--save-soc', help='Write SOC info to file') + parser.add_argument('--save-timeseries', help='Write timesteps to file - not apllicable', default=False) + parser.add_argument('--save-results', help='Write general info to file - not apllicable', default=False) + parser.add_argument('--save-soc', help='Write SOC info to file - not apllicable', default=False) parser.add_argument('--strategy', '-s', default='greedy', help='Specify the charging strategy. One of {}. You may define \ custom options with --strategy-option.'.format('greedy, balanced')) @@ -119,13 +122,6 @@ # args.output_directory can be overwritten by config args.output_directory.mkdir(parents=True, exist_ok=True) - if not args.save_timeseries: - args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" - if not args.save_results: - args.save_results = args.output_directory / "simulation_spiceEV.json" - if not args.save_soc: - args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - # copy input files to output to ensure reproducibility copy_list = [args.config, args.electrified_stations, args.vehicle_types] diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 55bb3fbc..fdd11553 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -6,7 +6,7 @@ import json import matplotlib.pyplot as plt from ebus_toolbox.util import sanitize -from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results, plot +from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results, plot, generate_reports def generate_vehicle_socs(scenario, args): @@ -162,12 +162,15 @@ def generate(schedule, scenario, args): :type args: argparse.Namespace """ - # generate csv out of vehicle's socs - generate_vehicle_socs(scenario, args) - - # generate csv and json for all stations - generate_station_name_csv(scenario, args) - generate_station_name_json(scenario, args) + # # generate csv out of vehicle's socs + # generate_vehicle_socs(scenario, args) + # + # # generate csv and json for all stations + # generate_station_name_csv(scenario, args) + # generate_station_name_json(scenario, args) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + generate_reports(scenario, vars(args).copy()) # generate gc power overview generate_gc_power_overview_timeseries(scenario, args) @@ -182,8 +185,8 @@ def generate(schedule, scenario, args): plt.gcf().set_size_inches(10, 10) plt.savefig(args.output_directory / "run_overview.png") plt.savefig(args.output_directory / "run_overview.pdf") - plt.close() + # calculate SOCs for each rotation rotation_infos = [] negative_rotations = schedule.get_negative_rotations(scenario) @@ -268,3 +271,5 @@ def generate(schedule, scenario, args): csv_writer.writerow([key, round(value, 2), "€/year"]) else: csv_writer.writerow([key, round(value, 2), "€"]) + + print("Plots and output files saved in " + str(args.output_directory)) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 19540f68..4e94f0eb 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -89,4 +89,13 @@ def simulate(args): calculate_costs(cost_parameters_file, scenario, schedule, args) # create report - report.generate(schedule, scenario, args) + if args.generate_report: + args.save_timeseries = args.output_directory / "simulation_timeseries.csv" + args.save_results = args.output_directory / "simulation.json" + args.save_soc = args.output_directory / "vehicle_socs.csv" + + report.generate(schedule, scenario, args) + + args.save_timeseries = False + args.save_results = False + args.save_soc = False \ No newline at end of file From c240dde35aad9a76611bfd6007f2dd63fa45f84a Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 20 Dec 2022 13:17:26 +0100 Subject: [PATCH 414/802] remove deprecated functions from report --- ebus_toolbox/report.py | 67 ++---------------------------------------- 1 file changed, 2 insertions(+), 65 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index fdd11553..fa88470c 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -6,65 +6,7 @@ import json import matplotlib.pyplot as plt from ebus_toolbox.util import sanitize -from src.report import aggregate_timeseries, aggregate_local_results, aggregate_global_results, plot, generate_reports - - -def generate_vehicle_socs(scenario, args): - """Generates a csv file from the vehicle's socs in the specified simulation time. - - :param scenario: Scenario for with to generate timeseries. - :type scenario: spice_ev.Scenario - :param args: Configuration arguments specified in config files contained in configs directory. - :type args: argparse.Namespace - """ - - sim_start_time = scenario.start_time - v_list = list(scenario.vehicle_socs.keys()) - with open(args.output_directory / "vehicle_socs.csv", "w", newline='') as f: - csv_writer = csv.writer(f) - csv_writer.writerow(["timestep", "time", ] + v_list) - for i, row in enumerate(zip(*scenario.vehicle_socs.values())): - t = (sim_start_time + i * scenario.interval).isoformat() - csv_writer.writerow([i, t] + list(row)) - - -def generate_station_name_csv(scenario, args): - """Generates a csv file from the grid connectors - and their header information in the specified simulation time. - - :param scenario: Scenario for with to generate timeseries. - :type scenario: spice_ev.Scenario - :param args: Configuration arguments specified in config files contained in configs directory. - :type args: argparse.Namespace - """ - - for gc in scenario.constants.grid_connectors.keys(): - gc_info = aggregate_timeseries(scenario, gc) - file_name = f"simulation_{sanitize(gc)}.csv" - with open(args.output_directory / file_name, "w", newline='') as f: - csv_writer = csv.writer(f) - csv_writer.writerow(gc_info["header"]) - for elem in gc_info["timeseries"]: - csv_writer.writerow(elem) - - -def generate_station_name_json(scenario, args): - """Generates a json file from the grid connectors - and their header information in the specified simulation time. - - :param scenario: Scenario for with to generate timeseries. - :type scenario: spice_ev.Scenario - :param args: Configuration arguments specified in config files contained in configs directory. - :type args: argparse.Namespace - """ - - file_name_prefix = "simulation" - for gc in scenario.constants.grid_connectors.keys(): - gc_info = aggregate_local_results(scenario, gc) - file_name = f"{file_name_prefix}_{sanitize(gc)}.json" - with open(args.output_directory / file_name, 'w') as f: - json.dump(gc_info, f, indent=2) - +from src.report import aggregate_global_results, plot, generate_reports def generate_gc_power_overview_timeseries(scenario, args): """Generates a csv file from each grid connectors summed up @@ -162,12 +104,7 @@ def generate(schedule, scenario, args): :type args: argparse.Namespace """ - # # generate csv out of vehicle's socs - # generate_vehicle_socs(scenario, args) - # - # # generate csv and json for all stations - # generate_station_name_csv(scenario, args) - # generate_station_name_json(scenario, args) + # generate simulation_timeseries.csv, simulation.json and vehicle_socs.csv in spiceEV with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) generate_reports(scenario, vars(args).copy()) From 5038a6ee912b1a66584d8198d4a8e9d4c8a403c0 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 20 Dec 2022 13:25:37 +0100 Subject: [PATCH 415/802] move input_data in output into subfolder --- ebus_toolbox/__main__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index d8ada032..f2e6cb06 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -120,7 +120,8 @@ # if folder doesnt exists, create folder. # needs to happen after set_options_from_config since # args.output_directory can be overwritten by config - args.output_directory.mkdir(parents=True, exist_ok=True) + args.output_directory_input = Path(args.output_directory) / "input_data" + args.output_directory_input.mkdir(parents=True, exist_ok=True) # copy input files to output to ensure reproducibility copy_list = [args.config, args.electrified_stations, args.vehicle_types] @@ -129,9 +130,9 @@ if args.cost_parameters_file is not None: copy_list.append(args.cost_parameters_file) for c_file in copy_list: - shutil.copy(str(c_file), str(args.output_directory / Path(c_file).name)) + shutil.copy(str(c_file), str(args.output_directory_input / Path(c_file).name)) - util.save_version(Path(args.output_directory / "program_version.txt")) + util.save_version(Path(args.output_directory_input / "program_version.txt")) # rename special options args.timing = args.eta From d47d80587fd1f3083ab7222a9984613f29d54529 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 20 Dec 2022 13:29:07 +0100 Subject: [PATCH 416/802] correct typo --- data/examples/ebus_toolbox.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 23e215f7..42c0b498 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -106,7 +106,6 @@ strategy = distributed strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] # generate report and plots, default: false -# TODO: remove efter implementation of chaned mods. Then report becomes a mod generate_report = true # give margin for desired SoC [0.0 - 1.0] From 8c6d4efa7775dbf6f693344e5f97eb7b935ba912 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 20 Dec 2022 13:44:06 +0100 Subject: [PATCH 417/802] make flake8 happy --- ebus_toolbox/__main__.py | 6 ++++-- ebus_toolbox/report.py | 3 +-- ebus_toolbox/simulate.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index f2e6cb06..c90ce031 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -80,8 +80,10 @@ parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') - parser.add_argument('--save-timeseries', help='Write timesteps to file - not apllicable', default=False) - parser.add_argument('--save-results', help='Write general info to file - not apllicable', default=False) + parser.add_argument('--save-timeseries', help='Write timesteps to file - not apllicable', + default=False) + parser.add_argument('--save-results', help='Write general info to file - not apllicable', + default=False) parser.add_argument('--save-soc', help='Write SOC info to file - not apllicable', default=False) parser.add_argument('--strategy', '-s', default='greedy', help='Specify the charging strategy. One of {}. You may define \ diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index fa88470c..ed518244 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -3,11 +3,10 @@ import csv import datetime import warnings -import json import matplotlib.pyplot as plt -from ebus_toolbox.util import sanitize from src.report import aggregate_global_results, plot, generate_reports + def generate_gc_power_overview_timeseries(scenario, args): """Generates a csv file from each grid connectors summed up charging station power in the specified simulation time. diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 4e94f0eb..f2f9bfef 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -98,4 +98,4 @@ def simulate(args): args.save_timeseries = False args.save_results = False - args.save_soc = False \ No newline at end of file + args.save_soc = False From dbac17125fd42c6d47683320501f3eb261c0a3d1 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 20 Dec 2022 18:02:13 +0100 Subject: [PATCH 418/802] Refractor to working condition with event and optimizer class --- data/examples/optimizer.cfg | 8 +- ebus_toolbox/low_soc_events.py | 95 +++- ebus_toolbox/schedule_optimizer.py | 438 +++++++++++------- .../{optimizer.py => station_optimization.py} | 348 ++------------ 4 files changed, 382 insertions(+), 507 deletions(-) rename ebus_toolbox/{optimizer.py => station_optimization.py} (50%) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 324188c5..c21479ef 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -38,13 +38,13 @@ charge_eff = 0.95 output_path=data/private_examples/332_Buffered/optimization # "quick" or "spiceev" solver = quick -rebase_scenario = True +rebase_scenario = False pickle_rebased= False pickle_rebased_name=buffered_rebase_all_electrified run_only_neg=False # "greedy" or "deep" without "" -opt_type = deep +opt_type = greedy # "step-by-step" or "brute" without "" node_choice=brute max_brute_loop=250 @@ -57,9 +57,7 @@ prefer_deps=True # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible # If they are deemed as impossible, they are not optimized but discarded remove_impossible_rots=True - - -check_for_must_stations=True +check_for_must_stations=False include_must_stations = True diff --git a/ebus_toolbox/low_soc_events.py b/ebus_toolbox/low_soc_events.py index 54dc3b66..0a02a3fe 100644 --- a/ebus_toolbox/low_soc_events.py +++ b/ebus_toolbox/low_soc_events.py @@ -3,13 +3,11 @@ from ebus_toolbox.util import uncomment_json_file, get_buffer_time as get_buffer_time_spice_ev -from ebus_toolbox.schedule_optimizer import ScheduleOptimizer - - class LowSocEvent: + event_counter=0 def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rotation, stations_list, - capacity, v_type, ch_type): + capacity, v_type, ch_type,soc_curve): self.start_idx = start_idx self.end_idx = end_idx self.min_soc = min_soc @@ -21,16 +19,18 @@ def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rota self.capacity = capacity self.v_type = v_type self.ch_type = ch_type + self.event_counter=LowSocEvent.event_counter + LowSocEvent.event_counter += 1 + self.soc_curve=soc_curve -def get_low_soc_events(optimizer: ScheduleOptimizer, rotations=None, filter_standing_time=True, +def get_low_soc_events(optimizer, rotations=None, filter_standing_time=True, rel_soc=False, soc_data=None, **kwargs): if not rotations: rotations = optimizer.schedule.rotations soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) - # Create list of events which describe trips which end in a soc below zero # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to @@ -58,6 +58,8 @@ def get_low_soc_events(optimizer: ScheduleOptimizer, rotations=None, filter_stan if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 while min_soc < soc_lower_thresh_cur: + if LowSocEvent.event_counter==235: + print(optimizer.scenario) i = min_idx idx = [x[1] for x in reduced_list] while soc[i] < soc_upper_thresh: @@ -98,7 +100,7 @@ def get_low_soc_events(optimizer: ScheduleOptimizer, rotations=None, filter_stan rotation=rot, stations_list=possible_stations_list, capacity=optimizer.schedule.vehicle_types[v_type][ch_type][ 'capacity'], - v_type=v_type, ch_type=ch_type) + v_type=v_type, ch_type=ch_type, soc_curve=soc[start:min_idx].copy()) events.append(event) copy_list = reduced_list.copy() @@ -135,7 +137,7 @@ def get_index_by_time(scenario, search_time): return idx -def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer:ScheduleOptimizer): +def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer): """ get expected soc lift for a given start_soc and time_delta.""" # units for time_delta and time_curve are assumed to be the same, e.g. minutes # first element which is bigger than current soc @@ -156,13 +158,14 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer:ScheduleOptimi return min(optimizer.args.desired_soc_opps, end_soc - start_soc) -def evaluate(events: typing.Iterable[LowSocEvent], optimizer: ScheduleOptimizer, **kwargs): +def evaluate(events: typing.Iterable[LowSocEvent], optimizer, **kwargs): """Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an event is raised up to a minimal soc (probably zero). The supplied energy is approximated by loading power, standing time at a station, soc at station, minimal soc of the event""" soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) + soc_data = kwargs.get("soc_data", optimizer.scenario.vehicle_socs) # electrified_station_set = kwargs.get("electrified_station_set", set()) @@ -172,10 +175,10 @@ def evaluate(events: typing.Iterable[LowSocEvent], optimizer: ScheduleOptimizer, for i, trip in enumerate(event.trip): # Station is only evaluated if station name is part of event stations # Only these stations showed potential in electrification, e.g enough standing time - if trip.arrival_name not in event["stations"]: + if trip.arrival_name not in event.stations: continue idx = get_index_by_time(optimizer.scenario, trip.arrival_time, ) - soc = optimizer.scenario.vehicle_socs[event.vehicle_id][idx] + soc = soc_data[event.vehicle_id][idx] # Potential is the minimal amount of delta_soc_pot = min(soc_upper_thresh - soc, @@ -189,7 +192,7 @@ def evaluate(events: typing.Iterable[LowSocEvent], optimizer: ScheduleOptimizer, standing_time_min = 0 # energy_charging_potential = standing_time_min *60 * ch_power - e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min, optimizer)\ + e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min, optimizer) \ * event.capacity # Potential is at max the minimum between the useful delta soc * capacity or the @@ -198,9 +201,9 @@ def evaluate(events: typing.Iterable[LowSocEvent], optimizer: ScheduleOptimizer, try: station_eval[trip.arrival_name] += delta_e_pot except KeyError: - station_eval[trip.arrival_name] station_eval[trip.arrival_name] = delta_e_pot + # ToDo can get true potential from decision tree but is it necessary? # # time_list = [] # for station_name, stat_dict in station_eval.items(): @@ -212,8 +215,72 @@ def evaluate(events: typing.Iterable[LowSocEvent], optimizer: ScheduleOptimizer, # # decision_tree[str(electrified_station_set)]["children"].append(check_stations) # continue - # time_list.append(standing_time / timedelta(minutes=1)) + # time_list.append(standing_time / timedelta(minutes=1)) # Sort by pot_sum station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1])).items()) station_eval.reverse() return station_eval + + +def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None, + optimizer=None): + """ First create simple list of station sets for single events. + #Electrified and other not possible to electrify stations should not connect groups""" + + # Making sure default arguments are none and not mutable + if not not_possible_stations: + not_possible_stations = set() + + if not could_not_be_electrified: + could_not_be_electrified = set() + + possible_stations = [ + {station for station in event.stations if station not in not_possible_stations} + for event + in events] + # If stations overlap join them + station_subsets = join_all_subsets(possible_stations) + event_groups = [[] for __ in range(len(station_subsets))] + + # Group the events in the same manner as stations, so that the same amount of event groups are + # created as station subsets + for event in events: + for i, subset in enumerate(station_subsets): + # Every station from an event must share the same station sub_set. Therefore its enough + # to check only the first element + if len(event.stations) > 0: + if next(iter(event.stations)) in subset: + event_groups[i].append(event) + break + else: + if optimizer: + optimizer.logger.warning('Did not find rotation %s in any subset' + 'of possible electrifiable stations', event.rotation.id) + # this event will no show up in an event_group. + # therefore it needs to be put into this set + could_not_be_electrified.update([event.rotation.id]) + + groups = list(zip(event_groups, station_subsets)) + return sorted(groups, key=lambda x: len(x[1])) + + +def join_all_subsets(subsets): + """ join sets for as long as needed until no elements share any intersections""" + joined_subset = True + while joined_subset: + joined_subset, subsets = join_subsets(subsets) + return subsets + + +def join_subsets(subsets: typing.Iterable[set]): + subsets = [s.copy() for s in subsets] + for i in range(len(subsets)): + for ii in range(len(subsets)): + if i == ii: + continue + intersec = subsets[i].intersection(subsets[ii]) + if len(intersec) > 0: + subsets[i] = subsets[i].union(subsets[ii]) + subsets.remove(subsets[ii]) + return True, subsets + return False, subsets diff --git a/ebus_toolbox/schedule_optimizer.py b/ebus_toolbox/schedule_optimizer.py index bcc2f3b8..8d86e952 100644 --- a/ebus_toolbox/schedule_optimizer.py +++ b/ebus_toolbox/schedule_optimizer.py @@ -1,22 +1,25 @@ """ Optimizer class which implements the optimizer object and methods needed""" import json -from copy import copy +import typing +from copy import copy, deepcopy from datetime import timedelta import pickle from pathlib import Path - import numpy as np -import schedule +import schedule from ebus_toolbox import report, rotation from src import scenario from optimizer_config import read_config, OptimizerConfig - +from low_soc_events import evaluate, get_low_soc_events, get_groups_from_events, get_delta_soc, \ + get_buffer_time, get_charging_time, get_index_by_time import logging -import optimizer +import station_optimization class ScheduleOptimizer: + """ Class for schedule and station optimization""" + def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, config: OptimizerConfig(), logger: logging.Logger, **kwargs): self.could_not_be_electrified = set() @@ -47,21 +50,23 @@ def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): # Loops over every base group with the core of group optimization and handles deep or # greedy arguments - # base stations for optimization, so inclusion of stations can be skipped - base_stations = self.base_stations.copy() - base_electrified_station_set = self.base_electrified_station_set.copy() + # # base stations for optimization, so inclusion of stations can be skipped + # base_stations = self.base_stations.copy() + # base_electrified_station_set = self.base_electrified_station_set.copy() self.base_scenario = copy(self.scenario) self.base_schedule = copy(self.schedule) # get events where soc fell below 0. The events contain info about the problematic # time span, which includes stations which could provide a soc lift - base_events = self.get_low_soc_events(rel_soc=False, - soc_data=self.base_scenario.vehicle_socs) + base_events = get_low_soc_events(self, rel_soc=False, + soc_data=self.base_scenario.vehicle_socs) # check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible - groups = optimizer.get_groups_from_events(base_events, self.not_possible_stations) + groups = get_groups_from_events(base_events, self.not_possible_stations, + could_not_be_electrified=self.could_not_be_electrified, + optimizer=self) # Baseline greedy Optimization list_greedy_sets = [set()] * len(groups) @@ -79,16 +84,18 @@ def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): # Base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups[:]): events, stations = group - linien = {lne for e in events for lne in e["rotation"].lines} - self.electrified_stations = self.base_stations.copy() - self.electrified_station_set = self.base_electrified_station_set.copy() + linien = {lne for e in events for lne in e.rotation.lines} + # self.electrified_stations = self.base_stations.copy() + # self.electrified_station_set = self.base_electrified_station_set.copy() self.logger.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, len(groups)) self.logger.warning(linien) self.logger.warning("%s events", (len(events))) # first run is always step by step - self.group_optimization(group, self.choose_station_step_by_step, **kwargs) + # return values of no use + _, __ = self.group_optimization(group, self.choose_station_step_by_step, + events_remaining=[len(events)], **kwargs) self.logger.warning("Greedy Result ++++++++ %s stations out of %s", len(self.electrified_station_set), @@ -110,9 +117,10 @@ def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): sols = [] i = 0 cont_loop = True - combinations = optimizer.combs_unordered_no_putting_back(len(stations), - len(list_greedy_sets[ - group_nr])) + combinations = station_optimization.combs_unordered_no_putting_back(len(stations), + len( + list_greedy_sets[ + group_nr])) if node_choice == "brute": choice_func = self.choose_station_brute else: @@ -157,13 +165,27 @@ def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): return self.electrified_stations, self.electrified_station_set + def get_negative_rotations_all_electrified(self, rel_soc=False): + """Get the rotation ids for the rotations which show negative socs, even when everything + is electrified""" + + events = get_low_soc_events(self, rel_soc=rel_soc) + + stats = {stat for event in events for stat in event.stations_list + if stat not in self.not_possible_stations} + electrified_station_set = set(stats) + vehicle_socs = self.timeseries_calc() + new_events = get_low_soc_events(self, soc_data=vehicle_socs) + return [event.rotation.id for event in new_events] + def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, - tree_position=None, **kwargs): + tree_position=None, pre_optimized_set=None, **kwargs): """ Optimize a single group events :return (electrified_stations if optimization continues, None if no further recursive calls should happen, bool if further deep analysis should take place) :rtype (dict() or None, bool) """ + could_not_be_electrified = self.could_not_be_electrified # in deep analysis not all nodes are visited if they are suboptimal. @@ -172,7 +194,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if not track_not_possible_rots: could_not_be_electrified = set() - solver = kwargs.get("solver", "spiceev") + solver = self.config.solver if not tree_position: tree_position = [] @@ -180,150 +202,216 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # give tree position self.logger.debug("%s with length of %s", tree_position, len(tree_position)) - # Unpack events and possible stations + # unpack events and possible stations event_group, _ = group - # Get the events which are still negative + # get the events which are still negative events_remaining = kwargs.get("events_remaining", [99999]) - # Copy Scen and sched - new_scen = copy(self.base_scenario) - new_sched = copy(self.base_schedule) + kwargs["lifted_socs"] = kwargs.get("lifted_socs", self.scenario.vehicle_socs) - # Get rotations from event dict and calculate the missing energy - rotation_dict = {e["rotation"].id: e["rotation"] for e in event_group} + # evaluate with current scenario and schedule and lifted values from the + # call above. Important not to use the scenario in optimizer, since it gets overwritten + # every call and only relevant trips are adjusted. This leads to problems + # when the recursive call goes on a higher level eg. level 0 - level 1 - level 2 - level 1 + station_eval = evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) + + # get rotations from event dict and calculate the missing energy + rotation_dict = {e.rotation.id: e.rotation for e in event_group} missing_energy = get_missing_energy(event_group) if missing_energy >= 0: self.logger.debug("Already electrified: Returning") return self.electrified_stations, True - station_eval = evaluate(event_group, new_scen, soc_curve_dict, - kwargs) - - - # Get the best stations, brute or step_by_step - best_station_ids, recursive = choose_station_function(station_eval, electrified_station_set, - pre_optimized_set, decision_tree, + # get the best stations, brute or step_by_step + best_station_ids, recursive = choose_station_function(station_eval, missing_energy=missing_energy) - stat_eval_dict = {stat_id[0]: stat_id[1]["pot_sum"] for stat_id in station_eval} + + stat_eval_dict = {stat_id[0]: stat_id[1] for stat_id in station_eval} if best_station_ids is None: - LOGGER.warning("No useful station found with %s rotations not electrified yet. " - "Stopped after electrifying %s", events_remaining, - len(electrified_station_set)) + self.logger.warning("No useful station found with %s rotations not electrified yet. " + "Stopped after electrifying %s", events_remaining, + len(self.electrified_station_set)) if pre_optimized_set is None: could_not_be_electrified.update(list(rotation_dict.keys())) return None, False - # Remove electrified stations in this run - copied_set = electrified_station_set.copy() + # remove electrified stations in this run + copied_set = self.electrified_station_set.copy() for stat in copied_set: - electrified_stations.pop(stat) - electrified_station_set.remove(stat) - # Overwrite with preoptimized set + self.electrified_stations.pop(stat) + self.electrified_station_set.remove(stat) + # overwrite with preoptimized set for stat in pre_optimized_set: self.electrify_station(stat, self.electrified_station_set) return None, False - LOGGER.debug("%s, with first pot of %s", best_station_ids, - stat_eval_dict[best_station_ids[0]]) + self.logger.debug("%s, with first pot of %s", best_station_ids, + stat_eval_dict[best_station_ids[0]]) - # Electrify station(s) + # electrify station(s) for stat_id in best_station_ids: self.electrify_station(stat_id, self.electrified_station_set) - event_rotations = {x["rotation"] for x in event_group} + event_rotations = {event.rotation for event in event_group} + + # copy Scen and sched + self.scenario = copy(self.base_scenario) + self.schedule = copy(self.base_schedule) + if solver == "quick": - # Quick calculation has to electrify everything in one step, + # quick calculation has to electrify everything in one step, # or the lifting of socs is not correct - new_scen.vehicle_socs = deepcopy(base_socs) - new_scen.vehicle_socs = timeseries_calc(event_rotations, - new_scen.vehicle_socs, - new_scen, electrified_station_set, - soc_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps, - electrify_stations=best_station_ids[0]) + self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) + self.scenario.vehicle_socs = self.timeseries_calc(event_rotations, + electrify_stations=best_station_ids) else: - new_sched.rotations = rotation_dict - new_sched, new_scen = run_schedule(new_sched, ARGS, - electrified_stations=electrified_stations) + self.schedule.rotations = rotation_dict + self.schedule, self.scenario = station_optimization.run_schedule(self.schedule, + self.args, + electrified_stations=self.electrified_stations) - not_possible_stations = set(electrified_stations.keys()).union(not_possible_stations) - event_rotations_ids = {event["rotation"].id for event in event_group} - new_events = get_low_soc_events(new_scen, - new_sched, rotations=event_rotations_ids, - not_possible_stations=not_possible_stations, rel_soc=True, - **kwargs) + kwargs["lifted_socs"] = self.scenario.vehicle_socs.copy() - delta_energy = get_missing_energy(new_events) + self.not_possible_stations = set(self.electrified_stations.keys()).union( + self.not_possible_stations) + event_rotations_ids = {event.rotation.id for event in event_group} + new_events = get_low_soc_events(self, rotations=event_rotations_ids, + rel_soc=True, **kwargs) + delta_energy = get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) - LOGGER.debug("Last electrification electrified %s/%s." - " %s remaining events in the base group.", - len(event_group) - len(new_events), len(event_group), events_remaining[0]) + self.logger.debug("Last electrification electrified %s/%s." + " %s remaining events in the base group.", + len(event_group) - len(new_events), len(event_group), events_remaining[0]) delta_base_energy = delta_energy # get_missing_energy(base_events) - # Put this node intro the decision tree including the missing energy - if decision_tree is not None: - decision_tree = node_to_tree(decision_tree, electrified_station_set, delta_base_energy) + # put this node intro the decision tree including the missing energy + self.node_to_tree(delta_base_energy) - # Everything electrified + # everything electrified if delta_energy >= 0: - return electrified_stations, True - # Some choice functions might not need a recursive call, they return here. recursive is set + return self.electrified_stations, True + # some choice functions might not need a recursive call, they return here. recursive is set # by the choose_station_function if not recursive: return None, True - # Check if the events can be divided into subgroups which are independent - groups = get_groups_from_events(new_events, not_possible_stations, could_not_be_electrified) + # check if the events can be divided into subgroups which are independent + groups = get_groups_from_events(new_events, self.not_possible_stations, + could_not_be_electrified, + optimizer=self) for k, this_group in enumerate(groups): this_tree = tree_position.copy() this_tree.append(k) - new_stations, _ = group_optimization(this_group, new_scen, new_sched, - electrified_stations, - electrified_station_set, - could_not_be_electrified, - not_possible_stations, choose_station_function, - soc_curve_dict, - pre_optimized_set, decision_tree, - tree_position=this_tree, - **kwargs) + # self, group, choose_station_function, track_not_possible_rots = True, + # tree_position = None, pre_optimized_set = None, ** kwargs): + # + new_stations, _ = self.group_optimization(this_group, choose_station_function, + track_not_possible_rots=track_not_possible_rots, + pre_optimized_set=pre_optimized_set, + tree_position=this_tree, + **kwargs) if new_stations is not None: - electrified_stations.update(new_stations) + self.electrified_stations.update(new_stations) else: return None, True - # If there is no pre optimized set function can return + # if there is no pre optimized set function can return if pre_optimized_set is None: - return electrified_stations, True + continue - # If there is a preoptimized set check if the preoptimized set leads to pruning + # if there is a preoptimized set check if the preoptimized set leads to pruning # i.e. if if following branch makes sense - if len(pre_optimized_set) - len(electrified_station_set) < 10: - new_scen.vehicle_socs = timeseries_calc(event_rotations, - new_scen.vehicle_socs, - new_scen, electrified_station_set, - soc_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps, - electrify_stations=best_station_ids[0]) - - prune_events = get_low_soc_events(new_scen, new_sched, - rotations=event_rotations_ids, - not_possible_stations=not_possible_stations, + if len(pre_optimized_set) - len(self.electrified_station_set) < 10: + self.scenario.vehicle_socs = self.timeseries_calc(event_rotations, + electrify_stations= + best_station_ids) + + prune_events = get_low_soc_events(self, rotations=event_rotations_ids, rel_soc=True, **kwargs) - station_eval = evaluate(prune_events, new_scen, soc_curve_dict) + station_eval = evaluate(prune_events, self) prune_missing_energy = get_missing_energy(prune_events) - if not is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, prune_missing_energy): - print("Branch pruned early") - is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, missing_energy) + if not self.is_branch_promising(station_eval, self.electrified_station_set, + pre_optimized_set, prune_missing_energy): + self.logger.debug("Branch pruned early") return None, True + return self.electrified_stations, True + + def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, + soc_upper_thresh=None, electrify_stations=None) -> object: + """ A quick estimation of socs by mutating the soc data accordingly + :return soc dict + :rtype dict() + """ + if not rotations: + rotations = self.schedule.rotations.values() + + if not soc_dict: + soc_dict = self.scenario.vehicle_socs + if not ele_station_set: + ele_station_set = self.electrified_station_set + if not soc_upper_thresh: + soc_upper_thresh = self.args.desired_soc_deps + if not electrify_stations: + electrify_stations = set() + + if not electrify_stations: + electrify_stations = set() + ele_stations = {*ele_station_set, *electrify_stations} + soc_dict = copy(soc_dict) + + print("Calc with ", ele_stations) + + for rot in rotations: + ch_type = (rot.vehicle_id.find("oppb") > 0) * "oppb" + ( + rot.vehicle_id.find("depb") > 0) * "depb" + v_type = rot.vehicle_id.split("_" + ch_type)[0] + soc_over_time_curve = self.soc_charge_curve_dict[v_type][ch_type] + soc = soc_dict[rot.vehicle_id] + for i, trip in enumerate(rot.trips): + if trip.arrival_name not in ele_stations: + continue + idx = get_index_by_time(self.scenario, trip.arrival_time) + try: + standing_time_min = get_charging_time(trip, rot.trips[i + 1], self.args) + except IndexError: + standing_time_min = 0 + + d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min, self) + buffer_idx = int((get_buffer_time(trip, self.args.default_buffer_time_opps)) + / timedelta(minutes=1)) + delta_idx = int(standing_time_min) + 1 + old_soc = soc[idx + buffer_idx:idx + buffer_idx + delta_idx].copy() + soc[idx + buffer_idx:] += d_soc + soc[idx + buffer_idx:idx + buffer_idx + delta_idx] = old_soc + soc[idx + buffer_idx:idx + buffer_idx + delta_idx] += np.linspace(0, d_soc, + delta_idx) + + soc_pre = soc[:idx] + soc = soc[idx:] + soc_max = np.max(soc) + while soc_max > soc_upper_thresh: + desc = np.arange(len(soc), 0, -1) + diff = np.hstack((np.diff(soc), -1)) + # masking of socs >1 and negative gradient for local maximum + idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) + + soc_max = soc[idc_loc_max] + # Reducing everything after local maximum + soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) + + # Capping everything before local maximum + soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 + soc_max = np.max(soc) + soc = np.hstack((soc_pre, soc)) + soc_dict[rot.vehicle_id] = soc + return soc_dict def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): @@ -334,14 +422,30 @@ def is_branch_promising(self, station_eval, electrified_station_set, delta = len(pre_optimized_set) - len(electrified_station_set) pot = 0 for i in range(0, min(delta, len(station_eval))): - pot += station_eval[i][1]["pot_sum"] + pot += station_eval[i] if pot < -missing_energy * self.config.estimation_threshold: print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", stations_hash(electrified_station_set)) return False return True - def choose_station_brute(self, station_eval, electrified_station_set, + def node_to_tree(self, delta_base_energy): + """ Fill decision tree with the given info + :return decision tree + :rtype dict() + """ + node_name = stations_hash(self.electrified_station_set) + try: + self.decision_tree[node_name]["missing_energy"] = delta_base_energy + self.decision_tree[node_name]["visit_counter"] += 1 + # todo add is_viable + self.logger.debug("already visited") + except KeyError: + self.decision_tree[node_name] = {} + self.decision_tree[node_name]["missing_energy"] = delta_base_energy + self.decision_tree[node_name]["visit_counter"] = 1 + + def choose_station_brute(self, station_eval, pre_optimized_set=None, decision_tree=None, missing_energy=0, gens=dict()): """ Gives back a possible set of Stations to electrify which shows potential and hasnt been @@ -361,12 +465,12 @@ def choose_station_brute(self, station_eval, electrified_station_set, # the missing energy # potential>missing energy * 80% potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) - if potential > -missing_energy * CONFIG.estimation_threshold: + if potential > -missing_energy * self.config.estimation_threshold: return comb, False else: - LOGGER.debug("skipped %s since potential is too low %s %%", comb, - round(potential / -missing_energy * 100, 0)) - LOGGER.debug("calculated all viable possibilities") + self.logger.debug("skipped %s since potential is too low %s %%", comb, + round(potential / -missing_energy * 100, 0)) + self.logger.debug("calculated all viable possibilities") return None, False def choose_station_step_by_step(self, station_eval, @@ -382,25 +486,26 @@ def choose_station_step_by_step(self, station_eval, # return pre_optimized_set # Potentials have to be at least as promising as the pre-optimized case if pre_optimized_set is not None: - if not is_branch_promising(station_eval, electrified_station_set, - pre_optimized_set, missing_energy): + if not self.is_branch_promising(station_eval, self.electrified_station_set, + pre_optimized_set, missing_energy): # Best station id is none and dont go deeper in recursion return None, False min_count_visited = float('inf') - for station in station_eval: + for stat_tuple in station_eval: + station, pot = stat_tuple # Create a station combination from already electrified stations and possible new station - check_stations = electrified_station_set.union([station[0]]) + check_stations = self.electrified_station_set.union([station]) - if decision_tree is not None: + if self.decision_tree is not None: node_name = stations_hash(check_stations) - if node_name in decision_tree.keys(): + if node_name in self.decision_tree.keys(): min_count_visited = min(min_count_visited, - decision_tree[node_name]["visit_counter"]) + self.decision_tree[node_name]["visit_counter"]) # If already checked skip to next one continue - if station[0] not in electrified_station_set: - best_station_id = station[0] + if station not in self.electrified_station_set: + best_station_id = station return [best_station_id], True else: # Every possible node from here was evaluated already @@ -409,10 +514,10 @@ def choose_station_step_by_step(self, station_eval, for station in station_eval: # Create a station combination from already electrified stations # and possible new station - check_stations = electrified_station_set.union([station[0]]) - if decision_tree[stations_hash(check_stations)][ + check_stations = self.electrified_station_set.union([station]) + if self.decision_tree[stations_hash(check_stations)][ "visit_counter"] == min_count_visited: - best_station_id = station[0] + best_station_id = station return [best_station_id], True return None, True @@ -476,9 +581,9 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, r not in self.config.exclusion_rots} self.schedule.rotations = rots - new_sched, new_scen = optimizer.run_schedule(self.schedule, self.args, - self.electrified_stations, - cost_calc=cost_calc) + new_sched, new_scen = station_optimization.run_schedule(self.schedule, self.args, + self.electrified_stations, + cost_calc=cost_calc) report.generate(new_sched, new_scen, self.args) self.schedule = new_sched self.scenario = new_scen @@ -508,41 +613,34 @@ def get_must_stations_and_rebase(self, relative_soc=False): """Electrify everything minus 1 station. If without the stations there are below zero events it is a must have station""" - events = self.get_low_soc_events(rel_soc=relative_soc) + events = get_low_soc_events(self, rel_soc=relative_soc) - stats = {station for event in events for station in event["stations_list"] + stats = {station for event in events for station in event.stations_list if station not in self.not_possible_stations} electrified_station_set_all = set(stats) must_stations = set() + print(f"Electrifiying {len(electrified_station_set_all)} stations minus one", ) for station in electrified_station_set_all: - self.logger.debug(".", end="") electrified_station_set = electrified_station_set_all.difference([station]) - vehicle_socs = optimizer. \ - timeseries_calc(self.schedule.rotations.values(), - self.scenario.vehicle_socs, - self.scenario, electrified_station_set, - soc_charge_curve_dict=self.soc_charge_curve_dict, - soc_upper_thresh=self.args.desired_soc_deps) - + vehicle_socs = self.timeseries_calc(ele_station_set=electrified_station_set) + soc_min = 1 for rot in self.schedule.rotations: soc, start, end = self.get_rotation_soc(rot, vehicle_socs) - if np.min(soc[start:end]) < self.config.min_soc: - self.logger.debug("%s , with min soc: %s", station, np.min(soc[start:end])) + + soc_min = min(np.min(soc[start:end]), soc_min) + if soc_min < self.config.min_soc: must_stations.add(station) - break + self.logger.debug("%s , with min soc: %s", station, soc_min) + self.not_possible_stations = self.not_possible_stations.union(must_stations) # rebasing for stat in must_stations: # dont put must stations in electrified set, but in extra set must_include_set self.electrify_station(stat, self.must_include_set) - self.scenario.vehicle_socs = optimizer. \ - timeseries_calc(self.schedule.rotations.values(), - self.scenario.vehicle_socs, - self.scenario, must_stations, - soc_charge_curve_dict=self.soc_charge_curve_dict, - soc_upper_thresh=self.args.desired_soc_deps) + + self.scenario.vehicle_socs = self.timeseries_calc(ele_station_set=must_stations) return must_stations def remove_none_socs(self): @@ -563,7 +661,6 @@ def remove_none_socs(self): soc[soc == np.array(None)] = last_not_none self.scenario.vehicle_socs[v_id] = soc - def get_rotation_soc(self, rot_id, soc_data: dict = None): rot = self.schedule.rotations[rot_id] rot_start_idx = self.get_index_by_time(rot.departure_time) @@ -574,15 +671,15 @@ def get_rotation_soc(self, rot_id, soc_data: dict = None): def get_index_by_time(self, search_time): start_time = self.scenario.start_time - delta_time = timedelta(minutes=60 / self.scenarioc.stepsPerHour) + delta_time = timedelta(minutes=60 / self.scenario.stepsPerHour) idx = (search_time - start_time) // delta_time return idx def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): # return trips in a rotation from a start to an end index, if the arrival time is in between # the start and end idx - start_time_event = self.get_time_by_index(start_idx, self.scenario) - end_time_event = self.get_time_by_index(end_idx, self.scenario) + start_time_event = self.get_time_by_index(start_idx) + end_time_event = self.get_time_by_index(end_idx) trips = [] for i, trip in enumerate(rot.trips): @@ -598,23 +695,6 @@ def get_time_by_index(self, idx): return searched_time - - - - - - -def toolbox_from_pickle(sched_name, scen_name, args_name): - """ Load the 3 files from pickle""" - with open(args_name, "rb") as f: - this_args = pickle.load(f) - with open(scen_name, "rb") as f: - scen = pickle.load(f) - with open(sched_name, "rb") as f: - sched = pickle.load(f) - return sched, scen, this_args - - def toolbox_to_pickle(name, sched, scen, this_args): """ Dump the 3 files to pickle files""" args_name = "args_" + name + ".pickle" @@ -660,10 +740,32 @@ def get_missing_energy(events): """ Sum up all the missing energies of the given events""" missing_energy = 0 for event in events: - missing_energy += event["min_soc"] * event["capacity"] + missing_energy += event.min_soc * event.capacity return missing_energy def stations_hash(stations_set): """ Create a simple str as hash for a set of stations""" return str(sorted(list(stations_set))) + + +def combination_generator(iterable: typing.Iterable, amount: int): + """ Generator which yields all possible combinations of choosing + an amount out of an iterable without putting them back and without caring about the + order of elements + :param iterable: Any collection which can be cast to a list + :param amount: Number of elements which should be drawn from iterable + :type amount: int + """ + iterable = list(iterable) + + for i, item in enumerate(iterable): + # Recursive calling of generator with clock like behavior, e.g right-most item changes until + # end of list is reached. This leads to a change in the item left to it and so on. Elements + # on the right can only change to a subset of bigger indices than their left counter-part. + # This is due to the ignoring of order, which reduces the amount of possibilities. + if amount <= 1: + yield [item] + else: + for gen in combination_generator(iterable[i + 1:], amount - 1): + yield [item] + gen diff --git a/ebus_toolbox/optimizer.py b/ebus_toolbox/station_optimization.py similarity index 50% rename from ebus_toolbox/optimizer.py rename to ebus_toolbox/station_optimization.py index a91387b5..82f00422 100644 --- a/ebus_toolbox/optimizer.py +++ b/ebus_toolbox/station_optimization.py @@ -7,7 +7,7 @@ import sys import warnings import pickle -from copy import copy, deepcopy +from copy import copy from pathlib import Path from time import time import logging @@ -16,12 +16,12 @@ import numpy as np import matplotlib import matplotlib.pyplot as plt -import report -from ebus_toolbox.schedule_optimizer import ScheduleOptimizer + + +import ebus_toolbox.schedule_optimizer +from ebus_toolbox.low_soc_events import get_low_soc_events, get_delta_soc from src import scenario -import schedule -import rotation -from optimizer_config import read_config, OptimizerConfig + from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip from ebus_toolbox.costs import calculate_costs @@ -62,6 +62,7 @@ def decorated_function(*this_args, **kwargs): sorted_timer = dict(sorted(timers.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) return sorted_timer + def setup_logger(): """ setup file and stream logging by config and args arguments :return: logger @@ -163,11 +164,10 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # needed. del ARGS.save_timeseries del ARGS.save_results - if ARGS.desired_soc_deps != 1 and CONFIG.opt_type=="quick": + if ARGS.desired_soc_deps != 1 and CONFIG.opt_type == "quick": LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") - optimizer = ScheduleOptimizer(sched, scen, ARGS, CONFIG, LOGGER) - + optimizer = ebus_toolbox.schedule_optimizer.ScheduleOptimizer(sched, scen, ARGS, CONFIG, LOGGER) remove_impossible_rots = CONFIG.remove_impossible_rots # set battery and charging curves through config file if wished for @@ -176,16 +176,15 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # create a decision tree or load one from a previous run optimizer.set_up_decision_tree() - # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations if CONFIG.rebase_scenario: must_include_set, ele_stations = optimizer.rebase_spice_ev() else: must_include_set, ele_stations = optimizer.rebase_simple() - # create charging dicts which contain soc over time, which is numerically calculated - soc_charge_curve_dict = optimizer.create_charging_curves(sched) + # create charging dicts which contain soc over time, which is numerically calculated + optimizer.create_charging_curves() # Remove none Values from socs in the vehicle_socs an optimizer.remove_none_socs() @@ -197,95 +196,37 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): LOGGER.debug("Starting greedy optimization") ele_station_set = set() print_time() - ele_stations, ele_station_set, could_not_be_electrified, list_greedy_sets =\ - \ - optimization_loop(ele_stations, ele_station_set, scen, sched, - not_possible_stations, soc_upper_thresh=ARGS.desired_soc_opps, - soc_lower_thresh=CONFIG.min_soc, - solver=CONFIG.solver, opt_type=CONFIG.opt_type, - node_choice=CONFIG.node_choice, - soc_charge_curve_dict=soc_charge_curve_dict, - decision_tree=decision_tree) + ele_stations, ele_station_set = optimizer.loop() + print_time() ele_station_set = ele_station_set.union(must_include_set) LOGGER.debug("Functions took these times in seconds") LOGGER.debug("%s Stations : %s", len(ele_station_set), ele_station_set) - LOGGER.debug(could_not_be_electrified) - scen.vehicle_socs = timeseries_calc(sched.rotations.values(), - scen.vehicle_socs, - scen, ele_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps) - new_events = get_low_soc_events(scen, sched) + LOGGER.debug(optimizer.could_not_be_electrified) + + scen.vehicle_socs = optimizer.timeseries_calc() + + new_events = get_low_soc_events(optimizer, soc_data=scen.vehicle_socs) + if len(new_events) > 0: - LOGGER.debug("Still not electrified with fast calc") + LOGGER.debug("Still not electrified with abs. soc with fast calc") for event in new_events: - LOGGER.debug(event["rotation"].id) + LOGGER.debug(event.rotation.id) LOGGER.debug("#####") with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) LOGGER.debug("Spice EV is calculating optimized case as a complete scenario") - final_sched, final_scen, ele_station_set, ele_stations = preprocessing_scenario( - sched, scen, ARGS, electrified_stations=ele_stations, run_only_neg=False, - electrified_station_set=ele_station_set, cost_calc=True) + final_sched, final_scen, ele_station_set, ele_stations = optimizer.preprocessing_scenario( + electrified_stations=ele_stations, run_only_neg=False, cost_calc=True) LOGGER.warning("Still negative rotations: %s", final_sched.get_negative_rotations(final_scen)) print("Finished") return final_sched, final_scen - - - -@time_it -def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None): - """ First create simple list of station sets for single events. - #Electrified and other not possible to electrify stations should not connect groups""" - - # Making sure default arguments are none and not mutable - if not not_possible_stations: - not_possible_stations = set() - - if not could_not_be_electrified: - could_not_be_electrified = set() - - possible_stations = [ - {station for station in event["stations"] if station not in not_possible_stations} - for event - in events] - # If stations overlap join them - station_subsets = join_all_subsets(possible_stations) - event_groups = [[] for __ in range(len(station_subsets))] - - # Group the events in the same manner as stations, so that the same amount of event groups are - # created as station subsets - for event in events: - for i, subset in enumerate(station_subsets): - # Every station from an event must share the same station sub_set. Therefore its enough - # to check only the first element - if len(event["stations"]) > 0: - if next(iter(event["stations"])) in subset: - event_groups[i].append(event) - break - else: - LOGGER.warning('Didnt find rotation %sin any subset' - 'of possible electrifiable stations', event["rotation"].id) - # this event will no show up in an event_group. - # therefore it needs to be put into this set - could_not_be_electrified.update([event["rotation"].id]) - - groups = list(zip(event_groups, station_subsets)) - return sorted(groups, key=lambda x: len(x[1])) - - @time_it - - - - - def print_time(start=[]): """ Print the time and automatically set start time to the first time the function getting called""" @@ -295,52 +236,6 @@ def print_time(start=[]): @time_it -def node_to_tree(decision_tree, electrified_station_set, delta_base_energy): - """ Fill decision tree with the given info - :return decision tree - :rtype dict() - """ - node_name = stations_hash(electrified_station_set) - try: - decision_tree[node_name]["missing_energy"] = delta_base_energy - decision_tree[node_name]["visit_counter"] += 1 - # todo add is_viable - LOGGER.debug("already visited") - except KeyError: - decision_tree[node_name] = {} - decision_tree[node_name]["missing_energy"] = delta_base_energy - decision_tree[node_name]["visit_counter"] = 1 - - return decision_tree - - -@time_it - - - -@time_it -def combination_generator(iterable, amount: int): - """ Generator which yields all possible combinations of choosing - an amount out of an iterable without putting them back and without caring about the - order of elements - :param iterable: Any collection which can be cast to a list - :param amount: Number of elements which should be drawn from iterable - :type amount: int - """ - iterable = list(iterable) - - for i, item in enumerate(iterable): - # Recursive calling of generator with clock like behavior, e.g right-most item changes until - # end of list is reached. This leads to a change in the item left to it and so on. Elements - # on the right can only change to a subset of bigger indicies than their left counter-part. - # This is due to the ignoring of order, which reduces the amount of possibilities. - if amount <= 1: - yield [item] - else: - for gen in combination_generator(iterable[i + 1:], amount - 1): - yield [item] + gen - - def plot_(data): """ Simple plot of data without having to create subplots""" fig, ax = plt.subplots() @@ -361,75 +256,6 @@ def plot_rot(rot_id, this_sched, this_scen, ax=None, rot_only=True): ax.plot(soc[start:end], linewidth=2.0) return ax - -def join_all_subsets(subsets): - """ join sets for as long as needed until no elements share any intersections""" - joined_subset = True - while joined_subset: - joined_subset, subsets = join_subsets(subsets) - return subsets - - - - -@time_it -def timeseries_calc(rotations, soc_dict, eval_scen, ele_station_set, - soc_charge_curve_dict, soc_upper_thresh=1, electrify_stations=None): - """ A quick estimation of socs by mutating the soc data accordingly - :return soc dict - :rtype dict() - """ - if not electrify_stations: - electrify_stations=set() - ele_stations = {*ele_station_set, electrify_stations} - soc_dict = copy(soc_dict) - - for rot in rotations: - ch_type = (rot.vehicle_id.find("oppb") > 0) * "oppb" + ( - rot.vehicle_id.find("depb") > 0) * "depb" - v_type = rot.vehicle_id.split("_" + ch_type)[0] - soc_over_time_curve = soc_charge_curve_dict[v_type][ch_type] - soc = soc_dict[rot.vehicle_id] - for i, trip in enumerate(rot.trips): - if trip.arrival_name not in ele_stations: - continue - idx = get_index_by_time(trip.arrival_time, eval_scen) - try: - standing_time_min = get_charging_time(trip, rot.trips[i + 1], ARGS) - except IndexError: - standing_time_min = 0 - - d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min) - buffer_idx = int((get_buffer_time(trip)) / timedelta(minutes=1)) - delta_idx = int(standing_time_min) + 1 - old_soc = soc[idx + buffer_idx:idx + buffer_idx + delta_idx].copy() - soc[idx + buffer_idx:] += d_soc - soc[idx + buffer_idx:idx + buffer_idx + delta_idx] = old_soc - soc[idx + buffer_idx:idx + buffer_idx + delta_idx] += np.linspace(0, d_soc, delta_idx) - - soc_pre = soc[:idx] - soc = soc[idx:] - soc_max = np.max(soc) - while soc_max > soc_upper_thresh: - desc = np.arange(len(soc), 0, -1) - diff = np.hstack((np.diff(soc), -1)) - # masking of socs >1 and negative gradient for local maximum - idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) - - soc_max = soc[idc_loc_max] - # Reducing everything after local maximum - soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) - - # Capping everything before local maximum - soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 - soc_max = np.max(soc) - soc = np.hstack((soc_pre, soc)) - soc_dict[rot.vehicle_id] = soc - return soc_dict - - -@time_it - @time_it def get_charging_time(trip1, trip2, args): standing_time_min = (trip2.departure_time - trip1.arrival_time) \ @@ -442,21 +268,6 @@ def get_charging_time(trip1, trip2, args): return max(0, standing_time_min) -@time_it -def join_subsets(subsets): - subsets = [s.copy() for s in subsets] - for i in range(len(subsets)): - for ii in range(len(subsets)): - if i == ii: - continue - intersec = subsets[i].intersection(subsets[ii]) - if len(intersec) > 0: - subsets[i] = subsets[i].union(subsets[ii]) - subsets.remove(subsets[ii]) - return True, subsets - return False, subsets - - @time_it def get_index_by_time(search_time, this_scen: scenario.Scenario): start_time = this_scen.start_time @@ -465,7 +276,6 @@ def get_index_by_time(search_time, this_scen: scenario.Scenario): return idx - @time_it def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): rot = this_sched.rotations[rot_id] @@ -478,10 +288,9 @@ def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): @time_it def preprocess_schedule(this_sched, this_args, electrified_stations=None): - Trip.consumption = Consumption(this_sched.vehicle_types, - outside_temperatures=ARGS.outside_temperature_over_day_path, - level_of_loading_over_day=ARGS.level_of_loading_over_day_path) + outside_temperatures=this_args.outside_temperature_over_day_path, + level_of_loading_over_day=this_args.level_of_loading_over_day_path) this_sched.stations = electrified_stations this_sched.calculate_consumption() @@ -504,15 +313,15 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal warnings.simplefilter('ignore', UserWarning) new_scen.run('distributed', vars(this_args).copy()) sys.stdout = sys.__stdout__ - if ARGS.cost_calculation and cost_calc: + if this_args.cost_calculation and cost_calc: # cost calculation following directly after simulation try: - with open(ARGS.cost_parameters_file, encoding='utf-8') as f: + with open(this_args.cost_parameters_file, encoding='utf-8') as f: cost_parameters_file = uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to cost parameters ({ARGS.cost_parameters_file}) " "does not exist. Exiting...") - calculate_costs(cost_parameters_file, new_scen, this_sched2, ARGS) + calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) return this_sched2, new_scen @@ -543,10 +352,6 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_gr return np.array((times, socs)).T -@time_it - - - @time_it def get_buffer_time(trip): """ Return the buffer time as timedelta object""" @@ -572,8 +377,6 @@ def combs_unordered_no_putting_back(n: int, k: int): @time_it - - def get_vehicle(rot_id, this_sched): return this_sched.rotations[rot_id].vehicle_id @@ -581,11 +384,6 @@ def get_vehicle(rot_id, this_sched): def get_vehicle_rots(rot_id, this_sched): return [rot for rot in this_sched.rotations if rot_id == get_vehicle(rot, this_sched)] - - - - -@time_it def toolbox_from_pickle(sched_name, scen_name, args_name): """ Load the 3 files from pickle""" with open(args_name, "rb") as f: @@ -596,95 +394,5 @@ def toolbox_from_pickle(sched_name, scen_name, args_name): sched = pickle.load(f) return sched, scen, this_args - -@time_it -def toolbox_to_pickle(name, sched, scen, this_args): - """ Dump the 3 files to pickle files""" - args_name = "args_" + name + ".pickle" - with open(args_name, "wb") as f: - pickle.dump(this_args, f) - scen_name = "scenario_" + name + ".pickle" - with open(scen_name, "wb") as f: - pickle.dump(scen, f) - sched_name = "schedule_" + name + ".pickle" - with open(sched_name, "wb") as f: - pickle.dump(sched, f) - return sched_name, scen_name, args_name - - -@time_it -def get_negative_rotations_all_electrified(this_scen, this_sched, soc_upper_thresh, - soc_charge_curve_dict, - not_possible_stations=None, rel_soc=False): - """Get the rotation ids for the rotations which show negative socs, even when everything - is electrified""" - if not not_possible_stations: - not_possible_stations = set() - - events = get_low_soc_events(this_scen=this_scen, this_sched=this_sched, - soc_upper_thresh=soc_upper_thresh, - not_possible_stations=not_possible_stations, rel_soc=rel_soc) - - stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} - electrified_station_set = set(stats) - vehicle_socs = timeseries_calc(this_sched.rotations.values(), - this_scen.vehicle_socs, this_scen, electrified_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps) - new_events = get_low_soc_events(this_scen, this_sched, soc_data=vehicle_socs) - return [e["rotation"].id for e in new_events] - - -def create_charging_curves(this_sched): - """Cycle through vehicles and create numerically created charging curves with energy supplied - over time""" - soc_charge_curve_dict = dict() - for v_type_name in this_sched.vehicle_types: - soc_charge_curve_dict[v_type_name] = dict() - for name, v_type in this_sched.vehicle_types.items(): - for ch_type, data in v_type.items(): - soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( - data["charging_curve"], data["capacity"], - this_sched.cs_power_opps, efficiency=CONFIG.charge_eff, - time_step=0.1) - return soc_charge_curve_dict - - -@time_it -def get_must_stations(this_scen, this_sched, soc_charge_curve_dict, - not_possible_stations=None, - relative_soc=False, **kwargs): - """Electrify everything minus 1 station. If without the stations there are below zero events - it is a must have station""" - - soc_lower_thresh = kwargs.get("soc_lower_thresh", CONFIG.min_soc) - events = get_low_soc_events(this_scen=this_scen, this_sched=this_sched, - not_possible_stations=not_possible_stations, rel_soc=relative_soc) - - if not not_possible_stations: - not_possible_stations = set() - stats = {s for e in events for s in e["stations_list"] if s not in not_possible_stations} - electrified_station_set_all = set(stats) - - must_stations = set() - for station in electrified_station_set_all: - print(".", end="") - electrified_station_set = electrified_station_set_all.difference([station]) - vehicle_socs = timeseries_calc(this_sched.rotations.values(), - this_scen.vehicle_socs, - this_scen, electrified_station_set, - soc_charge_curve_dict=soc_charge_curve_dict, - soc_upper_thresh=ARGS.desired_soc_deps) - - for rot in this_sched.rotations: - soc, start, end = get_rotation_soc(rot, this_sched, this_scen, vehicle_socs) - if np.min(soc[start:end]) < soc_lower_thresh: - LOGGER.debug("%s , with min soc: %s", station, np.min(soc[start:end])) - must_stations.add(station) - break - - return must_stations - - if __name__ == "__main__": main() From 74e16120f69329841ec0ba1d87e230b69a0a1419 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 21 Dec 2022 10:52:38 +0100 Subject: [PATCH 419/802] Make flake8 happy and sphinx for low_soc_events --- ebus_toolbox/low_soc_events.py | 166 ++++++++++++------ ebus_toolbox/station_optimization.py | 4 +- ...dule_optimizer.py => station_optimizer.py} | 2 +- 3 files changed, 114 insertions(+), 58 deletions(-) rename ebus_toolbox/{schedule_optimizer.py => station_optimizer.py} (99%) diff --git a/ebus_toolbox/low_soc_events.py b/ebus_toolbox/low_soc_events.py index 0a02a3fe..2d69074e 100644 --- a/ebus_toolbox/low_soc_events.py +++ b/ebus_toolbox/low_soc_events.py @@ -1,13 +1,17 @@ +""" Module for the class LowSocEvent which gathers functionality around +LowSocEvents, like evaluating them, gathering them and so on""" + import typing from datetime import timedelta -from ebus_toolbox.util import uncomment_json_file, get_buffer_time as get_buffer_time_spice_ev +from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev + class LowSocEvent: - event_counter=0 + event_counter = 0 + def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rotation, - stations_list, - capacity, v_type, ch_type,soc_curve): + stations_list, capacity, v_type, ch_type, soc_curve): self.start_idx = start_idx self.end_idx = end_idx self.min_soc = min_soc @@ -19,13 +23,28 @@ def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rota self.capacity = capacity self.v_type = v_type self.ch_type = ch_type - self.event_counter=LowSocEvent.event_counter + self.event_counter = LowSocEvent.event_counter LowSocEvent.event_counter += 1 - self.soc_curve=soc_curve def get_low_soc_events(optimizer, rotations=None, filter_standing_time=True, rel_soc=False, soc_data=None, **kwargs): + """ Gather low soc events below the config threshold. + + :param optimizer: StationOptimizer which defines the search conditions as well as + the scenario and schedule + :param rotations: rotations to be searched for low soc events. Default None means whole + schedule is searched + :param filter_standing_time: Should the stations be filtered by standing time. True leads to + an output only stations with charging potential + :param rel_soc: Defines if the start soc should be seen as full even when not. If the rel_soc + is false, it means coupled rotations might be prone to errors due to impossible lifts. + :param soc_data: soc data to be used. Default None means the soc data from the optimizer + scenario is used + :param kwargs: optional soc_lower_tresh or soc_upper_thresh if from optimizer differing values + should be used + :return: list(LowSocEvents) + """ if not rotations: rotations = optimizer.schedule.rotations @@ -58,7 +77,7 @@ def get_low_soc_events(optimizer, rotations=None, filter_standing_time=True, if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 while min_soc < soc_lower_thresh_cur: - if LowSocEvent.event_counter==235: + if LowSocEvent.event_counter == 235: print(optimizer.scenario) i = min_idx idx = [x[1] for x in reduced_list] @@ -100,7 +119,7 @@ def get_low_soc_events(optimizer, rotations=None, filter_standing_time=True, rotation=rot, stations_list=possible_stations_list, capacity=optimizer.schedule.vehicle_types[v_type][ch_type][ 'capacity'], - v_type=v_type, ch_type=ch_type, soc_curve=soc[start:min_idx].copy()) + v_type=v_type, ch_type=ch_type) events.append(event) copy_list = reduced_list.copy() @@ -115,8 +134,14 @@ def get_low_soc_events(optimizer, rotations=None, filter_standing_time=True, def get_charging_time(trip1, trip2, args): - standing_time_min = (trip2.departure_time - trip1.arrival_time) \ - / timedelta(minutes=1) + """ Returns the charging time between trips as numeric value + + :param trip1: First trip + :param trip2: Following trip + :param args: arguments Namespace with default buffer time + :return: maximum possible charging time in minutes between trips + """ + standing_time_min = (trip2.departure_time - trip1.arrival_time) / timedelta(minutes=1) buffer_time = (get_buffer_time(trip1, args.default_buffer_time_opps) / timedelta(minutes=1)) standing_time_min -= buffer_time @@ -126,11 +151,20 @@ def get_charging_time(trip1, trip2, args): def get_buffer_time(trip, default_buffer_time_opps): - """ Return the buffer time as timedelta object""" + """ Return the buffer time as timedelta object + :param trip: trip object + :param default_buffer_time_opps: + :return: timedelta object for the buffer time + """ return timedelta(minutes=get_buffer_time_spice_ev(trip, default_buffer_time_opps)) def get_index_by_time(scenario, search_time): + """ Get the index for a given time + :param scenario: scenario object + :param search_time: search time as datetime object + :return: index as int + """ start_time = scenario.start_time delta_time = timedelta(minutes=60 / scenario.stepsPerHour) idx = (search_time - start_time) // delta_time @@ -138,7 +172,14 @@ def get_index_by_time(scenario, search_time): def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer): - """ get expected soc lift for a given start_soc and time_delta.""" + """get expected soc lift for a given start_soc and time_delta. + + :param soc_over_time_curve: + :param soc: + :param time_delta: + :param optimizer: + :return: + """ # units for time_delta and time_curve are assumed to be the same, e.g. minutes # first element which is bigger than current soc if time_delta == 0: @@ -159,64 +200,56 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer): def evaluate(events: typing.Iterable[LowSocEvent], optimizer, **kwargs): - """Analyse stations for "helpful" energy supply. Energy supply is helpful the minimal soc of an - event is raised up to a minimal soc (probably zero). The supplied energy is approximated by - loading power, standing time at a station, soc at station, minimal soc of the event""" + """Analyse stations for "helpful" energy supply. Energy supply is helpful if the minimal soc of + an event is raised (up to a minimal soc (probably zero)). The supplied energy is approximated + by loading power, standing time at a station, soc at station and minimal soc of the event + + :param events: events to be evaulated + :param optimizer: StationOptimizer object with scenario and schedule data + :param kwargs: optional overwriting of soc_lower_thresh, soc_upper_thresh or soc_data + :return: sorted list with the best station and its potential on index 0 + :rtype: list(str(station_id), float(potential)) + """ soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) soc_data = kwargs.get("soc_data", optimizer.scenario.vehicle_socs) - # electrified_station_set = kwargs.get("electrified_station_set", set()) - station_eval = {} - for event in events: - soc_over_time = optimizer.soc_charge_curve_dict[event.v_type][event.ch_type] - for i, trip in enumerate(event.trip): - # Station is only evaluated if station name is part of event stations - # Only these stations showed potential in electrification, e.g enough standing time - if trip.arrival_name not in event.stations: + # cycle through events and determine how much lift can be provided by electrifying a station + # the lift is determined by the soc position, standing time, power supply and charging curve + for e in events: + soc_over_time = optimizer.soc_charge_curve_dict[e.v_type][e.ch_type] + for i, trip in enumerate(e.trip): + # station is only evaluated if station name is part of event stations + # only these stations showed potential in electrification, e.g enough standing time + if trip.arrival_name not in e.stations: continue idx = get_index_by_time(optimizer.scenario, trip.arrival_time, ) - soc = soc_data[event.vehicle_id][idx] + soc = soc_data[e.vehicle_id][idx] - # Potential is the minimal amount of + # potential is the minimal amount of delta_soc_pot = min(soc_upper_thresh - soc, - soc_lower_thresh - event.min_soc, - soc - event.min_soc, + soc_lower_thresh - e.min_soc, + soc - e.min_soc, soc_upper_thresh - soc_lower_thresh) try: - standing_time_min = get_charging_time(trip, event.trip[i + 1], optimizer.args) + standing_time_min = get_charging_time(trip, e.trip[i + 1], optimizer.args) except IndexError: standing_time_min = 0 - # energy_charging_potential = standing_time_min *60 * ch_power - e_charging_pot = get_delta_soc(soc_over_time, soc, standing_time_min, optimizer) \ - * event.capacity + pot_kwh = get_delta_soc(soc_over_time, soc, standing_time_min, optimizer) * e.capacity - # Potential is at max the minimum between the useful delta soc * capacity or the + # potential is at max the minimum between the useful delta soc * capacity or the # energy provided by charging for the full standing time - delta_e_pot = min(delta_soc_pot * event.capacity, e_charging_pot) + delta_e_pot = min(delta_soc_pot * e.capacity, pot_kwh) try: station_eval[trip.arrival_name] += delta_e_pot except KeyError: station_eval[trip.arrival_name] = delta_e_pot - - # ToDo can get true potential from decision tree but is it necessary? - # # time_list = [] - # for station_name, stat_dict in station_eval.items(): - # if decision_tree is not None: - # check_stations = electrified_station_set.union(station_name) - # if check_stations in decision_tree.keys(): - # stat_dict["pot_sum"] = decision_tree[str(check_stations)]["missing_energy"] - \ - # decision_tree[str(electrified_station_set)]["missing_energy"] - # # decision_tree[str(electrified_station_set)]["children"].append(check_stations) - # continue - - # time_list.append(standing_time / timedelta(minutes=1)) - # Sort by pot_sum + # sort by pot_sum station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1])).items()) station_eval.reverse() return station_eval @@ -224,10 +257,21 @@ def evaluate(events: typing.Iterable[LowSocEvent], optimizer, **kwargs): def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None, optimizer=None): - """ First create simple list of station sets for single events. - #Electrified and other not possible to electrify stations should not connect groups""" + """ Create groups from events which need to be optimized together + + First it creates a simple list of station sets for single events. They are connected if they + share possible stations. + Electrified and other not possible to electrify stations should not connect groups + + :param events: events for a given state of a scenario + :param not_possible_stations: stations to be discarded + :param could_not_be_electrified: rotations to be discarded + :param optimizer: StationOptimizer object + :return: list((events, stations)) which give you events to optimize together with the stations + which might help them + """ - # Making sure default arguments are none and not mutable + # making sure default arguments are none and not mutable if not not_possible_stations: not_possible_stations = set() @@ -238,15 +282,15 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec {station for station in event.stations if station not in not_possible_stations} for event in events] - # If stations overlap join them + # if stations overlap join them station_subsets = join_all_subsets(possible_stations) event_groups = [[] for __ in range(len(station_subsets))] - # Group the events in the same manner as stations, so that the same amount of event groups are + # group the events in the same manner as stations, so that the same amount of event groups are # created as station subsets for event in events: for i, subset in enumerate(station_subsets): - # Every station from an event must share the same station sub_set. Therefore its enough + # every station from an event must share the same station sub_set. Therefore its enough # to check only the first element if len(event.stations) > 0: if next(iter(event.stations)) in subset: @@ -255,7 +299,7 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec else: if optimizer: optimizer.logger.warning('Did not find rotation %s in any subset' - 'of possible electrifiable stations', event.rotation.id) + 'of possible electrifiable stations', event.rotation.id) # this event will no show up in an event_group. # therefore it needs to be put into this set could_not_be_electrified.update([event.rotation.id]) @@ -265,7 +309,10 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec def join_all_subsets(subsets): - """ join sets for as long as needed until no elements share any intersections""" + """ join sets for as long as needed until no elements share any intersections + :param subsets: iterable of sets + :return: joined subsets if they connect with other subsets in some way + """ joined_subset = True while joined_subset: joined_subset, subsets = join_subsets(subsets) @@ -273,6 +320,15 @@ def join_all_subsets(subsets): def join_subsets(subsets: typing.Iterable[set]): + """ Run through every subset and check with every other subset if there is an intersection + If an intersection is found. The subsets are joined and returned with a boolean of True. + If not intersection is found over all subsets False is returned which will cancel the outer + call in join_all_subsets + + :param subsets: iterable of sets + :return: boolean if joining subsets is finished (i.e. False if all subsets are connected + and thus far connected subsets + """ subsets = [s.copy() for s in subsets] for i in range(len(subsets)): for ii in range(len(subsets)): diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 82f00422..0439160c 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -18,7 +18,7 @@ import matplotlib.pyplot as plt -import ebus_toolbox.schedule_optimizer +import ebus_toolbox.station_optimizer from ebus_toolbox.low_soc_events import get_low_soc_events, get_delta_soc from src import scenario @@ -167,7 +167,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): if ARGS.desired_soc_deps != 1 and CONFIG.opt_type == "quick": LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") - optimizer = ebus_toolbox.schedule_optimizer.ScheduleOptimizer(sched, scen, ARGS, CONFIG, LOGGER) + optimizer = ebus_toolbox.station_optimizer.StationOptimizer(sched, scen, ARGS, CONFIG, LOGGER) remove_impossible_rots = CONFIG.remove_impossible_rots # set battery and charging curves through config file if wished for diff --git a/ebus_toolbox/schedule_optimizer.py b/ebus_toolbox/station_optimizer.py similarity index 99% rename from ebus_toolbox/schedule_optimizer.py rename to ebus_toolbox/station_optimizer.py index 8d86e952..ac03b8ee 100644 --- a/ebus_toolbox/schedule_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -17,7 +17,7 @@ import station_optimization -class ScheduleOptimizer: +class StationOptimizer: """ Class for schedule and station optimization""" def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, From ba3c56ffaae61c413fc457ee233df4ebf8658b62 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 21 Dec 2022 16:48:26 +0100 Subject: [PATCH 420/802] Add sphinx and some fixes for deep brute and step-by-step --- data/examples/optimizer.cfg | 10 +- ebus_toolbox/low_soc_events.py | 17 +- ebus_toolbox/station_optimization.py | 93 ++----- ebus_toolbox/station_optimizer.py | 360 +++++++++++++++++---------- 4 files changed, 265 insertions(+), 215 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index c21479ef..86c0de1d 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -4,7 +4,9 @@ debug_level=0 [SCENARIO] # Use "" for ids and not '' -exclusion_rots = ["7003_7", "0817_3", "0817_2", "6003_6", "0817_1", "0306a_3", "0817_4", "0306a_2", "0306a_4", "0306a_5", "0306a_1", "0817_5"] +exclusion_rots = [] +# a={'0306a_2', '0306a_5', '0306a_3', '0817_2', '0817_4', '0817_1', '0306a_1', '0817_3', '0817_5', '0306a_4'} +# b= ["7003_7", "0817_3", "0817_2", "6003_6", "0817_1", "0306a_3", "0817_4", "0306a_2", "0306a_4", "0306a_5", "0306a_1", "0817_5"] exclusion_stations= [] # If using inclusion stations, scenario should be rebased inclusion_stations= [] @@ -44,10 +46,10 @@ pickle_rebased_name=buffered_rebase_all_electrified run_only_neg=False # "greedy" or "deep" without "" -opt_type = greedy +opt_type = deep # "step-by-step" or "brute" without "" -node_choice=brute -max_brute_loop=250 +node_choice=step-by-step +max_brute_loop=20 estimation_threshold = 0.80 # Preferring deps leads to a spice_ev simulation with preferred charging type depots diff --git a/ebus_toolbox/low_soc_events.py b/ebus_toolbox/low_soc_events.py index 2d69074e..7b428376 100644 --- a/ebus_toolbox/low_soc_events.py +++ b/ebus_toolbox/low_soc_events.py @@ -11,7 +11,7 @@ class LowSocEvent: event_counter = 0 def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rotation, - stations_list, capacity, v_type, ch_type, soc_curve): + stations_list, capacity, v_type, ch_type): self.start_idx = start_idx self.end_idx = end_idx self.min_soc = min_soc @@ -77,8 +77,6 @@ def get_low_soc_events(optimizer, rotations=None, filter_standing_time=True, if min_soc >= soc_lower_thresh_cur: count_electrified_rot += 1 while min_soc < soc_lower_thresh_cur: - if LowSocEvent.event_counter == 235: - print(optimizer.scenario) i = min_idx idx = [x[1] for x in reduced_list] while soc[i] < soc_upper_thresh: @@ -171,6 +169,16 @@ def get_index_by_time(scenario, search_time): return idx +def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): + + rot = this_sched.rotations[rot_id] + rot_start_idx = get_index_by_time(rot.departure_time, this_scen) + rot_end_idx = get_index_by_time(rot.arrival_time, this_scen) + if soc_data: + return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx + return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx + + def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer): """get expected soc lift for a given start_soc and time_delta. @@ -196,7 +204,8 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer): # make sure to limit delta soc to 1 if negative socs are given. They are possible during # the optimization process but will be continuously raised until they are >0. - return min(optimizer.args.desired_soc_opps, end_soc - start_soc) + return min(optimizer.args.desired_soc_opps, optimizer.args.desired_soc_opps-start_soc, + end_soc - start_soc) def evaluate(events: typing.Iterable[LowSocEvent], optimizer, **kwargs): diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 0439160c..e5b2553f 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -19,8 +19,7 @@ import ebus_toolbox.station_optimizer -from ebus_toolbox.low_soc_events import get_low_soc_events, get_delta_soc -from src import scenario +from ebus_toolbox.low_soc_events import get_low_soc_events, get_rotation_soc from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip @@ -58,6 +57,7 @@ def decorated_function(*this_args, **kwargs): timers[key]["time"] += delta_time return return_value + return decorated_function sorted_timer = dict(sorted(timers.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) return sorted_timer @@ -168,7 +168,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") optimizer = ebus_toolbox.station_optimizer.StationOptimizer(sched, scen, ARGS, CONFIG, LOGGER) - remove_impossible_rots = CONFIG.remove_impossible_rots + # set battery and charging curves through config file if wished for optimizer.set_battery_and_charging_curves() @@ -188,20 +188,30 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # Remove none Values from socs in the vehicle_socs an optimizer.remove_none_socs() + if CONFIG.remove_impossible_rots: + neg_rots = optimizer.get_negative_rotations_all_electrified() + optimizer.config.exclusion_rots.update(neg_rots) + optimizer.schedule.rotations = {r: optimizer.schedule.rotations[r] + for r in optimizer.schedule.rotations if + r not in optimizer.config.exclusion_rots} + LOGGER.warning("%s negative rotations %s", len(neg_rots), neg_rots) + + + if CONFIG.check_for_must_stations: must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) LOGGER.warning("%s must stations %s", len(must_stations), must_stations) LOGGER.debug("Starting greedy optimization") - ele_station_set = set() print_time() ele_stations, ele_station_set = optimizer.loop() print_time() ele_station_set = ele_station_set.union(must_include_set) LOGGER.debug("Functions took these times in seconds") - LOGGER.debug("%s Stations : %s", len(ele_station_set), ele_station_set) + LOGGER.debug("%s electrified stations : %s", len(ele_station_set), ele_station_set) + LOGGER.debug("%s total stations", len(ele_stations)) LOGGER.debug(optimizer.could_not_be_electrified) scen.vehicle_socs = optimizer.timeseries_calc() @@ -218,12 +228,13 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): json.dump(ele_stations, file, indent=2) LOGGER.debug("Spice EV is calculating optimized case as a complete scenario") - final_sched, final_scen, ele_station_set, ele_stations = optimizer.preprocessing_scenario( + _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False, cost_calc=True) - LOGGER.warning("Still negative rotations: %s", final_sched.get_negative_rotations(final_scen)) + LOGGER.warning("Still negative rotations: %s", optimizer.schedule. + get_negative_rotations(optimizer.scenario)) print("Finished") - return final_sched, final_scen + return optimizer.schedule, optimizer.scenario @time_it @@ -256,34 +267,6 @@ def plot_rot(rot_id, this_sched, this_scen, ax=None, rot_only=True): ax.plot(soc[start:end], linewidth=2.0) return ax -@time_it -def get_charging_time(trip1, trip2, args): - standing_time_min = (trip2.departure_time - trip1.arrival_time) \ - / timedelta(minutes=1) - buffer_time = (get_buffer_time(trip1) / timedelta(minutes=1)) - standing_time_min -= buffer_time - - if args.min_charging_time > standing_time_min: - return 0 - return max(0, standing_time_min) - - -@time_it -def get_index_by_time(search_time, this_scen: scenario.Scenario): - start_time = this_scen.start_time - delta_time = timedelta(minutes=60 / this_scen.stepsPerHour) - idx = (search_time - start_time) // delta_time - return idx - - -@time_it -def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): - rot = this_sched.rotations[rot_id] - rot_start_idx = get_index_by_time(rot.departure_time, this_scen) - rot_end_idx = get_index_by_time(rot.arrival_time, this_scen) - if soc_data: - return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx - return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx @time_it @@ -325,39 +308,6 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal return this_sched2, new_scen -@time_it -def charging_curve_to_soc_over_time(charging_curve, capacity, max_charge_from_grid=float('inf'), - time_step=0.1, efficiency=1): - """create charging curve as nested list of SOC, Power[kW] and capacity in [kWh]""" - # simple numeric creation of power over time --> to energy over time - normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) - soc = 0 - time = 0 - socs = [] - times = [] - while soc < ARGS.desired_soc_opps: - times.append(time) - socs.append(soc) - power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) - soc2 = soc + time_step / 60 * power1 - power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) - power = (power1 + power2) / 2 * efficiency - soc += time_step / 60 * power - time += time_step - # Fill the soc completely in last timestep - times.append(time) - socs.append(ARGS.desired_soc_opps) - return np.array((times, socs)).T - - -@time_it -def get_buffer_time(trip): - """ Return the buffer time as timedelta object""" - return timedelta(minutes=get_buffer_time_spice_ev(trip, ARGS.default_buffer_time_opps)) - - @time_it def combs_unordered_no_putting_back(n: int, k: int): """ Returns amount of combinations for pulling k elements out of n, without putting elements @@ -376,13 +326,8 @@ def combs_unordered_no_putting_back(n: int, k: int): return 0 -@time_it -def get_vehicle(rot_id, this_sched): - return this_sched.rotations[rot_id].vehicle_id -def get_vehicle_rots(rot_id, this_sched): - return [rot for rot in this_sched.rotations if rot_id == get_vehicle(rot, this_sched)] def toolbox_from_pickle(sched_name, scen_name, args_name): """ Load the 3 files from pickle""" diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index ac03b8ee..732acaa1 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -6,22 +6,24 @@ import pickle from pathlib import Path import numpy as np +import logging import schedule from ebus_toolbox import report, rotation from src import scenario -from optimizer_config import read_config, OptimizerConfig +from optimizer_config import OptimizerConfig from low_soc_events import evaluate, get_low_soc_events, get_groups_from_events, get_delta_soc, \ - get_buffer_time, get_charging_time, get_index_by_time -import logging -import station_optimization + get_buffer_time, get_charging_time, get_index_by_time,\ + get_rotation_soc as get_rotation_soc_low_soc +import station_optimization as opt class StationOptimizer: - """ Class for schedule and station optimization""" + """ Class for station optimization""" def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, config: OptimizerConfig(), logger: logging.Logger, **kwargs): + self.base_not_possible_stations = set() self.could_not_be_electrified = set() self.must_include_set = set() self.soc_charge_curve_dict = {} @@ -46,17 +48,25 @@ def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, if config.reduce_rots: self.schedule.rotations = {rot: sched.rotations[rot] for rot in config.rots} - def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): - # Loops over every base group with the core of group optimization and handles deep or - # greedy arguments + def loop(self, **kwargs): + """ Loops over every base group with the core of group optimization and handles deep or + greedy arguments - # # base stations for optimization, so inclusion of stations can be skipped - # base_stations = self.base_stations.copy() - # base_electrified_station_set = self.base_electrified_station_set.copy() + :param opt_type: type of optimization. Default from optimizer object + :param kwargs: arguments handled by the function and config. + :return: tuple of the dict electrified_stations and the set electrified_station_set + in the optimal found case + """ + node_choice=kwargs.get("node_choice", self.config.node_choice) + opt_type=kwargs.get("opt_type", self.config.opt_type) self.base_scenario = copy(self.scenario) self.base_schedule = copy(self.schedule) + self.base_stations = self.electrified_stations.copy() + self.base_electrified_station_set = self.electrified_station_set.copy() + self.base_not_possible_stations = self.not_possible_stations.copy() + # get events where soc fell below 0. The events contain info about the problematic # time span, which includes stations which could provide a soc lift base_events = get_low_soc_events(self, rel_soc=False, @@ -68,34 +78,22 @@ def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): could_not_be_electrified=self.could_not_be_electrified, optimizer=self) - # Baseline greedy Optimization + # storage for the sets of stations which will be generated list_greedy_sets = [set()] * len(groups) - # get_negative_rotations_all_electrified(base_scen, base_sched, soc_upper_thresh, soc_charge_curve_dict, - # not_possible_stations=not_possible_stations, - # rel_soc=False) - - # new_scen.vehicle_socs = timeseries_calc(new_sched.rotations.values(), - # new_scen.vehicle_socs, - # new_scen, electrified_station_set, - # soc_charge_curve_dict=soc_charge_curve_dict, - # soc_upper_thresh=ARGS.desired_soc_deps) - - # Base line is created simply by not having a decision tree and not a pre optimized_set yet + # baseline greedy optimization + # base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups[:]): events, stations = group linien = {lne for e in events for lne in e.rotation.lines} - # self.electrified_stations = self.base_stations.copy() - # self.electrified_station_set = self.base_electrified_station_set.copy() self.logger.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, len(groups)) self.logger.warning(linien) self.logger.warning("%s events", (len(events))) # first run is always step by step - # return values of no use - _, __ = self.group_optimization(group, self.choose_station_step_by_step, - events_remaining=[len(events)], **kwargs) + self.group_optimization(group, self.choose_station_step_by_step, + events_remaining=[len(events)], **kwargs) self.logger.warning("Greedy Result ++++++++ %s stations out of %s", len(self.electrified_station_set), @@ -117,48 +115,61 @@ def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): sols = [] i = 0 cont_loop = True - combinations = station_optimization.combs_unordered_no_putting_back(len(stations), - len( - list_greedy_sets[ - group_nr])) if node_choice == "brute": choice_func = self.choose_station_brute else: choice_func = self.choose_station_step_by_step - self.logger.debug("There are %s combinations", combinations) + + combinations = opt.combs_unordered_no_putting_back(len(stations), + len(list_greedy_sets[group_nr]) - 1) + self.logger.debug("There are %s combinations with 1 station less than " + "the current solution", combinations) + pre_optimized_set = list_greedy_sets[group_nr] while i < self.config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: - print(len(self.decision_tree), " Knotenpunkte durchwandert") - print(f"Optimal solution has length {len(self.electrified_station_set)}") - # not_possible_stations = copy(not_possible_stations) + print(len(self.decision_tree), " nodes checked") + print(f"Optimal solution has length {len(pre_optimized_set)}") self.electrified_stations = self.base_stations.copy() - new_electrified_set = set() - - new_stations, cont_loop = self.group_optimization(group, choice_func, - track_not_possible_rots=False, - **kwargs) + self.electrified_station_set= self.base_electrified_station_set.copy() + self.scenario = copy(self.base_scenario) + self.schedule = copy(self.base_schedule) + + self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) + self.schedule.rotations = deepcopy(self.base_schedule.rotations) + self.not_possible_stations = self.base_not_possible_stations.copy() + + # create a new electrified set + new_stats, cont_loop = self.group_optimization(group, choice_func, + track_not_possible_rots=False, + pre_optimized_set=pre_optimized_set, + events_remaining = [len(events)], + **kwargs) + + new_electrified_set = self.electrified_station_set # if a new set was found, print it and save it in sols - if new_electrified_set != pre_optimized_set and new_stations is not None: + if new_electrified_set != pre_optimized_set and new_stats is not None: self.logger.warning("Optimized with %s stations %s %s", len(new_electrified_set), str('#' * 20), stations_hash(new_electrified_set)) sols.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): - electrified_station_set = new_electrified_set + list_greedy_sets[group_nr] = new_electrified_set.copy() + pre_optimized_set = new_electrified_set.copy() self.logger.debug("All solutions for this group: %s", sols) - list_greedy_sets[group_nr] = electrified_station_set.copy() - self.logger.debug("Optimized with %s stations out of %s", len(electrified_station_set), + self.logger.debug("Optimized with %s stations out of %s", len(pre_optimized_set), len(stations)) - # Saving decision tree only in case of deep analysis + # saving decision tree only in case of deep analysis if self.config.save_decision_tree: with open(self.args.output_directory / Path("decision_tree.pickle"), "wb") as file: pickle.dump(self.decision_tree, file) + self.electrified_stations = self.base_stations.copy() + self.electrified_station_set = self.base_electrified_station_set.copy() for single_set in list_greedy_sets: for stat in single_set: self.electrify_station(stat, self.electrified_station_set) @@ -167,25 +178,34 @@ def loop(self, opt_type="greedy", node_choice="step-by-step", **kwargs): def get_negative_rotations_all_electrified(self, rel_soc=False): """Get the rotation ids for the rotations which show negative socs, even when everything - is electrified""" + is electrified + :param rel_soc: if true, the start soc is handled like it has the desired deps soc + :return: set of rotation ids which are negative even with all stations electrified + """ events = get_low_soc_events(self, rel_soc=rel_soc) stats = {stat for event in events for stat in event.stations_list if stat not in self.not_possible_stations} electrified_station_set = set(stats) - vehicle_socs = self.timeseries_calc() + vehicle_socs = self.timeseries_calc(ele_station_set=electrified_station_set) new_events = get_low_soc_events(self, soc_data=vehicle_socs) - return [event.rotation.id for event in new_events] + return {event.rotation.id for event in new_events} def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, - tree_position=None, pre_optimized_set=None, **kwargs): - """ Optimize a single group events + pre_optimized_set=None, **kwargs): + """Optimize a single group events + + :param group: tuple of events and station_ids to be optimized together + :param choose_station_function: function to be used for choosing the next function + :param track_not_possible_rots: not possible tracks need to be tracked in the first run + :param pre_optimized_set: set which was optimized before hand used as upper threshold for + optimization + :param kwargs: internally used functionality :return (electrified_stations if optimization continues, None if no further recursive calls should happen, bool if further deep analysis should take place) :rtype (dict() or None, bool) """ - could_not_be_electrified = self.could_not_be_electrified # in deep analysis not all nodes are visited if they are suboptimal. @@ -196,11 +216,12 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ solver = self.config.solver - if not tree_position: - tree_position = [] + tree_position = kwargs.get("tree_position", [1]) # give tree position - self.logger.debug("%s with length of %s", tree_position, len(tree_position)) + self.logger.debug("%s with length of %s and a total of %s " + "stations", tree_position, len(tree_position), + len(self.electrified_station_set)) # unpack events and possible stations event_group, _ = group @@ -225,6 +246,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # get the best stations, brute or step_by_step best_station_ids, recursive = choose_station_function(station_eval, + pre_optimized_set=pre_optimized_set, missing_energy=missing_energy) stat_eval_dict = {stat_id[0]: stat_id[1] for stat_id in station_eval} @@ -242,13 +264,13 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ for stat in copied_set: self.electrified_stations.pop(stat) self.electrified_station_set.remove(stat) - # overwrite with preoptimized set + # overwrite with preo ptimized set for stat in pre_optimized_set: self.electrify_station(stat, self.electrified_station_set) return None, False self.logger.debug("%s, with first pot of %s", best_station_ids, - stat_eval_dict[best_station_ids[0]]) + round(stat_eval_dict[best_station_ids[0]],1)) # electrify station(s) for stat_id in best_station_ids: @@ -256,7 +278,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ event_rotations = {event.rotation for event in event_group} - # copy Scen and sched + # copy scen and sched self.scenario = copy(self.base_scenario) self.schedule = copy(self.base_schedule) @@ -268,9 +290,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ electrify_stations=best_station_ids) else: self.schedule.rotations = rotation_dict - self.schedule, self.scenario = station_optimization.run_schedule(self.schedule, - self.args, - electrified_stations=self.electrified_stations) + self.schedule, self.scenario = \ + opt.run_schedule(self.schedule, self.args, + electrified_stations=self.electrified_stations) kwargs["lifted_socs"] = self.scenario.vehicle_socs.copy() @@ -305,15 +327,13 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ for k, this_group in enumerate(groups): this_tree = tree_position.copy() - this_tree.append(k) - # self, group, choose_station_function, track_not_possible_rots = True, - # tree_position = None, pre_optimized_set = None, ** kwargs): - # - new_stations, _ = self.group_optimization(this_group, choose_station_function, - track_not_possible_rots=track_not_possible_rots, - pre_optimized_set=pre_optimized_set, - tree_position=this_tree, - **kwargs) + this_tree.append(k+1) + kwargs["tree_position"] = this_tree + new_stations, _ = \ + self.group_optimization(this_group, choose_station_function, + track_not_possible_rots=track_not_possible_rots, + pre_optimized_set=pre_optimized_set, + **kwargs) if new_stations is not None: self.electrified_stations.update(new_stations) @@ -324,15 +344,14 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if pre_optimized_set is None: continue - # if there is a preoptimized set check if the preoptimized set leads to pruning + # if there is a pre optimized set check if the preoptimized set leads to pruning # i.e. if if following branch makes sense if len(pre_optimized_set) - len(self.electrified_station_set) < 10: - self.scenario.vehicle_socs = self.timeseries_calc(event_rotations, - electrify_stations= - best_station_ids) + self.scenario.vehicle_socs = \ + self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) - prune_events = get_low_soc_events(self, rotations=event_rotations_ids, - rel_soc=True, **kwargs) + prune_events = \ + get_low_soc_events(self, rotations=event_rotations_ids, rel_soc=True, **kwargs) station_eval = evaluate(prune_events, self) prune_missing_energy = get_missing_energy(prune_events) @@ -343,10 +362,51 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ return self.electrified_stations, True + # ToDo implement a fast calculation of timeseries_calc but with a limited amount of charging + # points. Implementation could look like this + # For each possible station find the charging times of each vehicle, e.g + # PotsdamerPlatz: Vehicle1: 12:30-12:40, 13:20-14:00 + # Vehicle5: 9:30-9:40, 13:10-13:25 + # For each station sort the events accordingly, e.g. + # Step 1 + # PotsdamerPlatz: 9:30-9:40 Vehicle5 + # 12:30-12:40 Vehicle1 + # 13:10-13:25 Vehicle5 + # 13:20-14:00 Vehicle1 + # For a number of charging points mutate the events, e.g. 2 charging points + # + # Step2 + # PotsdamerPlatz: 9:30-9:40 Vehicle5 + # 12:30-12:40 Vehicle1 + # 13:10-13:25 Vehicle5 + # 13:20-14:00 Vehicle1 + # or 1 charging piont + # PotsdamerPlatz: 9:30-9:40 Vehicle5 + # 12:30-12:40 Vehicle1 + # 13:10-13:25 Vehicle5 + # 13:25-14:00 Vehicle1 + # do this for every station + # Step 3 + # Sort all events of all stations by time + # PotsdamerPlatz: 9:30-9:40 Vehicle5 + # Hauptbahnhof: 9:35-9:45 + # ... + # go through events and lift the socs according to timeseries_calc + # check if socs are clipped. if so mutate the event time and repeat step2 and 3. + # go further + def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_upper_thresh=None, electrify_stations=None) -> object: - """ A quick estimation of socs by mutating the soc data accordingly - :return soc dict + """ A quick estimation of socs by mutating the soc data according to full electrification. + This means a electrified station has unlimited charging points + + :param rotations: Optional if not optimizer.schedule.rotations should be used + :param soc_dict: Optional if not optimizer.scenario.vehicle_socs should be used + :param ele_station_set: set to be electrified. Default None leads to using the + so far optimized optimizer.electrified_station_set + :param soc_upper_thresh: optional if not optimizer.config.desired_soc_deps is used + :param electrify_stations: dict of stations to be electrified + :return soc dict with lifted socs :rtype dict() """ if not rotations: @@ -366,8 +426,6 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, ele_stations = {*ele_station_set, *electrify_stations} soc_dict = copy(soc_dict) - print("Calc with ", ele_stations) - for rot in rotations: ch_type = (rot.vehicle_id.find("oppb") > 0) * "oppb" + ( rot.vehicle_id.find("depb") > 0) * "depb" @@ -397,17 +455,22 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc = soc[idx:] soc_max = np.max(soc) while soc_max > soc_upper_thresh: + # descending array desc = np.arange(len(soc), 0, -1) + # gradient of soc i.e. positive if charging negative if discharging diff = np.hstack((np.diff(soc), -1)) # masking of socs >1 and negative gradient for local maximum + # i.e. after lifiting the soc, it finds the first spot where the soc is bigger + # than the upper threshold and descending. idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) + # find the soc value of this local maximum soc_max = soc[idc_loc_max] - # Reducing everything after local maximum + # reducing everything after local maximum soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) - # Capping everything before local maximum - soc[:idc_loc_max][soc[:idc_loc_max] > 1] = 1 + # capping everything before local maximum + soc[:idc_loc_max][soc[:idc_loc_max] > 1] = soc_upper_thresh soc_max = np.max(soc) soc = np.hstack((soc_pre, soc)) soc_dict[rot.vehicle_id] = soc @@ -415,14 +478,19 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): - """ quickly evaluates if following a branch is promising by summing up estimated potentials + """Quickly evaluates if following a branch is promising by summing up estimated potentials + :param station_eval: list of sorted station evaluation with list(station_id, pot) + :param electrified_station_set: set of electrified stations + :param pre_optimized_set: set of already optimized stations + :param missing_energy: :return is the branch promising - :rtype bool""" + :rtype bool + """ delta = len(pre_optimized_set) - len(electrified_station_set) pot = 0 for i in range(0, min(delta, len(station_eval))): - pot += station_eval[i] + pot += station_eval[i][1] if pot < -missing_energy * self.config.estimation_threshold: print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", stations_hash(electrified_station_set)) @@ -431,6 +499,7 @@ def is_branch_promising(self, station_eval, electrified_station_set, def node_to_tree(self, delta_base_energy): """ Fill decision tree with the given info + :param delta_base_energy: missing energy :return decision tree :rtype dict() """ @@ -446,10 +515,18 @@ def node_to_tree(self, delta_base_energy): self.decision_tree[node_name]["visit_counter"] = 1 def choose_station_brute(self, station_eval, - pre_optimized_set=None, decision_tree=None, missing_energy=0, + pre_optimized_set=None, missing_energy=0, gens=dict()): - """ Gives back a possible set of Stations to electrify which shows potential and hasnt been - tried yet. The set of stations is smaller than the best optimized set so far.""" + """Gives back a possible set of Stations to electrify which shows potential and hasnt been + tried yet. The set of stations is smaller than the best optimized set so far. + + :param station_eval: list of sorted station evaluation with list(station_id, pot) + :param pre_optimized_set: set of optimized stations thus far + :param missing_energy: missing energy in this branch before electrification + :param gens: dict of generators for brute force generation + :return: combination of stations or None if no viable stations exists and + false since this function does not support recursive calling + """ station_ids = [x[0] for x in station_eval] try: @@ -460,11 +537,11 @@ def choose_station_brute(self, station_eval, station_eval_dict = {stat[0]: stat[1] for stat in station_eval} for comb in generator: node_name = stations_hash(comb) - if node_name not in decision_tree: + if node_name not in self.decision_tree: # only check the brute force station if they have the remote chance of fulfilling # the missing energy # potential>missing energy * 80% - potential = sum([station_eval_dict[stat]["pot_sum"] for stat in comb]) + potential = sum([station_eval_dict[stat] for stat in comb]) if potential > -missing_energy * self.config.estimation_threshold: return comb, False else: @@ -476,52 +553,63 @@ def choose_station_brute(self, station_eval, def choose_station_step_by_step(self, station_eval, pre_optimized_set=None, missing_energy=0): """ Gives back a station of possible stations to electrify which shows the biggest potential - and hasnt been picked before.""" + and hasnt been picked before. + + + :param station_eval: list of sorted station evaluation with list(station_id, pot) + :param pre_optimized_set: set of optimized stations thus far + :param missing energy in this branch before electrification + :return:a station to electrify or None if no viable stations exists and + false since this function does not support recursive calling + """ - # Filter functions to stop simulating cases which have no hope of being optimal. - # If in optimization mode, optimization can break if station amount is superseded - # This filter is done better by the next + # filter functions to stop simulating cases which have no hope of being optimal. + # if in optimization mode, optimization can break if station amount is superseded + # this filter is done better by the next # if pre_optimized_set is not None: # if len(electrified_station_set)>len(pre_optimized_set): # return pre_optimized_set - # Potentials have to be at least as promising as the pre-optimized case + # potentials have to be at least as promising as the pre-optimized case if pre_optimized_set is not None: if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, missing_energy): - # Best station id is none and dont go deeper in recursion + # best station id is none and dont go deeper in recursion return None, False - min_count_visited = float('inf') + min_nr_visited = float('inf') for stat_tuple in station_eval: station, pot = stat_tuple - # Create a station combination from already electrified stations and possible new station + # create a station combination from already electrified + # stations and possible new station check_stations = self.electrified_station_set.union([station]) if self.decision_tree is not None: node_name = stations_hash(check_stations) if node_name in self.decision_tree.keys(): - min_count_visited = min(min_count_visited, - self.decision_tree[node_name]["visit_counter"]) - # If already checked skip to next one + min_nr_visited = min(min_nr_visited, + self.decision_tree[node_name]["visit_counter"]) + # if already checked skip to next one continue if station not in self.electrified_station_set: best_station_id = station return [best_station_id], True - else: - # Every possible node from here was evaluated already - # to do what now? - # Simply visit the least visited node - for station in station_eval: - # Create a station combination from already electrified stations - # and possible new station - check_stations = self.electrified_station_set.union([station]) - if self.decision_tree[stations_hash(check_stations)][ - "visit_counter"] == min_count_visited: - best_station_id = station - return [best_station_id], True + # every possible node from here was evaluated already + # to do what now? + # simply visit the least visited node + for stat_eval in station_eval: + station, eval = stat_eval + # create a station combination from already electrified stations + # and possible new station + check_stations = self.electrified_station_set.union([station]) + if self.decision_tree[stations_hash(check_stations)]["visit_counter"] == min_nr_visited: + best_station_id = station + return [best_station_id], True return None, True def set_battery_and_charging_curves(self): + """ Create battery and charging curves for fast lookup + :return: Void + """ for v_type in self.schedule.vehicle_types.values(): for vehicle in v_type.values(): if self.config.battery_capacity is not None: @@ -530,6 +618,9 @@ def set_battery_and_charging_curves(self): vehicle["charging_curve"] = self.config.charging_curve def set_up_decision_tree(self): + """ Load decision tree if given in the config + :return: Void + """ if self.config.decision_tree_path is not None: with open(self.config.decision_tree_path, "rb") as file: self.decision_tree = self.config.load(file) @@ -550,7 +641,7 @@ def rebase_spice_ev(self): def rebase_simple(self): must_include_set = set() - # Electrify inclusion stations + # electrify inclusion stations for stat in self.config.inclusion_stations: self.electrify_station(stat, must_include_set) self.schedule.rotations = {r: self.schedule.rotations[r] for r in self.schedule.rotations if @@ -566,11 +657,11 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, :rtype (schedule.Schedule(), scenario.Scneario(), set(), dict()) """ must_include_set = set() - # Electrify inclusion stations + # electrify inclusion stations for stat in self.config.inclusion_stations: self.electrify_station(stat, must_include_set) - # Calc new but only prev. negative rotations + # calc new but only prev. negative rotations if run_only_neg: rots = self.schedule.get_negative_rotations(self.scenario) rots = {r: self.schedule.rotations[r] for r in rots if r not in @@ -581,9 +672,9 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, r not in self.config.exclusion_rots} self.schedule.rotations = rots - new_sched, new_scen = station_optimization.run_schedule(self.schedule, self.args, - self.electrified_stations, - cost_calc=cost_calc) + new_sched, new_scen = opt.run_schedule(self.schedule, self.args, + self.electrified_stations, + cost_calc=cost_calc) report.generate(new_sched, new_scen, self.args) self.schedule = new_sched self.scenario = new_scen @@ -596,8 +687,8 @@ def electrify_station(self, stat, electrified_set): electrified_set.add(stat) def create_charging_curves(self): - """Cycle through vehicles and create numerically created charging curves with energy supplied - over time""" + """Cycle through vehicles and create numerically created charging curves with energy + supplied over time """ soc_charge_curve_dict = {} for v_type_name in self.schedule.vehicle_types: soc_charge_curve_dict[v_type_name] = {} @@ -620,10 +711,10 @@ def get_must_stations_and_rebase(self, relative_soc=False): electrified_station_set_all = set(stats) must_stations = set() - print(f"Electrifiying {len(electrified_station_set_all)} stations minus one", ) + print(f"Electrifying {len(electrified_station_set_all)} stations minus one", ) for station in electrified_station_set_all: electrified_station_set = electrified_station_set_all.difference([station]) - vehicle_socs = self.timeseries_calc(ele_station_set=electrified_station_set) + vehicle_socs = self.timeseries_calc(electrify_stations=electrified_station_set) soc_min = 1 for rot in self.schedule.rotations: soc, start, end = self.get_rotation_soc(rot, vehicle_socs) @@ -661,13 +752,16 @@ def remove_none_socs(self): soc[soc == np.array(None)] = last_not_none self.scenario.vehicle_socs[v_id] = soc + + def get_rotation_soc(self, rot_id, soc_data: dict = None): - rot = self.schedule.rotations[rot_id] - rot_start_idx = self.get_index_by_time(rot.departure_time) - rot_end_idx = self.get_index_by_time(rot.arrival_time) - if soc_data: - return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx - return self.scenario.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx + """ gets you the soc object with start and end index for a given rotation id + :param rot_id: rotation_id + :param soc_data: optional soc_data if not the scenario data should be used + :return: tuple with soc array, start index and end index + """ + return get_rotation_soc_low_soc(rot_id, self.schedule, self.scenario, soc_data=soc_data) + def get_index_by_time(self, search_time): start_time = self.scenario.start_time @@ -730,7 +824,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, power = (power1 + power2) / 2 * efficiency soc += time_step / 60 * power time += time_step - # Fill the soc completely in last timestep + # fill the soc completely in last time step times.append(time) socs.append(args.desired_soc_opps) return np.array((times, socs)).T @@ -760,10 +854,10 @@ def combination_generator(iterable: typing.Iterable, amount: int): iterable = list(iterable) for i, item in enumerate(iterable): - # Recursive calling of generator with clock like behavior, e.g right-most item changes until + # recursive calling of generator with clock like behavior, e.g right-most item changes until # end of list is reached. This leads to a change in the item left to it and so on. Elements # on the right can only change to a subset of bigger indices than their left counter-part. - # This is due to the ignoring of order, which reduces the amount of possibilities. + # this is due to the ignoring of order, which reduces the amount of possibilities. if amount <= 1: yield [item] else: From 7e548be0945c2dd0bd5034ca1baf097090332f39 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 12:17:18 +0100 Subject: [PATCH 421/802] Refactoring into util and optimizr --- data/examples/optimizer.cfg | 2 +- ebus_toolbox/__main__.py | 40 +-- ebus_toolbox/low_soc_events.py | 351 ------------------ ebus_toolbox/optimizer_config.py | 101 ------ ebus_toolbox/optimizer_util.py | 509 +++++++++++++++++++++++++++ ebus_toolbox/station_optimization.py | 229 +++--------- ebus_toolbox/station_optimizer.py | 360 +++++++++++-------- 7 files changed, 798 insertions(+), 794 deletions(-) delete mode 100644 ebus_toolbox/low_soc_events.py create mode 100644 ebus_toolbox/optimizer_util.py diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 86c0de1d..8e631149 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -48,7 +48,7 @@ run_only_neg=False # "greedy" or "deep" without "" opt_type = deep # "step-by-step" or "brute" without "" -node_choice=step-by-step +node_choice=brute max_brute_loop=20 estimation_threshold = 0.80 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 42e61005..addffc74 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -116,44 +116,44 @@ help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") - ARGS = parser.parse_args() + args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config - ARGS.ALLOW_NEGATIVE_SOC = True - ARGS.attach_vehicle_soc = True + args.ALLOW_NEGATIVE_SOC = True + args.attach_vehicle_soc = True - util.set_options_from_config(ARGS, check=True, verbose=False) + util.set_options_from_config(args, check=True, verbose=False) - ARGS.output_directory = Path(ARGS.output_directory) / \ + args.output_directory = Path(args.output_directory) / \ str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. # needs to happen after set_options_from_config since # args.output_directory can be overwritten by config - ARGS.output_directory.mkdir(parents=True, exist_ok=True) + args.output_directory.mkdir(parents=True, exist_ok=True) - if not ARGS.save_timeseries: - ARGS.save_timeseries = ARGS.output_directory / "simulation_spiceEV.csv" - if not ARGS.save_results: - ARGS.save_results = ARGS.output_directory / "simulation_spiceEV.json" - if not ARGS.save_soc: - ARGS.save_soc = ARGS.output_directory / "simulation_soc_spiceEV.csv" + if not args.save_timeseries: + args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" + if not args.save_results: + args.save_results = args.output_directory / "simulation_spiceEV.json" + if not args.save_soc: + args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" # copy input files to output to ensure reproducibility - copy_list = [ARGS.config, ARGS.electrified_stations, ARGS.vehicle_types] + copy_list = [args.config, args.electrified_stations, args.vehicle_types] # only copy cost params if they exist - if ARGS.cost_parameters_file is not None: - copy_list.append(ARGS.cost_parameters_file) + if args.cost_parameters_file is not None: + copy_list.append(args.cost_parameters_file) for c_file in copy_list: - shutil.copy(str(c_file), str(ARGS.output_directory / Path(c_file).name)) + shutil.copy(str(c_file), str(args.output_directory / Path(c_file).name)) - util.save_version(Path(ARGS.output_directory / "program_version.txt")) + util.save_version(Path(args.output_directory / "program_version.txt")) # rename special options - ARGS.timing = ARGS.eta + args.timing = args.eta - if ARGS.input_schedule is None: + if args.input_schedule is None: raise SystemExit("The following argument is required: input_schedule") - simulate.simulate(ARGS) + simulate.simulate(args) diff --git a/ebus_toolbox/low_soc_events.py b/ebus_toolbox/low_soc_events.py deleted file mode 100644 index 7b428376..00000000 --- a/ebus_toolbox/low_soc_events.py +++ /dev/null @@ -1,351 +0,0 @@ -""" Module for the class LowSocEvent which gathers functionality around -LowSocEvents, like evaluating them, gathering them and so on""" - -import typing -from datetime import timedelta - -from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev - - -class LowSocEvent: - event_counter = 0 - - def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rotation, - stations_list, capacity, v_type, ch_type): - self.start_idx = start_idx - self.end_idx = end_idx - self.min_soc = min_soc - self.stations = stations - self.vehicle_id = vehicle_id - self.trip = trip - self.rotation = rotation - self.stations_list = stations_list - self.capacity = capacity - self.v_type = v_type - self.ch_type = ch_type - self.event_counter = LowSocEvent.event_counter - LowSocEvent.event_counter += 1 - - -def get_low_soc_events(optimizer, rotations=None, filter_standing_time=True, - rel_soc=False, soc_data=None, **kwargs): - """ Gather low soc events below the config threshold. - - :param optimizer: StationOptimizer which defines the search conditions as well as - the scenario and schedule - :param rotations: rotations to be searched for low soc events. Default None means whole - schedule is searched - :param filter_standing_time: Should the stations be filtered by standing time. True leads to - an output only stations with charging potential - :param rel_soc: Defines if the start soc should be seen as full even when not. If the rel_soc - is false, it means coupled rotations might be prone to errors due to impossible lifts. - :param soc_data: soc data to be used. Default None means the soc data from the optimizer - scenario is used - :param kwargs: optional soc_lower_tresh or soc_upper_thresh if from optimizer differing values - should be used - :return: list(LowSocEvents) - """ - if not rotations: - rotations = optimizer.schedule.rotations - - soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) - soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) - # Create list of events which describe trips which end in a soc below zero - # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 - # Properties before and after these points have no effect on the event itself, similar to - # an event horizon - events = [] - count_electrified_rot = 0 - - for rot_id in rotations: - rot = optimizer.schedule.rotations[rot_id] - soc, rot_start_idx, rot_end_idx = optimizer.get_rotation_soc(rot_id, soc_data) - idx = range(0, len(soc)) - comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] - min_soc, min_idx = min(comb, key=lambda x: x[0]) - reduced_list = comb.copy() - soc_lower_thresh_cur = soc_lower_thresh - # if rotation gets a start soc below 1 this should change below 0 soc events since fixing - # the rotation before would lead to fixing this rotation - - # if using relative SOC, SOC lookup has to be adjusted - if rel_soc: - start_soc = comb[0][0] - soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( - soc_upper_thresh - soc_lower_thresh) - soc_upper_thresh = soc_lower_thresh_cur + soc_upper_thresh - if min_soc >= soc_lower_thresh_cur: - count_electrified_rot += 1 - while min_soc < soc_lower_thresh_cur: - i = min_idx - idx = [x[1] for x in reduced_list] - while soc[i] < soc_upper_thresh: - if i == rot_start_idx: - break - i -= 1 - start_comb = idx.index(i) - start = i - i = min_idx - while soc[i] < soc_upper_thresh: - if i >= rot_end_idx - 1: - break - i += 1 - end_comb = idx.index(i) - trips = optimizer.get_trips(rot=rot, start_idx=start, end_idx=min_idx) - possible_stations = set() - possible_stations_list = [] - if not filter_standing_time: - possible_stations = {t.arrival_name for t in trips} - possible_stations_list = [t.arrival_name for t in trips] - else: - for ii, trip in enumerate(trips): - try: - standing_time_min = get_charging_time(trip, trips[ii + 1], optimizer.args) - except IndexError: - standing_time_min = 0 - if standing_time_min > 0: - possible_stations.add(trip.arrival_name) - possible_stations_list.append(trip.arrival_name) - - possible_stations = possible_stations.difference(optimizer.not_possible_stations) - cht = rot.vehicle_id.find("depb") - ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" - v_type = rot.vehicle_id.split("_" + ch_type)[0] - event = LowSocEvent(start_idx=start, end_idx=min_idx, - min_soc=min_soc, stations=possible_stations, - vehicle_id=rot.vehicle_id, trip=trips, - rotation=rot, stations_list=possible_stations_list, - capacity=optimizer.schedule.vehicle_types[v_type][ch_type][ - 'capacity'], - v_type=v_type, ch_type=ch_type) - - events.append(event) - copy_list = reduced_list.copy() - reduced_list = reduced_list[:start_comb] - if end_comb + 1 <= len(copy_list): - reduced_list.extend(copy_list[end_comb + 1:]) - if len(reduced_list) > 0: - min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) - else: - break - return events - - -def get_charging_time(trip1, trip2, args): - """ Returns the charging time between trips as numeric value - - :param trip1: First trip - :param trip2: Following trip - :param args: arguments Namespace with default buffer time - :return: maximum possible charging time in minutes between trips - """ - standing_time_min = (trip2.departure_time - trip1.arrival_time) / timedelta(minutes=1) - buffer_time = (get_buffer_time(trip1, args.default_buffer_time_opps) / timedelta(minutes=1)) - standing_time_min -= buffer_time - - if args.min_charging_time > standing_time_min: - return 0 - return max(0, standing_time_min) - - -def get_buffer_time(trip, default_buffer_time_opps): - """ Return the buffer time as timedelta object - :param trip: trip object - :param default_buffer_time_opps: - :return: timedelta object for the buffer time - """ - return timedelta(minutes=get_buffer_time_spice_ev(trip, default_buffer_time_opps)) - - -def get_index_by_time(scenario, search_time): - """ Get the index for a given time - :param scenario: scenario object - :param search_time: search time as datetime object - :return: index as int - """ - start_time = scenario.start_time - delta_time = timedelta(minutes=60 / scenario.stepsPerHour) - idx = (search_time - start_time) // delta_time - return idx - - -def get_rotation_soc(rot_id, this_sched, this_scen, soc_data: dict = None): - - rot = this_sched.rotations[rot_id] - rot_start_idx = get_index_by_time(rot.departure_time, this_scen) - rot_end_idx = get_index_by_time(rot.arrival_time, this_scen) - if soc_data: - return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx - return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx - - -def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer): - """get expected soc lift for a given start_soc and time_delta. - - :param soc_over_time_curve: - :param soc: - :param time_delta: - :param optimizer: - :return: - """ - # units for time_delta and time_curve are assumed to be the same, e.g. minutes - # first element which is bigger than current soc - if time_delta == 0: - return 0 - soc = max(min(optimizer.args.desired_soc_opps, soc), 0) - first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] - second_time = first_time + time_delta - # catch out of bounds if time of charging end is bigger than table values - - if second_time >= soc_over_time_curve[-1, 0]: - end_soc = soc_over_time_curve[-1, 1] - else: - end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] - - # make sure to limit delta soc to 1 if negative socs are given. They are possible during - # the optimization process but will be continuously raised until they are >0. - return min(optimizer.args.desired_soc_opps, optimizer.args.desired_soc_opps-start_soc, - end_soc - start_soc) - - -def evaluate(events: typing.Iterable[LowSocEvent], optimizer, **kwargs): - """Analyse stations for "helpful" energy supply. Energy supply is helpful if the minimal soc of - an event is raised (up to a minimal soc (probably zero)). The supplied energy is approximated - by loading power, standing time at a station, soc at station and minimal soc of the event - - :param events: events to be evaulated - :param optimizer: StationOptimizer object with scenario and schedule data - :param kwargs: optional overwriting of soc_lower_thresh, soc_upper_thresh or soc_data - :return: sorted list with the best station and its potential on index 0 - :rtype: list(str(station_id), float(potential)) - """ - - soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) - soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) - soc_data = kwargs.get("soc_data", optimizer.scenario.vehicle_socs) - - station_eval = {} - # cycle through events and determine how much lift can be provided by electrifying a station - # the lift is determined by the soc position, standing time, power supply and charging curve - for e in events: - soc_over_time = optimizer.soc_charge_curve_dict[e.v_type][e.ch_type] - for i, trip in enumerate(e.trip): - # station is only evaluated if station name is part of event stations - # only these stations showed potential in electrification, e.g enough standing time - if trip.arrival_name not in e.stations: - continue - idx = get_index_by_time(optimizer.scenario, trip.arrival_time, ) - soc = soc_data[e.vehicle_id][idx] - - # potential is the minimal amount of - delta_soc_pot = min(soc_upper_thresh - soc, - soc_lower_thresh - e.min_soc, - soc - e.min_soc, - soc_upper_thresh - soc_lower_thresh) - - try: - standing_time_min = get_charging_time(trip, e.trip[i + 1], optimizer.args) - except IndexError: - standing_time_min = 0 - - pot_kwh = get_delta_soc(soc_over_time, soc, standing_time_min, optimizer) * e.capacity - - # potential is at max the minimum between the useful delta soc * capacity or the - # energy provided by charging for the full standing time - delta_e_pot = min(delta_soc_pot * e.capacity, pot_kwh) - try: - station_eval[trip.arrival_name] += delta_e_pot - except KeyError: - station_eval[trip.arrival_name] = delta_e_pot - - # sort by pot_sum - station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1])).items()) - station_eval.reverse() - return station_eval - - -def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None, - optimizer=None): - """ Create groups from events which need to be optimized together - - First it creates a simple list of station sets for single events. They are connected if they - share possible stations. - Electrified and other not possible to electrify stations should not connect groups - - :param events: events for a given state of a scenario - :param not_possible_stations: stations to be discarded - :param could_not_be_electrified: rotations to be discarded - :param optimizer: StationOptimizer object - :return: list((events, stations)) which give you events to optimize together with the stations - which might help them - """ - - # making sure default arguments are none and not mutable - if not not_possible_stations: - not_possible_stations = set() - - if not could_not_be_electrified: - could_not_be_electrified = set() - - possible_stations = [ - {station for station in event.stations if station not in not_possible_stations} - for event - in events] - # if stations overlap join them - station_subsets = join_all_subsets(possible_stations) - event_groups = [[] for __ in range(len(station_subsets))] - - # group the events in the same manner as stations, so that the same amount of event groups are - # created as station subsets - for event in events: - for i, subset in enumerate(station_subsets): - # every station from an event must share the same station sub_set. Therefore its enough - # to check only the first element - if len(event.stations) > 0: - if next(iter(event.stations)) in subset: - event_groups[i].append(event) - break - else: - if optimizer: - optimizer.logger.warning('Did not find rotation %s in any subset' - 'of possible electrifiable stations', event.rotation.id) - # this event will no show up in an event_group. - # therefore it needs to be put into this set - could_not_be_electrified.update([event.rotation.id]) - - groups = list(zip(event_groups, station_subsets)) - return sorted(groups, key=lambda x: len(x[1])) - - -def join_all_subsets(subsets): - """ join sets for as long as needed until no elements share any intersections - :param subsets: iterable of sets - :return: joined subsets if they connect with other subsets in some way - """ - joined_subset = True - while joined_subset: - joined_subset, subsets = join_subsets(subsets) - return subsets - - -def join_subsets(subsets: typing.Iterable[set]): - """ Run through every subset and check with every other subset if there is an intersection - If an intersection is found. The subsets are joined and returned with a boolean of True. - If not intersection is found over all subsets False is returned which will cancel the outer - call in join_all_subsets - - :param subsets: iterable of sets - :return: boolean if joining subsets is finished (i.e. False if all subsets are connected - and thus far connected subsets - """ - subsets = [s.copy() for s in subsets] - for i in range(len(subsets)): - for ii in range(len(subsets)): - if i == ii: - continue - intersec = subsets[i].intersection(subsets[ii]) - if len(intersec) > 0: - subsets[i] = subsets[i].union(subsets[ii]) - subsets.remove(subsets[ii]) - return True, subsets - return False, subsets diff --git a/ebus_toolbox/optimizer_config.py b/ebus_toolbox/optimizer_config.py index 3297115f..e69de29b 100644 --- a/ebus_toolbox/optimizer_config.py +++ b/ebus_toolbox/optimizer_config.py @@ -1,101 +0,0 @@ -from datetime import datetime - - -class OptimizerConfig(): - def __init__(self): - self.debug_level = None - self.exclusion_rots = None - self.exclusion_stations = None - self.inclusion_stations = None - self.standard_opp_station = None - self.schedule = None - self.scenario = None - self.args = None - self.charge_eff = None - self.battery_capacity = None - self.charging_curve = None - self.charging_power = None - self.min_soc = None - self.solver = None - self.rebase_scenario = None - self.pickle_rebased = None - self.pickle_rebased_name = None - self.opt_type = None - self.remove_impossible_rots = None - self.node_choice = None - self.max_brute_loop = None - self.run_only_neg = None - self.estimation_threshold = None - self.output_path = None - self.check_for_must_stations = None - self.decision_tree_path = None - self.save_decision_tree = None - self.reduce_rots = None - self.rots = None - self.path = None - pass - - -def read_config(config_path): - import configparser - import json - - config_parser = configparser.ConfigParser() - config_parser.sections() - config_parser.read(config_path) - - conf = OptimizerConfig() - conf.path = config_path - - default = config_parser["DEFAULT"] - conf.debug_level = int(default.get("debug_level", 0)) - sce = config_parser["SCENARIO"] - conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) - conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) - conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) - conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) - - pi = config_parser["PICKLE"] - - conf.schedule = pi.get("schedule", "") - conf.scenario = pi.get("scenario", "") - conf.args = pi.get("args", "") - - vehicle = config_parser["VEHICLE"] - conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) - conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) - if conf.battery_capacity == 0: - conf.battery_capacity = None - conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) - if conf.charging_curve == []: - conf.charging_curve = None - conf.charging_power = float(vehicle.get("charging_power", 0)) - if conf.charging_power == 0: - conf.charging_power = None - conf.min_soc = float(vehicle.get("min_soc", 0.0)) - - optimizer = config_parser["OPTIMIZER"] - conf.solver = optimizer.get("solver", "spiceev") - conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) - conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) - conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", - "rebased_" + str( - datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) - conf.opt_type = optimizer.get("opt_type", "greedy") - conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) - conf.node_choice = optimizer.get("node_choice", "step-by-step") - conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) - conf.run_only_neg = optimizer.getboolean("run_only_neg", False) - conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) - conf.output_path = optimizer.get("output_path") - conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) - - special = config_parser["SPECIAL"] - conf.decision_tree_path = special.get("decision_tree_path", None) - if conf.decision_tree_path in ["", '""', "''"]: - conf.decision_tree_path = None - conf.save_decision_tree = special.getboolean("save_decision_tree", False) - conf.reduce_rots = special.getboolean("reduce_rots", False) - conf.rots = json.loads(special.get("rots", [])) - - return conf diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py new file mode 100644 index 00000000..2f5b06f5 --- /dev/null +++ b/ebus_toolbox/optimizer_util.py @@ -0,0 +1,509 @@ +""" Module for the class LowSocEvent which gathers functionality around +LowSocEvents, like evaluating them, gathering them and so on""" +import math +import os +import pickle +import sys +import typing +import warnings +from copy import copy +from datetime import timedelta, datetime +from time import time +import station_optimizer as stat_op +import numpy as np +from matplotlib import pyplot as plt + +from ebus_toolbox.consumption import Consumption +from ebus_toolbox.costs import calculate_costs +from ebus_toolbox.trip import Trip +from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev, uncomment_json_file + + +class OptimizerConfig: + def __init__(self): + self.debug_level = None + self.exclusion_rots = None + self.exclusion_stations = None + self.inclusion_stations = None + self.standard_opp_station = None + self.schedule = None + self.scenario = None + self.args = None + self.charge_eff = None + self.battery_capacity = None + self.charging_curve = None + self.charging_power = None + self.min_soc = None + self.solver = None + self.rebase_scenario = None + self.pickle_rebased = None + self.pickle_rebased_name = None + self.opt_type = None + self.remove_impossible_rots = None + self.node_choice = None + self.max_brute_loop = None + self.run_only_neg = None + self.estimation_threshold = None + self.output_path = None + self.check_for_must_stations = None + self.decision_tree_path = None + self.save_decision_tree = None + self.reduce_rots = None + self.rots = None + self.path = None + pass + + +def read_config(config_path): + import configparser + import json + + config_parser = configparser.ConfigParser() + config_parser.sections() + config_parser.read(config_path) + + conf = OptimizerConfig() + conf.path = config_path + + default = config_parser["DEFAULT"] + conf.debug_level = int(default.get("debug_level", 0)) + sce = config_parser["SCENARIO"] + conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) + conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) + conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) + conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) + + pi = config_parser["PICKLE"] + + conf.schedule = pi.get("schedule", "") + conf.scenario = pi.get("scenario", "") + conf.args = pi.get("args", "") + + vehicle = config_parser["VEHICLE"] + conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) + conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) + if conf.battery_capacity == 0: + conf.battery_capacity = None + conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) + if not conf.charging_curve: + conf.charging_curve = None + conf.charging_power = float(vehicle.get("charging_power", 0)) + if conf.charging_power == 0: + conf.charging_power = None + conf.min_soc = float(vehicle.get("min_soc", 0.0)) + + optimizer = config_parser["OPTIMIZER"] + conf.solver = optimizer.get("solver", "spiceev") + conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) + conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) + conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", + "rebased_" + str( + datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) + conf.opt_type = optimizer.get("opt_type", "greedy") + conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) + conf.node_choice = optimizer.get("node_choice", "step-by-step") + conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) + conf.run_only_neg = optimizer.getboolean("run_only_neg", False) + conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) + conf.output_path = optimizer.get("output_path") + conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) + + special = config_parser["SPECIAL"] + conf.decision_tree_path = special.get("decision_tree_path", None) + if conf.decision_tree_path in ["", '""', "''"]: + conf.decision_tree_path = None + conf.save_decision_tree = special.getboolean("save_decision_tree", False) + conf.reduce_rots = special.getboolean("reduce_rots", False) + conf.rots = json.loads(special.get("rots", [])) + + return conf + + +def get_charging_time(trip1, trip2, args): + """ Returns the charging time between trips as numeric value + + :param trip1: First trip + :param trip2: Following trip + :param args: arguments Namespace with default buffer time + :return: maximum possible charging time in minutes between trips + """ + standing_time_min = (trip2.departure_time - trip1.arrival_time) / timedelta(minutes=1) + buffer_time = (get_buffer_time(trip1, args.default_buffer_time_opps) / timedelta(minutes=1)) + standing_time_min -= buffer_time + + if args.min_charging_time > standing_time_min: + return 0 + return max(0, standing_time_min) + + +def get_buffer_time(trip, default_buffer_time_opps): + """ Return the buffer time as timedelta object + :param trip: trip object + :param default_buffer_time_opps: + :return: timedelta object for the buffer time + """ + return timedelta(minutes=get_buffer_time_spice_ev(trip, default_buffer_time_opps)) + + +def get_index_by_time(scenario, search_time): + """ Get the index for a given time + :param scenario: scenario object + :param search_time: search time as datetime object + :return: index as int + """ + start_time = scenario.start_time + delta_time = timedelta(minutes=60 / scenario.stepsPerHour) + idx = (search_time - start_time) // delta_time + return idx + + +def get_rotation_soc_util(rot_id, this_sched, this_scen, soc_data: dict = None): + rot = this_sched.rotations[rot_id] + rot_start_idx = get_index_by_time(this_scen, rot.departure_time) + rot_end_idx = get_index_by_time(this_scen, rot.arrival_time) + if soc_data: + return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx + return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx + + +def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: stat_op.StationOptimizer): + """get expected soc lift for a given start_soc and time_delta. + + :param soc_over_time_curve: + :param soc: + :param time_delta: + :param optimizer: + :return: + """ + # units for time_delta and time_curve are assumed to be the same, e.g. minutes + # first element which is bigger than current soc + if time_delta == 0: + return 0 + soc = max(min(optimizer.args.desired_soc_opps, soc), 0) + first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] + second_time = first_time + time_delta + # catch out of bounds if time of charging end is bigger than table values + + if second_time >= soc_over_time_curve[-1, 0]: + end_soc = soc_over_time_curve[-1, 1] + else: + end_soc = soc_over_time_curve[soc_over_time_curve[:, 0] >= second_time][0, 1] + + # make sure to limit delta soc to 1 if negative socs are given. They are possible during + # the optimization process but will be continuously raised until they are >0. + return min(optimizer.args.desired_soc_opps, optimizer.args.desired_soc_opps - start_soc, + end_soc - start_soc) + + +def evaluate(events: typing.Iterable[stat_op.LowSocEvent], + optimizer: stat_op.StationOptimizer, **kwargs): + """Analyse stations for "helpful" energy supply. Energy supply is helpful if the minimal soc of + an event is raised (up to a minimal soc (probably zero)). The supplied energy is approximated + by loading power, standing time at a station, soc at station and minimal soc of the event + + :param events: events to be evaulated + :param optimizer: StationOptimizer object with scenario and schedule data + :param kwargs: optional overwriting of soc_lower_thresh, soc_upper_thresh or soc_data + :return: sorted list with the best station and its potential on index 0 + :rtype: list(str(station_id), float(potential)) + """ + + soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) + soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) + soc_data = kwargs.get("soc_data", optimizer.scenario.vehicle_socs) + + station_eval = {} + # cycle through events and determine how much lift can be provided by electrifying a station + # the lift is determined by the soc position, standing time, power supply and charging curve + for e in events: + soc_over_time = optimizer.soc_charge_curve_dict[e.v_type][e.ch_type] + for i, trip in enumerate(e.trip): + # station is only evaluated if station name is part of event stations + # only these stations showed potential in electrification, e.g enough standing time + if trip.arrival_name not in e.stations: + continue + idx = get_index_by_time(optimizer.scenario, trip.arrival_time, ) + soc = soc_data[e.vehicle_id][idx] + + # potential is the minimal amount of + delta_soc_pot = min(soc_upper_thresh - soc, + soc_lower_thresh - e.min_soc, + soc - e.min_soc, + soc_upper_thresh - soc_lower_thresh) + + try: + standing_time_min = get_charging_time(trip, e.trip[i + 1], optimizer.args) + except IndexError: + standing_time_min = 0 + + pot_kwh = get_delta_soc(soc_over_time, soc, standing_time_min, optimizer) * e.capacity + + # potential is at max the minimum between the useful delta soc * capacity or the + # energy provided by charging for the full standing time + delta_e_pot = min(delta_soc_pot * e.capacity, pot_kwh) + try: + station_eval[trip.arrival_name] += delta_e_pot + except KeyError: + station_eval[trip.arrival_name] = delta_e_pot + + # sort by pot_sum + station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1])).items()) + station_eval.reverse() + return station_eval + + +def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None, + optimizer=None): + """ Create groups from events which need to be optimized together + + First it creates a simple list of station sets for single events. They are connected if they + share possible stations. + Electrified and other not possible to electrify stations should not connect groups + + :param events: events for a given state of a scenario + :param not_possible_stations: stations to be discarded + :param could_not_be_electrified: rotations to be discarded + :param optimizer: StationOptimizer object + :return: list((events, stations)) which give you events to optimize together with the stations + which might help them + """ + + # making sure default arguments are none and not mutable + if not not_possible_stations: + not_possible_stations = set() + + if not could_not_be_electrified: + could_not_be_electrified = set() + + possible_stations = [ + {station for station in event.stations if station not in not_possible_stations} + for event + in events] + # if stations overlap join them + station_subsets = join_all_subsets(possible_stations) + event_groups = [[] for __ in range(len(station_subsets))] + + # group the events in the same manner as stations, so that the same amount of event groups are + # created as station subsets + for event in events: + for i, subset in enumerate(station_subsets): + # every station from an event must share the same station sub_set. Therefore its enough + # to check only the first element + if len(event.stations) > 0: + if next(iter(event.stations)) in subset: + event_groups[i].append(event) + break + else: + if optimizer: + optimizer.logger.warning('Did not find rotation %s in any subset' + 'of possible electrifiable stations', event.rotation.id) + # this event will no show up in an event_group. + # therefore it needs to be put into this set + could_not_be_electrified.update([event.rotation.id]) + + groups = list(zip(event_groups, station_subsets)) + return sorted(groups, key=lambda x: len(x[1])) + + +def join_all_subsets(subsets): + """ join sets for as long as needed until no elements share any intersections + :param subsets: iterable of sets + :return: joined subsets if they connect with other subsets in some way + """ + joined_subset = True + while joined_subset: + joined_subset, subsets = join_subsets(subsets) + return subsets + + +def join_subsets(subsets: typing.Iterable[set]): + """ Run through every subset and check with every other subset if there is an intersection + If an intersection is found. The subsets are joined and returned with a boolean of True. + If not intersection is found over all subsets False is returned which will cancel the outer + call in join_all_subsets + + :param subsets: iterable of sets + :return: boolean if joining subsets is finished (i.e. False if all subsets are connected + and thus far connected subsets + """ + subsets = [s.copy() for s in subsets] + for i in range(len(subsets)): + for ii in range(len(subsets)): + if i == ii: + continue + intersec = subsets[i].intersection(subsets[ii]) + if len(intersec) > 0: + subsets[i] = subsets[i].union(subsets[ii]) + subsets.remove(subsets[ii]) + return True, subsets + return False, subsets + + +def toolbox_to_pickle(name, sched, scen, this_args): + """ Dump the 3 files to pickle files""" + args_name = "args_" + name + ".pickle" + with open(args_name, "wb") as f: + pickle.dump(this_args, f) + scen_name = "scenario_" + name + ".pickle" + with open(scen_name, "wb") as f: + pickle.dump(scen, f) + sched_name = "schedule_" + name + ".pickle" + with open(sched_name, "wb") as f: + pickle.dump(sched, f) + return sched_name, scen_name, args_name + + +def charging_curve_to_soc_over_time(charging_curve, capacity, args, + max_charge_from_grid=float('inf'), + time_step=0.1, efficiency=1): + """create charging curve as nested list of SOC, Power[kW] and capacity in [kWh]""" + # simple numeric creation of power over time --> to energy over time + normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) + soc = 0 + time = 0 + socs = [] + times = [] + while soc < args.desired_soc_opps: + times.append(time) + socs.append(soc) + power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) + soc2 = soc + time_step / 60 * power1 + power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) + power = (power1 + power2) / 2 * efficiency + soc += time_step / 60 * power + time += time_step + # fill the soc completely in last time step + times.append(time) + socs.append(args.desired_soc_opps) + return np.array((times, socs)).T + + +def get_missing_energy(events): + """ Sum up all the missing energies of the given events""" + missing_energy = 0 + for event in events: + missing_energy += event.min_soc * event.capacity + return missing_energy + + +def stations_hash(stations_set): + """ Create a simple str as hash for a set of stations""" + return str(sorted(list(stations_set))) + + +def combination_generator(iterable: typing.Iterable, amount: int): + """ Generator which yields all possible combinations of choosing + an amount out of an iterable without putting them back and without caring about the + order of elements + :param iterable: Any collection which can be cast to a list + :param amount: Number of elements which should be drawn from iterable + :type amount: int + """ + iterable = list(iterable) + + for i, item in enumerate(iterable): + # recursive calling of generator with clock like behavior, e.g right-most item changes until + # end of list is reached. This leads to a change in the item left to it and so on. Elements + # on the right can only change to a subset of bigger indices than their left counter-part. + # this is due to the ignoring of order, which reduces the amount of possibilities. + if amount <= 1: + yield [item] + else: + for gen in combination_generator(iterable[i + 1:], amount - 1): + yield [item] + gen + + +def toolbox_from_pickle(sched_name, scen_name, args_name): + """ Load the 3 files from pickle""" + with open(args_name, "rb") as f: + this_args = pickle.load(f) + with open(scen_name, "rb") as f: + scen = pickle.load(f) + with open(sched_name, "rb") as f: + sched = pickle.load(f) + return sched, scen, this_args + + +def combs_unordered_no_putting_back(n: int, k: int): + """ Returns amount of combinations for pulling k elements out of n, without putting elements + back or looking at the order. this is equal to n over k + :param n: number of elements in the base group + :type n: int + :param k: number of elements in the sub group of picked elements + :type k: int + :return: number of combinations + :rtype: int + """ + try: + return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) + except ValueError: + warnings.warn("Value Error") + return 0 + + +def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): + """Run a given schedule and electrify stations if need be""" + this_sched2 = copy(this_sched) + this_sched2.stations = electrified_stations + this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, + electrified_stations=electrified_stations) + # Dont print output from spice ev to reduce clutter + sys.stdout = open(os.devnull, 'w') + + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + new_scen.run('distributed', vars(this_args).copy()) + sys.stdout = sys.__stdout__ + if this_args.cost_calculation and cost_calc: + # cost calculation following directly after simulation + try: + with open(this_args.cost_parameters_file, encoding='utf-8') as f: + cost_parameters_file = uncomment_json_file(f) + except FileNotFoundError: + raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " + "does not exist. Exiting...") + calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) + return this_sched2, new_scen + + +def preprocess_schedule(this_sched, this_args, electrified_stations=None): + Trip.consumption = Consumption(this_sched.vehicle_types, + outside_temperatures=this_args.outside_temperature_over_day_path, + level_of_loading_over_day=this_args.level_of_loading_over_day_path) + + this_sched.stations = electrified_stations + this_sched.calculate_consumption() + this_sched.assign_vehicles() + + return this_sched, this_sched.generate_scenario(this_args) + + +def print_time(start=[]): + """ Print the time and automatically set start time to the first time the function getting + called""" + if not start: + start.append(time()) + print(round(time() - start[0], 2), " seconds till start") + + +def plot_(data): + """ Simple plot of data without having to create subplots""" + fig, ax = plt.subplots() + ax.plot(data, linewidth=2.0) + return ax + + +def plot_rot(rot_id, this_sched, this_scen, ax=None, rot_only=True): + """ Simple plot of data without having to create subplots""" + soc, start, end = get_rotation_soc_util(rot_id, this_sched, this_scen) + if not rot_only: + start = 0 + end = -1 + if ax is None: + fig, ax = plt.subplots() + ax.plot(soc[start:end], linewidth=2.0) + return ax + ax.plot(soc[start:end], linewidth=2.0) + return ax diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index e5b2553f..47e2b990 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -1,33 +1,18 @@ """ Optimizer that evaluates inputs and outputs of every iteration, adapting scenario setup to optimize for specified metrics. """ -from datetime import datetime, timedelta +from datetime import datetime import json -import os -import sys -import warnings -import pickle -from copy import copy from pathlib import Path from time import time import logging -import math import shutil -import numpy as np import matplotlib -import matplotlib.pyplot as plt - import ebus_toolbox.station_optimizer -from ebus_toolbox.low_soc_events import get_low_soc_events, get_rotation_soc - -from ebus_toolbox.consumption import Consumption -from ebus_toolbox.trip import Trip -from ebus_toolbox.costs import calculate_costs -from ebus_toolbox.util import uncomment_json_file, get_buffer_time as get_buffer_time_spice_ev -from optimizer_config import read_config, OptimizerConfig +import ebus_toolbox.optimizer_util as opt_util -CONFIG = OptimizerConfig() +config = opt_util.OptimizerConfig() matplotlib.use("TkAgg") @@ -36,7 +21,7 @@ def time_it(function, timers={}): take and count how often they happen :param function: function do be decorated :type function: function - :param timers: storage for cumlulated time and call number + :param timers: storage for cumulated time and call number :type timers: dict :return decorated function or timer if given function is None :rtype function or dict @@ -56,15 +41,16 @@ def decorated_function(*this_args, **kwargs): timers[key] = dict(time=0, calls=1) timers[key]["time"] += delta_time return return_value - - return decorated_function + sorted_timer = dict(sorted(timers.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) return sorted_timer -def setup_logger(): +def setup_logger(this_args, conf): """ setup file and stream logging by config and args arguments + :param conf: configuration object + :param this_args: Namespace object of arguments for ebus toolbox :return: logger :rtype: Logger """ @@ -73,11 +59,12 @@ def setup_logger(): # logging to one file which keeps track of optimization over many runs file_handler_all_opts = logging.FileHandler('optimizer.log') - file_handler_all_opts.setLevel(CONFIG.debug_level) + file_handler_all_opts.setLevel(conf.debug_level) # and logging to a file which is put in the folder with the other optimizer results - file_handler_this_opt = logging.FileHandler(Path(ARGS.output_directory) / Path('optimizer.log')) - file_handler_this_opt.setLevel(CONFIG.debug_level) + file_handler_this_opt = logging.FileHandler(Path(this_args.output_directory) / + Path('optimizer.log')) + file_handler_this_opt.setLevel(conf.debug_level) formatter = logging.Formatter('%(asctime)s:%(message)s', "%m%d %H%M%S") @@ -88,7 +75,7 @@ def setup_logger(): formatter = logging.Formatter('%(message)s') stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) - stream_handler.setLevel(CONFIG.debug_level) + stream_handler.setLevel(conf.debug_level) this_logger.addHandler(file_handler_this_opt) this_logger.addHandler(file_handler_all_opts) this_logger.addHandler(stream_handler) @@ -99,24 +86,25 @@ def main(): """ main call""" config_path = "./data/examples/optimizer.cfg" run_optimization(config_path) - LOGGER.debug(time_it(None)) -def prepare_filesystem(): - """ Prepare files and folders in the optimization results folder""" +def prepare_filesystem(this_args, conf): + """ Prepare files and folders in the optimization results folder + :param conf: configuration object + :param this_args: Namespace object of arguments for ebus toolbox + """ now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - ARGS.output_directory = Path(CONFIG.output_path) / str(now + "_optimizer") - # create subfolder for specific sim results with timestamp. + this_args.output_directory = Path(conf.output_path) / str(now + "_optimizer") + # create sub folder for specific sim results with timestamp. # if folder doesnt exists, create folder. - ARGS.output_directory.mkdir(parents=True, exist_ok=True) + this_args.output_directory.mkdir(parents=True, exist_ok=True) # copy paste the config file - copy_file = Path(CONFIG.path) - destination = ARGS.output_directory / Path("optimizer_config.cfg") + copy_file = Path(conf.path) + destination = this_args.output_directory / Path("optimizer_config.cfg") shutil.copy(copy_file, destination) -@time_it def run_optimization(config_path, sched=None, scen=None, this_args=None): """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. @@ -138,37 +126,33 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): :return: (Schedule,Scenario) optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - global CONFIG - global LOGGER - global ARGS - CONFIG = read_config(config_path) + conf = opt_util.read_config(config_path) # load pickle files if sched is None or scen is None or this_args is None: # if no schedule was given as argument, make sure no scenario # and args input was given as well. assert sched == scen == this_args is None - sched, scen, this_args = toolbox_from_pickle(CONFIG.schedule, CONFIG.scenario, CONFIG.args) - ARGS = this_args + sched, scen, this_args = opt_util.toolbox_from_pickle(conf.schedule, conf.scenario, conf.args) + args = this_args # prepare Filesystem with folders and paths and copy config - prepare_filesystem() + prepare_filesystem(args, conf) - if ARGS.save_soc: - ARGS.save_soc = ARGS.output_directory / "simulation_soc_spiceEV.csv" - new_ele_stations_path = ARGS.output_directory / Path("optimized_stations" + ".json") + if args.save_soc: + args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" + new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") - LOGGER = setup_logger() + logger = setup_logger(args, conf) # remove those args, since they lead to file creation, which is not # needed. - del ARGS.save_timeseries - del ARGS.save_results - if ARGS.desired_soc_deps != 1 and CONFIG.opt_type == "quick": - LOGGER.error("Fast calc is not yet optimized for desired socs unequal to 1") - - optimizer = ebus_toolbox.station_optimizer.StationOptimizer(sched, scen, ARGS, CONFIG, LOGGER) + del args.save_timeseries + del args.save_results + if args.desired_soc_deps != 1 and conf.opt_type == "quick": + logger.error("Fast calc is not yet optimized for desired socs unequal to 1") + optimizer = ebus_toolbox.station_optimizer.StationOptimizer(sched, scen, args, conf, logger) # set battery and charging curves through config file if wished for optimizer.set_battery_and_charging_curves() @@ -178,7 +162,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations - if CONFIG.rebase_scenario: + if conf.rebase_scenario: must_include_set, ele_stations = optimizer.rebase_spice_ev() else: must_include_set, ele_stations = optimizer.rebase_simple() @@ -188,156 +172,47 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # Remove none Values from socs in the vehicle_socs an optimizer.remove_none_socs() - if CONFIG.remove_impossible_rots: + if conf.remove_impossible_rots: neg_rots = optimizer.get_negative_rotations_all_electrified() optimizer.config.exclusion_rots.update(neg_rots) optimizer.schedule.rotations = {r: optimizer.schedule.rotations[r] for r in optimizer.schedule.rotations if r not in optimizer.config.exclusion_rots} - LOGGER.warning("%s negative rotations %s", len(neg_rots), neg_rots) - - - + logger.warning("%s negative rotations %s", len(neg_rots), neg_rots) - if CONFIG.check_for_must_stations: + if conf.check_for_must_stations: must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) - LOGGER.warning("%s must stations %s", len(must_stations), must_stations) + logger.warning("%s must stations %s", len(must_stations), must_stations) - LOGGER.debug("Starting greedy optimization") - print_time() + logger.debug("Starting greedy optimization") ele_stations, ele_station_set = optimizer.loop() - - print_time() ele_station_set = ele_station_set.union(must_include_set) - LOGGER.debug("Functions took these times in seconds") - LOGGER.debug("%s electrified stations : %s", len(ele_station_set), ele_station_set) - LOGGER.debug("%s total stations", len(ele_stations)) - LOGGER.debug(optimizer.could_not_be_electrified) + logger.debug("%s electrified stations : %s", len(ele_station_set), ele_station_set) + logger.debug("%s total stations", len(ele_stations)) + logger.debug("These rotations could not be electrified: %s", optimizer.could_not_be_electrified) scen.vehicle_socs = optimizer.timeseries_calc() - new_events = get_low_soc_events(optimizer, soc_data=scen.vehicle_socs) + new_events = optimizer.get_low_soc_events(soc_data=scen.vehicle_socs) if len(new_events) > 0: - LOGGER.debug("Still not electrified with abs. soc with fast calc") + logger.debug("Still not electrified with abs. soc with fast calc") for event in new_events: - LOGGER.debug(event.rotation.id) - LOGGER.debug("#####") - + logger.debug(event.rotation.id) with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) - LOGGER.debug("Spice EV is calculating optimized case as a complete scenario") + logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False, cost_calc=True) - LOGGER.warning("Still negative rotations: %s", optimizer.schedule. + logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) print("Finished") - return optimizer.schedule, optimizer.scenario - - -@time_it -def print_time(start=[]): - """ Print the time and automatically set start time to the first time the function getting - called""" - if not start: - start.append(time()) - print(round(time() - start[0], 2), " seconds till start") - - -@time_it -def plot_(data): - """ Simple plot of data without having to create subplots""" - fig, ax = plt.subplots() - ax.plot(data, linewidth=2.0) - return ax - - -def plot_rot(rot_id, this_sched, this_scen, ax=None, rot_only=True): - """ Simple plot of data without having to create subplots""" - soc, start, end = get_rotation_soc(rot_id, this_sched, this_scen) - if not rot_only: - start = 0 - end = -1 - if ax is None: - fig, ax = plt.subplots() - ax.plot(soc[start:end], linewidth=2.0) - return ax - ax.plot(soc[start:end], linewidth=2.0) - return ax - - - -@time_it -def preprocess_schedule(this_sched, this_args, electrified_stations=None): - Trip.consumption = Consumption(this_sched.vehicle_types, - outside_temperatures=this_args.outside_temperature_over_day_path, - level_of_loading_over_day=this_args.level_of_loading_over_day_path) - - this_sched.stations = electrified_stations - this_sched.calculate_consumption() - this_sched.assign_vehicles() - - return this_sched, this_sched.generate_scenario(this_args) - - -@time_it -def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): - """Run a given schedule and electrify stations if need be""" - this_sched2 = copy(this_sched) - this_sched2.stations = electrified_stations - this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, - electrified_stations=electrified_stations) - # Dont print output from spice ev to reduce clutter - sys.stdout = open(os.devnull, 'w') - - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - new_scen.run('distributed', vars(this_args).copy()) - sys.stdout = sys.__stdout__ - if this_args.cost_calculation and cost_calc: - # cost calculation following directly after simulation - try: - with open(this_args.cost_parameters_file, encoding='utf-8') as f: - cost_parameters_file = uncomment_json_file(f) - except FileNotFoundError: - raise SystemExit(f"Path to cost parameters ({ARGS.cost_parameters_file}) " - "does not exist. Exiting...") - calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) - return this_sched2, new_scen - - -@time_it -def combs_unordered_no_putting_back(n: int, k: int): - """ Returns amount of combinations for pulling k elements out of n, without putting elements - back or looking at the order. this is equal to n over k - :param n: number of elements in the base group - :type n: int - :param k: number of elements in the sub group of picked elements - :type k: int - :return: number of combinations - :rtype: int - """ - try: - return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) - except ValueError: - LOGGER.warning("Value Error") - return 0 - - - + logger.debug(time_it(None)) + return optimizer.schedule, optimizer.scenario -def toolbox_from_pickle(sched_name, scen_name, args_name): - """ Load the 3 files from pickle""" - with open(args_name, "rb") as f: - this_args = pickle.load(f) - with open(scen_name, "rb") as f: - scen = pickle.load(f) - with open(sched_name, "rb") as f: - sched = pickle.load(f) - return sched, scen, this_args if __name__ == "__main__": main() diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 732acaa1..1ba2234f 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -1,28 +1,24 @@ """ Optimizer class which implements the optimizer object and methods needed""" import json -import typing -from copy import copy, deepcopy -from datetime import timedelta +import logging import pickle +from copy import deepcopy, copy +from datetime import datetime, timedelta from pathlib import Path + import numpy as np -import logging +import optimizer_util as op_util +from src import scenario import schedule from ebus_toolbox import report, rotation -from src import scenario -from optimizer_config import OptimizerConfig -from low_soc_events import evaluate, get_low_soc_events, get_groups_from_events, get_delta_soc, \ - get_buffer_time, get_charging_time, get_index_by_time,\ - get_rotation_soc as get_rotation_soc_low_soc -import station_optimization as opt class StationOptimizer: """ Class for station optimization""" def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, - config: OptimizerConfig(), logger: logging.Logger, **kwargs): + config: 'op_util.OptimizerConfig', logger: logging.Logger): self.base_not_possible_stations = set() self.could_not_be_electrified = set() self.must_include_set = set() @@ -58,23 +54,23 @@ def loop(self, **kwargs): in the optimal found case """ - node_choice=kwargs.get("node_choice", self.config.node_choice) - opt_type=kwargs.get("opt_type", self.config.opt_type) + node_choice = kwargs.get("node_choice", self.config.node_choice) + opt_type = kwargs.get("opt_type", self.config.opt_type) self.base_scenario = copy(self.scenario) self.base_schedule = copy(self.schedule) - self.base_stations = self.electrified_stations.copy() + self.base_stations = self.electrified_stations.copy() self.base_electrified_station_set = self.electrified_station_set.copy() self.base_not_possible_stations = self.not_possible_stations.copy() # get events where soc fell below 0. The events contain info about the problematic # time span, which includes stations which could provide a soc lift - base_events = get_low_soc_events(self, rel_soc=False, - soc_data=self.base_scenario.vehicle_socs) + base_events = self.get_low_soc_events(rel_soc=False, + soc_data=self.base_scenario.vehicle_socs) # check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible - groups = get_groups_from_events(base_events, self.not_possible_stations, + groups = op_util.get_groups_from_events(base_events, self.not_possible_stations, could_not_be_electrified=self.could_not_be_electrified, optimizer=self) @@ -120,7 +116,7 @@ def loop(self, **kwargs): else: choice_func = self.choose_station_step_by_step - combinations = opt.combs_unordered_no_putting_back(len(stations), + combinations = op_util.combs_unordered_no_putting_back(len(stations), len(list_greedy_sets[group_nr]) - 1) self.logger.debug("There are %s combinations with 1 station less than " "the current solution", combinations) @@ -133,7 +129,7 @@ def loop(self, **kwargs): print(len(self.decision_tree), " nodes checked") print(f"Optimal solution has length {len(pre_optimized_set)}") self.electrified_stations = self.base_stations.copy() - self.electrified_station_set= self.base_electrified_station_set.copy() + self.electrified_station_set = self.base_electrified_station_set.copy() self.scenario = copy(self.base_scenario) self.schedule = copy(self.base_schedule) @@ -145,7 +141,7 @@ def loop(self, **kwargs): new_stats, cont_loop = self.group_optimization(group, choice_func, track_not_possible_rots=False, pre_optimized_set=pre_optimized_set, - events_remaining = [len(events)], + events_remaining=[len(events)], **kwargs) new_electrified_set = self.electrified_station_set @@ -153,7 +149,7 @@ def loop(self, **kwargs): if new_electrified_set != pre_optimized_set and new_stats is not None: self.logger.warning("Optimized with %s stations %s %s", len(new_electrified_set), str('#' * 20), - stations_hash(new_electrified_set)) + op_util.stations_hash(new_electrified_set)) sols.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): list_greedy_sets[group_nr] = new_electrified_set.copy() @@ -183,13 +179,13 @@ def get_negative_rotations_all_electrified(self, rel_soc=False): :param rel_soc: if true, the start soc is handled like it has the desired deps soc :return: set of rotation ids which are negative even with all stations electrified """ - events = get_low_soc_events(self, rel_soc=rel_soc) + events = self.get_low_soc_events(rel_soc=rel_soc) stats = {stat for event in events for stat in event.stations_list if stat not in self.not_possible_stations} electrified_station_set = set(stats) vehicle_socs = self.timeseries_calc(ele_station_set=electrified_station_set) - new_events = get_low_soc_events(self, soc_data=vehicle_socs) + new_events = self.get_low_soc_events(soc_data=vehicle_socs) return {event.rotation.id for event in new_events} def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, @@ -235,11 +231,11 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # call above. Important not to use the scenario in optimizer, since it gets overwritten # every call and only relevant trips are adjusted. This leads to problems # when the recursive call goes on a higher level eg. level 0 - level 1 - level 2 - level 1 - station_eval = evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) + station_eval = op_util.evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) # get rotations from event dict and calculate the missing energy rotation_dict = {e.rotation.id: e.rotation for e in event_group} - missing_energy = get_missing_energy(event_group) + missing_energy = op_util.get_missing_energy(event_group) if missing_energy >= 0: self.logger.debug("Already electrified: Returning") return self.electrified_stations, True @@ -270,7 +266,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ return None, False self.logger.debug("%s, with first pot of %s", best_station_ids, - round(stat_eval_dict[best_station_ids[0]],1)) + round(stat_eval_dict[best_station_ids[0]], 1)) # electrify station(s) for stat_id in best_station_ids: @@ -290,8 +286,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ electrify_stations=best_station_ids) else: self.schedule.rotations = rotation_dict - self.schedule, self.scenario = \ - opt.run_schedule(self.schedule, self.args, + self.schedule, self.scenario = op_util.run_schedule(self.schedule, self.args, electrified_stations=self.electrified_stations) kwargs["lifted_socs"] = self.scenario.vehicle_socs.copy() @@ -299,10 +294,10 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ self.not_possible_stations = set(self.electrified_stations.keys()).union( self.not_possible_stations) event_rotations_ids = {event.rotation.id for event in event_group} - new_events = get_low_soc_events(self, rotations=event_rotations_ids, - rel_soc=True, **kwargs) + new_events = self.get_low_soc_events(rotations=event_rotations_ids, + rel_soc=True, **kwargs) - delta_energy = get_missing_energy(new_events) + delta_energy = op_util.get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) self.logger.debug("Last electrification electrified %s/%s." " %s remaining events in the base group.", @@ -321,13 +316,13 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ return None, True # check if the events can be divided into subgroups which are independent - groups = get_groups_from_events(new_events, self.not_possible_stations, + groups = op_util.get_groups_from_events(new_events, self.not_possible_stations, could_not_be_electrified, optimizer=self) for k, this_group in enumerate(groups): this_tree = tree_position.copy() - this_tree.append(k+1) + this_tree.append(k + 1) kwargs["tree_position"] = this_tree new_stations, _ = \ self.group_optimization(this_group, choose_station_function, @@ -343,18 +338,15 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # if there is no pre optimized set function can return if pre_optimized_set is None: continue - # if there is a pre optimized set check if the preoptimized set leads to pruning # i.e. if if following branch makes sense if len(pre_optimized_set) - len(self.electrified_station_set) < 10: self.scenario.vehicle_socs = \ self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) - - prune_events = \ - get_low_soc_events(self, rotations=event_rotations_ids, rel_soc=True, **kwargs) - - station_eval = evaluate(prune_events, self) - prune_missing_energy = get_missing_energy(prune_events) + prune_events = self.get_low_soc_events(rotations=event_rotations_ids, + rel_soc=True, **kwargs) + station_eval = op_util.evaluate(prune_events, self) + prune_missing_energy = op_util.get_missing_energy(prune_events) if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, prune_missing_energy): self.logger.debug("Branch pruned early") @@ -435,14 +427,14 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, for i, trip in enumerate(rot.trips): if trip.arrival_name not in ele_stations: continue - idx = get_index_by_time(self.scenario, trip.arrival_time) + idx = op_util.get_index_by_time(self.scenario, trip.arrival_time) try: - standing_time_min = get_charging_time(trip, rot.trips[i + 1], self.args) + standing_time_min = op_util.get_charging_time(trip, rot.trips[i + 1], self.args) except IndexError: standing_time_min = 0 - d_soc = get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min, self) - buffer_idx = int((get_buffer_time(trip, self.args.default_buffer_time_opps)) + d_soc = op_util.get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min, self) + buffer_idx = int((op_util.get_buffer_time(trip, self.args.default_buffer_time_opps)) / timedelta(minutes=1)) delta_idx = int(standing_time_min) + 1 old_soc = soc[idx + buffer_idx:idx + buffer_idx + delta_idx].copy() @@ -493,7 +485,7 @@ def is_branch_promising(self, station_eval, electrified_station_set, pot += station_eval[i][1] if pot < -missing_energy * self.config.estimation_threshold: print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", - stations_hash(electrified_station_set)) + op_util.stations_hash(electrified_station_set)) return False return True @@ -503,7 +495,7 @@ def node_to_tree(self, delta_base_energy): :return decision tree :rtype dict() """ - node_name = stations_hash(self.electrified_station_set) + node_name = op_util.stations_hash(self.electrified_station_set) try: self.decision_tree[node_name]["missing_energy"] = delta_base_energy self.decision_tree[node_name]["visit_counter"] += 1 @@ -532,11 +524,11 @@ def choose_station_brute(self, station_eval, try: generator = gens[str(station_ids) + str(len(pre_optimized_set) - 1)] except KeyError: - generator = combination_generator(station_ids, len(pre_optimized_set) - 1) + generator = op_util.combination_generator(station_ids, len(pre_optimized_set) - 1) gens[str(station_ids) + str(len(pre_optimized_set) - 1)] = generator station_eval_dict = {stat[0]: stat[1] for stat in station_eval} for comb in generator: - node_name = stations_hash(comb) + node_name = op_util.stations_hash(comb) if node_name not in self.decision_tree: # only check the brute force station if they have the remote chance of fulfilling # the missing energy @@ -584,7 +576,7 @@ def choose_station_step_by_step(self, station_eval, check_stations = self.electrified_station_set.union([station]) if self.decision_tree is not None: - node_name = stations_hash(check_stations) + node_name = op_util.stations_hash(check_stations) if node_name in self.decision_tree.keys(): min_nr_visited = min(min_nr_visited, self.decision_tree[node_name]["visit_counter"]) @@ -601,14 +593,13 @@ def choose_station_step_by_step(self, station_eval, # create a station combination from already electrified stations # and possible new station check_stations = self.electrified_station_set.union([station]) - if self.decision_tree[stations_hash(check_stations)]["visit_counter"] == min_nr_visited: + if self.decision_tree[op_util.stations_hash(check_stations)]["visit_counter"] == min_nr_visited: best_station_id = station return [best_station_id], True return None, True def set_battery_and_charging_curves(self): """ Create battery and charging curves for fast lookup - :return: Void """ for v_type in self.schedule.vehicle_types.values(): for vehicle in v_type.values(): @@ -619,19 +610,21 @@ def set_battery_and_charging_curves(self): def set_up_decision_tree(self): """ Load decision tree if given in the config - :return: Void """ if self.config.decision_tree_path is not None: with open(self.config.decision_tree_path, "rb") as file: self.decision_tree = self.config.load(file) def rebase_spice_ev(self): + """ Rebase the scenario meaning configuring various variables according to the input data + and running a spice ev simulation + """ self.logger.debug("Spice EV Rebasing Scenario") must_include_set, ele_stations = self.preprocessing_scenario( run_only_neg=self.config.run_only_neg) self.logger.debug("Rebasing finished") if self.config.pickle_rebased: - toolbox_to_pickle(self.config.pickle_rebased_name, self.schedule, self.scenario, + op_util.toolbox_to_pickle(self.config.pickle_rebased_name, self.schedule, self.scenario, self.args) self.logger.debug("Rebased scenario pickled as %s", self.config.pickle_rebased_name) @@ -640,6 +633,8 @@ def rebase_spice_ev(self): return must_include_set, ele_stations def rebase_simple(self): + """ Rebase the scenario meaning configuring various variables according to the input data + """ must_include_set = set() # electrify inclusion stations for stat in self.config.inclusion_stations: @@ -652,10 +647,16 @@ def rebase_simple(self): def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, cost_calc=False): - """ Prepare scenario and run schedule + """Prepare scenario and run schedule + :param electrified_stations: optional dict of electrified stations to use in simulation. + Default None leads to using optimizer.electrified_stations + :param run_only_neg: should only negative rotations be simulated + :param cost_calc: should costs be calculated :return schedule, scenario, electrified_station_set, electrified_stations - :rtype (schedule.Schedule(), scenario.Scneario(), set(), dict()) + :rtype (schedule.Schedule, scenario.Scenario, set(), dict()) """ + if not electrified_stations: + electrified_stations = self.electrified_stations must_include_set = set() # electrify inclusion stations for stat in self.config.inclusion_stations: @@ -672,8 +673,8 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, r not in self.config.exclusion_rots} self.schedule.rotations = rots - new_sched, new_scen = opt.run_schedule(self.schedule, self.args, - self.electrified_stations, + new_sched, new_scen = op_util.run_schedule(self.schedule, self.args, + electrified_stations, cost_calc=cost_calc) report.generate(new_sched, new_scen, self.args) self.schedule = new_sched @@ -682,7 +683,10 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, return must_include_set, electrified_stations def electrify_station(self, stat, electrified_set): - """electrify a station and keep track of it in the electrified set file""" + """electrify a station and keep track of it in the electrified set file + :param stat: station id to be electrified + :param electrified_set:the set that is mutated along the electrification + """ self.electrified_stations[stat] = self.config.standard_opp_station electrified_set.add(stat) @@ -694,17 +698,22 @@ def create_charging_curves(self): soc_charge_curve_dict[v_type_name] = {} for name, v_type in self.schedule.vehicle_types.items(): for ch_type, data in v_type.items(): - soc_charge_curve_dict[name][ch_type] = charging_curve_to_soc_over_time( + soc_charge_curve_dict[name][ch_type] = op_util.charging_curve_to_soc_over_time( data["charging_curve"], data["capacity"], self.args, self.schedule.cs_power_opps, efficiency=self.config.charge_eff, time_step=0.1) self.soc_charge_curve_dict = soc_charge_curve_dict def get_must_stations_and_rebase(self, relative_soc=False): - """Electrify everything minus 1 station. If without the stations there are below zero events - it is a must have station""" + """ Get the stations that must be electrified and put them into the electrified stations + and an extra set of must stations + Electrify everything minus 1 station. If without the stations there are below zero events + it is a must have station - events = get_low_soc_events(self, rel_soc=relative_soc) + :param relative_soc: should the evaluation use the relative or absolute soc + :return: Set(Station_ids) + """ + events = self.get_low_soc_events(rel_soc=relative_soc) stats = {station for event in events for station in event.stations_list if station not in self.not_possible_stations} @@ -752,26 +761,34 @@ def remove_none_socs(self): soc[soc == np.array(None)] = last_not_none self.scenario.vehicle_socs[v_id] = soc - - def get_rotation_soc(self, rot_id, soc_data: dict = None): - """ gets you the soc object with start and end index for a given rotation id + """ Gets you the soc object with start and end index for a given rotation id :param rot_id: rotation_id :param soc_data: optional soc_data if not the scenario data should be used :return: tuple with soc array, start index and end index """ - return get_rotation_soc_low_soc(rot_id, self.schedule, self.scenario, soc_data=soc_data) + return op_util.get_rotation_soc_util(rot_id, self.schedule, self.scenario, soc_data=soc_data) - - def get_index_by_time(self, search_time): + def get_index_by_time(self, search_time: datetime): + """Get the index for a given time. + :param search_time: The time for which to return the index as datetime object + :return: the time corresponding to the given index. + """ start_time = self.scenario.start_time delta_time = timedelta(minutes=60 / self.scenario.stepsPerHour) idx = (search_time - start_time) // delta_time return idx def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): - # return trips in a rotation from a start to an end index, if the arrival time is in between - # the start and end idx + """ Get trips in a rotation from a start to an end index, if the arrival time is in between + the start and end idx + + :param rot: The rotation object containing the trips. + :param start_idx: The start index, representing the start time. + :param end_idx:self The end index, representing the end time. + :return: A list of trip objects that arrive between the start and end time. + """ + start_time_event = self.get_time_by_index(start_idx) end_time_event = self.get_time_by_index(end_idx) @@ -783,83 +800,138 @@ def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): return trips def get_time_by_index(self, idx): + """Get the time for a given index. + + :param idx: The index for which to return the time. + :return: the time corresponding to the given index. + """ + start_time = self.scenario.start_time delta_time = timedelta(minutes=60 / self.scenario.stepsPerHour) searched_time = start_time + delta_time * idx return searched_time + def get_low_soc_events(self, rotations=None, filter_standing_time=True, + rel_soc=False, soc_data=None, **kwargs): + """ Gather low soc events below the config threshold. + + :param optimizer: StationOptimizer which defines the search conditions as well as + the scenario and schedule + :param rotations: rotations to be searched for low soc events. Default None means whole + schedule is searched + :param filter_standing_time: Should the stations be filtered by standing time. True leads to + an output only stations with charging potential + :param rel_soc: Defines if the start soc should be seen as full even when not. If the rel_soc + is false, it means coupled rotations might be prone to errors due to impossible lifts. + :param soc_data: soc data to be used. Default None means the soc data from the optimizer + scenario is used + :param kwargs: optional soc_lower_tresh or soc_upper_thresh if from optimizer differing values + should be used + :return: list(LowSocEvents) + """ + if not rotations: + rotations = self.schedule.rotations + + soc_lower_thresh = kwargs.get("soc_lower_thresh", self.config.min_soc) + soc_upper_thresh = kwargs.get("soc_upper_thresh", self.args.desired_soc_deps) + # Create list of events which describe trips which end in a soc below zero + # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 + # Properties before and after these points have no effect on the event itself, similar to + # an event horizon + events = [] + count_electrified_rot = 0 + + for rot_id in rotations: + rot = self.schedule.rotations[rot_id] + soc, rot_start_idx, rot_end_idx = self.get_rotation_soc(rot_id, soc_data) + idx = range(0, len(soc)) + comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] + min_soc, min_idx = min(comb, key=lambda x: x[0]) + reduced_list = comb.copy() + soc_lower_thresh_cur = soc_lower_thresh + # if rotation gets a start soc below 1 this should change below 0 soc events since fixing + # the rotation before would lead to fixing this rotation + + # if using relative SOC, SOC lookup has to be adjusted + if rel_soc: + start_soc = comb[0][0] + soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( + soc_upper_thresh - soc_lower_thresh) + soc_upper_thresh = soc_lower_thresh_cur + soc_upper_thresh + if min_soc >= soc_lower_thresh_cur: + count_electrified_rot += 1 + while min_soc < soc_lower_thresh_cur: + i = min_idx + idx = [x[1] for x in reduced_list] + while soc[i] < soc_upper_thresh: + if i == rot_start_idx: + break + i -= 1 + start_comb = idx.index(i) + start = i + i = min_idx + while soc[i] < soc_upper_thresh: + if i >= rot_end_idx - 1: + break + i += 1 + end_comb = idx.index(i) + trips = self.get_trips(rot=rot, start_idx=start, end_idx=min_idx) + possible_stations = set() + possible_stations_list = [] + if not filter_standing_time: + possible_stations = {t.arrival_name for t in trips} + possible_stations_list = [t.arrival_name for t in trips] + else: + for ii, trip in enumerate(trips): + try: + standing_time_min = op_util.get_charging_time(trip, trips[ii + 1], + self.args) + except IndexError: + standing_time_min = 0 + if standing_time_min > 0: + possible_stations.add(trip.arrival_name) + possible_stations_list.append(trip.arrival_name) + + possible_stations = possible_stations.difference(self.not_possible_stations) + cht = rot.vehicle_id.find("depb") + ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" + v_type = rot.vehicle_id.split("_" + ch_type)[0] + event = LowSocEvent(start_idx=start, end_idx=min_idx, + min_soc=min_soc, stations=possible_stations, + vehicle_id=rot.vehicle_id, trip=trips, + rotation=rot, stations_list=possible_stations_list, + capacity=self.schedule.vehicle_types[v_type][ch_type][ + 'capacity'], + v_type=v_type, ch_type=ch_type) + + events.append(event) + copy_list = reduced_list.copy() + reduced_list = reduced_list[:start_comb] + if end_comb + 1 <= len(copy_list): + reduced_list.extend(copy_list[end_comb + 1:]) + if len(reduced_list) > 0: + min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) + else: + break + return events + + +class LowSocEvent: + event_counter = 0 + + def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rotation, + stations_list, capacity, v_type, ch_type): + self.start_idx = start_idx + self.end_idx = end_idx + self.min_soc = min_soc + self.stations = stations + self.vehicle_id = vehicle_id + self.trip = trip + self.rotation = rotation + self.stations_list = stations_list + self.capacity = capacity + self.v_type = v_type + self.ch_type = ch_type + self.event_counter = LowSocEvent.event_counter + LowSocEvent.event_counter += 1 -def toolbox_to_pickle(name, sched, scen, this_args): - """ Dump the 3 files to pickle files""" - args_name = "args_" + name + ".pickle" - with open(args_name, "wb") as f: - pickle.dump(this_args, f) - scen_name = "scenario_" + name + ".pickle" - with open(scen_name, "wb") as f: - pickle.dump(scen, f) - sched_name = "schedule_" + name + ".pickle" - with open(sched_name, "wb") as f: - pickle.dump(sched, f) - return sched_name, scen_name, args_name - - -def charging_curve_to_soc_over_time(charging_curve, capacity, args, - max_charge_from_grid=float('inf'), - time_step=0.1, efficiency=1): - """create charging curve as nested list of SOC, Power[kW] and capacity in [kWh]""" - # simple numeric creation of power over time --> to energy over time - normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) - soc = 0 - time = 0 - socs = [] - times = [] - while soc < args.desired_soc_opps: - times.append(time) - socs.append(soc) - power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) - soc2 = soc + time_step / 60 * power1 - power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) - power = (power1 + power2) / 2 * efficiency - soc += time_step / 60 * power - time += time_step - # fill the soc completely in last time step - times.append(time) - socs.append(args.desired_soc_opps) - return np.array((times, socs)).T - - -def get_missing_energy(events): - """ Sum up all the missing energies of the given events""" - missing_energy = 0 - for event in events: - missing_energy += event.min_soc * event.capacity - return missing_energy - - -def stations_hash(stations_set): - """ Create a simple str as hash for a set of stations""" - return str(sorted(list(stations_set))) - - -def combination_generator(iterable: typing.Iterable, amount: int): - """ Generator which yields all possible combinations of choosing - an amount out of an iterable without putting them back and without caring about the - order of elements - :param iterable: Any collection which can be cast to a list - :param amount: Number of elements which should be drawn from iterable - :type amount: int - """ - iterable = list(iterable) - - for i, item in enumerate(iterable): - # recursive calling of generator with clock like behavior, e.g right-most item changes until - # end of list is reached. This leads to a change in the item left to it and so on. Elements - # on the right can only change to a subset of bigger indices than their left counter-part. - # this is due to the ignoring of order, which reduces the amount of possibilities. - if amount <= 1: - yield [item] - else: - for gen in combination_generator(iterable[i + 1:], amount - 1): - yield [item] + gen From 1eb94ad98f9bb12d1ce2c8a814801b125cbac49d Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 22 Dec 2022 12:48:25 +0100 Subject: [PATCH 422/802] rewrite use factors in report.py --- ebus_toolbox/report.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 55bb3fbc..2d1697f5 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -125,18 +125,13 @@ def generate_gc_overview(schedule, scenario, args): max_nr_cs = max(ts["# occupied CS"]) sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 - # find the smallest use factors - use_factor_list = [0] * (max(ts["# occupied CS"]) + 1) - for v in ts["# occupied CS"]: - use_factor_list[v] += 1 - use_factors = [] - for _ in range(3): - minimum = min(use_factor_list) - for i, v in enumerate(use_factor_list): - if minimum == v: - use_factors.append(i) - use_factor_list[i] = float('inf') - break + # use factors: to which percentage of time are the three least used stations in use + least_used_cs = [max_nr_cs, max_nr_cs-1, max_nr_cs-2] + use_factors = [ts["# occupied CS"].count(least_used_cs[i])/ + len(ts["# occupied CS"]) for i in range(3)] + for i in range(3): + if least_used_cs[i] < 1: + use_factors[i] = None else: max_gc_power = 0 max_nr_cs = 0 From 1b8fd1c598dc6968a768e7e068e25a96360db3d7 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 22 Dec 2022 12:52:26 +0100 Subject: [PATCH 423/802] make flake8 happy --- ebus_toolbox/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 961157df..f6342d39 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -68,8 +68,8 @@ def generate_gc_overview(schedule, scenario, args): # use factors: to which percentage of time are the three least used stations in use least_used_cs = [max_nr_cs, max_nr_cs-1, max_nr_cs-2] - use_factors = [ts["# occupied CS"].count(least_used_cs[i])/ - len(ts["# occupied CS"]) for i in range(3)] + use_factors = [ts["# occupied CS"].count(least_used_cs[i]) / + len(ts["# occupied CS"]) for i in range(3)] for i in range(3): if least_used_cs[i] < 1: use_factors[i] = None From 96016953a50d71e7ce5584c1c01fc7dfa4a827a2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 12:55:07 +0100 Subject: [PATCH 424/802] Make pylint and flake8 happy --- ebus_toolbox/optimizer_util.py | 121 +++++++++++++++----------- ebus_toolbox/station_optimizer.py | 140 +++++++++++++++--------------- 2 files changed, 140 insertions(+), 121 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 2f5b06f5..69327a37 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -6,6 +6,9 @@ import sys import typing import warnings +import configparser +import json + from copy import copy from datetime import timedelta, datetime from time import time @@ -20,6 +23,7 @@ class OptimizerConfig: + """Class for the configuration file""" def __init__(self): self.debug_level = None self.exclusion_rots = None @@ -51,13 +55,13 @@ def __init__(self): self.reduce_rots = None self.rots = None self.path = None - pass def read_config(config_path): - import configparser - import json - + """ Read the config path to a config object + :param config_path: path to file + :return: config object + """ config_parser = configparser.ConfigParser() config_parser.sections() config_parser.read(config_path) @@ -66,31 +70,30 @@ def read_config(config_path): conf.path = config_path default = config_parser["DEFAULT"] - conf.debug_level = int(default.get("debug_level", 0)) + conf.debug_level = int(default.get("debug_level", "0")) sce = config_parser["SCENARIO"] conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) - pi = config_parser["PICKLE"] - - conf.schedule = pi.get("schedule", "") - conf.scenario = pi.get("scenario", "") - conf.args = pi.get("args", "") + pick = config_parser["PICKLE"] + conf.schedule = pick.get("schedule", "") + conf.scenario = pick.get("scenario", "") + conf.args = pick.get("args", "") vehicle = config_parser["VEHICLE"] - conf.charge_eff = float(vehicle.get("charge_eff", 0.95)) - conf.battery_capacity = float(vehicle.get("battery_capacity", 0)) + conf.charge_eff = float(vehicle.get("charge_eff", "0.95")) + conf.battery_capacity = float(vehicle.get("battery_capacity", "0")) if conf.battery_capacity == 0: conf.battery_capacity = None conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) if not conf.charging_curve: conf.charging_curve = None - conf.charging_power = float(vehicle.get("charging_power", 0)) + conf.charging_power = float(vehicle.get("charging_power", "0")) if conf.charging_power == 0: conf.charging_power = None - conf.min_soc = float(vehicle.get("min_soc", 0.0)) + conf.min_soc = float(vehicle.get("min_soc", "0.0")) optimizer = config_parser["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") @@ -102,9 +105,9 @@ def read_config(config_path): conf.opt_type = optimizer.get("opt_type", "greedy") conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) conf.node_choice = optimizer.get("node_choice", "step-by-step") - conf.max_brute_loop = int(optimizer.get("max_brute_loop", 200)) + conf.max_brute_loop = int(optimizer.get("max_brute_loop", "20")) conf.run_only_neg = optimizer.getboolean("run_only_neg", False) - conf.estimation_threshold = float(optimizer.get("estimation_threshold", 0.8)) + conf.estimation_threshold = float(optimizer.get("estimation_threshold", "0.8")) conf.output_path = optimizer.get("output_path") conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) @@ -158,6 +161,13 @@ def get_index_by_time(scenario, search_time): def get_rotation_soc_util(rot_id, this_sched, this_scen, soc_data: dict = None): + """Gets you the soc object with start and end index for a given rotation id + :param rot_id: rotation_id + :param this_sched: schedule object contain rotation information + :param this_scen: scenario object containing the soc data + :param soc_data: optional soc_data if not the scenario data should be used + :return: tuple with soc array, start index and end index + """ rot = this_sched.rotations[rot_id] rot_start_idx = get_index_by_time(this_scen, rot.departure_time) rot_end_idx = get_index_by_time(this_scen, rot.arrival_time) @@ -201,7 +211,7 @@ def evaluate(events: typing.Iterable[stat_op.LowSocEvent], an event is raised (up to a minimal soc (probably zero)). The supplied energy is approximated by loading power, standing time at a station, soc at station and minimal soc of the event - :param events: events to be evaulated + :param events: events to be evaluated :param optimizer: StationOptimizer object with scenario and schedule data :param kwargs: optional overwriting of soc_lower_thresh, soc_upper_thresh or soc_data :return: sorted list with the best station and its potential on index 0 @@ -269,10 +279,10 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec """ # making sure default arguments are none and not mutable - if not not_possible_stations: + if not_possible_stations is None: not_possible_stations = set() - if not could_not_be_electrified: + if could_not_be_electrified is None: could_not_be_electrified = set() possible_stations = [ @@ -342,14 +352,14 @@ def join_subsets(subsets: typing.Iterable[set]): def toolbox_to_pickle(name, sched, scen, this_args): """ Dump the 3 files to pickle files""" args_name = "args_" + name + ".pickle" - with open(args_name, "wb") as f: - pickle.dump(this_args, f) + with open(args_name, "wb") as file: + pickle.dump(this_args, file) scen_name = "scenario_" + name + ".pickle" - with open(scen_name, "wb") as f: - pickle.dump(scen, f) + with open(scen_name, "wb") as file: + pickle.dump(scen, file) sched_name = "schedule_" + name + ".pickle" - with open(sched_name, "wb") as f: - pickle.dump(sched, f) + with open(sched_name, "wb") as file: + pickle.dump(sched, file) return sched_name, scen_name, args_name @@ -360,11 +370,11 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, # simple numeric creation of power over time --> to energy over time normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) soc = 0 - time = 0 + charge_time = 0 socs = [] times = [] while soc < args.desired_soc_opps: - times.append(time) + times.append(charge_time) socs.append(soc) power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), max_charge_from_grid / capacity) @@ -373,9 +383,9 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, max_charge_from_grid / capacity) power = (power1 + power2) / 2 * efficiency soc += time_step / 60 * power - time += time_step + charge_time += time_step # fill the soc completely in last time step - times.append(time) + times.append(charge_time) socs.append(args.desired_soc_opps) return np.array((times, socs)).T @@ -417,12 +427,12 @@ def combination_generator(iterable: typing.Iterable, amount: int): def toolbox_from_pickle(sched_name, scen_name, args_name): """ Load the 3 files from pickle""" - with open(args_name, "rb") as f: - this_args = pickle.load(f) - with open(scen_name, "rb") as f: - scen = pickle.load(f) - with open(sched_name, "rb") as f: - sched = pickle.load(f) + with open(args_name, "rb") as file: + this_args = pickle.load(file) + with open(scen_name, "rb") as file: + scen = pickle.load(file) + with open(sched_name, "rb") as file: + sched = pickle.load(file) return sched, scen, this_args @@ -449,7 +459,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal this_sched2.stations = electrified_stations this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, electrified_stations=electrified_stations) - # Dont print output from spice ev to reduce clutter + # do not print output from spice ev to reduce clutter sys.stdout = open(os.devnull, 'w') with warnings.catch_warnings(): @@ -459,8 +469,8 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal if this_args.cost_calculation and cost_calc: # cost calculation following directly after simulation try: - with open(this_args.cost_parameters_file, encoding='utf-8') as f: - cost_parameters_file = uncomment_json_file(f) + with open(this_args.cost_parameters_file, encoding='utf-8') as file: + cost_parameters_file = uncomment_json_file(file) except FileNotFoundError: raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " "does not exist. Exiting...") @@ -469,9 +479,18 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal def preprocess_schedule(this_sched, this_args, electrified_stations=None): - Trip.consumption = Consumption(this_sched.vehicle_types, - outside_temperatures=this_args.outside_temperature_over_day_path, - level_of_loading_over_day=this_args.level_of_loading_over_day_path) + """ Prepare the schedule by calculating consumption, setting elctrified stations and assigning + vehicles + + :param this_sched: schedule containing the rotations + :param this_args: arguments for simulation + :param electrified_stations: dict of stations to be electrified + :return: schedule and scenario to be simulated + """ + Trip.consumption =\ + Consumption(this_sched.vehicle_types, + outside_temperatures=this_args.outside_temperature_over_day_path, + level_of_loading_over_day=this_args.level_of_loading_over_day_path) this_sched.stations = electrified_stations this_sched.calculate_consumption() @@ -490,20 +509,20 @@ def print_time(start=[]): def plot_(data): """ Simple plot of data without having to create subplots""" - fig, ax = plt.subplots() - ax.plot(data, linewidth=2.0) - return ax + fig, axis = plt.subplots() + axis.plot(data, linewidth=2.0) + return axis -def plot_rot(rot_id, this_sched, this_scen, ax=None, rot_only=True): +def plot_rot(rot_id, this_sched, this_scen, axis=None, rot_only=True): """ Simple plot of data without having to create subplots""" soc, start, end = get_rotation_soc_util(rot_id, this_sched, this_scen) if not rot_only: start = 0 end = -1 - if ax is None: - fig, ax = plt.subplots() - ax.plot(soc[start:end], linewidth=2.0) - return ax - ax.plot(soc[start:end], linewidth=2.0) - return ax + if axis is None: + fig, axis = plt.subplots() + axis.plot(soc[start:end], linewidth=2.0) + return axis + axis.plot(soc[start:end], linewidth=2.0) + return axis diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 1ba2234f..2dcd56fa 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -8,7 +8,7 @@ import numpy as np -import optimizer_util as op_util +import optimizer_util as util from src import scenario import schedule from ebus_toolbox import report, rotation @@ -18,7 +18,7 @@ class StationOptimizer: """ Class for station optimization""" def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, - config: 'op_util.OptimizerConfig', logger: logging.Logger): + config: 'util.OptimizerConfig', logger: logging.Logger): self.base_not_possible_stations = set() self.could_not_be_electrified = set() self.must_include_set = set() @@ -70,7 +70,8 @@ def loop(self, **kwargs): # check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible - groups = op_util.get_groups_from_events(base_events, self.not_possible_stations, + groups =\ + util.get_groups_from_events(base_events, self.not_possible_stations, could_not_be_electrified=self.could_not_be_electrified, optimizer=self) @@ -116,8 +117,8 @@ def loop(self, **kwargs): else: choice_func = self.choose_station_step_by_step - combinations = op_util.combs_unordered_no_putting_back(len(stations), - len(list_greedy_sets[group_nr]) - 1) + combinations = util.combs_unordered_no_putting_back(len(stations), + len(list_greedy_sets[group_nr]) - 1) self.logger.debug("There are %s combinations with 1 station less than " "the current solution", combinations) @@ -149,7 +150,7 @@ def loop(self, **kwargs): if new_electrified_set != pre_optimized_set and new_stats is not None: self.logger.warning("Optimized with %s stations %s %s", len(new_electrified_set), str('#' * 20), - op_util.stations_hash(new_electrified_set)) + util.stations_hash(new_electrified_set)) sols.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): list_greedy_sets[group_nr] = new_electrified_set.copy() @@ -207,7 +208,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # in deep analysis not all nodes are visited if they are suboptimal. # therefore could not be electrified is only important in the first run, where every station # is possible - if not track_not_possible_rots: + if track_not_possible_rots is None: could_not_be_electrified = set() solver = self.config.solver @@ -231,11 +232,11 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # call above. Important not to use the scenario in optimizer, since it gets overwritten # every call and only relevant trips are adjusted. This leads to problems # when the recursive call goes on a higher level eg. level 0 - level 1 - level 2 - level 1 - station_eval = op_util.evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) + station_eval = util.evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) # get rotations from event dict and calculate the missing energy rotation_dict = {e.rotation.id: e.rotation for e in event_group} - missing_energy = op_util.get_missing_energy(event_group) + missing_energy = util.get_missing_energy(event_group) if missing_energy >= 0: self.logger.debug("Already electrified: Returning") return self.electrified_stations, True @@ -260,7 +261,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ for stat in copied_set: self.electrified_stations.pop(stat) self.electrified_station_set.remove(stat) - # overwrite with preo ptimized set + # overwrite with pre optimized set for stat in pre_optimized_set: self.electrify_station(stat, self.electrified_station_set) return None, False @@ -286,8 +287,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ electrify_stations=best_station_ids) else: self.schedule.rotations = rotation_dict - self.schedule, self.scenario = op_util.run_schedule(self.schedule, self.args, - electrified_stations=self.electrified_stations) + self.schedule, self.scenario = \ + util.run_schedule(self.schedule, self.args, + electrified_stations=self.electrified_stations) kwargs["lifted_socs"] = self.scenario.vehicle_socs.copy() @@ -297,7 +299,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ new_events = self.get_low_soc_events(rotations=event_rotations_ids, rel_soc=True, **kwargs) - delta_energy = op_util.get_missing_energy(new_events) + delta_energy = util.get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) self.logger.debug("Last electrification electrified %s/%s." " %s remaining events in the base group.", @@ -316,9 +318,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ return None, True # check if the events can be divided into subgroups which are independent - groups = op_util.get_groups_from_events(new_events, self.not_possible_stations, - could_not_be_electrified, - optimizer=self) + groups = util.get_groups_from_events(new_events, self.not_possible_stations, + could_not_be_electrified, + optimizer=self) for k, this_group in enumerate(groups): this_tree = tree_position.copy() @@ -338,15 +340,15 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # if there is no pre optimized set function can return if pre_optimized_set is None: continue - # if there is a pre optimized set check if the preoptimized set leads to pruning + # if there is a pre optimized set check if the pre optimized set leads to pruning # i.e. if if following branch makes sense if len(pre_optimized_set) - len(self.electrified_station_set) < 10: self.scenario.vehicle_socs = \ self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) prune_events = self.get_low_soc_events(rotations=event_rotations_ids, rel_soc=True, **kwargs) - station_eval = op_util.evaluate(prune_events, self) - prune_missing_energy = op_util.get_missing_energy(prune_events) + station_eval = util.evaluate(prune_events, self) + prune_missing_energy = util.get_missing_energy(prune_events) if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, prune_missing_energy): self.logger.debug("Branch pruned early") @@ -372,7 +374,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # 12:30-12:40 Vehicle1 # 13:10-13:25 Vehicle5 # 13:20-14:00 Vehicle1 - # or 1 charging piont + # or 1 charging point # PotsdamerPlatz: 9:30-9:40 Vehicle5 # 12:30-12:40 Vehicle1 # 13:10-13:25 Vehicle5 @@ -401,19 +403,19 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, :return soc dict with lifted socs :rtype dict() """ - if not rotations: + if rotations is None: rotations = self.schedule.rotations.values() - if not soc_dict: + if soc_dict is None: soc_dict = self.scenario.vehicle_socs - if not ele_station_set: + if ele_station_set is None: ele_station_set = self.electrified_station_set if not soc_upper_thresh: soc_upper_thresh = self.args.desired_soc_deps - if not electrify_stations: + if electrify_stations is None: electrify_stations = set() - if not electrify_stations: + if electrify_stations is None: electrify_stations = set() ele_stations = {*ele_station_set, *electrify_stations} soc_dict = copy(soc_dict) @@ -427,14 +429,14 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, for i, trip in enumerate(rot.trips): if trip.arrival_name not in ele_stations: continue - idx = op_util.get_index_by_time(self.scenario, trip.arrival_time) + idx = util.get_index_by_time(self.scenario, trip.arrival_time) try: - standing_time_min = op_util.get_charging_time(trip, rot.trips[i + 1], self.args) + standing_time_min = util.get_charging_time(trip, rot.trips[i + 1], self.args) except IndexError: standing_time_min = 0 - d_soc = op_util.get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min, self) - buffer_idx = int((op_util.get_buffer_time(trip, self.args.default_buffer_time_opps)) + d_soc = util.get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min, self) + buffer_idx = int((util.get_buffer_time(trip, self.args.default_buffer_time_opps)) / timedelta(minutes=1)) delta_idx = int(standing_time_min) + 1 old_soc = soc[idx + buffer_idx:idx + buffer_idx + delta_idx].copy() @@ -452,7 +454,7 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, # gradient of soc i.e. positive if charging negative if discharging diff = np.hstack((np.diff(soc), -1)) # masking of socs >1 and negative gradient for local maximum - # i.e. after lifiting the soc, it finds the first spot where the soc is bigger + # i.e. after lifting the soc, it finds the first spot where the soc is bigger # than the upper threshold and descending. idc_loc_max = np.argmax(desc * (soc > 1) * (diff < 0)) @@ -485,7 +487,7 @@ def is_branch_promising(self, station_eval, electrified_station_set, pot += station_eval[i][1] if pot < -missing_energy * self.config.estimation_threshold: print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", - op_util.stations_hash(electrified_station_set)) + util.stations_hash(electrified_station_set)) return False return True @@ -495,7 +497,7 @@ def node_to_tree(self, delta_base_energy): :return decision tree :rtype dict() """ - node_name = op_util.stations_hash(self.electrified_station_set) + node_name = util.stations_hash(self.electrified_station_set) try: self.decision_tree[node_name]["missing_energy"] = delta_base_energy self.decision_tree[node_name]["visit_counter"] += 1 @@ -509,7 +511,7 @@ def node_to_tree(self, delta_base_energy): def choose_station_brute(self, station_eval, pre_optimized_set=None, missing_energy=0, gens=dict()): - """Gives back a possible set of Stations to electrify which shows potential and hasnt been + """Gives back a possible set of Stations to electrify which shows potential and has not been tried yet. The set of stations is smaller than the best optimized set so far. :param station_eval: list of sorted station evaluation with list(station_id, pot) @@ -524,11 +526,11 @@ def choose_station_brute(self, station_eval, try: generator = gens[str(station_ids) + str(len(pre_optimized_set) - 1)] except KeyError: - generator = op_util.combination_generator(station_ids, len(pre_optimized_set) - 1) + generator = util.combination_generator(station_ids, len(pre_optimized_set) - 1) gens[str(station_ids) + str(len(pre_optimized_set) - 1)] = generator station_eval_dict = {stat[0]: stat[1] for stat in station_eval} for comb in generator: - node_name = op_util.stations_hash(comb) + node_name = util.stations_hash(comb) if node_name not in self.decision_tree: # only check the brute force station if they have the remote chance of fulfilling # the missing energy @@ -545,7 +547,7 @@ def choose_station_brute(self, station_eval, def choose_station_step_by_step(self, station_eval, pre_optimized_set=None, missing_energy=0): """ Gives back a station of possible stations to electrify which shows the biggest potential - and hasnt been picked before. + and has not been picked before. :param station_eval: list of sorted station evaluation with list(station_id, pot) @@ -565,18 +567,18 @@ def choose_station_step_by_step(self, station_eval, if pre_optimized_set is not None: if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, missing_energy): - # best station id is none and dont go deeper in recursion + # best station id is none and do not go deeper in recursion return None, False min_nr_visited = float('inf') for stat_tuple in station_eval: - station, pot = stat_tuple + station, _ = stat_tuple # create a station combination from already electrified - # stations and possible new station - check_stations = self.electrified_station_set.union([station]) + # stations and possible new stations + stats = self.electrified_station_set.union([station]) if self.decision_tree is not None: - node_name = op_util.stations_hash(check_stations) + node_name = util.stations_hash(stats) if node_name in self.decision_tree.keys(): min_nr_visited = min(min_nr_visited, self.decision_tree[node_name]["visit_counter"]) @@ -589,11 +591,11 @@ def choose_station_step_by_step(self, station_eval, # to do what now? # simply visit the least visited node for stat_eval in station_eval: - station, eval = stat_eval + station, _ = stat_eval # create a station combination from already electrified stations # and possible new station - check_stations = self.electrified_station_set.union([station]) - if self.decision_tree[op_util.stations_hash(check_stations)]["visit_counter"] == min_nr_visited: + stats = self.electrified_station_set.union([station]) + if self.decision_tree[util.stations_hash(stats)]["visit_counter"] == min_nr_visited: best_station_id = station return [best_station_id], True return None, True @@ -624,8 +626,8 @@ def rebase_spice_ev(self): run_only_neg=self.config.run_only_neg) self.logger.debug("Rebasing finished") if self.config.pickle_rebased: - op_util.toolbox_to_pickle(self.config.pickle_rebased_name, self.schedule, self.scenario, - self.args) + util.toolbox_to_pickle(self.config.pickle_rebased_name, self.schedule, self.scenario, + self.args) self.logger.debug("Rebased scenario pickled as %s", self.config.pickle_rebased_name) self.must_include_set = must_include_set @@ -655,7 +657,7 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, :return schedule, scenario, electrified_station_set, electrified_stations :rtype (schedule.Schedule, scenario.Scenario, set(), dict()) """ - if not electrified_stations: + if electrified_stations is None: electrified_stations = self.electrified_stations must_include_set = set() # electrify inclusion stations @@ -673,9 +675,9 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, r not in self.config.exclusion_rots} self.schedule.rotations = rots - new_sched, new_scen = op_util.run_schedule(self.schedule, self.args, - electrified_stations, - cost_calc=cost_calc) + new_sched, new_scen = util.run_schedule(self.schedule, self.args, + electrified_stations, + cost_calc=cost_calc) report.generate(new_sched, new_scen, self.args) self.schedule = new_sched self.scenario = new_scen @@ -698,7 +700,7 @@ def create_charging_curves(self): soc_charge_curve_dict[v_type_name] = {} for name, v_type in self.schedule.vehicle_types.items(): for ch_type, data in v_type.items(): - soc_charge_curve_dict[name][ch_type] = op_util.charging_curve_to_soc_over_time( + soc_charge_curve_dict[name][ch_type] = util.charging_curve_to_soc_over_time( data["charging_curve"], data["capacity"], self.args, self.schedule.cs_power_opps, efficiency=self.config.charge_eff, time_step=0.1) @@ -737,7 +739,7 @@ def get_must_stations_and_rebase(self, relative_soc=False): # rebasing for stat in must_stations: - # dont put must stations in electrified set, but in extra set must_include_set + # do not put must stations in electrified set, but in extra set must_include_set self.electrify_station(stat, self.must_include_set) self.scenario.vehicle_socs = self.timeseries_calc(ele_station_set=must_stations) @@ -745,8 +747,6 @@ def get_must_stations_and_rebase(self, relative_soc=False): def remove_none_socs(self): """ Removes soc values of None by filling them with the last value which is not None - :param this_scen: scenario from which the None socs should be removed - :type this_scen: scenario.Scenario() """ # make sure no None values exists in SOCs. Fill later values with last value # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] @@ -767,7 +767,7 @@ def get_rotation_soc(self, rot_id, soc_data: dict = None): :param soc_data: optional soc_data if not the scenario data should be used :return: tuple with soc array, start index and end index """ - return op_util.get_rotation_soc_util(rot_id, self.schedule, self.scenario, soc_data=soc_data) + return util.get_rotation_soc_util(rot_id, self.schedule, self.scenario, soc_data=soc_data) def get_index_by_time(self, search_time: datetime): """Get the index for a given time. @@ -815,18 +815,19 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, rel_soc=False, soc_data=None, **kwargs): """ Gather low soc events below the config threshold. - :param optimizer: StationOptimizer which defines the search conditions as well as - the scenario and schedule :param rotations: rotations to be searched for low soc events. Default None means whole schedule is searched :param filter_standing_time: Should the stations be filtered by standing time. True leads to an output only stations with charging potential - :param rel_soc: Defines if the start soc should be seen as full even when not. If the rel_soc + :param rel_soc: Defines if the start soc should be seen as full even when not. + i.e. a drop from a rotation start soc from 0.1 to -0.3 is not critical since the start + soc from the rotation will be raised + If the rel_soc is false, it means coupled rotations might be prone to errors due to impossible lifts. :param soc_data: soc data to be used. Default None means the soc data from the optimizer scenario is used - :param kwargs: optional soc_lower_tresh or soc_upper_thresh if from optimizer differing values - should be used + :param kwargs: optional soc_lower_tresh or soc_upper_thresh if from optimizer differing + values should be used :return: list(LowSocEvents) """ if not rotations: @@ -835,7 +836,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, soc_lower_thresh = kwargs.get("soc_lower_thresh", self.config.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", self.args.desired_soc_deps) # Create list of events which describe trips which end in a soc below zero - # The event is bound by the lowest soc and an upper soc threshhold which is naturally 1 + # The event is bound by the lowest soc and an upper soc threshold which is naturally 1 # Properties before and after these points have no effect on the event itself, similar to # an event horizon events = [] @@ -849,8 +850,8 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, min_soc, min_idx = min(comb, key=lambda x: x[0]) reduced_list = comb.copy() soc_lower_thresh_cur = soc_lower_thresh - # if rotation gets a start soc below 1 this should change below 0 soc events since fixing - # the rotation before would lead to fixing this rotation + # if rotation gets a start soc below 1 this should change below 0 soc + # events since fixing the rotation before would lead to fixing this rotation # if using relative SOC, SOC lookup has to be adjusted if rel_soc: @@ -884,8 +885,8 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, else: for ii, trip in enumerate(trips): try: - standing_time_min = op_util.get_charging_time(trip, trips[ii + 1], - self.args) + standing_time_min = util.get_charging_time(trip, trips[ii + 1], + self.args) except IndexError: standing_time_min = 0 if standing_time_min > 0: @@ -899,7 +900,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, event = LowSocEvent(start_idx=start, end_idx=min_idx, min_soc=min_soc, stations=possible_stations, vehicle_id=rot.vehicle_id, trip=trips, - rotation=rot, stations_list=possible_stations_list, + rot=rot, stations_list=possible_stations_list, capacity=self.schedule.vehicle_types[v_type][ch_type][ 'capacity'], v_type=v_type, ch_type=ch_type) @@ -917,9 +918,9 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, class LowSocEvent: + """Class to gather information about a low soc event""" event_counter = 0 - - def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rotation, + def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rot, stations_list, capacity, v_type, ch_type): self.start_idx = start_idx self.end_idx = end_idx @@ -927,11 +928,10 @@ def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rota self.stations = stations self.vehicle_id = vehicle_id self.trip = trip - self.rotation = rotation + self.rotation = rot self.stations_list = stations_list self.capacity = capacity self.v_type = v_type self.ch_type = ch_type self.event_counter = LowSocEvent.event_counter LowSocEvent.event_counter += 1 - From 7709686d19d6f6d8b7e4f81373f951349bf55eb7 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 12:56:27 +0100 Subject: [PATCH 425/802] Make pylint and flake8 happy --- ebus_toolbox/station_optimization.py | 3 ++- ebus_toolbox/station_optimizer.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 47e2b990..27f8e5b2 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -133,7 +133,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # if no schedule was given as argument, make sure no scenario # and args input was given as well. assert sched == scen == this_args is None - sched, scen, this_args = opt_util.toolbox_from_pickle(conf.schedule, conf.scenario, conf.args) + sched, scen, this_args = opt_util.toolbox_from_pickle(conf.schedule, + conf.scenario, conf.args) args = this_args # prepare Filesystem with folders and paths and copy config diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 2dcd56fa..f3d417c1 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -920,6 +920,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, class LowSocEvent: """Class to gather information about a low soc event""" event_counter = 0 + def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rot, stations_list, capacity, v_type, ch_type): self.start_idx = start_idx From 0c882d84ce67d2a263756f646967ba4fe41fa1dd Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 22 Dec 2022 12:56:29 +0100 Subject: [PATCH 426/802] make flake8 happy --- ebus_toolbox/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 2d1697f5..750a3012 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -127,8 +127,8 @@ def generate_gc_overview(schedule, scenario, args): # use factors: to which percentage of time are the three least used stations in use least_used_cs = [max_nr_cs, max_nr_cs-1, max_nr_cs-2] - use_factors = [ts["# occupied CS"].count(least_used_cs[i])/ - len(ts["# occupied CS"]) for i in range(3)] + use_factors = [ts["# occupied CS"].count(least_used_cs[i]) / + len(ts["# occupied CS"]) for i in range(3)] for i in range(3): if least_used_cs[i] < 1: use_factors[i] = None From 48939e204aa8dbd866a3f21f0ef601e46ee02cc3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 13:29:10 +0100 Subject: [PATCH 427/802] Make flake8 and darglint happy --- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/costs.py | 2 +- ebus_toolbox/optimizer_util.py | 86 ++++++++++++++++++++++------ ebus_toolbox/station_optimization.py | 3 +- ebus_toolbox/station_optimizer.py | 47 +++++++-------- 5 files changed, 95 insertions(+), 45 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index addffc74..89e25b74 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -124,7 +124,7 @@ util.set_options_from_config(args, check=True, verbose=False) args.output_directory = Path(args.output_directory) / \ - str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index e4e9e0d7..e6abe549 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -50,7 +50,7 @@ def calculate_costs(c_params, scenario, schedule, args): # GRID CONNECTION POINTS gcs = schedule.scenario["constants"]["grid_connectors"] - c_transformer=0 + c_transformer = 0 for gcID, gc_keys in gcs.items(): try: distance_transformer = schedule.stations[gcID]["distance_transformer"] diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 69327a37..e1f5fefe 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -142,7 +142,7 @@ def get_charging_time(trip1, trip2, args): def get_buffer_time(trip, default_buffer_time_opps): """ Return the buffer time as timedelta object :param trip: trip object - :param default_buffer_time_opps: + :param default_buffer_time_opps: the default buffer time at opps charging stations :return: timedelta object for the buffer time """ return timedelta(minutes=get_buffer_time_spice_ev(trip, default_buffer_time_opps)) @@ -179,11 +179,11 @@ def get_rotation_soc_util(rot_id, this_sched, this_scen, soc_data: dict = None): def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: stat_op.StationOptimizer): """get expected soc lift for a given start_soc and time_delta. - :param soc_over_time_curve: - :param soc: - :param time_delta: - :param optimizer: - :return: + :param soc_over_time_curve: array with socs over time + :param soc: start socs + :param time_delta: time of charging + :param optimizer: optimizer object + :return: (float) the lift of the soc """ # units for time_delta and time_curve are assumed to be the same, e.g. minutes # first element which is bigger than current soc @@ -275,7 +275,7 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec :param could_not_be_electrified: rotations to be discarded :param optimizer: StationOptimizer object :return: list((events, stations)) which give you events to optimize together with the stations - which might help them + which might help them """ # making sure default arguments are none and not mutable @@ -334,7 +334,7 @@ def join_subsets(subsets: typing.Iterable[set]): :param subsets: iterable of sets :return: boolean if joining subsets is finished (i.e. False if all subsets are connected - and thus far connected subsets + and thus far connected subsets """ subsets = [s.copy() for s in subsets] for i in range(len(subsets)): @@ -350,7 +350,14 @@ def join_subsets(subsets: typing.Iterable[set]): def toolbox_to_pickle(name, sched, scen, this_args): - """ Dump the 3 files to pickle files""" + """ Dump the 3 files to pickle files + + :param name: base name of the files + :param sched: schedule object + :param scen: scenario object + :param this_args: args Namespace object + :return: Names of the created files + """ args_name = "args_" + name + ".pickle" with open(args_name, "wb") as file: pickle.dump(this_args, file) @@ -366,7 +373,16 @@ def toolbox_to_pickle(name, sched, scen, this_args): def charging_curve_to_soc_over_time(charging_curve, capacity, args, max_charge_from_grid=float('inf'), time_step=0.1, efficiency=1): - """create charging curve as nested list of SOC, Power[kW] and capacity in [kWh]""" + """ create charging curve as nested list of SOC, Power[kW] and capacity in [kWh] + + :param charging_curve: the charging curve with power over soc + :param capacity: capacity of the vehicle + :param args: args namespace object for simulation arguments + :param max_charge_from_grid: maximum amount of charge from grid / connector + :param time_step: time step for simulation + :param efficiency: efficiency of charging + :return: np.array with soc over time + """ # simple numeric creation of power over time --> to energy over time normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) soc = 0 @@ -391,7 +407,11 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, def get_missing_energy(events): - """ Sum up all the missing energies of the given events""" + """ Sum up all the missing energies of the given events + + :param events: events to be checked + :return: (float) missing energy + """ missing_energy = 0 for event in events: missing_energy += event.min_soc * event.capacity @@ -399,7 +419,11 @@ def get_missing_energy(events): def stations_hash(stations_set): - """ Create a simple str as hash for a set of stations""" + """ Create a simple str as hash for a set of stations + + :param stations_set: set of stations to be hashed + :return: hash string + """ return str(sorted(list(stations_set))) @@ -410,6 +434,7 @@ def combination_generator(iterable: typing.Iterable, amount: int): :param iterable: Any collection which can be cast to a list :param amount: Number of elements which should be drawn from iterable :type amount: int + :yields: list of items """ iterable = list(iterable) @@ -426,7 +451,13 @@ def combination_generator(iterable: typing.Iterable, amount: int): def toolbox_from_pickle(sched_name, scen_name, args_name): - """ Load the 3 files from pickle""" + """ Load the 3 files from pickle + + :param sched_name: name of schedule file + :param scen_name: name of scenario file + :param args_name: name of args file + :return: schedule, scenario and args object + """ with open(args_name, "rb") as file: this_args = pickle.load(file) with open(scen_name, "rb") as file: @@ -454,7 +485,15 @@ def combs_unordered_no_putting_back(n: int, k: int): def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): - """Run a given schedule and electrify stations if need be""" + """Run a given schedule and electrify stations if need be + :param this_sched: schedule object + :param this_args: args namespace object + :param electrified_stations: dict of electrified stations. Default value None means no further + stations are electrified + :param cost_calc: should the cost be calculated + :raises SystemExit: in case of wrong cost calculation file + :return: schedule and scenario objects after spiceev simulation + """ this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, @@ -500,22 +539,33 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): def print_time(start=[]): - """ Print the time and automatically set start time to the first time the function getting - called""" + """Print the time and automatically set start time to the first time the function getting + called + :param start: list for storing times + """ if not start: start.append(time()) print(round(time() - start[0], 2), " seconds till start") def plot_(data): - """ Simple plot of data without having to create subplots""" + """ Simple plot of data without having to create subplots + :param data: data to be plotted + :return: axis of the plot """ fig, axis = plt.subplots() axis.plot(data, linewidth=2.0) return axis def plot_rot(rot_id, this_sched, this_scen, axis=None, rot_only=True): - """ Simple plot of data without having to create subplots""" + """Simple plot of data without having to create subplots + :param rot_id: id of the rotation + :param this_sched: schedule object + :param this_scen: scenario object + :param axis: axis to be plotted on + :param rot_only: show only the rot or the whole vehicle socs + :return: axis of the plot + """ soc, start, end = get_rotation_soc_util(rot_id, this_sched, this_scen) if not rot_only: start = 0 diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 27f8e5b2..d29b3394 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -23,10 +23,9 @@ def time_it(function, timers={}): :type function: function :param timers: storage for cumulated time and call number :type timers: dict - :return decorated function or timer if given function is None + :return: decorated function or timer if given function is None :rtype function or dict - """ if function: def decorated_function(*this_args, **kwargs): diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index f3d417c1..33160f99 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -48,10 +48,9 @@ def loop(self, **kwargs): """ Loops over every base group with the core of group optimization and handles deep or greedy arguments - :param opt_type: type of optimization. Default from optimizer object :param kwargs: arguments handled by the function and config. :return: tuple of the dict electrified_stations and the set electrified_station_set - in the optimal found case + in the optimal found case """ node_choice = kwargs.get("node_choice", self.config.node_choice) @@ -191,16 +190,16 @@ def get_negative_rotations_all_electrified(self, rel_soc=False): def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, pre_optimized_set=None, **kwargs): - """Optimize a single group events + """Optimize a single group events and returns the electrified stations and a flag :param group: tuple of events and station_ids to be optimized together :param choose_station_function: function to be used for choosing the next function :param track_not_possible_rots: not possible tracks need to be tracked in the first run :param pre_optimized_set: set which was optimized before hand used as upper threshold for - optimization + optimization :param kwargs: internally used functionality - :return (electrified_stations if optimization continues, None if no further recursive calls - should happen, bool if further deep analysis should take place) + :return: Returns (electrified_stations if optimization continues, None if no further + recursive calls should happen, bool if further deep analysis should take place) :rtype (dict() or None, bool) """ could_not_be_electrified = self.could_not_be_electrified @@ -397,10 +396,10 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, :param rotations: Optional if not optimizer.schedule.rotations should be used :param soc_dict: Optional if not optimizer.scenario.vehicle_socs should be used :param ele_station_set: set to be electrified. Default None leads to using the - so far optimized optimizer.electrified_station_set + so far optimized optimizer.electrified_station_set :param soc_upper_thresh: optional if not optimizer.config.desired_soc_deps is used :param electrify_stations: dict of stations to be electrified - :return soc dict with lifted socs + :return: Returns soc dict with lifted socs :rtype dict() """ if rotations is None: @@ -476,8 +475,8 @@ def is_branch_promising(self, station_eval, electrified_station_set, :param station_eval: list of sorted station evaluation with list(station_id, pot) :param electrified_station_set: set of electrified stations :param pre_optimized_set: set of already optimized stations - :param missing_energy: - :return is the branch promising + :param missing_energy: the amount of energy missing in this branch + :return: is the branch promising :rtype bool """ @@ -519,7 +518,7 @@ def choose_station_brute(self, station_eval, :param missing_energy: missing energy in this branch before electrification :param gens: dict of generators for brute force generation :return: combination of stations or None if no viable stations exists and - false since this function does not support recursive calling + false since this function does not support recursive calling """ station_ids = [x[0] for x in station_eval] @@ -552,9 +551,9 @@ def choose_station_step_by_step(self, station_eval, :param station_eval: list of sorted station evaluation with list(station_id, pot) :param pre_optimized_set: set of optimized stations thus far - :param missing energy in this branch before electrification + :param missing_energy: missing energy in this branch before electrification :return:a station to electrify or None if no viable stations exists and - false since this function does not support recursive calling + false since this function does not support recursive calling """ # filter functions to stop simulating cases which have no hope of being optimal. @@ -620,6 +619,7 @@ def set_up_decision_tree(self): def rebase_spice_ev(self): """ Rebase the scenario meaning configuring various variables according to the input data and running a spice ev simulation + :return: must_include_set and dict of electrified_stations """ self.logger.debug("Spice EV Rebasing Scenario") must_include_set, ele_stations = self.preprocessing_scenario( @@ -636,6 +636,7 @@ def rebase_spice_ev(self): def rebase_simple(self): """ Rebase the scenario meaning configuring various variables according to the input data + return: must_include_set and dict of electrified_stations """ must_include_set = set() # electrify inclusion stations @@ -651,10 +652,10 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, cost_calc=False): """Prepare scenario and run schedule :param electrified_stations: optional dict of electrified stations to use in simulation. - Default None leads to using optimizer.electrified_stations + Default None leads to using optimizer.electrified_stations :param run_only_neg: should only negative rotations be simulated :param cost_calc: should costs be calculated - :return schedule, scenario, electrified_station_set, electrified_stations + :return: schedule, scenario, electrified_station_set, electrified_stations :rtype (schedule.Schedule, scenario.Scenario, set(), dict()) """ if electrified_stations is None: @@ -816,18 +817,18 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, """ Gather low soc events below the config threshold. :param rotations: rotations to be searched for low soc events. Default None means whole - schedule is searched + schedule is searched :param filter_standing_time: Should the stations be filtered by standing time. True leads to - an output only stations with charging potential + an output only stations with charging potential :param rel_soc: Defines if the start soc should be seen as full even when not. - i.e. a drop from a rotation start soc from 0.1 to -0.3 is not critical since the start - soc from the rotation will be raised - If the rel_soc - is false, it means coupled rotations might be prone to errors due to impossible lifts. + i.e. a drop from a rotation start soc from 0.1 to -0.3 is not critical since the start + soc from the rotation will be raised + If the rel_soc + is false, it means coupled rotations might be prone to errors due to impossible lifts. :param soc_data: soc data to be used. Default None means the soc data from the optimizer - scenario is used + scenario is used :param kwargs: optional soc_lower_tresh or soc_upper_thresh if from optimizer differing - values should be used + values should be used :return: list(LowSocEvents) """ if not rotations: From 27f492edb5e834bddc19f455bb7344c33e5f04c4 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 13:31:36 +0100 Subject: [PATCH 428/802] Make flake8 and darglint happy --- ebus_toolbox/station_optimizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 33160f99..7177c232 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -636,7 +636,7 @@ def rebase_spice_ev(self): def rebase_simple(self): """ Rebase the scenario meaning configuring various variables according to the input data - return: must_include_set and dict of electrified_stations + :return: must_include_set and dict of electrified_stations """ must_include_set = set() # electrify inclusion stations From 899d343096965a79ec53734602462d13e06c0bff Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 15:01:05 +0100 Subject: [PATCH 429/802] Move time it and fix type dependencies --- data/examples/optimizer.cfg | 4 +- ebus_toolbox/optimizer_util.py | 71 ++++++++++++++++++++++++---- ebus_toolbox/station_optimization.py | 37 ++------------- ebus_toolbox/station_optimizer.py | 40 +++++----------- 4 files changed, 80 insertions(+), 72 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 8e631149..f272d8e4 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -49,7 +49,7 @@ run_only_neg=False opt_type = deep # "step-by-step" or "brute" without "" node_choice=brute -max_brute_loop=20 +max_brute_loop=2 estimation_threshold = 0.80 # Preferring deps leads to a spice_ev simulation with preferred charging type depots @@ -66,7 +66,7 @@ include_must_stations = True [SPECIAL] decision_tree_path = "" -save_decision_tree = False +save_decision_tree = True reduce_rots = True # Use "" for ids and not '' # Negative Rots in all deps diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index e1f5fefe..5b323fcf 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -8,22 +8,45 @@ import warnings import configparser import json - from copy import copy from datetime import timedelta, datetime from time import time -import station_optimizer as stat_op import numpy as np from matplotlib import pyplot as plt +if typing.TYPE_CHECKING: + from ebus_toolbox.station_optimizer import StationOptimizer + from ebus_toolbox.consumption import Consumption from ebus_toolbox.costs import calculate_costs from ebus_toolbox.trip import Trip from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev, uncomment_json_file +class LowSocEvent: + """Class to gather information about a low soc event""" + event_counter = 0 + + def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rot, + stations_list, capacity, v_type, ch_type): + self.start_idx = start_idx + self.end_idx = end_idx + self.min_soc = min_soc + self.stations = stations + self.vehicle_id = vehicle_id + self.trip = trip + self.rotation = rot + self.stations_list = stations_list + self.capacity = capacity + self.v_type = v_type + self.ch_type = ch_type + self.event_counter = LowSocEvent.event_counter + LowSocEvent.event_counter += 1 + + class OptimizerConfig: """Class for the configuration file""" + def __init__(self): self.debug_level = None self.exclusion_rots = None @@ -57,6 +80,37 @@ def __init__(self): self.path = None +def time_it(function, timers={}): + """decorator function to time the duration function calls + take and count how often they happen + :param function: function do be decorated + :type function: function + :param timers: storage for cumulated time and call number + :type timers: dict + :return: decorated function or timer if given function is None + :rtype function or dict + + """ + if function: + def decorated_function(*this_args, **kwargs): + key = function.__name__ + start_time = time() + return_value = function(*this_args, **kwargs) + delta_time = time() - start_time + try: + timers[key]["time"] += delta_time + timers[key]["calls"] += 1 + except KeyError: + timers[key] = dict(time=0, calls=1) + timers[key]["time"] += delta_time + return return_value + + return decorated_function + + sorted_timer = dict(sorted(timers.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) + return sorted_timer + + def read_config(config_path): """ Read the config path to a config object :param config_path: path to file @@ -176,7 +230,7 @@ def get_rotation_soc_util(rot_id, this_sched, this_scen, soc_data: dict = None): return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx -def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: stat_op.StationOptimizer): +def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: 'StationOptimizer'): """get expected soc lift for a given start_soc and time_delta. :param soc_over_time_curve: array with socs over time @@ -205,8 +259,8 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: stat_op.Stati end_soc - start_soc) -def evaluate(events: typing.Iterable[stat_op.LowSocEvent], - optimizer: stat_op.StationOptimizer, **kwargs): +def evaluate(events: typing.Iterable[LowSocEvent], + optimizer: 'StationOptimizer', **kwargs): """Analyse stations for "helpful" energy supply. Energy supply is helpful if the minimal soc of an event is raised (up to a minimal soc (probably zero)). The supplied energy is approximated by loading power, standing time at a station, soc at station and minimal soc of the event @@ -217,7 +271,6 @@ def evaluate(events: typing.Iterable[stat_op.LowSocEvent], :return: sorted list with the best station and its potential on index 0 :rtype: list(str(station_id), float(potential)) """ - soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) soc_data = kwargs.get("soc_data", optimizer.scenario.vehicle_socs) @@ -526,7 +579,7 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): :param electrified_stations: dict of stations to be electrified :return: schedule and scenario to be simulated """ - Trip.consumption =\ + Trip.consumption = \ Consumption(this_sched.vehicle_types, outside_temperatures=this_args.outside_temperature_over_day_path, level_of_loading_over_day=this_args.level_of_loading_over_day_path) @@ -545,7 +598,9 @@ def print_time(start=[]): """ if not start: start.append(time()) - print(round(time() - start[0], 2), " seconds till start") + delta = round(time() - start[0], 2) + if delta > 0: + print(delta, " seconds till start") def plot_(data): diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index d29b3394..0dfa36a2 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -4,7 +4,6 @@ from datetime import datetime import json from pathlib import Path -from time import time import logging import shutil import matplotlib @@ -16,36 +15,6 @@ matplotlib.use("TkAgg") -def time_it(function, timers={}): - """decorator function to time the duration function calls - take and count how often they happen - :param function: function do be decorated - :type function: function - :param timers: storage for cumulated time and call number - :type timers: dict - :return: decorated function or timer if given function is None - :rtype function or dict - - """ - if function: - def decorated_function(*this_args, **kwargs): - key = function.__name__ - start_time = time() - return_value = function(*this_args, **kwargs) - delta_time = time() - start_time - try: - timers[key]["time"] += delta_time - timers[key]["calls"] += 1 - except KeyError: - timers[key] = dict(time=0, calls=1) - timers[key]["time"] += delta_time - return return_value - return decorated_function - - sorted_timer = dict(sorted(timers.items(), key=lambda x: x[1]["time"] / x[1]["calls"])) - return sorted_timer - - def setup_logger(this_args, conf): """ setup file and stream logging by config and args arguments :param conf: configuration object @@ -83,8 +52,10 @@ def setup_logger(this_args, conf): def main(): """ main call""" + opt_util.print_time() config_path = "./data/examples/optimizer.cfg" run_optimization(config_path) + opt_util.print_time() def prepare_filesystem(this_args, conf): @@ -201,7 +172,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger.debug(event.rotation.id) with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) - + opt_util.print_time() logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False, cost_calc=True) @@ -209,8 +180,6 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) print("Finished") - logger.debug(time_it(None)) - return optimizer.schedule, optimizer.scenario diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 7177c232..eff12a3b 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -170,6 +170,7 @@ def loop(self, **kwargs): for stat in single_set: self.electrify_station(stat, self.electrified_station_set) + self.logger.debug(util.time_it(None)) return self.electrified_stations, self.electrified_station_set def get_negative_rotations_all_electrified(self, rel_soc=False): @@ -707,6 +708,7 @@ def create_charging_curves(self): time_step=0.1) self.soc_charge_curve_dict = soc_charge_curve_dict + @util.time_it def get_must_stations_and_rebase(self, relative_soc=False): """ Get the stations that must be electrified and put them into the electrified stations and an extra set of must stations @@ -780,6 +782,7 @@ def get_index_by_time(self, search_time: datetime): idx = (search_time - start_time) // delta_time return idx + @util.time_it def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): """ Get trips in a rotation from a start to an end index, if the arrival time is in between the start and end idx @@ -800,6 +803,7 @@ def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): return trips + @util.time_it def get_time_by_index(self, idx): """Get the time for a given index. @@ -812,6 +816,7 @@ def get_time_by_index(self, idx): searched_time = start_time + delta_time * idx return searched_time + @util.time_it def get_low_soc_events(self, rotations=None, filter_standing_time=True, rel_soc=False, soc_data=None, **kwargs): """ Gather low soc events below the config threshold. @@ -898,13 +903,13 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, cht = rot.vehicle_id.find("depb") ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" v_type = rot.vehicle_id.split("_" + ch_type)[0] - event = LowSocEvent(start_idx=start, end_idx=min_idx, - min_soc=min_soc, stations=possible_stations, - vehicle_id=rot.vehicle_id, trip=trips, - rot=rot, stations_list=possible_stations_list, - capacity=self.schedule.vehicle_types[v_type][ch_type][ - 'capacity'], - v_type=v_type, ch_type=ch_type) + event = util.LowSocEvent(start_idx=start, end_idx=min_idx, + min_soc=min_soc, stations=possible_stations, + vehicle_id=rot.vehicle_id, trip=trips, + rot=rot, stations_list=possible_stations_list, + capacity=self.schedule.vehicle_types[v_type][ch_type][ + 'capacity'], + v_type=v_type, ch_type=ch_type) events.append(event) copy_list = reduced_list.copy() @@ -916,24 +921,3 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, else: break return events - - -class LowSocEvent: - """Class to gather information about a low soc event""" - event_counter = 0 - - def __init__(self, start_idx, end_idx, min_soc, stations, vehicle_id, trip, rot, - stations_list, capacity, v_type, ch_type): - self.start_idx = start_idx - self.end_idx = end_idx - self.min_soc = min_soc - self.stations = stations - self.vehicle_id = vehicle_id - self.trip = trip - self.rotation = rot - self.stations_list = stations_list - self.capacity = capacity - self.v_type = v_type - self.ch_type = ch_type - self.event_counter = LowSocEvent.event_counter - LowSocEvent.event_counter += 1 From 8c9acd461ae738383640df1bb88d377f5be24e88 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 16:36:49 +0100 Subject: [PATCH 430/802] Add exceptions to group optimization --- data/examples/optimizer.cfg | 6 +- ebus_toolbox/optimizer_util.py | 7 ++ ebus_toolbox/station_optimizer.py | 134 +++++++++++++++++++++++------- 3 files changed, 113 insertions(+), 34 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index f272d8e4..33bd3b34 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -49,7 +49,7 @@ run_only_neg=False opt_type = deep # "step-by-step" or "brute" without "" node_choice=brute -max_brute_loop=2 +max_brute_loop=70 estimation_threshold = 0.80 # Preferring deps leads to a spice_ev simulation with preferred charging type depots @@ -59,14 +59,14 @@ prefer_deps=True # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible # If they are deemed as impossible, they are not optimized but discarded remove_impossible_rots=True -check_for_must_stations=False +check_for_must_stations=True include_must_stations = True [SPECIAL] decision_tree_path = "" -save_decision_tree = True +save_decision_tree = False reduce_rots = True # Use "" for ids and not '' # Negative Rots in all deps diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 5b323fcf..9ebda739 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -259,6 +259,13 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: 'StationOptim end_soc - start_soc) +class SuboptimalSimulationException(Exception): + pass + +class AllCombinationsCheckedException(Exception): + pass + + def evaluate(events: typing.Iterable[LowSocEvent], optimizer: 'StationOptimizer', **kwargs): """Analyse stations for "helpful" energy supply. Energy supply is helpful if the minimal soc of diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index eff12a3b..46986b68 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -35,7 +35,7 @@ def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, with open(self.args.electrified_stations, "r", encoding="utf-8", ) as file: self.electrified_stations = json.load(file) self.base_stations = self.electrified_stations.copy() - self.base_electrified_station_set = self.electrified_station_set.copy() + self.base_electrified_station_set = set() # stations which are included can not be included again. Therefore they get into # the set of not possible stations together with excluded stations @@ -59,7 +59,6 @@ def loop(self, **kwargs): self.base_schedule = copy(self.schedule) self.base_stations = self.electrified_stations.copy() - self.base_electrified_station_set = self.electrified_station_set.copy() self.base_not_possible_stations = self.not_possible_stations.copy() # get events where soc fell below 0. The events contain info about the problematic @@ -85,7 +84,7 @@ def loop(self, **kwargs): self.logger.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, len(groups)) self.logger.warning(linien) - self.logger.warning("%s events", (len(events))) + self.logger.warning("%s events with %s stations", (len(events)), len(stations)) # first run is always step by step self.group_optimization(group, self.choose_station_step_by_step, @@ -119,7 +118,8 @@ def loop(self, **kwargs): combinations = util.combs_unordered_no_putting_back(len(stations), len(list_greedy_sets[group_nr]) - 1) self.logger.debug("There are %s combinations with 1 station less than " - "the current solution", combinations) + "the current solution with %s stations out of %s", combinations, + len(list_greedy_sets[group_nr]), len(stations)) pre_optimized_set = list_greedy_sets[group_nr] @@ -138,11 +138,19 @@ def loop(self, **kwargs): self.not_possible_stations = self.base_not_possible_stations.copy() # create a new electrified set - new_stats, cont_loop = self.group_optimization(group, choice_func, - track_not_possible_rots=False, - pre_optimized_set=pre_optimized_set, - events_remaining=[len(events)], - **kwargs) + try: + new_stats, cont_loop =\ + self.group_optimization(group, choice_func, + track_not_possible_rots=False, + pre_optimized_set=pre_optimized_set, + events_remaining=[len(events)], + **kwargs) + except util.SuboptimalSimulationException: + print("suboptimal") + continue + except util.AllCombinationsCheckedException: + print("all checked") + break new_electrified_set = self.electrified_station_set # if a new set was found, print it and save it in sols @@ -202,6 +210,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ :return: Returns (electrified_stations if optimization continues, None if no further recursive calls should happen, bool if further deep analysis should take place) :rtype (dict() or None, bool) + :raise util.AllCombinationsCheckedException: If all combinations have been checked + :raise util.SuboptimalSimulationException: if a suboptimal Simulation has been identified """ could_not_be_electrified = self.could_not_be_electrified @@ -234,19 +244,36 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # when the recursive call goes on a higher level eg. level 0 - level 1 - level 2 - level 1 station_eval = util.evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) - # get rotations from event dict and calculate the missing energy - rotation_dict = {e.rotation.id: e.rotation for e in event_group} missing_energy = util.get_missing_energy(event_group) if missing_energy >= 0: self.logger.debug("Already electrified: Returning") return self.electrified_stations, True + # get rotations from event dict and calculate the missing energy + rotation_dict = {e.rotation.id: e.rotation for e in event_group} + + self.expand_tree(station_eval) + + # Check if the children are viable or not. If no children are viable this node is not + # viable itself for further inspection + # if the node is the root of the tree, i.e. no electrified stations yet, than all + # combinations have been checked + if not self.is_node_viable(): + if len(self.electrified_station_set) == 0: + raise util.AllCombinationsCheckedException + node_name = util.stations_hash(self.electrified_station_set) + self.decision_tree[node_name]["viable"] = False + print("suboptimal after children node check") + raise util.SuboptimalSimulationException + + # get the best stations, brute or step_by_step best_station_ids, recursive = choose_station_function(station_eval, pre_optimized_set=pre_optimized_set, missing_energy=missing_energy) stat_eval_dict = {stat_id[0]: stat_id[1] for stat_id in station_eval} + if best_station_ids is None: self.logger.warning("No useful station found with %s rotations not electrified yet. " "Stopped after electrifying %s", events_remaining, @@ -254,7 +281,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if pre_optimized_set is None: could_not_be_electrified.update(list(rotation_dict.keys())) - return None, False + print("1") + raise util.SuboptimalSimulationException # remove electrified stations in this run copied_set = self.electrified_station_set.copy() @@ -264,7 +292,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # overwrite with pre optimized set for stat in pre_optimized_set: self.electrify_station(stat, self.electrified_station_set) - return None, False + print("2") + raise util.SuboptimalSimulationException self.logger.debug("%s, with first pot of %s", best_station_ids, round(stat_eval_dict[best_station_ids[0]], 1)) @@ -315,7 +344,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # some choice functions might not need a recursive call, they return here. recursive is set # by the choose_station_function if not recursive: - return None, True + print("not recursive") + raise util.SuboptimalSimulationException # check if the events can be divided into subgroups which are independent groups = util.get_groups_from_events(new_events, self.not_possible_stations, @@ -334,8 +364,6 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if new_stations is not None: self.electrified_stations.update(new_stations) - else: - return None, True # if there is no pre optimized set function can return if pre_optimized_set is None: @@ -352,7 +380,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, prune_missing_energy): self.logger.debug("Branch pruned early") - return None, True + node_name=util.stations_hash(self.electrified_station_set) + self.decision_tree[node_name]["viable"]=False + raise util.SuboptimalSimulationException return self.electrified_stations, True @@ -470,6 +500,31 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_dict[rot.vehicle_id] = soc return soc_dict + def expand_tree(self, station_eval): + try: + parent_name=util.stations_hash(self.electrified_station_set) + self.decision_tree[parent_name] + except KeyError: + self.decision_tree[parent_name] = get_init_node() + for stat, ev_score in station_eval: + try: + node_name=util.stations_hash(self.electrified_station_set.union([stat])) + self.decision_tree[node_name] + except KeyError: + self.decision_tree[parent_name]["children"].append(node_name) + self.decision_tree[node_name] = {} + self.decision_tree[node_name]["viable"]=True + self.decision_tree[node_name]["missing_energy"] = None + self.decision_tree[node_name]["visit_counter"] = 0 + self.decision_tree[node_name]["children"] = [] + + def is_node_viable(self): + parent_name = util.stations_hash(self.electrified_station_set) + for child in self.decision_tree[parent_name]["children"]: + if not self.decision_tree[child]["viable"]: + return False + return True + def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): """Quickly evaluates if following a branch is promising by summing up estimated potentials @@ -498,15 +553,10 @@ def node_to_tree(self, delta_base_energy): :rtype dict() """ node_name = util.stations_hash(self.electrified_station_set) - try: - self.decision_tree[node_name]["missing_energy"] = delta_base_energy - self.decision_tree[node_name]["visit_counter"] += 1 - # todo add is_viable - self.logger.debug("already visited") - except KeyError: - self.decision_tree[node_name] = {} - self.decision_tree[node_name]["missing_energy"] = delta_base_energy - self.decision_tree[node_name]["visit_counter"] = 1 + self.decision_tree[node_name]["missing_energy"] = delta_base_energy + self.decision_tree[node_name]["visit_counter"] += 1 + if self.decision_tree[node_name]["visit_counter"]>1: + self.logger.debug("already visited this node") def choose_station_brute(self, station_eval, pre_optimized_set=None, missing_energy=0, @@ -537,12 +587,18 @@ def choose_station_brute(self, station_eval, # potential>missing energy * 80% potential = sum([station_eval_dict[stat] for stat in comb]) if potential > -missing_energy * self.config.estimation_threshold: + self.decision_tree[node_name] = get_init_node() return comb, False else: self.logger.debug("skipped %s since potential is too low %s %%", comb, round(potential / -missing_energy * 100, 0)) + try: + self.decision_tree[node_name]["viable"] = False + except KeyError: + self.decision_tree[node_name]=get_init_node() + self.decision_tree[node_name]["viable"] = False self.logger.debug("calculated all viable possibilities") - return None, False + raise util.AllCombinationsCheckedException def choose_station_step_by_step(self, station_eval, pre_optimized_set=None, missing_energy=0): @@ -568,7 +624,9 @@ def choose_station_step_by_step(self, station_eval, if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, missing_energy): # best station id is none and do not go deeper in recursion - return None, False + node_name = util.stations_hash(self.electrified_station_set) + self.decision_tree[node_name]["viable"] = False + raise util.SuboptimalSimulationException min_nr_visited = float('inf') for stat_tuple in station_eval: @@ -579,10 +637,12 @@ def choose_station_step_by_step(self, station_eval, if self.decision_tree is not None: node_name = util.stations_hash(stats) - if node_name in self.decision_tree.keys(): + if node_name in self.decision_tree.keys()\ + and self.decision_tree[node_name]["viable"]: min_nr_visited = min(min_nr_visited, self.decision_tree[node_name]["visit_counter"]) - # if already checked skip to next one + # if already checked skip to next one. I.e. do not give a station which it is + # in the decision tree already continue if station not in self.electrified_station_set: best_station_id = station @@ -598,7 +658,10 @@ def choose_station_step_by_step(self, station_eval, if self.decision_tree[util.stations_hash(stats)]["visit_counter"] == min_nr_visited: best_station_id = station return [best_station_id], True - return None, True + + node_name = util.stations_hash(self.electrified_station_set) + self.decision_tree[node_name]["viable"] = False + raise util.SuboptimalSimulationException def set_battery_and_charging_curves(self): """ Create battery and charging curves for fast lookup @@ -921,3 +984,12 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, else: break return events + + +def get_init_node(): + d = {} + d["viable"] = True + d["missing_energy"] = None + d["visit_counter"] = 0 + d["children"] = [] + return d \ No newline at end of file From cbf2ed6d4afdd6f0a3be6f79c99858c2e7fba592 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 22 Dec 2022 16:57:08 +0100 Subject: [PATCH 431/802] Fix copy to deepcopy in timeseries --- ebus_toolbox/station_optimizer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 46986b68..19e5b68e 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -448,7 +448,7 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, if electrify_stations is None: electrify_stations = set() ele_stations = {*ele_station_set, *electrify_stations} - soc_dict = copy(soc_dict) + soc_dict = deepcopy(soc_dict) for rot in rotations: ch_type = (rot.vehicle_id.find("oppb") > 0) * "oppb" + ( @@ -789,8 +789,9 @@ def get_must_stations_and_rebase(self, relative_soc=False): electrified_station_set_all = set(stats) must_stations = set() print(f"Electrifying {len(electrified_station_set_all)} stations minus one", ) - for station in electrified_station_set_all: + for station in sorted(electrified_station_set_all): electrified_station_set = electrified_station_set_all.difference([station]) + vehicle_socs = self.timeseries_calc(electrify_stations=electrified_station_set) soc_min = 1 for rot in self.schedule.rotations: From 776ec36f0b492c36278b2974635b1b4fc59a6d0a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 23 Dec 2022 13:40:05 +0100 Subject: [PATCH 432/802] Fix is node viable --- data/examples/optimizer.cfg | 2 +- ebus_toolbox/station_optimization.py | 3 - ebus_toolbox/station_optimizer.py | 154 ++++++++++++++++----------- 3 files changed, 90 insertions(+), 69 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 33bd3b34..96609750 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -48,7 +48,7 @@ run_only_neg=False # "greedy" or "deep" without "" opt_type = deep # "step-by-step" or "brute" without "" -node_choice=brute +node_choice=step-by-step max_brute_loop=70 estimation_threshold = 0.80 diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 0dfa36a2..a6d16fd5 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -128,9 +128,6 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # set battery and charging curves through config file if wished for optimizer.set_battery_and_charging_curves() - # create a decision tree or load one from a previous run - optimizer.set_up_decision_tree() - # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations if conf.rebase_scenario: diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 19e5b68e..ac11512f 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -23,7 +23,8 @@ def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, self.could_not_be_electrified = set() self.must_include_set = set() self.soc_charge_curve_dict = {} - self.decision_tree = {} + self.decision_trees = [] + self.current_tree = {} self.schedule = sched self.scenario = scen self.base_schedule = self.schedule @@ -76,10 +77,14 @@ def loop(self, **kwargs): # storage for the sets of stations which will be generated list_greedy_sets = [set()] * len(groups) + # create a decision tree or load one from a previous run + self.set_up_decision_tree(len(groups)) + # baseline greedy optimization # base line is created simply by not having a decision tree and not a pre optimized_set yet for group_nr, group in enumerate(groups[:]): events, stations = group + self.current_tree = self.decision_trees[group_nr] linien = {lne for e in events for lne in e.rotation.lines} self.logger.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, len(groups)) @@ -103,6 +108,7 @@ def loop(self, **kwargs): for stat in single_set: self.electrify_station(stat, self.electrified_station_set) return self.electrified_stations, self.electrified_station_set + self.logger.warning("Starting deep analysis with mode: %s", self.config.node_choice) # from here on only for deep analysis for group_nr, group in enumerate(groups[:]): @@ -110,6 +116,7 @@ def loop(self, **kwargs): sols = [] i = 0 cont_loop = True + self.current_tree = self.decision_trees[group_nr] if node_choice == "brute": choice_func = self.choose_station_brute else: @@ -122,11 +129,10 @@ def loop(self, **kwargs): len(list_greedy_sets[group_nr]), len(stations)) pre_optimized_set = list_greedy_sets[group_nr] - while i < self.config.max_brute_loop and cont_loop: i += 1 if i % 10 == 0: - print(len(self.decision_tree), " nodes checked") + print(len(self.current_tree), " nodes checked") print(f"Optimal solution has length {len(pre_optimized_set)}") self.electrified_stations = self.base_stations.copy() self.electrified_station_set = self.base_electrified_station_set.copy() @@ -145,6 +151,10 @@ def loop(self, **kwargs): pre_optimized_set=pre_optimized_set, events_remaining=[len(events)], **kwargs) + # The terminal node is checked therefore not viable anymore + node_name = util.stations_hash(self.electrified_station_set) + self.current_tree[node_name]["viable"] = False + except util.SuboptimalSimulationException: print("suboptimal") continue @@ -170,7 +180,7 @@ def loop(self, **kwargs): # saving decision tree only in case of deep analysis if self.config.save_decision_tree: with open(self.args.output_directory / Path("decision_tree.pickle"), "wb") as file: - pickle.dump(self.decision_tree, file) + pickle.dump(self.current_tree, file) self.electrified_stations = self.base_stations.copy() self.electrified_station_set = self.base_electrified_station_set.copy() @@ -259,10 +269,11 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # if the node is the root of the tree, i.e. no electrified stations yet, than all # combinations have been checked if not self.is_node_viable(): + node_name = util.stations_hash(self.electrified_station_set) + self.current_tree[node_name]["viable"] = False if len(self.electrified_station_set) == 0: + a=1 raise util.AllCombinationsCheckedException - node_name = util.stations_hash(self.electrified_station_set) - self.decision_tree[node_name]["viable"] = False print("suboptimal after children node check") raise util.SuboptimalSimulationException @@ -275,25 +286,26 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ stat_eval_dict = {stat_id[0]: stat_id[1] for stat_id in station_eval} if best_station_ids is None: - self.logger.warning("No useful station found with %s rotations not electrified yet. " - "Stopped after electrifying %s", events_remaining, - len(self.electrified_station_set)) - - if pre_optimized_set is None: - could_not_be_electrified.update(list(rotation_dict.keys())) - print("1") - raise util.SuboptimalSimulationException - - # remove electrified stations in this run - copied_set = self.electrified_station_set.copy() - for stat in copied_set: - self.electrified_stations.pop(stat) - self.electrified_station_set.remove(stat) - # overwrite with pre optimized set - for stat in pre_optimized_set: - self.electrify_station(stat, self.electrified_station_set) - print("2") - raise util.SuboptimalSimulationException + print("depreceated part not happening anymore") + # self.logger.warning("No useful station found with %s rotations not electrified yet. " + # "Stopped after electrifying %s", events_remaining, + # len(self.electrified_station_set)) + # + # if pre_optimized_set is None: + # could_not_be_electrified.update(list(rotation_dict.keys())) + # print("1..1") + # raise util.SuboptimalSimulationException + # + # # remove electrified stations in this run + # copied_set = self.electrified_station_set.copy() + # for stat in copied_set: + # self.electrified_stations.pop(stat) + # self.electrified_station_set.remove(stat) + # # overwrite with pre optimized set + # for stat in pre_optimized_set: + # self.electrify_station(stat, self.electrified_station_set) + # print("2..2") + # raise util.SuboptimalSimulationException self.logger.debug("%s, with first pot of %s", best_station_ids, round(stat_eval_dict[best_station_ids[0]], 1)) @@ -344,7 +356,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # some choice functions might not need a recursive call, they return here. recursive is set # by the choose_station_function if not recursive: - print("not recursive") + print("not recu") raise util.SuboptimalSimulationException # check if the events can be divided into subgroups which are independent @@ -381,7 +393,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ pre_optimized_set, prune_missing_energy): self.logger.debug("Branch pruned early") node_name=util.stations_hash(self.electrified_station_set) - self.decision_tree[node_name]["viable"]=False + self.current_tree[node_name]["viable"]=False raise util.SuboptimalSimulationException return self.electrified_stations, True @@ -418,7 +430,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # go through events and lift the socs according to timeseries_calc # check if socs are clipped. if so mutate the event time and repeat step2 and 3. # go further - + @util.time_it def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_upper_thresh=None, electrify_stations=None) -> object: """ A quick estimation of socs by mutating the soc data according to full electrification. @@ -503,27 +515,31 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, def expand_tree(self, station_eval): try: parent_name=util.stations_hash(self.electrified_station_set) - self.decision_tree[parent_name] + self.current_tree[parent_name] except KeyError: - self.decision_tree[parent_name] = get_init_node() + self.current_tree[parent_name] = get_init_node() for stat, ev_score in station_eval: try: node_name=util.stations_hash(self.electrified_station_set.union([stat])) - self.decision_tree[node_name] + self.current_tree[node_name] except KeyError: - self.decision_tree[parent_name]["children"].append(node_name) - self.decision_tree[node_name] = {} - self.decision_tree[node_name]["viable"]=True - self.decision_tree[node_name]["missing_energy"] = None - self.decision_tree[node_name]["visit_counter"] = 0 - self.decision_tree[node_name]["children"] = [] + self.current_tree[parent_name]["children"].append(node_name) + self.current_tree[node_name] = {} + self.current_tree[node_name]["viable"]=True + self.current_tree[node_name]["missing_energy"] = None + self.current_tree[node_name]["visit_counter"] = 0 + self.current_tree[node_name]["children"] = [] def is_node_viable(self): parent_name = util.stations_hash(self.electrified_station_set) - for child in self.decision_tree[parent_name]["children"]: - if not self.decision_tree[child]["viable"]: - return False - return True + for child in self.current_tree[parent_name]["children"]: + if not self.current_tree[child]["viable"]: + continue + # if one viable node is found return True + return True + # not a single viable node was found, return False + return False + def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): @@ -553,9 +569,9 @@ def node_to_tree(self, delta_base_energy): :rtype dict() """ node_name = util.stations_hash(self.electrified_station_set) - self.decision_tree[node_name]["missing_energy"] = delta_base_energy - self.decision_tree[node_name]["visit_counter"] += 1 - if self.decision_tree[node_name]["visit_counter"]>1: + self.current_tree[node_name]["missing_energy"] = delta_base_energy + self.current_tree[node_name]["visit_counter"] += 1 + if self.current_tree[node_name]["visit_counter"]>1: self.logger.debug("already visited this node") def choose_station_brute(self, station_eval, @@ -581,22 +597,22 @@ def choose_station_brute(self, station_eval, station_eval_dict = {stat[0]: stat[1] for stat in station_eval} for comb in generator: node_name = util.stations_hash(comb) - if node_name not in self.decision_tree: + if node_name not in self.current_tree: # only check the brute force station if they have the remote chance of fulfilling # the missing energy # potential>missing energy * 80% potential = sum([station_eval_dict[stat] for stat in comb]) if potential > -missing_energy * self.config.estimation_threshold: - self.decision_tree[node_name] = get_init_node() + self.current_tree[node_name] = get_init_node() return comb, False else: self.logger.debug("skipped %s since potential is too low %s %%", comb, round(potential / -missing_energy * 100, 0)) try: - self.decision_tree[node_name]["viable"] = False + self.current_tree[node_name]["viable"] = False except KeyError: - self.decision_tree[node_name]=get_init_node() - self.decision_tree[node_name]["viable"] = False + self.current_tree[node_name]=get_init_node() + self.current_tree[node_name]["viable"] = False self.logger.debug("calculated all viable possibilities") raise util.AllCombinationsCheckedException @@ -625,7 +641,7 @@ def choose_station_step_by_step(self, station_eval, pre_optimized_set, missing_energy): # best station id is none and do not go deeper in recursion node_name = util.stations_hash(self.electrified_station_set) - self.decision_tree[node_name]["viable"] = False + self.current_tree[node_name]["viable"] = False raise util.SuboptimalSimulationException min_nr_visited = float('inf') @@ -635,12 +651,12 @@ def choose_station_step_by_step(self, station_eval, # stations and possible new stations stats = self.electrified_station_set.union([station]) - if self.decision_tree is not None: + if self.current_tree is not None: node_name = util.stations_hash(stats) - if node_name in self.decision_tree.keys()\ - and self.decision_tree[node_name]["viable"]: + if node_name in self.current_tree.keys()\ + and self.current_tree[node_name]["viable"]: min_nr_visited = min(min_nr_visited, - self.decision_tree[node_name]["visit_counter"]) + self.current_tree[node_name]["visit_counter"]) # if already checked skip to next one. I.e. do not give a station which it is # in the decision tree already continue @@ -655,12 +671,12 @@ def choose_station_step_by_step(self, station_eval, # create a station combination from already electrified stations # and possible new station stats = self.electrified_station_set.union([station]) - if self.decision_tree[util.stations_hash(stats)]["visit_counter"] == min_nr_visited: + if self.current_tree[util.stations_hash(stats)]["visit_counter"] == min_nr_visited: best_station_id = station return [best_station_id], True node_name = util.stations_hash(self.electrified_station_set) - self.decision_tree[node_name]["viable"] = False + self.current_tree[node_name]["viable"] = False raise util.SuboptimalSimulationException def set_battery_and_charging_curves(self): @@ -673,12 +689,14 @@ def set_battery_and_charging_curves(self): if self.config.charging_curve is not None: vehicle["charging_curve"] = self.config.charging_curve - def set_up_decision_tree(self): + def set_up_decision_tree(self, group_amount): """ Load decision tree if given in the config """ if self.config.decision_tree_path is not None: with open(self.config.decision_tree_path, "rb") as file: - self.decision_tree = self.config.load(file) + self.decision_trees = self.config.load(file) + else: + self.decision_trees = [{} for _ in range(group_amount)] def rebase_spice_ev(self): """ Rebase the scenario meaning configuring various variables according to the input data @@ -781,6 +799,18 @@ def get_must_stations_and_rebase(self, relative_soc=False): :param relative_soc: should the evaluation use the relative or absolute soc :return: Set(Station_ids) """ + + ############### + must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', 'Bensheim Bahnhof/ ZOB'} + self.not_possible_stations = self.not_possible_stations.union(must_stations) + for stat in must_stations: + # do not put must stations in electrified set, but in extra set must_include_set + self.electrify_station(stat, self.must_include_set) + + self.scenario.vehicle_socs = self.timeseries_calc(ele_station_set=must_stations) + return must_stations + ################# + events = self.get_low_soc_events(rel_soc=relative_soc) stats = {station for event in events for station in event.stations_list @@ -986,11 +1016,5 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, break return events - def get_init_node(): - d = {} - d["viable"] = True - d["missing_energy"] = None - d["visit_counter"] = 0 - d["children"] = [] - return d \ No newline at end of file + return {"viable": True, "missing_energy": None, "visit_counter": 0, "children": []} From bc08a604b5230abd36a9a7f84befad8e710687a3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 23 Dec 2022 15:43:12 +0100 Subject: [PATCH 433/802] Fully implement is viable and completed runs --- data/examples/optimizer.cfg | 10 +-- ebus_toolbox/optimizer_util.py | 4 +- ebus_toolbox/station_optimizer.py | 138 ++++++++++++++++++------------ 3 files changed, 84 insertions(+), 68 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 96609750..3a1c5664 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -5,20 +5,12 @@ debug_level=0 [SCENARIO] # Use "" for ids and not '' exclusion_rots = [] -# a={'0306a_2', '0306a_5', '0306a_3', '0817_2', '0817_4', '0817_1', '0306a_1', '0817_3', '0817_5', '0306a_4'} -# b= ["7003_7", "0817_3", "0817_2", "6003_6", "0817_1", "0306a_3", "0817_4", "0306a_2", "0306a_4", "0306a_5", "0306a_1", "0817_5"] exclusion_stations= [] # If using inclusion stations, scenario should be rebased inclusion_stations= [] standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, "voltage_level": "MV"} -#Buffered -#["0310a_2", "0310a_3", "0310a_4", "0310a_5", "0413_3", "6310b_6"] -#Spice Ev -#['0717_2', '0310a_5', '7003_7', '0413_3', '0310a_2', '0413_4', '0717_4', '7310a_7', '0310a_3', '0717_5', '6003_6', '0310a_4', '6310b_6', '0413_5', '0717_3'] -# BVG -#["1000031","6891224", "6891223", "6891222", "6891228", "689126"] [PICKLE] schedule=schedule_buffered_all_oppb.pickle scenario=scenario_buffered_all_oppb.pickle @@ -49,7 +41,7 @@ run_only_neg=False opt_type = deep # "step-by-step" or "brute" without "" node_choice=step-by-step -max_brute_loop=70 +max_brute_loop=300 estimation_threshold = 0.80 # Preferring deps leads to a spice_ev simulation with preferred charging type depots diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 9ebda739..89d2443b 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -118,7 +118,7 @@ def read_config(config_path): """ config_parser = configparser.ConfigParser() config_parser.sections() - config_parser.read(config_path) + config_parser.read(config_path, encoding="utf-8") conf = OptimizerConfig() conf.path = config_path @@ -265,7 +265,7 @@ class SuboptimalSimulationException(Exception): class AllCombinationsCheckedException(Exception): pass - +@time_it def evaluate(events: typing.Iterable[LowSocEvent], optimizer: 'StationOptimizer', **kwargs): """Analyse stations for "helpful" energy supply. Energy supply is helpful if the minimal soc of diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index ac11512f..d1f43d4b 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -4,6 +4,7 @@ import pickle from copy import deepcopy, copy from datetime import datetime, timedelta +from time import time from pathlib import Path import numpy as np @@ -56,6 +57,8 @@ def loop(self, **kwargs): node_choice = kwargs.get("node_choice", self.config.node_choice) opt_type = kwargs.get("opt_type", self.config.opt_type) + + self.scenario.vehicle_socs = self.timeseries_calc(electrify_stations=self.must_include_set) self.base_scenario = copy(self.scenario) self.base_schedule = copy(self.schedule) @@ -69,7 +72,7 @@ def loop(self, **kwargs): # check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible - groups =\ + groups = \ util.get_groups_from_events(base_events, self.not_possible_stations, could_not_be_electrified=self.could_not_be_electrified, optimizer=self) @@ -82,6 +85,7 @@ def loop(self, **kwargs): # baseline greedy optimization # base line is created simply by not having a decision tree and not a pre optimized_set yet + util.print_time() for group_nr, group in enumerate(groups[:]): events, stations = group self.current_tree = self.decision_trees[group_nr] @@ -109,13 +113,11 @@ def loop(self, **kwargs): self.electrify_station(stat, self.electrified_station_set) return self.electrified_stations, self.electrified_station_set self.logger.warning("Starting deep analysis with mode: %s", self.config.node_choice) - + util.print_time() # from here on only for deep analysis for group_nr, group in enumerate(groups[:]): events, stations = group sols = [] - i = 0 - cont_loop = True self.current_tree = self.decision_trees[group_nr] if node_choice == "brute": choice_func = self.choose_station_brute @@ -129,34 +131,37 @@ def loop(self, **kwargs): len(list_greedy_sets[group_nr]), len(stations)) pre_optimized_set = list_greedy_sets[group_nr] - while i < self.config.max_brute_loop and cont_loop: + for i in range(self.config.max_brute_loop): i += 1 if i % 10 == 0: print(len(self.current_tree), " nodes checked") print(f"Optimal solution has length {len(pre_optimized_set)}") + self.electrified_stations = self.base_stations.copy() self.electrified_station_set = self.base_electrified_station_set.copy() self.scenario = copy(self.base_scenario) self.schedule = copy(self.base_schedule) self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) - self.schedule.rotations = deepcopy(self.base_schedule.rotations) + if self.config.solver == "spiceev": + self.schedule.rotations = deepcopy(self.base_schedule.rotations) self.not_possible_stations = self.base_not_possible_stations.copy() # create a new electrified set try: - new_stats, cont_loop =\ + + new_stats = \ self.group_optimization(group, choice_func, track_not_possible_rots=False, pre_optimized_set=pre_optimized_set, events_remaining=[len(events)], **kwargs) + # The terminal node is checked therefore not viable anymore node_name = util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False - + self.current_tree[node_name]["completed"] = True except util.SuboptimalSimulationException: - print("suboptimal") continue except util.AllCombinationsCheckedException: print("all checked") @@ -172,11 +177,14 @@ def loop(self, **kwargs): if len(new_electrified_set) < len(pre_optimized_set): list_greedy_sets[group_nr] = new_electrified_set.copy() pre_optimized_set = new_electrified_set.copy() + else: + print(f"Ran all {self.config.max_brute_loop} loops") self.logger.debug("All solutions for this group: %s", sols) self.logger.debug("Optimized with %s stations out of %s", len(pre_optimized_set), len(stations)) + util.print_time() # saving decision tree only in case of deep analysis if self.config.save_decision_tree: with open(self.args.output_directory / Path("decision_tree.pickle"), "wb") as file: @@ -188,7 +196,7 @@ def loop(self, **kwargs): for stat in single_set: self.electrify_station(stat, self.electrified_station_set) - self.logger.debug(util.time_it(None)) + print(util.time_it(None)) return self.electrified_stations, self.electrified_station_set def get_negative_rotations_all_electrified(self, rel_soc=False): @@ -207,6 +215,7 @@ def get_negative_rotations_all_electrified(self, rel_soc=False): new_events = self.get_low_soc_events(soc_data=vehicle_socs) return {event.rotation.id for event in new_events} + @util.time_it def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, pre_optimized_set=None, **kwargs): """Optimize a single group events and returns the electrified stations and a flag @@ -257,7 +266,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ missing_energy = util.get_missing_energy(event_group) if missing_energy >= 0: self.logger.debug("Already electrified: Returning") - return self.electrified_stations, True + return self.electrified_stations # get rotations from event dict and calculate the missing energy rotation_dict = {e.rotation.id: e.rotation for e in event_group} @@ -272,12 +281,10 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ node_name = util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False if len(self.electrified_station_set) == 0: - a=1 + a = 1 raise util.AllCombinationsCheckedException - print("suboptimal after children node check") raise util.SuboptimalSimulationException - # get the best stations, brute or step_by_step best_station_ids, recursive = choose_station_function(station_eval, pre_optimized_set=pre_optimized_set, @@ -287,6 +294,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if best_station_ids is None: print("depreceated part not happening anymore") + raise Exception # self.logger.warning("No useful station found with %s rotations not electrified yet. " # "Stopped after electrifying %s", events_remaining, # len(self.electrified_station_set)) @@ -317,13 +325,12 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ event_rotations = {event.rotation for event in event_group} # copy scen and sched - self.scenario = copy(self.base_scenario) - self.schedule = copy(self.base_schedule) + self.copy_scen_sched() if solver == "quick": # quick calculation has to electrify everything in one step, # or the lifting of socs is not correct - self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) + self.deepcopy_socs() self.scenario.vehicle_socs = self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) else: @@ -352,11 +359,10 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # everything electrified if delta_energy >= 0: - return self.electrified_stations, True + return self.electrified_stations # some choice functions might not need a recursive call, they return here. recursive is set # by the choose_station_function if not recursive: - print("not recu") raise util.SuboptimalSimulationException # check if the events can be divided into subgroups which are independent @@ -368,7 +374,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ this_tree = tree_position.copy() this_tree.append(k + 1) kwargs["tree_position"] = this_tree - new_stations, _ = \ + new_stations = \ self.group_optimization(this_group, choose_station_function, track_not_possible_rots=track_not_possible_rots, pre_optimized_set=pre_optimized_set, @@ -392,11 +398,20 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, prune_missing_energy): self.logger.debug("Branch pruned early") - node_name=util.stations_hash(self.electrified_station_set) - self.current_tree[node_name]["viable"]=False + node_name = util.stations_hash(self.electrified_station_set) + self.current_tree[node_name]["viable"] = False raise util.SuboptimalSimulationException - return self.electrified_stations, True + return self.electrified_stations + + @util.time_it + def deepcopy_socs(self): + self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) + + @util.time_it + def copy_scen_sched(self): + self.scenario = copy(self.base_scenario) + self.schedule = copy(self.base_schedule) # ToDo implement a fast calculation of timeseries_calc but with a limited amount of charging # points. Implementation could look like this @@ -430,6 +445,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # go through events and lift the socs according to timeseries_calc # check if socs are clipped. if so mutate the event time and repeat step2 and 3. # go further + @util.time_it def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_upper_thresh=None, electrify_stations=None) -> object: @@ -512,25 +528,27 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_dict[rot.vehicle_id] = soc return soc_dict + @util.time_it def expand_tree(self, station_eval): try: - parent_name=util.stations_hash(self.electrified_station_set) + parent_name = util.stations_hash(self.electrified_station_set) self.current_tree[parent_name] except KeyError: self.current_tree[parent_name] = get_init_node() for stat, ev_score in station_eval: try: - node_name=util.stations_hash(self.electrified_station_set.union([stat])) + node_name = util.stations_hash(self.electrified_station_set.union([stat])) self.current_tree[node_name] except KeyError: self.current_tree[parent_name]["children"].append(node_name) - self.current_tree[node_name] = {} - self.current_tree[node_name]["viable"]=True - self.current_tree[node_name]["missing_energy"] = None - self.current_tree[node_name]["visit_counter"] = 0 - self.current_tree[node_name]["children"] = [] + self.current_tree[node_name] = get_init_node() + @util.time_it def is_node_viable(self): + """Check if anode has viable children. Viable children are not terminal and did not show + lack of potential yet + :return: True if the node still has potential + """ parent_name = util.stations_hash(self.electrified_station_set) for child in self.current_tree[parent_name]["children"]: if not self.current_tree[child]["viable"]: @@ -540,7 +558,7 @@ def is_node_viable(self): # not a single viable node was found, return False return False - + @util.time_it def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): """Quickly evaluates if following a branch is promising by summing up estimated potentials @@ -557,8 +575,9 @@ def is_branch_promising(self, station_eval, electrified_station_set, for i in range(0, min(delta, len(station_eval))): pot += station_eval[i][1] if pot < -missing_energy * self.config.estimation_threshold: - print(f"Not enough potential {round(pot, 0)} / {round(-missing_energy, 0)} after ", - util.stations_hash(electrified_station_set)) + self.logger.debug("Not enough potential: %s after: %s ", + round(pot / -missing_energy, 0), + util.stations_hash(electrified_station_set)) return False return True @@ -571,9 +590,10 @@ def node_to_tree(self, delta_base_energy): node_name = util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["missing_energy"] = delta_base_energy self.current_tree[node_name]["visit_counter"] += 1 - if self.current_tree[node_name]["visit_counter"]>1: + if self.current_tree[node_name]["visit_counter"] > 1: self.logger.debug("already visited this node") + @util.time_it def choose_station_brute(self, station_eval, pre_optimized_set=None, missing_energy=0, gens=dict()): @@ -611,11 +631,12 @@ def choose_station_brute(self, station_eval, try: self.current_tree[node_name]["viable"] = False except KeyError: - self.current_tree[node_name]=get_init_node() + self.current_tree[node_name] = get_init_node() self.current_tree[node_name]["viable"] = False self.logger.debug("calculated all viable possibilities") raise util.AllCombinationsCheckedException + @util.time_it def choose_station_step_by_step(self, station_eval, pre_optimized_set=None, missing_energy=0): """ Gives back a station of possible stations to electrify which shows the biggest potential @@ -645,32 +666,28 @@ def choose_station_step_by_step(self, station_eval, raise util.SuboptimalSimulationException min_nr_visited = float('inf') + # find the lowes amount of visits in the possible stations / children + # not viable stations are skipped for stat_tuple in station_eval: station, _ = stat_tuple # create a station combination from already electrified # stations and possible new stations stats = self.electrified_station_set.union([station]) - - if self.current_tree is not None: - node_name = util.stations_hash(stats) - if node_name in self.current_tree.keys()\ - and self.current_tree[node_name]["viable"]: - min_nr_visited = min(min_nr_visited, - self.current_tree[node_name]["visit_counter"]) - # if already checked skip to next one. I.e. do not give a station which it is - # in the decision tree already - continue - if station not in self.electrified_station_set: - best_station_id = station - return [best_station_id], True - # every possible node from here was evaluated already - # to do what now? - # simply visit the least visited node + node_name = util.stations_hash(stats) + if not self.current_tree[node_name]["viable"]: + continue + min_nr_visited = min(min_nr_visited, self.current_tree[node_name]["visit_counter"]) + # simply visit the least visited node, starting from the one with the highest potential + # not viable stations are skipped for stat_eval in station_eval: station, _ = stat_eval # create a station combination from already electrified stations # and possible new station stats = self.electrified_station_set.union([station]) + node_name = util.stations_hash(stats) + if not self.current_tree[node_name]["viable"]: + continue + if self.current_tree[util.stations_hash(stats)]["visit_counter"] == min_nr_visited: best_station_id = station return [best_station_id], True @@ -801,13 +818,20 @@ def get_must_stations_and_rebase(self, relative_soc=False): """ ############### - must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', 'Bensheim Bahnhof/ ZOB'} + must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', + 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', + 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', + 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', + 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', + 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', + 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', + 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', + 'Bensheim Bahnhof/ ZOB'} self.not_possible_stations = self.not_possible_stations.union(must_stations) for stat in must_stations: # do not put must stations in electrified set, but in extra set must_include_set self.electrify_station(stat, self.must_include_set) - self.scenario.vehicle_socs = self.timeseries_calc(ele_station_set=must_stations) return must_stations ################# @@ -838,8 +862,6 @@ def get_must_stations_and_rebase(self, relative_soc=False): for stat in must_stations: # do not put must stations in electrified set, but in extra set must_include_set self.electrify_station(stat, self.must_include_set) - - self.scenario.vehicle_socs = self.timeseries_calc(ele_station_set=must_stations) return must_stations def remove_none_socs(self): @@ -1002,7 +1024,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, vehicle_id=rot.vehicle_id, trip=trips, rot=rot, stations_list=possible_stations_list, capacity=self.schedule.vehicle_types[v_type][ch_type][ - 'capacity'], + 'capacity'], v_type=v_type, ch_type=ch_type) events.append(event) @@ -1016,5 +1038,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, break return events + def get_init_node(): - return {"viable": True, "missing_energy": None, "visit_counter": 0, "children": []} + return {"completed":False, "viable": True, + "missing_energy": None, "visit_counter": 0, "children": []} From 0262a9ae1c3c4cbf40d1132cf8fcd76ff24b4461 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 23 Dec 2022 15:43:50 +0100 Subject: [PATCH 434/802] Delete best station id is none --- ebus_toolbox/station_optimizer.py | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index d1f43d4b..f88027f7 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -292,29 +292,6 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ stat_eval_dict = {stat_id[0]: stat_id[1] for stat_id in station_eval} - if best_station_ids is None: - print("depreceated part not happening anymore") - raise Exception - # self.logger.warning("No useful station found with %s rotations not electrified yet. " - # "Stopped after electrifying %s", events_remaining, - # len(self.electrified_station_set)) - # - # if pre_optimized_set is None: - # could_not_be_electrified.update(list(rotation_dict.keys())) - # print("1..1") - # raise util.SuboptimalSimulationException - # - # # remove electrified stations in this run - # copied_set = self.electrified_station_set.copy() - # for stat in copied_set: - # self.electrified_stations.pop(stat) - # self.electrified_station_set.remove(stat) - # # overwrite with pre optimized set - # for stat in pre_optimized_set: - # self.electrify_station(stat, self.electrified_station_set) - # print("2..2") - # raise util.SuboptimalSimulationException - self.logger.debug("%s, with first pot of %s", best_station_ids, round(stat_eval_dict[best_station_ids[0]], 1)) From 72209351138d5263db8e1b96520e9846434d8022 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 2 Jan 2023 12:03:51 +0100 Subject: [PATCH 435/802] Improve file_wrapper_to_dict function #30 --- ebus_toolbox/util.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index e6748a8e..8e100091 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -6,11 +6,18 @@ def file_wrapper_to_dict(f): line = f.readline() header = line.split(",") - return_dict = {} - line = f.readline().split(",") - for key, value in zip(header, line): - return_dict[key] = value - return [return_dict] + return_dict = dict() + + while line != "": + tmp_rotation = dict() + line = f.readline().split(",") + if line == [""]: + break + for key, value in zip(header, line): + tmp_rotation[key] = value + return_dict[tmp_rotation['id']] = tmp_rotation + + return return_dict def get_git_revision_hash() -> str: From 5a72727f49807f0905406a043276736113dc4dbb Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 2 Jan 2023 12:05:49 +0100 Subject: [PATCH 436/802] update include, exclude rotation filtering #30 --- ebus_toolbox/simulate.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 37b60cc1..e33894c7 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -66,22 +66,21 @@ def simulate(args): if args.rotation_filter_variable: try: with open(args.rotation_filter, encoding='utf-8') as f: - # TODO: file zu dict umwandeln + # convert rotation file to dict rotation_filter = util.file_wrapper_to_dict(f) - print(rotation_filter) except FileNotFoundError: print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") - # TODO: filter rotations - if args.rotation_filter_variable == "exclude_rotation": + # filter out rotations in schedule + if args.rotation_filter_variable == "exclude": for rotation in rotation_filter: - if rotation in rotation_filter: + if rotation in schedule.rotations: try: - schedule.rotations.pop(rotation['rotation_id']) + schedule.rotations.pop(rotation) except KeyError: - print(f"Key of rotation {rotation['rotation_id']} " + print(f"Key of rotation {rotation['id']} " f"does not exist in schedule.") - elif args.rotation_filter_variable == "include_rotation": + elif args.rotation_filter_variable == "include": staying_rotations = dict() for rot_filter in rotation_filter: for rot_schedule in schedule.rotations: From 6bda2fce8e59f950f3e2ee98363491e2ca75ca54 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 2 Jan 2023 12:33:59 +0100 Subject: [PATCH 437/802] Add some comments --- data/examples/optimizer.cfg | 1 + ebus_toolbox/optimizer_util.py | 4 ++ ebus_toolbox/station_optimizer.py | 61 ++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 3a1c5664..865b23ab 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -36,6 +36,7 @@ rebase_scenario = False pickle_rebased= False pickle_rebased_name=buffered_rebase_all_electrified run_only_neg=False +pruning_threshold=0 # "greedy" or "deep" without "" opt_type = deep diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 89d2443b..4953bdf8 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -78,6 +78,7 @@ def __init__(self): self.reduce_rots = None self.rots = None self.path = None + self.pruning_threshold = None def time_it(function, timers={}): @@ -164,6 +165,7 @@ def read_config(config_path): conf.estimation_threshold = float(optimizer.get("estimation_threshold", "0.8")) conf.output_path = optimizer.get("output_path") conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) + conf.pruning_threshold = int(optimizer.get("pruning_threshold", "3")) special = config_parser["SPECIAL"] conf.decision_tree_path = special.get("decision_tree_path", None) @@ -262,9 +264,11 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: 'StationOptim class SuboptimalSimulationException(Exception): pass + class AllCombinationsCheckedException(Exception): pass + @time_it def evaluate(events: typing.Iterable[LowSocEvent], optimizer: 'StationOptimizer', **kwargs): diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index f88027f7..82067613 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -4,7 +4,6 @@ import pickle from copy import deepcopy, copy from datetime import datetime, timedelta -from time import time from pathlib import Path import numpy as np @@ -17,7 +16,6 @@ class StationOptimizer: """ Class for station optimization""" - def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, config: 'util.OptimizerConfig', logger: logging.Logger): self.base_not_possible_stations = set() @@ -39,10 +37,11 @@ def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, self.base_stations = self.electrified_stations.copy() self.base_electrified_station_set = set() - # stations which are included can not be included again. Therefore they get into + # stations which are included can not be included again. Therefore they go into # the set of not possible stations together with excluded stations self.not_possible_stations = config.inclusion_stations.union(config.exclusion_stations) + # if the config defines special rotations, only use them in the schedule if config.reduce_rots: self.schedule.rotations = {rot: sched.rotations[rot] for rot in config.rots} @@ -65,7 +64,8 @@ def loop(self, **kwargs): self.base_stations = self.electrified_stations.copy() self.base_not_possible_stations = self.not_possible_stations.copy() - # get events where soc fell below 0. The events contain info about the problematic + # get events where soc fell below the minimal + # soc. The events contain info about the problematic # time span, which includes stations which could provide a soc lift base_events = self.get_low_soc_events(rel_soc=False, soc_data=self.base_scenario.vehicle_socs) @@ -80,19 +80,22 @@ def loop(self, **kwargs): # storage for the sets of stations which will be generated list_greedy_sets = [set()] * len(groups) - # create a decision tree or load one from a previous run + # create a decision tree or load one from a previous run. + # there are as many trees as groups. self.set_up_decision_tree(len(groups)) # baseline greedy optimization # base line is created simply by not having a decision tree and not a pre optimized_set yet util.print_time() for group_nr, group in enumerate(groups[:]): + # unpack the group events, stations = group + # define the current tree from the decision trees self.current_tree = self.decision_trees[group_nr] - linien = {lne for e in events for lne in e.rotation.lines} + lines = {lne for e in events for lne in e.rotation.lines} self.logger.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, len(groups)) - self.logger.warning(linien) + self.logger.warning(lines) self.logger.warning("%s events with %s stations", (len(events)), len(stations)) # first run is always step by step @@ -106,7 +109,8 @@ def loop(self, **kwargs): list_greedy_sets[group_nr] = self.electrified_station_set.copy() - # if no deep analysis is needed, loop can continue and part further down is skipped + # if no deep analysis is needed, return here and part further down is skipped + # if deep analysis is needed run can continue if opt_type != "deep": for single_set in list_greedy_sets: for stat in single_set: @@ -143,13 +147,14 @@ def loop(self, **kwargs): self.schedule = copy(self.base_schedule) self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) + # deep copy of schedule.rotations is very slow. Not needed for + # quick calculation. if self.config.solver == "spiceev": self.schedule.rotations = deepcopy(self.base_schedule.rotations) self.not_possible_stations = self.base_not_possible_stations.copy() # create a new electrified set try: - new_stats = \ self.group_optimization(group, choice_func, track_not_possible_rots=False, @@ -162,8 +167,12 @@ def loop(self, **kwargs): self.current_tree[node_name]["viable"] = False self.current_tree[node_name]["completed"] = True except util.SuboptimalSimulationException: + # exception if the optimization encountered a situation, where it is clear + # that going down the tree further, will not lead to an optimal solution continue except util.AllCombinationsCheckedException: + # exception if all combinations in the brute force method are checked or at + # least estimated or all nodes show no potential in the step-by-step method print("all checked") break @@ -180,6 +189,7 @@ def loop(self, **kwargs): else: print(f"Ran all {self.config.max_brute_loop} loops") + # print all solutions with the length of the self.logger.debug("All solutions for this group: %s", sols) self.logger.debug("Optimized with %s stations out of %s", len(pre_optimized_set), len(stations)) @@ -195,7 +205,7 @@ def loop(self, **kwargs): for single_set in list_greedy_sets: for stat in single_set: self.electrify_station(stat, self.electrified_station_set) - + # dump the measured running times of the functions print(util.time_it(None)) return self.electrified_stations, self.electrified_station_set @@ -229,8 +239,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ :return: Returns (electrified_stations if optimization continues, None if no further recursive calls should happen, bool if further deep analysis should take place) :rtype (dict() or None, bool) - :raise util.AllCombinationsCheckedException: If all combinations have been checked - :raise util.SuboptimalSimulationException: if a suboptimal Simulation has been identified + :raises AllCombinationsCheckedException: If all combinations have been checked + :raises SuboptimalSimulationException: if a suboptimal Simulation has been identified """ could_not_be_electrified = self.could_not_be_electrified @@ -273,7 +283,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ self.expand_tree(station_eval) - # Check if the children are viable or not. If no children are viable this node is not + # check if the children are viable or not. If no children are viable this node is not # viable itself for further inspection # if the node is the root of the tree, i.e. no electrified stations yet, than all # combinations have been checked @@ -281,7 +291,6 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ node_name = util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False if len(self.electrified_station_set) == 0: - a = 1 raise util.AllCombinationsCheckedException raise util.SuboptimalSimulationException @@ -329,9 +338,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ self.logger.debug("Last electrification electrified %s/%s." " %s remaining events in the base group.", len(event_group) - len(new_events), len(event_group), events_remaining[0]) - delta_base_energy = delta_energy # get_missing_energy(base_events) + delta_base_energy = delta_energy - # put this node intro the decision tree including the missing energy + # put this node into the decision tree including the missing energy self.node_to_tree(delta_base_energy) # everything electrified @@ -348,8 +357,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ optimizer=self) for k, this_group in enumerate(groups): - this_tree = tree_position.copy() - this_tree.append(k + 1) + this_tree = tree_position+[k + 1] kwargs["tree_position"] = this_tree new_stations = \ self.group_optimization(this_group, choose_station_function, @@ -364,8 +372,12 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if pre_optimized_set is None: continue # if there is a pre optimized set check if the pre optimized set leads to pruning - # i.e. if if following branch makes sense - if len(pre_optimized_set) - len(self.electrified_station_set) < 10: + # i.e. if if following branch makes sense. Since the prognosis is not very accurate + # over many station electrification pruning is very unlikely early on. The pruning + # threshold should be set not to high, since checking for pruning is likely to be + # unnecessary calculation + thresh =self.config.pruning_threshold + if len(pre_optimized_set) - len(self.electrified_station_set) < thresh: self.scenario.vehicle_socs = \ self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) prune_events = self.get_low_soc_events(rotations=event_rotations_ids, @@ -583,6 +595,7 @@ def choose_station_brute(self, station_eval, :param gens: dict of generators for brute force generation :return: combination of stations or None if no viable stations exists and false since this function does not support recursive calling + :raises AllCombinationsCheckedException: If all combinations have been checked """ station_ids = [x[0] for x in station_eval] @@ -625,6 +638,7 @@ def choose_station_step_by_step(self, station_eval, :param missing_energy: missing energy in this branch before electrification :return:a station to electrify or None if no viable stations exists and false since this function does not support recursive calling + :raises SuboptimalSimulationException: if a suboptimal Simulation has been identified """ # filter functions to stop simulating cases which have no hope of being optimal. @@ -685,6 +699,7 @@ def set_battery_and_charging_curves(self): def set_up_decision_tree(self, group_amount): """ Load decision tree if given in the config + :param group_amount: amount of groups for decision tree """ if self.config.decision_tree_path is not None: with open(self.config.decision_tree_path, "rb") as file: @@ -1017,5 +1032,9 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, def get_init_node(): - return {"completed":False, "viable": True, + """ Returns the initialization dictionary / node of the decision tree + :return: init node + :rtype: dict + """ + return {"completed": False, "viable": True, "missing_energy": None, "visit_counter": 0, "children": []} From bfaf95153f38ff351cd0f4ddfbd6a2eee881e086 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 2 Jan 2023 15:49:22 +0100 Subject: [PATCH 438/802] Make flak8 happy --- data/examples/optimizer.cfg | 25 +-------------- ebus_toolbox/station_optimization.py | 16 +++++----- ebus_toolbox/station_optimizer.py | 46 +++++++++++++++------------- 3 files changed, 33 insertions(+), 54 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 865b23ab..1157d4e6 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -43,7 +43,7 @@ opt_type = deep # "step-by-step" or "brute" without "" node_choice=step-by-step max_brute_loop=300 -estimation_threshold = 0.80 +estimation_threshold = 0.90 # Preferring deps leads to a spice_ev simulation with preferred charging type depots # Afterwards all negative rotations are swapped to opportunity chargers and optimized @@ -65,26 +65,3 @@ reduce_rots = True # Negative Rots in all deps rots = ["0310b_3", "0317_3", "0308_3", "0301b_5", "0404b_4", "0301b_2", "0802b_5", "0401b_4", "7401_7", "0702b_3", "0307a_3", "0307a_1", "0404a_3", "0711_3", "0817_2", "6002a_6", "6302_6", "6306b_6", "0302a_1", "0308_2", "0811_4", "0307b_5", "0705_5", "0801a_4", "0711_4", "0303_3", "0705_3", "0402_5", "0304_2", "0304_3", "0801a_1", "0314_4", "0002_1", "7310a_7", "0811_3", "6711_6", "0301a_5", "0301b_1", "0403_4", "0310b_4", "0701a_2", "0303_1", "0311a_3", "0711_1", "0317_1", "0318_5", "0305_2", "0402_4", "0002_4", "0403_5", "0801a_3", "0310a_2", "0803b_2", "0314_5", "0702b_5", "0701a_1", "0401b_5", "0005a_5", "0801b_5", "0310a_4", "0311a_5", "0311a_4", "0404b_1", "0014b_2", "0803b_5", "0306a_4", "0726_5", "0318_1", "0005a_2", "0303_5", "0308_4", "0002_3", "0306a_3", "0307a_4", "0701a_4", "0401a_4", "6403_6", "0404a_2", "6309a_6", "0314_3", "0317_4", "0401a_2", "0705_1", "0310b_1", "0701a_5", "0310a_1", "0404a_1", "0302a_5", "6305a_6", "0817_4", "0312a_1", "0301a_2", "0705_4", "0305_1", "0312a_4", "0702b_2", "0302b_5", "0005a_4", "6001a_6", "0003b_1", "0301b_4", "0310a_3", "6003_6", "0302a_2", "0817_3", "0404b_5", "0403_2", "0317_5", "0817_1", "0401b_3", "0003b_3", "0726_1", "0701a_3", "7005_7", "0311a_2", "0307b_3", "0301b_3", "0314_2", "6310b_6", "0803b_3", "0014b_1", "0401a_3", "0306a_1", "0305_5", "6303a_6", "6401_6", "0303_2", "6301_6", "0005a_3", "0404a_4", "0312a_2", "0302a_4", "7402_7", "0401b_2", "0301a_1", "0402_2", "0014b_3", "0307b_1", "0803b_1", "6002b_6", "0303_4", "6310a_6", "0302a_3", "0318_4", "7811_7", "0306a_2", "0312a_3", "0308_5", "0014b_4", "0310a_5", "0319_1", "0310b_5", "0705_2", "0002_2", "7702b_7", "7711_7", "0811_2", "0403_1", "0319_3", "0317_2", "0726_3", "0404a_5", "0726_4", "0307b_2", "6901_6", "0319_4", "0005b_5", "0305_4", "6702b_6", "7002b_7", "0304_5", "0305_3", "0003b_2", "0401b_1", "0801a_5", "0301a_3", "0402_1", "0005a_1", "0319_5", "6306a_6", "0319_2", "0311a_1", "0401a_5", "0003b_5", "0307a_5", "0307a_2", "0301a_4", "0318_3", "0308_1", "0726_2", "0803b_4", "6001b_6", "0401a_1", "0312a_5", "6703b_6", "0711_2", "0811_1", "0702b_1", "0314_1", "0014b_5", "0310b_2", "0404b_2", "0003b_4", "0307b_4", "0304_1", "0306a_5", "0811_5", "0403_3", "0318_2", "0402_3", "0817_5", "0404b_3", "0702b_4", "0711_5", "7003_7", "0002_5", "0304_4", "0801a_2"] - - -# add later as description -# :param remove_impossible_rots: repeat optimization without impossible to electrify rotations -# default=False -# :type remove_impossible_rots: bool -# -# :param rebase_scenario: should the given scenario be simulated with the given boundries before -# optimization or can schedule and scenario be used right away. rebasing can be time consuming -# but can speed up optimization afterwards and increase optimization efficiency -# default=False -# :type rebase_scenario: bool -# -# -# :param opt_type: Type of the following optimizations ["greedy"] -# :type opt_type: str -# :param exclusion_rots: Rotations to be excluded from optimization -# :type exclusion_rots: set(str) -# :param inclusion_stations: Stations which have to be electrified -# :type inclusion_stations: set(str) -# :param exclusion_stations: Stations to be excluded from optimization, eg. cant be electrified -# :type exclusion_stations: set(str) - diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index a6d16fd5..ceb4af8a 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -9,9 +9,9 @@ import matplotlib import ebus_toolbox.station_optimizer -import ebus_toolbox.optimizer_util as opt_util +from ebus_toolbox.station_optimizer import util -config = opt_util.OptimizerConfig() +config = util.OptimizerConfig() matplotlib.use("TkAgg") @@ -52,10 +52,10 @@ def setup_logger(this_args, conf): def main(): """ main call""" - opt_util.print_time() + util.print_time() config_path = "./data/examples/optimizer.cfg" run_optimization(config_path) - opt_util.print_time() + util.print_time() def prepare_filesystem(this_args, conf): @@ -96,15 +96,15 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): :return: (Schedule,Scenario) optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - conf = opt_util.read_config(config_path) + conf = util.read_config(config_path) # load pickle files if sched is None or scen is None or this_args is None: # if no schedule was given as argument, make sure no scenario # and args input was given as well. assert sched == scen == this_args is None - sched, scen, this_args = opt_util.toolbox_from_pickle(conf.schedule, - conf.scenario, conf.args) + sched, scen, this_args = util.toolbox_from_pickle(conf.schedule, + conf.scenario, conf.args) args = this_args # prepare Filesystem with folders and paths and copy config @@ -169,7 +169,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger.debug(event.rotation.id) with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: json.dump(ele_stations, file, indent=2) - opt_util.print_time() + util.print_time() logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False, cost_calc=True) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 82067613..4fa13179 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -376,7 +376,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # over many station electrification pruning is very unlikely early on. The pruning # threshold should be set not to high, since checking for pruning is likely to be # unnecessary calculation - thresh =self.config.pruning_threshold + thresh = self.config.pruning_threshold if len(pre_optimized_set) - len(self.electrified_station_set) < thresh: self.scenario.vehicle_socs = \ self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) @@ -534,7 +534,7 @@ def expand_tree(self, station_eval): @util.time_it def is_node_viable(self): - """Check if anode has viable children. Viable children are not terminal and did not show + """Check if a node has viable children. Viable children are not terminal and did not show lack of potential yet :return: True if the node still has potential """ @@ -561,6 +561,8 @@ def is_branch_promising(self, station_eval, electrified_station_set, delta = len(pre_optimized_set) - len(electrified_station_set) pot = 0 + # sum up highest potentials until you would reach the number of electrified stations + # in the pre optimized case for i in range(0, min(delta, len(station_eval))): pot += station_eval[i][1] if pot < -missing_energy * self.config.estimation_threshold: @@ -688,7 +690,7 @@ def choose_station_step_by_step(self, station_eval, raise util.SuboptimalSimulationException def set_battery_and_charging_curves(self): - """ Create battery and charging curves for fast lookup + """ Set battery and charging curves from config """ for v_type in self.schedule.vehicle_types.values(): for vehicle in v_type.values(): @@ -703,7 +705,7 @@ def set_up_decision_tree(self, group_amount): """ if self.config.decision_tree_path is not None: with open(self.config.decision_tree_path, "rb") as file: - self.decision_trees = self.config.load(file) + self.decision_trees = pickle.load(file) else: self.decision_trees = [{} for _ in range(group_amount)] @@ -777,7 +779,7 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, return must_include_set, electrified_stations def electrify_station(self, stat, electrified_set): - """electrify a station and keep track of it in the electrified set file + """Electrify a station and keep track of it in the electrified set file :param stat: station id to be electrified :param electrified_set:the set that is mutated along the electrification """ @@ -809,23 +811,23 @@ def get_must_stations_and_rebase(self, relative_soc=False): :return: Set(Station_ids) """ - ############### - must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', - 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', - 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', - 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', - 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', - 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', - 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', - 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', - 'Bensheim Bahnhof/ ZOB'} - self.not_possible_stations = self.not_possible_stations.union(must_stations) - for stat in must_stations: - # do not put must stations in electrified set, but in extra set must_include_set - self.electrify_station(stat, self.must_include_set) - - return must_stations - ################# + # ############### + # must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', + # 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', + # 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', + # 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', + # 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', + # 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', + # 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', + # 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', + # 'Bensheim Bahnhof/ ZOB'} + # self.not_possible_stations = self.not_possible_stations.union(must_stations) + # for stat in must_stations: + # # do not put must stations in electrified set, but in extra set must_include_set + # self.electrify_station(stat, self.must_include_set) + # + # return must_stations + # ################# events = self.get_low_soc_events(rel_soc=relative_soc) From 33c39610ebc092a632c0e1738831c949395cd6f2 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 2 Jan 2023 17:35:30 +0100 Subject: [PATCH 439/802] update include rotation filtering #30 --- ebus_toolbox/simulate.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e33894c7..802fa816 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -78,14 +78,17 @@ def simulate(args): try: schedule.rotations.pop(rotation) except KeyError: - print(f"Key of rotation {rotation['id']} " - f"does not exist in schedule.") + print(f"Rotation {rotation['id']} does not exist in schedule.") elif args.rotation_filter_variable == "include": - staying_rotations = dict() - for rot_filter in rotation_filter: - for rot_schedule in schedule.rotations: - if rot_filter == rot_schedule: - staying_rotations.update(rot_schedule) + remove_rotations = list() + for rotation in schedule.rotations: + if rotation not in rotation_filter: + remove_rotations.append(rotation) + for rotation in remove_rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") # run the mode specified in config if args.mode == 'service_optimization': From cf1e3067f4c3d240d56e499195e527ffedb400f9 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 3 Jan 2023 10:44:37 +0100 Subject: [PATCH 440/802] Make flak8 happy --- ebus_toolbox/station_optimizer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 4fa13179..bb60f59c 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -525,11 +525,11 @@ def expand_tree(self, station_eval): except KeyError: self.current_tree[parent_name] = get_init_node() for stat, ev_score in station_eval: + node_name = util.stations_hash(self.electrified_station_set.union([stat])) + self.current_tree[parent_name]["children"].add(node_name) try: - node_name = util.stations_hash(self.electrified_station_set.union([stat])) self.current_tree[node_name] except KeyError: - self.current_tree[parent_name]["children"].append(node_name) self.current_tree[node_name] = get_init_node() @util.time_it @@ -1039,4 +1039,4 @@ def get_init_node(): :rtype: dict """ return {"completed": False, "viable": True, - "missing_energy": None, "visit_counter": 0, "children": []} + "missing_energy": None, "visit_counter": 0, "children": set()} From 1563f1b86292b0697d7f72b4500dfd4024c75f87 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 3 Jan 2023 15:02:53 +0100 Subject: [PATCH 441/802] Add save functionality --- data/examples/optimizer.cfg | 3 +- ebus_toolbox/optimizer_util.py | 28 +++++++ ebus_toolbox/simulate.py | 6 +- ebus_toolbox/station_optimization.py | 13 +++- ebus_toolbox/station_optimizer.py | 109 ++++++++++++++++++++++----- 5 files changed, 133 insertions(+), 26 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 1157d4e6..2d95411c 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -30,6 +30,7 @@ charge_eff = 0.95 [OPTIMIZER] # Not optional path to outputs of optimizer output_path=data/private_examples/332_Buffered/optimization +save_all_results=True # "quick" or "spiceev" solver = quick rebase_scenario = False @@ -39,7 +40,7 @@ run_only_neg=False pruning_threshold=0 # "greedy" or "deep" without "" -opt_type = deep +opt_type = greedy # "step-by-step" or "brute" without "" node_choice=step-by-step max_brute_loop=300 diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 4953bdf8..3ff685cc 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -23,6 +23,23 @@ from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev, uncomment_json_file +class ChargingEvent: + """ Class to gather information about a charging event""" + def __init__(self, start_idx, end_idx,arrival_time, start_time, end_time, buffer_time, + vehicle_id, capacity, + station_name, rotation): + self.start_idx = start_idx + self.end_idx = end_idx + self.arrival_time = arrival_time + self.start_time = start_time + self.end_time = end_time + self.buffer_time = buffer_time + self.vehicle_id = vehicle_id + self.capacity = capacity + self.station_name = station_name + self.rotation = rotation + + class LowSocEvent: """Class to gather information about a low soc event""" event_counter = 0 @@ -79,6 +96,7 @@ def __init__(self): self.rots = None self.path = None self.pruning_threshold = None + self.save_all_results = None def time_it(function, timers={}): @@ -166,6 +184,7 @@ def read_config(config_path): conf.output_path = optimizer.get("output_path") conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) conf.pruning_threshold = int(optimizer.get("pruning_threshold", "3")) + conf.save_all_results = optimizer.getboolean("save_all_results", False) special = config_parser["SPECIAL"] conf.decision_tree_path = special.get("decision_tree_path", None) @@ -194,6 +213,15 @@ def get_charging_time(trip1, trip2, args): return 0 return max(0, standing_time_min) +def get_charging_start(trip1, args): + """ Returns the possible start of charging consindering buffer times + + :param trip1: First trip + :param args: arguments Namespace with default buffer time + :return: First possible charging time as datetime object + """ + buffer_time = get_buffer_time(trip1, args.default_buffer_time_opps) + return trip1.arrival_time+buffer_time def get_buffer_time(trip, default_buffer_time_opps): """ Return the buffer time as timedelta object diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 4256e6ea..e4539fbb 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -93,11 +93,11 @@ def simulate(args): calculate_costs(cost_parameters_file, scenario, schedule, args) import pickle - with open("schedule_buffered_all_oppb.pickle", "wb") as f: + with open("schedule", "wb") as f: pickle.dump(schedule, f) - with open("scenario_buffered_all_oppb.pickle", "wb") as f: + with open("scenario.pickle", "wb") as f: pickle.dump(scenario, f) - with open("args_buffered_all_oppb.pickle", "wb") as f: + with open("args.pickle", "wb") as f: pickle.dump(args, f) print("pickled") diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index ceb4af8a..a8596b34 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -116,10 +116,15 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger = setup_logger(args, conf) - # remove those args, since they lead to file creation, which is not - # needed. - del args.save_timeseries - del args.save_results + # remove those args, since they lead to file creation, which is not + # needed. + if not conf.save_all_results: + del args.save_timeseries + del args.save_results + else: + args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" + args.save_results = args.output_directory / "simulation_spiceEV.json" + if args.desired_soc_deps != 1 and conf.opt_type == "quick": logger.error("Fast calc is not yet optimized for desired socs unequal to 1") diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index bb60f59c..c37a6137 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -2,6 +2,7 @@ import json import logging import pickle +import warnings from copy import deepcopy, copy from datetime import datetime, timedelta from pathlib import Path @@ -16,6 +17,7 @@ class StationOptimizer: """ Class for station optimization""" + def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, config: 'util.OptimizerConfig', logger: logging.Logger): self.base_not_possible_stations = set() @@ -357,7 +359,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ optimizer=self) for k, this_group in enumerate(groups): - this_tree = tree_position+[k + 1] + this_tree = tree_position + [k + 1] kwargs["tree_position"] = this_tree new_stations = \ self.group_optimization(this_group, choose_station_function, @@ -404,6 +406,77 @@ def copy_scen_sched(self): # ToDo implement a fast calculation of timeseries_calc but with a limited amount of charging # points. Implementation could look like this + + def get_charge_events_per_station(self, station_name, rotations=None): + """ Gather low soc events below the config threshold. + + :param rotations: rotations to be searched for low soc events. Default None means whole + schedule is searched + :param station_name: name of the station to be checked + :return: list(ChargingEvents) + """ + if not rotations: + rotations = self.schedule.rotations + + # Find relevant charging events for this station + charging_events = [] + + for rot_id in rotations: + rot = self.schedule.rotations[rot_id] + for i, trip in enumerate(rot.trips): + # if the trip station name is not the searched station continue. + if trip.arrival_name != station_name: + continue + try: + charging_event_start_time = util.get_charging_start(trip, self.args) + end_time = rot.trips[i + 1].departure_time + + + # Do not add the event if there is charging time of at least the defined + # min charging time + if charging_event_start_time + self.args.min_charging_time >= end_time: + continue + except IndexError: + warnings.warn("Station to be checked has no following trip. Final destinations" + "can not offer lift to the soc and are therefore discarded") + continue + arrival_time= trip.arrival_time + start_idx = self.get_index_by_time(charging_event_start_time) + end_time = rot.trips[i+1].departure_time + buffer_time = util.get_buffer_time(trip, self.args.default_buffer_time_opps) + end_idx = self.get_index_by_time(end_time) + cht = rot.vehicle_id.find("depb") + ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" + v_type = rot.vehicle_id.split("_" + ch_type)[0] + event = util.ChargingEvent(start_idx=start_idx,end_idx=end_idx, + arrival_time=arrival_time, + start_time=charging_event_start_time, end_time=end_time, + buffer_time=buffer_time, vehicle_id=rot.vehicle_id, + capacity=self.schedule.vehicle_types[v_type][ch_type][ + 'capacity'], + station_name=station_name, rotation=rot) + charging_events.append(event) + return charging_events + + + def sort_station_events(self, charge_events_single_station): + return sorted(charge_events_single_station, key=lambda x: x.arrival_time) + + def mutate_events_for_n_charging_points(self, charge_events_single_station, nr_charge_points): + pass + + # mutate_events_for_n_charging_points() + # + # sort_all_station_events() + # + # calculate_events() + # + # get_below_0_soc_events() + # + # get_missing_energy() + # + # evaluate_soc_lift_vs_objective_function() + # For each possible station find the charging times of each vehicle, e.g # PotsdamerPlatz: Vehicle1: 12:30-12:40, 13:20-14:00 # Vehicle5: 9:30-9:40, 13:10-13:25 @@ -811,23 +884,23 @@ def get_must_stations_and_rebase(self, relative_soc=False): :return: Set(Station_ids) """ - # ############### - # must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', - # 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', - # 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', - # 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', - # 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', - # 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', - # 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', - # 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', - # 'Bensheim Bahnhof/ ZOB'} - # self.not_possible_stations = self.not_possible_stations.union(must_stations) - # for stat in must_stations: - # # do not put must stations in electrified set, but in extra set must_include_set - # self.electrify_station(stat, self.must_include_set) - # - # return must_stations - # ################# + ############### + must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', + 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', + 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', + 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', + 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', + 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', + 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', + 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', + 'Bensheim Bahnhof/ ZOB'} + self.not_possible_stations = self.not_possible_stations.union(must_stations) + for stat in must_stations: + # do not put must stations in electrified set, but in extra set must_include_set + self.electrify_station(stat, self.must_include_set) + + return must_stations + ################# events = self.get_low_soc_events(rel_soc=relative_soc) From 136f50f0f7ebf7611751db0073f74ec079e5f9be Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 4 Jan 2023 17:21:36 +0100 Subject: [PATCH 442/802] correct use factor calculation, make show plots optional --- data/examples/ebus_toolbox.cfg | 2 ++ ebus_toolbox/__main__.py | 3 +++ ebus_toolbox/report.py | 14 ++++++++------ ebus_toolbox/simulate.py | 6 +++--- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 42c0b498..31d4a8ff 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -107,6 +107,8 @@ strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEG # generate report and plots, default: false generate_report = true +# show plots for users to view, only valid if generate_report = true +show_plots = true # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index c90ce031..e2d4ba32 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -77,6 +77,9 @@ help='Show plots of the results- not apllicable', default=False) parser.add_argument('--generate-report', '-r', help='generates and stores plots and results', default=False) + parser.add_argument('--show-plots', + help='opens plots for user to view, only valid if generate_report=True', + default=False) parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index f6342d39..75bbfa60 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -66,18 +66,18 @@ def generate_gc_overview(schedule, scenario, args): max_nr_cs = max(ts["# occupied CS"]) sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 - # use factors: to which percentage of time are the three least used stations in use + # use factors: to which percentage of time are the three least used CS in use least_used_cs = [max_nr_cs, max_nr_cs-1, max_nr_cs-2] - use_factors = [ts["# occupied CS"].count(least_used_cs[i]) / - len(ts["# occupied CS"]) for i in range(3)] + use_factors = [None, None, None] for i in range(3): - if least_used_cs[i] < 1: - use_factors[i] = None + if least_used_cs[i] >= 1: + use_factors[i] = sum([ts["# occupied CS"].count(least_used_cs[j]) / + len(ts["# occupied CS"]) for j in range(i+1)]) else: max_gc_power = 0 max_nr_cs = 0 sum_of_cs_energy = 0 - use_factors = [0, 0, 0] + use_factors = [None, None, None] station_type = stations[gc]["type"] csv_writer.writerow([gc, station_type, @@ -116,6 +116,8 @@ def generate(schedule, scenario, args): plt.gcf().set_size_inches(10, 10) plt.savefig(args.output_directory / "run_overview.png") plt.savefig(args.output_directory / "run_overview.pdf") + if not args.show_plots: + plt.close() # calculate SOCs for each rotation rotation_infos = [] diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f2f9bfef..d0e283d4 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -96,6 +96,6 @@ def simulate(args): report.generate(schedule, scenario, args) - args.save_timeseries = False - args.save_results = False - args.save_soc = False + args.save_timeseries = None + args.save_results = None + args.save_soc = None From d34d0853b3be3a2a5539ccb5ba7bbc0d6fb48bfa Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 5 Jan 2023 09:57:07 +0100 Subject: [PATCH 443/802] minor code improvements --- ebus_toolbox/__main__.py | 12 ++++++------ ebus_toolbox/report.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index e2d4ba32..bfc367f9 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -118,14 +118,14 @@ util.set_options_from_config(args, check=True, verbose=False) - args.output_directory = Path(args.output_directory) / \ - str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + args.output_directory = Path(args.output_directory) / ( + datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. # needs to happen after set_options_from_config since # args.output_directory can be overwritten by config - args.output_directory_input = Path(args.output_directory) / "input_data" + args.output_directory_input = args.output_directory / "input_data" args.output_directory_input.mkdir(parents=True, exist_ok=True) # copy input files to output to ensure reproducibility @@ -134,10 +134,10 @@ # only copy cost params if they exist if args.cost_parameters_file is not None: copy_list.append(args.cost_parameters_file) - for c_file in copy_list: - shutil.copy(str(c_file), str(args.output_directory_input / Path(c_file).name)) + for c_file in map(Path, copy_list): + shutil.copy(c_file, args.output_directory_input / c_file.name) - util.save_version(Path(args.output_directory_input / "program_version.txt")) + util.save_version(args.output_directory_input / "program_version.txt") # rename special options args.timing = args.eta diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 75bbfa60..940be10f 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -205,4 +205,4 @@ def generate(schedule, scenario, args): else: csv_writer.writerow([key, round(value, 2), "€"]) - print("Plots and output files saved in " + str(args.output_directory)) + print("Plots and output files saved in", args.output_directory) From d55e1981eba1dd28634edf22f7dd63b755a27882 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 5 Jan 2023 09:59:16 +0100 Subject: [PATCH 444/802] fixed typo --- ebus_toolbox/__main__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index bfc367f9..715840a2 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -74,7 +74,7 @@ 'start time of a vehicle event im min.', default=10) parser.add_argument('--visual', '-v', action='store_true', - help='Show plots of the results- not apllicable', default=False) + help='Show plots of the results- not applicable', default=False) parser.add_argument('--generate-report', '-r', help='generates and stores plots and results', default=False) parser.add_argument('--show-plots', @@ -83,11 +83,11 @@ parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') - parser.add_argument('--save-timeseries', help='Write timesteps to file - not apllicable', + parser.add_argument('--save-timeseries', help='Write timesteps to file - not applicable', default=False) - parser.add_argument('--save-results', help='Write general info to file - not apllicable', + parser.add_argument('--save-results', help='Write general info to file - not applicable', default=False) - parser.add_argument('--save-soc', help='Write SOC info to file - not apllicable', default=False) + parser.add_argument('--save-soc', help='Write SOC info to file - not applicable', default=False) parser.add_argument('--strategy', '-s', default='greedy', help='Specify the charging strategy. One of {}. You may define \ custom options with --strategy-option.'.format('greedy, balanced')) From 937611644f6dcdc5988c6dcb249b73241236cc61 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 5 Jan 2023 10:07:19 +0100 Subject: [PATCH 445/802] remove unused function sanitize --- ebus_toolbox/util.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 8580b72e..7771ab9e 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -3,23 +3,6 @@ import subprocess -def sanitize(s, chars=''): - """ - Removes special characters from string. - - Used to make strings safe for file paths. - :param s: input to be sanitized - :type s: string - :param chars: characters to replace - :type chars: string - :return: input without special characters in chars - :rtype: string - """ - if not chars: - chars = ':"?*' - return s.translate({ord(c): "" for c in chars}) - - def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() From 867d47effeb85b7a92ab2e5728ba0c9f194cebdd Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 5 Jan 2023 10:20:30 +0100 Subject: [PATCH 446/802] changes to report docstrings --- ebus_toolbox/report.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 940be10f..b2161404 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -8,8 +8,7 @@ def generate_gc_power_overview_timeseries(scenario, args): - """Generates a csv file from each grid connectors summed up - charging station power in the specified simulation time. + """Generate a csv timeseries with each grid connector's summed up charging station power :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario @@ -21,7 +20,7 @@ def generate_gc_power_overview_timeseries(scenario, args): with open(args.output_directory / "gc_power_overview_timeseries.csv", "w", newline='') as f: csv_writer = csv.writer(f) - csv_writer.writerow(["time", ] + gc_list) + csv_writer.writerow(["time"] + gc_list) stations = [] time_col = getattr(scenario, f"{gc_list[0]}_timeseries")["time"] for i in range(len(time_col)): @@ -34,8 +33,10 @@ def generate_gc_power_overview_timeseries(scenario, args): def generate_gc_overview(schedule, scenario, args): - """Generates a csv file where each line an electrified station's maximum power - and maximum number of charging stations is shown. + """Generate a csv file with information regarding electrified stations. + + For each electrified station, the name, type, max. power, max. number of occupied + charging stations, sum of charged energy and use factors of least used stations is saved. :param schedule: Driving schedule for the simulation. :type schedule: eBus-Toolbox.Schedule From 0a51e22d5c80db61fea528b19ec45b8ea3f022fc Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 5 Jan 2023 11:32:10 +0100 Subject: [PATCH 447/802] make calculation of use factors more understandable --- ebus_toolbox/report.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index b2161404..2d3234cc 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -68,12 +68,17 @@ def generate_gc_overview(schedule, scenario, args): sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 # use factors: to which percentage of time are the three least used CS in use - least_used_cs = [max_nr_cs, max_nr_cs-1, max_nr_cs-2] - use_factors = [None, None, None] - for i in range(3): - if least_used_cs[i] >= 1: - use_factors[i] = sum([ts["# occupied CS"].count(least_used_cs[j]) / - len(ts["# occupied CS"]) for j in range(i+1)]) + num_ts = len(ts["# occupied CS"]) # number of timesteps + max_nr_cs = max(ts["# occupied CS"]) # maximum number of occupied CS + least_used_num = min(3, max_nr_cs + ) # three least used CS. Less if number of CS is lower. + # count number of timesteps with this exact number of occupied CS + count_nr_cs = [ts["# occupied CS"].count(max_nr_cs - i) for i in range( + least_used_num)] + use_factors = [sum(count_nr_cs[:i + 1]) / num_ts for i in range( + least_used_num)] # relative occupancy with at least this number of occupied CS + use_factors = use_factors + [None] * (3 - least_used_num) # fill up line with None + else: max_gc_power = 0 max_nr_cs = 0 From ca09e4ec29ea8f0aad1496997e293416dfa41ba6 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 5 Jan 2023 11:34:17 +0100 Subject: [PATCH 448/802] make flake8 happy --- ebus_toolbox/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 2d3234cc..4054e95f 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -69,9 +69,9 @@ def generate_gc_overview(schedule, scenario, args): # use factors: to which percentage of time are the three least used CS in use num_ts = len(ts["# occupied CS"]) # number of timesteps - max_nr_cs = max(ts["# occupied CS"]) # maximum number of occupied CS + max_nr_cs = max(ts["# occupied CS"]) # maximum number of occupied CS least_used_num = min(3, max_nr_cs - ) # three least used CS. Less if number of CS is lower. + ) # three least used CS. Less if number of CS is lower. # count number of timesteps with this exact number of occupied CS count_nr_cs = [ts["# occupied CS"].count(max_nr_cs - i) for i in range( least_used_num)] From bbdf6a008bc7d4c745ea3bb0370bf48cd8a1a486 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 5 Jan 2023 11:44:04 +0100 Subject: [PATCH 449/802] improve radability of comments --- ebus_toolbox/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 4054e95f..352c467a 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -70,8 +70,8 @@ def generate_gc_overview(schedule, scenario, args): # use factors: to which percentage of time are the three least used CS in use num_ts = len(ts["# occupied CS"]) # number of timesteps max_nr_cs = max(ts["# occupied CS"]) # maximum number of occupied CS - least_used_num = min(3, max_nr_cs - ) # three least used CS. Less if number of CS is lower. + # three least used CS. Less if number of CS is lower. + least_used_num = min(3, max_nr_cs) # count number of timesteps with this exact number of occupied CS count_nr_cs = [ts["# occupied CS"].count(max_nr_cs - i) for i in range( least_used_num)] From aff099c44af107bc40d315b56caab15332b016a6 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 6 Jan 2023 11:34:56 +0100 Subject: [PATCH 450/802] make gc power adaptable per gc --- data/examples/electrified_stations.json | 3 ++- ebus_toolbox/schedule.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index b1a068ae..db50eee9 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -44,7 +44,8 @@ "Station-10": { "type": "opps", "n_charging_stations": 1, - "voltage_level" : "MV" + "voltage_level" : "MV", + "gc_power": 60 // optional: maximum pc power can be defined per station }, "Station-21": { "type": "opps", diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 548eb9b2..eab2130e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -480,10 +480,10 @@ def generate_scenario(self, args): cs_power = args.cs_power_deps_oppb \ if trip.rotation.charging_type == 'oppb' \ else args.cs_power_deps_depb - gc_power = args.gc_power_deps + gc_power = station.get("gc_power", args.gc_power_deps) elif station_type == "opps": cs_power = args.cs_power_opps - gc_power = args.gc_power_opps + gc_power = station.get("gc_power", args.gc_power_opps) # add one charging station for each bus at bus station charging_stations[connected_charging_station] = { From d82b692bb4b39065ce7a25fe8ba7bb48149dcc99 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 6 Jan 2023 11:38:15 +0100 Subject: [PATCH 451/802] correct typo in comments --- data/examples/electrified_stations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index db50eee9..a3ca2a4c 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -45,7 +45,7 @@ "type": "opps", "n_charging_stations": 1, "voltage_level" : "MV", - "gc_power": 60 // optional: maximum pc power can be defined per station + "gc_power": 60 // optional: maximum gc power can be defined per station }, "Station-21": { "type": "opps", From 6d16943deda7000c6e4f1ad4ffaaf6c98862f60a Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 6 Jan 2023 11:46:17 +0100 Subject: [PATCH 452/802] give better description of gc_power in example config --- data/examples/ebus_toolbox.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index e5090a88..8fd67c3d 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -84,7 +84,8 @@ default_buffer_time_opps = 0 min_recharge_deps_oppb = 1 min_recharge_deps_depb = 1 -# max power of grid connectors at depot and opp stations +# default max power of grid connectors at depot and opp stations, +# individual gc_power per gc can be defined in electrified stations # default: Sum of max power of all charging stations at this grid connector gc_power_opps = 1000 gc_power_deps = 1000 From 14b681cb2c406af3d26083f29aa8ec07f11141e1 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Mon, 9 Jan 2023 08:46:10 +0100 Subject: [PATCH 453/802] remove redundant code in report --- ebus_toolbox/report.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 352c467a..7e176d22 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -69,7 +69,6 @@ def generate_gc_overview(schedule, scenario, args): # use factors: to which percentage of time are the three least used CS in use num_ts = len(ts["# occupied CS"]) # number of timesteps - max_nr_cs = max(ts["# occupied CS"]) # maximum number of occupied CS # three least used CS. Less if number of CS is lower. least_used_num = min(3, max_nr_cs) # count number of timesteps with this exact number of occupied CS From 064bb883403f64da50cef1a5b72f372f3fc1033a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 9 Jan 2023 09:31:03 +0100 Subject: [PATCH 454/802] Small changes --- data/examples/optimizer.cfg | 13 ++++++++----- ebus_toolbox/simulate.py | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 2d95411c..213ddee9 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -1,6 +1,6 @@ # Configs for the eBus Toolbox Optimizer [DEFAULT] -debug_level=0 +debug_level=1 [SCENARIO] # Use "" for ids and not '' @@ -12,9 +12,12 @@ standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_trans "voltage_level": "MV"} [PICKLE] -schedule=schedule_buffered_all_oppb.pickle -scenario=scenario_buffered_all_oppb.pickle -args=args_buffered_all_oppb.pickle +schedule=schedule_neg_dep_to_oppb_buffered_only_depot.pickle +scenario=scenario_neg_dep_to_oppb_buffered_only_depot.pickle +args=args_neg_dep_to_oppb_buffered_only_depot.pickle +# schedule=schedule_buffered_all_oppb.pickle +# scenario=scenario_buffered_all_oppb.pickle +# args=args_buffered_all_oppb.pickle # schedule=schedule_buffered_depots_utf.pickle # scenario=scenario_buffered_depots_utf.pickle # args=args_buffered_utf.pickle @@ -61,7 +64,7 @@ include_must_stations = True [SPECIAL] decision_tree_path = "" save_decision_tree = False -reduce_rots = True +reduce_rots = False # Use "" for ids and not '' # Negative Rots in all deps rots = ["0310b_3", "0317_3", "0308_3", "0301b_5", "0404b_4", "0301b_2", "0802b_5", "0401b_4", "7401_7", "0702b_3", "0307a_3", "0307a_1", "0404a_3", "0711_3", "0817_2", "6002a_6", "6302_6", "6306b_6", "0302a_1", "0308_2", "0811_4", "0307b_5", "0705_5", "0801a_4", "0711_4", "0303_3", "0705_3", "0402_5", "0304_2", "0304_3", "0801a_1", "0314_4", "0002_1", "7310a_7", "0811_3", "6711_6", "0301a_5", "0301b_1", "0403_4", "0310b_4", "0701a_2", "0303_1", "0311a_3", "0711_1", "0317_1", "0318_5", "0305_2", "0402_4", "0002_4", "0403_5", "0801a_3", "0310a_2", "0803b_2", "0314_5", "0702b_5", "0701a_1", "0401b_5", "0005a_5", "0801b_5", "0310a_4", "0311a_5", "0311a_4", "0404b_1", "0014b_2", "0803b_5", "0306a_4", "0726_5", "0318_1", "0005a_2", "0303_5", "0308_4", "0002_3", "0306a_3", "0307a_4", "0701a_4", "0401a_4", "6403_6", "0404a_2", "6309a_6", "0314_3", "0317_4", "0401a_2", "0705_1", "0310b_1", "0701a_5", "0310a_1", "0404a_1", "0302a_5", "6305a_6", "0817_4", "0312a_1", "0301a_2", "0705_4", "0305_1", "0312a_4", "0702b_2", "0302b_5", "0005a_4", "6001a_6", "0003b_1", "0301b_4", "0310a_3", "6003_6", "0302a_2", "0817_3", "0404b_5", "0403_2", "0317_5", "0817_1", "0401b_3", "0003b_3", "0726_1", "0701a_3", "7005_7", "0311a_2", "0307b_3", "0301b_3", "0314_2", "6310b_6", "0803b_3", "0014b_1", "0401a_3", "0306a_1", "0305_5", "6303a_6", "6401_6", "0303_2", "6301_6", "0005a_3", "0404a_4", "0312a_2", "0302a_4", "7402_7", "0401b_2", "0301a_1", "0402_2", "0014b_3", "0307b_1", "0803b_1", "6002b_6", "0303_4", "6310a_6", "0302a_3", "0318_4", "7811_7", "0306a_2", "0312a_3", "0308_5", "0014b_4", "0310a_5", "0319_1", "0310b_5", "0705_2", "0002_2", "7702b_7", "7711_7", "0811_2", "0403_1", "0319_3", "0317_2", "0726_3", "0404a_5", "0726_4", "0307b_2", "6901_6", "0319_4", "0005b_5", "0305_4", "6702b_6", "7002b_7", "0304_5", "0305_3", "0003b_2", "0401b_1", "0801a_5", "0301a_3", "0402_1", "0005a_1", "0319_5", "6306a_6", "0319_2", "0311a_1", "0401a_5", "0003b_5", "0307a_5", "0307a_2", "0301a_4", "0318_3", "0308_1", "0726_2", "0803b_4", "6001b_6", "0401a_1", "0312a_5", "6703b_6", "0711_2", "0811_1", "0702b_1", "0314_1", "0014b_5", "0310b_2", "0404b_2", "0003b_4", "0307b_4", "0304_1", "0306a_5", "0811_5", "0403_3", "0318_2", "0402_3", "0817_5", "0404b_3", "0702b_4", "0711_5", "7003_7", "0002_5", "0304_4", "0801a_2"] diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e4539fbb..67170800 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -93,7 +93,7 @@ def simulate(args): calculate_costs(cost_parameters_file, scenario, schedule, args) import pickle - with open("schedule", "wb") as f: + with open("schedule.pickle", "wb") as f: pickle.dump(schedule, f) with open("scenario.pickle", "wb") as f: pickle.dump(scenario, f) From e81e019f3ba403e883b66a6eb466166f93534fba Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 9 Jan 2023 14:51:28 +0100 Subject: [PATCH 455/802] Refactor test case with test class, make use of pytest.approx and add some doc --- tests/test_nd_interpolate.py | 328 +++++++++++++++++++---------------- 1 file changed, 177 insertions(+), 151 deletions(-) diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 23d31eaf..d26f3fb1 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -1,36 +1,14 @@ -""" -run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` -pytest will look for all files starting with "test_" and run all functions -within this file. For basic example of tests you can look at our workshop -https://github.com/rl-institut/workshop/tree/master/test-driven-development. -Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html -are also good support. -""" - import random - +import pytest from ebus_toolbox.util import nd_interp -random.seed(5) -linear_function = None TOLERANCE = 0.0001 POINTS_TO_CHECK = 10 DIM_AMOUNT = 4 -def test_lookup_tables(): - table = [(1, 2, 3), (2, 2, 4), (1, 5, 3), (2, 5, 10)] - assert nd_interp((1, 2), table) == 3 - assert nd_interp((100, 100), table) == 10 - assert nd_interp((1.5, 2), table) == 3.5 - table = [(1, 2, 3), (2, 2, 4), ] - assert nd_interp((1, 2), table) == 3 - table = [(1, 2, 3)] - assert nd_interp((1, 2), table) == 3 - assert nd_interp((100, 100), table) == 3 - assert nd_interp((-100, -100), table) == 3 - - +# get the boundaries of a data_table, where the lower boundaries and upper boundaries are given +# as a tuple of two lists def get_boundaries(table): idims = len(table[0]) - 1 # get the boundaries of each dimension @@ -43,146 +21,194 @@ def get_boundaries(table): return lower_bounds, upper_bounds -# Test if out of bound dims are correctly calculated. At this stage clipping of values is assumed, -# e.g. constant values of the dimension onwards. Extrapolation could also be possible but isnt -# used at this point -def test_out_of_bounds(): - for num_dim in range(1, DIM_AMOUNT): - data_table = generate_data_table(num_dimensions=num_dim, random_values=True, - dim_length=[2] * num_dim) - lower_bounds, upper_bounds = get_boundaries(data_table) - for out_of_bounds_dim in range(1, num_dim): - # copy table - stuffed_table = [p for p in data_table] - point = get_outer_point(data_table, dims_out_of_bound=out_of_bounds_dim) - for row in data_table: - for dim, v in enumerate(point): - row = list(row) - if (v < lower_bounds[dim] and row[dim] == lower_bounds[dim]) \ - or (v > upper_bounds[dim] and row[dim] == upper_bounds[dim]): - row[dim] = v - stuffed_table.append(tuple(row)) - assert nd_interp(point, data_table) \ - == nd_interp(point, stuffed_table) - - -# select a random point in between each boundary of each dimensions -def get_outer_point(table, dims_out_of_bound=1): - idims = len(table[0]) - 1 - dims_out_of_bound = min(dims_out_of_bound, idims) - low_bounds, upper_bounds = get_boundaries(table) +class TestNdInterpol: + random.seed(5) + linear_function = None + tolerance = TOLERANCE + points_to_check = POINTS_TO_CHECK + dim_amount = DIM_AMOUNT + + # some manual test for a simple data table, where interpolated values can be easily + # calculated by hand + def test_lookup_tables(self): + table = [(1, 2, 3), (2, 2, 4), (1, 5, 3), (2, 5, 10)] + + # perfect grid lookup + # Looking for value for input (1,2) which is exactly found as first element in the above + # table. Therefore 3 should be given back + self.approx(nd_interp((1, 2), table), 3) + + # Looking for out of bounds value for both input dimension. Since the last element in + # the above table has maximum of first and second input dimension, 10 should be given back + self.approx(nd_interp((100, 100), table), 10) + + # looking for the value between the first and second element in the above table. Both of + # them share the same value for the second input dimension. Therefore the interpolation + # is one dimensional in the first dimension, i.e. f(1) = 3 and f(2)= 4 --> f(1.5) --> 3.5 + self.approx(nd_interp((1.5, 2), table), 3.5) + + # perfect grid lookup + # making sure the perfect lookup from above works for 2 and 1 dimensions as well + table = [(1, 2, 3), (2, 2, 4), ] + + self.approx(nd_interp((1, 2), table), 3) + table = [(1, 2, 3)] + self.approx(nd_interp((1, 2), table), 3) + + # checking the out of bounds for above and below for both input dimensions at the same time. + self.approx(nd_interp((100, 100), table), 3) + self.approx(nd_interp((-100, -100), table), 3) + + # test if out of bound dims are correctly calculated. At this stage clipping of values is + # assumed, e.g. constant values of the dimension onwards. Extrapolation could also be + # possible but is not used at this point + def test_out_of_bounds(self): + for num_dim in range(1, self.dim_amount): + data_table = self.generate_data_table(num_dimensions=num_dim, random_values=True, + dim_lengths=[2] * num_dim) + lower_bounds, upper_bounds = get_boundaries(data_table) + for out_of_bounds_dim in range(1, num_dim+1): + # copy table + stuffed_table = [p for p in data_table] + + # get a point which has one or many input values out of the table boundaries + point = self.get_outer_point(data_table, dims_out_of_bound=out_of_bounds_dim) - # define a point with the number of dims_out_of_bound values which are not inside - # the dimension values - point = () - for dim in range(0, idims): - offset = random.random() - # out of bounds - if dim < dims_out_of_bound: - point += ((low_bounds[dim] - offset) + (offset > 0.5) * - ((-low_bounds[dim] + offset) + (upper_bounds[dim] + offset)),) + for dim, v in enumerate(point): + if lower_bounds[dim] < v < upper_bounds[dim]: + continue + + stuffing = [] + # go through all rows in the data_table + for row in stuffed_table: + mutated_row = list(row) + + # copy boundary values to out of bound values. + # if a row contains a boundary value which is broken by the input, the + # value of this row is copied to a new row, where the boundary value + # changes to the input value + if (v < lower_bounds[dim] and mutated_row[dim] == lower_bounds[dim] or + v > upper_bounds[dim] and mutated_row[dim] == upper_bounds[dim]): + mutated_row[dim] = v + stuffing.append(mutated_row) + stuffed_table.extend(stuffing) + self.approx(nd_interp(point, data_table), nd_interp(point, stuffed_table)) + + # select a random point in between each boundary of each dimensions + def get_outer_point(self, table, dims_out_of_bound=1): + idims = len(table[0]) - 1 + dims_out_of_bound = min(dims_out_of_bound, idims) + low_bounds, upper_bounds = get_boundaries(table) + + # define a point with the number of dims_out_of_bound values which are not inside + # the dimension values + point = () + for dim in range(0, idims): + offset = random.random() + # out of bounds + if dim < dims_out_of_bound: + point += ((low_bounds[dim] - offset) + (offset > 0.5) * + ((-low_bounds[dim] + offset) + (upper_bounds[dim] + offset)),) + else: + # inside bounds + point += (offset * (upper_bounds[dim] - low_bounds[dim]) + low_bounds[dim],) + return point + + # test each point on the grid of an automatically and randomly generated data table. + def test_grid_points(self): + for i in range(1, DIM_AMOUNT): + data_table = self.generate_data_table(num_dimensions=i, random_values=True) + for row in data_table: + self.approx(nd_interp(row[:-1], data_table), row[-1]) + + # test 10 randomly generated points in between the table bounds. Values are checked against + # a linear function with a TOLERANCE of 0.0001 + def test_random_points(self): + for i in range(1, DIM_AMOUNT): + data_table = self.generate_data_table(num_dimensions=i, random_values=False) + for _ in range(0, POINTS_TO_CHECK): + point = get_random_inner_point(data_table) + exact_value = self.linear_function(point) + self.approx(exact_value, nd_interp(point, data_table)) + self.approx(nd_interp(point, data_table), self.linear_function(point)) + + # test handling of singleton dimension, e.g [1,1,11], [2,1,12] <-- second dimension only has + # 1 value + def test_singleton(self): + for i in range(1, DIM_AMOUNT): + data_table = self.generate_data_table(num_dimensions=i, random_values=True) + singleton_value = random.random() + for ii, row in enumerate(data_table): + row = list(row) + row.insert(0, singleton_value) + data_table[ii] = row + for row in data_table: + self.approx(nd_interp(row[:-1], data_table), row[-1]) + + # generate a data table with num_dimensions as input plus 1 output dimension + # output values can be random values or follow a linear function + # nr of values per dimension can be specified via dim_length + # dimension values are not sorted and don't follow a constant stride / step size + def generate_data_table(self, num_dimensions: int, random_values=True, dim_lengths=None): + dims = [] + # generate dimensions with random values with random step size + for dim in range(0, num_dimensions): + start = random.randint(-100, 100) + if dim_lengths is not None: + steps = dim_lengths[dim] + else: + steps = random.randint(1, 5) + dims.append(list( + {start + (random.randint(1, 4) * random.randint(-10, 10)) * k for k in + range(0, steps)})) + # combine dimensions via list_combinator and append random or linear value as output to each + # row + if random_values: + output_table = [row + (random.randint(1, 4) * random.randint(1, 10),) for row in + list_combinator(dims)] + return output_table else: - # inside bounds - point += (offset * (upper_bounds[dim] - low_bounds[dim]) + low_bounds[dim],) - return point + def get_linear_function(num_dimensions): + linear_factors = [random.uniform(-5, 5) for _ in range(num_dimensions)] + def linear_function(inputs): + result = 0 + for i, inp in enumerate(inputs): + result += inp * linear_factors[i] + return result -# test each point on the grid of an automatically and randomly generated data table. -def test_grid_points(): - for i in range(1, DIM_AMOUNT): - data_table = generate_data_table(num_dimensions=i, random_values=True) - for row in data_table: - assert nd_interp(row[:-1], data_table) == row[-1] + return linear_function + self.linear_function = get_linear_function(num_dimensions) -# test 10 randomly generated points in between the table bounds. Values are checked against -# a linear function with a TOLERANCE of 0.0001 -def test_random_points(): - global linear_function - for i in range(1, DIM_AMOUNT): - data_table = generate_data_table(num_dimensions=i, random_values=False) - for _ in range(0, POINTS_TO_CHECK): - point = get_random_inner_point(data_table) - exact_value = linear_function(point) - # get signature of value for tolerance (sig=+1 or -1) - sig = 1 - (exact_value < 0) * 2 - assert ((1 - TOLERANCE * sig) * linear_function(point)) <= nd_interp(point, data_table) - assert nd_interp(point, data_table) <= ((1 + TOLERANCE * sig) * linear_function(point)) + output_table = [row + (self.linear_function(row),) for row in + list_combinator(dims)] + return output_table - -# select a random point in between each boundary of each dimensions -def get_random_inner_point(table): - idims = len(table[0]) - 1 - lower_bounds, upper_bounds = get_boundaries(table) - point = () - for dim in range(0, idims): - point += (random.random() * (upper_bounds[dim] - lower_bounds[dim]) + lower_bounds[dim],) - return point - - -def test_singleton(): - for i in range(1, DIM_AMOUNT): - data_table = generate_data_table(num_dimensions=i, random_values=True) - singleton_value = random.random() - for ii, row in enumerate(data_table): - row = list(row) - row.insert(0, singleton_value) - data_table[ii] = row - for row in data_table: - assert nd_interp(row[:-1], data_table) == row[-1] - - -# generate a data table with num_dimensions as input plus 1 output dimension -# output values can be random values or follow a linear function -# nr of values per dimension can be specified via dim_length -# dimension values are not sorted and dont follow a constant stride / step size -def generate_data_table(num_dimensions: int, random_values=True, dim_length=None): - dims = [] - # generate dimensions with random values with random step size - for _ in range(0, num_dimensions): - start = random.randint(-100, 100) - if dim_length is not None: - steps = dim_length[_] - else: - steps = random.randint(1, 5) - dims.append(list( - {start + (random.randint(1, 4) * random.randint(-10, 10)) * k for k in - range(0, steps)})) - # combine dimensions via list_combinator and append random or linear value as output to each - # row - if random_values: - output_table = [row + (random.randint(1, 4) * random.randint(1, 10),) for row in - list_combinator(dims)] - return output_table - else: - def get_linear_function(num_dimensions): - linear_factors = [random.random() * random.randint(-5, 5) for _ in - range(0, num_dimensions)] - - def linear_function(inputs): - result = 0 - for i, inp in enumerate(inputs): - result += inp * linear_factors[i] - return result - - return linear_function - - global linear_function - linear_function = get_linear_function(num_dimensions) - - output_table = [row + (linear_function(row),) for row in - list_combinator(dims)] - return output_table + # Wrapper for pytest.approx with constant tolerance + def approx(self, value_a, value_b): + tolerance = self.__class__.tolerance + assert value_a == pytest.approx(value_b, rel=tolerance, abs=tolerance) +# creates a full matrix, if given a list of lists with unique values per dimension def list_combinator(dimension_list): table = [(x,) for x in dimension_list[0]] - for i, l in enumerate(dimension_list): - if i == 0: - continue + for i, l in enumerate(dimension_list[1:]): new_table = [] for v in l: for ii, t in enumerate(table): new_table.append((*table[ii], v,)) table = new_table return table + + +# select a random point in between each boundary of each dimensions +def get_random_inner_point(table): + idims = len(table[0]) - 1 + lower_bounds, upper_bounds = get_boundaries(table) + point = () + for dim in range(0, idims): + point += ( + random.random() * (upper_bounds[dim] - lower_bounds[dim]) + lower_bounds[dim],) + return point From dc9ddc5b57b610a4e15c4c7718ecf185c3214f82 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 10 Jan 2023 13:10:47 +0100 Subject: [PATCH 456/802] Add comments, make more readable --- tests/test_nd_interpolate.py | 99 ++++++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 32 deletions(-) diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index d26f3fb1..3da52ad5 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -21,6 +21,40 @@ def get_boundaries(table): return lower_bounds, upper_bounds +def get_outer_point(table, dims_out_of_bound=1): + # Number of input dimensions + idims = len(table[0]) - 1 + + # Number of dimensions which are out of bounds + dims_out_of_bound = min(dims_out_of_bound, idims) + + # Lists for boundaries for each dimension, e.g. Dimension 2 has lower boundary of + # low_bounds[1] + low_bounds, upper_bounds = get_boundaries(table) + + # define a point where the first dims_out_of_bound values are outside of the boundaries, and + # the following are inside of the boundaries + point = () + for dim in range(idims): + offset = random.random() + if dim < dims_out_of_bound: + # out of bounds + # the point is randomly below the lower bounds or above the upper bound, depending + # on the offset value + if offset > 0.5: + out_of_bounds_value = (low_bounds[dim] - offset) + else: + out_of_bounds_value = (upper_bounds[dim] + offset) + point += (out_of_bounds_value,) + else: + # inside bounds + scaling = offset + # find a random value between boundaries + inside_bounds_value = scaling * (upper_bounds[dim] - low_bounds[dim]) + low_bounds[dim] + point += (inside_bounds_value,) + return point + + class TestNdInterpol: random.seed(5) linear_function = None @@ -64,20 +98,32 @@ def test_lookup_tables(self): # possible but is not used at this point def test_out_of_bounds(self): for num_dim in range(1, self.dim_amount): - data_table = self.generate_data_table(num_dimensions=num_dim, random_values=True, - dim_lengths=[2] * num_dim) + data_table = self.generate_data_table( + num_dimensions=num_dim, random_values=True, dim_lengths=[2] * num_dim) lower_bounds, upper_bounds = get_boundaries(data_table) for out_of_bounds_dim in range(1, num_dim+1): # copy table stuffed_table = [p for p in data_table] # get a point which has one or many input values out of the table boundaries - point = self.get_outer_point(data_table, dims_out_of_bound=out_of_bounds_dim) + point = get_outer_point(data_table, dims_out_of_bound=out_of_bounds_dim) for dim, v in enumerate(point): if lower_bounds[dim] < v < upper_bounds[dim]: + # if the value is inside of the boundaries, no stuffing at the borders has + # to take place. Therefore this dimension can be skipped continue + if v < lower_bounds[dim]: + # input value is below the lower boundary of the dimension + value_below_bounds = True + else: + # value is not below the lower boundary. With the previous skip condition + # this means the value is above the upper bounds of the dimension + value_below_bounds = False + + # Points which will extend the boundaries of the data_table, so that the given + # point with out of bound dimensions can be found in the stuffed table. stuffing = [] # go through all rows in the data_table for row in stuffed_table: @@ -86,34 +132,23 @@ def test_out_of_bounds(self): # copy boundary values to out of bound values. # if a row contains a boundary value which is broken by the input, the # value of this row is copied to a new row, where the boundary value - # changes to the input value - if (v < lower_bounds[dim] and mutated_row[dim] == lower_bounds[dim] or - v > upper_bounds[dim] and mutated_row[dim] == upper_bounds[dim]): + # changes to the input value. + # Eg The lower boundary of dimension 0 is '5'. The data_table has a row with + # the value '5' for dimension 0, but the input value is '4'. + # In this case the row in the data_table including the output value + # is copied, but the value for dimension 0 is changed to '4'. + # In the case where the input value exceeds the boundary of the dimension, + # only the rows of the data_table which have the upper boundary are copied. + lower_bound_broken = value_below_bounds and\ + mutated_row[dim] == lower_bounds[dim] + upper_bound_broken = (not value_below_bounds) and\ + mutated_row[dim] == upper_bounds[dim] + if lower_bound_broken or upper_bound_broken: mutated_row[dim] = v stuffing.append(mutated_row) stuffed_table.extend(stuffing) self.approx(nd_interp(point, data_table), nd_interp(point, stuffed_table)) - # select a random point in between each boundary of each dimensions - def get_outer_point(self, table, dims_out_of_bound=1): - idims = len(table[0]) - 1 - dims_out_of_bound = min(dims_out_of_bound, idims) - low_bounds, upper_bounds = get_boundaries(table) - - # define a point with the number of dims_out_of_bound values which are not inside - # the dimension values - point = () - for dim in range(0, idims): - offset = random.random() - # out of bounds - if dim < dims_out_of_bound: - point += ((low_bounds[dim] - offset) + (offset > 0.5) * - ((-low_bounds[dim] + offset) + (upper_bounds[dim] + offset)),) - else: - # inside bounds - point += (offset * (upper_bounds[dim] - low_bounds[dim]) + low_bounds[dim],) - return point - # test each point on the grid of an automatically and randomly generated data table. def test_grid_points(self): for i in range(1, DIM_AMOUNT): @@ -152,7 +187,7 @@ def test_singleton(self): def generate_data_table(self, num_dimensions: int, random_values=True, dim_lengths=None): dims = [] # generate dimensions with random values with random step size - for dim in range(0, num_dimensions): + for dim in range(num_dimensions): start = random.randint(-100, 100) if dim_lengths is not None: steps = dim_lengths[dim] @@ -194,9 +229,9 @@ def approx(self, value_a, value_b): # creates a full matrix, if given a list of lists with unique values per dimension def list_combinator(dimension_list): table = [(x,) for x in dimension_list[0]] - for i, l in enumerate(dimension_list[1:]): + for unique_values_single_dimension in dimension_list[1:]: new_table = [] - for v in l: + for v in unique_values_single_dimension: for ii, t in enumerate(table): new_table.append((*table[ii], v,)) table = new_table @@ -205,10 +240,10 @@ def list_combinator(dimension_list): # select a random point in between each boundary of each dimensions def get_random_inner_point(table): + # Number of input dimensions idims = len(table[0]) - 1 lower_bounds, upper_bounds = get_boundaries(table) - point = () + point = [] for dim in range(0, idims): - point += ( - random.random() * (upper_bounds[dim] - lower_bounds[dim]) + lower_bounds[dim],) + point.append(random.random() * (upper_bounds[dim] - lower_bounds[dim]) + lower_bounds[dim],) return point From 6006eeb37d8d96bb02439a836ea3f7c459985dab Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 10 Jan 2023 13:12:10 +0100 Subject: [PATCH 457/802] Add comments, make more readable --- tests/test_nd_interpolate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 3da52ad5..6ab7883f 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -156,7 +156,7 @@ def test_grid_points(self): for row in data_table: self.approx(nd_interp(row[:-1], data_table), row[-1]) - # test 10 randomly generated points in between the table bounds. Values are checked against + # test 10 randomly generated points in between the table bounds. Values are checked againstAdd # a linear function with a TOLERANCE of 0.0001 def test_random_points(self): for i in range(1, DIM_AMOUNT): From c08f9d25839de797348826537b3e5527d69558b3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 10 Jan 2023 13:40:26 +0100 Subject: [PATCH 458/802] Fix comment --- tests/test_nd_interpolate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 6ab7883f..3da52ad5 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -156,7 +156,7 @@ def test_grid_points(self): for row in data_table: self.approx(nd_interp(row[:-1], data_table), row[-1]) - # test 10 randomly generated points in between the table bounds. Values are checked againstAdd + # test 10 randomly generated points in between the table bounds. Values are checked against # a linear function with a TOLERANCE of 0.0001 def test_random_points(self): for i in range(1, DIM_AMOUNT): From dd27437786765c02655d142c99c0da12b200323b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 10 Jan 2023 15:43:38 +0100 Subject: [PATCH 459/802] Small changes! --- data/examples/optimizer.cfg | 4 ++-- ebus_toolbox/station_optimization.py | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 213ddee9..380710e1 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -43,7 +43,7 @@ run_only_neg=False pruning_threshold=0 # "greedy" or "deep" without "" -opt_type = greedy +opt_type = deep # "step-by-step" or "brute" without "" node_choice=step-by-step max_brute_loop=300 @@ -51,7 +51,7 @@ estimation_threshold = 0.90 # Preferring deps leads to a spice_ev simulation with preferred charging type depots # Afterwards all negative rotations are swapped to opportunity chargers and optimized -prefer_deps=True +# prefer_deps=True # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible # If they are deemed as impossible, they are not optimized but discarded diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index a8596b34..757c1a87 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -54,8 +54,13 @@ def main(): """ main call""" util.print_time() config_path = "./data/examples/optimizer.cfg" - run_optimization(config_path) + opt_sched, opt_scen= run_optimization(config_path) util.print_time() + import pickle + with open("schedule_opt.pickle", "wb") as f: + pickle.dump(opt_sched, f) + with open("scenario_opt.pickle", "wb") as f: + pickle.dump(opt_scen, f) def prepare_filesystem(this_args, conf): From 3de0c8d7f483be3573f13e9cc4e8ea5ba3b30385 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 11 Jan 2023 15:15:17 +0100 Subject: [PATCH 460/802] include different gc costs for different voltage levels --- data/examples/cost_params.json | 27 +++++-- data/examples/electrified_stations.json | 2 +- ebus_toolbox/costs.py | 95 ++++++++++++++++++------- 3 files changed, 90 insertions(+), 34 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 87d35ec6..6f26fab0 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -26,13 +26,28 @@ "cost_per_kWh": 250 }, "gc": { - "building_cost_subsidy_per_kW": 158.3, - "capex_gc_fix": 62500, - "capex_gc_per_meter": 562.5, - "default_distance": 50, + "LV_capex_gc_per_meter": 16.85, + "LV_capex_gc_per_kW": 24.14, + "LV_default_distance": 50, + "MV_building_cost_subsidy_per_kW": 158.3, + "MV_capex_gc_fix": 62500, + "MV_capex_gc_per_meter": 562.5, + "MV_default_distance": 50, + "MV_capex_transformer_fix": 80000, + "MV_capex_transformer_per_kW": 0, + "HV/MV_building_cost_subsidy_per_kW": 158.3, + "HV/MV_capex_gc_fix": 0, + "HV/MV_capex_gc_per_meter": 80, + "HV/MV_default_distance": 2000, + "HV/MV_capex_transformer_fix": 0, + "HV/MV_capex_transformer_per_kW": 63.49, + "HV_building_cost_subsidy_per_kW": 158.3, + "HV_capex_gc_fix": 0, + "HV_capex_gc_per_meter": 1300, + "HV_default_distance": 2000, + "HV_capex_transformer_fix": 2500000, + "HV_capex_transformer_per_kW": 0, "lifetime_gc": 50, - "capex_transformer_fix": 80000, - "capex_transformer_per_kW": 0, "c_maint_transformer_per_year": 0.02, "lifetime_transformer": 20 }, diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index a3ca2a4c..97d0a8a6 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -2,7 +2,7 @@ "Station-0": { "type": "deps", "n_charging_stations": null, - "distance_transformer": 150, + "distance_to_grid": 150, "energy_feed_in": { "csv_file": "data/examples/example_pv_feedin.csv", "start_time": "2022-03-07T00:00:00", diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 1116b0a2..9a4d4920 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -18,13 +18,13 @@ def calculate_costs(c_params, scenario, schedule, args): # initialize dictionary with all costs costs = {cost: 0 for cost in ["c_vehicles", "c_vehicles_annual", "c_gcs", "c_gcs_annual", - "c_cs", "c_cs_annual", "c_garage_cs", "c_garage_workstations", - "c_garage", "c_garage_annual", "c_invest", "c_invest_annual", - "c_maint_infrastructure_annual", "c_maint_vehicles_annual", - "c_maint_annual", "c_el_procurement_annual", - "c_el_power_price_annual", "c_el_energy_price_annual", - "c_el_taxes_annual", "c_el_feed_in_remuneration_annual", - "c_el_annual"]} + "c_maint_gc", "c_cs", "c_cs_annual", "c_garage_cs", + "c_garage_workstations", "c_garage", "c_garage_annual", + "c_invest", "c_invest_annual","c_maint_infrastructure_annual", + "c_maint_vehicles_annual","c_maint_annual", + "c_el_procurement_annual","c_el_power_price_annual", + "c_el_energy_price_annual","c_el_taxes_annual", + "c_el_feed_in_remuneration_annual","c_el_annual"]} # INVESTMENT COSTS # @@ -52,22 +52,64 @@ def calculate_costs(c_params, scenario, schedule, args): gcs = schedule.scenario["constants"]["grid_connectors"] for gcID in gcs.keys(): # get max. power of grid connector - gc = getattr(scenario, f"{gcID}_timeseries") - gc_max_power = -min(gc["grid power [kW]"]) - # get distance of transformer to gc - try: - distance_transformer = schedule.stations[gcID]["distance_transformer"] - except KeyError: - distance_transformer = c_params["gc"]["default_distance"] - c_gc = (c_params["gc"]["building_cost_subsidy_per_kW"] * gc_max_power + - c_params["gc"]["capex_gc_fix"] + - c_params["gc"]["capex_gc_per_meter"] * distance_transformer) - c_transformer = (c_params["gc"]["capex_transformer_fix"] + - c_params["gc"]["capex_transformer_per_kW"] * gc_max_power) - costs["c_gcs"] += c_gc + c_transformer - # calculate annual costs of grid connectors, depending the lifetime of gc and transformer - costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + - c_transformer / c_params["gc"]["lifetime_transformer"]) + gc_timeseries = getattr(scenario, f"{gcID}_timeseries") + gc_max_power = -min(gc_timeseries["grid power [kW]"]) + if schedule.stations[gcID]["voltage_level"] in ["LV", "MV/LV"]: + # get distance between grid and gc + distance_to_grid = schedule.stations[gcID].get( + "distance_to_grid", c_params["gc"]["LV_default_distance"]) + c_gc = (c_params["gc"]["LV_capex_gc_per_meter"] * distance_to_grid + + c_params["gc"]["LV_capex_gc_per_kW"] * gc_max_power) + costs["c_gcs"] += c_gc + # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"]) + # calculate maintenance cost of grid connectors + costs["c_maint_gc"] += 0 + elif schedule.stations[gcID]["voltage_level"] == "MV": + # get distance between grid and gc + distance_to_grid = schedule.stations[gcID].get( + "distance_to_grid", c_params["gc"]["MV_default_distance"]) + c_gc = (c_params["gc"]["MV_building_cost_subsidy_per_kW"] * gc_max_power + + c_params["gc"]["MV_capex_gc_fix"] + + c_params["gc"]["MV_capex_gc_per_meter"] * distance_to_grid) + c_transformer = (c_params["gc"]["MV_capex_transformer_fix"] + + c_params["gc"]["MV_capex_transformer_per_kW"] * gc_max_power) + costs["c_gcs"] += c_gc + c_transformer + # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + + c_transformer / c_params["gc"]["lifetime_transformer"]) + # calculate maintenance cost of grid connectors + costs["c_maint_gc"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + elif schedule.stations[gcID]["voltage_level"] == "HV/MV": + # get distance between grid and gc + distance_to_grid = schedule.stations[gcID].get( + "distance_to_grid", c_params["gc"]["HV/MV_default_distance"]) + c_gc = (c_params["gc"]["HV/MV_building_cost_subsidy_per_kW"] * gc_max_power + + c_params["gc"]["HV/MV_capex_gc_fix"] + + c_params["gc"]["HV/MV_capex_gc_per_meter"] * distance_to_grid) + c_transformer = (c_params["gc"]["HV/MV_capex_transformer_fix"] + + c_params["gc"]["HV/MV_capex_transformer_per_kW"] * gc_max_power) + costs["c_gcs"] += c_gc + c_transformer + # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + + c_transformer / c_params["gc"]["lifetime_transformer"]) + # calculate maintenance cost of grid connectors + costs["c_maint_gc"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + elif schedule.stations[gcID]["voltage_level"] == "HV": + # get distance between grid and gc + distance_to_grid = schedule.stations[gcID].get( + "distance_to_grid", c_params["gc"]["HV_default_distance"]) + c_gc = (c_params["gc"]["HV_building_cost_subsidy_per_kW"] * gc_max_power + + c_params["gc"]["HV_capex_gc_fix"] + + c_params["gc"]["HV_capex_gc_per_meter"] * distance_to_grid) + c_transformer = (c_params["gc"]["HV_capex_transformer_fix"] + + c_params["gc"]["HV_capex_transformer_per_kW"] * gc_max_power) + costs["c_gcs"] += c_gc + c_transformer + # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + + c_transformer / c_params["gc"]["lifetime_transformer"]) + # calculate maintenance cost of grid connectors + costs["c_maint_gc"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] # CHARGING INFRASTRUCTURE cs = schedule.scenario["constants"]["charging_stations"] @@ -79,9 +121,9 @@ def calculate_costs(c_params, scenario, schedule, args): for gcID, gc_keys in gcs.items(): if schedule.stations[gcID]["type"] == "opps": # get max. nr of occupied CS per grid connector - gc = getattr(scenario, f"{gcID}_timeseries") + gc_timeseries = getattr(scenario, f"{gcID}_timeseries") costs["c_cs"] += (c_params["cs"]["capex_opps_per_kW"] * vars(args)["cs_power_opps"] * - max(gc["# occupied CS"])) + max(gc_timeseries["# occupied CS"])) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] @@ -98,8 +140,7 @@ def calculate_costs(c_params, scenario, schedule, args): # MAINTENANCE costs["c_maint_infrastructure_annual"] = (costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] - + c_transformer * - c_params["gc"]["c_maint_transformer_per_year"]) + + costs["c_maint_gc"]) # calculate (ceil) number of days in scenario drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * schedule.scenario["scenario"]["interval"]) // (24 * 60)) From 5a861d55b59d41ea61519404e7f774da2d064808 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 11 Jan 2023 16:45:53 +0100 Subject: [PATCH 461/802] include costs for stationary storage --- data/examples/cost_params.json | 6 ++++++ ebus_toolbox/costs.py | 31 ++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 6f26fab0..011deac3 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -51,6 +51,12 @@ "c_maint_transformer_per_year": 0.02, "lifetime_transformer": 20 }, + "stationary_storage": { + "capex_fix": 1, + "capex_per_kWh": 1, + "c_maint_stat_storage_per_year": 0.02, + "lifetime_stat_storage": 20 + }, "cs":{ "capex_opps_per_kW": 877.5, "capex_deps_per_kW": 1000, diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 9a4d4920..984353c6 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -18,13 +18,15 @@ def calculate_costs(c_params, scenario, schedule, args): # initialize dictionary with all costs costs = {cost: 0 for cost in ["c_vehicles", "c_vehicles_annual", "c_gcs", "c_gcs_annual", - "c_maint_gc", "c_cs", "c_cs_annual", "c_garage_cs", + "c_maint_gc_annual", "c_cs", "c_cs_annual", "c_garage_cs", "c_garage_workstations", "c_garage", "c_garage_annual", "c_invest", "c_invest_annual","c_maint_infrastructure_annual", "c_maint_vehicles_annual","c_maint_annual", "c_el_procurement_annual","c_el_power_price_annual", "c_el_energy_price_annual","c_el_taxes_annual", - "c_el_feed_in_remuneration_annual","c_el_annual"]} + "c_el_feed_in_remuneration_annual","c_el_annual", + "c_stat_storage", "c_stat_storage_annual", + "c_maint_stat_storage_annual"]} # INVESTMENT COSTS # @@ -64,7 +66,7 @@ def calculate_costs(c_params, scenario, schedule, args): # calculate annual costs of grid connectors, depending the lifetime of gc and transformer costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"]) # calculate maintenance cost of grid connectors - costs["c_maint_gc"] += 0 + costs["c_maint_gc_annual"] += 0 elif schedule.stations[gcID]["voltage_level"] == "MV": # get distance between grid and gc distance_to_grid = schedule.stations[gcID].get( @@ -79,7 +81,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + c_transformer / c_params["gc"]["lifetime_transformer"]) # calculate maintenance cost of grid connectors - costs["c_maint_gc"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + costs["c_maint_gc_annual"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] elif schedule.stations[gcID]["voltage_level"] == "HV/MV": # get distance between grid and gc distance_to_grid = schedule.stations[gcID].get( @@ -94,7 +96,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + c_transformer / c_params["gc"]["lifetime_transformer"]) # calculate maintenance cost of grid connectors - costs["c_maint_gc"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + costs["c_maint_gc_annual"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] elif schedule.stations[gcID]["voltage_level"] == "HV": # get distance between grid and gc distance_to_grid = schedule.stations[gcID].get( @@ -109,7 +111,21 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + c_transformer / c_params["gc"]["lifetime_transformer"]) # calculate maintenance cost of grid connectors - costs["c_maint_gc"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + costs["c_maint_gc_annual"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + + # STATIONARY STORAGE + try: + costs["c_stat_storage"] += ( + c_params["stationary_storage"]["capex_fix"] + + schedule.stations[gcID]["battery"]["capacity"] * + c_params["stationary_storage"]["capex_per_kWh"]) + except KeyError: + costs["c_stat_storage"] += 0 + costs["c_stat_storage_annual"] = (costs["c_stat_storage"] + / c_params["stationary_storage"]["lifetime_stat_storage"]) + costs["c_maint_stat_storage_annual"] = ( + costs["c_stat_storage"] * + c_params["stationary_storage"]["c_maint_stat_storage_per_year"]) # CHARGING INFRASTRUCTURE cs = schedule.scenario["constants"]["charging_stations"] @@ -140,7 +156,8 @@ def calculate_costs(c_params, scenario, schedule, args): # MAINTENANCE costs["c_maint_infrastructure_annual"] = (costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] - + costs["c_maint_gc"]) + + costs["c_maint_gc_annual"] + + costs["c_maint_stat_storage_annual"]) # calculate (ceil) number of days in scenario drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * schedule.scenario["scenario"]["interval"]) // (24 * 60)) From 852b4fcd2451978c85a791e8ad35c6dc63ad0515 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 11 Jan 2023 17:22:19 +0100 Subject: [PATCH 462/802] Add dummy input file, add rotation filter option in cfg , add docstring for function file_wrapper_to_dict #30 --- data/examples/ebus_toolbox.cfg | 6 ++++++ data/examples/rotation_filter.csv | 3 +++ ebus_toolbox/util.py | 8 ++++++++ 3 files changed, 17 insertions(+) create mode 100644 data/examples/rotation_filter.csv diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 30e37229..e4e9c6c1 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -23,6 +23,9 @@ outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" +# Path to rotation filter +rotation_filter = "data/examples/rotation_filter.csv" + ##### COST CALCULATION ##### # set flag for cost calculation: @@ -56,6 +59,9 @@ ignore_inconsistent_rotations = false ##### SIMULATION CONDITIONS AND BOUNDARIES ##### +# rotation filter variable, options: exclude, include, false (deactivate function) +rotation_filter_variable = include + # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/data/examples/rotation_filter.csv b/data/examples/rotation_filter.csv new file mode 100644 index 00000000..11525898 --- /dev/null +++ b/data/examples/rotation_filter.csv @@ -0,0 +1,3 @@ +id,departure_time,arrival_time,departure_name,arrival_name,distance,vehicle_type,line,charging_type +1,2022-03-07T21:31:00,2022-03-08T04:06:00,Station-0,Station-0, 97869.3,AB,LINE_0:LINE_1,depb +2,2022-03-07T22:11:00,2022-03-08T04:12:00,Station-0,Station-0, 82030.56,AB,LINE_0:LINE_1,depb \ No newline at end of file diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 8e100091..739ad8d5 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -4,6 +4,14 @@ def file_wrapper_to_dict(f): + """Returns a dict representation of a file wrapper parameter + + :param f: Input Textwrapper from which the retur_dict gets created. + :type f: io.TextIOWrapper + + :return: Textwrapper content in a dict. + :rtype: dict + """ line = f.readline() header = line.split(",") return_dict = dict() From 308e62d532def5300eb3f84c05510be68869f5bf Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 11 Jan 2023 17:23:07 +0100 Subject: [PATCH 463/802] Move rotation filter implementation from simulate.py to schedule.py #30 --- ebus_toolbox/schedule.py | 30 ++++++++++++++++++++++++++++++ ebus_toolbox/simulate.py | 28 ---------------------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 3ca32b19..e67bfd57 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -102,6 +102,36 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) + # read filter rotation file + rotation_filter_variable = kwargs.get("rotation_filter_variable") + if rotation_filter_variable is not False: + rot_filt_file = kwargs.get("rotation_filter") + try: + with open(rot_filt_file, encoding='utf-8') as f: + # convert rotation file to dict + rotation_filter = util.file_wrapper_to_dict(f) + except FileNotFoundError: + print(f"Path to rotation filter ({rot_filt_file}) does not exist.") + + # filter out rotations in schedule + if rotation_filter_variable == "exclude": + for rotation in rotation_filter: + if rotation in schedule.rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + elif rotation_filter_variable == "include": + remove_rotations = list() + for rotation in schedule.rotations: + if rotation not in rotation_filter: + remove_rotations.append(rotation) + for rotation in remove_rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + # set charging type for all rotations without explicitly specified charging type # charging type may have been set above if a trip of a rotation has a specified # charging type diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 802fa816..19540f68 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,34 +62,6 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() - # read filter rotation file - if args.rotation_filter_variable: - try: - with open(args.rotation_filter, encoding='utf-8') as f: - # convert rotation file to dict - rotation_filter = util.file_wrapper_to_dict(f) - except FileNotFoundError: - print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") - - # filter out rotations in schedule - if args.rotation_filter_variable == "exclude": - for rotation in rotation_filter: - if rotation in schedule.rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") - elif args.rotation_filter_variable == "include": - remove_rotations = list() - for rotation in schedule.rotations: - if rotation not in rotation_filter: - remove_rotations.append(rotation) - for rotation in remove_rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") - # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] From 9a6431412f351e3a739cd40d30b220a611bfc53e Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 11 Jan 2023 18:11:52 +0100 Subject: [PATCH 464/802] make cs power adaptable per gc --- data/examples/ebus_toolbox.cfg | 3 ++- data/examples/electrified_stations.json | 9 ++++++--- ebus_toolbox/schedule.py | 12 ++++++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 8fd67c3d..1996545d 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -90,8 +90,9 @@ min_recharge_deps_depb = 1 gc_power_opps = 1000 gc_power_deps = 1000 -# max power of charging station at depot and opp stations +# default max power of charging station at depot and opp stations # at depot stations opp and depot busses have distinct charging stations (all default to: 150) +# individual cs_power per gc and cs type can be defined in electrified stations cs_power_opps = 400 cs_power_deps_depb = 100 cs_power_deps_oppb = 150 diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index a3ca2a4c..ef230411 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -26,7 +26,9 @@ "soc": 0, // initial state of charge [0-1], optional "efficiency": 0.95, // optional "discharge_curve": null // optional, same as charging curve - } + }, + "cs_power_deps_oppb" : 50, // optional: maximum cs power can be defined per station + "cs_power_deps_depb" : 120 // optional: maximum cs power can be defined per station }, "Station-3": { "type": "opps", @@ -45,8 +47,9 @@ "type": "opps", "n_charging_stations": 1, "voltage_level" : "MV", - "gc_power": 60 // optional: maximum gc power can be defined per station - }, + "gc_power": 250, // optional: maximum gc power can be defined per station + "cs_power_opps" : 140 // optional: maximum cs power can be defined per station + }, "Station-21": { "type": "opps", "n_charging_stations": 2, diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 1daa5e8e..7468086b 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -478,12 +478,16 @@ def generate_scenario(self, args): # create charging station and grid connector if necessary if cs_name not in charging_stations: if station_type == "deps": - cs_power = args.cs_power_deps_oppb \ - if trip.rotation.charging_type == 'oppb' \ - else args.cs_power_deps_depb + if trip.rotation.charging_type == 'oppb': + cs_power = station.get("cs_power_deps_oppb", + args.cs_power_deps_oppb) + else: + cs_power = station.get("cs_power_deps_depb", + args.cs_power_deps_depb) gc_power = station.get("gc_power", args.gc_power_deps) elif station_type == "opps": - cs_power = args.cs_power_opps + cs_power = station.get("cs_power_opps", + args.cs_power_opps) gc_power = station.get("gc_power", args.gc_power_opps) # add one charging station for each bus at bus station From 647e623b15e3cd0928833d8cec3c372af0fa8242 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 11 Jan 2023 23:51:08 +0100 Subject: [PATCH 465/802] Put implementation into a function, add commentary to rotation_filter_variable #30 --- data/examples/ebus_toolbox.cfg | 7 ++-- ebus_toolbox/schedule.py | 61 ++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index e4e9c6c1..bfec76eb 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -59,8 +59,11 @@ ignore_inconsistent_rotations = false ##### SIMULATION CONDITIONS AND BOUNDARIES ##### -# rotation filter variable, options: exclude, include, false (deactivate function) -rotation_filter_variable = include +# rotation filter variable, options: +# exclude: exclude the rotations in the file from the schedule +# include: include only the rotations in the file +# false: deactivate function +rotation_filter_variable = false # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index e67bfd57..291588fe 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -102,35 +102,8 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) - # read filter rotation file - rotation_filter_variable = kwargs.get("rotation_filter_variable") - if rotation_filter_variable is not False: - rot_filt_file = kwargs.get("rotation_filter") - try: - with open(rot_filt_file, encoding='utf-8') as f: - # convert rotation file to dict - rotation_filter = util.file_wrapper_to_dict(f) - except FileNotFoundError: - print(f"Path to rotation filter ({rot_filt_file}) does not exist.") - - # filter out rotations in schedule - if rotation_filter_variable == "exclude": - for rotation in rotation_filter: - if rotation in schedule.rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") - elif rotation_filter_variable == "include": - remove_rotations = list() - for rotation in schedule.rotations: - if rotation not in rotation_filter: - remove_rotations.append(rotation) - for rotation in remove_rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") + # read filter rotation file + cls.rotation_filter(cls, kwargs, schedule) # set charging type for all rotations without explicitly specified charging type # charging type may have been set above if a trip of a rotation has a specified @@ -403,6 +376,36 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) + def rotation_filter(self, args, schedule): + rotation_filter_variable = args["rotation_filter_variable"] + if rotation_filter_variable is not False: + rot_filt_file = args["rotation_filter"] + try: + with open(rot_filt_file, encoding='utf-8') as f: + # convert rotation file to dict + rotation_filter = util.file_wrapper_to_dict(f) + except FileNotFoundError: + print(f"Path to rotation filter ({rot_filt_file}) does not exist.") + + # filter out rotations in schedule + if rotation_filter_variable == "exclude": + for rotation in rotation_filter: + if rotation in schedule.rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + elif rotation_filter_variable == "include": + remove_rotations = list() + for rotation in schedule.rotations: + if rotation not in rotation_filter: + remove_rotations.append(rotation) + for rotation in remove_rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + def generate_scenario(self, args): """ Generate scenario.json for spiceEV From d514959e231627290621f5530b50f4aa6a7e0901 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Thu, 12 Jan 2023 00:01:05 +0100 Subject: [PATCH 466/802] Move function call of rotation_filter from schedule.py to simulate.py #30 --- ebus_toolbox/schedule.py | 9 +++------ ebus_toolbox/simulate.py | 3 +++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 291588fe..689d7af4 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -102,9 +102,6 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) - # read filter rotation file - cls.rotation_filter(cls, kwargs, schedule) - # set charging type for all rotations without explicitly specified charging type # charging type may have been set above if a trip of a rotation has a specified # charging type @@ -376,10 +373,10 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) - def rotation_filter(self, args, schedule): - rotation_filter_variable = args["rotation_filter_variable"] + def rotation_filter(self, schedule, args): + rotation_filter_variable = args.rotation_filter_variable if rotation_filter_variable is not False: - rot_filt_file = args["rotation_filter"] + rot_filt_file = args.rotation_filter try: with open(rot_filt_file, encoding='utf-8') as f: # convert rotation file to dict diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 19540f68..3bbeb62a 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,6 +62,9 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() + # filter rotations + schedule.rotation_filter(schedule, args) + # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] From 4120f594c12654d2376b0a68df638cbdbec9d29b Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 12 Dec 2022 23:12:16 +0100 Subject: [PATCH 467/802] Add exclude rotation filter functionality #30 --- ebus_toolbox/__main__.py | 3 +++ ebus_toolbox/simulate.py | 31 +++++++++++++++++++++++++++++++ ebus_toolbox/util.py | 10 ++++++++++ 3 files changed, 44 insertions(+) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 715840a2..e5bf8312 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -116,6 +116,9 @@ args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True + args.rotation_filter_variable = "" + args.rotation_filter = "" + util.set_options_from_config(args, check=True, verbose=False) args.output_directory = Path(args.output_directory) / ( diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 5cd25b09..5fa3e7c4 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,6 +62,37 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() + + # read filter rotation file + if args.rotation_filter_variable: + try: + with open(args.rotation_filter, encoding='utf-8') as f: + # TODO: file zu dict umwandeln + rotation_filter = util.file_wrapper_to_dict(f) + print(rotation_filter) + except FileNotFoundError: + print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") + + # TODO: filter rotations + if args.rotation_filter_variable == "exclude_rotation": + excluding_rotations = rotation_filter + for rotation in rotation_filter: + if rotation in rotation_filter: + try: + schedule.rotations.pop(rotation['rotation_id']) + except KeyError: + print(f"Key of rotation {rotation['rotation_id']} does not exist in schedule.") + elif args.rotation_filter_variable == "include_rotation": + included_rotations = rotation_filter + staying_rotations = dict() + for rot_filter in rotation_filter: + for rot_schedule in schedule.rotations: + if rot_filter == rot_schedule: + staying_rotations.update(rot_schedule) + + + + # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 7771ab9e..e6748a8e 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -3,6 +3,16 @@ import subprocess +def file_wrapper_to_dict(f): + line = f.readline() + header = line.split(",") + return_dict = {} + line = f.readline().split(",") + for key, value in zip(header, line): + return_dict[key] = value + return [return_dict] + + def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() From 34cca118897f460567e35b9c4742519a91ed7cf2 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 12 Dec 2022 23:14:52 +0100 Subject: [PATCH 468/802] Correct flake8 warnings #30 --- ebus_toolbox/simulate.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 5fa3e7c4..f9280a76 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,7 +62,6 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() - # read filter rotation file if args.rotation_filter_variable: try: @@ -75,24 +74,20 @@ def simulate(args): # TODO: filter rotations if args.rotation_filter_variable == "exclude_rotation": - excluding_rotations = rotation_filter for rotation in rotation_filter: if rotation in rotation_filter: try: schedule.rotations.pop(rotation['rotation_id']) except KeyError: - print(f"Key of rotation {rotation['rotation_id']} does not exist in schedule.") + print(f"Key of rotation {rotation['rotation_id']} " + f"does not exist in schedule.") elif args.rotation_filter_variable == "include_rotation": - included_rotations = rotation_filter staying_rotations = dict() for rot_filter in rotation_filter: for rot_schedule in schedule.rotations: if rot_filter == rot_schedule: staying_rotations.update(rot_schedule) - - - # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] From 02fd60c4d971260390659318f3398ba269fb9533 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 2 Jan 2023 12:03:51 +0100 Subject: [PATCH 469/802] Improve file_wrapper_to_dict function #30 --- ebus_toolbox/util.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index e6748a8e..8e100091 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -6,11 +6,18 @@ def file_wrapper_to_dict(f): line = f.readline() header = line.split(",") - return_dict = {} - line = f.readline().split(",") - for key, value in zip(header, line): - return_dict[key] = value - return [return_dict] + return_dict = dict() + + while line != "": + tmp_rotation = dict() + line = f.readline().split(",") + if line == [""]: + break + for key, value in zip(header, line): + tmp_rotation[key] = value + return_dict[tmp_rotation['id']] = tmp_rotation + + return return_dict def get_git_revision_hash() -> str: From c4821927f26cdd1873145fd311d57472c99d3925 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 2 Jan 2023 12:05:49 +0100 Subject: [PATCH 470/802] update include, exclude rotation filtering #30 --- ebus_toolbox/simulate.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f9280a76..f5872a90 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -66,22 +66,21 @@ def simulate(args): if args.rotation_filter_variable: try: with open(args.rotation_filter, encoding='utf-8') as f: - # TODO: file zu dict umwandeln + # convert rotation file to dict rotation_filter = util.file_wrapper_to_dict(f) - print(rotation_filter) except FileNotFoundError: print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") - # TODO: filter rotations - if args.rotation_filter_variable == "exclude_rotation": + # filter out rotations in schedule + if args.rotation_filter_variable == "exclude": for rotation in rotation_filter: - if rotation in rotation_filter: + if rotation in schedule.rotations: try: - schedule.rotations.pop(rotation['rotation_id']) + schedule.rotations.pop(rotation) except KeyError: - print(f"Key of rotation {rotation['rotation_id']} " + print(f"Key of rotation {rotation['id']} " f"does not exist in schedule.") - elif args.rotation_filter_variable == "include_rotation": + elif args.rotation_filter_variable == "include": staying_rotations = dict() for rot_filter in rotation_filter: for rot_schedule in schedule.rotations: From 876566755edc2d84a07ac12e78a0a0722eac98ce Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 2 Jan 2023 17:35:30 +0100 Subject: [PATCH 471/802] update include rotation filtering #30 --- ebus_toolbox/simulate.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f5872a90..e62979da 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -78,14 +78,17 @@ def simulate(args): try: schedule.rotations.pop(rotation) except KeyError: - print(f"Key of rotation {rotation['id']} " - f"does not exist in schedule.") + print(f"Rotation {rotation['id']} does not exist in schedule.") elif args.rotation_filter_variable == "include": - staying_rotations = dict() - for rot_filter in rotation_filter: - for rot_schedule in schedule.rotations: - if rot_filter == rot_schedule: - staying_rotations.update(rot_schedule) + remove_rotations = list() + for rotation in schedule.rotations: + if rotation not in rotation_filter: + remove_rotations.append(rotation) + for rotation in remove_rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") # run the mode specified in config if args.mode == 'service_optimization': From 4641cdee1a63db4cefd22a5a6326e59c66cce174 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 11 Jan 2023 17:22:19 +0100 Subject: [PATCH 472/802] Add dummy input file, add rotation filter option in cfg , add docstring for function file_wrapper_to_dict #30 --- data/examples/ebus_toolbox.cfg | 6 ++++++ data/examples/rotation_filter.csv | 3 +++ ebus_toolbox/util.py | 8 ++++++++ 3 files changed, 17 insertions(+) create mode 100644 data/examples/rotation_filter.csv diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 8fd67c3d..e8b44c42 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -23,6 +23,9 @@ outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" +# Path to rotation filter +rotation_filter = "data/examples/rotation_filter.csv" + ##### COST CALCULATION ##### # set flag for cost calculation: @@ -55,6 +58,9 @@ ignore_inconsistent_rotations = false ##### SIMULATION CONDITIONS AND BOUNDARIES ##### +# rotation filter variable, options: exclude, include, false (deactivate function) +rotation_filter_variable = include + # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/data/examples/rotation_filter.csv b/data/examples/rotation_filter.csv new file mode 100644 index 00000000..11525898 --- /dev/null +++ b/data/examples/rotation_filter.csv @@ -0,0 +1,3 @@ +id,departure_time,arrival_time,departure_name,arrival_name,distance,vehicle_type,line,charging_type +1,2022-03-07T21:31:00,2022-03-08T04:06:00,Station-0,Station-0, 97869.3,AB,LINE_0:LINE_1,depb +2,2022-03-07T22:11:00,2022-03-08T04:12:00,Station-0,Station-0, 82030.56,AB,LINE_0:LINE_1,depb \ No newline at end of file diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 8e100091..739ad8d5 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -4,6 +4,14 @@ def file_wrapper_to_dict(f): + """Returns a dict representation of a file wrapper parameter + + :param f: Input Textwrapper from which the retur_dict gets created. + :type f: io.TextIOWrapper + + :return: Textwrapper content in a dict. + :rtype: dict + """ line = f.readline() header = line.split(",") return_dict = dict() From 5c678bc0afda911d7e9aa77b24e1b437285641b2 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 11 Jan 2023 17:23:07 +0100 Subject: [PATCH 473/802] Move rotation filter implementation from simulate.py to schedule.py #30 --- ebus_toolbox/schedule.py | 30 ++++++++++++++++++++++++++++++ ebus_toolbox/simulate.py | 28 ---------------------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index eab2130e..f96f86dd 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -102,6 +102,36 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) + # read filter rotation file + rotation_filter_variable = kwargs.get("rotation_filter_variable") + if rotation_filter_variable is not False: + rot_filt_file = kwargs.get("rotation_filter") + try: + with open(rot_filt_file, encoding='utf-8') as f: + # convert rotation file to dict + rotation_filter = util.file_wrapper_to_dict(f) + except FileNotFoundError: + print(f"Path to rotation filter ({rot_filt_file}) does not exist.") + + # filter out rotations in schedule + if rotation_filter_variable == "exclude": + for rotation in rotation_filter: + if rotation in schedule.rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + elif rotation_filter_variable == "include": + remove_rotations = list() + for rotation in schedule.rotations: + if rotation not in rotation_filter: + remove_rotations.append(rotation) + for rotation in remove_rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + # set charging type for all rotations without explicitly specified charging type # charging type may have been set above if a trip of a rotation has a specified # charging type diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e62979da..5cd25b09 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,34 +62,6 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() - # read filter rotation file - if args.rotation_filter_variable: - try: - with open(args.rotation_filter, encoding='utf-8') as f: - # convert rotation file to dict - rotation_filter = util.file_wrapper_to_dict(f) - except FileNotFoundError: - print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") - - # filter out rotations in schedule - if args.rotation_filter_variable == "exclude": - for rotation in rotation_filter: - if rotation in schedule.rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") - elif args.rotation_filter_variable == "include": - remove_rotations = list() - for rotation in schedule.rotations: - if rotation not in rotation_filter: - remove_rotations.append(rotation) - for rotation in remove_rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") - # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] From 7e0fc11713e200cc4ebb409763ad9b5aa81b9606 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Wed, 11 Jan 2023 23:51:08 +0100 Subject: [PATCH 474/802] Put implementation into a function, add commentary to rotation_filter_variable #30 --- data/examples/ebus_toolbox.cfg | 7 ++-- ebus_toolbox/schedule.py | 61 ++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index e8b44c42..6e5fd3f4 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -58,8 +58,11 @@ ignore_inconsistent_rotations = false ##### SIMULATION CONDITIONS AND BOUNDARIES ##### -# rotation filter variable, options: exclude, include, false (deactivate function) -rotation_filter_variable = include +# rotation filter variable, options: +# exclude: exclude the rotations in the file from the schedule +# include: include only the rotations in the file +# false: deactivate function +rotation_filter_variable = false # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index f96f86dd..5909cdb4 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -102,35 +102,8 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) - # read filter rotation file - rotation_filter_variable = kwargs.get("rotation_filter_variable") - if rotation_filter_variable is not False: - rot_filt_file = kwargs.get("rotation_filter") - try: - with open(rot_filt_file, encoding='utf-8') as f: - # convert rotation file to dict - rotation_filter = util.file_wrapper_to_dict(f) - except FileNotFoundError: - print(f"Path to rotation filter ({rot_filt_file}) does not exist.") - - # filter out rotations in schedule - if rotation_filter_variable == "exclude": - for rotation in rotation_filter: - if rotation in schedule.rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") - elif rotation_filter_variable == "include": - remove_rotations = list() - for rotation in schedule.rotations: - if rotation not in rotation_filter: - remove_rotations.append(rotation) - for rotation in remove_rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") + # read filter rotation file + cls.rotation_filter(cls, kwargs, schedule) # set charging type for all rotations without explicitly specified charging type # charging type may have been set above if a trip of a rotation has a specified @@ -403,6 +376,36 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) + def rotation_filter(self, args, schedule): + rotation_filter_variable = args["rotation_filter_variable"] + if rotation_filter_variable is not False: + rot_filt_file = args["rotation_filter"] + try: + with open(rot_filt_file, encoding='utf-8') as f: + # convert rotation file to dict + rotation_filter = util.file_wrapper_to_dict(f) + except FileNotFoundError: + print(f"Path to rotation filter ({rot_filt_file}) does not exist.") + + # filter out rotations in schedule + if rotation_filter_variable == "exclude": + for rotation in rotation_filter: + if rotation in schedule.rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + elif rotation_filter_variable == "include": + remove_rotations = list() + for rotation in schedule.rotations: + if rotation not in rotation_filter: + remove_rotations.append(rotation) + for rotation in remove_rotations: + try: + schedule.rotations.pop(rotation) + except KeyError: + print(f"Rotation {rotation['id']} does not exist in schedule.") + def generate_scenario(self, args): """ Generate scenario.json for spiceEV From d90160d7ca5375247b38f8aee225289ab09b1e45 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Thu, 12 Jan 2023 00:01:05 +0100 Subject: [PATCH 475/802] Move function call of rotation_filter from schedule.py to simulate.py #30 --- ebus_toolbox/schedule.py | 9 +++------ ebus_toolbox/simulate.py | 3 +++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5909cdb4..b851812c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -102,9 +102,6 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): schedule=schedule)}) schedule.rotations[rotation_id].add_trip(trip) - # read filter rotation file - cls.rotation_filter(cls, kwargs, schedule) - # set charging type for all rotations without explicitly specified charging type # charging type may have been set above if a trip of a rotation has a specified # charging type @@ -376,10 +373,10 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) - def rotation_filter(self, args, schedule): - rotation_filter_variable = args["rotation_filter_variable"] + def rotation_filter(self, schedule, args): + rotation_filter_variable = args.rotation_filter_variable if rotation_filter_variable is not False: - rot_filt_file = args["rotation_filter"] + rot_filt_file = args.rotation_filter try: with open(rot_filt_file, encoding='utf-8') as f: # convert rotation file to dict diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 5cd25b09..2d7f6165 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -62,6 +62,9 @@ def simulate(args): **vars(args)) schedule.calculate_consumption() + # filter rotations + schedule.rotation_filter(schedule, args) + # run the mode specified in config if args.mode == 'service_optimization': schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] From 872fda8466792e9df6bb897cabdba72edf21d305 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Thu, 12 Jan 2023 00:12:10 +0100 Subject: [PATCH 476/802] Add docstring to schedule.py #30 --- ebus_toolbox/schedule.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index b851812c..eb9e5b4f 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -374,6 +374,14 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) def rotation_filter(self, schedule, args): + """The method edits the schedule.rotations accordingly + to the set rotation_filter_variable in args. + + :param schedule: Schedule with property rotations which get filtered. + :type schedule: ebus_toolbox.Schedule + :param args: Command line arguments. + :type args: argparse.Namespace + """ rotation_filter_variable = args.rotation_filter_variable if rotation_filter_variable is not False: rot_filt_file = args.rotation_filter From 464a6fb7220c993886129b45edb4f9ae351cfbb9 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 12 Jan 2023 13:17:03 +0100 Subject: [PATCH 477/802] cost/report: use 'CS in use' instead of # occ. CS --- ebus_toolbox/costs.py | 2 +- ebus_toolbox/report.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 1116b0a2..decf518a 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -81,7 +81,7 @@ def calculate_costs(c_params, scenario, schedule, args): # get max. nr of occupied CS per grid connector gc = getattr(scenario, f"{gcID}_timeseries") costs["c_cs"] += (c_params["cs"]["capex_opps_per_kW"] * vars(args)["cs_power_opps"] * - max(gc["# occupied CS"])) + max(gc["CS in use"])) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 7e176d22..f5f33419 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -64,15 +64,15 @@ def generate_gc_overview(schedule, scenario, args): if gc in used_gc_list: ts = getattr(scenario, f"{gc}_timeseries") max_gc_power = -min(ts["grid power [kW]"]) - max_nr_cs = max(ts["# occupied CS"]) + max_nr_cs = max(ts["CS in use"]) sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 # use factors: to which percentage of time are the three least used CS in use - num_ts = len(ts["# occupied CS"]) # number of timesteps + num_ts = scenario.n_intervals # number of timesteps # three least used CS. Less if number of CS is lower. least_used_num = min(3, max_nr_cs) # count number of timesteps with this exact number of occupied CS - count_nr_cs = [ts["# occupied CS"].count(max_nr_cs - i) for i in range( + count_nr_cs = [ts["CS in use"].count(max_nr_cs - i) for i in range( least_used_num)] use_factors = [sum(count_nr_cs[:i + 1]) / num_ts for i in range( least_used_num)] # relative occupancy with at least this number of occupied CS From 827d570a8046cd7ced0866fda61c7cd8768f634a Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 13 Jan 2023 13:32:25 +0100 Subject: [PATCH 478/802] make flake8 happy --- ebus_toolbox/costs.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 984353c6..690d4592 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -20,11 +20,11 @@ def calculate_costs(c_params, scenario, schedule, args): costs = {cost: 0 for cost in ["c_vehicles", "c_vehicles_annual", "c_gcs", "c_gcs_annual", "c_maint_gc_annual", "c_cs", "c_cs_annual", "c_garage_cs", "c_garage_workstations", "c_garage", "c_garage_annual", - "c_invest", "c_invest_annual","c_maint_infrastructure_annual", - "c_maint_vehicles_annual","c_maint_annual", - "c_el_procurement_annual","c_el_power_price_annual", - "c_el_energy_price_annual","c_el_taxes_annual", - "c_el_feed_in_remuneration_annual","c_el_annual", + "c_invest", "c_invest_annual", "c_maint_infrastructure_annual", + "c_maint_vehicles_annual", "c_maint_annual", + "c_el_procurement_annual", "c_el_power_price_annual", + "c_el_energy_price_annual", "c_el_taxes_annual", + "c_el_feed_in_remuneration_annual", "c_el_annual", "c_stat_storage", "c_stat_storage_annual", "c_maint_stat_storage_annual"]} @@ -63,7 +63,7 @@ def calculate_costs(c_params, scenario, schedule, args): c_gc = (c_params["gc"]["LV_capex_gc_per_meter"] * distance_to_grid + c_params["gc"]["LV_capex_gc_per_kW"] * gc_max_power) costs["c_gcs"] += c_gc - # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + # calculate annual costs of grid connectors, depending on lifetime of gc and transformer costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"]) # calculate maintenance cost of grid connectors costs["c_maint_gc_annual"] += 0 @@ -77,11 +77,12 @@ def calculate_costs(c_params, scenario, schedule, args): c_transformer = (c_params["gc"]["MV_capex_transformer_fix"] + c_params["gc"]["MV_capex_transformer_per_kW"] * gc_max_power) costs["c_gcs"] += c_gc + c_transformer - # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + # calculate annual costs of grid connectors, depending on lifetime of gc and transformer costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + c_transformer / c_params["gc"]["lifetime_transformer"]) # calculate maintenance cost of grid connectors - costs["c_maint_gc_annual"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + costs["c_maint_gc_annual"] += (c_transformer * + c_params["gc"]["c_maint_transformer_per_year"]) elif schedule.stations[gcID]["voltage_level"] == "HV/MV": # get distance between grid and gc distance_to_grid = schedule.stations[gcID].get( @@ -92,11 +93,12 @@ def calculate_costs(c_params, scenario, schedule, args): c_transformer = (c_params["gc"]["HV/MV_capex_transformer_fix"] + c_params["gc"]["HV/MV_capex_transformer_per_kW"] * gc_max_power) costs["c_gcs"] += c_gc + c_transformer - # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + # calculate annual costs of grid connectors, depending on lifetime of gc and transformer costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + c_transformer / c_params["gc"]["lifetime_transformer"]) # calculate maintenance cost of grid connectors - costs["c_maint_gc_annual"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + costs["c_maint_gc_annual"] += (c_transformer * + c_params["gc"]["c_maint_transformer_per_year"]) elif schedule.stations[gcID]["voltage_level"] == "HV": # get distance between grid and gc distance_to_grid = schedule.stations[gcID].get( @@ -107,11 +109,12 @@ def calculate_costs(c_params, scenario, schedule, args): c_transformer = (c_params["gc"]["HV_capex_transformer_fix"] + c_params["gc"]["HV_capex_transformer_per_kW"] * gc_max_power) costs["c_gcs"] += c_gc + c_transformer - # calculate annual costs of grid connectors, depending the lifetime of gc and transformer + # calculate annual costs of grid connectors, depending on lifetime of gc and transformer costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + c_transformer / c_params["gc"]["lifetime_transformer"]) # calculate maintenance cost of grid connectors - costs["c_maint_gc_annual"] += c_transformer * c_params["gc"]["c_maint_transformer_per_year"] + costs["c_maint_gc_annual"] += (c_transformer * + c_params["gc"]["c_maint_transformer_per_year"]) # STATIONARY STORAGE try: From d60a542e758c94bbcea779c1670118dff73f2f0e Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 13 Jan 2023 20:09:53 +0100 Subject: [PATCH 479/802] Only rotation_id in rotation_filter.csv, remove file_wrapper_to_dict function #30 --- data/examples/rotation_filter.csv | 6 +++--- ebus_toolbox/util.py | 25 ------------------------- 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/data/examples/rotation_filter.csv b/data/examples/rotation_filter.csv index 11525898..05d26c7f 100644 --- a/data/examples/rotation_filter.csv +++ b/data/examples/rotation_filter.csv @@ -1,3 +1,3 @@ -id,departure_time,arrival_time,departure_name,arrival_name,distance,vehicle_type,line,charging_type -1,2022-03-07T21:31:00,2022-03-08T04:06:00,Station-0,Station-0, 97869.3,AB,LINE_0:LINE_1,depb -2,2022-03-07T22:11:00,2022-03-08T04:12:00,Station-0,Station-0, 82030.56,AB,LINE_0:LINE_1,depb \ No newline at end of file +rotation_id +1 +2 \ No newline at end of file diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 739ad8d5..7771ab9e 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -3,31 +3,6 @@ import subprocess -def file_wrapper_to_dict(f): - """Returns a dict representation of a file wrapper parameter - - :param f: Input Textwrapper from which the retur_dict gets created. - :type f: io.TextIOWrapper - - :return: Textwrapper content in a dict. - :rtype: dict - """ - line = f.readline() - header = line.split(",") - return_dict = dict() - - while line != "": - tmp_rotation = dict() - line = f.readline().split(",") - if line == [""]: - break - for key, value in zip(header, line): - tmp_rotation[key] = value - return_dict[tmp_rotation['id']] = tmp_rotation - - return return_dict - - def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() From 97010d431a81d8870fb4647ab839e2034b284813 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 13 Jan 2023 20:11:25 +0100 Subject: [PATCH 480/802] Add optional rf_list argument, use rf_list instead of rotation_filter #30 --- ebus_toolbox/schedule.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index eb9e5b4f..aa503587 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -373,7 +373,7 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) - def rotation_filter(self, schedule, args): + def rotation_filter(self, schedule, args, rf_list=None): """The method edits the schedule.rotations accordingly to the set rotation_filter_variable in args. @@ -381,29 +381,39 @@ def rotation_filter(self, schedule, args): :type schedule: ebus_toolbox.Schedule :param args: Command line arguments. :type args: argparse.Namespace + :param rf_list: rotation filter list with strings of rotation ids + :type rf_list: list, optional """ - rotation_filter_variable = args.rotation_filter_variable - if rotation_filter_variable is not False: - rot_filt_file = args.rotation_filter + if rf_list is None: + rf_list = [] + + rf_variable = args.rotation_filter_variable + if rf_variable is not False: + rf_file = args.rotation_filter try: - with open(rot_filt_file, encoding='utf-8') as f: - # convert rotation file to dict - rotation_filter = util.file_wrapper_to_dict(f) + with open(rf_file, encoding='utf-8') as f: + # put rotation_ids from file into rf_list + line = f.readline().strip() + if line == "rotation_id": + line = f.readline().strip() + while line != "": + rf_list.append(line) + line = f.readline().strip() except FileNotFoundError: - print(f"Path to rotation filter ({rot_filt_file}) does not exist.") + print(f"Path to rotation filter ({rf_file}) does not exist.") # filter out rotations in schedule - if rotation_filter_variable == "exclude": - for rotation in rotation_filter: + if rf_variable == "exclude": + for rotation in rf_list: if rotation in schedule.rotations: try: schedule.rotations.pop(rotation) except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") - elif rotation_filter_variable == "include": - remove_rotations = list() + print(f"Rotation '{rotation}' does not exist in schedule.") + elif rf_variable == "include": + remove_rotations = [] for rotation in schedule.rotations: - if rotation not in rotation_filter: + if rotation not in rf_list: remove_rotations.append(rotation) for rotation in remove_rotations: try: From cd0ad97ec77a602a57e487c6c753d8da39b695d3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 17 Jan 2023 10:26:25 +0100 Subject: [PATCH 481/802] Minor Changes --- data/examples/optimizer.cfg | 2 +- ebus_toolbox/optimizer_util.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 380710e1..8ba8904e 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -4,7 +4,7 @@ debug_level=1 [SCENARIO] # Use "" for ids and not '' -exclusion_rots = [] +exclusion_rots = ["6003_6", "7003_7"] exclusion_stations= [] # If using inclusion stations, scenario should be rebased inclusion_stations= [] diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 3ff685cc..083a0a74 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -274,7 +274,8 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: 'StationOptim if time_delta == 0: return 0 soc = max(min(optimizer.args.desired_soc_opps, soc), 0) - first_time, start_soc = soc_over_time_curve[soc_over_time_curve[:, 1] >= soc][0, :] + idx = np.searchsorted(soc_over_time_curve[:, 1], soc, side='left') + first_time, start_soc = soc_over_time_curve[idx, :] second_time = first_time + time_delta # catch out of bounds if time of charging end is bigger than table values @@ -481,6 +482,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, charge_time = 0 socs = [] times = [] + final_value=args.desired_soc_opps while soc < args.desired_soc_opps: times.append(charge_time) socs.append(soc) @@ -490,11 +492,15 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), max_charge_from_grid / capacity) power = (power1 + power2) / 2 * efficiency - soc += time_step / 60 * power + delta_soc = time_step / 60 * power + soc += delta_soc charge_time += time_step + if args.desired_soc_opps-soc < 0.0001 and delta_soc < 1e-10: + final_value = soc + break # fill the soc completely in last time step times.append(charge_time) - socs.append(args.desired_soc_opps) + socs.append(final_value) return np.array((times, socs)).T From c9c5fcf73aaf0cc11c6116b78020d7ef2573698b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 17 Jan 2023 10:27:36 +0100 Subject: [PATCH 482/802] Make flake8 happy --- ebus_toolbox/optimizer_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 083a0a74..b0cf2a83 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -482,7 +482,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, charge_time = 0 socs = [] times = [] - final_value=args.desired_soc_opps + final_value = args.desired_soc_opps while soc < args.desired_soc_opps: times.append(charge_time) socs.append(soc) From cc8fe19260507034945f282b9cc75d98e8afd3a4 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 18 Jan 2023 11:32:14 +0100 Subject: [PATCH 483/802] First basic running version of geoplotting --- ebus_toolbox/plot_geoposition.py | 317 +++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 ebus_toolbox/plot_geoposition.py diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py new file mode 100644 index 00000000..7124d34d --- /dev/null +++ b/ebus_toolbox/plot_geoposition.py @@ -0,0 +1,317 @@ +""" Module to implement plotting functionality of busses with georeferences""" +import datetime + +import ebus_toolbox.util as util +import pickle +import csv +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + import ebus_toolbox.trip + import ebus_toolbox.schedule + import spiceev.scenario + +import requests +import json +from time import sleep +import io + +import matplotlib.pyplot as plt +import pandas as pd +from matplotlib.colors import LinearSegmentedColormap +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd + +import math + +# Mathematical function we need to plot +from matplotlib.colors import LinearSegmentedColormap +import matplotlib +import matplotlib.animation as animation +matplotlib.use("TkAgg") +import os +shared_axis=None +FIGSIZE=(14,5) +LINEWIDTH=2 +DELIMITER = ';' +FRAMEALPHA=0.8 +ALPHA_POINTS=0.1 + + +### +rli_dblue =(0, 46 / 255, 80 / 255) +rli_green=(68 / 255, 175 / 255, 105 / 255) +rli_orange=(254 / 255, 127 / 255, 45 / 255) +rli_yellow=(241 / 255, 196 / 255, 15 / 255) +rli_lblue=(34/ 255, 116 / 255, 165 / 255) +rli_dgrey=(51 / 255, 88 / 255, 115 / 255) +### Not from official coperate design +rli_red =(192/255,0,0) +rli_green2 =(0, 176/255,80/255) +rli_brown = (132 / 255, 60 / 255, 12 / 255) +rli_black=(0,0,0) +rli_colors = [rli_dblue, rli_green, rli_orange, rli_yellow,rli_lblue, rli_dgrey,rli_black,rli_red, rli_brown,rli_green2] +### + +cdict = {'red': [[0.0, 0, 0], + [0.2, 34/255, 34/255], + [0.4, 68/255, 68/255], + [0.6, 254/255, 254/255], + [0.8, 241/255, 241/255], + [1.0, 255/255, 255/255]], + 'green': [[0.0, 46/255, 46/255], + [0.2, 116/255, 116/255], + [0.4, 175/255, 175/255], + [0.6, 127/255, 127/255], + [0.8, 196/255, 196/255], + [1.0, 255/255, 255/255]], + 'blue': [[0.0, 80/255, 80/255], + [0.2, 165/255, 165/255], + [0.4, 105/255, 105/255], + [0.6, 45/255, 45/255], + [0.8, 15/255, 15/255], + [1.0, 255/255, 255/255]]} +rli_rainbow_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) + +cdict = {'red': [[0.0, 0, 0], + [0.33, 0, 0], + [0.66, 34/255, 34/255], + [1, 255/255, 255/255]], + 'green': [[0.0, 0, 0], + [0.33, 46/255, 46/255], + [0.66, 116/255, 116/255], + [1, 255/255, 255/255]], + 'blue': [[0.0, 0, 0], + [0.33, 80/255, 80/255], + [0.66, 165/255, 165/255], + [1, 255/255, 45/255]]} +rli_blue_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) + +with open("schedule_opt.pickle", "rb") as file: + schedule = pickle.load(file) + +with open("scenario_opt.pickle", "rb") as file: + scenario = pickle.load(file) + +with open("args_buffered_all_depb.pickle", "rb") as file: + args = pickle.load(file) + +args.station_data_path= "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/data/buffered_all_stations.csv" + +class station: + def __init__(self, name, lat, lon, elevation): + self.name = name + self.lat = lat + self.lon = lon + self.elevation = elevation + + def get_lat_lon(self, next_station, rel_pos): + lat_pos= (next_station.lat-self.lat)*rel_pos+self.lat + lon_pos = (next_station.lon - self.lon) * rel_pos + self.lon + return lat_pos, lon_pos + + +with open(str(args.station_data_path), "r", encoding='utf-8') as f: + delim = util.get_csv_delim(args.station_data_path) + reader = csv.DictReader(f, delimiter=delim) + stations = dict() + for row in reader: + elevation = float(row['elevation']) + name = str(row['Endhaltestelle']) + lon = float(row['lon']) + lat = float(row['lat']) + stations[name]=station(name, lat, lon, elevation) + +def get_sorted_rotations(v_id, schedule): + rots=[] + for rot in schedule.rotations.values(): + if rot.vehicle_id==v_id: + rots.append(rot) + return sorted(rots, key= lambda x: x.departure_time) + + +def plot_merge_animate_battery(data: pd.DataFrame, z_ax=None, + save=False, repeat=True, vehicle_black=False, track_black=True): + v_max=1 + v_min=0 + fig = plt.figure(figsize=(14, 8)) + + fig.suptitle('Vehicle Tracking', fontsize=14) + + sub2 = fig.add_subplot(111) + ax = plt.gca() + data.xs("lat", level="Data", axis=1) + lat_boundary = (data.xs("lat", level="Data", axis=1).min().min(),data.xs("lat", level="Data", axis=1).max().max()) + lon_boundary = (data.xs("lon", level="Data", axis=1).min().min(),data.xs("lon", level="Data", axis=1).max().max()) + + # Get all the vehicle ids from data + vehicles = list(data.columns.levels[0]) + data_rounded = data.copy() + + round_decimals = 3 #4 decimals approx 110m in germany + all_lats=[] + all_lons=[] + # for v_id in vehicles: + # data_rounded.loc[:, (v_id, "lat")] = data_rounded[v_id]["lat"].round(round_decimals) + # data_rounded.loc[:, (v_id, "lon")]= data_rounded[v_id]["lon"].round(round_decimals) + # all_lats.extend(data_rounded[v_id]["lat"]) + # all_lons.extend(data_rounded[v_id]["lon"]) + # + # all_geos=np.array((all_lats, all_lons)) + # all_geos_unique=np.unique(all_geos, axis=1) + # # Plot track on the canvas + # if track_black: + # plot_dict = dict(color=(0, 0, 0), alpha=0.1) + # else: + # plot_dict = dict(c=data[v_id]['soc'] * 100, alpha=0.01) + # + # lns2_1 = sub2.scatter(all_geos_unique[0,:],all_geos_unique[1,:], + # **plot_dict, linestyle='-', + # linewidth=0, vmin=v_min, vmax=v_max) + # lns2_1.set_clim(vmin=v_min, vmax=v_max) + + + for v_id in vehicles: + if track_black: + plot_dict = dict(color=(0.9, 0.9, 0.9), alpha=1) + # lns2_1 = sub2.plot(data[v_id]['lat'], data[v_id]['lon'], + # **plot_dict, linestyle='-', + # linewidth=2) + lns2_1 = sub2.scatter(data[v_id]['lat'], data[v_id]['lon'], + **plot_dict, linestyle='-', + linewidth=2, s=0, vmin=v_min, vmax=v_max) + else: + plot_dict = dict(c=data[v_id]['soc'] * 100, alpha=0.01) + lns2_1 = sub2.scatter(data[v_id]['lat'], data[v_id]['lon'], + **plot_dict, linestyle='-', + linewidth=0, vmin=v_min, vmax=v_max) + lns2_1.set_clim(vmin=v_min, vmax=v_max) + + # Helper plot so we can plot a colorbar aftwards, not possible with only line plot + # lns2_1 = sub2.scatter([], [], + # **plot_dict, linestyle='-', + # linewidth=0, vmin=v_min, vmax=v_max) + + + cbar = fig.colorbar(lns2_1, ax=ax, pad=0.0) + cbar.set_alpha(1) + cbar.draw_all() + cbar.set_label("SOC") + + sub2.set_ylabel('Position') + sub2.set_xlabel('Position') + + artist_objects=[] + for _ in vehicles: + lns2_1 = sub2.scatter([0, 0], [0, 0], [0, 100]) + artist_objects.append(lns2_1) + + d_bound=0.001 + sub2.set_ylim((lon_boundary[0]-d_bound, lon_boundary[1]+d_bound)) + sub2.set_xlim((lat_boundary[0]-d_bound, lat_boundary[1]+d_bound)) + + def animate(i, data , counter=[]): + roll_v = 3 + len_v = 5 + vehicles = list(data.columns.levels[0]) + if not counter: + counter.append(i) + else: + counter[0] +=1 + i =counter[0] + start_index=i*roll_v + end_index=start_index+len_v + + for k, v_id in enumerate(vehicles): + artist_objects[k].remove() + if vehicle_black: + plot_dict = dict(color=(0, 0, 0)) + else: + mean_soc = data[v_id]["soc"][start_index:end_index].mean() + l = len(data[v_id]["lat"][start_index:end_index]) + plot_dict = dict(c=mean_soc * np.ones(l)) + artist_objects[k] = sub2.scatter(data[v_id]["lat"][start_index:end_index], + data[v_id]["lon"][start_index:end_index], + **plot_dict, + vmin=0, vmax=1, + linestyle='-', + linewidth=0) + if end_index >= len(data[v_id]["soc"]): + counter[0]=0 + + return artist_objects + + ax.axis('off') + # create animation using the animate() function + myAnimation = animation.FuncAnimation(fig, + lambda i: animate(i, data), + frames=10, + interval=50, blit=False, repeat=repeat) + # + sub2.set_ylabel('Position') + sub2.set_xlabel('Position') + + # y_d = (y_max - y_min) * 0.02 + # x_d = (x_max - x_min) * 0.02 + # sub2.set_ylim((y_min - y_d, y_max + y_d)) + # sub2.set_xlim((x_min - x_d, x_max + x_d)) + + # Toggle Comment of for saving + if save: + myAnimation.save('SOC_Animation_all_OLIA_w_locations.gif', writer='imagemagick') + + fig.tight_layout() + + plt.show() + +def find_current_trip(trips, current_time): + for i, trip in enumerate(trips): + try: + next_trip = trips[i + 1] + if next_trip.departure_time>current_time: + return trip, i + except IndexError: + return trip, i + else: + raise Exception("no trip found for time: " + str(current_time)) + +def get_rel_time_of_trip(current_time: datetime.datetime, current_trip: 'ebus_toolbox.trip.Trip'): + rel_time=(current_time-current_trip.departure_time)/\ + (current_trip.arrival_time-current_trip.departure_time) + return min(1,max(rel_time,0)) + +start_time=scenario.start_time +time_step = datetime.timedelta(hours=1/scenario.stepsPerHour) + +vehicle_data_frames=pd.DataFrame() +c = 0 +for v_id, soc_data in scenario.vehicle_socs.items(): + rotations=get_sorted_rotations(v_id, schedule) + trips = [trip for rot in rotations for trip in rot.trips ] + lats = [] + lons = [] + trip_nr=0 + for counter, soc in enumerate(soc_data): + try: + current_time=start_time+counter*time_step + current_trip, found_trip_index = find_current_trip(trips[trip_nr:],current_time) + trip_nr += found_trip_index + rel_time_of_trip=get_rel_time_of_trip(current_time, current_trip) + current_station = stations[current_trip.departure_name] + next_station = stations[current_trip.arrival_name] + lat, lon = current_station.get_lat_lon(next_station,rel_time_of_trip) + lats.append(lat) + lons.append(lon) + except IndexError: + pass + columns=[(v_id, "soc"), (v_id, "lat") , (v_id, "lon")] + data = np.array([soc_data, lats, lons]).transpose() + vehicle_data_frames=pd.concat((vehicle_data_frames, pd.DataFrame(data ,columns=columns)),axis=1) + c +=1 + if c>4: + break + + +vehicle_data_frames.columns = pd.MultiIndex.from_tuples(vehicle_data_frames.columns, names=['Vehicle_id','Data']) +plot_merge_animate_battery(vehicle_data_frames) From bf70a3054da7e8ac9ae23407c46d7ecc56e5973c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 18 Jan 2023 17:24:59 +0100 Subject: [PATCH 484/802] Track as line, annotations and more --- ebus_toolbox/plot_geoposition.py | 337 ++++++++++++++++--------------- 1 file changed, 175 insertions(+), 162 deletions(-) diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py index 7124d34d..e486eab3 100644 --- a/ebus_toolbox/plot_geoposition.py +++ b/ebus_toolbox/plot_geoposition.py @@ -1,6 +1,8 @@ """ Module to implement plotting functionality of busses with georeferences""" import datetime +from matplotlib.offsetbox import TextArea, AnnotationBbox + import ebus_toolbox.util as util import pickle import csv @@ -29,63 +31,65 @@ from matplotlib.colors import LinearSegmentedColormap import matplotlib import matplotlib.animation as animation + matplotlib.use("TkAgg") import os -shared_axis=None -FIGSIZE=(14,5) -LINEWIDTH=2 -DELIMITER = ';' -FRAMEALPHA=0.8 -ALPHA_POINTS=0.1 +shared_axis = None +FIGSIZE = (14, 5) +LINEWIDTH = 2 +DELIMITER = ';' +FRAMEALPHA = 0.8 +ALPHA_POINTS = 0.1 ### -rli_dblue =(0, 46 / 255, 80 / 255) -rli_green=(68 / 255, 175 / 255, 105 / 255) -rli_orange=(254 / 255, 127 / 255, 45 / 255) -rli_yellow=(241 / 255, 196 / 255, 15 / 255) -rli_lblue=(34/ 255, 116 / 255, 165 / 255) -rli_dgrey=(51 / 255, 88 / 255, 115 / 255) +rli_dblue = (0, 46 / 255, 80 / 255) +rli_green = (68 / 255, 175 / 255, 105 / 255) +rli_orange = (254 / 255, 127 / 255, 45 / 255) +rli_yellow = (241 / 255, 196 / 255, 15 / 255) +rli_lblue = (34 / 255, 116 / 255, 165 / 255) +rli_dgrey = (51 / 255, 88 / 255, 115 / 255) ### Not from official coperate design -rli_red =(192/255,0,0) -rli_green2 =(0, 176/255,80/255) +rli_red = (192 / 255, 0, 0) +rli_green2 = (0, 176 / 255, 80 / 255) rli_brown = (132 / 255, 60 / 255, 12 / 255) -rli_black=(0,0,0) -rli_colors = [rli_dblue, rli_green, rli_orange, rli_yellow,rli_lblue, rli_dgrey,rli_black,rli_red, rli_brown,rli_green2] +rli_black = (0, 0, 0) +rli_colors = [rli_dblue, rli_green, rli_orange, rli_yellow, rli_lblue, rli_dgrey, rli_black, + rli_red, rli_brown, rli_green2] ### -cdict = {'red': [[0.0, 0, 0], - [0.2, 34/255, 34/255], - [0.4, 68/255, 68/255], - [0.6, 254/255, 254/255], - [0.8, 241/255, 241/255], - [1.0, 255/255, 255/255]], - 'green': [[0.0, 46/255, 46/255], - [0.2, 116/255, 116/255], - [0.4, 175/255, 175/255], - [0.6, 127/255, 127/255], - [0.8, 196/255, 196/255], - [1.0, 255/255, 255/255]], - 'blue': [[0.0, 80/255, 80/255], - [0.2, 165/255, 165/255], - [0.4, 105/255, 105/255], - [0.6, 45/255, 45/255], - [0.8, 15/255, 15/255], - [1.0, 255/255, 255/255]]} +cdict = {'red': [[0.0, 0, 0], + [0.2, 34 / 255, 34 / 255], + [0.4, 68 / 255, 68 / 255], + [0.6, 254 / 255, 254 / 255], + [0.8, 241 / 255, 241 / 255], + [1.0, 255 / 255, 255 / 255]], + 'green': [[0.0, 46 / 255, 46 / 255], + [0.2, 116 / 255, 116 / 255], + [0.4, 175 / 255, 175 / 255], + [0.6, 127 / 255, 127 / 255], + [0.8, 196 / 255, 196 / 255], + [1.0, 255 / 255, 255 / 255]], + 'blue': [[0.0, 80 / 255, 80 / 255], + [0.2, 165 / 255, 165 / 255], + [0.4, 105 / 255, 105 / 255], + [0.6, 45 / 255, 45 / 255], + [0.8, 15 / 255, 15 / 255], + [1.0, 255 / 255, 255 / 255]]} rli_rainbow_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) -cdict = {'red': [[0.0, 0, 0], - [0.33, 0, 0], - [0.66, 34/255, 34/255], - [1, 255/255, 255/255]], - 'green': [[0.0, 0, 0], - [0.33, 46/255, 46/255], - [0.66, 116/255, 116/255], - [1, 255/255, 255/255]], - 'blue': [[0.0, 0, 0], - [0.33, 80/255, 80/255], - [0.66, 165/255, 165/255], - [1, 255/255, 45/255]]} +cdict = {'red': [[0.0, 0, 0], + [0.33, 0, 0], + [0.66, 34 / 255, 34 / 255], + [1, 255 / 255, 255 / 255]], + 'green': [[0.0, 0, 0], + [0.33, 46 / 255, 46 / 255], + [0.66, 116 / 255, 116 / 255], + [1, 255 / 255, 255 / 255]], + 'blue': [[0.0, 0, 0], + [0.33, 80 / 255, 80 / 255], + [0.66, 165 / 255, 165 / 255], + [1, 255 / 255, 45 / 255]]} rli_blue_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) with open("schedule_opt.pickle", "rb") as file: @@ -97,7 +101,63 @@ with open("args_buffered_all_depb.pickle", "rb") as file: args = pickle.load(file) -args.station_data_path= "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/data/buffered_all_stations.csv" +args.station_data_path = "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/data/buffered_all_stations.csv" + + +def main(): + with open(str(args.station_data_path), "r", encoding='utf-8') as f: + delim = util.get_csv_delim(args.station_data_path) + reader = csv.DictReader(f, delimiter=delim) + stations = dict() + for row in reader: + elevation = float(row['elevation']) + name = str(row['Endhaltestelle']) + lon = float(row['lon']) + lat = float(row['lat']) + stations[name] = station(name, lat, lon, elevation) + + start_time = scenario.start_time + time_step = datetime.timedelta(hours=1 / scenario.stepsPerHour) + + vehicle_data_frames = pd.DataFrame() + c = 0 + for v_id, soc_data in scenario.vehicle_socs.items(): + rotations = get_sorted_rotations(v_id, schedule) + trips = [trip for rot in rotations for trip in rot.trips] + lats = [] + lons = [] + trip_nr = 0 + for counter, soc in enumerate(soc_data): + try: + current_time = start_time + counter * time_step + current_trip, found_trip_index = find_current_trip(trips[trip_nr:], current_time) + trip_nr += found_trip_index + rel_time_of_trip = get_rel_time_of_trip(current_time, current_trip) + current_station = stations[current_trip.departure_name] + next_station = stations[current_trip.arrival_name] + lat, lon = current_station.get_lat_lon(next_station, rel_time_of_trip) + lats.append(lat) + lons.append(lon) + except IndexError: + pass + columns = [(v_id, "soc"), (v_id, "lat"), (v_id, "lon")] + data = np.array([soc_data, lats, lons]).transpose() + vehicle_data_frames = pd.concat((vehicle_data_frames, pd.DataFrame(data, columns=columns)), + axis=1) + # c += 1 + # if c > 2: + # break + + vehicle_data_frames.columns = pd.MultiIndex.from_tuples(vehicle_data_frames.columns, + names=['Vehicle_id', 'Data']) + + vehicle_data_frames.index = np.arange(start_time, start_time + + len(vehicle_data_frames) * time_step, time_step) + + stations_to_annotate = {name: stat for name, stat in stations.items() if + name in schedule.stations} + plot_merge_animate_battery(vehicle_data_frames, station_data=stations_to_annotate, save=True, repeat=False) + class station: def __init__(self, name, lat, lon, elevation): @@ -107,34 +167,23 @@ def __init__(self, name, lat, lon, elevation): self.elevation = elevation def get_lat_lon(self, next_station, rel_pos): - lat_pos= (next_station.lat-self.lat)*rel_pos+self.lat + lat_pos = (next_station.lat - self.lat) * rel_pos + self.lat lon_pos = (next_station.lon - self.lon) * rel_pos + self.lon return lat_pos, lon_pos -with open(str(args.station_data_path), "r", encoding='utf-8') as f: - delim = util.get_csv_delim(args.station_data_path) - reader = csv.DictReader(f, delimiter=delim) - stations = dict() - for row in reader: - elevation = float(row['elevation']) - name = str(row['Endhaltestelle']) - lon = float(row['lon']) - lat = float(row['lat']) - stations[name]=station(name, lat, lon, elevation) - def get_sorted_rotations(v_id, schedule): - rots=[] + rots = [] for rot in schedule.rotations.values(): - if rot.vehicle_id==v_id: + if rot.vehicle_id == v_id: rots.append(rot) - return sorted(rots, key= lambda x: x.departure_time) + return sorted(rots, key=lambda x: x.departure_time) -def plot_merge_animate_battery(data: pd.DataFrame, z_ax=None, +def plot_merge_animate_battery(data: pd.DataFrame, z_ax=None, station_data=None, save=False, repeat=True, vehicle_black=False, track_black=True): - v_max=1 - v_min=0 + v_max = 1 + v_min = 0 fig = plt.figure(figsize=(14, 8)) fig.suptitle('Vehicle Tracking', fontsize=14) @@ -142,86 +191,83 @@ def plot_merge_animate_battery(data: pd.DataFrame, z_ax=None, sub2 = fig.add_subplot(111) ax = plt.gca() data.xs("lat", level="Data", axis=1) - lat_boundary = (data.xs("lat", level="Data", axis=1).min().min(),data.xs("lat", level="Data", axis=1).max().max()) - lon_boundary = (data.xs("lon", level="Data", axis=1).min().min(),data.xs("lon", level="Data", axis=1).max().max()) + lat_boundary = (data.xs("lat", level="Data", axis=1).min().min(), + data.xs("lat", level="Data", axis=1).max().max()) + lon_boundary = (data.xs("lon", level="Data", axis=1).min().min(), + data.xs("lon", level="Data", axis=1).max().max()) # Get all the vehicle ids from data - vehicles = list(data.columns.levels[0]) - data_rounded = data.copy() - - round_decimals = 3 #4 decimals approx 110m in germany - all_lats=[] - all_lons=[] - # for v_id in vehicles: - # data_rounded.loc[:, (v_id, "lat")] = data_rounded[v_id]["lat"].round(round_decimals) - # data_rounded.loc[:, (v_id, "lon")]= data_rounded[v_id]["lon"].round(round_decimals) - # all_lats.extend(data_rounded[v_id]["lat"]) - # all_lons.extend(data_rounded[v_id]["lon"]) - # - # all_geos=np.array((all_lats, all_lons)) - # all_geos_unique=np.unique(all_geos, axis=1) - # # Plot track on the canvas - # if track_black: - # plot_dict = dict(color=(0, 0, 0), alpha=0.1) - # else: - # plot_dict = dict(c=data[v_id]['soc'] * 100, alpha=0.01) - # - # lns2_1 = sub2.scatter(all_geos_unique[0,:],all_geos_unique[1,:], - # **plot_dict, linestyle='-', - # linewidth=0, vmin=v_min, vmax=v_max) - # lns2_1.set_clim(vmin=v_min, vmax=v_max) - + vehicles = list(data.columns.levels[0]) + # Plot track onto canvas via line which doesnt allow soc printing + # or via scatter plot. With a scatter plot the points can take the color of the soc which drove + # above the position. + # ToDo for soc printing soc handling needs to be implemented so for every position only a + # single soc is printed for v_id in vehicles: if track_black: plot_dict = dict(color=(0.9, 0.9, 0.9), alpha=1) - # lns2_1 = sub2.plot(data[v_id]['lat'], data[v_id]['lon'], - # **plot_dict, linestyle='-', - # linewidth=2) - lns2_1 = sub2.scatter(data[v_id]['lat'], data[v_id]['lon'], + lns2_1 = sub2.plot(data[v_id]['lat'], data[v_id]['lon'], **plot_dict, linestyle='-', - linewidth=2, s=0, vmin=v_min, vmax=v_max) + linewidth=2) else: plot_dict = dict(c=data[v_id]['soc'] * 100, alpha=0.01) lns2_1 = sub2.scatter(data[v_id]['lat'], data[v_id]['lon'], - **plot_dict, linestyle='-', - linewidth=0, vmin=v_min, vmax=v_max) + **plot_dict, linestyle='-', + linewidth=0, vmin=v_min, vmax=v_max) lns2_1.set_clim(vmin=v_min, vmax=v_max) # Helper plot so we can plot a colorbar aftwards, not possible with only line plot - # lns2_1 = sub2.scatter([], [], - # **plot_dict, linestyle='-', - # linewidth=0, vmin=v_min, vmax=v_max) - + lns2_1 = sub2.scatter([], [], + **plot_dict, linestyle='-', + linewidth=0, vmin=v_min, vmax=v_max) cbar = fig.colorbar(lns2_1, ax=ax, pad=0.0) cbar.set_alpha(1) cbar.draw_all() cbar.set_label("SOC") - sub2.set_ylabel('Position') - sub2.set_xlabel('Position') + # Plot Station Names + if station_data: + for station in station_data.values(): + ax.annotate(station.name, + xy=(station.lat, station.lon), xycoords='data', fontsize=8, ha='center') + ax.plot(station.lat, station.lon, 'bo') - artist_objects=[] + artist_objects = [] for _ in vehicles: lns2_1 = sub2.scatter([0, 0], [0, 0], [0, 100]) artist_objects.append(lns2_1) - d_bound=0.001 - sub2.set_ylim((lon_boundary[0]-d_bound, lon_boundary[1]+d_bound)) - sub2.set_xlim((lat_boundary[0]-d_bound, lat_boundary[1]+d_bound)) + d_bound = 0.005 + sub2.set_ylim((lon_boundary[0] - d_bound, lon_boundary[1] + d_bound)) + sub2.set_xlim((lat_boundary[0] - d_bound, lat_boundary[1] + d_bound)) + sub2.set_ylabel('Position') + sub2.set_xlabel('Position') + + text_box = TextArea(data.index[0]) + time_annotation_box = [AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', + fontsize=15)] + ax.add_artist(time_annotation_box[0]) - def animate(i, data , counter=[]): - roll_v = 3 - len_v = 5 + def animate(i, data, counter=[]): + roll_v = 1 + len_v = 2 + ax = plt.gca() vehicles = list(data.columns.levels[0]) if not counter: counter.append(i) else: - counter[0] +=1 - i =counter[0] - start_index=i*roll_v - end_index=start_index+len_v + counter[0] += 1 + i = counter[0] + start_index = i * roll_v + end_index = start_index + len_v + + ax.artists.remove(time_annotation_box[0]) + text_box = TextArea(data.index[start_index]) + time_annotation_box[0] = AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', + fontsize=15) + ax.add_artist(time_annotation_box[0]) for k, v_id in enumerate(vehicles): artist_objects[k].remove() @@ -236,9 +282,10 @@ def animate(i, data , counter=[]): **plot_dict, vmin=0, vmax=1, linestyle='-', - linewidth=0) + linewidth=0, zorder=50) + if end_index >= len(data[v_id]["soc"]): - counter[0]=0 + counter[0] = 0 return artist_objects @@ -252,66 +299,32 @@ def animate(i, data , counter=[]): sub2.set_ylabel('Position') sub2.set_xlabel('Position') - # y_d = (y_max - y_min) * 0.02 - # x_d = (x_max - x_min) * 0.02 - # sub2.set_ylim((y_min - y_d, y_max + y_d)) - # sub2.set_xlim((x_min - x_d, x_max + x_d)) - - # Toggle Comment of for saving + # Toggle save for saving if save: - myAnimation.save('SOC_Animation_all_OLIA_w_locations.gif', writer='imagemagick') + myAnimation.save('SOC_animation.gif', writer='imagemagick') fig.tight_layout() plt.show() + def find_current_trip(trips, current_time): for i, trip in enumerate(trips): try: next_trip = trips[i + 1] - if next_trip.departure_time>current_time: + if next_trip.departure_time > current_time: return trip, i except IndexError: return trip, i else: raise Exception("no trip found for time: " + str(current_time)) + def get_rel_time_of_trip(current_time: datetime.datetime, current_trip: 'ebus_toolbox.trip.Trip'): - rel_time=(current_time-current_trip.departure_time)/\ - (current_trip.arrival_time-current_trip.departure_time) - return min(1,max(rel_time,0)) - -start_time=scenario.start_time -time_step = datetime.timedelta(hours=1/scenario.stepsPerHour) - -vehicle_data_frames=pd.DataFrame() -c = 0 -for v_id, soc_data in scenario.vehicle_socs.items(): - rotations=get_sorted_rotations(v_id, schedule) - trips = [trip for rot in rotations for trip in rot.trips ] - lats = [] - lons = [] - trip_nr=0 - for counter, soc in enumerate(soc_data): - try: - current_time=start_time+counter*time_step - current_trip, found_trip_index = find_current_trip(trips[trip_nr:],current_time) - trip_nr += found_trip_index - rel_time_of_trip=get_rel_time_of_trip(current_time, current_trip) - current_station = stations[current_trip.departure_name] - next_station = stations[current_trip.arrival_name] - lat, lon = current_station.get_lat_lon(next_station,rel_time_of_trip) - lats.append(lat) - lons.append(lon) - except IndexError: - pass - columns=[(v_id, "soc"), (v_id, "lat") , (v_id, "lon")] - data = np.array([soc_data, lats, lons]).transpose() - vehicle_data_frames=pd.concat((vehicle_data_frames, pd.DataFrame(data ,columns=columns)),axis=1) - c +=1 - if c>4: - break + rel_time = (current_time - current_trip.departure_time) / \ + (current_trip.arrival_time - current_trip.departure_time) + return min(1, max(rel_time, 0)) -vehicle_data_frames.columns = pd.MultiIndex.from_tuples(vehicle_data_frames.columns, names=['Vehicle_id','Data']) -plot_merge_animate_battery(vehicle_data_frames) +if __name__ == "__main__": + main() From 5af6899d1c2cf3482ca0726583024718ac5f7abf Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 19 Jan 2023 16:45:20 +0100 Subject: [PATCH 485/802] Add hover to plot --- ebus_toolbox/plot_geoposition.py | 137 ++++++++++++++++++++++--------- 1 file changed, 96 insertions(+), 41 deletions(-) diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py index e486eab3..8b9f5fa8 100644 --- a/ebus_toolbox/plot_geoposition.py +++ b/ebus_toolbox/plot_geoposition.py @@ -1,5 +1,6 @@ """ Module to implement plotting functionality of busses with georeferences""" import datetime +import typing from matplotlib.offsetbox import TextArea, AnnotationBbox @@ -103,8 +104,9 @@ args.station_data_path = "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/data/buffered_all_stations.csv" - +ANIMATION_DURATION_MIN = 480 def main(): + pickle_path="vehicle_data_frames.pickle" with open(str(args.station_data_path), "r", encoding='utf-8') as f: delim = util.get_csv_delim(args.station_data_path) reader = csv.DictReader(f, delimiter=delim) @@ -119,44 +121,51 @@ def main(): start_time = scenario.start_time time_step = datetime.timedelta(hours=1 / scenario.stepsPerHour) - vehicle_data_frames = pd.DataFrame() - c = 0 - for v_id, soc_data in scenario.vehicle_socs.items(): - rotations = get_sorted_rotations(v_id, schedule) - trips = [trip for rot in rotations for trip in rot.trips] - lats = [] - lons = [] - trip_nr = 0 - for counter, soc in enumerate(soc_data): - try: - current_time = start_time + counter * time_step - current_trip, found_trip_index = find_current_trip(trips[trip_nr:], current_time) - trip_nr += found_trip_index - rel_time_of_trip = get_rel_time_of_trip(current_time, current_trip) - current_station = stations[current_trip.departure_name] - next_station = stations[current_trip.arrival_name] - lat, lon = current_station.get_lat_lon(next_station, rel_time_of_trip) - lats.append(lat) - lons.append(lon) - except IndexError: - pass - columns = [(v_id, "soc"), (v_id, "lat"), (v_id, "lon")] - data = np.array([soc_data, lats, lons]).transpose() - vehicle_data_frames = pd.concat((vehicle_data_frames, pd.DataFrame(data, columns=columns)), - axis=1) - # c += 1 - # if c > 2: - # break - - vehicle_data_frames.columns = pd.MultiIndex.from_tuples(vehicle_data_frames.columns, - names=['Vehicle_id', 'Data']) - - vehicle_data_frames.index = np.arange(start_time, start_time + - len(vehicle_data_frames) * time_step, time_step) + if not pickle_path: + vehicle_data_frames = pd.DataFrame() + c = 0 + + for v_id, soc_data in scenario.vehicle_socs.items(): + rotations = get_sorted_rotations(v_id, schedule) + trips = [trip for rot in rotations for trip in rot.trips] + lats = [] + lons = [] + trip_nr = 0 + for counter, soc in enumerate(soc_data): + try: + current_time = start_time + counter * time_step + current_trip, found_trip_index = find_current_trip(trips[trip_nr:], current_time) + trip_nr += found_trip_index + rel_time_of_trip = get_rel_time_of_trip(current_time, current_trip) + current_station = stations[current_trip.departure_name] + next_station = stations[current_trip.arrival_name] + lat, lon = current_station.get_lat_lon(next_station, rel_time_of_trip) + lats.append(lat) + lons.append(lon) + except IndexError: + pass + columns = [(v_id, "soc"), (v_id, "lat"), (v_id, "lon")] + data = np.array([soc_data, lats, lons]).transpose() + vehicle_data_frames = pd.concat((vehicle_data_frames, pd.DataFrame(data, columns=columns)), + axis=1) + # c += 1 + # if c > 2: + # break + + vehicle_data_frames.columns = pd.MultiIndex.from_tuples(vehicle_data_frames.columns, + names=['Vehicle_id', 'Data']) + + vehicle_data_frames.index = np.arange(start_time, start_time + + len(vehicle_data_frames) * time_step, time_step) + else: + with open(pickle_path, "rb") as f: + print("depickeling") + vehicle_data_frames= pickle.load(f) stations_to_annotate = {name: stat for name, stat in stations.items() if name in schedule.stations} - plot_merge_animate_battery(vehicle_data_frames, station_data=stations_to_annotate, save=True, repeat=False) + vehicle_data_frames = vehicle_data_frames.iloc[:24*60,:] + plot_merge_animate_battery(vehicle_data_frames, station_data=stations_to_annotate, save=False, repeat=False) class station: @@ -180,7 +189,7 @@ def get_sorted_rotations(v_id, schedule): return sorted(rots, key=lambda x: x.departure_time) -def plot_merge_animate_battery(data: pd.DataFrame, z_ax=None, station_data=None, +def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, save=False, repeat=True, vehicle_black=False, track_black=True): v_max = 1 v_min = 0 @@ -232,7 +241,7 @@ def plot_merge_animate_battery(data: pd.DataFrame, z_ax=None, station_data=None, for station in station_data.values(): ax.annotate(station.name, xy=(station.lat, station.lon), xycoords='data', fontsize=8, ha='center') - ax.plot(station.lat, station.lon, 'bo') + ax.plot(station.lat, station.lon, 'ko') artist_objects = [] for _ in vehicles: @@ -249,7 +258,7 @@ def plot_merge_animate_battery(data: pd.DataFrame, z_ax=None, station_data=None, time_annotation_box = [AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', fontsize=15)] ax.add_artist(time_annotation_box[0]) - + hover_texts= [str(v_id) for v_id in vehicles] def animate(i, data, counter=[]): roll_v = 1 len_v = 2 @@ -260,7 +269,7 @@ def animate(i, data, counter=[]): else: counter[0] += 1 i = counter[0] - start_index = i * roll_v + start_index = i * roll_v+8*60 end_index = start_index + len_v ax.artists.remove(time_annotation_box[0]) @@ -270,7 +279,9 @@ def animate(i, data, counter=[]): ax.add_artist(time_annotation_box[0]) for k, v_id in enumerate(vehicles): + artist_objects[k].remove() + mean_soc = 0 if vehicle_black: plot_dict = dict(color=(0, 0, 0)) else: @@ -283,6 +294,7 @@ def animate(i, data, counter=[]): vmin=0, vmax=1, linestyle='-', linewidth=0, zorder=50) + hover_texts[k] = (v_id, str(round(mean_soc, 3))) if end_index >= len(data[v_id]["soc"]): counter[0] = 0 @@ -293,12 +305,14 @@ def animate(i, data, counter=[]): # create animation using the animate() function myAnimation = animation.FuncAnimation(fig, lambda i: animate(i, data), - frames=10, + frames=ANIMATION_DURATION_MIN, interval=50, blit=False, repeat=repeat) # sub2.set_ylabel('Position') sub2.set_xlabel('Position') + fig.canvas.mpl_connect("motion_notify_event",lambda event: hover_for_scatter( + event, fig,ax, artist_objects, hover_texts)) # Toggle save for saving if save: myAnimation.save('SOC_animation.gif', writer='imagemagick') @@ -307,6 +321,47 @@ def animate(i, data, counter=[]): plt.show() +def hover_for_scatter(event, fig, ax, plot_points: typing.Iterable[matplotlib.lines.Line2D], hover_texts: typing.Iterable[str], annotations=[]): + """Called when user hovers over plot. + Checks if user hovers over point. If so, delete old annotation and + create new one with relevant info from the hover_texts list. + If user does not hover over point, remove annotation, if any. + """ + if len(annotations)==0: + annotations.append(None) + for i,points in enumerate(plot_points): + if points and event.inaxes == ax: + # results shown, mouse within plot: get event info + # cont: any points hovered? + # ind: list of points hovered + cont, ind = points.contains(event) + + if cont and "ind" in ind: + ind = ind["ind"] + # points hovered + # get all point coordinates + xy = points.get_offsets().data + text = hover_texts[i] + + # # remove old annotation + if annotations and annotations[0]: + annotations[0].remove() + annotations[0]=None + + # create new annotation + annotations[0]= ax.annotate( + text, + xy=(xy[ind[0]][0], xy[ind[0]][1]), + xytext=(-20, 20), + textcoords="offset points", + bbox=dict(boxstyle="round", fc="w"), + arrowprops={'arrowstyle': "-"}, + annotation_clip=False) + fig.canvas.draw() + + + + def find_current_trip(trips, current_time): for i, trip in enumerate(trips): From 5902f656df64a2de34fa0cd50044e0f46d0b9a59 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 11:09:34 +0100 Subject: [PATCH 486/802] add comments to cs and gc power --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 7468086b..5548ecca 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -477,7 +477,10 @@ def generate_scenario(self, args): connected_charging_station = f"{cs_name}_{station_type}" # create charging station and grid connector if necessary if cs_name not in charging_stations: + # get CS and GC power from stations file, + # default back to input arguments from config if station_type == "deps": + # trip type only relevant to depot stations if trip.rotation.charging_type == 'oppb': cs_power = station.get("cs_power_deps_oppb", args.cs_power_deps_oppb) From df974e2a876c9f832449a7f68179aec6cd3044b8 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 11:21:49 +0100 Subject: [PATCH 487/802] add comments to cs and gc power --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 7468086b..5548ecca 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -477,7 +477,10 @@ def generate_scenario(self, args): connected_charging_station = f"{cs_name}_{station_type}" # create charging station and grid connector if necessary if cs_name not in charging_stations: + # get CS and GC power from stations file, + # default back to input arguments from config if station_type == "deps": + # trip type only relevant to depot stations if trip.rotation.charging_type == 'oppb': cs_power = station.get("cs_power_deps_oppb", args.cs_power_deps_oppb) From 028f37e3203da88d367d7fe38377a3681362c5bc Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 11:32:45 +0100 Subject: [PATCH 488/802] shorten code for cs and gc power --- ebus_toolbox/schedule.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5548ecca..cdfe87ae 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -479,19 +479,12 @@ def generate_scenario(self, args): if cs_name not in charging_stations: # get CS and GC power from stations file, # default back to input arguments from config - if station_type == "deps": - # trip type only relevant to depot stations - if trip.rotation.charging_type == 'oppb': - cs_power = station.get("cs_power_deps_oppb", - args.cs_power_deps_oppb) - else: - cs_power = station.get("cs_power_deps_depb", - args.cs_power_deps_depb) - gc_power = station.get("gc_power", args.gc_power_deps) - elif station_type == "opps": - cs_power = station.get("cs_power_opps", - args.cs_power_opps) - gc_power = station.get("gc_power", args.gc_power_opps) + # trip type only relevant to depot stations + trip_type = trip.rotation.charging_type + trip_type = '_' + trip_type if station_type == "deps" else "" + cs_power_type = f"cs_power_{station_type}{trip_type}" + cs_power = station.get(cs_power_type, vars(args)[cs_power_type]) + gc_power = station.get("gc_power", vars(args)[f"gc_power_{station_type}"]) # add one charging station for each bus at bus station charging_stations[connected_charging_station] = { From bd1e29936813550933803a19937055f757075e27 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 11:38:22 +0100 Subject: [PATCH 489/802] adjust for changes in spiceEV --- ebus_toolbox/costs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index decf518a..5ae540da 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -141,7 +141,7 @@ def calculate_costs(c_params, scenario, schedule, args): ) # ToDo: Decide if gc-specific costs should be added to scenario object to use in report.py # setattr(scenario.constants.grid_connectors[gcID], "costs_electricity", costs_electricity) - costs["c_el_procurement_annual"] += costs_electricity['power_procurement_per_year'] + costs["c_el_procurement_annual"] += costs_electricity['power_procurement_costs_per_year'] costs["c_el_power_price_annual"] += costs_electricity['capacity_costs_eur'] costs["c_el_energy_price_annual"] += costs_electricity['commodity_costs_eur_per_year'] costs["c_el_taxes_annual"] += costs_electricity['levies_fees_and_taxes_per_year'] From 7f9d1eedad9d2c5b647896e76672eee2a6ad9bf3 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 13:44:03 +0100 Subject: [PATCH 490/802] simplify voltage level dependent gc cost calculation --- data/examples/cost_params.json | 53 ++++++++++------- ebus_toolbox/costs.py | 105 +++++++++++---------------------- 2 files changed, 67 insertions(+), 91 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 011deac3..3efd1489 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -26,27 +26,38 @@ "cost_per_kWh": 250 }, "gc": { - "LV_capex_gc_per_meter": 16.85, - "LV_capex_gc_per_kW": 24.14, - "LV_default_distance": 50, - "MV_building_cost_subsidy_per_kW": 158.3, - "MV_capex_gc_fix": 62500, - "MV_capex_gc_per_meter": 562.5, - "MV_default_distance": 50, - "MV_capex_transformer_fix": 80000, - "MV_capex_transformer_per_kW": 0, - "HV/MV_building_cost_subsidy_per_kW": 158.3, - "HV/MV_capex_gc_fix": 0, - "HV/MV_capex_gc_per_meter": 80, - "HV/MV_default_distance": 2000, - "HV/MV_capex_transformer_fix": 0, - "HV/MV_capex_transformer_per_kW": 63.49, - "HV_building_cost_subsidy_per_kW": 158.3, - "HV_capex_gc_fix": 0, - "HV_capex_gc_per_meter": 1300, - "HV_default_distance": 2000, - "HV_capex_transformer_fix": 2500000, - "HV_capex_transformer_per_kW": 0, + "LV": { + "default_distance": 50, + "capex_gc_fix": 16.85, + "capex_gc_per_meter": 16.85, + "capex_gc_per_kW": 24.14, + "capex_transformer_fix": 0, + "capex_transformer_per_kW": 0 + }, + "MV": { + "default_distance": 50, + "capex_gc_fix": 62500, + "capex_gc_per_meter": 562.5, + "capex_gc_per_kW": 158.3, + "capex_transformer_fix": 80000, + "capex_transformer_per_kW": 0 + }, + "HV/MV": { + "default_distance": 2000, + "capex_gc_fix": 0, + "capex_gc_per_meter": 80, + "capex_gc_per_kW": 158.3, + "capex_transformer_fix": 0, + "capex_transformer_per_kW": 63.49 + }, + "HV": { + "default_distance": 2000, + "capex_gc_fix": 0, + "capex_gc_per_meter": 1300, + "capex_gc_per_kW": 158.3, + "capex_transformer_fix": 2500000, + "capex_transformer_per_kW": 0 + }, "lifetime_gc": 50, "c_maint_transformer_per_year": 0.02, "lifetime_transformer": 20 diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 1f0c1d36..a3013952 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -56,76 +56,41 @@ def calculate_costs(c_params, scenario, schedule, args): # get max. power of grid connector gc_timeseries = getattr(scenario, f"{gcID}_timeseries") gc_max_power = -min(gc_timeseries["grid power [kW]"]) - if schedule.stations[gcID]["voltage_level"] in ["LV", "MV/LV"]: - # get distance between grid and gc - distance_to_grid = schedule.stations[gcID].get( - "distance_to_grid", c_params["gc"]["LV_default_distance"]) - c_gc = (c_params["gc"]["LV_capex_gc_per_meter"] * distance_to_grid + - c_params["gc"]["LV_capex_gc_per_kW"] * gc_max_power) - costs["c_gcs"] += c_gc - # calculate annual costs of grid connectors, depending on lifetime of gc and transformer - costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"]) - # calculate maintenance cost of grid connectors - costs["c_maint_gc_annual"] += 0 - elif schedule.stations[gcID]["voltage_level"] == "MV": - # get distance between grid and gc - distance_to_grid = schedule.stations[gcID].get( - "distance_to_grid", c_params["gc"]["MV_default_distance"]) - c_gc = (c_params["gc"]["MV_building_cost_subsidy_per_kW"] * gc_max_power + - c_params["gc"]["MV_capex_gc_fix"] + - c_params["gc"]["MV_capex_gc_per_meter"] * distance_to_grid) - c_transformer = (c_params["gc"]["MV_capex_transformer_fix"] + - c_params["gc"]["MV_capex_transformer_per_kW"] * gc_max_power) - costs["c_gcs"] += c_gc + c_transformer - # calculate annual costs of grid connectors, depending on lifetime of gc and transformer - costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + - c_transformer / c_params["gc"]["lifetime_transformer"]) - # calculate maintenance cost of grid connectors - costs["c_maint_gc_annual"] += (c_transformer * - c_params["gc"]["c_maint_transformer_per_year"]) - elif schedule.stations[gcID]["voltage_level"] == "HV/MV": - # get distance between grid and gc - distance_to_grid = schedule.stations[gcID].get( - "distance_to_grid", c_params["gc"]["HV/MV_default_distance"]) - c_gc = (c_params["gc"]["HV/MV_building_cost_subsidy_per_kW"] * gc_max_power + - c_params["gc"]["HV/MV_capex_gc_fix"] + - c_params["gc"]["HV/MV_capex_gc_per_meter"] * distance_to_grid) - c_transformer = (c_params["gc"]["HV/MV_capex_transformer_fix"] + - c_params["gc"]["HV/MV_capex_transformer_per_kW"] * gc_max_power) - costs["c_gcs"] += c_gc + c_transformer - # calculate annual costs of grid connectors, depending on lifetime of gc and transformer - costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + - c_transformer / c_params["gc"]["lifetime_transformer"]) - # calculate maintenance cost of grid connectors - costs["c_maint_gc_annual"] += (c_transformer * - c_params["gc"]["c_maint_transformer_per_year"]) - elif schedule.stations[gcID]["voltage_level"] == "HV": - # get distance between grid and gc - distance_to_grid = schedule.stations[gcID].get( - "distance_to_grid", c_params["gc"]["HV_default_distance"]) - c_gc = (c_params["gc"]["HV_building_cost_subsidy_per_kW"] * gc_max_power + - c_params["gc"]["HV_capex_gc_fix"] + - c_params["gc"]["HV_capex_gc_per_meter"] * distance_to_grid) - c_transformer = (c_params["gc"]["HV_capex_transformer_fix"] + - c_params["gc"]["HV_capex_transformer_per_kW"] * gc_max_power) - costs["c_gcs"] += c_gc + c_transformer - # calculate annual costs of grid connectors, depending on lifetime of gc and transformer - costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + - c_transformer / c_params["gc"]["lifetime_transformer"]) - # calculate maintenance cost of grid connectors - costs["c_maint_gc_annual"] += (c_transformer * - c_params["gc"]["c_maint_transformer_per_year"]) - + # get voltage_level + voltage_level = schedule.stations[gcID]["voltage_level"] + # get distance between grid and grid connector + distance_to_grid = schedule.stations[gcID].get( + "distance_to_grid", c_params["gc"][voltage_level]["default_distance"]) + # calculate grid connection costs + c_gc = (c_params["gc"][voltage_level]["capex_gc_fix"] + + c_params["gc"][voltage_level]["capex_gc_per_kW"] * gc_max_power + + c_params["gc"][voltage_level]["capex_gc_per_meter"] * distance_to_grid) + # calculate transformer costs + c_transformer = ( + c_params["gc"][voltage_level]["capex_transformer_fix"] + + c_params["gc"][voltage_level]["capex_transformer_per_kW"] * gc_max_power) + # calculate total cost of grid connection + costs["c_gcs"] += c_gc + c_transformer + # calculate annual costs of grid connection, depending on lifetime of gc and transformer + costs["c_gcs_annual"] += (c_gc / c_params["gc"]["lifetime_gc"] + + c_transformer / c_params["gc"]["lifetime_transformer"]) + # calculate maintenance cost of grid connection + costs["c_maint_gc_annual"] += ( + c_transformer * c_params["gc"]["c_maint_transformer_per_year"]) # STATIONARY STORAGE + # assume there is a stationary storage try: + # calculate costs of stationary storage costs["c_stat_storage"] += ( c_params["stationary_storage"]["capex_fix"] + - schedule.stations[gcID]["battery"]["capacity"] * - c_params["stationary_storage"]["capex_per_kWh"]) + c_params["stationary_storage"]["capex_per_kWh"] * + schedule.stations[gcID]["battery"]["capacity"] + ) except KeyError: + # if no stationary storage at grid connector cost is 0 costs["c_stat_storage"] += 0 - costs["c_stat_storage_annual"] = (costs["c_stat_storage"] - / c_params["stationary_storage"]["lifetime_stat_storage"]) + costs["c_stat_storage_annual"] = ( + costs["c_stat_storage"] / c_params["stationary_storage"]["lifetime_stat_storage"]) costs["c_maint_stat_storage_annual"] = ( costs["c_stat_storage"] * c_params["stationary_storage"]["c_maint_stat_storage_per_year"]) @@ -154,14 +119,14 @@ def calculate_costs(c_params, scenario, schedule, args): c_params["garage"]["vehicles_per_workstation"] * c_params["garage"]["cost_per_workstation"]) costs["c_garage"] = costs["c_garage_cs"] + costs["c_garage_workstations"] - costs["c_garage_annual"] = (costs["c_garage_cs"] / c_params["cs"]["lifetime_cs"] + - costs["c_garage_workstations"] / - c_params["garage"]["lifetime_workstations"]) + costs["c_garage_annual"] = ( + costs["c_garage_cs"] / c_params["cs"]["lifetime_cs"] + + costs["c_garage_workstations"] / c_params["garage"]["lifetime_workstations"]) # MAINTENANCE - costs["c_maint_infrastructure_annual"] = (costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] - + costs["c_maint_gc_annual"] - + costs["c_maint_stat_storage_annual"]) + costs["c_maint_infrastructure_annual"] = ( + costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] + + costs["c_maint_gc_annual"] + costs["c_maint_stat_storage_annual"]) # calculate (ceil) number of days in scenario drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * schedule.scenario["scenario"]["interval"]) // (24 * 60)) From abb434a60aeb6cdabf588ccb21e66b6dc6982581 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 13:52:02 +0100 Subject: [PATCH 491/802] include MV/LV gc costs in example --- data/examples/cost_params.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 3efd1489..a7703d12 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -34,8 +34,16 @@ "capex_transformer_fix": 0, "capex_transformer_per_kW": 0 }, + "MV/LV": { + "default_distance": 100, + "capex_gc_fix": 16.85, + "capex_gc_per_meter": 16.85, + "capex_gc_per_kW": 24.14, + "capex_transformer_fix": 0, + "capex_transformer_per_kW": 0 + }, "MV": { - "default_distance": 50, + "default_distance": 200, "capex_gc_fix": 62500, "capex_gc_per_meter": 562.5, "capex_gc_per_kW": 158.3, From 5554a8111372ec2284515ce7406380254c837c18 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 13:58:34 +0100 Subject: [PATCH 492/802] restructure cost initialization --- ebus_toolbox/costs.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index a3013952..cf2ad09f 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -17,16 +17,19 @@ def calculate_costs(c_params, scenario, schedule, args): """ # initialize dictionary with all costs - costs = {cost: 0 for cost in ["c_vehicles", "c_vehicles_annual", "c_gcs", "c_gcs_annual", - "c_maint_gc_annual", "c_cs", "c_cs_annual", "c_garage_cs", - "c_garage_workstations", "c_garage", "c_garage_annual", - "c_invest", "c_invest_annual", "c_maint_infrastructure_annual", - "c_maint_vehicles_annual", "c_maint_annual", - "c_el_procurement_annual", "c_el_power_price_annual", - "c_el_energy_price_annual", "c_el_taxes_annual", - "c_el_feed_in_remuneration_annual", "c_el_annual", - "c_stat_storage", "c_stat_storage_annual", - "c_maint_stat_storage_annual"]} + costs = {cost: 0 for cost in [ + # investment costs + "c_vehicles", "c_gcs", "c_cs", "c_garage_cs", "c_garage", "c_garage_workstations", + "c_stat_storage", "c_invest", + # annual investment costs + "c_vehicles_annual", "c_gcs_annual", "c_cs_annual", "c_garage_annual", + "c_stat_storage_annual", "c_invest_annual", + # annual maintainance costs + "c_maint_gc_annual", "c_maint_infrastructure_annual", "c_maint_vehicles_annual", + "c_maint_stat_storage_annual", "c_maint_annual", + # annual electricity costs + "c_el_procurement_annual", "c_el_power_price_annual","c_el_energy_price_annual", + "c_el_taxes_annual","c_el_feed_in_remuneration_annual", "c_el_annual"]} # INVESTMENT COSTS # From 125644a980d7f4aa3b0e0015ed82a8fcca45fd14 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 14:08:59 +0100 Subject: [PATCH 493/802] detail comments for gc costs --- ebus_toolbox/costs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index cf2ad09f..d85cfd44 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -64,7 +64,7 @@ def calculate_costs(c_params, scenario, schedule, args): # get distance between grid and grid connector distance_to_grid = schedule.stations[gcID].get( "distance_to_grid", c_params["gc"][voltage_level]["default_distance"]) - # calculate grid connection costs + # calculate grid connection costs, typically buidling costs and buiding cost subsidy c_gc = (c_params["gc"][voltage_level]["capex_gc_fix"] + c_params["gc"][voltage_level]["capex_gc_per_kW"] * gc_max_power + c_params["gc"][voltage_level]["capex_gc_per_meter"] * distance_to_grid) From 0f740dcd04403cfc991b3457378e838360eb70cb Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 15:03:41 +0100 Subject: [PATCH 494/802] restructure code for readability --- ebus_toolbox/costs.py | 48 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index d85cfd44..9331bb88 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -28,8 +28,8 @@ def calculate_costs(c_params, scenario, schedule, args): "c_maint_gc_annual", "c_maint_infrastructure_annual", "c_maint_vehicles_annual", "c_maint_stat_storage_annual", "c_maint_annual", # annual electricity costs - "c_el_procurement_annual", "c_el_power_price_annual","c_el_energy_price_annual", - "c_el_taxes_annual","c_el_feed_in_remuneration_annual", "c_el_annual"]} + "c_el_procurement_annual", "c_el_power_price_annual", "c_el_energy_price_annual", + "c_el_taxes_annual", "c_el_feed_in_remuneration_annual", "c_el_annual"]} # INVESTMENT COSTS # @@ -45,10 +45,11 @@ def calculate_costs(c_params, scenario, schedule, args): continue # sum up cost of vehicles and their batteries, depending on how often the battery # has to be replaced in the lifetime of the vehicles - c_vehicles_vt = (schedule.vehicle_type_counts[v_type] * - (costs_vehicle + (c_params["vehicles"][v_type]["lifetime"] // - c_params["batteries"]["lifetime_battery"]) * - v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"])) + c_vehicles_vt = ( + schedule.vehicle_type_counts[v_type] * + (costs_vehicle + (c_params["vehicles"][v_type]["lifetime"] // + c_params["batteries"]["lifetime_battery"]) * + v_keys["capacity"] * c_params["batteries"]["cost_per_kWh"])) costs["c_vehicles"] += c_vehicles_vt # calculate annual cost of vehicles of this type, depending on their lifetime costs["c_vehicles_annual"] += c_vehicles_vt / c_params["vehicles"][v_type]["lifetime"] @@ -63,15 +64,15 @@ def calculate_costs(c_params, scenario, schedule, args): voltage_level = schedule.stations[gcID]["voltage_level"] # get distance between grid and grid connector distance_to_grid = schedule.stations[gcID].get( - "distance_to_grid", c_params["gc"][voltage_level]["default_distance"]) + "distance_to_grid", c_params["gc"][voltage_level]["default_distance"]) # calculate grid connection costs, typically buidling costs and buiding cost subsidy c_gc = (c_params["gc"][voltage_level]["capex_gc_fix"] + c_params["gc"][voltage_level]["capex_gc_per_kW"] * gc_max_power + c_params["gc"][voltage_level]["capex_gc_per_meter"] * distance_to_grid) # calculate transformer costs c_transformer = ( - c_params["gc"][voltage_level]["capex_transformer_fix"] + - c_params["gc"][voltage_level]["capex_transformer_per_kW"] * gc_max_power) + c_params["gc"][voltage_level]["capex_transformer_fix"] + + c_params["gc"][voltage_level]["capex_transformer_per_kW"] * gc_max_power) # calculate total cost of grid connection costs["c_gcs"] += c_gc + c_transformer # calculate annual costs of grid connection, depending on lifetime of gc and transformer @@ -79,7 +80,7 @@ def calculate_costs(c_params, scenario, schedule, args): c_transformer / c_params["gc"]["lifetime_transformer"]) # calculate maintenance cost of grid connection costs["c_maint_gc_annual"] += ( - c_transformer * c_params["gc"]["c_maint_transformer_per_year"]) + c_transformer * c_params["gc"]["c_maint_transformer_per_year"]) # STATIONARY STORAGE # assume there is a stationary storage try: @@ -87,16 +88,14 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_stat_storage"] += ( c_params["stationary_storage"]["capex_fix"] + c_params["stationary_storage"]["capex_per_kWh"] * - schedule.stations[gcID]["battery"]["capacity"] - ) + schedule.stations[gcID]["battery"]["capacity"]) except KeyError: - # if no stationary storage at grid connector cost is 0 - costs["c_stat_storage"] += 0 + # if no stationary storage at grid connector: cost is 0 + pass costs["c_stat_storage_annual"] = ( - costs["c_stat_storage"] / c_params["stationary_storage"]["lifetime_stat_storage"]) + costs["c_stat_storage"] / c_params["stationary_storage"]["lifetime_stat_storage"]) costs["c_maint_stat_storage_annual"] = ( - costs["c_stat_storage"] * - c_params["stationary_storage"]["c_maint_stat_storage_per_year"]) + costs["c_stat_storage"] * c_params["stationary_storage"]["c_maint_stat_storage_per_year"]) # CHARGING INFRASTRUCTURE cs = schedule.scenario["constants"]["charging_stations"] @@ -105,12 +104,15 @@ def calculate_costs(c_params, scenario, schedule, args): if csID["type"] == "deps": costs["c_cs"] += c_params["cs"]["capex_deps_per_kW"] * csID["max_power"] # opportunity charging stations - nr of CS depend on max nr of simultaneously occupied CS - for gcID, gc_keys in gcs.items(): + for gcID in gcs: if schedule.stations[gcID]["type"] == "opps": - # get max. nr of occupied CS per grid connector gc_timeseries = getattr(scenario, f"{gcID}_timeseries") - costs["c_cs"] += (c_params["cs"]["capex_opps_per_kW"] * vars(args)["cs_power_opps"] * - max(gc_timeseries["CS in use"])) + costs["c_cs"] += ( + c_params["cs"]["capex_opps_per_kW"] * + # get cs power of this opps + schedule.stations[gcID].get("cs_power_opps", vars(args)["cs_power_opps"]) * + # get max. nr of occupied CS per grid connector + max(gc_timeseries["CS in use"])) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] @@ -128,8 +130,8 @@ def calculate_costs(c_params, scenario, schedule, args): # MAINTENANCE costs["c_maint_infrastructure_annual"] = ( - costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] - + costs["c_maint_gc_annual"] + costs["c_maint_stat_storage_annual"]) + costs["c_cs"] * c_params["cs"]["c_maint_cs_per_year"] + + costs["c_maint_gc_annual"] + costs["c_maint_stat_storage_annual"]) # calculate (ceil) number of days in scenario drive_days = -(-(schedule.scenario["scenario"]["n_intervals"] * schedule.scenario["scenario"]["interval"]) // (24 * 60)) From a95bc5dee7fc0d4a8d3cc746b7627add696b7dc2 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 15:29:21 +0100 Subject: [PATCH 495/802] clean the code further --- ebus_toolbox/costs.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 9331bb88..a20b8c7b 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -118,15 +118,17 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] # GARAGE - costs["c_garage_cs"] = (c_params["garage"]["n_charging_stations"] * - c_params["garage"]["power_cs"] * c_params["cs"]["capex_deps_per_kW"]) - costs["c_garage_workstations"] = -(-sum(schedule.vehicle_type_counts.values()) // - c_params["garage"]["vehicles_per_workstation"] * - c_params["garage"]["cost_per_workstation"]) + costs["c_garage_cs"] = ( + c_params["garage"]["n_charging_stations"] + * c_params["garage"]["power_cs"] * c_params["cs"]["capex_deps_per_kW"]) + costs["c_garage_workstations"] = -( + -sum(schedule.vehicle_type_counts.values()) + // c_params["garage"]["vehicles_per_workstation"] + * c_params["garage"]["cost_per_workstation"]) costs["c_garage"] = costs["c_garage_cs"] + costs["c_garage_workstations"] costs["c_garage_annual"] = ( - costs["c_garage_cs"] / c_params["cs"]["lifetime_cs"] - + costs["c_garage_workstations"] / c_params["garage"]["lifetime_workstations"]) + costs["c_garage_cs"] / c_params["cs"]["lifetime_cs"] + + costs["c_garage_workstations"] / c_params["garage"]["lifetime_workstations"]) # MAINTENANCE costs["c_maint_infrastructure_annual"] = ( From 20df10fd2d99d660ddcd314c437c9d5617d939aa Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 20 Jan 2023 16:56:06 +0100 Subject: [PATCH 496/802] Resolving review requested changes #30 --- data/examples/ebus_toolbox.cfg | 4 +- data/examples/rotation_filter.csv | 3 -- data/examples/rotation_filter.json | 1 + ebus_toolbox/__main__.py | 4 +- ebus_toolbox/schedule.py | 63 ++++++++++-------------------- ebus_toolbox/simulate.py | 2 +- 6 files changed, 27 insertions(+), 50 deletions(-) delete mode 100644 data/examples/rotation_filter.csv create mode 100644 data/examples/rotation_filter.json diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 6e5fd3f4..4348266d 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -24,7 +24,7 @@ outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" # Path to rotation filter -rotation_filter = "data/examples/rotation_filter.csv" +rotation_filter = "data/examples/rotation_filter.json" ##### COST CALCULATION ##### @@ -62,7 +62,7 @@ ignore_inconsistent_rotations = false # exclude: exclude the rotations in the file from the schedule # include: include only the rotations in the file # false: deactivate function -rotation_filter_variable = false +rotation_filter_variable = include # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/data/examples/rotation_filter.csv b/data/examples/rotation_filter.csv deleted file mode 100644 index 05d26c7f..00000000 --- a/data/examples/rotation_filter.csv +++ /dev/null @@ -1,3 +0,0 @@ -rotation_id -1 -2 \ No newline at end of file diff --git a/data/examples/rotation_filter.json b/data/examples/rotation_filter.json new file mode 100644 index 00000000..fd8ef095 --- /dev/null +++ b/data/examples/rotation_filter.json @@ -0,0 +1 @@ +[1, 2] \ No newline at end of file diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index e5bf8312..a91863ad 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -116,8 +116,8 @@ args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True - args.rotation_filter_variable = "" - args.rotation_filter = "" + args.rotation_filter_variable = None + args.rotation_filter = None util.set_options_from_config(args, check=True, verbose=False) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index aa503587..27d6017d 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -2,6 +2,7 @@ import random import datetime import warnings +import json from pathlib import Path from ebus_toolbox import util @@ -373,53 +374,31 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) - def rotation_filter(self, schedule, args, rf_list=None): - """The method edits the schedule.rotations accordingly - to the set rotation_filter_variable in args. + def rotation_filter(self, args, rf_list=None): + """Edit rotations according to args.rotation_filter_variable. - :param schedule: Schedule with property rotations which get filtered. + :param schedule: Schedule with property rotations which get filtered :type schedule: ebus_toolbox.Schedule - :param args: Command line arguments. + :param args: Command line arguments :type args: argparse.Namespace :param rf_list: rotation filter list with strings of rotation ids - :type rf_list: list, optional + :type rf_list: list, default: no rotation ids """ - if rf_list is None: - rf_list = [] - - rf_variable = args.rotation_filter_variable - if rf_variable is not False: - rf_file = args.rotation_filter - try: - with open(rf_file, encoding='utf-8') as f: - # put rotation_ids from file into rf_list - line = f.readline().strip() - if line == "rotation_id": - line = f.readline().strip() - while line != "": - rf_list.append(line) - line = f.readline().strip() - except FileNotFoundError: - print(f"Path to rotation filter ({rf_file}) does not exist.") - - # filter out rotations in schedule - if rf_variable == "exclude": - for rotation in rf_list: - if rotation in schedule.rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation '{rotation}' does not exist in schedule.") - elif rf_variable == "include": - remove_rotations = [] - for rotation in schedule.rotations: - if rotation not in rf_list: - remove_rotations.append(rotation) - for rotation in remove_rotations: - try: - schedule.rotations.pop(rotation) - except KeyError: - print(f"Rotation {rotation['id']} does not exist in schedule.") + rf_list = rf_list or [] + if not args.rotation_filter_variable: + return + try: + with open(args.rotation_filter, encoding='utf-8') as f: + # put rotation_ids from file into rf_list + rf_list += json.load(f, parse_int=str) + except FileNotFoundError: + print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") + # filter out rotations in schedule + tmp_rot = {} + if args.rotation_filter_variable == "exclude": + self.rotations = {k: v for k, v in self.rotations.items() if k not in rf_list} + elif args.rotation_filter_variable == "include": + self.rotations = {k: v for k, v in self.rotations.items() if k in rf_list} def generate_scenario(self, args): """ Generate scenario.json for spiceEV diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 2d7f6165..c0c0b56e 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -63,7 +63,7 @@ def simulate(args): schedule.calculate_consumption() # filter rotations - schedule.rotation_filter(schedule, args) + schedule.rotation_filter(args) # run the mode specified in config if args.mode == 'service_optimization': From 98e9f9030ce2de147b73820bfa617b87b63a889f Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 20 Jan 2023 16:57:38 +0100 Subject: [PATCH 497/802] Make flake8 happy #30 --- ebus_toolbox/schedule.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 27d6017d..5b14c84c 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -393,8 +393,7 @@ def rotation_filter(self, args, rf_list=None): rf_list += json.load(f, parse_int=str) except FileNotFoundError: print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") - # filter out rotations in schedule - tmp_rot = {} + # filter out rotations in self.rotations if args.rotation_filter_variable == "exclude": self.rotations = {k: v for k, v in self.rotations.items() if k not in rf_list} elif args.rotation_filter_variable == "include": From 8a88707126730fa757db080957da58b1cddf235f Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 20 Jan 2023 17:00:16 +0100 Subject: [PATCH 498/802] Make flake8 happy #30 --- ebus_toolbox/schedule.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5b14c84c..fff0d765 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -377,8 +377,6 @@ def get_negative_rotations(self, scenario): def rotation_filter(self, args, rf_list=None): """Edit rotations according to args.rotation_filter_variable. - :param schedule: Schedule with property rotations which get filtered - :type schedule: ebus_toolbox.Schedule :param args: Command line arguments :type args: argparse.Namespace :param rf_list: rotation filter list with strings of rotation ids From cc4e6740f396268a2386732e5e5e2bf8374181e4 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 20 Jan 2023 17:20:27 +0100 Subject: [PATCH 499/802] Add arguments for rotation option, set rotation_filter_variable to false #30 --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/__main__.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 4348266d..3d4fea20 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -62,7 +62,7 @@ ignore_inconsistent_rotations = false # exclude: exclude the rotations in the file from the schedule # include: include only the rotations in the file # false: deactivate function -rotation_filter_variable = include +rotation_filter_variable = false # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index a91863ad..bffccd66 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -110,15 +110,16 @@ parser.add_argument('--level_of_loading_over_day_path', default=None, help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") + parser.add_argument('--rotation-filter', default=None, + help="Use json. data with rotation ids") + parser.add_argument('--rotation-filter-variable', default=None, + help="Add option for filtering the rotations in the schedule") args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True - args.rotation_filter_variable = None - args.rotation_filter = None - util.set_options_from_config(args, check=True, verbose=False) args.output_directory = Path(args.output_directory) / ( From 98f20e48f995c12f584772d0b847bd44f8d87f23 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 20 Jan 2023 19:49:06 +0100 Subject: [PATCH 500/802] change keyword from pv_power to nominal_power --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 5446cd9b..95fa53dd 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -520,7 +520,7 @@ def generate_scenario(self, args): # add PV component photovoltaics[gc_name] = { "parent": gc_name, - "nominal_power": feed_in.get("pv_power", 0) + "nominal_power": feed_in.get("nominal_power", 0) } # add external load if exists From 12f5a6296fe788448d08e0092b7692ad422c34c6 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Mon, 23 Jan 2023 13:15:21 +0100 Subject: [PATCH 501/802] reflect new SpiceEV structure --- .flake8 | 2 +- .gitignore | 3 ++- ebus_toolbox/costs.py | 12 ++++++------ ebus_toolbox/optimization.py | 2 +- ebus_toolbox/report.py | 6 +++--- ebus_toolbox/schedule.py | 6 +++--- 6 files changed, 16 insertions(+), 15 deletions(-) diff --git a/.flake8 b/.flake8 index 7f0a9bd3..c78aaeae 100644 --- a/.flake8 +++ b/.flake8 @@ -1,4 +1,4 @@ [flake8] -exclude = docs,src,data +exclude = docs,src,spice_ev,data max-line-length=100 docstring_style=sphinx diff --git a/.gitignore b/.gitignore index 22889a19..382af8eb 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ data/private_examples data/sim_outputs data/preprocessing_scripts src/ -*.bak \ No newline at end of file +spice_ev/ +*.bak diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index a20b8c7b..bfeb234f 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -34,7 +34,7 @@ def calculate_costs(c_params, scenario, schedule, args): # INVESTMENT COSTS # # VEHICLES - v_types = schedule.scenario["constants"]["vehicle_types"] + v_types = schedule.scenario["components"]["vehicle_types"] for v_type, v_keys in v_types.items(): if schedule.vehicle_type_counts[v_type] > 0: try: @@ -55,7 +55,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_vehicles_annual"] += c_vehicles_vt / c_params["vehicles"][v_type]["lifetime"] # GRID CONNECTION POINTS - gcs = schedule.scenario["constants"]["grid_connectors"] + gcs = schedule.scenario["components"]["grid_connectors"] for gcID in gcs.keys(): # get max. power of grid connector gc_timeseries = getattr(scenario, f"{gcID}_timeseries") @@ -98,7 +98,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_stat_storage"] * c_params["stationary_storage"]["c_maint_stat_storage_per_year"]) # CHARGING INFRASTRUCTURE - cs = schedule.scenario["constants"]["charging_stations"] + cs = schedule.scenario["components"]["charging_stations"] # depot charging stations - each charging bus generates one CS for csID in cs.values(): if csID["type"] == "deps": @@ -154,8 +154,8 @@ def calculate_costs(c_params, scenario, schedule, args): # ELECTRICITY COSTS # - for gcID, gc in scenario.constants.grid_connectors.items(): - pv = sum([pv.nominal_power for pv in scenario.constants.photovoltaics.values() + for gcID, gc in scenario.components.grid_connectors.items(): + pv = sum([pv.nominal_power for pv in scenario.components.photovoltaics.values() if pv.parent == gcID]) timeseries = vars(scenario).get(f"{gcID}_timeseries") @@ -174,7 +174,7 @@ def calculate_costs(c_params, scenario, schedule, args): power_pv_nominal=pv, ) # ToDo: Decide if gc-specific costs should be added to scenario object to use in report.py - # setattr(scenario.constants.grid_connectors[gcID], "costs_electricity", costs_electricity) + # setattr(scenario.components.grid_connectors[gcID], "costs_electricity", costs_electricity) costs["c_el_procurement_annual"] += costs_electricity['power_procurement_costs_per_year'] costs["c_el_power_price_annual"] += costs_electricity['capacity_costs_eur'] costs["c_el_energy_price_annual"] += costs_electricity['commodity_costs_eur_per_year'] diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 6043ae09..72baa6e3 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -14,7 +14,7 @@ def service_optimization(schedule, args): :param args: Command line arguments :type args: argparse.Namespace :return: original and most optimized scenario (highest electrification rate) - :rtype: dict of tuple of schedule and spice_ev.src.scenario + :rtype: dict of tuple of schedule and spice_ev.Scenario :raises Exception: if the charging type of a rotation with negative SoC is not oppb """ common_stations = schedule.get_common_stations(only_opps=True) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index f5f33419..ebc8c34a 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -4,7 +4,7 @@ import datetime import warnings import matplotlib.pyplot as plt -from src.report import aggregate_global_results, plot, generate_reports +from spice_ev.report import aggregate_global_results, plot, generate_reports def generate_gc_power_overview_timeseries(scenario, args): @@ -16,7 +16,7 @@ def generate_gc_power_overview_timeseries(scenario, args): :type args: argparse.Namespace """ - gc_list = list(scenario.constants.grid_connectors.keys()) + gc_list = list(scenario.components.grid_connectors.keys()) with open(args.output_directory / "gc_power_overview_timeseries.csv", "w", newline='') as f: csv_writer = csv.writer(f) @@ -47,7 +47,7 @@ def generate_gc_overview(schedule, scenario, args): """ all_gc_list = list(schedule.stations.keys()) - used_gc_list = list(scenario.constants.grid_connectors.keys()) + used_gc_list = list(scenario.components.grid_connectors.keys()) stations = getattr(schedule, "stations") with open(args.output_directory / "gc_overview.csv", "w", newline='') as f: diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 95fa53dd..38bc9386 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -6,7 +6,7 @@ from ebus_toolbox import util from ebus_toolbox.rotation import Rotation -from src.scenario import Scenario +from spice_ev.scenario import Scenario class Schedule: @@ -381,7 +381,7 @@ def generate_scenario(self, args): :type args: argparse.Namespace :return: A spiceEV Scenario instance that can be run and also collects all simulation outputs. - :rtype: spice_ev.src.Scenario + :rtype: spice_ev.Scenario """ random.seed(args.seed) @@ -648,7 +648,7 @@ def generate_scenario(self, args): "interval": interval.days * 24 * 60 + interval.seconds // 60, "n_intervals": (stop_simulation - start_simulation) // interval }, - "constants": { + "components": { "vehicle_types": vehicle_types_spiceev, "vehicles": vehicles, "grid_connectors": grid_connectors, From 423fbab6217a509b7721e006c000f4fc1c102d10 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 23 Jan 2023 16:21:40 +0100 Subject: [PATCH 502/802] Replace helptext for rf_variable, replace in cfg rf_variable value false with null, improve docstring in rotation_filter method #30 --- data/examples/ebus_toolbox.cfg | 4 ++-- ebus_toolbox/__main__.py | 6 +++--- ebus_toolbox/schedule.py | 9 +++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 3d4fea20..a0908a42 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -61,8 +61,8 @@ ignore_inconsistent_rotations = false # rotation filter variable, options: # exclude: exclude the rotations in the file from the schedule # include: include only the rotations in the file -# false: deactivate function -rotation_filter_variable = false +# null: deactivate function +rotation_filter_variable = null # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index bffccd66..5f432b89 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -111,9 +111,9 @@ help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") parser.add_argument('--rotation-filter', default=None, - help="Use json. data with rotation ids") - parser.add_argument('--rotation-filter-variable', default=None, - help="Add option for filtering the rotations in the schedule") + help='Use json data with rotation ids') + parser.add_argument('--rotation-filter-variable', default=None, choices=['include', 'exclude'], + help='set mode for filtering schedule rotations') args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index fff0d765..61b22b00 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -377,17 +377,18 @@ def get_negative_rotations(self, scenario): def rotation_filter(self, args, rf_list=None): """Edit rotations according to args.rotation_filter_variable. - :param args: Command line arguments + :param args: used arguments are rotation_filter, path to rotation ids, + and rotation_filter_variable that sets mode (options: include, exclude) :type args: argparse.Namespace - :param rf_list: rotation filter list with strings of rotation ids - :type rf_list: list, default: no rotation ids + :param rf_list: rotation filter list with strings of rotation ids (default is None) + :type rf_list: list """ rf_list = rf_list or [] if not args.rotation_filter_variable: return try: with open(args.rotation_filter, encoding='utf-8') as f: - # put rotation_ids from file into rf_list + # read rotation_ids from file into rf_list rf_list += json.load(f, parse_int=str) except FileNotFoundError: print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") From 67c2191a7a890cc8f9760699728c71eedf8512da Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 25 Jan 2023 16:20:47 +0100 Subject: [PATCH 503/802] Fix encoding issue with optimized_stations.json output --- ebus_toolbox/station_optimization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 757c1a87..276b5603 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -177,8 +177,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger.debug("Still not electrified with abs. soc with fast calc") for event in new_events: logger.debug(event.rotation.id) - with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: - json.dump(ele_stations, file, indent=2) + with open(new_ele_stations_path, "w", encoding="utf-8") as file: + json.dump(ele_stations, file,ensure_ascii=False, indent=2) util.print_time() logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( From 197c0c03eb35fe7efc2694e7328dfebd6c096a9c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 30 Jan 2023 10:09:12 +0100 Subject: [PATCH 504/802] Add various track plotting elements --- ebus_toolbox/plot_geoposition.py | 180 ++++++++++++++++++++------- ebus_toolbox/station_optimization.py | 4 +- 2 files changed, 139 insertions(+), 45 deletions(-) diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py index 8b9f5fa8..2aee7543 100644 --- a/ebus_toolbox/plot_geoposition.py +++ b/ebus_toolbox/plot_geoposition.py @@ -105,8 +105,10 @@ args.station_data_path = "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/data/buffered_all_stations.csv" ANIMATION_DURATION_MIN = 480 + + def main(): - pickle_path="vehicle_data_frames.pickle" + pickle_path = "vehicle_data_frames.pickle" with open(str(args.station_data_path), "r", encoding='utf-8') as f: delim = util.get_csv_delim(args.station_data_path) reader = csv.DictReader(f, delimiter=delim) @@ -134,7 +136,8 @@ def main(): for counter, soc in enumerate(soc_data): try: current_time = start_time + counter * time_step - current_trip, found_trip_index = find_current_trip(trips[trip_nr:], current_time) + current_trip, found_trip_index = find_current_trip(trips[trip_nr:], + current_time) trip_nr += found_trip_index rel_time_of_trip = get_rel_time_of_trip(current_time, current_trip) current_station = stations[current_trip.departure_name] @@ -146,11 +149,9 @@ def main(): pass columns = [(v_id, "soc"), (v_id, "lat"), (v_id, "lon")] data = np.array([soc_data, lats, lons]).transpose() - vehicle_data_frames = pd.concat((vehicle_data_frames, pd.DataFrame(data, columns=columns)), - axis=1) - # c += 1 - # if c > 2: - # break + vehicle_data_frames = pd.concat( + (vehicle_data_frames, pd.DataFrame(data, columns=columns)), + axis=1) vehicle_data_frames.columns = pd.MultiIndex.from_tuples(vehicle_data_frames.columns, names=['Vehicle_id', 'Data']) @@ -160,12 +161,13 @@ def main(): else: with open(pickle_path, "rb") as f: print("depickeling") - vehicle_data_frames= pickle.load(f) + vehicle_data_frames = pickle.load(f) stations_to_annotate = {name: stat for name, stat in stations.items() if name in schedule.stations} - vehicle_data_frames = vehicle_data_frames.iloc[:24*60,:] - plot_merge_animate_battery(vehicle_data_frames, station_data=stations_to_annotate, save=False, repeat=False) + vehicle_data_frames = vehicle_data_frames.iloc[:24 * 60, :] + plot_merge_animate_battery(vehicle_data_frames, vehicle_black=True, track_black=False, + station_data=stations_to_annotate, save=False, repeat=False) class station: @@ -190,7 +192,14 @@ def get_sorted_rotations(v_id, schedule): def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, - save=False, repeat=True, vehicle_black=False, track_black=True): + save=False, repeat=True, vehicle_black=False, track_black=True, + track_method="min"): + data.xs("lat", level="Data", axis=1) + lat_boundary = (data.xs("lat", level="Data", axis=1).min().min(), + data.xs("lat", level="Data", axis=1).max().max()) + lon_boundary = (data.xs("lon", level="Data", axis=1).min().min(), + data.xs("lon", level="Data", axis=1).max().max()) + v_max = 1 v_min = 0 fig = plt.figure(figsize=(14, 8)) @@ -199,11 +208,6 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, sub2 = fig.add_subplot(111) ax = plt.gca() - data.xs("lat", level="Data", axis=1) - lat_boundary = (data.xs("lat", level="Data", axis=1).min().min(), - data.xs("lat", level="Data", axis=1).max().max()) - lon_boundary = (data.xs("lon", level="Data", axis=1).min().min(), - data.xs("lon", level="Data", axis=1).max().max()) # Get all the vehicle ids from data vehicles = list(data.columns.levels[0]) @@ -213,20 +217,75 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, # above the position. # ToDo for soc printing soc handling needs to be implemented so for every position only a # single soc is printed - for v_id in vehicles: - if track_black: + round_nr = 3 + stacked_array_unique = make_unique_data(vehicles, data, track_black, track_method) + x_org= stacked_array_unique[0, :].copy() + y_org= stacked_array_unique[1, :].copy() + + stacked_array_unique[0, :] = stacked_array_unique[0, :] - min(stacked_array_unique[0, :]) + stacked_array_unique[1, :] = stacked_array_unique[1, :] - min(stacked_array_unique[1, :]) + stacked_array_unique[0, :] = stacked_array_unique[0, :] + stacked_array_unique[0, :] = stacked_array_unique[0, :] * 10 ** round_nr + stacked_array_unique[1, :] = stacked_array_unique[1, :] * 10 ** round_nr + ############## + # from scipy.ndimage import gaussian_filter as gauss + # fig = plt.figure(figsize=(8, 8)) + # + # fig.suptitle('Vehicle Tracking', fontsize=14) + # sub2 = fig.add_subplot(111) + # ax = plt.gca() + # + # stacked_array_pic = make_unique_data(vehicles, data, track_black, track_method, + # round_nr=round_nr) + # + # x = (stacked_array_pic[0, :] * 10 ** round_nr).astype(int) + # X = x - np.min(x) + # y = (stacked_array_pic[1, :] * 10 ** round_nr).astype(int) + # Y = y - np.min(y) + # z = stacked_array_pic[2, :] + # idx1 = X + # idx2 = Y + # grid_data = z + # grid = np.ones((np.max(Y) + 1, np.max(X) + 1)) + # grid[idx2, idx1] = grid_data + # ax.imshow(gauss(grid, 10)) + # ############################# + # fig = plt.figure(figsize=(14, 8)) + # + # fig.suptitle('Vehicle Tracking', fontsize=14) + # + # sub2 = fig.add_subplot(111) + # ax = plt.gca() + # + # x=stacked_array_unique[0,:] + # y=stacked_array_unique[1,:] + # z=stacked_array_unique[2,:] + # + # steps=500 + # X = np.linspace(stacked_array_unique[0, :].min(), stacked_array_unique[0, :].max(), steps) + # Y = np.linspace(stacked_array_unique[1, :].min(), stacked_array_unique[1, :].max(), steps) + # from scipy.interpolate import griddata + # Z = griddata((x, y), z,((X[None, :], Y[:, None])), method='linear') + # contour = sub2.contourf(X, Y, Z) + # ######################## + # ax.imshow(Z) + # ######################## + + if track_black: + for v_id in vehicles: plot_dict = dict(color=(0.9, 0.9, 0.9), alpha=1) lns2_1 = sub2.plot(data[v_id]['lat'], data[v_id]['lon'], **plot_dict, linestyle='-', linewidth=2) - else: - plot_dict = dict(c=data[v_id]['soc'] * 100, alpha=0.01) - lns2_1 = sub2.scatter(data[v_id]['lat'], data[v_id]['lon'], - **plot_dict, linestyle='-', - linewidth=0, vmin=v_min, vmax=v_max) - lns2_1.set_clim(vmin=v_min, vmax=v_max) + else: + plot_dict = dict(c=stacked_array_unique[2, :] * 1, alpha=0.1) + lns2_1 = sub2.scatter(stacked_array_unique[0, :], stacked_array_unique[1, :], + **plot_dict, linestyle='-', + linewidth=0, vmin=v_min, vmax=v_max) + lns2_1.set_clim(vmin=v_min, vmax=v_max) # Helper plot so we can plot a colorbar aftwards, not possible with only line plot + plot_dict = dict() lns2_1 = sub2.scatter([], [], **plot_dict, linestyle='-', linewidth=0, vmin=v_min, vmax=v_max) @@ -239,9 +298,10 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, # Plot Station Names if station_data: for station in station_data.values(): + xy=((station.lat-np.min(x_org))*10**round_nr, (station.lon-np.min(y_org))*10**round_nr) ax.annotate(station.name, - xy=(station.lat, station.lon), xycoords='data', fontsize=8, ha='center') - ax.plot(station.lat, station.lon, 'ko') + xy=xy, xycoords='data', fontsize=8, ha='center') + ax.plot(xy[0], xy[1], 'ko', zorder=100) artist_objects = [] for _ in vehicles: @@ -258,10 +318,11 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, time_annotation_box = [AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', fontsize=15)] ax.add_artist(time_annotation_box[0]) - hover_texts= [str(v_id) for v_id in vehicles] + hover_texts = [str(v_id) for v_id in vehicles] + def animate(i, data, counter=[]): roll_v = 1 - len_v = 2 + len_v = 1 ax = plt.gca() vehicles = list(data.columns.levels[0]) if not counter: @@ -269,7 +330,7 @@ def animate(i, data, counter=[]): else: counter[0] += 1 i = counter[0] - start_index = i * roll_v+8*60 + start_index = i * roll_v + 8 * 60 end_index = start_index + len_v ax.artists.remove(time_annotation_box[0]) @@ -279,13 +340,11 @@ def animate(i, data, counter=[]): ax.add_artist(time_annotation_box[0]) for k, v_id in enumerate(vehicles): - artist_objects[k].remove() - mean_soc = 0 + mean_soc = data[v_id]["soc"][start_index:end_index].mean() if vehicle_black: plot_dict = dict(color=(0, 0, 0)) else: - mean_soc = data[v_id]["soc"][start_index:end_index].mean() l = len(data[v_id]["lat"][start_index:end_index]) plot_dict = dict(c=mean_soc * np.ones(l)) artist_objects[k] = sub2.scatter(data[v_id]["lat"][start_index:end_index], @@ -311,8 +370,8 @@ def animate(i, data, counter=[]): sub2.set_ylabel('Position') sub2.set_xlabel('Position') - fig.canvas.mpl_connect("motion_notify_event",lambda event: hover_for_scatter( - event, fig,ax, artist_objects, hover_texts)) + fig.canvas.mpl_connect("motion_notify_event", lambda event: hover_for_scatter( + event, fig, ax, artist_objects, hover_texts)) # Toggle save for saving if save: myAnimation.save('SOC_animation.gif', writer='imagemagick') @@ -321,15 +380,53 @@ def animate(i, data, counter=[]): plt.show() -def hover_for_scatter(event, fig, ax, plot_points: typing.Iterable[matplotlib.lines.Line2D], hover_texts: typing.Iterable[str], annotations=[]): + +def make_unique_data(vehicles, data, track_black, track_method, round_nr=None): + v_iter = iter(vehicles) + v_id = next(v_iter) + data = pd.DataFrame(data) + if not round_nr: + r = lambda x: x + else: + r = lambda i: round(i, round_nr) + stacked_array = np.array((r(data[v_id]['lat']), r(data[v_id]['lon']), data[v_id]['soc'])) + for v_id in v_iter: + stacked_array = np.hstack( + (stacked_array, (r(data[v_id]['lat']), r(data[v_id]['lon']), data[v_id]['soc']))) + # stacked_array has all vehicle socs and geo positions in + unique_mask = np.unique(stacked_array[0:2, :], axis=1, return_index=True)[1] + stacked_array_unique = stacked_array[:, unique_mask] + + # find soc data for stacked array depending on method. Since its only needed if the track is not black check this as well + + if not track_black: + apply_function = None + if track_method == "mean": + apply_function = np.mean + elif track_method == "max": + apply_function = np.max + else: + apply_function = np.min + + for geo_index in range(len(stacked_array_unique)): + geo_loc = stacked_array_unique[0:2, geo_index] + found_positions = np.all([stacked_array[0:2, :].T == geo_loc], axis=0)[:, 0] + fill_value = apply_function(stacked_array[2, found_positions]) + stacked_array_unique[2, geo_index] = fill_value + + return stacked_array_unique + + +def hover_for_scatter(event, fig, ax, plot_points: typing.Iterable[matplotlib.lines.Line2D], + hover_texts: typing.Iterable[str], annotations=[]): """Called when user hovers over plot. Checks if user hovers over point. If so, delete old annotation and create new one with relevant info from the hover_texts list. If user does not hover over point, remove annotation, if any. """ - if len(annotations)==0: + if len(annotations) == 0: annotations.append(None) - for i,points in enumerate(plot_points): + for i, points in enumerate(plot_points): if points and event.inaxes == ax: # results shown, mouse within plot: get event info # cont: any points hovered? @@ -344,12 +441,12 @@ def hover_for_scatter(event, fig, ax, plot_points: typing.Iterable[matplotlib.li text = hover_texts[i] # # remove old annotation - if annotations and annotations[0]: + if annotations and annotations[0]: annotations[0].remove() - annotations[0]=None + annotations[0] = None # create new annotation - annotations[0]= ax.annotate( + annotations[0] = ax.annotate( text, xy=(xy[ind[0]][0], xy[ind[0]][1]), xytext=(-20, 20), @@ -360,9 +457,6 @@ def hover_for_scatter(event, fig, ax, plot_points: typing.Iterable[matplotlib.li fig.canvas.draw() - - - def find_current_trip(trips, current_time): for i, trip in enumerate(trips): try: diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 757c1a87..276b5603 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -177,8 +177,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger.debug("Still not electrified with abs. soc with fast calc") for event in new_events: logger.debug(event.rotation.id) - with open(new_ele_stations_path, "w", encoding="utf-8", ) as file: - json.dump(ele_stations, file, indent=2) + with open(new_ele_stations_path, "w", encoding="utf-8") as file: + json.dump(ele_stations, file,ensure_ascii=False, indent=2) util.print_time() logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( From e02dca17dd0997a9fd0a421063a05b75284ff10f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 30 Jan 2023 10:44:19 +0100 Subject: [PATCH 505/802] Bring base case to working condition --- ebus_toolbox/plot_geoposition.py | 83 ++++++++++++++++---------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py index 2aee7543..4a902988 100644 --- a/ebus_toolbox/plot_geoposition.py +++ b/ebus_toolbox/plot_geoposition.py @@ -14,20 +14,10 @@ import ebus_toolbox.schedule import spiceev.scenario -import requests -import json -from time import sleep -import io - -import matplotlib.pyplot as plt -import pandas as pd -from matplotlib.colors import LinearSegmentedColormap import numpy as np import matplotlib.pyplot as plt import pandas as pd -import math - # Mathematical function we need to plot from matplotlib.colors import LinearSegmentedColormap import matplotlib @@ -165,9 +155,11 @@ def main(): stations_to_annotate = {name: stat for name, stat in stations.items() if name in schedule.stations} - vehicle_data_frames = vehicle_data_frames.iloc[:24 * 60, :] - plot_merge_animate_battery(vehicle_data_frames, vehicle_black=True, track_black=False, - station_data=stations_to_annotate, save=False, repeat=False) + + vehicle_data_frames = vehicle_data_frames.iloc[:24*60,:] + plot_merge_animate_battery(vehicle_data_frames, station_data=stations_to_annotate, + soc_threshold=0.2,track_black=False, vehicle_black=True, + save=False, repeat=False) class station: @@ -193,13 +185,15 @@ def get_sorted_rotations(v_id, schedule): def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, save=False, repeat=True, vehicle_black=False, track_black=True, - track_method="min"): + track_method="min", soc_threshold=1.0): + data.xs("lat", level="Data", axis=1) lat_boundary = (data.xs("lat", level="Data", axis=1).min().min(), data.xs("lat", level="Data", axis=1).max().max()) lon_boundary = (data.xs("lon", level="Data", axis=1).min().min(), data.xs("lon", level="Data", axis=1).max().max()) + v_max = 1 v_min = 0 fig = plt.figure(figsize=(14, 8)) @@ -212,21 +206,28 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, # Get all the vehicle ids from data vehicles = list(data.columns.levels[0]) + # Filter data for relevant SOCs + for v_id in vehicles: + if data[v_id]['soc'].min()>soc_threshold: + data=data.drop(v_id,axis=1) + data.columns = data.columns.remove_unused_levels() + vehicles = list(data.columns.levels[0]) + # Plot track onto canvas via line which doesnt allow soc printing # or via scatter plot. With a scatter plot the points can take the color of the soc which drove # above the position. - # ToDo for soc printing soc handling needs to be implemented so for every position only a - # single soc is printed + + round_nr = 3 - stacked_array_unique = make_unique_data(vehicles, data, track_black, track_method) + stacked_array_unique = make_unique_data(vehicles, data, track_method) x_org= stacked_array_unique[0, :].copy() y_org= stacked_array_unique[1, :].copy() - - stacked_array_unique[0, :] = stacked_array_unique[0, :] - min(stacked_array_unique[0, :]) - stacked_array_unique[1, :] = stacked_array_unique[1, :] - min(stacked_array_unique[1, :]) - stacked_array_unique[0, :] = stacked_array_unique[0, :] - stacked_array_unique[0, :] = stacked_array_unique[0, :] * 10 ** round_nr - stacked_array_unique[1, :] = stacked_array_unique[1, :] * 10 ** round_nr + # + # stacked_array_unique[0, :] = stacked_array_unique[0, :] - min(stacked_array_unique[0, :]) + # stacked_array_unique[1, :] = stacked_array_unique[1, :] - min(stacked_array_unique[1, :]) + # stacked_array_unique[0, :] = stacked_array_unique[0, :] + # stacked_array_unique[0, :] = stacked_array_unique[0, :] * 10 ** round_nr + # stacked_array_unique[1, :] = stacked_array_unique[1, :] * 10 ** round_nr ############## # from scipy.ndimage import gaussian_filter as gauss # fig = plt.figure(figsize=(8, 8)) @@ -278,7 +279,7 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, **plot_dict, linestyle='-', linewidth=2) else: - plot_dict = dict(c=stacked_array_unique[2, :] * 1, alpha=0.1) + plot_dict = dict(c=stacked_array_unique[2, :] * 1, alpha=0.2) lns2_1 = sub2.scatter(stacked_array_unique[0, :], stacked_array_unique[1, :], **plot_dict, linestyle='-', linewidth=0, vmin=v_min, vmax=v_max) @@ -298,7 +299,8 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, # Plot Station Names if station_data: for station in station_data.values(): - xy=((station.lat-np.min(x_org))*10**round_nr, (station.lon-np.min(y_org))*10**round_nr) + # xy=((station.lat-np.min(x_org))*10**round_nr, (station.lon-np.min(y_org))*10**round_nr) + xy=(station.lat, station.lon) ax.annotate(station.name, xy=xy, xycoords='data', fontsize=8, ha='center') ax.plot(xy[0], xy[1], 'ko', zorder=100) @@ -362,7 +364,7 @@ def animate(i, data, counter=[]): ax.axis('off') # create animation using the animate() function - myAnimation = animation.FuncAnimation(fig, + my_animation = animation.FuncAnimation(fig, lambda i: animate(i, data), frames=ANIMATION_DURATION_MIN, interval=50, blit=False, repeat=repeat) @@ -374,14 +376,14 @@ def animate(i, data, counter=[]): event, fig, ax, artist_objects, hover_texts)) # Toggle save for saving if save: - myAnimation.save('SOC_animation.gif', writer='imagemagick') + my_animation.save('SOC_animation.gif', writer='imagemagick') fig.tight_layout() plt.show() -def make_unique_data(vehicles, data, track_black, track_method, round_nr=None): +def make_unique_data(vehicles, data, track_method, round_nr=None): v_iter = iter(vehicles) v_id = next(v_iter) data = pd.DataFrame(data) @@ -399,20 +401,19 @@ def make_unique_data(vehicles, data, track_black, track_method, round_nr=None): # find soc data for stacked array depending on method. Since its only needed if the track is not black check this as well - if not track_black: - apply_function = None - if track_method == "mean": - apply_function = np.mean - elif track_method == "max": - apply_function = np.max - else: - apply_function = np.min + apply_function = None + if track_method == "mean": + apply_function = np.mean + elif track_method == "max": + apply_function = np.max + else: + apply_function = np.min - for geo_index in range(len(stacked_array_unique)): - geo_loc = stacked_array_unique[0:2, geo_index] - found_positions = np.all([stacked_array[0:2, :].T == geo_loc], axis=0)[:, 0] - fill_value = apply_function(stacked_array[2, found_positions]) - stacked_array_unique[2, geo_index] = fill_value + for geo_index in range(len(stacked_array_unique)): + geo_loc = stacked_array_unique[0:2, geo_index] + found_positions = np.all([stacked_array[0:2, :].T == geo_loc], axis=0)[:, 0] + fill_value = apply_function(stacked_array[2, found_positions]) + stacked_array_unique[2, geo_index] = fill_value return stacked_array_unique From e42ebbdef63399198db5e9df03febd4dd135c389 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 1 Feb 2023 10:52:34 +0100 Subject: [PATCH 506/802] Change for Berlin data --- ebus_toolbox/plot_geoposition.py | 110 ++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 37 deletions(-) diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py index 4a902988..4b101334 100644 --- a/ebus_toolbox/plot_geoposition.py +++ b/ebus_toolbox/plot_geoposition.py @@ -83,22 +83,22 @@ [1, 255 / 255, 45 / 255]]} rli_blue_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) -with open("schedule_opt.pickle", "rb") as file: +with open("schedule_rebased_BVG_BFI.pickle", "rb") as file: schedule = pickle.load(file) -with open("scenario_opt.pickle", "rb") as file: +with open("scenario_rebased_BVG_BFI.pickle", "rb") as file: scenario = pickle.load(file) -with open("args_buffered_all_depb.pickle", "rb") as file: +with open("args_rebased_BVG_BFI.pickle", "rb") as file: args = pickle.load(file) -args.station_data_path = "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/data/buffered_all_stations.csv" +args.station_data_path = "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/Haltestellen.csv" ANIMATION_DURATION_MIN = 480 def main(): - pickle_path = "vehicle_data_frames.pickle" + pickle_path = None #"vehicle_data_frames.pickle" with open(str(args.station_data_path), "r", encoding='utf-8') as f: delim = util.get_csv_delim(args.station_data_path) reader = csv.DictReader(f, delimiter=delim) @@ -115,8 +115,6 @@ def main(): if not pickle_path: vehicle_data_frames = pd.DataFrame() - c = 0 - for v_id, soc_data in scenario.vehicle_socs.items(): rotations = get_sorted_rotations(v_id, schedule) trips = [trip for rot in rotations for trip in rot.trips] @@ -130,8 +128,15 @@ def main(): current_time) trip_nr += found_trip_index rel_time_of_trip = get_rel_time_of_trip(current_time, current_trip) - current_station = stations[current_trip.departure_name] - next_station = stations[current_trip.arrival_name] + try: + current_station = stations[current_trip.departure_name] + except: + current_station = last_station + try: + next_station = stations[current_trip.arrival_name] + except: + next_station = current_station + last_station=current_station lat, lon = current_station.get_lat_lon(next_station, rel_time_of_trip) lats.append(lat) lons.append(lon) @@ -158,8 +163,8 @@ def main(): vehicle_data_frames = vehicle_data_frames.iloc[:24*60,:] plot_merge_animate_battery(vehicle_data_frames, station_data=stations_to_annotate, - soc_threshold=0.2,track_black=False, vehicle_black=True, - save=False, repeat=False) + soc_threshold=1,track_black=False, vehicle_black=True, + save=False, repeat=True) class station: @@ -279,7 +284,7 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, **plot_dict, linestyle='-', linewidth=2) else: - plot_dict = dict(c=stacked_array_unique[2, :] * 1, alpha=0.2) + plot_dict = dict(c=stacked_array_unique[2, :] * 1, alpha=0.8) lns2_1 = sub2.scatter(stacked_array_unique[0, :], stacked_array_unique[1, :], **plot_dict, linestyle='-', linewidth=0, vmin=v_min, vmax=v_max) @@ -302,7 +307,7 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, # xy=((station.lat-np.min(x_org))*10**round_nr, (station.lon-np.min(y_org))*10**round_nr) xy=(station.lat, station.lon) ax.annotate(station.name, - xy=xy, xycoords='data', fontsize=8, ha='center') + xy=xy, xycoords='data', xytext=(0, 5), textcoords='offset points', fontsize=8, ha='center') ax.plot(xy[0], xy[1], 'ko', zorder=100) artist_objects = [] @@ -317,6 +322,7 @@ def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, sub2.set_xlabel('Position') text_box = TextArea(data.index[0]) + time_annotation_box = [AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', fontsize=15)] ax.add_artist(time_annotation_box[0]) @@ -334,40 +340,64 @@ def animate(i, data, counter=[]): i = counter[0] start_index = i * roll_v + 8 * 60 end_index = start_index + len_v - - ax.artists.remove(time_annotation_box[0]) + try: + ax.artists.remove(time_annotation_box[0]) + except: + return artist_objects text_box = TextArea(data.index[start_index]) time_annotation_box[0] = AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', fontsize=15) ax.add_artist(time_annotation_box[0]) - - for k, v_id in enumerate(vehicles): - artist_objects[k].remove() - mean_soc = data[v_id]["soc"][start_index:end_index].mean() - if vehicle_black: - plot_dict = dict(color=(0, 0, 0)) - else: - l = len(data[v_id]["lat"][start_index:end_index]) - plot_dict = dict(c=mean_soc * np.ones(l)) - artist_objects[k] = sub2.scatter(data[v_id]["lat"][start_index:end_index], - data[v_id]["lon"][start_index:end_index], - **plot_dict, - vmin=0, vmax=1, - linestyle='-', - linewidth=0, zorder=50) - hover_texts[k] = (v_id, str(round(mean_soc, 3))) - - if end_index >= len(data[v_id]["soc"]): + # + # + + plot_dict = dict(color=(0, 0, 0)) + artist_objects[0].remove() + lat_data=data.xs("lat", level="Data", axis=1).iloc[start_index:end_index].values + lon_data=data.xs("lon", level="Data", axis=1).iloc[start_index:end_index].values + soc_data=data.xs("soc", level="Data", axis=1).iloc[start_index:end_index].mean().values + if vehicle_black: + plot_dict = dict(color=(0, 0, 0)) + else: + plot_dict = dict(c=soc_data) + artist_objects[0] = sub2.scatter(lat_data, + lon_data, + **plot_dict, + vmin=0, vmax=1, + linestyle='-', + linewidth=0, zorder=50) + + # + # + # for k, v_id in enumerate(vehicles): + # artist_objects[k].remove() + # mean_soc = data[v_id]["soc"][start_index:end_index].mean() + # if vehicle_black: + # plot_dict = dict(color=(0, 0, 0)) + # else: + # l = len(data[v_id]["lat"][start_index:end_index]) + # plot_dict = dict(c=mean_soc * np.ones(l)) + # artist_objects[k] = sub2.scatter(data[v_id]["lat"][start_index:end_index], + # data[v_id]["lon"][start_index:end_index], + # **plot_dict, + # vmin=0, vmax=1, + # linestyle='-', + # linewidth=0, zorder=50) + # hover_texts[k] = (v_id, str(round(mean_soc, 3))) + + if end_index >= len(data): counter[0] = 0 return artist_objects ax.axis('off') # create animation using the animate() function + my_animation = animation.FuncAnimation(fig, lambda i: animate(i, data), frames=ANIMATION_DURATION_MIN, - interval=50, blit=False, repeat=repeat) + interval=15, blit=False, repeat=repeat) + # sub2.set_ylabel('Position') sub2.set_xlabel('Position') @@ -380,8 +410,12 @@ def animate(i, data, counter=[]): fig.tight_layout() - plt.show() - + def on_close(event): + plt.close() + print('Closed Figure!') + fig.canvas.mpl_connect('close_event',lambda event:on_close(event)) + plt.show(block=True) + print("stopped") def make_unique_data(vehicles, data, track_method, round_nr=None): v_iter = iter(vehicles) @@ -395,6 +429,7 @@ def make_unique_data(vehicles, data, track_method, round_nr=None): for v_id in v_iter: stacked_array = np.hstack( (stacked_array, (r(data[v_id]['lat']), r(data[v_id]['lon']), data[v_id]['soc']))) + stacked_array = stacked_array.astype(float) # stacked_array has all vehicle socs and geo positions in unique_mask = np.unique(stacked_array[0:2, :], axis=1, return_index=True)[1] stacked_array_unique = stacked_array[:, unique_mask] @@ -471,8 +506,9 @@ def find_current_trip(trips, current_time): def get_rel_time_of_trip(current_time: datetime.datetime, current_trip: 'ebus_toolbox.trip.Trip'): + trip_time= (current_trip.arrival_time - current_trip.departure_time) rel_time = (current_time - current_trip.departure_time) / \ - (current_trip.arrival_time - current_trip.departure_time) + max(trip_time,datetime.timedelta(minutes=1)) return min(1, max(rel_time, 0)) From 5f83824a4ca4a02d955289c33f749b199f0788f0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 1 Feb 2023 17:21:44 +0100 Subject: [PATCH 507/802] Change import calls to include ebus_toolbox package name, so sphinx doc works properly --- docs/source/conf.py | 16 ++++++++++++++-- ebus_toolbox/optimizer_config.py | 0 ebus_toolbox/plot_geoposition.py | 9 +++++---- ebus_toolbox/station_optimizer.py | 5 ++--- 4 files changed, 21 insertions(+), 9 deletions(-) delete mode 100644 ebus_toolbox/optimizer_config.py diff --git a/docs/source/conf.py b/docs/source/conf.py index 7e98ff01..5d427e1e 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,11 +9,23 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. +# for example + + +#If conf.py is located in this directory, +# +#D:\\Projects\MyProject\Docs\source # +#and the project's Python modules are in +# +#D:\\Projects\MyProject\SourceCode, + import os import sys -sys.path.insert(0, os.path.abspath('..')) - +import pathlib +sys.path.insert(0, os.path.abspath('../../')) +sys.path.insert(0, pathlib.Path(__file__).parents[2].resolve().as_posix()) +sys.path.insert(0, os.path.abspath('C:/Users/paul.scheer/Python/spiceev')) # -- Project information ----------------------------------------------------- diff --git a/ebus_toolbox/optimizer_config.py b/ebus_toolbox/optimizer_config.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py index 4b101334..cb13cab6 100644 --- a/ebus_toolbox/plot_geoposition.py +++ b/ebus_toolbox/plot_geoposition.py @@ -1,7 +1,7 @@ """ Module to implement plotting functionality of busses with georeferences""" import datetime import typing - +import pathlib from matplotlib.offsetbox import TextArea, AnnotationBbox import ebus_toolbox.util as util @@ -83,13 +83,14 @@ [1, 255 / 255, 45 / 255]]} rli_blue_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) -with open("schedule_rebased_BVG_BFI.pickle", "rb") as file: +f_path=pathlib.Path(__file__).parent.parent +with open(f_path / "schedule_rebased_BVG_BFI.pickle", "rb") as file: schedule = pickle.load(file) -with open("scenario_rebased_BVG_BFI.pickle", "rb") as file: +with open(f_path / "scenario_rebased_BVG_BFI.pickle", "rb") as file: scenario = pickle.load(file) -with open("args_rebased_BVG_BFI.pickle", "rb") as file: +with open(f_path / "args_rebased_BVG_BFI.pickle", "rb") as file: args = pickle.load(file) args.station_data_path = "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/Haltestellen.csv" diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index c37a6137..b3aae32a 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -9,10 +9,9 @@ import numpy as np -import optimizer_util as util +import ebus_toolbox.optimizer_util as util from src import scenario -import schedule -from ebus_toolbox import report, rotation +from ebus_toolbox import report, rotation, schedule class StationOptimizer: From 555aa477a9bf8b94098d0c7ff29c69088ca00876 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 3 Feb 2023 12:08:44 +0100 Subject: [PATCH 508/802] Add first rst files to docs source --- docs/_static/style.css | 16 ++++ docs/source/conf.py | 4 +- docs/source/ebus_toolbox.rst | 117 ++++++++++++++++++++++++++ docs/source/getting_started.rst | 31 +++++++ docs/source/index.rst | 9 +- docs/source/modes.rst | 24 ++++++ docs/source/modules.rst | 7 ++ docs/source/simulation_parameters.rst | 73 ++++++++++++++++ 8 files changed, 276 insertions(+), 5 deletions(-) create mode 100644 docs/source/ebus_toolbox.rst create mode 100644 docs/source/getting_started.rst create mode 100644 docs/source/modes.rst create mode 100644 docs/source/modules.rst create mode 100644 docs/source/simulation_parameters.rst diff --git a/docs/_static/style.css b/docs/_static/style.css index b07bdb1b..0f9e565d 100644 --- a/docs/_static/style.css +++ b/docs/_static/style.css @@ -1,3 +1,19 @@ .wy-nav-content { max-width: none; } + +/* override table width restrictions */ +.wy-table-responsive table td, .wy-table-responsive table th { + /* !important prevents the common CSS stylesheets from + overriding this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; +} + +.wy-table-responsive { + overflow: visible !important; +} + +table { + table-layout: auto; + width: 800px; +} \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 5d427e1e..56dbe2a0 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -42,7 +42,7 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary','sphinx.ext.autosectionlabel'] # Add any paths that contain templates here, relative to this directory. templates_path = [] @@ -67,5 +67,5 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ['../_static'] html_css_files = ['style.css'] diff --git a/docs/source/ebus_toolbox.rst b/docs/source/ebus_toolbox.rst new file mode 100644 index 00000000..cef1ada6 --- /dev/null +++ b/docs/source/ebus_toolbox.rst @@ -0,0 +1,117 @@ +ebus\_toolbox package +===================== + +Submodules +---------- + +ebus\_toolbox.consumption module +-------------------------------- + +.. automodule:: ebus_toolbox.consumption + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.costs module +-------------------------- + +.. automodule:: ebus_toolbox.costs + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.optimization module +--------------------------------- + +.. automodule:: ebus_toolbox.optimization + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.optimizer\_util module +------------------------------------ + +.. automodule:: ebus_toolbox.optimizer_util + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.plot\_geoposition module +-------------------------------------- + +.. automodule:: ebus_toolbox.plot_geoposition + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.report module +--------------------------- + +.. automodule:: ebus_toolbox.report + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.rotation module +----------------------------- + +.. automodule:: ebus_toolbox.rotation + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.schedule module +----------------------------- + +.. automodule:: ebus_toolbox.schedule + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.simulate module +----------------------------- + +.. automodule:: ebus_toolbox.simulate + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.station\_optimization module +------------------------------------------ + +.. automodule:: ebus_toolbox.station_optimization + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.station\_optimizer module +--------------------------------------- + +.. automodule:: ebus_toolbox.station_optimizer + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.trip module +------------------------- + +.. automodule:: ebus_toolbox.trip + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.util module +------------------------- + +.. automodule:: ebus_toolbox.util + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: ebus_toolbox + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst new file mode 100644 index 00000000..70d51474 --- /dev/null +++ b/docs/source/getting_started.rst @@ -0,0 +1,31 @@ +Getting Started +=============== + +The eBus-Toolbox assists the user in analysing and optimising electrified bus fleets and schedules. + +.. _installation: + +Installation +------------ + +At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an in-depth SOC analysis. + +To try it out, first clone this repository and then install the required packages to your current environment by running + +`pip install -r requirements.txt` + +Now you can start the eBus Toolbox module with all configurations stored at `data/configs/ebus_toolbox.cfg` via the command + +``python -m ebus_toolbox --config data/configs/ebus_toolbox.cfg`` + +The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. + +To run the eBus Toolbox with your own `schedule.csv` (see details [below](#input-data)) file and default configurations run + +`python -m ebus_toolbox --input_schedule path/to/schedule.csv` + +Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. + + +General Concept +--------------- diff --git a/docs/source/index.rst b/docs/source/index.rst index 8a3e2313..1e0da5f5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -4,15 +4,18 @@ contain the root `toctree` directive. Welcome to the eBus-Toolbox's documentation! -======================================== +============================================ -This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies. +This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies. .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Contents: + getting_started + modes + simulation_parameters Indices and tables diff --git a/docs/source/modes.rst b/docs/source/modes.rst new file mode 100644 index 00000000..7458fcc8 --- /dev/null +++ b/docs/source/modes.rst @@ -0,0 +1,24 @@ +Modes of the eBus-Toolbox +========================= + +The eBus-Toolbox assists the user in analysing and optimising electrified bus fleets and schedules. Besides a simple simulation run, several +different modes support the user in finding optimal solutions for their eBus-System. Supported Modes are + +* simple simulation +* negative depot to opportunity charger +* negative opportunity to depot charger +* station optimization + + +simple simulation +----------------- +The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started` + +negative depot to opportunity charger +------------------------------------- + +negative opportunity to depot charger +------------------------------------- + +station optimization +-------------------- \ No newline at end of file diff --git a/docs/source/modules.rst b/docs/source/modules.rst new file mode 100644 index 00000000..8278aeee --- /dev/null +++ b/docs/source/modules.rst @@ -0,0 +1,7 @@ +ebus_toolbox +============ + +.. toctree:: + :maxdepth: 4 + + ebus_toolbox diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst new file mode 100644 index 00000000..f5db05bd --- /dev/null +++ b/docs/source/simulation_parameters.rst @@ -0,0 +1,73 @@ +Simulation Parameters +===================== + +The simulation of an eBus-Sytem relies on a variety of simulation parameters. +The eBus-Toolbox provides most of them as default values. Depending on specific needs adjusting +these values can increase the accuracy of the simulation outputs. The eBus-Toolbox input files are described +in detail in the following subsections as well as their default parameters. +When providing the user defined input files, the user should make sure the files are either 'utf-8' +encoded or not contain regional characters. + +Configuration +------------- + +Schedule +-------- + +To analyze your own electric bus schedule, the data needs to be provided as a .csv file where each row contains the details of a single trip of that schedule. Find the details about the various columns in this file below. The first table lists the **mandatory** columns while the second one (tbd) lists optional parameters. Refer to `data/examples/trips.csv` for an example. + +.. list-table:: schedule mandatory input + :widths: 150 300 150 + :header-rows: 1 + + * - Column Name + - Description + - Example + * - rotation_id + - Unique alphanumeric ID to identify rotations + - 27312 + * - departure_name + - Name of the station the trip starts at + - Warschauer Straße + * - departure_time + - Date and Time at which bus starts trip + - 2022-03-13T10:25 + * - arrival_name + - Name of the station the trip ends at + - Ostbahnhof Berlin + * - arrival_time + - Date and Time at which bus completes trip (e.g. yyyy-mm-ddThh:mm[:ss]) + - 2022-03-13T10:30 + * - distance + - Distance traveled in **m** + - 1340 + * - vehicle_type + - | ID of vehicle type defined in vehicle types file. Set path of this file in config + | (see default for reference: `data/examples/vehicle_types.json`) + - some_bus_type + +.. list-table:: schedule optional input + :widths: 150 300 150 + :header-rows: 1 + + * - Column Name + - Description + - Example + * - line + - The bus line + - 512, M10, X11 etc. + * - charging_type + - | The preferred charging type for this trip. + | NOTE: All trips of a rotation need to have the same charging type. + | If omitted, charging type is set according to preferred charging type provided in the config file. + - Options: **depb**, **oppb** + * - temperature + - Temperature of the trip in **degC** + - 25 + * - level_of_loading + - The level of loading of the bus on this trip in between 0 and 1 + - 0.5. + + + + From 78a5c781fcb795982a8a841ba1fbe0e4e8513973 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 6 Feb 2023 22:00:03 +0100 Subject: [PATCH 509/802] Fix bug in rf_list, add warnings #30 --- ebus_toolbox/schedule.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 61b22b00..c37143d0 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -375,7 +375,7 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) def rotation_filter(self, args, rf_list=None): - """Edit rotations according to args.rotation_filter_variable. + """Edits rotations according to args.rotation_filter_variable. :param args: used arguments are rotation_filter, path to rotation ids, and rotation_filter_variable that sets mode (options: include, exclude) @@ -383,15 +383,19 @@ def rotation_filter(self, args, rf_list=None): :param rf_list: rotation filter list with strings of rotation ids (default is None) :type rf_list: list """ - rf_list = rf_list or [] + rf_list = [str(i) for i in rf_list] or [] if not args.rotation_filter_variable: return - try: - with open(args.rotation_filter, encoding='utf-8') as f: - # read rotation_ids from file into rf_list - rf_list += json.load(f, parse_int=str) - except FileNotFoundError: - print(f"Path to rotation filter ({args.rotation_filter}) does not exist.") + if args.rotation_filter_variable and not args.rotation_filter and not rf_list: + warnings.warn("Rotation filter variable is enabled but both json and list are not used.") + return + if args.rotation_filter: + try: + with open(args.rotation_filter, encoding='utf-8') as f: + # read rotation_ids from file into rf_list + rf_list += json.load(f, parse_int=str) + except FileNotFoundError: + warnings.warn(f"Path to rotation filter {args.rotation_filter} is invalid.") # filter out rotations in self.rotations if args.rotation_filter_variable == "exclude": self.rotations = {k: v for k, v in self.rotations.items() if k not in rf_list} From c18f5683c5df4d2a644ebe8c5fdc010220830ff3 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 6 Feb 2023 22:01:01 +0100 Subject: [PATCH 510/802] Make flake8 happy #30 --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index c37143d0..96b5abdd 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -387,7 +387,7 @@ def rotation_filter(self, args, rf_list=None): if not args.rotation_filter_variable: return if args.rotation_filter_variable and not args.rotation_filter and not rf_list: - warnings.warn("Rotation filter variable is enabled but both json and list are not used.") + warnings.warn("Rotation filter variable is enabled but json and list are not used.") return if args.rotation_filter: try: From 2c4dfd7ae78a210ff85b2d87358fd2206d38da40 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 7 Feb 2023 10:28:50 +0100 Subject: [PATCH 511/802] Change config for bvg, add tries for cost and report generation --- data/examples/optimizer.cfg | 17 ++++++------- ebus_toolbox/optimizer_util.py | 21 +++++++++------- ebus_toolbox/station_optimization.py | 2 +- ebus_toolbox/station_optimizer.py | 37 +++++++++++++++------------- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 8ba8904e..65b3d5b8 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -4,7 +4,7 @@ debug_level=1 [SCENARIO] # Use "" for ids and not '' -exclusion_rots = ["6003_6", "7003_7"] +exclusion_rots = [] exclusion_stations= [] # If using inclusion stations, scenario should be rebased inclusion_stations= [] @@ -12,9 +12,9 @@ standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_trans "voltage_level": "MV"} [PICKLE] -schedule=schedule_neg_dep_to_oppb_buffered_only_depot.pickle -scenario=scenario_neg_dep_to_oppb_buffered_only_depot.pickle -args=args_neg_dep_to_oppb_buffered_only_depot.pickle +schedule=schedule_rebased_BVG_BFI.pickle +scenario=scenario_rebased_BVG_BFI.pickle +args=args_rebased_BVG_BFI.pickle # schedule=schedule_buffered_all_oppb.pickle # scenario=scenario_buffered_all_oppb.pickle # args=args_buffered_all_oppb.pickle @@ -32,23 +32,22 @@ charge_eff = 0.95 [OPTIMIZER] # Not optional path to outputs of optimizer -output_path=data/private_examples/332_Buffered/optimization +output_path=data/private_examples/BVG/optimization save_all_results=True # "quick" or "spiceev" solver = quick rebase_scenario = False pickle_rebased= False -pickle_rebased_name=buffered_rebase_all_electrified +pickle_rebased_name=bvg_rebase_all_electrified run_only_neg=False pruning_threshold=0 # "greedy" or "deep" without "" -opt_type = deep +opt_type = greedy # "step-by-step" or "brute" without "" node_choice=step-by-step max_brute_loop=300 estimation_threshold = 0.90 - # Preferring deps leads to a spice_ev simulation with preferred charging type depots # Afterwards all negative rotations are swapped to opportunity chargers and optimized # prefer_deps=True @@ -56,7 +55,7 @@ estimation_threshold = 0.90 # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible # If they are deemed as impossible, they are not optimized but discarded remove_impossible_rots=True -check_for_must_stations=True +check_for_must_stations=False include_must_stations = True diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index b0cf2a83..1a72e156 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -603,15 +603,18 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal warnings.simplefilter('ignore', UserWarning) new_scen.run('distributed', vars(this_args).copy()) sys.stdout = sys.__stdout__ - if this_args.cost_calculation and cost_calc: - # cost calculation following directly after simulation - try: - with open(this_args.cost_parameters_file, encoding='utf-8') as file: - cost_parameters_file = uncomment_json_file(file) - except FileNotFoundError: - raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " - "does not exist. Exiting...") - calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) + try: + if this_args.cost_calculation and cost_calc: + # cost calculation following directly after simulation + try: + with open(this_args.cost_parameters_file, encoding='utf-8') as file: + cost_parameters_file = uncomment_json_file(file) + except FileNotFoundError: + raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " + "does not exist. Exiting...") + calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) + except: + pass return this_sched2, new_scen diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 276b5603..803ff38c 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -130,7 +130,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" args.save_results = args.output_directory / "simulation_spiceEV.json" - if args.desired_soc_deps != 1 and conf.opt_type == "quick": + if args.desired_soc_deps != 1 and conf.solver == "quick": logger.error("Fast calc is not yet optimized for desired socs unequal to 1") optimizer = ebus_toolbox.station_optimizer.StationOptimizer(sched, scen, args, conf, logger) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index c37a6137..acacd60b 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -845,7 +845,10 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, new_sched, new_scen = util.run_schedule(self.schedule, self.args, electrified_stations, cost_calc=cost_calc) - report.generate(new_sched, new_scen, self.args) + try: + report.generate(new_sched, new_scen, self.args) + except: + pass self.schedule = new_sched self.scenario = new_scen self.must_include_set = must_include_set @@ -884,22 +887,22 @@ def get_must_stations_and_rebase(self, relative_soc=False): :return: Set(Station_ids) """ - ############### - must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', - 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', - 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', - 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', - 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', - 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', - 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', - 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', - 'Bensheim Bahnhof/ ZOB'} - self.not_possible_stations = self.not_possible_stations.union(must_stations) - for stat in must_stations: - # do not put must stations in electrified set, but in extra set must_include_set - self.electrify_station(stat, self.must_include_set) - - return must_stations + # ############### + # must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', + # 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', + # 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', + # 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', + # 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', + # 'Bürstadt Lampertheimer Straße', 'Wald-Michelbach Alter Bahnhof', + # 'Heppenheim Gießener Straße', 'Heppenheim Starkenburg-Gymnasium', + # 'Erbach Post', 'Wald-Michelbach ZOB', 'Viernheim Bahnhof', + # 'Bensheim Bahnhof/ ZOB'} + # self.not_possible_stations = self.not_possible_stations.union(must_stations) + # for stat in must_stations: + # # do not put must stations in electrified set, but in extra set must_include_set + # self.electrify_station(stat, self.must_include_set) + # + # return must_stations ################# events = self.get_low_soc_events(rel_soc=relative_soc) From de4259f319c4867f889e94534d632ed4a9a9c4e7 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 7 Feb 2023 12:23:07 +0100 Subject: [PATCH 512/802] Extend doc and add figures --- docs/source/getting_started.rst | 27 ++++++++++++--- docs/source/index.rst | 7 +++- docs/source/modes.rst | 32 +++++++++++++++-- docs/source/simulation_parameters.rst | 49 ++++++++++++++++++++++++++- 4 files changed, 105 insertions(+), 10 deletions(-) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 70d51474..5c3810ec 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -1,16 +1,18 @@ +.. image:: https://user-images.githubusercontent.com/104760879/217226792-4297d3c8-8a7c-45ad-894f-5efd03031f49.png + :alt: ebus_toolbox_logo + Getting Started =============== The eBus-Toolbox assists the user in analysing and optimising electrified bus fleets and schedules. -.. _installation: +.. Without creating links like in the line below, subpages go missing from the sidebar + +.. _installation_label: Installation ------------ - -At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an in-depth SOC analysis. - -To try it out, first clone this repository and then install the required packages to your current environment by running +To try it out, first clone `this repository `_ and then install the required packages to your current environment by running `pip install -r requirements.txt` @@ -29,3 +31,18 @@ Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. General Concept --------------- +At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an in-depth SOC analysis. + +.. figure:: https://user-images.githubusercontent.com/104760879/217225545-5e6858c1-d056-4519-beea-6274d06533c7.png + :alt: ebus_toolbox_modules + :width: 800 + + Modules of the eBus-Toolbox + +.. figure:: https://user-images.githubusercontent.com/104760879/217226800-647956c5-9d63-4988-a710-f3326a8304d5.png + :alt: ebus_toolbox_default_plot + :width: 800 + + Default output plot for a single simulation. + +More text diff --git a/docs/source/index.rst b/docs/source/index.rst index 1e0da5f5..64c27c84 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,10 +3,15 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. +.. image:: https://user-images.githubusercontent.com/104760879/217226792-4297d3c8-8a7c-45ad-894f-5efd03031f49.png + :alt: ebus_toolbox_logo + Welcome to the eBus-Toolbox's documentation! ============================================ -This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies. +This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies in Python. + + .. toctree:: diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 7458fcc8..d59b4240 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -1,3 +1,7 @@ +# Without creating links like in the line below, subpages go missing from the sidebar + +.. _sim_modes: + Modes of the eBus-Toolbox ========================= @@ -10,15 +14,37 @@ different modes support the user in finding optimal solutions for their eBus-Sys * station optimization -simple simulation +Single simulation ----------------- -The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started` +The single simulation case is the default mode. Its usage is explained in :ref:`Getting Started` negative depot to opportunity charger ------------------------------------- +| This mode is the first kind of optimization provided by the eBus-Toolbox. It takes a scenario and uses the provided depot charger vehicle data to check if the scenario can run with only depot charger vehicles without socs falling below 0. Vehicles with a soc below 0 are changed to opportunity chargers with the provided opportunity charger vehicle data and the simulation is run again. +| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type exists. +| TBC + + negative opportunity to depot charger ------------------------------------- +| This mode is the similar to the previous optimization. It takes a scenario and uses the provided opportunity charger vehicle data to check if the scenario can run with only opportunity charger vehicles without socs falling below 0. Vehicles with a soc below 0 are changed to opportunity chargers with the provided depot charger vehicle data and the simulation is run again. +| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type exists. +| TBC + + +service optimization +-------------------- +This mode optimizes a scenario by creating sub-scenarios, so the given sub-scenario runs without socs falling below 0. The sub-scenario has the same input has the scenario but only consists of a sub-sets of rotations. These sub-sets are are optimized to be as big as possible. Previous negative rotations can become positive since effects like blocked charging points by other rotations can be reduced. station optimization --------------------- \ No newline at end of file +-------------------- +.. figure:: https://user-images.githubusercontent.com/104760879/217225177-66201146-d31a-4127-9ca0-4d6e6e5a3cc4.png + :alt: optimization_loop + + Caption + +.. figure:: https://user-images.githubusercontent.com/104760879/217225588-abfad83d-9d2a-463a-8597-584e29f5f885.png + :alt: below_0_soc_event + + Caption diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index f5db05bd..296d8fab 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -1,7 +1,9 @@ +.. _simulation_parameters: + Simulation Parameters ===================== -The simulation of an eBus-Sytem relies on a variety of simulation parameters. +The simulation of an eBus-System relies on a variety of simulation parameters. The eBus-Toolbox provides most of them as default values. Depending on specific needs adjusting these values can increase the accuracy of the simulation outputs. The eBus-Toolbox input files are described in detail in the following subsections as well as their default parameters. @@ -10,6 +12,9 @@ encoded or not contain regional characters. Configuration ------------- +The configuration file config.cfg is provided as example in ./examples/ and provides the user with most of the functionality surrounding the settings and boundary conditions of a simulation. The example contains parameter descriptions which are explained here in more detail: + +.. _schedule: Schedule -------- @@ -69,5 +74,47 @@ To analyze your own electric bus schedule, the data needs to be provided as a .c - 0.5. +.. _vehicle_types: + +Vehicle types +------------- +vehicle_type.json +tbc + +Electrified stations +-------------------- +Stations which are electrified. TBC + +Cost parameters +--------------- +TBC + + + +TBC + +.. _station_geo_data: + +Station data +------------ +Geodata. TBV + + +.. _level_of_loading: + +Level of loading +---------------- +TBC + +.. _temperature_data: + +Temperatures +------------ + +TBC +.. _consumption_table: +Consumption table +----------------- +The consumption table can be referenced in the :ref:`vehicle_types` file. Instead of constant consumption the eBus-Toolbox uses provided temperatures, level of loadings, mean speeds, average inclines and the vehicle type to interpolate the consumption value from this data table. Level of loading and temperatures are read from the :ref:`schedule` if the trips provide them. If they are missing from the schedule, they are looked up from the files :ref:`level_of_loading` and :ref:`temperature_data`. The average incline is calculated from :ref:`station_geo_data` and the mean speed is calculated by using the departure and arrival time and distance provided by the schedule. \ No newline at end of file From 30a667f8baf00a3a0c793381a04833761dd672f5 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 7 Feb 2023 12:25:50 +0100 Subject: [PATCH 513/802] Remove geopositons from this branch --- ebus_toolbox/plot_geoposition.py | 517 ------------------------------ ebus_toolbox/station_optimizer.py | 7 +- 2 files changed, 3 insertions(+), 521 deletions(-) delete mode 100644 ebus_toolbox/plot_geoposition.py diff --git a/ebus_toolbox/plot_geoposition.py b/ebus_toolbox/plot_geoposition.py deleted file mode 100644 index cb13cab6..00000000 --- a/ebus_toolbox/plot_geoposition.py +++ /dev/null @@ -1,517 +0,0 @@ -""" Module to implement plotting functionality of busses with georeferences""" -import datetime -import typing -import pathlib -from matplotlib.offsetbox import TextArea, AnnotationBbox - -import ebus_toolbox.util as util -import pickle -import csv -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - import ebus_toolbox.trip - import ebus_toolbox.schedule - import spiceev.scenario - -import numpy as np -import matplotlib.pyplot as plt -import pandas as pd - -# Mathematical function we need to plot -from matplotlib.colors import LinearSegmentedColormap -import matplotlib -import matplotlib.animation as animation - -matplotlib.use("TkAgg") -import os - -shared_axis = None -FIGSIZE = (14, 5) -LINEWIDTH = 2 -DELIMITER = ';' -FRAMEALPHA = 0.8 -ALPHA_POINTS = 0.1 - -### -rli_dblue = (0, 46 / 255, 80 / 255) -rli_green = (68 / 255, 175 / 255, 105 / 255) -rli_orange = (254 / 255, 127 / 255, 45 / 255) -rli_yellow = (241 / 255, 196 / 255, 15 / 255) -rli_lblue = (34 / 255, 116 / 255, 165 / 255) -rli_dgrey = (51 / 255, 88 / 255, 115 / 255) -### Not from official coperate design -rli_red = (192 / 255, 0, 0) -rli_green2 = (0, 176 / 255, 80 / 255) -rli_brown = (132 / 255, 60 / 255, 12 / 255) -rli_black = (0, 0, 0) -rli_colors = [rli_dblue, rli_green, rli_orange, rli_yellow, rli_lblue, rli_dgrey, rli_black, - rli_red, rli_brown, rli_green2] -### - -cdict = {'red': [[0.0, 0, 0], - [0.2, 34 / 255, 34 / 255], - [0.4, 68 / 255, 68 / 255], - [0.6, 254 / 255, 254 / 255], - [0.8, 241 / 255, 241 / 255], - [1.0, 255 / 255, 255 / 255]], - 'green': [[0.0, 46 / 255, 46 / 255], - [0.2, 116 / 255, 116 / 255], - [0.4, 175 / 255, 175 / 255], - [0.6, 127 / 255, 127 / 255], - [0.8, 196 / 255, 196 / 255], - [1.0, 255 / 255, 255 / 255]], - 'blue': [[0.0, 80 / 255, 80 / 255], - [0.2, 165 / 255, 165 / 255], - [0.4, 105 / 255, 105 / 255], - [0.6, 45 / 255, 45 / 255], - [0.8, 15 / 255, 15 / 255], - [1.0, 255 / 255, 255 / 255]]} -rli_rainbow_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) - -cdict = {'red': [[0.0, 0, 0], - [0.33, 0, 0], - [0.66, 34 / 255, 34 / 255], - [1, 255 / 255, 255 / 255]], - 'green': [[0.0, 0, 0], - [0.33, 46 / 255, 46 / 255], - [0.66, 116 / 255, 116 / 255], - [1, 255 / 255, 255 / 255]], - 'blue': [[0.0, 0, 0], - [0.33, 80 / 255, 80 / 255], - [0.66, 165 / 255, 165 / 255], - [1, 255 / 255, 45 / 255]]} -rli_blue_cmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256) - -f_path=pathlib.Path(__file__).parent.parent -with open(f_path / "schedule_rebased_BVG_BFI.pickle", "rb") as file: - schedule = pickle.load(file) - -with open(f_path / "scenario_rebased_BVG_BFI.pickle", "rb") as file: - scenario = pickle.load(file) - -with open(f_path / "args_rebased_BVG_BFI.pickle", "rb") as file: - args = pickle.load(file) - -args.station_data_path = "C:/Users/paul.scheer/Python/bus_toolbox/eBus-Toolbox/Haltestellen.csv" - -ANIMATION_DURATION_MIN = 480 - - -def main(): - pickle_path = None #"vehicle_data_frames.pickle" - with open(str(args.station_data_path), "r", encoding='utf-8') as f: - delim = util.get_csv_delim(args.station_data_path) - reader = csv.DictReader(f, delimiter=delim) - stations = dict() - for row in reader: - elevation = float(row['elevation']) - name = str(row['Endhaltestelle']) - lon = float(row['lon']) - lat = float(row['lat']) - stations[name] = station(name, lat, lon, elevation) - - start_time = scenario.start_time - time_step = datetime.timedelta(hours=1 / scenario.stepsPerHour) - - if not pickle_path: - vehicle_data_frames = pd.DataFrame() - for v_id, soc_data in scenario.vehicle_socs.items(): - rotations = get_sorted_rotations(v_id, schedule) - trips = [trip for rot in rotations for trip in rot.trips] - lats = [] - lons = [] - trip_nr = 0 - for counter, soc in enumerate(soc_data): - try: - current_time = start_time + counter * time_step - current_trip, found_trip_index = find_current_trip(trips[trip_nr:], - current_time) - trip_nr += found_trip_index - rel_time_of_trip = get_rel_time_of_trip(current_time, current_trip) - try: - current_station = stations[current_trip.departure_name] - except: - current_station = last_station - try: - next_station = stations[current_trip.arrival_name] - except: - next_station = current_station - last_station=current_station - lat, lon = current_station.get_lat_lon(next_station, rel_time_of_trip) - lats.append(lat) - lons.append(lon) - except IndexError: - pass - columns = [(v_id, "soc"), (v_id, "lat"), (v_id, "lon")] - data = np.array([soc_data, lats, lons]).transpose() - vehicle_data_frames = pd.concat( - (vehicle_data_frames, pd.DataFrame(data, columns=columns)), - axis=1) - - vehicle_data_frames.columns = pd.MultiIndex.from_tuples(vehicle_data_frames.columns, - names=['Vehicle_id', 'Data']) - - vehicle_data_frames.index = np.arange(start_time, start_time + - len(vehicle_data_frames) * time_step, time_step) - else: - with open(pickle_path, "rb") as f: - print("depickeling") - vehicle_data_frames = pickle.load(f) - - stations_to_annotate = {name: stat for name, stat in stations.items() if - name in schedule.stations} - - vehicle_data_frames = vehicle_data_frames.iloc[:24*60,:] - plot_merge_animate_battery(vehicle_data_frames, station_data=stations_to_annotate, - soc_threshold=1,track_black=False, vehicle_black=True, - save=False, repeat=True) - - -class station: - def __init__(self, name, lat, lon, elevation): - self.name = name - self.lat = lat - self.lon = lon - self.elevation = elevation - - def get_lat_lon(self, next_station, rel_pos): - lat_pos = (next_station.lat - self.lat) * rel_pos + self.lat - lon_pos = (next_station.lon - self.lon) * rel_pos + self.lon - return lat_pos, lon_pos - - -def get_sorted_rotations(v_id, schedule): - rots = [] - for rot in schedule.rotations.values(): - if rot.vehicle_id == v_id: - rots.append(rot) - return sorted(rots, key=lambda x: x.departure_time) - - -def plot_merge_animate_battery(data: pd.DataFrame, station_data=None, - save=False, repeat=True, vehicle_black=False, track_black=True, - track_method="min", soc_threshold=1.0): - - data.xs("lat", level="Data", axis=1) - lat_boundary = (data.xs("lat", level="Data", axis=1).min().min(), - data.xs("lat", level="Data", axis=1).max().max()) - lon_boundary = (data.xs("lon", level="Data", axis=1).min().min(), - data.xs("lon", level="Data", axis=1).max().max()) - - - v_max = 1 - v_min = 0 - fig = plt.figure(figsize=(14, 8)) - - fig.suptitle('Vehicle Tracking', fontsize=14) - - sub2 = fig.add_subplot(111) - ax = plt.gca() - - # Get all the vehicle ids from data - vehicles = list(data.columns.levels[0]) - - # Filter data for relevant SOCs - for v_id in vehicles: - if data[v_id]['soc'].min()>soc_threshold: - data=data.drop(v_id,axis=1) - data.columns = data.columns.remove_unused_levels() - vehicles = list(data.columns.levels[0]) - - # Plot track onto canvas via line which doesnt allow soc printing - # or via scatter plot. With a scatter plot the points can take the color of the soc which drove - # above the position. - - - round_nr = 3 - stacked_array_unique = make_unique_data(vehicles, data, track_method) - x_org= stacked_array_unique[0, :].copy() - y_org= stacked_array_unique[1, :].copy() - # - # stacked_array_unique[0, :] = stacked_array_unique[0, :] - min(stacked_array_unique[0, :]) - # stacked_array_unique[1, :] = stacked_array_unique[1, :] - min(stacked_array_unique[1, :]) - # stacked_array_unique[0, :] = stacked_array_unique[0, :] - # stacked_array_unique[0, :] = stacked_array_unique[0, :] * 10 ** round_nr - # stacked_array_unique[1, :] = stacked_array_unique[1, :] * 10 ** round_nr - ############## - # from scipy.ndimage import gaussian_filter as gauss - # fig = plt.figure(figsize=(8, 8)) - # - # fig.suptitle('Vehicle Tracking', fontsize=14) - # sub2 = fig.add_subplot(111) - # ax = plt.gca() - # - # stacked_array_pic = make_unique_data(vehicles, data, track_black, track_method, - # round_nr=round_nr) - # - # x = (stacked_array_pic[0, :] * 10 ** round_nr).astype(int) - # X = x - np.min(x) - # y = (stacked_array_pic[1, :] * 10 ** round_nr).astype(int) - # Y = y - np.min(y) - # z = stacked_array_pic[2, :] - # idx1 = X - # idx2 = Y - # grid_data = z - # grid = np.ones((np.max(Y) + 1, np.max(X) + 1)) - # grid[idx2, idx1] = grid_data - # ax.imshow(gauss(grid, 10)) - # ############################# - # fig = plt.figure(figsize=(14, 8)) - # - # fig.suptitle('Vehicle Tracking', fontsize=14) - # - # sub2 = fig.add_subplot(111) - # ax = plt.gca() - # - # x=stacked_array_unique[0,:] - # y=stacked_array_unique[1,:] - # z=stacked_array_unique[2,:] - # - # steps=500 - # X = np.linspace(stacked_array_unique[0, :].min(), stacked_array_unique[0, :].max(), steps) - # Y = np.linspace(stacked_array_unique[1, :].min(), stacked_array_unique[1, :].max(), steps) - # from scipy.interpolate import griddata - # Z = griddata((x, y), z,((X[None, :], Y[:, None])), method='linear') - # contour = sub2.contourf(X, Y, Z) - # ######################## - # ax.imshow(Z) - # ######################## - - if track_black: - for v_id in vehicles: - plot_dict = dict(color=(0.9, 0.9, 0.9), alpha=1) - lns2_1 = sub2.plot(data[v_id]['lat'], data[v_id]['lon'], - **plot_dict, linestyle='-', - linewidth=2) - else: - plot_dict = dict(c=stacked_array_unique[2, :] * 1, alpha=0.8) - lns2_1 = sub2.scatter(stacked_array_unique[0, :], stacked_array_unique[1, :], - **plot_dict, linestyle='-', - linewidth=0, vmin=v_min, vmax=v_max) - lns2_1.set_clim(vmin=v_min, vmax=v_max) - - # Helper plot so we can plot a colorbar aftwards, not possible with only line plot - plot_dict = dict() - lns2_1 = sub2.scatter([], [], - **plot_dict, linestyle='-', - linewidth=0, vmin=v_min, vmax=v_max) - - cbar = fig.colorbar(lns2_1, ax=ax, pad=0.0) - cbar.set_alpha(1) - cbar.draw_all() - cbar.set_label("SOC") - - # Plot Station Names - if station_data: - for station in station_data.values(): - # xy=((station.lat-np.min(x_org))*10**round_nr, (station.lon-np.min(y_org))*10**round_nr) - xy=(station.lat, station.lon) - ax.annotate(station.name, - xy=xy, xycoords='data', xytext=(0, 5), textcoords='offset points', fontsize=8, ha='center') - ax.plot(xy[0], xy[1], 'ko', zorder=100) - - artist_objects = [] - for _ in vehicles: - lns2_1 = sub2.scatter([0, 0], [0, 0], [0, 100]) - artist_objects.append(lns2_1) - - d_bound = 0.005 - sub2.set_ylim((lon_boundary[0] - d_bound, lon_boundary[1] + d_bound)) - sub2.set_xlim((lat_boundary[0] - d_bound, lat_boundary[1] + d_bound)) - sub2.set_ylabel('Position') - sub2.set_xlabel('Position') - - text_box = TextArea(data.index[0]) - - time_annotation_box = [AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', - fontsize=15)] - ax.add_artist(time_annotation_box[0]) - hover_texts = [str(v_id) for v_id in vehicles] - - def animate(i, data, counter=[]): - roll_v = 1 - len_v = 1 - ax = plt.gca() - vehicles = list(data.columns.levels[0]) - if not counter: - counter.append(i) - else: - counter[0] += 1 - i = counter[0] - start_index = i * roll_v + 8 * 60 - end_index = start_index + len_v - try: - ax.artists.remove(time_annotation_box[0]) - except: - return artist_objects - text_box = TextArea(data.index[start_index]) - time_annotation_box[0] = AnnotationBbox(text_box, xy=(0.1, 0.1), xycoords='axes fraction', - fontsize=15) - ax.add_artist(time_annotation_box[0]) - # - # - - plot_dict = dict(color=(0, 0, 0)) - artist_objects[0].remove() - lat_data=data.xs("lat", level="Data", axis=1).iloc[start_index:end_index].values - lon_data=data.xs("lon", level="Data", axis=1).iloc[start_index:end_index].values - soc_data=data.xs("soc", level="Data", axis=1).iloc[start_index:end_index].mean().values - if vehicle_black: - plot_dict = dict(color=(0, 0, 0)) - else: - plot_dict = dict(c=soc_data) - artist_objects[0] = sub2.scatter(lat_data, - lon_data, - **plot_dict, - vmin=0, vmax=1, - linestyle='-', - linewidth=0, zorder=50) - - # - # - # for k, v_id in enumerate(vehicles): - # artist_objects[k].remove() - # mean_soc = data[v_id]["soc"][start_index:end_index].mean() - # if vehicle_black: - # plot_dict = dict(color=(0, 0, 0)) - # else: - # l = len(data[v_id]["lat"][start_index:end_index]) - # plot_dict = dict(c=mean_soc * np.ones(l)) - # artist_objects[k] = sub2.scatter(data[v_id]["lat"][start_index:end_index], - # data[v_id]["lon"][start_index:end_index], - # **plot_dict, - # vmin=0, vmax=1, - # linestyle='-', - # linewidth=0, zorder=50) - # hover_texts[k] = (v_id, str(round(mean_soc, 3))) - - if end_index >= len(data): - counter[0] = 0 - - return artist_objects - - ax.axis('off') - # create animation using the animate() function - - my_animation = animation.FuncAnimation(fig, - lambda i: animate(i, data), - frames=ANIMATION_DURATION_MIN, - interval=15, blit=False, repeat=repeat) - - # - sub2.set_ylabel('Position') - sub2.set_xlabel('Position') - - fig.canvas.mpl_connect("motion_notify_event", lambda event: hover_for_scatter( - event, fig, ax, artist_objects, hover_texts)) - # Toggle save for saving - if save: - my_animation.save('SOC_animation.gif', writer='imagemagick') - - fig.tight_layout() - - def on_close(event): - plt.close() - print('Closed Figure!') - fig.canvas.mpl_connect('close_event',lambda event:on_close(event)) - plt.show(block=True) - print("stopped") - -def make_unique_data(vehicles, data, track_method, round_nr=None): - v_iter = iter(vehicles) - v_id = next(v_iter) - data = pd.DataFrame(data) - if not round_nr: - r = lambda x: x - else: - r = lambda i: round(i, round_nr) - stacked_array = np.array((r(data[v_id]['lat']), r(data[v_id]['lon']), data[v_id]['soc'])) - for v_id in v_iter: - stacked_array = np.hstack( - (stacked_array, (r(data[v_id]['lat']), r(data[v_id]['lon']), data[v_id]['soc']))) - stacked_array = stacked_array.astype(float) - # stacked_array has all vehicle socs and geo positions in - unique_mask = np.unique(stacked_array[0:2, :], axis=1, return_index=True)[1] - stacked_array_unique = stacked_array[:, unique_mask] - - # find soc data for stacked array depending on method. Since its only needed if the track is not black check this as well - - apply_function = None - if track_method == "mean": - apply_function = np.mean - elif track_method == "max": - apply_function = np.max - else: - apply_function = np.min - - for geo_index in range(len(stacked_array_unique)): - geo_loc = stacked_array_unique[0:2, geo_index] - found_positions = np.all([stacked_array[0:2, :].T == geo_loc], axis=0)[:, 0] - fill_value = apply_function(stacked_array[2, found_positions]) - stacked_array_unique[2, geo_index] = fill_value - - return stacked_array_unique - - -def hover_for_scatter(event, fig, ax, plot_points: typing.Iterable[matplotlib.lines.Line2D], - hover_texts: typing.Iterable[str], annotations=[]): - """Called when user hovers over plot. - Checks if user hovers over point. If so, delete old annotation and - create new one with relevant info from the hover_texts list. - If user does not hover over point, remove annotation, if any. - """ - if len(annotations) == 0: - annotations.append(None) - for i, points in enumerate(plot_points): - if points and event.inaxes == ax: - # results shown, mouse within plot: get event info - # cont: any points hovered? - # ind: list of points hovered - cont, ind = points.contains(event) - - if cont and "ind" in ind: - ind = ind["ind"] - # points hovered - # get all point coordinates - xy = points.get_offsets().data - text = hover_texts[i] - - # # remove old annotation - if annotations and annotations[0]: - annotations[0].remove() - annotations[0] = None - - # create new annotation - annotations[0] = ax.annotate( - text, - xy=(xy[ind[0]][0], xy[ind[0]][1]), - xytext=(-20, 20), - textcoords="offset points", - bbox=dict(boxstyle="round", fc="w"), - arrowprops={'arrowstyle': "-"}, - annotation_clip=False) - fig.canvas.draw() - - -def find_current_trip(trips, current_time): - for i, trip in enumerate(trips): - try: - next_trip = trips[i + 1] - if next_trip.departure_time > current_time: - return trip, i - except IndexError: - return trip, i - else: - raise Exception("no trip found for time: " + str(current_time)) - - -def get_rel_time_of_trip(current_time: datetime.datetime, current_trip: 'ebus_toolbox.trip.Trip'): - trip_time= (current_trip.arrival_time - current_trip.departure_time) - rel_time = (current_time - current_trip.departure_time) / \ - max(trip_time,datetime.timedelta(minutes=1)) - return min(1, max(rel_time, 0)) - - -if __name__ == "__main__": - main() diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index b3aae32a..e96c98f1 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -439,7 +439,7 @@ def get_charge_events_per_station(self, station_name, rotations=None): warnings.warn("Station to be checked has no following trip. Final destinations" "can not offer lift to the soc and are therefore discarded") continue - arrival_time= trip.arrival_time + arrival_time = trip.arrival_time start_idx = self.get_index_by_time(charging_event_start_time) end_time = rot.trips[i+1].departure_time buffer_time = util.get_buffer_time(trip, self.args.default_buffer_time_opps) @@ -447,7 +447,7 @@ def get_charge_events_per_station(self, station_name, rotations=None): cht = rot.vehicle_id.find("depb") ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" v_type = rot.vehicle_id.split("_" + ch_type)[0] - event = util.ChargingEvent(start_idx=start_idx,end_idx=end_idx, + event = util.ChargingEvent(start_idx=start_idx, end_idx=end_idx, arrival_time=arrival_time, start_time=charging_event_start_time, end_time=end_time, buffer_time=buffer_time, vehicle_id=rot.vehicle_id, @@ -457,7 +457,6 @@ def get_charge_events_per_station(self, station_name, rotations=None): charging_events.append(event) return charging_events - def sort_station_events(self, charge_events_single_station): return sorted(charge_events_single_station, key=lambda x: x.arrival_time) @@ -885,7 +884,7 @@ def get_must_stations_and_rebase(self, relative_soc=False): ############### must_stations = {'Heppenheim Graben', 'Wahlen Grundschule', 'Erbach Gesundheiszentrum', - 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', + 'Heppenheim Vogelsbergstraße', 'Rimbach Kirche', 'Hirschhorn Grundschule', 'Bensheim Geschw.-Scholl-Schule', 'Lindenfels Poststraße', 'Heppenheim Bahnhof', 'Zotzenbach Schule', 'Heppenheim Kreiskrankenhaus', 'Weinheim Hauptbahnhof', 'Worms Hauptbahnhof', From 65ab842d07d9f0d412a9faa170ddb97b93a44058 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 7 Feb 2023 12:27:17 +0100 Subject: [PATCH 514/802] Make flake8 happy --- ebus_toolbox/optimizer_util.py | 5 +++-- ebus_toolbox/station_optimization.py | 8 ++++---- ebus_toolbox/station_optimizer.py | 2 -- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index b0cf2a83..7cfefd0e 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -25,7 +25,7 @@ class ChargingEvent: """ Class to gather information about a charging event""" - def __init__(self, start_idx, end_idx,arrival_time, start_time, end_time, buffer_time, + def __init__(self, start_idx, end_idx, arrival_time, start_time, end_time, buffer_time, vehicle_id, capacity, station_name, rotation): self.start_idx = start_idx @@ -213,9 +213,9 @@ def get_charging_time(trip1, trip2, args): return 0 return max(0, standing_time_min) + def get_charging_start(trip1, args): """ Returns the possible start of charging consindering buffer times - :param trip1: First trip :param args: arguments Namespace with default buffer time :return: First possible charging time as datetime object @@ -223,6 +223,7 @@ def get_charging_start(trip1, args): buffer_time = get_buffer_time(trip1, args.default_buffer_time_opps) return trip1.arrival_time+buffer_time + def get_buffer_time(trip, default_buffer_time_opps): """ Return the buffer time as timedelta object :param trip: trip object diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 276b5603..02163f6b 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -54,7 +54,7 @@ def main(): """ main call""" util.print_time() config_path = "./data/examples/optimizer.cfg" - opt_sched, opt_scen= run_optimization(config_path) + opt_sched, opt_scen = run_optimization(config_path) util.print_time() import pickle with open("schedule_opt.pickle", "wb") as f: @@ -121,8 +121,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger = setup_logger(args, conf) - # remove those args, since they lead to file creation, which is not - # needed. + # remove those args, since they lead to file creation, which is not + # needed. if not conf.save_all_results: del args.save_timeseries del args.save_results @@ -178,7 +178,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): for event in new_events: logger.debug(event.rotation.id) with open(new_ele_stations_path, "w", encoding="utf-8") as file: - json.dump(ele_stations, file,ensure_ascii=False, indent=2) + json.dump(ele_stations, file, ensure_ascii=False, indent=2) util.print_time() logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index e96c98f1..a39cac8a 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -429,8 +429,6 @@ def get_charge_events_per_station(self, station_name, rotations=None): try: charging_event_start_time = util.get_charging_start(trip, self.args) end_time = rot.trips[i + 1].departure_time - - # Do not add the event if there is charging time of at least the defined # min charging time if charging_event_start_time + self.args.min_charging_time >= end_time: From 521d941688856a5df7b2b9fd826931e94e5b60c2 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 7 Feb 2023 15:14:08 +0100 Subject: [PATCH 515/802] costs: fix SpiceEV import path --- ebus_toolbox/costs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index bfeb234f..8ae8ad9e 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,6 +1,6 @@ import warnings -from calculate_costs import calculate_costs as calc_costs_spice_ev +from spice_ev.costs import calculate_costs as calc_costs_spice_ev def calculate_costs(c_params, scenario, schedule, args): From 8bdf7a72756b4c83e8c2df36f4a2d0ae3e95eb4b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 8 Feb 2023 14:25:15 +0100 Subject: [PATCH 516/802] Add more doc --- docs/source/conf.py | 2 +- docs/source/getting_started.rst | 19 +++++++++++++------ docs/source/index.rst | 6 ++---- docs/source/modes.rst | 10 ++++++++++ docs/source/simulation_parameters.rst | 18 ++++++++++++++++-- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 56dbe2a0..3daca017 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -43,7 +43,7 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary','sphinx.ext.autosectionlabel'] - +numfig = True # Add any paths that contain templates here, relative to this directory. templates_path = [] diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 5c3810ec..53d1d8d8 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -14,7 +14,9 @@ Installation ------------ To try it out, first clone `this repository `_ and then install the required packages to your current environment by running -`pip install -r requirements.txt` + + +``pip install -r requirements.txt`` Now you can start the eBus Toolbox module with all configurations stored at `data/configs/ebus_toolbox.cfg` via the command @@ -22,26 +24,31 @@ Now you can start the eBus Toolbox module with all configurations stored at `dat The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. -To run the eBus Toolbox with your own `schedule.csv` (see details [below](#input-data)) file and default configurations run +To run the eBus-Toolbox with your own `schedule.csv` (see :ref:`schedule`)) file and default configurations run -`python -m ebus_toolbox --input_schedule path/to/schedule.csv` +``python -m ebus_toolbox --input_schedule path/to/schedule.csv`` Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. General Concept --------------- -At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an in-depth SOC analysis. +At the current stage several functionalities are implemented. The base simulation processes a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and runs it through a module called SpiceEV for an in-depth SOC analysis. +Other modes can alter bus types from depot to opportunity chargers, optimize sets of rotations to increase electrification or suggest stations for electrification by minimizing the amount of stations needed. You can learn more about the modes :ref:`here ` +.. _figure_ebus_toolbox_modules: .. figure:: https://user-images.githubusercontent.com/104760879/217225545-5e6858c1-d056-4519-beea-6274d06533c7.png :alt: ebus_toolbox_modules - :width: 800 + :width: 600 Modules of the eBus-Toolbox +:numref:`figure_ebus_toolbox_modules` shows how the different modules work together to calculate the scenario. Optionally different optimizations can be used or even chained together. The output of the simulation is locally saved and consists of the vehicle socs, summaries for each rotation, estimated costs for vehicles, infrastructure and operation as well as station specific electric loads, utilization rates and other key performance indicators. Some of them can be plotted automatically and can be seen in :numref:`ebus_toolbox_default_plot` + +.. _ebus_toolbox_default_plot: .. figure:: https://user-images.githubusercontent.com/104760879/217226800-647956c5-9d63-4988-a710-f3326a8304d5.png :alt: ebus_toolbox_default_plot - :width: 800 + :width: 600 Default output plot for a single simulation. diff --git a/docs/source/index.rst b/docs/source/index.rst index 64c27c84..b1a0ac92 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,8 +12,6 @@ Welcome to the eBus-Toolbox's documentation! This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies in Python. - - .. toctree:: :maxdepth: 3 :caption: Contents: @@ -21,11 +19,11 @@ This toolbox extends the functionality of the Open Source simulation tool SpiceE getting_started modes simulation_parameters - + modindex Indices and tables ================== * :ref:`genindex` * :ref:`modindex` -* :ref:`search` + diff --git a/docs/source/modes.rst b/docs/source/modes.rst index d59b4240..c6563bbd 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -39,12 +39,22 @@ This mode optimizes a scenario by creating sub-scenarios, so the given sub-scena station optimization -------------------- +.. _optimization_loop: .. figure:: https://user-images.githubusercontent.com/104760879/217225177-66201146-d31a-4127-9ca0-4d6e6e5a3cc4.png + :width: 600 :alt: optimization_loop Caption +:numref:`optimization_loop` shows xxxxxxxxxxxxxxxxxxx + .. figure:: https://user-images.githubusercontent.com/104760879/217225588-abfad83d-9d2a-463a-8597-584e29f5f885.png + :width: 600 :alt: below_0_soc_event Caption + + +chained modes +------------- +Lorem ipsum ... \ No newline at end of file diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index 296d8fab..6e4ab315 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -35,13 +35,13 @@ To analyze your own electric bus schedule, the data needs to be provided as a .c - Name of the station the trip starts at - Warschauer Straße * - departure_time - - Date and Time at which bus starts trip + - Date and time at which bus starts trip (ISO-Format) - 2022-03-13T10:25 * - arrival_name - Name of the station the trip ends at - Ostbahnhof Berlin * - arrival_time - - Date and Time at which bus completes trip (e.g. yyyy-mm-ddThh:mm[:ss]) + - Date and Time at which bus completes trip (ISO-Format) (e.g. yyyy-mm-ddThh:mm[:ss]) - 2022-03-13T10:30 * - distance - Distance traveled in **m** @@ -73,6 +73,20 @@ To analyze your own electric bus schedule, the data needs to be provided as a .c - The level of loading of the bus on this trip in between 0 and 1 - 0.5. +This is how a schedule file might look like. + ++--------+----------------+---------------------+---------------------+--------------+----------+-------------+--------------+-------------+------------------+ +| line | departure_name | departure_time | arrival_time | arrival_name | distance | rotation_id | vehicle_type | temperature | level_of_loading | ++========+================+=====================+=====================+==============+==========+=============+==============+=============+==================+ +| LINE_0 | Station-0 | 2022-03-07 21:28:00 | 2022-03-07 21:31:00 | Station-1 | 1530 | 1 | 12m_bus | 20 | 0 | ++--------+----------------+---------------------+---------------------+--------------+----------+-------------+--------------+-------------+------------------+ +| LINE_0 | Station-1 | 2022-03-07 21:31:00 | 2022-03-07 22:04:00 | Station-3 | 14519 | 1 | 12m_bus | -5 | 0.9 | ++--------+----------------+---------------------+---------------------+--------------+----------+-------------+--------------+-------------+------------------+ +| LINE_0 | Station-3 | 2022-03-07 22:08:00 | 2022-03-07 22:43:00 | Station-1 | 13541 | 1 | 12m_bus | | | ++--------+----------------+---------------------+---------------------+--------------+----------+-------------+--------------+-------------+------------------+ +| LINE_0 | Station-1 | 2022-03-07 22:51:00 | 2022-03-07 23:24:00 | Station-2 | 14519 | 1 | 12m_bus | | | ++--------+----------------+---------------------+---------------------+--------------+----------+-------------+--------------+-------------+------------------+ + .. _vehicle_types: From 48ca9a1fdfe2f6d742faa54b1ff20ae9961e536a Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 8 Feb 2023 15:03:38 +0100 Subject: [PATCH 517/802] change spice_ev requirements egg --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 432394c1..25e02659 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ numpy >= 1.12.0 matplotlib --e git+https://github.com/rl-institut/spice_ev.git@dev#egg=spiceev +-e git+https://github.com/rl-institut/spice_ev.git@dev#egg=spice_ev pandas From 64c81895dba08352c5040948186f7d2f81a9cf61 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 9 Feb 2023 09:29:51 +0100 Subject: [PATCH 518/802] Expand test_schedule --- .../test_input_files/all_stations_example.csv | 4 + .../test_input_files/not_numeric_stations.csv | 4 + tests/test_schedule.py | 103 +++++++++++++++++- 3 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 tests/test_input_files/all_stations_example.csv create mode 100644 tests/test_input_files/not_numeric_stations.csv diff --git a/tests/test_input_files/all_stations_example.csv b/tests/test_input_files/all_stations_example.csv new file mode 100644 index 00000000..dec18443 --- /dev/null +++ b/tests/test_input_files/all_stations_example.csv @@ -0,0 +1,4 @@ +Endhaltestelle,elevation +Station A,1 +Station B,9 +Station C,10 \ No newline at end of file diff --git a/tests/test_input_files/not_numeric_stations.csv b/tests/test_input_files/not_numeric_stations.csv new file mode 100644 index 00000000..94d0b8c4 --- /dev/null +++ b/tests/test_input_files/not_numeric_stations.csv @@ -0,0 +1,4 @@ +Endhaltestelle,elevation +Station A, +Station B,b +Station C,10 \ No newline at end of file diff --git a/tests/test_schedule.py b/tests/test_schedule.py index f5b5e453..437e27cf 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -6,9 +6,106 @@ Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html are also good support. """ +import pytest + from tests.helpers import generate_basic_schedule +import json +import pathlib +from ebus_toolbox import schedule, trip, consumption + +test_root = pathlib.Path(__file__).parent +file_root = test_root / "test_input_files" +path_to_trips = file_root / "trips.csv" + +mandatory_args = { + "min_recharge_deps_oppb": 0, + "min_recharge_deps_depb": 0, + "gc_power_opps": 1000, + "gc_power_deps": 1000, + "cs_power_opps": 100, + "cs_power_deps_depb": 50, + "cs_power_deps_oppb": 150 +} + + +class TestSchedule: + temperature_path = file_root / 'default_temp_winter.csv' + lol_path = file_root / 'default_level_of_loading_over_day.csv' + + with open(file_root / "electrified_stations.json", "r", encoding='utf-8') as file: + electrified_stations = json.load(file) + + with open(file_root / "vehicle_types.json", "r", encoding='utf-8') as file: + vehicle_types = json.load(file) + + def test_mandatory_options_exit(self): + """ Check if the schedule creation properly throws a SystemExit error in case of missing + mandatory options""" + try: + schedule.Schedule(self.vehicle_types, self.electrified_stations) + except SystemExit: + # exception was properly thrown + pass + else: + raise Exception( + "Schedule initialization did not get mandatory options but did not throw an" + "exception") + + def test_station_data_reading(self): + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + + path_to_all_station_data = file_root / "all_stations_example.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args, + station_data_pata=path_to_all_station_data) + assert generated_schedule.stations + + path_to_all_station_data = file_root / "not_existent_file" + with pytest.warns(Warning) as record: + schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, + **mandatory_args, station_data_path=path_to_all_station_data) + assert len(record) == 1 + + path_to_all_station_data = file_root / "not_numeric_stations.csv" + schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, + **mandatory_args, station_data_path=path_to_all_station_data) + assert len(record) == 2 + assert 0 + + + def test_rotation_consistency(self): + pass + + def test_run(self): + pass + + def test_assign_vehicles(self): + pass + + def test_calculate_consumption(self): + pass + + def test_get_departure_of_first_trip(self): + pass + + def test_get_common_stations(self): + pass + + def test_generate_scenario(self): + pass + + def test_get_negative_rotations(self): + pass + + def test_set_charging_type(self): + pass + def test_schedule_from_csv(self): + generated_schedule = generate_basic_schedule() + assert len(generated_schedule.rotations) == 1 + assert type(generated_schedule) == schedule.Schedule -def test_schedule_from_csv(): - schedule = generate_basic_schedule() - assert len(schedule.rotations) == 1 +t =TestSchedule() +t.test_station_data_reading() \ No newline at end of file From 382973338473e3776f248a6279dedd4e66e298ff Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 9 Feb 2023 09:31:22 +0100 Subject: [PATCH 519/802] Add station_data with geodata to schedule, to make sucessfull creation testable --- ebus_toolbox/schedule.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 95fa53dd..77233385 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -30,6 +30,7 @@ def __init__(self, vehicle_types, stations, **kwargs): self.consumption = 0 self.vehicle_types = vehicle_types self.original_rotations = None + self.station_data = None # mandatory config parameters mandatory_options = [ @@ -87,6 +88,8 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): "values in the column 'elevation'. Station data is discarded.". format(station_path), stacklevel=100) + else: + schedule.station_data = station_data with open(path_to_csv, 'r', encoding='utf-8') as trips_file: trip_reader = csv.DictReader(trips_file) From c7febd4810e921af04d88a27f24cd31b34951f3b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 9 Feb 2023 10:10:22 +0100 Subject: [PATCH 520/802] Fix consistency check for diverging departure names to previous arrivals --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 77233385..228a4d52 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -164,7 +164,7 @@ def check_consistency(cls, schedule): if prev_station_name is not None: # must depart from the previous station assert trip.departure_name == prev_station_name, "Wrong departure station" - prev_station_name = trip.arrival_name + prev_station_name = trip.arrival_name # must have exactly one "Einsetzfahrt" and "Aussetzfahrt" assert dep_name is not None and arr_name is not None, "No Ein- or Aussetzfahrt" # rotation must end where it started From 644dadd170681b6ded718723773da39b201b1f99 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 9 Feb 2023 10:40:18 +0100 Subject: [PATCH 521/802] Create function for argument parser creation --- ebus_toolbox/util.py | 112 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 7771ab9e..27683589 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,7 +1,7 @@ import json import warnings import subprocess - +import argparse def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() @@ -257,3 +257,113 @@ def nd_interp(input_values, lookup_table): points = new_points return points[0][-1] + + +def create_ArgumentParser_with_arguments(): + parser = argparse.ArgumentParser( + description='eBus-Toolbox - \ + simulation program for electric bus fleets.') + parser.add_argument('--input-schedule', nargs='?', + help='Path to CSV file containing all trips of schedule to be analyzed.') + parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], + help='Specify what you want to do. Choose one from {sim, \ + service_optimization}. sim runs a single simulation with the given inputs. \ + service optimization finds the largest set of electrified rotations.') + parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', + help='Location where all simulation outputs are stored') + parser.add_argument('--preferred-charging-type', '-pct', default='depb', + choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ + from {depb, oppb}. opp stands for opportunity.") + parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", + help='location of vehicle type definitions') + parser.add_argument('--min-recharge-deps-oppb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--min-recharge-deps-depb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--check-rotation-consistency', action='store_true', + help='Check rotation assumptions when building schedule.') + parser.add_argument('--ignore-inconsistent-rotations', action='store_true', + help='Remove rotations from schedule that violate assumptions. ') + parser.add_argument('--days', metavar='N', type=int, default=None, + help='set duration of scenario as number of days') + parser.add_argument('--interval', metavar='MIN', type=int, default=15, + help='set number of minutes for each timestep (Δt)') + parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, + help='set minimum desired SOC (0 - 1) for depot charging') + parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=0.8, + help='set minimum desired SOC (0 - 1) for opportunity charging') + parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=None, + help='max power of grid connector at opp stations') + parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=None, + help='max power of grid connector at depot stations') + parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=450, + help='max power of charging station at opp stations') + parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=100, + help='max power of charging station at depot stations for depot busses') + parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, + help='max power of charging station at depot stations for opp busses') + parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', + help='add battery with specified capacity in kWh and C-rate \ + (-1 for variable capacity, second argument is fixed power))') + parser.add_argument('--seed', default=None, type=int, help='set random seed') + parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') + parser.add_argument('--include-price-csv', + help='include CSV for energy price. \ + You may define custom options with --include-price-csv-option') + parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), + nargs=2, default=[], action='append', + help='append additional argument to price signals') + parser.add_argument('--start-date', default='2018-01-02', + help='Provide start date of simulation in format YYYY-MM-DD.E.g. ' + '2018-01-31') + parser.add_argument('--electrified-stations', help='include electrified_stations json', + default='data/examples/electrified_stations.json') + parser.add_argument('--cost-calculation', '-cc', action='store_true', + help='Calculate costs') + parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) + parser.add_argument('--min-charging-time', help='define minimum time of charging', + default=0) + parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' + 'at opp station to simulate docking procedure.', + default=0) + parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' + 'start time of a vehicle event im min.', + default=10) + parser.add_argument('--visual', '-v', action='store_true', + help='Show plots of the results- not applicable', default=False) + parser.add_argument('--generate-report', '-r', help='generates and stores plots and results', + default=False) + parser.add_argument('--show-plots', + help='opens plots for user to view, only valid if generate_report=True', + default=False) + parser.add_argument('--eta', action='store_true', + help='Show estimated time to finish simulation after each step, \ + instead of progress bar. Not recommended for fast computations.') + parser.add_argument('--save-timeseries', help='Write timesteps to file - not applicable', + default=False) + parser.add_argument('--save-results', help='Write general info to file - not applicable', + default=False) + parser.add_argument('--save-soc', help='Write SOC info to file - not applicable', default=False) + parser.add_argument('--strategy', '-s', default='greedy', + help='Specify the charging strategy. One of {}. You may define \ + custom options with --strategy-option.'.format('greedy, balanced')) + parser.add_argument('--margin', '-m', metavar='X', type=float, default=0.05, + help=('Add margin for desired SOC [0.0 - 1.0].\ + margin=0.05 means the simulation will not abort if vehicles \ + reach at least 95%% of the desired SOC before leaving. \ + margin=1 -> the simulation continues with every positive SOC value.')) + parser.add_argument('--strategy-option', '-so', metavar=('KEY', 'VALUE'), + nargs=2, action='append', + help='Append additional options to the charging strategy.') + parser.add_argument('--config', help='Use config file to set arguments') + parser.add_argument('--station_data_path', help='Use station data to back calculation \ + of consumption with height information of \ + stations') + parser.add_argument('--outside_temperature_over_day_path', default=None, + help="Use csv. data with 'hour' and temperature' columns to set \ + temperatures in case they are not in trips.csv") + + parser.add_argument('--level_of_loading_over_day_path', default=None, + help="Use csv. data with 'hour' and level_of_loading' columns to set \ + level of loading in case they are not in trips.csv") + return parser \ No newline at end of file From 67364fe6bb20fe29f380fc0aa1f6cddade9daecd Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 9 Feb 2023 11:16:18 +0100 Subject: [PATCH 522/802] Make use of the util.argparser creation in main --- ebus_toolbox/__main__.py | 108 +------------------------------ tests/test_input_files/trips.csv | 4 +- tests/test_schedule.py | 91 +++++++++++++++++++++++--- 3 files changed, 84 insertions(+), 119 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 715840a2..10180e53 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,116 +1,10 @@ -import argparse import shutil from ebus_toolbox import simulate, util from pathlib import Path from datetime import datetime if __name__ == '__main__': - parser = argparse.ArgumentParser( - description='eBus-Toolbox - \ - simulation program for electric bus fleets.') - parser.add_argument('--input-schedule', nargs='?', - help='Path to CSV file containing all trips of schedule to be analyzed.') - parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], - help='Specify what you want to do. Choose one from {sim, \ - service_optimization}. sim runs a single simulation with the given inputs. \ - service optimization finds the largest set of electrified rotations.') - parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', - help='Location where all simulation outputs are stored') - parser.add_argument('--preferred-charging-type', '-pct', default='depb', - choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ - from {depb, oppb}. opp stands for opportunity.") - parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", - help='location of vehicle type definitions') - parser.add_argument('--min-recharge-deps-oppb', default=1, - help='Minimum fraction of capacity for recharge when leaving the depot.') - parser.add_argument('--min-recharge-deps-depb', default=1, - help='Minimum fraction of capacity for recharge when leaving the depot.') - parser.add_argument('--check-rotation-consistency', action='store_true', - help='Check rotation assumptions when building schedule.') - parser.add_argument('--ignore-inconsistent-rotations', action='store_true', - help='Remove rotations from schedule that violate assumptions. ') - parser.add_argument('--days', metavar='N', type=int, default=None, - help='set duration of scenario as number of days') - parser.add_argument('--interval', metavar='MIN', type=int, default=15, - help='set number of minutes for each timestep (Δt)') - parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, - help='set minimum desired SOC (0 - 1) for depot charging') - parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=0.8, - help='set minimum desired SOC (0 - 1) for opportunity charging') - parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=None, - help='max power of grid connector at opp stations') - parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=None, - help='max power of grid connector at depot stations') - parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=450, - help='max power of charging station at opp stations') - parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=100, - help='max power of charging station at depot stations for depot busses') - parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, - help='max power of charging station at depot stations for opp busses') - parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', - help='add battery with specified capacity in kWh and C-rate \ - (-1 for variable capacity, second argument is fixed power))') - parser.add_argument('--seed', default=None, type=int, help='set random seed') - parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') - parser.add_argument('--include-price-csv', - help='include CSV for energy price. \ - You may define custom options with --include-price-csv-option') - parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), - nargs=2, default=[], action='append', - help='append additional argument to price signals') - parser.add_argument('--start-date', default='2018-01-02', - help='Provide start date of simulation in format YYYY-MM-DD.E.g. ' - '2018-01-31') - parser.add_argument('--electrified-stations', help='include electrified_stations json', - default='data/examples/electrified_stations.json') - parser.add_argument('--cost-calculation', '-cc', action='store_true', - help='Calculate costs') - parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) - parser.add_argument('--min-charging-time', help='define minimum time of charging', - default=0) - parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' - 'at opp station to simulate docking procedure.', default=0) - parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' - 'start time of a vehicle event im min.', - default=10) - parser.add_argument('--visual', '-v', action='store_true', - help='Show plots of the results- not applicable', default=False) - parser.add_argument('--generate-report', '-r', help='generates and stores plots and results', - default=False) - parser.add_argument('--show-plots', - help='opens plots for user to view, only valid if generate_report=True', - default=False) - parser.add_argument('--eta', action='store_true', - help='Show estimated time to finish simulation after each step, \ - instead of progress bar. Not recommended for fast computations.') - parser.add_argument('--save-timeseries', help='Write timesteps to file - not applicable', - default=False) - parser.add_argument('--save-results', help='Write general info to file - not applicable', - default=False) - parser.add_argument('--save-soc', help='Write SOC info to file - not applicable', default=False) - parser.add_argument('--strategy', '-s', default='greedy', - help='Specify the charging strategy. One of {}. You may define \ - custom options with --strategy-option.'.format('greedy, balanced')) - parser.add_argument('--margin', '-m', metavar='X', type=float, default=0.05, - help=('Add margin for desired SOC [0.0 - 1.0].\ - margin=0.05 means the simulation will not abort if vehicles \ - reach at least 95%% of the desired SOC before leaving. \ - margin=1 -> the simulation continues with every positive SOC value.')) - parser.add_argument('--strategy-option', '-so', metavar=('KEY', 'VALUE'), - nargs=2, action='append', - help='Append additional options to the charging strategy.') - parser.add_argument('--config', help='Use config file to set arguments') - parser.add_argument('--station_data_path', help='Use station data to back calculation \ - of consumption with height information of \ - stations') - parser.add_argument('--outside_temperature_over_day_path', default=None, - help="Use csv. data with 'hour' and temperature' columns to set \ - temperatures in case they are not in trips.csv") - - parser.add_argument('--level_of_loading_over_day_path', default=None, - help="Use csv. data with 'hour' and level_of_loading' columns to set \ - level of loading in case they are not in trips.csv") - + parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True diff --git a/tests/test_input_files/trips.csv b/tests/test_input_files/trips.csv index c22bf992..0f0a1a48 100644 --- a/tests/test_input_files/trips.csv +++ b/tests/test_input_files/trips.csv @@ -1,6 +1,6 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB -LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 437e27cf..805b4e47 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -7,11 +7,12 @@ are also good support. """ import pytest - +import src.scenario from tests.helpers import generate_basic_schedule import json import pathlib -from ebus_toolbox import schedule, trip, consumption +from ebus_toolbox import schedule, trip, consumption, util + test_root = pathlib.Path(__file__).parent file_root = test_root / "test_input_files" @@ -58,9 +59,9 @@ def test_station_data_reading(self): path_to_all_station_data = file_root / "all_stations_example.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - station_data_pata=path_to_all_station_data) - assert generated_schedule.stations + self.electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) + assert generated_schedule.station_data is not None path_to_all_station_data = file_root / "not_existent_file" with pytest.warns(Warning) as record: @@ -72,14 +73,83 @@ def test_station_data_reading(self): schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) assert len(record) == 2 - assert 0 + del trip.Trip.consumption def test_rotation_consistency(self): - pass + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + output_dir = test_root / "test_output_files" + rotation_consistency_dict = dict(check_rotation_consistency=True, + ignore_inconsistent_rotations=True, + output_directory=output_dir) + + path_to_trips = file_root / "trips.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args) + + generated_schedule2 = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args, + **rotation_consistency_dict) + + assert len(generated_schedule.rotations) == len(generated_schedule2.rotations) + + + + + path_to_trips = file_root / "trips_no_einsetz.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args, + **rotation_consistency_dict) + assert len(generated_schedule.rotations) == 0 + + path_to_trips = file_root / "trips_no_aussetz.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args, + **rotation_consistency_dict) + assert len(generated_schedule.rotations) == 0 + + path_to_trips = file_root / "inconsistent_stations_trips.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args, + **rotation_consistency_dict) + assert len(generated_schedule.rotations) == 0 + + with pytest.warns(Warning) as record: + path_to_trips = file_root / "inconsistent_time_trips.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, + **mandatory_args, + check_rotation_consistency=False, + ignore_inconsistent_rotations=True, + output_directory=output_dir) + assert len(record) == 1 + def test_run(self): - pass + import argparse + parser = util.create_ArgumentParser_with_arguments() + args = parser.parse_args() + args.config = file_root / "ebus_toolbox.cfg" + args.days = None + args.seed = 5 + + + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + + path_to_all_station_data = file_root / "all_stations_example.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) + + util.set_options_from_config(args, check=False, verbose=False) + scen = generated_schedule.run(args) + + assert type(scen)==src.scenario.Scenario() + def test_assign_vehicles(self): pass @@ -107,5 +177,6 @@ def test_schedule_from_csv(self): assert len(generated_schedule.rotations) == 1 assert type(generated_schedule) == schedule.Schedule -t =TestSchedule() -t.test_station_data_reading() \ No newline at end of file + +t = TestSchedule() +t.test_run() From a34c477072c7a79a79899bc2de19b8c3ad81b8d6 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 9 Feb 2023 11:34:06 +0100 Subject: [PATCH 523/802] Fix assertion error in schedule --- ebus_toolbox/schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 38bc9386..d14d7561 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -183,7 +183,7 @@ def run(self, args): with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) scenario.run('distributed', vars(args).copy()) - assert scenario.step_i == scenario.n_intervals - 1, \ + assert scenario.step_i == scenario.n_intervals, \ 'spiceEV simulation aborted, see above for details' return scenario From ca6714e4173e2651600eb58bcd4f7905591fcccb Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 10 Feb 2023 12:30:51 +0100 Subject: [PATCH 524/802] Fix out of bounds testing and add further tests for schedule --- tests/test_input_files/ebus_toolbox.cfg | 119 ++++++++++++++++ .../inconsistent_stations_trips.csv | 6 + .../inconsistent_time_trips.csv | 6 + .../trips_assign_vehicles.csv | 16 +++ tests/test_input_files/trips_no_aussetz.csv | 6 + tests/test_input_files/trips_no_einsetz.csv | 6 + tests/test_nd_interpolate.py | 5 +- .../inconsistent_rotations.csv | 1 + tests/test_schedule.py | 131 ++++++++++++++---- 9 files changed, 265 insertions(+), 31 deletions(-) create mode 100644 tests/test_input_files/ebus_toolbox.cfg create mode 100644 tests/test_input_files/inconsistent_stations_trips.csv create mode 100644 tests/test_input_files/inconsistent_time_trips.csv create mode 100644 tests/test_input_files/trips_assign_vehicles.csv create mode 100644 tests/test_input_files/trips_no_aussetz.csv create mode 100644 tests/test_input_files/trips_no_einsetz.csv create mode 100644 tests/test_output_files/inconsistent_rotations.csv diff --git a/tests/test_input_files/ebus_toolbox.cfg b/tests/test_input_files/ebus_toolbox.cfg new file mode 100644 index 00000000..1996545d --- /dev/null +++ b/tests/test_input_files/ebus_toolbox.cfg @@ -0,0 +1,119 @@ +# Configs for the eBus Toolbox + +##### INPUT/OUTPUT FILES AND PATHS ##### + +# Input file containing trip information (required) +input_schedule = "./data/examples/trips_example.csv" + +# output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) +output_directory = "./data/sim_outputs/" + +# electrified stations (defaults to: data/examples/electrified_stations.json) +electrified_stations = "data/examples/electrified_stations.json" + +# vehicle types (defaults to: ./data/examples/vehicle_types.json) +vehicle_types = "./data/examples/vehicle_types.json" + +# Path to station data with stations heights +station_data_path = "data/examples/all_stations.csv" + +# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) +outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" + +# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) +level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" + + +##### COST CALCULATION ##### +# set flag for cost calculation: +cost_calculation = true +# cost parameters (Calculation of costs is optional, defaults to None) +cost_parameters_file = "./data/examples/cost_params.json" + + +##### SIMULATION HYPERPARAMETERS ##### +# set random seed (for always random: set seed = null) +seed = 1 + +# Options: sim, neg_depb_to_oppb, neg_oppb_to_depb, service_optimization. Default: sim +# sim runs a single simulation with the given inputs. +# neg_depb_to_oppb changes negative depb-rotations to oppb charging. +# neg_oppb_to_depb changes negative oppb-rotations to depb charging. +# service optimization finds the largest set of electrified rotations. +mode = sim + +# set length of timestep in minutes (default: 15 minute intervals) +interval = 1 + +# time difference between signal time and actual start time of a vehicle event im min. (default: 10) +signal_time_dif = 10 + +# Check rotation assumptions when building schedule? +check_rotation_consistency = false +# Remove rotations from schedule that violate assumptions? Needs check_rotation_consistency to have an effect +ignore_inconsistent_rotations = false + +##### SIMULATION CONDITIONS AND BOUNDARIES ##### + +# maximum number of days to simulate, if not set simulate entire schedule +#days = 10 + +# set minimum allowed state of charge when leaving +# distinguish between depot and opportunity station +desired_soc_deps = 1.0 +desired_soc_opps = 0.8 + +# Preferred charging type. Options: depb, oppb (default: oppb) +preferred_charging_type = "oppb" + +# min charging time at depots and opp stations [minutes] (default: 0) +min_charging_time = 0 + +# buffer time at opp station if no specific buffer time is provided +# via the electrified_stations.json [minutes] (default: 0) +# Time specific buffer times can be set via a dict like: +# {"10-22": 5, "else": 2} NOTE: else clause is a MUST! +# The buffer time is deducted off of the planned standing time. +# It may resemble things like delays and/or docking procedures +default_buffer_time_opps = 0 + + +##### PHYSICAL SETUP OF ENVIRONMENT ##### + +# minimum fraction of capacity for recharge when leaving the depot. Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) +min_recharge_deps_oppb = 1 +min_recharge_deps_depb = 1 + +# default max power of grid connectors at depot and opp stations, +# individual gc_power per gc can be defined in electrified stations +# default: Sum of max power of all charging stations at this grid connector +gc_power_opps = 1000 +gc_power_deps = 1000 + +# default max power of charging station at depot and opp stations +# at depot stations opp and depot busses have distinct charging stations (all default to: 150) +# individual cs_power per gc and cs type can be defined in electrified stations +cs_power_opps = 400 +cs_power_deps_depb = 100 +cs_power_deps_oppb = 150 + +# define hours of traffic_jam (options are "stop&go" and "dense") +#rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} + + +########### SPICE_EV SIMULATE PARAMETERS ############### + +strategy = distributed +# possible strategies: greedy, balanced, balanced_market, schedule, flex_window +# options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] +strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] + +# generate report and plots, default: false +generate_report = true +# show plots for users to view, only valid if generate_report = true +show_plots = true + +# give margin for desired SoC [0.0 - 1.0] +# margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. +# margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. +margin = 1.0 diff --git a/tests/test_input_files/inconsistent_stations_trips.csv b/tests/test_input_files/inconsistent_stations_trips.csv new file mode 100644 index 00000000..0872ab4d --- /dev/null +++ b/tests/test_input_files/inconsistent_stations_trips.csv @@ -0,0 +1,6 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB +LINE_0,Station-1,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_input_files/inconsistent_time_trips.csv b/tests/test_input_files/inconsistent_time_trips.csv new file mode 100644 index 00000000..78809c72 --- /dev/null +++ b/tests/test_input_files/inconsistent_time_trips.csv @@ -0,0 +1,6 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB +LINE_0,Station-2,2022-03-07 22:02:00,2022-03-07 22:43:00,Station-3,12000,1,CKB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB +LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_input_files/trips_assign_vehicles.csv b/tests/test_input_files/trips_assign_vehicles.csv new file mode 100644 index 00000000..90f938fa --- /dev/null +++ b/tests/test_input_files/trips_assign_vehicles.csv @@ -0,0 +1,16 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB +Einsetzfahrt,Station-0,2022-03-08 21:31:00,2022-03-08 21:31:00,Station-1,7000,2,CKB +LINE_0,Station-1,2022-03-08 21:31:00,2022-03-08 22:04:00,Station-2,10000,2,CKB +LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-3,12000,2,CKB +LINE_0,Station-3,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-4,8000,2,CKB +Aussetzfahrt,Station-4,2022-03-08 23:28:00,2022-03-08 00:03:00,Station-0,5000,2,CKB +Einsetzfahrt,Station-0,2022-03-08 21:32:00,2022-03-08 21:33:00,Station-1,7000,3,CKB +LINE_0,Station-1,2022-03-08 21:33:00,2022-03-08 22:04:00,Station-2,10000,3,CKB +LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-3,12000,3,CKB +LINE_0,Station-3,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-4,8000,3,CKB +Aussetzfahrt,Station-4,2022-03-08 23:28:00,2022-03-08 00:03:00,Station-0,5000,3,CKB \ No newline at end of file diff --git a/tests/test_input_files/trips_no_aussetz.csv b/tests/test_input_files/trips_no_aussetz.csv new file mode 100644 index 00000000..b2da8b7b --- /dev/null +++ b/tests/test_input_files/trips_no_aussetz.csv @@ -0,0 +1,6 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB +LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_input_files/trips_no_einsetz.csv b/tests/test_input_files/trips_no_einsetz.csv new file mode 100644 index 00000000..04d43dc2 --- /dev/null +++ b/tests/test_input_files/trips_no_einsetz.csv @@ -0,0 +1,6 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 3da52ad5..802e30f1 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -109,7 +109,7 @@ def test_out_of_bounds(self): point = get_outer_point(data_table, dims_out_of_bound=out_of_bounds_dim) for dim, v in enumerate(point): - if lower_bounds[dim] < v < upper_bounds[dim]: + if lower_bounds[dim] <= v <= upper_bounds[dim]: # if the value is inside of the boundaries, no stuffing at the borders has # to take place. Therefore this dimension can be skipped continue @@ -247,3 +247,6 @@ def get_random_inner_point(table): for dim in range(0, idims): point.append(random.random() * (upper_bounds[dim] - lower_bounds[dim]) + lower_bounds[dim],) return point + +t=TestNdInterpol() +t.test_out_of_bounds() \ No newline at end of file diff --git a/tests/test_output_files/inconsistent_rotations.csv b/tests/test_output_files/inconsistent_rotations.csv new file mode 100644 index 00000000..1db71adc --- /dev/null +++ b/tests/test_output_files/inconsistent_rotations.csv @@ -0,0 +1 @@ +Rotation 1: Wrong departure station diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 805b4e47..dd3db7ce 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -7,16 +7,14 @@ are also good support. """ import pytest -import src.scenario +import spice_ev.scenario as scenario from tests.helpers import generate_basic_schedule import json import pathlib from ebus_toolbox import schedule, trip, consumption, util - test_root = pathlib.Path(__file__).parent file_root = test_root / "test_input_files" -path_to_trips = file_root / "trips.csv" mandatory_args = { "min_recharge_deps_oppb": 0, @@ -43,16 +41,21 @@ def test_mandatory_options_exit(self): """ Check if the schedule creation properly throws a SystemExit error in case of missing mandatory options""" try: + # schedule creation without mandatory args schedule.Schedule(self.vehicle_types, self.electrified_stations) except SystemExit: # exception was properly thrown pass else: - raise Exception( - "Schedule initialization did not get mandatory options but did not throw an" - "exception") + # create assertion error since schedule creation did no + assert 0, "Schedule initialization did not get mandatory options but did" \ + "not throw an exception" def test_station_data_reading(self): + """ Test if the reading of the geo station data works and outputs warnings in + case the data was problematic, e.g. not numeric or not existent""" + path_to_trips = file_root / "trips.csv" + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) @@ -63,8 +66,9 @@ def test_station_data_reading(self): station_data_path=path_to_all_station_data) assert generated_schedule.station_data is not None - path_to_all_station_data = file_root / "not_existent_file" + # check if reading a non valid station.csv throws warnings with pytest.warns(Warning) as record: + path_to_all_station_data = file_root / "not_existent_file" schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) assert len(record) == 1 @@ -74,9 +78,13 @@ def test_station_data_reading(self): **mandatory_args, station_data_path=path_to_all_station_data) assert len(record) == 2 - del trip.Trip.consumption - def test_rotation_consistency(self): + """ Test if the consistency check for rotations finds missing einsetz or ausetzfahrten, + if it finds gaps between arrival and departure stations of successive trips and last + it checks if the arguments for check_rotation_consistency and ignore_inconsistent_rotations + were set correctly, i.e. if ignore_inconsistent_rotations is True, check_rotation_consistency + has to be true as well. If not a warning has to be thrown""" + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) @@ -85,39 +93,43 @@ def test_rotation_consistency(self): ignore_inconsistent_rotations=True, output_directory=output_dir) + # check if consistency check does not remove rotations of a "good" trips.csv path_to_trips = file_root / "trips.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) generated_schedule2 = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - **rotation_consistency_dict) + self.electrified_stations, + **mandatory_args, + **rotation_consistency_dict) assert len(generated_schedule.rotations) == len(generated_schedule2.rotations) - - - + # check if consistency check does removes bad rotation of a "bad" trips.csv path_to_trips = file_root / "trips_no_einsetz.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, **rotation_consistency_dict) assert len(generated_schedule.rotations) == 0 + # check if consistency check does removes bad rotation of a "bad" trips.csv path_to_trips = file_root / "trips_no_aussetz.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, **rotation_consistency_dict) assert len(generated_schedule.rotations) == 0 + # check if consistency check does removes bad rotation of a "bad" trips.csv. + # in this case a skipping of stations between trips path_to_trips = file_root / "inconsistent_stations_trips.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, **rotation_consistency_dict) assert len(generated_schedule.rotations) == 0 + # check if consistency throws warning for bad arguments with pytest.warns(Warning) as record: - path_to_trips = file_root / "inconsistent_time_trips.csv" + path_to_trips = file_root / "inconsistent_stations_trips.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, @@ -126,16 +138,15 @@ def test_rotation_consistency(self): output_directory=output_dir) assert len(record) == 1 - def test_run(self): - import argparse + """ Check if running a basic example works and if a scenario object is returned""" + path_to_trips = file_root / "trips.csv" parser = util.create_ArgumentParser_with_arguments() - args = parser.parse_args() + args = parser.parse_args(args="") args.config = file_root / "ebus_toolbox.cfg" args.days = None args.seed = 5 - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) @@ -146,28 +157,88 @@ def test_run(self): station_data_path=path_to_all_station_data) util.set_options_from_config(args, check=False, verbose=False) - scen = generated_schedule.run(args) + args.ALLOW_NEGATIVE_SOC = True + args.attach_vehicle_soc = True - assert type(scen)==src.scenario.Scenario() + scen = generated_schedule.run(args) + assert type(scen) == scenario.Scenario + return generated_schedule, scen def test_assign_vehicles(self): - pass + """ Test if assigning vehicles works as intended. + + Use a trips csv with two rotations ("1","2") a day apart. Ebus toolbox should assign + the same vehicle to both of them. rotation "3", starts shortly after "2" and should be + a new vehicle.""" + + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + + path_to_trips = file_root / "trips_assign_vehicles.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args) + generated_schedule.assign_vehicles() + + assert generated_schedule.rotations["1"].vehicle_id == \ + generated_schedule.rotations["2"].vehicle_id + assert generated_schedule.rotations["1"].vehicle_id != \ + generated_schedule.rotations["3"].vehicle_id def test_calculate_consumption(self): - pass + """ Test if calling the consumption calculation works + """ + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + + path_to_trips = file_root / "trips_assign_vehicles.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args) + # set mileage constant + mileage = 10 + for v_typ in generated_schedule.vehicle_types.values(): + for charge_typ in v_typ.values(): + charge_typ['mileage'] = mileage + calc_consumption = generated_schedule.calculate_consumption() + # set mileage to half of the prev constant + for v_typ in generated_schedule.vehicle_types.values(): + for charge_typ in v_typ.values(): + charge_typ['mileage'] = mileage / 2 + assert calc_consumption == generated_schedule.calculate_consumption() * 2 - def test_get_departure_of_first_trip(self): - pass def test_get_common_stations(self): - pass + """ Test if getting common_stations works. Rotation 1 is on the first day, rotation 2 and 3 + on the second day. rotation 1 should not share any stations with other rotations and + 2 and 3 are basically simulati + """ + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + + path_to_trips = file_root / "trips_assign_vehicles.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, **mandatory_args) + + common_stations=generated_schedule.get_common_stations(only_opps=False) + assert len(common_stations["1"]) == 0 + assert len(common_stations["2"]) == 1 + assert len(common_stations["3"]) == 1 + assert '3' in (common_stations["2"]) + assert '2' in (common_stations["3"]) - def test_generate_scenario(self): - pass def test_get_negative_rotations(self): - pass + """Check if the single rotation '1' with a negative soc is found """ + + # make use of the test_run() which has to return schedule and scenario object + sched, scen = self.test_run() + + neg_rots= sched.get_negative_rotations(scen) + assert '1' in neg_rots + def test_set_charging_type(self): pass @@ -179,4 +250,4 @@ def test_schedule_from_csv(self): t = TestSchedule() -t.test_run() +t.test_get_negative_rotations() From a0821c194e4af3aef14cb5d4d29b6fbb4ccb2b7a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 10 Feb 2023 12:34:04 +0100 Subject: [PATCH 525/802] Add test output folder --- tests/test_output_files/inconsistent_rotations.csv | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tests/test_output_files/inconsistent_rotations.csv diff --git a/tests/test_output_files/inconsistent_rotations.csv b/tests/test_output_files/inconsistent_rotations.csv deleted file mode 100644 index 1db71adc..00000000 --- a/tests/test_output_files/inconsistent_rotations.csv +++ /dev/null @@ -1 +0,0 @@ -Rotation 1: Wrong departure station From 8ffc8aa2a7a1ed931dbb3c149f68305b488d404d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 10 Feb 2023 12:39:30 +0100 Subject: [PATCH 526/802] Make flake8 happy and ignore test output folder --- .gitignore | 1 + tests/test_nd_interpolate.py | 3 --- tests/test_schedule.py | 15 +++++++-------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 382af8eb..346f01c4 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ data/preprocessing_scripts src/ spice_ev/ *.bak +/tests/test_output_files/ diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 802e30f1..3528909e 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -247,6 +247,3 @@ def get_random_inner_point(table): for dim in range(0, idims): point.append(random.random() * (upper_bounds[dim] - lower_bounds[dim]) + lower_bounds[dim],) return point - -t=TestNdInterpol() -t.test_out_of_bounds() \ No newline at end of file diff --git a/tests/test_schedule.py b/tests/test_schedule.py index dd3db7ce..eede7507 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -82,8 +82,8 @@ def test_rotation_consistency(self): """ Test if the consistency check for rotations finds missing einsetz or ausetzfahrten, if it finds gaps between arrival and departure stations of successive trips and last it checks if the arguments for check_rotation_consistency and ignore_inconsistent_rotations - were set correctly, i.e. if ignore_inconsistent_rotations is True, check_rotation_consistency - has to be true as well. If not a warning has to be thrown""" + were set correctly, i.e. if ignore_inconsistent_rotations is True, + check_rotation_consistency has to be true as well. If not a warning has to be thrown""" trip.Trip.consumption = consumption.Consumption(self.vehicle_types, outside_temperatures=self.temperature_path, @@ -139,7 +139,9 @@ def test_rotation_consistency(self): assert len(record) == 1 def test_run(self): - """ Check if running a basic example works and if a scenario object is returned""" + """ Check if running a basic example works and if a scenario object is returned + :return: schedule, scenario""" + path_to_trips = file_root / "trips.csv" parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args(args="") @@ -208,7 +210,6 @@ def test_calculate_consumption(self): charge_typ['mileage'] = mileage / 2 assert calc_consumption == generated_schedule.calculate_consumption() * 2 - def test_get_common_stations(self): """ Test if getting common_stations works. Rotation 1 is on the first day, rotation 2 and 3 on the second day. rotation 1 should not share any stations with other rotations and @@ -222,24 +223,22 @@ def test_get_common_stations(self): generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) - common_stations=generated_schedule.get_common_stations(only_opps=False) + common_stations = generated_schedule.get_common_stations(only_opps=False) assert len(common_stations["1"]) == 0 assert len(common_stations["2"]) == 1 assert len(common_stations["3"]) == 1 assert '3' in (common_stations["2"]) assert '2' in (common_stations["3"]) - def test_get_negative_rotations(self): """Check if the single rotation '1' with a negative soc is found """ # make use of the test_run() which has to return schedule and scenario object sched, scen = self.test_run() - neg_rots= sched.get_negative_rotations(scen) + neg_rots = sched.get_negative_rotations(scen) assert '1' in neg_rots - def test_set_charging_type(self): pass From 2b9eae5047340c15a67d67a29385ed7a69633232 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 10 Feb 2023 12:44:08 +0100 Subject: [PATCH 527/802] Make flak8 happpy for util --- ebus_toolbox/util.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 27683589..5cbd81e9 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -3,6 +3,7 @@ import subprocess import argparse + def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() @@ -267,8 +268,8 @@ def create_ArgumentParser_with_arguments(): help='Path to CSV file containing all trips of schedule to be analyzed.') parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], help='Specify what you want to do. Choose one from {sim, \ - service_optimization}. sim runs a single simulation with the given inputs. \ - service optimization finds the largest set of electrified rotations.') + service_optimization}. sim runs a single simulation with the given inputs.\ + service optimization finds the largest set of electrified rotations.') parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') parser.add_argument('--preferred-charging-type', '-pct', default='depb', @@ -323,8 +324,9 @@ def create_ArgumentParser_with_arguments(): parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) parser.add_argument('--min-charging-time', help='define minimum time of charging', default=0) - parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' - 'at opp station to simulate docking procedure.', + parser.add_argument('--default-buffer-time-opps', + help='time to subtract off of standing time ' + 'at opp station to simulate docking procedure.', default=0) parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' 'start time of a vehicle event im min.', @@ -357,7 +359,7 @@ def create_ArgumentParser_with_arguments(): help='Append additional options to the charging strategy.') parser.add_argument('--config', help='Use config file to set arguments') parser.add_argument('--station_data_path', help='Use station data to back calculation \ - of consumption with height information of \ + of consumption with height information of \ stations') parser.add_argument('--outside_temperature_over_day_path', default=None, help="Use csv. data with 'hour' and temperature' columns to set \ @@ -366,4 +368,4 @@ def create_ArgumentParser_with_arguments(): parser.add_argument('--level_of_loading_over_day_path', default=None, help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") - return parser \ No newline at end of file + return parser From a76ed902148ff385b058441df952b0be449d43cd Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 13 Feb 2023 10:25:27 +0100 Subject: [PATCH 528/802] Add test and files for feed-in, external load and battery test --- tests/test_input_files/ebus_toolbox.cfg | 14 +- .../electrified_stations_with_feeds.json | 93 ++++++++++ .../example_external_load.csv | 169 ++++++++++++++++++ tests/test_input_files/example_pv_feedin.csv | 169 ++++++++++++++++++ tests/test_schedule.py | 67 ++++++- 5 files changed, 499 insertions(+), 13 deletions(-) create mode 100644 tests/test_input_files/electrified_stations_with_feeds.json create mode 100644 tests/test_input_files/example_external_load.csv create mode 100644 tests/test_input_files/example_pv_feedin.csv diff --git a/tests/test_input_files/ebus_toolbox.cfg b/tests/test_input_files/ebus_toolbox.cfg index 1996545d..0b436390 100644 --- a/tests/test_input_files/ebus_toolbox.cfg +++ b/tests/test_input_files/ebus_toolbox.cfg @@ -3,32 +3,32 @@ ##### INPUT/OUTPUT FILES AND PATHS ##### # Input file containing trip information (required) -input_schedule = "./data/examples/trips_example.csv" +input_schedule = "./tests/test_input_files/trips_example.csv" # output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) output_directory = "./data/sim_outputs/" # electrified stations (defaults to: data/examples/electrified_stations.json) -electrified_stations = "data/examples/electrified_stations.json" +electrified_stations = "tests/test_input_files/electrified_stations.json" # vehicle types (defaults to: ./data/examples/vehicle_types.json) -vehicle_types = "./data/examples/vehicle_types.json" +vehicle_types = ".tests/test_input_files/vehicle_types.json" # Path to station data with stations heights -station_data_path = "data/examples/all_stations.csv" +station_data_path = "tests/test_input_files/all_stations.csv" # Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" +outside_temperature_over_day_path = "tests/test_input_files/default_temp_winter.csv" # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" +level_of_loading_over_day_path = "tests/test_input_files/default_level_of_loading_over_day.csv" ##### COST CALCULATION ##### # set flag for cost calculation: cost_calculation = true # cost parameters (Calculation of costs is optional, defaults to None) -cost_parameters_file = "./data/examples/cost_params.json" +cost_parameters_file = "./tests/test_input_files/cost_params.json" ##### SIMULATION HYPERPARAMETERS ##### diff --git a/tests/test_input_files/electrified_stations_with_feeds.json b/tests/test_input_files/electrified_stations_with_feeds.json new file mode 100644 index 00000000..85525970 --- /dev/null +++ b/tests/test_input_files/electrified_stations_with_feeds.json @@ -0,0 +1,93 @@ +{ + "Station-0": { + "type": "deps", + "n_charging_stations": null, + "distance_to_grid": 150, + "energy_feed_in": { + "csv_file": "data/examples/example_pv_feedin.csv", + "start_time": "2022-03-07T00:00:00", + "step_duration_s": 3600, + "column": "Feed-in Total (kW)", + "nominal_power": 10, + "factor": 1 + }, + "external_load": { + "csv_file": "data/examples/example_external_load.csv", + "start_time": "2022-03-07T00:00:00", + "step_duration_s": 900, + "column": "External Load (kW)", + "factor": 2 + }, + "voltage_level" : "MV", + "battery": { + "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required + "capacity": 300, // kWh, assumed to be infinite if not given + "min_charging_power": 0, // kW, optional + "soc": 0, // initial state of charge [0-1], optional + "efficiency": 0.95, // optional + "discharge_curve": null // optional, same as charging curve + }, + "cs_power_deps_oppb" : 50, // optional: maximum cs power can be defined per station + "cs_power_deps_depb" : 120 // optional: maximum cs power can be defined per station + }, + "Station-3": { + "type": "opps", + "n_charging_stations": 3, + "voltage_level" : "MV", + "energy_feed_in": { + "csv_file": "data/examples/example_pv_feedin.csv", + "start_time": "2022-03-08T00:00:00", + "step_duration_s": 3600, + "column": "Feed-in Total (kW)", + "nominal_power": 2, + "factor": 0.5 + } + }, + "Station-10": { + "type": "opps", + "n_charging_stations": 1, + "voltage_level" : "MV", + "gc_power": 250, // optional: maximum gc power can be defined per station + "cs_power_opps" : 140 // optional: maximum cs power can be defined per station + }, + "Station-21": { + "type": "opps", + "n_charging_stations": 2, + "voltage_level" : "MV" + }, + "Station-22": { + "type": "deps", + "n_charging_stations": null, + "voltage_level" : "MV" + }, + "Station-26": { + "type": "opps", + "n_charging_stations": 5, + "voltage_level" : "MV" + }, + "Station-28": { + "type": "opps", + "n_charging_stations": 4, + "voltage_level" : "MV" + }, + "Station-30": { + "type": "opps", + "n_charging_stations": 4, + "voltage_level" : "MV" + }, + "Station-32": { + "type": "opps", + "n_charging_stations": 3, + "voltage_level" : "MV" + }, + "Station-39": { + "type": "opps", + "n_charging_stations": 5, + "voltage_level" : "MV" + }, + "Station-42": { + "type": "deps", + "n_charging_stations": null, + "voltage_level" : "MV" + } +} diff --git a/tests/test_input_files/example_external_load.csv b/tests/test_input_files/example_external_load.csv new file mode 100644 index 00000000..a6e10456 --- /dev/null +++ b/tests/test_input_files/example_external_load.csv @@ -0,0 +1,169 @@ +time,External Load (kW) +2018-01-01 00:00:00+01:00,5.16 +2018-01-01 01:00:00+01:00,35.48 +2018-01-01 02:00:00+01:00,6.00 +2018-01-01 03:00:00+01:00,4.11 +2018-01-01 04:00:00+01:00,33.82 +2018-01-01 05:00:00+01:00,15.24 +2018-01-01 06:00:00+01:00,8.14 +2018-01-01 07:00:00+01:00,14.29 +2018-01-01 08:00:00+01:00,28.21 +2018-01-01 09:00:00+01:00,11.47 +2018-01-01 10:00:00+01:00,10.48 +2018-01-01 11:00:00+01:00,18.22 +2018-01-01 12:00:00+01:00,37.40 +2018-01-01 13:00:00+01:00,34.82 +2018-01-01 14:00:00+01:00,4.60 +2018-01-01 15:00:00+01:00,31.82 +2018-01-01 16:00:00+01:00,29.10 +2018-01-01 17:00:00+01:00,22.37 +2018-01-01 18:00:00+01:00,15.62 +2018-01-01 19:00:00+01:00,8.29 +2018-01-01 20:00:00+01:00,33.94 +2018-01-01 21:00:00+01:00,3.23 +2018-01-01 22:00:00+01:00,23.44 +2018-01-01 23:00:00+01:00,17.28 +2018-01-02 00:00:00+01:00,10.01 +2018-01-02 01:00:00+01:00,32.82 +2018-01-02 02:00:00+01:00,12.49 +2018-01-02 03:00:00+01:00,7.27 +2018-01-02 04:00:00+01:00,37.27 +2018-01-02 05:00:00+01:00,34.28 +2018-01-02 06:00:00+01:00,25.58 +2018-01-02 07:00:00+01:00,18.00 +2018-01-02 08:00:00+01:00,7.90 +2018-01-02 09:00:00+01:00,1.88 +2018-01-02 10:00:00+01:00,19.48 +2018-01-02 11:00:00+01:00,21.86 +2018-01-02 12:00:00+01:00,0.67 +2018-01-02 13:00:00+01:00,3.62 +2018-01-02 14:00:00+01:00,4.61 +2018-01-02 15:00:00+01:00,17.42 +2018-01-02 16:00:00+01:00,39.72 +2018-01-02 17:00:00+01:00,26.93 +2018-01-02 18:00:00+01:00,7.25 +2018-01-02 19:00:00+01:00,6.29 +2018-01-02 20:00:00+01:00,15.48 +2018-01-02 21:00:00+01:00,1.89 +2018-01-02 22:00:00+01:00,38.54 +2018-01-02 23:00:00+01:00,36.71 +2018-01-03 00:00:00+01:00,0.63 +2018-01-03 01:00:00+01:00,15.72 +2018-01-03 02:00:00+01:00,14.13 +2018-01-03 03:00:00+01:00,6.39 +2018-01-03 04:00:00+01:00,11.81 +2018-01-03 05:00:00+01:00,30.54 +2018-01-03 06:00:00+01:00,1.67 +2018-01-03 07:00:00+01:00,10.25 +2018-01-03 08:00:00+01:00,19.56 +2018-01-03 09:00:00+01:00,28.35 +2018-01-03 10:00:00+01:00,30.06 +2018-01-03 11:00:00+01:00,12.46 +2018-01-03 12:00:00+01:00,21.00 +2018-01-03 13:00:00+01:00,16.93 +2018-01-03 14:00:00+01:00,26.33 +2018-01-03 15:00:00+01:00,11.79 +2018-01-03 16:00:00+01:00,31.70 +2018-01-03 17:00:00+01:00,33.23 +2018-01-03 18:00:00+01:00,15.07 +2018-01-03 19:00:00+01:00,6.85 +2018-01-03 20:00:00+01:00,18.43 +2018-01-03 21:00:00+01:00,15.52 +2018-01-03 22:00:00+01:00,3.19 +2018-01-03 23:00:00+01:00,1.38 +2018-01-04 00:00:00+01:00,38.34 +2018-01-04 01:00:00+01:00,22.72 +2018-01-04 02:00:00+01:00,6.04 +2018-01-04 03:00:00+01:00,5.20 +2018-01-04 04:00:00+01:00,13.89 +2018-01-04 05:00:00+01:00,1.95 +2018-01-04 06:00:00+01:00,17.37 +2018-01-04 07:00:00+01:00,10.18 +2018-01-04 08:00:00+01:00,31.57 +2018-01-04 09:00:00+01:00,1.85 +2018-01-04 10:00:00+01:00,27.54 +2018-01-04 11:00:00+01:00,15.15 +2018-01-04 12:00:00+01:00,27.39 +2018-01-04 13:00:00+01:00,1.07 +2018-01-04 14:00:00+01:00,15.87 +2018-01-04 15:00:00+01:00,8.68 +2018-01-04 16:00:00+01:00,11.23 +2018-01-04 17:00:00+01:00,32.89 +2018-01-04 18:00:00+01:00,36.06 +2018-01-04 19:00:00+01:00,17.42 +2018-01-04 20:00:00+01:00,26.70 +2018-01-04 21:00:00+01:00,32.41 +2018-01-04 22:00:00+01:00,27.35 +2018-01-04 23:00:00+01:00,2.69 +2018-01-05 00:00:00+01:00,36.49 +2018-01-05 01:00:00+01:00,36.07 +2018-01-05 02:00:00+01:00,28.91 +2018-01-05 03:00:00+01:00,29.32 +2018-01-05 04:00:00+01:00,39.44 +2018-01-05 05:00:00+01:00,7.89 +2018-01-05 06:00:00+01:00,8.04 +2018-01-05 07:00:00+01:00,33.84 +2018-01-05 08:00:00+01:00,26.80 +2018-01-05 09:00:00+01:00,38.52 +2018-01-05 10:00:00+01:00,33.08 +2018-01-05 11:00:00+01:00,11.39 +2018-01-05 12:00:00+01:00,39.39 +2018-01-05 13:00:00+01:00,29.03 +2018-01-05 14:00:00+01:00,12.59 +2018-01-05 15:00:00+01:00,30.77 +2018-01-05 16:00:00+01:00,37.99 +2018-01-05 17:00:00+01:00,27.89 +2018-01-05 18:00:00+01:00,0.32 +2018-01-05 19:00:00+01:00,22.43 +2018-01-05 20:00:00+01:00,0.25 +2018-01-05 21:00:00+01:00,25.04 +2018-01-05 22:00:00+01:00,11.68 +2018-01-05 23:00:00+01:00,6.74 +2018-01-06 00:00:00+01:00,36.65 +2018-01-06 01:00:00+01:00,17.65 +2018-01-06 02:00:00+01:00,9.48 +2018-01-06 03:00:00+01:00,27.64 +2018-01-06 04:00:00+01:00,22.12 +2018-01-06 05:00:00+01:00,17.45 +2018-01-06 06:00:00+01:00,11.22 +2018-01-06 07:00:00+01:00,9.37 +2018-01-06 08:00:00+01:00,35.61 +2018-01-06 09:00:00+01:00,8.27 +2018-01-06 10:00:00+01:00,11.68 +2018-01-06 11:00:00+01:00,33.98 +2018-01-06 12:00:00+01:00,36.31 +2018-01-06 13:00:00+01:00,33.21 +2018-01-06 14:00:00+01:00,37.04 +2018-01-06 15:00:00+01:00,8.37 +2018-01-06 16:00:00+01:00,4.22 +2018-01-06 17:00:00+01:00,12.98 +2018-01-06 18:00:00+01:00,14.96 +2018-01-06 19:00:00+01:00,19.94 +2018-01-06 20:00:00+01:00,5.09 +2018-01-06 21:00:00+01:00,37.47 +2018-01-06 22:00:00+01:00,16.43 +2018-01-06 23:00:00+01:00,31.26 +2018-01-07 00:00:00+01:00,10.79 +2018-01-07 01:00:00+01:00,7.06 +2018-01-07 02:00:00+01:00,39.06 +2018-01-07 03:00:00+01:00,12.52 +2018-01-07 04:00:00+01:00,34.01 +2018-01-07 05:00:00+01:00,9.36 +2018-01-07 06:00:00+01:00,22.25 +2018-01-07 07:00:00+01:00,31.88 +2018-01-07 08:00:00+01:00,27.65 +2018-01-07 09:00:00+01:00,5.76 +2018-01-07 10:00:00+01:00,38.97 +2018-01-07 11:00:00+01:00,22.58 +2018-01-07 12:00:00+01:00,18.30 +2018-01-07 13:00:00+01:00,8.78 +2018-01-07 14:00:00+01:00,37.14 +2018-01-07 15:00:00+01:00,9.10 +2018-01-07 16:00:00+01:00,38.67 +2018-01-07 17:00:00+01:00,36.16 +2018-01-07 18:00:00+01:00,4.79 +2018-01-07 19:00:00+01:00,12.90 +2018-01-07 20:00:00+01:00,28.39 +2018-01-07 21:00:00+01:00,20.73 +2018-01-07 22:00:00+01:00,39.39 +2018-01-07 23:00:00+01:00,23.12 diff --git a/tests/test_input_files/example_pv_feedin.csv b/tests/test_input_files/example_pv_feedin.csv new file mode 100644 index 00000000..7725d8cc --- /dev/null +++ b/tests/test_input_files/example_pv_feedin.csv @@ -0,0 +1,169 @@ +time,Feed-in Total (kW) +2018-01-01 00:00:00+01:00,0.0 +2018-01-01 01:00:00+01:00,0.0 +2018-01-01 02:00:00+01:00,0.0 +2018-01-01 03:00:00+01:00,0.0 +2018-01-01 04:00:00+01:00,0.0 +2018-01-01 05:00:00+01:00,0.0 +2018-01-01 06:00:00+01:00,0.0 +2018-01-01 07:00:00+01:00,0.0 +2018-01-01 08:00:00+01:00,0.0 +2018-01-01 09:00:00+01:00,20.59949737304199 +2018-01-01 10:00:00+01:00,57.44536767395442 +2018-01-01 11:00:00+01:00,87.80795648835002 +2018-01-01 12:00:00+01:00,82.4312872827236 +2018-01-01 13:00:00+01:00,60.73295277209872 +2018-01-01 14:00:00+01:00,38.57275076938971 +2018-01-01 15:00:00+01:00,0.0 +2018-01-01 16:00:00+01:00,0.0 +2018-01-01 17:00:00+01:00,0.0 +2018-01-01 18:00:00+01:00,0.0 +2018-01-01 19:00:00+01:00,0.0 +2018-01-01 20:00:00+01:00,0.0 +2018-01-01 21:00:00+01:00,0.0 +2018-01-01 22:00:00+01:00,0.0 +2018-01-01 23:00:00+01:00,0.0 +2018-01-02 00:00:00+01:00,0.0 +2018-01-02 01:00:00+01:00,0.0 +2018-01-02 02:00:00+01:00,0.0 +2018-01-02 03:00:00+01:00,0.0 +2018-01-02 04:00:00+01:00,0.0 +2018-01-02 05:00:00+01:00,0.0 +2018-01-02 06:00:00+01:00,0.0 +2018-01-02 07:00:00+01:00,0.0 +2018-01-02 08:00:00+01:00,0.0 +2018-01-02 09:00:00+01:00,0.9282483231458806 +2018-01-02 10:00:00+01:00,6.522839084117224 +2018-01-02 11:00:00+01:00,18.113391973670502 +2018-01-02 12:00:00+01:00,23.93442006207004 +2018-01-02 13:00:00+01:00,19.02198413802917 +2018-01-02 14:00:00+01:00,3.7944513234994064 +2018-01-02 15:00:00+01:00,0.0 +2018-01-02 16:00:00+01:00,0.0 +2018-01-02 17:00:00+01:00,0.0 +2018-01-02 18:00:00+01:00,0.0 +2018-01-02 19:00:00+01:00,0.0 +2018-01-02 20:00:00+01:00,0.0 +2018-01-02 21:00:00+01:00,0.0 +2018-01-02 22:00:00+01:00,0.0 +2018-01-02 23:00:00+01:00,0.0 +2018-01-03 00:00:00+01:00,0.0 +2018-01-03 01:00:00+01:00,0.0 +2018-01-03 02:00:00+01:00,0.0 +2018-01-03 03:00:00+01:00,0.0 +2018-01-03 04:00:00+01:00,0.0 +2018-01-03 05:00:00+01:00,0.0 +2018-01-03 06:00:00+01:00,0.0 +2018-01-03 07:00:00+01:00,0.0 +2018-01-03 08:00:00+01:00,0.0 +2018-01-03 09:00:00+01:00,0.0 +2018-01-03 10:00:00+01:00,0.0 +2018-01-03 11:00:00+01:00,3.1043054608116027 +2018-01-03 12:00:00+01:00,44.500155163804976 +2018-01-03 13:00:00+01:00,48.60707644284791 +2018-01-03 14:00:00+01:00,5.352609987933698 +2018-01-03 15:00:00+01:00,0.0 +2018-01-03 16:00:00+01:00,0.0 +2018-01-03 17:00:00+01:00,0.0 +2018-01-03 18:00:00+01:00,0.0 +2018-01-03 19:00:00+01:00,0.0 +2018-01-03 20:00:00+01:00,0.0 +2018-01-03 21:00:00+01:00,0.0 +2018-01-03 22:00:00+01:00,0.0 +2018-01-03 23:00:00+01:00,0.0 +2018-01-04 00:00:00+01:00,0.0 +2018-01-04 01:00:00+01:00,0.0 +2018-01-04 02:00:00+01:00,0.0 +2018-01-04 03:00:00+01:00,0.0 +2018-01-04 04:00:00+01:00,0.0 +2018-01-04 05:00:00+01:00,0.0 +2018-01-04 06:00:00+01:00,0.0 +2018-01-04 07:00:00+01:00,0.0 +2018-01-04 08:00:00+01:00,0.0 +2018-01-04 09:00:00+01:00,2.412911528138851 +2018-01-04 10:00:00+01:00,7.735581619871407 +2018-01-04 11:00:00+01:00,21.291168270279613 +2018-01-04 12:00:00+01:00,40.94436918414178 +2018-01-04 13:00:00+01:00,42.373288765911056 +2018-01-04 14:00:00+01:00,29.225648212630627 +2018-01-04 15:00:00+01:00,0.0 +2018-01-04 16:00:00+01:00,0.0 +2018-01-04 17:00:00+01:00,0.0 +2018-01-04 18:00:00+01:00,0.0 +2018-01-04 19:00:00+01:00,0.0 +2018-01-04 20:00:00+01:00,0.0 +2018-01-04 21:00:00+01:00,0.0 +2018-01-04 22:00:00+01:00,0.0 +2018-01-04 23:00:00+01:00,0.0 +2018-01-05 00:00:00+01:00,0.0 +2018-01-05 01:00:00+01:00,0.0 +2018-01-05 02:00:00+01:00,0.0 +2018-01-05 03:00:00+01:00,0.0 +2018-01-05 04:00:00+01:00,0.0 +2018-01-05 05:00:00+01:00,0.0 +2018-01-05 06:00:00+01:00,0.0 +2018-01-05 07:00:00+01:00,0.0 +2018-01-05 08:00:00+01:00,0.0 +2018-01-05 09:00:00+01:00,19.40043544618326 +2018-01-05 10:00:00+01:00,17.78003649979294 +2018-01-05 11:00:00+01:00,19.1828395051374 +2018-01-05 12:00:00+01:00,17.28758152431003 +2018-01-05 13:00:00+01:00,37.19451480924751 +2018-01-05 14:00:00+01:00,26.347029652712724 +2018-01-05 15:00:00+01:00,0.0 +2018-01-05 16:00:00+01:00,0.0 +2018-01-05 17:00:00+01:00,0.0 +2018-01-05 18:00:00+01:00,0.0 +2018-01-05 19:00:00+01:00,0.0 +2018-01-05 20:00:00+01:00,0.0 +2018-01-05 21:00:00+01:00,0.0 +2018-01-05 22:00:00+01:00,0.0 +2018-01-05 23:00:00+01:00,0.0 +2018-01-06 00:00:00+01:00,0.0 +2018-01-06 01:00:00+01:00,0.0 +2018-01-06 02:00:00+01:00,0.0 +2018-01-06 03:00:00+01:00,0.0 +2018-01-06 04:00:00+01:00,0.0 +2018-01-06 05:00:00+01:00,0.0 +2018-01-06 06:00:00+01:00,0.0 +2018-01-06 07:00:00+01:00,0.0 +2018-01-06 08:00:00+01:00,0.0 +2018-01-06 09:00:00+01:00,24.258760014041247 +2018-01-06 10:00:00+01:00,54.91375116003941 +2018-01-06 11:00:00+01:00,85.00597424688478 +2018-01-06 12:00:00+01:00,85.90006197264941 +2018-01-06 13:00:00+01:00,67.37653052865542 +2018-01-06 14:00:00+01:00,31.174064306596133 +2018-01-06 15:00:00+01:00,0.0 +2018-01-06 16:00:00+01:00,0.0 +2018-01-06 17:00:00+01:00,0.0 +2018-01-06 18:00:00+01:00,0.0 +2018-01-06 19:00:00+01:00,0.0 +2018-01-06 20:00:00+01:00,0.0 +2018-01-06 21:00:00+01:00,0.0 +2018-01-06 22:00:00+01:00,0.0 +2018-01-06 23:00:00+01:00,0.0 +2018-01-07 00:00:00+01:00,0.0 +2018-01-07 01:00:00+01:00,0.0 +2018-01-07 02:00:00+01:00,0.0 +2018-01-07 03:00:00+01:00,0.0 +2018-01-07 04:00:00+01:00,0.0 +2018-01-07 05:00:00+01:00,0.0 +2018-01-07 06:00:00+01:00,0.0 +2018-01-07 07:00:00+01:00,0.0 +2018-01-07 08:00:00+01:00,0.0 +2018-01-07 09:00:00+01:00,8.361867062873221 +2018-01-07 10:00:00+01:00,26.028288674715704 +2018-01-07 11:00:00+01:00,43.634635884057296 +2018-01-07 12:00:00+01:00,34.49380141729803 +2018-01-07 13:00:00+01:00,36.91816671510759 +2018-01-07 14:00:00+01:00,33.35423932538908 +2018-01-07 15:00:00+01:00,0.652259558172688 +2018-01-07 16:00:00+01:00,0.0 +2018-01-07 17:00:00+01:00,0.0 +2018-01-07 18:00:00+01:00,0.0 +2018-01-07 19:00:00+01:00,0.0 +2018-01-07 20:00:00+01:00,0.0 +2018-01-07 21:00:00+01:00,0.0 +2018-01-07 22:00:00+01:00,0.0 +2018-01-07 23:00:00+01:00,0.0 diff --git a/tests/test_schedule.py b/tests/test_schedule.py index eede7507..ff47bd00 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -138,7 +138,7 @@ def test_rotation_consistency(self): output_directory=output_dir) assert len(record) == 1 - def test_run(self): + def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned :return: schedule, scenario""" @@ -234,11 +234,70 @@ def test_get_negative_rotations(self): """Check if the single rotation '1' with a negative soc is found """ # make use of the test_run() which has to return schedule and scenario object - sched, scen = self.test_run() + sched, scen = self.test_basic_run() neg_rots = sched.get_negative_rotations(scen) assert '1' in neg_rots + def test_scenario_with_feed_in(self): + """ Check if running a example with an extended electrified stations file + with feed in, external load and battery works and if a scenario object is returned""" + + path_to_trips = file_root / "trips.csv" + parser = util.create_ArgumentParser_with_arguments() + args = parser.parse_args(args="") + args.config = file_root / "ebus_toolbox.cfg" + electrified_stations_path = file_root / "electrified_stations_with_feeds.json" + args.electrified_stations = electrified_stations_path + with open(electrified_stations_path, "r", encoding='utf-8') as file: + electrified_stations = util.uncomment_json_file(file) + args.days = None + args.seed = 5 + + trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + + path_to_all_station_data = file_root / "all_stations_example.csv" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) + + util.set_options_from_config(args, check=False, verbose=False) + args.ALLOW_NEGATIVE_SOC = True + args.attach_vehicle_soc = True + scen = generated_schedule.generate_scenario(args) + assert "Station-0" in scen.components.photovoltaics + assert "Station-3" in scen.components.photovoltaics + assert "Station-0" in scen.components.batteries + assert scen.components.batteries["Station-0"].capacity == 300 + assert scen.components.batteries["Station-0"].efficiency == 0.95 + assert scen.components.batteries["Station-0"].min_charging_power == 0 + scen = generated_schedule.run(args) + assert type(scen) == scenario.Scenario + + with open(electrified_stations_path, "r", encoding='utf-8') as file: + electrified_stations = util.uncomment_json_file(file) + + electrified_stations["Station-0"]["energy_feed_in"]["csv_file"] = file_root / "not_a_file" + electrified_stations["Station-0"]["external_load"]["csv_file"] = file_root / "not_a_file" + generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) + + util.set_options_from_config(args, check=False, verbose=False) + + # check that 2 user warnings are put put for missing files and an error is thrown + with pytest.warns(Warning) as record: + try: + scen = generated_schedule.generate_scenario(args) + except FileNotFoundError: + user_warning_count = sum([1 for warning in record.list + if warning.category == UserWarning]) + assert user_warning_count == 2 + else: + assert 0, "No error despite wrong file paths" + def test_set_charging_type(self): pass @@ -246,7 +305,3 @@ def test_schedule_from_csv(self): generated_schedule = generate_basic_schedule() assert len(generated_schedule.rotations) == 1 assert type(generated_schedule) == schedule.Schedule - - -t = TestSchedule() -t.test_get_negative_rotations() From bca3118e3b87928fa8ade76832a42217231dd9cf Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 13 Feb 2023 10:36:43 +0100 Subject: [PATCH 529/802] Create folder for test output --- tests/test_output_files/.gitkeep | Bin 0 -> 14 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/test_output_files/.gitkeep diff --git a/tests/test_output_files/.gitkeep b/tests/test_output_files/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..879f93e62bd93fa43424606fe0d5d0b64058c439 GIT binary patch literal 14 VcmezWuY@6$p@N}=ftP`c0RSrq1KI!p literal 0 HcmV?d00001 From 384f9f6d1efaa291a7fc2a450bf821cf48979487 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 13 Feb 2023 10:46:06 +0100 Subject: [PATCH 530/802] Remove test header --- tests/test_schedule.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index ff47bd00..b1703b0f 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -1,11 +1,3 @@ -""" -run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` -pytest will look for all files starting with "test_" and run all functions -within this file. For basic example of tests you can look at our workshop -https://github.com/rl-institut/workshop/tree/master/test-driven-development. -Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html -are also good support. -""" import pytest import spice_ev.scenario as scenario from tests.helpers import generate_basic_schedule @@ -251,6 +243,7 @@ def test_scenario_with_feed_in(self): args.electrified_stations = electrified_stations_path with open(electrified_stations_path, "r", encoding='utf-8') as file: electrified_stations = util.uncomment_json_file(file) + args.days = None args.seed = 5 From 86fdc907629881e8b568736950660392db9dc532 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 13 Feb 2023 10:56:26 +0100 Subject: [PATCH 531/802] Delete optimizer config --- ebus_toolbox/optimizer_config.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ebus_toolbox/optimizer_config.py diff --git a/ebus_toolbox/optimizer_config.py b/ebus_toolbox/optimizer_config.py deleted file mode 100644 index e69de29b..00000000 From 40dca4948699f1a45b3bb50340b8437759852759 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Feb 2023 13:12:25 +0100 Subject: [PATCH 532/802] First commit for optimizer testing --- data/examples/optimizer.cfg | 1 + ebus_toolbox/optimizer_util.py | 10 ++-- ebus_toolbox/station_optimization.py | 20 ++++---- ebus_toolbox/station_optimizer.py | 6 +-- tests/test_input_files/optimizer.cfg | 71 ++++++++++++++++++++++++++++ tests/test_station_optimization.py | 17 +++++++ 6 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 tests/test_input_files/optimizer.cfg create mode 100644 tests/test_station_optimization.py diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg index 65b3d5b8..8e28504d 100644 --- a/data/examples/optimizer.cfg +++ b/data/examples/optimizer.cfg @@ -40,6 +40,7 @@ rebase_scenario = False pickle_rebased= False pickle_rebased_name=bvg_rebase_all_electrified run_only_neg=False +run_only_oppb = True pruning_threshold=0 # "greedy" or "deep" without "" diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 1a72e156..12c61597 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -25,7 +25,7 @@ class ChargingEvent: """ Class to gather information about a charging event""" - def __init__(self, start_idx, end_idx,arrival_time, start_time, end_time, buffer_time, + def __init__(self, start_idx, end_idx, arrival_time, start_time, end_time, buffer_time, vehicle_id, capacity, station_name, rotation): self.start_idx = start_idx @@ -87,6 +87,7 @@ def __init__(self): self.node_choice = None self.max_brute_loop = None self.run_only_neg = None + self.run_only_depb = None self.estimation_threshold = None self.output_path = None self.check_for_must_stations = None @@ -180,6 +181,7 @@ def read_config(config_path): conf.node_choice = optimizer.get("node_choice", "step-by-step") conf.max_brute_loop = int(optimizer.get("max_brute_loop", "20")) conf.run_only_neg = optimizer.getboolean("run_only_neg", False) + conf.run_only_depb = optimizer.getboolean("run_only_depb", False) conf.estimation_threshold = float(optimizer.get("estimation_threshold", "0.8")) conf.output_path = optimizer.get("output_path") conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) @@ -213,6 +215,7 @@ def get_charging_time(trip1, trip2, args): return 0 return max(0, standing_time_min) + def get_charging_start(trip1, args): """ Returns the possible start of charging consindering buffer times @@ -223,6 +226,7 @@ def get_charging_start(trip1, args): buffer_time = get_buffer_time(trip1, args.default_buffer_time_opps) return trip1.arrival_time+buffer_time + def get_buffer_time(trip, default_buffer_time_opps): """ Return the buffer time as timedelta object :param trip: trip object @@ -589,7 +593,6 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal :param electrified_stations: dict of electrified stations. Default value None means no further stations are electrified :param cost_calc: should the cost be calculated - :raises SystemExit: in case of wrong cost calculation file :return: schedule and scenario objects after spiceev simulation """ this_sched2 = copy(this_sched) @@ -613,7 +616,8 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " "does not exist. Exiting...") calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) - except: + except Exception as e: + warnings.warn("Cost Calculation was ignored due to some error :", e) pass return this_sched2, new_scen diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 803ff38c..00449a9a 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -54,7 +54,8 @@ def main(): """ main call""" util.print_time() config_path = "./data/examples/optimizer.cfg" - opt_sched, opt_scen= run_optimization(config_path) + conf = util.read_config(config_path) + opt_sched, opt_scen = run_optimization(conf) util.print_time() import pickle with open("schedule_opt.pickle", "wb") as f: @@ -80,14 +81,14 @@ def prepare_filesystem(this_args, conf): shutil.copy(copy_file, destination) -def run_optimization(config_path, sched=None, scen=None, this_args=None): +def run_optimization(conf, sched=None, scen=None, this_args=None): """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. The optimizer config file is used for setting the optimization up. - :param config_path: path to optimizer.cfg file. - :type config_path: str + :param conf: Configuration object of optimization + :type conf: OptimizerConfig :param sched: Simulation schedule containing buses, rotations etc. :type sched: ebus_toolbox.Schedule @@ -101,7 +102,6 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): :return: (Schedule,Scenario) optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - conf = util.read_config(config_path) # load pickle files if sched is None or scen is None or this_args is None: @@ -121,8 +121,8 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): logger = setup_logger(args, conf) - # remove those args, since they lead to file creation, which is not - # needed. + # remove those args, since they lead to file creation, which is not + # needed. if not conf.save_all_results: del args.save_timeseries del args.save_results @@ -139,7 +139,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): optimizer.set_battery_and_charging_curves() # rebasing the scenario meaning simulating it again with the given conditions of - # included and excluded stations and rotations + # included and excluded stations and rotations and maybe changed battery sizes if conf.rebase_scenario: must_include_set, ele_stations = optimizer.rebase_spice_ev() else: @@ -148,7 +148,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): # create charging dicts which contain soc over time, which is numerically calculated optimizer.create_charging_curves() - # Remove none Values from socs in the vehicle_socs an + # remove none Values from socs in the vehicle_socs optimizer.remove_none_socs() if conf.remove_impossible_rots: neg_rots = optimizer.get_negative_rotations_all_electrified() @@ -178,7 +178,7 @@ def run_optimization(config_path, sched=None, scen=None, this_args=None): for event in new_events: logger.debug(event.rotation.id) with open(new_ele_stations_path, "w", encoding="utf-8") as file: - json.dump(ele_stations, file,ensure_ascii=False, indent=2) + json.dump(ele_stations, file, ensure_ascii=False, indent=2) util.print_time() logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 0c34346f..f95e2200 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -458,7 +458,6 @@ def get_charge_events_per_station(self, station_name, rotations=None): charging_events.append(event) return charging_events - def sort_station_events(self, charge_events_single_station): return sorted(charge_events_single_station, key=lambda x: x.arrival_time) @@ -847,7 +846,8 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, cost_calc=cost_calc) try: report.generate(new_sched, new_scen, self.args) - except: + except Exception: + warnings.warn("Report generation failed") pass self.schedule = new_sched self.scenario = new_scen @@ -1000,7 +1000,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, is false, it means coupled rotations might be prone to errors due to impossible lifts. :param soc_data: soc data to be used. Default None means the soc data from the optimizer scenario is used - :param kwargs: optional soc_lower_tresh or soc_upper_thresh if from optimizer differing + :param kwargs: optional soc_lower_thresh or soc_upper_thresh if from optimizer differing values should be used :return: list(LowSocEvents) """ diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg new file mode 100644 index 00000000..8e28504d --- /dev/null +++ b/tests/test_input_files/optimizer.cfg @@ -0,0 +1,71 @@ +# Configs for the eBus Toolbox Optimizer +[DEFAULT] +debug_level=1 + +[SCENARIO] +# Use "" for ids and not '' +exclusion_rots = [] +exclusion_stations= [] +# If using inclusion stations, scenario should be rebased +inclusion_stations= [] +standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, + "voltage_level": "MV"} + +[PICKLE] +schedule=schedule_rebased_BVG_BFI.pickle +scenario=scenario_rebased_BVG_BFI.pickle +args=args_rebased_BVG_BFI.pickle +# schedule=schedule_buffered_all_oppb.pickle +# scenario=scenario_buffered_all_oppb.pickle +# args=args_buffered_all_oppb.pickle +# schedule=schedule_buffered_depots_utf.pickle +# scenario=scenario_buffered_depots_utf.pickle +# args=args_buffered_utf.pickle + + +[VEHICLE] +charge_eff = 0.95 +# battery_capacity = 400 +# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +# charging_power = 250 +# min_soc=0.05 + +[OPTIMIZER] +# Not optional path to outputs of optimizer +output_path=data/private_examples/BVG/optimization +save_all_results=True +# "quick" or "spiceev" +solver = quick +rebase_scenario = False +pickle_rebased= False +pickle_rebased_name=bvg_rebase_all_electrified +run_only_neg=False +run_only_oppb = True +pruning_threshold=0 + +# "greedy" or "deep" without "" +opt_type = greedy +# "step-by-step" or "brute" without "" +node_choice=step-by-step +max_brute_loop=300 +estimation_threshold = 0.90 +# Preferring deps leads to a spice_ev simulation with preferred charging type depots +# Afterwards all negative rotations are swapped to opportunity chargers and optimized +# prefer_deps=True + +# Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible +# If they are deemed as impossible, they are not optimized but discarded +remove_impossible_rots=True +check_for_must_stations=False +include_must_stations = True + + + +[SPECIAL] +decision_tree_path = "" +save_decision_tree = False +reduce_rots = False +# Use "" for ids and not '' +# Negative Rots in all deps +rots = ["0310b_3", "0317_3", "0308_3", "0301b_5", "0404b_4", "0301b_2", "0802b_5", "0401b_4", "7401_7", "0702b_3", "0307a_3", "0307a_1", "0404a_3", "0711_3", "0817_2", "6002a_6", "6302_6", "6306b_6", "0302a_1", "0308_2", "0811_4", "0307b_5", "0705_5", "0801a_4", "0711_4", "0303_3", "0705_3", "0402_5", "0304_2", "0304_3", "0801a_1", "0314_4", "0002_1", "7310a_7", "0811_3", "6711_6", "0301a_5", "0301b_1", "0403_4", "0310b_4", "0701a_2", "0303_1", "0311a_3", "0711_1", "0317_1", "0318_5", "0305_2", "0402_4", "0002_4", "0403_5", "0801a_3", "0310a_2", "0803b_2", "0314_5", "0702b_5", "0701a_1", "0401b_5", "0005a_5", "0801b_5", "0310a_4", "0311a_5", "0311a_4", "0404b_1", "0014b_2", "0803b_5", "0306a_4", "0726_5", "0318_1", "0005a_2", "0303_5", "0308_4", "0002_3", "0306a_3", "0307a_4", "0701a_4", "0401a_4", "6403_6", "0404a_2", "6309a_6", "0314_3", "0317_4", "0401a_2", "0705_1", "0310b_1", "0701a_5", "0310a_1", "0404a_1", "0302a_5", "6305a_6", "0817_4", "0312a_1", "0301a_2", "0705_4", "0305_1", "0312a_4", "0702b_2", "0302b_5", "0005a_4", "6001a_6", "0003b_1", "0301b_4", "0310a_3", "6003_6", "0302a_2", "0817_3", "0404b_5", "0403_2", "0317_5", "0817_1", "0401b_3", "0003b_3", "0726_1", "0701a_3", "7005_7", "0311a_2", "0307b_3", "0301b_3", "0314_2", "6310b_6", "0803b_3", "0014b_1", "0401a_3", "0306a_1", "0305_5", "6303a_6", "6401_6", "0303_2", "6301_6", "0005a_3", "0404a_4", "0312a_2", "0302a_4", "7402_7", "0401b_2", "0301a_1", "0402_2", "0014b_3", "0307b_1", "0803b_1", "6002b_6", "0303_4", "6310a_6", "0302a_3", "0318_4", "7811_7", "0306a_2", "0312a_3", "0308_5", "0014b_4", "0310a_5", "0319_1", "0310b_5", "0705_2", "0002_2", "7702b_7", "7711_7", "0811_2", "0403_1", "0319_3", "0317_2", "0726_3", "0404a_5", "0726_4", "0307b_2", "6901_6", "0319_4", "0005b_5", "0305_4", "6702b_6", "7002b_7", "0304_5", "0305_3", "0003b_2", "0401b_1", "0801a_5", "0301a_3", "0402_1", "0005a_1", "0319_5", "6306a_6", "0319_2", "0311a_1", "0401a_5", "0003b_5", "0307a_5", "0307a_2", "0301a_4", "0318_3", "0308_1", "0726_2", "0803b_4", "6001b_6", "0401a_1", "0312a_5", "6703b_6", "0711_2", "0811_1", "0702b_1", "0314_1", "0014b_5", "0310b_2", "0404b_2", "0003b_4", "0307b_4", "0304_1", "0306a_5", "0811_5", "0403_3", "0318_2", "0402_3", "0817_5", "0404b_3", "0702b_4", "0711_5", "7003_7", "0002_5", "0304_4", "0801a_2"] + diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py new file mode 100644 index 00000000..6a3915e3 --- /dev/null +++ b/tests/test_station_optimization.py @@ -0,0 +1,17 @@ +from tests.helpers import generate_basic_schedule +import ebus_toolbox.optimizer_util as util +from ebus_toolbox.station_optimization import run_optimization +class TestStationOptimization: + + def test_spice_ev_optimization(self): + util.print_time() + config_path = "./tests/test_input_files/optimizer.cfg" + conf = util.read_config(config_path) + sched, scen = 123 + opt_sched, opt_scen = run_optimization(conf, sched=None, scen=None, this_args=None) + util.print_time() + import pickle + with open("schedule_opt.pickle", "wb") as f: + pickle.dump(opt_sched, f) + with open("scenario_opt.pickle", "wb") as f: + pickle.dump(opt_scen, f) From 366491c185041a24bc787b8e7aca99966015c72c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Feb 2023 13:18:02 +0100 Subject: [PATCH 533/802] Merge with testing branch #100 --- ebus_toolbox/station_optimizer.py | 5 ++--- tests/test_station_optimization.py | 27 ++++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index f95e2200..b9afaf89 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -9,10 +9,9 @@ import numpy as np -import optimizer_util as util +import ebus_toolbox.optimizer_util as util from src import scenario -import schedule -from ebus_toolbox import report, rotation +from ebus_toolbox import report, rotation, schedule class StationOptimizer: diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 6a3915e3..f6de1531 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,17 +1,18 @@ from tests.helpers import generate_basic_schedule -import ebus_toolbox.optimizer_util as util +import ebus_toolbox.optimizer_util from ebus_toolbox.station_optimization import run_optimization class TestStationOptimization: + pass + # def test_spice_ev_optimization(self): + # util.print_time() + # config_path = "./tests/test_input_files/optimizer.cfg" + # conf = util.read_config(config_path) + # sched, scen = 123 + # opt_sched, opt_scen = run_optimization(conf, sched=None, scen=None, this_args=None) + # util.print_time() + # import pickle + # with open("schedule_opt.pickle", "wb") as f: + # pickle.dump(opt_sched, f) + # with open("scenario_opt.pickle", "wb") as f: + # pickle.dump(opt_scen, f) - def test_spice_ev_optimization(self): - util.print_time() - config_path = "./tests/test_input_files/optimizer.cfg" - conf = util.read_config(config_path) - sched, scen = 123 - opt_sched, opt_scen = run_optimization(conf, sched=None, scen=None, this_args=None) - util.print_time() - import pickle - with open("schedule_opt.pickle", "wb") as f: - pickle.dump(opt_sched, f) - with open("scenario_opt.pickle", "wb") as f: - pickle.dump(opt_scen, f) From 30dc2fc96ed8e0eb4bd0402dd2a1648dd30c191f Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 14 Feb 2023 15:47:44 +0100 Subject: [PATCH 534/802] clear figure before replotting --- ebus_toolbox/report.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index aca4bd95..2147f619 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -124,6 +124,7 @@ def generate(schedule, scenario, args): # save plots as png and pdf aggregate_global_results(scenario) with plt.ion(): # make plotting temporarily interactive, so plt.show does not block + plt.clf() plot(scenario) plt.gcf().set_size_inches(10, 10) plt.savefig(args.results_directory / "run_overview.png") From d24b090c66af3942798ac5d45b42f3c6941b22a1 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 14 Feb 2023 15:52:54 +0100 Subject: [PATCH 535/802] change values in example vehicle_types.json --- data/examples/vehicle_types.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index dd1c0944..b7491df5 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -2,16 +2,16 @@ "AB": { "depb": { "name": "articulated bus - depot charging", - "capacity": 150, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "capacity": 250, + "charging_curve": [[0, 150], [0.8, 150], [1, 15]], "min_charging_power": 0, "v2g": false, "mileage": "data/examples/energy_consumption_example.csv" }, "oppb": { "name": "articulated bus - opportunity charging", - "capacity": 50, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], + "capacity": 150, + "charging_curve": [[0, 250], [0.8, 250], [1, 25]], "min_charging_power": 0, "v2g": false, "mileage": "data/examples/energy_consumption_example.csv" @@ -21,15 +21,15 @@ "depb": { "name": "solo bus - depot charging", "capacity": 250, - "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "charging_curve": [[0, 150], [0.8, 150], [1, 15]], "min_charging_power": 0, "v2g": false, "mileage": "data/examples/energy_consumption_example.csv" }, "oppb": { "name": "solo bus - opportunity charging", - "capacity": 250, - "charging_curve": [[0, 250], [0.8, 250], [1, 250]], + "capacity": 150, + "charging_curve": [[0, 250], [0.8, 250], [1, 25]], "min_charging_power": 0, "v2g": false, "mileage": "data/examples/energy_consumption_example.csv" From 076a1edbae41229b82cfd0cb631ddcecdb81ca8d Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 14 Feb 2023 16:15:28 +0100 Subject: [PATCH 536/802] minor fixes - only simulate for neg_XX_to_YY if not simulated before - removed generate_report/plots from config --- data/examples/ebus_toolbox.cfg | 5 ----- ebus_toolbox/simulate.py | 7 +++++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index f1796947..57bd9a8f 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -112,11 +112,6 @@ strategy = distributed # options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] -# generate report and plots, default: false -generate_report = true -# show plots for users to view, only valid if generate_report = true -show_plots = true - # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. # margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index fe3aa25c..f16a1b0e 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -70,9 +70,9 @@ def simulate(args): args.mode = [args.mode] for i, mode in enumerate(args.mode): - if mode in ["sim", "neg_depb_to_oppb", "neg_oppb_to_depb"]: + if mode == "sim": # scenario simulated once - # default if mode argument is not specified by user + # default mode: 'sim' if mode argument is not specified by user scenario = schedule.run(args) elif mode == 'service_optimization': # find largest set of rotations that produce no negative SoC @@ -81,6 +81,9 @@ def simulate(args): print("*"*49 + "\nNo optimization possible (all rotations negative)") if mode in ["neg_depb_to_oppb", "neg_oppb_to_depb"]: # simple optimization: change charging type, simulate again + if scenario is None: + # no prior simulation/optimization: run once + scenario = schedule.run(args) change_from = mode[4:8] change_to = mode[-4:] # get negative rotations From a84cd8081e9fc2dab939d23211a17abe60aa6258 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 14 Feb 2023 16:28:17 +0100 Subject: [PATCH 537/802] add neg_oppb_to_depb to mode description --- ebus_toolbox/__main__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 4f3fc2b2..2d8679ce 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -12,12 +12,13 @@ simulation program for electric bus fleets.') parser.add_argument('--input-schedule', nargs='?', help='Path to CSV file containing all trips of schedule to be analyzed.') - mode_choices = ['sim', 'neg_depb_to_oppb', 'service_optimization', 'report'] + mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] parser.add_argument('--mode', default=['sim'], nargs='*', choices=mode_choices, help=f"Specify what you want to do. Choose one or more from \ {', '.join(mode_choices)}. \ sim runs a single simulation with the given inputs. \ neg_depb_to_oppb changes charging type of negative depb rotations. \ + neg_oppb_to_depb changes charging type of negative oppb rotations. \ service optimization finds the largest set of electrified rotations. \ report generates simulation output files.") parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', From 5b2049cf115fe3985942e207d44f983f0d712200 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Feb 2023 16:46:31 +0100 Subject: [PATCH 538/802] Merge with current testing status and create first runnable test --- ebus_toolbox/optimizer_util.py | 11 +- ebus_toolbox/station_optimization.py | 8 +- ebus_toolbox/station_optimizer.py | 2 +- tests/test_input_files/cost_params.json | 195 ++++++++++++++++++ tests/test_input_files/ebus_toolbox.cfg | 4 +- .../electrified_stations.json | 3 +- tests/test_input_files/optimizer.cfg | 7 +- .../test_input_files/trips_for_optimizer.csv | 10 + tests/test_schedule.py | 8 +- tests/test_station_optimization.py | 30 +-- 10 files changed, 246 insertions(+), 32 deletions(-) create mode 100644 tests/test_input_files/cost_params.json create mode 100644 tests/test_input_files/trips_for_optimizer.csv diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 12c61597..e61c13cc 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -600,12 +600,15 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, electrified_stations=electrified_stations) # do not print output from spice ev to reduce clutter - sys.stdout = open(os.devnull, 'w') + with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) + if not "pytest" in sys.modules: + sys.stdout = open(os.devnull, 'w') new_scen.run('distributed', vars(this_args).copy()) - sys.stdout = sys.__stdout__ + if not "pytest" in sys.modules: + sys.stdout = sys.__stdout__ try: if this_args.cost_calculation and cost_calc: # cost calculation following directly after simulation @@ -616,8 +619,8 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " "does not exist. Exiting...") calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) - except Exception as e: - warnings.warn("Cost Calculation was ignored due to some error :", e) + except: + warnings.warn(f"Cost Calculation was ignored due to some error") pass return this_sched2, new_scen diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 00449a9a..e67ca15e 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -102,7 +102,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): :return: (Schedule,Scenario) optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - + print("Finished") # load pickle files if sched is None or scen is None or this_args is None: # if no schedule was given as argument, make sure no scenario @@ -156,7 +156,10 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): optimizer.schedule.rotations = {r: optimizer.schedule.rotations[r] for r in optimizer.schedule.rotations if r not in optimizer.config.exclusion_rots} - logger.warning("%s negative rotations %s", len(neg_rots), neg_rots) + logger.warning("%s negative rotations %s were removed from schedule", + len(neg_rots), neg_rots) + assert len(optimizer.schedule.rotations)>0, "Schedule cant be optimized, since rotations" \ + "cant be electrified." if conf.check_for_must_stations: must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) @@ -186,6 +189,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) + print("Finished") return optimizer.schedule, optimizer.scenario diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index b9afaf89..b894c6f8 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -10,7 +10,7 @@ import numpy as np import ebus_toolbox.optimizer_util as util -from src import scenario +from spice_ev import scenario from ebus_toolbox import report, rotation, schedule diff --git a/tests/test_input_files/cost_params.json b/tests/test_input_files/cost_params.json new file mode 100644 index 00000000..d725bc1b --- /dev/null +++ b/tests/test_input_files/cost_params.json @@ -0,0 +1,195 @@ +{ + "vehicles": { + "SB_depb": { + "capex": 420000, + "c_maint_per_km": 0.24, + "lifetime": 14 + }, + "SB_oppb": { + "capex": 420000, + "c_maint_per_km": 0.24, + "lifetime": 14 + }, + "CKB_depb": { + "capex": 600000, + "c_maint_per_km": 0.3, + "lifetime": 14 + }, + "CKB_oppb": { + "capex": 600000, + "c_maint_per_km": 0.3, + "lifetime": 14 + } + }, + "batteries": { + "lifetime_battery": 7, + "cost_per_kWh": 250 + }, + "gc": { + "LV": { + "default_distance": 50, + "capex_gc_fix": 16.85, + "capex_gc_per_meter": 16.85, + "capex_gc_per_kW": 24.14, + "capex_transformer_fix": 0, + "capex_transformer_per_kW": 0 + }, + "MV/LV": { + "default_distance": 100, + "capex_gc_fix": 16.85, + "capex_gc_per_meter": 16.85, + "capex_gc_per_kW": 24.14, + "capex_transformer_fix": 0, + "capex_transformer_per_kW": 0 + }, + "MV": { + "default_distance": 200, + "capex_gc_fix": 62500, + "capex_gc_per_meter": 562.5, + "capex_gc_per_kW": 158.3, + "capex_transformer_fix": 80000, + "capex_transformer_per_kW": 0 + }, + "HV/MV": { + "default_distance": 2000, + "capex_gc_fix": 0, + "capex_gc_per_meter": 80, + "capex_gc_per_kW": 158.3, + "capex_transformer_fix": 0, + "capex_transformer_per_kW": 63.49 + }, + "HV": { + "default_distance": 2000, + "capex_gc_fix": 0, + "capex_gc_per_meter": 1300, + "capex_gc_per_kW": 158.3, + "capex_transformer_fix": 2500000, + "capex_transformer_per_kW": 0 + }, + "lifetime_gc": 50, + "c_maint_transformer_per_year": 0.02, + "lifetime_transformer": 20 + }, + "stationary_storage": { + "capex_fix": 1, + "capex_per_kWh": 1, + "c_maint_stat_storage_per_year": 0.02, + "lifetime_stat_storage": 20 + }, + "cs":{ + "capex_opps_per_kW": 877.5, + "capex_deps_per_kW": 1000, + "lifetime_cs": 20, + "c_maint_cs_per_year": 0.02 + }, + "garage": { + "n_charging_stations": 1, + "power_cs": 50, + "vehicles_per_workstation": 20, + "cost_per_workstation": 245000, + "lifetime_workstations": 20 + }, + "grid_fee":{ + "SLP": { + "basic_charge_EUR/a": { + "net_price": 65.7, + "gross_price": 78.18, + "unit": "EUR/a", + "info": "basic charge for SLP (standard load profile) customers." + }, + "commodity_charge_ct/kWh": { + "net_price": 7.48, + "gross_price": 8.9, + "unit": "ct/kWh", + "info": "commodity costs for SLP (standard load profile) customers" + } + }, + "RLM": { + "<2500_h/a": { + "capacity_charge_EUR/kW*a": { + "HV": 19.13, + "HV/MV": 25.25, + "MV": 41.06, + "MV/LV": 44.26, + "LV": 44.26, + "unit": "EUR/(kW*a)", + "info": ["capacity charge depending on the voltage level for RLM", + "(Registrierende Leistungsmessung, engl.: consumption metering) customers with", + "annual utilization time < 2500 h/a"] + }, + "commodity_charge_ct/kWh": { + "HV": 2.3, + "HV/MV": 3.81, + "MV": 3.49, + "MV/LV": 4.39, + "LV": 4.83, + "unit": "ct/kWh", + "info": ["commodity charge depending on the voltage level for RLM", + "(Registrierende Leistungsmessung, engl.: consumption metering) customers with", + "annual utilization time < 2500 h/a"] + } + }, + ">=2500_h/a": { + "capacity_charge_EUR/kW*a": { + "HV": 56.33, + "HV/MV": 101.52, + "MV": 70.14, + "MV/LV": 97.01, + "LV": 64.33, + "unit": "EUR/(kW*a)", + "info": ["capacity charge depending on the voltage level for RLM customers with", + "annual utilization time >= 2500 h/a"] + }, + "commodity_charge_ct/kWh": { + "HV": 0.81, + "HV/MV": 0.76, + "MV": 2.32, + "MV/LV": 2.28, + "LV": 4.03, + "unit": "ct/kWh", + "info": ["commodity charge depending on the voltage level for RLM customers with", + "annual utilization time >= 2500 h/a"] + } + }, + "additional_costs": { + "costs": 0, + "unit": "EUR", + "info": "additional costs for RLM customers per year (f.i. costs for metering point operation)" + } + } + }, + "power_procurement": { + "charge": 7.7, + "unit": "ct/kWh", + "info": "charge for power generation, power procurement and sales" + }, + "levies": { + "EEG-levy": 0, + "chp_levy": 0.378, + "individual_charge_levy": 0.437, + "offshore_levy": 0.419, + "interruptible_loads_levy": 0.003, + "unit": "ct/kWh", + "info": ["levies on energy supplied from the power grid"] + }, + "concession_fee": { + "charge": 1.32, + "unit": "ct/kWh", + "info": "concession fee depending on the tariff and the size of the municipality" + }, + "taxes": { + "value_added_tax": 19, + "tax_on_electricity": 2.05, + "unit": "value added tax: %, tax on electricity: ct/kWh", + "info": "taxes on energy supplied from the power grid" + }, + "feed-in_remuneration": { + "PV": { + "kWp": [10, 40, 100], + "remuneration": [6.24, 6.06, 4.74] + }, + "V2G": 0, + "unit": "ct/kWh", + "info": "remuneration for power fed into the grid by PV power plants or electric vehicles" + } +} \ No newline at end of file diff --git a/tests/test_input_files/ebus_toolbox.cfg b/tests/test_input_files/ebus_toolbox.cfg index 0b436390..ccc205e7 100644 --- a/tests/test_input_files/ebus_toolbox.cfg +++ b/tests/test_input_files/ebus_toolbox.cfg @@ -6,7 +6,7 @@ input_schedule = "./tests/test_input_files/trips_example.csv" # output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) -output_directory = "./data/sim_outputs/" +output_directory = "./tests/test_output_files/" # electrified stations (defaults to: data/examples/electrified_stations.json) electrified_stations = "tests/test_input_files/electrified_stations.json" @@ -61,7 +61,7 @@ ignore_inconsistent_rotations = false # set minimum allowed state of charge when leaving # distinguish between depot and opportunity station desired_soc_deps = 1.0 -desired_soc_opps = 0.8 +desired_soc_opps = 1 # Preferred charging type. Options: depb, oppb (default: oppb) preferred_charging_type = "oppb" diff --git a/tests/test_input_files/electrified_stations.json b/tests/test_input_files/electrified_stations.json index 11e21383..7a2bfd43 100644 --- a/tests/test_input_files/electrified_stations.json +++ b/tests/test_input_files/electrified_stations.json @@ -1,6 +1,7 @@ { "Station-0": { "type": "deps", - "n_charging_stations": null + "n_charging_stations": null, + "voltage_level" : "MV" } } \ No newline at end of file diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg index 8e28504d..dcc4019c 100644 --- a/tests/test_input_files/optimizer.cfg +++ b/tests/test_input_files/optimizer.cfg @@ -32,13 +32,13 @@ charge_eff = 0.95 [OPTIMIZER] # Not optional path to outputs of optimizer -output_path=data/private_examples/BVG/optimization +output_path=./tests/test_output_files save_all_results=True # "quick" or "spiceev" solver = quick rebase_scenario = False pickle_rebased= False -pickle_rebased_name=bvg_rebase_all_electrified +pickle_rebased_name=rebased run_only_neg=False run_only_oppb = True pruning_threshold=0 @@ -67,5 +67,4 @@ save_decision_tree = False reduce_rots = False # Use "" for ids and not '' # Negative Rots in all deps -rots = ["0310b_3", "0317_3", "0308_3", "0301b_5", "0404b_4", "0301b_2", "0802b_5", "0401b_4", "7401_7", "0702b_3", "0307a_3", "0307a_1", "0404a_3", "0711_3", "0817_2", "6002a_6", "6302_6", "6306b_6", "0302a_1", "0308_2", "0811_4", "0307b_5", "0705_5", "0801a_4", "0711_4", "0303_3", "0705_3", "0402_5", "0304_2", "0304_3", "0801a_1", "0314_4", "0002_1", "7310a_7", "0811_3", "6711_6", "0301a_5", "0301b_1", "0403_4", "0310b_4", "0701a_2", "0303_1", "0311a_3", "0711_1", "0317_1", "0318_5", "0305_2", "0402_4", "0002_4", "0403_5", "0801a_3", "0310a_2", "0803b_2", "0314_5", "0702b_5", "0701a_1", "0401b_5", "0005a_5", "0801b_5", "0310a_4", "0311a_5", "0311a_4", "0404b_1", "0014b_2", "0803b_5", "0306a_4", "0726_5", "0318_1", "0005a_2", "0303_5", "0308_4", "0002_3", "0306a_3", "0307a_4", "0701a_4", "0401a_4", "6403_6", "0404a_2", "6309a_6", "0314_3", "0317_4", "0401a_2", "0705_1", "0310b_1", "0701a_5", "0310a_1", "0404a_1", "0302a_5", "6305a_6", "0817_4", "0312a_1", "0301a_2", "0705_4", "0305_1", "0312a_4", "0702b_2", "0302b_5", "0005a_4", "6001a_6", "0003b_1", "0301b_4", "0310a_3", "6003_6", "0302a_2", "0817_3", "0404b_5", "0403_2", "0317_5", "0817_1", "0401b_3", "0003b_3", "0726_1", "0701a_3", "7005_7", "0311a_2", "0307b_3", "0301b_3", "0314_2", "6310b_6", "0803b_3", "0014b_1", "0401a_3", "0306a_1", "0305_5", "6303a_6", "6401_6", "0303_2", "6301_6", "0005a_3", "0404a_4", "0312a_2", "0302a_4", "7402_7", "0401b_2", "0301a_1", "0402_2", "0014b_3", "0307b_1", "0803b_1", "6002b_6", "0303_4", "6310a_6", "0302a_3", "0318_4", "7811_7", "0306a_2", "0312a_3", "0308_5", "0014b_4", "0310a_5", "0319_1", "0310b_5", "0705_2", "0002_2", "7702b_7", "7711_7", "0811_2", "0403_1", "0319_3", "0317_2", "0726_3", "0404a_5", "0726_4", "0307b_2", "6901_6", "0319_4", "0005b_5", "0305_4", "6702b_6", "7002b_7", "0304_5", "0305_3", "0003b_2", "0401b_1", "0801a_5", "0301a_3", "0402_1", "0005a_1", "0319_5", "6306a_6", "0319_2", "0311a_1", "0401a_5", "0003b_5", "0307a_5", "0307a_2", "0301a_4", "0318_3", "0308_1", "0726_2", "0803b_4", "6001b_6", "0401a_1", "0312a_5", "6703b_6", "0711_2", "0811_1", "0702b_1", "0314_1", "0014b_5", "0310b_2", "0404b_2", "0003b_4", "0307b_4", "0304_1", "0306a_5", "0811_5", "0403_3", "0318_2", "0402_3", "0817_5", "0404b_3", "0702b_4", "0711_5", "7003_7", "0002_5", "0304_4", "0801a_2"] - +rots = [] \ No newline at end of file diff --git a/tests/test_input_files/trips_for_optimizer.csv b/tests/test_input_files/trips_for_optimizer.csv new file mode 100644 index 00000000..6df37ca2 --- /dev/null +++ b/tests/test_input_files/trips_for_optimizer.csv @@ -0,0 +1,10 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:32:00,Station-1,700,1,CKB +LINE_0,Station-1,2022-03-07 21:41:00,2022-03-07 22:04:00,Station-2,1000,1,CKB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,2000,1,CKB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,1000,1,CKB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,500,1,CKB +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:32:00,Station-1,100,2,CKB +LINE_1,Station-1,2022-03-07 21:41:00,2022-03-07 22:04:00,Station-3,1000,2,CKB +LINE_1,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,800,2,CKB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,500,2,CKB \ No newline at end of file diff --git a/tests/test_schedule.py b/tests/test_schedule.py index b1703b0f..efbcecef 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -130,11 +130,11 @@ def test_rotation_consistency(self): output_directory=output_dir) assert len(record) == 1 - def test_basic_run(self): + def test_basic_run(self, trips_file_name="trips.csv"): """ Check if running a basic example works and if a scenario object is returned :return: schedule, scenario""" - path_to_trips = file_root / "trips.csv" + path_to_trips = file_root / trips_file_name parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args(args="") args.config = file_root / "ebus_toolbox.cfg" @@ -157,7 +157,7 @@ def test_basic_run(self): scen = generated_schedule.run(args) assert type(scen) == scenario.Scenario - return generated_schedule, scen + return generated_schedule, scen, args def test_assign_vehicles(self): """ Test if assigning vehicles works as intended. @@ -226,7 +226,7 @@ def test_get_negative_rotations(self): """Check if the single rotation '1' with a negative soc is found """ # make use of the test_run() which has to return schedule and scenario object - sched, scen = self.test_basic_run() + sched, scen, _ = self.test_basic_run() neg_rots = sched.get_negative_rotations(scen) assert '1' in neg_rots diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index f6de1531..3854fc6b 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,18 +1,20 @@ from tests.helpers import generate_basic_schedule -import ebus_toolbox.optimizer_util +import ebus_toolbox.optimizer_util as util from ebus_toolbox.station_optimization import run_optimization +import tests.test_schedule + class TestStationOptimization: - pass - # def test_spice_ev_optimization(self): - # util.print_time() - # config_path = "./tests/test_input_files/optimizer.cfg" - # conf = util.read_config(config_path) - # sched, scen = 123 - # opt_sched, opt_scen = run_optimization(conf, sched=None, scen=None, this_args=None) - # util.print_time() - # import pickle - # with open("schedule_opt.pickle", "wb") as f: - # pickle.dump(opt_sched, f) - # with open("scenario_opt.pickle", "wb") as f: - # pickle.dump(opt_scen, f) + trips_file_name = "trips_for_optimizer.csv" + + def test_spice_ev_optimization(self): + schedule_test = tests.test_schedule.TestSchedule() + + sched, scen, args = schedule_test.test_basic_run(self.trips_file_name) + + config_path = "./tests/test_input_files/optimizer.cfg" + conf = util.read_config(config_path) + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) + +t = TestStationOptimization() +t.test_spice_ev_optimization() \ No newline at end of file From be0a8774d7047c0ce9e4b25555f84c9e3513e2d8 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 15 Feb 2023 09:47:13 +0100 Subject: [PATCH 539/802] show_report now shows plot --- data/examples/ebus_toolbox.cfg | 3 +++ ebus_toolbox/__main__.py | 4 +--- ebus_toolbox/report.py | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 57bd9a8f..7f748a56 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -112,6 +112,9 @@ strategy = distributed # options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] +# show plots for users to view in "report" mode +show_plots = true + # give margin for desired SoC [0.0 - 1.0] # margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. # margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 2d8679ce..932cedcf 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -82,10 +82,8 @@ default=10) parser.add_argument('--visual', '-v', action='store_true', help='Show plots of the results- not applicable', default=False) - parser.add_argument('--generate-report', '-r', help='generates and stores plots and results', - default=False) parser.add_argument('--show-plots', - help='opens plots for user to view, only valid if generate_report=True', + help='show plots for users to view in "report" mode', default=False) parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, \ diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 2147f619..6e43af6e 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -129,8 +129,8 @@ def generate(schedule, scenario, args): plt.gcf().set_size_inches(10, 10) plt.savefig(args.results_directory / "run_overview.png") plt.savefig(args.results_directory / "run_overview.pdf") - if not args.show_plots: - plt.close() + if args.show_plots: + plt.show() # calculate SOCs for each rotation rotation_infos = [] From c772655a3df19199e35dfb07b6c62195790d6f0b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 15 Feb 2023 11:17:33 +0100 Subject: [PATCH 540/802] Add test for deep optimization, fix get_trips_by_index and dont mutate input scenario --- ebus_toolbox/station_optimization.py | 10 ++-- ebus_toolbox/station_optimizer.py | 2 +- .../trips_for_optimizer_deep.csv | 9 +++ tests/test_station_optimization.py | 55 +++++++++++++++++-- 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 tests/test_input_files/trips_for_optimizer_deep.csv diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index e67ca15e..bde33bb5 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -102,7 +102,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): :return: (Schedule,Scenario) optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - print("Finished") + # load pickle files if sched is None or scen is None or this_args is None: # if no schedule was given as argument, make sure no scenario @@ -158,8 +158,8 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): r not in optimizer.config.exclusion_rots} logger.warning("%s negative rotations %s were removed from schedule", len(neg_rots), neg_rots) - assert len(optimizer.schedule.rotations)>0, "Schedule cant be optimized, since rotations" \ - "cant be electrified." + assert len(optimizer.schedule.rotations) > 0, "Schedule cant be optimized, since rotations" \ + "cant be electrified." if conf.check_for_must_stations: must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) @@ -172,9 +172,9 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): logger.debug("%s total stations", len(ele_stations)) logger.debug("These rotations could not be electrified: %s", optimizer.could_not_be_electrified) - scen.vehicle_socs = optimizer.timeseries_calc() + vehicle_socs = optimizer.timeseries_calc() - new_events = optimizer.get_low_soc_events(soc_data=scen.vehicle_socs) + new_events = optimizer.get_low_soc_events(soc_data=vehicle_socs) if len(new_events) > 0: logger.debug("Still not electrified with abs. soc with fast calc") diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index b894c6f8..742d2972 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -965,7 +965,7 @@ def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): trips = [] for i, trip in enumerate(rot.trips): - if end_time_event > trip.arrival_time > start_time_event: + if end_time_event >= trip.arrival_time > start_time_event: trips.append(trip) return trips diff --git a/tests/test_input_files/trips_for_optimizer_deep.csv b/tests/test_input_files/trips_for_optimizer_deep.csv new file mode 100644 index 00000000..5b1de7dc --- /dev/null +++ b/tests/test_input_files/trips_for_optimizer_deep.csv @@ -0,0 +1,9 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type +Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,1500,1,CKB +LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-2,3000,1,CKB +LINE_0,Station-2,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,1,CKB +Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,1500,1,CKB +Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,1500,2,CKB +LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-3,3000,2,CKB +LINE_0,Station-3,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,2,CKB +Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,1500,2,CKB \ No newline at end of file diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 3854fc6b..9d697792 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -2,19 +2,66 @@ import ebus_toolbox.optimizer_util as util from ebus_toolbox.station_optimization import run_optimization import tests.test_schedule +import pathlib + +test_root = pathlib.Path(__file__).parent +file_root = test_root / "test_input_files" class TestStationOptimization: - trips_file_name = "trips_for_optimizer.csv" - def test_spice_ev_optimization(self): + def test_basic_optimization(self): + trips_file_name = "trips_for_optimizer.csv" schedule_test = tests.test_schedule.TestSchedule() - sched, scen, args = schedule_test.test_basic_run(self.trips_file_name) + sched, scen, args = schedule_test.test_basic_run(trips_file_name) config_path = "./tests/test_input_files/optimizer.cfg" conf = util.read_config(config_path) opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) + + + def test_deep_optimization(self): + """ Check if deep analysis finds the prepared optimal solution for the test case. + The Test case is a a 3 star like network with two rotations which are negative without + electrification. + Rotation 1: + Depot --> Station-1 ---> Station-2 -->Station-1-->Depot + Rotation 2: + Depot --> Station-1 ---> Station-3 -->Station-1-->Depot + + Greedy optimization will electrify Station-1 first since its helpful for both rotations. + Since electrifiying Station-1 is not enough to electrify either rotations, greedy + optimization will electrify Station-2 and Station-3 as well. Deep Analysis will expand + the checked nodes --> It should find that electrifiying Station-2 and Station-3 is enough + + """ + trips_file_name = "trips_for_optimizer_deep.csv" + schedule_test = tests.test_schedule.TestSchedule() + + sched, scen, args = schedule_test.test_basic_run(trips_file_name) + args.input_schedule = file_root / trips_file_name + config_path = "./tests/test_input_files/optimizer.cfg" + conf = util.read_config(config_path) + conf.solver = "quick" + conf.opt_type = "deep" + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) + assert "Station-1" not in opt_sched.stations + assert "Station-2" in opt_sched.stations + assert "Station-3" in opt_sched.stations + + conf.solver = "spiceev" + conf.opt_type = "deep" + # sched = deepcopy(schedb) + # scen = deepcopy(scenb) + # args = deepcopy(argsb) + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) + assert "Station-1" not in opt_sched.stations + assert "Station-2" in opt_sched.stations + assert "Station-3" in opt_sched.stations + + + t = TestStationOptimization() -t.test_spice_ev_optimization() \ No newline at end of file +t.test_deep_optimization() \ No newline at end of file From 9f6f6472efe37db028be023c6ef7d3191d39f013 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 15 Feb 2023 13:05:16 +0100 Subject: [PATCH 541/802] restructure of mode loop - always simulate once in the beginning - ignore sim mode - add warning for intermediate sim and unknown modes - revert service optimizatoin if no optimization is possible --- ebus_toolbox/simulate.py | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f16a1b0e..1d8879ad 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,4 +1,5 @@ -# imports +from warnings import warn + from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from ebus_toolbox.trip import Trip @@ -69,17 +70,18 @@ def simulate(args): # backwards compatibility: run single mode args.mode = [args.mode] + # scenario simulated once + scenario = schedule.run(args) + for i, mode in enumerate(args.mode): - if mode == "sim": - # scenario simulated once - # default mode: 'sim' if mode argument is not specified by user - scenario = schedule.run(args) - elif mode == 'service_optimization': + if mode == 'service_optimization': # find largest set of rotations that produce no negative SoC - schedule, scenario = optimization.service_optimization(schedule, args)["optimized"] + result = optimization.service_optimization(schedule, args) + schedule, scenario = ['optimized'] if scenario is None: - print("*"*49 + "\nNo optimization possible (all rotations negative)") - if mode in ["neg_depb_to_oppb", "neg_oppb_to_depb"]: + print('*'*49 + '\nNo optimization possible (all rotations negative), reverting') + schedule, scenario = ['original'] + elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: # simple optimization: change charging type, simulate again if scenario is None: # no prior simulation/optimization: run once @@ -92,21 +94,28 @@ def simulate(args): neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from if change_to in vehicle_types[schedule.rotations[r].vehicle_type]] if neg_rot: - print(f"Changing charging type from {change_from} to {change_to} for rotations " + print(f'Changing charging type from {change_from} to {change_to} for rotations ' + ', '.join(neg_rot)) schedule.set_charging_type(change_to, neg_rot) # simulate again scenario = schedule.run(args) neg_rot = schedule.get_negative_rotations(scenario) if neg_rot: - print(f"Rotations {', '.join(neg_rot)} remain negative.") + print(f'Rotations {", ".join(neg_rot)} remain negative.') elif mode == 'report': # create report based on all previous modes - assert scenario is not None, "Can't report without simulation" + assert scenario is not None, 'Can\'t report without simulation' if args.cost_calculation: # cost calculation part of report calculate_costs(cost_parameters_file, scenario, schedule, args) - report_name = '__'.join([m for m in args.mode[:i] if m != "report"]) + # name: always start with sim, append all following optimization modes + report_name = 'sim' + '__'.join([m for m in args.mode[:i] if m not in ['sim', 'report']]) args.results_directory = args.output_directory.joinpath(report_name) args.results_directory.mkdir(parents=True, exist_ok=True) report.generate(schedule, scenario, args) + elif mode == 'sim': + if i > 0: + # ignore anyway, but at least give feedback that this has no effect + warn('Intermediate sim ignored') + else: + warn(f'Unknown mode {mode} ignored') From 4f699d36d7687b1a0ebd357d6ae496e99bbd3aef Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 15 Feb 2023 13:12:27 +0100 Subject: [PATCH 542/802] make flake8 happy --- ebus_toolbox/simulate.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1d8879ad..a5d8a328 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -77,10 +77,10 @@ def simulate(args): if mode == 'service_optimization': # find largest set of rotations that produce no negative SoC result = optimization.service_optimization(schedule, args) - schedule, scenario = ['optimized'] + schedule, scenario = result['optimized'] if scenario is None: print('*'*49 + '\nNo optimization possible (all rotations negative), reverting') - schedule, scenario = ['original'] + schedule, scenario = result['original'] elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: # simple optimization: change charging type, simulate again if scenario is None: @@ -108,8 +108,9 @@ def simulate(args): if args.cost_calculation: # cost calculation part of report calculate_costs(cost_parameters_file, scenario, schedule, args) - # name: always start with sim, append all following optimization modes - report_name = 'sim' + '__'.join([m for m in args.mode[:i] if m not in ['sim', 'report']]) + # name: always start with sim, append all prior optimization modes + prior_modes = ['sim'] + [m for m in args.mode[:i] if m not in ['sim', 'report']] + report_name = '__'.join(prior_modes) args.results_directory = args.output_directory.joinpath(report_name) args.results_directory.mkdir(parents=True, exist_ok=True) report.generate(schedule, scenario, args) From cafb559271eab61b882b55443eaa146cb01a4096 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 15 Feb 2023 16:53:05 +0100 Subject: [PATCH 543/802] check options from config against argparser --- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/util.py | 30 +++++++++++++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 715840a2..4b8d6ddb 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -116,7 +116,7 @@ args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True - util.set_options_from_config(args, check=True, verbose=False) + util.set_options_from_config(args, check=parser, verbose=False) args.output_directory = Path(args.output_directory) / ( datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 7771ab9e..8f928de0 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -12,7 +12,7 @@ def save_version(file_path): f.write("Git Hash eBus-Toolbox:" + get_git_revision_hash()) -def set_options_from_config(args, check=False, verbose=True): +def set_options_from_config(args, check=None, verbose=True): """Read options from config file, update given args, try to parse options , ignore comment lines (begin with #) @@ -23,7 +23,8 @@ def set_options_from_config(args, check=False, verbose=True): :param verbose: gives final overview of arguments :type bool - :raises ValueError: Raised if unknown options are given. + :raise argparse.ArgumentError: Raised if wrong option values are given + :raises Exception: Raised if unknown option is given """ if "config" in args and args.config is not None: @@ -46,11 +47,26 @@ def set_options_from_config(args, check=False, verbose=True): except ValueError: # or not pass - # known option? - if (k not in args) and check: - raise ValueError("Unknown option {}".format(k)) - # set option - vars(args)[k] = v + # check option + if check is not None: + # find action by name + try: + action = [a for a in check._actions if a.dest == k][0] + except IndexError: + raise Exception(f"Unknown option {k}") + # check each item in list individually + v_list = [v] if type(v) != list else v + for v_item in v_list: + # check item. Returns None on success + # may raise ArgumentError if not successful + check._check_value(action, v_item) + else: + # all checks successful: set argument + vars(args)[k] = v + else: + # set option + vars(args)[k] = v + # Give overview of options if verbose: print("Options: {}".format(vars(args))) From 95888ea3b99977adb727566a93bfc25d10578f5a Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 15 Feb 2023 16:54:37 +0100 Subject: [PATCH 544/802] fix docstring --- ebus_toolbox/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 8f928de0..15280049 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -18,8 +18,8 @@ def set_options_from_config(args, check=None, verbose=True): :param args: input arguments :type args: argparse.Namespace - :param check: raise ValueError on unknown options - :type check: bool + :param check: check config options against argparser + :type check: argparser :param verbose: gives final overview of arguments :type bool From c239e4510cfd32e8a082885afdd64baf7de923df Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 15 Feb 2023 17:09:28 +0100 Subject: [PATCH 545/802] Add must stations check and different solvers --- ebus_toolbox/station_optimization.py | 1 + ebus_toolbox/station_optimizer.py | 104 +++++++++--------- .../trips_for_optimizer_deep.csv | 8 +- tests/test_schedule.py | 13 ++- tests/test_station_optimization.py | 55 +++++---- 5 files changed, 100 insertions(+), 81 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index bde33bb5..3f1f6005 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -164,6 +164,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): if conf.check_for_must_stations: must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) logger.warning("%s must stations %s", len(must_stations), must_stations) + print("%s must stations %s", len(must_stations), must_stations) logger.debug("Starting greedy optimization") ele_stations, ele_station_set = optimizer.loop() diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 742d2972..455ccfca 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -406,56 +406,56 @@ def copy_scen_sched(self): # ToDo implement a fast calculation of timeseries_calc but with a limited amount of charging # points. Implementation could look like this - def get_charge_events_per_station(self, station_name, rotations=None): - """ Gather low soc events below the config threshold. - - :param rotations: rotations to be searched for low soc events. Default None means whole - schedule is searched - :param station_name: name of the station to be checked - :return: list(ChargingEvents) - """ - if not rotations: - rotations = self.schedule.rotations - - # Find relevant charging events for this station - charging_events = [] - - for rot_id in rotations: - rot = self.schedule.rotations[rot_id] - for i, trip in enumerate(rot.trips): - # if the trip station name is not the searched station continue. - if trip.arrival_name != station_name: - continue - try: - charging_event_start_time = util.get_charging_start(trip, self.args) - end_time = rot.trips[i + 1].departure_time - - - # Do not add the event if there is charging time of at least the defined - # min charging time - if charging_event_start_time + self.args.min_charging_time >= end_time: - continue - except IndexError: - warnings.warn("Station to be checked has no following trip. Final destinations" - "can not offer lift to the soc and are therefore discarded") - continue - arrival_time= trip.arrival_time - start_idx = self.get_index_by_time(charging_event_start_time) - end_time = rot.trips[i+1].departure_time - buffer_time = util.get_buffer_time(trip, self.args.default_buffer_time_opps) - end_idx = self.get_index_by_time(end_time) - cht = rot.vehicle_id.find("depb") - ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" - v_type = rot.vehicle_id.split("_" + ch_type)[0] - event = util.ChargingEvent(start_idx=start_idx,end_idx=end_idx, - arrival_time=arrival_time, - start_time=charging_event_start_time, end_time=end_time, - buffer_time=buffer_time, vehicle_id=rot.vehicle_id, - capacity=self.schedule.vehicle_types[v_type][ch_type][ - 'capacity'], - station_name=station_name, rotation=rot) - charging_events.append(event) - return charging_events + # def get_charge_events_per_station(self, station_name, rotations=None): + # """ Gather low soc events below the config threshold. + # + # :param rotations: rotations to be searched for low soc events. Default None means whole + # schedule is searched + # :param station_name: name of the station to be checked + # :return: list(ChargingEvents) + # """ + # if not rotations: + # rotations = self.schedule.rotations + # + # # Find relevant charging events for this station + # charging_events = [] + # + # for rot_id in rotations: + # rot = self.schedule.rotations[rot_id] + # for i, trip in enumerate(rot.trips): + # # if the trip station name is not the searched station continue. + # if trip.arrival_name != station_name: + # continue + # try: + # charging_event_start_time = util.get_charging_start(trip, self.args) + # end_time = rot.trips[i + 1].departure_time + # + # + # # Do not add the event if there is charging time of at least the defined + # # min charging time + # if charging_event_start_time + self.args.min_charging_time >= end_time: + # continue + # except IndexError: + # warnings.warn("Station to be checked has no following trip. Final destinations" + # "can not offer lift to the soc and are therefore discarded") + # continue + # arrival_time= trip.arrival_time + # start_idx = self.get_index_by_time(charging_event_start_time) + # end_time = rot.trips[i+1].departure_time + # buffer_time = util.get_buffer_time(trip, self.args.default_buffer_time_opps) + # end_idx = self.get_index_by_time(end_time) + # cht = rot.vehicle_id.find("depb") + # ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" + # v_type = rot.vehicle_id.split("_" + ch_type)[0] + # event = util.ChargingEvent(start_idx=start_idx,end_idx=end_idx, + # arrival_time=arrival_time, + # start_time=charging_event_start_time, end_time=end_time, + # buffer_time=buffer_time, vehicle_id=rot.vehicle_id, + # capacity=self.schedule.vehicle_types[v_type][ch_type][ + # 'capacity'], + # station_name=station_name, rotation=rot) + # charging_events.append(event) + # return charging_events def sort_station_events(self, charge_events_single_station): return sorted(charge_events_single_station, key=lambda x: x.arrival_time) @@ -1018,6 +1018,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, for rot_id in rotations: rot = self.schedule.rotations[rot_id] soc, rot_start_idx, rot_end_idx = self.get_rotation_soc(rot_id, soc_data) + rot_end_idx += 1 idx = range(0, len(soc)) comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] min_soc, min_idx = min(comb, key=lambda x: x[0]) @@ -1045,7 +1046,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, start = i i = min_idx while soc[i] < soc_upper_thresh: - if i >= rot_end_idx - 1: + if i >= rot_end_idx-1: break i += 1 end_comb = idx.index(i) @@ -1087,6 +1088,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) else: break + print([event.min_soc for event in events]) return events diff --git a/tests/test_input_files/trips_for_optimizer_deep.csv b/tests/test_input_files/trips_for_optimizer_deep.csv index 5b1de7dc..cf11cfa5 100644 --- a/tests/test_input_files/trips_for_optimizer_deep.csv +++ b/tests/test_input_files/trips_for_optimizer_deep.csv @@ -1,9 +1,9 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,1500,1,CKB +Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,500,1,CKB LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-2,3000,1,CKB LINE_0,Station-2,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,1,CKB -Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,1500,1,CKB -Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,1500,2,CKB +Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,500,1,CKB +Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,500,2,CKB LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-3,3000,2,CKB LINE_0,Station-3,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,2,CKB -Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,1500,2,CKB \ No newline at end of file +Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,500,2,CKB \ No newline at end of file diff --git a/tests/test_schedule.py b/tests/test_schedule.py index efbcecef..fa1af3ec 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -1,3 +1,5 @@ +from copy import deepcopy + import pytest import spice_ev.scenario as scenario from tests.helpers import generate_basic_schedule @@ -135,6 +137,7 @@ def test_basic_run(self, trips_file_name="trips.csv"): :return: schedule, scenario""" path_to_trips = file_root / trips_file_name + print("XXX" , path_to_trips) parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args(args="") args.config = file_root / "ebus_toolbox.cfg" @@ -156,7 +159,8 @@ def test_basic_run(self, trips_file_name="trips.csv"): scen = generated_schedule.run(args) assert type(scen) == scenario.Scenario - + print(self.electrified_stations) + print("############### NEGATIVE ROTATIONS", generated_schedule.get_negative_rotations(scen)) return generated_schedule, scen, args def test_assign_vehicles(self): @@ -183,12 +187,15 @@ def test_assign_vehicles(self): def test_calculate_consumption(self): """ Test if calling the consumption calculation works """ - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, + # deepcopy so other vehicle consumptions are not changed + vehicle_types = deepcopy(self.vehicle_types) + trip.Trip.consumption = consumption.Consumption(vehicle_types, outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) + path_to_trips = file_root / "trips_assign_vehicles.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, + generated_schedule = schedule.Schedule.from_csv(path_to_trips, vehicle_types, self.electrified_stations, **mandatory_args) # set mileage constant mileage = 10 diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 9d697792..5ca70c28 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,5 +1,5 @@ -from tests.helpers import generate_basic_schedule import ebus_toolbox.optimizer_util as util + from ebus_toolbox.station_optimization import run_optimization import tests.test_schedule import pathlib @@ -7,20 +7,20 @@ test_root = pathlib.Path(__file__).parent file_root = test_root / "test_input_files" + + class TestStationOptimization: def test_basic_optimization(self): trips_file_name = "trips_for_optimizer.csv" schedule_test = tests.test_schedule.TestSchedule() - sched, scen, args = schedule_test.test_basic_run(trips_file_name) - - config_path = "./tests/test_input_files/optimizer.cfg" + config_path = file_root / "optimizer.cfg" conf = util.read_config(config_path) opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - - + conf.solver = "spiceev" + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) def test_deep_optimization(self): """ Check if deep analysis finds the prepared optimal solution for the test case. @@ -39,29 +39,38 @@ def test_deep_optimization(self): """ trips_file_name = "trips_for_optimizer_deep.csv" schedule_test = tests.test_schedule.TestSchedule() + sched, scen, args = schedule_test.test_basic_run(trips_file_name=trips_file_name) + args.input_schedule = file_root / trips_file_name + config_path = file_root / "optimizer.cfg" + conf = util.read_config(config_path) - sched, scen, args = schedule_test.test_basic_run(trips_file_name) + solvers = ["quick", "spiceev"] + node_choices = ["step-by-step", "brute"] + conf.opt_type = "deep" + for solver in solvers: + for node_choice in node_choices: + conf.solver = solver + conf.node_choice = node_choice + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) + assert "Station-1" not in opt_sched.stations + assert "Station-2" in opt_sched.stations + assert "Station-3" in opt_sched.stations + + def test_must_stations_optimization(self, caplog): + """ Test if station 2 and 3 are correctly recognized as must stations""" + trips_file_name = "trips_for_optimizer_deep.csv" + schedule_test = tests.test_schedule.TestSchedule() + sched, scen, args = schedule_test.test_basic_run(trips_file_name=trips_file_name) args.input_schedule = file_root / trips_file_name - config_path = "./tests/test_input_files/optimizer.cfg" + config_path = file_root / "optimizer.cfg" conf = util.read_config(config_path) + conf.check_for_must_stations = True conf.solver = "quick" - conf.opt_type = "deep" + conf.node_choice = "step-by-step" opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - assert "Station-1" not in opt_sched.stations - assert "Station-2" in opt_sched.stations - assert "Station-3" in opt_sched.stations + assert ("must stations {'Station-3', 'Station-2'}" in caplog.text or + "must stations {'Station-2', 'Station-3'}" in caplog.text) - conf.solver = "spiceev" - conf.opt_type = "deep" - # sched = deepcopy(schedb) - # scen = deepcopy(scenb) - # args = deepcopy(argsb) - opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - assert "Station-1" not in opt_sched.stations - assert "Station-2" in opt_sched.stations - assert "Station-3" in opt_sched.stations -t = TestStationOptimization() -t.test_deep_optimization() \ No newline at end of file From a04aac8d206ac4f9001cfe4bcfd25cade74bab10 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 21 Feb 2023 11:21:07 +0100 Subject: [PATCH 546/802] minor fixes - cfg -- removed ./ path prefixes -- removed quotation marks where not needed -- changed description for sim and service_optimization -- added report to mode default - main -- added report to mode default - (service) optimization -- removed initial simulation run (scenario must already exist and be up-to-date) -- fixed exception text - simulate -- run scenario once before mode-loop -- check once during mode-loop that scenario is valid -- removed scenario checks of individual modes --- data/examples/ebus_toolbox.cfg | 28 ++++++++++++++-------------- ebus_toolbox/__main__.py | 2 +- ebus_toolbox/optimization.py | 8 ++++---- ebus_toolbox/simulate.py | 15 ++++++--------- 4 files changed, 25 insertions(+), 28 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 7f748a56..6ccfe068 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -3,32 +3,32 @@ ##### INPUT/OUTPUT FILES AND PATHS ##### # Input file containing trip information (required) -input_schedule = "./data/examples/trips_example.csv" +input_schedule = data/examples/trips_example.csv # output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) -output_directory = "./data/sim_outputs/" +output_directory = data/sim_outputs/ # electrified stations (defaults to: data/examples/electrified_stations.json) -electrified_stations = "data/examples/electrified_stations.json" +electrified_stations = data/examples/electrified_stations.json -# vehicle types (defaults to: ./data/examples/vehicle_types.json) -vehicle_types = "./data/examples/vehicle_types.json" +# vehicle types (defaults to: data/examples/vehicle_types.json) +vehicle_types = data/examples/vehicle_types.json # Path to station data with stations heights -station_data_path = "data/examples/all_stations.csv" +station_data_path = data/examples/all_stations.csv # Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" +outside_temperature_over_day_path = data/examples/default_temp_winter.csv # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" +level_of_loading_over_day_path = data/examples/default_level_of_loading_over_day.csv ##### COST CALCULATION ##### # set flag for cost calculation: cost_calculation = true # cost parameters (Calculation of costs is optional, defaults to None) -cost_parameters_file = "./data/examples/cost_params.json" +cost_parameters_file = data/examples/cost_params.json ##### SIMULATION HYPERPARAMETERS ##### @@ -37,13 +37,13 @@ seed = 1 # Specify what you want to do. Options: sim, neg_depb_to_oppb, neg_oppb_to_depb, service_optimization, report. # Multiple modes can be chained. -# Default: sim -# sim runs a single simulation with the given inputs. +# Default: sim and report +# sim runs a single simulation with the given inputs and should be used only as the first mode, as later it has no effects. # neg_depb_to_oppb changes negative depb-rotations to oppb charging. # neg_oppb_to_depb changes negative oppb-rotations to depb charging. -# service optimization finds the largest set of electrified rotations. +# service_optimization finds the largest set of electrified rotations. # report generates simulation output files, including costs. -mode = ["sim"] +mode = ["sim", "report"] #mode = ["sim", "neg_depb_to_oppb", "service_optimization", "report"] # set length of timestep in minutes (default: 15 minute intervals) @@ -68,7 +68,7 @@ desired_soc_deps = 1.0 desired_soc_opps = 0.8 # Preferred charging type. Options: depb, oppb (default: oppb) -preferred_charging_type = "oppb" +preferred_charging_type = oppb # min charging time at depots and opp stations [minutes] (default: 0) min_charging_time = 0 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 932cedcf..66d6a6a9 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -13,7 +13,7 @@ parser.add_argument('--input-schedule', nargs='?', help='Path to CSV file containing all trips of schedule to be analyzed.') mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] - parser.add_argument('--mode', default=['sim'], nargs='*', choices=mode_choices, + parser.add_argument('--mode', default=['sim', 'report'], nargs='*', choices=mode_choices, help=f"Specify what you want to do. Choose one or more from \ {', '.join(mode_choices)}. \ sim runs a single simulation with the given inputs. \ diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 72baa6e3..0fb262b5 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -5,12 +5,14 @@ from copy import deepcopy -def service_optimization(schedule, args): +def service_optimization(schedule, scenario, args): """ Optimize rotations based on feasability. Try to find sets of rotations that produce no negative SoC :param schedule: Schedule to be optimized :type schedule: ebus_toolbox.Schedule + :param scenario: Simulated schedule + :type scenario: spice_ev.Scenario :param args: Command line arguments :type args: argparse.Namespace :return: original and most optimized scenario (highest electrification rate) @@ -19,8 +21,6 @@ def service_optimization(schedule, args): """ common_stations = schedule.get_common_stations(only_opps=True) - # initial run - scenario = schedule.run(args) original = (deepcopy(schedule), deepcopy(scenario)) optimal = (None, None) @@ -33,7 +33,7 @@ def service_optimization(schedule, args): rotation = schedule.rotations[rot_key] if rotation.charging_type != "oppb": raise Exception(f"Rotation {rot_key} should be optimized, " - "but is of type {rotation.charging_type}.") + f"but is of type {rotation.charging_type}.") # oppb: build non-interfering sets of negative rotations # (these include the dependent non-negative rotations) s = {rot_key} diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index a5d8a328..21e0e155 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -63,29 +63,27 @@ def simulate(args): stations, **vars(args)) schedule.calculate_consumption() - scenario = None + # scenario simulated once + scenario = schedule.run(args) # run the mode(s) specified in config if type(args.mode) != list: # backwards compatibility: run single mode args.mode = [args.mode] - # scenario simulated once - scenario = schedule.run(args) - for i, mode in enumerate(args.mode): + # scenario must be set from initial run / prior modes + assert scenario is not None, f"Scenario became None after mode {args.mode[i-1]} (index {i})" + if mode == 'service_optimization': # find largest set of rotations that produce no negative SoC - result = optimization.service_optimization(schedule, args) + result = optimization.service_optimization(schedule, scenario, args) schedule, scenario = result['optimized'] if scenario is None: print('*'*49 + '\nNo optimization possible (all rotations negative), reverting') schedule, scenario = result['original'] elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: # simple optimization: change charging type, simulate again - if scenario is None: - # no prior simulation/optimization: run once - scenario = schedule.run(args) change_from = mode[4:8] change_to = mode[-4:] # get negative rotations @@ -104,7 +102,6 @@ def simulate(args): print(f'Rotations {", ".join(neg_rot)} remain negative.') elif mode == 'report': # create report based on all previous modes - assert scenario is not None, 'Can\'t report without simulation' if args.cost_calculation: # cost calculation part of report calculate_costs(cost_parameters_file, scenario, schedule, args) From 5c2d59401a48c1db4698dca88f5c22e77e5944ab Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 21 Feb 2023 12:55:40 +0100 Subject: [PATCH 547/802] restructure config --- data/examples/ebus_toolbox.cfg | 142 +++++++++++++++------------------ ebus_toolbox/__main__.py | 24 +++--- 2 files changed, 79 insertions(+), 87 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 1996545d..721fc685 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -1,119 +1,107 @@ -# Configs for the eBus Toolbox - -##### INPUT/OUTPUT FILES AND PATHS ##### - +##### Paths ##### +### Input and output files and paths ### # Input file containing trip information (required) -input_schedule = "./data/examples/trips_example.csv" +input_schedule = ./data/examples/trips_example.csv # output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) -output_directory = "./data/sim_outputs/" +output_directory = ./data/sim_outputs/ # electrified stations (defaults to: data/examples/electrified_stations.json) -electrified_stations = "data/examples/electrified_stations.json" +electrified_stations = data/examples/electrified_stations.json # vehicle types (defaults to: ./data/examples/vehicle_types.json) -vehicle_types = "./data/examples/vehicle_types.json" +vehicle_types = ./data/examples/vehicle_types.json # Path to station data with stations heights -station_data_path = "data/examples/all_stations.csv" - -# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -outside_temperature_over_day_path = "data/examples/default_temp_winter.csv" - -# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -level_of_loading_over_day_path = "data/examples/default_level_of_loading_over_day.csv" +# (optional: needed if mileage in vehicle types not constant and inclination should be considered) +station_data_path = data/examples/all_stations.csv +# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours +# (optional: needed if mileage in vehicle types not constant) +outside_temperature_over_day_path = data/examples/default_temp_winter.csv -##### COST CALCULATION ##### -# set flag for cost calculation: -cost_calculation = true -# cost parameters (Calculation of costs is optional, defaults to None) -cost_parameters_file = "./data/examples/cost_params.json" - +# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours +# (optional: needed if mileage in vehicle types not constant) +level_of_loading_over_day_path = data/examples/default_level_of_loading_over_day.csv -##### SIMULATION HYPERPARAMETERS ##### -# set random seed (for always random: set seed = null) -seed = 1 +# cost parameters (needed if cost_calculation flag is set to true, see Flag section below) +cost_parameters_file = ./data/examples/cost_params.json -# Options: sim, neg_depb_to_oppb, neg_oppb_to_depb, service_optimization. Default: sim +##### Modes ##### +### Specify how you want to simulate the szenario ### +# Options: sim, neg_depb_to_oppb, neg_oppb_to_depb, service_optimization. # sim runs a single simulation with the given inputs. # neg_depb_to_oppb changes negative depb-rotations to oppb charging. # neg_oppb_to_depb changes negative oppb-rotations to depb charging. # service optimization finds the largest set of electrified rotations. mode = sim -# set length of timestep in minutes (default: 15 minute intervals) -interval = 1 - -# time difference between signal time and actual start time of a vehicle event im min. (default: 10) -signal_time_dif = 10 +##### Flags ##### +### Activate optional functions ### +# set flag for cost calculation: +cost_calculation = true # Check rotation assumptions when building schedule? check_rotation_consistency = false + # Remove rotations from schedule that violate assumptions? Needs check_rotation_consistency to have an effect ignore_inconsistent_rotations = false -##### SIMULATION CONDITIONS AND BOUNDARIES ##### - -# maximum number of days to simulate, if not set simulate entire schedule -#days = 10 +# generate report and plots, default: false +generate_report = true -# set minimum allowed state of charge when leaving -# distinguish between depot and opportunity station -desired_soc_deps = 1.0 -desired_soc_opps = 0.8 +# show plots for users to view, only valid if generate_report = true +show_plots = true +##### Physical setup of environment ##### +### Parametrization of the physical setup ### # Preferred charging type. Options: depb, oppb (default: oppb) -preferred_charging_type = "oppb" - -# min charging time at depots and opp stations [minutes] (default: 0) -min_charging_time = 0 - -# buffer time at opp station if no specific buffer time is provided -# via the electrified_stations.json [minutes] (default: 0) -# Time specific buffer times can be set via a dict like: -# {"10-22": 5, "else": 2} NOTE: else clause is a MUST! -# The buffer time is deducted off of the planned standing time. -# It may resemble things like delays and/or docking procedures -default_buffer_time_opps = 0 - - -##### PHYSICAL SETUP OF ENVIRONMENT ##### +preferred_charging_type = oppb -# minimum fraction of capacity for recharge when leaving the depot. Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) +# minimum fraction of capacity for recharge when leaving the depot. Helps calculating the +# minimum standing time at depot. Between 0 - 1. (default: 1) min_recharge_deps_oppb = 1 min_recharge_deps_depb = 1 -# default max power of grid connectors at depot and opp stations, +# default max power [kW] of grid connectors at depot and opp stations, # individual gc_power per gc can be defined in electrified stations -# default: Sum of max power of all charging stations at this grid connector -gc_power_opps = 1000 -gc_power_deps = 1000 +# If cs power should not be limited, a very high number should be given (e.g. 100000 = default) +gc_power_opps = 100000 +gc_power_deps = 100000 -# default max power of charging station at depot and opp stations -# at depot stations opp and depot busses have distinct charging stations (all default to: 150) +# default max power [kW] of charging station at depot and opp stations (default at opps: 300) +# at depot stations opp and depot busses have distinct charging stations (all deps default to: 150) # individual cs_power per gc and cs type can be defined in electrified stations -cs_power_opps = 400 -cs_power_deps_depb = 100 +cs_power_opps = 300 +cs_power_deps_depb = 150 cs_power_deps_oppb = 150 -# define hours of traffic_jam (options are "stop&go" and "dense") -#rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} +# set minimum allowed state of charge when leaving +# distinguish between depot and opportunity station +desired_soc_deps = 1.0 +desired_soc_opps = 1.0 +# min charging time at depots and opp stations ##### minutes ##### (default: 0) +min_charging_time = 0 -########### SPICE_EV SIMULATE PARAMETERS ############### +# buffer time at opp station if no specific buffer time is provided via the +# electrified_stations.json ##### minutes ##### (default: 0) Time specific buffer times can be set via a dict +# like: {"10-22": 5, "else": 2} NOTE: else clause is a MUST! The buffer time is deducted off of the +# planned standing time. It may resemble things like delays and/or docking procedures +default_buffer_time_opps = 0 -strategy = distributed -# possible strategies: greedy, balanced, balanced_market, schedule, flex_window -# options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] -strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] +##### SIMULATION HYPERPARAMETERS ##### +# maximum number of days to simulate, if not set simulate entire schedule +#days = 10 -# generate report and plots, default: false -generate_report = true -# show plots for users to view, only valid if generate_report = true -show_plots = true +# set length of timestep in minutes (default: 15 minute intervals) +interval = 1 + +# set random seed (for always random: set seed = null) +seed = 1 + +# time difference between signal time and actual start time of a vehicle event im min. (default: 10) +signal_time_dif = 10 -# give margin for desired SoC [0.0 - 1.0] -# margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. -# margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. -margin = 1.0 +# Show estimated time to finish simulation after each step. Not recommended for fast computations +eta = False diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 715840a2..754b80dc 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -37,13 +37,13 @@ help='set minimum desired SOC (0 - 1) for depot charging') parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=0.8, help='set minimum desired SOC (0 - 1) for opportunity charging') - parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=None, + parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=100000, help='max power of grid connector at opp stations') - parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=None, + parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=100000, help='max power of grid connector at depot stations') - parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=450, + parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=300, help='max power of charging station at opp stations') - parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=100, + parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=150, help='max power of charging station at depot stations for depot busses') parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, help='max power of charging station at depot stations for opp busses') @@ -88,17 +88,21 @@ parser.add_argument('--save-results', help='Write general info to file - not applicable', default=False) parser.add_argument('--save-soc', help='Write SOC info to file - not applicable', default=False) - parser.add_argument('--strategy', '-s', default='greedy', - help='Specify the charging strategy. One of {}. You may define \ - custom options with --strategy-option.'.format('greedy, balanced')) - parser.add_argument('--margin', '-m', metavar='X', type=float, default=0.05, + parser.add_argument('--strategy', '-s', default='distributed', + help='Specify the charging strategy for spiceEV\ + - not applicable'.format('greedy, balanced')) + parser.add_argument('--margin', '-m', metavar='X', type=float, default=1, help=('Add margin for desired SOC [0.0 - 1.0].\ margin=0.05 means the simulation will not abort if vehicles \ reach at least 95%% of the desired SOC before leaving. \ - margin=1 -> the simulation continues with every positive SOC value.')) + margin=1 -> the simulation continues with every positive SOC value.\ + - not applicable.')) parser.add_argument('--strategy-option', '-so', metavar=('KEY', 'VALUE'), nargs=2, action='append', - help='Append additional options to the charging strategy.') + default= [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], + ["ALLOW_NEGATIVE_SOC", True], ["RESET_NEGATIVE_SOC", False]], + help='Append additional options to the charging strategy.\ + - not applicable') parser.add_argument('--config', help='Use config file to set arguments') parser.add_argument('--station_data_path', help='Use station data to back calculation \ of consumption with height information of \ From 1858e2d59bc0665d08a326f30f4757c797e6bfc5 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 21 Feb 2023 12:59:06 +0100 Subject: [PATCH 548/802] make flake 8 happy --- ebus_toolbox/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 754b80dc..c0f2b008 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -90,7 +90,7 @@ parser.add_argument('--save-soc', help='Write SOC info to file - not applicable', default=False) parser.add_argument('--strategy', '-s', default='distributed', help='Specify the charging strategy for spiceEV\ - - not applicable'.format('greedy, balanced')) + - not applicable') parser.add_argument('--margin', '-m', metavar='X', type=float, default=1, help=('Add margin for desired SOC [0.0 - 1.0].\ margin=0.05 means the simulation will not abort if vehicles \ @@ -99,7 +99,7 @@ - not applicable.')) parser.add_argument('--strategy-option', '-so', metavar=('KEY', 'VALUE'), nargs=2, action='append', - default= [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], + default=[["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", True], ["RESET_NEGATIVE_SOC", False]], help='Append additional options to the charging strategy.\ - not applicable') From 25bfc683db0389768ea7e48e0a35c61745c38546 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 22 Feb 2023 09:30:18 +0100 Subject: [PATCH 549/802] use set_options_from_config of SpiceEV --- ebus_toolbox/__main__.py | 4 +-- ebus_toolbox/util.py | 60 ---------------------------------------- 2 files changed, 2 insertions(+), 62 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 924591ff..f90c5d49 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -3,9 +3,9 @@ from pathlib import Path import shutil +from spice_ev.util import set_options_from_config from ebus_toolbox import simulate, util - if __name__ == '__main__': parser = argparse.ArgumentParser( description='eBus-Toolbox - \ @@ -121,7 +121,7 @@ args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True - util.set_options_from_config(args, check=parser, verbose=False) + set_options_from_config(args, check=parser, verbose=False) args.output_directory = Path(args.output_directory) / ( datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 15280049..7d92e705 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -12,66 +12,6 @@ def save_version(file_path): f.write("Git Hash eBus-Toolbox:" + get_git_revision_hash()) -def set_options_from_config(args, check=None, verbose=True): - """Read options from config file, update given args, try to parse options - , ignore comment lines (begin with #) - - :param args: input arguments - :type args: argparse.Namespace - :param check: check config options against argparser - :type check: argparser - :param verbose: gives final overview of arguments - :type bool - - :raise argparse.ArgumentError: Raised if wrong option values are given - :raises Exception: Raised if unknown option is given - """ - - if "config" in args and args.config is not None: - # read options from config file - with open(args.config, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line.startswith('#'): - # comment - continue - if len(line) == 0: - # empty line - continue - k, v = line.split('=') - k = k.strip() - v = v.strip() - try: - # option may be special: number, array, etc. - v = json.loads(v) - except ValueError: - # or not - pass - # check option - if check is not None: - # find action by name - try: - action = [a for a in check._actions if a.dest == k][0] - except IndexError: - raise Exception(f"Unknown option {k}") - # check each item in list individually - v_list = [v] if type(v) != list else v - for v_item in v_list: - # check item. Returns None on success - # may raise ArgumentError if not successful - check._check_value(action, v_item) - else: - # all checks successful: set argument - vars(args)[k] = v - else: - # set option - vars(args)[k] = v - - # Give overview of options - if verbose: - print("Options: {}".format(vars(args))) - - def get_buffer_time(trip, default=0): """ Get buffer time at arrival station of a trip. Buffer_time is an abstraction of delays like docking procedures and From b5d358fb0bae0b869aa96cbb89b9510be55a6f3f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 10:31:55 +0100 Subject: [PATCH 550/802] Make flake8 happy --- ebus_toolbox/optimizer_util.py | 14 ++-- ebus_toolbox/simulate.py | 1 - ebus_toolbox/station_optimization.py | 4 +- ebus_toolbox/station_optimizer.py | 106 +++++++++++++-------------- tests/test_schedule.py | 5 +- tests/test_station_optimization.py | 9 +-- 6 files changed, 68 insertions(+), 71 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index e61c13cc..c1f3c67b 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -594,20 +594,21 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal stations are electrified :param cost_calc: should the cost be calculated :return: schedule and scenario objects after spiceev simulation + :raises SystemExit: Failing spiceEv Simulation raises SystemExit """ this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, electrified_stations=electrified_stations) - # do not print output from spice ev to reduce clutter - with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) - if not "pytest" in sys.modules: + if "pytest" not in sys.modules: + # do not print output from spice ev to reduce clutter. Dont do it in testing + # since it produces errors sys.stdout = open(os.devnull, 'w') new_scen.run('distributed', vars(this_args).copy()) - if not "pytest" in sys.modules: + if "pytest" not in sys.modules: sys.stdout = sys.__stdout__ try: if this_args.cost_calculation and cost_calc: @@ -619,9 +620,8 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " "does not exist. Exiting...") calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) - except: - warnings.warn(f"Cost Calculation was ignored due to some error") - pass + except Exception as e: + warnings.warn('Unexpected error in Cost calculation: {0}'.format(e)) return this_sched2, new_scen diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 0a235a0c..1cd725b3 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -117,4 +117,3 @@ def simulate(args): warn('Intermediate sim ignored') else: warn(f'Unknown mode {mode} ignored') - diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 3f1f6005..6f064249 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -158,8 +158,8 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): r not in optimizer.config.exclusion_rots} logger.warning("%s negative rotations %s were removed from schedule", len(neg_rots), neg_rots) - assert len(optimizer.schedule.rotations) > 0, "Schedule cant be optimized, since rotations" \ - "cant be electrified." + assert len(optimizer.schedule.rotations) > 0, "Schedule cant be optimized, since" \ + "rotations cant be electrified." if conf.check_for_must_stations: must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 455ccfca..76c49f73 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -403,59 +403,59 @@ def copy_scen_sched(self): self.scenario = copy(self.base_scenario) self.schedule = copy(self.base_schedule) - # ToDo implement a fast calculation of timeseries_calc but with a limited amount of charging - # points. Implementation could look like this - - # def get_charge_events_per_station(self, station_name, rotations=None): - # """ Gather low soc events below the config threshold. - # - # :param rotations: rotations to be searched for low soc events. Default None means whole - # schedule is searched - # :param station_name: name of the station to be checked - # :return: list(ChargingEvents) - # """ - # if not rotations: - # rotations = self.schedule.rotations - # - # # Find relevant charging events for this station - # charging_events = [] - # - # for rot_id in rotations: - # rot = self.schedule.rotations[rot_id] - # for i, trip in enumerate(rot.trips): - # # if the trip station name is not the searched station continue. - # if trip.arrival_name != station_name: - # continue - # try: - # charging_event_start_time = util.get_charging_start(trip, self.args) - # end_time = rot.trips[i + 1].departure_time - # - # - # # Do not add the event if there is charging time of at least the defined - # # min charging time - # if charging_event_start_time + self.args.min_charging_time >= end_time: - # continue - # except IndexError: - # warnings.warn("Station to be checked has no following trip. Final destinations" - # "can not offer lift to the soc and are therefore discarded") - # continue - # arrival_time= trip.arrival_time - # start_idx = self.get_index_by_time(charging_event_start_time) - # end_time = rot.trips[i+1].departure_time - # buffer_time = util.get_buffer_time(trip, self.args.default_buffer_time_opps) - # end_idx = self.get_index_by_time(end_time) - # cht = rot.vehicle_id.find("depb") - # ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" - # v_type = rot.vehicle_id.split("_" + ch_type)[0] - # event = util.ChargingEvent(start_idx=start_idx,end_idx=end_idx, - # arrival_time=arrival_time, - # start_time=charging_event_start_time, end_time=end_time, - # buffer_time=buffer_time, vehicle_id=rot.vehicle_id, - # capacity=self.schedule.vehicle_types[v_type][ch_type][ - # 'capacity'], - # station_name=station_name, rotation=rot) - # charging_events.append(event) - # return charging_events +# ToDo implement a fast calculation of timeseries_calc but with a limited amount of charging +# points. Implementation could look like this + +# def get_charge_events_per_station(self, station_name, rotations=None): +# """ Gather low soc events below the config threshold. +# +# :param rotations: rotations to be searched for low soc events. Default None means whole +# schedule is searched +# :param station_name: name of the station to be checked +# :return: list(ChargingEvents) +# """ +# if not rotations: +# rotations = self.schedule.rotations +# +# # Find relevant charging events for this station +# charging_events = [] +# +# for rot_id in rotations: +# rot = self.schedule.rotations[rot_id] +# for i, trip in enumerate(rot.trips): +# # if the trip station name is not the searched station continue. +# if trip.arrival_name != station_name: +# continue +# try: +# charging_event_start_time = util.get_charging_start(trip, self.args) +# end_time = rot.trips[i + 1].departure_time +# +# +# # Do not add the event if there is charging time of at least the defined +# # min charging time +# if charging_event_start_time + self.args.min_charging_time >= end_time: +# continue +# except IndexError: +# warnings.warn("Station to be checked has no following trip. Final destinations" +# "can not offer lift to the soc and are therefore discarded") +# continue +# arrival_time= trip.arrival_time +# start_idx = self.get_index_by_time(charging_event_start_time) +# end_time = rot.trips[i+1].departure_time +# buffer_time = util.get_buffer_time(trip, self.args.default_buffer_time_opps) +# end_idx = self.get_index_by_time(end_time) +# cht = rot.vehicle_id.find("depb") +# ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" +# v_type = rot.vehicle_id.split("_" + ch_type)[0] +# event = util.ChargingEvent(start_idx=start_idx,end_idx=end_idx, +# arrival_time=arrival_time, +# start_time=charging_event_start_time, end_time=end_time, +# buffer_time=buffer_time, vehicle_id=rot.vehicle_id, +# capacity=self.schedule.vehicle_types[v_type][ch_type][ +# 'capacity'], +# station_name=station_name, rotation=rot) +# charging_events.append(event) +# return charging_events def sort_station_events(self, charge_events_single_station): return sorted(charge_events_single_station, key=lambda x: x.arrival_time) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index fa1af3ec..db401b65 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -134,10 +134,12 @@ def test_rotation_consistency(self): def test_basic_run(self, trips_file_name="trips.csv"): """ Check if running a basic example works and if a scenario object is returned + :param trips_file_name: file name of the trips file. Has to be inside the test_input_file + folder + :type trips_file_name: str :return: schedule, scenario""" path_to_trips = file_root / trips_file_name - print("XXX" , path_to_trips) parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args(args="") args.config = file_root / "ebus_toolbox.cfg" @@ -193,7 +195,6 @@ def test_calculate_consumption(self): outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) - path_to_trips = file_root / "trips_assign_vehicles.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, vehicle_types, self.electrified_stations, **mandatory_args) diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 5ca70c28..6557be44 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -8,7 +8,6 @@ file_root = test_root / "test_input_files" - class TestStationOptimization: def test_basic_optimization(self): @@ -57,7 +56,9 @@ def test_deep_optimization(self): assert "Station-3" in opt_sched.stations def test_must_stations_optimization(self, caplog): - """ Test if station 2 and 3 are correctly recognized as must stations""" + """ Test if station 2 and 3 are correctly recognized as must stations + :param caplog: pytest fixture, which is automatically created + """ trips_file_name = "trips_for_optimizer_deep.csv" schedule_test = tests.test_schedule.TestSchedule() sched, scen, args = schedule_test.test_basic_run(trips_file_name=trips_file_name) @@ -70,7 +71,3 @@ def test_must_stations_optimization(self, caplog): opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) assert ("must stations {'Station-3', 'Station-2'}" in caplog.text or "must stations {'Station-2', 'Station-3'}" in caplog.text) - - - - From a2f5c1846fd8197230d74e471e27a704e5e9b597 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 13:49:29 +0100 Subject: [PATCH 551/802] Add station optimizer into config and simulate. Make config reading more robust --- data/examples/ebus_toolbox.cfg | 6 ++++-- ebus_toolbox/__main__.py | 4 ++++ ebus_toolbox/optimizer_util.py | 26 ++++++++++++++++++-------- ebus_toolbox/simulate.py | 15 +++++++++++++++ ebus_toolbox/station_optimization.py | 11 +++++++++-- ebus_toolbox/station_optimizer.py | 10 ++++------ tests/test_station_optimization.py | 3 ++- 7 files changed, 56 insertions(+), 19 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 9fdac230..9200c884 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -24,6 +24,8 @@ outside_temperature_over_day_path = data/examples/default_temp_winter.csv # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) level_of_loading_over_day_path = data/examples/default_level_of_loading_over_day.csv +# Path to configuration file for the station optimization. Only needed for mode "station_optimization" +optimizer_config = data/examples/default_optimizer.cfg ##### COST CALCULATION ##### # set flag for cost calculation: @@ -44,8 +46,8 @@ seed = 1 # neg_oppb_to_depb changes negative oppb-rotations to depb charging. # service_optimization finds the largest set of electrified rotations. # report generates simulation output files, including costs. -mode = ["sim", "report"] -#mode = ["sim", "neg_depb_to_oppb", "service_optimization", "report"] +mode = ["sim","station_optimization", "report"] +#mode = ["sim", "neg_depb_to_oppb", "service_optimization", "report", "station_optimization"] # set length of timestep in minutes (default: 15 minute intervals) interval = 1 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 66d6a6a9..65f6de6a 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -116,6 +116,10 @@ help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") + parser.add_argument('--optimizer_config', default=None, + help="For station_optimization a optimizer_config is needed. Input" + "a path to an .cfg file or use the default_optimizer.cfg") + args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index c1f3c67b..f84b6796 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -2,6 +2,7 @@ LowSocEvents, like evaluating them, gathering them and so on""" import math import os +import pathlib import pickle import sys import typing @@ -87,7 +88,7 @@ def __init__(self): self.node_choice = None self.max_brute_loop = None self.run_only_neg = None - self.run_only_depb = None + self.run_only_oppb = None self.estimation_threshold = None self.output_path = None self.check_for_must_stations = None @@ -138,12 +139,21 @@ def read_config(config_path): """ config_parser = configparser.ConfigParser() config_parser.sections() - config_parser.read(config_path, encoding="utf-8") + assert pathlib.Path(config_path).is_file(), f"Path to optimizer_config: {config_path} " \ + f"does not lead to file" + config_parser.read(config_path, encoding="utf-8") conf = OptimizerConfig() conf.path = config_path - default = config_parser["DEFAULT"] + section_dict = dict() + for section in ["DEFAULT", "SCENARIO", "PICKLE", "VEHICLE", "OPTIMIZER", "SPECIAL"]: + try: + section_dict[section] = config_parser[section] + except KeyError: + section_dict[section] = config_parser["DEFAULT"] + + default = section_dict["DEFAULT"] conf.debug_level = int(default.get("debug_level", "0")) sce = config_parser["SCENARIO"] conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) @@ -151,12 +161,12 @@ def read_config(config_path): conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) - pick = config_parser["PICKLE"] + pick = section_dict["PICKLE"] conf.schedule = pick.get("schedule", "") conf.scenario = pick.get("scenario", "") conf.args = pick.get("args", "") - vehicle = config_parser["VEHICLE"] + vehicle = section_dict["VEHICLE"] conf.charge_eff = float(vehicle.get("charge_eff", "0.95")) conf.battery_capacity = float(vehicle.get("battery_capacity", "0")) if conf.battery_capacity == 0: @@ -169,7 +179,7 @@ def read_config(config_path): conf.charging_power = None conf.min_soc = float(vehicle.get("min_soc", "0.0")) - optimizer = config_parser["OPTIMIZER"] + optimizer = section_dict["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) @@ -181,14 +191,14 @@ def read_config(config_path): conf.node_choice = optimizer.get("node_choice", "step-by-step") conf.max_brute_loop = int(optimizer.get("max_brute_loop", "20")) conf.run_only_neg = optimizer.getboolean("run_only_neg", False) - conf.run_only_depb = optimizer.getboolean("run_only_depb", False) + conf.run_only_oppb = optimizer.getboolean("run_only_oppb", False) conf.estimation_threshold = float(optimizer.get("estimation_threshold", "0.8")) conf.output_path = optimizer.get("output_path") conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) conf.pruning_threshold = int(optimizer.get("pruning_threshold", "3")) conf.save_all_results = optimizer.getboolean("save_all_results", False) - special = config_parser["SPECIAL"] + special = section_dict["SPECIAL"] conf.decision_tree_path = special.get("decision_tree_path", None) if conf.decision_tree_path in ["", '""', "''"]: conf.decision_tree_path = None diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1cd725b3..dda91748 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,3 +1,4 @@ +import warnings from warnings import warn from ebus_toolbox.consumption import Consumption @@ -5,6 +6,8 @@ from ebus_toolbox.trip import Trip from ebus_toolbox.costs import calculate_costs from ebus_toolbox import report, optimization, util +from ebus_toolbox.station_optimization import run_optimization +from ebus_toolbox.optimizer_util import read_config as read_optimzier_config def simulate(args): @@ -100,6 +103,18 @@ def simulate(args): neg_rot = schedule.get_negative_rotations(scenario) if neg_rot: print(f'Rotations {", ".join(neg_rot)} remain negative.') + elif mode == "station_optimization": + if str(args.optimizer_config) == "" or args.optimizer_config is None: + warnings.warn("Station optimization needs an optimization config file. Since no" + "path was given, station optimization is skipped") + break + conf = read_optimzier_config(args.optimizer_config) + try: + schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, + this_args=args) + except Exception as err: + warnings.warn('During Station optimization an Error occurred {0}.' + 'Optimization was skipped'.format(err)) elif mode == 'report': # create report based on all previous modes if args.cost_calculation: diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 6f064249..76021d4b 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -103,7 +103,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - # load pickle files + # load pickle files only in the case they are not given as arguments if sched is None or scen is None or this_args is None: # if no schedule was given as argument, make sure no scenario # and args input was given as well. @@ -138,6 +138,13 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): # set battery and charging curves through config file if wished for optimizer.set_battery_and_charging_curves() + # filter out depot chargers if option is set + if conf.run_only_oppb: + sched.rotations = {r: sched.rotations[r] for r in sched.rotations + if "oppb" in sched.rotations[r].vehicle_id} + assert len(sched.rotations) > 0, "Removing depot chargers led to a schedule without any " \ + "rotations." + # rebasing the scenario meaning simulating it again with the given conditions of # included and excluded stations and rotations and maybe changed battery sizes if conf.rebase_scenario: @@ -148,7 +155,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): # create charging dicts which contain soc over time, which is numerically calculated optimizer.create_charging_curves() - # remove none Values from socs in the vehicle_socs + # remove none values from socs in the vehicle_socs optimizer.remove_none_socs() if conf.remove_impossible_rots: neg_rots = optimizer.get_negative_rotations_all_electrified() diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 76c49f73..9ea8205e 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -1,17 +1,17 @@ """ Optimizer class which implements the optimizer object and methods needed""" -import json +import traceback import logging import pickle import warnings from copy import deepcopy, copy from datetime import datetime, timedelta from pathlib import Path - import numpy as np import ebus_toolbox.optimizer_util as util from spice_ev import scenario from ebus_toolbox import report, rotation, schedule +from ebus_toolbox.util import uncomment_json_file class StationOptimizer: @@ -34,7 +34,7 @@ def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, self.config = config self.electrified_station_set = set() with open(self.args.electrified_stations, "r", encoding="utf-8", ) as file: - self.electrified_stations = json.load(file) + self.electrified_stations = uncomment_json_file(file) self.base_stations = self.electrified_stations.copy() self.base_electrified_station_set = set() @@ -846,8 +846,7 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, try: report.generate(new_sched, new_scen, self.args) except Exception: - warnings.warn("Report generation failed") - pass + warnings.warn('Report generation failed: " {0}'.format(traceback.format_exc())) self.schedule = new_sched self.scenario = new_scen self.must_include_set = must_include_set @@ -1088,7 +1087,6 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, min_soc, min_idx = min(reduced_list, key=lambda x: x[0]) else: break - print([event.min_soc for event in events]) return events diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 6557be44..bc551806 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -11,13 +11,14 @@ class TestStationOptimization: def test_basic_optimization(self): + """ Test the base optimization simply by checking of optimization finishes without + raising errors""" trips_file_name = "trips_for_optimizer.csv" schedule_test = tests.test_schedule.TestSchedule() sched, scen, args = schedule_test.test_basic_run(trips_file_name) config_path = file_root / "optimizer.cfg" conf = util.read_config(config_path) opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - conf.solver = "spiceev" opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) From 7ecb2715384ec22201406c17d14c62a42955e729 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 15:03:08 +0100 Subject: [PATCH 552/802] Remove cost calculation and report generation --- ebus_toolbox/optimizer_util.py | 14 +------------- ebus_toolbox/station_optimization.py | 4 +++- ebus_toolbox/station_optimizer.py | 11 ++--------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index f84b6796..81a6ccea 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -596,7 +596,7 @@ def combs_unordered_no_putting_back(n: int, k: int): return 0 -def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): +def run_schedule(this_sched, this_args, electrified_stations=None): """Run a given schedule and electrify stations if need be :param this_sched: schedule object :param this_args: args namespace object @@ -620,18 +620,6 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal new_scen.run('distributed', vars(this_args).copy()) if "pytest" not in sys.modules: sys.stdout = sys.__stdout__ - try: - if this_args.cost_calculation and cost_calc: - # cost calculation following directly after simulation - try: - with open(this_args.cost_parameters_file, encoding='utf-8') as file: - cost_parameters_file = uncomment_json_file(file) - except FileNotFoundError: - raise SystemExit(f"Path to cost parameters ({this_args.cost_parameters_file}) " - "does not exist. Exiting...") - calculate_costs(cost_parameters_file, new_scen, this_sched2, this_args) - except Exception as e: - warnings.warn('Unexpected error in Cost calculation: {0}'.format(e)) return this_sched2, new_scen diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 76021d4b..e0a1fe9d 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -191,9 +191,11 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): with open(new_ele_stations_path, "w", encoding="utf-8") as file: json.dump(ele_stations, file, ensure_ascii=False, indent=2) util.print_time() + + # todo remove cost calc and report generation logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( - electrified_stations=ele_stations, run_only_neg=False, cost_calc=True) + electrified_stations=ele_stations, run_only_neg=False) logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 9ea8205e..8dcd25f0 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -812,13 +812,11 @@ def rebase_simple(self): self.base_stations = self.electrified_stations.copy() return must_include_set, self.electrified_stations - def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, - cost_calc=False): + def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): """Prepare scenario and run schedule :param electrified_stations: optional dict of electrified stations to use in simulation. Default None leads to using optimizer.electrified_stations :param run_only_neg: should only negative rotations be simulated - :param cost_calc: should costs be calculated :return: schedule, scenario, electrified_station_set, electrified_stations :rtype (schedule.Schedule, scenario.Scenario, set(), dict()) """ @@ -841,12 +839,7 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False, self.schedule.rotations = rots new_sched, new_scen = util.run_schedule(self.schedule, self.args, - electrified_stations, - cost_calc=cost_calc) - try: - report.generate(new_sched, new_scen, self.args) - except Exception: - warnings.warn('Report generation failed: " {0}'.format(traceback.format_exc())) + electrified_stations) self.schedule = new_sched self.scenario = new_scen self.must_include_set = must_include_set From 90fd81790f585d007a77294d5f522451295ea416 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 22 Feb 2023 15:27:37 +0100 Subject: [PATCH 553/802] remove unneeded arguments from config and main --- ebus_toolbox/__main__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index d86afe46..fdf81a72 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -91,10 +91,7 @@ help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') - ##### SPICE EV PARAMETERS ONLY DEFAULT NOT BY DEFAULT IN eBus-Toolbox CONFIG ##### - parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', - help='add battery with specified capacity in kWh and C-rate \ - (-1 for variable capacity, second argument is fixed power))') + ##### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') parser.add_argument('--include-price-csv', From c47ee08b6a5ad1b26973be9224f8ea5423108b0e Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 22 Feb 2023 15:29:11 +0100 Subject: [PATCH 554/802] make flake8 happy --- ebus_toolbox/__main__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index fdf81a72..0acbddc9 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -11,7 +11,7 @@ description='eBus-Toolbox - \ simulation program for electric bus fleets.') - ##### Paths ##### + # #### Paths ##### parser.add_argument('--input-schedule', nargs='?', help='Path to CSV file containing all trips of schedule to be analyzed.') parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', @@ -30,7 +30,7 @@ level of loading in case they are not in trips.csv") parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) - ##### Modes ##### + # #### Modes ##### mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] parser.add_argument('--mode', default=['sim', 'report'], nargs='*', choices=mode_choices, help=f"Specify what you want to do. Choose one or more from \ @@ -41,7 +41,7 @@ service optimization finds the largest set of electrified rotations. \ report generates simulation output files.") - ##### Flags ##### + # #### Flags ##### parser.add_argument('--cost-calculation', '-cc', action='store_true', help='Calculate costs') parser.add_argument('--check-rotation-consistency', action='store_true', @@ -52,7 +52,7 @@ help='show plots for users to view in "report" mode', default=False) - ##### Physical setup of environment ##### + # #### Physical setup of environment ##### parser.add_argument('--preferred-charging-type', '-pct', default='depb', choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ from {depb, oppb}. opp stands for opportunity.") @@ -79,7 +79,7 @@ parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' 'at opp station to simulate docking procedure.', default=0) - ##### SIMULATION PARAMETERS ##### + # #### SIMULATION PARAMETERS ##### parser.add_argument('--days', metavar='N', type=int, default=None, help='set duration of scenario as number of days') parser.add_argument('--interval', metavar='MIN', type=int, default=15, @@ -91,7 +91,7 @@ help='Show estimated time to finish simulation after each step, \ instead of progress bar. Not recommended for fast computations.') - ##### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### + # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') parser.add_argument('--include-price-csv', From 47e29fdbacb1c04cf46f10839b195f5390ad3e79 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 15:39:57 +0100 Subject: [PATCH 555/802] Remove spiceev file handling from station_optimization --- ebus_toolbox/optimizer_util.py | 19 ++++++++++++------ ebus_toolbox/simulate.py | 2 +- ebus_toolbox/station_optimization.py | 29 ++++++++++++++-------------- ebus_toolbox/station_optimizer.py | 6 ++---- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 81a6ccea..294a1973 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -19,9 +19,8 @@ from ebus_toolbox.station_optimizer import StationOptimizer from ebus_toolbox.consumption import Consumption -from ebus_toolbox.costs import calculate_costs from ebus_toolbox.trip import Trip -from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev, uncomment_json_file +from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev class ChargingEvent: @@ -90,10 +89,10 @@ def __init__(self): self.run_only_neg = None self.run_only_oppb = None self.estimation_threshold = None - self.output_path = None self.check_for_must_stations = None self.decision_tree_path = None self.save_decision_tree = None + self.optimizer_output_dir = None self.reduce_rots = None self.rots = None self.path = None @@ -193,7 +192,6 @@ def read_config(config_path): conf.run_only_neg = optimizer.getboolean("run_only_neg", False) conf.run_only_oppb = optimizer.getboolean("run_only_oppb", False) conf.estimation_threshold = float(optimizer.get("estimation_threshold", "0.8")) - conf.output_path = optimizer.get("output_path") conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) conf.pruning_threshold = int(optimizer.get("pruning_threshold", "3")) conf.save_all_results = optimizer.getboolean("save_all_results", False) @@ -602,15 +600,24 @@ def run_schedule(this_sched, this_args, electrified_stations=None): :param this_args: args namespace object :param electrified_stations: dict of electrified stations. Default value None means no further stations are electrified - :param cost_calc: should the cost be calculated :return: schedule and scenario objects after spiceev simulation - :raises SystemExit: Failing spiceEv Simulation raises SystemExit """ this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, electrified_stations=electrified_stations) + # parse strategy options for Spice EV + if this_args.strategy_option is not None: + for opt_key, opt_val in this_args.strategy_option: + try: + # option may be number + opt_val = float(opt_val) + except ValueError: + # or not + pass + setattr(this_args, opt_key, opt_val) + with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) if "pytest" not in sys.modules: diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index dda91748..4f5aa46c 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -113,7 +113,7 @@ def simulate(args): schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, this_args=args) except Exception as err: - warnings.warn('During Station optimization an Error occurred {0}.' + warnings.warn('During Station optimization an error occurred {0}.' 'Optimization was skipped'.format(err)) elif mode == 'report': # create report based on all previous modes diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index e0a1fe9d..01ed68d1 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -7,7 +7,6 @@ import logging import shutil import matplotlib - import ebus_toolbox.station_optimizer from ebus_toolbox.station_optimizer import util @@ -30,7 +29,7 @@ def setup_logger(this_args, conf): file_handler_all_opts.setLevel(conf.debug_level) # and logging to a file which is put in the folder with the other optimizer results - file_handler_this_opt = logging.FileHandler(Path(this_args.output_directory) / + file_handler_this_opt = logging.FileHandler(Path(conf.optimizer_output_dir) / Path('optimizer.log')) file_handler_this_opt.setLevel(conf.debug_level) @@ -70,14 +69,15 @@ def prepare_filesystem(this_args, conf): :param this_args: Namespace object of arguments for ebus toolbox """ now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - this_args.output_directory = Path(conf.output_path) / str(now + "_optimizer") + this_args.output_directory = Path(this_args.output_directory) + conf.optimizer_output_dir = Path(this_args.output_directory) / str(now + "_optimizer") # create sub folder for specific sim results with timestamp. # if folder doesnt exists, create folder. - this_args.output_directory.mkdir(parents=True, exist_ok=True) + conf.optimizer_output_dir.mkdir(parents=True, exist_ok=True) # copy paste the config file copy_file = Path(conf.path) - destination = this_args.output_directory / Path("optimizer_config.cfg") + destination = conf.optimizer_output_dir / Path("optimizer_config.cfg") shutil.copy(copy_file, destination) @@ -117,18 +117,18 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): if args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - new_ele_stations_path = args.output_directory / Path("optimized_stations" + ".json") + new_ele_stations_path = conf.optimizer_output_dir / Path("optimized_stations" + ".json") logger = setup_logger(args, conf) - # remove those args, since they lead to file creation, which is not - # needed. - if not conf.save_all_results: - del args.save_timeseries - del args.save_results - else: - args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" - args.save_results = args.output_directory / "simulation_spiceEV.json" + # # remove those args, since they lead to file creation, which is not + # # needed. + # if not conf.save_all_results: + # del args.save_timeseries + # del args.save_results + # else: + # args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" + # args.save_results = args.output_directory / "simulation_spiceEV.json" if args.desired_soc_deps != 1 and conf.solver == "quick": logger.error("Fast calc is not yet optimized for desired socs unequal to 1") @@ -192,7 +192,6 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): json.dump(ele_stations, file, ensure_ascii=False, indent=2) util.print_time() - # todo remove cost calc and report generation logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 8dcd25f0..2d7de0c8 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -1,8 +1,6 @@ """ Optimizer class which implements the optimizer object and methods needed""" -import traceback import logging import pickle -import warnings from copy import deepcopy, copy from datetime import datetime, timedelta from pathlib import Path @@ -10,7 +8,7 @@ import ebus_toolbox.optimizer_util as util from spice_ev import scenario -from ebus_toolbox import report, rotation, schedule +from ebus_toolbox import rotation, schedule from ebus_toolbox.util import uncomment_json_file @@ -198,7 +196,7 @@ def loop(self, **kwargs): util.print_time() # saving decision tree only in case of deep analysis if self.config.save_decision_tree: - with open(self.args.output_directory / Path("decision_tree.pickle"), "wb") as file: + with open(self.config.optimizer_output_dir / Path("decision_tree.pickle"), "wb") as file: pickle.dump(self.current_tree, file) self.electrified_stations = self.base_stations.copy() From f35e5d4c756b0d274373d2f9fb79ed76f3639347 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 15:41:31 +0100 Subject: [PATCH 556/802] Make flake8 happy --- ebus_toolbox/station_optimization.py | 9 --------- ebus_toolbox/station_optimizer.py | 4 ++-- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 01ed68d1..d2f905af 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -121,15 +121,6 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): logger = setup_logger(args, conf) - # # remove those args, since they lead to file creation, which is not - # # needed. - # if not conf.save_all_results: - # del args.save_timeseries - # del args.save_results - # else: - # args.save_timeseries = args.output_directory / "simulation_spiceEV.csv" - # args.save_results = args.output_directory / "simulation_spiceEV.json" - if args.desired_soc_deps != 1 and conf.solver == "quick": logger.error("Fast calc is not yet optimized for desired socs unequal to 1") diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 2d7de0c8..fd604404 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -196,8 +196,8 @@ def loop(self, **kwargs): util.print_time() # saving decision tree only in case of deep analysis if self.config.save_decision_tree: - with open(self.config.optimizer_output_dir / Path("decision_tree.pickle"), "wb") as file: - pickle.dump(self.current_tree, file) + with open(self.config.optimizer_output_dir / Path("decision_tree.pickle"), "wb") as f: + pickle.dump(self.current_tree, f) self.electrified_stations = self.base_stations.copy() self.electrified_station_set = self.base_electrified_station_set.copy() From 5886e6e260b1cfc183413d83787ecfdefa37c4d0 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 22 Feb 2023 16:18:30 +0100 Subject: [PATCH 557/802] rework defaults and comments in config arguments --- data/examples/ebus_toolbox.cfg | 18 +++++++++-------- ebus_toolbox/__main__.py | 37 +++++++++++++++++----------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 9c19274e..12d02840 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -33,18 +33,19 @@ mode = ["sim", "report"] ##### Flags ##### ### Activate optional functions ### -# Set flag for cost calculation: +# Set flag for cost calculation: (default: false) cost_calculation = true -# Check rotation assumptions when building schedule? +# Check rotation assumptions when building schedule? (default: false) check_rotation_consistency = false -# Remove rotations from schedule that violate assumptions? Needs check_rotation_consistency to have an effect +# Remove rotations from schedule that violate assumptions? +# Needs check_rotation_consistency to have an effect (default: false) ignore_inconsistent_rotations = false -# Show plots for users to view, only valid if generate_report = true +# Show plots for users to view, only valid if generate_report = true (default: false) show_plots = true ##### Physical setup of environment ##### ### Parametrization of the physical setup ### -# Preferred charging type. Options: depb, oppb (default: oppb) +# Preferred charging type. Options: depb, oppb (default: depb) preferred_charging_type = oppb # Default max power [kW] of grid connectors at depot and opp stations, # individual gc_power per gc can be defined in electrified stations @@ -57,7 +58,7 @@ gc_power_deps = 100000 cs_power_opps = 300 cs_power_deps_depb = 150 cs_power_deps_oppb = 150 -# Set minimum allowed state of charge when leaving depot and opportunity stations +# Set minimum allowed state of charge when leaving depot and opportunity stations (both default: 1) desired_soc_deps = 1.0 desired_soc_opps = 1.0 # Minimum fraction of capacity for recharge when leaving the depot. Helps calculating the @@ -69,15 +70,16 @@ min_charging_time = 0 # Buffer time [min] at opp station if no specific buffer time is given in electrified_stations.json # Time specific buffer times can be set via a dict e.g.: {"10-22": 5, "else": 2} # NOTE: else clause is a MUST! The buffer time is deducted off of the planned standing time. -# It may resemble things like delays and/or docking procedures +# It may resemble things like delays and/or docking procedures (default: 0) default_buffer_time_opps = 0 ##### SIMULATION PARAMETERS ##### # Maximum number of days to simulate, if not set simulate entire schedule #days = 10 -# Set length of timestep in minutes (default: 15 minute intervals) +# Set length of timestep in minutes (default: 1) interval = 1 # Time difference between signal time and actual start time of a vehicle event im min. (default: 10) signal_time_dif = 10 # Show estimated time to finish simulation after each step. Not recommended for fast computations +# (default: False) eta = False diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 884787b7..057f5d76 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -13,22 +13,25 @@ # #### Paths ##### parser.add_argument('--input-schedule', nargs='?', - help='Path to CSV file containing all trips of schedule to be analyzed.') + help='Path to CSV file containing all trips of schedule to be analyzed.', + required = True) parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') - parser.add_argument('--electrified-stations', help='include electrified_stations json') + parser.add_argument('--electrified-stations', help='include electrified_stations json', + required = True) parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", help='location of vehicle type definitions') - parser.add_argument('--station_data_path', help='Use station data to back calculation \ - of consumption with height information of \ - stations') + parser.add_argument('--station_data_path', default=None, + help='Use station data to back calculation of consumption with height\ + information of stations') parser.add_argument('--outside_temperature_over_day_path', default=None, help="Use csv. data with 'hour' and temperature' columns to set \ temperatures in case they are not in trips.csv") parser.add_argument('--level_of_loading_over_day_path', default=None, help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") - parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) + parser.add_argument('--cost-parameters-file', default=None, + help='include cost parameters json, needed if cost_calculation==True') # #### Modes ##### mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] @@ -48,9 +51,8 @@ help='Check rotation assumptions when building schedule.') parser.add_argument('--ignore-inconsistent-rotations', action='store_true', help='Remove rotations from schedule that violate assumptions. ') - parser.add_argument('--show-plots', - help='show plots for users to view in "report" mode', - default=False) + parser.add_argument('--show-plots', action='store_true', + help='show plots for users to view in "report" mode') # #### Physical setup of environment ##### parser.add_argument('--preferred-charging-type', '-pct', default='depb', @@ -68,7 +70,7 @@ help='max power of charging station at depot stations for opp busses') parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, help='set minimum desired SOC (0 - 1) for depot charging') - parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=0.8, + parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=1.0, help='set minimum desired SOC (0 - 1) for opportunity charging') parser.add_argument('--min-recharge-deps-oppb', default=1, help='Minimum fraction of capacity for recharge when leaving the depot.') @@ -82,14 +84,14 @@ # #### SIMULATION PARAMETERS ##### parser.add_argument('--days', metavar='N', type=int, default=None, help='set duration of scenario as number of days') - parser.add_argument('--interval', metavar='MIN', type=int, default=15, + parser.add_argument('--interval', metavar='MIN', type=int, default=1, help='set number of minutes for each timestep (Δt)') - parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' - 'start time of a vehicle event im min.', - default=10) + parser.add_argument('--signal-time-dif', default=10, + help='time difference between signal time and actual ' + 'start time of a vehicle event im min.') parser.add_argument('--eta', action='store_true', - help='Show estimated time to finish simulation after each step, \ - instead of progress bar. Not recommended for fast computations.') + help='Show estimated time to finish simulation after each step, ' + 'instead of progress bar. Not recommended for fast computations.') # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') @@ -161,7 +163,4 @@ if any([args.save_soc, args.save_results, args.save_timeseries]): print("save_* options ignored for eBus-Toolbox reports naming") - if args.input_schedule is None: - raise SystemExit("The following argument is required: input_schedule") - simulate.simulate(args) From 8abfce66130e9d6dc5ddd3c532c627916d8057d5 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 22 Feb 2023 16:21:19 +0100 Subject: [PATCH 558/802] make flake8 happy --- ebus_toolbox/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 057f5d76..c80c9bd7 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -14,11 +14,11 @@ # #### Paths ##### parser.add_argument('--input-schedule', nargs='?', help='Path to CSV file containing all trips of schedule to be analyzed.', - required = True) + required=True) parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') parser.add_argument('--electrified-stations', help='include electrified_stations json', - required = True) + required=True) parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", help='location of vehicle type definitions') parser.add_argument('--station_data_path', default=None, From bc45ee0f9d7d6dd800cf4a8e09080ea0f6c15666 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 16:50:02 +0100 Subject: [PATCH 559/802] Change prints --- ebus_toolbox/optimizer_util.py | 4 +++- ebus_toolbox/station_optimization.py | 23 +++++++++++++++-------- ebus_toolbox/station_optimizer.py | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 294a1973..87c4f0c5 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -66,6 +66,7 @@ class OptimizerConfig: def __init__(self): self.debug_level = None + self.console_level = None self.exclusion_rots = None self.exclusion_stations = None self.inclusion_stations = None @@ -154,6 +155,7 @@ def read_config(config_path): default = section_dict["DEFAULT"] conf.debug_level = int(default.get("debug_level", "0")) + conf.console_level = int(default.get("console_level", "99")) sce = config_parser["SCENARIO"] conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) @@ -660,7 +662,7 @@ def print_time(start=[]): start.append(time()) delta = round(time() - start[0], 2) if delta > 0: - print(delta, " seconds till start") + print(delta, "seconds since start") def plot_(data): diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index d2f905af..bf27faad 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -14,8 +14,8 @@ matplotlib.use("TkAgg") -def setup_logger(this_args, conf): - """ setup file and stream logging by config and args arguments +def setup_logger(conf): + """ Setup file and stream logging by config and args arguments :param conf: configuration object :param this_args: Namespace object of arguments for ebus toolbox :return: logger @@ -42,7 +42,7 @@ def setup_logger(this_args, conf): formatter = logging.Formatter('%(message)s') stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) - stream_handler.setLevel(conf.debug_level) + stream_handler.setLevel(conf.console_level) this_logger.addHandler(file_handler_this_opt) this_logger.addHandler(file_handler_all_opts) this_logger.addHandler(stream_handler) @@ -119,7 +119,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" new_ele_stations_path = conf.optimizer_output_dir / Path("optimized_stations" + ".json") - logger = setup_logger(args, conf) + logger = setup_logger(conf) if args.desired_soc_deps != 1 and conf.solver == "quick": logger.error("Fast calc is not yet optimized for desired socs unequal to 1") @@ -141,6 +141,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): if conf.rebase_scenario: must_include_set, ele_stations = optimizer.rebase_spice_ev() else: + # no new spice ev calculation will take place but some variables need to be adjusted. must_include_set, ele_stations = optimizer.rebase_simple() # create charging dicts which contain soc over time, which is numerically calculated @@ -148,6 +149,8 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): # remove none values from socs in the vehicle_socs optimizer.remove_none_socs() + + # check if rotations cant be operated electric, even with all stations electrified. if conf.remove_impossible_rots: neg_rots = optimizer.get_negative_rotations_all_electrified() optimizer.config.exclusion_rots.update(neg_rots) @@ -159,12 +162,16 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): assert len(optimizer.schedule.rotations) > 0, "Schedule cant be optimized, since" \ "rotations cant be electrified." + # if the whole network cant be fully electrified if even just a single station is not + # electrified, this station must be included in a fully electrified network + # this can make solving networks much simpler. Some information in the electrification path + # gets lost though if conf.check_for_must_stations: must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) logger.warning("%s must stations %s", len(must_stations), must_stations) - print("%s must stations %s", len(must_stations), must_stations) - logger.debug("Starting greedy optimization") + logger.debug("Starting greedy station optimization") + print("Starting greedy station optimization") ele_stations, ele_station_set = optimizer.loop() ele_station_set = ele_station_set.union(must_include_set) logger.debug("%s electrified stations : %s", len(ele_station_set), ele_station_set) @@ -181,7 +188,6 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): logger.debug(event.rotation.id) with open(new_ele_stations_path, "w", encoding="utf-8") as file: json.dump(ele_stations, file, ensure_ascii=False, indent=2) - util.print_time() logger.debug("Spice EV is calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( @@ -189,8 +195,9 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) + print("Station optimization finished after ", end="") + util.print_time() - print("Finished") return optimizer.schedule, optimizer.scenario diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index fd604404..6bf4cd63 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -186,7 +186,7 @@ def loop(self, **kwargs): list_greedy_sets[group_nr] = new_electrified_set.copy() pre_optimized_set = new_electrified_set.copy() else: - print(f"Ran all {self.config.max_brute_loop} loops") + self.logger.warning(f"Ran all {self.config.max_brute_loop} loops") # print all solutions with the length of the self.logger.debug("All solutions for this group: %s", sols) From 19ace13d7103336bf99a13649f88e004f21080ae Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 16:50:59 +0100 Subject: [PATCH 560/802] Remove excess docstring --- ebus_toolbox/station_optimization.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index bf27faad..59b7f127 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -17,7 +17,6 @@ def setup_logger(conf): """ Setup file and stream logging by config and args arguments :param conf: configuration object - :param this_args: Namespace object of arguments for ebus toolbox :return: logger :rtype: Logger """ From 5b0887b26cb8e25f21156d1b504f6aff647825d1 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 16:55:12 +0100 Subject: [PATCH 561/802] Remove TkAgg --- ebus_toolbox/station_optimization.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 59b7f127..97d42987 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -9,9 +9,8 @@ import matplotlib import ebus_toolbox.station_optimizer from ebus_toolbox.station_optimizer import util - config = util.OptimizerConfig() -matplotlib.use("TkAgg") + def setup_logger(conf): From c14bdd5c4c27a237b1afc8bc0b8ebafd3329b2f6 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 16:57:22 +0100 Subject: [PATCH 562/802] Make flake8 happy --- ebus_toolbox/station_optimization.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 97d42987..981bcf3f 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -6,13 +6,11 @@ from pathlib import Path import logging import shutil -import matplotlib import ebus_toolbox.station_optimizer from ebus_toolbox.station_optimizer import util config = util.OptimizerConfig() - def setup_logger(conf): """ Setup file and stream logging by config and args arguments :param conf: configuration object From b35edfda77b45550a722f3a2f773dfdf3a97873d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Feb 2023 17:02:34 +0100 Subject: [PATCH 563/802] Fix tests for merge --- tests/test_schedule.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index db401b65..4cd65fe4 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -1,5 +1,5 @@ from copy import deepcopy - +from spice_ev.util import set_options_from_config import pytest import spice_ev.scenario as scenario from tests.helpers import generate_basic_schedule @@ -155,7 +155,7 @@ def test_basic_run(self, trips_file_name="trips.csv"): self.electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) - util.set_options_from_config(args, check=False, verbose=False) + set_options_from_config(args, check=parser, verbose=False) args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True @@ -264,7 +264,7 @@ def test_scenario_with_feed_in(self): electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) - util.set_options_from_config(args, check=False, verbose=False) + set_options_from_config(args, check=parser, verbose=False) args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True scen = generated_schedule.generate_scenario(args) @@ -286,7 +286,7 @@ def test_scenario_with_feed_in(self): electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) - util.set_options_from_config(args, check=False, verbose=False) + set_options_from_config(args, check=parser, verbose=False) # check that 2 user warnings are put put for missing files and an error is thrown with pytest.warns(Warning) as record: From 2fcca64f0abc384ab3356856783d272a5ac9245d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 10:02:51 +0100 Subject: [PATCH 564/802] Remove line --- data/examples/ebus_toolbox.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 9200c884..ba650ffa 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -5,7 +5,6 @@ # Input file containing trip information (required) input_schedule = data/examples/trips_example.csv - # output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) output_directory = data/sim_outputs/ From d269265cdfba0e7e55d3ff2c4d5cb8b60f9fb5ca Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 10:40:06 +0100 Subject: [PATCH 565/802] Add buffer time test --- tests/test_output_files/.gitkeep | Bin 14 -> 0 bytes tests/test_util.py | 110 ++++++++++++++++++++----------- 2 files changed, 72 insertions(+), 38 deletions(-) delete mode 100644 tests/test_output_files/.gitkeep diff --git a/tests/test_output_files/.gitkeep b/tests/test_output_files/.gitkeep deleted file mode 100644 index 879f93e62bd93fa43424606fe0d5d0b64058c439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14 VcmezWuY@6$p@N}=ftP`c0RSrq1KI!p diff --git a/tests/test_util.py b/tests/test_util.py index 054f134d..f7eaccca 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,42 +1,76 @@ +from datetime import datetime import json from ebus_toolbox import util +from tests.test_schedule import TestSchedule -def test_uncomment_json_file(tmp_path): - p = tmp_path / "test.json" - with open(p, 'w+', encoding='utf-8') as f: - # no comment - json.dump({"test1": 1}, f) - f.seek(0) - assert util.uncomment_json_file(f)["test1"] == 1 - - with open(p, 'w+', encoding='utf-8') as f: - # multiline, no comment - f.seek(0) - f.write('{\n"test1.1": 1.1,\n"test1.2": 1.2\n}') - f.seek(0) - assert sum(util.uncomment_json_file(f).values()) == 2.3 - - with open(p, 'w+', encoding='utf-8') as f: - # single char comment in single line - f.write('# this is a comment\n{"test2": 2}\n#and another comment') - f.seek(0) - assert util.uncomment_json_file(f, '#')["test2"] == 2 - - with open(p, 'w+', encoding='utf-8') as f: - # single char comment at end of line - f.write('{"test3": 3} % this is a comment') - f.seek(0) - assert util.uncomment_json_file(f, '%')["test3"] == 3 - - with open(p, 'w+', encoding='utf-8') as f: - # multi-char comment in own line - f.write('// {"test4": "comment"}\n{"test4": 4}') - f.seek(0) - assert util.uncomment_json_file(f, '//')["test4"] == 4 - - with open(p, 'w+', encoding='utf-8') as f: - # multi-char comment at end of line - f.write('{"test5": 5} """ {test5: "comment"} """') - f.seek(0) - assert util.uncomment_json_file(f, '"""')["test5"] == 5 +class TestUtil: + def test_uncomment_json_file(self, tmp_path): + p = tmp_path / "test.json" + with open(p, 'w+', encoding='utf-8') as f: + # no comment + json.dump({"test1": 1}, f) + f.seek(0) + assert util.uncomment_json_file(f)["test1"] == 1 + + with open(p, 'w+', encoding='utf-8') as f: + # multiline, no comment + f.seek(0) + f.write('{\n"test1.1": 1.1,\n"test1.2": 1.2\n}') + f.seek(0) + assert sum(util.uncomment_json_file(f).values()) == 2.3 + + with open(p, 'w+', encoding='utf-8') as f: + # single char comment in single line + f.write('# this is a comment\n{"test2": 2}\n#and another comment') + f.seek(0) + assert util.uncomment_json_file(f, '#')["test2"] == 2 + + with open(p, 'w+', encoding='utf-8') as f: + # single char comment at end of line + f.write('{"test3": 3} % this is a comment') + f.seek(0) + assert util.uncomment_json_file(f, '%')["test3"] == 3 + + with open(p, 'w+', encoding='utf-8') as f: + # multi-char comment in own line + f.write('// {"test4": "comment"}\n{"test4": 4}') + f.seek(0) + assert util.uncomment_json_file(f, '//')["test4"] == 4 + + with open(p, 'w+', encoding='utf-8') as f: + # multi-char comment at end of line + f.write('{"test5": 5} """ {test5: "comment"} """') + f.seek(0) + assert util.uncomment_json_file(f, '"""')["test5"] == 5 + + def test_get_git_revision_hash(self): + git_hash = util.get_git_revision_hash() + assert type(git_hash) == str + + def test_get_buffer_time(self): + schedule, scenario = TestSchedule().test_basic_run() + trip = next(iter(schedule.rotations.values())).trips.pop(0) + util.get_buffer_time(trip) + buffer_time = {"10-22": 2, + "22-6": 3, + "else": 1 + } + + trip.arrival_time = datetime(year=2023, month=1, day=1, hour=10) + assert util.get_buffer_time(trip, default=buffer_time) == 2 + + trip.arrival_time = datetime(year=2023, month=1, day=1, hour=21, minute=59, second=59) + assert util.get_buffer_time(trip, default=buffer_time) == 2 + + trip.arrival_time = datetime(year=2023, month=1, day=1, hour=22) + assert util.get_buffer_time(trip, default=buffer_time) == 3 + + trip.arrival_time = datetime(year=2023, month=1, day=1, hour=22, second=1) + assert util.get_buffer_time(trip, default=buffer_time) == 3 + + trip.arrival_time = datetime(year=2023, month=1, day=2, hour=0, second=1) + assert util.get_buffer_time(trip, default=buffer_time) == 3 + + trip.arrival_time = datetime(year=2023, month=1, day=2, hour=6, second=1) + assert util.get_buffer_time(trip, default=buffer_time) == 1 From aed76a4a13e7cc4b7ec6c61e8662a5dfac3e46ff Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 23 Feb 2023 14:40:32 +0100 Subject: [PATCH 566/802] moved argparse to util, minor fixes - main is now much more tidy - config: removed leading ./ and fixed eta default value - arguments: removed unused SpiceEV parameters iterations, start_date, visual, save_X, margin, strategy and strategy_option - added check that input_schedule and electrified_stations is set --- data/examples/ebus_toolbox.cfg | 12 +-- ebus_toolbox/__main__.py | 137 +-------------------------------- ebus_toolbox/simulate.py | 11 --- ebus_toolbox/util.py | 117 ++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+), 153 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 12d02840..d120a0fb 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -1,13 +1,13 @@ ##### Paths ##### ### Input and output files and paths ### # Input file containing trip information (required) -input_schedule = ./data/examples/trips_example.csv +input_schedule = data/examples/trips_example.csv # Output files are stored here (defaults to: data/sim_outputs) -output_directory = ./data/sim_outputs/ +output_directory = data/sim_outputs/ # Electrified stations (required) electrified_stations = data/examples/electrified_stations.json # Vehicle types (defaults to: ./data/examples/vehicle_types.json) -vehicle_types = ./data/examples/vehicle_types.json +vehicle_types = data/examples/vehicle_types.json # Path to station data with stations heights # (Optional: needed if mileage in vehicle types not constant and inclination should be considered) station_data_path = data/examples/all_stations.csv @@ -18,7 +18,7 @@ outside_temperature_over_day_path = data/examples/default_temp_winter.csv # (Optional: needed if mileage in vehicle types not constant) level_of_loading_over_day_path = data/examples/default_level_of_loading_over_day.csv # Cost parameters (needed if cost_calculation flag is set to true, see Flag section below) -cost_parameters_file = ./data/examples/cost_params.json +cost_parameters_file = data/examples/cost_params.json ##### Modes ##### ### Specify how you want to simulate the szenario ### @@ -81,5 +81,5 @@ interval = 1 # Time difference between signal time and actual start time of a vehicle event im min. (default: 10) signal_time_dif = 10 # Show estimated time to finish simulation after each step. Not recommended for fast computations -# (default: False) -eta = False +# (default: false) +eta = false diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index c80c9bd7..691a1f1e 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,140 +1,11 @@ -import argparse from datetime import datetime from pathlib import Path import shutil -from spice_ev.util import set_options_from_config from ebus_toolbox import simulate, util if __name__ == '__main__': - parser = argparse.ArgumentParser( - description='eBus-Toolbox - \ - simulation program for electric bus fleets.') - - # #### Paths ##### - parser.add_argument('--input-schedule', nargs='?', - help='Path to CSV file containing all trips of schedule to be analyzed.', - required=True) - parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', - help='Location where all simulation outputs are stored') - parser.add_argument('--electrified-stations', help='include electrified_stations json', - required=True) - parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", - help='location of vehicle type definitions') - parser.add_argument('--station_data_path', default=None, - help='Use station data to back calculation of consumption with height\ - information of stations') - parser.add_argument('--outside_temperature_over_day_path', default=None, - help="Use csv. data with 'hour' and temperature' columns to set \ - temperatures in case they are not in trips.csv") - parser.add_argument('--level_of_loading_over_day_path', default=None, - help="Use csv. data with 'hour' and level_of_loading' columns to set \ - level of loading in case they are not in trips.csv") - parser.add_argument('--cost-parameters-file', default=None, - help='include cost parameters json, needed if cost_calculation==True') - - # #### Modes ##### - mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] - parser.add_argument('--mode', default=['sim', 'report'], nargs='*', choices=mode_choices, - help=f"Specify what you want to do. Choose one or more from \ - {', '.join(mode_choices)}. \ - sim runs a single simulation with the given inputs. \ - neg_depb_to_oppb changes charging type of negative depb rotations. \ - neg_oppb_to_depb changes charging type of negative oppb rotations. \ - service optimization finds the largest set of electrified rotations. \ - report generates simulation output files.") - - # #### Flags ##### - parser.add_argument('--cost-calculation', '-cc', action='store_true', - help='Calculate costs') - parser.add_argument('--check-rotation-consistency', action='store_true', - help='Check rotation assumptions when building schedule.') - parser.add_argument('--ignore-inconsistent-rotations', action='store_true', - help='Remove rotations from schedule that violate assumptions. ') - parser.add_argument('--show-plots', action='store_true', - help='show plots for users to view in "report" mode') - - # #### Physical setup of environment ##### - parser.add_argument('--preferred-charging-type', '-pct', default='depb', - choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ - from {depb, oppb}. opp stands for opportunity.") - parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=100000, - help='max power of grid connector at opp stations') - parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=100000, - help='max power of grid connector at depot stations') - parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=300, - help='max power of charging station at opp stations') - parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=150, - help='max power of charging station at depot stations for depot busses') - parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, - help='max power of charging station at depot stations for opp busses') - parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, - help='set minimum desired SOC (0 - 1) for depot charging') - parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=1.0, - help='set minimum desired SOC (0 - 1) for opportunity charging') - parser.add_argument('--min-recharge-deps-oppb', default=1, - help='Minimum fraction of capacity for recharge when leaving the depot.') - parser.add_argument('--min-recharge-deps-depb', default=1, - help='Minimum fraction of capacity for recharge when leaving the depot.') - parser.add_argument('--min-charging-time', help='define minimum time of charging', - default=0) - parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' - 'at opp station to simulate docking procedure.', default=0) - - # #### SIMULATION PARAMETERS ##### - parser.add_argument('--days', metavar='N', type=int, default=None, - help='set duration of scenario as number of days') - parser.add_argument('--interval', metavar='MIN', type=int, default=1, - help='set number of minutes for each timestep (Δt)') - parser.add_argument('--signal-time-dif', default=10, - help='time difference between signal time and actual ' - 'start time of a vehicle event im min.') - parser.add_argument('--eta', action='store_true', - help='Show estimated time to finish simulation after each step, ' - 'instead of progress bar. Not recommended for fast computations.') - - # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### - parser.add_argument('--seed', default=1, type=int, help='set random seed') - parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') - parser.add_argument('--include-price-csv', - help='include CSV for energy price. \ - You may define custom options with --include-price-csv-option') - parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), - nargs=2, default=[], action='append', - help='append additional argument to price signals') - parser.add_argument('--start-date', default='2018-01-02', - help='Provide start date of simulation in format YYYY-MM-DD.E.g. ' - '2018-01-31') - parser.add_argument('--visual', '-v', action='store_true', - help='Show plots of the results- not applicable', default=False) - parser.add_argument('--save-timeseries', help='Write timesteps to file - not applicable', - default=False) - parser.add_argument('--save-results', help='Write general info to file - not applicable', - default=False) - parser.add_argument('--save-soc', help='Write SOC info to file - not applicable', default=False) - parser.add_argument('--strategy', '-s', default='distributed', - help='Specify the charging strategy for spiceEV\ - - not applicable') - parser.add_argument('--margin', '-m', metavar='X', type=float, default=1, - help=('Add margin for desired SOC [0.0 - 1.0].\ - margin=0.05 means the simulation will not abort if vehicles \ - reach at least 95%% of the desired SOC before leaving. \ - margin=1 -> the simulation continues with every positive SOC value.\ - - not applicable.')) - parser.add_argument('--strategy-option', '-so', metavar=('KEY', 'VALUE'), - nargs=2, action='append', - default=[["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], - ["ALLOW_NEGATIVE_SOC", True], ["RESET_NEGATIVE_SOC", False]], - help='Append additional options to the charging strategy.\ - - not applicable') - parser.add_argument('--config', help='Use config file to set arguments') - - args = parser.parse_args() - # arguments relevant to SpiceEV, setting automatically to reduce clutter in config - args.ALLOW_NEGATIVE_SOC = True - args.attach_vehicle_soc = True - - set_options_from_config(args, check=parser, verbose=False) + args = util.get_args() args.output_directory = Path(args.output_directory) / ( datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") @@ -157,10 +28,4 @@ util.save_version(args.output_directory_input / "program_version.txt") - # rename special options - args.timing = args.eta - - if any([args.save_soc, args.save_results, args.save_timeseries]): - print("save_* options ignored for eBus-Toolbox reports naming") - simulate.simulate(args) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 21e0e155..d6c32355 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -41,17 +41,6 @@ def simulate(args): raise SystemExit(f"Path to cost parameters ({args.cost_parameters_file}) " "does not exist. Exiting...") - # parse strategy options for Spice EV - if args.strategy_option is not None: - for opt_key, opt_val in args.strategy_option: - try: - # option may be number - opt_val = float(opt_val) - except ValueError: - # or not - pass - setattr(args, opt_key, opt_val) - # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption( vehicle_types, diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 7d92e705..70357626 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,7 +1,10 @@ +import argparse import json import warnings import subprocess +from spice_ev.util import set_options_from_config + def get_git_revision_hash() -> str: return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip() @@ -213,3 +216,117 @@ def nd_interp(input_values, lookup_table): points = new_points return points[0][-1] + +def get_args(): + parser = argparse.ArgumentParser( + description='eBus-Toolbox - simulation program for electric bus fleets.') + + # #### Paths ##### + parser.add_argument('--input-schedule', nargs='?', + help='Path to CSV file containing all trips of schedule to be analyzed.') + parser.add_argument('--output-directory', default="data/sim_outputs", nargs='?', + help='Location where all simulation outputs are stored') + parser.add_argument('--electrified-stations', help='include electrified_stations json') + parser.add_argument('--vehicle-types', default="data/examples/vehicle_types.json", + help='location of vehicle type definitions') + parser.add_argument('--station_data_path', default=None, + help='Use station data to back calculation of consumption with height\ + information of stations') + parser.add_argument('--outside_temperature_over_day_path', default=None, + help="Use csv. data with 'hour' and temperature' columns to set \ + temperatures in case they are not in trips.csv") + parser.add_argument('--level_of_loading_over_day_path', default=None, + help="Use csv. data with 'hour' and level_of_loading' columns to set \ + level of loading in case they are not in trips.csv") + parser.add_argument('--cost-parameters-file', default=None, + help='include cost parameters json, needed if cost_calculation==True') + + # #### Modes ##### + mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] + parser.add_argument('--mode', default=['sim', 'report'], nargs='*', choices=mode_choices, + help=f"Specify what you want to do. Choose one or more from \ + {', '.join(mode_choices)}. \ + sim runs a single simulation with the given inputs. \ + neg_depb_to_oppb changes charging type of negative depb rotations. \ + neg_oppb_to_depb changes charging type of negative oppb rotations. \ + service optimization finds the largest set of electrified rotations. \ + report generates simulation output files.") + + # #### Flags ##### + parser.add_argument('--cost-calculation', '-cc', action='store_true', + help='Calculate costs') + parser.add_argument('--check-rotation-consistency', action='store_true', + help='Check rotation assumptions when building schedule.') + parser.add_argument('--ignore-inconsistent-rotations', action='store_true', + help='Remove rotations from schedule that violate assumptions. ') + parser.add_argument('--show-plots', action='store_true', + help='show plots for users to view in "report" mode') + + # #### Physical setup of environment ##### + parser.add_argument('--preferred-charging-type', '-pct', default='depb', + choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ + from {depb, oppb}. opp stands for opportunity.") + parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=100000, + help='max power of grid connector at opp stations') + parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=100000, + help='max power of grid connector at depot stations') + parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=300, + help='max power of charging station at opp stations') + parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=150, + help='max power of charging station at depot stations for depot busses') + parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, + help='max power of charging station at depot stations for opp busses') + parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, + help='set minimum desired SOC (0 - 1) for depot charging') + parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=1.0, + help='set minimum desired SOC (0 - 1) for opportunity charging') + parser.add_argument('--min-recharge-deps-oppb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--min-recharge-deps-depb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--min-charging-time', help='define minimum time of charging', + default=0) + parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' + 'at opp station to simulate docking procedure.', default=0) + + # #### SIMULATION PARAMETERS ##### + parser.add_argument('--days', metavar='N', type=int, default=None, + help='set duration of scenario as number of days') + parser.add_argument('--interval', metavar='MIN', type=int, default=1, + help='set number of minutes for each timestep (Δt)') + parser.add_argument('--signal-time-dif', default=10, + help='time difference between signal time and actual ' + 'start time of a vehicle event im min.') + parser.add_argument('--eta', action='store_true', + help='Show estimated time to finish simulation after each step, ' + 'instead of progress bar. Not recommended for fast computations.') + + # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### + parser.add_argument('--seed', default=1, type=int, help='set random seed') + parser.add_argument('--include-price-csv', + help='include CSV for energy price. \ + You may define custom options with --include-price-csv-option') + parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), + nargs=2, default=[], action='append', + help='append additional argument to price signals') + + parser.add_argument('--config', help='Use config file to set arguments') + + args = parser.parse_args() + + # arguments relevant to SpiceEV, setting automatically to reduce clutter in config + args.strategy = 'distributed' + args.margin = 1 + args.ALLOW_NEGATIVE_SOC = True + args.PRICE_THRESHOLD = -100 # ignore price for charging decisions + + set_options_from_config(args, check=parser, verbose=False) + + # rename special options + args.timing = args.eta + + missing = [a for a in ["input_schedule", "electrified_stations"] if vars(args).get(a) is None] + if missing: + raise SystemExit("The following arguments are required: {}".format(", ".join(missing))) + + return args From 724a6b1e51bc8241ef555eb94b68aa44abf2d43d Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 23 Feb 2023 14:46:00 +0100 Subject: [PATCH 567/802] make flake8 happy --- ebus_toolbox/util.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 70357626..8c5e3c84 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -217,6 +217,7 @@ def nd_interp(input_values, lookup_table): return points[0][-1] + def get_args(): parser = argparse.ArgumentParser( description='eBus-Toolbox - simulation program for electric bus fleets.') From f2e1c86666cb052e36a6c110facf1a7d54694ffc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 17:24:31 +0100 Subject: [PATCH 568/802] Add Consumption tests --- ebus_toolbox/consumption.py | 18 ++++----- tests/test_consumption.py | 73 +++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 tests/test_consumption.py diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 7857abf0..e4b8ff5d 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -55,7 +55,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :return: Consumed energy [kWh] and delta SOC as tuple :rtype: (float, float) - :raises IndexError: if there is missing data for temperature or lol data + :raises KeyError: if there is missing data for temperature or lol data :raises AttributeError: if there is no path to temperature or lol data provided """ @@ -78,12 +78,12 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem print("Neither of these conditions is met:\n" "1. Temperature data is available for every trip through the trips file " "or a temperature over day file.\n" - f"2. A constant mileage for the vehicle " - f"{vehicle_info['mileage']} is provided.") + f"2. A constant mileage for the vehicle: " + f"{vehicle_info['name']} - is provided.") raise AttributeError - except IndexError: + except KeyError: print(f"No temperature data for the hour {time.hour} is provided") - raise IndexError + raise KeyError # if no specific LoL is given, lookup temperature if level_of_loading is None: @@ -93,12 +93,12 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem print("Neither of these conditions is met:\n" "1. Level of loading data is available for every trip through the trips file " "or a level of loading over day file.\n" - f"2. A constant mileage for the vehicle " - f"{vehicle_info['mileage']} is provided.") + f"2. A constant mileage for the vehicle: " + f"{vehicle_info['name']} - is provided.") raise AttributeError - except IndexError: + except KeyError: print(f"No level of loading data for the hour {time.hour} is provided") - raise IndexError + raise KeyError # load consumption csv consumption_path = vehicle_info["mileage"] diff --git a/tests/test_consumption.py b/tests/test_consumption.py new file mode 100644 index 00000000..b0e1c079 --- /dev/null +++ b/tests/test_consumption.py @@ -0,0 +1,73 @@ +import pytest +import pathlib +from tests.test_schedule import TestSchedule +from datetime import datetime + +test_root = pathlib.Path(__file__).parent +file_root = test_root / "test_input_files" + + +class TestConsumption: + consumption_path = file_root / "testing_energy_consumption.csv" + + def test_calculate_consumption(self): + schedule, scenario = TestSchedule().test_basic_run() + trip = next(iter(schedule.rotations.values())).trips.pop(0) + consumption = trip.__class__.consumption + consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, 24)} + time = datetime(year=2023, month=1, day=1, hour=1) + dist = 10 + vehicle = next(iter(consumption.vehicle_types.items())) + vehicle_type = vehicle[0] + charging_type = next(iter(vehicle[1].keys())) + + # check distance scaling + def calc_c(distance): + return consumption.calculate_consumption(time, distance, vehicle_type, charging_type, + temp=10, height_diff=0, level_of_loading=0, + mean_speed=18)[0] + + assert calc_c(dist) * 2 == calc_c(dist * 2) + assert calc_c(dist) / 2 == calc_c(dist / 2) + + vehicle[1][charging_type]["mileage"] = str(self.consumption_path) + # consumption is based on this formula + # def true_cons(lol,incline,speed,t_amb): + # return lol+incline+speed/10+abs(t_amb-20)/10 + + consumption.vehicle_types[vehicle_type][charging_type] = vehicle[1][charging_type] + # check temperature default from temperature timeseries + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=None, height_diff=0, level_of_loading=0, + mean_speed=18)[0] + + # check temperature default from temperature time series error throwing + last_hour = 12 + consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} + time = datetime(year=2023, month=1, day=1, hour=last_hour+2) + with pytest.raises(KeyError): + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=None, height_diff=0, level_of_loading=0, + mean_speed=18)[0] + del consumption.temperatures_by_hour + with pytest.raises(AttributeError): + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=None, height_diff=0, level_of_loading=0, + mean_speed=18)[0] + + # reset temperature_by_hour + consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, 24)} + + # check level_of_loading default from level_of_loading time series error throwing + last_hour = 12 + consumption.lol_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} + time = datetime(year=2023, month=1, day=1, hour=last_hour+2) + with pytest.raises(KeyError): + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=20, height_diff=0, level_of_loading=None, + mean_speed=18)[0] + del consumption.lol_by_hour + with pytest.raises(AttributeError): + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=20, height_diff=0, level_of_loading=None, + mean_speed=18)[0] From 62b1343770988e749adbeaf713c95c5048e20fe2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 17:42:14 +0100 Subject: [PATCH 569/802] Add more functionality testing to consumption testing --- tests/test_consumption.py | 56 +++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index b0e1c079..b4ce6df1 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -8,9 +8,11 @@ class TestConsumption: + """Class to test Consumption functionality""" consumption_path = file_root / "testing_energy_consumption.csv" def test_calculate_consumption(self): + """ Various tests to trigger errors and check if behaviour is as expected""" schedule, scenario = TestSchedule().test_basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) consumption = trip.__class__.consumption @@ -31,12 +33,56 @@ def calc_c(distance): assert calc_c(dist) / 2 == calc_c(dist / 2) vehicle[1][charging_type]["mileage"] = str(self.consumption_path) + # consumption is based on this formula - # def true_cons(lol,incline,speed,t_amb): - # return lol+incline+speed/10+abs(t_amb-20)/10 + def true_cons(lol, incline, speed, t_amb): + return lol + incline + speed / 10 + abs(t_amb - 20) / 10 consumption.vehicle_types[vehicle_type][charging_type] = vehicle[1][charging_type] - # check temperature default from temperature timeseries + + lol = 0.5 + incline = 0 + speed = 15 + t_amb = 20 + distance = 1000 # 1000m =1km, since true_cons give the consumption per 1000 m + + # Check various inputs, which need interpolation + assert true_cons(lol, incline, speed, t_amb) == \ + consumption.calculate_consumption(time, distance, vehicle_type, charging_type, + temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, + mean_speed=speed)[0] + + incline = 0.05 + assert true_cons(lol, incline, speed, t_amb) == \ + consumption.calculate_consumption(time, distance, vehicle_type, charging_type, + temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, + mean_speed=speed)[0] + t_amb = 15 + assert true_cons(lol, incline, speed, t_amb) == \ + consumption.calculate_consumption(time, distance, vehicle_type, charging_type, + temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, + mean_speed=speed)[0] + lol = 0.1 + assert true_cons(lol, incline, speed, t_amb) == \ + consumption.calculate_consumption(time, distance, vehicle_type, charging_type, + temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, + mean_speed=speed)[0] + + # check for out of bounds consumption. Max consumption in the table is 6.6. + t_amb = -99999 + incline = 99999 + lol = 99999 + speed = 99999 + assert consumption.calculate_consumption(time, distance, vehicle_type, charging_type, + temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, + mean_speed=speed)[0] < 6.7 + + # check temperature default from temperature timeseries when temp is None consumption.calculate_consumption(time, dist, vehicle_type, charging_type, temp=None, height_diff=0, level_of_loading=0, mean_speed=18)[0] @@ -44,7 +90,7 @@ def calc_c(distance): # check temperature default from temperature time series error throwing last_hour = 12 consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} - time = datetime(year=2023, month=1, day=1, hour=last_hour+2) + time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): consumption.calculate_consumption(time, dist, vehicle_type, charging_type, temp=None, height_diff=0, level_of_loading=0, @@ -61,7 +107,7 @@ def calc_c(distance): # check level_of_loading default from level_of_loading time series error throwing last_hour = 12 consumption.lol_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} - time = datetime(year=2023, month=1, day=1, hour=last_hour+2) + time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): consumption.calculate_consumption(time, dist, vehicle_type, charging_type, temp=20, height_diff=0, level_of_loading=None, From f273c6582cad300ec3cd546f2c2316aff0dc9e1f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 17:45:04 +0100 Subject: [PATCH 570/802] Add consumption table for testing --- .../testing_energy_consumption.csv | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 tests/test_input_files/testing_energy_consumption.csv diff --git a/tests/test_input_files/testing_energy_consumption.csv b/tests/test_input_files/testing_energy_consumption.csv new file mode 100644 index 00000000..16df757b --- /dev/null +++ b/tests/test_input_files/testing_energy_consumption.csv @@ -0,0 +1,73 @@ +vehicle_type,level_of_loading,incline,mean_speed_kmh,t_amb,consumption_kwh_per_km +CKB,0,-0.1,10,-15,4.4 +CKB,0.5,-0.1,10,-15,4.9 +CKB,1,-0.1,10,-15,5.4 +CKB,0,0,10,-15,4.5 +CKB,0.5,0,10,-15,5 +CKB,1,0,10,-15,5.5 +CKB,0,0.1,10,-15,4.6 +CKB,0.5,0.1,10,-15,5.1 +CKB,1,0.1,10,-15,5.6 +CKB,0,-0.1,20,-15,5.4 +CKB,0.5,-0.1,20,-15,5.9 +CKB,1,-0.1,20,-15,6.4 +CKB,0,0,20,-15,5.5 +CKB,0.5,0,20,-15,6 +CKB,1,0,20,-15,6.5 +CKB,0,0.1,20,-15,5.6 +CKB,0.5,0.1,20,-15,6.1 +CKB,1,0.1,20,-15,6.6 +CKB,0,-0.1,10,0,2.9 +CKB,0.5,-0.1,10,0,3.4 +CKB,1,-0.1,10,0,3.9 +CKB,0,0,10,0,3 +CKB,0.5,0,10,0,3.5 +CKB,1,0,10,0,4 +CKB,0,0.1,10,0,3.1 +CKB,0.5,0.1,10,0,3.6 +CKB,1,0.1,10,0,4.1 +CKB,0,-0.1,20,0,3.9 +CKB,0.5,-0.1,20,0,4.4 +CKB,1,-0.1,20,0,4.9 +CKB,0,0,20,0,4 +CKB,0.5,0,20,0,4.5 +CKB,1,0,20,0,5 +CKB,0,0.1,20,0,4.1 +CKB,0.5,0.1,20,0,4.6 +CKB,1,0.1,20,0,5.1 +CKB,0,-0.1,10,20,0.9 +CKB,0.5,-0.1,10,20,1.4 +CKB,1,-0.1,10,20,1.9 +CKB,0,0,10,20,1 +CKB,0.5,0,10,20,1.5 +CKB,1,0,10,20,2 +CKB,0,0.1,10,20,1.1 +CKB,0.5,0.1,10,20,1.6 +CKB,1,0.1,10,20,2.1 +CKB,0,-0.1,20,20,1.9 +CKB,0.5,-0.1,20,20,2.4 +CKB,1,-0.1,20,20,2.9 +CKB,0,0,20,20,2 +CKB,0.5,0,20,20,2.5 +CKB,1,0,20,20,3 +CKB,0,0.1,20,20,2.1 +CKB,0.5,0.1,20,20,2.6 +CKB,1,0.1,20,20,3.1 +CKB,0,-0.1,10,30,2 +CKB,0.5,-0.1,10,30,2.5 +CKB,1,-0.1,10,30,3 +CKB,0,0,10,30,2 +CKB,0.5,0,10,30,2.5 +CKB,1,0,10,30,3 +CKB,0,0.1,10,30,2 +CKB,0.5,0.1,10,30,2.5 +CKB,1,0.1,10,30,3 +CKB,0,-0.1,20,30,3 +CKB,0.5,-0.1,20,30,3.5 +CKB,1,-0.1,20,30,4 +CKB,0,0,20,30,3 +CKB,0.5,0,20,30,3.5 +CKB,1,0,20,30,4 +CKB,0,0.1,20,30,3 +CKB,0.5,0.1,20,30,3.5 +CKB,1,0.1,20,30,4 From 2a3e7d9568870faf1c5915becfe57f937b0429ba Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 17:52:50 +0100 Subject: [PATCH 571/802] Make use of tmp_path fixture of pytest --- tests/test_schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index b1703b0f..47720f01 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -70,7 +70,7 @@ def test_station_data_reading(self): **mandatory_args, station_data_path=path_to_all_station_data) assert len(record) == 2 - def test_rotation_consistency(self): + def test_rotation_consistency(self, tmp_path): """ Test if the consistency check for rotations finds missing einsetz or ausetzfahrten, if it finds gaps between arrival and departure stations of successive trips and last it checks if the arguments for check_rotation_consistency and ignore_inconsistent_rotations @@ -80,7 +80,7 @@ def test_rotation_consistency(self): trip.Trip.consumption = consumption.Consumption(self.vehicle_types, outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) - output_dir = test_root / "test_output_files" + output_dir = tmp_path rotation_consistency_dict = dict(check_rotation_consistency=True, ignore_inconsistent_rotations=True, output_directory=output_dir) From 1959ecebdd4e78d790de72eb174d134c84318d9f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 17:55:34 +0100 Subject: [PATCH 572/802] Make flake8 happy --- tests/test_schedule.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 47720f01..ae940f0f 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -75,7 +75,9 @@ def test_rotation_consistency(self, tmp_path): if it finds gaps between arrival and departure stations of successive trips and last it checks if the arguments for check_rotation_consistency and ignore_inconsistent_rotations were set correctly, i.e. if ignore_inconsistent_rotations is True, - check_rotation_consistency has to be true as well. If not a warning has to be thrown""" + check_rotation_consistency has to be true as well. If not a warning has to be thrown + :param tmp_path: pytest fixture to a path that is dynamically created + """ trip.Trip.consumption = consumption.Consumption(self.vehicle_types, outside_temperatures=self.temperature_path, From 3a933eff14785e40b154d4ffbee20304c08c4c2c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 10:05:41 +0100 Subject: [PATCH 573/802] Make use of pytest.raises --- tests/test_schedule.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 73580912..12ad8ccc 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -34,16 +34,11 @@ class TestSchedule: def test_mandatory_options_exit(self): """ Check if the schedule creation properly throws a SystemExit error in case of missing mandatory options""" - try: + + # check if System exit is properly thrown when mandatory options are not given + with pytest.raises(SystemExit): # schedule creation without mandatory args schedule.Schedule(self.vehicle_types, self.electrified_stations) - except SystemExit: - # exception was properly thrown - pass - else: - # create assertion error since schedule creation did no - assert 0, "Schedule initialization did not get mandatory options but did" \ - "not throw an exception" def test_station_data_reading(self): """ Test if the reading of the geo station data works and outputs warnings in From 68ab02bcd12573012e3c7a3883b50ca147cce45f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 10:07:12 +0100 Subject: [PATCH 574/802] Add placeholder for function return --- tests/test_consumption.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index b4ce6df1..e777f68c 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -83,23 +83,23 @@ def true_cons(lol, incline, speed, t_amb): mean_speed=speed)[0] < 6.7 # check temperature default from temperature timeseries when temp is None - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=None, height_diff=0, level_of_loading=0, - mean_speed=18)[0] + _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=None, height_diff=0, level_of_loading=0, + mean_speed=18)[0] # check temperature default from temperature time series error throwing last_hour = 12 consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=None, height_diff=0, level_of_loading=0, - mean_speed=18)[0] + _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=None, height_diff=0, level_of_loading=0, + mean_speed=18)[0] del consumption.temperatures_by_hour with pytest.raises(AttributeError): - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=None, height_diff=0, level_of_loading=0, - mean_speed=18)[0] + _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=None, height_diff=0, level_of_loading=0, + mean_speed=18)[0] # reset temperature_by_hour consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, 24)} @@ -109,11 +109,11 @@ def true_cons(lol, incline, speed, t_amb): consumption.lol_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=20, height_diff=0, level_of_loading=None, - mean_speed=18)[0] + _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=20, height_diff=0, level_of_loading=None, + mean_speed=18)[0] del consumption.lol_by_hour with pytest.raises(AttributeError): - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=20, height_diff=0, level_of_loading=None, - mean_speed=18)[0] + _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + temp=20, height_diff=0, level_of_loading=None, + mean_speed=18)[0] From dc7bdcfbfe072821c1782db9769378f7eabe3c26 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 10:45:53 +0100 Subject: [PATCH 575/802] Extend modes --- docs/source/modes.rst | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index c6563bbd..86a50882 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -11,12 +11,24 @@ different modes support the user in finding optimal solutions for their eBus-Sys * simple simulation * negative depot to opportunity charger * negative opportunity to depot charger +* service optimization * station optimization +* report +While the default mode is the simple simulation modes can be chained together to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: +:: + mode = ["sim", "report"] -Single simulation +This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. An extended simple use case would be + mode = ["sim", "report" ,"neg_depb_to_oppb", "report] + + + + +simple simulation ----------------- -The single simulation case is the default mode. Its usage is explained in :ref:`Getting Started` +The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started`. The simulation takes the scenario as is. No parameters will be adjusted, optimized or changed in any way. The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data + negative depot to opportunity charger ------------------------------------- From 510389a884aa4c1022da9d82e20b86d20799f639 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 11:45:35 +0100 Subject: [PATCH 576/802] Extend modes --- docs/source/modes.rst | 47 ++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 86a50882..71487357 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -15,34 +15,43 @@ different modes support the user in finding optimal solutions for their eBus-Sys * station optimization * report -While the default mode is the simple simulation modes can be chained together to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: +chained modes +------------- +While the default mode of the ebus-toolbox is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: :: mode = ["sim", "report"] -This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. An extended simple use case would be +This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. Their output describes the simulation outcome of this mutated schedule. An extended simple use case would be +:: mode = ["sim", "report" ,"neg_depb_to_oppb", "report] - - +Where the scenario is run as is, a report is generated, the schedule is changed and simulated again and a second report is generated. The description what the modes do +can be found below. simple simulation ----------------- -The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started`. The simulation takes the scenario as is. No parameters will be adjusted, optimized or changed in any way. The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data +The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started`. Every chain of modes starts with a simple simulation, even if it is not explicitly called. The simulation takes the scenario as is. No parameters will be adjusted, optimized or changed in any way. The charging type for each rotation is read from the trips.csv if this data is included. If not the *preferred_charging_type* from the config file is used, as long as the provided vehicles data provides the preferred_charging_type for the specified vehicle type. negative depot to opportunity charger ------------------------------------- -| This mode is the first kind of optimization provided by the eBus-Toolbox. It takes a scenario and uses the provided depot charger vehicle data to check if the scenario can run with only depot charger vehicles without socs falling below 0. Vehicles with a soc below 0 are changed to opportunity chargers with the provided opportunity charger vehicle data and the simulation is run again. -| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type exists. -| TBC + +This mode is the first kind of optimization provided by the eBus-Toolbox and is called by +:: + mode = ["neg_depb_to_oppb"] +It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to depot chargers. +| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. negative opportunity to depot charger ------------------------------------- -| This mode is the similar to the previous optimization. It takes a scenario and uses the provided opportunity charger vehicle data to check if the scenario can run with only opportunity charger vehicles without socs falling below 0. Vehicles with a soc below 0 are changed to opportunity chargers with the provided depot charger vehicle data and the simulation is run again. -| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type exists. -| TBC +|This mode is analogous to *neg_depb_to_oppb* +This mode is the second kind of optimization provided by the eBus-Toolbox and is called by +:: + mode = ["neg_oppb_to_depb"] +It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to opportunity chargers. +| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as opportunity charger exists in the provided vehicles_data.json. service optimization @@ -67,6 +76,20 @@ station optimization Caption +report +----------------- +The The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. + + chained modes ------------- -Lorem ipsum ... \ No newline at end of file +While the default mode of the ebus-toolbox is the simple simulation, modes can be chained together to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: +:: + mode = ["sim", "report"] + +This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. An extended simple use case would be +:: + mode = ["sim", "report" ,"neg_depb_to_oppb", "report] + +Where the scenario is run as is, a report is generated, the schedule is changed and simulated again and a second report is generated. The description what the modes do +can be found below. \ No newline at end of file From 7730df8ddf88f8f1a33fd248f22fd7e7eb82473d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 11:54:53 +0100 Subject: [PATCH 577/802] Remove changes to test folder, including tests to station optimization. Tests will come from the prepared test branch --- .../electrified_stations.json | 3 +- tests/test_input_files/trips.csv | 4 +- tests/test_nd_interpolate.py | 2 +- tests/test_schedule.py | 316 +----------------- tests/test_station_optimization.py | 74 ---- 5 files changed, 15 insertions(+), 384 deletions(-) delete mode 100644 tests/test_station_optimization.py diff --git a/tests/test_input_files/electrified_stations.json b/tests/test_input_files/electrified_stations.json index 7a2bfd43..11e21383 100644 --- a/tests/test_input_files/electrified_stations.json +++ b/tests/test_input_files/electrified_stations.json @@ -1,7 +1,6 @@ { "Station-0": { "type": "deps", - "n_charging_stations": null, - "voltage_level" : "MV" + "n_charging_stations": null } } \ No newline at end of file diff --git a/tests/test_input_files/trips.csv b/tests/test_input_files/trips.csv index 0f0a1a48..c22bf992 100644 --- a/tests/test_input_files/trips.csv +++ b/tests/test_input_files/trips.csv @@ -1,6 +1,6 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB -Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file +LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 3528909e..3da52ad5 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -109,7 +109,7 @@ def test_out_of_bounds(self): point = get_outer_point(data_table, dims_out_of_bound=out_of_bounds_dim) for dim, v in enumerate(point): - if lower_bounds[dim] <= v <= upper_bounds[dim]: + if lower_bounds[dim] < v < upper_bounds[dim]: # if the value is inside of the boundaries, no stuffing at the borders has # to take place. Therefore this dimension can be skipped continue diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 4cd65fe4..f5b5e453 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -1,308 +1,14 @@ -from copy import deepcopy -from spice_ev.util import set_options_from_config -import pytest -import spice_ev.scenario as scenario +""" +run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` +pytest will look for all files starting with "test_" and run all functions +within this file. For basic example of tests you can look at our workshop +https://github.com/rl-institut/workshop/tree/master/test-driven-development. +Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html +are also good support. +""" from tests.helpers import generate_basic_schedule -import json -import pathlib -from ebus_toolbox import schedule, trip, consumption, util -test_root = pathlib.Path(__file__).parent -file_root = test_root / "test_input_files" -mandatory_args = { - "min_recharge_deps_oppb": 0, - "min_recharge_deps_depb": 0, - "gc_power_opps": 1000, - "gc_power_deps": 1000, - "cs_power_opps": 100, - "cs_power_deps_depb": 50, - "cs_power_deps_oppb": 150 -} - - -class TestSchedule: - temperature_path = file_root / 'default_temp_winter.csv' - lol_path = file_root / 'default_level_of_loading_over_day.csv' - - with open(file_root / "electrified_stations.json", "r", encoding='utf-8') as file: - electrified_stations = json.load(file) - - with open(file_root / "vehicle_types.json", "r", encoding='utf-8') as file: - vehicle_types = json.load(file) - - def test_mandatory_options_exit(self): - """ Check if the schedule creation properly throws a SystemExit error in case of missing - mandatory options""" - try: - # schedule creation without mandatory args - schedule.Schedule(self.vehicle_types, self.electrified_stations) - except SystemExit: - # exception was properly thrown - pass - else: - # create assertion error since schedule creation did no - assert 0, "Schedule initialization did not get mandatory options but did" \ - "not throw an exception" - - def test_station_data_reading(self): - """ Test if the reading of the geo station data works and outputs warnings in - case the data was problematic, e.g. not numeric or not existent""" - path_to_trips = file_root / "trips.csv" - - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - - path_to_all_station_data = file_root / "all_stations_example.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) - assert generated_schedule.station_data is not None - - # check if reading a non valid station.csv throws warnings - with pytest.warns(Warning) as record: - path_to_all_station_data = file_root / "not_existent_file" - schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, - **mandatory_args, station_data_path=path_to_all_station_data) - assert len(record) == 1 - - path_to_all_station_data = file_root / "not_numeric_stations.csv" - schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, - **mandatory_args, station_data_path=path_to_all_station_data) - assert len(record) == 2 - - def test_rotation_consistency(self): - """ Test if the consistency check for rotations finds missing einsetz or ausetzfahrten, - if it finds gaps between arrival and departure stations of successive trips and last - it checks if the arguments for check_rotation_consistency and ignore_inconsistent_rotations - were set correctly, i.e. if ignore_inconsistent_rotations is True, - check_rotation_consistency has to be true as well. If not a warning has to be thrown""" - - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - output_dir = test_root / "test_output_files" - rotation_consistency_dict = dict(check_rotation_consistency=True, - ignore_inconsistent_rotations=True, - output_directory=output_dir) - - # check if consistency check does not remove rotations of a "good" trips.csv - path_to_trips = file_root / "trips.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args) - - generated_schedule2 = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, - **mandatory_args, - **rotation_consistency_dict) - - assert len(generated_schedule.rotations) == len(generated_schedule2.rotations) - - # check if consistency check does removes bad rotation of a "bad" trips.csv - path_to_trips = file_root / "trips_no_einsetz.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - **rotation_consistency_dict) - assert len(generated_schedule.rotations) == 0 - - # check if consistency check does removes bad rotation of a "bad" trips.csv - path_to_trips = file_root / "trips_no_aussetz.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - **rotation_consistency_dict) - assert len(generated_schedule.rotations) == 0 - - # check if consistency check does removes bad rotation of a "bad" trips.csv. - # in this case a skipping of stations between trips - path_to_trips = file_root / "inconsistent_stations_trips.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - **rotation_consistency_dict) - assert len(generated_schedule.rotations) == 0 - - # check if consistency throws warning for bad arguments - with pytest.warns(Warning) as record: - path_to_trips = file_root / "inconsistent_stations_trips.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, - **mandatory_args, - check_rotation_consistency=False, - ignore_inconsistent_rotations=True, - output_directory=output_dir) - assert len(record) == 1 - - def test_basic_run(self, trips_file_name="trips.csv"): - """ Check if running a basic example works and if a scenario object is returned - :param trips_file_name: file name of the trips file. Has to be inside the test_input_file - folder - :type trips_file_name: str - :return: schedule, scenario""" - - path_to_trips = file_root / trips_file_name - parser = util.create_ArgumentParser_with_arguments() - args = parser.parse_args(args="") - args.config = file_root / "ebus_toolbox.cfg" - args.days = None - args.seed = 5 - - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - - path_to_all_station_data = file_root / "all_stations_example.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) - - set_options_from_config(args, check=parser, verbose=False) - args.ALLOW_NEGATIVE_SOC = True - args.attach_vehicle_soc = True - - scen = generated_schedule.run(args) - assert type(scen) == scenario.Scenario - print(self.electrified_stations) - print("############### NEGATIVE ROTATIONS", generated_schedule.get_negative_rotations(scen)) - return generated_schedule, scen, args - - def test_assign_vehicles(self): - """ Test if assigning vehicles works as intended. - - Use a trips csv with two rotations ("1","2") a day apart. Ebus toolbox should assign - the same vehicle to both of them. rotation "3", starts shortly after "2" and should be - a new vehicle.""" - - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - - path_to_trips = file_root / "trips_assign_vehicles.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args) - generated_schedule.assign_vehicles() - - assert generated_schedule.rotations["1"].vehicle_id == \ - generated_schedule.rotations["2"].vehicle_id - assert generated_schedule.rotations["1"].vehicle_id != \ - generated_schedule.rotations["3"].vehicle_id - - def test_calculate_consumption(self): - """ Test if calling the consumption calculation works - """ - # deepcopy so other vehicle consumptions are not changed - vehicle_types = deepcopy(self.vehicle_types) - trip.Trip.consumption = consumption.Consumption(vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - - path_to_trips = file_root / "trips_assign_vehicles.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, vehicle_types, - self.electrified_stations, **mandatory_args) - # set mileage constant - mileage = 10 - for v_typ in generated_schedule.vehicle_types.values(): - for charge_typ in v_typ.values(): - charge_typ['mileage'] = mileage - calc_consumption = generated_schedule.calculate_consumption() - # set mileage to half of the prev constant - for v_typ in generated_schedule.vehicle_types.values(): - for charge_typ in v_typ.values(): - charge_typ['mileage'] = mileage / 2 - assert calc_consumption == generated_schedule.calculate_consumption() * 2 - - def test_get_common_stations(self): - """ Test if getting common_stations works. Rotation 1 is on the first day, rotation 2 and 3 - on the second day. rotation 1 should not share any stations with other rotations and - 2 and 3 are basically simulati - """ - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - - path_to_trips = file_root / "trips_assign_vehicles.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args) - - common_stations = generated_schedule.get_common_stations(only_opps=False) - assert len(common_stations["1"]) == 0 - assert len(common_stations["2"]) == 1 - assert len(common_stations["3"]) == 1 - assert '3' in (common_stations["2"]) - assert '2' in (common_stations["3"]) - - def test_get_negative_rotations(self): - """Check if the single rotation '1' with a negative soc is found """ - - # make use of the test_run() which has to return schedule and scenario object - sched, scen, _ = self.test_basic_run() - - neg_rots = sched.get_negative_rotations(scen) - assert '1' in neg_rots - - def test_scenario_with_feed_in(self): - """ Check if running a example with an extended electrified stations file - with feed in, external load and battery works and if a scenario object is returned""" - - path_to_trips = file_root / "trips.csv" - parser = util.create_ArgumentParser_with_arguments() - args = parser.parse_args(args="") - args.config = file_root / "ebus_toolbox.cfg" - electrified_stations_path = file_root / "electrified_stations_with_feeds.json" - args.electrified_stations = electrified_stations_path - with open(electrified_stations_path, "r", encoding='utf-8') as file: - electrified_stations = util.uncomment_json_file(file) - - args.days = None - args.seed = 5 - - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - - path_to_all_station_data = file_root / "all_stations_example.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) - - set_options_from_config(args, check=parser, verbose=False) - args.ALLOW_NEGATIVE_SOC = True - args.attach_vehicle_soc = True - scen = generated_schedule.generate_scenario(args) - assert "Station-0" in scen.components.photovoltaics - assert "Station-3" in scen.components.photovoltaics - assert "Station-0" in scen.components.batteries - assert scen.components.batteries["Station-0"].capacity == 300 - assert scen.components.batteries["Station-0"].efficiency == 0.95 - assert scen.components.batteries["Station-0"].min_charging_power == 0 - scen = generated_schedule.run(args) - assert type(scen) == scenario.Scenario - - with open(electrified_stations_path, "r", encoding='utf-8') as file: - electrified_stations = util.uncomment_json_file(file) - - electrified_stations["Station-0"]["energy_feed_in"]["csv_file"] = file_root / "not_a_file" - electrified_stations["Station-0"]["external_load"]["csv_file"] = file_root / "not_a_file" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) - - set_options_from_config(args, check=parser, verbose=False) - - # check that 2 user warnings are put put for missing files and an error is thrown - with pytest.warns(Warning) as record: - try: - scen = generated_schedule.generate_scenario(args) - except FileNotFoundError: - user_warning_count = sum([1 for warning in record.list - if warning.category == UserWarning]) - assert user_warning_count == 2 - else: - assert 0, "No error despite wrong file paths" - - def test_set_charging_type(self): - pass - - def test_schedule_from_csv(self): - generated_schedule = generate_basic_schedule() - assert len(generated_schedule.rotations) == 1 - assert type(generated_schedule) == schedule.Schedule +def test_schedule_from_csv(): + schedule = generate_basic_schedule() + assert len(schedule.rotations) == 1 diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py deleted file mode 100644 index bc551806..00000000 --- a/tests/test_station_optimization.py +++ /dev/null @@ -1,74 +0,0 @@ -import ebus_toolbox.optimizer_util as util - -from ebus_toolbox.station_optimization import run_optimization -import tests.test_schedule -import pathlib - -test_root = pathlib.Path(__file__).parent -file_root = test_root / "test_input_files" - - -class TestStationOptimization: - - def test_basic_optimization(self): - """ Test the base optimization simply by checking of optimization finishes without - raising errors""" - trips_file_name = "trips_for_optimizer.csv" - schedule_test = tests.test_schedule.TestSchedule() - sched, scen, args = schedule_test.test_basic_run(trips_file_name) - config_path = file_root / "optimizer.cfg" - conf = util.read_config(config_path) - opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - conf.solver = "spiceev" - opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - - def test_deep_optimization(self): - """ Check if deep analysis finds the prepared optimal solution for the test case. - The Test case is a a 3 star like network with two rotations which are negative without - electrification. - Rotation 1: - Depot --> Station-1 ---> Station-2 -->Station-1-->Depot - Rotation 2: - Depot --> Station-1 ---> Station-3 -->Station-1-->Depot - - Greedy optimization will electrify Station-1 first since its helpful for both rotations. - Since electrifiying Station-1 is not enough to electrify either rotations, greedy - optimization will electrify Station-2 and Station-3 as well. Deep Analysis will expand - the checked nodes --> It should find that electrifiying Station-2 and Station-3 is enough - - """ - trips_file_name = "trips_for_optimizer_deep.csv" - schedule_test = tests.test_schedule.TestSchedule() - sched, scen, args = schedule_test.test_basic_run(trips_file_name=trips_file_name) - args.input_schedule = file_root / trips_file_name - config_path = file_root / "optimizer.cfg" - conf = util.read_config(config_path) - - solvers = ["quick", "spiceev"] - node_choices = ["step-by-step", "brute"] - conf.opt_type = "deep" - for solver in solvers: - for node_choice in node_choices: - conf.solver = solver - conf.node_choice = node_choice - opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - assert "Station-1" not in opt_sched.stations - assert "Station-2" in opt_sched.stations - assert "Station-3" in opt_sched.stations - - def test_must_stations_optimization(self, caplog): - """ Test if station 2 and 3 are correctly recognized as must stations - :param caplog: pytest fixture, which is automatically created - """ - trips_file_name = "trips_for_optimizer_deep.csv" - schedule_test = tests.test_schedule.TestSchedule() - sched, scen, args = schedule_test.test_basic_run(trips_file_name=trips_file_name) - args.input_schedule = file_root / trips_file_name - config_path = file_root / "optimizer.cfg" - conf = util.read_config(config_path) - conf.check_for_must_stations = True - conf.solver = "quick" - conf.node_choice = "step-by-step" - opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, this_args=args) - assert ("must stations {'Station-3', 'Station-2'}" in caplog.text or - "must stations {'Station-2', 'Station-3'}" in caplog.text) From d272c612af804154fc7dd89db55595d8f9d2b1cc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 11:57:10 +0100 Subject: [PATCH 578/802] Remove test output folder --- tests/test_output_files/.gitkeep | Bin 14 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/test_output_files/.gitkeep diff --git a/tests/test_output_files/.gitkeep b/tests/test_output_files/.gitkeep deleted file mode 100644 index 879f93e62bd93fa43424606fe0d5d0b64058c439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14 VcmezWuY@6$p@N}=ftP`c0RSrq1KI!p From 206f4f07001a5d5f172f3e0a4c0bcb601ac3f685 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 12:04:45 +0100 Subject: [PATCH 579/802] Remove old optimzier --- data/examples/optimizer.cfg | 71 ------------------------------------- 1 file changed, 71 deletions(-) delete mode 100644 data/examples/optimizer.cfg diff --git a/data/examples/optimizer.cfg b/data/examples/optimizer.cfg deleted file mode 100644 index 8e28504d..00000000 --- a/data/examples/optimizer.cfg +++ /dev/null @@ -1,71 +0,0 @@ -# Configs for the eBus Toolbox Optimizer -[DEFAULT] -debug_level=1 - -[SCENARIO] -# Use "" for ids and not '' -exclusion_rots = [] -exclusion_stations= [] -# If using inclusion stations, scenario should be rebased -inclusion_stations= [] -standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, - "voltage_level": "MV"} - -[PICKLE] -schedule=schedule_rebased_BVG_BFI.pickle -scenario=scenario_rebased_BVG_BFI.pickle -args=args_rebased_BVG_BFI.pickle -# schedule=schedule_buffered_all_oppb.pickle -# scenario=scenario_buffered_all_oppb.pickle -# args=args_buffered_all_oppb.pickle -# schedule=schedule_buffered_depots_utf.pickle -# scenario=scenario_buffered_depots_utf.pickle -# args=args_buffered_utf.pickle - - -[VEHICLE] -charge_eff = 0.95 -# battery_capacity = 400 -# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] -# charging_power = 250 -# min_soc=0.05 - -[OPTIMIZER] -# Not optional path to outputs of optimizer -output_path=data/private_examples/BVG/optimization -save_all_results=True -# "quick" or "spiceev" -solver = quick -rebase_scenario = False -pickle_rebased= False -pickle_rebased_name=bvg_rebase_all_electrified -run_only_neg=False -run_only_oppb = True -pruning_threshold=0 - -# "greedy" or "deep" without "" -opt_type = greedy -# "step-by-step" or "brute" without "" -node_choice=step-by-step -max_brute_loop=300 -estimation_threshold = 0.90 -# Preferring deps leads to a spice_ev simulation with preferred charging type depots -# Afterwards all negative rotations are swapped to opportunity chargers and optimized -# prefer_deps=True - -# Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible -# If they are deemed as impossible, they are not optimized but discarded -remove_impossible_rots=True -check_for_must_stations=False -include_must_stations = True - - - -[SPECIAL] -decision_tree_path = "" -save_decision_tree = False -reduce_rots = False -# Use "" for ids and not '' -# Negative Rots in all deps -rots = ["0310b_3", "0317_3", "0308_3", "0301b_5", "0404b_4", "0301b_2", "0802b_5", "0401b_4", "7401_7", "0702b_3", "0307a_3", "0307a_1", "0404a_3", "0711_3", "0817_2", "6002a_6", "6302_6", "6306b_6", "0302a_1", "0308_2", "0811_4", "0307b_5", "0705_5", "0801a_4", "0711_4", "0303_3", "0705_3", "0402_5", "0304_2", "0304_3", "0801a_1", "0314_4", "0002_1", "7310a_7", "0811_3", "6711_6", "0301a_5", "0301b_1", "0403_4", "0310b_4", "0701a_2", "0303_1", "0311a_3", "0711_1", "0317_1", "0318_5", "0305_2", "0402_4", "0002_4", "0403_5", "0801a_3", "0310a_2", "0803b_2", "0314_5", "0702b_5", "0701a_1", "0401b_5", "0005a_5", "0801b_5", "0310a_4", "0311a_5", "0311a_4", "0404b_1", "0014b_2", "0803b_5", "0306a_4", "0726_5", "0318_1", "0005a_2", "0303_5", "0308_4", "0002_3", "0306a_3", "0307a_4", "0701a_4", "0401a_4", "6403_6", "0404a_2", "6309a_6", "0314_3", "0317_4", "0401a_2", "0705_1", "0310b_1", "0701a_5", "0310a_1", "0404a_1", "0302a_5", "6305a_6", "0817_4", "0312a_1", "0301a_2", "0705_4", "0305_1", "0312a_4", "0702b_2", "0302b_5", "0005a_4", "6001a_6", "0003b_1", "0301b_4", "0310a_3", "6003_6", "0302a_2", "0817_3", "0404b_5", "0403_2", "0317_5", "0817_1", "0401b_3", "0003b_3", "0726_1", "0701a_3", "7005_7", "0311a_2", "0307b_3", "0301b_3", "0314_2", "6310b_6", "0803b_3", "0014b_1", "0401a_3", "0306a_1", "0305_5", "6303a_6", "6401_6", "0303_2", "6301_6", "0005a_3", "0404a_4", "0312a_2", "0302a_4", "7402_7", "0401b_2", "0301a_1", "0402_2", "0014b_3", "0307b_1", "0803b_1", "6002b_6", "0303_4", "6310a_6", "0302a_3", "0318_4", "7811_7", "0306a_2", "0312a_3", "0308_5", "0014b_4", "0310a_5", "0319_1", "0310b_5", "0705_2", "0002_2", "7702b_7", "7711_7", "0811_2", "0403_1", "0319_3", "0317_2", "0726_3", "0404a_5", "0726_4", "0307b_2", "6901_6", "0319_4", "0005b_5", "0305_4", "6702b_6", "7002b_7", "0304_5", "0305_3", "0003b_2", "0401b_1", "0801a_5", "0301a_3", "0402_1", "0005a_1", "0319_5", "6306a_6", "0319_2", "0311a_1", "0401a_5", "0003b_5", "0307a_5", "0307a_2", "0301a_4", "0318_3", "0308_1", "0726_2", "0803b_4", "6001b_6", "0401a_1", "0312a_5", "6703b_6", "0711_2", "0811_1", "0702b_1", "0314_1", "0014b_5", "0310b_2", "0404b_2", "0003b_4", "0307b_4", "0304_1", "0306a_5", "0811_5", "0403_3", "0318_2", "0402_3", "0817_5", "0404b_3", "0702b_4", "0711_5", "7003_7", "0002_5", "0304_4", "0801a_2"] - From dcb71a70f60e491ba4bd57d1074d8f8fd40af485 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 12:07:11 +0100 Subject: [PATCH 580/802] Revert vehicle_types and cfg --- data/examples/ebus_toolbox.cfg | 5 +++-- data/examples/vehicle_types.json | 20 -------------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index ba650ffa..aaac6721 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -44,8 +44,9 @@ seed = 1 # neg_depb_to_oppb changes negative depb-rotations to oppb charging. # neg_oppb_to_depb changes negative oppb-rotations to depb charging. # service_optimization finds the largest set of electrified rotations. +# station_optimization finds the set of fewest stations to electrify all rotations. # report generates simulation output files, including costs. -mode = ["sim","station_optimization", "report"] +mode = ["sim", "report"] #mode = ["sim", "neg_depb_to_oppb", "service_optimization", "report", "station_optimization"] # set length of timestep in minutes (default: 15 minute intervals) @@ -67,7 +68,7 @@ ignore_inconsistent_rotations = false # set minimum allowed state of charge when leaving # distinguish between depot and opportunity station desired_soc_deps = 1.0 -desired_soc_opps = 1 +desired_soc_opps = 0.8 # Preferred charging type. Options: depb, oppb (default: oppb) preferred_charging_type = oppb diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index 52416315..b7491df5 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -34,25 +34,5 @@ "v2g": false, "mileage": "data/examples/energy_consumption_example.csv" } - }, - "BVG-GE": { - "depb": { - "name": "articulated bus", - "capacity": 400, - "charging_curve": [[0, 450], [0.8, 296], [0.9, 210], [1, 20]], - "min_charging_power": 0, - "v2g": false, - "mileage": 3, - "hc": "winter" - }, - "oppb": { - "name": "articulated bus", - "capacity": 400, - "charging_curve": [[0, 450], [0.8, 296], [0.9, 210], [1, 20]], - "min_charging_power": 0, - "v2g": false, - "mileage": 3, - "hc": "winter" - } } } \ No newline at end of file From 499c7377fa57f65f135fba36344f50038cfbc738 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 12:09:09 +0100 Subject: [PATCH 581/802] Add station_optimization description to parser --- ebus_toolbox/__main__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 1d1b630c..fd5bbd05 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -20,6 +20,8 @@ neg_depb_to_oppb changes charging type of negative depb rotations. \ neg_oppb_to_depb changes charging type of negative oppb rotations. \ service optimization finds the largest set of electrified rotations. \ + station_optimization finds the set of fewest stations to electrify \ + all rotations. \ report generates simulation output files.") parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', help='Location where all simulation outputs are stored') From f8818254eb1451722ada3f515d50c3d1044884d0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 12:13:33 +0100 Subject: [PATCH 582/802] Make parser argument more pretty --- ebus_toolbox/__main__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index fd5bbd05..4c1e01f6 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -118,9 +118,10 @@ help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") - parser.add_argument('--optimizer_config', default=None, - help="For station_optimization a optimizer_config is needed. Input" - "a path to an .cfg file or use the default_optimizer.cfg") + parser.add_argument( + '--optimizer_config', default=None, + help="For station_optimization a optimizer_config is needed. Input " + "a path to an .cfg file or use the default_optimizer.cfg") args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config From 1846c27dcc60bf4a708b37414ff55aee8a0488e7 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 14:54:40 +0100 Subject: [PATCH 583/802] First commit to handle review changes --- data/examples/default_optimizer.cfg | 56 +++++++++++++++++++++ ebus_toolbox/optimizer_util.py | 75 +++++++++++++++------------- ebus_toolbox/simulate.py | 16 +++--- ebus_toolbox/station_optimization.py | 27 +++++----- ebus_toolbox/station_optimizer.py | 4 +- 5 files changed, 121 insertions(+), 57 deletions(-) create mode 100644 data/examples/default_optimizer.cfg diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg new file mode 100644 index 00000000..98e55a3a --- /dev/null +++ b/data/examples/default_optimizer.cfg @@ -0,0 +1,56 @@ +# Config for the eBus-Toolbox Optimizer +[DEFAULT] +debug_level=1 +console_level=99 + +[SCENARIO] +# Use "" for ids and not '' +exclusion_rots = [] +exclusion_stations= [] +# If using inclusion stations, scenario should be rebased +inclusion_stations= [] +standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, + "voltage_level": "MV"} + + +[VEHICLE] +charge_eff = 0.95 +# battery_capacity = 400 +# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] +# charging_power = 250 +# min_soc=0.05 + +[OPTIMIZER] +save_all_results=True +# "quick" or "spiceev" +solver = quick +rebase_scenario = False +pickle_rebased= False +pickle_rebased_name="" +run_only_neg=False +run_only_oppb = True +pruning_threshold=0 + +# "greedy" or "deep" without "" +opt_type = greedy +# "step-by-step" or "brute" without "" +node_choice=step-by-step +max_brute_loop=300 +estimation_threshold = 0.90 + + +# Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible +# If they are deemed as impossible, they are not optimized but discarded +remove_impossible_rotations = True +check_for_must_stations = False +include_must_stations = True + + +[SPECIAL] +decision_tree_path = "" +save_decision_tree = False +# Do you want to reduce the rotations to a smaller subset? +reduce_rotations = False +# Only use these rotations for optimization +rotations = [] + diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 87c4f0c5..1f50a1b2 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -2,7 +2,7 @@ LowSocEvents, like evaluating them, gathering them and so on""" import math import os -import pathlib +from pathlib import Path import pickle import sys import typing @@ -84,7 +84,7 @@ def __init__(self): self.pickle_rebased = None self.pickle_rebased_name = None self.opt_type = None - self.remove_impossible_rots = None + self.remove_impossible_rotations = None self.node_choice = None self.max_brute_loop = None self.run_only_neg = None @@ -94,8 +94,8 @@ def __init__(self): self.decision_tree_path = None self.save_decision_tree = None self.optimizer_output_dir = None - self.reduce_rots = None - self.rots = None + self.reduce_rotations = None + self.rotations = None self.path = None self.pruning_threshold = None self.save_all_results = None @@ -140,7 +140,7 @@ def read_config(config_path): config_parser = configparser.ConfigParser() config_parser.sections() - assert pathlib.Path(config_path).is_file(), f"Path to optimizer_config: {config_path} " \ + assert Path(config_path).is_file(), f"Path to optimizer_config: {config_path} " \ f"does not lead to file" config_parser.read(config_path, encoding="utf-8") conf = OptimizerConfig() @@ -154,8 +154,8 @@ def read_config(config_path): section_dict[section] = config_parser["DEFAULT"] default = section_dict["DEFAULT"] - conf.debug_level = int(default.get("debug_level", "0")) - conf.console_level = int(default.get("console_level", "99")) + conf.debug_level = default.getint("debug_level", 0) + conf.console_level = default.getint("console_level", 99) sce = config_parser["SCENARIO"] conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) @@ -168,34 +168,33 @@ def read_config(config_path): conf.args = pick.get("args", "") vehicle = section_dict["VEHICLE"] - conf.charge_eff = float(vehicle.get("charge_eff", "0.95")) - conf.battery_capacity = float(vehicle.get("battery_capacity", "0")) + conf.charge_eff = vehicle.getfloat("charge_eff", 0.95) + conf.battery_capacity = vehicle.getfloat("battery_capacity", 0) if conf.battery_capacity == 0: conf.battery_capacity = None conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) if not conf.charging_curve: conf.charging_curve = None - conf.charging_power = float(vehicle.get("charging_power", "0")) + conf.charging_power = vehicle.getfloat("charging_power", 0) if conf.charging_power == 0: conf.charging_power = None - conf.min_soc = float(vehicle.get("min_soc", "0.0")) + conf.min_soc = vehicle.getfloat("min_soc", 0) optimizer = section_dict["OPTIMIZER"] conf.solver = optimizer.get("solver", "spiceev") conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) - conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", - "rebased_" + str( - datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) + conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", "rebased_" + + datetime.now().isoformat(sep='-', timespec='seconds')) conf.opt_type = optimizer.get("opt_type", "greedy") - conf.remove_impossible_rots = optimizer.getboolean("remove_impossible_rots", False) + conf.remove_impossible_rotations = optimizer.getboolean("remove_impossible_rotations", False) conf.node_choice = optimizer.get("node_choice", "step-by-step") - conf.max_brute_loop = int(optimizer.get("max_brute_loop", "20")) + conf.max_brute_loop = optimizer.getint("max_brute_loop", 20) conf.run_only_neg = optimizer.getboolean("run_only_neg", False) conf.run_only_oppb = optimizer.getboolean("run_only_oppb", False) - conf.estimation_threshold = float(optimizer.get("estimation_threshold", "0.8")) + conf.estimation_threshold = optimizer.getfloat("estimation_threshold", 0.8) conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) - conf.pruning_threshold = int(optimizer.get("pruning_threshold", "3")) + conf.pruning_threshold = optimizer.getint("pruning_threshold", 3) conf.save_all_results = optimizer.getboolean("save_all_results", False) special = section_dict["SPECIAL"] @@ -203,19 +202,20 @@ def read_config(config_path): if conf.decision_tree_path in ["", '""', "''"]: conf.decision_tree_path = None conf.save_decision_tree = special.getboolean("save_decision_tree", False) - conf.reduce_rots = special.getboolean("reduce_rots", False) - conf.rots = json.loads(special.get("rots", [])) + conf.reduce_rotations = special.getboolean("reduce_rotations", False) + conf.rotations = json.loads(special.get("rotations", [])) return conf def get_charging_time(trip1, trip2, args): - """ Returns the charging time between trips as numeric value + """ Returns the charging time in minutes between trips as numeric value/float :param trip1: First trip :param trip2: Following trip :param args: arguments Namespace with default buffer time :return: maximum possible charging time in minutes between trips + :rtype: float """ standing_time_min = (trip2.departure_time - trip1.arrival_time) / timedelta(minutes=1) buffer_time = (get_buffer_time(trip1, args.default_buffer_time_opps) / timedelta(minutes=1)) @@ -227,7 +227,8 @@ def get_charging_time(trip1, trip2, args): def get_charging_start(trip1, args): - """ Returns the possible start of charging consindering buffer times + """ Returns the possible start time of charging considering buffer times before charging + can take place :param trip1: First trip :param args: arguments Namespace with default buffer time @@ -248,18 +249,19 @@ def get_buffer_time(trip, default_buffer_time_opps): def get_index_by_time(scenario, search_time): """ Get the index for a given time + + In case the time does not coincide with a simulation index the lower index is returned. + :param scenario: scenario object :param search_time: search time as datetime object :return: index as int """ - start_time = scenario.start_time - delta_time = timedelta(minutes=60 / scenario.stepsPerHour) - idx = (search_time - start_time) // delta_time + idx = (search_time - scenario.start_time) // scenario.interval return idx def get_rotation_soc_util(rot_id, this_sched, this_scen, soc_data: dict = None): - """Gets you the soc object with start and end index for a given rotation id + """Returns the soc time series with start and end index for a given rotation id :param rot_id: rotation_id :param this_sched: schedule object contain rotation information :param this_scen: scenario object containing the soc data @@ -275,7 +277,7 @@ def get_rotation_soc_util(rot_id, this_sched, this_scen, soc_data: dict = None): def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: 'StationOptimizer'): - """get expected soc lift for a given start_soc and time_delta. + """Return expected soc lift for a given soc charging time series, start_soc and time_delta. :param soc_over_time_curve: array with socs over time :param soc: start socs @@ -330,19 +332,25 @@ def evaluate(events: typing.Iterable[LowSocEvent], soc_data = kwargs.get("soc_data", optimizer.scenario.vehicle_socs) station_eval = {} + # Note: Lift describes the positive delta in the soc time series through electrification. # cycle through events and determine how much lift can be provided by electrifying a station # the lift is determined by the soc position, standing time, power supply and charging curve for e in events: soc_over_time = optimizer.soc_charge_curve_dict[e.v_type][e.ch_type] for i, trip in enumerate(e.trip): # station is only evaluated if station name is part of event stations - # only these stations showed potential in electrification, e.g enough standing time + # only these stations showed potential in electrification, e.g. enough standing time if trip.arrival_name not in e.stations: continue idx = get_index_by_time(optimizer.scenario, trip.arrival_time, ) soc = soc_data[e.vehicle_id][idx] - # potential is the minimal amount of + # potential is the minimal amount of the following boundaries + # - soc can only be lifted to the upper threshold + # - useful lift is in between the minimal soc of the event and the lower threshold of soc + # - useful lift can only occur in between the current soc and the + # - the highest useful lift is the amount between a "full" and "empty" battery, where + # "full" and "empty" are described by the upper and lower thresholds delta_soc_pot = min(soc_upper_thresh - soc, soc_lower_thresh - e.min_soc, soc - e.min_soc, @@ -364,9 +372,8 @@ def evaluate(events: typing.Iterable[LowSocEvent], station_eval[trip.arrival_name] = delta_e_pot # sort by pot_sum - station_eval = list(dict(sorted(station_eval.items(), key=lambda x: x[1])).items()) - station_eval.reverse() - return station_eval + station_eval_list = sorted(station_eval.items(), key=lambda x: x[1],reverse=True) + return station_eval_list def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None, @@ -623,7 +630,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None): with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) if "pytest" not in sys.modules: - # do not print output from spice ev to reduce clutter. Dont do it in testing + # do not print output from spice ev to reduce clutter. Don't do it in testing # since it produces errors sys.stdout = open(os.devnull, 'w') new_scen.run('distributed', vars(this_args).copy()) @@ -633,7 +640,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None): def preprocess_schedule(this_sched, this_args, electrified_stations=None): - """ Prepare the schedule by calculating consumption, setting elctrified stations and assigning + """ Prepare the schedule by calculating consumption, setting electrified stations and assigning vehicles :param this_sched: schedule containing the rotations diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 4f5aa46c..42f7fce8 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -7,7 +7,7 @@ from ebus_toolbox.costs import calculate_costs from ebus_toolbox import report, optimization, util from ebus_toolbox.station_optimization import run_optimization -from ebus_toolbox.optimizer_util import read_config as read_optimzier_config +from ebus_toolbox.optimizer_util import read_config as read_optimizer_config def simulate(args): @@ -29,7 +29,7 @@ def simulate(args): # load stations file try: - with open(args.electrified_stations, encoding='UTF-8') as f: + with open(args.electrified_stations, encoding='utf-8') as f: stations = util.uncomment_json_file(f) except FileNotFoundError: raise SystemExit(f"Path to electrified stations ({args.electrified_stations}) " @@ -104,14 +104,14 @@ def simulate(args): if neg_rot: print(f'Rotations {", ".join(neg_rot)} remain negative.') elif mode == "station_optimization": - if str(args.optimizer_config) == "" or args.optimizer_config is None: - warnings.warn("Station optimization needs an optimization config file. Since no" - "path was given, station optimization is skipped") - break - conf = read_optimzier_config(args.optimizer_config) + if not args.optimizer_config: + warnings.warn("Station optimization needs an optimization config file." + "Since no path was given, station optimization is skipped") + continue + conf = read_optimizer_config(args.optimizer_config) try: schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, - this_args=args) + args=args) except Exception as err: warnings.warn('During Station optimization an error occurred {0}.' 'Optimization was skipped'.format(err)) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 981bcf3f..68a1ff83 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -1,6 +1,8 @@ -""" Optimizer that evaluates inputs and outputs of every iteration, adapting scenario setup - to optimize for specified metrics. +""" Optimization that tries minimizing the amount of electrified stations to achieve full +electrification. + """ + from datetime import datetime import json from pathlib import Path @@ -48,7 +50,7 @@ def setup_logger(conf): def main(): """ main call""" util.print_time() - config_path = "./data/examples/optimizer.cfg" + config_path = "./data/examples/default_optimizer.cfg" conf = util.read_config(config_path) opt_sched, opt_scen = run_optimization(conf) util.print_time() @@ -66,7 +68,7 @@ def prepare_filesystem(this_args, conf): """ now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") this_args.output_directory = Path(this_args.output_directory) - conf.optimizer_output_dir = Path(this_args.output_directory) / str(now + "_optimizer") + conf.optimizer_output_dir = Path(this_args.output_directory) / (now + "_optimizer") # create sub folder for specific sim results with timestamp. # if folder doesnt exists, create folder. conf.optimizer_output_dir.mkdir(parents=True, exist_ok=True) @@ -77,7 +79,7 @@ def prepare_filesystem(this_args, conf): shutil.copy(copy_file, destination) -def run_optimization(conf, sched=None, scen=None, this_args=None): +def run_optimization(conf, sched=None, scen=None, args=None): """ Optimizes scenario by adding electrified stations sparingly until scenario has no below 0 soc events. @@ -92,21 +94,20 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): :param scen: Simulation scenario containing simulation results including the SoC of all vehicles over time :type scen: spice_ev.Scenario - :param this_args: Simulation arguments for manipulation or generated outputs - :type this_args: object + :param args: Simulation arguments for manipulation or generated outputs + :type args: object :return: (Schedule,Scenario) optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ # load pickle files only in the case they are not given as arguments - if sched is None or scen is None or this_args is None: + if sched is None or scen is None or args is None: # if no schedule was given as argument, make sure no scenario # and args input was given as well. - assert sched == scen == this_args is None - sched, scen, this_args = util.toolbox_from_pickle(conf.schedule, - conf.scenario, conf.args) - args = this_args + assert sched == scen == args is None + sched, scen, args = util.toolbox_from_pickle(conf.schedule, + conf.scenario, conf.args) # prepare Filesystem with folders and paths and copy config prepare_filesystem(args, conf) @@ -147,7 +148,7 @@ def run_optimization(conf, sched=None, scen=None, this_args=None): optimizer.remove_none_socs() # check if rotations cant be operated electric, even with all stations electrified. - if conf.remove_impossible_rots: + if conf.remove_impossible_rotations: neg_rots = optimizer.get_negative_rotations_all_electrified() optimizer.config.exclusion_rots.update(neg_rots) optimizer.schedule.rotations = {r: optimizer.schedule.rotations[r] diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 6bf4cd63..bf1fda18 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -41,8 +41,8 @@ def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, self.not_possible_stations = config.inclusion_stations.union(config.exclusion_stations) # if the config defines special rotations, only use them in the schedule - if config.reduce_rots: - self.schedule.rotations = {rot: sched.rotations[rot] for rot in config.rots} + if config.reduce_rotations: + self.schedule.rotations = {rot: sched.rotations[rot] for rot in config.rotations} def loop(self, **kwargs): """ Loops over every base group with the core of group optimization and handles deep or From 1743b469e93a6a85ab4b83be0cb9f9690e13029d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Feb 2023 15:14:01 +0100 Subject: [PATCH 584/802] Make sure its SpiceEV without spaces and proper capitalization --- ebus_toolbox/optimizer_util.py | 10 +++++----- ebus_toolbox/station_optimization.py | 4 ++-- ebus_toolbox/station_optimizer.py | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 1f50a1b2..4415a208 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -20,7 +20,7 @@ from ebus_toolbox.consumption import Consumption from ebus_toolbox.trip import Trip -from ebus_toolbox.util import get_buffer_time as get_buffer_time_spice_ev +from ebus_toolbox.util import get_buffer_time as get_buffer_time_util class ChargingEvent: @@ -244,7 +244,7 @@ def get_buffer_time(trip, default_buffer_time_opps): :param default_buffer_time_opps: the default buffer time at opps charging stations :return: timedelta object for the buffer time """ - return timedelta(minutes=get_buffer_time_spice_ev(trip, default_buffer_time_opps)) + return timedelta(minutes=get_buffer_time_util(trip, default_buffer_time_opps)) def get_index_by_time(scenario, search_time): @@ -609,14 +609,14 @@ def run_schedule(this_sched, this_args, electrified_stations=None): :param this_args: args namespace object :param electrified_stations: dict of electrified stations. Default value None means no further stations are electrified - :return: schedule and scenario objects after spiceev simulation + :return: schedule and scenario objects after SpiceEV simulation """ this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, electrified_stations=electrified_stations) - # parse strategy options for Spice EV + # parse strategy options for SpiceEV if this_args.strategy_option is not None: for opt_key, opt_val in this_args.strategy_option: try: @@ -630,7 +630,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None): with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) if "pytest" not in sys.modules: - # do not print output from spice ev to reduce clutter. Don't do it in testing + # do not print output from SpiceEV to reduce clutter. Don't do it in testing # since it produces errors sys.stdout = open(os.devnull, 'w') new_scen.run('distributed', vars(this_args).copy()) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 68a1ff83..04f28fdf 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -138,7 +138,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): if conf.rebase_scenario: must_include_set, ele_stations = optimizer.rebase_spice_ev() else: - # no new spice ev calculation will take place but some variables need to be adjusted. + # no new SpiceEV calculation will take place but some variables need to be adjusted. must_include_set, ele_stations = optimizer.rebase_simple() # create charging dicts which contain soc over time, which is numerically calculated @@ -186,7 +186,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): with open(new_ele_stations_path, "w", encoding="utf-8") as file: json.dump(ele_stations, file, ensure_ascii=False, indent=2) - logger.debug("Spice EV is calculating optimized case as a complete scenario") + logger.debug("Calculating optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index bf1fda18..8894c9fd 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -780,10 +780,10 @@ def set_up_decision_tree(self, group_amount): def rebase_spice_ev(self): """ Rebase the scenario meaning configuring various variables according to the input data - and running a spice ev simulation + and running a SpiceEV simulation :return: must_include_set and dict of electrified_stations """ - self.logger.debug("Spice EV Rebasing Scenario") + self.logger.debug("Rebasing Scenario") must_include_set, ele_stations = self.preprocessing_scenario( run_only_neg=self.config.run_only_neg) self.logger.debug("Rebasing finished") From 25edbc666221488c192b98abaac3164aa000892c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Feb 2023 10:02:51 +0100 Subject: [PATCH 585/802] Add standalone test for optimization and rest of review. --- ebus_toolbox/optimizer_util.py | 9 +- ebus_toolbox/station_optimization.py | 5 +- ebus_toolbox/station_optimizer.py | 80 +++++++++++++----- tests/test_station_optimization.py | 122 +++++++++++++++++++++++++++ 4 files changed, 189 insertions(+), 27 deletions(-) create mode 100644 tests/test_station_optimization.py diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 4415a208..5865a3e2 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -141,7 +141,7 @@ def read_config(config_path): config_parser.sections() assert Path(config_path).is_file(), f"Path to optimizer_config: {config_path} " \ - f"does not lead to file" + f"does not lead to file" config_parser.read(config_path, encoding="utf-8") conf = OptimizerConfig() conf.path = config_path @@ -203,7 +203,7 @@ def read_config(config_path): conf.decision_tree_path = None conf.save_decision_tree = special.getboolean("save_decision_tree", False) conf.reduce_rotations = special.getboolean("reduce_rotations", False) - conf.rotations = json.loads(special.get("rotations", [])) + conf.rotations = json.loads(special.get("rotations", "[]")) return conf @@ -347,7 +347,8 @@ def evaluate(events: typing.Iterable[LowSocEvent], # potential is the minimal amount of the following boundaries # - soc can only be lifted to the upper threshold - # - useful lift is in between the minimal soc of the event and the lower threshold of soc + # - useful lift is in between the minimal soc of the event and the + # lower threshold of soc # - useful lift can only occur in between the current soc and the # - the highest useful lift is the amount between a "full" and "empty" battery, where # "full" and "empty" are described by the upper and lower thresholds @@ -372,7 +373,7 @@ def evaluate(events: typing.Iterable[LowSocEvent], station_eval[trip.arrival_name] = delta_e_pot # sort by pot_sum - station_eval_list = sorted(station_eval.items(), key=lambda x: x[1],reverse=True) + station_eval_list = sorted(station_eval.items(), key=lambda x: x[1], reverse=True) return station_eval_list diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 04f28fdf..89f377d8 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -164,7 +164,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): # this can make solving networks much simpler. Some information in the electrification path # gets lost though if conf.check_for_must_stations: - must_stations = optimizer.get_must_stations_and_rebase(relative_soc=False) + must_stations = optimizer.get_critical_stations_and_rebase(relative_soc=False) logger.warning("%s must stations %s", len(must_stations), must_stations) logger.debug("Starting greedy station optimization") @@ -175,6 +175,9 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.debug("%s total stations", len(ele_stations)) logger.debug("These rotations could not be electrified: %s", optimizer.could_not_be_electrified) + # remove none values from socs in the vehicle_socs so timeseries_calc can work + optimizer.remove_none_socs() + vehicle_socs = optimizer.timeseries_calc() new_events = optimizer.get_low_soc_events(soc_data=vehicle_socs) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 8894c9fd..f8e986ba 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -866,11 +866,11 @@ def create_charging_curves(self): self.soc_charge_curve_dict = soc_charge_curve_dict @util.time_it - def get_must_stations_and_rebase(self, relative_soc=False): + def get_critical_stations_and_rebase(self, relative_soc=False): """ Get the stations that must be electrified and put them into the electrified stations - and an extra set of must stations - Electrify everything minus 1 station. If without the stations there are below zero events - it is a must have station + and an extra set of critical stations. + Electrify every station but one. If without this single station there are below zero events + it is a critical station. :param relative_soc: should the evaluation use the relative or absolute soc :return: Set(Station_ids) @@ -882,8 +882,9 @@ def get_must_stations_and_rebase(self, relative_soc=False): if station not in self.not_possible_stations} electrified_station_set_all = set(stats) - must_stations = set() - print(f"Electrifying {len(electrified_station_set_all)} stations minus one", ) + critical_stations = set() + nr_of_all_stations = len(electrified_station_set_all) + print(f"Electrifying {nr_of_all_stations-1}/{nr_of_all_stations} stations", ) for station in sorted(electrified_station_set_all): electrified_station_set = electrified_station_set_all.difference([station]) @@ -894,16 +895,16 @@ def get_must_stations_and_rebase(self, relative_soc=False): soc_min = min(np.min(soc[start:end]), soc_min) if soc_min < self.config.min_soc: - must_stations.add(station) + critical_stations.add(station) self.logger.debug("%s , with min soc: %s", station, soc_min) - self.not_possible_stations = self.not_possible_stations.union(must_stations) + self.not_possible_stations = self.not_possible_stations.union(critical_stations) # rebasing - for stat in must_stations: + for stat in critical_stations: # do not put must stations in electrified set, but in extra set must_include_set self.electrify_station(stat, self.must_include_set) - return must_stations + return critical_stations def remove_none_socs(self): """ Removes soc values of None by filling them with the last value which is not None @@ -934,10 +935,7 @@ def get_index_by_time(self, search_time: datetime): :param search_time: The time for which to return the index as datetime object :return: the time corresponding to the given index. """ - start_time = self.scenario.start_time - delta_time = timedelta(minutes=60 / self.scenario.stepsPerHour) - idx = (search_time - start_time) // delta_time - return idx + return util.get_index_by_time(self.scenario, search_time) @util.time_it def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): @@ -998,9 +996,9 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, soc_lower_thresh = kwargs.get("soc_lower_thresh", self.config.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", self.args.desired_soc_deps) - # Create list of events which describe trips which end in a soc below zero - # The event is bound by the lowest soc and an upper soc threshold which is naturally 1 - # Properties before and after these points have no effect on the event itself, similar to + # create list of events which describe trips which end in a soc below zero + # the event is bound by the lowest soc and an upper soc threshold which is naturally 1 + # properties before and after these points have no effect on the event itself, similar to # an event horizon events = [] count_electrified_rot = 0 @@ -1010,12 +1008,16 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, soc, rot_start_idx, rot_end_idx = self.get_rotation_soc(rot_id, soc_data) rot_end_idx += 1 idx = range(0, len(soc)) + # combined data of the soc data of the rotation and the original index comb = list(zip(soc, idx))[rot_start_idx:rot_end_idx] + + # get the minimum soc and index of this value min_soc, min_idx = min(comb, key=lambda x: x[0]) reduced_list = comb.copy() + soc_lower_thresh_cur = soc_lower_thresh - # if rotation gets a start soc below 1 this should change below 0 soc - # events since fixing the rotation before would lead to fixing this rotation + # if rotation gets a start soc below 1 this should change below 0 soc events, + # since fixing the rotation before would lead to fixing this rotation # if using relative SOC, SOC lookup has to be adjusted if rel_soc: @@ -1023,26 +1025,43 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, soc_lower_thresh_cur = min(start_soc, soc_upper_thresh) - ( soc_upper_thresh - soc_lower_thresh) soc_upper_thresh = soc_lower_thresh_cur + soc_upper_thresh - if min_soc >= soc_lower_thresh_cur: - count_electrified_rot += 1 + + # while the minimal soc of the soc time series is below the threshold find the events + # which are connected with this event. Every iteration the data of the found events is + # removed. At some point the reduced time series is either empty or does not have a + # soc below the lower threshold. while min_soc < soc_lower_thresh_cur: i = min_idx + # these indicies were not removed yet. idx = [x[1] for x in reduced_list] + + # find the first index by going back from the minimal soc index, where the soc + # was above the upper threshold OR the index where the rotation started. while soc[i] < soc_upper_thresh: if i == rot_start_idx: break i -= 1 - start_comb = idx.index(i) + + # which index in the original data is the found index? start = i + start_comb = idx.index(start) + i = min_idx + # do the same as before but find the index after the minimal soc. while soc[i] < soc_upper_thresh: if i >= rot_end_idx-1: break i += 1 end_comb = idx.index(i) + + # with the start index and and the minimal index find trips, in this time span trips = self.get_trips(rot=rot, start_idx=start, end_idx=min_idx) possible_stations = set() possible_stations_list = [] + + # check which stations the bus arrives at with these trips. Depending on + # filter_standing_time, every station is returned or only the stations where the bus + # stops long enough to be able to charge. if not filter_standing_time: possible_stations = {t.arrival_name for t in trips} possible_stations_list = [t.arrival_name for t in trips] @@ -1057,10 +1076,14 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, possible_stations.add(trip.arrival_name) possible_stations_list.append(trip.arrival_name) + # the stations which have potential should be filtered by the not_possible_stations, + # which are stations which for some reason should not be electrified. possible_stations = possible_stations.difference(self.not_possible_stations) cht = rot.vehicle_id.find("depb") ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" v_type = rot.vehicle_id.split("_" + ch_type)[0] + + # with the gathered data create the event object event = util.LowSocEvent(start_idx=start, end_idx=min_idx, min_soc=min_soc, stations=possible_stations, vehicle_id=rot.vehicle_id, trip=trips, @@ -1071,7 +1094,20 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, events.append(event) copy_list = reduced_list.copy() + + # to leave the while loop, we need to change the data source of the loop, which is + # reduced_list and the minimal soc and index. + # the reduced list, contains the same values as the reduced list up to the point, + # where our current low soc event started reduced_list = reduced_list[:start_comb] + + # if the index end_comb is smaller than the length of the list, the end of the + # list has to be appended, since there is data left in the rotation + # after the low soc event. + # Note: The event goes from start_comb to min_index. Therefore this part is removed + # from the reduced list. Since the socs right after the minimal soc are dominated, + # by the previous minimal socs they can be removed up to the point of the upper soc + # threshold. This index was found earlier as end_comb. if end_comb + 1 <= len(copy_list): reduced_list.extend(copy_list[end_comb + 1:]) if len(reduced_list) > 0: diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py new file mode 100644 index 00000000..d05b4113 --- /dev/null +++ b/tests/test_station_optimization.py @@ -0,0 +1,122 @@ +import json + +import ebus_toolbox.optimizer_util as opt_util +import ebus_toolbox.util as util +from ebus_toolbox.station_optimization import run_optimization +import pathlib +from ebus_toolbox.trip import Trip +from ebus_toolbox.consumption import Consumption +from ebus_toolbox.schedule import Schedule +from spice_ev.util import set_options_from_config + +test_root = pathlib.Path(__file__).parent +file_root = test_root / "test_input_files" + + +class TestStationOptimization: + mandatory_args = { + "min_recharge_deps_oppb": 0, + "min_recharge_deps_depb": 0, + "gc_power_opps": 1000, + "gc_power_deps": 1000, + "cs_power_opps": 100, + "cs_power_deps_depb": 50, + "cs_power_deps_oppb": 150 + } + with open(file_root / "vehicle_types.json", "r", encoding='utf-8') as file: + vehicle_types = json.load(file) + + with open(file_root / "electrified_stations.json", "r", encoding='utf-8') as file: + electrified_stations = json.load(file) + + def test_basic_run(self, trips_file_name="trips.csv"): + """ Check if running a basic example works and if a scenario object is returned + :param trips_file_name: file name of the trips file. Has to be inside the test_input_file + folder + :type trips_file_name: str + :return: schedule, scenario""" + + path_to_trips = file_root / trips_file_name + parser = util.create_ArgumentParser_with_arguments() + args = parser.parse_args(args="") + args.config = file_root / "ebus_toolbox.cfg" + args.days = None + args.seed = 5 + + Trip.consumption = Consumption(self.vehicle_types, + outside_temperatures=None, + level_of_loading_over_day=None) + + path_to_all_station_data = file_root / "all_stations_example.csv" + generated_schedule = Schedule.from_csv(path_to_trips, self.vehicle_types, + self.electrified_stations, + **self.mandatory_args, + station_data_path=path_to_all_station_data) + + set_options_from_config(args, check=parser, verbose=False) + args.ALLOW_NEGATIVE_SOC = True + args.attach_vehicle_soc = True + scen = generated_schedule.run(args) + return generated_schedule, scen, args + + def test_basic_optimization(self): + """ Test the base optimization simply by checking if optimization finishes without + raising errors""" + trips_file_name = "trips_for_optimizer.csv" + sched, scen, args = self.test_basic_run(trips_file_name) + config_path = file_root / "optimizer.cfg" + conf = opt_util.read_config(config_path) + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + conf.solver = "spiceev" + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + + def test_deep_optimization(self): + """ Check if deep analysis finds the prepared optimal solution for the test case. + The Test case is a a 3 star like network with two rotations which are negative without + electrification. + Rotation 1: + Depot --> Station-1 ---> Station-2 -->Station-1-->Depot + Rotation 2: + Depot --> Station-1 ---> Station-3 -->Station-1-->Depot + + Greedy optimization will electrify Station-1 first since it is helpful for both rotations. + Since electrifying Station-1 is not enough to electrify either rotations, greedy + optimization will electrify Station-2 and Station-3 as well. Deep Analysis will expand + the checked nodes --> It should find that electrifying Station-2 and Station-3 is enough + without electrifying Station-1 + + """ + trips_file_name = "trips_for_optimizer_deep.csv" + sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + args.input_schedule = file_root / trips_file_name + config_path = file_root / "optimizer.cfg" + conf = opt_util.read_config(config_path) + + solvers = ["quick", "spiceev"] + node_choices = ["step-by-step", "brute"] + conf.opt_type = "deep" + for solver in solvers: + for node_choice in node_choices: + conf.solver = solver + conf.node_choice = node_choice + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + assert "Station-1" not in opt_sched.stations + assert "Station-2" in opt_sched.stations + assert "Station-3" in opt_sched.stations + + def test_critical_stations_optimization(self, caplog): + """ Test if station 2 and 3 are correctly recognized as critical stations + :param caplog: pytest fixture, which is automatically created, + to have access to logging data + """ + trips_file_name = "trips_for_optimizer_deep.csv" + sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + args.input_schedule = file_root / trips_file_name + config_path = file_root / "optimizer.cfg" + conf = opt_util.read_config(config_path) + conf.check_for_must_stations = True + conf.solver = "quick" + conf.node_choice = "step-by-step" + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + assert ("must stations {'Station-3', 'Station-2'}" in caplog.text or + "must stations {'Station-2', 'Station-3'}" in caplog.text) From 71174c4b80ccb5ce86c62c8489a5d0342d8819c5 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 27 Feb 2023 13:24:36 +0100 Subject: [PATCH 586/802] Remove rotation count from get_low_soc_events --- ebus_toolbox/station_optimizer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index f8e986ba..12b96f40 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -1001,7 +1001,6 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, # properties before and after these points have no effect on the event itself, similar to # an event horizon events = [] - count_electrified_rot = 0 for rot_id in rotations: rot = self.schedule.rotations[rot_id] From 9b8f02810c424091c451ce1ef9d986e6fa7e3bbb Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 27 Feb 2023 15:42:05 +0100 Subject: [PATCH 587/802] Add types to some sphinx doc strings --- ebus_toolbox/optimizer_util.py | 77 ++++++++++++++++++---------- ebus_toolbox/station_optimization.py | 64 +++++++++++------------ ebus_toolbox/station_optimizer.py | 9 ++-- 3 files changed, 88 insertions(+), 62 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 5865a3e2..7943d305 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -135,7 +135,9 @@ def decorated_function(*this_args, **kwargs): def read_config(config_path): """ Read the config path to a config object :param config_path: path to file - :return: config object + :type config_path: str + :return: configuration + :rtype: ebus_toolbox.optimizer_util.OptimizerConfig """ config_parser = configparser.ConfigParser() config_parser.sections() @@ -211,9 +213,12 @@ def read_config(config_path): def get_charging_time(trip1, trip2, args): """ Returns the charging time in minutes between trips as numeric value/float - :param trip1: First trip - :param trip2: Following trip - :param args: arguments Namespace with default buffer time + :param trip1: first trip + :type trip1: ebus_toolbox.trip.Trip + :param trip2: following trip + :type trip2: ebus_toolbox.trip.Trip + :param args: arguments including default buffer time + :type args: Namespace object :return: maximum possible charging time in minutes between trips :rtype: float """ @@ -230,8 +235,10 @@ def get_charging_start(trip1, args): """ Returns the possible start time of charging considering buffer times before charging can take place - :param trip1: First trip - :param args: arguments Namespace with default buffer time + :param trip1: trip to be checked + :type trip1: ebus_toolbox.trip.Trip + :param args: arguments including default buffer time + :type args: Namespace object :return: First possible charging time as datetime object """ buffer_time = get_buffer_time(trip1, args.default_buffer_time_opps) @@ -240,9 +247,12 @@ def get_charging_start(trip1, args): def get_buffer_time(trip, default_buffer_time_opps): """ Return the buffer time as timedelta object - :param trip: trip object + + :param trip: trip to be checked + :type trip: ebus_toolbox.trip.Trip :param default_buffer_time_opps: the default buffer time at opps charging stations - :return: timedelta object for the buffer time + :return: buffer time + :rtype: datetime.timedelta """ return timedelta(minutes=get_buffer_time_util(trip, default_buffer_time_opps)) @@ -252,38 +262,50 @@ def get_index_by_time(scenario, search_time): In case the time does not coincide with a simulation index the lower index is returned. - :param scenario: scenario object - :param search_time: search time as datetime object - :return: index as int + :param scenario: scenario to be checked + :type scenario: spice_ev.Scenario + :param search_time: search time + :type search_time: datetime.datetime + :return: index + :rtype: int """ idx = (search_time - scenario.start_time) // scenario.interval return idx -def get_rotation_soc_util(rot_id, this_sched, this_scen, soc_data: dict = None): +def get_rotation_soc_util(rot_id, schedule, scenario, soc_data: dict = None): """Returns the soc time series with start and end index for a given rotation id :param rot_id: rotation_id - :param this_sched: schedule object contain rotation information - :param this_scen: scenario object containing the soc data - :param soc_data: optional soc_data if not the scenario data should be used - :return: tuple with soc array, start index and end index + :type rot_id: str + :param schedule: schedule object contain rotation information + :param scenario: scenario containing the soc data + :type scenario: spice_ev.Scenario + :param soc_data: optional soc_data if the scenario data should not be used + :type soc_data: dict + :return: soc time series, start index and end index + :rtype: (list, int, int) """ - rot = this_sched.rotations[rot_id] - rot_start_idx = get_index_by_time(this_scen, rot.departure_time) - rot_end_idx = get_index_by_time(this_scen, rot.arrival_time) + rot = schedule.rotations[rot_id] + rot_start_idx = get_index_by_time(scenario, rot.departure_time) + rot_end_idx = get_index_by_time(scenario, rot.arrival_time) if soc_data: return soc_data[rot.vehicle_id], rot_start_idx, rot_end_idx - return this_scen.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx + return scenario.vehicle_socs[rot.vehicle_id], rot_start_idx, rot_end_idx def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: 'StationOptimizer'): """Return expected soc lift for a given soc charging time series, start_soc and time_delta. - :param soc_over_time_curve: array with socs over time + :param soc_over_time_curve: Data with columns: time, soc and n rows + :type soc_over_time_curve: np.array() with shape(n, 2) :param soc: start socs + :type soc: float :param time_delta: time of charging + :type time_delta: float :param optimizer: optimizer object - :return: (float) the lift of the soc + :type optimizer: ebus_toolbox.station_optimizer.StationOptimizer + :return: positive delta of the soc + :rtype: float """ # units for time_delta and time_curve are assumed to be the same, e.g. minutes # first element which is bigger than current soc @@ -322,9 +344,11 @@ def evaluate(events: typing.Iterable[LowSocEvent], by loading power, standing time at a station, soc at station and minimal soc of the event :param events: events to be evaluated - :param optimizer: StationOptimizer object with scenario and schedule data + :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) + :param optimizer: optimizer with scenario and schedule data + :type optimizer: ebus_toolbox.station_optimizer.StationOptimizer :param kwargs: optional overwriting of soc_lower_thresh, soc_upper_thresh or soc_data - :return: sorted list with the best station and its potential on index 0 + :return: sorted stations and potentials :rtype: list(str(station_id), float(potential)) """ soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) @@ -661,16 +685,17 @@ def preprocess_schedule(this_sched, this_args, electrified_stations=None): return this_sched, this_sched.generate_scenario(this_args) -def print_time(start=[]): +def get_time(start=[]): """Print the time and automatically set start time to the first time the function getting called :param start: list for storing times + :returns: String with seconds which passed since the first call. """ if not start: start.append(time()) delta = round(time() - start[0], 2) if delta > 0: - print(delta, "seconds since start") + return str(delta) + " seconds since start" def plot_(data): diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 89f377d8..ae11889b 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -49,11 +49,11 @@ def setup_logger(conf): def main(): """ main call""" - util.print_time() + print(util.get_time()) config_path = "./data/examples/default_optimizer.cfg" conf = util.read_config(config_path) opt_sched, opt_scen = run_optimization(conf) - util.print_time() + print(util.get_time()) import pickle with open("schedule_opt.pickle", "wb") as f: pickle.dump(opt_sched, f) @@ -61,14 +61,16 @@ def main(): pickle.dump(opt_scen, f) -def prepare_filesystem(this_args, conf): +def prepare_filesystem(args, conf): """ Prepare files and folders in the optimization results folder - :param conf: configuration object - :param this_args: Namespace object of arguments for ebus toolbox + :param conf: configuration + :type conf: ebus_toolbox.optimizer_util.OptimizerConfig + :param args: Arguments for ebus toolbox + :type args: Namespace object """ now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - this_args.output_directory = Path(this_args.output_directory) - conf.optimizer_output_dir = Path(this_args.output_directory) / (now + "_optimizer") + args.output_directory = Path(args.output_directory) + conf.optimizer_output_dir = Path(args.output_directory) / (now + "_optimizer") # create sub folder for specific sim results with timestamp. # if folder doesnt exists, create folder. conf.optimizer_output_dir.mkdir(parents=True, exist_ok=True) @@ -80,50 +82,46 @@ def prepare_filesystem(this_args, conf): def run_optimization(conf, sched=None, scen=None, args=None): - """ Optimizes scenario by adding electrified stations sparingly - until scenario has no below 0 soc events. + """ Add electrified stations until there are no more negative rotations. - The optimizer config file is used for setting the optimization up. + Configured with arguments from optimizer config file. :param conf: Configuration object of optimization :type conf: OptimizerConfig - :param sched: Simulation schedule containing buses, rotations etc. :type sched: ebus_toolbox.Schedule - :param scen: Simulation scenario containing simulation results including the SoC of all vehicles over time :type scen: spice_ev.Scenario :param args: Simulation arguments for manipulation or generated outputs :type args: object - :return: (Schedule,Scenario) optimized schedule and Scenario + :return: optimized schedule and Scenario :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) """ - # load pickle files only in the case they are not given as arguments + # load pickle files if they are not given as arguments if sched is None or scen is None or args is None: - # if no schedule was given as argument, make sure no scenario - # and args input was given as well. + # either all optional arguments are given or none are assert sched == scen == args is None sched, scen, args = util.toolbox_from_pickle(conf.schedule, conf.scenario, conf.args) - # prepare Filesystem with folders and paths and copy config + # setup folders, paths and copy config prepare_filesystem(args, conf) if args.save_soc: args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" - new_ele_stations_path = conf.optimizer_output_dir / Path("optimized_stations" + ".json") + new_ele_stations_path = conf.optimizer_output_dir / "optimized_stations.json" logger = setup_logger(conf) if args.desired_soc_deps != 1 and conf.solver == "quick": - logger.error("Fast calc is not yet optimized for desired socs unequal to 1") + logger.error("Fast calculation is not yet optimized for desired socs different to 1") optimizer = ebus_toolbox.station_optimizer.StationOptimizer(sched, scen, args, conf, logger) - # set battery and charging curves through config file if wished for + # set battery and charging curves through config file optimizer.set_battery_and_charging_curves() # filter out depot chargers if option is set @@ -134,7 +132,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): "rotations." # rebasing the scenario meaning simulating it again with the given conditions of - # included and excluded stations and rotations and maybe changed battery sizes + # included stations, excluded stations, filtered rotations and changed battery sizes if conf.rebase_scenario: must_include_set, ele_stations = optimizer.rebase_spice_ev() else: @@ -147,22 +145,23 @@ def run_optimization(conf, sched=None, scen=None, args=None): # remove none values from socs in the vehicle_socs optimizer.remove_none_socs() - # check if rotations cant be operated electric, even with all stations electrified. + # all stations electrified: are there still negative rotations? if conf.remove_impossible_rotations: neg_rots = optimizer.get_negative_rotations_all_electrified() optimizer.config.exclusion_rots.update(neg_rots) - optimizer.schedule.rotations = {r: optimizer.schedule.rotations[r] - for r in optimizer.schedule.rotations if - r not in optimizer.config.exclusion_rots} + optimizer.schedule.rotations = { + r: optimizer.schedule.rotations[r] for r in optimizer.schedule.rotations if + r not in optimizer.config.exclusion_rots} + logger.warning("%s negative rotations %s were removed from schedule", len(neg_rots), neg_rots) assert len(optimizer.schedule.rotations) > 0, "Schedule cant be optimized, since" \ "rotations cant be electrified." - # if the whole network cant be fully electrified if even just a single station is not + # if the whole network can not be fully electrified if even just a single station is not # electrified, this station must be included in a fully electrified network - # this can make solving networks much simpler. Some information in the electrification path - # gets lost though + # this can make solving networks much simpler. Some information during the path to full + # electrification gets lost though, e.g. priority of stations. if conf.check_for_must_stations: must_stations = optimizer.get_critical_stations_and_rebase(relative_soc=False) logger.warning("%s must stations %s", len(must_stations), must_stations) @@ -183,20 +182,21 @@ def run_optimization(conf, sched=None, scen=None, args=None): new_events = optimizer.get_low_soc_events(soc_data=vehicle_socs) if len(new_events) > 0: - logger.debug("Still not electrified with abs. soc with fast calc") + logger.debug("Estimation of network still shows negative rotations") for event in new_events: logger.debug(event.rotation.id) with open(new_ele_stations_path, "w", encoding="utf-8") as file: json.dump(ele_stations, file, ensure_ascii=False, indent=2) - logger.debug("Calculating optimized case as a complete scenario") + # Calculation with SpiceEV is more accurate and will show if the optimization is viable or not + logger.debug("Detailed calculation of optimized case as a complete scenario") _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False) logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) - print("Station optimization finished after ", end="") - util.print_time() + print("Station optimization finished after " + util.get_time()) + logger.warning("Station optimization finished after %s", util.get_time()) return optimizer.schedule, optimizer.scenario diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 12b96f40..b378c9bf 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -85,7 +85,7 @@ def loop(self, **kwargs): # baseline greedy optimization # base line is created simply by not having a decision tree and not a pre optimized_set yet - util.print_time() + print(util.get_time()) for group_nr, group in enumerate(groups[:]): # unpack the group events, stations = group @@ -116,7 +116,7 @@ def loop(self, **kwargs): self.electrify_station(stat, self.electrified_station_set) return self.electrified_stations, self.electrified_station_set self.logger.warning("Starting deep analysis with mode: %s", self.config.node_choice) - util.print_time() + print(util.get_time()) # from here on only for deep analysis for group_nr, group in enumerate(groups[:]): events, stations = group @@ -193,7 +193,7 @@ def loop(self, **kwargs): self.logger.debug("Optimized with %s stations out of %s", len(pre_optimized_set), len(stations)) - util.print_time() + print(util.get_time()) # saving decision tree only in case of deep analysis if self.config.save_decision_tree: with open(self.config.optimizer_output_dir / Path("decision_tree.pickle"), "wb") as f: @@ -967,7 +967,8 @@ def get_time_by_index(self, idx): """ start_time = self.scenario.start_time - delta_time = timedelta(minutes=60 / self.scenario.stepsPerHour) + + delta_time = self.scenario.interval searched_time = start_time + delta_time * idx return searched_time From 23711b2658be5be7a824d88af04afef9e8b83742 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 28 Feb 2023 12:09:56 +0100 Subject: [PATCH 588/802] Add param types and rtypes to sphinx docstrings --- ebus_toolbox/optimizer_util.py | 156 +++++++++++++++++---------- ebus_toolbox/station_optimization.py | 9 +- ebus_toolbox/station_optimizer.py | 128 ++++++++++++++++------ 3 files changed, 197 insertions(+), 96 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 7943d305..0d266b4b 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -218,7 +218,7 @@ def get_charging_time(trip1, trip2, args): :param trip2: following trip :type trip2: ebus_toolbox.trip.Trip :param args: arguments including default buffer time - :type args: Namespace object + :type args: Namespace :return: maximum possible charging time in minutes between trips :rtype: float """ @@ -238,7 +238,7 @@ def get_charging_start(trip1, args): :param trip1: trip to be checked :type trip1: ebus_toolbox.trip.Trip :param args: arguments including default buffer time - :type args: Namespace object + :type args: Namespace :return: First possible charging time as datetime object """ buffer_time = get_buffer_time(trip1, args.default_buffer_time_opps) @@ -277,7 +277,8 @@ def get_rotation_soc_util(rot_id, schedule, scenario, soc_data: dict = None): """Returns the soc time series with start and end index for a given rotation id :param rot_id: rotation_id :type rot_id: str - :param schedule: schedule object contain rotation information + :param schedule: schedule containing rotation information + :type schedule:ebus_toolbox.schedule.Schedule :param scenario: scenario containing the soc data :type scenario: spice_ev.Scenario :param soc_data: optional soc_data if the scenario data should not be used @@ -401,7 +402,7 @@ def evaluate(events: typing.Iterable[LowSocEvent], return station_eval_list -def get_groups_from_events(events, not_possible_stations=None, could_not_be_electrified=None, +def get_groups_from_events(events, impossible_stations=None, could_not_be_electrified=None, optimizer=None): """ Create groups from events which need to be optimized together @@ -410,22 +411,26 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec Electrified and other not possible to electrify stations should not connect groups :param events: events for a given state of a scenario - :param not_possible_stations: stations to be discarded + :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) + :param impossible_stations: stations to be discarded + :type impossible_stations: set(str) :param could_not_be_electrified: rotations to be discarded - :param optimizer: StationOptimizer object - :return: list((events, stations)) which give you events to optimize together with the stations - which might help them + :type could_not_be_electrified: set(str) + :param optimizer: Optimizer + :type optimizer: ebus_toolbox.station_optimizer.StationOptimizer + :return: Groups of events and stations which have to be optimized together + :rtype: list((ebus_toolbox.optimizer_util.LowSocEvent, str)) """ # making sure default arguments are none and not mutable - if not_possible_stations is None: - not_possible_stations = set() + if impossible_stations is None: + impossible_stations = set() if could_not_be_electrified is None: could_not_be_electrified = set() possible_stations = [ - {station for station in event.stations if station not in not_possible_stations} + {station for station in event.stations if station not in impossible_stations} for event in events] # if stations overlap join them @@ -456,7 +461,8 @@ def get_groups_from_events(events, not_possible_stations=None, could_not_be_elec def join_all_subsets(subsets): """ join sets for as long as needed until no elements share any intersections - :param subsets: iterable of sets + :param subsets: sets to be joined + :type subsets: iterable :return: joined subsets if they connect with other subsets in some way """ joined_subset = True @@ -471,7 +477,8 @@ def join_subsets(subsets: typing.Iterable[set]): If not intersection is found over all subsets False is returned which will cancel the outer call in join_all_subsets - :param subsets: iterable of sets + :param subsets: sets to be joined + :type subsets: iterable :return: boolean if joining subsets is finished (i.e. False if all subsets are connected and thus far connected subsets """ @@ -488,18 +495,22 @@ def join_subsets(subsets: typing.Iterable[set]): return False, subsets -def toolbox_to_pickle(name, sched, scen, this_args): +def toolbox_to_pickle(name, sched, scen, args): """ Dump the 3 files to pickle files :param name: base name of the files - :param sched: schedule object - :param scen: scenario object - :param this_args: args Namespace object - :return: Names of the created files + :param sched: schedule + :type sched: ebus_toolbox.schedule.Schedule + :param scen: scenario + :type scen: spice_ev.Scenario + :param args: arguments + :type args: Namespace + :return: names of the created files + :rtype: str """ args_name = "args_" + name + ".pickle" with open(args_name, "wb") as file: - pickle.dump(this_args, file) + pickle.dump(args, file) scen_name = "scenario_" + name + ".pickle" with open(scen_name, "wb") as file: pickle.dump(scen, file) @@ -515,12 +526,19 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, """ create charging curve as nested list of SOC, Power[kW] and capacity in [kWh] :param charging_curve: the charging curve with power over soc + :type charging_curve: list(float,float) :param capacity: capacity of the vehicle - :param args: args namespace object for simulation arguments + :type capacity: float + :param args: simulation arguments + :type args: Namespace :param max_charge_from_grid: maximum amount of charge from grid / connector + :type max_charge_from_grid: float :param time_step: time step for simulation + :type time_step: float :param efficiency: efficiency of charging - :return: np.array with soc over time + :type efficiency: float + :return: soc over time with n values + :rtype: np.array of shape (n, 2) """ # simple numeric creation of power over time --> to energy over time normalized_curve = np.array([[soc, power / capacity] for soc, power in charging_curve]) @@ -552,9 +570,10 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, def get_missing_energy(events): """ Sum up all the missing energies of the given events - :param events: events to be checked - :return: (float) missing energy + :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) + :return: missing energy + :rtype: float """ missing_energy = 0 for event in events: @@ -564,9 +583,10 @@ def get_missing_energy(events): def stations_hash(stations_set): """ Create a simple str as hash for a set of stations - - :param stations_set: set of stations to be hashed - :return: hash string + :param stations_set: stations to be hashed + :type stations_set: set + :return: hash + :rtype: str """ return str(sorted(list(stations_set))) @@ -576,6 +596,7 @@ def combination_generator(iterable: typing.Iterable, amount: int): an amount out of an iterable without putting them back and without caring about the order of elements :param iterable: Any collection which can be cast to a list + :rtype iterable: iterable :param amount: Number of elements which should be drawn from iterable :type amount: int :yields: list of items @@ -598,17 +619,21 @@ def toolbox_from_pickle(sched_name, scen_name, args_name): """ Load the 3 files from pickle :param sched_name: name of schedule file + :type sched_name: str :param scen_name: name of scenario file + :type scen_name: str :param args_name: name of args file - :return: schedule, scenario and args object + :type args_name: str + :return: schedule, scenario and arguments + :rtype: (ebus_toolbox.schedule.Schedule, spice_ev.Scenario, Namespace) """ with open(args_name, "rb") as file: - this_args = pickle.load(file) + args = pickle.load(file) with open(scen_name, "rb") as file: scen = pickle.load(file) with open(sched_name, "rb") as file: sched = pickle.load(file) - return sched, scen, this_args + return sched, scen, args def combs_unordered_no_putting_back(n: int, k: int): @@ -628,29 +653,33 @@ def combs_unordered_no_putting_back(n: int, k: int): return 0 -def run_schedule(this_sched, this_args, electrified_stations=None): +def run_schedule(sched, args, electrified_stations=None): """Run a given schedule and electrify stations if need be - :param this_sched: schedule object - :param this_args: args namespace object - :param electrified_stations: dict of electrified stations. Default value None means no further + :param sched: schedule object + :type sched: ebus_toolbox.schedule.Schedule + :param args: arguments + :type args: Namespace + :param electrified_stations: electrified stations. Default value None means no further stations are electrified - :return: schedule and scenario objects after SpiceEV simulation + :type electrified_stations: dict or None + :return: schedule and scenario after SpiceEV simulation + :rtype: ebus_toolbox.schedule.Schedule, spice_ev.Scenario """ - this_sched2 = copy(this_sched) + this_sched2 = copy(sched) this_sched2.stations = electrified_stations - this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, + this_sched2, new_scen = preprocess_schedule(this_sched2, args, electrified_stations=electrified_stations) # parse strategy options for SpiceEV - if this_args.strategy_option is not None: - for opt_key, opt_val in this_args.strategy_option: + if args.strategy_option is not None: + for opt_key, opt_val in args.strategy_option: try: # option may be number opt_val = float(opt_val) except ValueError: # or not pass - setattr(this_args, opt_key, opt_val) + setattr(args, opt_key, opt_val) with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) @@ -658,38 +687,44 @@ def run_schedule(this_sched, this_args, electrified_stations=None): # do not print output from SpiceEV to reduce clutter. Don't do it in testing # since it produces errors sys.stdout = open(os.devnull, 'w') - new_scen.run('distributed', vars(this_args).copy()) + new_scen.run('distributed', vars(args).copy()) if "pytest" not in sys.modules: sys.stdout = sys.__stdout__ return this_sched2, new_scen -def preprocess_schedule(this_sched, this_args, electrified_stations=None): +def preprocess_schedule(sched, args, electrified_stations=None): """ Prepare the schedule by calculating consumption, setting electrified stations and assigning vehicles - :param this_sched: schedule containing the rotations - :param this_args: arguments for simulation - :param electrified_stations: dict of stations to be electrified + :param sched: schedule containing the rotations + :type sched: ebus_toolbox.schedule.Schedule + :param args: arguments for simulation + :type args: Namespace + :param electrified_stations: stations to be electrified + :type electrified_stations: dict :return: schedule and scenario to be simulated + :rtype: (ebus_toolbox.schedule.Schedule, spice_ev.Scenario) """ Trip.consumption = \ - Consumption(this_sched.vehicle_types, - outside_temperatures=this_args.outside_temperature_over_day_path, - level_of_loading_over_day=this_args.level_of_loading_over_day_path) + Consumption(sched.vehicle_types, + outside_temperatures=args.outside_temperature_over_day_path, + level_of_loading_over_day=args.level_of_loading_over_day_path) - this_sched.stations = electrified_stations - this_sched.calculate_consumption() - this_sched.assign_vehicles() + sched.stations = electrified_stations + sched.calculate_consumption() + sched.assign_vehicles() - return this_sched, this_sched.generate_scenario(this_args) + return sched, sched.generate_scenario(args) def get_time(start=[]): """Print the time and automatically set start time to the first time the function getting called - :param start: list for storing times - :returns: String with seconds which passed since the first call. + :param start: start time + :type start: list(float) + :return: String with seconds which passed since the first call. + :rtype: str """ if not start: start.append(time()) @@ -701,22 +736,29 @@ def get_time(start=[]): def plot_(data): """ Simple plot of data without having to create subplots :param data: data to be plotted + :type data: iterable :return: axis of the plot """ fig, axis = plt.subplots() axis.plot(data, linewidth=2.0) return axis -def plot_rot(rot_id, this_sched, this_scen, axis=None, rot_only=True): +def plot_rot(rot_id, sched, scen, axis=None, rot_only=True): """Simple plot of data without having to create subplots :param rot_id: id of the rotation - :param this_sched: schedule object - :param this_scen: scenario object + :type rot_id: str + :param sched: schedule + :type sched: ebus_toolbox.schedule.Schedule + :param scen: scenario + :type scen: spice_ev.Scenario :param axis: axis to be plotted on + :type axis: int :param rot_only: show only the rot or the whole vehicle socs + :type rot_only: bool :return: axis of the plot + :rtype matplotlib.axes """ - soc, start, end = get_rotation_soc_util(rot_id, this_sched, this_scen) + soc, start, end = get_rotation_soc_util(rot_id, sched, scen) if not rot_only: start = 0 end = -1 diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index ae11889b..3c63c174 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -16,6 +16,7 @@ def setup_logger(conf): """ Setup file and stream logging by config and args arguments :param conf: configuration object + :type conf: ebus_toolbox.optimizer_util.OptimizerConfig :return: logger :rtype: Logger """ @@ -66,7 +67,7 @@ def prepare_filesystem(args, conf): :param conf: configuration :type conf: ebus_toolbox.optimizer_util.OptimizerConfig :param args: Arguments for ebus toolbox - :type args: Namespace object + :type args: Namespace """ now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") args.output_directory = Path(args.output_directory) @@ -89,15 +90,15 @@ def run_optimization(conf, sched=None, scen=None, args=None): :param conf: Configuration object of optimization :type conf: OptimizerConfig :param sched: Simulation schedule containing buses, rotations etc. - :type sched: ebus_toolbox.Schedule + :type sched: ebus_toolbox.schedule.Schedule :param scen: Simulation scenario containing simulation results including the SoC of all vehicles over time :type scen: spice_ev.Scenario :param args: Simulation arguments for manipulation or generated outputs - :type args: object + :type args: Namespace :return: optimized schedule and Scenario - :rtype: tuple(ebus_toolbox.Schedule, spice_ev.Scenario) + :rtype: tuple(ebus_toolbox.schedule.Schedule, spice_ev.Scenario) """ # load pickle files if they are not given as arguments diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index b378c9bf..40f5c8e0 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -49,8 +49,10 @@ def loop(self, **kwargs): greedy arguments :param kwargs: arguments handled by the function and config. + :type kwargs: dict :return: tuple of the dict electrified_stations and the set electrified_station_set in the optimal found case + :rtype: (dict, set) """ node_choice = kwargs.get("node_choice", self.config.node_choice) @@ -213,7 +215,9 @@ def get_negative_rotations_all_electrified(self, rel_soc=False): is electrified :param rel_soc: if true, the start soc is handled like it has the desired deps soc - :return: set of rotation ids which are negative even with all stations electrified + :type rel_soc: bool + :return: rotation ids which are negative even with all stations electrified + :rtype: set """ events = self.get_low_soc_events(rel_soc=rel_soc) @@ -230,14 +234,18 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ """Optimize a single group events and returns the electrified stations and a flag :param group: tuple of events and station_ids to be optimized together + :type group: (list(ebus_toolbox.optimizer_util.LowSocEvent), list(str)) :param choose_station_function: function to be used for choosing the next function + :type choose_station_function: function :param track_not_possible_rots: not possible tracks need to be tracked in the first run - :param pre_optimized_set: set which was optimized before hand used as upper threshold for - optimization + :type track_not_possible_rots: bool + :param pre_optimized_set: stations which were optimized before hand used + as upper threshold for optimization + :type pre_optimized_set: set :param kwargs: internally used functionality - :return: Returns (electrified_stations if optimization continues, None if no further - recursive calls should happen, bool if further deep analysis should take place) - :rtype (dict() or None, bool) + :type kwargs: dict + :return: electrified_stations + :rtype dict :raises AllCombinationsCheckedException: If all combinations have been checked :raises SuboptimalSimulationException: if a suboptimal Simulation has been identified """ @@ -394,10 +402,12 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ @util.time_it def deepcopy_socs(self): + """ Deepcopy of the socs in the scenario""" self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) @util.time_it def copy_scen_sched(self): + """Copy of the base scenario and base schedule""" self.scenario = copy(self.base_scenario) self.schedule = copy(self.base_schedule) @@ -456,9 +466,16 @@ def copy_scen_sched(self): # return charging_events def sort_station_events(self, charge_events_single_station): + """ Sort events by arrival times + :param charge_events_single_station: charge events + :type charge_events_single_station: list + :return: sorted charging events + :rtype: list + """ return sorted(charge_events_single_station, key=lambda x: x.arrival_time) def mutate_events_for_n_charging_points(self, charge_events_single_station, nr_charge_points): + # Filter out charging events if no charging point is available pass # mutate_events_for_n_charging_points() @@ -507,15 +524,21 @@ def mutate_events_for_n_charging_points(self, charge_events_single_station, nr_c @util.time_it def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_upper_thresh=None, electrify_stations=None) -> object: - """ A quick estimation of socs by mutating the soc data according to full electrification. - This means a electrified station has unlimited charging points + """ A quick estimation of socs for after electrifying stations + + The function assumes unlimited charging points per electrified station. :param rotations: Optional if not optimizer.schedule.rotations should be used + :type rotations: dict :param soc_dict: Optional if not optimizer.scenario.vehicle_socs should be used - :param ele_station_set: set to be electrified. Default None leads to using the + :type soc_dict: dict + :param ele_station_set: Stations which are electrified . Default None leads to using the so far optimized optimizer.electrified_station_set + :type ele_station_set: set :param soc_upper_thresh: optional if not optimizer.config.desired_soc_deps is used - :param electrify_stations: dict of stations to be electrified + :type soc_upper_thresh: float + :param electrify_stations: stations to be electrified + :type electrify_stations: set(str) :return: Returns soc dict with lifted socs :rtype dict() """ @@ -588,6 +611,10 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, @util.time_it def expand_tree(self, station_eval): + """ Check which nodes can be reached from the current node + :param station_eval: station evaluation with station names and potential + :type station_eval: list(str, float) + """ try: parent_name = util.stations_hash(self.electrified_station_set) self.current_tree[parent_name] @@ -620,10 +647,14 @@ def is_node_viable(self): def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): """Quickly evaluates if following a branch is promising by summing up estimated potentials - :param station_eval: list of sorted station evaluation with list(station_id, pot) - :param electrified_station_set: set of electrified stations - :param pre_optimized_set: set of already optimized stations + :param station_eval: sorted station evaluation with name and potential of station + :type station_eval: list(str, float) + :param electrified_station_set: electrified stations + :type electrified_station_set: set(str) + :param pre_optimized_set: already optimized stations + :type pre_optimized_set: set(str) :param missing_energy: the amount of energy missing in this branch + :type missing_energy: float :return: is the branch promising :rtype bool """ @@ -644,8 +675,9 @@ def is_branch_promising(self, station_eval, electrified_station_set, def node_to_tree(self, delta_base_energy): """ Fill decision tree with the given info :param delta_base_energy: missing energy + :type delta_base_energy: float :return decision tree - :rtype dict() + :rtype dict """ node_name = util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["missing_energy"] = delta_base_energy @@ -659,12 +691,15 @@ def choose_station_brute(self, station_eval, gens=dict()): """Gives back a possible set of Stations to electrify which shows potential and has not been tried yet. The set of stations is smaller than the best optimized set so far. - - :param station_eval: list of sorted station evaluation with list(station_id, pot) - :param pre_optimized_set: set of optimized stations thus far + :param station_eval: sorted station evaluation with names and potential + :type station_eval list(str, float) + :param pre_optimized_set: optimized stations thus far + :type pre_optimized_set: set :param missing_energy: missing energy in this branch before electrification - :param gens: dict of generators for brute force generation - :return: combination of stations or None if no viable stations exists and + :type missing_energy: float + :param gens: generators for brute force generation + :type gens: dict + :return: combination of stations to electrify and false since this function does not support recursive calling :raises AllCombinationsCheckedException: If all combinations have been checked """ @@ -704,11 +739,13 @@ def choose_station_step_by_step(self, station_eval, and has not been picked before. - :param station_eval: list of sorted station evaluation with list(station_id, pot) - :param pre_optimized_set: set of optimized stations thus far + :param station_eval: sorted station evaluation with names and potential + :type station_eval list(str, float) + :param pre_optimized_set: optimized stations thus far + :type pre_optimized_set: set :param missing_energy: missing energy in this branch before electrification - :return:a station to electrify or None if no viable stations exists and - false since this function does not support recursive calling + :type missing_energy: float + :return:a station to electrify and True since this function needs recursive calling :raises SuboptimalSimulationException: if a suboptimal Simulation has been identified """ @@ -771,6 +808,7 @@ def set_battery_and_charging_curves(self): def set_up_decision_tree(self, group_amount): """ Load decision tree if given in the config :param group_amount: amount of groups for decision tree + :type group_amount: int """ if self.config.decision_tree_path is not None: with open(self.config.decision_tree_path, "rb") as file: @@ -781,7 +819,8 @@ def set_up_decision_tree(self, group_amount): def rebase_spice_ev(self): """ Rebase the scenario meaning configuring various variables according to the input data and running a SpiceEV simulation - :return: must_include_set and dict of electrified_stations + :return: must_include_set and electrified_stations + :rtype: (set,dict) """ self.logger.debug("Rebasing Scenario") must_include_set, ele_stations = self.preprocessing_scenario( @@ -798,7 +837,8 @@ def rebase_spice_ev(self): def rebase_simple(self): """ Rebase the scenario meaning configuring various variables according to the input data - :return: must_include_set and dict of electrified_stations + :return: must_include_set and electrified_stations + :rtype: (set,dict) """ must_include_set = set() # electrify inclusion stations @@ -812,11 +852,13 @@ def rebase_simple(self): def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): """Prepare scenario and run schedule - :param electrified_stations: optional dict of electrified stations to use in simulation. + :param electrified_stations: optional electrified stations to use in simulation. Default None leads to using optimizer.electrified_stations + :type electrified_stations: dict :param run_only_neg: should only negative rotations be simulated + :type run_only_neg: bool :return: schedule, scenario, electrified_station_set, electrified_stations - :rtype (schedule.Schedule, scenario.Scenario, set(), dict()) + :rtype (ebus_toolbox.schedule.Schedule, spice_ev.Scenario, set, dict) """ if electrified_stations is None: electrified_stations = self.electrified_stations @@ -846,7 +888,9 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): def electrify_station(self, stat, electrified_set): """Electrify a station and keep track of it in the electrified set file :param stat: station id to be electrified - :param electrified_set:the set that is mutated along the electrification + :param stat: str + :param electrified_set: the group of stations which is mutated along the optimization + :type electrified_set: set(str) """ self.electrified_stations[stat] = self.config.standard_opp_station electrified_set.add(stat) @@ -873,7 +917,9 @@ def get_critical_stations_and_rebase(self, relative_soc=False): it is a critical station. :param relative_soc: should the evaluation use the relative or absolute soc - :return: Set(Station_ids) + :param relative_soc: bool + :return: Group of stations which have to be part of a fully electrified system + :rtype: set(str) """ events = self.get_low_soc_events(rel_soc=relative_soc) @@ -933,7 +979,10 @@ def get_rotation_soc(self, rot_id, soc_data: dict = None): def get_index_by_time(self, search_time: datetime): """Get the index for a given time. :param search_time: The time for which to return the index as datetime object - :return: the time corresponding to the given index. + :type search_time: datetime + :return: the index corresponding to the time. In case there is no exact match, the index + before is given. + :rtype int """ return util.get_index_by_time(self.scenario, search_time) @@ -943,9 +992,13 @@ def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): the start and end idx :param rot: The rotation object containing the trips. - :param start_idx: The start index, representing the start time. - :param end_idx:self The end index, representing the end time. - :return: A list of trip objects that arrive between the start and end time. + :type rot: ebus_toolbox.rotation.Rotation + :param start_idx: start index, representing the start time. + :type start_idx: int + :param end_idx: end index, representing the end time. + :type end_idx: int + :return: trips that arrive between the start and end time. + :rtype: list(ebus_toolbox.trip.Trip) """ start_time_event = self.get_time_by_index(start_idx) @@ -963,6 +1016,7 @@ def get_time_by_index(self, idx): """Get the time for a given index. :param idx: The index for which to return the time. + :type idx: int :return: the time corresponding to the given index. """ @@ -979,8 +1033,10 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, :param rotations: rotations to be searched for low soc events. Default None means whole schedule is searched + :type rotations: dict :param filter_standing_time: Should the stations be filtered by standing time. True leads to - an output only stations with charging potential + an output with only stations with charging potential + :type filter_standing_time: bool :param rel_soc: Defines if the start soc should be seen as full even when not. i.e. a drop from a rotation start soc from 0.1 to -0.3 is not critical since the start soc from the rotation will be raised @@ -988,9 +1044,11 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, is false, it means coupled rotations might be prone to errors due to impossible lifts. :param soc_data: soc data to be used. Default None means the soc data from the optimizer scenario is used + :type soc_data: dict :param kwargs: optional soc_lower_thresh or soc_upper_thresh if from optimizer differing values should be used - :return: list(LowSocEvents) + :return: low soc events + :rtype: list(ebus_toolbox.optimizer_util.LowSocEvent) """ if not rotations: rotations = self.schedule.rotations From 0923ebe7dc17461611a5c5dc6411bab3bd49527b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 28 Feb 2023 14:48:27 +0100 Subject: [PATCH 589/802] Add eps parameter and warning for charging curve creation --- ebus_toolbox/optimizer_util.py | 51 +++++++++++++++++++++++-------- ebus_toolbox/station_optimizer.py | 2 +- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 0d266b4b..b58a85a7 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -1,5 +1,6 @@ """ Module for the class LowSocEvent which gathers functionality around LowSocEvents, like evaluating them, gathering them and so on""" +import logging import math import os from pathlib import Path @@ -99,6 +100,7 @@ def __init__(self): self.path = None self.pruning_threshold = None self.save_all_results = None + self.eps = None def time_it(function, timers={}): @@ -189,6 +191,7 @@ def read_config(config_path): conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", "rebased_" + datetime.now().isoformat(sep='-', timespec='seconds')) conf.opt_type = optimizer.get("opt_type", "greedy") + conf.eps = optimizer.getfloat("eps", 0.0001) conf.remove_impossible_rotations = optimizer.getboolean("remove_impossible_rotations", False) conf.node_choice = optimizer.get("node_choice", "step-by-step") conf.max_brute_loop = optimizer.getint("max_brute_loop", 20) @@ -408,7 +411,8 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr First it creates a simple list of station sets for single events. They are connected if they share possible stations. - Electrified and other not possible to electrify stations should not connect groups + Electrified and non-electrifiable stations are ignored, i.e. will not show up as possible + station :param events: events for a given state of a scenario :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) @@ -429,11 +433,10 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr if could_not_be_electrified is None: could_not_be_electrified = set() - possible_stations = [ - {station for station in event.stations if station not in impossible_stations} - for event - in events] - # if stations overlap join them + possible_stations = \ + [{station for station in event.stations if station not in impossible_stations} + for event in events] + # if station sets have intersections they are returned as single set station_subsets = join_all_subsets(possible_stations) event_groups = [[] for __ in range(len(station_subsets))] @@ -451,7 +454,7 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr if optimizer: optimizer.logger.warning('Did not find rotation %s in any subset' 'of possible electrifiable stations', event.rotation.id) - # this event will no show up in an event_group. + # this event will not show up in an event_group. # therefore it needs to be put into this set could_not_be_electrified.update([event.rotation.id]) @@ -472,15 +475,18 @@ def join_all_subsets(subsets): def join_subsets(subsets: typing.Iterable[set]): - """ Run through every subset and check with every other subset if there is an intersection - If an intersection is found. The subsets are joined and returned with a boolean of True. - If not intersection is found over all subsets False is returned which will cancel the outer + """ Run through subsets and return their union, if they have an intersection + + Run through every subset and check with every other subset if there is an intersection + If an intersection is found, the subsets are joined and returned with a boolean of True. + If no intersection is found over all subsets False is returned which will cancel the outer call in join_all_subsets :param subsets: sets to be joined :type subsets: iterable :return: boolean if joining subsets is finished (i.e. False if all subsets are connected - and thus far connected subsets + and thus far connected subsets) + :rtype: (bool,list(set)) """ subsets = [s.copy() for s in subsets] for i in range(len(subsets)): @@ -522,9 +528,14 @@ def toolbox_to_pickle(name, sched, scen, args): def charging_curve_to_soc_over_time(charging_curve, capacity, args, max_charge_from_grid=float('inf'), - time_step=0.1, efficiency=1): + time_step=0.1, efficiency=1, eps=0.001, + logger: logging.Logger = None): """ create charging curve as nested list of SOC, Power[kW] and capacity in [kWh] + :param logger: logger + :type logger: logging.Logger + :param eps: smallest normalized power, where charging curve will stop + :type eps: float :param charging_curve: the charging curve with power over soc :type charging_curve: list(float,float) :param capacity: capacity of the vehicle @@ -547,6 +558,14 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, socs = [] times = [] final_value = args.desired_soc_opps + + starting_power = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) + if starting_power <= 0: + times.append(charge_time) + socs.append(soc) + return np.array((times, socs)).T + while soc < args.desired_soc_opps: times.append(charge_time) socs.append(soc) @@ -559,7 +578,13 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, delta_soc = time_step / 60 * power soc += delta_soc charge_time += time_step - if args.desired_soc_opps-soc < 0.0001 and delta_soc < 1e-10: + if power/starting_power < eps: + if logger: + warnings.warn("charging_curve_to_soc_over_time stopped early") + logger.warning("charging_curve_to_soc_over_time stopped early," + "because the charging power of %s was to low for eps: %s" + "at an soc of %s an a desired soc of %s", + power, eps, soc, args.desired_soc_opps) final_value = soc break # fill the soc completely in last time step diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 40f5c8e0..56190ef8 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -906,7 +906,7 @@ def create_charging_curves(self): soc_charge_curve_dict[name][ch_type] = util.charging_curve_to_soc_over_time( data["charging_curve"], data["capacity"], self.args, self.schedule.cs_power_opps, efficiency=self.config.charge_eff, - time_step=0.1) + time_step=0.1, eps=self.config.eps) self.soc_charge_curve_dict = soc_charge_curve_dict @util.time_it From ebe9d820f3990f1fbfa33216d587620b27f0735c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 1 Mar 2023 13:27:27 +0100 Subject: [PATCH 590/802] Resolve PR issues --- ebus_toolbox/optimizer_util.py | 42 +-- ebus_toolbox/station_optimization.py | 30 +- ebus_toolbox/station_optimizer.py | 391 +++++++++++---------------- tests/test_station_optimization.py | 6 +- 4 files changed, 198 insertions(+), 271 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index b58a85a7..46869da9 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -104,8 +104,8 @@ def __init__(self): def time_it(function, timers={}): - """decorator function to time the duration function calls - take and count how often they happen + """Decorator function to time the duration and number of function calls + :param function: function do be decorated :type function: function :param timers: storage for cumulated time and call number @@ -136,6 +136,7 @@ def decorated_function(*this_args, **kwargs): def read_config(config_path): """ Read the config path to a config object + :param config_path: path to file :type config_path: str :return: configuration @@ -235,8 +236,9 @@ def get_charging_time(trip1, trip2, args): def get_charging_start(trip1, args): - """ Returns the possible start time of charging considering buffer times before charging - can take place + """ Returns the possible start time of charging + + This function considers the buffer times before charging can take place :param trip1: trip to be checked :type trip1: ebus_toolbox.trip.Trip @@ -278,6 +280,7 @@ def get_index_by_time(scenario, search_time): def get_rotation_soc_util(rot_id, schedule, scenario, soc_data: dict = None): """Returns the soc time series with start and end index for a given rotation id + :param rot_id: rotation_id :type rot_id: str :param schedule: schedule containing rotation information @@ -343,9 +346,11 @@ class AllCombinationsCheckedException(Exception): @time_it def evaluate(events: typing.Iterable[LowSocEvent], optimizer: 'StationOptimizer', **kwargs): - """Analyse stations for "helpful" energy supply. Energy supply is helpful if the minimal soc of - an event is raised (up to a minimal soc (probably zero)). The supplied energy is approximated - by loading power, standing time at a station, soc at station and minimal soc of the event + """Analyse stations for useful energy supply. + + Energy supply is helpful if the minimal soc of an event is raised (up to a minimal soc + (probably zero)). The supplied energy is approximated by charging power, standing time at a + station, soc at station and minimal soc of the event. :param events: events to be evaluated :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) @@ -464,9 +469,11 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr def join_all_subsets(subsets): """ join sets for as long as needed until no elements share any intersections + :param subsets: sets to be joined :type subsets: iterable :return: joined subsets if they connect with other subsets in some way + :rtype: list(set) """ joined_subset = True while joined_subset: @@ -484,8 +491,7 @@ def join_subsets(subsets: typing.Iterable[set]): :param subsets: sets to be joined :type subsets: iterable - :return: boolean if joining subsets is finished (i.e. False if all subsets are connected - and thus far connected subsets) + :return: status if joining subsets is finished and the current list of connected subsets :rtype: (bool,list(set)) """ subsets = [s.copy() for s in subsets] @@ -530,7 +536,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, max_charge_from_grid=float('inf'), time_step=0.1, efficiency=1, eps=0.001, logger: logging.Logger = None): - """ create charging curve as nested list of SOC, Power[kW] and capacity in [kWh] + """Create charging curve as np.array with soc and time as two columns of an np.array :param logger: logger :type logger: logging.Logger @@ -548,7 +554,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, :type time_step: float :param efficiency: efficiency of charging :type efficiency: float - :return: soc over time with n values + :return: soc and time with n values each :rtype: np.array of shape (n, 2) """ # simple numeric creation of power over time --> to energy over time @@ -595,6 +601,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, def get_missing_energy(events): """ Sum up all the missing energies of the given events + :param events: events to be checked :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) :return: missing energy @@ -608,18 +615,21 @@ def get_missing_energy(events): def stations_hash(stations_set): """ Create a simple str as hash for a set of stations + :param stations_set: stations to be hashed :type stations_set: set :return: hash :rtype: str """ - return str(sorted(list(stations_set))) + return str(sorted(stations_set)) def combination_generator(iterable: typing.Iterable, amount: int): - """ Generator which yields all possible combinations of choosing - an amount out of an iterable without putting them back and without caring about the - order of elements + """ Yields all combinations of choosing an amount, without putting back and without order + + Generator which yields all possible combinations of choosing an amount out of an iterable + without putting them back and without caring about the order of elements + :param iterable: Any collection which can be cast to a list :rtype iterable: iterable :param amount: Number of elements which should be drawn from iterable @@ -709,7 +719,7 @@ def run_schedule(sched, args, electrified_stations=None): with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) if "pytest" not in sys.modules: - # do not print output from SpiceEV to reduce clutter. Don't do it in testing + # do not print output from SpiceEV to reduce clutter. Do not do it in testing # since it produces errors sys.stdout = open(os.devnull, 'w') new_scen.run('distributed', vars(args).copy()) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 3c63c174..f5c1033b 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -9,12 +9,13 @@ import logging import shutil import ebus_toolbox.station_optimizer -from ebus_toolbox.station_optimizer import util -config = util.OptimizerConfig() +from ebus_toolbox.station_optimizer import opt_util +config = opt_util.OptimizerConfig() def setup_logger(conf): """ Setup file and stream logging by config and args arguments + :param conf: configuration object :type conf: ebus_toolbox.optimizer_util.OptimizerConfig :return: logger @@ -50,11 +51,11 @@ def setup_logger(conf): def main(): """ main call""" - print(util.get_time()) + print(opt_util.get_time()) config_path = "./data/examples/default_optimizer.cfg" - conf = util.read_config(config_path) + conf = opt_util.read_config(config_path) opt_sched, opt_scen = run_optimization(conf) - print(util.get_time()) + print(opt_util.get_time()) import pickle with open("schedule_opt.pickle", "wb") as f: pickle.dump(opt_sched, f) @@ -64,6 +65,7 @@ def main(): def prepare_filesystem(args, conf): """ Prepare files and folders in the optimization results folder + :param conf: configuration :type conf: ebus_toolbox.optimizer_util.OptimizerConfig :param args: Arguments for ebus toolbox @@ -104,9 +106,9 @@ def run_optimization(conf, sched=None, scen=None, args=None): # load pickle files if they are not given as arguments if sched is None or scen is None or args is None: # either all optional arguments are given or none are - assert sched == scen == args is None - sched, scen, args = util.toolbox_from_pickle(conf.schedule, - conf.scenario, conf.args) + assert sched == scen == args is None, "To optimize from .pickle files, schedule," \ + "scenario and arguments need to be provided together" + sched, scen, args = opt_util.toolbox_from_pickle(conf.schedule, conf.scenario, conf.args) # setup folders, paths and copy config prepare_filesystem(args, conf) @@ -132,19 +134,19 @@ def run_optimization(conf, sched=None, scen=None, args=None): assert len(sched.rotations) > 0, "Removing depot chargers led to a schedule without any " \ "rotations." - # rebasing the scenario meaning simulating it again with the given conditions of + # rebasing the scenario meaning simulating it again with SpiceEV and the given conditions of # included stations, excluded stations, filtered rotations and changed battery sizes if conf.rebase_scenario: must_include_set, ele_stations = optimizer.rebase_spice_ev() else: - # no new SpiceEV calculation will take place but some variables need to be adjusted. + # no new SpiceEV simulation will take place, but some variables need to be adjusted must_include_set, ele_stations = optimizer.rebase_simple() # create charging dicts which contain soc over time, which is numerically calculated optimizer.create_charging_curves() # remove none values from socs in the vehicle_socs - optimizer.remove_none_socs() + optimizer.replace_socs_from_none_to_value() # all stations electrified: are there still negative rotations? if conf.remove_impossible_rotations: @@ -176,7 +178,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.debug("These rotations could not be electrified: %s", optimizer.could_not_be_electrified) # remove none values from socs in the vehicle_socs so timeseries_calc can work - optimizer.remove_none_socs() + optimizer.replace_socs_from_none_to_value() vehicle_socs = optimizer.timeseries_calc() @@ -196,8 +198,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) - print("Station optimization finished after " + util.get_time()) - logger.warning("Station optimization finished after %s", util.get_time()) + print("Station optimization finished after " + opt_util.get_time()) + logger.warning("Station optimization finished after %s", opt_util.get_time()) return optimizer.schedule, optimizer.scenario diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 56190ef8..249b9f09 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -6,7 +6,7 @@ from pathlib import Path import numpy as np -import ebus_toolbox.optimizer_util as util +import ebus_toolbox.optimizer_util as opt_util from spice_ev import scenario from ebus_toolbox import rotation, schedule from ebus_toolbox.util import uncomment_json_file @@ -16,7 +16,7 @@ class StationOptimizer: """ Class for station optimization""" def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, - config: 'util.OptimizerConfig', logger: logging.Logger): + config: 'opt_util.OptimizerConfig', logger: logging.Logger): self.base_not_possible_stations = set() self.could_not_be_electrified = set() self.must_include_set = set() @@ -73,10 +73,9 @@ def loop(self, **kwargs): # check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible - groups = \ - util.get_groups_from_events(base_events, self.not_possible_stations, - could_not_be_electrified=self.could_not_be_electrified, - optimizer=self) + groups = opt_util.get_groups_from_events( + base_events, self.not_possible_stations, + could_not_be_electrified=self.could_not_be_electrified, optimizer=self) # storage for the sets of stations which will be generated list_greedy_sets = [set()] * len(groups) @@ -87,7 +86,7 @@ def loop(self, **kwargs): # baseline greedy optimization # base line is created simply by not having a decision tree and not a pre optimized_set yet - print(util.get_time()) + print(opt_util.get_time()) for group_nr, group in enumerate(groups[:]): # unpack the group events, stations = group @@ -118,26 +117,25 @@ def loop(self, **kwargs): self.electrify_station(stat, self.electrified_station_set) return self.electrified_stations, self.electrified_station_set self.logger.warning("Starting deep analysis with mode: %s", self.config.node_choice) - print(util.get_time()) + print(opt_util.get_time()) # from here on only for deep analysis for group_nr, group in enumerate(groups[:]): events, stations = group - sols = [] + solutions = [] self.current_tree = self.decision_trees[group_nr] if node_choice == "brute": choice_func = self.choose_station_brute else: choice_func = self.choose_station_step_by_step - combinations = util.combs_unordered_no_putting_back(len(stations), - len(list_greedy_sets[group_nr]) - 1) + combinations = opt_util.combs_unordered_no_putting_back( + len(stations), len(list_greedy_sets[group_nr]) - 1) self.logger.debug("There are %s combinations with 1 station less than " "the current solution with %s stations out of %s", combinations, len(list_greedy_sets[group_nr]), len(stations)) pre_optimized_set = list_greedy_sets[group_nr] for i in range(self.config.max_brute_loop): - i += 1 if i % 10 == 0: print(len(self.current_tree), " nodes checked") print(f"Optimal solution has length {len(pre_optimized_set)}") @@ -148,54 +146,52 @@ def loop(self, **kwargs): self.schedule = copy(self.base_schedule) self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) - # deep copy of schedule.rotations is very slow. Not needed for - # quick calculation. + # deep copy of schedule.rotations is very slow. Not needed for quick calculation. if self.config.solver == "spiceev": self.schedule.rotations = deepcopy(self.base_schedule.rotations) self.not_possible_stations = self.base_not_possible_stations.copy() # create a new electrified set try: - new_stats = \ - self.group_optimization(group, choice_func, - track_not_possible_rots=False, - pre_optimized_set=pre_optimized_set, - events_remaining=[len(events)], - **kwargs) + new_stats = self.group_optimization( + group, choice_func, track_not_possible_rots=False, + pre_optimized_set=pre_optimized_set, events_remaining=[len(events)], + **kwargs) # The terminal node is checked therefore not viable anymore - node_name = util.stations_hash(self.electrified_station_set) + node_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False self.current_tree[node_name]["completed"] = True - except util.SuboptimalSimulationException: - # exception if the optimization encountered a situation, where it is clear - # that going down the tree further, will not lead to an optimal solution + except opt_util.SuboptimalSimulationException: + # exception if the optimization encountered a dead end, where it is clear + # that this case will not lead to an optimal solution continue - except util.AllCombinationsCheckedException: + except opt_util.AllCombinationsCheckedException: # exception if all combinations in the brute force method are checked or at # least estimated or all nodes show no potential in the step-by-step method - print("all checked") + self.logger.warning("The brute force method checked all possible combinations") break new_electrified_set = self.electrified_station_set - # if a new set was found, print it and save it in sols + # if a new set was found, print it and save it in solutions if new_electrified_set != pre_optimized_set and new_stats is not None: self.logger.warning("Optimized with %s stations %s %s", len(new_electrified_set), str('#' * 20), - util.stations_hash(new_electrified_set)) - sols.append(new_electrified_set) + opt_util.stations_hash(new_electrified_set)) + solutions.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): list_greedy_sets[group_nr] = new_electrified_set.copy() pre_optimized_set = new_electrified_set.copy() else: self.logger.warning(f"Ran all {self.config.max_brute_loop} loops") - # print all solutions with the length of the - self.logger.debug("All solutions for this group: %s", sols) + # print all solutions + self.logger.debug("All solutions for this group: %s", solutions) + # how many stations do these solutions need in comparison to the available stations? self.logger.debug("Optimized with %s stations out of %s", len(pre_optimized_set), len(stations)) - print(util.get_time()) + print(opt_util.get_time()) # saving decision tree only in case of deep analysis if self.config.save_decision_tree: with open(self.config.optimizer_output_dir / Path("decision_tree.pickle"), "wb") as f: @@ -207,7 +203,7 @@ def loop(self, **kwargs): for stat in single_set: self.electrify_station(stat, self.electrified_station_set) # dump the measured running times of the functions - print(util.time_it(None)) + print(opt_util.time_it(None)) return self.electrified_stations, self.electrified_station_set def get_negative_rotations_all_electrified(self, rel_soc=False): @@ -228,7 +224,7 @@ def get_negative_rotations_all_electrified(self, rel_soc=False): new_events = self.get_low_soc_events(soc_data=vehicle_socs) return {event.rotation.id for event in new_events} - @util.time_it + @opt_util.time_it def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, pre_optimized_set=None, **kwargs): """Optimize a single group events and returns the electrified stations and a flag @@ -251,10 +247,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ """ could_not_be_electrified = self.could_not_be_electrified - # in deep analysis not all nodes are visited if they are suboptimal. - # therefore could not be electrified is only important in the first run, where every station - # is possible - if track_not_possible_rots is None: + # could_not_be_electrified only important in first loop, where every station is possible" + if not track_not_possible_rots: + # could_not_be_electrified gets decoupled with optimizer attribute could_not_be_electrified = set() solver = self.config.solver @@ -278,9 +273,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # call above. Important not to use the scenario in optimizer, since it gets overwritten # every call and only relevant trips are adjusted. This leads to problems # when the recursive call goes on a higher level eg. level 0 - level 1 - level 2 - level 1 - station_eval = util.evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) + station_eval = opt_util.evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) - missing_energy = util.get_missing_energy(event_group) + missing_energy = opt_util.get_missing_energy(event_group) if missing_energy >= 0: self.logger.debug("Already electrified: Returning") return self.electrified_stations @@ -295,11 +290,11 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # if the node is the root of the tree, i.e. no electrified stations yet, than all # combinations have been checked if not self.is_node_viable(): - node_name = util.stations_hash(self.electrified_station_set) + node_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False if len(self.electrified_station_set) == 0: - raise util.AllCombinationsCheckedException - raise util.SuboptimalSimulationException + raise opt_util.AllCombinationsCheckedException + raise opt_util.SuboptimalSimulationException # get the best stations, brute or step_by_step best_station_ids, recursive = choose_station_function(station_eval, @@ -317,20 +312,27 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ event_rotations = {event.rotation for event in event_group} - # copy scen and sched + # copy scen and sched from base scenario and base schedule. This way we can be sure + # to have the correct original basis for simulation. If we would not copy, there can be + # unintended, changes in scenario start times for example, since some values do no stay the + # same if we mutate the rotation dictionary and run the scenario. + # This led to problems in the past self.copy_scen_sched() if solver == "quick": - # quick calculation has to electrify everything in one step, - # or the lifting of socs is not correct + # quick calculation has to electrify everything in one step, that is chronologically. + # or the lifting of socs is not correct. + # Since its only adding charge on top of soc time series, electrification that took + # place before in the the optimization but later in the time series in regards to the + # current electrification would show to much charge, since charging curves decrease over + # soc. self.deepcopy_socs() self.scenario.vehicle_socs = self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) else: self.schedule.rotations = rotation_dict - self.schedule, self.scenario = \ - util.run_schedule(self.schedule, self.args, - electrified_stations=self.electrified_stations) + self.schedule, self.scenario = opt_util.run_schedule( + self.schedule, self.args, electrified_stations=self.electrified_stations) kwargs["lifted_socs"] = self.scenario.vehicle_socs.copy() @@ -340,7 +342,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ new_events = self.get_low_soc_events(rotations=event_rotations_ids, rel_soc=True, **kwargs) - delta_energy = util.get_missing_energy(new_events) + delta_energy = opt_util.get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) self.logger.debug("Last electrification electrified %s/%s." " %s remaining events in the base group.", @@ -356,21 +358,20 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # some choice functions might not need a recursive call, they return here. recursive is set # by the choose_station_function if not recursive: - raise util.SuboptimalSimulationException + raise opt_util.SuboptimalSimulationException # check if the events can be divided into subgroups which are independent - groups = util.get_groups_from_events(new_events, self.not_possible_stations, - could_not_be_electrified, - optimizer=self) + groups = opt_util.get_groups_from_events(new_events, self.not_possible_stations, + could_not_be_electrified, + optimizer=self) for k, this_group in enumerate(groups): this_tree = tree_position + [k + 1] kwargs["tree_position"] = this_tree - new_stations = \ - self.group_optimization(this_group, choose_station_function, - track_not_possible_rots=track_not_possible_rots, - pre_optimized_set=pre_optimized_set, - **kwargs) + new_stations = self.group_optimization( + this_group, choose_station_function, + track_not_possible_rots=track_not_possible_rots, + pre_optimized_set=pre_optimized_set, **kwargs) if new_stations is not None: self.electrified_stations.update(new_stations) @@ -389,82 +390,28 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) prune_events = self.get_low_soc_events(rotations=event_rotations_ids, rel_soc=True, **kwargs) - station_eval = util.evaluate(prune_events, self) - prune_missing_energy = util.get_missing_energy(prune_events) + station_eval = opt_util.evaluate(prune_events, self) + prune_missing_energy = opt_util.get_missing_energy(prune_events) if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, prune_missing_energy): self.logger.debug("Branch pruned early") - node_name = util.stations_hash(self.electrified_station_set) + node_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False - raise util.SuboptimalSimulationException + raise opt_util.SuboptimalSimulationException return self.electrified_stations - @util.time_it + @opt_util.time_it def deepcopy_socs(self): """ Deepcopy of the socs in the scenario""" self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) - @util.time_it + @opt_util.time_it def copy_scen_sched(self): """Copy of the base scenario and base schedule""" self.scenario = copy(self.base_scenario) self.schedule = copy(self.base_schedule) -# ToDo implement a fast calculation of timeseries_calc but with a limited amount of charging -# points. Implementation could look like this - -# def get_charge_events_per_station(self, station_name, rotations=None): -# """ Gather low soc events below the config threshold. -# -# :param rotations: rotations to be searched for low soc events. Default None means whole -# schedule is searched -# :param station_name: name of the station to be checked -# :return: list(ChargingEvents) -# """ -# if not rotations: -# rotations = self.schedule.rotations -# -# # Find relevant charging events for this station -# charging_events = [] -# -# for rot_id in rotations: -# rot = self.schedule.rotations[rot_id] -# for i, trip in enumerate(rot.trips): -# # if the trip station name is not the searched station continue. -# if trip.arrival_name != station_name: -# continue -# try: -# charging_event_start_time = util.get_charging_start(trip, self.args) -# end_time = rot.trips[i + 1].departure_time -# -# -# # Do not add the event if there is charging time of at least the defined -# # min charging time -# if charging_event_start_time + self.args.min_charging_time >= end_time: -# continue -# except IndexError: -# warnings.warn("Station to be checked has no following trip. Final destinations" -# "can not offer lift to the soc and are therefore discarded") -# continue -# arrival_time= trip.arrival_time -# start_idx = self.get_index_by_time(charging_event_start_time) -# end_time = rot.trips[i+1].departure_time -# buffer_time = util.get_buffer_time(trip, self.args.default_buffer_time_opps) -# end_idx = self.get_index_by_time(end_time) -# cht = rot.vehicle_id.find("depb") -# ch_type = (cht > 0) * "depb" + (cht <= 0) * "oppb" -# v_type = rot.vehicle_id.split("_" + ch_type)[0] -# event = util.ChargingEvent(start_idx=start_idx,end_idx=end_idx, -# arrival_time=arrival_time, -# start_time=charging_event_start_time, end_time=end_time, -# buffer_time=buffer_time, vehicle_id=rot.vehicle_id, -# capacity=self.schedule.vehicle_types[v_type][ch_type][ -# 'capacity'], -# station_name=station_name, rotation=rot) -# charging_events.append(event) -# return charging_events - def sort_station_events(self, charge_events_single_station): """ Sort events by arrival times :param charge_events_single_station: charge events @@ -474,69 +421,24 @@ def sort_station_events(self, charge_events_single_station): """ return sorted(charge_events_single_station, key=lambda x: x.arrival_time) - def mutate_events_for_n_charging_points(self, charge_events_single_station, nr_charge_points): - # Filter out charging events if no charging point is available - pass - - # mutate_events_for_n_charging_points() - # - # sort_all_station_events() - # - # calculate_events() - # - # get_below_0_soc_events() - # - # get_missing_energy() - # - # evaluate_soc_lift_vs_objective_function() - - # For each possible station find the charging times of each vehicle, e.g - # PotsdamerPlatz: Vehicle1: 12:30-12:40, 13:20-14:00 - # Vehicle5: 9:30-9:40, 13:10-13:25 - # For each station sort the events accordingly, e.g. - # Step 1 - # PotsdamerPlatz: 9:30-9:40 Vehicle5 - # 12:30-12:40 Vehicle1 - # 13:10-13:25 Vehicle5 - # 13:20-14:00 Vehicle1 - # For a number of charging points mutate the events, e.g. 2 charging points - # - # Step2 - # PotsdamerPlatz: 9:30-9:40 Vehicle5 - # 12:30-12:40 Vehicle1 - # 13:10-13:25 Vehicle5 - # 13:20-14:00 Vehicle1 - # or 1 charging point - # PotsdamerPlatz: 9:30-9:40 Vehicle5 - # 12:30-12:40 Vehicle1 - # 13:10-13:25 Vehicle5 - # 13:25-14:00 Vehicle1 - # do this for every station - # Step 3 - # Sort all events of all stations by time - # PotsdamerPlatz: 9:30-9:40 Vehicle5 - # Hauptbahnhof: 9:35-9:45 - # ... - # go through events and lift the socs according to timeseries_calc - # check if socs are clipped. if so mutate the event time and repeat step2 and 3. - # go further - - @util.time_it + @opt_util.time_it def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, - soc_upper_thresh=None, electrify_stations=None) -> object: + soc_upper_threshold=None, electrify_stations=None) -> object: """ A quick estimation of socs for after electrifying stations The function assumes unlimited charging points per electrified station. :param rotations: Optional if not optimizer.schedule.rotations should be used - :type rotations: dict + :type rotations: iterable :param soc_dict: Optional if not optimizer.scenario.vehicle_socs should be used :type soc_dict: dict :param ele_station_set: Stations which are electrified . Default None leads to using the so far optimized optimizer.electrified_station_set :type ele_station_set: set - :param soc_upper_thresh: optional if not optimizer.config.desired_soc_deps is used - :type soc_upper_thresh: float + :param soc_upper_threshold: Optional upper threshold for the soc. Default value is + config.desired_soc_deps. This value clips charging so no socs above this value are + reached + :type soc_upper_threshold: float :param electrify_stations: stations to be electrified :type electrify_stations: set(str) :return: Returns soc dict with lifted socs @@ -549,8 +451,8 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_dict = self.scenario.vehicle_socs if ele_station_set is None: ele_station_set = self.electrified_station_set - if not soc_upper_thresh: - soc_upper_thresh = self.args.desired_soc_deps + if not soc_upper_threshold: + soc_upper_threshold = self.args.desired_soc_deps if electrify_stations is None: electrify_stations = set() @@ -568,15 +470,18 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, for i, trip in enumerate(rot.trips): if trip.arrival_name not in ele_stations: continue - idx = util.get_index_by_time(self.scenario, trip.arrival_time) + idx = opt_util.get_index_by_time(self.scenario, trip.arrival_time) try: - standing_time_min = util.get_charging_time(trip, rot.trips[i + 1], self.args) + standing_time_min = opt_util.get_charging_time( + trip, rot.trips[i + 1], self.args) except IndexError: standing_time_min = 0 - d_soc = util.get_delta_soc(soc_over_time_curve, soc[idx], standing_time_min, self) - buffer_idx = int((util.get_buffer_time(trip, self.args.default_buffer_time_opps)) - / timedelta(minutes=1)) + d_soc = opt_util.get_delta_soc( + soc_over_time_curve, soc[idx], standing_time_min, self) + buffer_idx = int( + (opt_util.get_buffer_time(trip, self.args.default_buffer_time_opps)) + / timedelta(minutes=1)) delta_idx = int(standing_time_min) + 1 old_soc = soc[idx + buffer_idx:idx + buffer_idx + delta_idx].copy() soc[idx + buffer_idx:] += d_soc @@ -587,7 +492,7 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_pre = soc[:idx] soc = soc[idx:] soc_max = np.max(soc) - while soc_max > soc_upper_thresh: + while soc_max > soc_upper_threshold: # descending array desc = np.arange(len(soc), 0, -1) # gradient of soc i.e. positive if charging negative if discharging @@ -603,38 +508,38 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc[idc_loc_max:] = soc[idc_loc_max:] - (soc_max - 1) # capping everything before local maximum - soc[:idc_loc_max][soc[:idc_loc_max] > 1] = soc_upper_thresh + soc[:idc_loc_max][soc[:idc_loc_max] > 1] = soc_upper_threshold soc_max = np.max(soc) soc = np.hstack((soc_pre, soc)) soc_dict[rot.vehicle_id] = soc return soc_dict - @util.time_it + @opt_util.time_it def expand_tree(self, station_eval): """ Check which nodes can be reached from the current node :param station_eval: station evaluation with station names and potential :type station_eval: list(str, float) """ try: - parent_name = util.stations_hash(self.electrified_station_set) + parent_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[parent_name] except KeyError: self.current_tree[parent_name] = get_init_node() for stat, ev_score in station_eval: - node_name = util.stations_hash(self.electrified_station_set.union([stat])) + node_name = opt_util.stations_hash(self.electrified_station_set.union([stat])) self.current_tree[parent_name]["children"].add(node_name) try: self.current_tree[node_name] except KeyError: self.current_tree[node_name] = get_init_node() - @util.time_it + @opt_util.time_it def is_node_viable(self): """Check if a node has viable children. Viable children are not terminal and did not show lack of potential yet :return: True if the node still has potential """ - parent_name = util.stations_hash(self.electrified_station_set) + parent_name = opt_util.stations_hash(self.electrified_station_set) for child in self.current_tree[parent_name]["children"]: if not self.current_tree[child]["viable"]: continue @@ -643,7 +548,7 @@ def is_node_viable(self): # not a single viable node was found, return False return False - @util.time_it + @opt_util.time_it def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): """Quickly evaluates if following a branch is promising by summing up estimated potentials @@ -660,6 +565,8 @@ def is_branch_promising(self, station_eval, electrified_station_set, """ delta = len(pre_optimized_set) - len(electrified_station_set) + if delta < 0: + return False pot = 0 # sum up highest potentials until you would reach the number of electrified stations # in the pre optimized case @@ -668,7 +575,7 @@ def is_branch_promising(self, station_eval, electrified_station_set, if pot < -missing_energy * self.config.estimation_threshold: self.logger.debug("Not enough potential: %s after: %s ", round(pot / -missing_energy, 0), - util.stations_hash(electrified_station_set)) + opt_util.stations_hash(electrified_station_set)) return False return True @@ -679,13 +586,13 @@ def node_to_tree(self, delta_base_energy): :return decision tree :rtype dict """ - node_name = util.stations_hash(self.electrified_station_set) + node_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["missing_energy"] = delta_base_energy self.current_tree[node_name]["visit_counter"] += 1 if self.current_tree[node_name]["visit_counter"] > 1: self.logger.debug("already visited this node") - @util.time_it + @opt_util.time_it def choose_station_brute(self, station_eval, pre_optimized_set=None, missing_energy=0, gens=dict()): @@ -708,15 +615,14 @@ def choose_station_brute(self, station_eval, try: generator = gens[str(station_ids) + str(len(pre_optimized_set) - 1)] except KeyError: - generator = util.combination_generator(station_ids, len(pre_optimized_set) - 1) + generator = opt_util.combination_generator(station_ids, len(pre_optimized_set) - 1) gens[str(station_ids) + str(len(pre_optimized_set) - 1)] = generator station_eval_dict = {stat[0]: stat[1] for stat in station_eval} for comb in generator: - node_name = util.stations_hash(comb) + node_name = opt_util.stations_hash(comb) if node_name not in self.current_tree: - # only check the brute force station if they have the remote chance of fulfilling - # the missing energy - # potential>missing energy * 80% + # only check the combination of stations if they have the remote chance of + # fulfilling the missing energy. The default for the estimation_threshold is 80% potential = sum([station_eval_dict[stat] for stat in comb]) if potential > -missing_energy * self.config.estimation_threshold: self.current_tree[node_name] = get_init_node() @@ -729,10 +635,10 @@ def choose_station_brute(self, station_eval, except KeyError: self.current_tree[node_name] = get_init_node() self.current_tree[node_name]["viable"] = False - self.logger.debug("calculated all viable possibilities") - raise util.AllCombinationsCheckedException + self.logger.debug("Calculated all viable possibilities") + raise opt_util.AllCombinationsCheckedException - @util.time_it + @opt_util.time_it def choose_station_step_by_step(self, station_eval, pre_optimized_set=None, missing_energy=0): """ Gives back a station of possible stations to electrify which shows the biggest potential @@ -749,30 +655,25 @@ def choose_station_step_by_step(self, station_eval, :raises SuboptimalSimulationException: if a suboptimal Simulation has been identified """ - # filter functions to stop simulating cases which have no hope of being optimal. - # if in optimization mode, optimization can break if station amount is superseded - # this filter is done better by the next - # if pre_optimized_set is not None: - # if len(electrified_station_set)>len(pre_optimized_set): - # return pre_optimized_set - # potentials have to be at least as promising as the pre-optimized case + # filter function to stop simulating cases which have no hope of being optimal. + # potentials have to be at least as promising as the pre-optimized case. if pre_optimized_set is not None: if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, missing_energy): # best station id is none and do not go deeper in recursion - node_name = util.stations_hash(self.electrified_station_set) + node_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False - raise util.SuboptimalSimulationException + raise opt_util.SuboptimalSimulationException min_nr_visited = float('inf') - # find the lowes amount of visits in the possible stations / children + # find the lowest amount of visits in the possible stations / children # not viable stations are skipped for stat_tuple in station_eval: station, _ = stat_tuple # create a station combination from already electrified # stations and possible new stations stats = self.electrified_station_set.union([station]) - node_name = util.stations_hash(stats) + node_name = opt_util.stations_hash(stats) if not self.current_tree[node_name]["viable"]: continue min_nr_visited = min(min_nr_visited, self.current_tree[node_name]["visit_counter"]) @@ -783,17 +684,19 @@ def choose_station_step_by_step(self, station_eval, # create a station combination from already electrified stations # and possible new station stats = self.electrified_station_set.union([station]) - node_name = util.stations_hash(stats) + node_name = opt_util.stations_hash(stats) if not self.current_tree[node_name]["viable"]: continue - if self.current_tree[util.stations_hash(stats)]["visit_counter"] == min_nr_visited: + if self.current_tree[opt_util.stations_hash(stats)]["visit_counter"] == min_nr_visited: best_station_id = station return [best_station_id], True - node_name = util.stations_hash(self.electrified_station_set) + # not a single children node was deemed viable. Therefore the current node itself can not be + # viable + node_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False - raise util.SuboptimalSimulationException + raise opt_util.SuboptimalSimulationException def set_battery_and_charging_curves(self): """ Set battery and charging curves from config @@ -807,6 +710,7 @@ def set_battery_and_charging_curves(self): def set_up_decision_tree(self, group_amount): """ Load decision tree if given in the config + :param group_amount: amount of groups for decision tree :type group_amount: int """ @@ -817,8 +721,9 @@ def set_up_decision_tree(self, group_amount): self.decision_trees = [{} for _ in range(group_amount)] def rebase_spice_ev(self): - """ Rebase the scenario meaning configuring various variables according to the input data - and running a SpiceEV simulation + """Run SpiceEV simulation with new schedule and parameters. + + Configure various variables according to the input data and run a SpiceEV simulation :return: must_include_set and electrified_stations :rtype: (set,dict) """ @@ -827,8 +732,9 @@ def rebase_spice_ev(self): run_only_neg=self.config.run_only_neg) self.logger.debug("Rebasing finished") if self.config.pickle_rebased: - util.toolbox_to_pickle(self.config.pickle_rebased_name, self.schedule, self.scenario, - self.args) + opt_util.toolbox_to_pickle( + self.config.pickle_rebased_name, self.schedule, self.scenario, self.args) + self.logger.debug("Rebased scenario pickled as %s", self.config.pickle_rebased_name) self.must_include_set = must_include_set @@ -836,7 +742,10 @@ def rebase_spice_ev(self): return must_include_set, ele_stations def rebase_simple(self): - """ Rebase the scenario meaning configuring various variables according to the input data + """ Configure various variables according to the input data + + To configure is these variables, e.g. rebasing, is necessary, so data is consistent between + schedule and scenario :return: must_include_set and electrified_stations :rtype: (set,dict) """ @@ -852,6 +761,7 @@ def rebase_simple(self): def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): """Prepare scenario and run schedule + :param electrified_stations: optional electrified stations to use in simulation. Default None leads to using optimizer.electrified_stations :type electrified_stations: dict @@ -878,8 +788,8 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): r not in self.config.exclusion_rots} self.schedule.rotations = rots - new_sched, new_scen = util.run_schedule(self.schedule, self.args, - electrified_stations) + new_sched, new_scen = opt_util.run_schedule(self.schedule, self.args, + electrified_stations) self.schedule = new_sched self.scenario = new_scen self.must_include_set = must_include_set @@ -887,6 +797,7 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): def electrify_station(self, stat, electrified_set): """Electrify a station and keep track of it in the electrified set file + :param stat: station id to be electrified :param stat: str :param electrified_set: the group of stations which is mutated along the optimization @@ -896,20 +807,22 @@ def electrify_station(self, stat, electrified_set): electrified_set.add(stat) def create_charging_curves(self): - """Cycle through vehicles and create numerically created charging curves with energy - supplied over time """ + """Create charging curves with energy supplied over time for all vehicles + + Cycle through vehicles and create numerically created charging curves with energy + supplied over time, taking efficiencies into consideration """ soc_charge_curve_dict = {} for v_type_name in self.schedule.vehicle_types: soc_charge_curve_dict[v_type_name] = {} for name, v_type in self.schedule.vehicle_types.items(): for ch_type, data in v_type.items(): - soc_charge_curve_dict[name][ch_type] = util.charging_curve_to_soc_over_time( + soc_charge_curve_dict[name][ch_type] = opt_util.charging_curve_to_soc_over_time( data["charging_curve"], data["capacity"], self.args, self.schedule.cs_power_opps, efficiency=self.config.charge_eff, time_step=0.1, eps=self.config.eps) self.soc_charge_curve_dict = soc_charge_curve_dict - @util.time_it + @opt_util.time_it def get_critical_stations_and_rebase(self, relative_soc=False): """ Get the stations that must be electrified and put them into the electrified stations and an extra set of critical stations. @@ -952,7 +865,7 @@ def get_critical_stations_and_rebase(self, relative_soc=False): self.electrify_station(stat, self.must_include_set) return critical_stations - def remove_none_socs(self): + def replace_socs_from_none_to_value(self): """ Removes soc values of None by filling them with the last value which is not None """ # make sure no None values exists in SOCs. Fill later values with last value @@ -974,7 +887,8 @@ def get_rotation_soc(self, rot_id, soc_data: dict = None): :param soc_data: optional soc_data if not the scenario data should be used :return: tuple with soc array, start index and end index """ - return util.get_rotation_soc_util(rot_id, self.schedule, self.scenario, soc_data=soc_data) + return opt_util.get_rotation_soc_util( + rot_id, self.schedule, self.scenario, soc_data=soc_data) def get_index_by_time(self, search_time: datetime): """Get the index for a given time. @@ -984,9 +898,9 @@ def get_index_by_time(self, search_time: datetime): before is given. :rtype int """ - return util.get_index_by_time(self.scenario, search_time) + return opt_util.get_index_by_time(self.scenario, search_time) - @util.time_it + @opt_util.time_it def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): """ Get trips in a rotation from a start to an end index, if the arrival time is in between the start and end idx @@ -1011,7 +925,7 @@ def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): return trips - @util.time_it + @opt_util.time_it def get_time_by_index(self, idx): """Get the time for a given index. @@ -1026,14 +940,14 @@ def get_time_by_index(self, idx): searched_time = start_time + delta_time * idx return searched_time - @util.time_it + @opt_util.time_it def get_low_soc_events(self, rotations=None, filter_standing_time=True, rel_soc=False, soc_data=None, **kwargs): """ Gather low soc events below the config threshold. :param rotations: rotations to be searched for low soc events. Default None means whole schedule is searched - :type rotations: dict + :type rotations: iterable :param filter_standing_time: Should the stations be filtered by standing time. True leads to an output with only stations with charging potential :type filter_standing_time: bool @@ -1126,8 +1040,8 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, else: for ii, trip in enumerate(trips): try: - standing_time_min = util.get_charging_time(trip, trips[ii + 1], - self.args) + standing_time_min = opt_util.get_charging_time(trip, trips[ii + 1], + self.args) except IndexError: standing_time_min = 0 if standing_time_min > 0: @@ -1142,13 +1056,12 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, v_type = rot.vehicle_id.split("_" + ch_type)[0] # with the gathered data create the event object - event = util.LowSocEvent(start_idx=start, end_idx=min_idx, - min_soc=min_soc, stations=possible_stations, - vehicle_id=rot.vehicle_id, trip=trips, - rot=rot, stations_list=possible_stations_list, - capacity=self.schedule.vehicle_types[v_type][ch_type][ - 'capacity'], - v_type=v_type, ch_type=ch_type) + event = opt_util.LowSocEvent( + start_idx=start, end_idx=min_idx, min_soc=min_soc, stations=possible_stations, + vehicle_id=rot.vehicle_id, trip=trips, rot=rot, + stations_list=possible_stations_list, + capacity=self.schedule.vehicle_types[v_type][ch_type]['capacity'], + v_type=v_type, ch_type=ch_type) events.append(event) copy_list = reduced_list.copy() diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index d05b4113..a33ad9ff 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -31,6 +31,7 @@ class TestStationOptimization: def test_basic_run(self, trips_file_name="trips.csv"): """ Check if running a basic example works and if a scenario object is returned + :param trips_file_name: file name of the trips file. Has to be inside the test_input_file folder :type trips_file_name: str @@ -60,8 +61,7 @@ def test_basic_run(self, trips_file_name="trips.csv"): return generated_schedule, scen, args def test_basic_optimization(self): - """ Test the base optimization simply by checking if optimization finishes without - raising errors""" + """ Test if the base optimization finishes without raising errors""" trips_file_name = "trips_for_optimizer.csv" sched, scen, args = self.test_basic_run(trips_file_name) config_path = file_root / "optimizer.cfg" @@ -72,6 +72,7 @@ def test_basic_optimization(self): def test_deep_optimization(self): """ Check if deep analysis finds the prepared optimal solution for the test case. + The Test case is a a 3 star like network with two rotations which are negative without electrification. Rotation 1: @@ -106,6 +107,7 @@ def test_deep_optimization(self): def test_critical_stations_optimization(self, caplog): """ Test if station 2 and 3 are correctly recognized as critical stations + :param caplog: pytest fixture, which is automatically created, to have access to logging data """ From b3fbcd355dcf914fc96defbf1d67e23e2416f1f8 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 1 Mar 2023 13:56:40 +0100 Subject: [PATCH 591/802] Add empty line after first line of docstring --- ebus_toolbox/optimizer_util.py | 55 +++++++++-------- ebus_toolbox/station_optimization.py | 6 +- ebus_toolbox/station_optimizer.py | 92 +++++++++++++++++----------- tests/test_station_optimization.py | 4 +- 4 files changed, 92 insertions(+), 65 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 46869da9..f507a753 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -104,7 +104,7 @@ def __init__(self): def time_it(function, timers={}): - """Decorator function to time the duration and number of function calls + """Decorator function to time the duration and number of function calls. :param function: function do be decorated :type function: function @@ -135,7 +135,7 @@ def decorated_function(*this_args, **kwargs): def read_config(config_path): - """ Read the config path to a config object + """ Read the config path to a config object. :param config_path: path to file :type config_path: str @@ -215,7 +215,7 @@ def read_config(config_path): def get_charging_time(trip1, trip2, args): - """ Returns the charging time in minutes between trips as numeric value/float + """ Returns the charging time in minutes between trips as numeric value/float. :param trip1: first trip :type trip1: ebus_toolbox.trip.Trip @@ -236,7 +236,7 @@ def get_charging_time(trip1, trip2, args): def get_charging_start(trip1, args): - """ Returns the possible start time of charging + """ Returns the possible start time of charging. This function considers the buffer times before charging can take place @@ -263,7 +263,7 @@ def get_buffer_time(trip, default_buffer_time_opps): def get_index_by_time(scenario, search_time): - """ Get the index for a given time + """ Get the index for a given time. In case the time does not coincide with a simulation index the lower index is returned. @@ -279,7 +279,7 @@ def get_index_by_time(scenario, search_time): def get_rotation_soc_util(rot_id, schedule, scenario, soc_data: dict = None): - """Returns the soc time series with start and end index for a given rotation id + """Returns the soc time series with start and end index for a given rotation id. :param rot_id: rotation_id :type rot_id: str @@ -412,7 +412,7 @@ def evaluate(events: typing.Iterable[LowSocEvent], def get_groups_from_events(events, impossible_stations=None, could_not_be_electrified=None, optimizer=None): - """ Create groups from events which need to be optimized together + """ Create groups from events which need to be optimized together. First it creates a simple list of station sets for single events. They are connected if they share possible stations. @@ -468,7 +468,7 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr def join_all_subsets(subsets): - """ join sets for as long as needed until no elements share any intersections + """ Return sets which are joined together if they have any intersections. :param subsets: sets to be joined :type subsets: iterable @@ -482,7 +482,7 @@ def join_all_subsets(subsets): def join_subsets(subsets: typing.Iterable[set]): - """ Run through subsets and return their union, if they have an intersection + """ Run through subsets and return their union, if they have an intersection. Run through every subset and check with every other subset if there is an intersection If an intersection is found, the subsets are joined and returned with a boolean of True. @@ -508,7 +508,7 @@ def join_subsets(subsets: typing.Iterable[set]): def toolbox_to_pickle(name, sched, scen, args): - """ Dump the 3 files to pickle files + """ Dump the 3 files to pickle files. :param name: base name of the files :param sched: schedule @@ -536,7 +536,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, max_charge_from_grid=float('inf'), time_step=0.1, efficiency=1, eps=0.001, logger: logging.Logger = None): - """Create charging curve as np.array with soc and time as two columns of an np.array + """Create charging curve as np.array with soc and time as two columns of an np.array. :param logger: logger :type logger: logging.Logger @@ -600,7 +600,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, def get_missing_energy(events): - """ Sum up all the missing energies of the given events + """ Sum up all the missing energies of the given events. :param events: events to be checked :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) @@ -614,7 +614,7 @@ def get_missing_energy(events): def stations_hash(stations_set): - """ Create a simple str as hash for a set of stations + """ Create a simple str as hash for a set of stations. :param stations_set: stations to be hashed :type stations_set: set @@ -625,7 +625,7 @@ def stations_hash(stations_set): def combination_generator(iterable: typing.Iterable, amount: int): - """ Yields all combinations of choosing an amount, without putting back and without order + """ Yields all combinations of choosing an amount, without putting back and without order. Generator which yields all possible combinations of choosing an amount out of an iterable without putting them back and without caring about the order of elements @@ -651,7 +651,7 @@ def combination_generator(iterable: typing.Iterable, amount: int): def toolbox_from_pickle(sched_name, scen_name, args_name): - """ Load the 3 files from pickle + """Load the 3 files from pickle. :param sched_name: name of schedule file :type sched_name: str @@ -672,9 +672,11 @@ def toolbox_from_pickle(sched_name, scen_name, args_name): def combs_unordered_no_putting_back(n: int, k: int): - """ Returns amount of combinations for pulling k elements out of n, without putting elements - back or looking at the order. this is equal to n over k - :param n: number of elements in the base group + """ Return number of combinations of choosing an amount, without putting back and without order. + + Returns amount of combinations for pulling k elements out of n, without putting elements + back or looking at the order. This is equal to n over k + :param n: number of elements to chose from :type n: int :param k: number of elements in the sub group of picked elements :type k: int @@ -689,7 +691,8 @@ def combs_unordered_no_putting_back(n: int, k: int): def run_schedule(sched, args, electrified_stations=None): - """Run a given schedule and electrify stations if need be + """Run a given schedule and electrify stations if need be. + :param sched: schedule object :type sched: ebus_toolbox.schedule.Schedule :param args: arguments @@ -729,7 +732,9 @@ def run_schedule(sched, args, electrified_stations=None): def preprocess_schedule(sched, args, electrified_stations=None): - """ Prepare the schedule by calculating consumption, setting electrified stations and assigning + """ Calculate consumption, set electrified stations and assign vehicles. + + Prepare the schedule by calculating consumption, setting electrified stations and assigning vehicles :param sched: schedule containing the rotations @@ -754,8 +759,8 @@ def preprocess_schedule(sched, args, electrified_stations=None): def get_time(start=[]): - """Print the time and automatically set start time to the first time the function getting - called + """Prints the time which passed since the first function call. + :param start: start time :type start: list(float) :return: String with seconds which passed since the first call. @@ -769,7 +774,8 @@ def get_time(start=[]): def plot_(data): - """ Simple plot of data without having to create subplots + """ Simple plot of data without having to create subplots. + :param data: data to be plotted :type data: iterable :return: axis of the plot """ @@ -779,7 +785,8 @@ def plot_(data): def plot_rot(rot_id, sched, scen, axis=None, rot_only=True): - """Simple plot of data without having to create subplots + """Simple plot of data without having to create subplots. + :param rot_id: id of the rotation :type rot_id: str :param sched: schedule diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index f5c1033b..8bbc8818 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -14,7 +14,7 @@ def setup_logger(conf): - """ Setup file and stream logging by config and args arguments + """ Setup file and stream logging by config and args arguments. :param conf: configuration object :type conf: ebus_toolbox.optimizer_util.OptimizerConfig @@ -50,7 +50,7 @@ def setup_logger(conf): def main(): - """ main call""" + """ Main call""" print(opt_util.get_time()) config_path = "./data/examples/default_optimizer.cfg" conf = opt_util.read_config(config_path) @@ -64,7 +64,7 @@ def main(): def prepare_filesystem(args, conf): - """ Prepare files and folders in the optimization results folder + """ Prepare files and folders in the optimization results folder. :param conf: configuration :type conf: ebus_toolbox.optimizer_util.OptimizerConfig diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 249b9f09..125aed7a 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -45,8 +45,7 @@ def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, self.schedule.rotations = {rot: sched.rotations[rot] for rot in config.rotations} def loop(self, **kwargs): - """ Loops over every base group with the core of group optimization and handles deep or - greedy arguments + """ Loops recursively over every base group and handles deep or greedy arguments. :param kwargs: arguments handled by the function and config. :type kwargs: dict @@ -207,8 +206,7 @@ def loop(self, **kwargs): return self.electrified_stations, self.electrified_station_set def get_negative_rotations_all_electrified(self, rel_soc=False): - """Get the rotation ids for the rotations which show negative socs, even when everything - is electrified + """Get the ids for the rotations which show negative socs when everything is electrified. :param rel_soc: if true, the start soc is handled like it has the desired deps soc :type rel_soc: bool @@ -227,7 +225,7 @@ def get_negative_rotations_all_electrified(self, rel_soc=False): @opt_util.time_it def group_optimization(self, group, choose_station_function, track_not_possible_rots=True, pre_optimized_set=None, **kwargs): - """Optimize a single group events and returns the electrified stations and a flag + """Optimize a single group events and returns the electrified stations and a flag. :param group: tuple of events and station_ids to be optimized together :type group: (list(ebus_toolbox.optimizer_util.LowSocEvent), list(str)) @@ -403,17 +401,18 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ @opt_util.time_it def deepcopy_socs(self): - """ Deepcopy of the socs in the scenario""" + """ Deepcopy of the socs in the scenario.""" self.scenario.vehicle_socs = deepcopy(self.base_scenario.vehicle_socs) @opt_util.time_it def copy_scen_sched(self): - """Copy of the base scenario and base schedule""" + """Copy of the base scenario and base schedule.""" self.scenario = copy(self.base_scenario) self.schedule = copy(self.base_schedule) def sort_station_events(self, charge_events_single_station): - """ Sort events by arrival times + """ Sort events by arrival times. + :param charge_events_single_station: charge events :type charge_events_single_station: list :return: sorted charging events @@ -424,7 +423,7 @@ def sort_station_events(self, charge_events_single_station): @opt_util.time_it def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, soc_upper_threshold=None, electrify_stations=None) -> object: - """ A quick estimation of socs for after electrifying stations + """ A quick estimation of socs for after electrifying stations. The function assumes unlimited charging points per electrified station. @@ -516,7 +515,8 @@ def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, @opt_util.time_it def expand_tree(self, station_eval): - """ Check which nodes can be reached from the current node + """ Check which nodes can be reached from the current node. + :param station_eval: station evaluation with station names and potential :type station_eval: list(str, float) """ @@ -535,8 +535,11 @@ def expand_tree(self, station_eval): @opt_util.time_it def is_node_viable(self): - """Check if a node has viable children. Viable children are not terminal and did not show + """Check if a node has viable children. + + Viable children are not terminal and did not show lack of potential yet + :return: True if the node still has potential """ parent_name = opt_util.stations_hash(self.electrified_station_set) @@ -551,7 +554,8 @@ def is_node_viable(self): @opt_util.time_it def is_branch_promising(self, station_eval, electrified_station_set, pre_optimized_set, missing_energy): - """Quickly evaluates if following a branch is promising by summing up estimated potentials + """Return if following a branch is promising by summing up estimated potentials. + :param station_eval: sorted station evaluation with name and potential of station :type station_eval: list(str, float) :param electrified_station_set: electrified stations @@ -580,7 +584,8 @@ def is_branch_promising(self, station_eval, electrified_station_set, return True def node_to_tree(self, delta_base_energy): - """ Fill decision tree with the given info + """ Fill decision tree with the given info. + :param delta_base_energy: missing energy :type delta_base_energy: float :return decision tree @@ -596,8 +601,11 @@ def node_to_tree(self, delta_base_energy): def choose_station_brute(self, station_eval, pre_optimized_set=None, missing_energy=0, gens=dict()): - """Gives back a possible set of Stations to electrify which shows potential and has not been + """Return a possible set of stations to electrify which has not been tried yet. + + Gives back a possible set of stations to electrify which shows potential and has not been tried yet. The set of stations is smaller than the best optimized set so far. + :param station_eval: sorted station evaluation with names and potential :type station_eval list(str, float) :param pre_optimized_set: optimized stations thus far @@ -641,9 +649,12 @@ def choose_station_brute(self, station_eval, @opt_util.time_it def choose_station_step_by_step(self, station_eval, pre_optimized_set=None, missing_energy=0): - """ Gives back a station of possible stations to electrify which shows the biggest potential - and has not been picked before. + """ Returns a station of possible stations to electrify which shows the biggest potential. + It checks that this station has not been picked before and the path of electrification is + viable. If all stations have been picked, the minimum amount of picks is determined. From + the group of stations with this number of picks, the one with the highest amount of + potential is chosen. :param station_eval: sorted station evaluation with names and potential :type station_eval list(str, float) @@ -651,7 +662,8 @@ def choose_station_step_by_step(self, station_eval, :type pre_optimized_set: set :param missing_energy: missing energy in this branch before electrification :type missing_energy: float - :return:a station to electrify and True since this function needs recursive calling + :return: a station to electrify and True since this function needs recursive calling + :rtype: str, bool :raises SuboptimalSimulationException: if a suboptimal Simulation has been identified """ @@ -699,7 +711,7 @@ def choose_station_step_by_step(self, station_eval, raise opt_util.SuboptimalSimulationException def set_battery_and_charging_curves(self): - """ Set battery and charging curves from config + """ Set battery and charging curves from config. """ for v_type in self.schedule.vehicle_types.values(): for vehicle in v_type.values(): @@ -709,7 +721,7 @@ def set_battery_and_charging_curves(self): vehicle["charging_curve"] = self.config.charging_curve def set_up_decision_tree(self, group_amount): - """ Load decision tree if given in the config + """ Load decision tree if given in the config. :param group_amount: amount of groups for decision tree :type group_amount: int @@ -742,7 +754,7 @@ def rebase_spice_ev(self): return must_include_set, ele_stations def rebase_simple(self): - """ Configure various variables according to the input data + """ Configure various variables according to the input data. To configure is these variables, e.g. rebasing, is necessary, so data is consistent between schedule and scenario @@ -760,15 +772,15 @@ def rebase_simple(self): return must_include_set, self.electrified_stations def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): - """Prepare scenario and run schedule + """Prepare scenario and run schedule. :param electrified_stations: optional electrified stations to use in simulation. Default None leads to using optimizer.electrified_stations :type electrified_stations: dict :param run_only_neg: should only negative rotations be simulated :type run_only_neg: bool - :return: schedule, scenario, electrified_station_set, electrified_stations - :rtype (ebus_toolbox.schedule.Schedule, spice_ev.Scenario, set, dict) + :return: stations that must be included and stations which are electrified + :rtype (set, dict) """ if electrified_stations is None: electrified_stations = self.electrified_stations @@ -796,7 +808,7 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): return must_include_set, electrified_stations def electrify_station(self, stat, electrified_set): - """Electrify a station and keep track of it in the electrified set file + """Electrify a station and keep track of it in the electrified set file. :param stat: station id to be electrified :param stat: str @@ -807,7 +819,7 @@ def electrify_station(self, stat, electrified_set): electrified_set.add(stat) def create_charging_curves(self): - """Create charging curves with energy supplied over time for all vehicles + """Create charging curves with energy supplied over time for all vehicles. Cycle through vehicles and create numerically created charging curves with energy supplied over time, taking efficiencies into consideration """ @@ -824,10 +836,12 @@ def create_charging_curves(self): @opt_util.time_it def get_critical_stations_and_rebase(self, relative_soc=False): - """ Get the stations that must be electrified and put them into the electrified stations - and an extra set of critical stations. - Electrify every station but one. If without this single station there are below zero events - it is a critical station. + """ Get the stations that must be electrified for full electrification of the system. + + Get the stations that must be electrified for full electrification of the system and put + them into the electrified stations and an extra set of critical stations. + Electrify every station but one. If without this single station there are below zero soc + events it is a critical station. :param relative_soc: should the evaluation use the relative or absolute soc :param relative_soc: bool @@ -866,7 +880,8 @@ def get_critical_stations_and_rebase(self, relative_soc=False): return critical_stations def replace_socs_from_none_to_value(self): - """ Removes soc values of None by filling them with the last value which is not None + """ Removes soc values of None by filling them with the last value which is not None. + """ # make sure no None values exists in SOCs. Fill later values with last value # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] @@ -882,7 +897,8 @@ def replace_socs_from_none_to_value(self): self.scenario.vehicle_socs[v_id] = soc def get_rotation_soc(self, rot_id, soc_data: dict = None): - """ Gets you the soc object with start and end index for a given rotation id + """ Gets you the soc object with start and end index for a given rotation id. + :param rot_id: rotation_id :param soc_data: optional soc_data if not the scenario data should be used :return: tuple with soc array, start index and end index @@ -892,6 +908,7 @@ def get_rotation_soc(self, rot_id, soc_data: dict = None): def get_index_by_time(self, search_time: datetime): """Get the index for a given time. + :param search_time: The time for which to return the index as datetime object :type search_time: datetime :return: the index corresponding to the time. In case there is no exact match, the index @@ -902,8 +919,10 @@ def get_index_by_time(self, search_time: datetime): @opt_util.time_it def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): - """ Get trips in a rotation from a start to an end index, if the arrival time is in between - the start and end idx + """ Return trips from rotation with start to end index. + + Get trips in a rotation from a start to an end index, if the arrival time is in between + the start and end idx :param rot: The rotation object containing the trips. :type rot: ebus_toolbox.rotation.Rotation @@ -927,7 +946,7 @@ def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): @opt_util.time_it def get_time_by_index(self, idx): - """Get the time for a given index. + """Get the time for a given index :param idx: The index for which to return the time. :type idx: int @@ -943,7 +962,7 @@ def get_time_by_index(self, idx): @opt_util.time_it def get_low_soc_events(self, rotations=None, filter_standing_time=True, rel_soc=False, soc_data=None, **kwargs): - """ Gather low soc events below the config threshold. + """ Return low soc events below the config threshold. :param rotations: rotations to be searched for low soc events. Default None means whole schedule is searched @@ -1089,7 +1108,8 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, def get_init_node(): - """ Returns the initialization dictionary / node of the decision tree + """ Returns the initialization dictionary / node of the decision tree. + :return: init node :rtype: dict """ diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index a33ad9ff..14aac219 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -30,7 +30,7 @@ class TestStationOptimization: electrified_stations = json.load(file) def test_basic_run(self, trips_file_name="trips.csv"): - """ Check if running a basic example works and if a scenario object is returned + """ Check if running a basic example works and if a scenario object is returned. :param trips_file_name: file name of the trips file. Has to be inside the test_input_file folder @@ -106,7 +106,7 @@ def test_deep_optimization(self): assert "Station-3" in opt_sched.stations def test_critical_stations_optimization(self, caplog): - """ Test if station 2 and 3 are correctly recognized as critical stations + """ Test if station 2 and 3 are correctly recognized as critical stations. :param caplog: pytest fixture, which is automatically created, to have access to logging data From 5434d172f4948dbba54382a9a8e9a69df61f4e0c Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 6 Mar 2023 11:25:02 +0100 Subject: [PATCH 592/802] Resolve review requests #30 --- data/examples/ebus_toolbox.cfg | 4 ++-- ebus_toolbox/schedule.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index a0908a42..a42616f2 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -59,8 +59,8 @@ ignore_inconsistent_rotations = false ##### SIMULATION CONDITIONS AND BOUNDARIES ##### # rotation filter variable, options: -# exclude: exclude the rotations in the file from the schedule -# include: include only the rotations in the file +# "exclude": exclude the rotations in the file from the schedule +# "include": include only the rotations in the file # null: deactivate function rotation_filter_variable = null diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 96b5abdd..2b718ff8 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -383,7 +383,8 @@ def rotation_filter(self, args, rf_list=None): :param rf_list: rotation filter list with strings of rotation ids (default is None) :type rf_list: list """ - rf_list = [str(i) for i in rf_list] or [] + rf_list = rf_list or [] + rf_list = [str(i) for i in rf_list] if not args.rotation_filter_variable: return if args.rotation_filter_variable and not args.rotation_filter and not rf_list: From 859ce40c52b99e398bdaf053e3157cbc20383bd4 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 7 Mar 2023 11:27:02 +0100 Subject: [PATCH 593/802] make flake8 happy --- ebus_toolbox/simulate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index ebc04b08..79644bdb 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -65,7 +65,7 @@ def simulate(args): schedule.calculate_consumption() # scenario simulated once scenario = schedule.run(args) - + # filter rotations schedule.rotation_filter(args) From 0572c840459aa868660ede78beff7ac466ce43f7 Mon Sep 17 00:00:00 2001 From: Patrick Stecher Date: Tue, 7 Mar 2023 12:38:01 +0100 Subject: [PATCH 594/802] implement #81: default voltage level --- data/examples/ebus_toolbox.cfg | 4 ++++ ebus_toolbox/__main__.py | 4 +++- ebus_toolbox/schedule.py | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 6ccfe068..c37bc2ee 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -82,6 +82,7 @@ min_charging_time = 0 default_buffer_time_opps = 0 + ##### PHYSICAL SETUP OF ENVIRONMENT ##### # minimum fraction of capacity for recharge when leaving the depot. Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) @@ -104,6 +105,9 @@ cs_power_deps_oppb = 150 # define hours of traffic_jam (options are "stop&go" and "dense") #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} +# Default voltage level for charging stations, when not otherwise specified. +# Options: +default_voltage_level = "MV" ########### SPICE_EV SIMULATE PARAMETERS ############### diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index f90c5d49..29e32205 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -115,7 +115,9 @@ parser.add_argument('--level_of_loading_over_day_path', default=None, help="Use csv. data with 'hour' and level_of_loading' columns to set \ level of loading in case they are not in trips.csv") - + parser.add_argument('--default_voltage_level', default=None, + help="Default voltage level for charging stations, \ + when not otherwise specified.") args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config args.ALLOW_NEGATIVE_SOC = True diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index d14d7561..401e1e3f 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -494,6 +494,10 @@ def generate_scenario(self, args): } if gc_name not in grid_connectors: # add one grid connector for each bus station + # if attribute "voltage_level" is not set, use default parameter + if "voltage_level" not in station: + station["voltage_level"] = getattr(args, "default_voltage_level") + grid_connectors[gc_name] = { "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, From 873fa1d6f1c8d653dd4d9f826b9b530f1ef6eb66 Mon Sep 17 00:00:00 2001 From: Patrick Stecher Date: Tue, 7 Mar 2023 12:49:37 +0100 Subject: [PATCH 595/802] added options as comment in config --- data/examples/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index c37bc2ee..0c66984a 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -106,7 +106,7 @@ cs_power_deps_oppb = 150 #rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} # Default voltage level for charging stations, when not otherwise specified. -# Options: +# Options: "LV", "MV", "HV" default_voltage_level = "MV" ########### SPICE_EV SIMULATE PARAMETERS ############### From ab48311036d5558b158a9fa3476ff02c431aedd3 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 7 Mar 2023 13:39:11 +0100 Subject: [PATCH 596/802] minor corrections in config --- data/examples/ebus_toolbox.cfg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index d120a0fb..ec17c80d 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -48,8 +48,8 @@ show_plots = true # Preferred charging type. Options: depb, oppb (default: depb) preferred_charging_type = oppb # Default max power [kW] of grid connectors at depot and opp stations, -# individual gc_power per gc can be defined in electrified stations -# If cs power should not be limited, a very high number should be given (e.g. 100000 = default) +# Individual gc_power per gc can be defined in electrified stations +# For unlimited gc power: set very large value (default: 100000) gc_power_opps = 100000 gc_power_deps = 100000 # Default max power [kW] of charging station at depot and opp stations (default at opps: 300) @@ -65,9 +65,9 @@ desired_soc_opps = 1.0 # Minimum standing time at depot. Between 0 - 1. (default: 1) min_recharge_deps_oppb = 1 min_recharge_deps_depb = 1 -# Min charging time at depots and opp stations ##### minutes ##### (default: 0) +# Min charging time at depots and opp stations in minutes (default: 0) min_charging_time = 0 -# Buffer time [min] at opp station if no specific buffer time is given in electrified_stations.json +# Buffer time in min at opp station if no specific buffer time is given in electrified_stations.json # Time specific buffer times can be set via a dict e.g.: {"10-22": 5, "else": 2} # NOTE: else clause is a MUST! The buffer time is deducted off of the planned standing time. # It may resemble things like delays and/or docking procedures (default: 0) @@ -78,7 +78,7 @@ default_buffer_time_opps = 0 #days = 10 # Set length of timestep in minutes (default: 1) interval = 1 -# Time difference between signal time and actual start time of a vehicle event im min. (default: 10) +# Time difference between signal time and actual start time of a vehicle event in min. (default: 10) signal_time_dif = 10 # Show estimated time to finish simulation after each step. Not recommended for fast computations # (default: false) From 8197755ba16d6146a4c8a69e38342b556e758d15 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Tue, 7 Mar 2023 14:37:48 +0100 Subject: [PATCH 597/802] Add None in argument choices, adjust args #30 --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/__main__.py | 116 +------------------------------ ebus_toolbox/util.py | 120 +++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 116 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index a42616f2..f7ec84c3 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -62,7 +62,7 @@ ignore_inconsistent_rotations = false # "exclude": exclude the rotations in the file from the schedule # "include": include only the rotations in the file # null: deactivate function -rotation_filter_variable = null +rotation_filter_variable = "exclude" # maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 5f432b89..474858bd 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -5,122 +5,8 @@ from datetime import datetime if __name__ == '__main__': - parser = argparse.ArgumentParser( - description='eBus-Toolbox - \ - simulation program for electric bus fleets.') - parser.add_argument('--input-schedule', nargs='?', - help='Path to CSV file containing all trips of schedule to be analyzed.') - parser.add_argument('--mode', default='sim', choices=['sim', 'service_optimization'], - help='Specify what you want to do. Choose one from {sim, \ - service_optimization}. sim runs a single simulation with the given inputs. \ - service optimization finds the largest set of electrified rotations.') - parser.add_argument('--output-directory', default="./data/sim_outputs", nargs='?', - help='Location where all simulation outputs are stored') - parser.add_argument('--preferred-charging-type', '-pct', default='depb', - choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ - from {depb, oppb}. opp stands for opportunity.") - parser.add_argument('--vehicle-types', default="./data/examples/vehicle_types.json", - help='location of vehicle type definitions') - parser.add_argument('--min-recharge-deps-oppb', default=1, - help='Minimum fraction of capacity for recharge when leaving the depot.') - parser.add_argument('--min-recharge-deps-depb', default=1, - help='Minimum fraction of capacity for recharge when leaving the depot.') - parser.add_argument('--check-rotation-consistency', action='store_true', - help='Check rotation assumptions when building schedule.') - parser.add_argument('--ignore-inconsistent-rotations', action='store_true', - help='Remove rotations from schedule that violate assumptions. ') - parser.add_argument('--days', metavar='N', type=int, default=None, - help='set duration of scenario as number of days') - parser.add_argument('--interval', metavar='MIN', type=int, default=15, - help='set number of minutes for each timestep (Δt)') - parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, - help='set minimum desired SOC (0 - 1) for depot charging') - parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=0.8, - help='set minimum desired SOC (0 - 1) for opportunity charging') - parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=None, - help='max power of grid connector at opp stations') - parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=None, - help='max power of grid connector at depot stations') - parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=450, - help='max power of charging station at opp stations') - parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=100, - help='max power of charging station at depot stations for depot busses') - parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, - help='max power of charging station at depot stations for opp busses') - parser.add_argument('--battery', '-b', default=[], nargs=2, type=float, action='append', - help='add battery with specified capacity in kWh and C-rate \ - (-1 for variable capacity, second argument is fixed power))') - parser.add_argument('--seed', default=None, type=int, help='set random seed') - parser.add_argument('--iterations', default=1, type=int, help='iterations for optimization') - parser.add_argument('--include-price-csv', - help='include CSV for energy price. \ - You may define custom options with --include-price-csv-option') - parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), - nargs=2, default=[], action='append', - help='append additional argument to price signals') - parser.add_argument('--start-date', default='2018-01-02', - help='Provide start date of simulation in format YYYY-MM-DD.E.g. ' - '2018-01-31') - parser.add_argument('--electrified-stations', help='include electrified_stations json', - default='data/examples/electrified_stations.json') - parser.add_argument('--cost-calculation', '-cc', action='store_true', - help='Calculate costs') - parser.add_argument('--cost-parameters-file', help='include cost parameters json', default=None) - parser.add_argument('--min-charging-time', help='define minimum time of charging', - default=0) - parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' - 'at opp station to simulate docking procedure.', default=0) - parser.add_argument('--signal-time-dif', help='time difference between signal time and actual ' - 'start time of a vehicle event im min.', - default=10) - parser.add_argument('--visual', '-v', action='store_true', - help='Show plots of the results- not applicable', default=False) - parser.add_argument('--generate-report', '-r', help='generates and stores plots and results', - default=False) - parser.add_argument('--show-plots', - help='opens plots for user to view, only valid if generate_report=True', - default=False) - parser.add_argument('--eta', action='store_true', - help='Show estimated time to finish simulation after each step, \ - instead of progress bar. Not recommended for fast computations.') - parser.add_argument('--save-timeseries', help='Write timesteps to file - not applicable', - default=False) - parser.add_argument('--save-results', help='Write general info to file - not applicable', - default=False) - parser.add_argument('--save-soc', help='Write SOC info to file - not applicable', default=False) - parser.add_argument('--strategy', '-s', default='greedy', - help='Specify the charging strategy. One of {}. You may define \ - custom options with --strategy-option.'.format('greedy, balanced')) - parser.add_argument('--margin', '-m', metavar='X', type=float, default=0.05, - help=('Add margin for desired SOC [0.0 - 1.0].\ - margin=0.05 means the simulation will not abort if vehicles \ - reach at least 95%% of the desired SOC before leaving. \ - margin=1 -> the simulation continues with every positive SOC value.')) - parser.add_argument('--strategy-option', '-so', metavar=('KEY', 'VALUE'), - nargs=2, action='append', - help='Append additional options to the charging strategy.') - parser.add_argument('--config', help='Use config file to set arguments') - parser.add_argument('--station_data_path', help='Use station data to back calculation \ - of consumption with height information of \ - stations') - parser.add_argument('--outside_temperature_over_day_path', default=None, - help="Use csv. data with 'hour' and temperature' columns to set \ - temperatures in case they are not in trips.csv") - parser.add_argument('--level_of_loading_over_day_path', default=None, - help="Use csv. data with 'hour' and level_of_loading' columns to set \ - level of loading in case they are not in trips.csv") - parser.add_argument('--rotation-filter', default=None, - help='Use json data with rotation ids') - parser.add_argument('--rotation-filter-variable', default=None, choices=['include', 'exclude'], - help='set mode for filtering schedule rotations') - - args = parser.parse_args() - # arguments relevant to SpiceEV, setting automatically to reduce clutter in config - args.ALLOW_NEGATIVE_SOC = True - args.attach_vehicle_soc = True - - util.set_options_from_config(args, check=True, verbose=False) + args = util.get_args() args.output_directory = Path(args.output_directory) / ( datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 7771ab9e..71af56bd 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,3 +1,4 @@ +import argparse import json import warnings import subprocess @@ -257,3 +258,122 @@ def nd_interp(input_values, lookup_table): points = new_points return points[0][-1] + + +def get_args(): + parser = argparse.ArgumentParser( + description='eBus-Toolbox - simulation program for electric bus fleets.') + + # #### Paths ##### + parser.add_argument('--input-schedule', nargs='?', + help='Path to CSV file containing all trips of schedule to be analyzed.') + parser.add_argument('--output-directory', default="data/sim_outputs", nargs='?', + help='Location where all simulation outputs are stored') + parser.add_argument('--electrified-stations', help='include electrified_stations json') + parser.add_argument('--vehicle-types', default="data/examples/vehicle_types.json", + help='location of vehicle type definitions') + parser.add_argument('--station_data_path', default=None, + help='Use station data to back calculation of consumption with height\ + information of stations') + parser.add_argument('--outside_temperature_over_day_path', default=None, + help="Use csv. data with 'hour' and temperature' columns to set \ + temperatures in case they are not in trips.csv") + parser.add_argument('--level_of_loading_over_day_path', default=None, + help="Use csv. data with 'hour' and level_of_loading' columns to set \ + level of loading in case they are not in trips.csv") + parser.add_argument('--cost-parameters-file', default=None, + help='include cost parameters json, needed if cost_calculation==True') + parser.add_argument('--rotation-filter', default=None, + help='Use json data with rotation ids') + + # #### Modes ##### + mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] + parser.add_argument('--mode', default=['sim', 'report'], nargs='*', choices=mode_choices, + help=f"Specify what you want to do. Choose one or more from \ + {', '.join(mode_choices)}. \ + sim runs a single simulation with the given inputs. \ + neg_depb_to_oppb changes charging type of negative depb rotations. \ + neg_oppb_to_depb changes charging type of negative oppb rotations. \ + service optimization finds the largest set of electrified rotations. \ + report generates simulation output files.") + + # #### Flags ##### + parser.add_argument('--cost-calculation', '-cc', action='store_true', + help='Calculate costs') + parser.add_argument('--check-rotation-consistency', action='store_true', + help='Check rotation assumptions when building schedule.') + parser.add_argument('--ignore-inconsistent-rotations', action='store_true', + help='Remove rotations from schedule that violate assumptions. ') + parser.add_argument('--show-plots', action='store_true', + help='show plots for users to view in "report" mode') + + # #### Physical setup of environment ##### + parser.add_argument('--preferred-charging-type', '-pct', default='depb', + choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ + from {depb, oppb}. opp stands for opportunity.") + parser.add_argument('--gc-power-opps', metavar='POPP', type=float, default=100000, + help='max power of grid connector at opp stations') + parser.add_argument('--gc-power-deps', metavar='PDEP', type=float, default=100000, + help='max power of grid connector at depot stations') + parser.add_argument('--cs-power-opps', metavar='CSPOPP', type=float, default=300, + help='max power of charging station at opp stations') + parser.add_argument('--cs-power-deps-depb', metavar='CSPDEPDEP', type=float, default=150, + help='max power of charging station at depot stations for depot busses') + parser.add_argument('--cs-power-deps-oppb', metavar='CSPDEPOPP', type=float, default=150, + help='max power of charging station at depot stations for opp busses') + parser.add_argument('--desired-soc-deps', metavar='SOC', type=float, default=1.0, + help='set minimum desired SOC (0 - 1) for depot charging') + parser.add_argument('--desired-soc-opps', metavar='SOC', type=float, default=1.0, + help='set minimum desired SOC (0 - 1) for opportunity charging') + parser.add_argument('--min-recharge-deps-oppb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--min-recharge-deps-depb', default=1, + help='Minimum fraction of capacity for recharge when leaving the depot.') + parser.add_argument('--min-charging-time', help='define minimum time of charging', + default=0) + parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' + 'at opp station to simulate docking procedure.', default=0) + + # #### SIMULATION PARAMETERS ##### + parser.add_argument('--days', metavar='N', type=int, default=None, + help='set duration of scenario as number of days') + parser.add_argument('--interval', metavar='MIN', type=int, default=1, + help='set number of minutes for each timestep (Δt)') + parser.add_argument('--signal-time-dif', default=10, + help='time difference between signal time and actual ' + 'start time of a vehicle event im min.') + parser.add_argument('--eta', action='store_true', + help='Show estimated time to finish simulation after each step, ' + 'instead of progress bar. Not recommended for fast computations.') + parser.add_argument('--rotation-filter-variable', default=None, choices=['include', 'exclude', None], + help='set mode for filtering schedule rotations') + + # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### + parser.add_argument('--seed', default=1, type=int, help='set random seed') + parser.add_argument('--include-price-csv', + help='include CSV for energy price. \ + You may define custom options with --include-price-csv-option') + parser.add_argument('--include-price-csv-option', '-po', metavar=('KEY', 'VALUE'), + nargs=2, default=[], action='append', + help='append additional argument to price signals') + + parser.add_argument('--config', help='Use config file to set arguments') + + args = parser.parse_args() + + # arguments relevant to SpiceEV, setting automatically to reduce clutter in config + args.strategy = 'distributed' + args.margin = 1 + args.ALLOW_NEGATIVE_SOC = True + args.PRICE_THRESHOLD = -100 # ignore price for charging decisions + + set_options_from_config(args, check=parser, verbose=False) + + # rename special options + args.timing = args.eta + + missing = [a for a in ["input_schedule", "electrified_stations"] if vars(args).get(a) is None] + if missing: + raise SystemExit("The following arguments are required: {}".format(", ".join(missing))) + + return args From 2fff7d23d90fe4894e55dc3a00c338284b6e1dd0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:02:07 +0100 Subject: [PATCH 598/802] Change line break in argument --- ebus_toolbox/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 4c1e01f6..3c33d285 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -120,8 +120,8 @@ parser.add_argument( '--optimizer_config', default=None, - help="For station_optimization a optimizer_config is needed. Input " - "a path to an .cfg file or use the default_optimizer.cfg") + help="For station_optimization a optimizer_config is needed. \ + Input a path to an .cfg file or use the default_optimizer.cfg") args = parser.parse_args() # arguments relevant to SpiceEV, setting automatically to reduce clutter in config From e658b1450bc2422edd2c029bd9e3c7c4c7189efc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:03:54 +0100 Subject: [PATCH 599/802] Change optimizer_util description --- ebus_toolbox/optimizer_util.py | 4 ++-- tests/test_input_files/optimizer.cfg | 17 ++++++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index f507a753..5108e1b2 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -1,5 +1,5 @@ -""" Module for the class LowSocEvent which gathers functionality around -LowSocEvents, like evaluating them, gathering them and so on""" +""" Module for the minor classes LowSocEvent, ChargingEvent, OptimizerConfig +and utility functionality used by the StationOptimizer and station_optimization""" import logging import math import os diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg index dcc4019c..5c5b232d 100644 --- a/tests/test_input_files/optimizer.cfg +++ b/tests/test_input_files/optimizer.cfg @@ -1,17 +1,16 @@ # Configs for the eBus Toolbox Optimizer -[DEFAULT] +#[DEFAULT] debug_level=1 -[SCENARIO] +#[SCENARIO] # Use "" for ids and not '' exclusion_rots = [] exclusion_stations= [] # If using inclusion stations, scenario should be rebased inclusion_stations= [] -standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, - "voltage_level": "MV"} +standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, "voltage_level": "MV"} -[PICKLE] +#[PICKLE] schedule=schedule_rebased_BVG_BFI.pickle scenario=scenario_rebased_BVG_BFI.pickle args=args_rebased_BVG_BFI.pickle @@ -23,17 +22,17 @@ args=args_rebased_BVG_BFI.pickle # args=args_buffered_utf.pickle -[VEHICLE] +#[VEHICLE] charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # charging_power = 250 # min_soc=0.05 -[OPTIMIZER] +#[OPTIMIZER] # Not optional path to outputs of optimizer output_path=./tests/test_output_files -save_all_results=True +save_all_results=true # "quick" or "spiceev" solver = quick rebase_scenario = False @@ -61,7 +60,7 @@ include_must_stations = True -[SPECIAL] +#[SPECIAL] decision_tree_path = "" save_decision_tree = False reduce_rots = False From 71e29d9488ee16aa9a26fa17bdba0381c8318241 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:08:52 +0100 Subject: [PATCH 600/802] Add comment for decision tree path --- ebus_toolbox/optimizer_util.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 5108e1b2..3526130b 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -206,6 +206,7 @@ def read_config(config_path): special = section_dict["SPECIAL"] conf.decision_tree_path = special.get("decision_tree_path", None) if conf.decision_tree_path in ["", '""', "''"]: + # path should not be empty or "empty like" conf.decision_tree_path = None conf.save_decision_tree = special.getboolean("save_decision_tree", False) conf.reduce_rotations = special.getboolean("reduce_rotations", False) From 27e0062ab99525243afe8dc5c6fa3b29157799b3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:22:41 +0100 Subject: [PATCH 601/802] Make join_subsets smarter --- ebus_toolbox/optimizer_util.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 3526130b..679b4c17 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -497,9 +497,7 @@ def join_subsets(subsets: typing.Iterable[set]): """ subsets = [s.copy() for s in subsets] for i in range(len(subsets)): - for ii in range(len(subsets)): - if i == ii: - continue + for ii in range(i+1, len(subsets)): intersec = subsets[i].intersection(subsets[ii]) if len(intersec) > 0: subsets[i] = subsets[i].union(subsets[ii]) From 4a8db1333ae1ba95a8d1a11d7d087107a9f73159 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:25:28 +0100 Subject: [PATCH 602/802] Change line break --- ebus_toolbox/optimizer_util.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 679b4c17..a813665f 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -745,10 +745,9 @@ def preprocess_schedule(sched, args, electrified_stations=None): :return: schedule and scenario to be simulated :rtype: (ebus_toolbox.schedule.Schedule, spice_ev.Scenario) """ - Trip.consumption = \ - Consumption(sched.vehicle_types, - outside_temperatures=args.outside_temperature_over_day_path, - level_of_loading_over_day=args.level_of_loading_over_day_path) + Trip.consumption = Consumption( + sched.vehicle_types, outside_temperatures=args.outside_temperature_over_day_path, + level_of_loading_over_day=args.level_of_loading_over_day_path) sched.stations = electrified_stations sched.calculate_consumption() From 6633f34d1cd3b514749f14250ec35b37739a92fb Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:27:07 +0100 Subject: [PATCH 603/802] Remove main call --- ebus_toolbox/station_optimization.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 8bbc8818..96c3e1a6 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -49,20 +49,6 @@ def setup_logger(conf): return this_logger -def main(): - """ Main call""" - print(opt_util.get_time()) - config_path = "./data/examples/default_optimizer.cfg" - conf = opt_util.read_config(config_path) - opt_sched, opt_scen = run_optimization(conf) - print(opt_util.get_time()) - import pickle - with open("schedule_opt.pickle", "wb") as f: - pickle.dump(opt_sched, f) - with open("scenario_opt.pickle", "wb") as f: - pickle.dump(opt_scen, f) - - def prepare_filesystem(args, conf): """ Prepare files and folders in the optimization results folder. @@ -202,7 +188,3 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.warning("Station optimization finished after %s", opt_util.get_time()) return optimizer.schedule, optimizer.scenario - - -if __name__ == "__main__": - main() From 6a7641353821efb53f2cb77cf6e6a52f82b11f9a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:39:52 +0100 Subject: [PATCH 604/802] Revert changes to optimizer.cfg --- tests/test_input_files/optimizer.cfg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg index 5c5b232d..2547f75d 100644 --- a/tests/test_input_files/optimizer.cfg +++ b/tests/test_input_files/optimizer.cfg @@ -1,8 +1,8 @@ # Configs for the eBus Toolbox Optimizer -#[DEFAULT] +[DEFAULT] debug_level=1 -#[SCENARIO] +[SCENARIO] # Use "" for ids and not '' exclusion_rots = [] exclusion_stations= [] @@ -10,7 +10,7 @@ exclusion_stations= [] inclusion_stations= [] standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, "voltage_level": "MV"} -#[PICKLE] +[PICKLE] schedule=schedule_rebased_BVG_BFI.pickle scenario=scenario_rebased_BVG_BFI.pickle args=args_rebased_BVG_BFI.pickle @@ -22,14 +22,14 @@ args=args_rebased_BVG_BFI.pickle # args=args_buffered_utf.pickle -#[VEHICLE] +[VEHICLE] charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # charging_power = 250 # min_soc=0.05 -#[OPTIMIZER] +[OPTIMIZER] # Not optional path to outputs of optimizer output_path=./tests/test_output_files save_all_results=true From 66236b75372d0e912182ae8c8b01aacfd3361fb7 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 11:46:30 +0100 Subject: [PATCH 605/802] Make is_node_viable more readable --- ebus_toolbox/station_optimizer.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 125aed7a..5e7be561 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -544,11 +544,10 @@ def is_node_viable(self): """ parent_name = opt_util.stations_hash(self.electrified_station_set) for child in self.current_tree[parent_name]["children"]: - if not self.current_tree[child]["viable"]: - continue - # if one viable node is found return True - return True - # not a single viable node was found, return False + if self.current_tree[child]["viable"]: + # at least one viable node is found --> return True + return True + # not a single viable node was found --> return False return False @opt_util.time_it From ac68543689778b1ee53628b1b9305669da7bc6e2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 13:45:51 +0100 Subject: [PATCH 606/802] Make loop in choose_station_step_by_step more readable --- ebus_toolbox/station_optimizer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 5e7be561..e9c03dfb 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -679,8 +679,7 @@ def choose_station_step_by_step(self, station_eval, min_nr_visited = float('inf') # find the lowest amount of visits in the possible stations / children # not viable stations are skipped - for stat_tuple in station_eval: - station, _ = stat_tuple + for station, _ in station_eval: # create a station combination from already electrified # stations and possible new stations stats = self.electrified_station_set.union([station]) From c2ec1fe9c59b3bcc68980dddec82a97cdc211803 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 14 Mar 2023 15:43:59 +0100 Subject: [PATCH 607/802] Optimize replace_socs_from_none_to_value --- ebus_toolbox/station_optimizer.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index e9c03dfb..7b824639 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -880,18 +880,20 @@ def get_critical_stations_and_rebase(self, relative_soc=False): def replace_socs_from_none_to_value(self): """ Removes soc values of None by filling them with the last value which is not None. + The function only changes None values which are at the end of soc time series. Data type + is switched to np.array for easier handling at later stages. """ - # make sure no None values exists in SOCs. Fill later values with last value + # make sure no None values exist in SOCs. Fill later values with last value # which was not None, eg, [1,5,4,None,None] becomes [1,5,4,4,4] for v_id, soc in self.scenario.vehicle_socs.items(): soc = np.array(soc) - last_not_none = "not found" - if None in soc: - for ii in range(len(soc) - 1, -1, -1): - if soc[ii] is not None: - last_not_none = soc[ii] + if soc[-1] is None: + for i in range(len(soc) - 1, -1, -1): + if soc[i] is not None: + # value is the last value which is not None. Overwrite the None values until + # the end of the list with this value + soc[i+1:] = soc[i] break - soc[soc == np.array(None)] = last_not_none self.scenario.vehicle_socs[v_id] = soc def get_rotation_soc(self, rot_id, soc_data: dict = None): From f35a4825cb27bf1619a4637e647b5295ad4a8067 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 15 Mar 2023 11:19:51 +0100 Subject: [PATCH 608/802] Make flake8 happy --- ebus_toolbox/optimizer_util.py | 1 + ebus_toolbox/util.py | 4 +--- tests/test_station_optimization.py | 8 ++------ 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 579f0762..82d0e4a1 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -24,6 +24,7 @@ from ebus_toolbox.util import get_buffer_time as get_buffer_time_util from spice_ev.report import generate_soc_timeseries + class ChargingEvent: """ Class to gather information about a charging event""" def __init__(self, start_idx, end_idx, arrival_time, start_time, end_time, buffer_time, diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 1e696a32..cf6875ce 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -2,7 +2,6 @@ import json import warnings import subprocess -import argparse from spice_ev.util import set_options_from_config @@ -245,8 +244,7 @@ def get_args(): # #### Modes ##### mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', - 'station_optimization', 'report', - ] + 'station_optimization', 'report'] parser.add_argument('--mode', default=['sim', 'report'], nargs='*', choices=mode_choices, help=f"Specify what you want to do. Choose one or more from \ {', '.join(mode_choices)}. \ diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 27ec7121..07fe17e3 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -3,8 +3,6 @@ import ebus_toolbox.optimizer_util as opt_util import ebus_toolbox.util as util -import spice_ev.report -import tests.test_station_optimization from ebus_toolbox.station_optimization import run_optimization import pathlib from ebus_toolbox.trip import Trip @@ -40,10 +38,8 @@ def test_basic_run(self, trips_file_name="trips.csv"): :type trips_file_name: str :return: schedule, scenario""" path_to_trips = file_root / trips_file_name - sys.argv=["foo", "--config", str(file_root / "ebus_toolbox.cfg")] + sys.argv = ["foo", "--config", str(file_root / "ebus_toolbox.cfg")] args = util.get_args() - # args.config = file_root / "ebus_toolbox.cfg" - Trip.consumption = Consumption(self.vehicle_types, outside_temperatures=None, @@ -56,6 +52,7 @@ def test_basic_run(self, trips_file_name="trips.csv"): station_data_path=path_to_all_station_data) scen = generated_schedule.run(args) + # optimization depends on vehicle_socs, therefore they need to be generated generate_soc_timeseries(scen) return generated_schedule, scen, args @@ -122,4 +119,3 @@ def test_critical_stations_optimization(self, caplog): opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) assert ("must stations {'Station-3', 'Station-2'}" in caplog.text or "must stations {'Station-2', 'Station-3'}" in caplog.text) - From 9d191058eada13561fd1119e2982fdaad2a76d8d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 15 Mar 2023 11:29:35 +0100 Subject: [PATCH 609/802] Fix comment about pruning --- ebus_toolbox/station_optimizer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index ec5f3b8b..c89c175a 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -378,9 +378,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if pre_optimized_set is None: continue # if there is a pre optimized set check if the pre optimized set leads to pruning - # i.e. if if following branch makes sense. Since the prognosis is not very accurate - # over many station electrification pruning is very unlikely early on. The pruning - # threshold should be set not to high, since checking for pruning is likely to be + # i.e. if following branch makes sense. Since the prognosis is not very accurate + # over electrifying many stations, pruning is very unlikely early on. The pruning + # threshold should be set not to high, since checking for pruning is likely to be an # unnecessary calculation thresh = self.config.pruning_threshold if len(pre_optimized_set) - len(self.electrified_station_set) < thresh: From 0b2f91303e741b74d7316a54c5724eea41f43f5c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 15 Mar 2023 11:39:00 +0100 Subject: [PATCH 610/802] Rename schedule variable in run_schedule function --- ebus_toolbox/optimizer_util.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 82d0e4a1..83fb5c6d 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -703,10 +703,10 @@ def run_schedule(sched, args, electrified_stations=None): :return: schedule and scenario after SpiceEV simulation :rtype: ebus_toolbox.schedule.Schedule, spice_ev.Scenario """ - this_sched2 = copy(sched) - this_sched2.stations = electrified_stations - this_sched2, new_scen = preprocess_schedule(this_sched2, args, - electrified_stations=electrified_stations) + sched_copy = copy(sched) + sched_copy.stations = electrified_stations + sched_copy, new_scen = preprocess_schedule(sched_copy, args, + electrified_stations=electrified_stations) with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) @@ -718,7 +718,7 @@ def run_schedule(sched, args, electrified_stations=None): if "pytest" not in sys.modules: sys.stdout = sys.__stdout__ generate_soc_timeseries(new_scen) - return this_sched2, new_scen + return sched_copy, new_scen def preprocess_schedule(sched, args, electrified_stations=None): From 6ba98de57ee834547ad533e6113ce51abb31059a Mon Sep 17 00:00:00 2001 From: Patrick Stecher Date: Wed, 15 Mar 2023 16:14:34 +0100 Subject: [PATCH 611/802] implemented #81: default voltage level, with feedback from PR#111 --- data/examples/ebus_toolbox.cfg | 3 +++ ebus_toolbox/costs.py | 2 +- ebus_toolbox/schedule.py | 6 +----- ebus_toolbox/util.py | 2 ++ 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index ec17c80d..80ca30de 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -72,6 +72,9 @@ min_charging_time = 0 # NOTE: else clause is a MUST! The buffer time is deducted off of the planned standing time. # It may resemble things like delays and/or docking procedures (default: 0) default_buffer_time_opps = 0 +# Default voltage level for charging stations if not set in electrified_stations file +# Options: HV, HV/MV, MV, MV/LV, LV (default: MV) +default_voltage_level = "MV" ##### SIMULATION PARAMETERS ##### # Maximum number of days to simulate, if not set simulate entire schedule diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 8ae8ad9e..793ba203 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -61,7 +61,7 @@ def calculate_costs(c_params, scenario, schedule, args): gc_timeseries = getattr(scenario, f"{gcID}_timeseries") gc_max_power = -min(gc_timeseries["grid power [kW]"]) # get voltage_level - voltage_level = schedule.stations[gcID]["voltage_level"] + voltage_level = schedule.stations[gcID].get("voltage_level", args.default_voltage_level) # get distance between grid and grid connector distance_to_grid = schedule.stations[gcID].get( "distance_to_grid", c_params["gc"][voltage_level]["default_distance"]) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 401e1e3f..990286f5 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -494,15 +494,11 @@ def generate_scenario(self, args): } if gc_name not in grid_connectors: # add one grid connector for each bus station - # if attribute "voltage_level" is not set, use default parameter - if "voltage_level" not in station: - station["voltage_level"] = getattr(args, "default_voltage_level") - grid_connectors[gc_name] = { "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, "number_cs": station["n_charging_stations"], - "voltage_level": station.get("voltage_level") + "voltage_level": station.get("voltage_level", args.default_voltage_level) } # check for stationary battery battery = station.get("battery") diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 8c5e3c84..1fb8afa6 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -289,6 +289,8 @@ def get_args(): default=0) parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' 'at opp station to simulate docking procedure.', default=0) + parser.add_argument('--default_voltage_level', help='Default voltage level for charging stations' + ' if not set in electrified_stations file', type=str, default=None) # #### SIMULATION PARAMETERS ##### parser.add_argument('--days', metavar='N', type=int, default=None, From a60c25ef3ae3e16595ef2c5718d92c3e3a91638d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Mar 2023 16:43:59 +0100 Subject: [PATCH 612/802] Remove sections from optimizer.cfg and handle parsing --- ebus_toolbox/optimizer_util.py | 10 ++++++++-- tests/test_input_files/optimizer.cfg | 10 +++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 83fb5c6d..599f7a94 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -148,7 +148,13 @@ def read_config(config_path): assert Path(config_path).is_file(), f"Path to optimizer_config: {config_path} " \ f"does not lead to file" - config_parser.read(config_path, encoding="utf-8") + try: + config_parser.read(config_path, encoding="utf-8") + except configparser.MissingSectionHeaderError: + # make sure there is always a DEFAULT section. + with open(config_path, 'r') as f: + config_string = '[DEFAULT]\n' + f.read() + config_parser.read_string(config_string) conf = OptimizerConfig() conf.path = config_path @@ -162,7 +168,7 @@ def read_config(config_path): default = section_dict["DEFAULT"] conf.debug_level = default.getint("debug_level", 0) conf.console_level = default.getint("console_level", 99) - sce = config_parser["SCENARIO"] + sce = section_dict["SCENARIO"] conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg index 2547f75d..5c5b232d 100644 --- a/tests/test_input_files/optimizer.cfg +++ b/tests/test_input_files/optimizer.cfg @@ -1,8 +1,8 @@ # Configs for the eBus Toolbox Optimizer -[DEFAULT] +#[DEFAULT] debug_level=1 -[SCENARIO] +#[SCENARIO] # Use "" for ids and not '' exclusion_rots = [] exclusion_stations= [] @@ -10,7 +10,7 @@ exclusion_stations= [] inclusion_stations= [] standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, "voltage_level": "MV"} -[PICKLE] +#[PICKLE] schedule=schedule_rebased_BVG_BFI.pickle scenario=scenario_rebased_BVG_BFI.pickle args=args_rebased_BVG_BFI.pickle @@ -22,14 +22,14 @@ args=args_rebased_BVG_BFI.pickle # args=args_buffered_utf.pickle -[VEHICLE] +#[VEHICLE] charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # charging_power = 250 # min_soc=0.05 -[OPTIMIZER] +#[OPTIMIZER] # Not optional path to outputs of optimizer output_path=./tests/test_output_files save_all_results=true From 022bc30dbc23d28b73bfb6e205aaec0e34694fb0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Mar 2023 16:45:38 +0100 Subject: [PATCH 613/802] Remove commented out save_soc handling --- ebus_toolbox/station_optimization.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index b8ea1e97..743d3db6 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -99,8 +99,6 @@ def run_optimization(conf, sched=None, scen=None, args=None): # setup folders, paths and copy config prepare_filesystem(args, conf) - # if args.save_soc: - # args.save_soc = args.output_directory / "simulation_soc_spiceEV.csv" new_ele_stations_path = conf.optimizer_output_dir / "optimized_stations.json" logger = setup_logger(conf) From adf8952baf9516bc386d7bd242d845a6fd954b6b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Mar 2023 16:48:24 +0100 Subject: [PATCH 614/802] Change default optimizer config to reflect not needed sections --- data/examples/default_optimizer.cfg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 98e55a3a..f98cb49a 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -1,5 +1,5 @@ # Config for the eBus-Toolbox Optimizer -[DEFAULT] +#[DEFAULT] debug_level=1 console_level=99 @@ -13,14 +13,14 @@ standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_trans "voltage_level": "MV"} -[VEHICLE] +#[VEHICLE] charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # charging_power = 250 # min_soc=0.05 -[OPTIMIZER] +#[OPTIMIZER] save_all_results=True # "quick" or "spiceev" solver = quick @@ -46,7 +46,7 @@ check_for_must_stations = False include_must_stations = True -[SPECIAL] +#[SPECIAL] decision_tree_path = "" save_decision_tree = False # Do you want to reduce the rotations to a smaller subset? From 607752008f594b8b2e3732e530edc0aec3532e98 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 22 Mar 2023 16:55:57 +0100 Subject: [PATCH 615/802] Minor changes: logging instead of print, line reduction, typo --- ebus_toolbox/optimizer_util.py | 5 ++--- ebus_toolbox/station_optimizer.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 599f7a94..009b1dca 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -282,8 +282,7 @@ def get_index_by_time(scenario, search_time): :return: index :rtype: int """ - idx = (search_time - scenario.start_time) // scenario.interval - return idx + return (search_time - scenario.start_time) // scenario.interval def get_rotation_soc_util(rot_id, schedule, scenario, soc_data: dict = None): @@ -457,7 +456,7 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr # created as station subsets for event in events: for i, subset in enumerate(station_subsets): - # every station from an event must share the same station sub_set. Therefore its enough + # every station from an event must share the same station subset. Therefore its enough # to check only the first element if len(event.stations) > 0: if next(iter(event.stations)) in subset: diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index c89c175a..9c475adf 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -116,7 +116,7 @@ def loop(self, **kwargs): self.electrify_station(stat, self.electrified_station_set) return self.electrified_stations, self.electrified_station_set self.logger.warning("Starting deep analysis with mode: %s", self.config.node_choice) - print(opt_util.get_time()) + self.logger.debug(opt_util.get_time()) # from here on only for deep analysis for group_nr, group in enumerate(groups[:]): events, stations = group From 883a6dd73b1fec203dacef001c008c91346bb221 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 10:15:37 +0100 Subject: [PATCH 616/802] Make use of tmp path and remove deprecated config settings --- data/examples/default_optimizer.cfg | 1 - ebus_toolbox/optimizer_util.py | 1 - tests/test_input_files/all_stations.csv | 4 ++++ tests/test_input_files/optimizer.cfg | 3 --- tests/test_station_optimization.py | 10 ++++++++++ 5 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 tests/test_input_files/all_stations.csv diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index f98cb49a..5197b2fe 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -21,7 +21,6 @@ charge_eff = 0.95 # min_soc=0.05 #[OPTIMIZER] -save_all_results=True # "quick" or "spiceev" solver = quick rebase_scenario = False diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 009b1dca..4ec97f22 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -208,7 +208,6 @@ def read_config(config_path): conf.estimation_threshold = optimizer.getfloat("estimation_threshold", 0.8) conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) conf.pruning_threshold = optimizer.getint("pruning_threshold", 3) - conf.save_all_results = optimizer.getboolean("save_all_results", False) special = section_dict["SPECIAL"] conf.decision_tree_path = special.get("decision_tree_path", None) diff --git a/tests/test_input_files/all_stations.csv b/tests/test_input_files/all_stations.csv new file mode 100644 index 00000000..dec18443 --- /dev/null +++ b/tests/test_input_files/all_stations.csv @@ -0,0 +1,4 @@ +Endhaltestelle,elevation +Station A,1 +Station B,9 +Station C,10 \ No newline at end of file diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg index 5c5b232d..84e6323a 100644 --- a/tests/test_input_files/optimizer.cfg +++ b/tests/test_input_files/optimizer.cfg @@ -30,9 +30,6 @@ charge_eff = 0.95 # min_soc=0.05 #[OPTIMIZER] -# Not optional path to outputs of optimizer -output_path=./tests/test_output_files -save_all_results=true # "quick" or "spiceev" solver = quick rebase_scenario = False diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 07fe17e3..f5de1a57 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,3 +1,4 @@ +import pytest import json import sys @@ -15,6 +16,12 @@ class TestStationOptimization: + + # Using the pytest fixture tmp_path to have access to a temporary directory as class attribute + @pytest.fixture(autouse=True) + def initialize_tmp_path(self, tmp_path): + self.tmp_path = tmp_path + mandatory_args = { "min_recharge_deps_oppb": 0, "min_recharge_deps_depb": 0, @@ -54,6 +61,8 @@ def test_basic_run(self, trips_file_name="trips.csv"): scen = generated_schedule.run(args) # optimization depends on vehicle_socs, therefore they need to be generated generate_soc_timeseries(scen) + args.output_directory = self.tmp_path + assert self.tmp_path return generated_schedule, scen, args def test_basic_optimization(self): @@ -113,6 +122,7 @@ def test_critical_stations_optimization(self, caplog): args.input_schedule = file_root / trips_file_name config_path = file_root / "optimizer.cfg" conf = opt_util.read_config(config_path) + conf.check_for_must_stations = True conf.solver = "quick" conf.node_choice = "step-by-step" From 9f2c81a72ebdedb9960b49fcbd8177d2ed562ab0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 12:34:00 +0100 Subject: [PATCH 617/802] Add time checks to consistency check and remove Einsetzfahrt check --- ebus_toolbox/schedule.py | 42 ++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index d14d7561..f1395a05 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -131,11 +131,11 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): def check_consistency(cls, schedule): """ Check rotation expectations, such as - - each rotation has one "Einsetzfahrt" - - each rotation has one "Aussetzfahrt" - - the "Einsatzfahrt" starts where the "Aussetzfahrt" ends - - the rotation name is unique + - the rotation starts and ends at the same station - every trip within a rotation starts where the previous trip ended + - trips are chronologically sorted + - trips have positive breaks in between + - trips have positive times between departure and arrival :param schedule: the schedule to check :type schedule: dict @@ -145,32 +145,28 @@ def check_consistency(cls, schedule): ignored_rotations = {} for rot_id, rotation in schedule.rotations.items(): # iterate over trips, looking for initial and final stations - dep_name = None - arr_name = None - prev_station_name = None + prev_trip = None try: for trip in rotation.trips: - if trip.line == "Einsetzfahrt": - # must have exactly one "Einsetzfahrt" - assert dep_name is None, "Einsetzfahrt encountered mutliple times" - dep_name = trip.departure_name - if trip.line == "Aussetzfahrt": - # must have exactly one "Aussetzfahrt" - assert arr_name is None, "Aussetzfahrt encountered multiple times" - arr_name = trip.arrival_name - if prev_station_name is not None: - # must depart from the previous station - assert trip.departure_name == prev_station_name, "Wrong departure station" - prev_station_name = trip.arrival_name - # must have exactly one "Einsetzfahrt" and "Aussetzfahrt" - assert dep_name is not None and arr_name is not None, "No Ein- or Aussetzfahrt" - # rotation must end where it started + # positive duration for a trip + assert trip.arrival_time >= trip.departure_time, "Trip time is negative" + if not prev_trip: + prev_trip = trip + continue + # chronologically sorted + assert trip.departure_time > prev_trip.departure_time, "Trips are not sorted" + # positive break time in between trips + assert trip.departure_time >= prev_trip.arrival_time, "Break time is negative" + assert trip.departure_name == prev_trip.arrival_name, "Trips are not sequential" + + assert len(rotation.trips) > 1, "Rotation has only one trip" + dep_name = list(rotation.trips)[0].departure_name + arr_name = list(rotation.trips)[-1].departure_name assert dep_name == arr_name, "Start and end of rotation differ" except AssertionError as e: # some assumption is violated # save error text ignored_rotations[rot_id] = e - return ignored_rotations def run(self, args): From a3b21f40c10f45689779aa4830ef3f65adaa71c2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 13:01:44 +0100 Subject: [PATCH 618/802] Minor changes --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/schedule.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index ec17c80d..e32b3798 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -36,7 +36,7 @@ mode = ["sim", "report"] # Set flag for cost calculation: (default: false) cost_calculation = true # Check rotation assumptions when building schedule? (default: false) -check_rotation_consistency = false +check_rotation_consistency = true # Remove rotations from schedule that violate assumptions? # Needs check_rotation_consistency to have an effect (default: false) ignore_inconsistent_rotations = false diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index f1395a05..441179a5 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -154,15 +154,23 @@ def check_consistency(cls, schedule): prev_trip = trip continue # chronologically sorted - assert trip.departure_time > prev_trip.departure_time, "Trips are not sorted" + assert trip.departure_time >= prev_trip.departure_time, "Trips are not sorted" # positive break time in between trips assert trip.departure_time >= prev_trip.arrival_time, "Break time is negative" assert trip.departure_name == prev_trip.arrival_name, "Trips are not sequential" + prev_trip = trip + assert len(rotation.trips) > 1, "Rotation has only one trip" - dep_name = list(rotation.trips)[0].departure_name - arr_name = list(rotation.trips)[-1].departure_name + rot_departure_trip = list(rotation.trips)[0] + rot_arrival_trip = list(rotation.trips)[-1] + dep_name = rot_departure_trip.departure_name + arr_name = rot_arrival_trip.arrival_name assert dep_name == arr_name, "Start and end of rotation differ" + assert dep_name == rotation.departure_name, "Rotation data differs from trips" + assert arr_name == rotation.arrival_name, "Rotation data differs from trips" + assert rot_arrival_trip.arrival_time == rotation.arrival_time + assert rot_departure_trip.departure_name == rotation.departure_name except AssertionError as e: # some assumption is violated # save error text From e2b527b964e1a08012b4f37d040400c27e6c5db2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 14:56:16 +0100 Subject: [PATCH 619/802] Add tests --- ebus_toolbox/schedule.py | 14 ++++----- tests/test_schedule.py | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 441179a5..bef2a5e2 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -153,8 +153,6 @@ def check_consistency(cls, schedule): if not prev_trip: prev_trip = trip continue - # chronologically sorted - assert trip.departure_time >= prev_trip.departure_time, "Trips are not sorted" # positive break time in between trips assert trip.departure_time >= prev_trip.arrival_time, "Break time is negative" assert trip.departure_name == prev_trip.arrival_name, "Trips are not sequential" @@ -167,14 +165,16 @@ def check_consistency(cls, schedule): dep_name = rot_departure_trip.departure_name arr_name = rot_arrival_trip.arrival_name assert dep_name == arr_name, "Start and end of rotation differ" - assert dep_name == rotation.departure_name, "Rotation data differs from trips" - assert arr_name == rotation.arrival_name, "Rotation data differs from trips" - assert rot_arrival_trip.arrival_time == rotation.arrival_time - assert rot_departure_trip.departure_name == rotation.departure_name + + error = "Rotation data differs from trips data" + assert dep_name == rotation.departure_name, error + assert arr_name == rotation.arrival_name, error + assert rot_arrival_trip.arrival_time == rotation.arrival_time, error + assert rot_departure_trip.departure_time == rotation.departure_time, error except AssertionError as e: # some assumption is violated # save error text - ignored_rotations[rot_id] = e + ignored_rotations[rot_id] = e.args[0] return ignored_rotations def run(self, args): diff --git a/tests/test_schedule.py b/tests/test_schedule.py index f5b5e453..6a372aa7 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -6,9 +6,70 @@ Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html are also good support. """ +from datetime import timedelta + from tests.helpers import generate_basic_schedule +from ebus_toolbox.schedule import Schedule def test_schedule_from_csv(): schedule = generate_basic_schedule() assert len(schedule.rotations) == 1 + + +def test_consistency(): + sched = generate_basic_schedule() + # check if no error is thrown in the basic case + assert len(Schedule.check_consistency(sched)) == 0 + + error = 'Trip time is negative' + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + faulty_trip = faulty_rot.trips[0] + # create error through moving trip arrival 1 year back + faulty_trip.arrival_time -= timedelta(days=365) + assert Schedule.check_consistency(sched)["1"] == error + + error = 'Rotation has only one trip' + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + faulty_rot.trips = faulty_rot.trips[:1] + assert Schedule.check_consistency(sched)["1"] == error + + error = 'Start and end of rotation differ' + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + departure_trip = list(faulty_rot.trips)[0] + departure_trip.departure_name = "foo" + faulty_rot.trips[-1].arrival_name = "bar" + assert Schedule.check_consistency(sched)["1"] == error + + error = "Rotation data differs from trips data" + + # check arrival data in rotation + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + faulty_rot.trips[-1].arrival_name = "foo" + faulty_rot.trips[0].departure_name = "foo" + faulty_rot.arrival_name = "bar" + assert Schedule.check_consistency(sched)["1"] == error + + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + arrival_trip = faulty_rot.trips[-1] + faulty_rot.arrival_time = arrival_trip.arrival_time - timedelta(minutes=1) + assert Schedule.check_consistency(sched)["1"] == error + + # check departure data in rotation + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + faulty_rot.trips[-1].arrival_name = "foo" + faulty_rot.trips[0].departure_name = "foo" + faulty_rot.departure_name = "bar" + assert Schedule.check_consistency(sched)["1"] == error + + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + departure_trip = faulty_rot.trips[0] + faulty_rot.departure_time = departure_trip.departure_time - timedelta(minutes=1) + assert Schedule.check_consistency(sched)["1"] == error From 96a16d4858f54c843a2d2000509f246f65b26cba Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 15:02:32 +0100 Subject: [PATCH 620/802] Renaming ignore_inconsistent_rotations to skip_inconsistent_rotations --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/schedule.py | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index e32b3798..5ee6bebe 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -39,7 +39,7 @@ cost_calculation = true check_rotation_consistency = true # Remove rotations from schedule that violate assumptions? # Needs check_rotation_consistency to have an effect (default: false) -ignore_inconsistent_rotations = false +skip_inconsistent_rotations = false # Show plots for users to view, only valid if generate_report = true (default: false) show_plots = true diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index bef2a5e2..420f1dc8 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -111,19 +111,19 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): if kwargs.get("check_rotation_consistency"): # check rotation expectations - ignored_rotations = cls.check_consistency(schedule) - if ignored_rotations: + inconsistent_rotations = cls.check_consistency(schedule) + if inconsistent_rotations: # write errors to file with open(kwargs["output_directory"] / "inconsistent_rotations.csv", "w") as f: - for rot_id, e in ignored_rotations.items(): + for rot_id, e in inconsistent_rotations.items(): f.write(f"Rotation {rot_id}: {e}\n") print(f"Rotation {rot_id}: {e}") - if kwargs.get("ignore_inconsistent_rotations"): + if kwargs.get("skip_inconsistent_rotations"): # remove this rotation from schedule del schedule.rotations[rot_id] - elif kwargs.get("ignore_inconsistent_rotations"): - warnings.warn("Option ignore_inconsistent_rotations ignored, " - "as check_rotation_consistency is not set") + elif kwargs.get("skip_inconsistent_rotations"): + warnings.warn("Option skip_inconsistent_rotations ignored, " + "as check_rotation_consistency is not set to 'true'") return schedule @@ -139,10 +139,10 @@ def check_consistency(cls, schedule): :param schedule: the schedule to check :type schedule: dict - :return: faulty rotations. Dict of rotation ID -> error message + :return: inconsistent_rotations. Dict of rotation ID -> error message :rtype: dict """ - ignored_rotations = {} + inconsistent_rotations = {} for rot_id, rotation in schedule.rotations.items(): # iterate over trips, looking for initial and final stations prev_trip = None @@ -174,8 +174,8 @@ def check_consistency(cls, schedule): except AssertionError as e: # some assumption is violated # save error text - ignored_rotations[rot_id] = e.args[0] - return ignored_rotations + inconsistent_rotations[rot_id] = e.args[0] + return inconsistent_rotations def run(self, args): # each rotation is assigned a vehicle ID From 6a1b5a31cc7e409695e96a9ba082c13df591e284 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 15:04:45 +0100 Subject: [PATCH 621/802] Revert change to default value in example cfg --- data/examples/ebus_toolbox.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 5ee6bebe..7a76cb52 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -36,7 +36,7 @@ mode = ["sim", "report"] # Set flag for cost calculation: (default: false) cost_calculation = true # Check rotation assumptions when building schedule? (default: false) -check_rotation_consistency = true +check_rotation_consistency = false # Remove rotations from schedule that violate assumptions? # Needs check_rotation_consistency to have an effect (default: false) skip_inconsistent_rotations = false From 88ef9d5c8384ee23a074c4728fdaf8da9a855479 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 15:10:50 +0100 Subject: [PATCH 622/802] Allow rotations with a single trip --- ebus_toolbox/schedule.py | 1 - tests/test_schedule.py | 6 ------ 2 files changed, 7 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 420f1dc8..57d59c30 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -159,7 +159,6 @@ def check_consistency(cls, schedule): prev_trip = trip - assert len(rotation.trips) > 1, "Rotation has only one trip" rot_departure_trip = list(rotation.trips)[0] rot_arrival_trip = list(rotation.trips)[-1] dep_name = rot_departure_trip.departure_name diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 6a372aa7..e30a42ce 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -30,12 +30,6 @@ def test_consistency(): faulty_trip.arrival_time -= timedelta(days=365) assert Schedule.check_consistency(sched)["1"] == error - error = 'Rotation has only one trip' - sched = generate_basic_schedule() - faulty_rot = list(sched.rotations.values())[0] - faulty_rot.trips = faulty_rot.trips[:1] - assert Schedule.check_consistency(sched)["1"] == error - error = 'Start and end of rotation differ' sched = generate_basic_schedule() faulty_rot = list(sched.rotations.values())[0] From e855ebdfa1d44f89b956f07090c9d5c818eba607 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 15:14:50 +0100 Subject: [PATCH 623/802] Add missing tests --- tests/test_schedule.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index e30a42ce..bd7bbe8e 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -22,7 +22,7 @@ def test_consistency(): # check if no error is thrown in the basic case assert len(Schedule.check_consistency(sched)) == 0 - error = 'Trip time is negative' + error = "Trip time is negative" sched = generate_basic_schedule() faulty_rot = list(sched.rotations.values())[0] faulty_trip = faulty_rot.trips[0] @@ -30,7 +30,22 @@ def test_consistency(): faulty_trip.arrival_time -= timedelta(days=365) assert Schedule.check_consistency(sched)["1"] == error - error = 'Start and end of rotation differ' + error = "Break time is negative" + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + faulty_trip = faulty_rot.trips[1] + # create error through moving trip departure before last arrival + faulty_trip.departure_time = faulty_rot.trips[0].arrival_time-timedelta(minutes=1) + assert Schedule.check_consistency(sched)["1"] == error + + error = "Trips are not sequential" + sched = generate_basic_schedule() + faulty_rot = list(sched.rotations.values())[0] + faulty_rot.trips[1].arrival_name = "foo" + faulty_rot.trips[0].departure_name = "bar" + assert Schedule.check_consistency(sched)["1"] == error + + error = "Start and end of rotation differ" sched = generate_basic_schedule() faulty_rot = list(sched.rotations.values())[0] departure_trip = list(faulty_rot.trips)[0] From fc503f138a3019b1607ea8dc64e5e739680d5649 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 15:16:56 +0100 Subject: [PATCH 624/802] Clean up negative trip time --- tests/test_schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index bd7bbe8e..fc1541a1 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -26,8 +26,8 @@ def test_consistency(): sched = generate_basic_schedule() faulty_rot = list(sched.rotations.values())[0] faulty_trip = faulty_rot.trips[0] - # create error through moving trip arrival 1 year back - faulty_trip.arrival_time -= timedelta(days=365) + # create error through moving trip arrival 1 day before departure + faulty_trip.arrival_time -= faulty_trip.departure_time - timedelta(days=1) assert Schedule.check_consistency(sched)["1"] == error error = "Break time is negative" From 323a89972f9e7faef7dcd79caa1da02a56834b57 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 23 Mar 2023 15:18:54 +0100 Subject: [PATCH 625/802] Fix type error of datetime --- tests/test_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index fc1541a1..9a103e84 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -27,7 +27,7 @@ def test_consistency(): faulty_rot = list(sched.rotations.values())[0] faulty_trip = faulty_rot.trips[0] # create error through moving trip arrival 1 day before departure - faulty_trip.arrival_time -= faulty_trip.departure_time - timedelta(days=1) + faulty_trip.arrival_time = faulty_trip.departure_time - timedelta(days=1) assert Schedule.check_consistency(sched)["1"] == error error = "Break time is negative" From ee79b6036ed971979aa912b5d30dd4c2b632762b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Mar 2023 10:48:23 +0100 Subject: [PATCH 626/802] Fix return in doc string and cast error to str --- ebus_toolbox/schedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 57d59c30..86ccde41 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -139,7 +139,7 @@ def check_consistency(cls, schedule): :param schedule: the schedule to check :type schedule: dict - :return: inconsistent_rotations. Dict of rotation ID -> error message + :return: inconsistent rotations. Dict of rotation ID -> error message :rtype: dict """ inconsistent_rotations = {} @@ -173,7 +173,7 @@ def check_consistency(cls, schedule): except AssertionError as e: # some assumption is violated # save error text - inconsistent_rotations[rot_id] = e.args[0] + inconsistent_rotations[rot_id] = str(e) return inconsistent_rotations def run(self, args): From b919f82b2cb253dbd47349d7634897efa45f224a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 24 Mar 2023 12:04:13 +0100 Subject: [PATCH 627/802] Move prints to logger --- ebus_toolbox/station_optimizer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 9c475adf..ed92e069 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -190,7 +190,8 @@ def loop(self, **kwargs): self.logger.debug("Optimized with %s stations out of %s", len(pre_optimized_set), len(stations)) - print(opt_util.get_time()) + # make sure it gets printed in the console through high level + self.logger.log(msg=opt_util.get_time(), level=100) # saving decision tree only in case of deep analysis if self.config.save_decision_tree: with open(self.config.optimizer_output_dir / Path("decision_tree.pickle"), "wb") as f: @@ -202,7 +203,7 @@ def loop(self, **kwargs): for stat in single_set: self.electrify_station(stat, self.electrified_station_set) # dump the measured running times of the functions - print(opt_util.time_it(None)) + self.logger.debug(opt_util.time_it(None)) return self.electrified_stations, self.electrified_station_set def get_negative_rotations_all_electrified(self, rel_soc=False): From 1bd9e25541de9c3d7d725b1812db859e4fafcdb7 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 27 Mar 2023 13:55:03 +0200 Subject: [PATCH 628/802] Patch error due to missing vehicle ids, add recursive dictionary changer and fix config parser --- ebus_toolbox/optimizer_util.py | 87 ++++++++++++---------------- ebus_toolbox/station_optimization.py | 13 ++++- ebus_toolbox/station_optimizer.py | 11 +++- tests/test_station_optimization.py | 23 +++++++- 4 files changed, 79 insertions(+), 55 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 4ec97f22..5e043366 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -144,7 +144,6 @@ def read_config(config_path): :rtype: ebus_toolbox.optimizer_util.OptimizerConfig """ config_parser = configparser.ConfigParser() - config_parser.sections() assert Path(config_path).is_file(), f"Path to optimizer_config: {config_path} " \ f"does not lead to file" @@ -157,66 +156,56 @@ def read_config(config_path): config_parser.read_string(config_string) conf = OptimizerConfig() conf.path = config_path + assert len(config_parser.sections()) == 0, "Sections are not allowed for the optimizer config." - section_dict = dict() - for section in ["DEFAULT", "SCENARIO", "PICKLE", "VEHICLE", "OPTIMIZER", "SPECIAL"]: - try: - section_dict[section] = config_parser[section] - except KeyError: - section_dict[section] = config_parser["DEFAULT"] - - default = section_dict["DEFAULT"] + default = config_parser["DEFAULT"] conf.debug_level = default.getint("debug_level", 0) conf.console_level = default.getint("console_level", 99) - sce = section_dict["SCENARIO"] - conf.exclusion_rots = set(json.loads(sce.get("exclusion_rots", "[]"))) - conf.exclusion_stations = set(json.loads(sce.get("exclusion_stations", "[]"))) - conf.inclusion_stations = set(json.loads(sce.get("inclusion_stations", "[]"))) - conf.standard_opp_station = dict(json.loads(sce.get("standard_opp_station", "{}"))) - - pick = section_dict["PICKLE"] - conf.schedule = pick.get("schedule", "") - conf.scenario = pick.get("scenario", "") - conf.args = pick.get("args", "") - - vehicle = section_dict["VEHICLE"] - conf.charge_eff = vehicle.getfloat("charge_eff", 0.95) - conf.battery_capacity = vehicle.getfloat("battery_capacity", 0) + + conf.exclusion_rots = set(json.loads(default.get("exclusion_rots", "[]"))) + conf.exclusion_stations = set(json.loads(default.get("exclusion_stations", "[]"))) + conf.inclusion_stations = set(json.loads(default.get("inclusion_stations", "[]"))) + conf.standard_opp_station = dict(json.loads(default.get("standard_opp_station", "{}"))) + + conf.schedule = default.get("schedule", "") + conf.scenario = default.get("scenario", "") + conf.args = default.get("args", "") + + conf.charge_eff = default.getfloat("charge_eff", 0.95) + conf.battery_capacity = default.getfloat("battery_capacity", 0) if conf.battery_capacity == 0: conf.battery_capacity = None - conf.charging_curve = json.loads(vehicle.get("charging_curve", "[]")) + conf.charging_curve = json.loads(default.get("charging_curve", "[]")) if not conf.charging_curve: conf.charging_curve = None - conf.charging_power = vehicle.getfloat("charging_power", 0) + conf.charging_power = default.getfloat("charging_power", 0) if conf.charging_power == 0: conf.charging_power = None - conf.min_soc = vehicle.getfloat("min_soc", 0) - - optimizer = section_dict["OPTIMIZER"] - conf.solver = optimizer.get("solver", "spiceev") - conf.rebase_scenario = optimizer.getboolean("rebase_scenario", True) - conf.pickle_rebased = optimizer.getboolean("pickle_rebased", False) - conf.pickle_rebased_name = optimizer.get("pickle_rebased_name", "rebased_" + - datetime.now().isoformat(sep='-', timespec='seconds')) - conf.opt_type = optimizer.get("opt_type", "greedy") - conf.eps = optimizer.getfloat("eps", 0.0001) - conf.remove_impossible_rotations = optimizer.getboolean("remove_impossible_rotations", False) - conf.node_choice = optimizer.get("node_choice", "step-by-step") - conf.max_brute_loop = optimizer.getint("max_brute_loop", 20) - conf.run_only_neg = optimizer.getboolean("run_only_neg", False) - conf.run_only_oppb = optimizer.getboolean("run_only_oppb", False) - conf.estimation_threshold = optimizer.getfloat("estimation_threshold", 0.8) - conf.check_for_must_stations = optimizer.getboolean("check_for_must_stations", True) - conf.pruning_threshold = optimizer.getint("pruning_threshold", 3) - - special = section_dict["SPECIAL"] - conf.decision_tree_path = special.get("decision_tree_path", None) + conf.min_soc = default.getfloat("min_soc", 0) + + conf.solver = default.get("solver", "spiceev") + conf.rebase_scenario = default.getboolean("rebase_scenario", True) + conf.pickle_rebased = default.getboolean("pickle_rebased", False) + conf.pickle_rebased_name = default.get("pickle_rebased_name", "rebased_" + + datetime.now().isoformat(sep='-', timespec='seconds')) + conf.opt_type = default.get("opt_type", "greedy") + conf.eps = default.getfloat("eps", 0.0001) + conf.remove_impossible_rotations = default.getboolean("remove_impossible_rotations", False) + conf.node_choice = default.get("node_choice", "step-by-step") + conf.max_brute_loop = default.getint("max_brute_loop", 20) + conf.run_only_neg = default.getboolean("run_only_neg", False) + conf.run_only_oppb = default.getboolean("run_only_oppb", False) + conf.estimation_threshold = default.getfloat("estimation_threshold", 0.8) + conf.check_for_must_stations = default.getboolean("check_for_must_stations", True) + conf.pruning_threshold = default.getint("pruning_threshold", 3) + + conf.decision_tree_path = default.get("decision_tree_path", None) if conf.decision_tree_path in ["", '""', "''"]: # path should not be empty or "empty like" conf.decision_tree_path = None - conf.save_decision_tree = special.getboolean("save_decision_tree", False) - conf.reduce_rotations = special.getboolean("reduce_rotations", False) - conf.rotations = json.loads(special.get("rotations", "[]")) + conf.save_decision_tree = default.getboolean("save_decision_tree", False) + conf.reduce_rotations = default.getboolean("reduce_rotations", False) + conf.rotations = json.loads(default.get("rotations", "[]")) return conf diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 743d3db6..d6a5ce19 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -5,11 +5,14 @@ from datetime import datetime import json -from pathlib import Path +from pathlib import Path, WindowsPath import logging import shutil import ebus_toolbox.station_optimizer from ebus_toolbox.station_optimizer import opt_util +from ebus_toolbox.util import recursive_dict_updater +from spice_ev.report import generate_soc_timeseries + config = opt_util.OptimizerConfig() @@ -125,6 +128,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): else: # no new SpiceEV simulation will take place, but some variables need to be adjusted must_include_set, ele_stations = optimizer.rebase_simple() + # make sure vehicle socs exist + generate_soc_timeseries(scen) # create charging dicts which contain soc over time, which is numerically calculated optimizer.create_charging_curves() @@ -172,8 +177,12 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.debug("Estimation of network still shows negative rotations") for event in new_events: logger.debug(event.rotation.id) + with open(new_ele_stations_path, "w", encoding="utf-8") as file: - json.dump(ele_stations, file, ensure_ascii=False, indent=2) + output_dict = {key: value for key, value in ele_stations.items()} + recursive_dict_updater(output_dict, lambda key, value: type(value) == WindowsPath, + lambda key, value: str(value)) + json.dump(output_dict, file, ensure_ascii=False, indent=2) # Calculation with SpiceEV is more accurate and will show if the optimization is viable or not logger.debug("Detailed calculation of optimized case as a complete scenario") diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index ed92e069..33e16345 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -58,7 +58,7 @@ def loop(self, **kwargs): opt_type = kwargs.get("opt_type", self.config.opt_type) self.scenario.vehicle_socs = self.timeseries_calc(electrify_stations=self.must_include_set) - self.base_scenario = copy(self.scenario) + self.base_scenario = deepcopy(self.scenario) self.base_schedule = copy(self.schedule) self.base_stations = self.electrified_stations.copy() @@ -85,7 +85,7 @@ def loop(self, **kwargs): # baseline greedy optimization # base line is created simply by not having a decision tree and not a pre optimized_set yet - print(opt_util.get_time()) + self.logger.debug(opt_util.get_time()) for group_nr, group in enumerate(groups[:]): # unpack the group events, stations = group @@ -97,6 +97,11 @@ def loop(self, **kwargs): self.logger.warning(lines) self.logger.warning("%s events with %s stations", (len(events)), len(stations)) + if self.config.solver == "spiceev": + # running SpiceEV changes the scenario and vehicle ids. Since the low soc events + # point to the base vehicle ids, these have to be used in the group optimization + self.scenario = deepcopy(self.base_scenario) + # first run is always step by step self.group_optimization(group, self.choose_station_step_by_step, events_remaining=[len(events)], **kwargs) @@ -314,7 +319,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # copy scen and sched from base scenario and base schedule. This way we can be sure # to have the correct original basis for simulation. If we would not copy, there can be # unintended, changes in scenario start times for example, since some values do no stay the - # same if we mutate the rotation dictionary and run the scenario. + # same if we mutate the rotation dictionary and run the scenario (e.g changing vehicle ids) # This led to problems in the past self.copy_scen_sched() diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index f5de1a57..9dcef603 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -111,8 +111,29 @@ def test_deep_optimization(self): assert "Station-2" in opt_sched.stations assert "Station-3" in opt_sched.stations + trips_file_name = "trips_extended.csv" + sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + args.input_schedule = file_root / trips_file_name + config_path = file_root / "optimizer.cfg" + conf = opt_util.read_config(config_path) + + solvers = ["quick", "spiceev"] + node_choices = ["step-by-step", "brute"] + conf.opt_type = "deep" + opt_stat = None + for solver in solvers: + for node_choice in node_choices: + conf.solver = solver + conf.node_choice = node_choice + opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + if opt_stat is None: + opt_stat = {stat for stat in opt_sched.stations} + assert len(opt_stat) > 0 + else: + assert opt_stat == set(opt_sched.stations) + def test_critical_stations_optimization(self, caplog): - """ Test if station 2 and 3 are correctly recognized as critical stations. + """Test if station 2 and 3 are correctly recognized as critical stations. :param caplog: pytest fixture, which is automatically created, to have access to logging data From c4763d10ef1b7828b7a07551980e915dcd8217fc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 27 Mar 2023 14:02:51 +0200 Subject: [PATCH 629/802] Move all prints to mandatory logger --- ebus_toolbox/station_optimization.py | 5 ++--- ebus_toolbox/station_optimizer.py | 8 +++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index d6a5ce19..553abf3d 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -158,8 +158,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): must_stations = optimizer.get_critical_stations_and_rebase(relative_soc=False) logger.warning("%s must stations %s", len(must_stations), must_stations) - logger.debug("Starting greedy station optimization") - print("Starting greedy station optimization") + logger.log(msg="Starting greedy station optimization", level=100) ele_stations, ele_station_set = optimizer.loop() ele_station_set = ele_station_set.union(must_include_set) logger.debug("%s electrified stations : %s", len(ele_station_set), ele_station_set) @@ -191,7 +190,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.warning("Still negative rotations: %s", optimizer.schedule. get_negative_rotations(optimizer.scenario)) - print("Station optimization finished after " + opt_util.get_time()) + logger.log(msg="Station optimization finished after " + opt_util.get_time(), level=100) logger.warning("Station optimization finished after %s", opt_util.get_time()) return optimizer.schedule, optimizer.scenario diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 33e16345..facfbfb2 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -141,8 +141,9 @@ def loop(self, **kwargs): pre_optimized_set = list_greedy_sets[group_nr] for i in range(self.config.max_brute_loop): if i % 10 == 0: - print(len(self.current_tree), " nodes checked") - print(f"Optimal solution has length {len(pre_optimized_set)}") + self.logger.log(msg=f"{len(self.current_tree)} nodes checked", level=100) + self.logger.log(msg=f"Optimal solution has length {len(pre_optimized_set)}", + level=100) self.electrified_stations = self.base_stations.copy() self.electrified_station_set = self.base_electrified_station_set.copy() @@ -861,7 +862,8 @@ def get_critical_stations_and_rebase(self, relative_soc=False): electrified_station_set_all = set(stats) critical_stations = set() nr_of_all_stations = len(electrified_station_set_all) - print(f"Electrifying {nr_of_all_stations-1}/{nr_of_all_stations} stations", ) + self.logger.log(msg=f"Electrifying {nr_of_all_stations-1}/{nr_of_all_stations} stations", + level=100) for station in sorted(electrified_station_set_all): electrified_station_set = electrified_station_set_all.difference([station]) From 5848c4e57eaeb889ef16d1c676d407dd9a7f1bd3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 27 Mar 2023 14:42:52 +0200 Subject: [PATCH 630/802] Fix multilines and missing whitespaces --- ebus_toolbox/optimizer_util.py | 18 +++++++++--------- ebus_toolbox/station_optimization.py | 11 +++++------ ebus_toolbox/util.py | 27 +++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 5e043366..60083074 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -145,8 +145,8 @@ def read_config(config_path): """ config_parser = configparser.ConfigParser() - assert Path(config_path).is_file(), f"Path to optimizer_config: {config_path} " \ - f"does not lead to file" + assert Path(config_path).is_file(), (f"Path to optimizer_config: {config_path} " + "does not lead to file") try: config_parser.read(config_path, encoding="utf-8") except configparser.MissingSectionHeaderError: @@ -433,9 +433,9 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr if could_not_be_electrified is None: could_not_be_electrified = set() - possible_stations = \ - [{station for station in event.stations if station not in impossible_stations} - for event in events] + possible_stations = [ + {station for station in event.stations if station not in impossible_stations} + for event in events] # if station sets have intersections they are returned as single set station_subsets = join_all_subsets(possible_stations) event_groups = [[] for __ in range(len(station_subsets))] @@ -463,7 +463,7 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr def join_all_subsets(subsets): - """ Return sets which are joined together if they have any intersections. + """Return sets which are joined together if they have any intersections. :param subsets: sets to be joined :type subsets: iterable @@ -580,7 +580,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, if power/starting_power < eps: if logger: warnings.warn("charging_curve_to_soc_over_time stopped early") - logger.warning("charging_curve_to_soc_over_time stopped early," + logger.warning("charging_curve_to_soc_over_time stopped early, " "because the charging power of %s was to low for eps: %s" "at an soc of %s an a desired soc of %s", power, eps, soc, args.desired_soc_opps) @@ -593,7 +593,7 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, def get_missing_energy(events): - """ Sum up all the missing energies of the given events. + """Sum up all the missing energies of the given events. :param events: events to be checked :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) @@ -767,7 +767,7 @@ def plot_(data): def plot_rot(rot_id, sched, scen, axis=None, rot_only=True): - """Simple plot of data without having to create subplots. + """ Simple plot of data without having to create subplots. :param rot_id: id of the rotation :type rot_id: str diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 553abf3d..78ec1abb 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -95,8 +95,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): # load pickle files if they are not given as arguments if sched is None or scen is None or args is None: # either all optional arguments are given or none are - assert sched == scen == args is None, "To optimize from .pickle files, schedule," \ - "scenario and arguments need to be provided together" + assert sched == scen == args is None, ("To optimize from .pickle files, schedule, scenario " + "and arguments need to be provided together") sched, scen, args = opt_util.toolbox_from_pickle(conf.schedule, conf.scenario, conf.args) # setup folders, paths and copy config @@ -118,8 +118,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): if conf.run_only_oppb: sched.rotations = {r: sched.rotations[r] for r in sched.rotations if "oppb" in sched.rotations[r].vehicle_id} - assert len(sched.rotations) > 0, "Removing depot chargers led to a schedule without any " \ - "rotations." + assert len(sched.rotations) > 0, "No rotations left after removing depot chargers" # rebasing the scenario meaning simulating it again with SpiceEV and the given conditions of # included stations, excluded stations, filtered rotations and changed battery sizes @@ -147,8 +146,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.warning("%s negative rotations %s were removed from schedule", len(neg_rots), neg_rots) - assert len(optimizer.schedule.rotations) > 0, "Schedule cant be optimized, since" \ - "rotations cant be electrified." + assert len(optimizer.schedule.rotations) > 0, ("Schedule can not be optimized, since " + "rotations can not be electrified.") # if the whole network can not be fully electrified if even just a single station is not # electrified, this station must be included in a fully electrified network diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index cf6875ce..8708ff01 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -91,6 +91,33 @@ def uncomment_json_file(f, char='//'): return json.loads(uncommented_data) +def recursive_dict_updater(dict_to_change, filter_function, modify_function): + """ Change nested dictionary in place given a filter and modify function + + Goes through all values of a dictionary and modifies the value when filter criteria are met. + The filter criteria are checked by the filter_function which gets the arguments key and value. + The values are updated by the modify_function which gets the arguments key and value and returns + the updated value. + :param dict_to_change: nested dictionary that needs to be updated + :type dict_to_change: dict + :param filter_function: function that returns True if the value should be changed with key and + value as arguments + :type filter_function: function + :param modify_function: function that returns the dictionary value with key and value as + arguments + :type modify_function: function + """ + # iterate over all items. For every item, try iterating over it as well until an AttributeError + for key, value in dict_to_change.items(): + try: + recursive_dict_updater(value, filter_function, modify_function) + except AttributeError: + # could not iterate, therefore its a "final" value. check for filter condition + # and apply the modify function + if filter_function(key, value): + dict_to_change[key] = modify_function(key, value) + + def get_csv_delim(path, other_delims=set()): """ Get the delimiter of a character separated file. Checks the file for ",", "tabulator" and ";" as well as optional other characters From ebb204eff422d270ceb7058183b84ec98841cad2 Mon Sep 17 00:00:00 2001 From: Patrick Stecher Date: Tue, 28 Mar 2023 10:25:39 +0200 Subject: [PATCH 631/802] Fixed linting error in schedule: line too long --- ebus_toolbox/schedule.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 990286f5..a859bb58 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -498,7 +498,8 @@ def generate_scenario(self, args): "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, "number_cs": station["n_charging_stations"], - "voltage_level": station.get("voltage_level", args.default_voltage_level) + "voltage_level": + station.get("voltage_level", args.default_voltage_level) } # check for stationary battery battery = station.get("battery") From 6b1ee1d82c5095a4255d0a9f90a9127b8e0fde3d Mon Sep 17 00:00:00 2001 From: Patrick Stecher Date: Tue, 28 Mar 2023 10:33:20 +0200 Subject: [PATCH 632/802] fixed additional linting errors --- ebus_toolbox/schedule.py | 2 +- ebus_toolbox/util.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index a859bb58..88fb6382 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -498,7 +498,7 @@ def generate_scenario(self, args): "max_power": gc_power, "cost": {"type": "fixed", "value": 0.3}, "number_cs": station["n_charging_stations"], - "voltage_level": + "voltage_level": station.get("voltage_level", args.default_voltage_level) } # check for stationary battery diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 1fb8afa6..6e5d27a1 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -289,8 +289,9 @@ def get_args(): default=0) parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' 'at opp station to simulate docking procedure.', default=0) - parser.add_argument('--default_voltage_level', help='Default voltage level for charging stations' - ' if not set in electrified_stations file', type=str, default=None) + parser.add_argument('--default_voltage_level', help='Default voltage level for ' + 'charging stations if not set in electrified_stations file', + type=str, default=None) # #### SIMULATION PARAMETERS ##### parser.add_argument('--days', metavar='N', type=int, default=None, From a2fba1268b9c48492b0abb2533873bfd28427240 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 28 Mar 2023 10:34:02 +0200 Subject: [PATCH 633/802] Extend warning if unpossible combinations arise --- data/examples/default_optimizer.cfg | 10 +++++----- ebus_toolbox/optimizer_util.py | 2 +- ebus_toolbox/simulate.py | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 5197b2fe..32aa20cb 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -1,9 +1,9 @@ # Config for the eBus-Toolbox Optimizer -#[DEFAULT] +#DEFAULT debug_level=1 console_level=99 -[SCENARIO] +#SCENARIO # Use "" for ids and not '' exclusion_rots = [] exclusion_stations= [] @@ -13,14 +13,14 @@ standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_trans "voltage_level": "MV"} -#[VEHICLE] +#VEHICLE charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # charging_power = 250 # min_soc=0.05 -#[OPTIMIZER] +#OPTIMIZER # "quick" or "spiceev" solver = quick rebase_scenario = False @@ -45,7 +45,7 @@ check_for_must_stations = False include_must_stations = True -#[SPECIAL] +#SPECIAL decision_tree_path = "" save_decision_tree = False # Do you want to reduce the rotations to a smaller subset? diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 60083074..1e0ee68c 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -679,7 +679,7 @@ def combs_unordered_no_putting_back(n: int, k: int): try: return math.factorial(n) / ((math.factorial(n - k)) * math.factorial(k)) except ValueError: - warnings.warn("Value Error") + warnings.warn(f"Value Error. n={n}, k={k}") return 0 diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 02548161..0612451a 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -94,7 +94,7 @@ def simulate(args): print(f'Rotations {", ".join(neg_rot)} remain negative.') elif mode == "station_optimization": if not args.optimizer_config: - warnings.warn("Station optimization needs an optimization config file." + warnings.warn("Station optimization needs an optimization config file. " "Since no path was given, station optimization is skipped") continue conf = read_optimizer_config(args.optimizer_config) @@ -102,7 +102,7 @@ def simulate(args): schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, args=args) except Exception as err: - warnings.warn('During Station optimization an error occurred {0}.' + warnings.warn('During Station optimization an error occurred {0}. ' 'Optimization was skipped'.format(err)) elif mode == 'report': # create report based on all previous modes From 634a7a78809c1d570ed303a97b78b2d3e75b6592 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 28 Mar 2023 10:36:38 +0200 Subject: [PATCH 634/802] Make sure greedy electrified set does not mutate over base loop --- ebus_toolbox/station_optimizer.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index facfbfb2..23c32264 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -97,6 +97,12 @@ def loop(self, **kwargs): self.logger.warning(lines) self.logger.warning("%s events with %s stations", (len(events)), len(stations)) + # the electrified_station_set get mutated by the group optimization + # the results are stored in the list of greedy sets, but before each group optimization + # the base stations are restored, so the resulting sets do not stack on top of each + # other + self.electrified_station_set = self.base_electrified_station_set.copy() + if self.config.solver == "spiceev": # running SpiceEV changes the scenario and vehicle ids. Since the low soc events # point to the base vehicle ids, these have to be used in the group optimization From e7d5c87ba3b1351ff0c1e42337df7d4ca63b84b2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 28 Mar 2023 10:43:41 +0200 Subject: [PATCH 635/802] Add trips file for test --- tests/test_input_files/trips_extended.csv | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/test_input_files/trips_extended.csv diff --git a/tests/test_input_files/trips_extended.csv b/tests/test_input_files/trips_extended.csv new file mode 100644 index 00000000..d03e65ed --- /dev/null +++ b/tests/test_input_files/trips_extended.csv @@ -0,0 +1,65 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,20,0 +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,-5,0.9 +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,, +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,, +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,, +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,, +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,, +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,, +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,, +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,, +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,, +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,, +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,, \ No newline at end of file From 5809e52ac05ae25b5fc351af0d2522faa36db2ea Mon Sep 17 00:00:00 2001 From: 0pss <71946340+0pss@users.noreply.github.com> Date: Tue, 4 Apr 2023 09:44:15 +0200 Subject: [PATCH 636/802] cleaned up argparse, added choices for voltage options --- ebus_toolbox/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 6e5d27a1..1885bb87 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -289,9 +289,9 @@ def get_args(): default=0) parser.add_argument('--default-buffer-time-opps', help='time to subtract off of standing time ' 'at opp station to simulate docking procedure.', default=0) - parser.add_argument('--default_voltage_level', help='Default voltage level for ' + parser.add_argument('--default-voltage-level', help='Default voltage level for ' 'charging stations if not set in electrified_stations file', - type=str, default=None) + default='MV', choices=['HV', 'HV/MV', 'MV', 'MV/LV', 'LV']) # #### SIMULATION PARAMETERS ##### parser.add_argument('--days', metavar='N', type=int, default=None, From bee2e49f8a26d19ac2b5d975994b46748fa6e0a3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 4 Apr 2023 10:53:32 +0200 Subject: [PATCH 637/802] Add comment why WindowsPath gets converted to string --- ebus_toolbox/station_optimization.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 78ec1abb..bc678ed5 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -176,6 +176,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): for event in new_events: logger.debug(event.rotation.id) + # Change WindowsPaths to datatype String, since WindowsPath is not json serializable with open(new_ele_stations_path, "w", encoding="utf-8") as file: output_dict = {key: value for key, value in ele_stations.items()} recursive_dict_updater(output_dict, lambda key, value: type(value) == WindowsPath, From 07b0ef98cf374c526f38c774b586cc3168c5b5f3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 4 Apr 2023 11:00:16 +0200 Subject: [PATCH 638/802] Change linebreak --- ebus_toolbox/station_optimizer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 23c32264..498a6122 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -397,8 +397,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # unnecessary calculation thresh = self.config.pruning_threshold if len(pre_optimized_set) - len(self.electrified_station_set) < thresh: - self.scenario.vehicle_socs = \ - self.timeseries_calc(event_rotations, electrify_stations=best_station_ids) + self.scenario.vehicle_socs = self.timeseries_calc( + event_rotations, electrify_stations=best_station_ids) prune_events = self.get_low_soc_events(rotations=event_rotations_ids, rel_soc=True, **kwargs) station_eval = opt_util.evaluate(prune_events, self) From 7e3048443c0c97c99df1545ef49576cef376ef00 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 4 Apr 2023 11:13:27 +0200 Subject: [PATCH 639/802] Check for Path instead of Windowspath and add a test case for proper Path conversion --- ebus_toolbox/station_optimization.py | 4 ++-- tests/test_input_files/electrified_stations.json | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index bc678ed5..e750ff1e 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -176,10 +176,10 @@ def run_optimization(conf, sched=None, scen=None, args=None): for event in new_events: logger.debug(event.rotation.id) - # Change WindowsPaths to datatype String, since WindowsPath is not json serializable + # Change Paths to datatype String, since Paths are not json serializable with open(new_ele_stations_path, "w", encoding="utf-8") as file: output_dict = {key: value for key, value in ele_stations.items()} - recursive_dict_updater(output_dict, lambda key, value: type(value) == WindowsPath, + recursive_dict_updater(output_dict, lambda key, value: isinstance(value, Path), lambda key, value: str(value)) json.dump(output_dict, file, ensure_ascii=False, indent=2) diff --git a/tests/test_input_files/electrified_stations.json b/tests/test_input_files/electrified_stations.json index 11e21383..6e71a084 100644 --- a/tests/test_input_files/electrified_stations.json +++ b/tests/test_input_files/electrified_stations.json @@ -1,6 +1,14 @@ { "Station-0": { "type": "deps", - "n_charging_stations": null + "n_charging_stations": null, + "energy_feed_in": { + "csv_file": "data/examples/example_pv_feedin.csv", + "start_time": "2022-03-07T00:00:00", + "step_duration_s": 3600, + "column": "Feed-in Total (kW)", + "nominal_power": 10, + "factor": 1 + } } } \ No newline at end of file From eac2792e84086e67a378c2fc0ccb70a8d86989fb Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 4 Apr 2023 11:17:13 +0200 Subject: [PATCH 640/802] Move recursive_dict_updater from util to optimzer_util --- ebus_toolbox/optimizer_util.py | 27 +++++++++++++++++++++++++++ ebus_toolbox/station_optimization.py | 7 +++---- ebus_toolbox/util.py | 27 --------------------------- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 1e0ee68c..09fb362d 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -617,6 +617,33 @@ def stations_hash(stations_set): return str(sorted(stations_set)) +def recursive_dict_updater(dict_to_change, filter_function, modify_function): + """ Change nested dictionary in place given a filter and modify function + + Goes through all values of a dictionary and modifies the value when filter criteria are met. + The filter criteria are checked by the filter_function which gets the arguments key and value. + The values are updated by the modify_function which gets the arguments key and value and returns + the updated value. + :param dict_to_change: nested dictionary that needs to be updated + :type dict_to_change: dict + :param filter_function: function that returns True if the value should be changed with key and + value as arguments + :type filter_function: function + :param modify_function: function that returns the dictionary value with key and value as + arguments + :type modify_function: function + """ + # iterate over all items. For every item, try iterating over it as well until an AttributeError + for key, value in dict_to_change.items(): + try: + recursive_dict_updater(value, filter_function, modify_function) + except AttributeError: + # could not iterate, therefore its a "final" value. check for filter condition + # and apply the modify function + if filter_function(key, value): + dict_to_change[key] = modify_function(key, value) + + def combination_generator(iterable: typing.Iterable, amount: int): """ Yields all combinations of choosing an amount, without putting back and without order. diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index e750ff1e..71ebc7db 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -5,12 +5,11 @@ from datetime import datetime import json -from pathlib import Path, WindowsPath +from pathlib import Path import logging import shutil import ebus_toolbox.station_optimizer from ebus_toolbox.station_optimizer import opt_util -from ebus_toolbox.util import recursive_dict_updater from spice_ev.report import generate_soc_timeseries config = opt_util.OptimizerConfig() @@ -179,8 +178,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): # Change Paths to datatype String, since Paths are not json serializable with open(new_ele_stations_path, "w", encoding="utf-8") as file: output_dict = {key: value for key, value in ele_stations.items()} - recursive_dict_updater(output_dict, lambda key, value: isinstance(value, Path), - lambda key, value: str(value)) + opt_util.recursive_dict_updater( + output_dict, lambda key, value: isinstance(value, Path), lambda key, value: str(value)) json.dump(output_dict, file, ensure_ascii=False, indent=2) # Calculation with SpiceEV is more accurate and will show if the optimization is viable or not diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 8708ff01..cf6875ce 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -91,33 +91,6 @@ def uncomment_json_file(f, char='//'): return json.loads(uncommented_data) -def recursive_dict_updater(dict_to_change, filter_function, modify_function): - """ Change nested dictionary in place given a filter and modify function - - Goes through all values of a dictionary and modifies the value when filter criteria are met. - The filter criteria are checked by the filter_function which gets the arguments key and value. - The values are updated by the modify_function which gets the arguments key and value and returns - the updated value. - :param dict_to_change: nested dictionary that needs to be updated - :type dict_to_change: dict - :param filter_function: function that returns True if the value should be changed with key and - value as arguments - :type filter_function: function - :param modify_function: function that returns the dictionary value with key and value as - arguments - :type modify_function: function - """ - # iterate over all items. For every item, try iterating over it as well until an AttributeError - for key, value in dict_to_change.items(): - try: - recursive_dict_updater(value, filter_function, modify_function) - except AttributeError: - # could not iterate, therefore its a "final" value. check for filter condition - # and apply the modify function - if filter_function(key, value): - dict_to_change[key] = modify_function(key, value) - - def get_csv_delim(path, other_delims=set()): """ Get the delimiter of a character separated file. Checks the file for ",", "tabulator" and ";" as well as optional other characters From ef357c717db4a751c31fba9dd668590fc4d66987 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 4 Apr 2023 14:06:58 +0200 Subject: [PATCH 641/802] Break multilines at 1st bracket --- ebus_toolbox/optimizer_util.py | 39 +++++----- ebus_toolbox/station_optimization.py | 8 +- ebus_toolbox/station_optimizer.py | 105 +++++++++++++-------------- 3 files changed, 77 insertions(+), 75 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 09fb362d..53620706 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -186,8 +186,8 @@ def read_config(config_path): conf.solver = default.get("solver", "spiceev") conf.rebase_scenario = default.getboolean("rebase_scenario", True) conf.pickle_rebased = default.getboolean("pickle_rebased", False) - conf.pickle_rebased_name = default.get("pickle_rebased_name", "rebased_" + - datetime.now().isoformat(sep='-', timespec='seconds')) + conf.pickle_rebased_name = default.get( + "pickle_rebased_name", "rebased_" + datetime.now().isoformat(sep='-', timespec='seconds')) conf.opt_type = default.get("opt_type", "greedy") conf.eps = default.getfloat("eps", 0.0001) conf.remove_impossible_rotations = default.getboolean("remove_impossible_rotations", False) @@ -452,8 +452,9 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr break else: if optimizer: - optimizer.logger.warning('Did not find rotation %s in any subset' - 'of possible electrifiable stations', event.rotation.id) + optimizer.logger.warning( + 'Did not find rotation %s in any subset of possible electrifiable stations', + event.rotation.id) # this event will not show up in an event_group. # therefore it needs to be put into this set could_not_be_electrified.update([event.rotation.id]) @@ -525,10 +526,9 @@ def toolbox_to_pickle(name, sched, scen, args): return sched_name, scen_name, args_name -def charging_curve_to_soc_over_time(charging_curve, capacity, args, - max_charge_from_grid=float('inf'), - time_step=0.1, efficiency=1, eps=0.001, - logger: logging.Logger = None): +def charging_curve_to_soc_over_time( + charging_curve, capacity, args, max_charge_from_grid=float('inf'), time_step=0.1, + efficiency=1, eps=0.001, logger: logging.Logger = None): """Create charging curve as np.array with soc and time as two columns of an np.array. :param logger: logger @@ -558,8 +558,9 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, times = [] final_value = args.desired_soc_opps - starting_power = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) + starting_power = min( + np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) if starting_power <= 0: times.append(charge_time) socs.append(soc) @@ -568,11 +569,13 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, while soc < args.desired_soc_opps: times.append(charge_time) socs.append(soc) - power1 = min(np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) + power1 = min( + np.interp(soc, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) soc2 = soc + time_step / 60 * power1 - power2 = min(np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), - max_charge_from_grid / capacity) + power2 = min( + np.interp(soc2, normalized_curve[:, 0], normalized_curve[:, 1]), + max_charge_from_grid / capacity) power = (power1 + power2) / 2 * efficiency delta_soc = time_step / 60 * power soc += delta_soc @@ -580,10 +583,10 @@ def charging_curve_to_soc_over_time(charging_curve, capacity, args, if power/starting_power < eps: if logger: warnings.warn("charging_curve_to_soc_over_time stopped early") - logger.warning("charging_curve_to_soc_over_time stopped early, " - "because the charging power of %s was to low for eps: %s" - "at an soc of %s an a desired soc of %s", - power, eps, soc, args.desired_soc_opps) + logger.warning( + "charging_curve_to_soc_over_time stopped early, because the charging power of " + "%s was to low for eps: %s at an soc of %s an a desired soc of %s", power, eps, + soc, args.desired_soc_opps) final_value = soc break # fill the soc completely in last time step diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 71ebc7db..72b015a7 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -143,8 +143,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): r: optimizer.schedule.rotations[r] for r in optimizer.schedule.rotations if r not in optimizer.config.exclusion_rots} - logger.warning("%s negative rotations %s were removed from schedule", - len(neg_rots), neg_rots) + logger.warning( + "%s negative rotations %s were removed from schedule", len(neg_rots), neg_rots) assert len(optimizer.schedule.rotations) > 0, ("Schedule can not be optimized, since " "rotations can not be electrified.") @@ -187,8 +187,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False) - logger.warning("Still negative rotations: %s", optimizer.schedule. - get_negative_rotations(optimizer.scenario)) + logger.warning("Still negative rotations: %s", + optimizer.schedule.get_negative_rotations(optimizer.scenario)) logger.log(msg="Station optimization finished after " + opt_util.get_time(), level=100) logger.warning("Station optimization finished after %s", opt_util.get_time()) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index 498a6122..d04b29c1 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -67,8 +67,8 @@ def loop(self, **kwargs): # get events where soc fell below the minimal # soc. The events contain info about the problematic # time span, which includes stations which could provide a soc lift - base_events = self.get_low_soc_events(rel_soc=False, - soc_data=self.base_scenario.vehicle_socs) + base_events = self.get_low_soc_events( + rel_soc=False, soc_data=self.base_scenario.vehicle_socs) # check if the events can be divided into subgroups which are independent # this makes optimization in smaller groups possible @@ -92,8 +92,8 @@ def loop(self, **kwargs): # define the current tree from the decision trees self.current_tree = self.decision_trees[group_nr] lines = {lne for e in events for lne in e.rotation.lines} - self.logger.warning("Optimizing %s out of %s. This includes these Lines", group_nr + 1, - len(groups)) + self.logger.warning( + "Optimizing %s out of %s. This includes these Lines", group_nr + 1, len(groups)) self.logger.warning(lines) self.logger.warning("%s events with %s stations", (len(events)), len(stations)) @@ -109,12 +109,11 @@ def loop(self, **kwargs): self.scenario = deepcopy(self.base_scenario) # first run is always step by step - self.group_optimization(group, self.choose_station_step_by_step, - events_remaining=[len(events)], **kwargs) + self.group_optimization( + group, self.choose_station_step_by_step, events_remaining=[len(events)], **kwargs) self.logger.warning("Greedy Result ++++++++ %s stations out of %s", - len(self.electrified_station_set), - len(stations)) + len(self.electrified_station_set), len(stations)) self.logger.warning(self.electrified_station_set) list_greedy_sets[group_nr] = self.electrified_station_set.copy() @@ -140,16 +139,16 @@ def loop(self, **kwargs): combinations = opt_util.combs_unordered_no_putting_back( len(stations), len(list_greedy_sets[group_nr]) - 1) - self.logger.debug("There are %s combinations with 1 station less than " - "the current solution with %s stations out of %s", combinations, - len(list_greedy_sets[group_nr]), len(stations)) + self.logger.debug( + "There are %s combinations with 1 station less than the current solution with %s " + "stations out of %s", combinations, len(list_greedy_sets[group_nr]), len(stations)) pre_optimized_set = list_greedy_sets[group_nr] for i in range(self.config.max_brute_loop): if i % 10 == 0: self.logger.log(msg=f"{len(self.current_tree)} nodes checked", level=100) - self.logger.log(msg=f"Optimal solution has length {len(pre_optimized_set)}", - level=100) + self.logger.log( + msg=f"Optimal solution has length {len(pre_optimized_set)}", level=100) self.electrified_stations = self.base_stations.copy() self.electrified_station_set = self.base_electrified_station_set.copy() @@ -186,9 +185,9 @@ def loop(self, **kwargs): new_electrified_set = self.electrified_station_set # if a new set was found, print it and save it in solutions if new_electrified_set != pre_optimized_set and new_stats is not None: - self.logger.warning("Optimized with %s stations %s %s", - len(new_electrified_set), str('#' * 20), - opt_util.stations_hash(new_electrified_set)) + self.logger.warning( + "Optimized with %s stations %s %s", len(new_electrified_set), + str('#' * 20), opt_util.stations_hash(new_electrified_set)) solutions.append(new_electrified_set) if len(new_electrified_set) < len(pre_optimized_set): list_greedy_sets[group_nr] = new_electrified_set.copy() @@ -199,8 +198,8 @@ def loop(self, **kwargs): # print all solutions self.logger.debug("All solutions for this group: %s", solutions) # how many stations do these solutions need in comparison to the available stations? - self.logger.debug("Optimized with %s stations out of %s", len(pre_optimized_set), - len(stations)) + self.logger.debug( + "Optimized with %s stations out of %s", len(pre_optimized_set), len(stations)) # make sure it gets printed in the console through high level self.logger.log(msg=opt_util.get_time(), level=100) @@ -268,9 +267,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ tree_position = kwargs.get("tree_position", [1]) # give tree position - self.logger.debug("%s with length of %s and a total of %s " - "stations", tree_position, len(tree_position), - len(self.electrified_station_set)) + self.logger.debug( + "%s with length of %s and a total of %s stations", tree_position, len(tree_position), + len(self.electrified_station_set)) # unpack events and possible stations event_group, _ = group @@ -308,9 +307,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ raise opt_util.SuboptimalSimulationException # get the best stations, brute or step_by_step - best_station_ids, recursive = choose_station_function(station_eval, - pre_optimized_set=pre_optimized_set, - missing_energy=missing_energy) + best_station_ids, recursive = choose_station_function( + station_eval, pre_optimized_set=pre_optimized_set, missing_energy=missing_energy) stat_eval_dict = {stat_id[0]: stat_id[1] for stat_id in station_eval} @@ -338,8 +336,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # current electrification would show to much charge, since charging curves decrease over # soc. self.deepcopy_socs() - self.scenario.vehicle_socs = self.timeseries_calc(event_rotations, - electrify_stations=best_station_ids) + self.scenario.vehicle_socs = self.timeseries_calc( + event_rotations, electrify_stations=best_station_ids) else: self.schedule.rotations = rotation_dict self.schedule, self.scenario = opt_util.run_schedule( @@ -355,9 +353,9 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ delta_energy = opt_util.get_missing_energy(new_events) events_remaining[0] -= len(event_group) - len(new_events) - self.logger.debug("Last electrification electrified %s/%s." - " %s remaining events in the base group.", - len(event_group) - len(new_events), len(event_group), events_remaining[0]) + self.logger.debug( + "Last electrification electrified %s/%s. %s remaining events in the base group.", + len(event_group) - len(new_events), len(event_group), events_remaining[0]) delta_base_energy = delta_energy # put this node into the decision tree including the missing energy @@ -372,9 +370,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ raise opt_util.SuboptimalSimulationException # check if the events can be divided into subgroups which are independent - groups = opt_util.get_groups_from_events(new_events, self.not_possible_stations, - could_not_be_electrified, - optimizer=self) + groups = opt_util.get_groups_from_events( + new_events, self.not_possible_stations, could_not_be_electrified, optimizer=self) for k, this_group in enumerate(groups): this_tree = tree_position + [k + 1] @@ -399,8 +396,8 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ if len(pre_optimized_set) - len(self.electrified_station_set) < thresh: self.scenario.vehicle_socs = self.timeseries_calc( event_rotations, electrify_stations=best_station_ids) - prune_events = self.get_low_soc_events(rotations=event_rotations_ids, - rel_soc=True, **kwargs) + prune_events = self.get_low_soc_events( + rotations=event_rotations_ids, rel_soc=True, **kwargs) station_eval = opt_util.evaluate(prune_events, self) prune_missing_energy = opt_util.get_missing_energy(prune_events) if not self.is_branch_promising(station_eval, self.electrified_station_set, @@ -434,8 +431,9 @@ def sort_station_events(self, charge_events_single_station): return sorted(charge_events_single_station, key=lambda x: x.arrival_time) @opt_util.time_it - def timeseries_calc(self, rotations=None, soc_dict=None, ele_station_set=None, - soc_upper_threshold=None, electrify_stations=None) -> object: + def timeseries_calc( + self, rotations=None, soc_dict=None, ele_station_set=None, soc_upper_threshold=None, + electrify_stations=None) -> object: """ A quick estimation of socs for after electrifying stations. The function assumes unlimited charging points per electrified station. @@ -589,9 +587,9 @@ def is_branch_promising(self, station_eval, electrified_station_set, for i in range(0, min(delta, len(station_eval))): pot += station_eval[i][1] if pot < -missing_energy * self.config.estimation_threshold: - self.logger.debug("Not enough potential: %s after: %s ", - round(pot / -missing_energy, 0), - opt_util.stations_hash(electrified_station_set)) + self.logger.debug( + "Not enough potential: %s after: %s ", round(pot / -missing_energy, 0), + opt_util.stations_hash(electrified_station_set)) return False return True @@ -648,8 +646,9 @@ def choose_station_brute(self, station_eval, self.current_tree[node_name] = get_init_node() return comb, False else: - self.logger.debug("skipped %s since potential is too low %s %%", comb, - round(potential / -missing_energy * 100, 0)) + self.logger.debug( + "skipped %s since potential is too low %s %%", comb, + round(potential / -missing_energy * 100, 0)) try: self.current_tree[node_name]["viable"] = False except KeyError: @@ -682,8 +681,8 @@ def choose_station_step_by_step(self, station_eval, # filter function to stop simulating cases which have no hope of being optimal. # potentials have to be at least as promising as the pre-optimized case. if pre_optimized_set is not None: - if not self.is_branch_promising(station_eval, self.electrified_station_set, - pre_optimized_set, missing_energy): + if not self.is_branch_promising( + station_eval, self.electrified_station_set, pre_optimized_set, missing_energy): # best station id is none and do not go deeper in recursion node_name = opt_util.stations_hash(self.electrified_station_set) self.current_tree[node_name]["viable"] = False @@ -776,8 +775,8 @@ def rebase_simple(self): # electrify inclusion stations for stat in self.config.inclusion_stations: self.electrify_station(stat, must_include_set) - self.schedule.rotations = {r: self.schedule.rotations[r] for r in self.schedule.rotations if - r not in self.config.exclusion_rots} + self.schedule.rotations = {r: self.schedule.rotations[r] for r in self.schedule.rotations + if r not in self.config.exclusion_rots} self.must_include_set = must_include_set self.base_stations = self.electrified_stations.copy() return must_include_set, self.electrified_stations @@ -803,16 +802,16 @@ def preprocessing_scenario(self, electrified_stations=None, run_only_neg=False): # calc new but only prev. negative rotations if run_only_neg: rots = self.schedule.get_negative_rotations(self.scenario) - rots = {r: self.schedule.rotations[r] for r in rots if r not in - self.config.exclusion_rots} + rots = {r: self.schedule.rotations[r] for r in rots + if r not in self.config.exclusion_rots} self.schedule.rotations = rots else: - rots = {r: self.schedule.rotations[r] for r in self.schedule.rotations if - r not in self.config.exclusion_rots} + rots = {r: self.schedule.rotations[r] for r in self.schedule.rotations + if r not in self.config.exclusion_rots} self.schedule.rotations = rots - new_sched, new_scen = opt_util.run_schedule(self.schedule, self.args, - electrified_stations) + new_sched, new_scen = opt_util.run_schedule( + self.schedule, self.args, electrified_stations) self.schedule = new_sched self.scenario = new_scen self.must_include_set = must_include_set @@ -1073,8 +1072,8 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, else: for ii, trip in enumerate(trips): try: - standing_time_min = opt_util.get_charging_time(trip, trips[ii + 1], - self.args) + standing_time_min = opt_util.get_charging_time( + trip, trips[ii + 1], self.args) except IndexError: standing_time_min = 0 if standing_time_min > 0: From d6ce74ec788ccf295d669747ca3e9eb42da69866 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 4 Apr 2023 14:08:52 +0200 Subject: [PATCH 642/802] Break multiline --- ebus_toolbox/optimizer_util.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 53620706..edeb5a46 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -380,10 +380,11 @@ def evaluate(events: typing.Iterable[LowSocEvent], # - useful lift can only occur in between the current soc and the # - the highest useful lift is the amount between a "full" and "empty" battery, where # "full" and "empty" are described by the upper and lower thresholds - delta_soc_pot = min(soc_upper_thresh - soc, - soc_lower_thresh - e.min_soc, - soc - e.min_soc, - soc_upper_thresh - soc_lower_thresh) + delta_soc_pot = min( + soc_upper_thresh - soc, + soc_lower_thresh - e.min_soc, + soc - e.min_soc, + soc_upper_thresh - soc_lower_thresh) try: standing_time_min = get_charging_time(trip, e.trip[i + 1], optimizer.args) From 462409d1149d826e505cfd37ab1d670d153bd4ff Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Thu, 6 Apr 2023 13:28:21 +0200 Subject: [PATCH 643/802] explanation of cost calculation in rtd --- docs/source/modes.rst | 97 ++++++++++++++++++++++++++++++++++++++++++- ebus_toolbox/costs.py | 1 + 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index c6563bbd..204411a2 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -12,6 +12,7 @@ different modes support the user in finding optimal solutions for their eBus-Sys * negative depot to opportunity charger * negative opportunity to depot charger * station optimization +* report Single simulation @@ -57,4 +58,98 @@ station optimization chained modes ------------- -Lorem ipsum ... \ No newline at end of file +Lorem ipsum ... + + +Report +------------- +Cost calculation +~~~~~~~~~~~~~ + +This mode calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. +The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV `_ for the calculation of electricity costs. + +* Investment + * **Busses**: Costs for all busses used in the simulation. Costs include battery swaps, depending on the lifetime of both busses and batteries. + * **Charging infrastructure**: Costs for all depot and opportunity charging stations, depending on the number of actually used charging stations at each grid connector. + * **Grid connectors**: Costs for grid connectors and transformers, depending on the voltage level and the distance to the grid. + * **Garages**: Costs for workstations and charging infrastructure at garages. + * **Stationary storages**: Costs for stationary batteries at depot and opportunity stations, depending on its capacity. +* Maintenance + * Depending on the lifetime of each component maintenance costs are calculated for busses, charging infrastructure, grid connectors and stationary storages. +* Electricity + * **Power procurement**: Costs for the procurement of energy. + * **Grid fees**: Costs for power and energy price, depending on the voltage level and the utilization time per year. + * **Taxes**: Taxes like electricity taxes, depending on given taxes by price sheet. + * **Feed-in remuneration**: Remuneration for electricity fed into the grid. + +As result the following table is saved as CSV: + ++---------------------------------+----------+-----------------------------------------------------------------------+ +|**parameter** | **unit** | **description** | ++=================================+==========+=======================================================================+ +|c_vehicles | EUR | Investment costs of all busses | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_gcs | EUR | Investment costs of all grid connectors | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_cs | EUR | Investment costs of all charging stations | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage_cs | EUR | Investment costs of charging stations at garages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage | EUR | Investment costs of garages itself | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage_workstations | EUR | Investment costs of working stations at garages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_stat_storage | EUR | Investment costs of stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_invest | EUR | Sum of all investment costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_vehicles_annual | EUR/year | Annual investment costs of all busses | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_gcs_annual | EUR/year | Annual investment costs of all grid connectors | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_cs_annual | EUR/year | Annual investment costs of all charging stations | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage_annual | EUR/year | Sum of annual investment costs of garages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_stat_storage_annual | EUR/year | Annual investment costs of all stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_invest_annual | EUR/year | Sum of all annual investment costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_gc_annual | EUR/year | Annual maintenance costs of grid connectors | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_infrastructure_annual | EUR/year | Annual maintenance costs of charging stations and stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_vehicles_annual | EUR/year | Annual maintenance costs of busses | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_stat_storage_annual | EUR/year | Annual maintenance costs of stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_annual | EUR/year | Sum of annual maintenance costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_procurement_annual | EUR/year | Annual costs of power procurement | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_power_price_annual | EUR/year | Annual grid fee for highest load peak | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_energy_price_annual | EUR/year | Annual grid fee for drawn energy | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_taxes_annual | EUR/year | Annual costs for all electricity related taxes | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_feed_in_remuneration_annual | EUR/year | Annual feed-in remuneration | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_annual | EUR/year | Sum of all annual electricity costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ + + + + + + + + + + + + diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index e89b11c8..e2dc65dd 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -150,6 +150,7 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_maint_annual"] = (costs["c_maint_infrastructure_annual"] + costs["c_maint_vehicles_annual"]) costs["c_invest"] = costs["c_vehicles"] + costs["c_cs"] + costs["c_gcs"] + costs["c_garage"] + # ToDo: add stat storages to investment costs (also annual)? costs["c_invest_annual"] = (costs["c_vehicles_annual"] + costs["c_cs_annual"] + costs["c_gcs_annual"] + costs["c_garage_annual"]) From 7b0afac84c872bf370e534b63edc515476f7c07d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 13:59:35 +0200 Subject: [PATCH 644/802] remove test output from gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 346f01c4..382af8eb 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,3 @@ data/preprocessing_scripts src/ spice_ev/ *.bak -/tests/test_output_files/ From 92e0ded4c1ea6882b4a1673f960958801b27a6a5 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 14:00:28 +0200 Subject: [PATCH 645/802] Make station_data reading more clear and add comment --- ebus_toolbox/schedule.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index f8f640ba..47c8058e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -69,12 +69,14 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): station_data = dict() station_path = kwargs.get("station_data_path") + # find the temperature and elevation of the stations by reading the .csv file. + # this data is stored in the schedule and passed to the trips, which use the information + # for consumption calculation. Missing station data is handled with default values. if station_path is not None: try: - with open(str(station_path), "r", encoding='utf-8') as f: + with open(station_path, "r", encoding='utf-8') as f: delim = util.get_csv_delim(station_path) reader = csv.DictReader(f, delimiter=delim) - station_data = dict() for row in reader: station_data.update({str(row['Endhaltestelle']): {"elevation": float(row['elevation'])}}) @@ -88,8 +90,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): "values in the column 'elevation'. Station data is discarded.". format(station_path), stacklevel=100) - else: - schedule.station_data = station_data + schedule.station_data = station_data with open(path_to_csv, 'r', encoding='utf-8') as trips_file: trip_reader = csv.DictReader(trips_file) From 0620309dce41ec229687eea0e65826c7abc1af73 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 15:47:04 +0200 Subject: [PATCH 646/802] Cast consumption path to string --- ebus_toolbox/consumption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index e4b8ff5d..63e3f182 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -101,7 +101,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem raise KeyError # load consumption csv - consumption_path = vehicle_info["mileage"] + consumption_path = str(vehicle_info["mileage"]) # consumption_files holds interpol functions of csv files which are called directly From 8be4be51981ec59771e6218b023ae2d154db2728 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 15:48:03 +0200 Subject: [PATCH 647/802] Remove unneeded returns and change linebreaks --- tests/test_consumption.py | 63 +++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index e777f68c..ea0cfcf2 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -25,14 +25,14 @@ def test_calculate_consumption(self): # check distance scaling def calc_c(distance): - return consumption.calculate_consumption(time, distance, vehicle_type, charging_type, - temp=10, height_diff=0, level_of_loading=0, - mean_speed=18)[0] + return consumption.calculate_consumption( + time, distance, vehicle_type, charging_type, temp=10, height_diff=0, + level_of_loading=0, mean_speed=18)[0] assert calc_c(dist) * 2 == calc_c(dist * 2) assert calc_c(dist) / 2 == calc_c(dist / 2) - vehicle[1][charging_type]["mileage"] = str(self.consumption_path) + vehicle[1][charging_type]["mileage"] = self.consumption_path # consumption is based on this formula def true_cons(lol, incline, speed, t_amb): @@ -47,52 +47,45 @@ def true_cons(lol, incline, speed, t_amb): distance = 1000 # 1000m =1km, since true_cons give the consumption per 1000 m # Check various inputs, which need interpolation - assert true_cons(lol, incline, speed, t_amb) == \ - consumption.calculate_consumption(time, distance, vehicle_type, charging_type, - temp=t_amb, height_diff=incline * distance, - level_of_loading=lol, - mean_speed=speed)[0] + assert true_cons(lol, incline, speed, t_amb) == consumption.calculate_consumption( + time, distance, vehicle_type, charging_type, temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, mean_speed=speed)[0] incline = 0.05 - assert true_cons(lol, incline, speed, t_amb) == \ - consumption.calculate_consumption(time, distance, vehicle_type, charging_type, - temp=t_amb, height_diff=incline * distance, - level_of_loading=lol, - mean_speed=speed)[0] + assert true_cons(lol, incline, speed, t_amb) == consumption.calculate_consumption( + time, distance, vehicle_type, charging_type, temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, mean_speed=speed)[0] + t_amb = 15 - assert true_cons(lol, incline, speed, t_amb) == \ - consumption.calculate_consumption(time, distance, vehicle_type, charging_type, - temp=t_amb, height_diff=incline * distance, - level_of_loading=lol, - mean_speed=speed)[0] + assert true_cons(lol, incline, speed, t_amb) == consumption.calculate_consumption( + time, distance, vehicle_type, charging_type, temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, mean_speed=speed)[0] + lol = 0.1 - assert true_cons(lol, incline, speed, t_amb) == \ - consumption.calculate_consumption(time, distance, vehicle_type, charging_type, - temp=t_amb, height_diff=incline * distance, - level_of_loading=lol, - mean_speed=speed)[0] + assert true_cons(lol, incline, speed, t_amb) == consumption.calculate_consumption( + time, distance, vehicle_type, charging_type, temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, mean_speed=speed)[0] # check for out of bounds consumption. Max consumption in the table is 6.6. t_amb = -99999 incline = 99999 lol = 99999 speed = 99999 - assert consumption.calculate_consumption(time, distance, vehicle_type, charging_type, - temp=t_amb, height_diff=incline * distance, - level_of_loading=lol, - mean_speed=speed)[0] < 6.7 + assert consumption.calculate_consumption( + time, distance, vehicle_type, charging_type, temp=t_amb, height_diff=incline * distance, + level_of_loading=lol, mean_speed=speed)[0] < 6.7 - # check temperature default from temperature timeseries when temp is None - _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=None, height_diff=0, level_of_loading=0, - mean_speed=18)[0] + # check temperature default runs without errors when temp is None + consumption.calculate_consumption( + time, dist, vehicle_type, charging_type, temp=None, height_diff=0, level_of_loading=0, + mean_speed=18)[0] # check temperature default from temperature time series error throwing last_hour = 12 consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): - _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, temp=None, height_diff=0, level_of_loading=0, mean_speed=18)[0] del consumption.temperatures_by_hour @@ -109,11 +102,11 @@ def true_cons(lol, incline, speed, t_amb): consumption.lol_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): - _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, temp=20, height_diff=0, level_of_loading=None, mean_speed=18)[0] del consumption.lol_by_hour with pytest.raises(AttributeError): - _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, + consumption.calculate_consumption(time, dist, vehicle_type, charging_type, temp=20, height_diff=0, level_of_loading=None, mean_speed=18)[0] From d3e9085b58800b62e270930f8859db90632e96f3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 15:49:54 +0200 Subject: [PATCH 648/802] Make flake8 happy and linebreaks --- tests/test_consumption.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index ea0cfcf2..cea9a3a8 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -85,14 +85,15 @@ def true_cons(lol, incline, speed, t_amb): consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=None, height_diff=0, level_of_loading=0, - mean_speed=18)[0] + consumption.calculate_consumption( + time, dist, vehicle_type, charging_type, temp=None, height_diff=0, + level_of_loading=0, mean_speed=18)[0] + del consumption.temperatures_by_hour with pytest.raises(AttributeError): - _ = consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=None, height_diff=0, level_of_loading=0, - mean_speed=18)[0] + consumption.calculate_consumption( + time, dist, vehicle_type, charging_type, temp=None, height_diff=0, + level_of_loading=0, mean_speed=18)[0] # reset temperature_by_hour consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, 24)} @@ -102,11 +103,11 @@ def true_cons(lol, incline, speed, t_amb): consumption.lol_by_hour = {hour: hour * 2 - 15 for hour in range(0, last_hour)} time = datetime(year=2023, month=1, day=1, hour=last_hour + 2) with pytest.raises(KeyError): - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=20, height_diff=0, level_of_loading=None, - mean_speed=18)[0] + consumption.calculate_consumption( + time, dist, vehicle_type, charging_type, temp=20, height_diff=0, + level_of_loading=None, mean_speed=18)[0] del consumption.lol_by_hour with pytest.raises(AttributeError): - consumption.calculate_consumption(time, dist, vehicle_type, charging_type, - temp=20, height_diff=0, level_of_loading=None, - mean_speed=18)[0] + consumption.calculate_consumption( + time, dist, vehicle_type, charging_type, temp=20, height_diff=0, + level_of_loading=None, mean_speed=18)[0] From dd61d433c64b0e97cc98e18447a3d7ad9fee47cf Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 16:18:21 +0200 Subject: [PATCH 649/802] Remove unnecessary pytest docstring --- tests/test_rotation.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test_rotation.py b/tests/test_rotation.py index 507c0685..838109e8 100644 --- a/tests/test_rotation.py +++ b/tests/test_rotation.py @@ -1,11 +1,3 @@ -""" -run these tests with `pytest tests/test_something.py` or `pytest tests` or simply `pytest` -pytest will look for all files starting with "test_" and run all functions -within this file. For basic example of tests you can look at our workshop -https://github.com/rl-institut/workshop/tree/master/test-driven-development. -Otherwise https://docs.pytest.org/en/latest/ and https://docs.python.org/3/library/unittest.html -are also good support. -""" from tests.helpers import generate_basic_schedule From c2bf396d7a302d21128f208a64d1069d5daeeb60 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 16:47:59 +0200 Subject: [PATCH 650/802] Remove consistency check since consistency functionality got overhauled --- tests/test_schedule.py | 127 +++++++++++------------------------------ 1 file changed, 33 insertions(+), 94 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 12ad8ccc..a3b12d54 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -9,6 +9,7 @@ test_root = pathlib.Path(__file__).parent file_root = test_root / "test_input_files" +example_root = pathlib.Path(__file__).parent.parent / "data/examples" mandatory_args = { "min_recharge_deps_oppb": 0, @@ -22,14 +23,14 @@ class TestSchedule: - temperature_path = file_root / 'default_temp_winter.csv' - lol_path = file_root / 'default_level_of_loading_over_day.csv' + temperature_path = example_root / 'default_temp_winter.csv' + lol_path = example_root / 'default_level_of_loading_over_day.csv' - with open(file_root / "electrified_stations.json", "r", encoding='utf-8') as file: - electrified_stations = json.load(file) + with open(example_root / "electrified_stations.json", "r", encoding='utf-8') as file: + electrified_stations = util.uncomment_json_file(file) - with open(file_root / "vehicle_types.json", "r", encoding='utf-8') as file: - vehicle_types = json.load(file) + with open(example_root / "vehicle_types.json", "r", encoding='utf-8') as file: + vehicle_types = util.uncomment_json_file(file) def test_mandatory_options_exit(self): """ Check if the schedule creation properly throws a SystemExit error in case of missing @@ -43,111 +44,51 @@ def test_mandatory_options_exit(self): def test_station_data_reading(self): """ Test if the reading of the geo station data works and outputs warnings in case the data was problematic, e.g. not numeric or not existent""" - path_to_trips = file_root / "trips.csv" + path_to_trips = example_root / "trips_example.csv" - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) + trip.Trip.consumption = consumption.Consumption( + self.vehicle_types, outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) - path_to_all_station_data = file_root / "all_stations_example.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) + path_to_all_station_data = example_root / "all_stations.csv" + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) assert generated_schedule.station_data is not None # check if reading a non valid station.csv throws warnings with pytest.warns(Warning) as record: path_to_all_station_data = file_root / "not_existent_file" - schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, - **mandatory_args, station_data_path=path_to_all_station_data) + schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) assert len(record) == 1 path_to_all_station_data = file_root / "not_numeric_stations.csv" - schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, - **mandatory_args, station_data_path=path_to_all_station_data) + schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) assert len(record) == 2 - def test_rotation_consistency(self, tmp_path): - """ Test if the consistency check for rotations finds missing einsetz or ausetzfahrten, - if it finds gaps between arrival and departure stations of successive trips and last - it checks if the arguments for check_rotation_consistency and ignore_inconsistent_rotations - were set correctly, i.e. if ignore_inconsistent_rotations is True, - check_rotation_consistency has to be true as well. If not a warning has to be thrown - :param tmp_path: pytest fixture to a path that is dynamically created - """ - - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - output_dir = tmp_path - rotation_consistency_dict = dict(check_rotation_consistency=True, - ignore_inconsistent_rotations=True, - output_directory=output_dir) - - # check if consistency check does not remove rotations of a "good" trips.csv - path_to_trips = file_root / "trips.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args) - - generated_schedule2 = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, - **mandatory_args, - **rotation_consistency_dict) - - assert len(generated_schedule.rotations) == len(generated_schedule2.rotations) - - # check if consistency check does removes bad rotation of a "bad" trips.csv - path_to_trips = file_root / "trips_no_einsetz.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - **rotation_consistency_dict) - assert len(generated_schedule.rotations) == 0 - - # check if consistency check does removes bad rotation of a "bad" trips.csv - path_to_trips = file_root / "trips_no_aussetz.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - **rotation_consistency_dict) - assert len(generated_schedule.rotations) == 0 - - # check if consistency check does removes bad rotation of a "bad" trips.csv. - # in this case a skipping of stations between trips - path_to_trips = file_root / "inconsistent_stations_trips.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - **rotation_consistency_dict) - assert len(generated_schedule.rotations) == 0 - - # check if consistency throws warning for bad arguments - with pytest.warns(Warning) as record: - path_to_trips = file_root / "inconsistent_stations_trips.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, - **mandatory_args, - check_rotation_consistency=False, - ignore_inconsistent_rotations=True, - output_directory=output_dir) - assert len(record) == 1 - def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned :return: schedule, scenario""" - path_to_trips = file_root / "trips.csv" + path_to_trips = example_root / "trips.csv" parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args(args="") - args.config = file_root / "ebus_toolbox.cfg" + args.config = example_root / "ebus_toolbox.cfg" args.days = None args.seed = 5 - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) + trip.Trip.consumption = consumption.Consumption( + self.vehicle_types,outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) - path_to_all_station_data = file_root / "all_stations_example.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) + path_to_all_station_data = example_root / "all_stations_example.csv" + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types,self.electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) set_options_from_config(args, check=parser, verbose=False) args.ALLOW_NEGATIVE_SOC = True @@ -173,11 +114,9 @@ def test_assign_vehicles(self): generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) generated_schedule.assign_vehicles() - - assert generated_schedule.rotations["1"].vehicle_id == \ - generated_schedule.rotations["2"].vehicle_id - assert generated_schedule.rotations["1"].vehicle_id != \ - generated_schedule.rotations["3"].vehicle_id + gen_rotations = generated_schedule.rotations + assert gen_rotations["1"].vehicle_id == gen_rotations["2"].vehicle_id + assert gen_rotations["1"].vehicle_id != gen_rotations["3"].vehicle_id def test_calculate_consumption(self): """ Test if calling the consumption calculation works From 795ad312077e5cdaa0baa85e90580b7503099eb1 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 12 Apr 2023 17:02:53 +0200 Subject: [PATCH 651/802] Make test_schedule.py runnable with mostly files from example folder --- tests/test_schedule.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index a3b12d54..2994a176 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -74,10 +74,11 @@ def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned :return: schedule, scenario""" - path_to_trips = example_root / "trips.csv" + path_to_trips = example_root / "trips_example.csv" parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args(args="") - args.config = example_root / "ebus_toolbox.cfg" + # ToDo: Change to example root if current ebus toolbox is merged + args.config = file_root / "ebus_toolbox.cfg" args.days = None args.seed = 5 @@ -85,7 +86,7 @@ def test_basic_run(self): self.vehicle_types,outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) - path_to_all_station_data = example_root / "all_stations_example.csv" + path_to_all_station_data = example_root / "all_stations.csv" generated_schedule = schedule.Schedule.from_csv( path_to_trips, self.vehicle_types,self.electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) @@ -173,9 +174,10 @@ def test_scenario_with_feed_in(self): """ Check if running a example with an extended electrified stations file with feed in, external load and battery works and if a scenario object is returned""" - path_to_trips = file_root / "trips.csv" + path_to_trips = example_root / "trips_example.csv" parser = util.create_ArgumentParser_with_arguments() args = parser.parse_args(args="") + # Todo change to example root after merge args.config = file_root / "ebus_toolbox.cfg" electrified_stations_path = file_root / "electrified_stations_with_feeds.json" args.electrified_stations = electrified_stations_path @@ -189,7 +191,7 @@ def test_scenario_with_feed_in(self): outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) - path_to_all_station_data = file_root / "all_stations_example.csv" + path_to_all_station_data = example_root / "all_stations.csv" generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) From 6ab2261fd0aa45eff3c2058adeb53da5135e0a2c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 09:51:29 +0200 Subject: [PATCH 652/802] Change linebreaks --- tests/test_schedule.py | 43 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 2994a176..12f16402 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -112,8 +112,8 @@ def test_assign_vehicles(self): level_of_loading_over_day=self.lol_path) path_to_trips = file_root / "trips_assign_vehicles.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args) + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) generated_schedule.assign_vehicles() gen_rotations = generated_schedule.rotations assert gen_rotations["1"].vehicle_id == gen_rotations["2"].vehicle_id @@ -122,13 +122,14 @@ def test_assign_vehicles(self): def test_calculate_consumption(self): """ Test if calling the consumption calculation works """ - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) + trip.Trip.consumption = consumption.Consumption( + self.vehicle_types, outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) path_to_trips = file_root / "trips_assign_vehicles.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args) + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) + # set mileage constant mileage = 10 for v_typ in generated_schedule.vehicle_types.values(): @@ -146,13 +147,13 @@ def test_get_common_stations(self): on the second day. rotation 1 should not share any stations with other rotations and 2 and 3 are basically simulati """ - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) + trip.Trip.consumption = consumption.Consumption( + self.vehicle_types, outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) path_to_trips = file_root / "trips_assign_vehicles.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - self.electrified_stations, **mandatory_args) + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) common_stations = generated_schedule.get_common_stations(only_opps=False) assert len(common_stations["1"]) == 0 @@ -187,14 +188,14 @@ def test_scenario_with_feed_in(self): args.days = None args.seed = 5 - trip.Trip.consumption = consumption.Consumption(self.vehicle_types, - outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) + trip.Trip.consumption = consumption.Consumption( + self.vehicle_types, outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) path_to_all_station_data = example_root / "all_stations.csv" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) set_options_from_config(args, check=parser, verbose=False) args.ALLOW_NEGATIVE_SOC = True @@ -214,9 +215,9 @@ def test_scenario_with_feed_in(self): electrified_stations["Station-0"]["energy_feed_in"]["csv_file"] = file_root / "not_a_file" electrified_stations["Station-0"]["external_load"]["csv_file"] = file_root / "not_a_file" - generated_schedule = schedule.Schedule.from_csv(path_to_trips, self.vehicle_types, - electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) set_options_from_config(args, check=parser, verbose=False) From 018271c62435d941f98fdc8aa6661c193bc995ca Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 10:42:08 +0200 Subject: [PATCH 653/802] Use example consumption as input for testing and mutate the file --- tests/test_consumption.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index cea9a3a8..ee841bd2 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -2,16 +2,17 @@ import pathlib from tests.test_schedule import TestSchedule from datetime import datetime +import pandas as pd test_root = pathlib.Path(__file__).parent file_root = test_root / "test_input_files" - +example_root = pathlib.Path(__file__).parent.parent / "data/examples" class TestConsumption: """Class to test Consumption functionality""" - consumption_path = file_root / "testing_energy_consumption.csv" + consumption_path = example_root / "energy_consumption_example.csv" - def test_calculate_consumption(self): + def test_calculate_consumption(self, tmp_path): """ Various tests to trigger errors and check if behaviour is as expected""" schedule, scenario = TestSchedule().test_basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) @@ -32,12 +33,26 @@ def calc_c(distance): assert calc_c(dist) * 2 == calc_c(dist * 2) assert calc_c(dist) / 2 == calc_c(dist / 2) - vehicle[1][charging_type]["mileage"] = self.consumption_path + # create a custom and well defined consumption file based on this formula - # consumption is based on this formula def true_cons(lol, incline, speed, t_amb): - return lol + incline + speed / 10 + abs(t_amb - 20) / 10 + return lol + incline + speed / 10 + (t_amb - 20) / 10 + + # apply the formula on the consumption file + consumption_df = pd.read_csv(self.consumption_path) + consumption_col = consumption_df["consumption_kwh_per_km"] + lol_col = consumption_df["level_of_loading"] + incline_col = consumption_df["incline"] + speed_col = consumption_df["mean_speed_kmh"] + temp_col = consumption_df["t_amb"] + + consumption_col[:] = true_cons(lol_col, incline_col, speed_col, temp_col) + + # save the file in a temp folder and use from now on + consumption_df.to_csv(tmp_path / "consumption.csv") + consumption_path = tmp_path / "consumption.csv" + vehicle[1][charging_type]["mileage"] = consumption_path consumption.vehicle_types[vehicle_type][charging_type] = vehicle[1][charging_type] lol = 0.5 @@ -46,12 +61,13 @@ def true_cons(lol, incline, speed, t_amb): t_amb = 20 distance = 1000 # 1000m =1km, since true_cons give the consumption per 1000 m - # Check various inputs, which need interpolation + # Check various inputs, which need interpolation. Inputs have to be inside of the data, i.e. + # not out of bounds assert true_cons(lol, incline, speed, t_amb) == consumption.calculate_consumption( time, distance, vehicle_type, charging_type, temp=t_amb, height_diff=incline * distance, level_of_loading=lol, mean_speed=speed)[0] - incline = 0.05 + incline = 0.02 assert true_cons(lol, incline, speed, t_amb) == consumption.calculate_consumption( time, distance, vehicle_type, charging_type, temp=t_amb, height_diff=incline * distance, level_of_loading=lol, mean_speed=speed)[0] @@ -67,7 +83,7 @@ def true_cons(lol, incline, speed, t_amb): level_of_loading=lol, mean_speed=speed)[0] # check for out of bounds consumption. Max consumption in the table is 6.6. - t_amb = -99999 + t_amb = 99999 incline = 99999 lol = 99999 speed = 99999 From bae8ed41f0fd9484fb758e93b8d536e8512c1ba5 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 10:43:30 +0200 Subject: [PATCH 654/802] Change trips assign file so it works with example --- .../trips_assign_vehicles.csv | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/test_input_files/trips_assign_vehicles.csv b/tests/test_input_files/trips_assign_vehicles.csv index 90f938fa..0138062f 100644 --- a/tests/test_input_files/trips_assign_vehicles.csv +++ b/tests/test_input_files/trips_assign_vehicles.csv @@ -1,16 +1,16 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB -LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB -Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB -Einsetzfahrt,Station-0,2022-03-08 21:31:00,2022-03-08 21:31:00,Station-1,7000,2,CKB -LINE_0,Station-1,2022-03-08 21:31:00,2022-03-08 22:04:00,Station-2,10000,2,CKB -LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-3,12000,2,CKB -LINE_0,Station-3,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-4,8000,2,CKB -Aussetzfahrt,Station-4,2022-03-08 23:28:00,2022-03-08 00:03:00,Station-0,5000,2,CKB -Einsetzfahrt,Station-0,2022-03-08 21:32:00,2022-03-08 21:33:00,Station-1,7000,3,CKB -LINE_0,Station-1,2022-03-08 21:33:00,2022-03-08 22:04:00,Station-2,10000,3,CKB -LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-3,12000,3,CKB -LINE_0,Station-3,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-4,8000,3,CKB -Aussetzfahrt,Station-4,2022-03-08 23:28:00,2022-03-08 00:03:00,Station-0,5000,3,CKB \ No newline at end of file +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,AB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,AB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,AB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,AB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,AB +Einsetzfahrt,Station-0,2022-03-08 21:31:00,2022-03-08 21:31:00,Station-1,7000,2,AB +LINE_0,Station-1,2022-03-08 21:31:00,2022-03-08 22:04:00,Station-2,10000,2,AB +LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-3,12000,2,AB +LINE_0,Station-3,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-4,8000,2,AB +Aussetzfahrt,Station-4,2022-03-08 23:28:00,2022-03-08 00:03:00,Station-0,5000,2,AB +Einsetzfahrt,Station-0,2022-03-08 21:32:00,2022-03-08 21:33:00,Station-1,7000,3,AB +LINE_0,Station-1,2022-03-08 21:33:00,2022-03-08 22:04:00,Station-2,10000,3,AB +LINE_0,Station-2,2022-03-08 22:08:00,2022-03-08 22:43:00,Station-3,12000,3,AB +LINE_0,Station-3,2022-03-08 22:51:00,2022-03-08 23:24:00,Station-4,8000,3,AB +Aussetzfahrt,Station-4,2022-03-08 23:28:00,2022-03-08 00:03:00,Station-0,5000,3,AB \ No newline at end of file From 4da8607ee679ba4de9c318ca5974aa59cacdf4c3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:03:25 +0200 Subject: [PATCH 655/802] Remove test input files which are part of the examples folder --- tests/helpers.py | 10 +- .../test_input_files/all_stations_example.csv | 4 - .../default_level_of_loading_over_day.csv | 25 --- .../test_input_files/default_temp_winter.csv | 25 --- tests/test_input_files/ebus_toolbox.cfg | 119 ------------ .../electrified_stations.json | 6 - .../electrified_stations_with_feeds.json | 93 ---------- .../example_external_load.csv | 169 ------------------ tests/test_input_files/example_pv_feedin.csv | 169 ------------------ .../testing_energy_consumption.csv | 73 -------- tests/test_input_files/trips.csv | 6 - tests/test_input_files/trips_no_aussetz.csv | 6 - tests/test_input_files/trips_no_einsetz.csv | 6 - tests/test_input_files/vehicle_types.json | 22 --- tests/test_rotation.py | 18 +- tests/test_schedule.py | 2 +- 16 files changed, 22 insertions(+), 731 deletions(-) delete mode 100644 tests/test_input_files/all_stations_example.csv delete mode 100644 tests/test_input_files/default_level_of_loading_over_day.csv delete mode 100644 tests/test_input_files/default_temp_winter.csv delete mode 100644 tests/test_input_files/ebus_toolbox.cfg delete mode 100644 tests/test_input_files/electrified_stations.json delete mode 100644 tests/test_input_files/electrified_stations_with_feeds.json delete mode 100644 tests/test_input_files/example_external_load.csv delete mode 100644 tests/test_input_files/example_pv_feedin.csv delete mode 100644 tests/test_input_files/testing_energy_consumption.csv delete mode 100644 tests/test_input_files/trips.csv delete mode 100644 tests/test_input_files/trips_no_aussetz.csv delete mode 100644 tests/test_input_files/trips_no_einsetz.csv delete mode 100644 tests/test_input_files/vehicle_types.json diff --git a/tests/helpers.py b/tests/helpers.py index e12fc304..93b3927c 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -5,11 +5,11 @@ def generate_basic_schedule(): - schedule_path = 'tests/test_input_files/trips.csv' - station_path = 'tests/test_input_files/electrified_stations.json' - temperature_path = 'tests/test_input_files/default_temp_winter.csv' - lol_path = 'tests/test_input_files/default_level_of_loading_over_day.csv' - with open("tests/test_input_files/vehicle_types.json", 'r', encoding='utf-8') as f: + schedule_path = 'data/examples/trips_example.csv' + station_path = 'data/examples/electrified_stations.json' + temperature_path = 'data/examples/default_temp_winter.csv' + lol_path = 'data/examples/default_level_of_loading_over_day.csv' + with open("data/examples/vehicle_types.json", 'r', encoding='utf-8') as f: vehicle_types = json.load(f) trip.Trip.consumption = consumption.Consumption(vehicle_types, outside_temperatures=temperature_path, diff --git a/tests/test_input_files/all_stations_example.csv b/tests/test_input_files/all_stations_example.csv deleted file mode 100644 index dec18443..00000000 --- a/tests/test_input_files/all_stations_example.csv +++ /dev/null @@ -1,4 +0,0 @@ -Endhaltestelle,elevation -Station A,1 -Station B,9 -Station C,10 \ No newline at end of file diff --git a/tests/test_input_files/default_level_of_loading_over_day.csv b/tests/test_input_files/default_level_of_loading_over_day.csv deleted file mode 100644 index 00fd62d9..00000000 --- a/tests/test_input_files/default_level_of_loading_over_day.csv +++ /dev/null @@ -1,25 +0,0 @@ -hour,level_of_loading -0,0.5 -1,0.5 -2,0.5 -3,0.5 -4,0.5 -5,0.5 -6,0.5 -7,0.5 -8,0.5 -9,0.5 -10,0.5 -11,0.5 -12,0.5 -13,0.5 -14,0.5 -15,0.5 -16,0.5 -17,0.5 -18,0.5 -19,0.5 -20,0.5 -21,0.5 -22,0.5 -23,0.5 diff --git a/tests/test_input_files/default_temp_winter.csv b/tests/test_input_files/default_temp_winter.csv deleted file mode 100644 index 67ea0d6d..00000000 --- a/tests/test_input_files/default_temp_winter.csv +++ /dev/null @@ -1,25 +0,0 @@ -hour,temperature -00,-1.1 -01,-1.1 -02,-2.2 -03,-2.7 -04,-2.7 -05,-2.7 -06,-2.7 -07,-3.8 -08,-3.8 -09,-3.8 -10,-3.8 -11,-2.7 -12,-1.1 -13,1.1 -14,2.2 -15,2.2 -16,1.1 -17,0 -18,0 -19,-1.1 -20,-1.1 -21,-1.1 -22,-1.1 -23,-1.1 diff --git a/tests/test_input_files/ebus_toolbox.cfg b/tests/test_input_files/ebus_toolbox.cfg deleted file mode 100644 index 0b436390..00000000 --- a/tests/test_input_files/ebus_toolbox.cfg +++ /dev/null @@ -1,119 +0,0 @@ -# Configs for the eBus Toolbox - -##### INPUT/OUTPUT FILES AND PATHS ##### - -# Input file containing trip information (required) -input_schedule = "./tests/test_input_files/trips_example.csv" - -# output files generated by eBusTool and SpiceEV are stored here (defaults to: data/sim_outputs) -output_directory = "./data/sim_outputs/" - -# electrified stations (defaults to: data/examples/electrified_stations.json) -electrified_stations = "tests/test_input_files/electrified_stations.json" - -# vehicle types (defaults to: ./data/examples/vehicle_types.json) -vehicle_types = ".tests/test_input_files/vehicle_types.json" - -# Path to station data with stations heights -station_data_path = "tests/test_input_files/all_stations.csv" - -# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -outside_temperature_over_day_path = "tests/test_input_files/default_temp_winter.csv" - -# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours (needed if mileage in vehicle types not constant) -level_of_loading_over_day_path = "tests/test_input_files/default_level_of_loading_over_day.csv" - - -##### COST CALCULATION ##### -# set flag for cost calculation: -cost_calculation = true -# cost parameters (Calculation of costs is optional, defaults to None) -cost_parameters_file = "./tests/test_input_files/cost_params.json" - - -##### SIMULATION HYPERPARAMETERS ##### -# set random seed (for always random: set seed = null) -seed = 1 - -# Options: sim, neg_depb_to_oppb, neg_oppb_to_depb, service_optimization. Default: sim -# sim runs a single simulation with the given inputs. -# neg_depb_to_oppb changes negative depb-rotations to oppb charging. -# neg_oppb_to_depb changes negative oppb-rotations to depb charging. -# service optimization finds the largest set of electrified rotations. -mode = sim - -# set length of timestep in minutes (default: 15 minute intervals) -interval = 1 - -# time difference between signal time and actual start time of a vehicle event im min. (default: 10) -signal_time_dif = 10 - -# Check rotation assumptions when building schedule? -check_rotation_consistency = false -# Remove rotations from schedule that violate assumptions? Needs check_rotation_consistency to have an effect -ignore_inconsistent_rotations = false - -##### SIMULATION CONDITIONS AND BOUNDARIES ##### - -# maximum number of days to simulate, if not set simulate entire schedule -#days = 10 - -# set minimum allowed state of charge when leaving -# distinguish between depot and opportunity station -desired_soc_deps = 1.0 -desired_soc_opps = 0.8 - -# Preferred charging type. Options: depb, oppb (default: oppb) -preferred_charging_type = "oppb" - -# min charging time at depots and opp stations [minutes] (default: 0) -min_charging_time = 0 - -# buffer time at opp station if no specific buffer time is provided -# via the electrified_stations.json [minutes] (default: 0) -# Time specific buffer times can be set via a dict like: -# {"10-22": 5, "else": 2} NOTE: else clause is a MUST! -# The buffer time is deducted off of the planned standing time. -# It may resemble things like delays and/or docking procedures -default_buffer_time_opps = 0 - - -##### PHYSICAL SETUP OF ENVIRONMENT ##### - -# minimum fraction of capacity for recharge when leaving the depot. Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) -min_recharge_deps_oppb = 1 -min_recharge_deps_depb = 1 - -# default max power of grid connectors at depot and opp stations, -# individual gc_power per gc can be defined in electrified stations -# default: Sum of max power of all charging stations at this grid connector -gc_power_opps = 1000 -gc_power_deps = 1000 - -# default max power of charging station at depot and opp stations -# at depot stations opp and depot busses have distinct charging stations (all default to: 150) -# individual cs_power per gc and cs type can be defined in electrified stations -cs_power_opps = 400 -cs_power_deps_depb = 100 -cs_power_deps_oppb = 150 - -# define hours of traffic_jam (options are "stop&go" and "dense") -#rush_hour = {"stop&go": [["07:00", "09:00"], ["15:00", "17:00"]], "dense": [["17:00", "19:00"]]} - - -########### SPICE_EV SIMULATE PARAMETERS ############### - -strategy = distributed -# possible strategies: greedy, balanced, balanced_market, schedule, flex_window -# options: LOAD_STRAT (sub-strategy for some strategies), CONCURRENCY [-], HORIZON [h], PRICE_THRESHOLD [€] -strategy_option = [["CONCURRENCY", 1.0], ["PRICE_THRESHOLD", 0.001], ["ALLOW_NEGATIVE_SOC", true], ["RESET_NEGATIVE_SOC", false]] - -# generate report and plots, default: false -generate_report = true -# show plots for users to view, only valid if generate_report = true -show_plots = true - -# give margin for desired SoC [0.0 - 1.0] -# margin = 0.1 -> simulation will not abort if vehicles reach at least 90% of the desired SoC before leaving. -# margin = 1.0 -> simulation continues with every positive SoC value, but may fail if trips can not be completed. -margin = 1.0 diff --git a/tests/test_input_files/electrified_stations.json b/tests/test_input_files/electrified_stations.json deleted file mode 100644 index 11e21383..00000000 --- a/tests/test_input_files/electrified_stations.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Station-0": { - "type": "deps", - "n_charging_stations": null - } -} \ No newline at end of file diff --git a/tests/test_input_files/electrified_stations_with_feeds.json b/tests/test_input_files/electrified_stations_with_feeds.json deleted file mode 100644 index 85525970..00000000 --- a/tests/test_input_files/electrified_stations_with_feeds.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "Station-0": { - "type": "deps", - "n_charging_stations": null, - "distance_to_grid": 150, - "energy_feed_in": { - "csv_file": "data/examples/example_pv_feedin.csv", - "start_time": "2022-03-07T00:00:00", - "step_duration_s": 3600, - "column": "Feed-in Total (kW)", - "nominal_power": 10, - "factor": 1 - }, - "external_load": { - "csv_file": "data/examples/example_external_load.csv", - "start_time": "2022-03-07T00:00:00", - "step_duration_s": 900, - "column": "External Load (kW)", - "factor": 2 - }, - "voltage_level" : "MV", - "battery": { - "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required - "capacity": 300, // kWh, assumed to be infinite if not given - "min_charging_power": 0, // kW, optional - "soc": 0, // initial state of charge [0-1], optional - "efficiency": 0.95, // optional - "discharge_curve": null // optional, same as charging curve - }, - "cs_power_deps_oppb" : 50, // optional: maximum cs power can be defined per station - "cs_power_deps_depb" : 120 // optional: maximum cs power can be defined per station - }, - "Station-3": { - "type": "opps", - "n_charging_stations": 3, - "voltage_level" : "MV", - "energy_feed_in": { - "csv_file": "data/examples/example_pv_feedin.csv", - "start_time": "2022-03-08T00:00:00", - "step_duration_s": 3600, - "column": "Feed-in Total (kW)", - "nominal_power": 2, - "factor": 0.5 - } - }, - "Station-10": { - "type": "opps", - "n_charging_stations": 1, - "voltage_level" : "MV", - "gc_power": 250, // optional: maximum gc power can be defined per station - "cs_power_opps" : 140 // optional: maximum cs power can be defined per station - }, - "Station-21": { - "type": "opps", - "n_charging_stations": 2, - "voltage_level" : "MV" - }, - "Station-22": { - "type": "deps", - "n_charging_stations": null, - "voltage_level" : "MV" - }, - "Station-26": { - "type": "opps", - "n_charging_stations": 5, - "voltage_level" : "MV" - }, - "Station-28": { - "type": "opps", - "n_charging_stations": 4, - "voltage_level" : "MV" - }, - "Station-30": { - "type": "opps", - "n_charging_stations": 4, - "voltage_level" : "MV" - }, - "Station-32": { - "type": "opps", - "n_charging_stations": 3, - "voltage_level" : "MV" - }, - "Station-39": { - "type": "opps", - "n_charging_stations": 5, - "voltage_level" : "MV" - }, - "Station-42": { - "type": "deps", - "n_charging_stations": null, - "voltage_level" : "MV" - } -} diff --git a/tests/test_input_files/example_external_load.csv b/tests/test_input_files/example_external_load.csv deleted file mode 100644 index a6e10456..00000000 --- a/tests/test_input_files/example_external_load.csv +++ /dev/null @@ -1,169 +0,0 @@ -time,External Load (kW) -2018-01-01 00:00:00+01:00,5.16 -2018-01-01 01:00:00+01:00,35.48 -2018-01-01 02:00:00+01:00,6.00 -2018-01-01 03:00:00+01:00,4.11 -2018-01-01 04:00:00+01:00,33.82 -2018-01-01 05:00:00+01:00,15.24 -2018-01-01 06:00:00+01:00,8.14 -2018-01-01 07:00:00+01:00,14.29 -2018-01-01 08:00:00+01:00,28.21 -2018-01-01 09:00:00+01:00,11.47 -2018-01-01 10:00:00+01:00,10.48 -2018-01-01 11:00:00+01:00,18.22 -2018-01-01 12:00:00+01:00,37.40 -2018-01-01 13:00:00+01:00,34.82 -2018-01-01 14:00:00+01:00,4.60 -2018-01-01 15:00:00+01:00,31.82 -2018-01-01 16:00:00+01:00,29.10 -2018-01-01 17:00:00+01:00,22.37 -2018-01-01 18:00:00+01:00,15.62 -2018-01-01 19:00:00+01:00,8.29 -2018-01-01 20:00:00+01:00,33.94 -2018-01-01 21:00:00+01:00,3.23 -2018-01-01 22:00:00+01:00,23.44 -2018-01-01 23:00:00+01:00,17.28 -2018-01-02 00:00:00+01:00,10.01 -2018-01-02 01:00:00+01:00,32.82 -2018-01-02 02:00:00+01:00,12.49 -2018-01-02 03:00:00+01:00,7.27 -2018-01-02 04:00:00+01:00,37.27 -2018-01-02 05:00:00+01:00,34.28 -2018-01-02 06:00:00+01:00,25.58 -2018-01-02 07:00:00+01:00,18.00 -2018-01-02 08:00:00+01:00,7.90 -2018-01-02 09:00:00+01:00,1.88 -2018-01-02 10:00:00+01:00,19.48 -2018-01-02 11:00:00+01:00,21.86 -2018-01-02 12:00:00+01:00,0.67 -2018-01-02 13:00:00+01:00,3.62 -2018-01-02 14:00:00+01:00,4.61 -2018-01-02 15:00:00+01:00,17.42 -2018-01-02 16:00:00+01:00,39.72 -2018-01-02 17:00:00+01:00,26.93 -2018-01-02 18:00:00+01:00,7.25 -2018-01-02 19:00:00+01:00,6.29 -2018-01-02 20:00:00+01:00,15.48 -2018-01-02 21:00:00+01:00,1.89 -2018-01-02 22:00:00+01:00,38.54 -2018-01-02 23:00:00+01:00,36.71 -2018-01-03 00:00:00+01:00,0.63 -2018-01-03 01:00:00+01:00,15.72 -2018-01-03 02:00:00+01:00,14.13 -2018-01-03 03:00:00+01:00,6.39 -2018-01-03 04:00:00+01:00,11.81 -2018-01-03 05:00:00+01:00,30.54 -2018-01-03 06:00:00+01:00,1.67 -2018-01-03 07:00:00+01:00,10.25 -2018-01-03 08:00:00+01:00,19.56 -2018-01-03 09:00:00+01:00,28.35 -2018-01-03 10:00:00+01:00,30.06 -2018-01-03 11:00:00+01:00,12.46 -2018-01-03 12:00:00+01:00,21.00 -2018-01-03 13:00:00+01:00,16.93 -2018-01-03 14:00:00+01:00,26.33 -2018-01-03 15:00:00+01:00,11.79 -2018-01-03 16:00:00+01:00,31.70 -2018-01-03 17:00:00+01:00,33.23 -2018-01-03 18:00:00+01:00,15.07 -2018-01-03 19:00:00+01:00,6.85 -2018-01-03 20:00:00+01:00,18.43 -2018-01-03 21:00:00+01:00,15.52 -2018-01-03 22:00:00+01:00,3.19 -2018-01-03 23:00:00+01:00,1.38 -2018-01-04 00:00:00+01:00,38.34 -2018-01-04 01:00:00+01:00,22.72 -2018-01-04 02:00:00+01:00,6.04 -2018-01-04 03:00:00+01:00,5.20 -2018-01-04 04:00:00+01:00,13.89 -2018-01-04 05:00:00+01:00,1.95 -2018-01-04 06:00:00+01:00,17.37 -2018-01-04 07:00:00+01:00,10.18 -2018-01-04 08:00:00+01:00,31.57 -2018-01-04 09:00:00+01:00,1.85 -2018-01-04 10:00:00+01:00,27.54 -2018-01-04 11:00:00+01:00,15.15 -2018-01-04 12:00:00+01:00,27.39 -2018-01-04 13:00:00+01:00,1.07 -2018-01-04 14:00:00+01:00,15.87 -2018-01-04 15:00:00+01:00,8.68 -2018-01-04 16:00:00+01:00,11.23 -2018-01-04 17:00:00+01:00,32.89 -2018-01-04 18:00:00+01:00,36.06 -2018-01-04 19:00:00+01:00,17.42 -2018-01-04 20:00:00+01:00,26.70 -2018-01-04 21:00:00+01:00,32.41 -2018-01-04 22:00:00+01:00,27.35 -2018-01-04 23:00:00+01:00,2.69 -2018-01-05 00:00:00+01:00,36.49 -2018-01-05 01:00:00+01:00,36.07 -2018-01-05 02:00:00+01:00,28.91 -2018-01-05 03:00:00+01:00,29.32 -2018-01-05 04:00:00+01:00,39.44 -2018-01-05 05:00:00+01:00,7.89 -2018-01-05 06:00:00+01:00,8.04 -2018-01-05 07:00:00+01:00,33.84 -2018-01-05 08:00:00+01:00,26.80 -2018-01-05 09:00:00+01:00,38.52 -2018-01-05 10:00:00+01:00,33.08 -2018-01-05 11:00:00+01:00,11.39 -2018-01-05 12:00:00+01:00,39.39 -2018-01-05 13:00:00+01:00,29.03 -2018-01-05 14:00:00+01:00,12.59 -2018-01-05 15:00:00+01:00,30.77 -2018-01-05 16:00:00+01:00,37.99 -2018-01-05 17:00:00+01:00,27.89 -2018-01-05 18:00:00+01:00,0.32 -2018-01-05 19:00:00+01:00,22.43 -2018-01-05 20:00:00+01:00,0.25 -2018-01-05 21:00:00+01:00,25.04 -2018-01-05 22:00:00+01:00,11.68 -2018-01-05 23:00:00+01:00,6.74 -2018-01-06 00:00:00+01:00,36.65 -2018-01-06 01:00:00+01:00,17.65 -2018-01-06 02:00:00+01:00,9.48 -2018-01-06 03:00:00+01:00,27.64 -2018-01-06 04:00:00+01:00,22.12 -2018-01-06 05:00:00+01:00,17.45 -2018-01-06 06:00:00+01:00,11.22 -2018-01-06 07:00:00+01:00,9.37 -2018-01-06 08:00:00+01:00,35.61 -2018-01-06 09:00:00+01:00,8.27 -2018-01-06 10:00:00+01:00,11.68 -2018-01-06 11:00:00+01:00,33.98 -2018-01-06 12:00:00+01:00,36.31 -2018-01-06 13:00:00+01:00,33.21 -2018-01-06 14:00:00+01:00,37.04 -2018-01-06 15:00:00+01:00,8.37 -2018-01-06 16:00:00+01:00,4.22 -2018-01-06 17:00:00+01:00,12.98 -2018-01-06 18:00:00+01:00,14.96 -2018-01-06 19:00:00+01:00,19.94 -2018-01-06 20:00:00+01:00,5.09 -2018-01-06 21:00:00+01:00,37.47 -2018-01-06 22:00:00+01:00,16.43 -2018-01-06 23:00:00+01:00,31.26 -2018-01-07 00:00:00+01:00,10.79 -2018-01-07 01:00:00+01:00,7.06 -2018-01-07 02:00:00+01:00,39.06 -2018-01-07 03:00:00+01:00,12.52 -2018-01-07 04:00:00+01:00,34.01 -2018-01-07 05:00:00+01:00,9.36 -2018-01-07 06:00:00+01:00,22.25 -2018-01-07 07:00:00+01:00,31.88 -2018-01-07 08:00:00+01:00,27.65 -2018-01-07 09:00:00+01:00,5.76 -2018-01-07 10:00:00+01:00,38.97 -2018-01-07 11:00:00+01:00,22.58 -2018-01-07 12:00:00+01:00,18.30 -2018-01-07 13:00:00+01:00,8.78 -2018-01-07 14:00:00+01:00,37.14 -2018-01-07 15:00:00+01:00,9.10 -2018-01-07 16:00:00+01:00,38.67 -2018-01-07 17:00:00+01:00,36.16 -2018-01-07 18:00:00+01:00,4.79 -2018-01-07 19:00:00+01:00,12.90 -2018-01-07 20:00:00+01:00,28.39 -2018-01-07 21:00:00+01:00,20.73 -2018-01-07 22:00:00+01:00,39.39 -2018-01-07 23:00:00+01:00,23.12 diff --git a/tests/test_input_files/example_pv_feedin.csv b/tests/test_input_files/example_pv_feedin.csv deleted file mode 100644 index 7725d8cc..00000000 --- a/tests/test_input_files/example_pv_feedin.csv +++ /dev/null @@ -1,169 +0,0 @@ -time,Feed-in Total (kW) -2018-01-01 00:00:00+01:00,0.0 -2018-01-01 01:00:00+01:00,0.0 -2018-01-01 02:00:00+01:00,0.0 -2018-01-01 03:00:00+01:00,0.0 -2018-01-01 04:00:00+01:00,0.0 -2018-01-01 05:00:00+01:00,0.0 -2018-01-01 06:00:00+01:00,0.0 -2018-01-01 07:00:00+01:00,0.0 -2018-01-01 08:00:00+01:00,0.0 -2018-01-01 09:00:00+01:00,20.59949737304199 -2018-01-01 10:00:00+01:00,57.44536767395442 -2018-01-01 11:00:00+01:00,87.80795648835002 -2018-01-01 12:00:00+01:00,82.4312872827236 -2018-01-01 13:00:00+01:00,60.73295277209872 -2018-01-01 14:00:00+01:00,38.57275076938971 -2018-01-01 15:00:00+01:00,0.0 -2018-01-01 16:00:00+01:00,0.0 -2018-01-01 17:00:00+01:00,0.0 -2018-01-01 18:00:00+01:00,0.0 -2018-01-01 19:00:00+01:00,0.0 -2018-01-01 20:00:00+01:00,0.0 -2018-01-01 21:00:00+01:00,0.0 -2018-01-01 22:00:00+01:00,0.0 -2018-01-01 23:00:00+01:00,0.0 -2018-01-02 00:00:00+01:00,0.0 -2018-01-02 01:00:00+01:00,0.0 -2018-01-02 02:00:00+01:00,0.0 -2018-01-02 03:00:00+01:00,0.0 -2018-01-02 04:00:00+01:00,0.0 -2018-01-02 05:00:00+01:00,0.0 -2018-01-02 06:00:00+01:00,0.0 -2018-01-02 07:00:00+01:00,0.0 -2018-01-02 08:00:00+01:00,0.0 -2018-01-02 09:00:00+01:00,0.9282483231458806 -2018-01-02 10:00:00+01:00,6.522839084117224 -2018-01-02 11:00:00+01:00,18.113391973670502 -2018-01-02 12:00:00+01:00,23.93442006207004 -2018-01-02 13:00:00+01:00,19.02198413802917 -2018-01-02 14:00:00+01:00,3.7944513234994064 -2018-01-02 15:00:00+01:00,0.0 -2018-01-02 16:00:00+01:00,0.0 -2018-01-02 17:00:00+01:00,0.0 -2018-01-02 18:00:00+01:00,0.0 -2018-01-02 19:00:00+01:00,0.0 -2018-01-02 20:00:00+01:00,0.0 -2018-01-02 21:00:00+01:00,0.0 -2018-01-02 22:00:00+01:00,0.0 -2018-01-02 23:00:00+01:00,0.0 -2018-01-03 00:00:00+01:00,0.0 -2018-01-03 01:00:00+01:00,0.0 -2018-01-03 02:00:00+01:00,0.0 -2018-01-03 03:00:00+01:00,0.0 -2018-01-03 04:00:00+01:00,0.0 -2018-01-03 05:00:00+01:00,0.0 -2018-01-03 06:00:00+01:00,0.0 -2018-01-03 07:00:00+01:00,0.0 -2018-01-03 08:00:00+01:00,0.0 -2018-01-03 09:00:00+01:00,0.0 -2018-01-03 10:00:00+01:00,0.0 -2018-01-03 11:00:00+01:00,3.1043054608116027 -2018-01-03 12:00:00+01:00,44.500155163804976 -2018-01-03 13:00:00+01:00,48.60707644284791 -2018-01-03 14:00:00+01:00,5.352609987933698 -2018-01-03 15:00:00+01:00,0.0 -2018-01-03 16:00:00+01:00,0.0 -2018-01-03 17:00:00+01:00,0.0 -2018-01-03 18:00:00+01:00,0.0 -2018-01-03 19:00:00+01:00,0.0 -2018-01-03 20:00:00+01:00,0.0 -2018-01-03 21:00:00+01:00,0.0 -2018-01-03 22:00:00+01:00,0.0 -2018-01-03 23:00:00+01:00,0.0 -2018-01-04 00:00:00+01:00,0.0 -2018-01-04 01:00:00+01:00,0.0 -2018-01-04 02:00:00+01:00,0.0 -2018-01-04 03:00:00+01:00,0.0 -2018-01-04 04:00:00+01:00,0.0 -2018-01-04 05:00:00+01:00,0.0 -2018-01-04 06:00:00+01:00,0.0 -2018-01-04 07:00:00+01:00,0.0 -2018-01-04 08:00:00+01:00,0.0 -2018-01-04 09:00:00+01:00,2.412911528138851 -2018-01-04 10:00:00+01:00,7.735581619871407 -2018-01-04 11:00:00+01:00,21.291168270279613 -2018-01-04 12:00:00+01:00,40.94436918414178 -2018-01-04 13:00:00+01:00,42.373288765911056 -2018-01-04 14:00:00+01:00,29.225648212630627 -2018-01-04 15:00:00+01:00,0.0 -2018-01-04 16:00:00+01:00,0.0 -2018-01-04 17:00:00+01:00,0.0 -2018-01-04 18:00:00+01:00,0.0 -2018-01-04 19:00:00+01:00,0.0 -2018-01-04 20:00:00+01:00,0.0 -2018-01-04 21:00:00+01:00,0.0 -2018-01-04 22:00:00+01:00,0.0 -2018-01-04 23:00:00+01:00,0.0 -2018-01-05 00:00:00+01:00,0.0 -2018-01-05 01:00:00+01:00,0.0 -2018-01-05 02:00:00+01:00,0.0 -2018-01-05 03:00:00+01:00,0.0 -2018-01-05 04:00:00+01:00,0.0 -2018-01-05 05:00:00+01:00,0.0 -2018-01-05 06:00:00+01:00,0.0 -2018-01-05 07:00:00+01:00,0.0 -2018-01-05 08:00:00+01:00,0.0 -2018-01-05 09:00:00+01:00,19.40043544618326 -2018-01-05 10:00:00+01:00,17.78003649979294 -2018-01-05 11:00:00+01:00,19.1828395051374 -2018-01-05 12:00:00+01:00,17.28758152431003 -2018-01-05 13:00:00+01:00,37.19451480924751 -2018-01-05 14:00:00+01:00,26.347029652712724 -2018-01-05 15:00:00+01:00,0.0 -2018-01-05 16:00:00+01:00,0.0 -2018-01-05 17:00:00+01:00,0.0 -2018-01-05 18:00:00+01:00,0.0 -2018-01-05 19:00:00+01:00,0.0 -2018-01-05 20:00:00+01:00,0.0 -2018-01-05 21:00:00+01:00,0.0 -2018-01-05 22:00:00+01:00,0.0 -2018-01-05 23:00:00+01:00,0.0 -2018-01-06 00:00:00+01:00,0.0 -2018-01-06 01:00:00+01:00,0.0 -2018-01-06 02:00:00+01:00,0.0 -2018-01-06 03:00:00+01:00,0.0 -2018-01-06 04:00:00+01:00,0.0 -2018-01-06 05:00:00+01:00,0.0 -2018-01-06 06:00:00+01:00,0.0 -2018-01-06 07:00:00+01:00,0.0 -2018-01-06 08:00:00+01:00,0.0 -2018-01-06 09:00:00+01:00,24.258760014041247 -2018-01-06 10:00:00+01:00,54.91375116003941 -2018-01-06 11:00:00+01:00,85.00597424688478 -2018-01-06 12:00:00+01:00,85.90006197264941 -2018-01-06 13:00:00+01:00,67.37653052865542 -2018-01-06 14:00:00+01:00,31.174064306596133 -2018-01-06 15:00:00+01:00,0.0 -2018-01-06 16:00:00+01:00,0.0 -2018-01-06 17:00:00+01:00,0.0 -2018-01-06 18:00:00+01:00,0.0 -2018-01-06 19:00:00+01:00,0.0 -2018-01-06 20:00:00+01:00,0.0 -2018-01-06 21:00:00+01:00,0.0 -2018-01-06 22:00:00+01:00,0.0 -2018-01-06 23:00:00+01:00,0.0 -2018-01-07 00:00:00+01:00,0.0 -2018-01-07 01:00:00+01:00,0.0 -2018-01-07 02:00:00+01:00,0.0 -2018-01-07 03:00:00+01:00,0.0 -2018-01-07 04:00:00+01:00,0.0 -2018-01-07 05:00:00+01:00,0.0 -2018-01-07 06:00:00+01:00,0.0 -2018-01-07 07:00:00+01:00,0.0 -2018-01-07 08:00:00+01:00,0.0 -2018-01-07 09:00:00+01:00,8.361867062873221 -2018-01-07 10:00:00+01:00,26.028288674715704 -2018-01-07 11:00:00+01:00,43.634635884057296 -2018-01-07 12:00:00+01:00,34.49380141729803 -2018-01-07 13:00:00+01:00,36.91816671510759 -2018-01-07 14:00:00+01:00,33.35423932538908 -2018-01-07 15:00:00+01:00,0.652259558172688 -2018-01-07 16:00:00+01:00,0.0 -2018-01-07 17:00:00+01:00,0.0 -2018-01-07 18:00:00+01:00,0.0 -2018-01-07 19:00:00+01:00,0.0 -2018-01-07 20:00:00+01:00,0.0 -2018-01-07 21:00:00+01:00,0.0 -2018-01-07 22:00:00+01:00,0.0 -2018-01-07 23:00:00+01:00,0.0 diff --git a/tests/test_input_files/testing_energy_consumption.csv b/tests/test_input_files/testing_energy_consumption.csv deleted file mode 100644 index 16df757b..00000000 --- a/tests/test_input_files/testing_energy_consumption.csv +++ /dev/null @@ -1,73 +0,0 @@ -vehicle_type,level_of_loading,incline,mean_speed_kmh,t_amb,consumption_kwh_per_km -CKB,0,-0.1,10,-15,4.4 -CKB,0.5,-0.1,10,-15,4.9 -CKB,1,-0.1,10,-15,5.4 -CKB,0,0,10,-15,4.5 -CKB,0.5,0,10,-15,5 -CKB,1,0,10,-15,5.5 -CKB,0,0.1,10,-15,4.6 -CKB,0.5,0.1,10,-15,5.1 -CKB,1,0.1,10,-15,5.6 -CKB,0,-0.1,20,-15,5.4 -CKB,0.5,-0.1,20,-15,5.9 -CKB,1,-0.1,20,-15,6.4 -CKB,0,0,20,-15,5.5 -CKB,0.5,0,20,-15,6 -CKB,1,0,20,-15,6.5 -CKB,0,0.1,20,-15,5.6 -CKB,0.5,0.1,20,-15,6.1 -CKB,1,0.1,20,-15,6.6 -CKB,0,-0.1,10,0,2.9 -CKB,0.5,-0.1,10,0,3.4 -CKB,1,-0.1,10,0,3.9 -CKB,0,0,10,0,3 -CKB,0.5,0,10,0,3.5 -CKB,1,0,10,0,4 -CKB,0,0.1,10,0,3.1 -CKB,0.5,0.1,10,0,3.6 -CKB,1,0.1,10,0,4.1 -CKB,0,-0.1,20,0,3.9 -CKB,0.5,-0.1,20,0,4.4 -CKB,1,-0.1,20,0,4.9 -CKB,0,0,20,0,4 -CKB,0.5,0,20,0,4.5 -CKB,1,0,20,0,5 -CKB,0,0.1,20,0,4.1 -CKB,0.5,0.1,20,0,4.6 -CKB,1,0.1,20,0,5.1 -CKB,0,-0.1,10,20,0.9 -CKB,0.5,-0.1,10,20,1.4 -CKB,1,-0.1,10,20,1.9 -CKB,0,0,10,20,1 -CKB,0.5,0,10,20,1.5 -CKB,1,0,10,20,2 -CKB,0,0.1,10,20,1.1 -CKB,0.5,0.1,10,20,1.6 -CKB,1,0.1,10,20,2.1 -CKB,0,-0.1,20,20,1.9 -CKB,0.5,-0.1,20,20,2.4 -CKB,1,-0.1,20,20,2.9 -CKB,0,0,20,20,2 -CKB,0.5,0,20,20,2.5 -CKB,1,0,20,20,3 -CKB,0,0.1,20,20,2.1 -CKB,0.5,0.1,20,20,2.6 -CKB,1,0.1,20,20,3.1 -CKB,0,-0.1,10,30,2 -CKB,0.5,-0.1,10,30,2.5 -CKB,1,-0.1,10,30,3 -CKB,0,0,10,30,2 -CKB,0.5,0,10,30,2.5 -CKB,1,0,10,30,3 -CKB,0,0.1,10,30,2 -CKB,0.5,0.1,10,30,2.5 -CKB,1,0.1,10,30,3 -CKB,0,-0.1,20,30,3 -CKB,0.5,-0.1,20,30,3.5 -CKB,1,-0.1,20,30,4 -CKB,0,0,20,30,3 -CKB,0.5,0,20,30,3.5 -CKB,1,0,20,30,4 -CKB,0,0.1,20,30,3 -CKB,0.5,0.1,20,30,3.5 -CKB,1,0.1,20,30,4 diff --git a/tests/test_input_files/trips.csv b/tests/test_input_files/trips.csv deleted file mode 100644 index 0f0a1a48..00000000 --- a/tests/test_input_files/trips.csv +++ /dev/null @@ -1,6 +0,0 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB -LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB -Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_input_files/trips_no_aussetz.csv b/tests/test_input_files/trips_no_aussetz.csv deleted file mode 100644 index b2da8b7b..00000000 --- a/tests/test_input_files/trips_no_aussetz.csv +++ /dev/null @@ -1,6 +0,0 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB -LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB -LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_input_files/trips_no_einsetz.csv b/tests/test_input_files/trips_no_einsetz.csv deleted file mode 100644 index 04d43dc2..00000000 --- a/tests/test_input_files/trips_no_einsetz.csv +++ /dev/null @@ -1,6 +0,0 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB -LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB -Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file diff --git a/tests/test_input_files/vehicle_types.json b/tests/test_input_files/vehicle_types.json deleted file mode 100644 index 413aa438..00000000 --- a/tests/test_input_files/vehicle_types.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "CKB": { - "oppb": { - "name": "articulated bus - opportunity charging", - "capacity": 50, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 10 - }, - "depb": { - "name": "articulated bus - depot charging", - "capacity": 150, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 15 - } - } -} diff --git a/tests/test_rotation.py b/tests/test_rotation.py index 838109e8..6a8fcf06 100644 --- a/tests/test_rotation.py +++ b/tests/test_rotation.py @@ -5,12 +5,26 @@ def test_set_charging_type(): s = generate_basic_schedule() rot = list(s.rotations.values())[0] + # set different mileages for different charging types to make sure consumption is properly + # calculated + for vehicle_key, vehicle_class in s.vehicle_types.items(): + for charging_key, vehicle in vehicle_class.items(): + if charging_key == "depb": + vehicle["mileage"] = 10 + else: + vehicle["mileage"] = 20 + rot.consumption = rot.calculate_consumption() + # set charging type to oppb rot.set_charging_type('oppb') assert rot.charging_type == 'oppb' - assert rot.consumption == 420 + # save the consumption of this type of charger + consumption_oppb = rot.consumption + # set charging type to depb rot.set_charging_type('depb') assert rot.charging_type == 'depb' - assert rot.consumption == 630 + # check that the consumption changed due to the change in charging type. The proper calculation + # of consumption is tested in test_consumption + assert rot.consumption != consumption_oppb diff --git a/tests/test_schedule.py b/tests/test_schedule.py index f56782d8..4a31f710 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -239,5 +239,5 @@ def test_set_charging_type(self): def test_schedule_from_csv(self): generated_schedule = generate_basic_schedule() - assert len(generated_schedule.rotations) == 1 + assert len(generated_schedule.rotations) == 4 assert type(generated_schedule) == schedule.Schedule From f824d31810f364966d3bcc27f45cd71d69523ecd Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:05:44 +0200 Subject: [PATCH 656/802] Make flake8 happy --- tests/test_consumption.py | 6 +++++- tests/test_rotation.py | 1 - tests/test_schedule.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index 70005baa..33d01c66 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -8,12 +8,16 @@ file_root = test_root / "test_input_files" example_root = pathlib.Path(__file__).parent.parent / "data/examples" + class TestConsumption: """Class to test Consumption functionality""" consumption_path = example_root / "energy_consumption_example.csv" def test_calculate_consumption(self, tmp_path): - """ Various tests to trigger errors and check if behaviour is as expected""" + """Various tests to trigger errors and check if behaviour is as expected + + :param tmp_path: pytest fixture to create a temporary path + """ schedule, scenario = TestSchedule().test_basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) consumption = trip.__class__.consumption diff --git a/tests/test_rotation.py b/tests/test_rotation.py index 6a8fcf06..4f93099e 100644 --- a/tests/test_rotation.py +++ b/tests/test_rotation.py @@ -21,7 +21,6 @@ def test_set_charging_type(): # save the consumption of this type of charger consumption_oppb = rot.consumption - # set charging type to depb rot.set_charging_type('depb') assert rot.charging_type == 'depb' diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 4a31f710..40e769e1 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -85,12 +85,12 @@ def test_basic_run(self): args.seed = 5 trip.Trip.consumption = consumption.Consumption( - self.vehicle_types,outside_temperatures=self.temperature_path, + self.vehicle_types, outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) path_to_all_station_data = example_root / "all_stations.csv" generated_schedule = schedule.Schedule.from_csv( - path_to_trips, self.vehicle_types,self.electrified_stations, **mandatory_args, + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) set_options_from_config(args, verbose=False) From 08defbfcd4e268d225b10287a1c0b5d163ee696e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:10:35 +0200 Subject: [PATCH 657/802] Add missing stations file as example with feeds --- .../electrified_stations_with_feeds.json | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 data/examples/electrified_stations_with_feeds.json diff --git a/data/examples/electrified_stations_with_feeds.json b/data/examples/electrified_stations_with_feeds.json new file mode 100644 index 00000000..85525970 --- /dev/null +++ b/data/examples/electrified_stations_with_feeds.json @@ -0,0 +1,93 @@ +{ + "Station-0": { + "type": "deps", + "n_charging_stations": null, + "distance_to_grid": 150, + "energy_feed_in": { + "csv_file": "data/examples/example_pv_feedin.csv", + "start_time": "2022-03-07T00:00:00", + "step_duration_s": 3600, + "column": "Feed-in Total (kW)", + "nominal_power": 10, + "factor": 1 + }, + "external_load": { + "csv_file": "data/examples/example_external_load.csv", + "start_time": "2022-03-07T00:00:00", + "step_duration_s": 900, + "column": "External Load (kW)", + "factor": 2 + }, + "voltage_level" : "MV", + "battery": { + "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required + "capacity": 300, // kWh, assumed to be infinite if not given + "min_charging_power": 0, // kW, optional + "soc": 0, // initial state of charge [0-1], optional + "efficiency": 0.95, // optional + "discharge_curve": null // optional, same as charging curve + }, + "cs_power_deps_oppb" : 50, // optional: maximum cs power can be defined per station + "cs_power_deps_depb" : 120 // optional: maximum cs power can be defined per station + }, + "Station-3": { + "type": "opps", + "n_charging_stations": 3, + "voltage_level" : "MV", + "energy_feed_in": { + "csv_file": "data/examples/example_pv_feedin.csv", + "start_time": "2022-03-08T00:00:00", + "step_duration_s": 3600, + "column": "Feed-in Total (kW)", + "nominal_power": 2, + "factor": 0.5 + } + }, + "Station-10": { + "type": "opps", + "n_charging_stations": 1, + "voltage_level" : "MV", + "gc_power": 250, // optional: maximum gc power can be defined per station + "cs_power_opps" : 140 // optional: maximum cs power can be defined per station + }, + "Station-21": { + "type": "opps", + "n_charging_stations": 2, + "voltage_level" : "MV" + }, + "Station-22": { + "type": "deps", + "n_charging_stations": null, + "voltage_level" : "MV" + }, + "Station-26": { + "type": "opps", + "n_charging_stations": 5, + "voltage_level" : "MV" + }, + "Station-28": { + "type": "opps", + "n_charging_stations": 4, + "voltage_level" : "MV" + }, + "Station-30": { + "type": "opps", + "n_charging_stations": 4, + "voltage_level" : "MV" + }, + "Station-32": { + "type": "opps", + "n_charging_stations": 3, + "voltage_level" : "MV" + }, + "Station-39": { + "type": "opps", + "n_charging_stations": 5, + "voltage_level" : "MV" + }, + "Station-42": { + "type": "deps", + "n_charging_stations": null, + "voltage_level" : "MV" + } +} From 0c0e907d033800efff2951bf40e97c5ad8908085 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:14:59 +0200 Subject: [PATCH 658/802] Remove testing of charging type, which is done in test_rotation.py --- tests/test_schedule.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 40e769e1..aab1df22 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -223,7 +223,7 @@ def test_scenario_with_feed_in(self): set_options_from_config(args, verbose=False) - # check that 2 user warnings are put put for missing files and an error is thrown + # check that 2 user warnings are put out for missing files and an error is thrown with pytest.warns(Warning) as record: try: scen = generated_schedule.generate_scenario(args) @@ -234,8 +234,6 @@ def test_scenario_with_feed_in(self): else: assert 0, "No error despite wrong file paths" - def test_set_charging_type(self): - pass def test_schedule_from_csv(self): generated_schedule = generate_basic_schedule() From feb98bb5468979b40565e5dcc6af24875d811364 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:39:50 +0200 Subject: [PATCH 659/802] Add helper class for schedule --- tests/test_consumption.py | 4 +-- tests/test_schedule.py | 59 ++++++++++++++++++++++----------------- tests/test_util.py | 4 +-- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index 33d01c66..a7b1d6cd 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -1,6 +1,6 @@ import pytest import pathlib -from tests.test_schedule import TestSchedule +from tests.test_schedule import HelperForTesting from datetime import datetime import pandas as pd @@ -18,7 +18,7 @@ def test_calculate_consumption(self, tmp_path): :param tmp_path: pytest fixture to create a temporary path """ - schedule, scenario = TestSchedule().test_basic_run() + schedule, scenario = HelperForTesting().basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) consumption = trip.__class__.consumption consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, 24)} diff --git a/tests/test_schedule.py b/tests/test_schedule.py index aab1df22..9166895e 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -23,7 +23,7 @@ } -class TestSchedule: +class HelperForTesting: temperature_path = example_root / 'default_temp_winter.csv' lol_path = example_root / 'default_level_of_loading_over_day.csv' @@ -33,6 +33,33 @@ class TestSchedule: with open(example_root / "vehicle_types.json", "r", encoding='utf-8') as file: vehicle_types = util.uncomment_json_file(file) + def basic_run(self): + path_to_trips = example_root / "trips_example.csv" + # set the system variables to imitate the console call with the config argument. + # first element has to be set to something or error is thrown + sys.argv = ["foo", "--config", str(example_root / "ebus_toolbox.cfg")] + args = util.get_args() + args.config = example_root / "ebus_toolbox.cfg" + args.days = None + args.seed = 5 + + trip.Trip.consumption = consumption.Consumption( + self.vehicle_types, outside_temperatures=self.temperature_path, + level_of_loading_over_day=self.lol_path) + + path_to_all_station_data = example_root / "all_stations.csv" + generated_schedule = schedule.Schedule.from_csv( + path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, + station_data_path=path_to_all_station_data) + + set_options_from_config(args, verbose=False) + args.ALLOW_NEGATIVE_SOC = True + args.attach_vehicle_soc = True + + scen = generated_schedule.run(args) + return generated_schedule, scen + +class TestHelper(HelperForTesting): def test_mandatory_options_exit(self): """ Check if the schedule creation properly throws a SystemExit error in case of missing mandatory options""" @@ -75,32 +102,11 @@ def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned :return: schedule, scenario""" - path_to_trips = example_root / "trips_example.csv" - # set the system variables to imitate the console call with the config argument. - # first element has to be set to something or error is thrown - sys.argv = ["foo", "--config", str(example_root / "ebus_toolbox.cfg")] - args = util.get_args() - args.config = example_root / "ebus_toolbox.cfg" - args.days = None - args.seed = 5 - - trip.Trip.consumption = consumption.Consumption( - self.vehicle_types, outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) + schedule, scen = self.basic_run() - path_to_all_station_data = example_root / "all_stations.csv" - generated_schedule = schedule.Schedule.from_csv( - path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) - - set_options_from_config(args, verbose=False) - args.ALLOW_NEGATIVE_SOC = True - args.attach_vehicle_soc = True - - scen = generated_schedule.run(args) assert type(scen) == scenario.Scenario - return generated_schedule, scen + def test_assign_vehicles(self): """ Test if assigning vehicles works as intended. @@ -168,7 +174,7 @@ def test_get_negative_rotations(self): """Check if the single rotation '1' with a negative soc is found """ # make use of the test_run() which has to return schedule and scenario object - sched, scen = self.test_basic_run() + sched, scen = self.basic_run() neg_rots = sched.get_negative_rotations(scen) assert '1' in neg_rots @@ -180,7 +186,6 @@ def test_scenario_with_feed_in(self): path_to_trips = example_root / "trips_example.csv" sys.argv = ["foo", "--config", str(example_root / "ebus_toolbox.cfg")] args = util.get_args() - # Todo change to example root after merge args.config = example_root / "ebus_toolbox.cfg" electrified_stations_path = example_root / "electrified_stations_with_feeds.json" args.electrified_stations = electrified_stations_path @@ -226,7 +231,9 @@ def test_scenario_with_feed_in(self): # check that 2 user warnings are put out for missing files and an error is thrown with pytest.warns(Warning) as record: try: + print("before problem") scen = generated_schedule.generate_scenario(args) + print("no problem") except FileNotFoundError: user_warning_count = sum([1 for warning in record.list if warning.category == UserWarning]) diff --git a/tests/test_util.py b/tests/test_util.py index f7eaccca..75d30442 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,7 +1,7 @@ from datetime import datetime import json from ebus_toolbox import util -from tests.test_schedule import TestSchedule +from tests.test_schedule import HelperForTesting class TestUtil: @@ -49,7 +49,7 @@ def test_get_git_revision_hash(self): assert type(git_hash) == str def test_get_buffer_time(self): - schedule, scenario = TestSchedule().test_basic_run() + schedule, scenario = HelperForTesting().basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) util.get_buffer_time(trip) buffer_time = {"10-22": 2, From 8acfad79a8edf57427582ce9b5a1c466a9ef8740 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:40:41 +0200 Subject: [PATCH 660/802] Make flake8 happy --- tests/test_schedule.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 9166895e..c47f89b0 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -59,6 +59,7 @@ def basic_run(self): scen = generated_schedule.run(args) return generated_schedule, scen + class TestHelper(HelperForTesting): def test_mandatory_options_exit(self): """ Check if the schedule creation properly throws a SystemExit error in case of missing @@ -100,14 +101,11 @@ def test_station_data_reading(self): def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned - :return: schedule, scenario""" - + """ schedule, scen = self.basic_run() assert type(scen) == scenario.Scenario - - def test_assign_vehicles(self): """ Test if assigning vehicles works as intended. @@ -241,7 +239,6 @@ def test_scenario_with_feed_in(self): else: assert 0, "No error despite wrong file paths" - def test_schedule_from_csv(self): generated_schedule = generate_basic_schedule() assert len(generated_schedule.rotations) == 4 From b837c52034bc28844f2357262d35d7dd26c670cf Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:54:50 +0200 Subject: [PATCH 661/802] Add checking for file instead of checking if path exists --- ebus_toolbox/schedule.py | 4 ++-- tests/test_schedule.py | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index cab0e0e7..0d6aad54 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -516,7 +516,7 @@ def generate_scenario(self, args): feed_in = station.get("energy_feed_in") if feed_in: feed_in_path = Path(feed_in["csv_file"]) - if not feed_in_path.exists(): + if not feed_in_path.exists() or not feed_in_path.is_file(): warnings.warn("feed-in csv file '{}' does not exist".format( feed_in_path)) feed_in["grid_connector_id"] = gc_name @@ -532,7 +532,7 @@ def generate_scenario(self, args): ext_load = station.get("external_load") if ext_load: ext_load_path = Path(ext_load["csv_file"]) - if not ext_load_path.exists(): + if not ext_load_path.exists() or not ext_load_path.is_file(): warnings.warn("external load csv file '{}' does not exist".format( ext_load_path)) ext_load["grid_connector_id"] = gc_name diff --git a/tests/test_schedule.py b/tests/test_schedule.py index c47f89b0..05cd3ab5 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -229,9 +229,7 @@ def test_scenario_with_feed_in(self): # check that 2 user warnings are put out for missing files and an error is thrown with pytest.warns(Warning) as record: try: - print("before problem") scen = generated_schedule.generate_scenario(args) - print("no problem") except FileNotFoundError: user_warning_count = sum([1 for warning in record.list if warning.category == UserWarning]) From 78039d7476056d7bf790b2e51fa405d0aaa384da Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 14:57:23 +0200 Subject: [PATCH 662/802] Add assert 0 for debugging of pytest in github --- ebus_toolbox/schedule.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 0d6aad54..80a8626f 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -517,6 +517,8 @@ def generate_scenario(self, args): if feed_in: feed_in_path = Path(feed_in["csv_file"]) if not feed_in_path.exists() or not feed_in_path.is_file(): + # todo check if this is executed + assert 0, "Feed in path" warnings.warn("feed-in csv file '{}' does not exist".format( feed_in_path)) feed_in["grid_connector_id"] = gc_name @@ -533,6 +535,8 @@ def generate_scenario(self, args): if ext_load: ext_load_path = Path(ext_load["csv_file"]) if not ext_load_path.exists() or not ext_load_path.is_file(): + # todo check if this is executed + assert 0, "ext load" warnings.warn("external load csv file '{}' does not exist".format( ext_load_path)) ext_load["grid_connector_id"] = gc_name From 786025d01ce1d2cf91053346ca09d110712147b7 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 16:12:00 +0200 Subject: [PATCH 663/802] Make warnings explicit userwarnings --- ebus_toolbox/schedule.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 80a8626f..21ef34a5 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -516,11 +516,9 @@ def generate_scenario(self, args): feed_in = station.get("energy_feed_in") if feed_in: feed_in_path = Path(feed_in["csv_file"]) - if not feed_in_path.exists() or not feed_in_path.is_file(): - # todo check if this is executed - assert 0, "Feed in path" + if not feed_in_path.exists(): warnings.warn("feed-in csv file '{}' does not exist".format( - feed_in_path)) + feed_in_path), category=UserWarning) feed_in["grid_connector_id"] = gc_name feed_in["csv_file"] = feed_in_path events["energy_feed_in"][gc_name + " feed-in"] = feed_in @@ -534,11 +532,9 @@ def generate_scenario(self, args): ext_load = station.get("external_load") if ext_load: ext_load_path = Path(ext_load["csv_file"]) - if not ext_load_path.exists() or not ext_load_path.is_file(): - # todo check if this is executed - assert 0, "ext load" + if not ext_load_path.exists(): warnings.warn("external load csv file '{}' does not exist".format( - ext_load_path)) + ext_load_path), category=UserWarning) ext_load["grid_connector_id"] = gc_name ext_load["csv_file"] = ext_load_path events["external_load"][gc_name + " ext. load"] = ext_load From 33d2fd918616ffeb25c22690feba72da0513b681 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 16:14:22 +0200 Subject: [PATCH 664/802] Add assert 0 to check for execution --- tests/test_schedule.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 05cd3ab5..2b4ab17e 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -234,6 +234,7 @@ def test_scenario_with_feed_in(self): user_warning_count = sum([1 for warning in record.list if warning.category == UserWarning]) assert user_warning_count == 2 + assert 0 else: assert 0, "No error despite wrong file paths" From 6086e7b0af691066f58a8b69725e39a4b5ae0634 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 13 Apr 2023 16:16:14 +0200 Subject: [PATCH 665/802] Move assert --- tests/test_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 2b4ab17e..1d3e290c 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -230,11 +230,11 @@ def test_scenario_with_feed_in(self): with pytest.warns(Warning) as record: try: scen = generated_schedule.generate_scenario(args) + assert 0 except FileNotFoundError: user_warning_count = sum([1 for warning in record.list if warning.category == UserWarning]) assert user_warning_count == 2 - assert 0 else: assert 0, "No error despite wrong file paths" From 392af16033dfc20a906dc96dff59f5a383617040 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 14 Apr 2023 14:58:34 +0200 Subject: [PATCH 666/802] reflect default voltage level in example file electrified_stations --- data/examples/electrified_stations.json | 30 +++++++++---------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 85525970..62d27a90 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -18,7 +18,6 @@ "column": "External Load (kW)", "factor": 2 }, - "voltage_level" : "MV", "battery": { "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required "capacity": 300, // kWh, assumed to be infinite if not given @@ -33,7 +32,6 @@ "Station-3": { "type": "opps", "n_charging_stations": 3, - "voltage_level" : "MV", "energy_feed_in": { "csv_file": "data/examples/example_pv_feedin.csv", "start_time": "2022-03-08T00:00:00", @@ -46,48 +44,40 @@ "Station-10": { "type": "opps", "n_charging_stations": 1, - "voltage_level" : "MV", "gc_power": 250, // optional: maximum gc power can be defined per station - "cs_power_opps" : 140 // optional: maximum cs power can be defined per station + "cs_power_opps" : 140, // optional: maximum cs power can be defined per station + "voltage_level": "LV" // optional: voltage_level can be defined per station, influences cost }, "Station-21": { "type": "opps", - "n_charging_stations": 2, - "voltage_level" : "MV" + "n_charging_stations": 2 }, "Station-22": { "type": "deps", - "n_charging_stations": null, - "voltage_level" : "MV" + "n_charging_stations": null }, "Station-26": { "type": "opps", - "n_charging_stations": 5, - "voltage_level" : "MV" + "n_charging_stations": 5 }, "Station-28": { "type": "opps", - "n_charging_stations": 4, - "voltage_level" : "MV" + "n_charging_stations": 4 }, "Station-30": { "type": "opps", - "n_charging_stations": 4, - "voltage_level" : "MV" + "n_charging_stations": 4 }, "Station-32": { "type": "opps", - "n_charging_stations": 3, - "voltage_level" : "MV" + "n_charging_stations": 3 }, "Station-39": { "type": "opps", - "n_charging_stations": 5, - "voltage_level" : "MV" + "n_charging_stations": 5 }, "Station-42": { "type": "deps", - "n_charging_stations": null, - "voltage_level" : "MV" + "n_charging_stations": null } } From d1e9dd734fb2eade83e526506117569c86268840 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 17 Apr 2023 10:00:18 +0200 Subject: [PATCH 667/802] Remove helper class --- tests/test_consumption.py | 4 ++-- tests/test_schedule.py | 14 +++++--------- tests/test_util.py | 4 ++-- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index a7b1d6cd..85a92efa 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -1,6 +1,6 @@ import pytest import pathlib -from tests.test_schedule import HelperForTesting +from tests.test_schedule import TestSchedule from datetime import datetime import pandas as pd @@ -18,7 +18,7 @@ def test_calculate_consumption(self, tmp_path): :param tmp_path: pytest fixture to create a temporary path """ - schedule, scenario = HelperForTesting().basic_run() + schedule, scenario = TestSchedule().basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) consumption = trip.__class__.consumption consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, 24)} diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 1d3e290c..e5f4e768 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -22,8 +22,7 @@ "cs_power_deps_oppb": 150 } - -class HelperForTesting: +class TestSchedule: temperature_path = example_root / 'default_temp_winter.csv' lol_path = example_root / 'default_level_of_loading_over_day.csv' @@ -59,8 +58,6 @@ def basic_run(self): scen = generated_schedule.run(args) return generated_schedule, scen - -class TestHelper(HelperForTesting): def test_mandatory_options_exit(self): """ Check if the schedule creation properly throws a SystemExit error in case of missing mandatory options""" @@ -149,9 +146,9 @@ def test_calculate_consumption(self): assert calc_consumption == generated_schedule.calculate_consumption() * 2 def test_get_common_stations(self): - """ Test if getting common_stations works. Rotation 1 is on the first day, rotation 2 and 3 + """Test if getting common_stations works. Rotation 1 is on the first day, rotation 2 and 3 on the second day. rotation 1 should not share any stations with other rotations and - 2 and 3 are basically simulati + 2 and 3 are almost simultaneous. """ trip.Trip.consumption = consumption.Consumption( self.vehicle_types, outside_temperatures=self.temperature_path, @@ -218,8 +215,8 @@ def test_scenario_with_feed_in(self): with open(electrified_stations_path, "r", encoding='utf-8') as file: electrified_stations = util.uncomment_json_file(file) - electrified_stations["Station-0"]["energy_feed_in"]["csv_file"] = file_root / "not_a_file" - electrified_stations["Station-0"]["external_load"]["csv_file"] = file_root / "not_a_file" + electrified_stations["Station-0"]["energy_feed_in"]["csv_file"] = file_root / "notafile" + electrified_stations["Station-0"]["external_load"]["csv_file"] = file_root / "notafile" generated_schedule = schedule.Schedule.from_csv( path_to_trips, self.vehicle_types, electrified_stations, **mandatory_args, station_data_path=path_to_all_station_data) @@ -230,7 +227,6 @@ def test_scenario_with_feed_in(self): with pytest.warns(Warning) as record: try: scen = generated_schedule.generate_scenario(args) - assert 0 except FileNotFoundError: user_warning_count = sum([1 for warning in record.list if warning.category == UserWarning]) diff --git a/tests/test_util.py b/tests/test_util.py index 75d30442..79dfa438 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,7 +1,7 @@ from datetime import datetime import json from ebus_toolbox import util -from tests.test_schedule import HelperForTesting +from tests.test_schedule import TestSchedule class TestUtil: @@ -49,7 +49,7 @@ def test_get_git_revision_hash(self): assert type(git_hash) == str def test_get_buffer_time(self): - schedule, scenario = HelperForTesting().basic_run() + schedule, scenario = TestSchedule().basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) util.get_buffer_time(trip) buffer_time = {"10-22": 2, From e41fb6efff8007d9fc7934f748dd0b8baaf5e5e0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 17 Apr 2023 10:37:31 +0200 Subject: [PATCH 668/802] Make flake8 happy --- tests/test_schedule.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index e5f4e768..4087f9d0 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -22,6 +22,7 @@ "cs_power_deps_oppb": 150 } + class TestSchedule: temperature_path = example_root / 'default_temp_winter.csv' lol_path = example_root / 'default_level_of_loading_over_day.csv' @@ -33,6 +34,7 @@ class TestSchedule: vehicle_types = util.uncomment_json_file(file) def basic_run(self): + """Returns a schedule and scenario after running the Ebus-Toolbox.""" path_to_trips = example_root / "trips_example.csv" # set the system variables to imitate the console call with the config argument. # first element has to be set to something or error is thrown @@ -100,7 +102,6 @@ def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned """ schedule, scen = self.basic_run() - assert type(scen) == scenario.Scenario def test_assign_vehicles(self): @@ -133,13 +134,13 @@ def test_calculate_consumption(self): generated_schedule = schedule.Schedule.from_csv( path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) - # set mileage constant + # set mileage to a constant mileage = 10 for v_typ in generated_schedule.vehicle_types.values(): for charge_typ in v_typ.values(): charge_typ['mileage'] = mileage calc_consumption = generated_schedule.calculate_consumption() - # set mileage to half of the prev constant + # set mileage to half of the previous constant for v_typ in generated_schedule.vehicle_types.values(): for charge_typ in v_typ.values(): charge_typ['mileage'] = mileage / 2 From 03d82ecc438a1048c1bf78400020bdfdd598f6e4 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Mon, 17 Apr 2023 10:47:25 +0200 Subject: [PATCH 669/802] Add return to basic run --- tests/test_schedule.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 4087f9d0..74fc7995 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -34,7 +34,9 @@ class TestSchedule: vehicle_types = util.uncomment_json_file(file) def basic_run(self): - """Returns a schedule and scenario after running the Ebus-Toolbox.""" + """Returns a schedule and scenario after running the Ebus-Toolbox. + :return: schedule, scenario + """ path_to_trips = example_root / "trips_example.csv" # set the system variables to imitate the console call with the config argument. # first element has to be set to something or error is thrown From 81b5dc149df14e91813f506ddfd20513f8afbb19 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Apr 2023 14:30:37 +0200 Subject: [PATCH 670/802] update report according to SpiceEV wording --- ebus_toolbox/costs.py | 8 ++++---- ebus_toolbox/report.py | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 8ae8ad9e..f39ad6a1 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -59,7 +59,7 @@ def calculate_costs(c_params, scenario, schedule, args): for gcID in gcs.keys(): # get max. power of grid connector gc_timeseries = getattr(scenario, f"{gcID}_timeseries") - gc_max_power = -min(gc_timeseries["grid power [kW]"]) + gc_max_power = -min(gc_timeseries["grid supply [kW]"]) # get voltage_level voltage_level = schedule.stations[gcID]["voltage_level"] # get distance between grid and grid connector @@ -112,7 +112,7 @@ def calculate_costs(c_params, scenario, schedule, args): # get cs power of this opps schedule.stations[gcID].get("cs_power_opps", vars(args)["cs_power_opps"]) * # get max. nr of occupied CS per grid connector - max(gc_timeseries["CS in use"])) + max(gc_timeseries["# CS in use [-]"])) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] @@ -165,9 +165,9 @@ def calculate_costs(c_params, scenario, schedule, args): voltage_level=gc.voltage_level, interval=scenario.interval, timestamps_list=timeseries.get("time"), - power_grid_supply_list=timeseries.get("grid power [kW]"), + power_grid_supply_list=timeseries.get("grid supply [kW]"), price_list=timeseries.get("price [EUR/kWh]"), - power_fix_load_list=timeseries.get("ext.load [kW]"), + power_fix_load_list=timeseries.get("fixed load [kW]"), charging_signal_list=timeseries.get("window"), core_standing_time_dict=scenario.core_standing_time, price_sheet_json=args.cost_parameters_file, diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 6e43af6e..4bac3ed2 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -27,7 +27,7 @@ def generate_gc_power_overview_timeseries(scenario, args): time_col[i] = time_col[i].isoformat() stations.append(time_col) for gc in gc_list: - stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid power [kW]"]]) + stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid supply [kW]"]]) gc_power_overview = list(map(list, zip(*stations))) csv_writer.writerows(gc_power_overview) @@ -63,16 +63,16 @@ def generate_gc_overview(schedule, scenario, args): for gc in all_gc_list: if gc in used_gc_list: ts = getattr(scenario, f"{gc}_timeseries") - max_gc_power = -min(ts["grid power [kW]"]) - max_nr_cs = max(ts["CS in use"]) - sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 + max_gc_power = -min(ts["grid supply [kW]"]) + max_nr_cs = max(ts["# CS in use [-]"]) + sum_of_cs_energy = sum(ts["sum CS power [kW]"]) * args.interval/60 # use factors: to which percentage of time are the three least used CS in use num_ts = scenario.n_intervals # number of timesteps # three least used CS. Less if number of CS is lower. least_used_num = min(3, max_nr_cs) # count number of timesteps with this exact number of occupied CS - count_nr_cs = [ts["CS in use"].count(max_nr_cs - i) for i in range( + count_nr_cs = [ts["# CS in use [-]"].count(max_nr_cs - i) for i in range( least_used_num)] use_factors = [sum(count_nr_cs[:i + 1]) / num_ts for i in range( least_used_num)] # relative occupancy with at least this number of occupied CS From d4fa2a81871afb4670697ba1dad8cc5bb142efa0 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Apr 2023 14:33:29 +0200 Subject: [PATCH 671/802] Revert "update report according to SpiceEV wording" This reverts commit 81b5dc149df14e91813f506ddfd20513f8afbb19. --- ebus_toolbox/costs.py | 8 ++++---- ebus_toolbox/report.py | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index f39ad6a1..8ae8ad9e 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -59,7 +59,7 @@ def calculate_costs(c_params, scenario, schedule, args): for gcID in gcs.keys(): # get max. power of grid connector gc_timeseries = getattr(scenario, f"{gcID}_timeseries") - gc_max_power = -min(gc_timeseries["grid supply [kW]"]) + gc_max_power = -min(gc_timeseries["grid power [kW]"]) # get voltage_level voltage_level = schedule.stations[gcID]["voltage_level"] # get distance between grid and grid connector @@ -112,7 +112,7 @@ def calculate_costs(c_params, scenario, schedule, args): # get cs power of this opps schedule.stations[gcID].get("cs_power_opps", vars(args)["cs_power_opps"]) * # get max. nr of occupied CS per grid connector - max(gc_timeseries["# CS in use [-]"])) + max(gc_timeseries["CS in use"])) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] @@ -165,9 +165,9 @@ def calculate_costs(c_params, scenario, schedule, args): voltage_level=gc.voltage_level, interval=scenario.interval, timestamps_list=timeseries.get("time"), - power_grid_supply_list=timeseries.get("grid supply [kW]"), + power_grid_supply_list=timeseries.get("grid power [kW]"), price_list=timeseries.get("price [EUR/kWh]"), - power_fix_load_list=timeseries.get("fixed load [kW]"), + power_fix_load_list=timeseries.get("ext.load [kW]"), charging_signal_list=timeseries.get("window"), core_standing_time_dict=scenario.core_standing_time, price_sheet_json=args.cost_parameters_file, diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 4bac3ed2..6e43af6e 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -27,7 +27,7 @@ def generate_gc_power_overview_timeseries(scenario, args): time_col[i] = time_col[i].isoformat() stations.append(time_col) for gc in gc_list: - stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid supply [kW]"]]) + stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid power [kW]"]]) gc_power_overview = list(map(list, zip(*stations))) csv_writer.writerows(gc_power_overview) @@ -63,16 +63,16 @@ def generate_gc_overview(schedule, scenario, args): for gc in all_gc_list: if gc in used_gc_list: ts = getattr(scenario, f"{gc}_timeseries") - max_gc_power = -min(ts["grid supply [kW]"]) - max_nr_cs = max(ts["# CS in use [-]"]) - sum_of_cs_energy = sum(ts["sum CS power [kW]"]) * args.interval/60 + max_gc_power = -min(ts["grid power [kW]"]) + max_nr_cs = max(ts["CS in use"]) + sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 # use factors: to which percentage of time are the three least used CS in use num_ts = scenario.n_intervals # number of timesteps # three least used CS. Less if number of CS is lower. least_used_num = min(3, max_nr_cs) # count number of timesteps with this exact number of occupied CS - count_nr_cs = [ts["# CS in use [-]"].count(max_nr_cs - i) for i in range( + count_nr_cs = [ts["CS in use"].count(max_nr_cs - i) for i in range( least_used_num)] use_factors = [sum(count_nr_cs[:i + 1]) / num_ts for i in range( least_used_num)] # relative occupancy with at least this number of occupied CS From 5ee4f6dac331b7935de71bd3e9b069b5b497f281 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 21 Apr 2023 14:30:37 +0200 Subject: [PATCH 672/802] update report according to SpiceEV wording --- ebus_toolbox/costs.py | 8 ++++---- ebus_toolbox/report.py | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 793ba203..6d78ebec 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -59,7 +59,7 @@ def calculate_costs(c_params, scenario, schedule, args): for gcID in gcs.keys(): # get max. power of grid connector gc_timeseries = getattr(scenario, f"{gcID}_timeseries") - gc_max_power = -min(gc_timeseries["grid power [kW]"]) + gc_max_power = -min(gc_timeseries["grid supply [kW]"]) # get voltage_level voltage_level = schedule.stations[gcID].get("voltage_level", args.default_voltage_level) # get distance between grid and grid connector @@ -112,7 +112,7 @@ def calculate_costs(c_params, scenario, schedule, args): # get cs power of this opps schedule.stations[gcID].get("cs_power_opps", vars(args)["cs_power_opps"]) * # get max. nr of occupied CS per grid connector - max(gc_timeseries["CS in use"])) + max(gc_timeseries["# CS in use [-]"])) # calculate annual cost of charging stations, depending on their lifetime costs["c_cs_annual"] = costs["c_cs"] / c_params["cs"]["lifetime_cs"] @@ -165,9 +165,9 @@ def calculate_costs(c_params, scenario, schedule, args): voltage_level=gc.voltage_level, interval=scenario.interval, timestamps_list=timeseries.get("time"), - power_grid_supply_list=timeseries.get("grid power [kW]"), + power_grid_supply_list=timeseries.get("grid supply [kW]"), price_list=timeseries.get("price [EUR/kWh]"), - power_fix_load_list=timeseries.get("ext.load [kW]"), + power_fix_load_list=timeseries.get("fixed load [kW]"), charging_signal_list=timeseries.get("window"), core_standing_time_dict=scenario.core_standing_time, price_sheet_json=args.cost_parameters_file, diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 6e43af6e..4bac3ed2 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -27,7 +27,7 @@ def generate_gc_power_overview_timeseries(scenario, args): time_col[i] = time_col[i].isoformat() stations.append(time_col) for gc in gc_list: - stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid power [kW]"]]) + stations.append([-x for x in getattr(scenario, f"{gc}_timeseries")["grid supply [kW]"]]) gc_power_overview = list(map(list, zip(*stations))) csv_writer.writerows(gc_power_overview) @@ -63,16 +63,16 @@ def generate_gc_overview(schedule, scenario, args): for gc in all_gc_list: if gc in used_gc_list: ts = getattr(scenario, f"{gc}_timeseries") - max_gc_power = -min(ts["grid power [kW]"]) - max_nr_cs = max(ts["CS in use"]) - sum_of_cs_energy = sum(ts["sum CS power"]) * args.interval/60 + max_gc_power = -min(ts["grid supply [kW]"]) + max_nr_cs = max(ts["# CS in use [-]"]) + sum_of_cs_energy = sum(ts["sum CS power [kW]"]) * args.interval/60 # use factors: to which percentage of time are the three least used CS in use num_ts = scenario.n_intervals # number of timesteps # three least used CS. Less if number of CS is lower. least_used_num = min(3, max_nr_cs) # count number of timesteps with this exact number of occupied CS - count_nr_cs = [ts["CS in use"].count(max_nr_cs - i) for i in range( + count_nr_cs = [ts["# CS in use [-]"].count(max_nr_cs - i) for i in range( least_used_num)] use_factors = [sum(count_nr_cs[:i + 1]) / num_ts for i in range( least_used_num)] # relative occupancy with at least this number of occupied CS From b517d3c2234008e35bb8d6fcce5dd2f6729aea32 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Mon, 24 Apr 2023 12:15:07 +0200 Subject: [PATCH 673/802] Add parser arguments for rotation-filter and rotation-filter-variable #30 --- ebus_toolbox/util.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 1885bb87..79292c9a 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -304,6 +304,10 @@ def get_args(): parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, ' 'instead of progress bar. Not recommended for fast computations.') + parser.add_argument('--rotation-filter', default=None, + help='Use json data with rotation ids') + parser.add_argument('--rotation-filter-variable', default=None, choices=['include', 'exclude'], + help='set mode for filtering schedule rotations') # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') From 3032a2331497eb62a95d97397f0d89f9dfa6cd4a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 09:56:20 +0200 Subject: [PATCH 674/802] Add explanation for debug and console level --- data/examples/default_optimizer.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 32aa20cb..38910df0 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -1,6 +1,10 @@ # Config for the eBus-Toolbox Optimizer #DEFAULT +# Level of debugging information that is printed to the .log file between. +# debug_level=1 prints everything debug_level=1 +# Level of debugging information that is printed in the console. +# console_level=99 only prints critical information. console_level=99 #SCENARIO From 35fac7e066739778d446195b81196a15cde6f85d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 10:23:32 +0200 Subject: [PATCH 675/802] Clean up whitespaces --- data/examples/default_optimizer.cfg | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 38910df0..7b4d0c37 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -1,11 +1,11 @@ # Config for the eBus-Toolbox Optimizer -#DEFAULT +# DEFAULT # Level of debugging information that is printed to the .log file between. -# debug_level=1 prints everything -debug_level=1 +# debug_level = 1 prints everything +debug_level = 1 # Level of debugging information that is printed in the console. -# console_level=99 only prints critical information. -console_level=99 +# console_level = 99 only prints critical information. +console_level = 99 #SCENARIO # Use "" for ids and not '' @@ -13,7 +13,7 @@ exclusion_rots = [] exclusion_stations= [] # If using inclusion stations, scenario should be rebased inclusion_stations= [] -standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, +standard_opp_station = {"type": "opps", "n_charging_stations": 200, "distance_transformer": 50, "voltage_level": "MV"} @@ -22,23 +22,23 @@ charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # charging_power = 250 -# min_soc=0.05 +# min_soc = 0.05 #OPTIMIZER # "quick" or "spiceev" solver = quick rebase_scenario = False pickle_rebased= False -pickle_rebased_name="" -run_only_neg=False +pickle_rebased_name = "" +run_only_neg = False run_only_oppb = True -pruning_threshold=0 +pruning_threshold = 0 # "greedy" or "deep" without "" opt_type = greedy # "step-by-step" or "brute" without "" -node_choice=step-by-step -max_brute_loop=300 +node_choice = step-by-step +max_brute_loop = 300 estimation_threshold = 0.90 From 724f0f04b0ff4f0a214819d63008e4365ad591b5 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 10:24:59 +0200 Subject: [PATCH 676/802] Remove voltage from default station in optimizer config --- data/examples/default_optimizer.cfg | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 7b4d0c37..80eece46 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -10,11 +10,10 @@ console_level = 99 #SCENARIO # Use "" for ids and not '' exclusion_rots = [] -exclusion_stations= [] +exclusion_stations = [] # If using inclusion stations, scenario should be rebased -inclusion_stations= [] -standard_opp_station = {"type": "opps", "n_charging_stations": 200, "distance_transformer": 50, - "voltage_level": "MV"} +inclusion_stations = [] +standard_opp_station = {"type": "opps", "n_charging_stations": 200,"distance_transformer": 50} #VEHICLE @@ -28,7 +27,7 @@ charge_eff = 0.95 # "quick" or "spiceev" solver = quick rebase_scenario = False -pickle_rebased= False +pickle_rebased = False pickle_rebased_name = "" run_only_neg = False run_only_oppb = True From 7b95fb238a66d2b7d97a3a57a835a8d729684d49 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 11:04:55 +0200 Subject: [PATCH 677/802] Merge optimization output directory with report directory --- ebus_toolbox/simulate.py | 20 ++++++++++++++++---- ebus_toolbox/station_optimization.py | 5 +---- tests/test_station_optimization.py | 1 + 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 0612451a..1fe8c34c 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -99,6 +99,7 @@ def simulate(args): continue conf = read_optimizer_config(args.optimizer_config) try: + create_results_directory(args, i+1) schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, args=args) except Exception as err: @@ -110,10 +111,7 @@ def simulate(args): # cost calculation part of report calculate_costs(cost_parameters_file, scenario, schedule, args) # name: always start with sim, append all prior optimization modes - prior_modes = ['sim'] + [m for m in args.mode[:i] if m not in ['sim', 'report']] - report_name = '__'.join(prior_modes) - args.results_directory = args.output_directory.joinpath(report_name) - args.results_directory.mkdir(parents=True, exist_ok=True) + create_results_directory(args, i) report.generate(schedule, scenario, args) elif mode == 'sim': if i > 0: @@ -121,3 +119,17 @@ def simulate(args): warn('Intermediate sim ignored') else: warn(f'Unknown mode {mode} ignored') + + +def create_results_directory(args, i): + """ Create directory for results. + + :param args: arguments + :type args: Namespace + :param i: iteration number of loop + :type i: int + """ + prior_modes = ['sim'] + [m for m in args.mode[:i] if m not in ['sim', 'report']] + report_name = '__'.join(prior_modes) + args.results_directory = args.output_directory.joinpath(report_name) + args.results_directory.mkdir(parents=True, exist_ok=True) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 72b015a7..a6e53aa7 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -3,7 +3,6 @@ """ -from datetime import datetime import json from pathlib import Path import logging @@ -59,9 +58,7 @@ def prepare_filesystem(args, conf): :param args: Arguments for ebus toolbox :type args: Namespace """ - now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - args.output_directory = Path(args.output_directory) - conf.optimizer_output_dir = Path(args.output_directory) / (now + "_optimizer") + conf.optimizer_output_dir = Path(args.results_directory) # create sub folder for specific sim results with timestamp. # if folder doesnt exists, create folder. conf.optimizer_output_dir.mkdir(parents=True, exist_ok=True) diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 9dcef603..156478db 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -62,6 +62,7 @@ def test_basic_run(self, trips_file_name="trips.csv"): # optimization depends on vehicle_socs, therefore they need to be generated generate_soc_timeseries(scen) args.output_directory = self.tmp_path + args.results_directory = self.tmp_path assert self.tmp_path return generated_schedule, scen, args From 4f0fe6331c01198e460f4e7c0c936f72759d3c4f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 11:18:55 +0200 Subject: [PATCH 678/802] Move copying of input optimizer config to main from station_optimization --- ebus_toolbox/__main__.py | 2 ++ ebus_toolbox/station_optimization.py | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 691a1f1e..ad2fefef 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -19,6 +19,8 @@ # copy input files to output to ensure reproducibility copy_list = [args.config, args.electrified_stations, args.vehicle_types] + if "station_optimization" in args.mode: + copy_list.append(args.optimizer_config) # only copy cost params if they exist if args.cost_parameters_file is not None: diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index a6e53aa7..1dba0d52 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -6,7 +6,6 @@ import json from pathlib import Path import logging -import shutil import ebus_toolbox.station_optimizer from ebus_toolbox.station_optimizer import opt_util from spice_ev.report import generate_soc_timeseries @@ -63,11 +62,6 @@ def prepare_filesystem(args, conf): # if folder doesnt exists, create folder. conf.optimizer_output_dir.mkdir(parents=True, exist_ok=True) - # copy paste the config file - copy_file = Path(conf.path) - destination = conf.optimizer_output_dir / Path("optimizer_config.cfg") - shutil.copy(copy_file, destination) - def run_optimization(conf, sched=None, scen=None, args=None): """ Add electrified stations until there are no more negative rotations. From 95e04996bf7fe6e6d1c809e0efd190f951a58bb4 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 11:45:02 +0200 Subject: [PATCH 679/802] Add explanation for pickle files --- data/examples/default_optimizer.cfg | 7 +++++++ ebus_toolbox/station_optimization.py | 10 ++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 80eece46..1337e91b 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -40,6 +40,13 @@ node_choice = step-by-step max_brute_loop = 300 estimation_threshold = 0.90 +# PICKLE +# Pickled objects of schedule, scenario and args can be provided. The optimizer uses these objects instead of +# the results of the previous simulation. This can be useful if the first simulation is time consuming. +# A relative path to the pickle files is expected. All three files need to be specified. +# schedule = "" +# scenario = "" +# args = "" # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible # If they are deemed as impossible, they are not optimized but discarded diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 1dba0d52..4237407e 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -82,11 +82,13 @@ def run_optimization(conf, sched=None, scen=None, args=None): :rtype: tuple(ebus_toolbox.schedule.Schedule, spice_ev.Scenario) """ - # load pickle files if they are not given as arguments - if sched is None or scen is None or args is None: + # load pickle files if they are given in the optimizer.config + if conf.schedule: # either all optional arguments are given or none are - assert sched == scen == args is None, ("To optimize from .pickle files, schedule, scenario " - "and arguments need to be provided together") + error_message = ("To optimize from .pickle files, schedule, scenario and arguments need to " + "be provided together") + assert conf.scenario, error_message + assert conf.args, error_message sched, scen, args = opt_util.toolbox_from_pickle(conf.schedule, conf.scenario, conf.args) # setup folders, paths and copy config From 69288bd095440cc7a4c44432a3cbf91e046a69ef Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 11:45:57 +0200 Subject: [PATCH 680/802] Fix Typo --- ebus_toolbox/station_optimization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 4237407e..1f50f91b 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -75,7 +75,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): :param scen: Simulation scenario containing simulation results including the SoC of all vehicles over time :type scen: spice_ev.Scenario - :param args: Simulation arguments for manipulation or generated outputs + :param args: Simulation arguments for manipulation of generated outputs :type args: Namespace :return: optimized schedule and Scenario From a32b76690ac8c7d6db4b309f4c102a8bcade6c2e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 12:16:05 +0200 Subject: [PATCH 681/802] Change gitignore to ignore data folder except subfolder examples --- .gitignore | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c55dcd26..692a78b2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,10 +9,8 @@ __pycache__ docs/_build docs/source/temp -data/private_examples -data/sim_outputs -data/private_examples -data/gogs_buffered +data/* +!data/examples src/ spice_ev/ From a0d5cf1ac82cdf1fc0cd3fae948826bf17f93d84 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 12:35:13 +0200 Subject: [PATCH 682/802] Move general logger to sim_outputs --- ebus_toolbox/station_optimization.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 1f50f91b..4c2aa0b1 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -4,6 +4,7 @@ """ import json +import sys from pathlib import Path import logging import ebus_toolbox.station_optimizer @@ -25,7 +26,16 @@ def setup_logger(conf): this_logger.setLevel(logging.DEBUG) # logging to one file which keeps track of optimization over many runs - file_handler_all_opts = logging.FileHandler('optimizer.log') + + # use the temporary folder in case of testing. In the use case the general log file with logging + # for all optimizations is located 2 folders above the opt folder, e.g. data/sim_outputs for the + # directory data/sim_outputs/XXX_eBus_results/sim__station_optimization/ + if "pytest" in sys.modules: + general_logger_path = Path(conf.optimizer_output_dir) / "optimizer.log" + else: + general_logger_path = Path(conf.optimizer_output_dir) / "../../optimizer.log" + file_handler_all_opts = logging.FileHandler(general_logger_path) + file_handler_all_opts.setLevel(conf.debug_level) # and logging to a file which is put in the folder with the other optimizer results From a33016a7aab3b78127f633b82a605354279fd1f5 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 13:43:29 +0200 Subject: [PATCH 683/802] Remove paths to pickle files from input --- tests/test_input_files/optimizer.cfg | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg index 84e6323a..89e78b57 100644 --- a/tests/test_input_files/optimizer.cfg +++ b/tests/test_input_files/optimizer.cfg @@ -11,15 +11,9 @@ inclusion_stations= [] standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, "voltage_level": "MV"} #[PICKLE] -schedule=schedule_rebased_BVG_BFI.pickle -scenario=scenario_rebased_BVG_BFI.pickle -args=args_rebased_BVG_BFI.pickle -# schedule=schedule_buffered_all_oppb.pickle -# scenario=scenario_buffered_all_oppb.pickle -# args=args_buffered_all_oppb.pickle -# schedule=schedule_buffered_depots_utf.pickle -# scenario=scenario_buffered_depots_utf.pickle -# args=args_buffered_utf.pickle +schedule= +scenario= +args= #[VEHICLE] From 6269ed36d1fc41c89a65e24dccdd150dfb53a543 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 13:44:54 +0200 Subject: [PATCH 684/802] Remove explanation for pickle files --- data/examples/default_optimizer.cfg | 7 ------- 1 file changed, 7 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 1337e91b..80eece46 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -40,13 +40,6 @@ node_choice = step-by-step max_brute_loop = 300 estimation_threshold = 0.90 -# PICKLE -# Pickled objects of schedule, scenario and args can be provided. The optimizer uses these objects instead of -# the results of the previous simulation. This can be useful if the first simulation is time consuming. -# A relative path to the pickle files is expected. All three files need to be specified. -# schedule = "" -# scenario = "" -# args = "" # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible # If they are deemed as impossible, they are not optimized but discarded From 48653934a2fe452d990f6a4c47302e8e5200892b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 14:19:16 +0200 Subject: [PATCH 685/802] Fix several issues with doc string formatting, e.g. blank lines and identation --- docs/source/ebus_toolbox.rst | 8 -------- docs/source/modes.rst | 27 +++------------------------ ebus_toolbox/consumption.py | 1 + ebus_toolbox/optimizer_util.py | 4 +++- ebus_toolbox/schedule.py | 3 +++ ebus_toolbox/util.py | 6 ++++-- 6 files changed, 14 insertions(+), 35 deletions(-) diff --git a/docs/source/ebus_toolbox.rst b/docs/source/ebus_toolbox.rst index cef1ada6..e7a1a296 100644 --- a/docs/source/ebus_toolbox.rst +++ b/docs/source/ebus_toolbox.rst @@ -36,14 +36,6 @@ ebus\_toolbox.optimizer\_util module :undoc-members: :show-inheritance: -ebus\_toolbox.plot\_geoposition module --------------------------------------- - -.. automodule:: ebus_toolbox.plot_geoposition - :members: - :undoc-members: - :show-inheritance: - ebus\_toolbox.report module --------------------------- diff --git a/docs/source/modes.rst b/docs/source/modes.rst index d02b55af..53762fc8 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -19,7 +19,7 @@ chained modes ------------- While the default mode of the ebus-toolbox is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: :: - mode = ["sim", "report"] + mode = ["sim", "report"] This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. Their output describes the simulation outcome of this mutated schedule. An extended simple use case would be :: @@ -39,8 +39,7 @@ negative depot to opportunity charger This mode is the first kind of optimization provided by the eBus-Toolbox and is called by :: mode = ["neg_depb_to_oppb"] -It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to depot chargers. -| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. +It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to depot chargers. | NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. @@ -76,29 +75,9 @@ station optimization Caption -report ------------------ -The The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. - - -chained modes -------------- -While the default mode of the ebus-toolbox is the simple simulation, modes can be chained together to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: -:: - mode = ["sim", "report"] - -This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. An extended simple use case would be -:: - mode = ["sim", "report" ,"neg_depb_to_oppb", "report] - -Where the scenario is run as is, a report is generated, the schedule is changed and simulated again and a second report is generated. The description what the modes do -can be found below. -======= -Lorem ipsum ... - - Report ------------- +The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Cost calculation ~~~~~~~~~~~~~ diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 7857abf0..f66cc0f5 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -33,6 +33,7 @@ def __init__(self, vehicle_types, **kwargs) -> None: def calculate_consumption(self, time, distance, vehicle_type, charging_type, temp=None, height_diff=0, level_of_loading=None, mean_speed=18): """ Calculates consumed amount of energy for a given distance. + :param time: The date and time at which the trip ends :type time: datetime.datetime :param distance: Distance travelled [m] diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 7cfefd0e..9c01e25c 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -584,7 +584,8 @@ def combs_unordered_no_putting_back(n: int, k: int): def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=False): - """Run a given schedule and electrify stations if need be + """Run a given schedule and electrify stations if need be. + :param this_sched: schedule object :param this_args: args namespace object :param electrified_stations: dict of electrified stations. Default value None means no further @@ -593,6 +594,7 @@ def run_schedule(this_sched, this_args, electrified_stations=None, cost_calc=Fal :raises SystemExit: in case of wrong cost calculation file :return: schedule and scenario objects after spiceev simulation """ + this_sched2 = copy(this_sched) this_sched2.stations = electrified_stations this_sched2, new_scen = preprocess_schedule(this_sched2, this_args, diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 88fb6382..80b127cd 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -63,6 +63,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): :return: Returns a new instance of Schedule with all trips from csv loaded. :rtype: Schedule """ + schedule = cls(vehicle_types, stations, **kwargs) station_data = dict() @@ -190,12 +191,14 @@ def run(self, args): def set_charging_type(self, ct, rotation_ids=None): """ Change charging type of either all or specified rotations. Adjust minimum standing time at depot after completion of rotation. + :param ct: Choose this charging type wheneever possible. Either 'depb' or 'oppb'. :type ct: str :param rotation_ids: IDs of rotations for which to set charging type. If None set charging charging type for all rotations. :type rotation_ids: list """ + assert ct in ["oppb", "depb"], f"Invalid charging type: {ct}" for id, rot in self.rotations.items(): diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 1885bb87..9a9c386a 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -17,8 +17,9 @@ def save_version(file_path): def get_buffer_time(trip, default=0): """ Get buffer time at arrival station of a trip. - Buffer_time is an abstraction of delays like docking procedures and - is added to the planned arrival time + + Buffer_time is an abstraction of delays like docking procedures and is added to the planned + arrival time. :param trip: The of buffer time of this trips arrival is returned. :type trip: ebus_toolbox.Trip @@ -39,6 +40,7 @@ def get_buffer_time(trip, default=0): "else": 1 } """ + schedule = trip.rotation.schedule buffer_time = schedule.stations.get(trip.arrival_name, {}).get('buffer_time', default) From 054a526eff8906df65700e029cbd230476f4df34 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Tue, 25 Apr 2023 16:42:40 +0200 Subject: [PATCH 686/802] Add to the station optimizer --- docs/source/modes.rst | 55 +++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 53762fc8..78a5aae6 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -1,4 +1,5 @@ -# Without creating links like in the line below, subpages go missing from the sidebar +.. + # Without creating links like in the line below, subpages go missing from the sidebar .. _sim_modes: @@ -15,58 +16,77 @@ different modes support the user in finding optimal solutions for their eBus-Sys * station optimization * report -chained modes +Chained Modes ------------- While the default mode of the ebus-toolbox is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: + :: + mode = ["sim", "report"] -This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. Their output describes the simulation outcome of this mutated schedule. An extended simple use case would be +This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. Their output describes the simulation outcome of this mutated schedule. An extended simple use case would be: + :: + mode = ["sim", "report" ,"neg_depb_to_oppb", "report] Where the scenario is run as is, a report is generated, the schedule is changed and simulated again and a second report is generated. The description what the modes do can be found below. -simple simulation +Simple Simulation ----------------- -The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started`. Every chain of modes starts with a simple simulation, even if it is not explicitly called. The simulation takes the scenario as is. No parameters will be adjusted, optimized or changed in any way. The charging type for each rotation is read from the trips.csv if this data is included. If not the *preferred_charging_type* from the config file is used, as long as the provided vehicles data provides the preferred_charging_type for the specified vehicle type. +The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started`. Every chain of modes starts with a simple simulation, even if it is not explicitly listed in the modes. The simulation takes the scenario as is. No parameters will be adjusted, optimized or changed in any way. The charging type for each vehicle is read from the rotation information from the trips.csv if this data is included. If the data is not included *preferred_charging_type* from the config file is used, as long as the provided vehicles data provides the preferred_charging_type for the specified vehicle type. -negative depot to opportunity charger +Negative Depot to Opportunity Charger ------------------------------------- +This mode is the first kind of optimization provided by the eBus-Toolbox and is called by: -This mode is the first kind of optimization provided by the eBus-Toolbox and is called by :: + mode = ["neg_depb_to_oppb"] -It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to depot chargers. | NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. +It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to depot chargers. + +.. note:: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. -negative opportunity to depot charger + +Negative Opportunity to Depot Charger ------------------------------------- -|This mode is analogous to *neg_depb_to_oppb* +This mode is analogous to *neg_depb_to_oppb*. This mode is the second kind of optimization provided by the eBus-Toolbox and is called by + :: + mode = ["neg_oppb_to_depb"] + It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to opportunity chargers. -| NOTE: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as opportunity charger exists in the provided vehicles_data.json. +.. note:: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as opportunity charger exists in the provided vehicles_data.json. -service optimization +Service Optimization -------------------- This mode optimizes a scenario by creating sub-scenarios, so the given sub-scenario runs without socs falling below 0. The sub-scenario has the same input has the scenario but only consists of a sub-sets of rotations. These sub-sets are are optimized to be as big as possible. Previous negative rotations can become positive since effects like blocked charging points by other rotations can be reduced. -station optimization +Station Optimization -------------------- +This mode optimizes a scenario by electrifying as few opportunity stations as possible using a greedy approach. The network with no opportunity charging station is first analyzed to find rotations which fail at the current stage and to estimate the potential of electrifying each station by its own. *Step-by-step* new opportunity stations are electrified until full electrification is reached. The optimization assumes that at every electrified station unlimited charging points exist, i.e. the number of simultaneously charging buses is not limited. In between each electrification a simulation is run and the network is analyzed again. The first run called the **base optimization** leads to a scenario which often times is better than extensively optimizing the scenario by hand. Since a greedy approach can not guarantee a global optimum a second extensive optimization can be chained to this base optimization. This *deep* optimization can make use of a *step-by-step* decision tree expansion which evaluates new combinations of electrified stations starting with the most promising combinations **OR** use a *brute* force approach trying to reduce the amount of electrified stations by one in comparison the the base optimization. The step-by-step process of the optimization follows :numref:`optimization_loop` + .. _optimization_loop: .. figure:: https://user-images.githubusercontent.com/104760879/217225177-66201146-d31a-4127-9ca0-4d6e6e5a3cc4.png :width: 600 :alt: optimization_loop - Caption + Steps of the optimization loop until full electrification is reached. + +To speed up the optimization process the scenario is divided into groups of independent systems. Each system is solved on its own and further divided whenever possible. + +The functionality of the optimizer is controlled through the optimizer.config + + + -:numref:`optimization_loop` shows xxxxxxxxxxxxxxxxxxx .. figure:: https://user-images.githubusercontent.com/104760879/217225588-abfad83d-9d2a-463a-8597-584e29f5f885.png :width: 600 @@ -75,6 +95,11 @@ station optimization Caption +At the current stage the scenario to be optimized needs depot charging stations at the start and end of each rotation. The scenario should not contain any opportunity charging stations. If for a given scenario opportunity charging stations are predefined, i.e. the scenario should contain a specific electrification and is set in the *electrified_station.json* the solver type *spice_ev* should be used in the *optimizer.cfg*. If the *quick* solver is supposed to be used the station can be listed in *must_stations* while the *electrified_stations.json* should only contain depot stations + + + + Report ------------- The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. From b2a7c901c7973c2038c2546856960f032a5aaa47 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 26 Apr 2023 10:33:24 +0200 Subject: [PATCH 687/802] allow negative non-oppb rotations for service_optimization - non-oppb rotations are skipped instead of throwing an exception - using logging instead of print (no logging during pytest) - small logic flow improvement --- ebus_toolbox/optimization.py | 42 +++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 0fb262b5..d2e2dc17 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -1,9 +1,17 @@ """ Collection of procedures optimizing arbitrary parameters of a bus schedule or infrastructure. """ -import datetime from copy import deepcopy +import datetime +import logging +import sys +logger = logging.getLogger(__name__) +if "pytest" not in sys.modules: + logger.setLevel(logging.DEBUG) + sh = logging.StreamHandler(sys.stdout) + sh.setLevel(logging.DEBUG) + logger.addHandler(sh) def service_optimization(schedule, scenario, args): """ Optimize rotations based on feasability. @@ -26,14 +34,23 @@ def service_optimization(schedule, scenario, args): # single out negative rotations. Try to run these with common non-negative rotations negative_rotations = schedule.get_negative_rotations(scenario) - print(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") + logger.info(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") + + if not negative_rotations: + return { + "original": original, + "optimized": original, + } negative_sets = {} for rot_key in negative_rotations: - rotation = schedule.rotations[rot_key] + # remove negative rotation from initial schedule + rotation = schedule.rotations.pop(rot_key) if rotation.charging_type != "oppb": - raise Exception(f"Rotation {rot_key} should be optimized, " - f"but is of type {rotation.charging_type}.") + # only oppb rotations are optimized -> skip others + logger.warn(f"Rotation {rot_key} should be optimized, " + f"but is of type {rotation.charging_type}.") + continue # oppb: build non-interfering sets of negative rotations # (these include the dependent non-negative rotations) s = {rot_key} @@ -49,9 +66,10 @@ def service_optimization(schedule, scenario, args): # add dependencies of r dependent_station.update({r2: t2 for r2, t2 in common_stations[r].items() if t2 <= t}) + elif r.charging_type != "obbp": + logger.warn(f"Rotation {rot_key} depends on negative non-oppb rotation") + negative_sets[rot_key] = s - # remove negative rotation from initial schedule - del schedule.rotations[rot_key] # run scenario with non-negative rotations only if schedule.rotations: @@ -62,7 +80,7 @@ def service_optimization(schedule, scenario, args): ignored = [] for i, (rot, s) in enumerate(negative_sets.items()): schedule.rotations = {r: original[0].rotations[r] for r in s} - print(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") + logger.debug(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") scenario = schedule.run(args) if scenario.negative_soc_tracker: # still fail: try just the negative rotation @@ -70,10 +88,10 @@ def service_optimization(schedule, scenario, args): scenario = schedule.run(args) if scenario.negative_soc_tracker: # no hope, this just won't work - print(f"Rotation {rot} will stay negative") + logger.info(f"Rotation {rot} will stay negative") else: # works alone with other non-negative rotations - print(f"Rotation {rot} works alone") + logger.info(f"Rotation {rot} works alone") ignored.append(rot) negative_sets = {k: v for k, v in negative_sets.items() if k not in ignored} @@ -82,7 +100,7 @@ def service_optimization(schedule, scenario, args): # try to combine them possible = [(a, b) for a in negative_sets for b in negative_sets if a != b] while possible: - print(f"{len(possible)} combinations remain") + logger.debug(f"{len(possible)} combinations remain") r1, r2 = possible.pop() combined = negative_sets[r1].union(negative_sets[r2]) schedule.rotations = {r: original[0].rotations[r] for r in combined} @@ -97,7 +115,7 @@ def service_optimization(schedule, scenario, args): if optimal is None or len(scenario[0].rotations) > len(optimal[0].rotations): optimal = (deepcopy(schedule), deepcopy(scenario)) - print(negative_sets) + logger.info(negative_sets) return { "original": original, From b9f7ac78a0503bc00ec86c214b6a9fb555326eed Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 27 Apr 2023 11:02:54 +0200 Subject: [PATCH 688/802] Remove duplicate line --- ebus_toolbox/station_optimization.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/station_optimization.py b/ebus_toolbox/station_optimization.py index 4c2aa0b1..c6793f75 100644 --- a/ebus_toolbox/station_optimization.py +++ b/ebus_toolbox/station_optimization.py @@ -193,6 +193,5 @@ def run_optimization(conf, sched=None, scen=None, args=None): logger.warning("Still negative rotations: %s", optimizer.schedule.get_negative_rotations(optimizer.scenario)) logger.log(msg="Station optimization finished after " + opt_util.get_time(), level=100) - logger.warning("Station optimization finished after %s", opt_util.get_time()) return optimizer.schedule, optimizer.scenario From c3cbbd3fae3e5188973808ed52a6a4bcfeef9ec7 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 27 Apr 2023 11:11:29 +0200 Subject: [PATCH 689/802] more tests - add tests for simulate (also covers report) - test example config - change SystemExit to generic Exception - move seeding in schedule.generate_scenario --- ebus_toolbox/schedule.py | 11 ++-- ebus_toolbox/simulate.py | 14 ++--- ebus_toolbox/util.py | 2 +- tests/test_example.py | 26 +++++++++ tests/test_schedule.py | 9 ++-- tests/test_simulate.py | 110 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 153 insertions(+), 19 deletions(-) create mode 100644 tests/test_example.py create mode 100644 tests/test_simulate.py diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 21ef34a5..f19560bb 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -19,7 +19,7 @@ def __init__(self, vehicle_types, stations, **kwargs): :param stations: electrified stations :type stations: dict - :raises SystemExit: In case not all mandatory options are provided + :raises Exception: In case not all mandatory options are provided :param kwargs: Command line arguments :type kwargs: dict @@ -44,7 +44,7 @@ def __init__(self, vehicle_types, stations, **kwargs): ] missing = [opt for opt in mandatory_options if kwargs.get(opt) is None] if missing: - raise SystemExit("The following arguments are required: {}".format(", ".join(missing))) + raise Exception("The following arguments are required: {}".format(", ".join(missing))) else: for opt in mandatory_options: setattr(self, opt, kwargs.get(opt)) @@ -388,8 +388,6 @@ def generate_scenario(self, args): :rtype: spice_ev.Scenario """ - random.seed(args.seed) - interval = datetime.timedelta(minutes=args.interval) vehicles = {} @@ -583,8 +581,9 @@ def generate_scenario(self, args): daily = datetime.timedelta(days=1) # price events - for key in grid_connectors.keys(): - if not args.include_price_csv: + if not args.include_price_csv: + random.seed(args.seed) + for key in grid_connectors.keys(): now = start_simulation - daily while now < stop_simulation + 2 * daily: now += daily diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index d6c32355..11540af8 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -13,7 +13,7 @@ def simulate(args): :param args: Configuration arguments specified in config files contained in configs directory. :type args: argparse.Namespace - :raises SystemExit: If an input file does not exist, exit the program. + :raises Exception: If an input file does not exist, exit the program. """ # load vehicle types try: @@ -21,16 +21,16 @@ def simulate(args): vehicle_types = util.uncomment_json_file(f) del args.vehicle_types except FileNotFoundError: - raise SystemExit(f"Path to vehicle types ({args.vehicle_types}) " - "does not exist. Exiting...") + raise Exception(f"Path to vehicle types ({args.vehicle_types}) " + "does not exist. Exiting...") # load stations file try: with open(args.electrified_stations, encoding='utf-8') as f: stations = util.uncomment_json_file(f) except FileNotFoundError: - raise SystemExit(f"Path to electrified stations ({args.electrified_stations}) " - "does not exist. Exiting...") + raise Exception(f"Path to electrified stations ({args.electrified_stations}) " + "does not exist. Exiting...") # load cost parameters if args.cost_parameters_file is not None: @@ -38,8 +38,8 @@ def simulate(args): with open(args.cost_parameters_file, encoding='utf-8') as f: cost_parameters_file = util.uncomment_json_file(f) except FileNotFoundError: - raise SystemExit(f"Path to cost parameters ({args.cost_parameters_file}) " - "does not exist. Exiting...") + raise Exception(f"Path to cost parameters ({args.cost_parameters_file}) " + "does not exist. Exiting...") # setup consumption calculator that can be accessed by all trips Trip.consumption = Consumption( diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 1885bb87..3696d8f4 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -331,6 +331,6 @@ def get_args(): missing = [a for a in ["input_schedule", "electrified_stations"] if vars(args).get(a) is None] if missing: - raise SystemExit("The following arguments are required: {}".format(", ".join(missing))) + raise Exception("The following arguments are required: {}".format(", ".join(missing))) return args diff --git a/tests/test_example.py b/tests/test_example.py new file mode 100644 index 00000000..d141b9ed --- /dev/null +++ b/tests/test_example.py @@ -0,0 +1,26 @@ +from pathlib import Path +import subprocess + +ROOT_PATH = Path(__file__).parent.parent +EXAMPLE_PATH = ROOT_PATH / "data/examples" + + +class TestExampleConfigs: + + def test_example_cfg(self, tmp_path): + # copy cfg to tmp, adjust paths + src = EXAMPLE_PATH / "ebus_toolbox.cfg" + src_text = src.read_text() + # provide path to input data + src_text = src_text.replace("data/examples", str(EXAMPLE_PATH)) + # write output to tmp + src_text = src_text.replace("data/sim_outputs", str(tmp_path)) + dst = tmp_path / "ebus_toolbox.cfg" + # don't show plots + src_text = src_text.replace("show_plots = true", "show_plots = false") + dst.write_text(src_text) + + # call toolbox from shell + assert subprocess.call([ + "python", "-m", "ebus_toolbox", "--config", dst + ]) == 0 diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 74fc7995..5d61b73a 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -63,11 +63,10 @@ def basic_run(self): return generated_schedule, scen def test_mandatory_options_exit(self): - """ Check if the schedule creation properly throws a SystemExit error in case of missing - mandatory options""" - - # check if System exit is properly thrown when mandatory options are not given - with pytest.raises(SystemExit): + """ + Check if the schedule creation properly throws an error in case of missing mandatory options + """ + with pytest.raises(Exception): # schedule creation without mandatory args schedule.Schedule(self.vehicle_types, self.electrified_stations) diff --git a/tests/test_simulate.py b/tests/test_simulate.py new file mode 100644 index 00000000..3c2ae958 --- /dev/null +++ b/tests/test_simulate.py @@ -0,0 +1,110 @@ +from argparse import Namespace +from pathlib import Path +import pytest +import warnings + +from ebus_toolbox.simulate import simulate + + +root_path = Path(__file__).parent.parent +example_path = root_path / "data/examples" + + +class TestSimulate: + + DEFAULT_VALUES = { + "vehicle_types": example_path / "vehicle_types.json", + "electrified_stations": example_path / "electrified_stations.json", + "cost_parameters_file": example_path / "cost_params.json", + "outside_temperature_over_day_path": example_path / "default_temp_summer.csv", + "level_of_loading_over_day_path": example_path / "default_level_of_loading_over_day.csv", + "input_schedule": example_path / "trips_example.csv", + "mode": [], + "min_recharge_deps_oppb": 1, + "min_recharge_deps_depb": 1, + "gc_power_opps": 100000, + "gc_power_deps": 100000, + "cs_power_opps": 300, + "cs_power_deps_depb": 150, + "cs_power_deps_oppb": 150, + "interval": 15, + "days": None, + "signal_time_dif": 10, + "include_price_csv": None, + "seed": None, + "default_buffer_time_opps": 0, + "desired_soc_opps": 1, + "desired_soc_deps": 1, + "min_charging_time": 0, + "default_voltage_level": "MV", + } + + def test_basic(self): + args = Namespace(**(self.DEFAULT_VALUES)) + simulate(args) + + def test_missing(self): + # every value in DEFAULT_VALUES is expected to be set, so omitting one should raise an error + values = self.DEFAULT_VALUES.copy() + for k, v in self.DEFAULT_VALUES.items(): + del values[k] + with pytest.raises(Exception): + simulate(Namespace(**values)) + # reset + values[k] = v + + # required file missing + for file_type in ["vehicle_types", "electrified_stations", "cost_parameters_file"]: + values[file_type] = "" + with pytest.raises(Exception): + simulate(Namespace(**values)) + # reset + values[file_type] = self.DEFAULT_VALUES[file_type] + + def test_unknown_mode(self): + # try to run a mode that does not exist + args = Namespace(**(self.DEFAULT_VALUES)) + args.mode = "foo" + with pytest.warns(UserWarning, match="Unknown mode"): + simulate(args) + + def test_late_sim(self): + # sim mode has no function, just produces a warning later + args = Namespace(**(self.DEFAULT_VALUES)) + args.mode = ["sim", "sim"] + with pytest.warns(UserWarning, match="Intermediate sim"): + simulate(args) + + def test_mode_service_opt(self): + # basic run + values = self.DEFAULT_VALUES.copy() + values["mode"] = "service_optimization" + simulate(Namespace(**values)) + # all rotations remain negative + values["desired_soc_deps"] = 0 + values["desired_soc_opps"] = 0 + values["ALLOW_NEGATIVE_SOC"] = True + simulate(Namespace(**values)) + + def test_mode_change_charge_type(self): + # all rotations remain negative + values = self.DEFAULT_VALUES.copy() + values["mode"] = "neg_oppb_to_depb" + values["desired_soc_deps"] = 0 + values["desired_soc_opps"] = 0 + values["ALLOW_NEGATIVE_SOC"] = True + simulate(Namespace(**values)) + + def test_mode_report(self, tmp_path): + # report with cost calculation, write to tmp + values = self.DEFAULT_VALUES.copy() + values["mode"] = "report" + values["cost_calculation"] = True + values["output_directory"] = tmp_path + values["strategy"] = "distributed" + values["show_plots"] = False + # tuned so that some rotations don't complete + values["days"] = .33 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + simulate(Namespace(**values)) From 4cc39ffa3e3e4ab9db673f0fb562946afed2ce09 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 27 Apr 2023 11:18:15 +0200 Subject: [PATCH 690/802] service opt: minor fixes --- ebus_toolbox/optimization.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index d2e2dc17..ce4c2073 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -13,6 +13,7 @@ sh.setLevel(logging.DEBUG) logger.addHandler(sh) + def service_optimization(schedule, scenario, args): """ Optimize rotations based on feasability. Try to find sets of rotations that produce no negative SoC @@ -25,7 +26,6 @@ def service_optimization(schedule, scenario, args): :type args: argparse.Namespace :return: original and most optimized scenario (highest electrification rate) :rtype: dict of tuple of schedule and spice_ev.Scenario - :raises Exception: if the charging type of a rotation with negative SoC is not oppb """ common_stations = schedule.get_common_stations(only_opps=True) @@ -38,9 +38,9 @@ def service_optimization(schedule, scenario, args): if not negative_rotations: return { - "original": original, - "optimized": original, - } + "original": original, + "optimized": original, + } negative_sets = {} for rot_key in negative_rotations: @@ -49,7 +49,7 @@ def service_optimization(schedule, scenario, args): if rotation.charging_type != "oppb": # only oppb rotations are optimized -> skip others logger.warn(f"Rotation {rot_key} should be optimized, " - f"but is of type {rotation.charging_type}.") + f"but is of type {rotation.charging_type}.") continue # oppb: build non-interfering sets of negative rotations # (these include the dependent non-negative rotations) From adab244d684dd022d2ccfe5545919df6939d826a Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 27 Apr 2023 11:18:54 +0200 Subject: [PATCH 691/802] Remove include_must_stations parameter from config --- data/examples/default_optimizer.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 80eece46..781c93c2 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -45,7 +45,7 @@ estimation_threshold = 0.90 # If they are deemed as impossible, they are not optimized but discarded remove_impossible_rotations = True check_for_must_stations = False -include_must_stations = True + #SPECIAL From 9308767aecab4e532b9a003dbf3af4a91d2bedaf Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 27 Apr 2023 13:40:14 +0200 Subject: [PATCH 692/802] Add to station optimization --- docs/source/modes.rst | 230 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 221 insertions(+), 9 deletions(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 78a5aae6..cc0dc39d 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -1,12 +1,13 @@ .. # Without creating links like in the line below, subpages go missing from the sidebar + this is a comment by the way .. _sim_modes: Modes of the eBus-Toolbox ========================= -The eBus-Toolbox assists the user in analysing and optimising electrified bus fleets and schedules. Besides a simple simulation run, several +The eBus-Toolbox assists the user in analyzing and optimising electrified bus fleets and schedules. Besides a simple simulation run, several different modes support the user in finding optimal solutions for their eBus-System. Supported Modes are * simple simulation @@ -71,7 +72,23 @@ This mode optimizes a scenario by creating sub-scenarios, so the given sub-scena Station Optimization -------------------- -This mode optimizes a scenario by electrifying as few opportunity stations as possible using a greedy approach. The network with no opportunity charging station is first analyzed to find rotations which fail at the current stage and to estimate the potential of electrifying each station by its own. *Step-by-step* new opportunity stations are electrified until full electrification is reached. The optimization assumes that at every electrified station unlimited charging points exist, i.e. the number of simultaneously charging buses is not limited. In between each electrification a simulation is run and the network is analyzed again. The first run called the **base optimization** leads to a scenario which often times is better than extensively optimizing the scenario by hand. Since a greedy approach can not guarantee a global optimum a second extensive optimization can be chained to this base optimization. This *deep* optimization can make use of a *step-by-step* decision tree expansion which evaluates new combinations of electrified stations starting with the most promising combinations **OR** use a *brute* force approach trying to reduce the amount of electrified stations by one in comparison the the base optimization. The step-by-step process of the optimization follows :numref:`optimization_loop` +Greedy Optimization +#################### +This mode optimizes a scenario by electrifying as few opportunity stations as possible using a greedy approach. Two basic approaches to use the optimization module are setting the mode in the ebus_toolbox configuration file to + +:: + + mode = ["sim", "station_optimization", "report"] + + +or + +:: + + mode = ["sim","neg_depb_to_oppb", "station_optimization", "report"] + +While the first call optimizes the scenario straight away trying to electrify all opportunity chargers, the second call, changes depot chargers to opportunity chargers, if they were not able to finish their rotations in the first simulation run. This way the second approach can lead to a higher degree of electrification for the system. +The network with no opportunity charging station is first analyzed to find rotations which fail at the current stage and to estimate the potential of electrifying each station by its own. *Step-by-step* new opportunity stations are electrified until full electrification is reached. The optimization assumes that at every electrified station unlimited charging points exist, i.e. the number of simultaneously charging buses is not limited. In between each electrification a simulation is run and the network is analyzed again. The first run called the **base optimization** leads to a scenario which often times is better than extensively optimizing the scenario by hand. Since a greedy approach can not guarantee a global optimum a second extensive optimization can be chained to this base optimization. This *deep* optimization can make use of a *step-by-step* decision tree expansion which evaluates new combinations of electrified stations starting with the most promising combinations **OR** use a *brute* force approach trying to reduce the amount of electrified stations by one in comparison to the base optimization. The step-by-step process of the optimization follows :numref:`optimization_loop` .. _optimization_loop: .. figure:: https://user-images.githubusercontent.com/104760879/217225177-66201146-d31a-4127-9ca0-4d6e6e5a3cc4.png @@ -80,25 +97,220 @@ This mode optimizes a scenario by electrifying as few opportunity stations as po Steps of the optimization loop until full electrification is reached. -To speed up the optimization process the scenario is divided into groups of independent systems. Each system is solved on its own and further divided whenever possible. +After a single simulation is run the rotations are analyzed. Any time a vehicle goes below an soc of zero (or a self defined value) a low soc event is triggered. This event saves information about when the soc reached its minimal value and the history before that up to a point of an upper soc threshold, with the default value being 1. Stations inside of this time span are potentially able to mitigate the low soc and are stored with other information about the event. :numref:`low_soc_event` shows a possible soc history with a low soc event. -The functionality of the optimizer is controlled through the optimizer.config +.. _low_soc_event: +.. figure:: https://user-images.githubusercontent.com/104760879/217225588-abfad83d-9d2a-463a-8597-584e29f5f885.png + :width: 600 + :alt: below_0_soc_event + Low soc event and classification of stations. +The next step groups low soc events based on the stations which were found earlier. Events which share at least one station could possibly interact with each other, e.g. vehicles could share a charging station. Therefore groups are build which do not share any stations in between groups. This speeds up the optimization process since for every electrification and simulation only rotations are calculated which could be impacted by the change. +Since greedy approaches execute the step which seems most promising in the current situation an evaluation function is needed. One possible approach could be to simulate each scenario, meaning simulating every case in which one of all possible stations is electrified and continuing with the best case. The optimizer does not use this approach. Instead an approximation function is used to evaluate the potential of electrifying a station. This approximation function analyzes the duration at each stop, the possible charging time, the soc and resulting possible charging power (battery with high socs are charged at a lower rate) as well as the upper soc threshold and minimal soc of the event. While this methodology is not accurate in all cases, e.g. a station could exist multiple times inside of a low soc event, therefore charging the first time at this station would alter the soc and charging power the vehicle has the second time it reaches the station, it seems well suited as heuristic for choosing the most promising station. The objective function of choosing what the *best* station is, is the mitigation of missing charge, i.e. what is the minimal amount of energy that needs to be inserted into the battery, so that no soc is below 0. +After the evaluation selected a station to be electrified the scenario input data is altered so that vehicles at this station are charged without limitation of charging points. This is followed up by a detailed simulation which can make use of a highly accurate solver for charging events called *SpiceEV* or a less accurate but faster solver. Now the resulting system has less missing charge and the potentials of stations might be decreased. Also a single group might have been split up into several smaller groups which can be analyzed even quicker. Therefore the loop repeats up until the point the missing charge in the system is zero or in other words the system is fully electrified. -.. figure:: https://user-images.githubusercontent.com/104760879/217225588-abfad83d-9d2a-463a-8597-584e29f5f885.png - :width: 600 - :alt: below_0_soc_event +At the current stage the scenario to be optimized needs depot charging stations at the start and end of each rotation. The scenario should not contain any opportunity charging stations. If for a given scenario opportunity charging stations are predefined, i.e. the scenario should contain a specific electrification and is set in the *electrified_station.json* the solver type *spice_ev* should be used in the *optimizer.cfg*. If the *quick* solver is supposed to be used the station can be listed in *inclusion_stations* while the *electrified_stations.json* should only contain depot stations. Stations can be also excluded from optimization by adding their name to *exclusion_stations*. + +Deep Optimization +#################### +The greedy algorithm in the base optimization can not guarantee that the solution is the global optimum. This is why the use of the *deep* mode is recommended for systems with high requirements. After the first run, instead of electrifying the station with the highest potential the second best station is electrified. This is similar to a decision tree, where every node is a set of electrified stations, with the first node being zero stations electrified and the last node being all stations electrified. The nodes in between correlate with every possible state of electrification. Each branch therefore represents an additional electrification of a single station. . The algorithm continues electrifying the best station, as long as this node has not been evaluated yet. This way gradually all possible nodes are checked. The search stops whenever the number of stations surpasses the number of the current optimal solution. If several options with the same optimal number of stations arise, they can be found in the log file of the optimizer, but only one file with optimized stations is produced. + +**Pruning** is used to stop evaluation of branches, whenever foresight predicts that no better solution will be reached. This is done through the simple heuristic of checking the sum of potential of the n remaining stations with the highest potentials, with n being the number until the number of stations of the current optimal solution is reached. - Caption +| **Example:** +| The base optimization found a set of 5 stations to fully electrify the scenario. These stations are *A*, *B*, *C*, *D* and *E* which were chosen in the same order. The whole scenario consists of the whole alphabet of stations. The deep optimization starts with evaluating a scenario without any electrified opportunity stations. Depot stations are electrified. The first evaluation gives a sorted list of potentials by +======== ===== +Station Potential +======== ===== +*A* 85 +*X* 75 +*B* 30 +*E* 25 +... ... +======== ===== -At the current stage the scenario to be optimized needs depot charging stations at the start and end of each rotation. The scenario should not contain any opportunity charging stations. If for a given scenario opportunity charging stations are predefined, i.e. the scenario should contain a specific electrification and is set in the *electrified_station.json* the solver type *spice_ev* should be used in the *optimizer.cfg*. If the *quick* solver is supposed to be used the station can be listed in *must_stations* while the *electrified_stations.json* should only contain depot stations +In the base optimization Station *A* was chosen since it showed the highest potential. The deep optimization ignores this node since it has been evaluated already and chooses station *X* instead. After a detailed simulation with *X* electrified, the remaining stations are evaluated again. +======== ===== +Station Potential +======== ===== +*B* 28 +*E* 25 +*C* 20 +*G* 18 +... ... +======== ===== +For every vehicle the amount of missing energy is calculated and summed up. In this example case the missing energy is 85. Since 4 stations are remaining until the current optimum of 5 stations is reached, the 4 stations with the highest potential are evaluated in this case + +.. math:: + + Pot = Pot_B + Pot_E + Pot_C + Pot_G = 28 + 25 + 20 +18 = 91 + +In this case the potential is high enough to continue the exploration of this branch. If the potential would have been below 85 the branch would have been pruned, meaning it would not be explored any further and labeled as *not promising*. It is not promising since it will not lead to a better solution than the current one. This is the case since on one hand the evaluation by approximation tends to overestimate the potential while the missing energy is accurately calculated and on the other hand electrification of stations can reduce the potential of other stations, for example if 2 stations charge the same rotation, electrifying one station might fully electrify the rotation meaning the potential of the other station drops to zero. +This concept can reduce the amount of nodes which have to be checked. + +Other Optimization Functionality +################################### +**Mandatory stations** can be attained to increase the optimization process. Mandatory stations are defined by being stations which are needed for a fully electrified system. To check if a station *Y* is a mandatory station can be easily attained by simulating the network with every station electrified except *Y*. If the system has vehicle socs which drop below the minimal soc (default value is 0) in this scenario, the station is mandatory. In the later exploration of best combinations of stations this station will be included in any case. + +**Impossible rotations** are rotations which given the settings are not possible to be run as opportunity chargers, given the vehicle properties, even when every station is electrified. Before starting an optimization it is recommended to remove these rotations from the optimization, since the optimizer will not reach the goal of full electrification. + +**Quick solver** +Instead of using the regular SpiceEV solver for optimization the user can also choose the *quick* solver. This approximates the soc history of a vehicle by straight manipulation of the soc data and numeric approximations of the charged energy. Therefore small differences between solving a scenario with SpiceEV and the quick solver exist. For the quick solver to work, some assumptions have to be met as well + +* Depots charge the vehicles to 100% soc +* Station electrification leads to unlimited charging points +* Base scenario has no electrified opportunity stations +* No grid connection power restrictions + +At the end of each optimization the optimized scenario will run using SpiceEV. This guarantees that the proposed solution works. If this is not the case, using SpicEV as solver is recommended + +**Continuing optimizations** can be useful in cases where simulation of the base case is slow or considerable effort was put into optimization before. The user might want to continue the optimization from the state where they left off. To speed up multiple optimizations or split up a big optimization in multiple smaller calculations two features are in early development. Experienced users can use these features on their own accord with a few minor implementation steps. To skip a potentially long simulation, with the simulation of the scenario being the first step of every ebus-toolbox run, the optimizer.config allows for using pickle files for the three major objects args, schedule and scenario. After pickling the resulting objects, the optimizer can be prompted to use them instead of using whatever other input is fed into the optimizer. This is done by giving the paths to the pickle files in the optimizer.cfg. + +:: + + args = data/args.pickle + schedule = data/schedule.pickle + scenario = data/scenario.pickle + +If they are provided they are used automatically. All three pickle files need to be set. + +If a deep optimization takes to long to run it in one go, it is possible to save the state of the decision tree as pickle file as well. Reloading of the state is possible and will lead to a continuation of the previous optimization. This feature is still in development and needs further testing. +To make use of this feature the parameters in the optimizer.cfg have to be set. + +:: + decision_tree_path = data/last_optimization.pickle + save_decision_tree = True + +Optimizer Configuration +################################### +The functionality of the optimizer is controlled through the optimizer.cfg specified in the ebus_toolbox.cfg used for calling the eBus_Toolbox. + +.. list-table:: Optimizer.cfg parameters + :header-rows: 1 + + * - Parameter + - Default value + - Expected values + - Description + * - debug_level + - 1 + - 1 to 99 + - Level of debugging information that is printed to the .log file between. debug_level = 1 prints everything + * - console_level + - 99 + - 1 to 99 + - "Level of debugging information that is printed in the console. console_level = 99 only prints critical information." + * - exclusion_rots + - [] + - ["rotation_id1", "rotation_id2" ..] + - Rotations which shall not be optimized + * - exclusion_stations + - [] + - ["station_id1", "station_id2" ..] + - Stations which shall not be electrified + * - inclusion_stations + - [] + - ["station_id1", "station_id2" ..] + - Station which shall be electrified. *Note:* If using inclusion stations, rebasing is recommended + * - standard_opp_station + - {"type": "opps", "n_charging_stations": 200, "distance_transformer": 50} + - dict() + - Description of the charging station using the syntax of electrified_stations.json + * - charge_eff + - 0.95 + - 0 to 1 + - Charging efficiency between charging station and vehicle battery. Only needed for solver=quick + * - battery_capacity + - 0 + - positive float value + - Optimizer overwrites vehicle battery capacities with this value. If the line is commented out or the value is 0, no overwriting takes place + * - charging_curve + - [] + - [[soc1, power1], [soc2, power2] ….] with soc between 0-1 and power as positive float value + - Optimizer overwrites vehicle charging curve with this value. If the line is commented out or the value is [], no overwriting takes place + * - charging_power + - 0 + - positive float value + - Optimizer overwrites vehicle charging power with this value. If the line is commented out or the value is 0, no overwriting takes place + * - min_soc + - 0 + - 0 to 1 + - Optimizer uses this value as lower SOC threshold, meaning vehicles with socs below this value need further electrification + * - solver + - spiceev + - [quick, spiceev] + - Should an accurate solver or a quick solver be used. At the end of each optimization the solution is always validated with the accurate (spiceev) solver + * - rebase_scenario + - False + - [True, False] + - If scenario settings are set, the optimizer might need rebasing for proper functionality. For example in case of changing the battery capacity or other vehicle data through this config or setting inclusion stations this should be set to True + * - pickle_rebased + - False + - [True, False] + - Should the rebased case be saved as pickle files + * - pickle_rebased_name + - rebased + - file_name as string + - Name of the pickle files of the rebased case + * - run_only_neg + - False + - [True, False] + - Should all rotations be rebased or can rotations which stay above the soc threshold be skipped? + * - run_only_oppb + - False + - [True, False] + - Filter out depot chargers during optimization + * - pruning_threshold + - 3 + - positive integer value + - Number of stations left until number of stations in optimal solution is reached,where pruning is activated. Calculation time of checking for pruning is not negligible, meaning that a lot of pruning checks (high pruning threshold, e.g. 99) lead to slower optimization. Low values will rarely check for pruning but also pruning will be rarely achieved + * - opt_type + - greedy + - [greedy, deep] + - Deep will lead to a deep optimization after a greedy one. Greedy will only run a single optimization case. + * - node_choice + - step-by-step + - [step-by-step, brute] + - How should the deep optimization choose the nodes. Brute is only recommended in smaller systems + * - max_brute_loop + - 20 + - positive integer value + - How many combinations is the brute force method allowed to check + * - estimation_threshold + - 0.8 + - 0 to 1 + - Factor with which the potential evaluation is multiplied before comparing it to the missing energy. A low estimation threshold will lead to a more conservative approach in dismissing branches. + * - remove_impossible_rotations + - False + - [True, False] + - Discard rotations which have socs below the threshold, even when every station is electrified + * - check_for_must_stations + - True + - [True, False] + - Check stations if they are mandatory for a fully electrified system. If they are, include them + * - decision_tree_path + - "" + - file_name as string + - Optional and in development: Path to pickle file of decision_tree. + * - save_decision_tree + - False + - [True, False] + - Optional and in development: Should the decision tree be saved? + * - reduce_rotations + - False + - [True, False] + - Should the optimizer only optimize a subset of rotations? + * - rotations + - [] + - ["rotation_id1", "rotation_id2" ..] + - If reduce_rotations is True, only the list of these rotations is optimized. Report ------------- From 206614e5e69a9a703ac524b7d15cd384ea40a141 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 27 Apr 2023 14:19:35 +0200 Subject: [PATCH 693/802] Add to report description --- docs/source/modes.rst | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index cc0dc39d..028c6b3d 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -314,9 +314,35 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci Report ------------- -The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. +The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Default outputs are + +| **Grid Connector Overview (gc_overview.csv)** +| Contains information about charging stations, including their names, types, maximum power, maximum number of charging stations, total energy usage, and use factors for the least, second least, and third least utilized charging stations. + +| **Grid Connector Time Series (gc_power_overview_timeseries.csv)** +| Time series of power flow in kW for every grid connector + +| **Rotation SoC Data (rotation_socs.csv)** +| Time series of soc for each rotation. + +| **Vehicle SoC Data (vehicle_socs.csv)** +| Time series of soc for each vehicle. + +| **Rotation Summary (rotation_summary.csv)** +| Contains data related to the rotation of vehicles, including the start and end times of each rotation, the type and ID of the vehicle, the depot name, the lines the vehicle traveled, total energy consumption in kWh, distance traveled in m, and various charging-related metrics such as charging type and soc at arrival, minimum soc and if the rotation had negative soc values. + +| **Overview Plots (run_overview.pdf and run_overview.png)** +| Contains plots for socs for every vehicle, power at each charging station, batteries, external loads and feed-ins as well as price time series for each station. + +| **Station Data Summary (simulation_station_xy.json)** +| Contains information about the simulation interval, grid connector, photovoltaics, charging strategy, average flexible power range per time window, total drawn energy from the grid, average duration of standing events, maximum drawn power, total energy fed into the grid, maximum stored energy in each battery, number of load cycles for stationary batteries and vehicles, and number of times vehicle soc was below the desired soc on departure. + +| **Station Data Time Series (simulation_timeseries_station_xy.csv)** +| Contains station specific time series including price of electricity, grid supply, fixed loads, battery power, energy stored in battery, flex band boundaries, battery feed, charging station power use, occupied charging stations and charging stations in use as well as vehicles which are at the station. + + Cost calculation -~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~ This mode calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV `_ for the calculation of electricity costs. From 61f3d249cff0efabd57516a3b4a02c11fbe0f973 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 27 Apr 2023 14:35:08 +0200 Subject: [PATCH 694/802] Add overview png and files folder --- docs/build/html/_files/run_overview.png | Bin 0 -> 149685 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/build/html/_files/run_overview.png diff --git a/docs/build/html/_files/run_overview.png b/docs/build/html/_files/run_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..a975f3c731d27cb50d9090dec4db1f1cb1677ade GIT binary patch literal 149685 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 literal 0 HcmV?d00001 From 8a477d6588a3633bb68f2a974ea08c082495c58f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 27 Apr 2023 14:39:12 +0200 Subject: [PATCH 695/802] Add overview png and files folder --- docs/source/getting_started.rst | 2 +- docs/source/modes.rst | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 53d1d8d8..18b00261 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -46,7 +46,7 @@ Other modes can alter bus types from depot to opportunity chargers, optimize set :numref:`figure_ebus_toolbox_modules` shows how the different modules work together to calculate the scenario. Optionally different optimizations can be used or even chained together. The output of the simulation is locally saved and consists of the vehicle socs, summaries for each rotation, estimated costs for vehicles, infrastructure and operation as well as station specific electric loads, utilization rates and other key performance indicators. Some of them can be plotted automatically and can be seen in :numref:`ebus_toolbox_default_plot` .. _ebus_toolbox_default_plot: -.. figure:: https://user-images.githubusercontent.com/104760879/217226800-647956c5-9d63-4988-a710-f3326a8304d5.png +.. figure:: _files/run_overview.png :alt: ebus_toolbox_default_plot :width: 600 diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 028c6b3d..5b18848c 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -314,7 +314,10 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci Report ------------- -The report will include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Default outputs are +The report will generate several files which include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. + +Default outputs +################################### | **Grid Connector Overview (gc_overview.csv)** | Contains information about charging stations, including their names, types, maximum power, maximum number of charging stations, total energy usage, and use factors for the least, second least, and third least utilized charging stations. @@ -340,12 +343,12 @@ The report will include information about the expected socs, power loads at the | **Station Data Time Series (simulation_timeseries_station_xy.csv)** | Contains station specific time series including price of electricity, grid supply, fixed loads, battery power, energy stored in battery, flex band boundaries, battery feed, charging station power use, occupied charging stations and charging stations in use as well as vehicles which are at the station. - +.. _cost_calculation: Cost calculation -~~~~~~~~~~~~~~~~~~ - -This mode calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. -The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV `_ for the calculation of electricity costs. +################################### +| **Cost calculation (summary_vehicles_costs.csv)** +| This is an optional output which calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. +| The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV `_ for the calculation of electricity costs. * Investment * **Busses**: Costs for all busses used in the simulation. Costs include battery swaps, depending on the lifetime of both busses and batteries. From 8424290fea2e34ac65b185209d9a4b1fb9b966fd Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Tue, 2 May 2023 15:37:00 +0200 Subject: [PATCH 696/802] Fix choices by adding None to them #30 --- ebus_toolbox/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 79292c9a..e7e1060a 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -306,7 +306,7 @@ def get_args(): 'instead of progress bar. Not recommended for fast computations.') parser.add_argument('--rotation-filter', default=None, help='Use json data with rotation ids') - parser.add_argument('--rotation-filter-variable', default=None, choices=['include', 'exclude'], + parser.add_argument('--rotation-filter-variable', default=None, choices=[None, 'include', 'exclude'], help='set mode for filtering schedule rotations') # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### From a23478d425e2caf87905ed4942116035c41768a4 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Tue, 2 May 2023 15:39:05 +0200 Subject: [PATCH 697/802] Make flake8 happy #30 --- ebus_toolbox/util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index e7e1060a..4e6f48b3 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -306,7 +306,8 @@ def get_args(): 'instead of progress bar. Not recommended for fast computations.') parser.add_argument('--rotation-filter', default=None, help='Use json data with rotation ids') - parser.add_argument('--rotation-filter-variable', default=None, choices=[None, 'include', 'exclude'], + parser.add_argument('--rotation-filter-variable', default=None, + choices=[None, 'include', 'exclude'], help='set mode for filtering schedule rotations') # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### From 95d84fe5567dbea2d50362a4c5b29ba905fc6448 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 5 May 2023 10:43:15 +0200 Subject: [PATCH 698/802] detail config description of service_optimization --- data/examples/ebus_toolbox.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 80ca30de..9c10cd62 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -26,7 +26,7 @@ cost_parameters_file = data/examples/cost_params.json # sim runs a single simulation with the given inputs. # neg_depb_to_oppb changes negative depb-rotations to oppb charging. # neg_oppb_to_depb changes negative oppb-rotations to depb charging. -# service_optimization finds the largest set of electrified rotations. +# service_optimization finds the largest set of electrified rotations, rotations SOC<0 are removed. # report generates simulation output files, including costs. mode = ["sim", "report"] #mode = ["sim", "neg_depb_to_oppb", "service_optimization", "report"] @@ -46,7 +46,7 @@ show_plots = true ##### Physical setup of environment ##### ### Parametrization of the physical setup ### # Preferred charging type. Options: depb, oppb (default: depb) -preferred_charging_type = oppb +preferred_charging_type = depb # Default max power [kW] of grid connectors at depot and opp stations, # Individual gc_power per gc can be defined in electrified stations # For unlimited gc power: set very large value (default: 100000) From b1085add9af067d77036f586be6f2af5ee3fb462 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 5 May 2023 12:16:13 +0200 Subject: [PATCH 699/802] merge dev and update keyword in argparser --- ebus_toolbox/util.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 1885bb87..2ab97bfc 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -258,11 +258,10 @@ def get_args(): help='Calculate costs') parser.add_argument('--check-rotation-consistency', action='store_true', help='Check rotation assumptions when building schedule.') - parser.add_argument('--ignore-inconsistent-rotations', action='store_true', + parser.add_argument('--skip_inconsistent_rotations', action='store_true', help='Remove rotations from schedule that violate assumptions. ') parser.add_argument('--show-plots', action='store_true', help='show plots for users to view in "report" mode') - # #### Physical setup of environment ##### parser.add_argument('--preferred-charging-type', '-pct', default='depb', choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ From 254f89de9448a90c5d2cd509bc3feb79c1f36b3c Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 5 May 2023 12:24:25 +0200 Subject: [PATCH 700/802] Fix typo in config description --- data/examples/ebus_toolbox.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 10c09baf..d9f83b72 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -61,8 +61,8 @@ cs_power_deps_oppb = 150 # Set minimum allowed state of charge when leaving depot and opportunity stations (both default: 1) desired_soc_deps = 1.0 desired_soc_opps = 1.0 -# Minimum fraction of capacity for recharge when leaving the depot. Helps calculating the -# Minimum standing time at depot. Between 0 - 1. (default: 1) +# Minimum fraction of capacity for recharge when leaving the depot. +# Helps calculating the minimum standing time at depot. Between 0 - 1. (default: 1) min_recharge_deps_oppb = 1 min_recharge_deps_depb = 1 # Min charging time at depots and opp stations in minutes (default: 0) From 1f64a663bbf187f4ea2e273fb9b6b9166d1891b9 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 5 May 2023 12:50:46 +0200 Subject: [PATCH 701/802] restructure rotation filter in config and change execution order in simulate --- data/examples/ebus_toolbox.cfg | 14 +++++++------- ebus_toolbox/simulate.py | 15 ++++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 6882243e..6d94ce6d 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -17,10 +17,10 @@ outside_temperature_over_day_path = data/examples/default_temp_winter.csv # Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours # (Optional: needed if mileage in vehicle types not constant) level_of_loading_over_day_path = data/examples/default_level_of_loading_over_day.csv -# Path to rotation filter -rotation_filter = data/examples/rotation_filter.json # Cost parameters (needed if cost_calculation flag is set to true, see Flag section below) cost_parameters_file = data/examples/cost_params.json +# Path to rotation filter +rotation_filter = data/examples/rotation_filter.json ##### Modes ##### ### Specify how you want to simulate the szenario ### @@ -44,6 +44,11 @@ check_rotation_consistency = false skip_inconsistent_rotations = false # Show plots for users to view, only valid if generate_report = true (default: false) show_plots = true +# Rotation filter variable, options: +# "include": include only the rotations from file 'rotation_filter' +# "exclude": exclude the rotations from file 'rotation_filter' from the schedule +# null: deactivate function +rotation_filter_variable = null ##### Physical setup of environment ##### ### Parametrization of the physical setup ### @@ -88,8 +93,3 @@ signal_time_dif = 10 # Show estimated time to finish simulation after each step. Not recommended for fast computations # (default: false) eta = false -# rotation filter variable, options: -# "exclude": exclude the rotations in the file from the schedule -# "include": include only the rotations in the file -# null: deactivate function -rotation_filter_variable = null diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index f987d02e..1989dda4 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -47,17 +47,18 @@ def simulate(args): outside_temperatures=args.outside_temperature_over_day_path, level_of_loading_over_day=args.level_of_loading_over_day_path) - schedule = Schedule.from_csv(args.input_schedule, - vehicle_types, - stations, - **vars(args)) - schedule.calculate_consumption() - # scenario simulated once - scenario = schedule.run(args) + # generate schedule from csv + schedule = Schedule.from_csv(args.input_schedule, vehicle_types, stations, **vars(args)) # filter rotations schedule.rotation_filter(args) + # calculate consumption of all trips + schedule.calculate_consumption() + + # scenario simulated once + scenario = schedule.run(args) + # run the mode(s) specified in config if type(args.mode) != list: # backwards compatibility: run single mode From f4ab5c47c860468bdfd31aa09d8ee5df96cb7324 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 9 May 2023 12:12:08 +0200 Subject: [PATCH 702/802] make make html possible and restructure doc directories for images --- docs/make.bat | 4 ++-- .../html/_files => source/_static}/run_overview.png | Bin docs/source/getting_started.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename docs/{build/html/_files => source/_static}/run_overview.png (100%) diff --git a/docs/make.bat b/docs/make.bat index 2119f510..6247f7e2 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -7,8 +7,8 @@ REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) -set SOURCEDIR=. -set BUILDDIR=_build +set SOURCEDIR=source +set BUILDDIR=build if "%1" == "" goto help diff --git a/docs/build/html/_files/run_overview.png b/docs/source/_static/run_overview.png similarity index 100% rename from docs/build/html/_files/run_overview.png rename to docs/source/_static/run_overview.png diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 18b00261..6137a578 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -46,7 +46,7 @@ Other modes can alter bus types from depot to opportunity chargers, optimize set :numref:`figure_ebus_toolbox_modules` shows how the different modules work together to calculate the scenario. Optionally different optimizations can be used or even chained together. The output of the simulation is locally saved and consists of the vehicle socs, summaries for each rotation, estimated costs for vehicles, infrastructure and operation as well as station specific electric loads, utilization rates and other key performance indicators. Some of them can be plotted automatically and can be seen in :numref:`ebus_toolbox_default_plot` .. _ebus_toolbox_default_plot: -.. figure:: _files/run_overview.png +.. figure:: _static/run_overview.png :alt: ebus_toolbox_default_plot :width: 600 From 648dd385f8ea9e7a184d65437045201dbdcd95ee Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Tue, 9 May 2023 17:39:00 +0200 Subject: [PATCH 703/802] Resolve review requests #30 --- data/examples/ebus_toolbox.cfg | 2 +- ebus_toolbox/schedule.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 6d94ce6d..ef732d1b 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -20,7 +20,7 @@ level_of_loading_over_day_path = data/examples/default_level_of_loading_over_da # Cost parameters (needed if cost_calculation flag is set to true, see Flag section below) cost_parameters_file = data/examples/cost_params.json # Path to rotation filter -rotation_filter = data/examples/rotation_filter.json +rotation_filter = data/examples/rotation_filter.csv ##### Modes ##### ### Specify how you want to simulate the szenario ### diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 7fc5f6dc..419c06b2 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -2,7 +2,6 @@ import random import datetime import warnings -import json from pathlib import Path from ebus_toolbox import util @@ -397,8 +396,8 @@ def rotation_filter(self, args, rf_list=None): if args.rotation_filter: try: with open(args.rotation_filter, encoding='utf-8') as f: - # read rotation_ids from file into rf_list - rf_list += json.load(f, parse_int=str) + for line in f: + rf_list.append(line.strip()) except FileNotFoundError: warnings.warn(f"Path to rotation filter {args.rotation_filter} is invalid.") # filter out rotations in self.rotations From 8218cc7407ec47cc59e7050a475da8682bcfd5d8 Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Tue, 9 May 2023 17:46:05 +0200 Subject: [PATCH 704/802] Delete line #30 --- ebus_toolbox/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 118f88a2..691a1f1e 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -5,7 +5,6 @@ from ebus_toolbox import simulate, util if __name__ == '__main__': - args = util.get_args() args.output_directory = Path(args.output_directory) / ( From 536b1d18faeb9c4ebadf8283c2e0b23c704dd2b0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 10 May 2023 11:08:31 +0200 Subject: [PATCH 705/802] Add explanation for every config parameter --- data/examples/default_optimizer.cfg | 39 ++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 781c93c2..35c17e84 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -9,14 +9,20 @@ console_level = 99 #SCENARIO # Use "" for ids and not '' +# these rotations are excluded from optimization. they will not be simulated exclusion_rots = [] + +# these stations are excluded from optimization. optimization will not electrify them exclusion_stations = [] -# If using inclusion stations, scenario should be rebased +# optimization will electrify these stations. +# if using inclusion stations, scenario should be rebased inclusion_stations = [] standard_opp_station = {"type": "opps", "n_charging_stations": 200,"distance_transformer": 50} #VEHICLE +# these vehicle properties can be overwritten, following the same syntax as in vehicles.json. +# NO distinction is made between vehicle types or names eg. 10m_bus or 12m_bus charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] @@ -24,32 +30,59 @@ charge_eff = 0.95 # min_soc = 0.05 #OPTIMIZER +# Choice between solver at the core of simulation. +# spiceev makes use of SpiceEV and is very robust and accurate. +# quick is a specifically for the optimization produced solver which is quick, but +# less accurate and with some assumptions that have to be met. # "quick" or "spiceev" solver = quick + +# Optimization procedure is developed from the input schedule and scenario. If the scenario is changed +# through this configuration rebasing should be set to true. This will simulate the scenario again with the +# given settings rebase_scenario = False + +# the rebased scenario can be pickled for analysis or repeated use pickle_rebased = False +# the name of this pickle file can be defined here pickle_rebased_name = "" +# Should all rotations be rebased or can rotations which stay above the soc threshold be skipped? run_only_neg = False +# Should only be opportunity vehicles be rebased, since this optimization is not meant for depot chargers run_only_oppb = True -pruning_threshold = 0 +# number of stations before optimal solution, where branch is checked for pruning +pruning_threshold = 3 +# Optimization type greedy runs the optimization a single time as greedy as impossible +# Deep repeatedly searches for promising nodes but only new nodes which have not +# been checked before. # "greedy" or "deep" without "" opt_type = greedy + +# For Deep optimization only +# How should the deep optimization choose the nodes. +# Brute is only recommended in smaller systems # "step-by-step" or "brute" without "" node_choice = step-by-step +# How many combinations is the deep method allowed to check max_brute_loop = 300 -estimation_threshold = 0.90 +# Factor with which the potential evaluation is multiplied before comparing it to the missing energy. A low estimation +# threshold will lead to a more conservative approach in dismissing branches +estimation_threshold = 0.80 # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible # If they are deemed as impossible, they are not optimized but discarded remove_impossible_rotations = True +# Check if stations are mandatory for a fully electrified system. If they are, include them check_for_must_stations = False #SPECIAL +#Optional and in development: Path to pickle file of decision_tree. decision_tree_path = "" +#Optional and in development: Should the decision tree be save save_decision_tree = False # Do you want to reduce the rotations to a smaller subset? reduce_rotations = False From 8f1aca04bedaa3aa2183db8b1e3de93bc971a184 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 10 May 2023 15:51:31 +0200 Subject: [PATCH 706/802] Fix test config --- tests/test_input_files/ebus_toolbox.cfg | 2 +- tests/test_station_optimization.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_input_files/ebus_toolbox.cfg b/tests/test_input_files/ebus_toolbox.cfg index 68d43be2..836221f2 100644 --- a/tests/test_input_files/ebus_toolbox.cfg +++ b/tests/test_input_files/ebus_toolbox.cfg @@ -42,7 +42,7 @@ cost_calculation = true check_rotation_consistency = false # Remove rotations from schedule that violate assumptions? # Needs check_rotation_consistency to have an effect (default: false) -ignore_inconsistent_rotations = false +skip_inconsistent_rotations = false # Show plots for users to view, only valid if generate_report = true (default: false) show_plots = true diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 156478db..1d7e6b38 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -96,6 +96,7 @@ def test_deep_optimization(self): """ trips_file_name = "trips_for_optimizer_deep.csv" sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + args.input_schedule = file_root / trips_file_name config_path = file_root / "optimizer.cfg" conf = opt_util.read_config(config_path) @@ -108,6 +109,7 @@ def test_deep_optimization(self): conf.solver = solver conf.node_choice = node_choice opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + print(solver, node_choice, opt_sched.stations) assert "Station-1" not in opt_sched.stations assert "Station-2" in opt_sched.stations assert "Station-3" in opt_sched.stations From ed75fe10cfa7c30759658447ee7c312009fd9845 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 10 May 2023 15:59:58 +0200 Subject: [PATCH 707/802] Revert test --- tests/test_station_optimization.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 1d7e6b38..156478db 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -96,7 +96,6 @@ def test_deep_optimization(self): """ trips_file_name = "trips_for_optimizer_deep.csv" sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) - args.input_schedule = file_root / trips_file_name config_path = file_root / "optimizer.cfg" conf = opt_util.read_config(config_path) @@ -109,7 +108,6 @@ def test_deep_optimization(self): conf.solver = solver conf.node_choice = node_choice opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) - print(solver, node_choice, opt_sched.stations) assert "Station-1" not in opt_sched.stations assert "Station-2" in opt_sched.stations assert "Station-3" in opt_sched.stations From 98385b275ca153973fb4ee43e9ea2c922e6541bd Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 11 May 2023 11:10:41 +0200 Subject: [PATCH 708/802] Remove vehicle properties from default config file --- data/examples/default_optimizer.cfg | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 35c17e84..f854cc8d 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -18,16 +18,8 @@ exclusion_stations = [] # if using inclusion stations, scenario should be rebased inclusion_stations = [] standard_opp_station = {"type": "opps", "n_charging_stations": 200,"distance_transformer": 50} - - -#VEHICLE -# these vehicle properties can be overwritten, following the same syntax as in vehicles.json. -# NO distinction is made between vehicle types or names eg. 10m_bus or 12m_bus -charge_eff = 0.95 -# battery_capacity = 400 -# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] -# charging_power = 250 -# min_soc = 0.05 +# rotations which drop below this value are considered not electrified (default value is 0) +min_soc = 0.05 #OPTIMIZER # Choice between solver at the core of simulation. From ae740407369732e2de5a59fe6654b1335d5997df Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 12 May 2023 09:40:50 +0200 Subject: [PATCH 709/802] vehicle types: give example of bat efficiency --- data/examples/vehicle_types.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index b7491df5..cba0ff05 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -6,7 +6,8 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 15]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv" + "mileage": "data/examples/energy_consumption_example.csv", + "battery_efficiency": 0.95 // optional. default: 0.95 }, "oppb": { "name": "articulated bus - opportunity charging", @@ -35,4 +36,4 @@ "mileage": "data/examples/energy_consumption_example.csv" } } -} \ No newline at end of file +} From 1a22de535540fd5bb5f2b7cc95e65557bbdc4141 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 12 May 2023 10:35:39 +0200 Subject: [PATCH 710/802] Remove battery efficiency from optimizer config and use scenario vehicle types instead --- ebus_toolbox/optimizer_util.py | 1 - ebus_toolbox/station_optimizer.py | 3 ++- tests/test_input_files/optimizer.cfg | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index edeb5a46..4f272efa 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -171,7 +171,6 @@ def read_config(config_path): conf.scenario = default.get("scenario", "") conf.args = default.get("args", "") - conf.charge_eff = default.getfloat("charge_eff", 0.95) conf.battery_capacity = default.getfloat("battery_capacity", 0) if conf.battery_capacity == 0: conf.battery_capacity = None diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index d04b29c1..a9c565f5 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -838,9 +838,10 @@ def create_charging_curves(self): soc_charge_curve_dict[v_type_name] = {} for name, v_type in self.schedule.vehicle_types.items(): for ch_type, data in v_type.items(): + eff = self.scenario.components.vehicle_types[f"{name}_{ch_type}"].battery_efficiency soc_charge_curve_dict[name][ch_type] = opt_util.charging_curve_to_soc_over_time( data["charging_curve"], data["capacity"], self.args, - self.schedule.cs_power_opps, efficiency=self.config.charge_eff, + self.schedule.cs_power_opps, efficiency=eff, time_step=0.1, eps=self.config.eps) self.soc_charge_curve_dict = soc_charge_curve_dict diff --git a/tests/test_input_files/optimizer.cfg b/tests/test_input_files/optimizer.cfg index 89e78b57..18071b02 100644 --- a/tests/test_input_files/optimizer.cfg +++ b/tests/test_input_files/optimizer.cfg @@ -17,7 +17,6 @@ args= #[VEHICLE] -charge_eff = 0.95 # battery_capacity = 400 # charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] # charging_power = 250 From 6dbe2037895789cb8e11d2a73a878063e1630ed5 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 25 May 2023 09:38:30 +0200 Subject: [PATCH 711/802] add methodology_overview.png --- docs/source/_static/methodology_overview.png | Bin 0 -> 64639 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/source/_static/methodology_overview.png diff --git a/docs/source/_static/methodology_overview.png b/docs/source/_static/methodology_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..af8dc284019cfaed1c585b0811d80470e89b5616 GIT binary patch literal 64639 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 literal 0 HcmV?d00001 From 398b34a65b1bfb11663ceea0f2339d438f50ff44 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 26 May 2023 08:49:30 +0200 Subject: [PATCH 712/802] change RTD mode description of service opt --- docs/source/modes.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 5b18848c..49124e61 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -68,7 +68,9 @@ It takes the results of the previous simulation, attains all rotations which had Service Optimization -------------------- -This mode optimizes a scenario by creating sub-scenarios, so the given sub-scenario runs without socs falling below 0. The sub-scenario has the same input has the scenario but only consists of a sub-sets of rotations. These sub-sets are are optimized to be as big as possible. Previous negative rotations can become positive since effects like blocked charging points by other rotations can be reduced. +This mode finds the largest set of rotations that results in no negative SoC. This is done by first taking all rotations that do become negative and finding their dependent rotations, i.e., ones that can have an influence by sharing a station earlier with the negative rotation. Next, all rotations are filtered out that stay negative when running with just their dependent rotations. +Now, only rotations are left that are non-negative when viewed alone, but might beome negative when run together. To find the largest subset of non-negative rotations, all possible set combinations are generated and tried out. When a union of two rotation-sets is non-negative, it is taken as the basis for new possible combinations. +In the end, the largest number of rotations that produce a non-negative result when taken together is returned as the optimized scenario. Station Optimization -------------------- From edb1851947d105c1a1ace91460bded6d46d844c9 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 26 May 2023 08:58:18 +0200 Subject: [PATCH 713/802] adjust path in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4b7950bf..5f9e4924 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ To try it out, first clone this repository and then install the required package `pip install -r requirements.txt` -Now you can start the eBus Toolbox module with all configurations stored at `data/configs/ebus_toolbox.cfg` via the command +Now you can start the eBus Toolbox module with all configurations stored at `data/examples/ebus_toolbox.cfg` via the command -``python -m ebus_toolbox --config data/configs/ebus_toolbox.cfg`` +``python -m ebus_toolbox --config data/examples/ebus_toolbox.cfg`` The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. From bf3cb465fa6eb52bde18064231c004c7c8f3300b Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 26 May 2023 09:06:38 +0200 Subject: [PATCH 714/802] add setup.py --- setup.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 setup.py diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..63de5bf2 --- /dev/null +++ b/setup.py @@ -0,0 +1,13 @@ +from setuptools import setup, find_packages + +setup( + name="ebus_toolbox", + version="0.0.1dev", + description="Assistent to analyse and optimise electrified bus fleets and schedules", + url="https://github.com/rl-institut/eBus-Toolbox", + author="Reiner Lemoine Institut", + author_email='info@rl-institut.de', + license="MIT", + packages=find_packages(), + package_data={}, +) From f9266bf254923cae5b38eefdb6bdf244f77650e1 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 26 May 2023 09:27:35 +0200 Subject: [PATCH 715/802] new mode remove_negative --- data/examples/ebus_toolbox.cfg | 3 ++- ebus_toolbox/simulate.py | 10 ++++++++++ ebus_toolbox/util.py | 6 ++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 3a58660b..81cc1549 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -30,9 +30,10 @@ cost_parameters_file = data/examples/cost_params.json # neg_oppb_to_depb changes negative oppb-rotations to depb charging. # service_optimization finds the largest set of electrified rotations, rotations SOC<0 are removed. # station_optimization finds the set of fewest stations to electrify all rotations. +# remove_negative removes all negative rotations. # report generates simulation output files, including costs. mode = ["sim", "report"] -#mode = ["sim", "neg_depb_to_oppb", "service_optimization", "report", "station_optimization"] +#mode = ["sim", "neg_depb_to_oppb", "service_optimization", "station_optimization", "remove_negative", "report"] ##### Flags ##### ### Activate optional functions ### diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 1fe8c34c..ebb8967a 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -105,6 +105,16 @@ def simulate(args): except Exception as err: warnings.warn('During Station optimization an error occurred {0}. ' 'Optimization was skipped'.format(err)) + elif mode == 'remove_negative': + neg_rot = schedule.get_negative_rotations(scenario) + if neg_rot: + schedule.rotations = { + k: v for k, v in schedule.rotations.items() if k not in neg_rot} + print('Rotations ' + ', '.join(neg_rot) + ' removed') + # re-run schedule + scenario = schedule.run(args) + else: + print('No negative rotations to remove') elif mode == 'report': # create report based on all previous modes if args.cost_calculation: diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index abfacad0..4442dcba 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -243,8 +243,9 @@ def get_args(): help='include cost parameters json, needed if cost_calculation==True') # #### Modes ##### - mode_choices = ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', - 'station_optimization', 'report'] + mode_choices = [ + 'sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', + 'station_optimization', 'remove_negative', 'report'] parser.add_argument('--mode', default=['sim', 'report'], nargs='*', choices=mode_choices, help=f"Specify what you want to do. Choose one or more from \ {', '.join(mode_choices)}. \ @@ -253,6 +254,7 @@ def get_args(): neg_oppb_to_depb changes charging type of negative oppb rotations. \ service optimization finds the largest set of electrified rotations. \ station_optimization finds the smallest set of electrified stations.\ + remove_negative removes all negative rotations.\ report generates simulation output files.") # #### Flags ##### From 483790ed5642ce1c7e7c408e481806e5945260ca Mon Sep 17 00:00:00 2001 From: lilAndy-bruh Date: Fri, 26 May 2023 14:28:15 +0200 Subject: [PATCH 716/802] Delete rotation_filter.json and add rotation_filter.csv #30 --- data/examples/rotation_filter.csv | 2 ++ data/examples/rotation_filter.json | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 data/examples/rotation_filter.csv delete mode 100644 data/examples/rotation_filter.json diff --git a/data/examples/rotation_filter.csv b/data/examples/rotation_filter.csv new file mode 100644 index 00000000..7a754f41 --- /dev/null +++ b/data/examples/rotation_filter.csv @@ -0,0 +1,2 @@ +1 +2 \ No newline at end of file diff --git a/data/examples/rotation_filter.json b/data/examples/rotation_filter.json deleted file mode 100644 index fd8ef095..00000000 --- a/data/examples/rotation_filter.json +++ /dev/null @@ -1 +0,0 @@ -[1, 2] \ No newline at end of file From adbf59e3f8f9cb222081e817d09377a6f9859c2e Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 31 May 2023 14:00:53 +0200 Subject: [PATCH 717/802] minor changes to tests - moved redundant path declarations to tests.conftest - test_schedule: remove Schedule import - test_example: use regex to remove show_plots --- tests/conftest.py | 5 +++++ tests/test_consumption.py | 6 +----- tests/test_example.py | 5 +++-- tests/test_schedule.py | 25 ++++++++++--------------- tests/test_station_optimization.py | 3 +-- 5 files changed, 20 insertions(+), 24 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index e69de29b..03c03cb8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -0,0 +1,5 @@ +import pathlib + +test_root = pathlib.Path(__file__).parent +file_root = test_root / "test_input_files" +example_root = pathlib.Path(__file__).parent.parent / "data/examples" diff --git a/tests/test_consumption.py b/tests/test_consumption.py index 85a92efa..7caca24e 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -1,13 +1,9 @@ import pytest -import pathlib from tests.test_schedule import TestSchedule +from tests.conftest import example_root from datetime import datetime import pandas as pd -test_root = pathlib.Path(__file__).parent -file_root = test_root / "test_input_files" -example_root = pathlib.Path(__file__).parent.parent / "data/examples" - class TestConsumption: """Class to test Consumption functionality""" diff --git a/tests/test_example.py b/tests/test_example.py index d141b9ed..04cc9470 100644 --- a/tests/test_example.py +++ b/tests/test_example.py @@ -1,4 +1,5 @@ from pathlib import Path +import re import subprocess ROOT_PATH = Path(__file__).parent.parent @@ -16,8 +17,8 @@ def test_example_cfg(self, tmp_path): # write output to tmp src_text = src_text.replace("data/sim_outputs", str(tmp_path)) dst = tmp_path / "ebus_toolbox.cfg" - # don't show plots - src_text = src_text.replace("show_plots = true", "show_plots = false") + # don't show plots. spaces are optional, so use regex + src_text = re.sub(r"show_plots\s*=\s*true", "show_plots = false", src_text) dst.write_text(src_text) # call toolbox from shell diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 5a079c1d..bf19627d 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -1,19 +1,14 @@ from datetime import timedelta -import pathlib import pytest import sys import spice_ev.scenario as scenario from spice_ev.util import set_options_from_config +from tests.conftest import example_root, file_root from tests.helpers import generate_basic_schedule from ebus_toolbox import schedule, trip, consumption, util -from ebus_toolbox.schedule import Schedule -test_root = pathlib.Path(__file__).parent -file_root = test_root / "test_input_files" -example_root = pathlib.Path(__file__).parent.parent / "data/examples" - mandatory_args = { "min_recharge_deps_oppb": 0, "min_recharge_deps_depb": 0, @@ -246,7 +241,7 @@ def test_schedule_from_csv(self): def test_consistency(self): sched = generate_basic_schedule() # check if no error is thrown in the basic case - assert len(Schedule.check_consistency(sched)) == 0 + assert len(schedule.Schedule.check_consistency(sched)) == 0 error = "Trip time is negative" sched = generate_basic_schedule() @@ -254,7 +249,7 @@ def test_consistency(self): faulty_trip = faulty_rot.trips[0] # create error through moving trip arrival 1 day before departure faulty_trip.arrival_time = faulty_trip.departure_time - timedelta(days=1) - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error error = "Break time is negative" sched = generate_basic_schedule() @@ -262,14 +257,14 @@ def test_consistency(self): faulty_trip = faulty_rot.trips[1] # create error through moving trip departure before last arrival faulty_trip.departure_time = faulty_rot.trips[0].arrival_time-timedelta(minutes=1) - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error error = "Trips are not sequential" sched = generate_basic_schedule() faulty_rot = list(sched.rotations.values())[0] faulty_rot.trips[1].arrival_name = "foo" faulty_rot.trips[0].departure_name = "bar" - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error error = "Start and end of rotation differ" sched = generate_basic_schedule() @@ -277,7 +272,7 @@ def test_consistency(self): departure_trip = list(faulty_rot.trips)[0] departure_trip.departure_name = "foo" faulty_rot.trips[-1].arrival_name = "bar" - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error error = "Rotation data differs from trips data" @@ -287,13 +282,13 @@ def test_consistency(self): faulty_rot.trips[-1].arrival_name = "foo" faulty_rot.trips[0].departure_name = "foo" faulty_rot.arrival_name = "bar" - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error sched = generate_basic_schedule() faulty_rot = list(sched.rotations.values())[0] arrival_trip = faulty_rot.trips[-1] faulty_rot.arrival_time = arrival_trip.arrival_time - timedelta(minutes=1) - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error # check departure data in rotation sched = generate_basic_schedule() @@ -301,10 +296,10 @@ def test_consistency(self): faulty_rot.trips[-1].arrival_name = "foo" faulty_rot.trips[0].departure_name = "foo" faulty_rot.departure_name = "bar" - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error sched = generate_basic_schedule() faulty_rot = list(sched.rotations.values())[0] departure_trip = faulty_rot.trips[0] faulty_rot.departure_time = departure_trip.departure_time - timedelta(minutes=1) - assert Schedule.check_consistency(sched)["1"] == error + assert schedule.Schedule.check_consistency(sched)["1"] == error diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index af643aca..d838b617 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,16 +1,15 @@ +import pathlib import pytest import sys import ebus_toolbox.optimizer_util as opt_util import ebus_toolbox.util as util from ebus_toolbox.station_optimization import run_optimization -import pathlib from ebus_toolbox.trip import Trip from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule from spice_ev.report import generate_soc_timeseries -# test_root = pathlib.Path(__file__).parent file_root = pathlib.Path(__file__).parent / "test_input_files/optimization" From 76f6c3f9c17275af606199b0b58cd0d8666c9ed8 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 31 May 2023 17:03:09 +0200 Subject: [PATCH 718/802] Remove optimizer files from testing and some restructuring --- tests/test_input_files/optimization/trips.csv | 10 +- .../optimization/trips_extended.csv | 128 +++++++++--------- .../optimization/trips_for_optimizer.csv | 18 +-- .../optimization/trips_for_optimizer_deep.csv | 16 +-- .../optimization/vehicle_types.json | 22 --- tests/test_station_optimization.py | 69 ++++++++-- 6 files changed, 145 insertions(+), 118 deletions(-) delete mode 100644 tests/test_input_files/optimization/vehicle_types.json diff --git a/tests/test_input_files/optimization/trips.csv b/tests/test_input_files/optimization/trips.csv index c22bf992..d3529863 100644 --- a/tests/test_input_files/optimization/trips.csv +++ b/tests/test_input_files/optimization/trips.csv @@ -1,6 +1,6 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,CKB -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,CKB -LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,CKB -LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,CKB \ No newline at end of file +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,7000,1,AB +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,10000,1,AB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,12000,1,AB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,8000,1,AB +LINE_0,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,5000,1,AB \ No newline at end of file diff --git a/tests/test_input_files/optimization/trips_extended.csv b/tests/test_input_files/optimization/trips_extended.csv index d03e65ed..055034de 100644 --- a/tests/test_input_files/optimization/trips_extended.csv +++ b/tests/test_input_files/optimization/trips_extended.csv @@ -1,65 +1,65 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,CKB,20,0 -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,CKB,-5,0.9 -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,CKB,, -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,CKB,, -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,CKB,, -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,CKB,, -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,CKB,, -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,CKB,, -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,CKB,, -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,CKB,, -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,CKB,, -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,CKB,, -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,CKB,, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,CKB,, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,CKB,, -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,CKB,, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,CKB,, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,CKB,, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,CKB,, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,CKB,, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,CKB,, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,CKB,, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,CKB,, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,CKB,, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,CKB,, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,CKB,, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,CKB,, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,CKB,, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,CKB,, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,CKB,, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,CKB,, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,CKB,, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,CKB,, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,CKB,, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,CKB,, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,CKB,, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,CKB,, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,CKB,, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,CKB,, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,CKB,, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,CKB,, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,CKB,, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,CKB,, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,CKB,, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,CKB,, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,CKB,, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,CKB,, \ No newline at end of file +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0 +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9 +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,, +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,, +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,, +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,, +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,, +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,, +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,, +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,, +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,, +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,, \ No newline at end of file diff --git a/tests/test_input_files/optimization/trips_for_optimizer.csv b/tests/test_input_files/optimization/trips_for_optimizer.csv index 6df37ca2..cac505c5 100644 --- a/tests/test_input_files/optimization/trips_for_optimizer.csv +++ b/tests/test_input_files/optimization/trips_for_optimizer.csv @@ -1,10 +1,10 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:32:00,Station-1,700,1,CKB -LINE_0,Station-1,2022-03-07 21:41:00,2022-03-07 22:04:00,Station-2,1000,1,CKB -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,2000,1,CKB -LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,1000,1,CKB -Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,500,1,CKB -Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:32:00,Station-1,100,2,CKB -LINE_1,Station-1,2022-03-07 21:41:00,2022-03-07 22:04:00,Station-3,1000,2,CKB -LINE_1,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,800,2,CKB -Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,500,2,CKB \ No newline at end of file +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:32:00,Station-1,700,1,AB +LINE_0,Station-1,2022-03-07 21:41:00,2022-03-07 22:04:00,Station-2,1000,1,AB +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-3,2000,1,AB +LINE_0,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,1000,1,AB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,500,1,AB +Einsetzfahrt,Station-0,2022-03-07 21:31:00,2022-03-07 21:32:00,Station-1,100,2,AB +LINE_1,Station-1,2022-03-07 21:41:00,2022-03-07 22:04:00,Station-3,1000,2,AB +LINE_1,Station-3,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-4,800,2,AB +Aussetzfahrt,Station-4,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-0,500,2,AB \ No newline at end of file diff --git a/tests/test_input_files/optimization/trips_for_optimizer_deep.csv b/tests/test_input_files/optimization/trips_for_optimizer_deep.csv index cf11cfa5..2fbc8c4e 100644 --- a/tests/test_input_files/optimization/trips_for_optimizer_deep.csv +++ b/tests/test_input_files/optimization/trips_for_optimizer_deep.csv @@ -1,9 +1,9 @@ line,departure_name,departure_time,arrival_time,arrival_name,distance,rotation_id,vehicle_type -Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,500,1,CKB -LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-2,3000,1,CKB -LINE_0,Station-2,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,1,CKB -Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,500,1,CKB -Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,500,2,CKB -LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-3,3000,2,CKB -LINE_0,Station-3,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,2,CKB -Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,500,2,CKB \ No newline at end of file +Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,500,1,AB +LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-2,3000,1,AB +LINE_0,Station-2,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,1,AB +Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,500,1,AB +Einsetzfahrt,Station-0,2022-03-07 21:29:00,2022-03-07 21:30:00,Station-1,500,2,AB +LINE_0,Station-1,2022-03-07 21:45:00,2022-03-07 23:00:00,Station-3,3000,2,AB +LINE_0,Station-3,2022-03-07 23:20:00,2022-03-07 23:30:00,Station-1,3000,2,AB +Aussetzfahrt,Station-1,2022-03-07 23:35:00,2022-03-07 23:36:00,Station-0,500,2,AB \ No newline at end of file diff --git a/tests/test_input_files/optimization/vehicle_types.json b/tests/test_input_files/optimization/vehicle_types.json deleted file mode 100644 index 413aa438..00000000 --- a/tests/test_input_files/optimization/vehicle_types.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "CKB": { - "oppb": { - "name": "articulated bus - opportunity charging", - "capacity": 50, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 10 - }, - "depb": { - "name": "articulated bus - depot charging", - "capacity": 150, - "charging_curve": [[0, 150], [0.8, 150], [1, 150]], - "min_charging_power": 0, - "v2g": false, - "v2g_power_factor": 0.5, - "mileage": 15 - } - } -} diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index d838b617..53fdd85d 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,7 +1,9 @@ import pathlib +import re import pytest import sys - +import json +from tests.conftest import example_root import ebus_toolbox.optimizer_util as opt_util import ebus_toolbox.util as util from ebus_toolbox.station_optimization import run_optimization @@ -14,12 +16,64 @@ class TestStationOptimization: + tmp_path = None - # Using the pytest fixture tmp_path to have access to a temporary directory as class attribute @pytest.fixture(autouse=True) - def initialize_tmp_path(self, tmp_path): + def setup_test(self, tmp_path): + # This will guarantee proper file setup before every test. Generates files and inputs + # by adjusting example files and storing them in a temporary directory + self.tmp_path = tmp_path + # Create a temporary config file as copy from the example configuration. + src = file_root / "ebus_toolbox.cfg" + src_text = src.read_text() + + # don't show plots. spaces are optional, so use regex + src_text = re.sub(r"show_plots\s*=\s*true", "show_plots = false", src_text) + + # use the default vehicles from example folder but change some values + with open(example_root / "vehicle_types.json", "r", encoding='utf-8') as file: + self.vehicle_types = util.uncomment_json_file(file) + self.vehicle_types["AB"]["depb"]["mileage"] = 15 + self.vehicle_types["AB"]["oppb"]["mileage"] = 10 + self.vehicle_types["AB"]["oppb"]["capacity"] = 50 + del self.vehicle_types["SB"] + + # store the adjusted vehicles temporarily and use them in the config file + vehicles_dest = tmp_path / "vehicle_types.json" + with open(vehicles_dest, "w", encoding='utf-8') as file: + json.dump(self.vehicle_types, file) + + # remove escape characters from string. \1 refers to the replacement of the first group + # in the regex expression, i.e. not replacing the newline characters + vehicles_dest_str = str(vehicles_dest).replace('\\', '/') + src_text = re.sub( + r"(vehicle_types\s=.*)(:=\r\n|\r|\n)", + "vehicle_types = " + vehicles_dest_str + r"\g<2>", src_text) + + # Use the default electrified stations from example folder but change some values + with open(example_root / "electrified_stations.json", "r", encoding='utf-8') as file: + self.electrified_stations = util.uncomment_json_file(file) + # only keep Station-0 electrified and remove the other staitons + self.electrified_stations = {"Station-0": self.electrified_stations["Station-0"]} + + # store the adjusted electrified_stations temporarily and use them in the config file + electrified_stations_dest = tmp_path / "electrified_stations.json" + with open(electrified_stations_dest, "w", encoding='utf-8') as file: + json.dump(self.electrified_stations, file) + + # remove escape characters from string. \1 refers to the replacement of the first group + # in the regex expression, i.e. not replacing the newline characters + electrified_stations_dest_str = str(electrified_stations_dest).replace('\\', '/') + src_text = re.sub( + r"(electrified_stations\s=.*)(:=\r\n|\r|\n)", + "electrified_stations = " + electrified_stations_dest_str + r"\g<2>", src_text) + + # change config file with adjusted temporary paths to vehicles and electrified stations + dst = tmp_path / "ebus_toolbox.cfg" + dst.write_text(src_text) + mandatory_args = { "min_recharge_deps_oppb": 0, "min_recharge_deps_depb": 0, @@ -29,11 +83,6 @@ def initialize_tmp_path(self, tmp_path): "cs_power_deps_depb": 50, "cs_power_deps_oppb": 150 } - with open(file_root / "vehicle_types.json", "r", encoding='utf-8') as file: - vehicle_types = util.uncomment_json_file(file) - - with open(file_root / "electrified_stations.json", "r", encoding='utf-8') as file: - electrified_stations = util.uncomment_json_file(file) def test_basic_run(self, trips_file_name="trips.csv"): """ Check if running a basic example works and if a scenario object is returned. @@ -43,9 +92,9 @@ def test_basic_run(self, trips_file_name="trips.csv"): :type trips_file_name: str :return: schedule, scenario""" path_to_trips = file_root / trips_file_name - sys.argv = ["foo", "--config", str(file_root / "ebus_toolbox.cfg")] + sys.argv = ["foo", "--config", str(self.tmp_path / "ebus_toolbox.cfg")] args = util.get_args() - + args.input_schedule = path_to_trips Trip.consumption = Consumption(self.vehicle_types, outside_temperatures=None, level_of_loading_over_day=None) From 76e8333a1b4889e142fee173d76c6b0cc7385424 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 31 May 2023 18:17:42 +0200 Subject: [PATCH 719/802] Delete files --- .../optimization/all_stations.csv | 4 - .../optimization/cost_params.json | 195 ------------------ .../default_level_of_loading_over_day.csv | 25 --- .../optimization/default_temp_winter.csv | 25 --- .../optimization/ebus_toolbox.cfg | 88 -------- .../optimization/electrified_stations.json | 14 -- tests/test_station_optimization.py | 2 +- 7 files changed, 1 insertion(+), 352 deletions(-) delete mode 100644 tests/test_input_files/optimization/all_stations.csv delete mode 100644 tests/test_input_files/optimization/cost_params.json delete mode 100644 tests/test_input_files/optimization/default_level_of_loading_over_day.csv delete mode 100644 tests/test_input_files/optimization/default_temp_winter.csv delete mode 100644 tests/test_input_files/optimization/ebus_toolbox.cfg delete mode 100644 tests/test_input_files/optimization/electrified_stations.json diff --git a/tests/test_input_files/optimization/all_stations.csv b/tests/test_input_files/optimization/all_stations.csv deleted file mode 100644 index dec18443..00000000 --- a/tests/test_input_files/optimization/all_stations.csv +++ /dev/null @@ -1,4 +0,0 @@ -Endhaltestelle,elevation -Station A,1 -Station B,9 -Station C,10 \ No newline at end of file diff --git a/tests/test_input_files/optimization/cost_params.json b/tests/test_input_files/optimization/cost_params.json deleted file mode 100644 index d725bc1b..00000000 --- a/tests/test_input_files/optimization/cost_params.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "vehicles": { - "SB_depb": { - "capex": 420000, - "c_maint_per_km": 0.24, - "lifetime": 14 - }, - "SB_oppb": { - "capex": 420000, - "c_maint_per_km": 0.24, - "lifetime": 14 - }, - "CKB_depb": { - "capex": 600000, - "c_maint_per_km": 0.3, - "lifetime": 14 - }, - "CKB_oppb": { - "capex": 600000, - "c_maint_per_km": 0.3, - "lifetime": 14 - } - }, - "batteries": { - "lifetime_battery": 7, - "cost_per_kWh": 250 - }, - "gc": { - "LV": { - "default_distance": 50, - "capex_gc_fix": 16.85, - "capex_gc_per_meter": 16.85, - "capex_gc_per_kW": 24.14, - "capex_transformer_fix": 0, - "capex_transformer_per_kW": 0 - }, - "MV/LV": { - "default_distance": 100, - "capex_gc_fix": 16.85, - "capex_gc_per_meter": 16.85, - "capex_gc_per_kW": 24.14, - "capex_transformer_fix": 0, - "capex_transformer_per_kW": 0 - }, - "MV": { - "default_distance": 200, - "capex_gc_fix": 62500, - "capex_gc_per_meter": 562.5, - "capex_gc_per_kW": 158.3, - "capex_transformer_fix": 80000, - "capex_transformer_per_kW": 0 - }, - "HV/MV": { - "default_distance": 2000, - "capex_gc_fix": 0, - "capex_gc_per_meter": 80, - "capex_gc_per_kW": 158.3, - "capex_transformer_fix": 0, - "capex_transformer_per_kW": 63.49 - }, - "HV": { - "default_distance": 2000, - "capex_gc_fix": 0, - "capex_gc_per_meter": 1300, - "capex_gc_per_kW": 158.3, - "capex_transformer_fix": 2500000, - "capex_transformer_per_kW": 0 - }, - "lifetime_gc": 50, - "c_maint_transformer_per_year": 0.02, - "lifetime_transformer": 20 - }, - "stationary_storage": { - "capex_fix": 1, - "capex_per_kWh": 1, - "c_maint_stat_storage_per_year": 0.02, - "lifetime_stat_storage": 20 - }, - "cs":{ - "capex_opps_per_kW": 877.5, - "capex_deps_per_kW": 1000, - "lifetime_cs": 20, - "c_maint_cs_per_year": 0.02 - }, - "garage": { - "n_charging_stations": 1, - "power_cs": 50, - "vehicles_per_workstation": 20, - "cost_per_workstation": 245000, - "lifetime_workstations": 20 - }, - "grid_fee":{ - "SLP": { - "basic_charge_EUR/a": { - "net_price": 65.7, - "gross_price": 78.18, - "unit": "EUR/a", - "info": "basic charge for SLP (standard load profile) customers." - }, - "commodity_charge_ct/kWh": { - "net_price": 7.48, - "gross_price": 8.9, - "unit": "ct/kWh", - "info": "commodity costs for SLP (standard load profile) customers" - } - }, - "RLM": { - "<2500_h/a": { - "capacity_charge_EUR/kW*a": { - "HV": 19.13, - "HV/MV": 25.25, - "MV": 41.06, - "MV/LV": 44.26, - "LV": 44.26, - "unit": "EUR/(kW*a)", - "info": ["capacity charge depending on the voltage level for RLM", - "(Registrierende Leistungsmessung, engl.: consumption metering) customers with", - "annual utilization time < 2500 h/a"] - }, - "commodity_charge_ct/kWh": { - "HV": 2.3, - "HV/MV": 3.81, - "MV": 3.49, - "MV/LV": 4.39, - "LV": 4.83, - "unit": "ct/kWh", - "info": ["commodity charge depending on the voltage level for RLM", - "(Registrierende Leistungsmessung, engl.: consumption metering) customers with", - "annual utilization time < 2500 h/a"] - } - }, - ">=2500_h/a": { - "capacity_charge_EUR/kW*a": { - "HV": 56.33, - "HV/MV": 101.52, - "MV": 70.14, - "MV/LV": 97.01, - "LV": 64.33, - "unit": "EUR/(kW*a)", - "info": ["capacity charge depending on the voltage level for RLM customers with", - "annual utilization time >= 2500 h/a"] - }, - "commodity_charge_ct/kWh": { - "HV": 0.81, - "HV/MV": 0.76, - "MV": 2.32, - "MV/LV": 2.28, - "LV": 4.03, - "unit": "ct/kWh", - "info": ["commodity charge depending on the voltage level for RLM customers with", - "annual utilization time >= 2500 h/a"] - } - }, - "additional_costs": { - "costs": 0, - "unit": "EUR", - "info": "additional costs for RLM customers per year (f.i. costs for metering point operation)" - } - } - }, - "power_procurement": { - "charge": 7.7, - "unit": "ct/kWh", - "info": "charge for power generation, power procurement and sales" - }, - "levies": { - "EEG-levy": 0, - "chp_levy": 0.378, - "individual_charge_levy": 0.437, - "offshore_levy": 0.419, - "interruptible_loads_levy": 0.003, - "unit": "ct/kWh", - "info": ["levies on energy supplied from the power grid"] - }, - "concession_fee": { - "charge": 1.32, - "unit": "ct/kWh", - "info": "concession fee depending on the tariff and the size of the municipality" - }, - "taxes": { - "value_added_tax": 19, - "tax_on_electricity": 2.05, - "unit": "value added tax: %, tax on electricity: ct/kWh", - "info": "taxes on energy supplied from the power grid" - }, - "feed-in_remuneration": { - "PV": { - "kWp": [10, 40, 100], - "remuneration": [6.24, 6.06, 4.74] - }, - "V2G": 0, - "unit": "ct/kWh", - "info": "remuneration for power fed into the grid by PV power plants or electric vehicles" - } -} \ No newline at end of file diff --git a/tests/test_input_files/optimization/default_level_of_loading_over_day.csv b/tests/test_input_files/optimization/default_level_of_loading_over_day.csv deleted file mode 100644 index 00fd62d9..00000000 --- a/tests/test_input_files/optimization/default_level_of_loading_over_day.csv +++ /dev/null @@ -1,25 +0,0 @@ -hour,level_of_loading -0,0.5 -1,0.5 -2,0.5 -3,0.5 -4,0.5 -5,0.5 -6,0.5 -7,0.5 -8,0.5 -9,0.5 -10,0.5 -11,0.5 -12,0.5 -13,0.5 -14,0.5 -15,0.5 -16,0.5 -17,0.5 -18,0.5 -19,0.5 -20,0.5 -21,0.5 -22,0.5 -23,0.5 diff --git a/tests/test_input_files/optimization/default_temp_winter.csv b/tests/test_input_files/optimization/default_temp_winter.csv deleted file mode 100644 index 67ea0d6d..00000000 --- a/tests/test_input_files/optimization/default_temp_winter.csv +++ /dev/null @@ -1,25 +0,0 @@ -hour,temperature -00,-1.1 -01,-1.1 -02,-2.2 -03,-2.7 -04,-2.7 -05,-2.7 -06,-2.7 -07,-3.8 -08,-3.8 -09,-3.8 -10,-3.8 -11,-2.7 -12,-1.1 -13,1.1 -14,2.2 -15,2.2 -16,1.1 -17,0 -18,0 -19,-1.1 -20,-1.1 -21,-1.1 -22,-1.1 -23,-1.1 diff --git a/tests/test_input_files/optimization/ebus_toolbox.cfg b/tests/test_input_files/optimization/ebus_toolbox.cfg deleted file mode 100644 index 8a5baabd..00000000 --- a/tests/test_input_files/optimization/ebus_toolbox.cfg +++ /dev/null @@ -1,88 +0,0 @@ -##### Paths ##### -### Input and output files and paths ### -# Input file containing trip information (required) -input_schedule = tests/test_input_files/optimization/trips.csv -# Output files are stored here (defaults to: data/sim_outputs) -output_directory = tests/test_output_files/ -# Electrified stations (required) -electrified_stations = tests/test_input_files/optimization/electrified_stations.json -# Vehicle types (defaults to: ./data/examples/vehicle_types.json) -vehicle_types = tests/test_input_files/optimization/vehicle_types.json -# Path to station data with stations heights -# (Optional: needed if mileage in vehicle types not constant and inclination should be considered) -station_data_path = tests/test_input_files/optimization/all_stations.csv -# Path to temperature csv. data with temperatures in deg Celsius over 0-23 hours -# (Optional: needed if mileage in vehicle types not constant) -outside_temperature_over_day_path = tests/test_input_files/optimization/default_temp_winter.csv -# Path to level of loading csv. data with temperatures in deg Celsius over 0-23 hours -# (Optional: needed if mileage in vehicle types not constant) -level_of_loading_over_day_path = tests/test_input_files/optimization/default_level_of_loading_over_day.csv -# Path to configuration file for the station optimization. Only needed for mode "station_optimization" -optimizer_config = tests/test_input_files/optimization/optimizer.cfg -# Cost parameters (needed if cost_calculation flag is set to true, see Flag section below) -cost_parameters_file = tests/test_input_files/optimization/cost_params.json - -##### Modes ##### -### Specify how you want to simulate the scenario ### -# Options: sim, neg_depb_to_oppb, neg_oppb_to_depb, service_optimization. -# sim runs a single simulation with the given inputs. -# neg_depb_to_oppb changes negative depb-rotations to oppb charging. -# neg_oppb_to_depb changes negative oppb-rotations to depb charging. -# service_optimization finds the largest set of electrified rotations. -# station_optimization finds the set of fewest stations to electrify all rotations. -# report generates simulation output files, including costs. -mode = ["sim", "report"] -#mode = ["sim", "neg_depb_to_oppb", "service_optimization", "report", "station_optimization"] - -##### Flags ##### -### Activate optional functions ### -# Set flag for cost calculation: (default: false) -cost_calculation = true -# Check rotation assumptions when building schedule? (default: false) -check_rotation_consistency = false -# Remove rotations from schedule that violate assumptions? -# Needs check_rotation_consistency to have an effect (default: false) -skip_inconsistent_rotations = false -# Show plots for users to view, only valid if generate_report = true (default: false) -show_plots = true - -##### Physical setup of environment ##### -### Parametrization of the physical setup ### -# Preferred charging type. Options: depb, oppb (default: depb) -preferred_charging_type = oppb -# Default max power [kW] of grid connectors at depot and opp stations, -# Individual gc_power per gc can be defined in electrified stations -# For unlimited gc power: set very large value (default: 100000) -gc_power_opps = 100000 -gc_power_deps = 100000 -# Default max power [kW] of charging station at depot and opp stations (default at opps: 300) -# At depot stations opp and depot busses have distinct charging stations (all deps default to: 150) -# Individual cs_power per gc and cs type can be defined in electrified stations -cs_power_opps = 300 -cs_power_deps_depb = 150 -cs_power_deps_oppb = 150 -# Set minimum allowed state of charge when leaving depot and opportunity stations (both default: 1) -desired_soc_deps = 1.0 -desired_soc_opps = 1.0 -# Minimum fraction of capacity for recharge when leaving the depot. Helps calculating the -# Minimum standing time at depot. Between 0 - 1. (default: 1) -min_recharge_deps_oppb = 1 -min_recharge_deps_depb = 1 -# Min charging time at depots and opp stations in minutes (default: 0) -min_charging_time = 0 -# Buffer time in min at opp station if no specific buffer time is given in electrified_stations.json -# Time specific buffer times can be set via a dict e.g.: {"10-22": 5, "else": 2} -# NOTE: else clause is a MUST! The buffer time is deducted off of the planned standing time. -# It may resemble things like delays and/or docking procedures (default: 0) -default_buffer_time_opps = 0 - -##### SIMULATION PARAMETERS ##### -# Maximum number of days to simulate, if not set simulate entire schedule -#days = 10 -# Set length of time step in minutes (default: 1) -interval = 1 -# Time difference between signal time and actual start time of a vehicle event in min. (default: 10) -signal_time_dif = 10 -# Show estimated time to finish simulation after each step. Not recommended for fast computations -# (default: false) -eta = false diff --git a/tests/test_input_files/optimization/electrified_stations.json b/tests/test_input_files/optimization/electrified_stations.json deleted file mode 100644 index 6e71a084..00000000 --- a/tests/test_input_files/optimization/electrified_stations.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "Station-0": { - "type": "deps", - "n_charging_stations": null, - "energy_feed_in": { - "csv_file": "data/examples/example_pv_feedin.csv", - "start_time": "2022-03-07T00:00:00", - "step_duration_s": 3600, - "column": "Feed-in Total (kW)", - "nominal_power": 10, - "factor": 1 - } - } -} \ No newline at end of file diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 53fdd85d..070e3cfb 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -26,7 +26,7 @@ def setup_test(self, tmp_path): self.tmp_path = tmp_path # Create a temporary config file as copy from the example configuration. - src = file_root / "ebus_toolbox.cfg" + src = example_root / "ebus_toolbox.cfg" src_text = src.read_text() # don't show plots. spaces are optional, so use regex From 4c137f4ad073e5c0a442c9a7d10b7cfad50c0f95 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 1 Jun 2023 10:08:27 +0200 Subject: [PATCH 720/802] add logging --- ebus_toolbox/__main__.py | 30 ++++++++++++++++++++++++---- ebus_toolbox/consumption.py | 38 ++++++++++++++++++------------------ ebus_toolbox/costs.py | 3 ++- ebus_toolbox/optimization.py | 25 ++++++++---------------- ebus_toolbox/report.py | 13 ++++++------ ebus_toolbox/simulate.py | 21 ++++++++++---------- ebus_toolbox/trip.py | 7 ++++--- ebus_toolbox/util.py | 28 +++++++++++++++----------- 8 files changed, 93 insertions(+), 72 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index ad2fefef..18681253 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -1,15 +1,16 @@ from datetime import datetime +import logging from pathlib import Path import shutil from ebus_toolbox import simulate, util + if __name__ == '__main__': args = util.get_args() - args.output_directory = Path(args.output_directory) / ( - datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") - + time_str = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + args.output_directory = Path(args.output_directory) / (time_str + "_eBus_results") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. # needs to happen after set_options_from_config since @@ -30,4 +31,25 @@ util.save_version(args.output_directory_input / "program_version.txt") - simulate.simulate(args) + # set up logging + # always to console + log_handlers = [logging.StreamHandler()] + if args.logfile is not None: + # optionally to file in output dir + if args.logfile: + log_name = f"{time_str}_{[args.log_file]}.log" + else: + log_name = f"{time_str}.log" + log_handlers.append(logging.FileHandler(args.output_directory / log_name)) + logging.basicConfig( + level=vars(logging)[args.loglevel], + # format="%(asctime)s [%(levelname)s] %(message)s", + handlers=log_handlers + ) + logging.captureWarnings(True) + + try: + simulate.simulate(args) + except Exception as e: + logging.error(e) + raise diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 7857abf0..a4a4ec65 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -74,31 +74,31 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem if temp is None: try: temp = self.temperatures_by_hour[time.hour] - except AttributeError: - print("Neither of these conditions is met:\n" - "1. Temperature data is available for every trip through the trips file " - "or a temperature over day file.\n" - f"2. A constant mileage for the vehicle " - f"{vehicle_info['mileage']} is provided.") - raise AttributeError - except IndexError: - print(f"No temperature data for the hour {time.hour} is provided") - raise IndexError + except AttributeError as e: + raise AttributeError( + "Neither of these conditions is met:\n" + "1. Temperature data is available for every trip through the trips file " + "or a temperature over day file.\n" + f"2. A constant mileage for the vehicle " + f"{vehicle_info['mileage']} is provided." + ) from e + except IndexError as e: + raise IndexError (f"No temperature data for the hour {time.hour} is provided") from e # if no specific LoL is given, lookup temperature if level_of_loading is None: try: level_of_loading = self.lol_by_hour[time.hour] - except AttributeError: - print("Neither of these conditions is met:\n" - "1. Level of loading data is available for every trip through the trips file " - "or a level of loading over day file.\n" - f"2. A constant mileage for the vehicle " - f"{vehicle_info['mileage']} is provided.") - raise AttributeError + except AttributeError as e: + raise AttributeError( + "Neither of these conditions is met:\n" + "1. Level of loading data is available for every trip through the trips file " + "or a level of loading over day file.\n" + f"2. A constant mileage for the vehicle " + f"{vehicle_info['mileage']} is provided." + ) from e except IndexError: - print(f"No level of loading data for the hour {time.hour} is provided") - raise IndexError + raise IndexError(f"No level of loading for the hour {time.hour} is provided") from e # load consumption csv consumption_path = vehicle_info["mileage"] diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 6d78ebec..bb800065 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -1,3 +1,4 @@ +import logging import warnings from spice_ev.costs import calculate_costs as calc_costs_spice_ev @@ -187,7 +188,7 @@ def calculate_costs(c_params, scenario, schedule, args): for key, v in costs.items(): costs[key] = round(v, 2) - print("\n" + logging.info("\n" "Total costs: \n" f"Investment cost: {costs['c_invest']} €. \n" f"Annual investment costs: {costs['c_invest_annual']} €/a. \n" diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index ce4c2073..1856ac9a 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -1,17 +1,8 @@ """ Collection of procedures optimizing arbitrary parameters of a bus schedule or infrastructure. """ - from copy import deepcopy import datetime - import logging -import sys -logger = logging.getLogger(__name__) -if "pytest" not in sys.modules: - logger.setLevel(logging.DEBUG) - sh = logging.StreamHandler(sys.stdout) - sh.setLevel(logging.DEBUG) - logger.addHandler(sh) def service_optimization(schedule, scenario, args): @@ -34,7 +25,7 @@ def service_optimization(schedule, scenario, args): # single out negative rotations. Try to run these with common non-negative rotations negative_rotations = schedule.get_negative_rotations(scenario) - logger.info(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") + logging.info(f"Initially, rotations {sorted(negative_rotations)} have neg. SoC.") if not negative_rotations: return { @@ -48,7 +39,7 @@ def service_optimization(schedule, scenario, args): rotation = schedule.rotations.pop(rot_key) if rotation.charging_type != "oppb": # only oppb rotations are optimized -> skip others - logger.warn(f"Rotation {rot_key} should be optimized, " + logging.warn(f"Rotation {rot_key} should be optimized, " f"but is of type {rotation.charging_type}.") continue # oppb: build non-interfering sets of negative rotations @@ -67,7 +58,7 @@ def service_optimization(schedule, scenario, args): dependent_station.update({r2: t2 for r2, t2 in common_stations[r].items() if t2 <= t}) elif r.charging_type != "obbp": - logger.warn(f"Rotation {rot_key} depends on negative non-oppb rotation") + logging.warn(f"Rotation {rot_key} depends on negative non-oppb rotation") negative_sets[rot_key] = s @@ -80,7 +71,7 @@ def service_optimization(schedule, scenario, args): ignored = [] for i, (rot, s) in enumerate(negative_sets.items()): schedule.rotations = {r: original[0].rotations[r] for r in s} - logger.debug(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") + logging.debug(f"{i+1} / {len(negative_sets)} negative schedules: {rot}") scenario = schedule.run(args) if scenario.negative_soc_tracker: # still fail: try just the negative rotation @@ -88,10 +79,10 @@ def service_optimization(schedule, scenario, args): scenario = schedule.run(args) if scenario.negative_soc_tracker: # no hope, this just won't work - logger.info(f"Rotation {rot} will stay negative") + logging.info(f"Rotation {rot} will stay negative") else: # works alone with other non-negative rotations - logger.info(f"Rotation {rot} works alone") + logging.info(f"Rotation {rot} works alone") ignored.append(rot) negative_sets = {k: v for k, v in negative_sets.items() if k not in ignored} @@ -100,7 +91,7 @@ def service_optimization(schedule, scenario, args): # try to combine them possible = [(a, b) for a in negative_sets for b in negative_sets if a != b] while possible: - logger.debug(f"{len(possible)} combinations remain") + logging.debug(f"{len(possible)} combinations remain") r1, r2 = possible.pop() combined = negative_sets[r1].union(negative_sets[r2]) schedule.rotations = {r: original[0].rotations[r] for r in combined} @@ -115,7 +106,7 @@ def service_optimization(schedule, scenario, args): if optimal is None or len(scenario[0].rotations) > len(optimal[0].rotations): optimal = (deepcopy(schedule), deepcopy(scenario)) - logger.info(negative_sets) + logging.info("Service optimization finished") return { "original": original, diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 4bac3ed2..ddca98da 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -2,8 +2,9 @@ """ import csv import datetime -import warnings +import logging import matplotlib.pyplot as plt +import warnings from spice_ev.report import aggregate_global_results, plot, generate_reports @@ -187,10 +188,10 @@ def generate(schedule, scenario, args): rotation_socs[id][start_idx:end_idx] = rotation_soc_ts if incomplete_rotations: - warnings.warn("SpiceEV stopped before simulation of the these rotations were completed:\n" - f"{', '.join(incomplete_rotations)}\n" - "Omit parameter to simulate entire schedule.", - stacklevel=100) + logging.warn( + "SpiceEV stopped before simulation of the these rotations were completed:\n" + f"{', '.join(incomplete_rotations)}\n" + "Omit parameter to simulate entire schedule.") with open(args.results_directory / "rotation_socs.csv", "w", newline='') as f: csv_writer = csv.writer(f) @@ -218,4 +219,4 @@ def generate(schedule, scenario, args): else: csv_writer.writerow([key, round(value, 2), "€"]) - print("Plots and output files saved in", args.results_directory) + logging.info("Plots and output files saved in", args.results_directory) diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index ebb8967a..0f424cb4 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,5 +1,4 @@ -import warnings -from warnings import warn +import logging from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule @@ -72,7 +71,7 @@ def simulate(args): result = optimization.service_optimization(schedule, scenario, args) schedule, scenario = result['optimized'] if scenario is None: - print('*'*49 + '\nNo optimization possible (all rotations negative), reverting') + logging.warn('*'*49 + '\nNo optimization possible (all rotations negative), reverting') schedule, scenario = result['original'] elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: # simple optimization: change charging type, simulate again @@ -84,17 +83,17 @@ def simulate(args): neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from if change_to in vehicle_types[schedule.rotations[r].vehicle_type]] if neg_rot: - print(f'Changing charging type from {change_from} to {change_to} for rotations ' + logging.info(f'Changing charging type from {change_from} to {change_to} for rotations ' + ', '.join(neg_rot)) schedule.set_charging_type(change_to, neg_rot) # simulate again scenario = schedule.run(args) neg_rot = schedule.get_negative_rotations(scenario) if neg_rot: - print(f'Rotations {", ".join(neg_rot)} remain negative.') + logging.info(f'Rotations {", ".join(neg_rot)} remain negative.') elif mode == "station_optimization": if not args.optimizer_config: - warnings.warn("Station optimization needs an optimization config file. " + logging.warn("Station optimization needs an optimization config file. " "Since no path was given, station optimization is skipped") continue conf = read_optimizer_config(args.optimizer_config) @@ -103,18 +102,18 @@ def simulate(args): schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, args=args) except Exception as err: - warnings.warn('During Station optimization an error occurred {0}. ' + logging.warn('During Station optimization an error occurred {0}. ' 'Optimization was skipped'.format(err)) elif mode == 'remove_negative': neg_rot = schedule.get_negative_rotations(scenario) if neg_rot: schedule.rotations = { k: v for k, v in schedule.rotations.items() if k not in neg_rot} - print('Rotations ' + ', '.join(neg_rot) + ' removed') + logging.info('Rotations ' + ', '.join(sorted(neg_rot)) + ' removed') # re-run schedule scenario = schedule.run(args) else: - print('No negative rotations to remove') + logging.info('No negative rotations to remove') elif mode == 'report': # create report based on all previous modes if args.cost_calculation: @@ -126,9 +125,9 @@ def simulate(args): elif mode == 'sim': if i > 0: # ignore anyway, but at least give feedback that this has no effect - warn('Intermediate sim ignored') + logging.info('Intermediate sim ignored') else: - warn(f'Unknown mode {mode} ignored') + logging.error(f'Unknown mode {mode} ignored') def create_results_directory(args, i): diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index da9fe205..258276e8 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -67,8 +67,9 @@ def calculate_consumption(self): height_diff=self.height_diff, level_of_loading=self.level_of_loading, mean_speed=self.mean_speed) - except AttributeError: - print("""To calculate consumption, a consumption object needs to be constructed - and linked to Trip class.""") + except AttributeError as e: + raise Exception( + 'To calculate consumption, a consumption object needs to be constructed \ + and linked to Trip class.').with_traceback(e.__traceback__) return self.consumption diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 4442dcba..270b1d25 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,5 +1,6 @@ import argparse import json +import logging import warnings import subprocess @@ -125,19 +126,19 @@ def get_csv_delim(path, other_delims=set()): # delete the counter if it is different to the first row if counters[delim] != amount: del counters[delim] - # if only one delimiter is remaining - if len(counters) == 1: - # take the last item and return the key - return counters.popitem()[0] - # if not even a single delimiter is remaining - elif not counters: - warnings.warn("Warning: Delimiter could not be found.\n" - "Returning standard Delimiter ','", stacklevel=100) - return "," + # if only one delimiter is remaining + if len(counters) == 1: + # take the last item and return the key + return counters.popitem()[0] + # if not even a single delimiter is remaining + elif not counters: + logging.warn("Warning: Delimiter could not be found.\n" + "Returning standard Delimiter ','") + return "," # multiple delimiters are possible. Every row was checked but more than 1 delimiter # has the same amount of occurrences (>0) in every row. - warnings.warn("Warning: Delimiter could not be found.\n" - "Returning standard delimiter ','", stacklevel=100) + logging.warn("Warning: Delimiter could not be found.\n" + "Returning standard delimiter ','") return "," @@ -308,6 +309,11 @@ def get_args(): help='Show estimated time to finish simulation after each step, ' 'instead of progress bar. Not recommended for fast computations.') + # #### LOGGING PARAMETERS #### # + parser.add_argument('--loglevel', default='INFO', + choices=logging._nameToLevel.keys(), help='Log level.') + parser.add_argument('--logfile', default='', help='Log file suffix. null: no log file.') + # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') parser.add_argument('--include-price-csv', From 3d98cabe32e9f4650398635f17d8c93e81a47162 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 1 Jun 2023 10:11:08 +0200 Subject: [PATCH 721/802] adjust to SpiceEV cost calc changes --- data/examples/cost_params.json | 3 ++- ebus_toolbox/costs.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index a7703d12..4cd4efa5 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -189,7 +189,8 @@ "remuneration": [6.24, 6.06, 4.74] }, "V2G": 0, + "battery": 0, "unit": "ct/kWh", "info": "remuneration for power fed into the grid by PV power plants or electric vehicles" } -} \ No newline at end of file +} diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index 6d78ebec..0d146cdc 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -168,8 +168,10 @@ def calculate_costs(c_params, scenario, schedule, args): power_grid_supply_list=timeseries.get("grid supply [kW]"), price_list=timeseries.get("price [EUR/kWh]"), power_fix_load_list=timeseries.get("fixed load [kW]"), + power_generation_feed_in_list=timeseries.get("generation feed-in [kW]"), + power_v2g_feed_in_list=timeseries.get("V2G feed-in [kW]"), + power_battery_feed_in_list=timeseries.get("battery feed-in [kW]"), charging_signal_list=timeseries.get("window"), - core_standing_time_dict=scenario.core_standing_time, price_sheet_json=args.cost_parameters_file, power_pv_nominal=pv, ) From de4e498fccab70fc9ecc7d95461d48783cd6d4d1 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 1 Jun 2023 10:32:31 +0200 Subject: [PATCH 722/802] small changes to logging --- data/examples/ebus_toolbox.cfg | 9 +++++++++ ebus_toolbox/__main__.py | 8 +++++--- ebus_toolbox/report.py | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 81cc1549..3990bc52 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -80,6 +80,15 @@ default_buffer_time_opps = 0 # Options: HV, HV/MV, MV, MV/LV, LV (default: MV) default_voltage_level = "MV" +##### LOGGING ##### +# minimum log level. Allowed/useful: DEBUG, INFO, WARN, ERROR +# INFO includes INFO, WARN and ERROR but excludes DEBUG +loglevel = INFO +# log file name. Placed in output directory +# set to null to disable logfile creation +# leave empty to have default [timestamp].log +logfile = + ##### SIMULATION PARAMETERS ##### # Maximum number of days to simulate, if not set simulate entire schedule #days = 10 diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 18681253..5f7bcc86 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -37,13 +37,15 @@ if args.logfile is not None: # optionally to file in output dir if args.logfile: - log_name = f"{time_str}_{[args.log_file]}.log" + log_name = args.logfile else: log_name = f"{time_str}.log" - log_handlers.append(logging.FileHandler(args.output_directory / log_name)) + log_path = args.output_directory / log_name + print(f"Writing log to {log_path}") + log_handlers.append(logging.FileHandler(log_path)) logging.basicConfig( level=vars(logging)[args.loglevel], - # format="%(asctime)s [%(levelname)s] %(message)s", + format="%(asctime)s [%(levelname)s] %(message)s", handlers=log_handlers ) logging.captureWarnings(True) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index ddca98da..43131f80 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -219,4 +219,4 @@ def generate(schedule, scenario, args): else: csv_writer.writerow([key, round(value, 2), "€"]) - logging.info("Plots and output files saved in", args.results_directory) + logging.info(f"Plots and output files saved in {args.results_directory}") From 8c38ae9c8d043ff9a89f8019e6d7ed878c0b00cf Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 1 Jun 2023 12:26:51 +0200 Subject: [PATCH 723/802] fixes, refactoring, continue after mode fail If there is an exception while running a mode, print to log, generate plot (if there is anything to plot) and continue with next mode. --- ebus_toolbox/consumption.py | 4 +- ebus_toolbox/costs.py | 12 ++-- ebus_toolbox/optimization.py | 2 +- ebus_toolbox/report.py | 29 +++++--- ebus_toolbox/schedule.py | 11 +-- ebus_toolbox/simulate.py | 136 ++++++++++++++++++++--------------- ebus_toolbox/trip.py | 1 + ebus_toolbox/util.py | 1 - 8 files changed, 113 insertions(+), 83 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index a4a4ec65..53337311 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -83,7 +83,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem f"{vehicle_info['mileage']} is provided." ) from e except IndexError as e: - raise IndexError (f"No temperature data for the hour {time.hour} is provided") from e + raise IndexError(f"No temperature data for the hour {time.hour} is provided") from e # if no specific LoL is given, lookup temperature if level_of_loading is None: @@ -97,7 +97,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem f"2. A constant mileage for the vehicle " f"{vehicle_info['mileage']} is provided." ) from e - except IndexError: + except IndexError as e: raise IndexError(f"No level of loading for the hour {time.hour} is provided") from e # load consumption csv diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index ae783a2a..69670fdf 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -190,11 +190,11 @@ def calculate_costs(c_params, scenario, schedule, args): for key, v in costs.items(): costs[key] = round(v, 2) - logging.info("\n" - "Total costs: \n" - f"Investment cost: {costs['c_invest']} €. \n" - f"Annual investment costs: {costs['c_invest_annual']} €/a. \n" - f"Annual maintenance costs: {costs['c_maint_annual']} €/a. \n" - f"Annual costs for electricity: {costs['c_el_annual']} €/a.\n") + logging.info( + "\nTotal costs:\n" + f"Investment cost: {costs['c_invest']} €. \n" + f"Annual investment costs: {costs['c_invest_annual']} €/a. \n" + f"Annual maintenance costs: {costs['c_maint_annual']} €/a. \n" + f"Annual costs for electricity: {costs['c_el_annual']} €/a.\n") setattr(scenario, "costs", costs) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index 1856ac9a..e6243d6e 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -40,7 +40,7 @@ def service_optimization(schedule, scenario, args): if rotation.charging_type != "oppb": # only oppb rotations are optimized -> skip others logging.warn(f"Rotation {rot_key} should be optimized, " - f"but is of type {rotation.charging_type}.") + f"but is of type {rotation.charging_type}.") continue # oppb: build non-interfering sets of negative rotations # (these include the dependent non-negative rotations) diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index 43131f80..d01c404f 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -93,6 +93,25 @@ def generate_gc_overview(schedule, scenario, args): *use_factors]) +def generate_plots(scenario, args): + """Save plots as png and pdf. + + :param scenario: Scenario to plot. + :type scenario: spice_ev.Scenario + :param args: Configuration. Uses results_directory and show_plots. + :type args: argparse.Namespace + """ + aggregate_global_results(scenario) + with plt.ion(): # make plotting temporarily interactive, so plt.show does not block + plt.clf() + plot(scenario) + plt.gcf().set_size_inches(10, 10) + plt.savefig(args.results_directory / "run_overview.png") + plt.savefig(args.results_directory / "run_overview.pdf") + if args.show_plots: + plt.show() + + def generate(schedule, scenario, args): """Generates all output files/ plots and saves them in the output directory. @@ -123,15 +142,7 @@ def generate(schedule, scenario, args): generate_gc_overview(schedule, scenario, args) # save plots as png and pdf - aggregate_global_results(scenario) - with plt.ion(): # make plotting temporarily interactive, so plt.show does not block - plt.clf() - plot(scenario) - plt.gcf().set_size_inches(10, 10) - plt.savefig(args.results_directory / "run_overview.png") - plt.savefig(args.results_directory / "run_overview.pdf") - if args.show_plots: - plt.show() + generate_plots(scenario, args) # calculate SOCs for each rotation rotation_infos = [] diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 514542ac..1caefe52 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -1,8 +1,9 @@ import csv -import random import datetime -import warnings +import logging from pathlib import Path +import random +import warnings from ebus_toolbox import util from ebus_toolbox.rotation import Rotation @@ -120,7 +121,7 @@ def from_csv(cls, path_to_csv, vehicle_types, stations, **kwargs): with open(kwargs["output_directory"] / "inconsistent_rotations.csv", "w") as f: for rot_id, e in inconsistent_rotations.items(): f.write(f"Rotation {rot_id}: {e}\n") - print(f"Rotation {rot_id}: {e}") + logging.error(f"Rotation {rot_id}: {e}") if kwargs.get("skip_inconsistent_rotations"): # remove this rotation from schedule del schedule.rotations[rot_id] @@ -185,7 +186,7 @@ def run(self, args): scenario = self.generate_scenario(args) - print("Running Spice EV...") + logging.info("Running Spice EV...") with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) scenario.run('distributed', vars(args).copy()) @@ -639,7 +640,7 @@ def generate_scenario(self, args): events['energy_price_from_csv'] = options price_csv_path = args.output_directory / filename if not price_csv_path.exists(): - print("Warning: price csv file '{}' does not exist yet".format(price_csv_path)) + logging.warn(f"Price csv file '{price_csv_path}' does not exist yet") # reformat vehicle types for spiceEV vehicle_types_spiceev = { diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 0f424cb4..a2b158a1 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -1,4 +1,5 @@ import logging +import traceback from ebus_toolbox.consumption import Consumption from ebus_toolbox.schedule import Schedule @@ -66,68 +67,85 @@ def simulate(args): # scenario must be set from initial run / prior modes assert scenario is not None, f"Scenario became None after mode {args.mode[i-1]} (index {i})" - if mode == 'service_optimization': - # find largest set of rotations that produce no negative SoC - result = optimization.service_optimization(schedule, scenario, args) - schedule, scenario = result['optimized'] - if scenario is None: - logging.warn('*'*49 + '\nNo optimization possible (all rotations negative), reverting') - schedule, scenario = result['original'] - elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: - # simple optimization: change charging type, simulate again - change_from = mode[4:8] - change_to = mode[-4:] - # get negative rotations - neg_rot = schedule.get_negative_rotations(scenario) - # check which rotations are relevant and if vehicle with other charging type exists - neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from - if change_to in vehicle_types[schedule.rotations[r].vehicle_type]] - if neg_rot: - logging.info(f'Changing charging type from {change_from} to {change_to} for rotations ' - + ', '.join(neg_rot)) - schedule.set_charging_type(change_to, neg_rot) - # simulate again - scenario = schedule.run(args) + try: + if mode == 'service_optimization': + # find largest set of rotations that produce no negative SoC + result = optimization.service_optimization(schedule, scenario, args) + schedule, scenario = result['optimized'] + if scenario is None: + logging.warn('No optimization possible (all rotations negative), reverting') + schedule, scenario = result['original'] + elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: + # simple optimization: change charging type, simulate again + change_from = mode[4:8] + change_to = mode[-4:] + # get negative rotations neg_rot = schedule.get_negative_rotations(scenario) + # check which rotations are relevant and if vehicle with other charging type exists + neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from + if change_to in vehicle_types[schedule.rotations[r].vehicle_type]] if neg_rot: - logging.info(f'Rotations {", ".join(neg_rot)} remain negative.') - elif mode == "station_optimization": - if not args.optimizer_config: - logging.warn("Station optimization needs an optimization config file. " - "Since no path was given, station optimization is skipped") - continue - conf = read_optimizer_config(args.optimizer_config) - try: - create_results_directory(args, i+1) - schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, - args=args) - except Exception as err: - logging.warn('During Station optimization an error occurred {0}. ' - 'Optimization was skipped'.format(err)) - elif mode == 'remove_negative': - neg_rot = schedule.get_negative_rotations(scenario) - if neg_rot: - schedule.rotations = { - k: v for k, v in schedule.rotations.items() if k not in neg_rot} - logging.info('Rotations ' + ', '.join(sorted(neg_rot)) + ' removed') - # re-run schedule - scenario = schedule.run(args) + logging.info( + f'Changing charging type from {change_from} to {change_to} for rotations ' + + ', '.join(sorted(neg_rot))) + schedule.set_charging_type(change_to, neg_rot) + # simulate again + scenario = schedule.run(args) + neg_rot = schedule.get_negative_rotations(scenario) + if neg_rot: + logging.info(f'Rotations {", ".join(neg_rot)} remain negative.') + elif mode == "station_optimization": + if not args.optimizer_config: + logging.warn("Station optimization needs an optimization config file. " + "Since no path was given, station optimization is skipped") + continue + conf = read_optimizer_config(args.optimizer_config) + try: + create_results_directory(args, i+1) + schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, + args=args) + except Exception as err: + logging.warn('During Station optimization an error occurred {0}. ' + 'Optimization was skipped'.format(err)) + elif mode == 'remove_negative': + neg_rot = schedule.get_negative_rotations(scenario) + if neg_rot: + schedule.rotations = { + k: v for k, v in schedule.rotations.items() if k not in neg_rot} + logging.info('Rotations ' + ', '.join(sorted(neg_rot)) + ' removed') + # re-run schedule + scenario = schedule.run(args) + else: + logging.info('No negative rotations to remove') + elif mode == 'report': + # create report based on all previous modes + if args.cost_calculation: + # cost calculation part of report + calculate_costs(cost_parameters_file, scenario, schedule, args) + # name: always start with sim, append all prior optimization modes + create_results_directory(args, i) + report.generate(schedule, scenario, args) + elif mode == 'sim': + if i > 0: + # ignore anyway, but at least give feedback that this has no effect + logging.info('Intermediate sim ignored') else: - logging.info('No negative rotations to remove') - elif mode == 'report': - # create report based on all previous modes - if args.cost_calculation: - # cost calculation part of report - calculate_costs(cost_parameters_file, scenario, schedule, args) - # name: always start with sim, append all prior optimization modes - create_results_directory(args, i) - report.generate(schedule, scenario, args) - elif mode == 'sim': - if i > 0: - # ignore anyway, but at least give feedback that this has no effect - logging.info('Intermediate sim ignored') - else: - logging.error(f'Unknown mode {mode} ignored') + logging.error(f'Unknown mode {mode} ignored') + except Exception as e: + msg = f"{e.__class__.__name__} during {mode}: {e}" + logging.error('*'*len(msg)) + logging.error(e) + logging.error('*'*len(msg)) + # logging.error(str(e.__traceback__)) + logging.error(traceback.format_exc()) + # logging.error(traceback.print_exception(type(e), e, e.__traceback__)) + if scenario is not None and scenario.step_i > 0: + # generate plot of failed scenario + args.mode = args.mode[:i] + ["ABORTED"] + create_results_directory(args, i+1) + report.generate_plots(scenario, args) + logging.info(f"Created plot of failed scenario in {args.results_directory}") + # continue with other modes after error def create_results_directory(args, i): diff --git a/ebus_toolbox/trip.py b/ebus_toolbox/trip.py index 258276e8..0d7d4713 100644 --- a/ebus_toolbox/trip.py +++ b/ebus_toolbox/trip.py @@ -55,6 +55,7 @@ def calculate_consumption(self): :return: Consumption of trip [kWh] :rtype: float + :raises with_traceback: if consumption cannot be constructed """ try: diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 270b1d25..1ae3040f 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -1,7 +1,6 @@ import argparse import json import logging -import warnings import subprocess from spice_ev.util import set_options_from_config From d0541baba30309a738eb12f0be3e9e8630953a09 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 1 Jun 2023 12:43:10 +0200 Subject: [PATCH 724/802] tidy up --- ebus_toolbox/__main__.py | 1 - ebus_toolbox/simulate.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 5f7bcc86..511503f7 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -5,7 +5,6 @@ from ebus_toolbox import simulate, util - if __name__ == '__main__': args = util.get_args() diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index a2b158a1..e5c1e76f 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -136,9 +136,7 @@ def simulate(args): logging.error('*'*len(msg)) logging.error(e) logging.error('*'*len(msg)) - # logging.error(str(e.__traceback__)) logging.error(traceback.format_exc()) - # logging.error(traceback.print_exception(type(e), e, e.__traceback__)) if scenario is not None and scenario.step_i > 0: # generate plot of failed scenario args.mode = args.mode[:i] + ["ABORTED"] From 39f1ed8e2e75494725ba55e8266968d6c3a02b6e Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 1 Jun 2023 14:43:34 +0200 Subject: [PATCH 725/802] Extend plotting functionality --- ebus_toolbox/optimizer_util.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 4f272efa..28cc4462 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -595,17 +595,21 @@ def charging_curve_to_soc_over_time( return np.array((times, socs)).T -def get_missing_energy(events): +def get_missing_energy(events, min_soc=0): """Sum up all the missing energies of the given events. :param events: events to be checked :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) + :param min_soc: minimal soc as desired value + :type min_soc: float :return: missing energy :rtype: float """ missing_energy = 0 for event in events: - missing_energy += event.min_soc * event.capacity + # events should be by definition below the min_soc defined by the config + assert event.min_soc < min_soc + missing_energy += (event.min_soc-min_soc) * event.capacity return missing_energy @@ -785,14 +789,30 @@ def get_time(start=[]): return str(delta) + " seconds since start" -def plot_(data): +def plot_(data, axis=None): """ Simple plot of data without having to create subplots. :param data: data to be plotted :type data: iterable + :param axis: axis to be plotted to. Default None will create new figure and axis + :type axis: matplotlib.axes.Axes :return: axis of the plot """ - fig, axis = plt.subplots() - axis.plot(data, linewidth=2.0) + if axis is None: + fig, axis = plt.subplots() + try: + # if the data is iterable, use the lower dimension + _ = iter(next(iter(data))) + for dat in data: + try: + name, plot_data = dat, data[dat] + except Exception: + plot_data = dat + name = None + print(name) + axis.plot(plot_data, label=name, linewidth=2.0) + axis.legend() + except Exception: + axis.plot(data, linewidth=2.0) return axis From 7bddeb30a4aed07e2d16e1e84456e27b9280c3f5 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 1 Jun 2023 14:45:34 +0200 Subject: [PATCH 726/802] Fix missing energy calculation in cases of non 0 min soc and fix pruning for spiceev as solver --- ebus_toolbox/station_optimizer.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index a9c565f5..15e35b31 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -285,7 +285,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # when the recursive call goes on a higher level eg. level 0 - level 1 - level 2 - level 1 station_eval = opt_util.evaluate(event_group, self, soc_data=kwargs["lifted_socs"]) - missing_energy = opt_util.get_missing_energy(event_group) + missing_energy = opt_util.get_missing_energy(event_group, min_soc=self.config.min_soc) if missing_energy >= 0: self.logger.debug("Already electrified: Returning") return self.electrified_stations @@ -351,7 +351,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ new_events = self.get_low_soc_events(rotations=event_rotations_ids, rel_soc=True, **kwargs) - delta_energy = opt_util.get_missing_energy(new_events) + delta_energy = opt_util.get_missing_energy(new_events, self.config.min_soc) events_remaining[0] -= len(event_group) - len(new_events) self.logger.debug( "Last electrification electrified %s/%s. %s remaining events in the base group.", @@ -394,12 +394,15 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ # unnecessary calculation thresh = self.config.pruning_threshold if len(pre_optimized_set) - len(self.electrified_station_set) < thresh: + self.copy_scen_sched() + self.deepcopy_socs() self.scenario.vehicle_socs = self.timeseries_calc( event_rotations, electrify_stations=best_station_ids) prune_events = self.get_low_soc_events( rotations=event_rotations_ids, rel_soc=True, **kwargs) station_eval = opt_util.evaluate(prune_events, self) - prune_missing_energy = opt_util.get_missing_energy(prune_events) + prune_missing_energy = \ + opt_util.get_missing_energy(prune_events, self.config.min_soc) if not self.is_branch_promising(station_eval, self.electrified_station_set, pre_optimized_set, prune_missing_energy): self.logger.debug("Branch pruned early") @@ -476,7 +479,7 @@ def timeseries_calc( rot.vehicle_id.find("depb") > 0) * "depb" v_type = rot.vehicle_id.split("_" + ch_type)[0] soc_over_time_curve = self.soc_charge_curve_dict[v_type][ch_type] - soc = soc_dict[rot.vehicle_id] + soc = np.array(soc_dict[rot.vehicle_id]) for i, trip in enumerate(rot.trips): if trip.arrival_name not in ele_stations: continue From 7a38b629cb9d717589f7f36e9e5abd6ccd035e80 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 1 Jun 2023 14:46:16 +0200 Subject: [PATCH 727/802] Remove unnessecary files from input and several fixes of test cases including more assertions --- tests/test_station_optimization.py | 92 ++++++++++++++++++------------ 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 070e3cfb..4502bd80 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,5 +1,8 @@ import pathlib import re +import shutil +from copy import copy + import pytest import sys import json @@ -18,10 +21,16 @@ class TestStationOptimization: tmp_path = None + # this format allows calling setup path directly, when not using pytest + # for debugging purposes @pytest.fixture(autouse=True) + def setup_test_fixture(self, tmp_path): + self.setup_test(tmp_path) + + # setup for test including setting up tmp_path and file creation def setup_test(self, tmp_path): # This will guarantee proper file setup before every test. Generates files and inputs - # by adjusting example files and storing them in a temporary directory + # by adjusting example files and storing them in a temporary directory. self.tmp_path = tmp_path @@ -32,22 +41,17 @@ def setup_test(self, tmp_path): # don't show plots. spaces are optional, so use regex src_text = re.sub(r"show_plots\s*=\s*true", "show_plots = false", src_text) - # use the default vehicles from example folder but change some values - with open(example_root / "vehicle_types.json", "r", encoding='utf-8') as file: - self.vehicle_types = util.uncomment_json_file(file) - self.vehicle_types["AB"]["depb"]["mileage"] = 15 - self.vehicle_types["AB"]["oppb"]["mileage"] = 10 - self.vehicle_types["AB"]["oppb"]["capacity"] = 50 - del self.vehicle_types["SB"] - - # store the adjusted vehicles temporarily and use them in the config file vehicles_dest = tmp_path / "vehicle_types.json" - with open(vehicles_dest, "w", encoding='utf-8') as file: - json.dump(self.vehicle_types, file) + # store vehicles temporarily and use them in the config file + shutil.copy(example_root / "vehicle_types.json", vehicles_dest) - # remove escape characters from string. \1 refers to the replacement of the first group - # in the regex expression, i.e. not replacing the newline characters + # opens the vehicle type file, and adjust capacity and mileage of all vehicles + self.vehicle_types = adjust_vehicle_file(vehicles_dest, capacity=50, mileage=10) + + # remove escape characters from string vehicles_dest_str = str(vehicles_dest).replace('\\', '/') + # replace line which defines vehicle_types up to line break. line break is concatenated in + # the replacement, to keep format src_text = re.sub( r"(vehicle_types\s=.*)(:=\r\n|\r|\n)", "vehicle_types = " + vehicles_dest_str + r"\g<2>", src_text) @@ -57,6 +61,9 @@ def setup_test(self, tmp_path): self.electrified_stations = util.uncomment_json_file(file) # only keep Station-0 electrified and remove the other staitons self.electrified_stations = {"Station-0": self.electrified_stations["Station-0"]} + del self.electrified_stations["Station-0"]["external_load"] + del self.electrified_stations["Station-0"]["battery"] + del self.electrified_stations["Station-0"]["energy_feed_in"] # store the adjusted electrified_stations temporarily and use them in the config file electrified_stations_dest = tmp_path / "electrified_stations.json" @@ -70,20 +77,14 @@ def setup_test(self, tmp_path): r"(electrified_stations\s=.*)(:=\r\n|\r|\n)", "electrified_stations = " + electrified_stations_dest_str + r"\g<2>", src_text) + src_text = re.sub( + r"(preferred_charging_type\s=.*)(:=\r\n|\r|\n)", + "preferred_charging_type = oppb"r"\g<2>", src_text) + # change config file with adjusted temporary paths to vehicles and electrified stations dst = tmp_path / "ebus_toolbox.cfg" dst.write_text(src_text) - mandatory_args = { - "min_recharge_deps_oppb": 0, - "min_recharge_deps_depb": 0, - "gc_power_opps": 1000, - "gc_power_deps": 1000, - "cs_power_opps": 100, - "cs_power_deps_depb": 50, - "cs_power_deps_oppb": 150 - } - def test_basic_run(self, trips_file_name="trips.csv"): """ Check if running a basic example works and if a scenario object is returned. @@ -98,12 +99,11 @@ def test_basic_run(self, trips_file_name="trips.csv"): Trip.consumption = Consumption(self.vehicle_types, outside_temperatures=None, level_of_loading_over_day=None) - - path_to_all_station_data = file_root / "all_stations.csv" + args2 = copy(args) + del args2.vehicle_types generated_schedule = Schedule.from_csv(path_to_trips, self.vehicle_types, self.electrified_stations, - **self.mandatory_args, - station_data_path=path_to_all_station_data) + **vars(args2)) scen = generated_schedule.run(args) # optimization depends on vehicle_socs, therefore they need to be generated @@ -117,7 +117,7 @@ def test_basic_optimization(self): """ Test if the base optimization finishes without raising errors""" trips_file_name = "trips_for_optimizer.csv" sched, scen, args = self.test_basic_run(trips_file_name) - config_path = file_root / "optimizer.cfg" + config_path = example_root / "default_optimizer.cfg" conf = opt_util.read_config(config_path) opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) @@ -144,7 +144,7 @@ def test_deep_optimization(self): trips_file_name = "trips_for_optimizer_deep.csv" sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) args.input_schedule = file_root / trips_file_name - config_path = file_root / "optimizer.cfg" + config_path = example_root / "default_optimizer.cfg" conf = opt_util.read_config(config_path) solvers = ["quick", "spiceev"] @@ -155,30 +155,32 @@ def test_deep_optimization(self): conf.solver = solver conf.node_choice = node_choice opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + assert len(opt_sched.get_negative_rotations(opt_scen)) == 0 assert "Station-1" not in opt_sched.stations assert "Station-2" in opt_sched.stations assert "Station-3" in opt_sched.stations trips_file_name = "trips_extended.csv" + # adjust mileage so scenario is not possible without adding electrification + self.vehicle_types = adjust_vehicle_file(args.vehicle_types, mileage=2, capacity=150) sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + # optimization can only be properly tested if negative rotations exist + assert len(sched.get_negative_rotations(scen)) > 0 args.input_schedule = file_root / trips_file_name - config_path = file_root / "optimizer.cfg" - conf = opt_util.read_config(config_path) - solvers = ["quick", "spiceev"] - node_choices = ["step-by-step", "brute"] - conf.opt_type = "deep" opt_stat = None for solver in solvers: for node_choice in node_choices: conf.solver = solver conf.node_choice = node_choice opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + neg_rots = opt_sched.get_negative_rotations(opt_scen) + assert len(neg_rots) == 0 if opt_stat is None: opt_stat = {stat for stat in opt_sched.stations} assert len(opt_stat) > 0 else: - assert opt_stat == set(opt_sched.stations) + assert len(opt_stat) == len(set(opt_sched.stations)) def test_critical_stations_optimization(self, caplog): """Test if station 2 and 3 are correctly recognized as critical stations. @@ -189,7 +191,7 @@ def test_critical_stations_optimization(self, caplog): trips_file_name = "trips_for_optimizer_deep.csv" sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) args.input_schedule = file_root / trips_file_name - config_path = file_root / "optimizer.cfg" + config_path = example_root / "default_optimizer.cfg" conf = opt_util.read_config(config_path) conf.check_for_must_stations = True @@ -198,3 +200,19 @@ def test_critical_stations_optimization(self, caplog): opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) assert ("must stations {'Station-3', 'Station-2'}" in caplog.text or "must stations {'Station-2', 'Station-3'}" in caplog.text) + + +def adjust_vehicle_file(source, capacity=None, mileage=0): + # use the default vehicles from example folder + with open(source, "r", encoding='utf-8') as file: + vehicle_types = util.uncomment_json_file(file) + + for vehicle in vehicle_types: + for vtype in vehicle_types[vehicle]: + if capacity is not None: + vehicle_types[vehicle][vtype]["capacity"] = capacity + if mileage is not None: + vehicle_types[vehicle][vtype]["mileage"] = mileage + with open(source, "w", encoding='utf-8') as file: + json.dump(vehicle_types, file) + return vehicle_types From 256fcbefdc6a55885bf19b94cfecd593d67e6dae Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 1 Jun 2023 14:47:19 +0200 Subject: [PATCH 728/802] Remove optimizer cfg from test --- .../optimization/optimizer.cfg | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 tests/test_input_files/optimization/optimizer.cfg diff --git a/tests/test_input_files/optimization/optimizer.cfg b/tests/test_input_files/optimization/optimizer.cfg deleted file mode 100644 index 18071b02..00000000 --- a/tests/test_input_files/optimization/optimizer.cfg +++ /dev/null @@ -1,59 +0,0 @@ -# Configs for the eBus Toolbox Optimizer -#[DEFAULT] -debug_level=1 - -#[SCENARIO] -# Use "" for ids and not '' -exclusion_rots = [] -exclusion_stations= [] -# If using inclusion stations, scenario should be rebased -inclusion_stations= [] -standard_opp_station={"type": "opps", "n_charging_stations": 200,"distance_transformer": 50, "voltage_level": "MV"} - -#[PICKLE] -schedule= -scenario= -args= - - -#[VEHICLE] -# battery_capacity = 400 -# charging_curve = [[0, 450], [0.8, 296], [0.9, 210], [1, 20]] -# charging_power = 250 -# min_soc=0.05 - -#[OPTIMIZER] -# "quick" or "spiceev" -solver = quick -rebase_scenario = False -pickle_rebased= False -pickle_rebased_name=rebased -run_only_neg=False -run_only_oppb = True -pruning_threshold=0 - -# "greedy" or "deep" without "" -opt_type = greedy -# "step-by-step" or "brute" without "" -node_choice=step-by-step -max_brute_loop=300 -estimation_threshold = 0.90 -# Preferring deps leads to a spice_ev simulation with preferred charging type depots -# Afterwards all negative rotations are swapped to opportunity chargers and optimized -# prefer_deps=True - -# Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible -# If they are deemed as impossible, they are not optimized but discarded -remove_impossible_rots=True -check_for_must_stations=False -include_must_stations = True - - - -#[SPECIAL] -decision_tree_path = "" -save_decision_tree = False -reduce_rots = False -# Use "" for ids and not '' -# Negative Rots in all deps -rots = [] \ No newline at end of file From 9293070df5e0748b375279befc35494ac2dd396f Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 2 Jun 2023 09:13:19 +0200 Subject: [PATCH 729/802] minor changes - logging.warning instead of logging.warn (deprecated) - correct spelling of SpiceEV - remove DEBUG logging of matplotlib - move logging setup to util --- ebus_toolbox/__main__.py | 20 +------------------- ebus_toolbox/optimization.py | 6 +++--- ebus_toolbox/report.py | 6 +++++- ebus_toolbox/schedule.py | 16 ++++++++-------- ebus_toolbox/simulate.py | 10 +++++----- ebus_toolbox/util.py | 31 ++++++++++++++++++++++++++----- 6 files changed, 48 insertions(+), 41 deletions(-) diff --git a/ebus_toolbox/__main__.py b/ebus_toolbox/__main__.py index 511503f7..486afa42 100644 --- a/ebus_toolbox/__main__.py +++ b/ebus_toolbox/__main__.py @@ -29,25 +29,7 @@ shutil.copy(c_file, args.output_directory_input / c_file.name) util.save_version(args.output_directory_input / "program_version.txt") - - # set up logging - # always to console - log_handlers = [logging.StreamHandler()] - if args.logfile is not None: - # optionally to file in output dir - if args.logfile: - log_name = args.logfile - else: - log_name = f"{time_str}.log" - log_path = args.output_directory / log_name - print(f"Writing log to {log_path}") - log_handlers.append(logging.FileHandler(log_path)) - logging.basicConfig( - level=vars(logging)[args.loglevel], - format="%(asctime)s [%(levelname)s] %(message)s", - handlers=log_handlers - ) - logging.captureWarnings(True) + util.setup_logging(args, time_str) try: simulate.simulate(args) diff --git a/ebus_toolbox/optimization.py b/ebus_toolbox/optimization.py index e6243d6e..a0906a32 100644 --- a/ebus_toolbox/optimization.py +++ b/ebus_toolbox/optimization.py @@ -39,8 +39,8 @@ def service_optimization(schedule, scenario, args): rotation = schedule.rotations.pop(rot_key) if rotation.charging_type != "oppb": # only oppb rotations are optimized -> skip others - logging.warn(f"Rotation {rot_key} should be optimized, " - f"but is of type {rotation.charging_type}.") + logging.warning(f"Rotation {rot_key} should be optimized, " + f"but is of type {rotation.charging_type}.") continue # oppb: build non-interfering sets of negative rotations # (these include the dependent non-negative rotations) @@ -58,7 +58,7 @@ def service_optimization(schedule, scenario, args): dependent_station.update({r2: t2 for r2, t2 in common_stations[r].items() if t2 <= t}) elif r.charging_type != "obbp": - logging.warn(f"Rotation {rot_key} depends on negative non-oppb rotation") + logging.warning(f"Rotation {rot_key} depends on negative non-oppb rotation") negative_sets[rot_key] = s diff --git a/ebus_toolbox/report.py b/ebus_toolbox/report.py index d01c404f..0ae9e790 100644 --- a/ebus_toolbox/report.py +++ b/ebus_toolbox/report.py @@ -102,6 +102,8 @@ def generate_plots(scenario, args): :type args: argparse.Namespace """ aggregate_global_results(scenario) + # disable DEBUG logging from matplotlib + logging.disable(logging.INFO) with plt.ion(): # make plotting temporarily interactive, so plt.show does not block plt.clf() plot(scenario) @@ -110,6 +112,8 @@ def generate_plots(scenario, args): plt.savefig(args.results_directory / "run_overview.pdf") if args.show_plots: plt.show() + # revert logging override + logging.disable(logging.NOTSET) def generate(schedule, scenario, args): @@ -199,7 +203,7 @@ def generate(schedule, scenario, args): rotation_socs[id][start_idx:end_idx] = rotation_soc_ts if incomplete_rotations: - logging.warn( + logging.warning( "SpiceEV stopped before simulation of the these rotations were completed:\n" f"{', '.join(incomplete_rotations)}\n" "Omit parameter to simulate entire schedule.") diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 1caefe52..5f4d24e7 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -186,12 +186,12 @@ def run(self, args): scenario = self.generate_scenario(args) - logging.info("Running Spice EV...") + logging.info("Running SpiceEV...") with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) scenario.run('distributed', vars(args).copy()) assert scenario.step_i == scenario.n_intervals, \ - 'spiceEV simulation aborted, see above for details' + 'SpiceEV simulation aborted, see above for details' return scenario def set_charging_type(self, ct, rotation_ids=None): @@ -345,7 +345,7 @@ def get_common_stations(self, only_opps=True): def get_negative_rotations(self, scenario): """ - Get rotations with negative soc from spice_ev outputs + Get rotations with negative soc from SpiceEV outputs :param scenario: Simulation scenario containing simulation results including the SoC of all vehicles over time @@ -382,13 +382,13 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) def generate_scenario(self, args): - """ Generate scenario.json for spiceEV + """ Generate scenario.json for SpiceEV :param args: Command line arguments and/or arguments from config file. :type args: argparse.Namespace - :return: A spiceEV Scenario instance that can be run and also collects all + :return: A SpiceEV Scenario instance that can be run and also collects all simulation outputs. - :rtype: spice_ev.Scenario + :rtype: SpiceEV.Scenario """ random.seed(args.seed) @@ -640,9 +640,9 @@ def generate_scenario(self, args): events['energy_price_from_csv'] = options price_csv_path = args.output_directory / filename if not price_csv_path.exists(): - logging.warn(f"Price csv file '{price_csv_path}' does not exist yet") + logging.warning(f"Price csv file '{price_csv_path}' does not exist yet") - # reformat vehicle types for spiceEV + # reformat vehicle types for SpiceEV vehicle_types_spiceev = { f'{vehicle_type}_{charging_type}': body for vehicle_type, subtypes in self.vehicle_types.items() diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index e5c1e76f..d960fa16 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -73,7 +73,7 @@ def simulate(args): result = optimization.service_optimization(schedule, scenario, args) schedule, scenario = result['optimized'] if scenario is None: - logging.warn('No optimization possible (all rotations negative), reverting') + logging.warning('No optimization possible (all rotations negative), reverting') schedule, scenario = result['original'] elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: # simple optimization: change charging type, simulate again @@ -96,8 +96,8 @@ def simulate(args): logging.info(f'Rotations {", ".join(neg_rot)} remain negative.') elif mode == "station_optimization": if not args.optimizer_config: - logging.warn("Station optimization needs an optimization config file. " - "Since no path was given, station optimization is skipped") + logging.warning("Station optimization needs an optimization config file. " + "Since no path was given, station optimization is skipped") continue conf = read_optimizer_config(args.optimizer_config) try: @@ -105,8 +105,8 @@ def simulate(args): schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, args=args) except Exception as err: - logging.warn('During Station optimization an error occurred {0}. ' - 'Optimization was skipped'.format(err)) + logging.warning('During Station optimization an error occurred {0}. ' + 'Optimization was skipped'.format(err)) elif mode == 'remove_negative': neg_rot = schedule.get_negative_rotations(scenario) if neg_rot: diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 1ae3040f..2e3b6896 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -131,13 +131,13 @@ def get_csv_delim(path, other_delims=set()): return counters.popitem()[0] # if not even a single delimiter is remaining elif not counters: - logging.warn("Warning: Delimiter could not be found.\n" - "Returning standard Delimiter ','") + logging.warning("Warning: Delimiter could not be found.\n" + "Returning standard Delimiter ','") return "," # multiple delimiters are possible. Every row was checked but more than 1 delimiter # has the same amount of occurrences (>0) in every row. - logging.warn("Warning: Delimiter could not be found.\n" - "Returning standard delimiter ','") + logging.warning("Warning: Delimiter could not be found.\n" + "Returning standard delimiter ','") return "," @@ -218,6 +218,27 @@ def nd_interp(input_values, lookup_table): return points[0][-1] +def setup_logging(args, time_str): + # set up logging + # always to console + log_handlers = [logging.StreamHandler()] + if args.logfile is not None: + # optionally to file in output dir + if args.logfile: + log_name = args.logfile + else: + log_name = f"{time_str}.log" + log_path = args.output_directory / log_name + print(f"Writing log to {log_path}") + log_handlers.append(logging.FileHandler(log_path)) + logging.basicConfig( + level=vars(logging)[args.loglevel], + format="%(asctime)s [%(levelname)s] %(message)s", + handlers=log_handlers + ) + logging.captureWarnings(True) + + def get_args(): parser = argparse.ArgumentParser( description='eBus-Toolbox - simulation program for electric bus fleets.') @@ -313,7 +334,7 @@ def get_args(): choices=logging._nameToLevel.keys(), help='Log level.') parser.add_argument('--logfile', default='', help='Log file suffix. null: no log file.') - # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### + # #### SpiceEV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') parser.add_argument('--include-price-csv', help='include CSV for energy price. \ From 23e5b5d2092be5ff726fda936b73be08d248e26c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 2 Jun 2023 10:11:33 +0200 Subject: [PATCH 730/802] Expand docstring of plot_ and remove print --- ebus_toolbox/optimizer_util.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 28cc4462..9acd2933 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -792,8 +792,11 @@ def get_time(start=[]): def plot_(data, axis=None): """ Simple plot of data without having to create subplots. + Checks if data is nested, e.g. dict(key, list), or list(list()), and plots the inner values. + If non-nested data is given, this data is plotted. + :param data: data to be plotted - :type data: iterable + :type data: iterable or iterable of iterables :param axis: axis to be plotted to. Default None will create new figure and axis :type axis: matplotlib.axes.Axes :return: axis of the plot """ @@ -808,7 +811,6 @@ def plot_(data, axis=None): except Exception: plot_data = dat name = None - print(name) axis.plot(plot_data, label=name, linewidth=2.0) axis.legend() except Exception: From a9aee5a886240ec3c8e215f01ff993ba26104b79 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 7 Jun 2023 08:25:08 +0200 Subject: [PATCH 731/802] Revert "Merge pull request #92 from rl-institut/feature/#30_allow_rotation_filtering_by_user" This reverts commit aea403bacc1394e76091ecd6f814b03a21e8ecd8, reversing changes made to 9fd3817361781e5c3912526c7ae269f5d8136f6d. I accidentally merged rotation_filter although there were errors --- data/examples/ebus_toolbox.cfg | 7 ------- data/examples/rotation_filter.csv | 2 -- ebus_toolbox/schedule.py | 29 ----------------------------- ebus_toolbox/simulate.py | 12 ++++-------- ebus_toolbox/util.py | 5 ----- 5 files changed, 4 insertions(+), 51 deletions(-) delete mode 100644 data/examples/rotation_filter.csv diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index 4afdefd1..81cc1549 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -21,8 +21,6 @@ level_of_loading_over_day_path = data/examples/default_level_of_loading_over_da optimizer_config = data/examples/default_optimizer.cfg # Cost parameters (needed if cost_calculation flag is set to true, see Flag section below) cost_parameters_file = data/examples/cost_params.json -# Path to rotation filter -rotation_filter = data/examples/rotation_filter.csv ##### Modes ##### ### Specify how you want to simulate the scenario ### @@ -48,11 +46,6 @@ check_rotation_consistency = false skip_inconsistent_rotations = false # Show plots for users to view, only valid if generate_report = true (default: false) show_plots = true -# Rotation filter variable, options: -# "include": include only the rotations from file 'rotation_filter' -# "exclude": exclude the rotations from file 'rotation_filter' from the schedule -# null: deactivate function -rotation_filter_variable = null ##### Physical setup of environment ##### ### Parametrization of the physical setup ### diff --git a/data/examples/rotation_filter.csv b/data/examples/rotation_filter.csv deleted file mode 100644 index 7a754f41..00000000 --- a/data/examples/rotation_filter.csv +++ /dev/null @@ -1,2 +0,0 @@ -1 -2 \ No newline at end of file diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 27d2b6a1..4257a89e 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -385,35 +385,6 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) - def rotation_filter(self, args, rf_list=None): - """Edits rotations according to args.rotation_filter_variable. - - :param args: used arguments are rotation_filter, path to rotation ids, - and rotation_filter_variable that sets mode (options: include, exclude) - :type args: argparse.Namespace - :param rf_list: rotation filter list with strings of rotation ids (default is None) - :type rf_list: list - """ - rf_list = rf_list or [] - rf_list = [str(i) for i in rf_list] - if not args.rotation_filter_variable: - return - if args.rotation_filter_variable and not args.rotation_filter and not rf_list: - warnings.warn("Rotation filter variable is enabled but json and list are not used.") - return - if args.rotation_filter: - try: - with open(args.rotation_filter, encoding='utf-8') as f: - for line in f: - rf_list.append(line.strip()) - except FileNotFoundError: - warnings.warn(f"Path to rotation filter {args.rotation_filter} is invalid.") - # filter out rotations in self.rotations - if args.rotation_filter_variable == "exclude": - self.rotations = {k: v for k, v in self.rotations.items() if k not in rf_list} - elif args.rotation_filter_variable == "include": - self.rotations = {k: v for k, v in self.rotations.items() if k in rf_list} - def generate_scenario(self, args): """ Generate scenario.json for spiceEV diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 509b113b..ff07ff44 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -50,15 +50,11 @@ def simulate(args): outside_temperatures=args.outside_temperature_over_day_path, level_of_loading_over_day=args.level_of_loading_over_day_path) - # generate schedule from csv - schedule = Schedule.from_csv(args.input_schedule, vehicle_types, stations, **vars(args)) - - # filter rotations - schedule.rotation_filter(args) - - # calculate consumption of all trips + schedule = Schedule.from_csv(args.input_schedule, + vehicle_types, + stations, + **vars(args)) schedule.calculate_consumption() - # scenario simulated once scenario = schedule.run(args) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 56920f29..89358d3d 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -307,11 +307,6 @@ def get_args(): parser.add_argument('--eta', action='store_true', help='Show estimated time to finish simulation after each step, ' 'instead of progress bar. Not recommended for fast computations.') - parser.add_argument('--rotation-filter', default=None, - help='Use json data with rotation ids') - parser.add_argument('--rotation-filter-variable', default=None, - choices=[None, 'include', 'exclude'], - help='set mode for filtering schedule rotations') # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') From b76c2a3c66a95a9b22261d1822b95f2c2ccad8d6 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 7 Jun 2023 09:15:35 +0200 Subject: [PATCH 732/802] consumption: refactor lines --- ebus_toolbox/consumption.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 63e3f182..1d9b3d4b 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -109,10 +109,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem consumption_function = vehicle_type+"_from_"+consumption_path try: mileage = self.consumption_files[consumption_function]( - this_incline=height_diff / distance, - this_temp=temp, - this_lol=level_of_loading, - this_speed=mean_speed) + this_incline=height_diff / distance, this_temp=temp, + this_lol=level_of_loading, this_speed=mean_speed) except KeyError: # creating the interpol function from csv file. delim = util.get_csv_delim(consumption_path) @@ -135,10 +133,8 @@ def interpol_function(this_incline, this_temp, this_lol, this_speed): self.consumption_files.update({consumption_function: interpol_function}) mileage = self.consumption_files[consumption_function]( - this_incline=height_diff / distance, - this_temp=temp, - this_lol=level_of_loading, - this_speed=mean_speed) + this_incline=height_diff / distance, this_temp=temp, + this_lol=level_of_loading, this_speed=mean_speed) consumed_energy = mileage * distance / 1000 # kWh delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) From c3cf91c6c9de8a87d42d5b27823a061b1b91111c Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 7 Jun 2023 09:48:03 +0200 Subject: [PATCH 733/802] fix typo --- docs/source/modes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 49124e61..8239a366 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -69,7 +69,7 @@ It takes the results of the previous simulation, attains all rotations which had Service Optimization -------------------- This mode finds the largest set of rotations that results in no negative SoC. This is done by first taking all rotations that do become negative and finding their dependent rotations, i.e., ones that can have an influence by sharing a station earlier with the negative rotation. Next, all rotations are filtered out that stay negative when running with just their dependent rotations. -Now, only rotations are left that are non-negative when viewed alone, but might beome negative when run together. To find the largest subset of non-negative rotations, all possible set combinations are generated and tried out. When a union of two rotation-sets is non-negative, it is taken as the basis for new possible combinations. +Now, only rotations are left that are non-negative when viewed alone, but might become negative when run together. To find the largest subset of non-negative rotations, all possible set combinations are generated and tried out. When a union of two rotation-sets is non-negative, it is taken as the basis for new possible combinations. In the end, the largest number of rotations that produce a non-negative result when taken together is returned as the optimized scenario. Station Optimization From 416f6d1b5684b7e77e7afd3806c1ac348180ed56 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 7 Jun 2023 10:57:52 +0200 Subject: [PATCH 734/802] this should be our new dev --- ebus_toolbox/consumption.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 63e3f182..1d9b3d4b 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -109,10 +109,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem consumption_function = vehicle_type+"_from_"+consumption_path try: mileage = self.consumption_files[consumption_function]( - this_incline=height_diff / distance, - this_temp=temp, - this_lol=level_of_loading, - this_speed=mean_speed) + this_incline=height_diff / distance, this_temp=temp, + this_lol=level_of_loading, this_speed=mean_speed) except KeyError: # creating the interpol function from csv file. delim = util.get_csv_delim(consumption_path) @@ -135,10 +133,8 @@ def interpol_function(this_incline, this_temp, this_lol, this_speed): self.consumption_files.update({consumption_function: interpol_function}) mileage = self.consumption_files[consumption_function]( - this_incline=height_diff / distance, - this_temp=temp, - this_lol=level_of_loading, - this_speed=mean_speed) + this_incline=height_diff / distance, this_temp=temp, + this_lol=level_of_loading, this_speed=mean_speed) consumed_energy = mileage * distance / 1000 # kWh delta_soc = -1 * (consumed_energy / vehicle_info["capacity"]) From 20849d56148484198b501cc40b0282cbd1e164a9 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 7 Jun 2023 15:48:28 +0200 Subject: [PATCH 735/802] rotation filter: restructure, fixes, add tests --- ebus_toolbox/schedule.py | 18 ++++++---- tests/test_schedule.py | 75 +++++++++++++++++++++++++++++++++++++--- tests/test_simulate.py | 1 + 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/ebus_toolbox/schedule.py b/ebus_toolbox/schedule.py index 27d2b6a1..6a18baa2 100644 --- a/ebus_toolbox/schedule.py +++ b/ebus_toolbox/schedule.py @@ -385,7 +385,7 @@ def get_negative_rotations(self, scenario): return list(negative_rotations) - def rotation_filter(self, args, rf_list=None): + def rotation_filter(self, args, rf_list=[]): """Edits rotations according to args.rotation_filter_variable. :param args: used arguments are rotation_filter, path to rotation ids, @@ -394,20 +394,26 @@ def rotation_filter(self, args, rf_list=None): :param rf_list: rotation filter list with strings of rotation ids (default is None) :type rf_list: list """ - rf_list = rf_list or [] - rf_list = [str(i) for i in rf_list] - if not args.rotation_filter_variable: + if args.rotation_filter_variable is None: + # filtering disabled return - if args.rotation_filter_variable and not args.rotation_filter and not rf_list: - warnings.warn("Rotation filter variable is enabled but json and list are not used.") + # cast rotations in filter to string + rf_list = [str(i) for i in rf_list] + + if args.rotation_filter is None and not rf_list: + warnings.warn("Rotation filter variable is enabled but file and list are not used.") return + if args.rotation_filter: + # read out rotations from file (one rotation ID per line) try: with open(args.rotation_filter, encoding='utf-8') as f: for line in f: rf_list.append(line.strip()) except FileNotFoundError: warnings.warn(f"Path to rotation filter {args.rotation_filter} is invalid.") + # no file, no change + return # filter out rotations in self.rotations if args.rotation_filter_variable == "exclude": self.rotations = {k: v for k, v in self.rotations.items() if k not in rf_list} diff --git a/tests/test_schedule.py b/tests/test_schedule.py index bf19627d..0d114dea 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -1,3 +1,5 @@ +from argparse import Namespace +from copy import deepcopy from datetime import timedelta import pytest import sys @@ -6,7 +8,7 @@ from tests.conftest import example_root, file_root from tests.helpers import generate_basic_schedule -from ebus_toolbox import schedule, trip, consumption, util +from ebus_toolbox import consumption, rotation, schedule, trip, util mandatory_args = { @@ -63,9 +65,13 @@ def test_mandatory_options_exit(self): """ Check if the schedule creation properly throws an error in case of missing mandatory options """ - with pytest.raises(Exception): - # schedule creation without mandatory args - schedule.Schedule(self.vehicle_types, self.electrified_stations) + args = mandatory_args.copy() + for key in mandatory_args.keys(): + value = args.pop(key) + with pytest.raises(Exception): + # schedule creation without mandatory arg + schedule.Schedule(self.vehicle_types, self.electrified_stations, **args) + args[key] = value def test_station_data_reading(self): """ Test if the reading of the geo station data works and outputs warnings in @@ -173,6 +179,67 @@ def test_get_negative_rotations(self): neg_rots = sched.get_negative_rotations(scen) assert '1' in neg_rots + def test_rotation_filter(self, tmp_path): + s = schedule.Schedule(self.vehicle_types, self.electrified_stations, **mandatory_args) + args = Namespace(**{ + "rotation_filter_variable": None, + "rotation_filter": None, + }) + # add dummy rotations + s.rotations = { + str(i): rotation.Rotation(id=str(i), vehicle_type="", schedule=None) + for i in range(6) + } + s.original_rotations = deepcopy(s.rotations) + # filtering disabled + args.rotation_filter_variable = None + s.rotation_filter(args) + assert s.rotations.keys() == s.original_rotations.keys() + + # filtering not disabled, but neither file nor list given -> warning + args.rotation_filter_variable = "include" + args.rotation_filter = None + with pytest.warns(UserWarning): + s.rotation_filter(args) + assert s.rotations.keys() == s.original_rotations.keys() + + # filter file not found -> warning + args.rotation_filter = tmp_path / "filter.txt" + with pytest.warns(UserWarning): + s.rotation_filter(args) + assert s.rotations.keys() == s.original_rotations.keys() + + # filter (include) from JSON file + args.rotation_filter.write_text("3 \n 4\n16") + s.rotation_filter(args) + assert sorted(s.rotations.keys()) == ['3', '4'] + + # filter (exclude) from given list + args.rotation_filter_variable = "exclude" + args.rotation_filter = None + s.rotations = deepcopy(s.original_rotations) + s.rotation_filter(args, rf_list=['3', '4']) + assert sorted(s.rotations.keys()) == ['0', '1', '2', '5'] + + # filter (include) from integer list + s.rotations = deepcopy(s.original_rotations) + args.rotation_filter_variable = "include" + s.rotation_filter(args, rf_list=[3, 4]) + assert sorted(s.rotations.keys()) == ['3', '4'] + + # filter nothing + s.rotations = deepcopy(s.original_rotations) + args.rotation_filter = tmp_path / "filter.txt" + args.rotation_filter.write_text('') + args.rotation_filter_variable = "exclude" + s.rotation_filter(args, rf_list=[]) + assert s.rotations.keys() == s.original_rotations.keys() + + # filter all (is this intended?) + args.rotation_filter_variable = "include" + s.rotation_filter(args, rf_list=[]) + assert not s.rotations + def test_scenario_with_feed_in(self): """ Check if running a example with an extended electrified stations file with feed in, external load and battery works and if a scenario object is returned""" diff --git a/tests/test_simulate.py b/tests/test_simulate.py index 0b23871a..ea7659c7 100644 --- a/tests/test_simulate.py +++ b/tests/test_simulate.py @@ -31,6 +31,7 @@ class TestSimulate: "days": None, "signal_time_dif": 10, "include_price_csv": None, + "rotation_filter_variable": None, "seed": None, "default_buffer_time_opps": 0, "desired_soc_opps": 1, From 1c9f5081bb60a90d2a52ff78be23285d9061dc2a Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 1 Aug 2023 08:28:38 +0200 Subject: [PATCH 736/802] change name to SimBA in rtd text --- docs/source/getting_started.rst | 6 +++--- docs/source/index.rst | 2 +- docs/source/modes.rst | 20 ++++++++++---------- docs/source/simulation_parameters.rst | 6 +++--- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 6137a578..46f5e9d5 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -4,7 +4,7 @@ Getting Started =============== -The eBus-Toolbox assists the user in analysing and optimising electrified bus fleets and schedules. +SimBA assists the user in analysing and optimising electrified bus fleets and schedules. .. Without creating links like in the line below, subpages go missing from the sidebar @@ -24,7 +24,7 @@ Now you can start the eBus Toolbox module with all configurations stored at `dat The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. -To run the eBus-Toolbox with your own `schedule.csv` (see :ref:`schedule`)) file and default configurations run +To run SimBA with your own `schedule.csv` (see :ref:`schedule`)) file and default configurations run ``python -m ebus_toolbox --input_schedule path/to/schedule.csv`` @@ -41,7 +41,7 @@ Other modes can alter bus types from depot to opportunity chargers, optimize set :alt: ebus_toolbox_modules :width: 600 - Modules of the eBus-Toolbox + Modules of the SimBA :numref:`figure_ebus_toolbox_modules` shows how the different modules work together to calculate the scenario. Optionally different optimizations can be used or even chained together. The output of the simulation is locally saved and consists of the vehicle socs, summaries for each rotation, estimated costs for vehicles, infrastructure and operation as well as station specific electric loads, utilization rates and other key performance indicators. Some of them can be plotted automatically and can be seen in :numref:`ebus_toolbox_default_plot` diff --git a/docs/source/index.rst b/docs/source/index.rst index b1a0ac92..bdbf7818 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -6,7 +6,7 @@ .. image:: https://user-images.githubusercontent.com/104760879/217226792-4297d3c8-8a7c-45ad-894f-5efd03031f49.png :alt: ebus_toolbox_logo -Welcome to the eBus-Toolbox's documentation! +Welcome to SimBA's documentation! ============================================ This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies in Python. diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 8239a366..dc053336 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -4,10 +4,10 @@ .. _sim_modes: -Modes of the eBus-Toolbox -========================= +Modes of SimBA +============== -The eBus-Toolbox assists the user in analyzing and optimising electrified bus fleets and schedules. Besides a simple simulation run, several +SimBA assists the user in analyzing and optimising electrified bus fleets and schedules. Besides a simple simulation run, several different modes support the user in finding optimal solutions for their eBus-System. Supported Modes are * simple simulation @@ -19,13 +19,13 @@ different modes support the user in finding optimal solutions for their eBus-Sys Chained Modes ------------- -While the default mode of the ebus-toolbox is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: +While the default mode of the SimBA is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: :: mode = ["sim", "report"] -This results in a simple simulation with a following report. To run a simulation the ebus-toolbox creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. Their output describes the simulation outcome of this mutated schedule. An extended simple use case would be: +This results in a simple simulation with a following report. To run a simulation SimBA creates a schedule which contains all information about how the bus system is supposed to run. Some modes are allowed to mutate the schedule in some way, which makes chaining of modes especially useful. Their output describes the simulation outcome of this mutated schedule. An extended simple use case would be: :: @@ -41,7 +41,7 @@ The simple simulation case is the default mode. Its usage is explained in :ref:` Negative Depot to Opportunity Charger ------------------------------------- -This mode is the first kind of optimization provided by the eBus-Toolbox and is called by: +This mode is the first kind of optimization provided by SimBA and is called by: :: @@ -49,14 +49,14 @@ This mode is the first kind of optimization provided by the eBus-Toolbox and is It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to depot chargers. -.. note:: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. +.. note:: Charging types are only switched by SimBA if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. Negative Opportunity to Depot Charger ------------------------------------- This mode is analogous to *neg_depb_to_oppb*. -This mode is the second kind of optimization provided by the eBus-Toolbox and is called by +This mode is the second kind of optimization provided by SimBA and is called by :: @@ -64,7 +64,7 @@ This mode is the second kind of optimization provided by the eBus-Toolbox and is It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to opportunity chargers. -.. note:: Charging types are only switched by the eBus-Toolbox if the corresponding vehicle type as opportunity charger exists in the provided vehicles_data.json. +.. note:: Charging types are only switched by SimBA if the corresponding vehicle type as opportunity charger exists in the provided vehicles_data.json. Service Optimization -------------------- @@ -172,7 +172,7 @@ Instead of using the regular SpiceEV solver for optimization the user can also c At the end of each optimization the optimized scenario will run using SpiceEV. This guarantees that the proposed solution works. If this is not the case, using SpicEV as solver is recommended -**Continuing optimizations** can be useful in cases where simulation of the base case is slow or considerable effort was put into optimization before. The user might want to continue the optimization from the state where they left off. To speed up multiple optimizations or split up a big optimization in multiple smaller calculations two features are in early development. Experienced users can use these features on their own accord with a few minor implementation steps. To skip a potentially long simulation, with the simulation of the scenario being the first step of every ebus-toolbox run, the optimizer.config allows for using pickle files for the three major objects args, schedule and scenario. After pickling the resulting objects, the optimizer can be prompted to use them instead of using whatever other input is fed into the optimizer. This is done by giving the paths to the pickle files in the optimizer.cfg. +**Continuing optimizations** can be useful in cases where simulation of the base case is slow or considerable effort was put into optimization before. The user might want to continue the optimization from the state where they left off. To speed up multiple optimizations or split up a big optimization in multiple smaller calculations two features are in early development. Experienced users can use these features on their own accord with a few minor implementation steps. To skip a potentially long simulation, with the simulation of the scenario being the first step of every SimBA run, the optimizer.config allows for using pickle files for the three major objects args, schedule and scenario. After pickling the resulting objects, the optimizer can be prompted to use them instead of using whatever other input is fed into the optimizer. This is done by giving the paths to the pickle files in the optimizer.cfg. :: diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index 6e4ab315..7e4399b4 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -4,8 +4,8 @@ Simulation Parameters ===================== The simulation of an eBus-System relies on a variety of simulation parameters. -The eBus-Toolbox provides most of them as default values. Depending on specific needs adjusting -these values can increase the accuracy of the simulation outputs. The eBus-Toolbox input files are described +SimBA provides most of them as default values. Depending on specific needs adjusting +these values can increase the accuracy of the simulation outputs. The SimBA input files are described in detail in the following subsections as well as their default parameters. When providing the user defined input files, the user should make sure the files are either 'utf-8' encoded or not contain regional characters. @@ -131,4 +131,4 @@ TBC Consumption table ----------------- -The consumption table can be referenced in the :ref:`vehicle_types` file. Instead of constant consumption the eBus-Toolbox uses provided temperatures, level of loadings, mean speeds, average inclines and the vehicle type to interpolate the consumption value from this data table. Level of loading and temperatures are read from the :ref:`schedule` if the trips provide them. If they are missing from the schedule, they are looked up from the files :ref:`level_of_loading` and :ref:`temperature_data`. The average incline is calculated from :ref:`station_geo_data` and the mean speed is calculated by using the departure and arrival time and distance provided by the schedule. \ No newline at end of file +The consumption table can be referenced in the :ref:`vehicle_types` file. Instead of constant consumption SimBA uses provided temperatures, level of loadings, mean speeds, average inclines and the vehicle type to interpolate the consumption value from this data table. Level of loading and temperatures are read from the :ref:`schedule` if the trips provide them. If they are missing from the schedule, they are looked up from the files :ref:`level_of_loading` and :ref:`temperature_data`. The average incline is calculated from :ref:`station_geo_data` and the mean speed is calculated by using the departure and arrival time and distance provided by the schedule. \ No newline at end of file From 79f52a85721ccfa618205d75d67ae4dd2bbaf86f Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 1 Aug 2023 08:32:24 +0200 Subject: [PATCH 737/802] solve stashed merge conflicts --- docs/source/getting_started.rst | 4 ++-- docs/source/index.rst | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 46f5e9d5..d27ad025 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -4,7 +4,7 @@ Getting Started =============== -SimBA assists the user in analysing and optimising electrified bus fleets and schedules. +This toolbox was designed to analyze and optimize electrified bus fleets. .. Without creating links like in the line below, subpages go missing from the sidebar @@ -37,7 +37,7 @@ At the current stage several functionalities are implemented. The base simulatio Other modes can alter bus types from depot to opportunity chargers, optimize sets of rotations to increase electrification or suggest stations for electrification by minimizing the amount of stations needed. You can learn more about the modes :ref:`here ` .. _figure_ebus_toolbox_modules: -.. figure:: https://user-images.githubusercontent.com/104760879/217225545-5e6858c1-d056-4519-beea-6274d06533c7.png +.. figure:: _static/methodology_overview.png :alt: ebus_toolbox_modules :width: 600 diff --git a/docs/source/index.rst b/docs/source/index.rst index bdbf7818..fcec2e16 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -9,8 +9,7 @@ Welcome to SimBA's documentation! ============================================ -This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies in Python. - +This toolbox was designed to analyze and optimize electrified bus fleets. .. toctree:: :maxdepth: 3 From 9eb687c1865a23420e95a899c3bc2afcd0e737a2 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 1 Aug 2023 08:36:23 +0200 Subject: [PATCH 738/802] change logo to SimBA --- .../_static/2023_06_08_eBus-Toolbox Logo.png | Bin 0 -> 19658 bytes docs/source/index.rst | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 docs/source/_static/2023_06_08_eBus-Toolbox Logo.png diff --git a/docs/source/_static/2023_06_08_eBus-Toolbox Logo.png b/docs/source/_static/2023_06_08_eBus-Toolbox Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5836edba45b10fbea9487d5eec670c4ff1632003 GIT binary patch literal 19658 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 literal 0 HcmV?d00001 diff --git a/docs/source/index.rst b/docs/source/index.rst index fcec2e16..c7f22957 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,8 +3,10 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -.. image:: https://user-images.githubusercontent.com/104760879/217226792-4297d3c8-8a7c-45ad-894f-5efd03031f49.png - :alt: ebus_toolbox_logo +.. _figure_SimBA_logo: +.. figure:: _static/2023_06_08_eBus-Toolbox Logo.png + :alt: ebus_toolbox_logo + :width: 600 Welcome to SimBA's documentation! ============================================ From 2227e86a43da2e394c02c6f988d349cc628ccf32 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 1 Aug 2023 16:15:14 +0200 Subject: [PATCH 739/802] make flake8 happy --- ebus_toolbox/consumption.py | 4 ++-- ebus_toolbox/rotation.py | 14 +++++++------- ebus_toolbox/simulate.py | 2 +- tests/test_schedule.py | 6 +++--- tests/test_station_optimization.py | 10 +++++----- tests/test_util.py | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index 1d9b3d4b..bb23adcd 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -59,8 +59,8 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :raises AttributeError: if there is no path to temperature or lol data provided """ - assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ - f"Combination of vehicle type {vehicle_type} and {charging_type} not defined." + assert self.vehicle_types.get(vehicle_type, {}).get(charging_type), ( + f"Combination of vehicle type {vehicle_type} and {charging_type} not defined.") vehicle_info = self.vehicle_types[vehicle_type][charging_type] diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index d07991f8..31729b3e 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -58,12 +58,12 @@ def add_trip(self, trip): # set charging type if given charging_type = trip.get('charging_type') if charging_type in ['depb', 'oppb']: - assert self.charging_type is None or self.charging_type == charging_type,\ - f"Two trips of rotation {self.id} have distinct charging types" + assert self.charging_type is None or self.charging_type == charging_type, ( + f"Two trips of rotation {self.id} have distinct charging types") assert self.schedule.vehicle_types.get( - self.vehicle_type, {}).get(charging_type) is not None,\ - (f"The required vehicle type {self.vehicle_type}({charging_type}) " - "is not given in the vehicle_types.json file.") + self.vehicle_type, {}).get(charging_type) is not None, ( + f"The required vehicle type {self.vehicle_type}({charging_type}) " + "is not given in the vehicle_types.json file.") self.set_charging_type(charging_type) self.trips.append(new_trip) @@ -93,8 +93,8 @@ def set_charging_type(self, ct): if ct == self.charging_type: return - assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct),\ - f"Combination of vehicle type {self.vehicle_type} and {ct} not defined." + assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct), ( + f"Combination of vehicle type {self.vehicle_type} and {ct} not defined.") old_consumption = self.consumption self.charging_type = ct diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 509b113b..ac773978 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -63,7 +63,7 @@ def simulate(args): scenario = schedule.run(args) # run the mode(s) specified in config - if type(args.mode) != list: + if type(args.mode) is not list: # backwards compatibility: run single mode args.mode = [args.mode] diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 0d114dea..284cc474 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -106,7 +106,7 @@ def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned """ schedule, scen = self.basic_run() - assert type(scen) == scenario.Scenario + assert type(scen) is scenario.Scenario def test_assign_vehicles(self): """ Test if assigning vehicles works as intended. @@ -276,7 +276,7 @@ def test_scenario_with_feed_in(self): assert scen.components.batteries["Station-0"].efficiency == 0.95 assert scen.components.batteries["Station-0"].min_charging_power == 0 scen = generated_schedule.run(args) - assert type(scen) == scenario.Scenario + assert type(scen) is scenario.Scenario with open(electrified_stations_path, "r", encoding='utf-8') as file: electrified_stations = util.uncomment_json_file(file) @@ -303,7 +303,7 @@ def test_scenario_with_feed_in(self): def test_schedule_from_csv(self): generated_schedule = generate_basic_schedule() assert len(generated_schedule.rotations) == 4 - assert type(generated_schedule) == schedule.Schedule + assert type(generated_schedule) is schedule.Schedule def test_consistency(self): sched = generate_basic_schedule() diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 4502bd80..17073fc5 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -85,7 +85,7 @@ def setup_test(self, tmp_path): dst = tmp_path / "ebus_toolbox.cfg" dst.write_text(src_text) - def test_basic_run(self, trips_file_name="trips.csv"): + def basic_run(self, trips_file_name="trips.csv"): """ Check if running a basic example works and if a scenario object is returned. :param trips_file_name: file name of the trips file. Has to be inside the test_input_file @@ -116,7 +116,7 @@ def test_basic_run(self, trips_file_name="trips.csv"): def test_basic_optimization(self): """ Test if the base optimization finishes without raising errors""" trips_file_name = "trips_for_optimizer.csv" - sched, scen, args = self.test_basic_run(trips_file_name) + sched, scen, args = self.basic_run(trips_file_name) config_path = example_root / "default_optimizer.cfg" conf = opt_util.read_config(config_path) @@ -142,7 +142,7 @@ def test_deep_optimization(self): """ trips_file_name = "trips_for_optimizer_deep.csv" - sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + sched, scen, args = self.basic_run(trips_file_name=trips_file_name) args.input_schedule = file_root / trips_file_name config_path = example_root / "default_optimizer.cfg" conf = opt_util.read_config(config_path) @@ -163,7 +163,7 @@ def test_deep_optimization(self): trips_file_name = "trips_extended.csv" # adjust mileage so scenario is not possible without adding electrification self.vehicle_types = adjust_vehicle_file(args.vehicle_types, mileage=2, capacity=150) - sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + sched, scen, args = self.basic_run(trips_file_name=trips_file_name) # optimization can only be properly tested if negative rotations exist assert len(sched.get_negative_rotations(scen)) > 0 args.input_schedule = file_root / trips_file_name @@ -189,7 +189,7 @@ def test_critical_stations_optimization(self, caplog): to have access to logging data """ trips_file_name = "trips_for_optimizer_deep.csv" - sched, scen, args = self.test_basic_run(trips_file_name=trips_file_name) + sched, scen, args = self.basic_run(trips_file_name=trips_file_name) args.input_schedule = file_root / trips_file_name config_path = example_root / "default_optimizer.cfg" conf = opt_util.read_config(config_path) diff --git a/tests/test_util.py b/tests/test_util.py index 79dfa438..03e01ad9 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -46,7 +46,7 @@ def test_uncomment_json_file(self, tmp_path): def test_get_git_revision_hash(self): git_hash = util.get_git_revision_hash() - assert type(git_hash) == str + assert type(git_hash) is str def test_get_buffer_time(self): schedule, scenario = TestSchedule().basic_run() From ff5168b373f43943f371e4b3d8b0e889e0703bca Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 1 Aug 2023 16:44:16 +0200 Subject: [PATCH 740/802] rename ebus_toolbox -> simba --- Development Progress.md | 4 +- README.md | 14 +++--- data/examples/default_optimizer.cfg | 2 +- data/examples/{ebus_toolbox.cfg => simba.cfg} | 0 docs/source/conf.py | 2 +- docs/source/index.rst | 2 +- setup.py | 4 +- {ebus_toolbox => simba}/__init__.py | 0 {ebus_toolbox => simba}/__main__.py | 4 +- {ebus_toolbox => simba}/consumption.py | 2 +- {ebus_toolbox => simba}/costs.py | 0 {ebus_toolbox => simba}/optimization.py | 2 +- {ebus_toolbox => simba}/optimizer_util.py | 48 +++++++++---------- {ebus_toolbox => simba}/report.py | 4 +- {ebus_toolbox => simba}/rotation.py | 2 +- {ebus_toolbox => simba}/schedule.py | 4 +- {ebus_toolbox => simba}/simulate.py | 14 +++--- .../station_optimization.py | 18 +++---- {ebus_toolbox => simba}/station_optimizer.py | 14 +++--- {ebus_toolbox => simba}/trip.py | 0 {ebus_toolbox => simba}/util.py | 8 ++-- tests/helpers.py | 2 +- tests/test_example.py | 6 +-- tests/test_nd_interpolate.py | 2 +- tests/test_schedule.py | 19 ++++---- tests/test_simulate.py | 2 +- tests/test_station_optimization.py | 32 ++++++------- tests/test_util.py | 2 +- 28 files changed, 107 insertions(+), 106 deletions(-) rename data/examples/{ebus_toolbox.cfg => simba.cfg} (100%) rename {ebus_toolbox => simba}/__init__.py (100%) rename {ebus_toolbox => simba}/__main__.py (91%) rename {ebus_toolbox => simba}/consumption.py (99%) rename {ebus_toolbox => simba}/costs.py (100%) rename {ebus_toolbox => simba}/optimization.py (99%) rename {ebus_toolbox => simba}/optimizer_util.py (95%) rename {ebus_toolbox => simba}/report.py (99%) rename {ebus_toolbox => simba}/rotation.py (99%) rename {ebus_toolbox => simba}/schedule.py (99%) rename {ebus_toolbox => simba}/simulate.py (94%) rename {ebus_toolbox => simba}/station_optimization.py (93%) rename {ebus_toolbox => simba}/station_optimizer.py (99%) rename {ebus_toolbox => simba}/trip.py (100%) rename {ebus_toolbox => simba}/util.py (98%) diff --git a/Development Progress.md b/Development Progress.md index 3845207a..3d6dff6d 100644 --- a/Development Progress.md +++ b/Development Progress.md @@ -1,8 +1,8 @@ -# eBus Toolbox +# SimBA: Simulation tool for Bus Applications ## Idea -This toolbox helps to do eBus feasibility studies and answer research questions +This toolbox helps to do bus feasibility studies and answer research questions ## Tools diff --git a/README.md b/README.md index 5f9e4924..077c747d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# eBus Toolbox +# SimBA: Simulation toolbox for Bus Applications -The eBus Toolbox assists the user in analysing and optimising electrified bus fleets and schedules. +The SimBA toolbox assists the user in analysing and optimising electrified bus fleets and schedules. ### Usage @@ -10,17 +10,17 @@ To try it out, first clone this repository and then install the required package `pip install -r requirements.txt` -Now you can start the eBus Toolbox module with all configurations stored at `data/examples/ebus_toolbox.cfg` via the command +Now you can start the SimBA module with all configurations stored at `data/examples/simba.cfg` via the command -``python -m ebus_toolbox --config data/examples/ebus_toolbox.cfg`` +``python -m simba --config data/examples/simba.cfg`` The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. -To run the eBus Toolbox with your own `schedule.csv` (see details [below](#input-data)) file and default configurations run +To run SimBA with your own `schedule.csv` (see details [below](#input-data)) file and default configurations run -`python -m ebus_toolbox --input_schedule path/to/schedule.csv` +`python -m simba --input_schedule path/to/schedule.csv` -Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. +Default configurations are detailed at `data/configs/simba.cfg`. diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index f854cc8d..d8fecdfc 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -1,4 +1,4 @@ -# Config for the eBus-Toolbox Optimizer +# Config for the SimBA Optimizer # DEFAULT # Level of debugging information that is printed to the .log file between. # debug_level = 1 prints everything diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/simba.cfg similarity index 100% rename from data/examples/ebus_toolbox.cfg rename to data/examples/simba.cfg diff --git a/docs/source/conf.py b/docs/source/conf.py index 7e98ff01..f261a1fd 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -17,7 +17,7 @@ # -- Project information ----------------------------------------------------- -project = 'eBus-Toolbox' +project = 'SimBA' copyright = '2020, Reiner Lemoine Institut' author = 'Reiner Lemoine Institut' diff --git a/docs/source/index.rst b/docs/source/index.rst index 8a3e2313..c5416032 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to the eBus-Toolbox's documentation! +Welcome to the SimBA documentation! ======================================== This toolbox extends the functionality of the Open Source simulation tool SpiceEV to facilitate eBus feasibility studies. diff --git a/setup.py b/setup.py index 63de5bf2..1fef2e63 100644 --- a/setup.py +++ b/setup.py @@ -1,9 +1,9 @@ from setuptools import setup, find_packages setup( - name="ebus_toolbox", + name="simba", version="0.0.1dev", - description="Assistent to analyse and optimise electrified bus fleets and schedules", + description="Simulation toolbox for Bus Applications", url="https://github.com/rl-institut/eBus-Toolbox", author="Reiner Lemoine Institut", author_email='info@rl-institut.de', diff --git a/ebus_toolbox/__init__.py b/simba/__init__.py similarity index 100% rename from ebus_toolbox/__init__.py rename to simba/__init__.py diff --git a/ebus_toolbox/__main__.py b/simba/__main__.py similarity index 91% rename from ebus_toolbox/__main__.py rename to simba/__main__.py index ad2fefef..392d472a 100644 --- a/ebus_toolbox/__main__.py +++ b/simba/__main__.py @@ -2,13 +2,13 @@ from pathlib import Path import shutil -from ebus_toolbox import simulate, util +from simba import simulate, util if __name__ == '__main__': args = util.get_args() args.output_directory = Path(args.output_directory) / ( - datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_eBus_results") + datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + "_SimBA_results") # create subfolder for specific sim results with timestamp. # if folder doesnt exists, create folder. diff --git a/ebus_toolbox/consumption.py b/simba/consumption.py similarity index 99% rename from ebus_toolbox/consumption.py rename to simba/consumption.py index bb23adcd..1c9e0679 100644 --- a/ebus_toolbox/consumption.py +++ b/simba/consumption.py @@ -1,6 +1,6 @@ import csv import pandas as pd -from ebus_toolbox import util +from simba import util class Consumption: diff --git a/ebus_toolbox/costs.py b/simba/costs.py similarity index 100% rename from ebus_toolbox/costs.py rename to simba/costs.py diff --git a/ebus_toolbox/optimization.py b/simba/optimization.py similarity index 99% rename from ebus_toolbox/optimization.py rename to simba/optimization.py index ce4c2073..abae4c81 100644 --- a/ebus_toolbox/optimization.py +++ b/simba/optimization.py @@ -19,7 +19,7 @@ def service_optimization(schedule, scenario, args): Try to find sets of rotations that produce no negative SoC :param schedule: Schedule to be optimized - :type schedule: ebus_toolbox.Schedule + :type schedule: simba.Schedule :param scenario: Simulated schedule :type scenario: spice_ev.Scenario :param args: Command line arguments diff --git a/ebus_toolbox/optimizer_util.py b/simba/optimizer_util.py similarity index 95% rename from ebus_toolbox/optimizer_util.py rename to simba/optimizer_util.py index 9acd2933..e340683a 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/simba/optimizer_util.py @@ -17,11 +17,11 @@ from matplotlib import pyplot as plt if typing.TYPE_CHECKING: - from ebus_toolbox.station_optimizer import StationOptimizer + from simba.station_optimizer import StationOptimizer -from ebus_toolbox.consumption import Consumption -from ebus_toolbox.trip import Trip -from ebus_toolbox.util import get_buffer_time as get_buffer_time_util +from simba.consumption import Consumption +from simba.trip import Trip +from simba.util import get_buffer_time as get_buffer_time_util from spice_ev.report import generate_soc_timeseries @@ -141,7 +141,7 @@ def read_config(config_path): :param config_path: path to file :type config_path: str :return: configuration - :rtype: ebus_toolbox.optimizer_util.OptimizerConfig + :rtype: simba.optimizer_util.OptimizerConfig """ config_parser = configparser.ConfigParser() @@ -213,9 +213,9 @@ def get_charging_time(trip1, trip2, args): """ Returns the charging time in minutes between trips as numeric value/float. :param trip1: first trip - :type trip1: ebus_toolbox.trip.Trip + :type trip1: simba.trip.Trip :param trip2: following trip - :type trip2: ebus_toolbox.trip.Trip + :type trip2: simba.trip.Trip :param args: arguments including default buffer time :type args: Namespace :return: maximum possible charging time in minutes between trips @@ -236,7 +236,7 @@ def get_charging_start(trip1, args): This function considers the buffer times before charging can take place :param trip1: trip to be checked - :type trip1: ebus_toolbox.trip.Trip + :type trip1: simba.trip.Trip :param args: arguments including default buffer time :type args: Namespace :return: First possible charging time as datetime object @@ -249,7 +249,7 @@ def get_buffer_time(trip, default_buffer_time_opps): """ Return the buffer time as timedelta object :param trip: trip to be checked - :type trip: ebus_toolbox.trip.Trip + :type trip: simba.trip.Trip :param default_buffer_time_opps: the default buffer time at opps charging stations :return: buffer time :rtype: datetime.timedelta @@ -278,7 +278,7 @@ def get_rotation_soc_util(rot_id, schedule, scenario, soc_data: dict = None): :param rot_id: rotation_id :type rot_id: str :param schedule: schedule containing rotation information - :type schedule:ebus_toolbox.schedule.Schedule + :type schedule: simba.schedule.Schedule :param scenario: scenario containing the soc data :type scenario: spice_ev.Scenario :param soc_data: optional soc_data if the scenario data should not be used @@ -304,7 +304,7 @@ def get_delta_soc(soc_over_time_curve, soc, time_delta, optimizer: 'StationOptim :param time_delta: time of charging :type time_delta: float :param optimizer: optimizer object - :type optimizer: ebus_toolbox.station_optimizer.StationOptimizer + :type optimizer: simba.station_optimizer.StationOptimizer :return: positive delta of the soc :rtype: float """ @@ -347,9 +347,9 @@ def evaluate(events: typing.Iterable[LowSocEvent], station, soc at station and minimal soc of the event. :param events: events to be evaluated - :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) + :type events: list(simba.optimizer_util.LowSocEvent) :param optimizer: optimizer with scenario and schedule data - :type optimizer: ebus_toolbox.station_optimizer.StationOptimizer + :type optimizer: simba.station_optimizer.StationOptimizer :param kwargs: optional overwriting of soc_lower_thresh, soc_upper_thresh or soc_data :return: sorted stations and potentials :rtype: list(str(station_id), float(potential)) @@ -415,15 +415,15 @@ def get_groups_from_events(events, impossible_stations=None, could_not_be_electr station :param events: events for a given state of a scenario - :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) + :type events: list(simba.optimizer_util.LowSocEvent) :param impossible_stations: stations to be discarded :type impossible_stations: set(str) :param could_not_be_electrified: rotations to be discarded :type could_not_be_electrified: set(str) :param optimizer: Optimizer - :type optimizer: ebus_toolbox.station_optimizer.StationOptimizer + :type optimizer: simba.station_optimizer.StationOptimizer :return: Groups of events and stations which have to be optimized together - :rtype: list((ebus_toolbox.optimizer_util.LowSocEvent, str)) + :rtype: list((simba.optimizer_util.LowSocEvent, str)) """ # making sure default arguments are none and not mutable @@ -506,7 +506,7 @@ def toolbox_to_pickle(name, sched, scen, args): :param name: base name of the files :param sched: schedule - :type sched: ebus_toolbox.schedule.Schedule + :type sched: simba.schedule.Schedule :param scen: scenario :type scen: spice_ev.Scenario :param args: arguments @@ -599,7 +599,7 @@ def get_missing_energy(events, min_soc=0): """Sum up all the missing energies of the given events. :param events: events to be checked - :type events: list(ebus_toolbox.optimizer_util.LowSocEvent) + :type events: list(simba.optimizer_util.LowSocEvent) :param min_soc: minimal soc as desired value :type min_soc: float :return: missing energy @@ -687,7 +687,7 @@ def toolbox_from_pickle(sched_name, scen_name, args_name): :param args_name: name of args file :type args_name: str :return: schedule, scenario and arguments - :rtype: (ebus_toolbox.schedule.Schedule, spice_ev.Scenario, Namespace) + :rtype: (simba.schedule.Schedule, spice_ev.Scenario, Namespace) """ with open(args_name, "rb") as file: args = pickle.load(file) @@ -721,14 +721,14 @@ def run_schedule(sched, args, electrified_stations=None): """Run a given schedule and electrify stations if need be. :param sched: schedule object - :type sched: ebus_toolbox.schedule.Schedule + :type sched: simba.schedule.Schedule :param args: arguments :type args: Namespace :param electrified_stations: electrified stations. Default value None means no further stations are electrified :type electrified_stations: dict or None :return: schedule and scenario after SpiceEV simulation - :rtype: ebus_toolbox.schedule.Schedule, spice_ev.Scenario + :rtype: simba.schedule.Schedule, spice_ev.Scenario """ sched_copy = copy(sched) sched_copy.stations = electrified_stations @@ -755,13 +755,13 @@ def preprocess_schedule(sched, args, electrified_stations=None): vehicles :param sched: schedule containing the rotations - :type sched: ebus_toolbox.schedule.Schedule + :type sched: simba.schedule.Schedule :param args: arguments for simulation :type args: Namespace :param electrified_stations: stations to be electrified :type electrified_stations: dict :return: schedule and scenario to be simulated - :rtype: (ebus_toolbox.schedule.Schedule, spice_ev.Scenario) + :rtype: (simba.schedule.Schedule, spice_ev.Scenario) """ Trip.consumption = Consumption( sched.vehicle_types, outside_temperatures=args.outside_temperature_over_day_path, @@ -824,7 +824,7 @@ def plot_rot(rot_id, sched, scen, axis=None, rot_only=True): :param rot_id: id of the rotation :type rot_id: str :param sched: schedule - :type sched: ebus_toolbox.schedule.Schedule + :type sched: simba.schedule.Schedule :param scen: scenario :type scen: spice_ev.Scenario :param axis: axis to be plotted on diff --git a/ebus_toolbox/report.py b/simba/report.py similarity index 99% rename from ebus_toolbox/report.py rename to simba/report.py index 2f888367..ebc01b93 100644 --- a/ebus_toolbox/report.py +++ b/simba/report.py @@ -42,7 +42,7 @@ def generate_gc_overview(schedule, scenario, args): charging stations, sum of charged energy and use factors of least used stations is saved. :param schedule: Driving schedule for the simulation. - :type schedule: eBus-Toolbox.Schedule + :type schedule: simba.Schedule :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario :param args: Configuration arguments specified in config files contained in configs directory. @@ -99,7 +99,7 @@ def generate(schedule, scenario, args): """Generates all output files/ plots and saves them in the output directory. :param schedule: Driving schedule for the simulation. - :type schedule: eBus-Toolbox.Schedule + :type schedule: simba.Schedule :param scenario: Scenario for with to generate timeseries. :type scenario: spice_ev.Scenario :param args: Configuration arguments specified in config files contained in configs directory. diff --git a/ebus_toolbox/rotation.py b/simba/rotation.py similarity index 99% rename from ebus_toolbox/rotation.py rename to simba/rotation.py index 31729b3e..1f7e4fc3 100644 --- a/ebus_toolbox/rotation.py +++ b/simba/rotation.py @@ -1,6 +1,6 @@ import datetime -from ebus_toolbox.trip import Trip +from simba.trip import Trip class Rotation: diff --git a/ebus_toolbox/schedule.py b/simba/schedule.py similarity index 99% rename from ebus_toolbox/schedule.py rename to simba/schedule.py index 6a18baa2..c13d9cfb 100644 --- a/ebus_toolbox/schedule.py +++ b/simba/schedule.py @@ -4,8 +4,8 @@ import warnings from pathlib import Path -from ebus_toolbox import util -from ebus_toolbox.rotation import Rotation +from simba import util +from simba.rotation import Rotation from spice_ev.scenario import Scenario diff --git a/ebus_toolbox/simulate.py b/simba/simulate.py similarity index 94% rename from ebus_toolbox/simulate.py rename to simba/simulate.py index ac773978..29df90d9 100644 --- a/ebus_toolbox/simulate.py +++ b/simba/simulate.py @@ -1,13 +1,13 @@ import warnings from warnings import warn -from ebus_toolbox.consumption import Consumption -from ebus_toolbox.schedule import Schedule -from ebus_toolbox.trip import Trip -from ebus_toolbox.costs import calculate_costs -from ebus_toolbox import report, optimization, util -from ebus_toolbox.station_optimization import run_optimization -from ebus_toolbox.optimizer_util import read_config as read_optimizer_config +from simba import report, optimization, util +from simba.consumption import Consumption +from simba.costs import calculate_costs +from simba.optimizer_util import read_config as read_optimizer_config +from simba.schedule import Schedule +from simba.station_optimization import run_optimization +from simba.trip import Trip def simulate(args): diff --git a/ebus_toolbox/station_optimization.py b/simba/station_optimization.py similarity index 93% rename from ebus_toolbox/station_optimization.py rename to simba/station_optimization.py index c6793f75..581870de 100644 --- a/ebus_toolbox/station_optimization.py +++ b/simba/station_optimization.py @@ -7,8 +7,8 @@ import sys from pathlib import Path import logging -import ebus_toolbox.station_optimizer -from ebus_toolbox.station_optimizer import opt_util +import simba.station_optimizer +from simba.station_optimizer import opt_util from spice_ev.report import generate_soc_timeseries config = opt_util.OptimizerConfig() @@ -18,7 +18,7 @@ def setup_logger(conf): """ Setup file and stream logging by config and args arguments. :param conf: configuration object - :type conf: ebus_toolbox.optimizer_util.OptimizerConfig + :type conf: simba.optimizer_util.OptimizerConfig :return: logger :rtype: Logger """ @@ -29,7 +29,7 @@ def setup_logger(conf): # use the temporary folder in case of testing. In the use case the general log file with logging # for all optimizations is located 2 folders above the opt folder, e.g. data/sim_outputs for the - # directory data/sim_outputs/XXX_eBus_results/sim__station_optimization/ + # directory data/sim_outputs/XXX_SimBA_results/sim__station_optimization/ if "pytest" in sys.modules: general_logger_path = Path(conf.optimizer_output_dir) / "optimizer.log" else: @@ -63,8 +63,8 @@ def prepare_filesystem(args, conf): """ Prepare files and folders in the optimization results folder. :param conf: configuration - :type conf: ebus_toolbox.optimizer_util.OptimizerConfig - :param args: Arguments for ebus toolbox + :type conf: simba.optimizer_util.OptimizerConfig + :param args: arguments for SimBA toolbox :type args: Namespace """ conf.optimizer_output_dir = Path(args.results_directory) @@ -81,7 +81,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): :param conf: Configuration object of optimization :type conf: OptimizerConfig :param sched: Simulation schedule containing buses, rotations etc. - :type sched: ebus_toolbox.schedule.Schedule + :type sched: simba.schedule.Schedule :param scen: Simulation scenario containing simulation results including the SoC of all vehicles over time :type scen: spice_ev.Scenario @@ -89,7 +89,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): :type args: Namespace :return: optimized schedule and Scenario - :rtype: tuple(ebus_toolbox.schedule.Schedule, spice_ev.Scenario) + :rtype: tuple(simba.schedule.Schedule, spice_ev.Scenario) """ # load pickle files if they are given in the optimizer.config @@ -111,7 +111,7 @@ def run_optimization(conf, sched=None, scen=None, args=None): if args.desired_soc_deps != 1 and conf.solver == "quick": logger.error("Fast calculation is not yet optimized for desired socs different to 1") - optimizer = ebus_toolbox.station_optimizer.StationOptimizer(sched, scen, args, conf, logger) + optimizer = simba.station_optimizer.StationOptimizer(sched, scen, args, conf, logger) # set battery and charging curves through config file optimizer.set_battery_and_charging_curves() diff --git a/ebus_toolbox/station_optimizer.py b/simba/station_optimizer.py similarity index 99% rename from ebus_toolbox/station_optimizer.py rename to simba/station_optimizer.py index 15e35b31..d2ae3028 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/simba/station_optimizer.py @@ -6,10 +6,10 @@ from pathlib import Path import numpy as np -import ebus_toolbox.optimizer_util as opt_util +import simba.optimizer_util as opt_util from spice_ev import scenario -from ebus_toolbox import rotation, schedule -from ebus_toolbox.util import uncomment_json_file +from simba import rotation, schedule +from simba.util import uncomment_json_file class StationOptimizer: @@ -240,7 +240,7 @@ def group_optimization(self, group, choose_station_function, track_not_possible_ """Optimize a single group events and returns the electrified stations and a flag. :param group: tuple of events and station_ids to be optimized together - :type group: (list(ebus_toolbox.optimizer_util.LowSocEvent), list(str)) + :type group: (list(simba.optimizer_util.LowSocEvent), list(str)) :param choose_station_function: function to be used for choosing the next function :type choose_station_function: function :param track_not_possible_rots: not possible tracks need to be tracked in the first run @@ -942,13 +942,13 @@ def get_trips(self, rot: rotation.Rotation, start_idx: int, end_idx: int): the start and end idx :param rot: The rotation object containing the trips. - :type rot: ebus_toolbox.rotation.Rotation + :type rot: simba.rotation.Rotation :param start_idx: start index, representing the start time. :type start_idx: int :param end_idx: end index, representing the end time. :type end_idx: int :return: trips that arrive between the start and end time. - :rtype: list(ebus_toolbox.trip.Trip) + :rtype: list(simba.trip.Trip) """ start_time_event = self.get_time_by_index(start_idx) @@ -998,7 +998,7 @@ def get_low_soc_events(self, rotations=None, filter_standing_time=True, :param kwargs: optional soc_lower_thresh or soc_upper_thresh if from optimizer differing values should be used :return: low soc events - :rtype: list(ebus_toolbox.optimizer_util.LowSocEvent) + :rtype: list(simba.optimizer_util.LowSocEvent) """ if not rotations: rotations = self.schedule.rotations diff --git a/ebus_toolbox/trip.py b/simba/trip.py similarity index 100% rename from ebus_toolbox/trip.py rename to simba/trip.py diff --git a/ebus_toolbox/util.py b/simba/util.py similarity index 98% rename from ebus_toolbox/util.py rename to simba/util.py index 56920f29..332a935c 100644 --- a/ebus_toolbox/util.py +++ b/simba/util.py @@ -12,7 +12,7 @@ def get_git_revision_hash() -> str: def save_version(file_path): with open(file_path, "w", encoding='utf-8') as f: - f.write("Git Hash eBus-Toolbox:" + get_git_revision_hash()) + f.write("Git Hash SimBA:" + get_git_revision_hash()) def get_buffer_time(trip, default=0): @@ -21,7 +21,7 @@ def get_buffer_time(trip, default=0): is added to the planned arrival time :param trip: The of buffer time of this trips arrival is returned. - :type trip: ebus_toolbox.Trip + :type trip: simba.Trip :param default: Default buffer time if no station specific buffer time is given. [minutes] :type default: dict, numeric :return: Buffer time @@ -220,7 +220,7 @@ def nd_interp(input_values, lookup_table): def get_args(): parser = argparse.ArgumentParser( - description='eBus-Toolbox - simulation program for electric bus fleets.') + description='SimBA - Simulation toolbox for Bus Applications.') # #### Paths ##### parser.add_argument('--input-schedule', nargs='?', @@ -313,7 +313,7 @@ def get_args(): choices=[None, 'include', 'exclude'], help='set mode for filtering schedule rotations') - # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN eBus-Toolbox CONFIG ##### + # #### SPICE EV PARAMETERS ONLY DEFAULT VALUES NOT IN SIMBA CONFIG ##### parser.add_argument('--seed', default=1, type=int, help='set random seed') parser.add_argument('--include-price-csv', help='include CSV for energy price. \ diff --git a/tests/helpers.py b/tests/helpers.py index f2d82235..a05fb5ae 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -1,6 +1,6 @@ """ Reusable functions that support tests """ -from ebus_toolbox import schedule, trip, consumption, util +from simba import schedule, trip, consumption, util def generate_basic_schedule(): diff --git a/tests/test_example.py b/tests/test_example.py index 04cc9470..f3162deb 100644 --- a/tests/test_example.py +++ b/tests/test_example.py @@ -10,18 +10,18 @@ class TestExampleConfigs: def test_example_cfg(self, tmp_path): # copy cfg to tmp, adjust paths - src = EXAMPLE_PATH / "ebus_toolbox.cfg" + src = EXAMPLE_PATH / "simba.cfg" src_text = src.read_text() # provide path to input data src_text = src_text.replace("data/examples", str(EXAMPLE_PATH)) # write output to tmp src_text = src_text.replace("data/sim_outputs", str(tmp_path)) - dst = tmp_path / "ebus_toolbox.cfg" + dst = tmp_path / "simba.cfg" # don't show plots. spaces are optional, so use regex src_text = re.sub(r"show_plots\s*=\s*true", "show_plots = false", src_text) dst.write_text(src_text) # call toolbox from shell assert subprocess.call([ - "python", "-m", "ebus_toolbox", "--config", dst + "python", "-m", "simba", "--config", dst ]) == 0 diff --git a/tests/test_nd_interpolate.py b/tests/test_nd_interpolate.py index 3da52ad5..4b23677b 100644 --- a/tests/test_nd_interpolate.py +++ b/tests/test_nd_interpolate.py @@ -1,6 +1,6 @@ import random import pytest -from ebus_toolbox.util import nd_interp +from simba.util import nd_interp TOLERANCE = 0.0001 POINTS_TO_CHECK = 10 diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 284cc474..2b7503b4 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -8,7 +8,7 @@ from tests.conftest import example_root, file_root from tests.helpers import generate_basic_schedule -from ebus_toolbox import consumption, rotation, schedule, trip, util +from simba import consumption, rotation, schedule, trip, util mandatory_args = { @@ -33,15 +33,15 @@ class TestSchedule: vehicle_types = util.uncomment_json_file(file) def basic_run(self): - """Returns a schedule and scenario after running the Ebus-Toolbox. + """Returns a schedule and scenario after running SimBA. :return: schedule, scenario """ path_to_trips = example_root / "trips_example.csv" # set the system variables to imitate the console call with the config argument. # first element has to be set to something or error is thrown - sys.argv = ["foo", "--config", str(example_root / "ebus_toolbox.cfg")] + sys.argv = ["foo", "--config", str(example_root / "simba.cfg")] args = util.get_args() - args.config = example_root / "ebus_toolbox.cfg" + args.config = example_root / "simba.cfg" args.days = None args.seed = 5 @@ -111,9 +111,10 @@ def test_basic_run(self): def test_assign_vehicles(self): """ Test if assigning vehicles works as intended. - Use a trips csv with two rotations ("1","2") a day apart. Ebus toolbox should assign - the same vehicle to both of them. rotation "3", starts shortly after "2" and should be - a new vehicle.""" + Use a trips csv with two rotations ("1","2") a day apart. + SimBA should assign the same vehicle to both of them. + Rotation "3" starts shortly after "2" and should be a new vehicle. + """ trip.Trip.consumption = consumption.Consumption(self.vehicle_types, outside_temperatures=self.temperature_path, @@ -245,9 +246,9 @@ def test_scenario_with_feed_in(self): with feed in, external load and battery works and if a scenario object is returned""" path_to_trips = example_root / "trips_example.csv" - sys.argv = ["foo", "--config", str(example_root / "ebus_toolbox.cfg")] + sys.argv = ["foo", "--config", str(example_root / "simba.cfg")] args = util.get_args() - args.config = example_root / "ebus_toolbox.cfg" + args.config = example_root / "simba.cfg" electrified_stations_path = example_root / "electrified_stations_with_feeds.json" args.electrified_stations = electrified_stations_path with open(electrified_stations_path, "r", encoding='utf-8') as file: diff --git a/tests/test_simulate.py b/tests/test_simulate.py index ea7659c7..68df257f 100644 --- a/tests/test_simulate.py +++ b/tests/test_simulate.py @@ -3,7 +3,7 @@ import pytest import warnings -from ebus_toolbox.simulate import simulate +from simba.simulate import simulate root_path = Path(__file__).parent.parent diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 17073fc5..9ea696d3 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,21 +1,21 @@ -import pathlib -import re -import shutil from copy import copy - +import json +from pathlib import Path import pytest +import re import sys -import json -from tests.conftest import example_root -import ebus_toolbox.optimizer_util as opt_util -import ebus_toolbox.util as util -from ebus_toolbox.station_optimization import run_optimization -from ebus_toolbox.trip import Trip -from ebus_toolbox.consumption import Consumption -from ebus_toolbox.schedule import Schedule +import shutil + +from simba.consumption import Consumption +import simba.optimizer_util as opt_util +from simba.schedule import Schedule +from simba.station_optimization import run_optimization +from simba.trip import Trip +import simba.util as util from spice_ev.report import generate_soc_timeseries +from tests.conftest import example_root -file_root = pathlib.Path(__file__).parent / "test_input_files/optimization" +file_root = Path(__file__).parent / "test_input_files/optimization" class TestStationOptimization: @@ -35,7 +35,7 @@ def setup_test(self, tmp_path): self.tmp_path = tmp_path # Create a temporary config file as copy from the example configuration. - src = example_root / "ebus_toolbox.cfg" + src = example_root / "simba.cfg" src_text = src.read_text() # don't show plots. spaces are optional, so use regex @@ -82,7 +82,7 @@ def setup_test(self, tmp_path): "preferred_charging_type = oppb"r"\g<2>", src_text) # change config file with adjusted temporary paths to vehicles and electrified stations - dst = tmp_path / "ebus_toolbox.cfg" + dst = tmp_path / "simba.cfg" dst.write_text(src_text) def basic_run(self, trips_file_name="trips.csv"): @@ -93,7 +93,7 @@ def basic_run(self, trips_file_name="trips.csv"): :type trips_file_name: str :return: schedule, scenario""" path_to_trips = file_root / trips_file_name - sys.argv = ["foo", "--config", str(self.tmp_path / "ebus_toolbox.cfg")] + sys.argv = ["foo", "--config", str(self.tmp_path / "simba.cfg")] args = util.get_args() args.input_schedule = path_to_trips Trip.consumption = Consumption(self.vehicle_types, diff --git a/tests/test_util.py b/tests/test_util.py index 03e01ad9..07fc0b26 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,6 +1,6 @@ from datetime import datetime import json -from ebus_toolbox import util +from simba import util from tests.test_schedule import TestSchedule From 0f715eab587f6941ca1a6070879ce3181f80b5ce Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 1 Aug 2023 16:54:13 +0200 Subject: [PATCH 741/802] update rtd pictures, config and getting_started --- data/examples/ebus_toolbox.cfg | 2 +- docs/source/_static/PyCharm_Configuration.png | Bin 0 -> 69829 bytes ...8_eBus-Toolbox Logo.png => SimBA_logo.png} | Bin docs/source/_static/SimBA_module_overview.png | Bin 0 -> 59991 bytes docs/source/_static/methodology_overview.png | Bin 64639 -> 0 bytes docs/source/getting_started.rst | 77 +++++++-- docs/source/index.rst | 8 +- docs/source/modes.rst | 58 +++---- docs/source/simulation_parameters.rst | 147 +++++++++++++++++- 9 files changed, 243 insertions(+), 49 deletions(-) create mode 100644 docs/source/_static/PyCharm_Configuration.png rename docs/source/_static/{2023_06_08_eBus-Toolbox Logo.png => SimBA_logo.png} (100%) create mode 100644 docs/source/_static/SimBA_module_overview.png delete mode 100644 docs/source/_static/methodology_overview.png diff --git a/data/examples/ebus_toolbox.cfg b/data/examples/ebus_toolbox.cfg index d9f83b72..3325442b 100644 --- a/data/examples/ebus_toolbox.cfg +++ b/data/examples/ebus_toolbox.cfg @@ -76,7 +76,7 @@ default_buffer_time_opps = 0 # Options: HV, HV/MV, MV, MV/LV, LV (default: MV) default_voltage_level = "MV" -##### SIMULATION PARAMETERS ##### +##### Simulation Parameters ##### # Maximum number of days to simulate, if not set simulate entire schedule #days = 10 # Set length of timestep in minutes (default: 1) diff --git a/docs/source/_static/PyCharm_Configuration.png b/docs/source/_static/PyCharm_Configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..8d42e3651376d5a8944eba4511a97ae7ae36c510 GIT binary patch literal 69829 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

U1IdyzvZDDQ85CRz#JIXVKlR5t9KmC`rDa| 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 From d3437521a448fff81cad8a448ba454207569b2ee Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 9 Aug 2023 08:29:05 +0200 Subject: [PATCH 766/802] revert charging_type in trips_example but add new trips_example_ct --- data/examples/trips_example.csv | 130 ++++++++++++++--------------- data/examples/trips_example_ct.csv | 65 +++++++++++++++ 2 files changed, 130 insertions(+), 65 deletions(-) create mode 100644 data/examples/trips_example_ct.csv diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index a08c3e83..055034de 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading,charging_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0,oppb -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9,oppb -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,,,oppb -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,,,oppb -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,,,oppb -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,,,oppb -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,,,oppb -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,,,oppb -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,,,oppb -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,,,oppb -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,,, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,,, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,,, -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,,, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,,, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,,, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,,, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,,, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,,, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,,, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,,, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,,, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,,, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,,, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,,, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,,, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,,, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,,, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,,, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,,, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,,, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,,, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,,, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,,, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,,, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,,, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,,, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,,, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,,, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,,, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,,, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,,, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,,, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,,, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,,, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,,, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,,, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,,, \ No newline at end of file +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0 +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9 +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,, +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,, +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,, +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,, +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,, +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,, +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,, +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,, +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,, +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,, +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,, \ No newline at end of file diff --git a/data/examples/trips_example_ct.csv b/data/examples/trips_example_ct.csv new file mode 100644 index 00000000..04f03929 --- /dev/null +++ b/data/examples/trips_example_ct.csv @@ -0,0 +1,65 @@ +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading,charging_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0,oppb +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9,oppb +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,,,oppb +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,,,oppb +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,,,oppb +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,,,oppb +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,,,oppb +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,,, \ No newline at end of file From 1ffa555d6d2572924c4854ed09b38a6dccafa449 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 9 Aug 2023 08:50:45 +0200 Subject: [PATCH 767/802] still WIP: rtd --- data/examples/electrified_stations.json | 16 +++++++++------- docs/source/simulation_parameters.rst | 8 +++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index c8755001..a43730f7 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -2,8 +2,12 @@ "Station-0": { // name of station "type": "deps", // type: "deps" or "opps" "n_charging_stations": null, // nr of charging stataions, "null" for unlimited - "distance_to_grid": 150, // distance to grid, needed for cost calculation - "energy_feed_in": { // energy feed in e.g. by local renewables + "distance_to_grid": 150, // optional: distance to grid, default defined in cost_params + "gc_power": 5000, // optional: maximum gc power for this station, default defined in config + "cs_power_deps_oppb" : 50, // optional: maximum cs power for this station, default defined in config + "cs_power_deps_depb" : 120, // optional: maximum cs power for this station, default defined in config + "voltage_level": "MV", // optional: voltage_level for this station, default defined in config + "energy_feed_in": { // optional: energy feed in e.g. by local renewables "csv_file": "data/examples/example_pv_feedin.csv", // path to feedin.csv "start_time": "2022-03-07T00:00:00", // start time as YYYY-MM-DDThh:mm:ss "step_duration_s": 3600, // timestep in seconds @@ -11,23 +15,21 @@ "nominal_power": 10, // nominal power in kW, needed for PV remuneration "factor": 1 // factor to multiply column values, eg 0.001 for conversion from W to kW }, - "external_load": { // local external loads + "external_load": { // optional: local external loads "csv_file": "data/examples/example_external_load.csv", // path to feedin.csv "start_time": "2022-03-07T00:00:00", // start time as YYYY-MM-DDThh:mm:ss "step_duration_s": 900, // timestep in seconds "column": "External Load (kW)", // column name in .csv "factor": 2 // factor to multiply column values, eg 0.001 for conversion from W to kW }, - "battery": { // local stationary battery + "battery": { // optional: local stationary battery "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required "capacity": 300, // kWh, assumed to be infinite if not given "min_charging_power": 0, // kW, optional "soc": 0, // initial state of charge [0-1], optional "efficiency": 0.95, // optional "discharge_curve": null // optional, same as charging curve - }, - "cs_power_deps_oppb" : 50, // optional: maximum cs power can be defined per station - "cs_power_deps_depb" : 120 // optional: maximum cs power can be defined per station + } }, "Station-3": { "type": "opps", diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index abcbba77..884a55d9 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -276,14 +276,11 @@ Cost parameters TBC - -TBC - .. _station_geo_data: Station data ------------ -Geodata. TBV +TBC .. _level_of_loading: @@ -292,13 +289,14 @@ Level of loading ---------------- TBC + .. _temperature_data: Temperatures ------------ - TBC + .. _consumption_table: Consumption table From 0cdedc9e971efc117594c3c74d33204deca10445 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 9 Aug 2023 11:16:33 +0200 Subject: [PATCH 768/802] add trip: fixed consumption calc if ct is given Changed logic of rotation.add_trip. Consumption for trips was not calculated when trip charging_type was given (eg through trips.csv) and rotation already had a charging type. Added check in schedule.generate_scenario that each trip has a delta_soc. Changed expected result in test_schedule.test_get_negative_rotations. --- simba/rotation.py | 16 +++++++++++----- simba/schedule.py | 2 ++ tests/test_schedule.py | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/simba/rotation.py b/simba/rotation.py index 1f7e4fc3..edea1d41 100644 --- a/simba/rotation.py +++ b/simba/rotation.py @@ -28,6 +28,7 @@ def add_trip(self, trip): :param trip: Information on trip to be added to rotation :type trip: dict + :raises Exception: if charging type of trip and rotation differ """ new_trip = Trip(self, **trip) @@ -57,16 +58,21 @@ def add_trip(self, trip): # set charging type if given charging_type = trip.get('charging_type') + self.trips.append(new_trip) if charging_type in ['depb', 'oppb']: - assert self.charging_type is None or self.charging_type == charging_type, ( - f"Two trips of rotation {self.id} have distinct charging types") assert self.schedule.vehicle_types.get( self.vehicle_type, {}).get(charging_type) is not None, ( f"The required vehicle type {self.vehicle_type}({charging_type}) " "is not given in the vehicle_types.json file.") - self.set_charging_type(charging_type) - - self.trips.append(new_trip) + if self.charging_type is None: + # set CT for whole rotation + self.set_charging_type(charging_type) + elif self.charging_type == charging_type: + # same CT as other trips: just add trip consumption + self.consumption += new_trip.calculate_consumption() + else: + # different CT than rotation: error + raise Exception(f"Two trips of rotation {self.id} have distinct charging types") def calculate_consumption(self): """ Calculate consumption of this rotation and all its trips. diff --git a/simba/schedule.py b/simba/schedule.py index 211c6f34..9e00335c 100644 --- a/simba/schedule.py +++ b/simba/schedule.py @@ -608,6 +608,8 @@ def generate_scenario(self, args): "estimated_time_of_arrival": arrival_time.isoformat() } }) + assert trip.delta_soc is not None, ( + "Trip delta_soc is None. Did you forget to calculate consumption?") # create arrival event events["vehicle_events"].append({ diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 2b7503b4..09f7dc09 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -178,7 +178,7 @@ def test_get_negative_rotations(self): sched, scen = self.basic_run() neg_rots = sched.get_negative_rotations(scen) - assert '1' in neg_rots + assert '2' in neg_rots def test_rotation_filter(self, tmp_path): s = schedule.Schedule(self.vehicle_types, self.electrified_stations, **mandatory_args) From 3606654522ebba310df5d51216d6e57bf149ee94 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 9 Aug 2023 13:57:08 +0200 Subject: [PATCH 769/802] update documentation --- data/examples/cost_params.json | 4 +- data/examples/electrified_stations.json | 8 +-- docs/source/simba_features.rst | 4 +- docs/source/simulation_parameters.rst | 74 +++++++++++++++++++++---- 4 files changed, 71 insertions(+), 19 deletions(-) diff --git a/data/examples/cost_params.json b/data/examples/cost_params.json index 4cd4efa5..38359dff 100644 --- a/data/examples/cost_params.json +++ b/data/examples/cost_params.json @@ -28,7 +28,7 @@ "gc": { "LV": { "default_distance": 50, - "capex_gc_fix": 16.85, + "capex_gc_fix": 100, "capex_gc_per_meter": 16.85, "capex_gc_per_kW": 24.14, "capex_transformer_fix": 0, @@ -36,7 +36,7 @@ }, "MV/LV": { "default_distance": 100, - "capex_gc_fix": 16.85, + "capex_gc_fix": 100, "capex_gc_per_meter": 16.85, "capex_gc_per_kW": 24.14, "capex_transformer_fix": 0, diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index a43730f7..40d4ffa9 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -12,13 +12,13 @@ "start_time": "2022-03-07T00:00:00", // start time as YYYY-MM-DDThh:mm:ss "step_duration_s": 3600, // timestep in seconds "column": "Feed-in Total (kW)", // column name in .csv - "nominal_power": 10, // nominal power in kW, needed for PV remuneration + "nominal_power": 10, // nominal power in kW, needed calculation of for PV remuneration "factor": 1 // factor to multiply column values, eg 0.001 for conversion from W to kW }, "external_load": { // optional: local external loads - "csv_file": "data/examples/example_external_load.csv", // path to feedin.csv + "csv_file": "data/examples/example_external_load.csv", // path to external_load.csv "start_time": "2022-03-07T00:00:00", // start time as YYYY-MM-DDThh:mm:ss - "step_duration_s": 900, // timestep in seconds + "step_duration_s": 3600, // timestep in seconds "column": "External Load (kW)", // column name in .csv "factor": 2 // factor to multiply column values, eg 0.001 for conversion from W to kW }, @@ -49,7 +49,7 @@ "gc_power": 250, // optional: maximum gc power can be defined per station "cs_power_opps" : 140, // optional: maximum cs power can be defined per station "voltage_level": "LV" // optional: voltage_level can be defined per station, influences cost - }, + }, "Station-21": { "type": "opps", "n_charging_stations": 2 diff --git a/docs/source/simba_features.rst b/docs/source/simba_features.rst index a1515f69..248a7d95 100644 --- a/docs/source/simba_features.rst +++ b/docs/source/simba_features.rst @@ -4,6 +4,8 @@ Features of SimBA ================= +.. _consumption_analysis: + Consumption analysis -------------------- @@ -70,7 +72,7 @@ Default outputs Cost calculation ################ | **Cost calculation (summary_vehicles_costs.csv)** -| This is an optional output which calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. +| This is an optional output which calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the :ref:`cost_params`. | The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV documentation `_ for the calculation of electricity costs. * Investment diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index 884a55d9..a06fe64c 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -5,10 +5,7 @@ Simulation Parameters The simulation of an eBus-System relies on a variety of simulation parameters. SimBA provides most of them as default values. Depending on specific needs adjusting -these values can increase the accuracy of the simulation outputs. The SimBA input files are described -in detail in the following subsections as well as their default parameters. -When providing the user defined input files, the user should make sure the files are either 'utf-8' -encoded or not contain regional characters. +these values can increase the accuracy of the simulation outputs. The SimBA input files are described in detail in the following subsections as well as their default parameters. When providing the user defined input files, the user should make sure the files are either 'utf-8' encoded or not contain regional characters. Except for the ``electrified_stations.json``, all .json files can be enriched with in-line comments starting with :code:`\\\\`. .. _config: @@ -232,7 +229,7 @@ This is how a schedule file might look like. Vehicle types ------------- -The vehicle types that can be used are defined in the "vehicle_type.json". The path to this file has to be defined in the :ref:`config` and an example is given at `data/examples/vehicle_types.json`. +The vehicle types that can be used are defined in the "vehicle_type.json". The path to this file has to be defined in the :ref:`config` and an example is given at "data/examples/vehicle_types.json". The data is structured as a .json where the top level key represents the vehicle_type, that needs to correspont to the "vehicle_type" defined in the :ref:`schedule`. The next level key defines the charging_type ("oppb" or "depb"). For one vehicle type either one or both charging types can be defined and for each given charging type the specifications in the third level of the .json have to be given. In this level, the parameters for the specified vehicle are be defined. The specification of one vehicle with the vehicle_type "AB" and the charging_types "depb" and "oppb" is given as follows: @@ -265,37 +262,90 @@ The data is structured as a .json where the top level key represents the vehicle Electrified stations -------------------- -All stations, that are or could be equipped with charging infrastructure have to be parameterized in the "electrified_stations.json" together with their grid connection, charging infrastructure and local energy systems. The path to this file has to be defined in the :ref:`config` and an example is given at `data/examples/electrified_stations.json`. +All stations, that are or could be equipped with charging infrastructure have to be parameterized in the "electrified_stations.json" together with their grid connection, charging infrastructure and local energy systems. The path to this file has to be defined in the :ref:`config`. + +The data is structured as a .json where the top level key represents the station name, that needs to correspont to the "departure_name", respectively "arrival_name" defined in the :ref:`schedule`. Each station has two mandatory arguments: "type" defines if a station is a depot ("deps") or a opportunity charging station ("opps") and "n_charging_stations" limits the amount of vehicles, that can simulataniously charge at one station. + +Furthermore the energy system at each station can be characterized in terms of local power generation ("energy_feed_in"), local external loads ("external_load") or local stationary electric power storage ("battery"). An example that displays all further parameters and the specification of the local energy systems is given at "data/examples/electrified_stations.json". -TODO: HIER WEITER .. _cost_params: Cost parameters --------------- -TBC +In order to run the :ref:`cost_calculation`, all cost parameters are to be defined in the ``cost_params.json``. The file is used as input for both, SimBA and SpiceEV, as both tools do part of the cost calculation and therefore no comments are allowed here. If not otherwise specified the investments/costs are gross prices. A commented example is given below, for a working example please refer to "data/examples/cost_params.json". + +.. code-block:: json + + { + "vehicles": { // all vehicles and charging types have to be defined here + "SB_debp": { // all combinations of vehicle types and charging types have a separate cost definition, the name is to be given as [vehicle_type]_[charging_type] + "capex": 500000, // investment cost for one vehicle without vehicle battery + "c_maint_per_km": 0.24, // maintanance cost per km + "lifetime": 14 // lifetime of the vehicle in years + } + }, + "batteries": { // vehicle battery + "lifetime_battery": 7, // lifetime of the vehicle battery in years + "cost_per_kWh": 250 // investment cost for vehicle battery per kWh + }, + "gc": { // grid connection + "LV": { // grid connection in specific volatege level. Options are "HV", "HV/MV", "MV", "MV/LV", "LV" and all relevant voltage levels have to be defined here + "default_distance": 50, // Used if not specified individually in electrified_stations.json + "capex_gc_fix": 100, // fix investment cost for establishing a grid connection + "capex_gc_per_meter": 16.85, // investment cost per meter + "capex_gc_per_kW": 24.14, // investment cost per kW + "capex_transformer_fix": 0, // fix investment cost for a transformer + "capex_transformer_per_kW": 0 // fix investment cost for a transformer per kW + }, + "lifetime_gc": 50, // lifetime of the grid connection in years + "c_maint_transformer_per_year": 0.02, // annual maintanance costs in % of capex + "lifetime_transformer": 20 // lifetime in years + }, + "stationary_storage": { // stationary electric energy storage + "capex_fix": 1, // fix investment cost for stationary storage + "capex_per_kWh": 1, // investment cost for stationary storage per kWh + "c_maint_stat_storage_per_year": 0.02, // annual maintanance costs in % of capex + "lifetime_stat_storage": 20 // lifetime in years + }, + "cs":{ // charging stations + "capex_opps_per_kW": 877.5, // investment cost for opportunity charging stations per kW + "capex_deps_per_kW": 1000, // investment cost for depot charging stations per kW + "lifetime_cs": 20, // lifetime of charging stations in years + "c_maint_cs_per_year": 0.02 // annual maintanance costs in % of capex + }, + "garage": { + "n_charging_stations": 1, // number of charging stations for the garage + "power_cs": 50, // power of the charging stations for the garage + "vehicles_per_workstation": 20, // how many vehicles share one workstation + "cost_per_workstation": 245000, // investment cost for one workstation + "lifetime_workstations": 20 // lifetime in years + } + } + +all remaining parameters are described in the example file. .. _station_geo_data: Station data ------------ -TBC +The file "all_stations.csv" contains information that is relevant for all stations regardless of their status of electrification. At this stage of development this reduces to the information of station height that is relevant only if a trip specific :ref:`consumption_analysis` is employed. See the example at "data/examples/all_stations.csv" for the required structure. .. _level_of_loading: Level of loading ---------------- -TBC + +If a trip specific :ref:`consumption_analysis` is employed, the level of loading for each trip is required. This information can be detailed in the :ref:`schedule`. If not specified there, a default value for every hour of the day can be specified in this file. See the example at "data/examples/default_level_of_loading_over_day.csv" for the required structure. .. _temperature_data: Temperatures ------------ -TBC - +If a trip specific :ref:`consumption_analysis` is employed, the temperature for each trip is required. This information can be detailed in the :ref:`schedule`. If not specified there, a default value for every hour of the day can be specified in this file. See the example at "data/examples/default_temp_summer.csv" for the required structure. .. _consumption_table: From 1025eabe92bbbdd38f21ede318af98314647f0ca Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 9 Aug 2023 14:44:15 +0200 Subject: [PATCH 770/802] Fix typos --- docs/source/simulation_parameters.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index a06fe64c..fea77604 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -231,7 +231,7 @@ Vehicle types The vehicle types that can be used are defined in the "vehicle_type.json". The path to this file has to be defined in the :ref:`config` and an example is given at "data/examples/vehicle_types.json". -The data is structured as a .json where the top level key represents the vehicle_type, that needs to correspont to the "vehicle_type" defined in the :ref:`schedule`. The next level key defines the charging_type ("oppb" or "depb"). For one vehicle type either one or both charging types can be defined and for each given charging type the specifications in the third level of the .json have to be given. In this level, the parameters for the specified vehicle are be defined. The specification of one vehicle with the vehicle_type "AB" and the charging_types "depb" and "oppb" is given as follows: +The data is structured as a .json where the top level key represents the vehicle_type, that needs to correspond to the "vehicle_type" defined in the :ref:`schedule`. The next level key defines the charging_type ("oppb" or "depb"). For one vehicle type either one or both charging types can be defined and for each given charging type the specifications in the third level of the .json have to be given. In this level, the parameters for the specified vehicle are be defined. The specification of one vehicle with the vehicle_type "AB" and the charging_types "depb" and "oppb" is given as follows: .. code-block:: json @@ -264,7 +264,7 @@ Electrified stations All stations, that are or could be equipped with charging infrastructure have to be parameterized in the "electrified_stations.json" together with their grid connection, charging infrastructure and local energy systems. The path to this file has to be defined in the :ref:`config`. -The data is structured as a .json where the top level key represents the station name, that needs to correspont to the "departure_name", respectively "arrival_name" defined in the :ref:`schedule`. Each station has two mandatory arguments: "type" defines if a station is a depot ("deps") or a opportunity charging station ("opps") and "n_charging_stations" limits the amount of vehicles, that can simulataniously charge at one station. +The data is structured as a .json where the top level key represents the station name, that needs to correspond to the "departure_name", respectively "arrival_name" defined in the :ref:`schedule`. Each station has two mandatory arguments: "type" defines if a station is a depot ("deps") or a opportunity charging station ("opps") and "n_charging_stations" limits the amount of vehicles, that can simultaneously charge at one station. Furthermore the energy system at each station can be characterized in terms of local power generation ("energy_feed_in"), local external loads ("external_load") or local stationary electric power storage ("battery"). An example that displays all further parameters and the specification of the local energy systems is given at "data/examples/electrified_stations.json". @@ -281,7 +281,7 @@ In order to run the :ref:`cost_calculation`, all cost parameters are to be defin "vehicles": { // all vehicles and charging types have to be defined here "SB_debp": { // all combinations of vehicle types and charging types have a separate cost definition, the name is to be given as [vehicle_type]_[charging_type] "capex": 500000, // investment cost for one vehicle without vehicle battery - "c_maint_per_km": 0.24, // maintanance cost per km + "c_maint_per_km": 0.24, // maintenance cost per km "lifetime": 14 // lifetime of the vehicle in years } }, @@ -290,7 +290,7 @@ In order to run the :ref:`cost_calculation`, all cost parameters are to be defin "cost_per_kWh": 250 // investment cost for vehicle battery per kWh }, "gc": { // grid connection - "LV": { // grid connection in specific volatege level. Options are "HV", "HV/MV", "MV", "MV/LV", "LV" and all relevant voltage levels have to be defined here + "LV": { // grid connection in specific voltage level. Options are "HV", "HV/MV", "MV", "MV/LV", "LV" and all relevant voltage levels have to be defined here "default_distance": 50, // Used if not specified individually in electrified_stations.json "capex_gc_fix": 100, // fix investment cost for establishing a grid connection "capex_gc_per_meter": 16.85, // investment cost per meter @@ -299,20 +299,20 @@ In order to run the :ref:`cost_calculation`, all cost parameters are to be defin "capex_transformer_per_kW": 0 // fix investment cost for a transformer per kW }, "lifetime_gc": 50, // lifetime of the grid connection in years - "c_maint_transformer_per_year": 0.02, // annual maintanance costs in % of capex + "c_maint_transformer_per_year": 0.02, // annual maintenance costs in % of capex "lifetime_transformer": 20 // lifetime in years }, "stationary_storage": { // stationary electric energy storage "capex_fix": 1, // fix investment cost for stationary storage "capex_per_kWh": 1, // investment cost for stationary storage per kWh - "c_maint_stat_storage_per_year": 0.02, // annual maintanance costs in % of capex + "c_maint_stat_storage_per_year": 0.02, // annual maintenance costs in % of capex "lifetime_stat_storage": 20 // lifetime in years }, "cs":{ // charging stations "capex_opps_per_kW": 877.5, // investment cost for opportunity charging stations per kW "capex_deps_per_kW": 1000, // investment cost for depot charging stations per kW "lifetime_cs": 20, // lifetime of charging stations in years - "c_maint_cs_per_year": 0.02 // annual maintanance costs in % of capex + "c_maint_cs_per_year": 0.02 // annual maintenance costs in % of capex }, "garage": { "n_charging_stations": 1, // number of charging stations for the garage From 97ef368a4ee6fa5d8637cc7044de599fe92ae0ff Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 9 Aug 2023 16:09:51 +0200 Subject: [PATCH 771/802] update version and requirements --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 25e02659..6ee776d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ numpy >= 1.12.0 matplotlib --e git+https://github.com/rl-institut/spice_ev.git@dev#egg=spice_ev +-e git+https://github.com/rl-institut/spice_ev.git@master#egg=spice_ev pandas diff --git a/setup.py b/setup.py index 1fef2e63..67909811 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="simba", - version="0.0.1dev", + version="1.0.0", description="Simulation toolbox for Bus Applications", url="https://github.com/rl-institut/eBus-Toolbox", author="Reiner Lemoine Institut", From b599b31d153fb0a1f5b95d2b12dc136a7fb2d3b3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 9 Aug 2023 16:19:00 +0200 Subject: [PATCH 772/802] Fix more typos --- docs/source/getting_started.rst | 6 ++++-- docs/source/simba_features.rst | 8 ++++---- docs/source/simulation_parameters.rst | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index ad08e6eb..9a71cce1 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -3,6 +3,7 @@ Getting Started SimBA - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. It is used for locating and dimensioning charging infrastructure, dimensioning buses, analyzing the feasibility of electrification of trips and rotations, determining charging strategies, and calculating investments and costs. + .. Without creating links like in the line below, subpages go missing from the sidebar .. _installation_label: @@ -28,7 +29,7 @@ Default configurations are detailed at `data/configs/simba.cfg`. Usage with PyCharm ################## -To use SimBa with PyCharm, create a new python (>= 3.7) environment and clone this repository. Then go to File -> Settings -> project in PyCharm and set Python of the newly created environment as interpreter and the local SimBA repository as project root. Now install the required packages by running in the Terminal: +To use SimBa with PyCharm, create a new python (>= 3.7) environment and clone `this repository `_. Then go to File -> Settings -> project in PyCharm and set Python of the newly created environment as interpreter and the local SimBA repository as project root. Now install the required packages by running in the terminal: ``pip install -r requirements.txt`` @@ -52,7 +53,8 @@ SimBA is designed as a toolbox, so the specific use can be adapted to the users :numref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. - Modules of SimBA +Modules of SimBA +################ Depending on the given simulation parameters, the vehicles are then dispatched. In this step, every rotation – the sum of all trips between leaving the depot until return – is allocated to a specific vehicle. The vehicles can be charged at any number of :ref:`electrified_stations`. These can be classified either as depot stations (deps) or as opportunity stations (opps). Each vehicle can be charged following one of the two charging strategies: Either as opportunity charging bus (oppb) or as depot charging bus (depb). While an oppb is charged at both deps and opps, depb are only charged at deps. The charging strategy can either be defined for each rotation in the :ref:`schedule` data or for all not explicitly defined rotations using the "preferred charging type" option in the :ref:`config`. Using this information, the charging simulation is then carried out. diff --git a/docs/source/simba_features.rst b/docs/source/simba_features.rst index 248a7d95..cd959ad0 100644 --- a/docs/source/simba_features.rst +++ b/docs/source/simba_features.rst @@ -33,7 +33,7 @@ The charging simulation is carried out in the open source software `SpiceEV Date: Wed, 9 Aug 2023 16:23:44 +0200 Subject: [PATCH 773/802] Expand service_optimization text --- docs/source/modes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 54b6fd6b..008e8dd2 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -74,7 +74,7 @@ It takes the results of the previous simulation, and changes the charging type o Service Optimization -------------------- It can happen that several buses influence each other while simultaneously charging at the same charging station, e.g. due to limited grid power or limited number of charging stations, which can lead to negative SoCs due to hindered charging. In this case, this mode finds the largest set of rotations that results in no negative SoC. This is done by first taking all rotations that do become negative and finding their dependent rotations, i.e., ones that can have an influence by sharing a station earlier with the negative rotation. Next, all rotations are filtered out that stay negative when running with just their dependent rotations. -Now, only rotations are left that are non-negative when viewed alone, but might become negative when run together. To find the largest subset of non-negative rotations, all possible set combinations are generated and tried out. When a union of two rotation-sets is non-negative, it is taken as the basis for new possible combinations. +Now, only rotations are left that are non-negative when viewed alone, but might become negative when run together. To find the largest subset of non-negative rotations, all possible set combinations are generated and tried out. When a union of two rotation-sets is non-negative, it is taken as the basis for new possible combinations. The previous two rotation-sets will not be tried on their own from now on. In the end, the largest number of rotations that produce a non-negative result when taken together is returned as the optimized scenario. Station Optimization From c953d073d11ef4d02ba4ba12b9293e0bd35f235f Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 9 Aug 2023 16:26:42 +0200 Subject: [PATCH 774/802] service_opt: minor changes --- simba/optimization.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/simba/optimization.py b/simba/optimization.py index ed299c7f..b6c1bd98 100644 --- a/simba/optimization.py +++ b/simba/optimization.py @@ -49,24 +49,22 @@ def service_optimization(schedule, scenario, args): vid = rotation.vehicle_id last_neg_soc_time = scenario.negative_soc_tracker[vid][-1] last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) - dependent_station = {r: t for r, t in common_stations[rot_key].items() - if t <= last_neg_soc_time} - logging.debug(f"Dependent stations: {dependent_station}") - while dependent_station: + dependent_rotations = {r: t for r, t in common_stations[rot_key].items() + if t <= last_neg_soc_time} + logging.debug(f"Dependent stations: {dependent_rotations}") + while dependent_rotations: # get next rotation ID and last common time - r, t = dependent_station.popitem() - # rotation ID -> rotation object - dependent_rotation = schedule.rotations.get(r) - logging.debug(f"\tRotation {r} ({dependent_rotation}) @ {t}:") + r, t = dependent_rotations.popitem() + logging.debug(f"\tRotation {r} @ {t}:") if r not in negative_rotations: # r not negative: add to set of dependent rotations s.add(r) # add dependencies of r, avoid circular dependency dependencies = {r2: t2 for r2, t2 in common_stations[r].items() if t2 <= t and r2 not in s} - dependent_station.update(dependencies) + dependent_rotations.update(dependencies) logging.debug(f"\t{dependencies}") - elif dependent_rotation is not None and dependent_rotation.charging_type != "obbp": + elif original.rotations[r].charging_type != "obbp": logging.warning(f"Rotation {rot_key} depends on negative non-oppb rotation") negative_sets[rot_key] = s From 0f898413a899b4a8cc180ac11915cb38d57b83cf Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 9 Aug 2023 17:22:56 +0200 Subject: [PATCH 775/802] Change config, add test for schedule consistency and slight changes of station_optimization --- data/examples/default_optimizer.cfg | 6 +++-- simba/station_optimization.py | 14 +++++++++++- tests/test_station_optimization.py | 35 ++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index d8fecdfc..04be160a 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -17,7 +17,7 @@ exclusion_stations = [] # optimization will electrify these stations. # if using inclusion stations, scenario should be rebased inclusion_stations = [] -standard_opp_station = {"type": "opps", "n_charging_stations": 200,"distance_transformer": 50} +standard_opp_station = {"type": "opps", "n_charging_stations": null} # rotations which drop below this value are considered not electrified (default value is 0) min_soc = 0.05 @@ -41,6 +41,7 @@ pickle_rebased_name = "" # Should all rotations be rebased or can rotations which stay above the soc threshold be skipped? run_only_neg = False # Should only be opportunity vehicles be rebased, since this optimization is not meant for depot chargers +# The depot chargers will be added to the returned schedule in any case run_only_oppb = True # number of stations before optimal solution, where branch is checked for pruning pruning_threshold = 3 @@ -64,7 +65,8 @@ estimation_threshold = 0.80 # Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible -# If they are deemed as impossible, they are not optimized but discarded +# If they are deemed as impossible, they are not optimized but discarded during optimization. +# They will be added to the returned schedule in any case. remove_impossible_rotations = True # Check if stations are mandatory for a fully electrified system. If they are, include them check_for_must_stations = False diff --git a/simba/station_optimization.py b/simba/station_optimization.py index 581870de..72b2d258 100644 --- a/simba/station_optimization.py +++ b/simba/station_optimization.py @@ -3,6 +3,7 @@ """ +from copy import deepcopy import json import sys from pathlib import Path @@ -101,6 +102,8 @@ def run_optimization(conf, sched=None, scen=None, args=None): assert conf.args, error_message sched, scen, args = opt_util.toolbox_from_pickle(conf.schedule, conf.scenario, conf.args) + original_schedule = deepcopy(sched) + # setup folders, paths and copy config prepare_filesystem(args, conf) @@ -118,8 +121,10 @@ def run_optimization(conf, sched=None, scen=None, args=None): # filter out depot chargers if option is set if conf.run_only_oppb: + optimizer.config.exclusion_rots = optimizer.config.exclusion_rots.union( + r for r in sched.rotations if "depb" in sched.rotations[r].charging_type) sched.rotations = {r: sched.rotations[r] for r in sched.rotations - if "oppb" in sched.rotations[r].vehicle_id} + if "oppb" in sched.rotations[r].charging_type} assert len(sched.rotations) > 0, "No rotations left after removing depot chargers" # rebasing the scenario meaning simulating it again with SpiceEV and the given conditions of @@ -187,6 +192,13 @@ def run_optimization(conf, sched=None, scen=None, args=None): # Calculation with SpiceEV is more accurate and will show if the optimization is viable or not logger.debug("Detailed calculation of optimized case as a complete scenario") + + # Restore excluded rotations + for rotation_id in optimizer.config.exclusion_rots: + optimizer.schedule.rotations[rotation_id] = original_schedule.rotations[rotation_id] + + # remove exclusion since internally these would not be simulated + optimizer.config.exclusion_rots = set() _, __ = optimizer.preprocessing_scenario( electrified_stations=ele_stations, run_only_neg=False) diff --git a/tests/test_station_optimization.py b/tests/test_station_optimization.py index 9ea696d3..20041379 100644 --- a/tests/test_station_optimization.py +++ b/tests/test_station_optimization.py @@ -1,4 +1,4 @@ -from copy import copy +from copy import copy, deepcopy import json from pathlib import Path import pytest @@ -124,6 +124,39 @@ def test_basic_optimization(self): conf.solver = "spiceev" opt_sched, opt_scen = run_optimization(conf, sched=sched, scen=scen, args=args) + def test_schedule_consistency(self): + """ Test if the optimization returns all rotations even when some filters are active""" + trips_file_name = "trips_for_optimizer.csv" + sched, scen, args = self.basic_run(trips_file_name) + config_path = example_root / "default_optimizer.cfg" + conf = opt_util.read_config(config_path) + + sched_impossible = deepcopy(sched) + # Make a single trip impossible + next(iter(sched_impossible.rotations.values())).trips[0].distance = 99999999 + sched_impossible.calculate_consumption() + scen = sched_impossible.run(args) + + amount_rotations = len(sched_impossible.rotations) + conf.remove_impossible_rotations = True + conf.run_only_oppb = False + opt_sched, opt_scen = run_optimization(conf, sched=sched_impossible, scen=scen, args=args) + assert len(opt_sched.rotations) == amount_rotations + + # set a single rotation to depot + next(iter(sched.rotations.values())).set_charging_type("depb") + # and run again to make everything consistent + scen = sched.run(args) + + amount_rotations = len(sched.rotations) + conf.run_only_oppb = True + opt_sched, opt_scen = run_optimization(conf, sched=deepcopy(sched), scen=scen, args=args) + assert len(opt_sched.rotations) == amount_rotations + + conf.run_only_oppb = False + opt_sched, opt_scen = run_optimization(conf, sched=deepcopy(sched), scen=scen, args=args) + assert len(opt_sched.rotations) == amount_rotations + def test_deep_optimization(self): """ Check if deep analysis finds the prepared optimal solution for the test case. From 9d66a2b7a8fca55b38767f5f49a5d9ddc988e738 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Wed, 9 Aug 2023 18:14:40 +0200 Subject: [PATCH 776/802] shorten path length to avoid problems in Windows --- data/examples/simba.cfg | 3 ++- simba/__main__.py | 4 ++-- simba/report.py | 13 +++++++++---- simba/simulate.py | 7 ++++--- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/data/examples/simba.cfg b/data/examples/simba.cfg index 5930e211..411a4e96 100644 --- a/data/examples/simba.cfg +++ b/data/examples/simba.cfg @@ -3,7 +3,8 @@ # Input file containing trip information (required) input_schedule = data/examples/trips_example.csv # Output files are stored here (defaults to: data/sim_outputs) -output_directory = data/sim_outputs/ +# Attention: In Windows the path-length is limited to 256 characters! +output_directory = data/output/ # Electrified stations (required) electrified_stations = data/examples/electrified_stations.json # Vehicle types (defaults to: ./data/examples/vehicle_types.json) diff --git a/simba/__main__.py b/simba/__main__.py index c1897e32..7a945d29 100644 --- a/simba/__main__.py +++ b/simba/__main__.py @@ -9,9 +9,9 @@ args = util.get_args() time_str = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - args.output_directory = Path(args.output_directory) / (time_str + "_SimBA_results") + args.output_directory = Path(args.output_directory) / time_str # create subfolder for specific sim results with timestamp. - # if folder doesnt exists, create folder. + # if folder doesn't exist, create folder. # needs to happen after set_options_from_config since # args.output_directory can be overwritten by config args.output_directory_input = args.output_directory / "input_data" diff --git a/simba/report.py b/simba/report.py index c88c2ad0..5f3b4459 100644 --- a/simba/report.py +++ b/simba/report.py @@ -119,7 +119,7 @@ def generate_plots(scenario, args): logging.disable(logging.NOTSET) -def generate(schedule, scenario, args): +def generate(schedule, scenario, args, i): """Generates all output files/ plots and saves them in the output directory. :param schedule: Driving schedule for the simulation. @@ -130,13 +130,18 @@ def generate(schedule, scenario, args): :type args: argparse.Namespace """ + # save used modes in report version + used_modes = ['sim'] + [m for m in args.mode[:i] if m not in ['sim', 'report']] + with open(args.results_directory / "used_modes.txt", "w", encoding='utf-8') as f: + f.write(f"Used modes in this scenario: {used_modes}") + # generate simulation_timeseries.csv, simulation.json and vehicle_socs.csv in spiceEV with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) # re-route output paths - args.save_soc = args.results_directory / "vehicle_socs.csv" - args.save_results = args.results_directory / "simulation.json" - args.save_timeseries = args.results_directory / "simulation_timeseries.csv" + args.save_soc = args.results_directory / "v_socs.csv" + args.save_results = args.results_directory / "sim_info.json" + args.save_timeseries = args.results_directory / "sim_ts.csv" generate_reports(scenario, vars(args).copy()) args.save_timeseries = None args.save_results = None diff --git a/simba/simulate.py b/simba/simulate.py index 33e78cd9..c448e474 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -224,7 +224,7 @@ def report(schedule, scenario, args, i): calculate_costs(args.cost_parameters, scenario, schedule, args) # name: always start with sim, append all prior optimization modes create_results_directory(args, i) - report.generate(schedule, scenario, args) + report.generate(schedule, scenario, args, i) return schedule, scenario @@ -236,7 +236,8 @@ def create_results_directory(args, i): :param i: iteration number of loop :type i: int """ - prior_modes = ['sim'] + [m for m in args.mode[:i] if m not in ['sim', 'report']] - report_name = '__'.join(prior_modes) + + prior_reports = sum([m.count('report') for m in args.mode[:i]]) + report_name = "report_1" if prior_reports == 0 else f"report_{prior_reports+1}" args.results_directory = args.output_directory.joinpath(report_name) args.results_directory.mkdir(parents=True, exist_ok=True) From c98e70177878ee2a4301fc04ef06a780a4d98698 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Wed, 9 Aug 2023 18:29:41 +0200 Subject: [PATCH 777/802] added missing docstring param --- simba/report.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/simba/report.py b/simba/report.py index 5f3b4459..cb4c63fa 100644 --- a/simba/report.py +++ b/simba/report.py @@ -128,6 +128,8 @@ def generate(schedule, scenario, args, i): :type scenario: spice_ev.Scenario :param args: Configuration arguments specified in config files contained in configs directory. :type args: argparse.Namespace + :param i: Number representing last used mode in mode chain before report is created. + :type i: int """ # save used modes in report version From 6a480c71ec3f9c5be76491961fe2221d1fd7860f Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 10 Aug 2023 06:29:12 +0200 Subject: [PATCH 778/802] include remove_negative to rtd and remove deprecated file Development progress.md --- Development Progress.md | 40 ---------------------------------------- docs/source/modes.rst | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 41 deletions(-) delete mode 100644 Development Progress.md diff --git a/Development Progress.md b/Development Progress.md deleted file mode 100644 index 3d6dff6d..00000000 --- a/Development Progress.md +++ /dev/null @@ -1,40 +0,0 @@ -# SimBA: Simulation tool for Bus Applications - -## Idea - -This toolbox helps to do bus feasibility studies and answer research questions - -## Tools - -For overview and interfaces of tools see here: -https://miro.com/app/board/o9J_lu8coPI=/ - -### scedule data preparation - -* [X] from VIP to RLI scedule data format -* [ ] from eFlips to RLI scedule data format - -### scedule data analysis - -* [ ] Generate table of rotation distances -* [ ] Ranking by accumulated break time - -### Consumption analysis -* [ ] air conditioning consumption based on weather data - -### SOC analysis -Assumptions: Leave depot fully loaded - -SOC trend for each rotation based on: -* [X] charging locations (OC) -* [X] number of available charging infrastructure (OC) -* [ ] charging characteristics (OC) - -### Charge demand analysis -Generate load profile for each charging location based on SOC analysis - -### Schedule adjustment -* [X] split up rotations with negative SOC -* [X] recombine splitted rotations - -### Charging Location Tool \ No newline at end of file diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 008e8dd2..ed2e798c 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -29,7 +29,7 @@ This results in a simple simulation with a following report. To run a simulation :: - mode = ["sim", "report" ,"neg_depb_to_oppb", "report] + mode = ["sim", "report" ,"neg_depb_to_oppb", "remove_negative", "report] Where the scenario is run as is, a report is generated, the schedule is changed and simulated again and a second report is generated. Descriptions for the modes can be found below. @@ -322,3 +322,16 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci Report ------ The report will generate several files which include information about the expected SoCs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Please refer to :ref:`generate_report` for more detailed information. + +.. _remove_negative: + +Remove negative rotations +------------------------------ + +This mode removes rotations with negative SoCs from the scenario and repeats the simulation. It is called by + +:: + + mode = ["remove_negative"] + +This can be useful as rotations with negative SoCs are not feasible for electrification. If they are included in the scenario, they are nonetheless being charged and contribute to costs, installed infrastructure and electricity demand. \ No newline at end of file From c7a1a8c61474fc9ae007d13cc10b28e0bb84df3a Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 10 Aug 2023 06:32:58 +0200 Subject: [PATCH 779/802] only include trips example with def charging type --- data/examples/trips_example.csv | 130 ++++++++++++++--------------- data/examples/trips_example_ct.csv | 65 --------------- 2 files changed, 65 insertions(+), 130 deletions(-) delete mode 100644 data/examples/trips_example_ct.csv diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 055034de..04f03929 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0 -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9 -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,, -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,, -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,, -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,, -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,, -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,, -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,, -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,, -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,, -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,, -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,, -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,, -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,, -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,, \ No newline at end of file +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading,charging_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0,oppb +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9,oppb +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,,,oppb +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,,,oppb +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,,,oppb +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,,,oppb +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,,,oppb +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,,, \ No newline at end of file diff --git a/data/examples/trips_example_ct.csv b/data/examples/trips_example_ct.csv deleted file mode 100644 index 04f03929..00000000 --- a/data/examples/trips_example_ct.csv +++ /dev/null @@ -1,65 +0,0 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading,charging_type -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0,oppb -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9,oppb -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,,,oppb -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,,,oppb -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,,,oppb -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,,,oppb -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,,,oppb -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,,,oppb -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,,,oppb -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,,,oppb -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,,,oppb -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,,, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,,, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,,, -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,,, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,,, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,,, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,,, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,,, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,,, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,,, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,,, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,,, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,,, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,,, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,,, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,,, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,,, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,,, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,,, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,,, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,,, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,,, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,,, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,,, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,,, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,,, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,,, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,,, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,,, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,,, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,,, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,,, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,,, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,,, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,,, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,,, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,,, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,,, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,,, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,,, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,,, \ No newline at end of file From 449164fce7e499dcdf5beb2c74146afecd55bfca Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 09:11:34 +0200 Subject: [PATCH 780/802] Fix cost table --- docs/source/simba_features.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/simba_features.rst b/docs/source/simba_features.rst index cd959ad0..486be7d5 100644 --- a/docs/source/simba_features.rst +++ b/docs/source/simba_features.rst @@ -94,7 +94,7 @@ As result the following table is saved as CSV: +---------------------------------+----------+-----------------------------------------------------------------------+ |**parameter** | **unit** | **description** | +=================================+==========+=======================================================================+ -|c_vehicles | EUR | Investment costs of all buses | +|c_vehicles | EUR | Investment costs of all buses | +---------------------------------+----------+-----------------------------------------------------------------------+ |c_gcs | EUR | Investment costs of all grid connectors | +---------------------------------+----------+-----------------------------------------------------------------------+ @@ -111,7 +111,7 @@ As result the following table is saved as CSV: |c_invest | EUR | Sum of all investment costs | +---------------------------------+----------+-----------------------------------------------------------------------+ +---------------------------------+----------+-----------------------------------------------------------------------+ -|c_vehicles_annual | EUR/year | Annual investment costs of all buses | +|c_vehicles_annual | EUR/year | Annual investment costs of all buses | +---------------------------------+----------+-----------------------------------------------------------------------+ |c_gcs_annual | EUR/year | Annual investment costs of all grid connectors | +---------------------------------+----------+-----------------------------------------------------------------------+ @@ -128,7 +128,7 @@ As result the following table is saved as CSV: +---------------------------------+----------+-----------------------------------------------------------------------+ |c_maint_infrastructure_annual | EUR/year | Annual maintenance costs of charging stations and stationary storages | +---------------------------------+----------+-----------------------------------------------------------------------+ -|c_maint_vehicles_annual | EUR/year | Annual maintenance costs of buses | +|c_maint_vehicles_annual | EUR/year | Annual maintenance costs of buses | +---------------------------------+----------+-----------------------------------------------------------------------+ |c_maint_stat_storage_annual | EUR/year | Annual maintenance costs of stationary storages | +---------------------------------+----------+-----------------------------------------------------------------------+ From 8f0799733669e2138ad18bf9ff02f78f1e79f2d6 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 10 Aug 2023 09:19:57 +0200 Subject: [PATCH 781/802] move path changes from report to simulate --- simba/report.py | 15 ++++----------- simba/simulate.py | 8 ++++++-- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/simba/report.py b/simba/report.py index cb4c63fa..eec7c135 100644 --- a/simba/report.py +++ b/simba/report.py @@ -119,7 +119,7 @@ def generate_plots(scenario, args): logging.disable(logging.NOTSET) -def generate(schedule, scenario, args, i): +def generate(schedule, scenario, args): """Generates all output files/ plots and saves them in the output directory. :param schedule: Driving schedule for the simulation. @@ -128,22 +128,15 @@ def generate(schedule, scenario, args, i): :type scenario: spice_ev.Scenario :param args: Configuration arguments specified in config files contained in configs directory. :type args: argparse.Namespace - :param i: Number representing last used mode in mode chain before report is created. - :type i: int """ - # save used modes in report version - used_modes = ['sim'] + [m for m in args.mode[:i] if m not in ['sim', 'report']] - with open(args.results_directory / "used_modes.txt", "w", encoding='utf-8') as f: - f.write(f"Used modes in this scenario: {used_modes}") - # generate simulation_timeseries.csv, simulation.json and vehicle_socs.csv in spiceEV with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) # re-route output paths - args.save_soc = args.results_directory / "v_socs.csv" - args.save_results = args.results_directory / "sim_info.json" - args.save_timeseries = args.results_directory / "sim_ts.csv" + args.save_soc = args.results_directory / "vehicle_socs.csv" + args.save_results = args.results_directory / "simulation.json" + args.save_timeseries = args.results_directory / "timeseries.csv" generate_reports(scenario, vars(args).copy()) args.save_timeseries = None args.save_results = None diff --git a/simba/simulate.py b/simba/simulate.py index c448e474..6edbf65b 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -224,7 +224,7 @@ def report(schedule, scenario, args, i): calculate_costs(args.cost_parameters, scenario, schedule, args) # name: always start with sim, append all prior optimization modes create_results_directory(args, i) - report.generate(schedule, scenario, args, i) + report.generate(schedule, scenario, args) return schedule, scenario @@ -238,6 +238,10 @@ def create_results_directory(args, i): """ prior_reports = sum([m.count('report') for m in args.mode[:i]]) - report_name = "report_1" if prior_reports == 0 else f"report_{prior_reports+1}" + report_name = f"report_{prior_reports+1}" args.results_directory = args.output_directory.joinpath(report_name) args.results_directory.mkdir(parents=True, exist_ok=True) + # save used modes in report version + used_modes = ['sim'] + [m for m in args.mode[:i] if m not in ['sim', 'report']] + with open(args.results_directory / "used_modes.txt", "w", encoding='utf-8') as f: + f.write(f"Used modes in this scenario: {', '.join(used_modes)}") From 90bd707f8201e3acbbbf338115fefcb27251534d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 09:53:52 +0200 Subject: [PATCH 782/802] Include review changes --- data/examples/default_optimizer.cfg | 46 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/data/examples/default_optimizer.cfg b/data/examples/default_optimizer.cfg index 04be160a..3693932d 100644 --- a/data/examples/default_optimizer.cfg +++ b/data/examples/default_optimizer.cfg @@ -8,17 +8,17 @@ debug_level = 1 console_level = 99 #SCENARIO -# Use "" for ids and not '' -# these rotations are excluded from optimization. they will not be simulated +# Use "" for ids and not ''. +# These rotations are excluded from optimization. They will not be simulated. exclusion_rots = [] -# these stations are excluded from optimization. optimization will not electrify them +# These stations are excluded from optimization. optimization will not electrify them. exclusion_stations = [] -# optimization will electrify these stations. -# if using inclusion stations, scenario should be rebased +# Optimization will electrify these stations. +# if using inclusion stations, scenario should be rebased. inclusion_stations = [] standard_opp_station = {"type": "opps", "n_charging_stations": null} -# rotations which drop below this value are considered not electrified (default value is 0) +# rotations which drop below this value are considered not electrified (default value is 0). min_soc = 0.05 #OPTIMIZER @@ -31,44 +31,44 @@ solver = quick # Optimization procedure is developed from the input schedule and scenario. If the scenario is changed # through this configuration rebasing should be set to true. This will simulate the scenario again with the -# given settings +# given settings. rebase_scenario = False -# the rebased scenario can be pickled for analysis or repeated use +# The rebased scenario can be pickled for analysis or repeated use. pickle_rebased = False -# the name of this pickle file can be defined here +# The name of this pickle file can be defined here. pickle_rebased_name = "" # Should all rotations be rebased or can rotations which stay above the soc threshold be skipped? run_only_neg = False -# Should only be opportunity vehicles be rebased, since this optimization is not meant for depot chargers -# The depot chargers will be added to the returned schedule in any case +# Should only be opportunity vehicles be rebased, since this optimization is not meant for depot chargers? +# The optimization will return ALL original rotations of the input in all cases. run_only_oppb = True -# number of stations before optimal solution, where branch is checked for pruning +# number of stations before optimal solution, where branch is checked for pruning. pruning_threshold = 3 # Optimization type greedy runs the optimization a single time as greedy as impossible -# Deep repeatedly searches for promising nodes but only new nodes which have not -# been checked before. -# "greedy" or "deep" without "" +# Deep repeatedly searches for promising nodes but only new nodes which have not been checked before. +# "greedy" or "deep" without "". opt_type = greedy -# For Deep optimization only +# For Deep optimization only: +############################# # How should the deep optimization choose the nodes. -# Brute is only recommended in smaller systems -# "step-by-step" or "brute" without "" +# Brute is only recommended in smaller systems. +# "step-by-step" or "brute" without "". node_choice = step-by-step -# How many combinations is the deep method allowed to check +# How many combinations is the deep method allowed to check? max_brute_loop = 300 # Factor with which the potential evaluation is multiplied before comparing it to the missing energy. A low estimation -# threshold will lead to a more conservative approach in dismissing branches +# threshold will lead to a more conservative approach in dismissing branches. estimation_threshold = 0.80 -# Removing impossible rotations leads to a quick calculation estimating if rotations are impossible.impossible +# Removing impossible rotations leads to a quick calculation estimating if rotations are impossible. # If they are deemed as impossible, they are not optimized but discarded during optimization. -# They will be added to the returned schedule in any case. +# The optimization will return ALL original rotations of the input in all cases. remove_impossible_rotations = True -# Check if stations are mandatory for a fully electrified system. If they are, include them +# Check if stations are mandatory for a fully electrified system. If they are, include them. check_for_must_stations = False From 18e1836477e82365f04165a34d40f01449727daf Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 09:54:50 +0200 Subject: [PATCH 783/802] Change check for depb / oppb --- simba/station_optimization.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/simba/station_optimization.py b/simba/station_optimization.py index 72b2d258..833bdba6 100644 --- a/simba/station_optimization.py +++ b/simba/station_optimization.py @@ -1,8 +1,6 @@ """ Optimization that tries minimizing the amount of electrified stations to achieve full electrification. - """ - from copy import deepcopy import json import sys @@ -122,9 +120,9 @@ def run_optimization(conf, sched=None, scen=None, args=None): # filter out depot chargers if option is set if conf.run_only_oppb: optimizer.config.exclusion_rots = optimizer.config.exclusion_rots.union( - r for r in sched.rotations if "depb" in sched.rotations[r].charging_type) + r for r in sched.rotations if "depb" == sched.rotations[r].charging_type) sched.rotations = {r: sched.rotations[r] for r in sched.rotations - if "oppb" in sched.rotations[r].charging_type} + if "oppb" == sched.rotations[r].charging_type} assert len(sched.rotations) > 0, "No rotations left after removing depot chargers" # rebasing the scenario meaning simulating it again with SpiceEV and the given conditions of From d4b781f110cd20857ca5e8dec7981b916b7e0b18 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 10 Aug 2023 10:18:29 +0200 Subject: [PATCH 784/802] pin SpiceEV v1.0.1 --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6ee776d0..63c467b4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ numpy >= 1.12.0 matplotlib --e git+https://github.com/rl-institut/spice_ev.git@master#egg=spice_ev -pandas +-e git+https://github.com/rl-institut/spice_ev.git@v1.0.1#egg=spice_ev +pandas \ No newline at end of file From 1922750fa29bd0aaea111779a68810a9d44342b2 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 10:31:43 +0200 Subject: [PATCH 785/802] Add propage_modes_error for better testing of modes --- simba/simulate.py | 2 ++ tests/test_simulate.py | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/simba/simulate.py b/simba/simulate.py index 33e78cd9..3e20ec99 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -129,6 +129,8 @@ def modes_simulation(schedule, scenario, args): logging.error(msg) logging.error('*'*len(msg)) logging.error(traceback.format_exc()) + if args.propagate_mode_errors: + raise e if scenario is not None and scenario.step_i > 0: # generate plot of failed scenario args.mode = args.mode[:i] + ["ABORTED"] diff --git a/tests/test_simulate.py b/tests/test_simulate.py index 796e140c..896d513f 100644 --- a/tests/test_simulate.py +++ b/tests/test_simulate.py @@ -1,3 +1,4 @@ +import traceback from argparse import Namespace import logging from pathlib import Path @@ -12,7 +13,7 @@ class TestSimulate: - + # Add propagate_mode_errors as developer setting to raise Exceptions. DEFAULT_VALUES = { "vehicle_types": example_path / "vehicle_types.json", "electrified_stations": example_path / "electrified_stations.json", @@ -39,6 +40,7 @@ class TestSimulate: "desired_soc_deps": 1, "min_charging_time": 0, "default_voltage_level": "MV", + "propagate_mode_errors": True, } def test_basic(self): @@ -48,12 +50,16 @@ def test_basic(self): def test_missing(self): # every value in DEFAULT_VALUES is expected to be set, so omitting one should raise an error values = self.DEFAULT_VALUES.copy() + # except propagate_modes_error + del self.DEFAULT_VALUES["propagate_mode_errors"] for k, v in self.DEFAULT_VALUES.items(): del values[k] with pytest.raises(Exception): simulate(Namespace(**values)) # reset values[k] = v + # restore the setting for further testing + self.DEFAULT_VALUES["propagate_mode_errors"] = values["propagate_mode_errors"] # required file missing for file_type in ["vehicle_types", "electrified_stations", "cost_parameters_file"]: @@ -100,6 +106,7 @@ def test_mode_change_charge_type(self): values["ALLOW_NEGATIVE_SOC"] = True simulate(Namespace(**values)) + def test_mode_remove_negative(self): values = self.DEFAULT_VALUES.copy() values["mode"] = "remove_negative" @@ -108,6 +115,10 @@ def test_mode_remove_negative(self): values["ALLOW_NEGATIVE_SOC"] = True simulate(Namespace(**values)) + + + + def test_mode_report(self, tmp_path): # report with cost calculation, write to tmp values = self.DEFAULT_VALUES.copy() From 33b0b434f526223fe70de2490fd71523da564d6d Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 10:56:13 +0200 Subject: [PATCH 786/802] Fix get negative rotations, and change basic_run return --- tests/test_consumption.py | 2 +- tests/test_schedule.py | 22 ++++++++++++++-------- tests/test_util.py | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/tests/test_consumption.py b/tests/test_consumption.py index 7caca24e..5dae0408 100644 --- a/tests/test_consumption.py +++ b/tests/test_consumption.py @@ -14,7 +14,7 @@ def test_calculate_consumption(self, tmp_path): :param tmp_path: pytest fixture to create a temporary path """ - schedule, scenario = TestSchedule().basic_run() + schedule, scenario, _ = TestSchedule().basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) consumption = trip.__class__.consumption consumption.temperatures_by_hour = {hour: hour * 2 - 15 for hour in range(0, 24)} diff --git a/tests/test_schedule.py b/tests/test_schedule.py index 09f7dc09..f98c7092 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -59,7 +59,7 @@ def basic_run(self): args.attach_vehicle_soc = True scen = generated_schedule.run(args) - return generated_schedule, scen + return generated_schedule, scen, args def test_mandatory_options_exit(self): """ @@ -105,7 +105,7 @@ def test_station_data_reading(self): def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned """ - schedule, scen = self.basic_run() + schedule, scen, args = self.basic_run() assert type(scen) is scenario.Scenario def test_assign_vehicles(self): @@ -131,13 +131,15 @@ def test_assign_vehicles(self): def test_calculate_consumption(self): """ Test if calling the consumption calculation works """ + # Changing self.vehicle_types can propagate to other tests + vehicle_types = deepcopy(self.vehicle_types) trip.Trip.consumption = consumption.Consumption( - self.vehicle_types, outside_temperatures=self.temperature_path, + vehicle_types, outside_temperatures=self.temperature_path, level_of_loading_over_day=self.lol_path) path_to_trips = file_root / "trips_assign_vehicles.csv" generated_schedule = schedule.Schedule.from_csv( - path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args) + path_to_trips, vehicle_types, self.electrified_stations, **mandatory_args) # set mileage to a constant mileage = 10 @@ -173,12 +175,16 @@ def test_get_common_stations(self): def test_get_negative_rotations(self): """Check if the single rotation '1' with a negative soc is found """ - # make use of the test_run() which has to return schedule and scenario object - sched, scen = self.basic_run() - + sched, scen, args = self.basic_run() + for rot in sched.rotations.values(): + for t in rot.trips: + t.distance = 0.01 + sched.rotations["1"].trips[0].distance = 9999999 + sched.calculate_consumption() + scen = sched.run(args) neg_rots = sched.get_negative_rotations(scen) - assert '2' in neg_rots + assert ['1'] == neg_rots def test_rotation_filter(self, tmp_path): s = schedule.Schedule(self.vehicle_types, self.electrified_stations, **mandatory_args) diff --git a/tests/test_util.py b/tests/test_util.py index 07fc0b26..e140dfbf 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -49,7 +49,7 @@ def test_get_git_revision_hash(self): assert type(git_hash) is str def test_get_buffer_time(self): - schedule, scenario = TestSchedule().basic_run() + schedule, scenario, _ = TestSchedule().basic_run() trip = next(iter(schedule.rotations.values())).trips.pop(0) util.get_buffer_time(trip) buffer_time = {"10-22": 2, From f71f2359a21f39eddca03d9cdc81e807a061201f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 11:06:29 +0200 Subject: [PATCH 787/802] Refactor basic_run --- tests/test_schedule.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/tests/test_schedule.py b/tests/test_schedule.py index f98c7092..e56be23d 100644 --- a/tests/test_schedule.py +++ b/tests/test_schedule.py @@ -6,6 +6,7 @@ import spice_ev.scenario as scenario from spice_ev.util import set_options_from_config +from simba.simulate import pre_simulation from tests.conftest import example_root, file_root from tests.helpers import generate_basic_schedule from simba import consumption, rotation, schedule, trip, util @@ -33,10 +34,9 @@ class TestSchedule: vehicle_types = util.uncomment_json_file(file) def basic_run(self): - """Returns a schedule and scenario after running SimBA. - :return: schedule, scenario + """Returns a schedule, scenario and args after running SimBA. + :return: schedule, scenario, args """ - path_to_trips = example_root / "trips_example.csv" # set the system variables to imitate the console call with the config argument. # first element has to be set to something or error is thrown sys.argv = ["foo", "--config", str(example_root / "simba.cfg")] @@ -44,22 +44,13 @@ def basic_run(self): args.config = example_root / "simba.cfg" args.days = None args.seed = 5 - - trip.Trip.consumption = consumption.Consumption( - self.vehicle_types, outside_temperatures=self.temperature_path, - level_of_loading_over_day=self.lol_path) - - path_to_all_station_data = example_root / "all_stations.csv" - generated_schedule = schedule.Schedule.from_csv( - path_to_trips, self.vehicle_types, self.electrified_stations, **mandatory_args, - station_data_path=path_to_all_station_data) - set_options_from_config(args, verbose=False) args.ALLOW_NEGATIVE_SOC = True args.attach_vehicle_soc = True - scen = generated_schedule.run(args) - return generated_schedule, scen, args + sched = pre_simulation(args) + scen = sched.run(args) + return sched, scen, args def test_mandatory_options_exit(self): """ @@ -105,7 +96,7 @@ def test_station_data_reading(self): def test_basic_run(self): """ Check if running a basic example works and if a scenario object is returned """ - schedule, scen, args = self.basic_run() + sched, scen, args = self.basic_run() assert type(scen) is scenario.Scenario def test_assign_vehicles(self): From b848042d1bfdcd4854470fe0726606528b824be0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 11:08:20 +0200 Subject: [PATCH 788/802] Make flake8 happy --- simba/simulate.py | 2 ++ tests/test_simulate.py | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/simba/simulate.py b/simba/simulate.py index 3e20ec99..8eefaee2 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -98,6 +98,8 @@ def modes_simulation(schedule, scenario, args): :type args: Namespace :return: final schedule and scenario :rtype: tuple + :raises Exception: If developer setting propagate_mode_errors is set and error occurs during + mode """ if type(args.mode) is not list: # backwards compatibility: run single mode diff --git a/tests/test_simulate.py b/tests/test_simulate.py index 896d513f..c510b5dc 100644 --- a/tests/test_simulate.py +++ b/tests/test_simulate.py @@ -1,4 +1,3 @@ -import traceback from argparse import Namespace import logging from pathlib import Path @@ -106,7 +105,6 @@ def test_mode_change_charge_type(self): values["ALLOW_NEGATIVE_SOC"] = True simulate(Namespace(**values)) - def test_mode_remove_negative(self): values = self.DEFAULT_VALUES.copy() values["mode"] = "remove_negative" @@ -115,10 +113,6 @@ def test_mode_remove_negative(self): values["ALLOW_NEGATIVE_SOC"] = True simulate(Namespace(**values)) - - - - def test_mode_report(self, tmp_path): # report with cost calculation, write to tmp values = self.DEFAULT_VALUES.copy() From 931bc19c5e1c05c1e1707b1e1cc94523c115ddbe Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 11:45:20 +0200 Subject: [PATCH 789/802] Add propagate_mode_errors to args parser --- simba/util.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/simba/util.py b/simba/util.py index 49ed0775..42236d4e 100644 --- a/simba/util.py +++ b/simba/util.py @@ -287,6 +287,9 @@ def get_args(): help='Remove rotations from schedule that violate assumptions. ') parser.add_argument('--show-plots', action='store_true', help='show plots for users to view in "report" mode') + parser.add_argument('--propagate_mode_errors', default=False, + help='Re-raise errors instead of continuing during simulation modes') + # #### Physical setup of environment ##### parser.add_argument('--preferred-charging-type', '-pct', default='depb', choices=['depb', 'oppb'], help="Preferred charging type. Choose one\ @@ -348,7 +351,7 @@ def get_args(): nargs=2, default=[], action='append', help='append additional argument to price signals') parser.add_argument('--optimizer_config', default=None, - help="For station_optimization a optimizer_config is needed. \ + help="For station_optimization an optimizer_config is needed. \ Input a path to an .cfg file or use the default_optimizer.cfg") parser.add_argument('--config', help='Use config file to set arguments') From b1d493ac7ffc37e9ab9079049eedae988c97673f Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 10 Aug 2023 11:46:03 +0200 Subject: [PATCH 790/802] adjust remove negative description --- docs/source/modes.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index ed2e798c..62268044 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -16,6 +16,7 @@ different modes support the user in finding optimal solutions for their eBus-Sys * service optimization * station optimization * report +* remove negative rotations Chained Modes ------------- @@ -328,7 +329,7 @@ The report will generate several files which include information about the expec Remove negative rotations ------------------------------ -This mode removes rotations with negative SoCs from the scenario and repeats the simulation. It is called by +This mode removes rotations with negative SoCs from the schedule and repeats the simulation. It is called by :: From eef5ecedb60e4aeb049413caf282df94b135d590 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 11:52:07 +0200 Subject: [PATCH 791/802] Change underscores to dashes --- simba/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simba/util.py b/simba/util.py index 42236d4e..915159a6 100644 --- a/simba/util.py +++ b/simba/util.py @@ -287,7 +287,7 @@ def get_args(): help='Remove rotations from schedule that violate assumptions. ') parser.add_argument('--show-plots', action='store_true', help='show plots for users to view in "report" mode') - parser.add_argument('--propagate_mode_errors', default=False, + parser.add_argument('--propagate-mode-errors', default=False, help='Re-raise errors instead of continuing during simulation modes') # #### Physical setup of environment ##### From 4e6e4f71491a24edc8c117003ddf5c785e46150c Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Thu, 10 Aug 2023 12:16:29 +0200 Subject: [PATCH 792/802] renamed output files --- simba/report.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/simba/report.py b/simba/report.py index eec7c135..f34a19b5 100644 --- a/simba/report.py +++ b/simba/report.py @@ -130,13 +130,13 @@ def generate(schedule, scenario, args): :type args: argparse.Namespace """ - # generate simulation_timeseries.csv, simulation.json and vehicle_socs.csv in spiceEV + # generate simulation_timeseries.csv, simulation.json and vehicle_socs.csv in SpiceEV with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) # re-route output paths - args.save_soc = args.results_directory / "vehicle_socs.csv" - args.save_results = args.results_directory / "simulation.json" - args.save_timeseries = args.results_directory / "timeseries.csv" + args.save_soc = args.results_directory / "socs.csv" + args.save_results = args.results_directory / "info.json" + args.save_timeseries = args.results_directory / "ts.csv" generate_reports(scenario, vars(args).copy()) args.save_timeseries = None args.save_results = None From 17663ebb1e515cf2557988174ee24ed3666aa63b Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 12:23:29 +0200 Subject: [PATCH 793/802] Fix numref which was not working --- docs/source/getting_started.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 9a71cce1..2aa9c3ce 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -51,6 +51,8 @@ SimBA is designed as a toolbox, so the specific use can be adapted to the users :alt: figure_simba_modules :width: 600 + Overview of SimBA modules. + :numref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. Modules of SimBA From deef4b94e62b8c23ed27b21491d1dd9f1f201b5e Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Thu, 10 Aug 2023 13:15:38 +0200 Subject: [PATCH 794/802] rename vehicle_socs --- simba/report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simba/report.py b/simba/report.py index f34a19b5..38329508 100644 --- a/simba/report.py +++ b/simba/report.py @@ -134,7 +134,7 @@ def generate(schedule, scenario, args): with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) # re-route output paths - args.save_soc = args.results_directory / "socs.csv" + args.save_soc = args.results_directory / "vehicle_socs.csv" args.save_results = args.results_directory / "info.json" args.save_timeseries = args.results_directory / "ts.csv" generate_reports(scenario, vars(args).copy()) From 6b95231b3133bb590a2c63ed655b2fcf90e94d76 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 13:36:08 +0200 Subject: [PATCH 795/802] Change docstring and exception raise according to review --- simba/simulate.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/simba/simulate.py b/simba/simulate.py index 8eefaee2..e1b5a506 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -98,8 +98,7 @@ def modes_simulation(schedule, scenario, args): :type args: Namespace :return: final schedule and scenario :rtype: tuple - :raises Exception: If developer setting propagate_mode_errors is set and error occurs during - mode + :raises Exception: if args.propagate_mode_errors is set, re-raises error instead of continuing """ if type(args.mode) is not list: # backwards compatibility: run single mode @@ -126,13 +125,13 @@ def modes_simulation(schedule, scenario, args): schedule, scenario = func(schedule, scenario, args, i) logging.debug("Finished mode " + mode) except Exception as e: + if args.propagate_mode_errors: + raise msg = f"{e.__class__.__name__} during {mode}: {e}" logging.error('*'*len(msg)) logging.error(msg) logging.error('*'*len(msg)) logging.error(traceback.format_exc()) - if args.propagate_mode_errors: - raise e if scenario is not None and scenario.step_i > 0: # generate plot of failed scenario args.mode = args.mode[:i] + ["ABORTED"] From 084f1e1faa4850ba38b75efaee5f32bd92c01544 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Thu, 10 Aug 2023 14:05:22 +0200 Subject: [PATCH 796/802] adapt rtd to shorten path lengths --- docs/source/simba_features.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/source/simba_features.rst b/docs/source/simba_features.rst index 486be7d5..1e46878a 100644 --- a/docs/source/simba_features.rst +++ b/docs/source/simba_features.rst @@ -33,7 +33,7 @@ The charging simulation is carried out in the open source software `SpiceEV Date: Thu, 10 Aug 2023 14:11:07 +0200 Subject: [PATCH 797/802] minor rtd change --- docs/source/simba_features.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/simba_features.rst b/docs/source/simba_features.rst index 1e46878a..45e58995 100644 --- a/docs/source/simba_features.rst +++ b/docs/source/simba_features.rst @@ -33,7 +33,7 @@ The charging simulation is carried out in the open source software `SpiceEV Date: Thu, 10 Aug 2023 14:25:42 +0200 Subject: [PATCH 798/802] Add readthedocs.yaml --- .readthedocs.yaml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..6c22691f --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,17 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +sphinx: + configuration: docs/source/conf.py + +python: + install: + - requirements: docs/docs_requirements.txt \ No newline at end of file From 594424d432ec3c8e23680ac9416a65730ee06556 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 14:35:03 +0200 Subject: [PATCH 799/802] Change figure to image --- docs/source/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 7a8f2bb6..2d0213b7 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -4,10 +4,11 @@ contain the root `toctree` directive. .. _figure_SimBA_logo: -.. figure:: _static/SimBA_Logo.png +.. image:: _static/SimBA_Logo.png :alt: SimBA_Logo :width: 200 + Welcome to the SimBA documentation! =================================== From 1e06d9a8baca596d5e538d4e9584587215f8ff73 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 14:55:53 +0200 Subject: [PATCH 800/802] Change requirements name --- .readthedocs.yaml | 4 ++-- docs/{docs_requirements.txt => requirements.txt} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/{docs_requirements.txt => requirements.txt} (100%) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 6c22691f..94be8af7 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -13,5 +13,5 @@ sphinx: configuration: docs/source/conf.py python: - install: - - requirements: docs/docs_requirements.txt \ No newline at end of file + install: + - requirements: docs/requirements.txt \ No newline at end of file diff --git a/docs/docs_requirements.txt b/docs/requirements.txt similarity index 100% rename from docs/docs_requirements.txt rename to docs/requirements.txt From c93bc74a05835f1735e5f758a91fdf0c3de4b66f Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 15:00:39 +0200 Subject: [PATCH 801/802] Remove link for logo --- docs/source/index.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 2d0213b7..5512b432 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,7 +3,6 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -.. _figure_SimBA_logo: .. image:: _static/SimBA_Logo.png :alt: SimBA_Logo :width: 200 From 34619a65eaf66b3ffcd4a85131da4788360a0ffc Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Thu, 10 Aug 2023 15:08:00 +0200 Subject: [PATCH 802/802] Add readthedocs url and logo to md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 481121c1..5330ce34 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ +![alt text](https://github.com/rl-institut/SimBA/blob/dev/docs/source/_static/SimBA_logo.png?raw=true) # SimBA: Simulation toolbox for Bus Applications SimBA - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. -Please refer to the documentation for further information: - -***LINK TO READ THE DOCS*** +Please refer to the [Documentation](https://rli-simba.readthedocs.io/en/latest/) for further information. \ No newline at end of file

U1IdyzvZDDQ85CRz#JIXVKlR5t9KmC`rDa| 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/2023_06_08_eBus-Toolbox Logo.png b/docs/source/_static/SimBA_logo.png similarity index 100% rename from docs/source/_static/2023_06_08_eBus-Toolbox Logo.png rename to docs/source/_static/SimBA_logo.png diff --git a/docs/source/_static/SimBA_module_overview.png b/docs/source/_static/SimBA_module_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5ecfaab9df4a3e92d5c226ca9d6854407f66c071 GIT binary patch literal 59991 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 S_$J~DQtavK=d#Wzp$Pz?P0GLk literal 0 HcmV?d00001 diff --git a/docs/source/_static/methodology_overview.png b/docs/source/_static/methodology_overview.png deleted file mode 100644 index af8dc284019cfaed1c585b0811d80470e89b5616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64639 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 diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index d27ad025..2106313d 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -1,10 +1,8 @@ -.. image:: https://user-images.githubusercontent.com/104760879/217226792-4297d3c8-8a7c-45ad-894f-5efd03031f49.png - :alt: ebus_toolbox_logo - Getting Started =============== -This toolbox was designed to analyze and optimize electrified bus fleets. +SimBa - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. +It be used for locating and dimensioning charging infrastructure, dimensioning buses, analyzing the feasibility of electrification of trips and circulations, determining charging strategies, and calculating investments and costs. .. Without creating links like in the line below, subpages go missing from the sidebar @@ -12,15 +10,13 @@ This toolbox was designed to analyze and optimize electrified bus fleets. Installation ------------ -To try it out, first clone `this repository `_ and then install the required packages to your current environment by running - - +To try it out, first clone `this repository `_ and then install the required packages to your current python environment by running ``pip install -r requirements.txt`` Now you can start the eBus Toolbox module with all configurations stored at `data/configs/ebus_toolbox.cfg` via the command -``python -m ebus_toolbox --config data/configs/ebus_toolbox.cfg`` +``python -m ebus_toolbox --config data/examples/ebus_toolbox.cfg`` The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. @@ -30,20 +26,40 @@ To run SimBA with your own `schedule.csv` (see :ref:`schedule`)) file and defaul Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. +Usage with PyCharm +################## + +To use SimBa with PyCharm, create a new python (>= 3.7) environment and clone this repository. Then go to File -> Settings -> project in PyCharm and set Python of the newly created environment as interpreter and the local SimBA repository as project root. Now install the required packages by running in the Terminal: + +``pip install -r requirements.txt`` + +Now add a new "run/debug configuration" with the following information: + +| module name: ``SimBA`` +| Parameters: ``--config data/examples/ebus_toolbox.cfg`` +| Working directory: ``Path\to\local\SimBa`` +| Run with Python Console: true + +Now you can run the scenario specified in the conif usin PyCharm. General Concept --------------- -At the current stage several functionalities are implemented. The base simulation processes a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and runs it through a module called SpiceEV for an in-depth SOC analysis. -Other modes can alter bus types from depot to opportunity chargers, optimize sets of rotations to increase electrification or suggest stations for electrification by minimizing the amount of stations needed. You can learn more about the modes :ref:`here ` +SimBA is designed as a toolbox, so the specific use can be adapted to the users needs. Its core functionality is to run scenariobased simulations. A scenario is defined by a set of input files. Next to the simulation mode, several optimization modes exist, that can be linked and executed consecutively. -.. _figure_ebus_toolbox_modules: -.. figure:: _static/methodology_overview.png - :alt: ebus_toolbox_modules +.. _figure_simba_modules: +.. figure:: _static/SimBA_module_overview.png + :alt: figure_simba_modules :width: 600 - Modules of the SimBA + Modules of SimBA + +:ref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. + +Depending on the given simulation parameters, the vehicles are then dispatched. In this step, every rotation – the sum of all trips between leaving the depot until return – is allocated to a specific vehicle. The vehicles can be charged at any number of :ref:`electrified_stations`. These can be classified either as depot stations (deps) or as opportunity stations (opps). Each vehicle can be charged following one of the two charging strategies: Either as opportunity charging bus (oppb) or as depot charging bus (depb). While an oppb is charged at both deps and opps, depb are only charged at deps. The charging strategy can either be defined for each rotation in the :ref:`schedule` data or for all not explicitly defined rotations using the "preferred charging type" option in the :ref:`config`. Using this information, the charging simulation is then carried out. + +As a result of each simulation the energy demand at each electrified station, the development of vehicles SoCs (State of Charge), summaries of all rotations, estimated costs for vehicles, infrastructure and operationand further data can be displayed and saved. Some information can also be plotted, an example can be seen in :numref:`ebus_toolbox_default_plot`. -:numref:`figure_ebus_toolbox_modules` shows how the different modules work together to calculate the scenario. Optionally different optimizations can be used or even chained together. The output of the simulation is locally saved and consists of the vehicle socs, summaries for each rotation, estimated costs for vehicles, infrastructure and operation as well as station specific electric loads, utilization rates and other key performance indicators. Some of them can be plotted automatically and can be seen in :numref:`ebus_toolbox_default_plot` +In case an optimization is carried out, the results are then analyzed, the optimizer adapts the input data and parameters and starts the process again with the trip consumption analysis. In which order and for what purpose the individual modules are executed is mainly defined using the different modes. These modes can be used to manipulate the defined scenario e.g. by altering bus types from depot to opportunity chargers, optimize sets of rotations to increase electrification or suggest stations for electrification by minimizing the amount of stations needed. You can learn more about the modes :ref:`here `. .. _ebus_toolbox_default_plot: .. figure:: _static/run_overview.png @@ -52,4 +68,33 @@ Other modes can alter bus types from depot to opportunity chargers, optimize set Default output plot for a single simulation. -More text +Specific modules +---------------- + +Consumption analysis +#################### + +.. _vehicle_dispatch: + +Vehicle Dispatch +################ + +Charging simulation +################### + +Generate report +############### + +Optimization +############ + +.. _consistency_check: + +Consistency check +################# + + +.. _rotation_filter: + +Rotation filter +############### diff --git a/docs/source/index.rst b/docs/source/index.rst index c7f22957..aa48d553 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -4,14 +4,14 @@ contain the root `toctree` directive. .. _figure_SimBA_logo: -.. figure:: _static/2023_06_08_eBus-Toolbox Logo.png - :alt: ebus_toolbox_logo - :width: 600 +.. figure:: _static/SimBA_Logo.png + :alt: SimBA_Logo + :width: 200 Welcome to SimBA's documentation! ============================================ -This toolbox was designed to analyze and optimize electrified bus fleets. +SimBa - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. .. toctree:: :maxdepth: 3 diff --git a/docs/source/modes.rst b/docs/source/modes.rst index dc053336..0d818703 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -36,6 +36,11 @@ can be found below. Simple Simulation ----------------- + +:: + + mode = ["sim"] + The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started`. Every chain of modes starts with a simple simulation, even if it is not explicitly listed in the modes. The simulation takes the scenario as is. No parameters will be adjusted, optimized or changed in any way. The charging type for each vehicle is read from the rotation information from the trips.csv if this data is included. If the data is not included *preferred_charging_type* from the config file is used, as long as the provided vehicles data provides the preferred_charging_type for the specified vehicle type. @@ -47,9 +52,9 @@ This mode is the first kind of optimization provided by SimBA and is called by: mode = ["neg_depb_to_oppb"] -It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to depot chargers. +It takes the results of the previous simulation, and changes the charging type of all rotations which had a negative SoC to opportunity chargers. -.. note:: Charging types are only switched by SimBA if the corresponding vehicle type as depot charger exists in the provided vehicles_data.json. +.. note:: Charging types are only switched by SimBA if the corresponding vehicle type as opportunity charging bus exists in the provided vehicles_data.json. @@ -62,13 +67,13 @@ This mode is the second kind of optimization provided by SimBA and is called by mode = ["neg_oppb_to_depb"] -It takes the results of the previous simulation, attains all rotations which had a negative soc, and changes their vehicle type to opportunity chargers. +It takes the results of the previous simulation, and changes the charging type of all rotations which had a negative SoC to depot charging. -.. note:: Charging types are only switched by SimBA if the corresponding vehicle type as opportunity charger exists in the provided vehicles_data.json. +.. note:: Charging types are only switched by SimBA if the corresponding vehicle type as depot charging bus exists in the provided vehicles_data.json. Service Optimization -------------------- -This mode finds the largest set of rotations that results in no negative SoC. This is done by first taking all rotations that do become negative and finding their dependent rotations, i.e., ones that can have an influence by sharing a station earlier with the negative rotation. Next, all rotations are filtered out that stay negative when running with just their dependent rotations. +It can happen that several busses influence each other while simulataiously charging at the same charging station, e.g. due to limited grid power or limited number of charging stations, which can lead to negative SoCs due to hindered charging. In this case, this mode finds the largest set of rotations that results in no negative SoC. This is done by first taking all rotations that do become negative and finding their dependent rotations, i.e., ones that can have an influence by sharing a station earlier with the negative rotation. Next, all rotations are filtered out that stay negative when running with just their dependent rotations. Now, only rotations are left that are non-negative when viewed alone, but might become negative when run together. To find the largest subset of non-negative rotations, all possible set combinations are generated and tried out. When a union of two rotation-sets is non-negative, it is taken as the basis for new possible combinations. In the end, the largest number of rotations that produce a non-negative result when taken together is returned as the optimized scenario. @@ -99,18 +104,18 @@ The network with no opportunity charging station is first analyzed to find rotat Steps of the optimization loop until full electrification is reached. -After a single simulation is run the rotations are analyzed. Any time a vehicle goes below an soc of zero (or a self defined value) a low soc event is triggered. This event saves information about when the soc reached its minimal value and the history before that up to a point of an upper soc threshold, with the default value being 1. Stations inside of this time span are potentially able to mitigate the low soc and are stored with other information about the event. :numref:`low_soc_event` shows a possible soc history with a low soc event. +After a single simulation is run the rotations are analyzed. Any time a vehicle goes below an SoC of zero (or a self defined value) a low SoC event is triggered. This event saves information about when the SoC reached its minimal value and the history before that up to a point of an upper SoC threshold, with the default value being 1. Stations inside of this time span are potentially able to mitigate the low SoC and are stored with other information about the event. :numref:`low_soc_event` shows a possible SoC history with a low SoC event. .. _low_soc_event: .. figure:: https://user-images.githubusercontent.com/104760879/217225588-abfad83d-9d2a-463a-8597-584e29f5f885.png :width: 600 :alt: below_0_soc_event - Low soc event and classification of stations. + Low SoC event and classification of stations. -The next step groups low soc events based on the stations which were found earlier. Events which share at least one station could possibly interact with each other, e.g. vehicles could share a charging station. Therefore groups are build which do not share any stations in between groups. This speeds up the optimization process since for every electrification and simulation only rotations are calculated which could be impacted by the change. +The next step groups low SoC events based on the stations which were found earlier. Events which share at least one station could possibly interact with each other, e.g. vehicles could share a charging station. Therefore groups are build which do not share any stations in between groups. This speeds up the optimization process since for every electrification and simulation only rotations are calculated which could be impacted by the change. -Since greedy approaches execute the step which seems most promising in the current situation an evaluation function is needed. One possible approach could be to simulate each scenario, meaning simulating every case in which one of all possible stations is electrified and continuing with the best case. The optimizer does not use this approach. Instead an approximation function is used to evaluate the potential of electrifying a station. This approximation function analyzes the duration at each stop, the possible charging time, the soc and resulting possible charging power (battery with high socs are charged at a lower rate) as well as the upper soc threshold and minimal soc of the event. While this methodology is not accurate in all cases, e.g. a station could exist multiple times inside of a low soc event, therefore charging the first time at this station would alter the soc and charging power the vehicle has the second time it reaches the station, it seems well suited as heuristic for choosing the most promising station. The objective function of choosing what the *best* station is, is the mitigation of missing charge, i.e. what is the minimal amount of energy that needs to be inserted into the battery, so that no soc is below 0. +Since greedy approaches execute the step which seems most promising in the current situation an evaluation function is needed. One possible approach could be to simulate each scenario, meaning simulating every case in which one of all possible stations is electrified and continuing with the best case. The optimizer does not use this approach. Instead an approximation function is used to evaluate the potential of electrifying a station. This approximation function analyzes the duration at each stop, the possible charging time, the SoC and resulting possible charging power (battery with high SoCs are charged at a lower rate) as well as the upper SoC threshold and minimal SoC of the event. While this methodology is not accurate in all cases, e.g. a station could exist multiple times inside of a low SoC event, therefore charging the first time at this station would alter the SoC and charging power the vehicle has the second time it reaches the station, it seems well suited as heuristic for choosing the most promising station. The objective function of choosing what the *best* station is, is the mitigation of missing charge, i.e. what is the minimal amount of energy that needs to be inserted into the battery, so that no SoC is below 0. After the evaluation selected a station to be electrified the scenario input data is altered so that vehicles at this station are charged without limitation of charging points. This is followed up by a detailed simulation which can make use of a highly accurate solver for charging events called *SpiceEV* or a less accurate but faster solver. Now the resulting system has less missing charge and the potentials of stations might be decreased. Also a single group might have been split up into several smaller groups which can be analyzed even quicker. Therefore the loop repeats up until the point the missing charge in the system is zero or in other words the system is fully electrified. @@ -118,7 +123,7 @@ At the current stage the scenario to be optimized needs depot charging stations Deep Optimization #################### -The greedy algorithm in the base optimization can not guarantee that the solution is the global optimum. This is why the use of the *deep* mode is recommended for systems with high requirements. After the first run, instead of electrifying the station with the highest potential the second best station is electrified. This is similar to a decision tree, where every node is a set of electrified stations, with the first node being zero stations electrified and the last node being all stations electrified. The nodes in between correlate with every possible state of electrification. Each branch therefore represents an additional electrification of a single station. . The algorithm continues electrifying the best station, as long as this node has not been evaluated yet. This way gradually all possible nodes are checked. The search stops whenever the number of stations surpasses the number of the current optimal solution. If several options with the same optimal number of stations arise, they can be found in the log file of the optimizer, but only one file with optimized stations is produced. +The greedy algorithm in the base optimization can not guarantee that the solution is the global optimum. This is why the use of the *deep* mode is recommended for systems with high requirements. After the first run, instead of electrifying the station with the highest potential the second best station is electrified. This is similar to a decision tree, where every node is a set of electrified stations, with the first node being zero stations electrified and the last node being all stations electrified. The nodes in between correlate with every possible state of electrification. Each branch therefore represents an additional electrification of a single station. The algorithm continues electrifying the best station, as long as this node has not been evaluated yet. This way gradually all possible nodes are checked. The search stops whenever the number of stations surpasses the number of the current optimal solution. If several options with the same optimal number of stations arise, they can be found in the log file of the optimizer, but only one file with optimized stations is produced. **Pruning** is used to stop evaluation of branches, whenever foresight predicts that no better solution will be reached. This is done through the simple heuristic of checking the sum of potential of the n remaining stations with the highest potentials, with n being the number until the number of stations of the current optimal solution is reached. @@ -158,14 +163,14 @@ This concept can reduce the amount of nodes which have to be checked. Other Optimization Functionality ################################### -**Mandatory stations** can be attained to increase the optimization process. Mandatory stations are defined by being stations which are needed for a fully electrified system. To check if a station *Y* is a mandatory station can be easily attained by simulating the network with every station electrified except *Y*. If the system has vehicle socs which drop below the minimal soc (default value is 0) in this scenario, the station is mandatory. In the later exploration of best combinations of stations this station will be included in any case. +**Mandatory stations** can be attained to increase the optimization process. Mandatory stations are defined by being stations which are needed for a fully electrified system. To check if a station *Y* is a mandatory station can be easily attained by simulating the network with every station electrified except *Y*. If the system has vehicle SoCs which drop below the minimal SoC (default value is 0) in this scenario, the station is mandatory. In the later exploration of best combinations of stations this station will be included in any case. **Impossible rotations** are rotations which given the settings are not possible to be run as opportunity chargers, given the vehicle properties, even when every station is electrified. Before starting an optimization it is recommended to remove these rotations from the optimization, since the optimizer will not reach the goal of full electrification. **Quick solver** -Instead of using the regular SpiceEV solver for optimization the user can also choose the *quick* solver. This approximates the soc history of a vehicle by straight manipulation of the soc data and numeric approximations of the charged energy. Therefore small differences between solving a scenario with SpiceEV and the quick solver exist. For the quick solver to work, some assumptions have to be met as well +Instead of using the regular SpiceEV solver for optimization the user can also choose the *quick* solver. This approximates the SoC history of a vehicle by straight manipulation of the SoC data and numeric approximations of the charged energy. Therefore small differences between solving a scenario with SpiceEV and the quick solver exist. For the quick solver to work, some assumptions have to be met as well -* Depots charge the vehicles to 100% soc +* Depots charge the vehicles to 100% SoC * Station electrification leads to unlimited charging points * Base scenario has no electrified opportunity stations * No grid connection power restrictions @@ -235,7 +240,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci - Optimizer overwrites vehicle battery capacities with this value. If the line is commented out or the value is 0, no overwriting takes place * - charging_curve - [] - - [[soc1, power1], [soc2, power2] ….] with soc between 0-1 and power as positive float value + - [[soc1, power1], [soc2, power2] ….] with SoC between 0-1 and power as positive float value - Optimizer overwrites vehicle charging curve with this value. If the line is commented out or the value is [], no overwriting takes place * - charging_power - 0 @@ -244,7 +249,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci * - min_soc - 0 - 0 to 1 - - Optimizer uses this value as lower SOC threshold, meaning vehicles with socs below this value need further electrification + - Optimizer uses this value as lower SoC threshold, meaning vehicles with SoCs below this value need further electrification * - solver - spiceev - [quick, spiceev] @@ -264,7 +269,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci * - run_only_neg - False - [True, False] - - Should all rotations be rebased or can rotations which stay above the soc threshold be skipped? + - Should all rotations be rebased or can rotations which stay above the SoC threshold be skipped? * - run_only_oppb - False - [True, False] @@ -292,7 +297,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci * - remove_impossible_rotations - False - [True, False] - - Discard rotations which have socs below the threshold, even when every station is electrified + - Discard rotations which have SoCs below the threshold, even when every station is electrified * - check_for_must_stations - True - [True, False] @@ -315,11 +320,11 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci - If reduce_rotations is True, only the list of these rotations is optimized. Report -------------- -The report will generate several files which include information about the expected socs, power loads at the charging stations or depots, default plots for the scenario and other useful data. +------ +The report will generate several files which include information about the expected SoCs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Default outputs -################################### +############### | **Grid Connector Overview (gc_overview.csv)** | Contains information about charging stations, including their names, types, maximum power, maximum number of charging stations, total energy usage, and use factors for the least, second least, and third least utilized charging stations. @@ -328,26 +333,27 @@ Default outputs | Time series of power flow in kW for every grid connector | **Rotation SoC Data (rotation_socs.csv)** -| Time series of soc for each rotation. +| Time series of SoC for each rotation. | **Vehicle SoC Data (vehicle_socs.csv)** -| Time series of soc for each vehicle. +| Time series of SoC for each vehicle. | **Rotation Summary (rotation_summary.csv)** -| Contains data related to the rotation of vehicles, including the start and end times of each rotation, the type and ID of the vehicle, the depot name, the lines the vehicle traveled, total energy consumption in kWh, distance traveled in m, and various charging-related metrics such as charging type and soc at arrival, minimum soc and if the rotation had negative soc values. +| Contains data related to the rotation of vehicles, including the start and end times of each rotation, the type and ID of the vehicle, the depot name, the lines the vehicle traveled, total energy consumption in kWh, distance traveled in m, and various charging-related metrics such as charging type and SoC at arrival, minimum SoC and if the rotation had negative SoC values. | **Overview Plots (run_overview.pdf and run_overview.png)** -| Contains plots for socs for every vehicle, power at each charging station, batteries, external loads and feed-ins as well as price time series for each station. +| Contains plots for SoCs for every vehicle, power at each charging station, batteries, external loads and feed-ins as well as price time series for each station. | **Station Data Summary (simulation_station_xy.json)** -| Contains information about the simulation interval, grid connector, photovoltaics, charging strategy, average flexible power range per time window, total drawn energy from the grid, average duration of standing events, maximum drawn power, total energy fed into the grid, maximum stored energy in each battery, number of load cycles for stationary batteries and vehicles, and number of times vehicle soc was below the desired soc on departure. +| Contains information about the simulation interval, grid connector, photovoltaics, charging strategy, average flexible power range per time window, total drawn energy from the grid, average duration of standing events, maximum drawn power, total energy fed into the grid, maximum stored energy in each battery, number of load cycles for stationary batteries and vehicles, and number of times vehicle SoC was below the desired SoC on departure. | **Station Data Time Series (simulation_timeseries_station_xy.csv)** | Contains station specific time series including price of electricity, grid supply, fixed loads, battery power, energy stored in battery, flex band boundaries, battery feed, charging station power use, occupied charging stations and charging stations in use as well as vehicles which are at the station. .. _cost_calculation: + Cost calculation -################################### +################ | **Cost calculation (summary_vehicles_costs.csv)** | This is an optional output which calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. | The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV `_ for the calculation of electricity costs. diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index 7e4399b4..78a63d87 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -10,11 +10,150 @@ in detail in the following subsections as well as their default parameters. When providing the user defined input files, the user should make sure the files are either 'utf-8' encoded or not contain regional characters. +.. _config: + Configuration ------------- -The configuration file config.cfg is provided as example in ./examples/ and provides the user with most of the functionality surrounding the settings and boundary conditions of a simulation. The example contains parameter descriptions which are explained here in more detail: +The configuration file config.cfg is provided as example in ./examples/ and provides the user with most of the functionality surrounding the settings and boundary conditions of a simulation. The config file is divided into several sections: + +| Paths: Here all in- and output paths are defined +| Modes: Here the modes of execution can be defined +| Flags: Here, optional functionality can be activated or deactivated +| Physical setup of environment: Here, the physical setup is characterized +| Simulation Parameters: The simulation can be adjusted using these paramteres + +The example (data/simba.cfg) contains parameter descriptions which are explained here in more detail: + +.. list-table:: config.cfg parameters + :header-rows: 1 + + * - Parameter + - Default value + - Expected values + - Description + * - input_schedule + - Mandatory: no default given + - path as string + - Input file containing :ref:`schedule` information + * - output_directory + - data/sim_outputs + - path as string + - Output files are stored here + * - electrified_stations + - ./data/examples/vehicle_types.json + - path as string + - Path to Electrified stations data + * - vehicle_types + - ./data/examples/vehicle_types.json + - path as string + - Path to :ref:`vehicle_types` + * - station_data_path + - Optional: no default given + - path as string + - Path to :ref:`station_geo_data` + * - outside_temperature_over_day_path + - Optional: no default given + - path as string + - Path to :ref:`temperature_data` + * - level_of_loading_over_day_path + - Optional: no default given + - path as string + - Path to :ref:`level_of_loading` + * - cost_parameters_file + - Optional: no default given + - path as string + - Path to :ref:`cost_params` + * - mode + - ['sim', 'report'] + - List of modes is any order in range of ['sim', 'neg_depb_to_oppb', 'neg_oppb_to_depb', 'service_optimization', 'report'] + - The order of :ref:`sim_modes` is defined here + * - cost_calculation + - false + - Boolean + - Activates the :ref:`cost_calculation` + * - check_rotation_consistency + - false + - Boolean + - Activates the :ref:`consistency_check` + * - skip_inconsistent_rotations + - false + - Boolean + - If check_rotation_consistency is active, rotations that don't comply with the checked assumtions are removed from the schedule if skip_inconsistent_rotations is set true + * - show_plots + - false + - Boolean + - If activated, plots are displayed with every run of :ref:`report` mode + + * - preferred_charging_type + - depb + - depb, oppb + - All rotations that have no specification of charging type in :ref:`Schedule` are assigned the charging type defined here + * - gc_power_opps + - 100000 + - Numeric + - Default max power [kW] of grid connectors at opportunity charging stations, Individual gc_power per gc can be defined in :ref:`electrified_stations` + * - gc_power_deps + - 100000 + - Numeric + - Default max power [kW] of grid connectors at depot charging stations, Individual gc_power per gc can be defined in :ref:`electrified_stations` + * - cs_power_opps + - 300 + - Numeric + - Default max power [kW] of opportunity charging stations + * - cs_power_deps_depb + - 300 + - Numeric + - Default max power [kW] of depot charging stations for depot charging busses. Individual cs_power per gc and cs type can be defined in :ref:`electrified_stations` + * - cs_power_deps_oppb + - 300 + - Numeric + - Default max power [kW] of depot charging stations for opportunity charging busses. Individual cs_power per gc and cs type can be defined in :ref:`electrified_stations` + * - desired_soc_deps + - 1 + - 0...1 + - Minimum allowed state of charge when leaving a depot station after charging. Also used to initialize the vehicles SoCs at the beginning of the simulation. + * - desired_soc_opps + - 1 + - 0...1 + - Minimum allowed state of charge when leaving an opportunity station after charging + * - min_recharge_deps_oppb + - 1 + - 0...1 + - This value is used to calculate the minimum standing time of opportunity charging busses at the depot, which is needed for the :ref:`vehicle_dispatch` + * - min_recharge_deps_depb + - 1 + - 0...1 + - This value is used to calculate the minimum standing time of depot charging busses at the depot, which is needed for the :ref:`vehicle_dispatch` + * - min_charging_time + - 0 + - Numeric + - Only stops that are longer than the time defined here are used for charging + * - default_buffer_time_opps + - 0 + - Numeric or dict e.g. {"10-22": 5, "else": 2} (else clause is a must if using the dict definition) + - The buffer time is deducted off of the planned standing time at each opportunity station. It can be used to model things like delays and/or docking procedures. This value is used if no specific buffer is defined per station in :ref:`electrified_stations`. It can either be given as constant or depending on the time of the day using a dict. + * - default_voltage_level + - MV + - HV, HV/MV, MV, MV/LV, LV + - The default volage level is used, if no specific voltage level is defined per station in :ref:`electrified_stations`. It is used to calculate the costs. Choices describe high voltage (HV), transfomer between high and medium voltage (HV/MV), medium voltage MV, transfomer between medium and low voltage (MV/LV) and low voltage (LV) + + * - days + - Optional: no default given + - numeric + - If this value is defined only the first number of 'days' of the schedule are simulated + * - interval + - 1 + - numeric + - timestep in minutes + * - signal_time_dif + - 10 + - numeric + - Some strategies use limited foresight. E.g. priorization of vehicles at limited number of charging stations is carried out only for this time ahead of actual time step. Also used in spiceEV as time difference between signal time and actual start time of a vehicle event in min. + * - eta + - false + - boolen + - Show estimated time to finish simulation after each step. Not recommended for fast computations -.. _schedule: Schedule -------- @@ -95,10 +234,14 @@ Vehicle types vehicle_type.json tbc +.. _electrified_stations: + Electrified stations -------------------- Stations which are electrified. TBC +.. _cost_params: + Cost parameters --------------- TBC From 7a19fbdef8c5c94e0b02f801472cd699048decd2 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 1 Aug 2023 18:34:05 +0200 Subject: [PATCH 742/802] make new flake8 6.1 happy --- ebus_toolbox/consumption.py | 2 +- ebus_toolbox/rotation.py | 6 +++--- ebus_toolbox/simulate.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index f66cc0f5..d8c1e6aa 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -60,7 +60,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :raises AttributeError: if there is no path to temperature or lol data provided """ - assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ + assert self.vehicle_types.get(vehicle_type, {}).get(charging_type), \ f"Combination of vehicle type {vehicle_type} and {charging_type} not defined." vehicle_info = self.vehicle_types[vehicle_type][charging_type] diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index d07991f8..fa1d8c7e 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -58,10 +58,10 @@ def add_trip(self, trip): # set charging type if given charging_type = trip.get('charging_type') if charging_type in ['depb', 'oppb']: - assert self.charging_type is None or self.charging_type == charging_type,\ + assert self.charging_type is None or self.charging_type == charging_type, \ f"Two trips of rotation {self.id} have distinct charging types" assert self.schedule.vehicle_types.get( - self.vehicle_type, {}).get(charging_type) is not None,\ + self.vehicle_type, {}).get(charging_type) is not None, \ (f"The required vehicle type {self.vehicle_type}({charging_type}) " "is not given in the vehicle_types.json file.") self.set_charging_type(charging_type) @@ -93,7 +93,7 @@ def set_charging_type(self, ct): if ct == self.charging_type: return - assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct),\ + assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct), \ f"Combination of vehicle type {self.vehicle_type} and {ct} not defined." old_consumption = self.consumption diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index d6c32355..a48b44f0 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -56,7 +56,7 @@ def simulate(args): scenario = schedule.run(args) # run the mode(s) specified in config - if type(args.mode) != list: + if not isinstance(args.mode, list): # backwards compatibility: run single mode args.mode = [args.mode] From 230fbc60e261af842fada32eb736b59d1f3e15a9 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 1 Aug 2023 19:37:31 +0200 Subject: [PATCH 743/802] add simba_modules to rtd --- docs/source/getting_started.rst | 31 ----------------------------- docs/source/index.rst | 1 + docs/source/modules.rst | 2 ++ docs/source/simba_modules.rst | 35 +++++++++++++++++++++++++++++++++ ebus_toolbox/util.py | 29 +++++++++++++-------------- 5 files changed, 52 insertions(+), 46 deletions(-) create mode 100644 docs/source/simba_modules.rst diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 2106313d..43c22639 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -67,34 +67,3 @@ In case an optimization is carried out, the results are then analyzed, the optim :width: 600 Default output plot for a single simulation. - -Specific modules ----------------- - -Consumption analysis -#################### - -.. _vehicle_dispatch: - -Vehicle Dispatch -################ - -Charging simulation -################### - -Generate report -############### - -Optimization -############ - -.. _consistency_check: - -Consistency check -################# - - -.. _rotation_filter: - -Rotation filter -############### diff --git a/docs/source/index.rst b/docs/source/index.rst index aa48d553..7e71b2a4 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -18,6 +18,7 @@ SimBa - the Simulation toolbox for Bus Applications - was designed to analyze an :caption: Contents: getting_started + simba_modules modes simulation_parameters modindex diff --git a/docs/source/modules.rst b/docs/source/modules.rst index 8278aeee..7e007c3b 100644 --- a/docs/source/modules.rst +++ b/docs/source/modules.rst @@ -1,3 +1,5 @@ +:orphan: + ebus_toolbox ============ diff --git a/docs/source/simba_modules.rst b/docs/source/simba_modules.rst new file mode 100644 index 00000000..bd062964 --- /dev/null +++ b/docs/source/simba_modules.rst @@ -0,0 +1,35 @@ + +.. _simba_modules: + +SimBA modules +============= + + + +Consumption analysis +-------------------- + +.. _vehicle_dispatch: + +Vehicle Dispatch +---------------- + +Charging simulation +------------------- + +Generate report +--------------- + +Optimization +------------ + +.. _consistency_check: + +Consistency check +----------------- + + +.. _rotation_filter: + +Rotation filter +--------------- \ No newline at end of file diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 53e61711..67816604 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -16,10 +16,21 @@ def save_version(file_path): def get_buffer_time(trip, default=0): - """ Get buffer time at arrival station of a trip. + """ + Get buffer time at arrival station of a trip. Buffer_time is an abstraction of delays like + docking procedures and is added to the planned arrival time. - Buffer_time is an abstraction of delays like docking procedures and is added to the planned - arrival time. + NOTE: Buffertime dictionaries map hours of the day to a buffer time. + Keys are ranges of hours and corresponding values provide buffer time in + minutes for that time range. + An entry with key "else" is a must if not all + hours of the day are covered. + E.g. + buffer_time = { + "10-22": 2, + "22-6": 3, + "else": 1 + } :param trip: The of buffer time of this trips arrival is returned. :type trip: ebus_toolbox.Trip @@ -27,18 +38,6 @@ def get_buffer_time(trip, default=0): :type default: dict, numeric :return: Buffer time :rtype: numeric - - NOTE: Buffertime dictionaries map hours of the day to a buffer time. - Keys are ranges of hours and corresponding values provide buffer time in - minutes for that time range. - An entry with key "else" is a must if not all - hours of the day are covered. - E.g. - buffer_time = { - "10-22": 2, - "22-6": 3, - "else": 1 - } """ schedule = trip.rotation.schedule From efefdd04fecb4e748cb5cea8d329551b1d70f6b1 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 2 Aug 2023 09:30:24 +0200 Subject: [PATCH 744/802] add content to rdt modules of SimBA --- docs/source/modes.rst | 116 +---------------------------- docs/source/simba_modules.rst | 135 +++++++++++++++++++++++++++++++++- 2 files changed, 136 insertions(+), 115 deletions(-) diff --git a/docs/source/modes.rst b/docs/source/modes.rst index 0d818703..c8548363 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -43,6 +43,7 @@ Simple Simulation The simple simulation case is the default mode. Its usage is explained in :ref:`Getting Started`. Every chain of modes starts with a simple simulation, even if it is not explicitly listed in the modes. The simulation takes the scenario as is. No parameters will be adjusted, optimized or changed in any way. The charging type for each vehicle is read from the rotation information from the trips.csv if this data is included. If the data is not included *preferred_charging_type* from the config file is used, as long as the provided vehicles data provides the preferred_charging_type for the specified vehicle type. +.. _neg_depb_to_oppb: Negative Depot to Opportunity Charger ------------------------------------- @@ -56,7 +57,7 @@ It takes the results of the previous simulation, and changes the charging type o .. note:: Charging types are only switched by SimBA if the corresponding vehicle type as opportunity charging bus exists in the provided vehicles_data.json. - +.. _neg_oppb_to_depb: Negative Opportunity to Depot Charger ------------------------------------- @@ -321,118 +322,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci Report ------ -The report will generate several files which include information about the expected SoCs, power loads at the charging stations or depots, default plots for the scenario and other useful data. - -Default outputs -############### - -| **Grid Connector Overview (gc_overview.csv)** -| Contains information about charging stations, including their names, types, maximum power, maximum number of charging stations, total energy usage, and use factors for the least, second least, and third least utilized charging stations. - -| **Grid Connector Time Series (gc_power_overview_timeseries.csv)** -| Time series of power flow in kW for every grid connector - -| **Rotation SoC Data (rotation_socs.csv)** -| Time series of SoC for each rotation. - -| **Vehicle SoC Data (vehicle_socs.csv)** -| Time series of SoC for each vehicle. - -| **Rotation Summary (rotation_summary.csv)** -| Contains data related to the rotation of vehicles, including the start and end times of each rotation, the type and ID of the vehicle, the depot name, the lines the vehicle traveled, total energy consumption in kWh, distance traveled in m, and various charging-related metrics such as charging type and SoC at arrival, minimum SoC and if the rotation had negative SoC values. - -| **Overview Plots (run_overview.pdf and run_overview.png)** -| Contains plots for SoCs for every vehicle, power at each charging station, batteries, external loads and feed-ins as well as price time series for each station. - -| **Station Data Summary (simulation_station_xy.json)** -| Contains information about the simulation interval, grid connector, photovoltaics, charging strategy, average flexible power range per time window, total drawn energy from the grid, average duration of standing events, maximum drawn power, total energy fed into the grid, maximum stored energy in each battery, number of load cycles for stationary batteries and vehicles, and number of times vehicle SoC was below the desired SoC on departure. - -| **Station Data Time Series (simulation_timeseries_station_xy.csv)** -| Contains station specific time series including price of electricity, grid supply, fixed loads, battery power, energy stored in battery, flex band boundaries, battery feed, charging station power use, occupied charging stations and charging stations in use as well as vehicles which are at the station. - -.. _cost_calculation: - -Cost calculation -################ -| **Cost calculation (summary_vehicles_costs.csv)** -| This is an optional output which calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. -| The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV `_ for the calculation of electricity costs. - -* Investment - * **Busses**: Costs for all busses used in the simulation. Costs include battery swaps, depending on the lifetime of both busses and batteries. - * **Charging infrastructure**: Costs for all depot and opportunity charging stations, depending on the number of actually used charging stations at each grid connector. - * **Grid connectors**: Costs for grid connectors and transformers, depending on the voltage level and the distance to the grid. - * **Garages**: Costs for workstations and charging infrastructure at garages. - * **Stationary storages**: Costs for stationary batteries at depot and opportunity stations, depending on its capacity. -* Maintenance - * Depending on the lifetime of each component maintenance costs are calculated for busses, charging infrastructure, grid connectors and stationary storages. -* Electricity - * **Power procurement**: Costs for the procurement of energy. - * **Grid fees**: Costs for power and energy price, depending on the voltage level and the utilization time per year. - * **Taxes**: Taxes like electricity taxes, depending on given taxes by price sheet. - * **Feed-in remuneration**: Remuneration for electricity fed into the grid. - -As result the following table is saved as CSV: - -+---------------------------------+----------+-----------------------------------------------------------------------+ -|**parameter** | **unit** | **description** | -+=================================+==========+=======================================================================+ -|c_vehicles | EUR | Investment costs of all busses | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_gcs | EUR | Investment costs of all grid connectors | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_cs | EUR | Investment costs of all charging stations | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_garage_cs | EUR | Investment costs of charging stations at garages | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_garage | EUR | Investment costs of garages itself | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_garage_workstations | EUR | Investment costs of working stations at garages | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_stat_storage | EUR | Investment costs of stationary storages | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_invest | EUR | Sum of all investment costs | -+---------------------------------+----------+-----------------------------------------------------------------------+ -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_vehicles_annual | EUR/year | Annual investment costs of all busses | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_gcs_annual | EUR/year | Annual investment costs of all grid connectors | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_cs_annual | EUR/year | Annual investment costs of all charging stations | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_garage_annual | EUR/year | Sum of annual investment costs of garages | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_stat_storage_annual | EUR/year | Annual investment costs of all stationary storages | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_invest_annual | EUR/year | Sum of all annual investment costs | -+---------------------------------+----------+-----------------------------------------------------------------------+ -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_maint_gc_annual | EUR/year | Annual maintenance costs of grid connectors | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_maint_infrastructure_annual | EUR/year | Annual maintenance costs of charging stations and stationary storages | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_maint_vehicles_annual | EUR/year | Annual maintenance costs of busses | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_maint_stat_storage_annual | EUR/year | Annual maintenance costs of stationary storages | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_maint_annual | EUR/year | Sum of annual maintenance costs | -+---------------------------------+----------+-----------------------------------------------------------------------+ -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_el_procurement_annual | EUR/year | Annual costs of power procurement | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_el_power_price_annual | EUR/year | Annual grid fee for highest load peak | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_el_energy_price_annual | EUR/year | Annual grid fee for drawn energy | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_el_taxes_annual | EUR/year | Annual costs for all electricity related taxes | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_el_feed_in_remuneration_annual | EUR/year | Annual feed-in remuneration | -+---------------------------------+----------+-----------------------------------------------------------------------+ -|c_el_annual | EUR/year | Sum of all annual electricity costs | -+---------------------------------+----------+-----------------------------------------------------------------------+ - - - +The report will generate several files which include information about the expected SoCs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Please refer to :ref:`generate_report` for more datailed information. diff --git a/docs/source/simba_modules.rst b/docs/source/simba_modules.rst index bd062964..1928aa18 100644 --- a/docs/source/simba_modules.rst +++ b/docs/source/simba_modules.rst @@ -4,11 +4,16 @@ SimBA modules ============= - - Consumption analysis -------------------- +The consumption can be calculated in two ways: Either with a constant average specific consumption or using a consumption table, where the consumption depends on the temperature, the incline, the level of loading and the speed profile/ average speed. + +To use a constant consumption, this value can be defined in the :ref:`vehicle_types` as "mileage" in the unit of [kWh/km]. To use the relative consumtion, a consumption table need to be created with data for each vehicle type and the path to the consumption table is assigned to the variable "mileage" in :ref:`vehicle_types`. The consumption table should have the columns "vehicle_type", "level_of_loading", "incline" ,"mean_speed_kmh", "t_amb", "consumption_kwh_per_km" and its creation is at ths point of development not part of SimBA. + +The level_of_loading describes the share between an empty vehicle (0) and a fully loaded vehicle (1) can be handed over in two ways: Either directcly as a column in :ref:`schedule` with specific values for each individual trip or as an input file "default_level_of_loading.csv" (path defined in :ref:`config`) containing values for each hour of the day. SimBA will first look into schedule and take this value and if it is not defined take the one from the .csv file. The temperature information is obtained in the same way as the level of loading and should be given in °C. In Order to calculate the consumption based on the in incline, an extra "all_stations.csv" file (path defined in :ref:`config`) has to be provided containing information on the elevation in m of each station. The incline is then calculated as the average incline between start and stop of the trip, which is an assumption that creates good results for vehicles with recuperation technology, as most electric vehicles have. The mean speed is calculated using the information provided in :ref:`schedule` about duration and length of each trip. + + .. _vehicle_dispatch: Vehicle Dispatch @@ -17,12 +22,138 @@ Vehicle Dispatch Charging simulation ------------------- +The charging simulation is carried out in the open source software `SpiceEV `_, that is included in SimBA as a package. SimBA therefore uses SpiceEVs carging strategy "distributed", that allows to sepatarte the charging strategy depending on the station type. The station types can be either depot charging station (deps) or opportunity charging station (opps). At depot charging stations vehicles are being charged using SpiceEVs strategy "balanced", which uses the whole standing time to charge with the minimal power to reach a desired SoC. At opportunity charging stations the strategy "greedy" is employed, that charges with the maximum available power due to restrictions from the grid connectoion, the charging curve of the vehicle and the charging station. + +.. _generate_report: + Generate report --------------- +The generation of the report is implemented as a mode, that can be activated with the keyword "report" in modes (:ref:`report`). The report generates most of the output files. These are saved in a subfolder of the output directory as defined in :ref:`config` named as a string with the modes executed up to the point when report is called. e.g. mode = ['sim', 'report', 'neg_oppb_to_depb', 'report'] will create two subfolders in the output directory named "sim" and "sim__neg_oppb_to_depb" containing the output files for the respective times in simulation. + +The generation of the report can be modified using the flag "cost_calculation" in :ref:`config`. If this flag is set to true, each report will also generate the file "summary_vehicles_costs.csv". + +Default outputs +############### + +| **Grid Connector Overview (gc_overview.csv)** +| Contains information about charging stations, including their names, types, maximum power, maximum number of charging stations, total energy usage, and use factors for the least, second least, and third least utilized charging stations. + +| **Grid Connector Time Series (gc_power_overview_timeseries.csv)** +| Time series of power flow in kW for every grid connector + +| **Rotation SoC Data (rotation_socs.csv)** +| Time series of SoC for each rotation. + +| **Vehicle SoC Data (vehicle_socs.csv)** +| Time series of SoC for each vehicle. + +| **Rotation Summary (rotation_summary.csv)** +| Contains data related to the rotation of vehicles, including the start and end times of each rotation, the type and ID of the vehicle, the depot name, the lines the vehicle traveled, total energy consumption in kWh, distance traveled in m, and various charging-related metrics such as charging type and SoC at arrival, minimum SoC and if the rotation had negative SoC values. + +| **Overview Plots (run_overview.pdf and run_overview.png)** +| Contains plots for SoCs for every vehicle, power at each charging station, batteries, external loads and feed-ins as well as price time series for each station. + +| **Station Data Summary (simulation_station_xy.json)** +| Contains information about the simulation interval, grid connector, photovoltaics, charging strategy, average flexible power range per time window, total drawn energy from the grid, average duration of standing events, maximum drawn power, total energy fed into the grid, maximum stored energy in each battery, number of load cycles for stationary batteries and vehicles, and number of times vehicle SoC was below the desired SoC on departure. + +| **Station Data Time Series (simulation_timeseries_station_xy.csv)** +| Contains station specific time series including price of electricity, grid supply, fixed loads, battery power, energy stored in battery, flex band boundaries, battery feed, charging station power use, occupied charging stations and charging stations in use as well as vehicles which are at the station. + +| **Overview on costs and vehicles (summary_vehicles_costs.csv)** +| If colst_caluclation is activated, this file contains the cost report as described below in :ref:`cost_calculation`. + +.. _cost_calculation: + +Cost calculation +################ +| **Cost calculation (summary_vehicles_costs.csv)** +| This is an optional output which calculates investment and maintenance costs of the infrastructure as well as energy costs in the scenario. The costs are calculated based on the price sheet, given as input in the ``costs_params.json``. +| The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV documentation `_ for the calculation of electricity costs. + +* Investment + * **Busses**: Costs for all busses used in the simulation. Costs include battery swaps, depending on the lifetime of both busses and batteries. + * **Charging infrastructure**: Costs for all depot and opportunity charging stations, depending on the number of actually used charging stations at each grid connector. + * **Grid connectors**: Costs for grid connectors and transformers, depending on the voltage level and the distance to the grid. + * **Garages**: Costs for workstations and charging infrastructure at garages. + * **Stationary storages**: Costs for stationary batteries at depot and opportunity stations, depending on its capacity. +* Maintenance + * Depending on the lifetime of each component maintenance costs are calculated for busses, charging infrastructure, grid connectors and stationary storages. +* Electricity + * **Power procurement**: Costs for the procurement of energy. + * **Grid fees**: Costs for power and energy price, depending on the voltage level and the utilization time per year. + * **Taxes**: Taxes like electricity taxes, depending on given taxes by price sheet. + * **Feed-in remuneration**: Remuneration for electricity fed into the grid. + +As result the following table is saved as CSV: + ++---------------------------------+----------+-----------------------------------------------------------------------+ +|**parameter** | **unit** | **description** | ++=================================+==========+=======================================================================+ +|c_vehicles | EUR | Investment costs of all busses | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_gcs | EUR | Investment costs of all grid connectors | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_cs | EUR | Investment costs of all charging stations | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage_cs | EUR | Investment costs of charging stations at garages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage | EUR | Investment costs of garages itself | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage_workstations | EUR | Investment costs of working stations at garages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_stat_storage | EUR | Investment costs of stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_invest | EUR | Sum of all investment costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_vehicles_annual | EUR/year | Annual investment costs of all busses | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_gcs_annual | EUR/year | Annual investment costs of all grid connectors | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_cs_annual | EUR/year | Annual investment costs of all charging stations | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_garage_annual | EUR/year | Sum of annual investment costs of garages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_stat_storage_annual | EUR/year | Annual investment costs of all stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_invest_annual | EUR/year | Sum of all annual investment costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_gc_annual | EUR/year | Annual maintenance costs of grid connectors | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_infrastructure_annual | EUR/year | Annual maintenance costs of charging stations and stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_vehicles_annual | EUR/year | Annual maintenance costs of busses | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_stat_storage_annual | EUR/year | Annual maintenance costs of stationary storages | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_maint_annual | EUR/year | Sum of annual maintenance costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_procurement_annual | EUR/year | Annual costs of power procurement | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_power_price_annual | EUR/year | Annual grid fee for highest load peak | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_energy_price_annual | EUR/year | Annual grid fee for drawn energy | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_taxes_annual | EUR/year | Annual costs for all electricity related taxes | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_feed_in_remuneration_annual | EUR/year | Annual feed-in remuneration | ++---------------------------------+----------+-----------------------------------------------------------------------+ +|c_el_annual | EUR/year | Sum of all annual electricity costs | ++---------------------------------+----------+-----------------------------------------------------------------------+ + Optimization ------------ +There are several options for optimizations that are implemented as :ref:`sim_modes`. These options are currently: + +* :ref:`neg_depb_to_oppb` +* :ref:`neg_oppb_to_depb` +* :ref:`Service Optimization` +* :ref:`Station Optimization` + .. _consistency_check: Consistency check From 6d6784513d960c9d11875f321204dae437a5069c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 2 Aug 2023 11:06:52 +0200 Subject: [PATCH 745/802] Minor changes to make flake8 and sphinx happy --- docs/source/conf.py | 1 - docs/source/ebus_toolbox.rst | 109 -------------------------------- docs/source/getting_started.rst | 2 +- docs/source/modules.rst | 9 --- ebus_toolbox/optimizer_util.py | 14 ++-- ebus_toolbox/util.py | 6 +- 6 files changed, 13 insertions(+), 128 deletions(-) delete mode 100644 docs/source/ebus_toolbox.rst delete mode 100644 docs/source/modules.rst diff --git a/docs/source/conf.py b/docs/source/conf.py index 3daca017..81cb065d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -25,7 +25,6 @@ import pathlib sys.path.insert(0, os.path.abspath('../../')) sys.path.insert(0, pathlib.Path(__file__).parents[2].resolve().as_posix()) -sys.path.insert(0, os.path.abspath('C:/Users/paul.scheer/Python/spiceev')) # -- Project information ----------------------------------------------------- diff --git a/docs/source/ebus_toolbox.rst b/docs/source/ebus_toolbox.rst deleted file mode 100644 index e7a1a296..00000000 --- a/docs/source/ebus_toolbox.rst +++ /dev/null @@ -1,109 +0,0 @@ -ebus\_toolbox package -===================== - -Submodules ----------- - -ebus\_toolbox.consumption module --------------------------------- - -.. automodule:: ebus_toolbox.consumption - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.costs module --------------------------- - -.. automodule:: ebus_toolbox.costs - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.optimization module ---------------------------------- - -.. automodule:: ebus_toolbox.optimization - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.optimizer\_util module ------------------------------------- - -.. automodule:: ebus_toolbox.optimizer_util - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.report module ---------------------------- - -.. automodule:: ebus_toolbox.report - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.rotation module ------------------------------ - -.. automodule:: ebus_toolbox.rotation - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.schedule module ------------------------------ - -.. automodule:: ebus_toolbox.schedule - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.simulate module ------------------------------ - -.. automodule:: ebus_toolbox.simulate - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.station\_optimization module ------------------------------------------- - -.. automodule:: ebus_toolbox.station_optimization - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.station\_optimizer module ---------------------------------------- - -.. automodule:: ebus_toolbox.station_optimizer - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.trip module -------------------------- - -.. automodule:: ebus_toolbox.trip - :members: - :undoc-members: - :show-inheritance: - -ebus\_toolbox.util module -------------------------- - -.. automodule:: ebus_toolbox.util - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: ebus_toolbox - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 43c22639..ce5e9a94 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -53,7 +53,7 @@ SimBA is designed as a toolbox, so the specific use can be adapted to the users Modules of SimBA -:ref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. +:numref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. Depending on the given simulation parameters, the vehicles are then dispatched. In this step, every rotation – the sum of all trips between leaving the depot until return – is allocated to a specific vehicle. The vehicles can be charged at any number of :ref:`electrified_stations`. These can be classified either as depot stations (deps) or as opportunity stations (opps). Each vehicle can be charged following one of the two charging strategies: Either as opportunity charging bus (oppb) or as depot charging bus (depb). While an oppb is charged at both deps and opps, depb are only charged at deps. The charging strategy can either be defined for each rotation in the :ref:`schedule` data or for all not explicitly defined rotations using the "preferred charging type" option in the :ref:`config`. Using this information, the charging simulation is then carried out. diff --git a/docs/source/modules.rst b/docs/source/modules.rst deleted file mode 100644 index 7e007c3b..00000000 --- a/docs/source/modules.rst +++ /dev/null @@ -1,9 +0,0 @@ -:orphan: - -ebus_toolbox -============ - -.. toctree:: - :maxdepth: 4 - - ebus_toolbox diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index 4f272efa..aa8b6e3b 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -1,5 +1,4 @@ -""" Module for the minor classes LowSocEvent, ChargingEvent, OptimizerConfig -and utility functionality used by the StationOptimizer and station_optimization""" +""" Module for LowSocEvent, ChargingEvent, OptimizerConfig and utility functionality""" import logging import math import os @@ -26,7 +25,8 @@ class ChargingEvent: - """ Class to gather information about a charging event""" + """Class to gather information about a charging event""" + def __init__(self, start_idx, end_idx, arrival_time, start_time, end_time, buffer_time, vehicle_id, capacity, station_name, rotation): @@ -246,12 +246,12 @@ def get_charging_start(trip1, args): def get_buffer_time(trip, default_buffer_time_opps): - """ Return the buffer time as timedelta object + """Return the buffer time as timedelta object :param trip: trip to be checked :type trip: ebus_toolbox.trip.Trip :param default_buffer_time_opps: the default buffer time at opps charging stations - :return: buffer time + :return: buffer ti :rtype: datetime.timedelta """ return timedelta(minutes=get_buffer_time_util(trip, default_buffer_time_opps)) @@ -353,6 +353,7 @@ def evaluate(events: typing.Iterable[LowSocEvent], :param kwargs: optional overwriting of soc_lower_thresh, soc_upper_thresh or soc_data :return: sorted stations and potentials :rtype: list(str(station_id), float(potential)) + """ soc_lower_thresh = kwargs.get("soc_lower_thresh", optimizer.config.min_soc) soc_upper_thresh = kwargs.get("soc_upper_thresh", optimizer.args.desired_soc_deps) @@ -627,6 +628,7 @@ def recursive_dict_updater(dict_to_change, filter_function, modify_function): The filter criteria are checked by the filter_function which gets the arguments key and value. The values are updated by the modify_function which gets the arguments key and value and returns the updated value. + :param dict_to_change: nested dictionary that needs to be updated :type dict_to_change: dict :param filter_function: function that returns True if the value should be changed with key and @@ -635,6 +637,7 @@ def recursive_dict_updater(dict_to_change, filter_function, modify_function): :param modify_function: function that returns the dictionary value with key and value as arguments :type modify_function: function + """ # iterate over all items. For every item, try iterating over it as well until an AttributeError for key, value in dict_to_change.items(): @@ -658,6 +661,7 @@ def combination_generator(iterable: typing.Iterable, amount: int): :param amount: Number of elements which should be drawn from iterable :type amount: int :yields: list of items + """ iterable = list(iterable) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 485690d4..91e01bec 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -27,9 +27,9 @@ def get_buffer_time(trip, default=0): hours of the day are covered. E.g. buffer_time = { - "10-22": 2, - "22-6": 3, - "else": 1 + "10-22": 2, + "22-6": 3, + "else": 1 } :param trip: The of buffer time of this trips arrival is returned. From c927cc3ef42ce96737f0716e07e5f23416d11b06 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 2 Aug 2023 11:08:06 +0200 Subject: [PATCH 746/802] Add modules and ebus_toolbox rst --- docs/source/ebus_toolbox.rst | 109 +++++++++++++++++++++++++++++++++++ docs/source/modules.rst | 9 +++ 2 files changed, 118 insertions(+) create mode 100644 docs/source/ebus_toolbox.rst create mode 100644 docs/source/modules.rst diff --git a/docs/source/ebus_toolbox.rst b/docs/source/ebus_toolbox.rst new file mode 100644 index 00000000..e7a1a296 --- /dev/null +++ b/docs/source/ebus_toolbox.rst @@ -0,0 +1,109 @@ +ebus\_toolbox package +===================== + +Submodules +---------- + +ebus\_toolbox.consumption module +-------------------------------- + +.. automodule:: ebus_toolbox.consumption + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.costs module +-------------------------- + +.. automodule:: ebus_toolbox.costs + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.optimization module +--------------------------------- + +.. automodule:: ebus_toolbox.optimization + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.optimizer\_util module +------------------------------------ + +.. automodule:: ebus_toolbox.optimizer_util + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.report module +--------------------------- + +.. automodule:: ebus_toolbox.report + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.rotation module +----------------------------- + +.. automodule:: ebus_toolbox.rotation + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.schedule module +----------------------------- + +.. automodule:: ebus_toolbox.schedule + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.simulate module +----------------------------- + +.. automodule:: ebus_toolbox.simulate + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.station\_optimization module +------------------------------------------ + +.. automodule:: ebus_toolbox.station_optimization + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.station\_optimizer module +--------------------------------------- + +.. automodule:: ebus_toolbox.station_optimizer + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.trip module +------------------------- + +.. automodule:: ebus_toolbox.trip + :members: + :undoc-members: + :show-inheritance: + +ebus\_toolbox.util module +------------------------- + +.. automodule:: ebus_toolbox.util + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: ebus_toolbox + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/modules.rst b/docs/source/modules.rst new file mode 100644 index 00000000..7e007c3b --- /dev/null +++ b/docs/source/modules.rst @@ -0,0 +1,9 @@ +:orphan: + +ebus_toolbox +============ + +.. toctree:: + :maxdepth: 4 + + ebus_toolbox From 25d70a859bf7da71ddbb1e2d36839a6cc4faed40 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 2 Aug 2023 11:08:35 +0200 Subject: [PATCH 747/802] Minor changes to make flake8 and sphinx happy --- ebus_toolbox/station_optimizer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ebus_toolbox/station_optimizer.py b/ebus_toolbox/station_optimizer.py index a9c565f5..988d24f2 100644 --- a/ebus_toolbox/station_optimizer.py +++ b/ebus_toolbox/station_optimizer.py @@ -1,4 +1,5 @@ """ Optimizer class which implements the optimizer object and methods needed""" + import logging import pickle from copy import deepcopy, copy @@ -13,7 +14,7 @@ class StationOptimizer: - """ Class for station optimization""" + """Class for station optimization""" def __init__(self, sched: schedule.Schedule, scen: scenario.Scenario, args, config: 'opt_util.OptimizerConfig', logger: logging.Logger): From bfca020c734ae68498daa1335575bc7b3ac84a65 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 2 Aug 2023 13:47:54 +0200 Subject: [PATCH 748/802] Remove minor changes from dev --- ebus_toolbox/consumption.py | 2 +- ebus_toolbox/optimizer_util.py | 4 ++-- ebus_toolbox/rotation.py | 6 +++--- ebus_toolbox/simulate.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index d8c1e6aa..f66cc0f5 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -60,7 +60,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :raises AttributeError: if there is no path to temperature or lol data provided """ - assert self.vehicle_types.get(vehicle_type, {}).get(charging_type), \ + assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ f"Combination of vehicle type {vehicle_type} and {charging_type} not defined." vehicle_info = self.vehicle_types[vehicle_type][charging_type] diff --git a/ebus_toolbox/optimizer_util.py b/ebus_toolbox/optimizer_util.py index aa8b6e3b..4c917683 100644 --- a/ebus_toolbox/optimizer_util.py +++ b/ebus_toolbox/optimizer_util.py @@ -246,12 +246,12 @@ def get_charging_start(trip1, args): def get_buffer_time(trip, default_buffer_time_opps): - """Return the buffer time as timedelta object + """ Return the buffer time as timedelta object :param trip: trip to be checked :type trip: ebus_toolbox.trip.Trip :param default_buffer_time_opps: the default buffer time at opps charging stations - :return: buffer ti + :return: buffer time :rtype: datetime.timedelta """ return timedelta(minutes=get_buffer_time_util(trip, default_buffer_time_opps)) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index fa1d8c7e..d07991f8 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -58,10 +58,10 @@ def add_trip(self, trip): # set charging type if given charging_type = trip.get('charging_type') if charging_type in ['depb', 'oppb']: - assert self.charging_type is None or self.charging_type == charging_type, \ + assert self.charging_type is None or self.charging_type == charging_type,\ f"Two trips of rotation {self.id} have distinct charging types" assert self.schedule.vehicle_types.get( - self.vehicle_type, {}).get(charging_type) is not None, \ + self.vehicle_type, {}).get(charging_type) is not None,\ (f"The required vehicle type {self.vehicle_type}({charging_type}) " "is not given in the vehicle_types.json file.") self.set_charging_type(charging_type) @@ -93,7 +93,7 @@ def set_charging_type(self, ct): if ct == self.charging_type: return - assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct), \ + assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct),\ f"Combination of vehicle type {self.vehicle_type} and {ct} not defined." old_consumption = self.consumption diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index 745c98f7..ebb8967a 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -59,7 +59,7 @@ def simulate(args): scenario = schedule.run(args) # run the mode(s) specified in config - if not isinstance(args.mode, list): + if type(args.mode) != list: # backwards compatibility: run single mode args.mode = [args.mode] From 17c120ba60f92bd5c1e8dcf6f35bef4dc4dd5ad0 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 2 Aug 2023 13:51:27 +0200 Subject: [PATCH 749/802] Remove minor changes from dev --- ebus_toolbox/util.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 91e01bec..ae1527b6 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -20,7 +20,14 @@ def get_buffer_time(trip, default=0): Get buffer time at arrival station of a trip. Buffer_time is an abstraction of delays like docking procedures and is added to the planned arrival time. - NOTE: Buffertime dictionaries map hours of the day to a buffer time. + :param trip: The of buffer time of this trips arrival is returned. + :type trip: ebus_toolbox.Trip + :param default: Default buffer time if no station specific buffer time is given. [minutes] + :type default: dict, numeric + :return: Buffer time + :rtype: numeric + + NOTE: Buffertime dictionaries map hours of the day to a buffer time. Keys are ranges of hours and corresponding values provide buffer time in minutes for that time range. An entry with key "else" is a must if not all @@ -31,13 +38,6 @@ def get_buffer_time(trip, default=0): "22-6": 3, "else": 1 } - - :param trip: The of buffer time of this trips arrival is returned. - :type trip: ebus_toolbox.Trip - :param default: Default buffer time if no station specific buffer time is given. [minutes] - :type default: dict, numeric - :return: Buffer time - :rtype: numeric """ schedule = trip.rotation.schedule From 7f325f41984ecb12a9aa951ec87f13c951feec1c Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 2 Aug 2023 13:53:55 +0200 Subject: [PATCH 750/802] Make flake8 up to date and happy --- ebus_toolbox/consumption.py | 2 +- ebus_toolbox/costs.py | 1 - ebus_toolbox/rotation.py | 6 +++--- ebus_toolbox/simulate.py | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index f66cc0f5..d8c1e6aa 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -60,7 +60,7 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :raises AttributeError: if there is no path to temperature or lol data provided """ - assert self.vehicle_types.get(vehicle_type, {}).get(charging_type),\ + assert self.vehicle_types.get(vehicle_type, {}).get(charging_type), \ f"Combination of vehicle type {vehicle_type} and {charging_type} not defined." vehicle_info = self.vehicle_types[vehicle_type][charging_type] diff --git a/ebus_toolbox/costs.py b/ebus_toolbox/costs.py index b54d7e4d..6d78ebec 100644 --- a/ebus_toolbox/costs.py +++ b/ebus_toolbox/costs.py @@ -149,7 +149,6 @@ def calculate_costs(c_params, scenario, schedule, args): costs["c_maint_annual"] = (costs["c_maint_infrastructure_annual"] + costs["c_maint_vehicles_annual"]) costs["c_invest"] = costs["c_vehicles"] + costs["c_cs"] + costs["c_gcs"] + costs["c_garage"] - # ToDo: add stat storages to investment costs (also annual)? costs["c_invest_annual"] = (costs["c_vehicles_annual"] + costs["c_cs_annual"] + costs["c_gcs_annual"] + costs["c_garage_annual"]) diff --git a/ebus_toolbox/rotation.py b/ebus_toolbox/rotation.py index d07991f8..fa1d8c7e 100644 --- a/ebus_toolbox/rotation.py +++ b/ebus_toolbox/rotation.py @@ -58,10 +58,10 @@ def add_trip(self, trip): # set charging type if given charging_type = trip.get('charging_type') if charging_type in ['depb', 'oppb']: - assert self.charging_type is None or self.charging_type == charging_type,\ + assert self.charging_type is None or self.charging_type == charging_type, \ f"Two trips of rotation {self.id} have distinct charging types" assert self.schedule.vehicle_types.get( - self.vehicle_type, {}).get(charging_type) is not None,\ + self.vehicle_type, {}).get(charging_type) is not None, \ (f"The required vehicle type {self.vehicle_type}({charging_type}) " "is not given in the vehicle_types.json file.") self.set_charging_type(charging_type) @@ -93,7 +93,7 @@ def set_charging_type(self, ct): if ct == self.charging_type: return - assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct),\ + assert self.schedule.vehicle_types.get(self.vehicle_type, {}).get(ct), \ f"Combination of vehicle type {self.vehicle_type} and {ct} not defined." old_consumption = self.consumption diff --git a/ebus_toolbox/simulate.py b/ebus_toolbox/simulate.py index ebb8967a..745c98f7 100644 --- a/ebus_toolbox/simulate.py +++ b/ebus_toolbox/simulate.py @@ -59,7 +59,7 @@ def simulate(args): scenario = schedule.run(args) # run the mode(s) specified in config - if type(args.mode) != list: + if not isinstance(args.mode, list): # backwards compatibility: run single mode args.mode = [args.mode] From 1ed378e9218e960f06bafe009d13ade252cc466b Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Wed, 2 Aug 2023 13:54:10 +0200 Subject: [PATCH 751/802] set log file encoding to UTF-8 --- ebus_toolbox/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ebus_toolbox/util.py b/ebus_toolbox/util.py index 3f40d4ed..323d376e 100644 --- a/ebus_toolbox/util.py +++ b/ebus_toolbox/util.py @@ -230,7 +230,7 @@ def setup_logging(args, time_str): log_name = f"{time_str}.log" log_path = args.output_directory / log_name print(f"Writing log to {log_path}") - log_handlers.append(logging.FileHandler(log_path)) + log_handlers.append(logging.FileHandler(log_path, encoding='utf-8')) logging.basicConfig( level=vars(logging)[args.loglevel], format="%(asctime)s [%(levelname)s] %(message)s", From ffe9a34bf7dfaaf3df6c7ee1711b1209e77a92eb Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Wed, 2 Aug 2023 14:46:58 +0200 Subject: [PATCH 752/802] Make flake8 happy --- ebus_toolbox/consumption.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ebus_toolbox/consumption.py b/ebus_toolbox/consumption.py index cb10fa29..bf76f554 100644 --- a/ebus_toolbox/consumption.py +++ b/ebus_toolbox/consumption.py @@ -60,7 +60,6 @@ def calculate_consumption(self, time, distance, vehicle_type, charging_type, tem :raises AttributeError: if there is no path to temperature or lol data provided """ - assert self.vehicle_types.get(vehicle_type, {}).get(charging_type), ( f"Combination of vehicle type {vehicle_type} and {charging_type} not defined.") From f682921c487d1a1ab52b4327e76bf2e7ebaecc48 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 2 Aug 2023 16:26:27 +0200 Subject: [PATCH 753/802] add explanation for vehicle dispatch to rtd --- docs/source/getting_started.rst | 10 +++++----- docs/source/simba_modules.rst | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index ce5e9a94..b7793816 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -35,9 +35,9 @@ To use SimBa with PyCharm, create a new python (>= 3.7) environment and clone th Now add a new "run/debug configuration" with the following information: -| module name: ``SimBA`` -| Parameters: ``--config data/examples/ebus_toolbox.cfg`` -| Working directory: ``Path\to\local\SimBa`` +| module name: ``simba`` +| Parameters: ``--config data/examples/simba.cfg`` +| Working directory: ``path/to/local/simba_repo`` | Run with Python Console: true Now you can run the scenario specified in the conif usin PyCharm. @@ -51,9 +51,9 @@ SimBA is designed as a toolbox, so the specific use can be adapted to the users :alt: figure_simba_modules :width: 600 - Modules of SimBA +:ref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. -:numref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. + Modules of SimBA Depending on the given simulation parameters, the vehicles are then dispatched. In this step, every rotation – the sum of all trips between leaving the depot until return – is allocated to a specific vehicle. The vehicles can be charged at any number of :ref:`electrified_stations`. These can be classified either as depot stations (deps) or as opportunity stations (opps). Each vehicle can be charged following one of the two charging strategies: Either as opportunity charging bus (oppb) or as depot charging bus (depb). While an oppb is charged at both deps and opps, depb are only charged at deps. The charging strategy can either be defined for each rotation in the :ref:`schedule` data or for all not explicitly defined rotations using the "preferred charging type" option in the :ref:`config`. Using this information, the charging simulation is then carried out. diff --git a/docs/source/simba_modules.rst b/docs/source/simba_modules.rst index 1928aa18..64783002 100644 --- a/docs/source/simba_modules.rst +++ b/docs/source/simba_modules.rst @@ -19,6 +19,8 @@ The level_of_loading describes the share between an empty vehicle (0) and a full Vehicle Dispatch ---------------- +To allocate the rotations to vehicles, vehicles of the needed type to fulfil the rotation are used. If no suitable vehicle is available, a new vehicle is created. Available vehilces are defined as not currently serving a rotation, having the same depot and having had enough time after return to the depot to be fully charged, when returning with an empty battery. This "minimum standing time" at the depot is calculated using the variable min_recharge_deps_oppb or min_recharge_deps_depb from the config together with the respective battery capacity of the vehicle and assuming the maximum available power of the depot chargning stations. + Charging simulation ------------------- @@ -163,4 +165,4 @@ Consistency check .. _rotation_filter: Rotation filter ---------------- \ No newline at end of file +--------------- From e75d1b1bf18ed1ac2b573ff45f428d8ea0261ef0 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 2 Aug 2023 16:57:22 +0200 Subject: [PATCH 754/802] make rtd run with simba --- docs/source/getting_started.rst | 20 ++++---- docs/source/index.rst | 2 +- docs/source/modes.rst | 6 +-- docs/source/modules.rst | 6 +-- docs/source/{ebus_toolbox.rst => simba.rst} | 52 ++++++++++----------- 5 files changed, 43 insertions(+), 43 deletions(-) rename docs/source/{ebus_toolbox.rst => simba.rst} (56%) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index b7793816..673eb982 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -1,7 +1,7 @@ Getting Started =============== -SimBa - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. +SimBA - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. It be used for locating and dimensioning charging infrastructure, dimensioning buses, analyzing the feasibility of electrification of trips and circulations, determining charging strategies, and calculating investments and costs. .. Without creating links like in the line below, subpages go missing from the sidebar @@ -10,21 +10,21 @@ It be used for locating and dimensioning charging infrastructure, dimensioning b Installation ------------ -To try it out, first clone `this repository `_ and then install the required packages to your current python environment by running +To try it out, first clone `this repository `_ and then install the required packages to your current python environment by running ``pip install -r requirements.txt`` -Now you can start the eBus Toolbox module with all configurations stored at `data/configs/ebus_toolbox.cfg` via the command +Now you can start SimBA with all configurations stored at `data/configs/simba.cfg` via the command -``python -m ebus_toolbox --config data/examples/ebus_toolbox.cfg`` +``python -m simba --config data/examples/simba.cfg`` The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. To run SimBA with your own `schedule.csv` (see :ref:`schedule`)) file and default configurations run -``python -m ebus_toolbox --input_schedule path/to/schedule.csv`` +``python -m simba --input_schedule path/to/schedule.csv`` -Default configurations are detailed at `data/configs/ebus_toolbox.cfg`. +Default configurations are detailed at `data/configs/simba.cfg`. Usage with PyCharm ################## @@ -51,19 +51,19 @@ SimBA is designed as a toolbox, so the specific use can be adapted to the users :alt: figure_simba_modules :width: 600 -:ref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. +:numref:`figure_simba_modules` shows the structure of the toolbox with its needed input data and how different modules work together to calculate the scenario. The optional input data and modules are indicated with dashed lines. A simulation starts by calculating the energy consumption of each trip, that is specified in the :ref:`schedule` data. A trip is defined by its departure name and time, arrival name and time, distance, pause, rotation_id and vehicle_type. For each of the :ref:`vehicle_types` either a specific consumption depending on current conditions like temperature and incline can be defined as a :ref:`consumption_table` or a constant specific consumption can be used. The specific consumption of the vehicles is then used to analyze the consumption of each trip. Modules of SimBA Depending on the given simulation parameters, the vehicles are then dispatched. In this step, every rotation – the sum of all trips between leaving the depot until return – is allocated to a specific vehicle. The vehicles can be charged at any number of :ref:`electrified_stations`. These can be classified either as depot stations (deps) or as opportunity stations (opps). Each vehicle can be charged following one of the two charging strategies: Either as opportunity charging bus (oppb) or as depot charging bus (depb). While an oppb is charged at both deps and opps, depb are only charged at deps. The charging strategy can either be defined for each rotation in the :ref:`schedule` data or for all not explicitly defined rotations using the "preferred charging type" option in the :ref:`config`. Using this information, the charging simulation is then carried out. -As a result of each simulation the energy demand at each electrified station, the development of vehicles SoCs (State of Charge), summaries of all rotations, estimated costs for vehicles, infrastructure and operationand further data can be displayed and saved. Some information can also be plotted, an example can be seen in :numref:`ebus_toolbox_default_plot`. +As a result of each simulation the energy demand at each electrified station, the development of vehicles SoCs (State of Charge), summaries of all rotations, estimated costs for vehicles, infrastructure and operationand further data can be displayed and saved. Some information can also be plotted, an example can be seen in :numref:`simba_default_plot`. In case an optimization is carried out, the results are then analyzed, the optimizer adapts the input data and parameters and starts the process again with the trip consumption analysis. In which order and for what purpose the individual modules are executed is mainly defined using the different modes. These modes can be used to manipulate the defined scenario e.g. by altering bus types from depot to opportunity chargers, optimize sets of rotations to increase electrification or suggest stations for electrification by minimizing the amount of stations needed. You can learn more about the modes :ref:`here `. -.. _ebus_toolbox_default_plot: +.. _simba_default_plot: .. figure:: _static/run_overview.png - :alt: ebus_toolbox_default_plot + :alt: simba_default_plot :width: 600 Default output plot for a single simulation. diff --git a/docs/source/index.rst b/docs/source/index.rst index e9ba43dd..75378179 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -9,7 +9,7 @@ :width: 200 Welcome to the SimBA documentation! -======================================== +=================================== SimBa - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. diff --git a/docs/source/modes.rst b/docs/source/modes.rst index c8548363..f38a6ae9 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -19,7 +19,7 @@ different modes support the user in finding optimal solutions for their eBus-Sys Chained Modes ------------- -While the default mode of the SimBA is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: ebus_toolbox.cfg) under the keyword *mode*: +While the default mode of the SimBA is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: simba.cfg) under the keyword *mode*: :: @@ -82,7 +82,7 @@ Station Optimization -------------------- Greedy Optimization #################### -This mode optimizes a scenario by electrifying as few opportunity stations as possible using a greedy approach. Two basic approaches to use the optimization module are setting the mode in the ebus_toolbox configuration file to +This mode optimizes a scenario by electrifying as few opportunity stations as possible using a greedy approach. Two basic approaches to use the optimization module are setting the mode in the simba configuration file to :: @@ -198,7 +198,7 @@ To make use of this feature the parameters in the optimizer.cfg have to be set. Optimizer Configuration ################################### -The functionality of the optimizer is controlled through the optimizer.cfg specified in the ebus_toolbox.cfg used for calling the eBus_Toolbox. +The functionality of the optimizer is controlled through the optimizer.cfg specified in the simba.cfg used for calling the SimBA. .. list-table:: Optimizer.cfg parameters :header-rows: 1 diff --git a/docs/source/modules.rst b/docs/source/modules.rst index 7e007c3b..b9190bc1 100644 --- a/docs/source/modules.rst +++ b/docs/source/modules.rst @@ -1,9 +1,9 @@ :orphan: -ebus_toolbox -============ +simba +===== .. toctree:: :maxdepth: 4 - ebus_toolbox + simba diff --git a/docs/source/ebus_toolbox.rst b/docs/source/simba.rst similarity index 56% rename from docs/source/ebus_toolbox.rst rename to docs/source/simba.rst index e7a1a296..859a0325 100644 --- a/docs/source/ebus_toolbox.rst +++ b/docs/source/simba.rst @@ -1,101 +1,101 @@ -ebus\_toolbox package +simba package ===================== Submodules ---------- -ebus\_toolbox.consumption module +simba.consumption module -------------------------------- -.. automodule:: ebus_toolbox.consumption +.. automodule:: simba.consumption :members: :undoc-members: :show-inheritance: -ebus\_toolbox.costs module +simba.costs module -------------------------- -.. automodule:: ebus_toolbox.costs +.. automodule:: simba.costs :members: :undoc-members: :show-inheritance: -ebus\_toolbox.optimization module +simba.optimization module --------------------------------- -.. automodule:: ebus_toolbox.optimization +.. automodule:: simba.optimization :members: :undoc-members: :show-inheritance: -ebus\_toolbox.optimizer\_util module +simba.optimizer\_util module ------------------------------------ -.. automodule:: ebus_toolbox.optimizer_util +.. automodule:: simba.optimizer_util :members: :undoc-members: :show-inheritance: -ebus\_toolbox.report module +simba.report module --------------------------- -.. automodule:: ebus_toolbox.report +.. automodule:: simba.report :members: :undoc-members: :show-inheritance: -ebus\_toolbox.rotation module +simba.rotation module ----------------------------- -.. automodule:: ebus_toolbox.rotation +.. automodule:: simba.rotation :members: :undoc-members: :show-inheritance: -ebus\_toolbox.schedule module +simba.schedule module ----------------------------- -.. automodule:: ebus_toolbox.schedule +.. automodule:: simba.schedule :members: :undoc-members: :show-inheritance: -ebus\_toolbox.simulate module +simba.simulate module ----------------------------- -.. automodule:: ebus_toolbox.simulate +.. automodule:: simba.simulate :members: :undoc-members: :show-inheritance: -ebus\_toolbox.station\_optimization module +simba.station\_optimization module ------------------------------------------ -.. automodule:: ebus_toolbox.station_optimization +.. automodule:: simba.station_optimization :members: :undoc-members: :show-inheritance: -ebus\_toolbox.station\_optimizer module +simba.station\_optimizer module --------------------------------------- -.. automodule:: ebus_toolbox.station_optimizer +.. automodule:: simba.station_optimizer :members: :undoc-members: :show-inheritance: -ebus\_toolbox.trip module +simba.trip module ------------------------- -.. automodule:: ebus_toolbox.trip +.. automodule:: simba.trip :members: :undoc-members: :show-inheritance: -ebus\_toolbox.util module +simba.util module ------------------------- -.. automodule:: ebus_toolbox.util +.. automodule:: simba.util :members: :undoc-members: :show-inheritance: @@ -103,7 +103,7 @@ ebus\_toolbox.util module Module contents --------------- -.. automodule:: ebus_toolbox +.. automodule:: simba :members: :undoc-members: :show-inheritance: From cd97e3b9df843d8c37699b8ec4f32b10443a41a7 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 3 Aug 2023 16:07:19 +0200 Subject: [PATCH 755/802] split simulate.simulate into smaller functions - pre_simulation to generate schedule - modes_simulation to run modes - added simulate.Modes class to bundle modes functions --- simba/simulate.py | 201 +++++++++++++++++++++++++++++----------------- 1 file changed, 129 insertions(+), 72 deletions(-) diff --git a/simba/simulate.py b/simba/simulate.py index 45931646..4fa6af51 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -11,14 +11,21 @@ def simulate(args): - """Simulate the given scenario and eventually optimize for given metric(s). + schedule = pre_simulation(args) + scenario = schedule.run(args) + return modes_simulation(schedule, scenario, args) + + +def pre_simulation(args): + """ + Prepare simulation. - :param args: Configuration arguments specified in config files contained in configs directory. - :type args: argparse.Namespace + Read in files, generate consumption info, create and filter schedule. :raises Exception: If an input file does not exist, exit the program. + :return: schedule + :rtype: simba.Schedule """ - # load vehicle types try: with open(args.vehicle_types, encoding='utf-8') as f: vehicle_types = util.uncomment_json_file(f) @@ -39,7 +46,7 @@ def simulate(args): if args.cost_parameters_file is not None: try: with open(args.cost_parameters_file, encoding='utf-8') as f: - cost_parameters_file = util.uncomment_json_file(f) + args.cost_parameters = util.uncomment_json_file(f) except FileNotFoundError: raise Exception(f"Path to cost parameters ({args.cost_parameters_file}) " "does not exist. Exiting...") @@ -59,10 +66,18 @@ def simulate(args): # calculate consumption of all trips schedule.calculate_consumption() - # scenario simulated once - scenario = schedule.run(args) + return schedule + - # run the mode(s) specified in config +def modes_simulation(schedule, scenario, args): + """ + Run the mode(s) specified in config. + + Ignores unknown and "sim" modes. + On error, create a report and continue with next mode. + + Returns final schedule and scenario. + """ if type(args.mode) is not list: # backwards compatibility: run single mode args.mode = [args.mode] @@ -71,74 +86,26 @@ def simulate(args): # scenario must be set from initial run / prior modes assert scenario is not None, f"Scenario became None after mode {args.mode[i-1]} (index {i})" + if mode == "sim": + if i > 0: + # ignore anyway, but at least give feedback that this has no effect + logging.info('Intermediate sim ignored') + continue + + logging.debug("Starting mode " + mode) try: - if mode == 'service_optimization': - # find largest set of rotations that produce no negative SoC - result = optimization.service_optimization(schedule, scenario, args) - schedule, scenario = result['optimized'] - if scenario is None: - logging.warning('No optimization possible (all rotations negative), reverting') - schedule, scenario = result['original'] - elif mode in ['neg_depb_to_oppb', 'neg_oppb_to_depb']: - # simple optimization: change charging type, simulate again - change_from = mode[4:8] - change_to = mode[-4:] - # get negative rotations - neg_rot = schedule.get_negative_rotations(scenario) - # check which rotations are relevant and if vehicle with other charging type exists - neg_rot = [r for r in neg_rot if schedule.rotations[r].charging_type == change_from - if change_to in vehicle_types[schedule.rotations[r].vehicle_type]] - if neg_rot: - logging.info( - f'Changing charging type from {change_from} to {change_to} for rotations ' - + ', '.join(sorted(neg_rot))) - schedule.set_charging_type(change_to, neg_rot) - # simulate again - scenario = schedule.run(args) - neg_rot = schedule.get_negative_rotations(scenario) - if neg_rot: - logging.info(f'Rotations {", ".join(neg_rot)} remain negative.') - elif mode == "station_optimization": - if not args.optimizer_config: - logging.warning("Station optimization needs an optimization config file. " - "Since no path was given, station optimization is skipped") - continue - conf = read_optimizer_config(args.optimizer_config) - try: - create_results_directory(args, i+1) - schedule, scenario = run_optimization(conf, sched=schedule, scen=scenario, - args=args) - except Exception as err: - logging.warning('During Station optimization an error occurred {0}. ' - 'Optimization was skipped'.format(err)) - elif mode == 'remove_negative': - neg_rot = schedule.get_negative_rotations(scenario) - if neg_rot: - schedule.rotations = { - k: v for k, v in schedule.rotations.items() if k not in neg_rot} - logging.info('Rotations ' + ', '.join(sorted(neg_rot)) + ' removed') - # re-run schedule - scenario = schedule.run(args) - else: - logging.info('No negative rotations to remove') - elif mode == 'report': - # create report based on all previous modes - if args.cost_calculation: - # cost calculation part of report - calculate_costs(cost_parameters_file, scenario, schedule, args) - # name: always start with sim, append all prior optimization modes - create_results_directory(args, i) - report.generate(schedule, scenario, args) - elif mode == 'sim': - if i > 0: - # ignore anyway, but at least give feedback that this has no effect - logging.info('Intermediate sim ignored') - else: - logging.error(f'Unknown mode {mode} ignored') + func = getattr(Mode, mode) + except AttributeError: + logging.error(f'Unknown mode {mode} ignored') + continue + + try: + schedule, scenario = func(schedule, scenario, args, i) + logging.debug("Finished mode " + mode) except Exception as e: msg = f"{e.__class__.__name__} during {mode}: {e}" logging.error('*'*len(msg)) - logging.error(e) + logging.error(msg) logging.error('*'*len(msg)) logging.error(traceback.format_exc()) if scenario is not None and scenario.step_i > 0: @@ -149,6 +116,96 @@ def simulate(args): logging.info(f"Created plot of failed scenario in {args.results_directory}") # continue with other modes after error + # all modes done + return schedule, scenario + + +class Mode: + """ + Container for simulation modes. + + Each function takes a schedule, the corresponding scenario and arguments Namespace. + Optionally, an index of the current mode in the modelist can be given. + A function must return the updated schedule and scenario objects. + """ + + def service_optimization(schedule, scenario, args, _i): + # find largest set of rotations that produce no negative SoC + result = optimization.service_optimization(schedule, scenario, args) + schedule, scenario = result['optimized'] + if scenario is None: + logging.warning('No optimization possible (all rotations negative), reverting') + schedule, scenario = result['original'] + return schedule, scenario + + def neg_depb_to_oppb(schedule, scenario, args, _i): + return Mode.switch_type(schedule, scenario, args, "depb", "oppb") + + def neg_oppb_to_depb(schedule, scenario, args, _i): + return Mode.switch_type(schedule, scenario, args, "oppb", "depb") + + def switch_type(schedule, scenario, args, from_type, to_type): + # simple optimization: change charging type, simulate again + # get negative rotations + neg_rot = schedule.get_negative_rotations(scenario) + # check which rotations are relevant and if vehicle with other charging type exists + relevant_rotations = [] + for rot_id in neg_rot: + if schedule.rotations[rot_id].charging_type == from_type: + new_vehicle_type = f"{schedule.rotations[rot_id].vehicle_type}_{to_type}" + if scenario.components.vehicle_types[new_vehicle_type]: + relevant_rotations.append(rot_id) + else: + logging.debug(f"Rotation {rot_id} negative and of type {from_type}, " + f"but vehicle type {new_vehicle_type} does not exist.") + if relevant_rotations: + logging.info( + f'Changing charging type from {from_type} to {to_type} for rotations ' + + ', '.join(sorted(relevant_rotations))) + schedule.set_charging_type(to_type, relevant_rotations) + # simulate again + scenario = schedule.run(args) + neg_rot = schedule.get_negative_rotations(scenario) + if neg_rot: + logging.info(f'Rotations {", ".join(neg_rot)} remain negative.') + return schedule, scenario + + def station_optimization(schedule, scenario, args, i): + if not args.optimizer_config: + logging.warning("Station optimization needs an optimization config file. " + "Since no path was given, station optimization is skipped") + return schedule, scenario + conf = read_optimizer_config(args.optimizer_config) + try: + create_results_directory(args, i+1) + return run_optimization(conf, sched=schedule, scen=scenario, args=args) + except Exception as err: + logging.warning('During Station optimization an error occurred {0}. ' + 'Optimization was skipped'.format(err)) + return schedule, scenario + + def remove_negative(schedule, scenario, args, _i): + neg_rot = schedule.get_negative_rotations(scenario) + if neg_rot: + schedule.rotations = { + k: v for k, v in schedule.rotations.items() if k not in neg_rot} + logging.info('Rotations ' + ', '.join(sorted(neg_rot)) + ' removed') + # re-run schedule + scenario = schedule.run(args) + else: + logging.info('No negative rotations to remove') + return schedule, scenario + + def report(schedule, scenario, args, i): + # create report based on all previous modes + if args.cost_calculation: + # cost calculation part of report + calculate_costs(args.cost_parameters, scenario, schedule, args) + # name: always start with sim, append all prior optimization modes + create_results_directory(args, i) + report.generate(schedule, scenario, args) + return schedule, scenario + def create_results_directory(args, i): """ Create directory for results. From d087501c8f5e4e1f0a41f58dd8c5f2ecb438b662 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Thu, 3 Aug 2023 16:16:41 +0200 Subject: [PATCH 756/802] add docstring parameters --- simba/simulate.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/simba/simulate.py b/simba/simulate.py index 4fa6af51..ceaa36f7 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -22,9 +22,11 @@ def pre_simulation(args): Read in files, generate consumption info, create and filter schedule. + :param args: arguments + :type args: Namespace :raises Exception: If an input file does not exist, exit the program. :return: schedule - :rtype: simba.Schedule + :rtype: simba.schedule.Schedule """ try: with open(args.vehicle_types, encoding='utf-8') as f: @@ -76,7 +78,14 @@ def modes_simulation(schedule, scenario, args): Ignores unknown and "sim" modes. On error, create a report and continue with next mode. - Returns final schedule and scenario. + :param schedule: input schedule + :type schedule: simba.schedule.Schedule + :param scenario: corresponding scenario + :type scenario: spice_ev.scenario.Scenario + :param args: arguments + :type args: Namespace + :return: final schedule and scenario + :rtype: tuple """ if type(args.mode) is not list: # backwards compatibility: run single mode From 1a1f4a7ab558f985e30256ffc916872829bf536c Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Fri, 4 Aug 2023 10:35:09 +0200 Subject: [PATCH 757/802] add docstring to simulate --- simba/simulate.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/simba/simulate.py b/simba/simulate.py index ceaa36f7..aaf4aa24 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -11,6 +11,18 @@ def simulate(args): + """ + High-level function to create and run a scenario. + + Use the parsed scenario arguments to prepare the schedule, + run the basic simulation and different modes of SimBA. + Returns final schedule and scenario after running all modes. + + :param args: configuration + :type args: Namespace + :return: final schedule and scenario + :rtype: tuple + """ schedule = pre_simulation(args) scenario = schedule.run(args) return modes_simulation(schedule, scenario, args) From b16e4e1721035dc1f1fdcdd5ff036ebf92d324d8 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 4 Aug 2023 11:53:09 +0200 Subject: [PATCH 758/802] rename modules to features --- docs/source/getting_started.rst | 2 +- docs/source/index.rst | 2 +- .../{simba_modules.rst => simba_features.rst} | 23 ++++++++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) rename docs/source/{simba_modules.rst => simba_features.rst} (89%) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 673eb982..b616b798 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -40,7 +40,7 @@ Now add a new "run/debug configuration" with the following information: | Working directory: ``path/to/local/simba_repo`` | Run with Python Console: true -Now you can run the scenario specified in the conif usin PyCharm. +Now you can run the scenario specified in the conif using PyCharm. General Concept --------------- diff --git a/docs/source/index.rst b/docs/source/index.rst index 75378179..7a8f2bb6 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -18,7 +18,7 @@ SimBa - the Simulation toolbox for Bus Applications - was designed to analyze an :caption: Contents: getting_started - simba_modules + simba_features modes simulation_parameters modindex diff --git a/docs/source/simba_modules.rst b/docs/source/simba_features.rst similarity index 89% rename from docs/source/simba_modules.rst rename to docs/source/simba_features.rst index 64783002..479d677c 100644 --- a/docs/source/simba_modules.rst +++ b/docs/source/simba_features.rst @@ -1,8 +1,8 @@ -.. _simba_modules: +.. _simba_features: -SimBA modules -============= +Features of SimBA +================= Consumption analysis -------------------- @@ -161,8 +161,25 @@ There are several options for optimizations that are implemented as :ref:`sim_mo Consistency check ----------------- +SimBA makes certain assumption, that have to be valid to trust the results. these are: + +* The trips inside a rotation are chronologically sorted +* The trip time is not negative, so the arrival of the trip is later or equal to its departure. +* The break time between trips is not negative, so the departure of the consecutive trip is later or equal to the arrival of the preceding trip. +* Each rotation has a defined and fixed depot, so the rotation starts and ends at the same station +* Every trip within a rotation starts where the previous trip ended + +In order to test these assumptions, the flag "check_rotation_consistency" can be activated in the :ref:`config`, which will result in the display of cases were assumptions are broken in the console and in the log file. Additionally the inconsistent totaions can be filtered out of the simulation by setting the "skip_inconsistent_rotations" flag to true. + .. _rotation_filter: Rotation filter --------------- + +Before all rotations specified in the :ref:`schedule` are simulated, there is the option to filter only the ones relevant to for the actual analysis. This is activated by setting the "rotation_filter_variable" in the :ref:`config` to either "include", than only certain rotations from the schedule are considered, or to "exclude", than certain rotations are excluded from the analysis. The list of rotations for both options is specified as "rotation_filter" in the Path paragraph of the :ref:`config`. + +Logging +------- + +SimBA uses the "logging" package for logging. All logging messages are both displayed in the Terminal and written to a .log file. The filepath and the loglevel can be defined in the :ref:`config`. Four loglevels are available in the following order: DEBUG, INFO, WARN and ERROR. INFO includes INFO, WARN and ERROR but excludes DEBUG. \ No newline at end of file From 74732527229f8ac78f2d56f9c2262696bb13f496 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 4 Aug 2023 12:07:04 +0200 Subject: [PATCH 759/802] clean readme --- README.md | 41 ++--------------------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 077c747d..e77c4e8c 100644 --- a/README.md +++ b/README.md @@ -2,43 +2,6 @@ The SimBA toolbox assists the user in analysing and optimising electrified bus fleets and schedules. -### Usage +Please refer to the documentation for further instructions: -At the current stage, only a single functionality is implemented, which is processing a bus schedule stored in a specific CSV format (see `data/examples/trips_examples.csv`) and run it through a module called SpiceEV for an in-depth SOC analysis. - -To try it out, first clone this repository and then install the required packages to your current environment by running - -`pip install -r requirements.txt` - -Now you can start the SimBA module with all configurations stored at `data/examples/simba.cfg` via the command - -``python -m simba --config data/examples/simba.cfg`` - -The repo provides an example for each necessary input file, so the example case can be executed without the need for the user to provide any data themselves. - -To run SimBA with your own `schedule.csv` (see details [below](#input-data)) file and default configurations run - -`python -m simba --input_schedule path/to/schedule.csv` - -Default configurations are detailed at `data/configs/simba.cfg`. - - - -### Input Data - -To analyze your own electric bus schedule, the data needs to be provided as a CSV file where each row contains the details of a single trip of that schedule. Find the details about the various columns in this file below. The first table lists the **mandatory** columns while the second one (tbd) lists optional parameters. Refer to `data/examples/trips.csv` for an example. - -| Column Name | Description | Example | -| -------------- | ------------------------------------------------------------ | ----------------- | -| rotation_id | Unique alphanumeric ID to identify rotations | 27312 | -| departure_name | Name of the station the trip starts at | Warschauer Straße | -| departure_time | Date and Time at which bus starts trip | 2022-03-13T10:25 | -| arrival_name | Name of the station the trip ends at | Ostbahnhof Berlin | -| arrival_time | Date and Time at which bus completes trip (e.g. yyyy-mm-ddThh:mm[:ss]) | 2022-03-13T10:30 | -| distance | Distance traveled in **m** | 1340 | -| vehicle_type | ID of vehicle type defined in vehicle types file. Set path of this file in config.
(see default for reference: `data/examples/vehicle_types.json`) | some_bus_type | - -| Column Name | Description | Example | -| :------------ | :----------------------------------------------------------- | ---------------------------- | -| line | The bus line | 512, M10, X11 etc | -| charging_type | The preferred charging type for this trip.
NOTE: All trips of a rotation need to have the same charging type. If omitted, charging type is set according to preferred charging type provided in the config file. | Options: **depb**, **oppb** | +***LINK TO READ THE DOCS*** From 64e5a93cb01f1456f44f14673a93264d7232b122 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Fri, 4 Aug 2023 12:08:16 +0200 Subject: [PATCH 760/802] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e77c4e8c..481121c1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SimBA: Simulation toolbox for Bus Applications -The SimBA toolbox assists the user in analysing and optimising electrified bus fleets and schedules. +SimBA - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. -Please refer to the documentation for further instructions: +Please refer to the documentation for further information: ***LINK TO READ THE DOCS*** From 1b820620683995ac8e8b4989be1a661571e769e3 Mon Sep 17 00:00:00 2001 From: "paul.scheer" Date: Fri, 4 Aug 2023 15:03:05 +0200 Subject: [PATCH 761/802] Fix typos and grammar --- docs/source/getting_started.rst | 9 +++-- docs/source/modes.rst | 35 ++++++++++--------- docs/source/simba_features.rst | 22 ++++++------ docs/source/simulation_parameters.rst | 48 +++++++++++++-------------- 4 files changed, 56 insertions(+), 58 deletions(-) diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index b616b798..5c230886 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -2,8 +2,7 @@ Getting Started =============== SimBA - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. -It be used for locating and dimensioning charging infrastructure, dimensioning buses, analyzing the feasibility of electrification of trips and circulations, determining charging strategies, and calculating investments and costs. - +It is used for locating and dimensioning charging infrastructure, dimensioning buses, analyzing the feasibility of electrification of trips and circulations, determining charging strategies, and calculating investments and costs. .. Without creating links like in the line below, subpages go missing from the sidebar .. _installation_label: @@ -40,11 +39,11 @@ Now add a new "run/debug configuration" with the following information: | Working directory: ``path/to/local/simba_repo`` | Run with Python Console: true -Now you can run the scenario specified in the conif using PyCharm. +Now you can run the scenario specified in the config using PyCharm. General Concept --------------- -SimBA is designed as a toolbox, so the specific use can be adapted to the users needs. Its core functionality is to run scenariobased simulations. A scenario is defined by a set of input files. Next to the simulation mode, several optimization modes exist, that can be linked and executed consecutively. +SimBA is designed as a toolbox, so the specific use can be adapted to the users needs. Its core functionality is to run scenario based simulations. A scenario is defined by a set of input files. Next to the simulation mode, several optimization modes exist, that can be linked and executed consecutively. .. _figure_simba_modules: .. figure:: _static/SimBA_module_overview.png @@ -57,7 +56,7 @@ SimBA is designed as a toolbox, so the specific use can be adapted to the users Depending on the given simulation parameters, the vehicles are then dispatched. In this step, every rotation – the sum of all trips between leaving the depot until return – is allocated to a specific vehicle. The vehicles can be charged at any number of :ref:`electrified_stations`. These can be classified either as depot stations (deps) or as opportunity stations (opps). Each vehicle can be charged following one of the two charging strategies: Either as opportunity charging bus (oppb) or as depot charging bus (depb). While an oppb is charged at both deps and opps, depb are only charged at deps. The charging strategy can either be defined for each rotation in the :ref:`schedule` data or for all not explicitly defined rotations using the "preferred charging type" option in the :ref:`config`. Using this information, the charging simulation is then carried out. -As a result of each simulation the energy demand at each electrified station, the development of vehicles SoCs (State of Charge), summaries of all rotations, estimated costs for vehicles, infrastructure and operationand further data can be displayed and saved. Some information can also be plotted, an example can be seen in :numref:`simba_default_plot`. +As a result of each simulation the energy demand at each electrified station, the development of vehicles SoCs (State of Charge), summaries of all rotations, estimated costs for vehicles, infrastructure and operation and further data can be displayed and saved. Some information can also be plotted, an example can be seen in :numref:`simba_default_plot`. In case an optimization is carried out, the results are then analyzed, the optimizer adapts the input data and parameters and starts the process again with the trip consumption analysis. In which order and for what purpose the individual modules are executed is mainly defined using the different modes. These modes can be used to manipulate the defined scenario e.g. by altering bus types from depot to opportunity chargers, optimize sets of rotations to increase electrification or suggest stations for electrification by minimizing the amount of stations needed. You can learn more about the modes :ref:`here `. diff --git a/docs/source/modes.rst b/docs/source/modes.rst index f38a6ae9..f3a00802 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -8,7 +8,7 @@ Modes of SimBA ============== SimBA assists the user in analyzing and optimising electrified bus fleets and schedules. Besides a simple simulation run, several -different modes support the user in finding optimal solutions for their eBus-System. Supported Modes are +different modes support the user in finding optimal solutions for their eBus-System. Supported modes are * simple simulation * negative depot to opportunity charger @@ -19,7 +19,7 @@ different modes support the user in finding optimal solutions for their eBus-Sys Chained Modes ------------- -While the default mode of the SimBA is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: simba.cfg) under the keyword *mode*: +While the default mode of SimBA is the simple simulation together with a report, modes can be chained together differently to achieve the desired results. The chain of modes is defined in the config file (default: simba.cfg) under the keyword *mode*: :: @@ -31,8 +31,7 @@ This results in a simple simulation with a following report. To run a simulation mode = ["sim", "report" ,"neg_depb_to_oppb", "report] -Where the scenario is run as is, a report is generated, the schedule is changed and simulated again and a second report is generated. The description what the modes do -can be found below. +Where the scenario is run as is, a report is generated, the schedule is changed and simulated again and a second report is generated. Descriptions for the modes can be found below. Simple Simulation ----------------- @@ -74,7 +73,7 @@ It takes the results of the previous simulation, and changes the charging type o Service Optimization -------------------- -It can happen that several busses influence each other while simulataiously charging at the same charging station, e.g. due to limited grid power or limited number of charging stations, which can lead to negative SoCs due to hindered charging. In this case, this mode finds the largest set of rotations that results in no negative SoC. This is done by first taking all rotations that do become negative and finding their dependent rotations, i.e., ones that can have an influence by sharing a station earlier with the negative rotation. Next, all rotations are filtered out that stay negative when running with just their dependent rotations. +It can happen that several buses influence each other while simultaneously charging at the same charging station, e.g. due to limited grid power or limited number of charging stations, which can lead to negative SoCs due to hindered charging. In this case, this mode finds the largest set of rotations that results in no negative SoC. This is done by first taking all rotations that do become negative and finding their dependent rotations, i.e., ones that can have an influence by sharing a station earlier with the negative rotation. Next, all rotations are filtered out that stay negative when running with just their dependent rotations. Now, only rotations are left that are non-negative when viewed alone, but might become negative when run together. To find the largest subset of non-negative rotations, all possible set combinations are generated and tried out. When a union of two rotation-sets is non-negative, it is taken as the basis for new possible combinations. In the end, the largest number of rotations that produce a non-negative result when taken together is returned as the optimized scenario. @@ -96,7 +95,7 @@ or mode = ["sim","neg_depb_to_oppb", "station_optimization", "report"] While the first call optimizes the scenario straight away trying to electrify all opportunity chargers, the second call, changes depot chargers to opportunity chargers, if they were not able to finish their rotations in the first simulation run. This way the second approach can lead to a higher degree of electrification for the system. -The network with no opportunity charging station is first analyzed to find rotations which fail at the current stage and to estimate the potential of electrifying each station by its own. *Step-by-step* new opportunity stations are electrified until full electrification is reached. The optimization assumes that at every electrified station unlimited charging points exist, i.e. the number of simultaneously charging buses is not limited. In between each electrification a simulation is run and the network is analyzed again. The first run called the **base optimization** leads to a scenario which often times is better than extensively optimizing the scenario by hand. Since a greedy approach can not guarantee a global optimum a second extensive optimization can be chained to this base optimization. This *deep* optimization can make use of a *step-by-step* decision tree expansion which evaluates new combinations of electrified stations starting with the most promising combinations **OR** use a *brute* force approach trying to reduce the amount of electrified stations by one in comparison to the base optimization. The step-by-step process of the optimization follows :numref:`optimization_loop` +The network with no opportunity charging station is first analyzed to find rotations which fail at the current stage and to estimate the potential of electrifying each station by its own. *Step-by-step* new opportunity stations are electrified until full electrification is reached. The optimization assumes that at every newly electrified station unlimited charging points exist, i.e. the number of simultaneously charging buses is not limited. In between each electrification a simulation is run and the network is analyzed again. The first run called the **base optimization** leads to a scenario which often times is better than extensively optimizing the scenario by hand. Since a greedy approach can not guarantee a global optimum a second extensive optimization can be chained to this base optimization. This *deep* optimization can make use of a *step-by-step* decision tree expansion which evaluates new combinations of electrified stations starting with the most promising combinations **OR** use a *brute* force approach trying to reduce the amount of electrified stations by one in comparison to the base optimization. The step-by-step process of the optimization follows :numref:`optimization_loop` .. _optimization_loop: .. figure:: https://user-images.githubusercontent.com/104760879/217225177-66201146-d31a-4127-9ca0-4d6e6e5a3cc4.png @@ -114,19 +113,19 @@ After a single simulation is run the rotations are analyzed. Any time a vehicle Low SoC event and classification of stations. -The next step groups low SoC events based on the stations which were found earlier. Events which share at least one station could possibly interact with each other, e.g. vehicles could share a charging station. Therefore groups are build which do not share any stations in between groups. This speeds up the optimization process since for every electrification and simulation only rotations are calculated which could be impacted by the change. +The next step groups low SoC events based on the stations which were found earlier. Events which share at least one station could possibly interact with each other, e.g. vehicles could share a charging station. Therefore, groups are build which do not share any stations in between groups. This speeds up the optimization process since for every electrification and simulation only rotations are calculated which could be impacted by the change. -Since greedy approaches execute the step which seems most promising in the current situation an evaluation function is needed. One possible approach could be to simulate each scenario, meaning simulating every case in which one of all possible stations is electrified and continuing with the best case. The optimizer does not use this approach. Instead an approximation function is used to evaluate the potential of electrifying a station. This approximation function analyzes the duration at each stop, the possible charging time, the SoC and resulting possible charging power (battery with high SoCs are charged at a lower rate) as well as the upper SoC threshold and minimal SoC of the event. While this methodology is not accurate in all cases, e.g. a station could exist multiple times inside of a low SoC event, therefore charging the first time at this station would alter the SoC and charging power the vehicle has the second time it reaches the station, it seems well suited as heuristic for choosing the most promising station. The objective function of choosing what the *best* station is, is the mitigation of missing charge, i.e. what is the minimal amount of energy that needs to be inserted into the battery, so that no SoC is below 0. +Since greedy approaches execute the step which seems most promising in the current situation an evaluation function is needed. One possible approach could be to simulate each scenario, meaning simulating every case in which one of all possible stations is electrified and continuing with the best case. The optimizer does not use this approach. Instead, an approximation function is used to evaluate the potential of electrifying a station. This approximation function analyzes the duration at each stop, the possible charging time, the SoC and resulting possible charging power (in general batteries with high SoCs are charged at a lower rate) as well as the upper SoC threshold and minimal SoC of the event. While this methodology is not accurate in all cases, e.g. a station could exist multiple times inside a low SoC event, therefore charging the first time at this station would alter the SoC and charging power the vehicle has the second time it reaches the station, it seems well suited as heuristic for choosing the most promising station. The objective function of choosing what the *best* station is, is the mitigation of missing charge, i.e. what is the minimal amount of energy that needs to be inserted into the battery, so that no SoC is below 0. -After the evaluation selected a station to be electrified the scenario input data is altered so that vehicles at this station are charged without limitation of charging points. This is followed up by a detailed simulation which can make use of a highly accurate solver for charging events called *SpiceEV* or a less accurate but faster solver. Now the resulting system has less missing charge and the potentials of stations might be decreased. Also a single group might have been split up into several smaller groups which can be analyzed even quicker. Therefore the loop repeats up until the point the missing charge in the system is zero or in other words the system is fully electrified. +After the evaluation selected a station to be electrified the scenario input data is altered so that vehicles at this station are charged without limitation of charging points. This is followed up by a detailed simulation which can make use of a highly accurate solver for charging events called *SpiceEV* or a less accurate but faster solver. Now the resulting system has less missing charge and the potentials of stations might be decreased. Also, a single group might have been split up into several smaller groups which can be analyzed even quicker. Therefore, the loop repeats up until the point the missing charge in the system is zero or in other words the system is fully electrified. At the current stage the scenario to be optimized needs depot charging stations at the start and end of each rotation. The scenario should not contain any opportunity charging stations. If for a given scenario opportunity charging stations are predefined, i.e. the scenario should contain a specific electrification and is set in the *electrified_station.json* the solver type *spice_ev* should be used in the *optimizer.cfg*. If the *quick* solver is supposed to be used the station can be listed in *inclusion_stations* while the *electrified_stations.json* should only contain depot stations. Stations can be also excluded from optimization by adding their name to *exclusion_stations*. Deep Optimization #################### -The greedy algorithm in the base optimization can not guarantee that the solution is the global optimum. This is why the use of the *deep* mode is recommended for systems with high requirements. After the first run, instead of electrifying the station with the highest potential the second best station is electrified. This is similar to a decision tree, where every node is a set of electrified stations, with the first node being zero stations electrified and the last node being all stations electrified. The nodes in between correlate with every possible state of electrification. Each branch therefore represents an additional electrification of a single station. The algorithm continues electrifying the best station, as long as this node has not been evaluated yet. This way gradually all possible nodes are checked. The search stops whenever the number of stations surpasses the number of the current optimal solution. If several options with the same optimal number of stations arise, they can be found in the log file of the optimizer, but only one file with optimized stations is produced. +The greedy algorithm in the base optimization can not guarantee that the solution is the global optimum. This is why the use of the *deep* mode is recommended for systems with high requirements. After the first run, instead of electrifying the station with the highest potential the second-best station is electrified. This is similar to a decision tree, where every node is a set of electrified stations, with the first node being zero stations electrified and the last node being all stations electrified. The nodes in between correlate with every possible state of electrification. Each branch therefore represents an additional electrification of a single station. The algorithm continues electrifying the best station, as long as this node has not been evaluated yet. This way gradually all possible nodes are checked. The search stops whenever the number of stations surpasses the number of the current optimal solution. If several options with the same optimal number of stations arise, they can be found in the log file of the optimizer, but only one file with optimized stations is produced. -**Pruning** is used to stop evaluation of branches, whenever foresight predicts that no better solution will be reached. This is done through the simple heuristic of checking the sum of potential of the n remaining stations with the highest potentials, with n being the number until the number of stations of the current optimal solution is reached. +**Pruning** is used to stop evaluation of branches, whenever foresight predicts that no better solution will be reached. This is done through the simple heuristic of checking the sum of potentials of the n remaining stations with the highest potentials, with n being the number until the number of stations of the current optimal solution is reached. | **Example:** | The base optimization found a set of 5 stations to fully electrify the scenario. These stations are *A*, *B*, *C*, *D* and *E* which were chosen in the same order. The whole scenario consists of the whole alphabet of stations. The deep optimization starts with evaluating a scenario without any electrified opportunity stations. Depot stations are electrified. The first evaluation gives a sorted list of potentials by @@ -159,17 +158,17 @@ For every vehicle the amount of missing energy is calculated and summed up. In t Pot = Pot_B + Pot_E + Pot_C + Pot_G = 28 + 25 + 20 +18 = 91 -In this case the potential is high enough to continue the exploration of this branch. If the potential would have been below 85 the branch would have been pruned, meaning it would not be explored any further and labeled as *not promising*. It is not promising since it will not lead to a better solution than the current one. This is the case since on one hand the evaluation by approximation tends to overestimate the potential while the missing energy is accurately calculated and on the other hand electrification of stations can reduce the potential of other stations, for example if 2 stations charge the same rotation, electrifying one station might fully electrify the rotation meaning the potential of the other station drops to zero. +In this case the potential is high enough to continue the exploration of this branch. If the potential had been below 85 the branch would have been pruned, meaning it would not be explored any further and labeled as *not promising*. It is not promising since it will not lead to a better solution than the current one. This is the case since on one hand the evaluation by approximation tends to overestimate the potential while the missing energy is accurately calculated and on the other hand electrification of stations can reduce the potential of other stations, for example if 2 stations charge the same rotation, electrifying one station might fully electrify the rotation meaning the potential of the other station drops to zero. This concept can reduce the amount of nodes which have to be checked. Other Optimization Functionality ################################### -**Mandatory stations** can be attained to increase the optimization process. Mandatory stations are defined by being stations which are needed for a fully electrified system. To check if a station *Y* is a mandatory station can be easily attained by simulating the network with every station electrified except *Y*. If the system has vehicle SoCs which drop below the minimal SoC (default value is 0) in this scenario, the station is mandatory. In the later exploration of best combinations of stations this station will be included in any case. +**Mandatory stations** can be attained to increase the speed of the optimization process. Mandatory stations are defined by being stations which are needed for a fully electrified system. To check if a station *Y* is mandatory the network with every station electrified except *Y* is simulated. If the system has vehicle SoCs which drop below the minimal SoC (default value is 0) in this scenario, the station is mandatory. In the later exploration of the best combinations of stations this station will be included in every case. **Impossible rotations** are rotations which given the settings are not possible to be run as opportunity chargers, given the vehicle properties, even when every station is electrified. Before starting an optimization it is recommended to remove these rotations from the optimization, since the optimizer will not reach the goal of full electrification. **Quick solver** -Instead of using the regular SpiceEV solver for optimization the user can also choose the *quick* solver. This approximates the SoC history of a vehicle by straight manipulation of the SoC data and numeric approximations of the charged energy. Therefore small differences between solving a scenario with SpiceEV and the quick solver exist. For the quick solver to work, some assumptions have to be met as well +Instead of using the regular SpiceEV solver for optimization the user can also choose the *quick* solver. This approximates the SoC history of a vehicle by straight manipulation of the SoC data and numeric approximations of the charged energy. Therefore, small differences between solving a scenario with SpiceEV and the quick solver exist. For the quick solver to work, some assumptions have to be met as well * Depots charge the vehicles to 100% SoC * Station electrification leads to unlimited charging points @@ -198,7 +197,7 @@ To make use of this feature the parameters in the optimizer.cfg have to be set. Optimizer Configuration ################################### -The functionality of the optimizer is controlled through the optimizer.cfg specified in the simba.cfg used for calling the SimBA. +The functionality of the optimizer is controlled through the optimizer.cfg specified in the simba.cfg used for calling SimBA. .. list-table:: Optimizer.cfg parameters :header-rows: 1 @@ -210,7 +209,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci * - debug_level - 1 - 1 to 99 - - Level of debugging information that is printed to the .log file between. debug_level = 1 prints everything + - Level of debugging information that is printed to the .log file. debug_level = 1 prints everything * - console_level - 99 - 1 to 99 @@ -278,7 +277,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci * - pruning_threshold - 3 - positive integer value - - Number of stations left until number of stations in optimal solution is reached,where pruning is activated. Calculation time of checking for pruning is not negligible, meaning that a lot of pruning checks (high pruning threshold, e.g. 99) lead to slower optimization. Low values will rarely check for pruning but also pruning will be rarely achieved + - Number of stations left until number of stations in optimal solution is reached,where pruning is activated. Calculation time of checking for pruning is not negligible, meaning that a lot of pruning checks (high pruning threshold, e.g. 99) lead to slower optimization. Low values will rarely check for pruning but also pruning will rarely be achieved * - opt_type - greedy - [greedy, deep] @@ -322,7 +321,7 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci Report ------ -The report will generate several files which include information about the expected SoCs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Please refer to :ref:`generate_report` for more datailed information. +The report will generate several files which include information about the expected SoCs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Please refer to :ref:`generate_report` for more detailed information. diff --git a/docs/source/simba_features.rst b/docs/source/simba_features.rst index 479d677c..b18878b3 100644 --- a/docs/source/simba_features.rst +++ b/docs/source/simba_features.rst @@ -9,9 +9,9 @@ Consumption analysis The consumption can be calculated in two ways: Either with a constant average specific consumption or using a consumption table, where the consumption depends on the temperature, the incline, the level of loading and the speed profile/ average speed. -To use a constant consumption, this value can be defined in the :ref:`vehicle_types` as "mileage" in the unit of [kWh/km]. To use the relative consumtion, a consumption table need to be created with data for each vehicle type and the path to the consumption table is assigned to the variable "mileage" in :ref:`vehicle_types`. The consumption table should have the columns "vehicle_type", "level_of_loading", "incline" ,"mean_speed_kmh", "t_amb", "consumption_kwh_per_km" and its creation is at ths point of development not part of SimBA. +To use a constant consumption, this value can be defined in the :ref:`vehicle_types` as "mileage" in the unit of [kWh/km]. To use the relative consumption, a consumption table needs to be created with data for each vehicle type and the path to the consumption table is assigned to the variable "mileage" in :ref:`vehicle_types`. The consumption table should have the columns "vehicle_type", "level_of_loading", "incline" ,"mean_speed_kmh", "t_amb", "consumption_kwh_per_km" and its creation is at ths point of development not part of SimBA. -The level_of_loading describes the share between an empty vehicle (0) and a fully loaded vehicle (1) can be handed over in two ways: Either directcly as a column in :ref:`schedule` with specific values for each individual trip or as an input file "default_level_of_loading.csv" (path defined in :ref:`config`) containing values for each hour of the day. SimBA will first look into schedule and take this value and if it is not defined take the one from the .csv file. The temperature information is obtained in the same way as the level of loading and should be given in °C. In Order to calculate the consumption based on the in incline, an extra "all_stations.csv" file (path defined in :ref:`config`) has to be provided containing information on the elevation in m of each station. The incline is then calculated as the average incline between start and stop of the trip, which is an assumption that creates good results for vehicles with recuperation technology, as most electric vehicles have. The mean speed is calculated using the information provided in :ref:`schedule` about duration and length of each trip. +The level_of_loading describes the share between an empty vehicle (0) and a fully loaded vehicle (1) and can be handed over in two ways: Either directly as a column in :ref:`schedule` with specific values for each individual trip or as an input file "default_level_of_loading.csv" (path defined in :ref:`config`) containing values for each hour of the day. SimBA will first look into schedule and take this value and if it is not defined take the one from the .csv file. The temperature information is obtained in the same way as the level of loading and should be given in °C. In order to calculate the consumption based on the incline, an extra "all_stations.csv" file (path defined in :ref:`config`) has to be provided containing information on the elevation in m of each station. The incline is then calculated as the average incline between start and stop of the trip, which is an assumption that creates good results for vehicles with recuperation technology, as most electric vehicles have. The mean speed is calculated using the information provided in :ref:`schedule` about duration and length of each trip. .. _vehicle_dispatch: @@ -19,19 +19,19 @@ The level_of_loading describes the share between an empty vehicle (0) and a full Vehicle Dispatch ---------------- -To allocate the rotations to vehicles, vehicles of the needed type to fulfil the rotation are used. If no suitable vehicle is available, a new vehicle is created. Available vehilces are defined as not currently serving a rotation, having the same depot and having had enough time after return to the depot to be fully charged, when returning with an empty battery. This "minimum standing time" at the depot is calculated using the variable min_recharge_deps_oppb or min_recharge_deps_depb from the config together with the respective battery capacity of the vehicle and assuming the maximum available power of the depot chargning stations. +To allocate the rotations to vehicles, vehicles of the needed type to fulfil the rotation are used. If no suitable vehicle is available, a new vehicle is created. Available vehicles are defined as not currently serving a rotation, having the same depot and having had enough time after return to the depot to be fully charged, when returning with an empty battery. This "minimum standing time" at the depot is calculated using the variable min_recharge_deps_oppb or min_recharge_deps_depb from the config together with the respective battery capacity of the vehicle and assuming the maximum available power of the depot charging stations. Charging simulation ------------------- -The charging simulation is carried out in the open source software `SpiceEV `_, that is included in SimBA as a package. SimBA therefore uses SpiceEVs carging strategy "distributed", that allows to sepatarte the charging strategy depending on the station type. The station types can be either depot charging station (deps) or opportunity charging station (opps). At depot charging stations vehicles are being charged using SpiceEVs strategy "balanced", which uses the whole standing time to charge with the minimal power to reach a desired SoC. At opportunity charging stations the strategy "greedy" is employed, that charges with the maximum available power due to restrictions from the grid connectoion, the charging curve of the vehicle and the charging station. +The charging simulation is carried out in the open source software `SpiceEV `_, that is included in SimBA as a package. SimBA therefore uses SpiceEVs charging strategy "distributed", that allows to separate the charging strategy depending on the station type. The station types can be either depot charging station (deps) or opportunity charging station (opps). At depot charging stations vehicles are being charged using SpiceEVs strategy "balanced", which uses the whole standing time to charge with the minimal power to reach a desired SoC. At opportunity charging stations the strategy "greedy" is employed, that charges with the maximum available power due to restrictions from the grid connection, the charging curve of the vehicle and the charging station. .. _generate_report: Generate report --------------- -The generation of the report is implemented as a mode, that can be activated with the keyword "report" in modes (:ref:`report`). The report generates most of the output files. These are saved in a subfolder of the output directory as defined in :ref:`config` named as a string with the modes executed up to the point when report is called. e.g. mode = ['sim', 'report', 'neg_oppb_to_depb', 'report'] will create two subfolders in the output directory named "sim" and "sim__neg_oppb_to_depb" containing the output files for the respective times in simulation. +The generation of the report is implemented as a mode, that can be activated with the keyword "report" in modes (:ref:`report`). The report generates most of the output files. These are saved in a sub-folder of the output directory as defined in :ref:`config` named as a string with the modes executed up to the point when report is called. e.g. mode = ['sim', 'report', 'neg_oppb_to_depb', 'report'] will create two sub-folders in the output directory named "sim" and "sim__neg_oppb_to_depb" containing the output files for the respective times in simulation. The generation of the report can be modified using the flag "cost_calculation" in :ref:`config`. If this flag is set to true, each report will also generate the file "summary_vehicles_costs.csv". @@ -63,7 +63,7 @@ Default outputs | Contains station specific time series including price of electricity, grid supply, fixed loads, battery power, energy stored in battery, flex band boundaries, battery feed, charging station power use, occupied charging stations and charging stations in use as well as vehicles which are at the station. | **Overview on costs and vehicles (summary_vehicles_costs.csv)** -| If colst_caluclation is activated, this file contains the cost report as described below in :ref:`cost_calculation`. +| If cost_calculation is activated, this file contains the cost report as described below in :ref:`cost_calculation`. .. _cost_calculation: @@ -74,13 +74,13 @@ Cost calculation | The following costs are calculated as both total and annual, depending on the lifetime of each component. See `SpiceEV documentation `_ for the calculation of electricity costs. * Investment - * **Busses**: Costs for all busses used in the simulation. Costs include battery swaps, depending on the lifetime of both busses and batteries. + * **Buses**: Costs for all buses used in the simulation. Costs include battery swaps, depending on the lifetime of both buses and batteries. * **Charging infrastructure**: Costs for all depot and opportunity charging stations, depending on the number of actually used charging stations at each grid connector. * **Grid connectors**: Costs for grid connectors and transformers, depending on the voltage level and the distance to the grid. * **Garages**: Costs for workstations and charging infrastructure at garages. * **Stationary storages**: Costs for stationary batteries at depot and opportunity stations, depending on its capacity. * Maintenance - * Depending on the lifetime of each component maintenance costs are calculated for busses, charging infrastructure, grid connectors and stationary storages. + * Depending on the lifetime of each component maintenance costs are calculated for buses, charging infrastructure, grid connectors and stationary storages. * Electricity * **Power procurement**: Costs for the procurement of energy. * **Grid fees**: Costs for power and energy price, depending on the voltage level and the utilization time per year. @@ -169,7 +169,7 @@ SimBA makes certain assumption, that have to be valid to trust the results. thes * Each rotation has a defined and fixed depot, so the rotation starts and ends at the same station * Every trip within a rotation starts where the previous trip ended -In order to test these assumptions, the flag "check_rotation_consistency" can be activated in the :ref:`config`, which will result in the display of cases were assumptions are broken in the console and in the log file. Additionally the inconsistent totaions can be filtered out of the simulation by setting the "skip_inconsistent_rotations" flag to true. +In order to test these assumptions, the flag "check_rotation_consistency" can be activated in the :ref:`config`, which will result in the display of cases where assumptions are broken in the console and in the log file. Additionally, the inconsistent rotations can be filtered out of the simulation by setting the "skip_inconsistent_rotations" flag to true. .. _rotation_filter: @@ -177,9 +177,9 @@ In order to test these assumptions, the flag "check_rotation_consistency" can be Rotation filter --------------- -Before all rotations specified in the :ref:`schedule` are simulated, there is the option to filter only the ones relevant to for the actual analysis. This is activated by setting the "rotation_filter_variable" in the :ref:`config` to either "include", than only certain rotations from the schedule are considered, or to "exclude", than certain rotations are excluded from the analysis. The list of rotations for both options is specified as "rotation_filter" in the Path paragraph of the :ref:`config`. +Before all rotations specified in the :ref:`schedule` are simulated, there is the option to filter only the ones relevant to for the actual analysis. This is activated by setting the "rotation_filter_variable" in the :ref:`config` to either "include" to consider only certain rotations from the schedule, or to "exclude" to exclude certain rotations from the analysis. The list of rotations for both options is specified as "rotation_filter" in the Path paragraph of the :ref:`config`. Logging ------- -SimBA uses the "logging" package for logging. All logging messages are both displayed in the Terminal and written to a .log file. The filepath and the loglevel can be defined in the :ref:`config`. Four loglevels are available in the following order: DEBUG, INFO, WARN and ERROR. INFO includes INFO, WARN and ERROR but excludes DEBUG. \ No newline at end of file +SimBA uses the "logging" package for logging. All logging messages are both displayed in the Terminal and written to a .log file. The filepath and the loglevel can be defined in the :ref:`config`. Four log levels are available in the following order: DEBUG, INFO, WARN and ERROR. INFO includes INFO, WARN and ERROR but excludes DEBUG. \ No newline at end of file diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index 78a63d87..e1d75e76 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -20,7 +20,7 @@ The configuration file config.cfg is provided as example in ./examples/ and prov | Modes: Here the modes of execution can be defined | Flags: Here, optional functionality can be activated or deactivated | Physical setup of environment: Here, the physical setup is characterized -| Simulation Parameters: The simulation can be adjusted using these paramteres +| Simulation Parameters: The simulation can be adjusted using these parameters The example (data/simba.cfg) contains parameter descriptions which are explained here in more detail: @@ -33,35 +33,35 @@ The example (data/simba.cfg) contains parameter descriptions which are explained - Description * - input_schedule - Mandatory: no default given - - path as string + - Path as string - Input file containing :ref:`schedule` information - * - output_directory - - data/sim_outputs - - path as string + * - Output_directory + - Data/sim_outputs + - Path as string - Output files are stored here * - electrified_stations - ./data/examples/vehicle_types.json - - path as string + - Path as string - Path to Electrified stations data * - vehicle_types - ./data/examples/vehicle_types.json - - path as string + - Path as string - Path to :ref:`vehicle_types` * - station_data_path - Optional: no default given - - path as string + - Path as string - Path to :ref:`station_geo_data` * - outside_temperature_over_day_path - Optional: no default given - - path as string + - Path as string - Path to :ref:`temperature_data` * - level_of_loading_over_day_path - Optional: no default given - - path as string + - Path as string - Path to :ref:`level_of_loading` * - cost_parameters_file - Optional: no default given - - path as string + - Path as string - Path to :ref:`cost_params` * - mode - ['sim', 'report'] @@ -78,7 +78,7 @@ The example (data/simba.cfg) contains parameter descriptions which are explained * - skip_inconsistent_rotations - false - Boolean - - If check_rotation_consistency is active, rotations that don't comply with the checked assumtions are removed from the schedule if skip_inconsistent_rotations is set true + - If check_rotation_consistency is active, rotations that don't comply with the checked assumptions are removed from the schedule if skip_inconsistent_rotations is set true * - show_plots - false - Boolean @@ -91,23 +91,23 @@ The example (data/simba.cfg) contains parameter descriptions which are explained * - gc_power_opps - 100000 - Numeric - - Default max power [kW] of grid connectors at opportunity charging stations, Individual gc_power per gc can be defined in :ref:`electrified_stations` + - Default max. power [kW] of grid connectors at opportunity charging stations, Individual gc_power per gc can be defined in :ref:`electrified_stations` * - gc_power_deps - 100000 - Numeric - - Default max power [kW] of grid connectors at depot charging stations, Individual gc_power per gc can be defined in :ref:`electrified_stations` + - Default max. power [kW] of grid connectors at depot charging stations, Individual gc_power per gc can be defined in :ref:`electrified_stations` * - cs_power_opps - 300 - Numeric - - Default max power [kW] of opportunity charging stations + - Default max. power [kW] of opportunity charging stations * - cs_power_deps_depb - 300 - Numeric - - Default max power [kW] of depot charging stations for depot charging busses. Individual cs_power per gc and cs type can be defined in :ref:`electrified_stations` + - Default max. power [kW] of depot charging stations for depot charging buses. Individual cs_power per gc and cs type can be defined in :ref:`electrified_stations` * - cs_power_deps_oppb - 300 - Numeric - - Default max power [kW] of depot charging stations for opportunity charging busses. Individual cs_power per gc and cs type can be defined in :ref:`electrified_stations` + - Default max. power [kW] of depot charging stations for opportunity charging buses. Individual cs_power per gc and cs type can be defined in :ref:`electrified_stations` * - desired_soc_deps - 1 - 0...1 @@ -135,23 +135,23 @@ The example (data/simba.cfg) contains parameter descriptions which are explained * - default_voltage_level - MV - HV, HV/MV, MV, MV/LV, LV - - The default volage level is used, if no specific voltage level is defined per station in :ref:`electrified_stations`. It is used to calculate the costs. Choices describe high voltage (HV), transfomer between high and medium voltage (HV/MV), medium voltage MV, transfomer between medium and low voltage (MV/LV) and low voltage (LV) + - The default voltage level is used, if no specific voltage level is defined per station in :ref:`electrified_stations`. It is used to calculate the costs. Choices describe high voltage (HV), transformer between high and medium voltage (HV/MV), medium voltage MV, transformer between medium and low voltage (MV/LV) and low voltage (LV) * - days - Optional: no default given - - numeric + - Numeric - If this value is defined only the first number of 'days' of the schedule are simulated * - interval - 1 - - numeric - - timestep in minutes + - Numeric + - Timestep in minutes * - signal_time_dif - 10 - - numeric - - Some strategies use limited foresight. E.g. priorization of vehicles at limited number of charging stations is carried out only for this time ahead of actual time step. Also used in spiceEV as time difference between signal time and actual start time of a vehicle event in min. + - Numeric + - Some strategies use limited foresight. E.g. prioritization of vehicles at limited number of charging stations is carried out only for this time ahead of actual time step. Also used in spiceEV as time difference between signal time and actual start time of a vehicle event in min. * - eta - false - - boolen + - Boolean - Show estimated time to finish simulation after each step. Not recommended for fast computations From c0e1caaf7688a8e1122e07bb0eb66280ecee4541 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Tue, 8 Aug 2023 10:18:25 +0200 Subject: [PATCH 762/802] still wip: doku sim_params --- data/examples/electrified_stations.json | 36 +++---- data/examples/trips_example.csv | 130 ++++++++++++------------ data/examples/vehicle_types.json | 20 ++-- docs/source/getting_started.rst | 2 +- docs/source/modes.rst | 11 +- docs/source/simba_features.rst | 6 +- docs/source/simulation_parameters.rst | 35 ++++++- 7 files changed, 130 insertions(+), 110 deletions(-) diff --git a/data/examples/electrified_stations.json b/data/examples/electrified_stations.json index 62d27a90..c8755001 100644 --- a/data/examples/electrified_stations.json +++ b/data/examples/electrified_stations.json @@ -1,24 +1,24 @@ { - "Station-0": { - "type": "deps", - "n_charging_stations": null, - "distance_to_grid": 150, - "energy_feed_in": { - "csv_file": "data/examples/example_pv_feedin.csv", - "start_time": "2022-03-07T00:00:00", - "step_duration_s": 3600, - "column": "Feed-in Total (kW)", - "nominal_power": 10, - "factor": 1 + "Station-0": { // name of station + "type": "deps", // type: "deps" or "opps" + "n_charging_stations": null, // nr of charging stataions, "null" for unlimited + "distance_to_grid": 150, // distance to grid, needed for cost calculation + "energy_feed_in": { // energy feed in e.g. by local renewables + "csv_file": "data/examples/example_pv_feedin.csv", // path to feedin.csv + "start_time": "2022-03-07T00:00:00", // start time as YYYY-MM-DDThh:mm:ss + "step_duration_s": 3600, // timestep in seconds + "column": "Feed-in Total (kW)", // column name in .csv + "nominal_power": 10, // nominal power in kW, needed for PV remuneration + "factor": 1 // factor to multiply column values, eg 0.001 for conversion from W to kW }, - "external_load": { - "csv_file": "data/examples/example_external_load.csv", - "start_time": "2022-03-07T00:00:00", - "step_duration_s": 900, - "column": "External Load (kW)", - "factor": 2 + "external_load": { // local external loads + "csv_file": "data/examples/example_external_load.csv", // path to feedin.csv + "start_time": "2022-03-07T00:00:00", // start time as YYYY-MM-DDThh:mm:ss + "step_duration_s": 900, // timestep in seconds + "column": "External Load (kW)", // column name in .csv + "factor": 2 // factor to multiply column values, eg 0.001 for conversion from W to kW }, - "battery": { + "battery": { // local stationary battery "charging_curve": [[0,50], [1,50]], // piecewise linear function that maps SoC to power, from 0 to 1, required "capacity": 300, // kWh, assumed to be infinite if not given "min_charging_power": 0, // kW, optional diff --git a/data/examples/trips_example.csv b/data/examples/trips_example.csv index 4036a2c2..a08c3e83 100644 --- a/data/examples/trips_example.csv +++ b/data/examples/trips_example.csv @@ -1,65 +1,65 @@ -line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading -LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0 -LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9 -LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,, -LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,, -LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,, -LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,, -LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,, -LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,, -LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,, -LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,, -LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,, -LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,, -LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,, -LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,, -LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,, -LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,, -LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,, -LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,, -LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,, -LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,, -LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,, -LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,, -LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,, -LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,, -LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,, -LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,, -LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,, -LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,, -LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,, -LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,, -LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,, -LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,, -LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,, -LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,, -LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,, -LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,, -LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,, -LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,, -LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,, -LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,, -LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,, -LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,, -LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,, -LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,, -LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,, -LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,, -LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,, -LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,, -LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,, -LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,, -LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,, -LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,, -LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,, -LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,, -LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,, \ No newline at end of file +line,departure_name,departure_time,arrival_time,arrival_name,distance,pause,rotation_id,vehicle_type,temperature,level_of_loading,charging_type +LINE_0,Station-0,2022-03-07 21:31:00,2022-03-07 21:31:00,Station-1,0.06,0,1,AB,20,0,oppb +LINE_0,Station-1,2022-03-07 21:31:00,2022-03-07 22:04:00,Station-2,14519,4,1,AB,-5,0.9,oppb +LINE_0,Station-2,2022-03-07 22:08:00,2022-03-07 22:43:00,Station-1,13541,8,1,AB,,,oppb +LINE_0,Station-1,2022-03-07 22:51:00,2022-03-07 23:24:00,Station-2,14519,4,1,AB,,,oppb +LINE_0,Station-2,2022-03-07 23:28:00,2022-03-08 00:03:00,Station-1,13541,8,1,AB,,,oppb +LINE_0,Station-1,2022-03-08 00:11:00,2022-03-08 00:44:00,Station-2,14519,0,1,AB,,,oppb +LINE_1,Station-2,2022-03-08 00:44:00,2022-03-08 00:54:00,Station-3,4.1,25,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 01:19:00,2022-03-08 01:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 01:48:00,2022-03-08 02:06:00,Station-3,9067,13,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 02:19:00,2022-03-08 02:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 02:48:00,2022-03-08 03:06:00,Station-3,9067,13,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 03:19:00,2022-03-08 03:42:00,Station-4,8.36,6,1,AB,,,oppb +LINE_1,Station-4,2022-03-08 03:48:00,2022-03-08 04:06:00,Station-3,9067,0,1,AB,,,oppb +LINE_1,Station-3,2022-03-08 04:06:00,2022-03-08 04:06:00,Station-0,0.06,0,1,AB,,,oppb +LINE_0,Station-0,2022-03-07 22:11:00,2022-03-07 22:11:00,Station-1,0.06,0,2,AB,,, +LINE_0,Station-1,2022-03-07 22:11:00,2022-03-07 22:44:00,Station-2,14519,4,2,AB,,, +LINE_0,Station-2,2022-03-07 22:48:00,2022-03-07 23:23:00,Station-1,13541,8,2,AB,,, +LINE_0,Station-1,2022-03-07 23:31:00,2022-03-08 00:04:00,Station-2,14519,4,2,AB,,, +LINE_0,Station-2,2022-03-08 00:08:00,2022-03-08 00:39:00,Station-5,12213,0,2,AB,,, +LINE_1,Station-5,2022-03-08 00:39:00,2022-03-08 00:47:00,Station-3,4.0,2,2,AB,,, +LINE_1,Station-3,2022-03-08 00:49:00,2022-03-08 01:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 01:18:00,2022-03-08 01:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 01:49:00,2022-03-08 02:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 02:18:00,2022-03-08 02:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 02:49:00,2022-03-08 03:12:00,Station-4,8.36,6,2,AB,,, +LINE_1,Station-4,2022-03-08 03:18:00,2022-03-08 03:36:00,Station-3,9067,13,2,AB,,, +LINE_1,Station-3,2022-03-08 03:49:00,2022-03-08 04:12:00,Station-4,8.36,0,2,AB,,, +LINE_1,Station-4,2022-03-08 04:12:00,2022-03-08 04:12:00,Station-0,0.06,0,2,AB,,, +LINE_2,Station-0,2022-03-07 21:06:00,2022-03-07 21:06:00,Station-6,0.06,0,3,AB,,, +LINE_2,Station-6,2022-03-07 21:06:00,2022-03-07 21:34:00,Station-7,13018,19,3,AB,,, +LINE_2,Station-7,2022-03-07 21:53:00,2022-03-07 22:13:00,Station-8,10332,17,3,AB,,, +LINE_2,Station-8,2022-03-07 22:30:00,2022-03-07 22:54:00,Station-7,10.48,19,3,AB,,, +LINE_2,Station-7,2022-03-07 23:13:00,2022-03-07 23:33:00,Station-8,10332,17,3,AB,,, +LINE_2,Station-8,2022-03-07 23:50:00,2022-03-08 00:14:00,Station-7,10.48,2,3,AB,,, +LINE_2,Station-7,2022-03-08 00:16:00,2022-03-08 00:23:00,Station-9,3709,5,3,AB,,, +LINE_3,Station-9,2022-03-08 00:28:00,2022-03-08 00:44:00,Station-10,6404,3,3,AB,,, +LINE_3,Station-10,2022-03-08 00:47:00,2022-03-08 01:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 01:17:00,2022-03-08 01:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 01:47:00,2022-03-08 02:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 02:17:00,2022-03-08 02:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 02:47:00,2022-03-08 03:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 03:17:00,2022-03-08 03:44:00,Station-10,12007,3,3,AB,,, +LINE_3,Station-10,2022-03-08 03:47:00,2022-03-08 04:10:00,Station-11,10579,7,3,AB,,, +LINE_3,Station-11,2022-03-08 04:17:00,2022-03-08 04:44:00,Station-10,12007,0,3,AB,,, +LINE_3,Station-10,2022-03-08 04:44:00,2022-03-08 04:44:00,Station-0,0.06,0,3,AB,,, +LINE_2,Station-0,2022-03-07 20:26:00,2022-03-07 20:26:00,Station-6,0.06,0,4,AB,,, +LINE_2,Station-6,2022-03-07 20:26:00,2022-03-07 20:56:00,Station-12,14097,14,4,AB,,, +LINE_2,Station-12,2022-03-07 21:10:00,2022-03-07 21:38:00,Station-6,13.19,8,4,AB,,, +LINE_2,Station-6,2022-03-07 21:46:00,2022-03-07 22:14:00,Station-7,13018,19,4,AB,,, +LINE_2,Station-7,2022-03-07 22:33:00,2022-03-07 22:53:00,Station-8,10332,17,4,AB,,, +LINE_2,Station-8,2022-03-07 23:10:00,2022-03-07 23:34:00,Station-7,10.48,19,4,AB,,, +LINE_2,Station-7,2022-03-07 23:53:00,2022-03-08 00:13:00,Station-8,10332,2,4,AB,,, +LINE_2,Station-8,2022-03-08 00:15:00,2022-03-08 00:16:00,Station-10,506,1,4,AB,,, +LINE_3,Station-10,2022-03-08 00:17:00,2022-03-08 00:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 00:47:00,2022-03-08 01:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 01:17:00,2022-03-08 01:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 01:47:00,2022-03-08 02:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 02:17:00,2022-03-08 02:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 02:47:00,2022-03-08 03:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 03:17:00,2022-03-08 03:40:00,Station-11,10579,7,4,AB,,, +LINE_3,Station-11,2022-03-08 03:47:00,2022-03-08 04:14:00,Station-10,12007,3,4,AB,,, +LINE_3,Station-10,2022-03-08 04:17:00,2022-03-08 04:40:00,Station-11,10579,3,4,AB,,, +LINE_4,Station-11,2022-03-08 04:43:00,2022-03-08 04:58:00,Station-13,6161,0,4,AB,,, +LINE_4,Station-13,2022-03-08 04:58:00,2022-03-08 04:58:00,Station-0,0.06,0,4,AB,,, \ No newline at end of file diff --git a/data/examples/vehicle_types.json b/data/examples/vehicle_types.json index cba0ff05..912e4978 100644 --- a/data/examples/vehicle_types.json +++ b/data/examples/vehicle_types.json @@ -1,12 +1,12 @@ { - "AB": { - "depb": { - "name": "articulated bus - depot charging", - "capacity": 250, - "charging_curve": [[0, 150], [0.8, 150], [1, 15]], - "min_charging_power": 0, - "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv", + "AB": { // vehicle_type + "depb": { // charging_type + "name": "articulated bus - depot charging", // long name + "capacity": 250, // battery capacity in kWh + "charging_curve": [[0, 150], [0.8, 150], [1, 15]], // charging curve [SoC, kW] + "min_charging_power": 0, // min charging power in KW + "v2g": false, // Is vehicle capable of vehicle to grid? + "mileage": "data/examples/energy_consumption_example.csv", // mileage in kWh/km or link to consumption.csv "battery_efficiency": 0.95 // optional. default: 0.95 }, "oppb": { @@ -25,7 +25,7 @@ "charging_curve": [[0, 150], [0.8, 150], [1, 15]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv" + "mileage": 1.2 }, "oppb": { "name": "solo bus - opportunity charging", @@ -33,7 +33,7 @@ "charging_curve": [[0, 250], [0.8, 250], [1, 25]], "min_charging_power": 0, "v2g": false, - "mileage": "data/examples/energy_consumption_example.csv" + "mileage": 1.1 } } } diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst index 5c230886..ad08e6eb 100644 --- a/docs/source/getting_started.rst +++ b/docs/source/getting_started.rst @@ -2,7 +2,7 @@ Getting Started =============== SimBA - the Simulation toolbox for Bus Applications - was designed to analyze and optimize electrified bus fleets. -It is used for locating and dimensioning charging infrastructure, dimensioning buses, analyzing the feasibility of electrification of trips and circulations, determining charging strategies, and calculating investments and costs. +It is used for locating and dimensioning charging infrastructure, dimensioning buses, analyzing the feasibility of electrification of trips and rotations, determining charging strategies, and calculating investments and costs. .. Without creating links like in the line below, subpages go missing from the sidebar .. _installation_label: diff --git a/docs/source/modes.rst b/docs/source/modes.rst index f3a00802..54b6fd6b 100644 --- a/docs/source/modes.rst +++ b/docs/source/modes.rst @@ -81,7 +81,7 @@ Station Optimization -------------------- Greedy Optimization #################### -This mode optimizes a scenario by electrifying as few opportunity stations as possible using a greedy approach. Two basic approaches to use the optimization module are setting the mode in the simba configuration file to +This mode optimizes a scenario by electrifying as few opportunity stations as possible using a greedy approach. Two basic approaches to use the optimization module are setting the mode in the SimBA configuration file to :: @@ -322,12 +322,3 @@ The functionality of the optimizer is controlled through the optimizer.cfg speci Report ------ The report will generate several files which include information about the expected SoCs, power loads at the charging stations or depots, default plots for the scenario and other useful data. Please refer to :ref:`generate_report` for more detailed information. - - - - - - - - - diff --git a/docs/source/simba_features.rst b/docs/source/simba_features.rst index b18878b3..a1515f69 100644 --- a/docs/source/simba_features.rst +++ b/docs/source/simba_features.rst @@ -7,9 +7,9 @@ Features of SimBA Consumption analysis -------------------- -The consumption can be calculated in two ways: Either with a constant average specific consumption or using a consumption table, where the consumption depends on the temperature, the incline, the level of loading and the speed profile/ average speed. +The consumption can be calculated in two ways: Either with a constant average specific consumption or with a trip specific consumption, where the consumption depends on the temperature, the incline, the level of loading and the average speed. -To use a constant consumption, this value can be defined in the :ref:`vehicle_types` as "mileage" in the unit of [kWh/km]. To use the relative consumption, a consumption table needs to be created with data for each vehicle type and the path to the consumption table is assigned to the variable "mileage" in :ref:`vehicle_types`. The consumption table should have the columns "vehicle_type", "level_of_loading", "incline" ,"mean_speed_kmh", "t_amb", "consumption_kwh_per_km" and its creation is at ths point of development not part of SimBA. +To use a constant consumption, this value can be defined in the :ref:`vehicle_types` as "mileage" in the unit of [kWh/km]. To use the trip specific consumption, a consumption table needs to be created with data for each vehicle type. The path to the consumption table is assigned to the variable "mileage" in :ref:`vehicle_types`. The consumption table should have the columns "vehicle_type", "level_of_loading", "incline" ,"mean_speed_kmh", "t_amb", "consumption_kwh_per_km" and its creation is at ths point of development not part of SimBA. The consumption for each trip is then calculated by interpolation of the datapoints provided in the table. The level_of_loading describes the share between an empty vehicle (0) and a fully loaded vehicle (1) and can be handed over in two ways: Either directly as a column in :ref:`schedule` with specific values for each individual trip or as an input file "default_level_of_loading.csv" (path defined in :ref:`config`) containing values for each hour of the day. SimBA will first look into schedule and take this value and if it is not defined take the one from the .csv file. The temperature information is obtained in the same way as the level of loading and should be given in °C. In order to calculate the consumption based on the incline, an extra "all_stations.csv" file (path defined in :ref:`config`) has to be provided containing information on the elevation in m of each station. The incline is then calculated as the average incline between start and stop of the trip, which is an assumption that creates good results for vehicles with recuperation technology, as most electric vehicles have. The mean speed is calculated using the information provided in :ref:`schedule` about duration and length of each trip. @@ -19,7 +19,7 @@ The level_of_loading describes the share between an empty vehicle (0) and a full Vehicle Dispatch ---------------- -To allocate the rotations to vehicles, vehicles of the needed type to fulfil the rotation are used. If no suitable vehicle is available, a new vehicle is created. Available vehicles are defined as not currently serving a rotation, having the same depot and having had enough time after return to the depot to be fully charged, when returning with an empty battery. This "minimum standing time" at the depot is calculated using the variable min_recharge_deps_oppb or min_recharge_deps_depb from the config together with the respective battery capacity of the vehicle and assuming the maximum available power of the depot charging stations. +To allocate the rotations to vehicles, vehicles of the needed type to fulfil the rotation are used. If no suitable vehicle is available, a new vehicle is created. A vehicle is defined as "available" if it is currently not serving another rotation, has the same depot and if it had enough time after return to the depot to be charged. This "minimum standing time" at the depot is calculated using the variable min_recharge_deps_oppb or min_recharge_deps_depb from the :ref`config` together with the respective battery capacity of the vehicle and assuming the maximum available power of the depot charging stations. Charging simulation ------------------- diff --git a/docs/source/simulation_parameters.rst b/docs/source/simulation_parameters.rst index e1d75e76..abcbba77 100644 --- a/docs/source/simulation_parameters.rst +++ b/docs/source/simulation_parameters.rst @@ -231,14 +231,43 @@ This is how a schedule file might look like. Vehicle types ------------- -vehicle_type.json -tbc + +The vehicle types that can be used are defined in the "vehicle_type.json". The path to this file has to be defined in the :ref:`config` and an example is given at `data/examples/vehicle_types.json`. + +The data is structured as a .json where the top level key represents the vehicle_type, that needs to correspont to the "vehicle_type" defined in the :ref:`schedule`. The next level key defines the charging_type ("oppb" or "depb"). For one vehicle type either one or both charging types can be defined and for each given charging type the specifications in the third level of the .json have to be given. In this level, the parameters for the specified vehicle are be defined. The specification of one vehicle with the vehicle_type "AB" and the charging_types "depb" and "oppb" is given as follows: + +.. code-block:: json + + { + "AB": { // vehicle_type + "depb": { // charging_type + "name": "articulated bus - depot charging", // long name + "capacity": 250, // battery capacity in kWh + "charging_curve": [[0, 150], [0.8, 150], [1, 15]], // charging curve [SoC, kW] + "min_charging_power": 0, // min charging power in KW + "v2g": false, // Is vehicle capable of vehicle to grid? + "mileage": "data/examples/energy_consumption_example.csv", // mileage in kWh/km or link to consumption.csv + "battery_efficiency": 0.95 // optional. default: 0.95 + }, + "oppb": { + "name": "articulated bus - opportunity charging", + "capacity": 150, + "charging_curve": [[0, 250], [0.8, 250], [1, 25]], + "min_charging_power": 0, + "v2g": false, + "mileage": "data/examples/energy_consumption_example.csv" + } + } + } .. _electrified_stations: Electrified stations -------------------- -Stations which are electrified. TBC + +All stations, that are or could be equipped with charging infrastructure have to be parameterized in the "electrified_stations.json" together with their grid connection, charging infrastructure and local energy systems. The path to this file has to be defined in the :ref:`config` and an example is given at `data/examples/electrified_stations.json`. + +TODO: HIER WEITER .. _cost_params: From 9767e93f7c8a429a681bcf2a055c7a640a5b9d22 Mon Sep 17 00:00:00 2001 From: Jakob Gemassmer Date: Tue, 8 Aug 2023 14:01:45 +0200 Subject: [PATCH 763/802] fix dict-lookup in neg_depb_to_oppb --- simba/simulate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simba/simulate.py b/simba/simulate.py index aaf4aa24..33e78cd9 100644 --- a/simba/simulate.py +++ b/simba/simulate.py @@ -174,7 +174,7 @@ def switch_type(schedule, scenario, args, from_type, to_type): for rot_id in neg_rot: if schedule.rotations[rot_id].charging_type == from_type: new_vehicle_type = f"{schedule.rotations[rot_id].vehicle_type}_{to_type}" - if scenario.components.vehicle_types[new_vehicle_type]: + if scenario.components.vehicle_types.get(new_vehicle_type) is not None: relevant_rotations.append(rot_id) else: logging.debug(f"Rotation {rot_id} negative and of type {from_type}, " From 31f594aab74fc860ab58bd1ee42b41aee3ebaf42 Mon Sep 17 00:00:00 2001 From: "stefan.schirmeister" Date: Tue, 8 Aug 2023 16:16:08 +0200 Subject: [PATCH 764/802] service optimization fixes - guard against infinite loop caused by circular dependency of rotations - fix type error (rotation ID instead of rotation object was checked) - added comments - added debug logging --- simba/optimization.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/simba/optimization.py b/simba/optimization.py index f6a21c3a..ed299c7f 100644 --- a/simba/optimization.py +++ b/simba/optimization.py @@ -35,6 +35,7 @@ def service_optimization(schedule, scenario, args): negative_sets = {} for rot_key in negative_rotations: + logging.debug(f"Looking at negative rotation {rot_key}") # remove negative rotation from initial schedule rotation = schedule.rotations.pop(rot_key) if rotation.charging_type != "oppb": @@ -50,17 +51,26 @@ def service_optimization(schedule, scenario, args): last_neg_soc_time = datetime.datetime.fromisoformat(last_neg_soc_time) dependent_station = {r: t for r, t in common_stations[rot_key].items() if t <= last_neg_soc_time} + logging.debug(f"Dependent stations: {dependent_station}") while dependent_station: + # get next rotation ID and last common time r, t = dependent_station.popitem() + # rotation ID -> rotation object + dependent_rotation = schedule.rotations.get(r) + logging.debug(f"\tRotation {r} ({dependent_rotation}) @ {t}:") if r not in negative_rotations: + # r not negative: add to set of dependent rotations s.add(r) - # add dependencies of r - dependent_station.update({r2: t2 for r2, t2 - in common_stations[r].items() if t2 <= t}) - elif r.charging_type != "obbp": + # add dependencies of r, avoid circular dependency + dependencies = {r2: t2 for r2, t2 in common_stations[r].items() + if t2 <= t and r2 not in s} + dependent_station.update(dependencies) + logging.debug(f"\t{dependencies}") + elif dependent_rotation is not None and dependent_rotation.charging_type != "obbp": logging.warning(f"Rotation {rot_key} depends on negative non-oppb rotation") negative_sets[rot_key] = s + logging.debug(f"Negative sets: {negative_sets}") # run scenario with non-negative rotations only if schedule.rotations: @@ -96,11 +106,13 @@ def service_optimization(schedule, scenario, args): combined = negative_sets[r1].union(negative_sets[r2]) schedule.rotations = {r: original[0].rotations[r] for r in combined} scenario = schedule.run(args) + logging.debug(f"{r1} + {r2}: {not scenario.negative_soc_tracker}") if not scenario.negative_soc_tracker: # compatible (don't interfere): keep union, remove r2 negative_sets[r1] = combined # simplified. What about triangle? (r1+r2, r1+r3, r2!+r3)? possible = [t for t in possible if r2 not in t] + logging.debug(possible) # save scenario with highest electrification rate if optimal is None or len(scenario[0].rotations) > len(optimal[0].rotations): From 1e450e9b4391db2936620cc133806ab9e1393701 Mon Sep 17 00:00:00 2001 From: Julian Brendel Date: Wed, 9 Aug 2023 08:14:40 +0200 Subject: [PATCH 765/802] remove unneeded picture --- docs/source/_static/PyCharm_Configuration.png | Bin 69829 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/source/_static/PyCharm_Configuration.png diff --git a/docs/source/_static/PyCharm_Configuration.png b/docs/source/_static/PyCharm_Configuration.png deleted file mode 100644 index 8d42e3651376d5a8944eba4511a97ae7ae36c510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69829 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